diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..427417b
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/Plugins REQUIRED/GenricUtils-1.0-SNAPSHOT.jar b/Plugins REQUIRED/GenricUtils-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..0ca7e5b
Binary files /dev/null and b/Plugins REQUIRED/GenricUtils-1.0-SNAPSHOT.jar differ
diff --git a/Plugins REQUIRED/KoTH.jar b/Plugins REQUIRED/KoTH.jar
new file mode 100644
index 0000000..59aa4e1
Binary files /dev/null and b/Plugins REQUIRED/KoTH.jar differ
diff --git a/Plugins REQUIRED/Popura-1.0-SNAPSHOT.jar b/Plugins REQUIRED/Popura-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..0c18a34
Binary files /dev/null and b/Plugins REQUIRED/Popura-1.0-SNAPSHOT.jar differ
diff --git a/Plugins REQUIRED/Vault-1.4.1.jar b/Plugins REQUIRED/Vault-1.4.1.jar
new file mode 100644
index 0000000..d4d4ecc
Binary files /dev/null and b/Plugins REQUIRED/Vault-1.4.1.jar differ
diff --git a/Plugins REQUIRED/WorldEdit.jar b/Plugins REQUIRED/WorldEdit.jar
new file mode 100644
index 0000000..48ab614
Binary files /dev/null and b/Plugins REQUIRED/WorldEdit.jar differ
diff --git a/Plugins REQUIRED/worldguard-6.0.0-beta-03.jar b/Plugins REQUIRED/worldguard-6.0.0-beta-03.jar
new file mode 100644
index 0000000..ac57234
Binary files /dev/null and b/Plugins REQUIRED/worldguard-6.0.0-beta-03.jar differ
diff --git a/Popura-1.0-SNAPSHOT.jar b/Popura-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..0c18a34
Binary files /dev/null and b/Popura-1.0-SNAPSHOT.jar differ
diff --git a/READ ME.txt b/READ ME.txt
new file mode 100644
index 0000000..81f0177
--- /dev/null
+++ b/READ ME.txt
@@ -0,0 +1,10 @@
+------------------------------------------------------
+
+1. Minetweak.jar is the custom spigot
+2. Put Popura into the plugin folder
+3. The .JAR files are in the folders. To easily get them just search .JAR
+4. All files contain the src code
+5. Upon loading the plugins you will recieve an error w/ Popura. It's because you need to hook into the MySQL database.
+6. Enjoy!
+
+------------------------------------------------------
diff --git a/README.md b/README.md
index ec3b130..95e5603 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# ViperMC-2016-or-some-shit
\ No newline at end of file
+Viper
diff --git a/ViperCore/.gitignore b/ViperCore/.gitignore
new file mode 100644
index 0000000..fff3a70
--- /dev/null
+++ b/ViperCore/.gitignore
@@ -0,0 +1,6 @@
+*.iml
+bin/
+META-INF/
+target/
+.idea/
+upload.sh
\ No newline at end of file
diff --git a/ViperCore/libs/GenricUtils-1.0-SNAPSHOT.jar b/ViperCore/libs/GenricUtils-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..0ca7e5b
Binary files /dev/null and b/ViperCore/libs/GenricUtils-1.0-SNAPSHOT.jar differ
diff --git a/ViperCore/libs/HCFactions.jar b/ViperCore/libs/HCFactions.jar
new file mode 100644
index 0000000..474c8a0
Binary files /dev/null and b/ViperCore/libs/HCFactions.jar differ
diff --git a/ViperCore/libs/KoTH.jar b/ViperCore/libs/KoTH.jar
new file mode 100644
index 0000000..59aa4e1
Binary files /dev/null and b/ViperCore/libs/KoTH.jar differ
diff --git a/ViperCore/libs/Popura-1.0-SNAPSHOT.jar b/ViperCore/libs/Popura-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..0c18a34
Binary files /dev/null and b/ViperCore/libs/Popura-1.0-SNAPSHOT.jar differ
diff --git a/ViperCore/libs/Vault-1.4.1.jar b/ViperCore/libs/Vault-1.4.1.jar
new file mode 100644
index 0000000..d4d4ecc
Binary files /dev/null and b/ViperCore/libs/Vault-1.4.1.jar differ
diff --git a/ViperCore/libs/paperspigot-1.7.10-R0.1-SNAPSHOT.jar b/ViperCore/libs/paperspigot-1.7.10-R0.1-SNAPSHOT.jar
new file mode 100644
index 0000000..794f22b
Binary files /dev/null and b/ViperCore/libs/paperspigot-1.7.10-R0.1-SNAPSHOT.jar differ
diff --git a/ViperCore/libs/paperspigot-api-1.7.10-R0.1-SNAPSHOT.jar b/ViperCore/libs/paperspigot-api-1.7.10-R0.1-SNAPSHOT.jar
new file mode 100644
index 0000000..2bddac4
Binary files /dev/null and b/ViperCore/libs/paperspigot-api-1.7.10-R0.1-SNAPSHOT.jar differ
diff --git a/ViperCore/out/artifacts/DeltaCore/DeltaCore.jar b/ViperCore/out/artifacts/DeltaCore/DeltaCore.jar
new file mode 100644
index 0000000..fec910c
Binary files /dev/null and b/ViperCore/out/artifacts/DeltaCore/DeltaCore.jar differ
diff --git a/ViperCore/pom.xml b/ViperCore/pom.xml
new file mode 100644
index 0000000..e7fbf85
--- /dev/null
+++ b/ViperCore/pom.xml
@@ -0,0 +1,92 @@
+
+
+ 4.0.0
+
+ net.libhalt.bukkit.kaede
+ ViperCore
+ 0.0.8
+
+
+
+ spigot-repo
+ https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+
+
+ sk89q-repo
+ http://maven.sk89q.com/repo/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.2
+
+
+ 1.7
+
+
+
+
+ ${project.artifactId}
+
+
+
+
+
+ org.spigotmc
+ spigot-api
+ 1.8-R0.1-SNAPSHOT
+
+ system
+ ${project.basedir}/libs/paperspigot-api-1.7.10-R0.1-SNAPSHOT.jar
+
+
+ org.spigotmc
+ spigot-server
+ 1.8-R0.1-SNAPSHOT
+
+ system
+ ${project.basedir}/libs/paperspigot-1.7.10-R0.1-SNAPSHOT.jar
+
+
+ io.syuu
+ GenericUtils
+ 0.0.8
+
+ system
+ ${project.basedir}/libs/GenricUtils-1.0-SNAPSHOT.jar
+
+
+ io.syuu
+ Popura
+ 0.0.8
+ system
+ ${project.basedir}/libs/Popura-1.0-SNAPSHOT.jar
+
+
+ vault
+ vault
+ LATEST
+ system
+ ${project.basedir}/libs/Vault-1.4.1.jar
+
+
+
+ subside.plugins
+ KoTH
+ LATEST
+ system
+ ${project.basedir}/libs/KoTH.jar
+
+
+ com.sk89q
+ worldguard
+ 6.1.1-SNAPSHOT
+
+
+
\ No newline at end of file
diff --git a/ViperCore/src/main/java/cloth/bugs/FenceGateBug.java b/ViperCore/src/main/java/cloth/bugs/FenceGateBug.java
new file mode 100644
index 0000000..246ac2a
--- /dev/null
+++ b/ViperCore/src/main/java/cloth/bugs/FenceGateBug.java
@@ -0,0 +1,76 @@
+package cloth.bugs;
+
+import com.igodlik3.subclaims.FactionsUtils;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.syuu.popura.faction.FactionType;
+import net.syuu.popura.faction.bean.Faction;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.bukkit.util.Vector;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.UUID;
+
+/**
+ * Created by Brennan on 6/18/2017.
+ */
+public class FenceGateBug implements Listener
+{
+
+ HCFactionPlugin plugin;
+ public FenceGateBug(HCFactionPlugin instance){
+ this.plugin = instance;
+ }
+
+ @EventHandler
+ public void openDoor(PlayerInteractEvent e)
+ {
+ final Player p = e.getPlayer();
+ if(e.getClickedBlock() != null)
+ {
+ if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK))
+ {
+ if(e.getClickedBlock().getType() == Material.FENCE_GATE)
+ {
+ if(FactionsUtils.getFactionAt(e.getClickedBlock().getLocation()) != null)
+ {
+ if(FactionsUtils.getFactionAt(e.getClickedBlock().getLocation()).getFactionType() != FactionType.WARZONE)
+ {
+ Faction pFaction = FactionsUtils.getFaction(p);
+ Faction lFaction = FactionsUtils.getFactionAt(e.getClickedBlock().getLocation());
+
+ if(pFaction == null)
+ {
+ if(p.getLocation().subtract(0, 1, 0).getBlock().getType() == Material.AIR || p.getLocation().subtract(0, 1, 0).getBlock().getType() == Material.FENCE_GATE)
+ {
+ return;
+ }
+
+ p.setVelocity(p.getLocation().getDirection().multiply(-1).setY(0));
+ return;
+ }
+
+ if(!pFaction.equals(lFaction))
+ {
+ if(p.getLocation().subtract(0, 1, 0).getBlock().getType() == Material.AIR || p.getLocation().subtract(0, 1, 0).getBlock().getType() == Material.FENCE_GATE)
+ {
+ return;
+ }
+
+ p.setVelocity(p.getLocation().getDirection().multiply(-1).setY(0));
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/cloth/pearls/PearlInteractEvent.java b/ViperCore/src/main/java/cloth/pearls/PearlInteractEvent.java
new file mode 100644
index 0000000..6ba11b8
--- /dev/null
+++ b/ViperCore/src/main/java/cloth/pearls/PearlInteractEvent.java
@@ -0,0 +1,55 @@
+package cloth.pearls;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.manager.EnderPearlManager;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.Sound;
+import org.bukkit.entity.EnderPearl;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+
+/**
+ * Created by Brennan on 6/27/2017.
+ */
+public class PearlInteractEvent implements Listener
+{
+
+ HCFactionPlugin plugin;
+ public PearlInteractEvent(HCFactionPlugin instance){
+ this.plugin = instance;
+ }
+
+ @EventHandler
+ public void onInteract(PlayerInteractEvent e)
+ {
+ Player p = e.getPlayer();
+ if(p.getItemInHand() != null)
+ {
+ if(p.getItemInHand().getType() == Material.ENDER_PEARL)
+ {
+ if(e.getAction() == Action.RIGHT_CLICK_AIR)
+ {
+ if(!EnderPearlManager.isCooldownActive(e.getPlayer()))
+ {
+ e.setCancelled(true);
+
+ if(p.getItemInHand().getAmount() == 1)
+ {
+ p.setItemInHand(new ItemStack(Material.AIR));
+ } else {
+ p.getItemInHand().setAmount(p.getItemInHand().getAmount() - 1);
+ }
+
+ EnderPearl pearl = e.getPlayer().launchProjectile(EnderPearl.class);
+ return;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/cloth/portals/NetherPortalEvent.java b/ViperCore/src/main/java/cloth/portals/NetherPortalEvent.java
new file mode 100644
index 0000000..6b1d2cb
--- /dev/null
+++ b/ViperCore/src/main/java/cloth/portals/NetherPortalEvent.java
@@ -0,0 +1,41 @@
+package cloth.portals;
+
+import com.igodlik3.subclaims.FactionsUtils;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerChangedWorldEvent;
+import org.bukkit.event.player.PlayerPortalEvent;
+import org.bukkit.event.player.PlayerTeleportEvent;
+
+/**
+ * Created by Brennan on 6/15/2017.
+ */
+public class NetherPortalEvent implements Listener
+{
+
+ HCFactionPlugin plugin;
+ public NetherPortalEvent(HCFactionPlugin instance)
+ {
+ this.plugin = instance;
+ }
+
+ @EventHandler
+ public void onTeleport(PlayerPortalEvent e)
+ {
+ if(FactionsUtils.getFactionAt(e.getPlayer().getLocation()) != null)
+ {
+ String name = FactionsUtils.getFactionAt(e.getPlayer().getLocation()).getName();
+ if(name.equals("Spawn"))
+ {
+ if(e.getCause() == PlayerTeleportEvent.TeleportCause.NETHER_PORTAL){
+ e.setCancelled(true);
+ e.getPlayer().sendMessage(plugin.configdata.getConfigMessage("nether-portal-in-spawn").replaceAll("&", "§"));
+ return;
+ }
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/cloth/xp/XpBottleCommand.java b/ViperCore/src/main/java/cloth/xp/XpBottleCommand.java
new file mode 100644
index 0000000..42e6969
--- /dev/null
+++ b/ViperCore/src/main/java/cloth/xp/XpBottleCommand.java
@@ -0,0 +1,64 @@
+package cloth.xp;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import org.bukkit.Material;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+/**
+ * Created by Brennan on 6/16/2017.
+ */
+public class XpBottleCommand implements CommandExecutor
+{
+
+ HCFactionPlugin plugin;
+ public XpBottleCommand(HCFactionPlugin instance)
+ {
+ this.plugin = instance;
+ }
+
+ public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+
+ if(!(sender instanceof Player))
+ {
+ sender.sendMessage("Only players can use this command.");
+ return true;
+ }
+
+ Player p = (Player) sender;
+
+ if(p.getLevel() < 30)
+ {
+ String message = plugin.configdata.getConfigMessage("xp-bottle-insufficient").replaceAll("&", "§");
+ p.sendMessage(message);
+ return true;
+ }
+
+ if(p.getInventory().firstEmpty() == -1)
+ {
+ String message = plugin.configdata.getConfigMessage("xp-bottle-inventory").replaceAll("&", "§");
+ p.sendMessage(message);
+ return true;
+ }
+
+ String message = plugin.configdata.getConfigMessage("xp-bottle-created").replaceAll("&", "§");
+ p.sendMessage(message);
+ p.setLevel(p.getLevel() - 30);
+ giveBottle(p);
+ return true;
+ }
+
+ public void giveBottle(Player p){
+ String bottlename = plugin.configdata.getConfigMessage("xp-bottle-name").replaceAll("&", "§");
+ ItemStack bottle = new ItemStack(Material.EXP_BOTTLE);
+ ItemMeta meta = bottle.getItemMeta();
+ meta.setDisplayName(bottlename);
+ bottle.setItemMeta(meta);
+ p.getInventory().addItem(bottle);
+ return;
+ }
+}
diff --git a/ViperCore/src/main/java/cloth/xp/XpBottleEvent.java b/ViperCore/src/main/java/cloth/xp/XpBottleEvent.java
new file mode 100644
index 0000000..fd7f4ea
--- /dev/null
+++ b/ViperCore/src/main/java/cloth/xp/XpBottleEvent.java
@@ -0,0 +1,59 @@
+package cloth.xp;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import org.bukkit.Material;
+import org.bukkit.Sound;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+
+/**
+ * Created by Brennan on 6/16/2017.
+ */
+public class XpBottleEvent implements Listener
+{
+
+ HCFactionPlugin plugin;
+ public XpBottleEvent(HCFactionPlugin instance)
+ {
+ this.plugin = instance;
+ }
+
+ @EventHandler
+ public void onInteract(PlayerInteractEvent e) {
+ if(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK)
+ {
+ if(e.getPlayer().getItemInHand() != null)
+ {
+ if(e.getPlayer().getItemInHand().getType() == Material.EXP_BOTTLE)
+ {
+ if(e.getPlayer().getItemInHand().hasItemMeta())
+ {
+ if(e.getPlayer().getItemInHand().getItemMeta().hasDisplayName())
+ {
+ String xp_bottle_name = plugin.configdata.getConfigMessage("xp-bottle-name").replaceAll("&","§");
+ if(e.getPlayer().getItemInHand().getItemMeta().getDisplayName().equals(xp_bottle_name))
+ {
+ e.setCancelled(true);
+
+ if(e.getPlayer().getItemInHand().getAmount() > 1) {
+ e.getPlayer().getItemInHand().setAmount(e.getPlayer().getItemInHand().getAmount() - 1);
+ } else {
+ e.getPlayer().setItemInHand(new ItemStack(Material.AIR));
+ }
+
+ String message = plugin.configdata.getConfigMessage("xp-bottle-received").replaceAll("&", "§");
+ e.getPlayer().sendMessage(message);
+ e.getPlayer().setLevel(e.getPlayer().getLevel() + 30);
+ e.getPlayer().playSound(e.getPlayer().getLocation(), Sound.ORB_PICKUP, 1, 1);
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/confinement/filter/Filter.java b/ViperCore/src/main/java/com/confinement/filter/Filter.java
new file mode 100644
index 0000000..fd3b98d
--- /dev/null
+++ b/ViperCore/src/main/java/com/confinement/filter/Filter.java
@@ -0,0 +1,30 @@
+package com.confinement.filter;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.plugin.java.*;
+import org.bukkit.command.*;
+import com.confinement.filter.commands.*;
+import org.bukkit.*;
+import org.bukkit.event.*;
+import org.bukkit.plugin.*;
+import com.confinement.filter.listeners.*;
+
+public class Filter extends Manager
+{
+ public Filter(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ public void init() {
+ getPlugin().getCommand("cobble").setExecutor((CommandExecutor)new CobblestoneCommand());
+ getPlugin().getCommand("stone").setExecutor((CommandExecutor)new StoneCommand());
+ getPlugin().getCommand("mobdrops").setExecutor((CommandExecutor)new MobDropsCommand());
+ Bukkit.getServer().getPluginManager().registerEvents((Listener)new CobblestoneListener(), (Plugin)getPlugin());
+ Bukkit.getServer().getPluginManager().registerEvents((Listener)new StoneListener(), (Plugin)getPlugin());
+ Bukkit.getServer().getPluginManager().registerEvents((Listener)new MobDropsListener(), (Plugin)getPlugin());
+ }
+
+ public void onDisable() {
+ }
+}
diff --git a/ViperCore/src/main/java/com/confinement/filter/commands/CobblestoneCommand.java b/ViperCore/src/main/java/com/confinement/filter/commands/CobblestoneCommand.java
new file mode 100644
index 0000000..588a4fd
--- /dev/null
+++ b/ViperCore/src/main/java/com/confinement/filter/commands/CobblestoneCommand.java
@@ -0,0 +1,30 @@
+package com.confinement.filter.commands;
+
+import java.util.*;
+import org.bukkit.command.*;
+import org.bukkit.entity.*;
+import org.bukkit.*;
+
+public class CobblestoneCommand implements CommandExecutor
+{
+ public static final ArrayList cantPickup;
+
+ static {
+ cantPickup = new ArrayList();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ final Player player = (Player)sender;
+ if (cmd.getName().equalsIgnoreCase("cobble") && sender instanceof Player) {
+ if (args.length == 0 && !CobblestoneCommand.cantPickup.contains(player.getUniqueId())) {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7You are now &cunable &7to pickup cobblestone."));
+ CobblestoneCommand.cantPickup.add(player.getUniqueId());
+ }
+ else {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7You are now &aable &7to pickup cobblestone."));
+ CobblestoneCommand.cantPickup.remove(player.getUniqueId());
+ }
+ }
+ return true;
+ }
+}
diff --git a/ViperCore/src/main/java/com/confinement/filter/commands/MobDropsCommand.java b/ViperCore/src/main/java/com/confinement/filter/commands/MobDropsCommand.java
new file mode 100644
index 0000000..bd998c4
--- /dev/null
+++ b/ViperCore/src/main/java/com/confinement/filter/commands/MobDropsCommand.java
@@ -0,0 +1,30 @@
+package com.confinement.filter.commands;
+
+import java.util.*;
+import org.bukkit.command.*;
+import org.bukkit.entity.*;
+import org.bukkit.*;
+
+public class MobDropsCommand implements CommandExecutor
+{
+ public static final ArrayList cantPickupMobs;
+
+ static {
+ cantPickupMobs = new ArrayList();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ final Player player = (Player)sender;
+ if (cmd.getName().equalsIgnoreCase("mobdrops") && sender instanceof Player) {
+ if (args.length == 0 && !MobDropsCommand.cantPickupMobs.contains(player.getUniqueId().toString())) {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7You are now &cunable &7to pickup mob drops."));
+ MobDropsCommand.cantPickupMobs.add(player.getUniqueId().toString());
+ }
+ else {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7You are now &aable &7to pickup mob drops."));
+ MobDropsCommand.cantPickupMobs.remove(player.getUniqueId().toString());
+ }
+ }
+ return true;
+ }
+}
diff --git a/ViperCore/src/main/java/com/confinement/filter/commands/StoneCommand.java b/ViperCore/src/main/java/com/confinement/filter/commands/StoneCommand.java
new file mode 100644
index 0000000..de623d7
--- /dev/null
+++ b/ViperCore/src/main/java/com/confinement/filter/commands/StoneCommand.java
@@ -0,0 +1,30 @@
+package com.confinement.filter.commands;
+
+import java.util.*;
+import org.bukkit.command.*;
+import org.bukkit.entity.*;
+import org.bukkit.*;
+
+public class StoneCommand implements CommandExecutor
+{
+ public static final ArrayList cantPickupStone;
+
+ static {
+ cantPickupStone = new ArrayList();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ final Player player = (Player)sender;
+ if (cmd.getName().equalsIgnoreCase("stone") && sender instanceof Player) {
+ if (args.length == 0 && !StoneCommand.cantPickupStone.contains(player.getUniqueId())) {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7You are now &cunable &7to pickup stone!!"));
+ StoneCommand.cantPickupStone.add(player.getUniqueId());
+ }
+ else {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7You are now &aable &7to pickup stone."));
+ StoneCommand.cantPickupStone.remove(player.getUniqueId());
+ }
+ }
+ return true;
+ }
+}
diff --git a/ViperCore/src/main/java/com/confinement/filter/listeners/CobblestoneListener.java b/ViperCore/src/main/java/com/confinement/filter/listeners/CobblestoneListener.java
new file mode 100644
index 0000000..6fcc0bf
--- /dev/null
+++ b/ViperCore/src/main/java/com/confinement/filter/listeners/CobblestoneListener.java
@@ -0,0 +1,27 @@
+package com.confinement.filter.listeners;
+
+import org.bukkit.*;
+import com.confinement.filter.commands.*;
+import org.bukkit.entity.*;
+import org.bukkit.inventory.*;
+import org.bukkit.event.*;
+import org.bukkit.event.player.*;
+
+public class CobblestoneListener implements Listener
+{
+ @EventHandler
+ public void onPlayerPickup(final PlayerPickupItemEvent event) {
+ final Player player = event.getPlayer();
+ final ItemStack item = event.getItem().getItemStack();
+ final Material itemType = item.getType();
+ if (itemType == Material.COBBLESTONE && CobblestoneCommand.cantPickup.contains(player.getUniqueId())) {
+ event.setCancelled(true);
+ }
+ }
+
+ @EventHandler
+ public void onLeave(final PlayerQuitEvent event) {
+ final Player player = event.getPlayer();
+ CobblestoneCommand.cantPickup.remove(player.getUniqueId());
+ }
+}
diff --git a/ViperCore/src/main/java/com/confinement/filter/listeners/MobDropsListener.java b/ViperCore/src/main/java/com/confinement/filter/listeners/MobDropsListener.java
new file mode 100644
index 0000000..d3c0ed4
--- /dev/null
+++ b/ViperCore/src/main/java/com/confinement/filter/listeners/MobDropsListener.java
@@ -0,0 +1,35 @@
+package com.confinement.filter.listeners;
+
+import org.bukkit.*;
+import com.confinement.filter.commands.*;
+import org.bukkit.entity.*;
+import org.bukkit.inventory.*;
+import org.bukkit.event.*;
+import org.bukkit.event.player.*;
+
+public class MobDropsListener implements Listener
+{
+ @EventHandler
+ public void onPlayerPickup(final PlayerPickupItemEvent event) {
+ final Player player = event.getPlayer();
+ final ItemStack item = event.getItem().getItemStack();
+ final Material itemType = item.getType();
+ if ((itemType == Material.BONE || itemType == Material.ROTTEN_FLESH || itemType == Material.BOW ||
+ itemType == Material.SPIDER_EYE || itemType == Material.STRING || itemType == Material.ARROW ||
+ itemType == Material.POTATO
+ /*||itemType == Material.IRON_HELMET || itemType == Material.IRON_HELMET ||
+ itemType == Material.IRON_CHESTPLATE || itemType == Material.IRON_LEGGINGS || itemType == Material.IRON_BOOTS
+ || itemType == Material.GOLD_HELMET || itemType == Material.GOLD_CHESTPLATE || itemType == Material.GOLD_LEGGINGS ||
+ itemType == Material.GOLD_BOOTS || itemType == Material.CHAINMAIL_HELMET || itemType == Material.CHAINMAIL_CHESTPLATE ||
+ itemType == Material.CHAINMAIL_LEGGINGS || itemType == Material.CHAINMAIL_BOOTS || itemType == Material.LEATHER_HELMET ||
+ itemType == Material.LEATHER_CHESTPLATE || itemType == Material.LEATHER_LEGGINGS || itemType == Material.LEATHER_BOOTS */) && MobDropsCommand.cantPickupMobs.contains(player.getUniqueId().toString())) {
+ event.setCancelled(true);
+ }
+ }
+
+ @EventHandler
+ public void onLeave(final PlayerQuitEvent event) {
+ final Player player = event.getPlayer();
+ MobDropsCommand.cantPickupMobs.remove(player.getUniqueId().toString());
+ }
+}
diff --git a/ViperCore/src/main/java/com/confinement/filter/listeners/StoneListener.java b/ViperCore/src/main/java/com/confinement/filter/listeners/StoneListener.java
new file mode 100644
index 0000000..f4137f9
--- /dev/null
+++ b/ViperCore/src/main/java/com/confinement/filter/listeners/StoneListener.java
@@ -0,0 +1,27 @@
+package com.confinement.filter.listeners;
+
+import org.bukkit.*;
+import com.confinement.filter.commands.*;
+import org.bukkit.entity.*;
+import org.bukkit.inventory.*;
+import org.bukkit.event.*;
+import org.bukkit.event.player.*;
+
+public class StoneListener implements Listener
+{
+ @EventHandler
+ public void onPlayerPickup(final PlayerPickupItemEvent event) {
+ final Player player = event.getPlayer();
+ final ItemStack item = event.getItem().getItemStack();
+ final Material itemType = item.getType();
+ if (itemType == Material.STONE && StoneCommand.cantPickupStone.contains(player.getUniqueId())) {
+ event.setCancelled(true);
+ }
+ }
+
+ @EventHandler
+ public void onLeave(final PlayerQuitEvent event) {
+ final Player player = event.getPlayer();
+ StoneCommand.cantPickupStone.remove(player.getUniqueId());
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/ItemBuilder.java b/ViperCore/src/main/java/com/igodlik3/ItemBuilder.java
new file mode 100644
index 0000000..4fa816f
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/ItemBuilder.java
@@ -0,0 +1,677 @@
+package com.igodlik3;
+
+import org.bukkit.inventory.*;
+import org.bukkit.material.*;
+import org.bukkit.enchantments.*;
+import java.util.*;
+import org.apache.commons.lang.*;
+import org.bukkit.configuration.file.*;
+import org.bukkit.inventory.meta.*;
+import net.minecraft.util.com.google.gson.*;
+import org.bukkit.*;
+import java.lang.reflect.*;
+
+public class ItemBuilder
+{
+ private ItemStack item;
+ private ItemMeta meta;
+ private Material material;
+ private int amount;
+ private MaterialData data;
+ private short damage;
+ private Map enchantments;
+ private String displayname;
+ private List lore;
+ private boolean andSymbol;
+ private boolean unsafeStackSize;
+
+ public ItemBuilder(Material material) {
+ this.material = Material.STONE;
+ this.amount = 1;
+ this.damage = 0;
+ this.enchantments = new HashMap();
+ this.lore = new ArrayList();
+ this.andSymbol = true;
+ this.unsafeStackSize = false;
+ if (material == null) {
+ material = Material.AIR;
+ }
+ this.item = new ItemStack(material);
+ this.material = material;
+ }
+
+ public ItemBuilder(Material material, int amount) {
+ this.material = Material.STONE;
+ this.amount = 1;
+ this.damage = 0;
+ this.enchantments = new HashMap();
+ this.lore = new ArrayList();
+ this.andSymbol = true;
+ this.unsafeStackSize = false;
+ if (material == null) {
+ material = Material.AIR;
+ }
+ if ((amount > material.getMaxStackSize() || amount <= 0) && !this.unsafeStackSize) {
+ amount = 1;
+ }
+ this.amount = amount;
+ this.item = new ItemStack(material, amount);
+ this.material = material;
+ }
+
+ public ItemBuilder(Material material, int amount, final String displayname) {
+ this.material = Material.STONE;
+ this.amount = 1;
+ this.damage = 0;
+ this.enchantments = new HashMap();
+ this.lore = new ArrayList();
+ this.andSymbol = true;
+ this.unsafeStackSize = false;
+ if (material == null) {
+ material = Material.AIR;
+ }
+ Validate.notNull((Object)displayname, "The Displayname is null.");
+ this.item = new ItemStack(material, amount);
+ this.material = material;
+ if ((amount > material.getMaxStackSize() || amount <= 0) && !this.unsafeStackSize) {
+ amount = 1;
+ }
+ this.amount = amount;
+ this.displayname = displayname;
+ }
+
+ public ItemBuilder(Material material, final String displayname) {
+ this.material = Material.STONE;
+ this.amount = 1;
+ this.damage = 0;
+ this.enchantments = new HashMap();
+ this.lore = new ArrayList();
+ this.andSymbol = true;
+ this.unsafeStackSize = false;
+ if (material == null) {
+ material = Material.AIR;
+ }
+ Validate.notNull((Object)displayname, "The Displayname is null.");
+ this.item = new ItemStack(material);
+ this.material = material;
+ this.displayname = displayname;
+ }
+
+ public ItemBuilder(final ItemStack item) {
+ this.material = Material.STONE;
+ this.amount = 1;
+ this.damage = 0;
+ this.enchantments = new HashMap();
+ this.lore = new ArrayList();
+ this.andSymbol = true;
+ this.unsafeStackSize = false;
+ Validate.notNull((Object)item, "The Item is null.");
+ this.item = item;
+ if (item.hasItemMeta()) {
+ this.meta = item.getItemMeta();
+ }
+ this.material = item.getType();
+ this.amount = item.getAmount();
+ this.data = item.getData();
+ this.damage = item.getDurability();
+ this.enchantments = (Map)item.getEnchantments();
+ if (item.hasItemMeta()) {
+ this.displayname = item.getItemMeta().getDisplayName();
+ }
+ if (item.hasItemMeta()) {
+ this.lore = (List)item.getItemMeta().getLore();
+ }
+ }
+
+ public ItemBuilder(final FileConfiguration cfg, final String path) {
+ this(cfg.getItemStack(path));
+ }
+
+ public ItemBuilder(final ItemBuilder builder) {
+ this.material = Material.STONE;
+ this.amount = 1;
+ this.damage = 0;
+ this.enchantments = new HashMap();
+ this.lore = new ArrayList();
+ this.andSymbol = true;
+ this.unsafeStackSize = false;
+ Validate.notNull((Object)builder, "The ItemBuilder is null.");
+ this.item = builder.item;
+ this.meta = builder.meta;
+ this.material = builder.material;
+ this.amount = builder.amount;
+ this.damage = builder.damage;
+ this.data = builder.data;
+ this.damage = builder.damage;
+ this.enchantments = builder.enchantments;
+ this.displayname = builder.displayname;
+ this.lore = builder.lore;
+ }
+
+ public ItemBuilder amount(int amount) {
+ if ((amount > this.material.getMaxStackSize() || amount <= 0) && !this.unsafeStackSize) {
+ amount = 1;
+ }
+ this.amount = amount;
+ return this;
+ }
+
+ public ItemBuilder data(final MaterialData data) {
+ Validate.notNull((Object)data, "The Data is null.");
+ this.data = data;
+ return this;
+ }
+
+ @Deprecated
+ public ItemBuilder damage(final short damage) {
+ this.damage = damage;
+ return this;
+ }
+
+ public ItemBuilder durability(final short damage) {
+ this.damage = damage;
+ return this;
+ }
+
+ public ItemBuilder material(final Material material) {
+ Validate.notNull((Object)material, "The Material is null.");
+ this.material = material;
+ return this;
+ }
+
+ public ItemBuilder meta(final ItemMeta meta) {
+ Validate.notNull((Object)meta, "The Meta is null.");
+ this.meta = meta;
+ return this;
+ }
+
+ public ItemBuilder enchant(final Enchantment enchant, final int level) {
+ Validate.notNull((Object)enchant, "The Enchantment is null.");
+ this.enchantments.put(enchant, level);
+ return this;
+ }
+
+ public ItemBuilder enchant(final Map enchantments) {
+ Validate.notNull((Object)enchantments, "The Enchantments are null.");
+ this.enchantments = enchantments;
+ return this;
+ }
+
+ public ItemBuilder displayname(final String displayname) {
+ Validate.notNull((Object)displayname, "The Displayname is null.");
+ this.displayname = (this.andSymbol ? ChatColor.translateAlternateColorCodes('&', displayname) : displayname);
+ return this;
+ }
+
+ public ItemBuilder lore(final String line) {
+ Validate.notNull((Object)line, "The Line is null.");
+ this.lore.add(this.andSymbol ? ChatColor.translateAlternateColorCodes('&', line) : line);
+ return this;
+ }
+
+ public ItemBuilder lore(final List lore) {
+ Validate.notNull((Object)lore, "The Lores are null.");
+ this.lore = lore;
+ return this;
+ }
+
+ @Deprecated
+ public ItemBuilder lores(final String... lines) {
+ Validate.notNull((Object)lines, "The Lines are null.");
+ for (final String line : lines) {
+ this.lore(this.andSymbol ? ChatColor.translateAlternateColorCodes('&', line) : line);
+ }
+ return this;
+ }
+
+ public ItemBuilder lore(final String... lines) {
+ Validate.notNull((Object)lines, "The Lines are null.");
+ for (final String line : lines) {
+ this.lore(this.andSymbol ? ChatColor.translateAlternateColorCodes('&', line) : line);
+ }
+ return this;
+ }
+
+ public ItemBuilder lore(final String line, final int index) {
+ Validate.notNull((Object)line, "The Line is null.");
+ this.lore.set(index, this.andSymbol ? ChatColor.translateAlternateColorCodes('&', line) : line);
+ return this;
+ }
+
+ public ItemBuilder unbreakable(final boolean unbreakable) {
+ this.meta.spigot().setUnbreakable(unbreakable);
+ return this;
+ }
+
+ @Deprecated
+ public ItemBuilder owner(final String user) {
+ Validate.notNull((Object)user, "The Username is null.");
+ if (this.material == Material.SKULL_ITEM || this.material == Material.SKULL) {
+ final SkullMeta smeta = (SkullMeta)this.meta;
+ smeta.setOwner(user);
+ this.meta = (ItemMeta)smeta;
+ }
+ return this;
+ }
+
+ public Unsafe unsafe() {
+ return new Unsafe(this);
+ }
+
+ @Deprecated
+ public ItemBuilder replaceAndSymbol() {
+ this.replaceAndSymbol(!this.andSymbol);
+ return this;
+ }
+
+ public ItemBuilder replaceAndSymbol(final boolean replace) {
+ this.andSymbol = replace;
+ return this;
+ }
+
+ public ItemBuilder toggleReplaceAndSymbol() {
+ this.replaceAndSymbol(!this.andSymbol);
+ return this;
+ }
+
+ public ItemBuilder unsafeStackSize(final boolean allow) {
+ this.unsafeStackSize = allow;
+ return this;
+ }
+
+ public ItemBuilder toggleUnsafeStackSize() {
+ this.unsafeStackSize(!this.unsafeStackSize);
+ return this;
+ }
+
+ public String getDisplayname() {
+ return this.displayname;
+ }
+
+ public int getAmount() {
+ return this.amount;
+ }
+
+ public Map getEnchantments() {
+ return this.enchantments;
+ }
+
+ @Deprecated
+ public short getDamage() {
+ return this.damage;
+ }
+
+ public short getDurability() {
+ return this.damage;
+ }
+
+ public List getLores() {
+ return this.lore;
+ }
+
+ public boolean getAndSymbol() {
+ return this.andSymbol;
+ }
+
+ public Material getMaterial() {
+ return this.material;
+ }
+
+ public ItemMeta getMeta() {
+ return this.meta;
+ }
+
+ public MaterialData getData() {
+ return this.data;
+ }
+
+ @Deprecated
+ public List getLore() {
+ return this.lore;
+ }
+
+ public ItemBuilder toConfig(final FileConfiguration cfg, final String path) {
+ cfg.set(path, (Object)this.build());
+ return this;
+ }
+
+ public ItemBuilder fromConfig(final FileConfiguration cfg, final String path) {
+ return new ItemBuilder(cfg, path);
+ }
+
+ public static void toConfig(final FileConfiguration cfg, final String path, final ItemBuilder builder) {
+ cfg.set(path, (Object)builder.build());
+ }
+
+ public String toJson() {
+ return new Gson().toJson((Object)this);
+ }
+
+ public static String toJson(final ItemBuilder builder) {
+ return new Gson().toJson((Object)builder);
+ }
+
+ public static ItemBuilder fromJson(final String json) {
+ return (ItemBuilder)new Gson().fromJson(json, (Class)ItemBuilder.class);
+ }
+
+ public ItemBuilder applyJson(final String json, final boolean overwrite) {
+ final ItemBuilder b = (ItemBuilder)new Gson().fromJson(json, (Class)ItemBuilder.class);
+ if (overwrite) {
+ return b;
+ }
+ if (b.displayname != null) {
+ this.displayname = b.displayname;
+ }
+ if (b.data != null) {
+ this.data = b.data;
+ }
+ if (b.material != null) {
+ this.material = b.material;
+ }
+ if (b.lore != null) {
+ this.lore = b.lore;
+ }
+ if (b.enchantments != null) {
+ this.enchantments = b.enchantments;
+ }
+ if (b.item != null) {
+ this.item = b.item;
+ }
+ this.damage = b.damage;
+ this.amount = b.amount;
+ return this;
+ }
+
+ public ItemStack build() {
+ this.item.setType(this.material);
+ this.item.setAmount(this.amount);
+ this.item.setDurability(this.damage);
+ this.meta = this.item.getItemMeta();
+ if (this.data != null) {
+ this.item.setData(this.data);
+ }
+ if (this.enchantments.size() > 0) {
+ this.item.addUnsafeEnchantments((Map)this.enchantments);
+ }
+ if (this.displayname != null) {
+ this.meta.setDisplayName(this.displayname);
+ }
+ if (this.lore.size() > 0) {
+ this.meta.setLore((List)this.lore);
+ }
+ this.item.setItemMeta(this.meta);
+ return this.item;
+ }
+
+ static /* synthetic */ void access$1(final ItemBuilder itemBuilder, final ItemStack item) {
+ itemBuilder.item = item;
+ }
+
+ public class Unsafe
+ {
+ protected final ReflectionUtils utils;
+ protected final ItemBuilder builder;
+
+ public Unsafe(final ItemBuilder builder) {
+ this.utils = new ReflectionUtils();
+ this.builder = builder;
+ }
+
+ public Unsafe setString(final String key, final String value) {
+ ItemBuilder.access$1(this.builder, this.utils.setString(this.builder.item, key, value));
+ return this;
+ }
+
+ public String getString(final String key) {
+ return this.utils.getString(this.builder.item, key);
+ }
+
+ public Unsafe setInt(final String key, final int value) {
+ ItemBuilder.access$1(this.builder, this.utils.setInt(this.builder.item, key, value));
+ return this;
+ }
+
+ public int getInt(final String key) {
+ return this.utils.getInt(this.builder.item, key);
+ }
+
+ public Unsafe setDouble(final String key, final double value) {
+ ItemBuilder.access$1(this.builder, this.utils.setDouble(this.builder.item, key, value));
+ return this;
+ }
+
+ public double getDouble(final String key) {
+ return this.utils.getDouble(this.builder.item, key);
+ }
+
+ public Unsafe setBoolean(final String key, final boolean value) {
+ ItemBuilder.access$1(this.builder, this.utils.setBoolean(this.builder.item, key, value));
+ return this;
+ }
+
+ public boolean getBoolean(final String key) {
+ return this.utils.getBoolean(this.builder.item, key);
+ }
+
+ public boolean containsKey(final String key) {
+ return this.utils.hasKey(this.builder.item, key);
+ }
+
+ public ItemBuilder builder() {
+ return this.builder;
+ }
+
+ public class ReflectionUtils
+ {
+ public String getString(final ItemStack item, final String key) {
+ Object compound = this.getNBTTagCompound(this.getItemAsNMSStack(item));
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ return (String)compound.getClass().getMethod("getString", String.class).invoke(compound, key);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+ public ItemStack setString(final ItemStack item, final String key, final String value) {
+ Object nmsItem = this.getItemAsNMSStack(item);
+ Object compound = this.getNBTTagCompound(nmsItem);
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ compound.getClass().getMethod("setString", String.class, String.class).invoke(compound, key, value);
+ nmsItem = this.setNBTTag(compound, nmsItem);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+ ex.printStackTrace();
+ }
+ return this.getItemAsBukkitStack(nmsItem);
+ }
+
+ public int getInt(final ItemStack item, final String key) {
+ Object compound = this.getNBTTagCompound(this.getItemAsNMSStack(item));
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ return (int)compound.getClass().getMethod("getInt", String.class).invoke(compound, key);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+ ex.printStackTrace();
+ return -1;
+ }
+ }
+
+ public ItemStack setInt(final ItemStack item, final String key, final int value) {
+ Object nmsItem = this.getItemAsNMSStack(item);
+ Object compound = this.getNBTTagCompound(nmsItem);
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ compound.getClass().getMethod("setInt", String.class, Integer.class).invoke(compound, key, value);
+ nmsItem = this.setNBTTag(compound, nmsItem);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+ ex.printStackTrace();
+ }
+ return this.getItemAsBukkitStack(nmsItem);
+ }
+
+ public double getDouble(final ItemStack item, final String key) {
+ Object compound = this.getNBTTagCompound(this.getItemAsNMSStack(item));
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ return (double)compound.getClass().getMethod("getDouble", String.class).invoke(compound, key);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+
+ ex.printStackTrace();
+ return Double.NaN;
+ }
+ }
+
+ public ItemStack setDouble(final ItemStack item, final String key, final double value) {
+ Object nmsItem = this.getItemAsNMSStack(item);
+ Object compound = this.getNBTTagCompound(nmsItem);
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ compound.getClass().getMethod("setDouble", String.class, Double.class).invoke(compound, key, value);
+ nmsItem = this.setNBTTag(compound, nmsItem);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+
+ ex.printStackTrace();
+ }
+ return this.getItemAsBukkitStack(nmsItem);
+ }
+
+ public boolean getBoolean(final ItemStack item, final String key) {
+ Object compound = this.getNBTTagCompound(this.getItemAsNMSStack(item));
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ return (boolean)compound.getClass().getMethod("getBoolean", String.class).invoke(compound, key);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+
+ ex.printStackTrace();
+ return false;
+ }
+ }
+
+ public ItemStack setBoolean(final ItemStack item, final String key, final boolean value) {
+ Object nmsItem = this.getItemAsNMSStack(item);
+ Object compound = this.getNBTTagCompound(nmsItem);
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ compound.getClass().getMethod("setBoolean", String.class, Boolean.class).invoke(compound, key, value);
+ nmsItem = this.setNBTTag(compound, nmsItem);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+
+ ex.printStackTrace();
+ }
+ return this.getItemAsBukkitStack(nmsItem);
+ }
+
+ public boolean hasKey(final ItemStack item, final String key) {
+ Object compound = this.getNBTTagCompound(this.getItemAsNMSStack(item));
+ if (compound == null) {
+ compound = this.getNewNBTTagCompound();
+ }
+ try {
+ return (boolean)compound.getClass().getMethod("hasKey", String.class).invoke(compound, key);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public Object getNewNBTTagCompound() {
+ final String ver = Bukkit.getServer().getClass().getPackage().getName().split(".")[3];
+ try {
+ return Class.forName("net.minecraft.server." + ver + ".NBTTagCompound").newInstance();
+ }
+ catch (ClassNotFoundException | IllegalAccessException | InstantiationException ex) {
+
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+ public Object setNBTTag(final Object tag, final Object item) {
+ try {
+ item.getClass().getMethod("setTag", item.getClass()).invoke(item, tag);
+ return item;
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+ public Object getNBTTagCompound(final Object nmsStack) {
+ try {
+ return nmsStack.getClass().getMethod("getTag", (Class>[])new Class[0]).invoke(nmsStack, new Object[0]);
+ }
+ catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
+
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+ public Object getItemAsNMSStack(final ItemStack item) {
+ try {
+ final Method m = this.getCraftItemStackClass().getMethod("asNMSCopy", ItemStack.class);
+ return m.invoke(this.getCraftItemStackClass(), item);
+ }
+ catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) {
+
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+ public ItemStack getItemAsBukkitStack(final Object nmsStack) {
+ try {
+ final Method m = this.getCraftItemStackClass().getMethod("asCraftMirror", nmsStack.getClass());
+ return (ItemStack)m.invoke(this.getCraftItemStackClass(), nmsStack);
+ }
+ catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) {
+
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+ public Class> getCraftItemStackClass() {
+ final String ver = Bukkit.getServer().getClass().getPackage().getName().split(".")[3];
+ try {
+ return Class.forName("org.bukkit.craftbukkit." + ver + ".inventory.CraftItemStack");
+ }
+ catch (ClassNotFoundException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/Conquest.java b/ViperCore/src/main/java/com/igodlik3/conquest/Conquest.java
new file mode 100644
index 0000000..93bdf42
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/Conquest.java
@@ -0,0 +1,97 @@
+package com.igodlik3.conquest;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.configuration.Configuration;
+import com.igodlik3.conquest.utils.*;
+import com.igodlik3.conquest.event.*;
+import org.bukkit.*;
+import org.bukkit.event.*;
+import com.igodlik3.conquest.loot.*;
+import com.igodlik3.conquest.listener.*;
+import org.bukkit.plugin.*;
+import com.igodlik3.conquest.commands.*;
+import org.bukkit.command.*;
+import com.igodlik3.conquest.task.*;
+
+public class Conquest extends Manager
+{
+ private static Conquest instance;
+ private ConquestManager conquestManager;
+ private LootManager lootManager;
+
+
+ private ConfigurationWrapper config;
+
+ public Configuration getConfig(){
+ return config.getConfig();
+ }
+ private Config storage;
+
+ public Conquest(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.setUpConfig();
+ (Conquest.instance = this).registerManagers();
+ this.registerListeners();
+ this.registerCommands();
+ }
+
+ @Override
+ public void tear() {
+
+ if (this.conquestManager.getRunningGame() != null) {
+ this.conquestManager.setRunningGame(null);
+ }
+ }
+
+ private void registerListeners() {
+ final PluginManager pm = Bukkit.getPluginManager();
+ pm.registerEvents((Listener)new ScoreboardListener(), this.getPlugin());
+ pm.registerEvents((Listener)new SelectionListener(), this.getPlugin());
+ pm.registerEvents((Listener)new ChestListener(), this.getPlugin());
+ pm.registerEvents((Listener)new PlayerListener(), this.getPlugin());
+ }
+
+ private void registerCommands() {
+ registerCommand("conquest" , (CommandExecutor)new CmdConquest());
+ }
+
+
+ private void registerManagers() {
+ this.conquestManager = new ConquestManager();
+ this.lootManager = new LootManager();
+ new ConquestTask().runTaskTimer(getPlugin(), 20L, 20L);
+ }
+
+ private void setUpConfig() {
+ config = new ConfigurationWrapper("conquest.yml", this.getPlugin());
+ config.saveDefault();
+ final Config config = new Config("plugins/" + getPlugin().getName() + "/storage", "conqueset-storage.yml", getPlugin());
+ config.create();
+ if (!config.exists() || config.toFile().exists()) {
+ config.saveConfig();
+ }
+ this.storage = config;
+ }
+
+ public static Conquest getInstance() {
+ return Conquest.instance;
+ }
+
+ public ConquestManager getConquestManager() {
+ return this.conquestManager;
+ }
+
+ public LootManager getLootManager() {
+ return this.lootManager;
+ }
+
+ public Config getStorage() {
+ return this.storage;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/commands/CmdConquest.java b/ViperCore/src/main/java/com/igodlik3/conquest/commands/CmdConquest.java
new file mode 100644
index 0000000..dd60518
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/commands/CmdConquest.java
@@ -0,0 +1,269 @@
+package com.igodlik3.conquest.commands;
+
+import org.bukkit.configuration.*;
+import com.igodlik3.conquest.loot.*;
+import com.igodlik3.conquest.*;
+import org.bukkit.command.*;
+import org.bukkit.entity.*;
+import com.igodlik3.conquest.utils.*;
+import com.igodlik3.conquest.listener.*;
+import com.igodlik3.conquest.event.*;
+import org.bukkit.*;
+import java.util.*;
+import org.bukkit.block.*;
+
+public class CmdConquest implements CommandExecutor
+{
+ private Configuration config;
+ private ConquestManager cm;
+ private LootManager lm;
+ private ChestLootManager chest;
+ private ChestKey key;
+
+ public CmdConquest() {
+ this.config = (Configuration)Conquest.getInstance().getConfig();
+ this.cm = Conquest.getInstance().getConquestManager();
+ this.lm = Conquest.getInstance().getLootManager();
+ this.chest = new ChestLootManager();
+ this.key = new ChestKey();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (!(sender instanceof Player)) {
+ return true;
+ }
+ final Player player = (Player)sender;
+ if (args.length == 0) {
+ this.sendUsage(player);
+ }
+ else if (args[0].equalsIgnoreCase("create")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ if (args.length < 2) {
+ this.sendUsage(player);
+ }
+ else {
+ final String name = args[1];
+ if (this.cm.gameExists(name)) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.ALREADY-EXIST")));
+ return true;
+ }
+ this.cm.saveOrUpdateGame(new ConquestGame(name));
+ player.sendMessage(Utils.color(this.config.getString("Messages.CREATED").replaceAll("%NAME%", name)));
+ }
+ }
+ else if (args[0].equalsIgnoreCase("delete")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ if (args.length < 2) {
+ this.sendUsage(player);
+ }
+ else {
+ final String name = args[1];
+ final ConquestGame game = this.cm.getGame(name);
+ if (game == null) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.DOESNT-EXIST")));
+ }
+ else if (this.cm.getRunningGame() != null && game.getName().equals(this.cm.getRunningGame().getName())) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.CONQUEST-RUNNING")));
+ }
+ else {
+ this.cm.deleteGame(game);
+ player.sendMessage(Utils.color(this.config.getString("Messages.DELETED").replaceAll("%NAME%", name)));
+ }
+ }
+ }
+ else if (args[0].equalsIgnoreCase("start")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ if (args.length < 2) {
+ this.sendUsage(player);
+ }
+ else {
+ if (this.cm.getRunningGame() != null) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.CONQUEST-RUNNING")));
+ return true;
+ }
+ final ConquestGame game2 = this.cm.getGame(args[1]);
+ if (game2 == null) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.DOESNT-EXIST")));
+ return true;
+ }
+ if (!game2.isComplete()) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.INCOMPLET-CONQUEST")));
+ return true;
+ }
+ this.cm.startConquest(game2);
+ this.cm.setRunningGame(game2);
+ }
+ }
+ else if (args[0].equalsIgnoreCase("stop")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ final ConquestGame game2 = this.cm.getRunningGame();
+ if (game2 == null) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.NONE-RUNNING-CONQUEST")));
+ return true;
+ }
+ this.cm.setRunningGame(null);
+ this.cm.resetRunningGameData();
+ Bukkit.broadcastMessage(Utils.color(this.config.getString("Messages.CONQUEST-STOPPED").replaceAll("%NAME%", game2.getName())));
+ }
+ else if (args[0].equalsIgnoreCase("area")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ if (args.length < 3) {
+ this.sendUsage(player);
+ }
+ else {
+ final ConquestGame game2 = this.cm.getGame(args[1]);
+ if (game2 == null) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.DOESNT-EXIST")));
+ return true;
+ }
+ if (this.cm.getRunningGame() != null && game2.getName().equals(this.cm.getRunningGame().getName())) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.CONQUEST-RUNNING")));
+ return true;
+ }
+ if (!SelectionListener.isCorrectSelection(player)) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.NO-SELECTION")));
+ return true;
+ }
+ ConquestArea.Type type;
+ try {
+ type = ConquestArea.Type.valueOf(args[2].toUpperCase());
+ }
+ catch (IllegalArgumentException e) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.INVALID-AREA")));
+ return true;
+ }
+ final Location loc1 = SelectionListener.getSelection(player).get(0);
+ final Location loc2 = SelectionListener.getSelection(player).get(1);
+ final boolean wasComplete = game2.isComplete();
+ game2.setArea(type, new ConquestArea(game2, type, loc1, loc2));
+ this.cm.saveOrUpdateGame(game2);
+ player.sendMessage(Utils.color(this.config.getString("Messages.AREA-UPTADED")));
+ if (!wasComplete && game2.isComplete()) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.CONQUEST-READY").replaceAll("%NAME%", args[1])));
+ }
+ }
+ }
+ else if (args[0].equalsIgnoreCase("list")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ final Set games = this.cm.listGames();
+ if (games == null || games.isEmpty()) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.NONE-CONQUEST")));
+ }
+ else {
+ for (final String game3 : games) {
+ player.sendMessage(Utils.color("&c- &e" + game3));
+ }
+ }
+ }
+ else if (args[0].equalsIgnoreCase("tp")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ if (args.length < 2) {
+ this.sendUsage(player);
+ }
+ else {
+ final String name = args[1];
+ final ConquestGame game = this.cm.getGame(name);
+ if (game == null) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.DOESNT-EXIST")));
+ return true;
+ }
+ final Location loc3 = this.cm.getConquestCubo(game.getArea(ConquestArea.Type.RED)).getCenter();
+ player.teleport(loc3);
+ player.sendMessage(Utils.color(this.config.getString("Messages.TELEPORTATION")));
+ }
+ }
+ else if (args[0].equalsIgnoreCase("editloot")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ this.lm.openLoot(player, true);
+ }
+ else if (args[0].equalsIgnoreCase("wand")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ SelectionListener.getWand(player);
+ }
+ else if (args[0].equalsIgnoreCase("loot")) {
+ this.lm.openLoot(player, false);
+ }
+ else if (args[0].equalsIgnoreCase("chest")) {
+ if (!this.hasPermission(player)) {
+ return true;
+ }
+ if (args.length < 2) {
+ this.sendUsage(player);
+ }
+ else if (args[1].equalsIgnoreCase("create")) {
+ final Block block = player.getTargetBlock((HashSet)null, 10);
+ if ((block != null && block.getType() == Material.CHEST) || block.getType() == Material.ENDER_CHEST || block.getType() == Material.TRAPPED_CHEST) {
+ if (this.chest.isChestLoot(block.getLocation())) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.ALREADY-CHESTLOOT")));
+ }
+ else {
+ player.sendMessage(Utils.color(this.config.getString("Messages.CHEST-LOOT-CREATED")));
+ this.chest.addLocation(block.getLocation());
+ }
+ }
+ else {
+ player.sendMessage(Utils.color(this.config.getString("Messages.NOT-A-CHEST")));
+ }
+ }
+ else if (args[1].equalsIgnoreCase("delete")) {
+ final Block block = player.getTargetBlock((HashSet)null, 10);
+ if ((block != null && block.getType() == Material.CHEST) || block.getType() == Material.ENDER_CHEST || block.getType() == Material.TRAPPED_CHEST) {
+ if (this.chest.isChestLoot(block.getLocation())) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.CHEST-LOOT-REMOVED")));
+ this.chest.removeLocation(block.getLocation());
+ }
+ else {
+ player.sendMessage(Utils.color(this.config.getString("Messages.NOT-A-CHESTLOOT")));
+ }
+ }
+ else {
+ player.sendMessage(Utils.color(this.config.getString("Messages.NOT-A-CHEST")));
+ }
+ }
+ else if (args[1].equalsIgnoreCase("key")) {
+ this.key.giveKey(player);
+ player.sendMessage(Utils.color("&aKey received !"));
+ }
+ }
+ return true;
+ }
+
+ private void sendUsage(final Player player) {
+ if (this.hasPermission(player)) {
+ for (final String stg : this.config.getStringList("Messages.USAGE.STAFF")) {
+ player.sendMessage(Utils.color(stg));
+ }
+ }
+ else {
+ for (final String stg : this.config.getStringList("Messages.USAGE.PLAYER")) {
+ player.sendMessage(Utils.color(stg));
+ }
+ }
+ }
+
+ private boolean hasPermission(final Player player) {
+ if (player.hasPermission("Conquest.Admin")) {
+ return true;
+ }
+ player.sendMessage(Utils.color(this.config.getString("Messages.NO-PERM")));
+ return false;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestArea.java b/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestArea.java
new file mode 100644
index 0000000..b69ef84
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestArea.java
@@ -0,0 +1,45 @@
+package com.igodlik3.conquest.event;
+
+import org.bukkit.*;
+
+public class ConquestArea
+{
+ private ConquestGame game;
+ private Type type;
+ private Location loc1;
+ private Location loc2;
+
+ public ConquestArea(final ConquestGame game, final Type type, final Location loc1, final Location loc2) {
+ this.game = game;
+ this.type = type;
+ this.loc1 = loc1;
+ this.loc2 = loc2;
+ }
+
+ public ConquestGame getGame() {
+ return this.game;
+ }
+
+ public Type getType() {
+ return this.type;
+ }
+
+ public Location getLoc1() {
+ return this.loc1;
+ }
+
+ public Location getLoc2() {
+ return this.loc2;
+ }
+
+ public enum Type
+ {
+ RED("RED", 0),
+ GREEN("GREEN", 1),
+ BLUE("BLUE", 2),
+ YELLOW("YELLOW", 3);
+
+ private Type(final String s, final int n) {
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestData.java b/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestData.java
new file mode 100644
index 0000000..3bf0868
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestData.java
@@ -0,0 +1,93 @@
+package com.igodlik3.conquest.event;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.entity.*;
+import java.util.*;
+import com.igodlik3.conquest.*;
+
+public class ConquestData
+{
+ private Map factionsPoints;
+ private Map capTime;
+ private Set containedFactions;
+ private Map firstCapper;
+
+ public ConquestData() {
+ this.factionsPoints = new HashMap();
+ this.capTime = new HashMap();
+ this.containedFactions = new HashSet();
+ this.firstCapper = new HashMap();
+ }
+
+ public Map getFactionsPoints() {
+ return this.factionsPoints;
+ }
+
+ public int getFactionPoints(final Player player) {
+ final FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+
+ return factionPlayer.getFaction() != null ? this.getFactionPoints(factionPlayer.getFaction()) : -1;
+ }
+
+ public int getFactionPoints(final Faction faction) {
+ return this.factionsPoints.containsKey(faction.getName()) ? this.factionsPoints.get(faction.getName()) : -1;
+ }
+
+ public void setFactionsPoints(final Faction faction, final int points, final boolean contained) {
+ if (contained) {
+ this.containedFactions.add(faction);
+ }
+ this.factionsPoints.put(faction.getName(), points);
+ }
+
+ public void setFactionsPoints(final Player player, final int points) {
+ final FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+
+ if (factionPlayer.getFaction() != null) {
+ this.setFactionsPoints(factionPlayer.getFaction(), points, true);
+ }
+ }
+
+ public boolean capPoint(final Faction faction, final ConquestArea.Type type) {
+ this.containedFactions.add(faction);
+ if (!this.capTime.containsKey(type)) {
+ this.capTime.put(type, 0);
+ return false;
+ }
+ final int time = this.capTime.get(type) + 1;
+ this.capTime.put(type, time);
+ final boolean capped = time >= Conquest.getInstance().getConfig().getInt("CONQUEST.Cap-Time");
+ if (capped) {
+ this.capTime.put(type, 0);
+ }
+ return capped;
+ }
+
+ public int getCapTime(final ConquestArea.Type type) {
+ final Integer time = this.capTime.get(type);
+ return (time == null) ? 0 : time;
+ }
+
+ public void resetTime(final ConquestArea.Type type) {
+ this.capTime.put(type, 0);
+ }
+
+ public Set getContainedFactions() {
+ return this.containedFactions;
+ }
+
+ public Player getFirstCapper(final ConquestArea.Type type) {
+ return this.firstCapper.get(type);
+ }
+
+ public void setFirstCapper(final ConquestArea.Type type, final Player capper) {
+ if (capper == null) {
+ this.firstCapper.remove(type);
+ }
+ else {
+ this.firstCapper.put(type, capper);
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestGame.java b/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestGame.java
new file mode 100644
index 0000000..75c7b33
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestGame.java
@@ -0,0 +1,39 @@
+package com.igodlik3.conquest.event;
+
+public class ConquestGame
+{
+ private ConquestArea[] areas;
+ private String name;
+
+ public ConquestGame(final String name) {
+ this.areas = new ConquestArea[ConquestArea.Type.values().length];
+ this.name = name;
+ }
+
+ public void setArea(final ConquestArea.Type type, final ConquestArea area) {
+ this.areas[type.ordinal()] = area;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public ConquestArea getArea(final ConquestArea.Type type) {
+ return this.areas[type.ordinal()];
+ }
+
+ public ConquestArea[] getAreas() {
+ return this.areas;
+ }
+
+ public boolean isComplete() {
+ ConquestArea[] areas;
+ for (int length = (areas = this.areas).length, i = 0; i < length; ++i) {
+ final ConquestArea area = areas[i];
+ if (area == null) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestManager.java b/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestManager.java
new file mode 100644
index 0000000..0409e80
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/event/ConquestManager.java
@@ -0,0 +1,115 @@
+package com.igodlik3.conquest.event;
+
+import com.igodlik3.conquest.*;
+import com.igodlik3.conquest.utils.*;
+import org.bukkit.configuration.*;
+import org.bukkit.*;
+import java.util.*;
+
+public class ConquestManager
+{
+ private ConquestData runningGameData;
+ private Configuration config;
+ private Configuration data;
+ private Map cuboCache;
+
+ public ConquestManager() {
+ this.config = (Configuration)Conquest.getInstance().getConfig();
+ this.data = (Configuration)Conquest.getInstance().getStorage().getConfig();
+ this.cuboCache = new HashMap();
+ }
+
+ public boolean gameExists(final String name) {
+ return this.data.contains("conquest." + name);
+ }
+
+ public void saveOrUpdateGame(final ConquestGame game) {
+ final ConfigurationSection section = this.gameExists("conquest." + game.getName()) ? this.data.getConfigurationSection("conquest." + game.getName()) : this.data.createSection("conquest." + game.getName());
+ for (int i = 0; i < ConquestArea.Type.values().length; ++i) {
+ final ConquestArea area = game.getArea(ConquestArea.Type.values()[i]);
+ if (area == null) {
+ section.set("area." + i, (Object)null);
+ }
+ else {
+ section.set("area." + i + ".loc1", (Object)Utils.stringifyLocation(area.getLoc1()));
+ section.set("area." + i + ".loc2", (Object)Utils.stringifyLocation(area.getLoc2()));
+ }
+ Conquest.getInstance().getStorage().saveConfig();
+ }
+ }
+
+ public ConquestGame getGame(final String name) {
+ if (!this.gameExists(name)) {
+ return null;
+ }
+ final ConfigurationSection section = this.data.getConfigurationSection("conquest." + name);
+ final ConquestGame game = new ConquestGame(name);
+ for (int i = 0; i < ConquestArea.Type.values().length; ++i) {
+ if (section.contains("area." + i)) {
+ game.setArea(ConquestArea.Type.values()[i], new ConquestArea(game, ConquestArea.Type.values()[i], Utils.destringifyLocation(section.getString("area." + i + ".loc1")), Utils.destringifyLocation(section.getString("area." + i + ".loc2"))));
+ }
+ }
+ return game;
+ }
+
+ public void startConquest(final ConquestGame game) {
+ this.setRunningGame(game);
+ Bukkit.broadcastMessage(Utils.color(this.config.getString("Messages.CONQUEST-STARTED").replaceAll("%NAME%", game.getName()).replaceAll("%POINTS%", String.valueOf(this.config.getInt("CONQUEST.Required-Points")))));
+ }
+
+ public Cuboid getConquestCubo(final ConquestArea area) {
+ if (this.cuboCache.containsKey(area)) {
+ return this.cuboCache.get(area);
+ }
+ final Cuboid cubo = new Cuboid(area.getLoc1(), area.getLoc2());
+ this.cuboCache.put(area, cubo);
+ return cubo;
+ }
+
+ public void deleteGame(final ConquestGame game) {
+ this.deleteGame(game.getName());
+ }
+
+ public void deleteGame(final String name) {
+ if (!this.gameExists(name)) {
+ return;
+ }
+ this.data.set("conquest." + name, (Object)null);
+ Conquest.getInstance().getStorage().saveConfig();
+ }
+
+ public Set listGames() {
+ if (this.data.isConfigurationSection("conquest")) {
+ return (Set)this.data.getConfigurationSection("conquest").getKeys(false);
+ }
+ return null;
+ }
+
+ public ConquestGame getRunningGame() {
+ if (!this.data.contains("conquest.running")) {
+ return null;
+ }
+ return this.getGame(this.data.getString("conquest.running"));
+ }
+
+ public boolean setRunningGame(final ConquestGame game) {
+ this.data.set("conquest.running", (Object)((game != null) ? game.getName() : null));
+ Conquest.getInstance().getStorage().saveConfig();
+ if (game == null) {
+ this.runningGameData = null;
+ }
+ else {
+ this.runningGameData = new ConquestData();
+ }
+ return true;
+ }
+
+ public void resetRunningGameData() {
+ this.data.set("rdata", (Object)null);
+ Conquest.getInstance().getStorage().saveConfig();
+ }
+
+ public ConquestData getRunningGameData() {
+ return this.runningGameData;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/listener/PlayerListener.java b/ViperCore/src/main/java/com/igodlik3/conquest/listener/PlayerListener.java
new file mode 100644
index 0000000..dacd821
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/listener/PlayerListener.java
@@ -0,0 +1,44 @@
+package com.igodlik3.conquest.listener;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.configuration.*;
+import com.igodlik3.conquest.*;
+import org.bukkit.event.entity.*;
+import org.bukkit.entity.*;
+import com.igodlik3.conquest.utils.*;
+import com.igodlik3.conquest.event.*;
+import java.util.*;
+import org.bukkit.event.*;
+
+public class PlayerListener implements Listener
+{
+ private Configuration config;
+ private ConquestManager cm;
+
+ public PlayerListener() {
+ this.config = (Configuration)Conquest.getInstance().getConfig();
+ this.cm = Conquest.getInstance().getConquestManager();
+ }
+
+ @EventHandler
+ public void onPlayerDeath(final PlayerDeathEvent event) {
+ final Player player = event.getEntity();
+ if (this.config.getBoolean("CONQUEST.Penality.enabled") && this.cm.getRunningGame() != null) {
+ final ConquestData ca = this.cm.getRunningGameData();
+ final FactionPlayer fp = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+
+ if (fp.getFaction() != null) {
+ final Faction faction = fp.getFaction();
+ final int penality = this.config.getInt("CONQUEST.Penality.points");
+ if (ca.getFactionPoints(faction) >= penality) {
+ ca.setFactionsPoints(faction, ca.getFactionPoints(faction) - penality, false);
+ for (final Player pls : faction.getOnlineMembers()) {
+ pls.sendMessage(Utils.color(this.config.getString("Messages.PENALITY").replaceAll("%POINTS%", String.valueOf(penality))));
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/listener/ScoreboardListener.java b/ViperCore/src/main/java/com/igodlik3/conquest/listener/ScoreboardListener.java
new file mode 100644
index 0000000..4cf451c
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/listener/ScoreboardListener.java
@@ -0,0 +1,75 @@
+package com.igodlik3.conquest.listener;
+
+import net.syuu.popura.PopuraPlugin;
+import org.bukkit.configuration.*;
+import com.igodlik3.conquest.*;
+import net.libhalt.bukkit.kaede.event.*;
+import org.bukkit.event.*;
+import com.igodlik3.conquest.event.*;
+import java.util.*;
+
+public class ScoreboardListener implements Listener
+{
+ private String[] placeholders;
+ private ConquestManager cm;
+ private Configuration config;
+
+ public ScoreboardListener() {
+ this.cm = Conquest.getInstance().getConquestManager();
+ this.config = (Configuration)Conquest.getInstance().getConfig();
+ this.placeholders = new String[] { "%CONQUEST_RED%", "%CONQUEST_GREEN%", "%CONQUEST_BLUE%", "%CONQUEST_YELLOW%", "%FACTION_1_NAME%", "%FACTION_1_POINT%", "%FACTION_2_NAME%", "%FACTION_2_POINT%", "%FACTION_3_NAME%", "%FACTION_3_POINT%", "%FACTION_4_NAME%", "%FACTION_4_POINT%" };
+ }
+
+ @EventHandler
+ public void onScoreboardUpdate(final ScoreboardTextAboutToUpdateEvent event) {
+ String[] placeholders;
+ for (int length = (placeholders = this.placeholders).length, i = 0; i < length; ++i) {
+ final String string = placeholders[i];
+ if (event.getText() != null && event.getText().contains(string)) {
+ if (this.cm.getRunningGame() == null) {
+ event.setText((String)null);
+ }
+ else {
+ event.setText(this.convertPlaceholder(event.getText()));
+ }
+ }
+ }
+ }
+
+ private String convertPlaceholder(String text) {
+ final ConquestGame game = this.cm.getRunningGame();
+ if (game != null) {
+ ConquestArea[] areas;
+ for (int length = (areas = game.getAreas()).length, j = 0; j < length; ++j) {
+ final ConquestArea area = areas[j];
+ if (text.contains("%CONQUEST_" + area.getType().name() + "%")) {
+ final String time = String.valueOf(this.config.getInt("CONQUEST.Cap-Time") - this.cm.getRunningGameData().getCapTime(area.getType())) + "s";
+ text = text.replaceAll("%CONQUEST_" + area.getType().name() + "%", time);
+ }
+ }
+ final List> ranking = new LinkedList>(this.cm.getRunningGameData().getFactionsPoints().entrySet());
+ Collections.sort(ranking, new Comparator>() {
+ @Override
+ public int compare(final Map.Entry o1, final Map.Entry o2) {
+ return o2.getValue() - o1.getValue();
+ }
+ });
+ for (int i = 1; i < 5; ++i) {
+ final Map.Entry entry = (i > ranking.size()) ? null : ranking.get(i - 1);
+ if (text.contains("%FACTION_" + i + "_NAME%")) {
+ if (entry == null) {
+ return null;
+ }
+ text = text.replaceAll("%FACTION_" + i + "_NAME%", PopuraPlugin.getInstance().getPopura().getFactionDataManager().getFaction((String)entry.getKey()).getName());
+ }
+ if (text.contains("%FACTION_" + i + "_POINT%")) {
+ if (entry == null) {
+ return null;
+ }
+ text = text.replaceAll("%FACTION_" + i + "_POINT%", new StringBuilder().append(entry.getValue()).toString());
+ }
+ }
+ }
+ return text;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/listener/SelectionListener.java b/ViperCore/src/main/java/com/igodlik3/conquest/listener/SelectionListener.java
new file mode 100644
index 0000000..58bcf6e
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/listener/SelectionListener.java
@@ -0,0 +1,74 @@
+package com.igodlik3.conquest.listener;
+
+import com.igodlik3.ItemBuilder;
+import org.bukkit.entity.*;
+import org.bukkit.event.player.*;
+import org.bukkit.event.block.*;
+import org.bukkit.*;
+import org.bukkit.block.*;
+import org.bukkit.inventory.*;
+import org.bukkit.event.*;
+import java.util.*;
+import com.igodlik3.conquest.utils.*;
+
+public class SelectionListener implements Listener
+{
+ private static Map> selectionMap;
+
+ static {
+ SelectionListener.selectionMap = new HashMap>();
+ }
+
+ @EventHandler
+ public void onInteract(final PlayerInteractEvent event) {
+ final Player player = event.getPlayer();
+ final Block block = event.getClickedBlock();
+ final Map map = SelectionListener.selectionMap.containsKey(player) ? SelectionListener.selectionMap.get(player) : new HashMap();
+ if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
+ if (event.getItem() != null && event.getItem().getType() == Material.GOLD_HOE) {
+ final ItemStack item = event.getItem();
+ if (this.isWand(item)) {
+ event.setCancelled(true);
+ map.put("1", block.getLocation());
+ SelectionListener.selectionMap.put(player, map);
+ player.sendMessage(Utils.color("&dSelected the 2# point !"));
+ }
+ }
+ }
+ else if (event.getAction() == Action.LEFT_CLICK_BLOCK && event.getItem() != null && event.getItem().getType() == Material.GOLD_HOE) {
+ final ItemStack item = event.getItem();
+ if (this.isWand(item)) {
+ event.setCancelled(true);
+ map.put("2", block.getLocation());
+ SelectionListener.selectionMap.put(player, map);
+ player.sendMessage(Utils.color("&dSelected the 1# point !"));
+ }
+ }
+ }
+
+ public static boolean isCorrectSelection(final Player player) {
+ return SelectionListener.selectionMap.containsKey(player) && SelectionListener.selectionMap.get(player).size() == 2;
+ }
+
+ public static List getSelection(final Player player) {
+ final List result = new ArrayList();
+ if (!isCorrectSelection(player)) {
+ return null;
+ }
+ final Location loc1 = SelectionListener.selectionMap.get(player).get("1");
+ final Location loc2 = SelectionListener.selectionMap.get(player).get("2");
+ result.add(loc1);
+ result.add(loc2);
+ return result;
+ }
+
+ private boolean isWand(final ItemStack item) {
+ return item.hasItemMeta() && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equalsIgnoreCase(Utils.color("&e&lRegion &6Wand"));
+ }
+
+ public static void getWand(final Player player) {
+ final ItemStack wand = new ItemBuilder(Material.GOLD_HOE).displayname("&e&lRegion &6Wand").build();
+ player.getInventory().addItem(new ItemStack[] { wand });
+ player.updateInventory();
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestKey.java b/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestKey.java
new file mode 100644
index 0000000..9055c03
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestKey.java
@@ -0,0 +1,53 @@
+package com.igodlik3.conquest.loot;
+
+import com.igodlik3.ItemBuilder;
+import org.bukkit.configuration.*;
+import com.igodlik3.conquest.*;
+import org.bukkit.entity.*;
+import org.bukkit.inventory.*;
+import org.bukkit.*;
+import com.igodlik3.conquest.utils.*;
+import java.text.*;
+import java.util.*;
+
+public class ChestKey
+{
+ private Configuration config;
+
+ public ChestKey() {
+ this.config = (Configuration)Conquest.getInstance().getConfig();
+ }
+
+ public void removeKey(final Player player) {
+ final int amount = player.getItemInHand().getAmount();
+ if (amount == 1) {
+ player.setItemInHand((ItemStack)null);
+ }
+ else {
+ player.getItemInHand().setAmount(amount - 1);
+ }
+ }
+
+ public boolean isKey(final ItemStack item) {
+ if (item != null && item.getType() == Material.TRIPWIRE_HOOK && item.hasItemMeta() && item.getItemMeta().hasDisplayName()) {
+ final String display = item.getItemMeta().getDisplayName();
+ final String d = this.config.getString("CONQUEST.Loot.Key.name");
+ return display.equalsIgnoreCase(Utils.color(d));
+ }
+ return false;
+ }
+
+ public void giveKey(final Player player) {
+ ItemStack key = null;
+ final List lore = (List)this.config.getStringList("CONQUEST.Loot.Key.lore");
+ final List formatted = new ArrayList();
+ final String display = this.config.getString("CONQUEST.Loot.Key.name");
+ final DateFormat dateFormat = new SimpleDateFormat(this.config.getString("Messages.Date-Format"));
+ final Date date = new Date();
+ for (final String stg : lore) {
+ formatted.add(Utils.color(stg).replaceAll("%DATE%", dateFormat.format(date)).replaceAll("%PLAYER%", player.getName()));
+ }
+ key = new ItemBuilder(Material.TRIPWIRE_HOOK).displayname(display).lore(formatted).build();
+ player.getInventory().addItem(new ItemStack[] { key });
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestListener.java b/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestListener.java
new file mode 100644
index 0000000..9276c69
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestListener.java
@@ -0,0 +1,82 @@
+package com.igodlik3.conquest.loot;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.configuration.*;
+import com.igodlik3.conquest.*;
+import org.bukkit.event.player.*;
+import org.bukkit.event.block.*;
+import com.igodlik3.conquest.utils.*;
+import org.bukkit.inventory.*;
+import org.bukkit.*;
+import org.bukkit.entity.*;
+import org.bukkit.block.*;
+import java.util.*;
+import org.bukkit.event.*;
+
+public class ChestListener implements Listener
+{
+ private Configuration config;
+ private ChestLootManager manager;
+ private LootManager lm;
+ private ChestKey key;
+
+ public ChestListener() {
+ this.config = (Configuration)Conquest.getInstance().getConfig();
+ this.manager = new ChestLootManager();
+ this.lm = Conquest.getInstance().getLootManager();
+ this.key = new ChestKey();
+ }
+
+ @EventHandler
+ public void onInteract(final PlayerInteractEvent event) {
+ final Player player = event.getPlayer();
+ if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
+ final Block block = event.getClickedBlock();
+ if (this.manager.isChestLoot(block.getLocation())) {
+ event.setCancelled(true);
+ final ItemStack item = event.getItem();
+ if (this.key.isKey(item)) {
+ final int lootNumber = this.config.getInt("CONQUEST.Loot-Number");
+ if (this.lm.getLootList().isEmpty()) {
+ player.sendMessage(Utils.color("&4&lLoot not found ! &cPlease fill the chest loot with items &e/conquest editloot"));
+ return;
+ }
+ final List set = new ArrayList(this.lm.getLootList());
+ if (set.size() < lootNumber) {
+ player.sendMessage(Utils.color("&cPlease fill the chest loot with items. &eLoot size: " + set.size() + " &7- &eLoot needed: " + lootNumber));
+ return;
+ }
+ final Random r = new Random();
+ final FactionPlayer fp = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ Bukkit.broadcastMessage(Utils.color(this.config.getString("Messages.LOOT")).replaceAll("%PLAYER%", player.getName()).replaceAll("%FACTION%", fp.getFaction().getName()));
+ for (int i = 0; i < lootNumber; ++i) {
+ final ItemStack is = set.get(r.nextInt(set.size()));
+ player.getInventory().addItem(new ItemStack[] { is });
+ Bukkit.broadcastMessage(Utils.color("&7- &e" + this.stringifyItem(is)));
+ }
+ player.updateInventory();
+ this.key.removeKey(player);
+ }
+ else {
+ player.sendMessage(Utils.color(this.config.getString("Messages.CHEST-LOOT-NO-KEY")));
+ }
+ }
+ }
+ }
+
+ private String stringifyItem(final ItemStack item) {
+ String itemName;
+ if (item.hasItemMeta() && item.getItemMeta().hasDisplayName()) {
+ itemName = item.getItemMeta().getDisplayName();
+ }
+ else {
+ final String matName = item.getType().toString().replace("_", " ").toLowerCase();
+ itemName = String.valueOf(Character.toUpperCase(matName.charAt(0))) + matName.substring(1);
+ }
+ if (item.getAmount() > 1) {
+ return String.valueOf(item.getAmount()) + "x " + itemName;
+ }
+ return itemName;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestLootManager.java b/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestLootManager.java
new file mode 100644
index 0000000..e0f2112
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/loot/ChestLootManager.java
@@ -0,0 +1,63 @@
+package com.igodlik3.conquest.loot;
+
+import org.bukkit.configuration.*;
+import com.igodlik3.conquest.*;
+import org.bukkit.*;
+import com.igodlik3.conquest.utils.*;
+import java.util.*;
+
+public class ChestLootManager
+{
+ private Configuration storage;
+
+ public ChestLootManager() {
+ this.storage = (Configuration)Conquest.getInstance().getStorage().getConfig();
+ }
+
+ public boolean isChestLoot(final Location loc) {
+ final List list = this.getLocations();
+ if (list.isEmpty()) {
+ return false;
+ }
+ for (final Location l : list) {
+ if (l != null && l.getBlockX() == loc.getBlockX() && l.getBlockZ() == loc.getBlockZ() && l.getBlockY() == loc.getBlockY()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public List getLocations() {
+ final List list = new ArrayList();
+ if (!this.storage.contains("chestloot.location")) {
+ return list;
+ }
+ for (final String stg : this.storage.getStringList("chestloot.location")) {
+ list.add(Utils.destringifyLocation(stg));
+ }
+ return list;
+ }
+
+ public void removeLocation(final Location loc) {
+ final String string = Utils.stringifyLocation(loc);
+ final List strings = new ArrayList(this.storage.getStringList("chestloot.location"));
+ for (final String stg : this.storage.getStringList("chestloot.location")) {
+ if (stg.equals(string)) {
+ strings.remove(string);
+ }
+ }
+ this.storage.set("chestloot.location", (Object)strings);
+ Conquest.getInstance().getStorage().saveConfig();
+ }
+
+ public void addLocation(final Location location) {
+ final String string = Utils.stringifyLocation(location);
+ final List strings = new ArrayList(this.storage.getStringList("chestloot.location"));
+ if (strings.contains(string)) {
+ return;
+ }
+ strings.add(string);
+ this.storage.set("chestloot.location", (Object)strings);
+ Conquest.getInstance().getStorage().saveConfig();
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/loot/LootManager.java b/ViperCore/src/main/java/com/igodlik3/conquest/loot/LootManager.java
new file mode 100644
index 0000000..dfd290c
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/loot/LootManager.java
@@ -0,0 +1,125 @@
+package com.igodlik3.conquest.loot;
+
+import org.bukkit.configuration.*;
+import com.igodlik3.conquest.*;
+import org.bukkit.plugin.*;
+import org.bukkit.*;
+import org.bukkit.inventory.*;
+import java.util.*;
+import org.bukkit.entity.*;
+import com.igodlik3.conquest.utils.*;
+import org.bukkit.event.*;
+import org.bukkit.event.inventory.*;
+
+public class LootManager implements Listener
+{
+ private Configuration storage;
+ private Set lootEditors;
+ private Inventory inv;
+ private List lootList;
+
+ public LootManager() {
+ this.storage = (Configuration)Conquest.getInstance().getStorage().getConfig();
+ this.lootEditors = new HashSet();
+ this.lootList = new ArrayList();
+ this.reloadLoot();
+ Bukkit.getPluginManager().registerEvents((Listener)this, Conquest.getInstance().getPlugin());
+ }
+
+ public void loadLoot() {
+ final Object value = this.storage.get("Loot");
+ if (value != null) {
+ ItemStack[] contents = null;
+ if (value instanceof ItemStack[]) {
+ contents = (ItemStack[])value;
+ }
+ else if (value instanceof List) {
+ contents = (ItemStack[]) ((List)value).toArray(new ItemStack[0]);
+ }
+ this.inv.setContents(contents);
+ ItemStack[] array;
+ for (int length = (array = contents).length, i = 0; i < length; ++i) {
+ final ItemStack is = array[i];
+ if (is != null && is.getType() != Material.AIR) {
+ this.lootList.add(is);
+ }
+ }
+ }
+ }
+
+ public void saveLoot() {
+ this.storage.set("Loot", (Object)this.inv.getContents());
+ Conquest.getInstance().getStorage().saveConfig();
+ this.lootList.clear();
+ ItemStack[] contents;
+ for (int length = (contents = this.inv.getContents()).length, i = 0; i < length; ++i) {
+ final ItemStack is = contents[i];
+ if (is != null && is.getType() != Material.AIR) {
+ this.lootList.add(is);
+ }
+ }
+ }
+
+ public void reloadLoot() {
+ final int size = 36;
+ this.inv = Bukkit.createInventory((InventoryHolder)null, size, "Conquest Loot");
+ this.loadLoot();
+ }
+
+ public ItemStack getRandomLoot() {
+ final Random r = new Random();
+ return this.lootList.get(r.nextInt(this.lootList.size()));
+ }
+
+ public void openLoot(final Player player, final boolean access) {
+ player.openInventory(this.inv);
+ if (access) {
+ this.lootEditors.add(player.getUniqueId());
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onInventoryClose(final InventoryCloseEvent event) {
+ final Player player = (Player)event.getPlayer();
+ final UUID uuid = player.getUniqueId();
+ final Inventory inv = event.getInventory();
+ boolean eventInv = false;
+ if (inv != null && inv.getName() != null) {
+ if (inv.getName().equalsIgnoreCase("Conquest Loot")) {
+ eventInv = true;
+ }
+ if (eventInv) {
+ final String name = inv.getName();
+ if (this.lootEditors.contains(uuid)) {
+ this.saveLoot();
+ player.sendMessage(Utils.color("&aSaving loot for &d" + name + " &a!"));
+ this.lootEditors.remove(uuid);
+ }
+ }
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onInventoryClick(final InventoryClickEvent event) {
+ final Player player = (Player)event.getWhoClicked();
+ final UUID uuid = player.getUniqueId();
+ final Inventory inv = event.getInventory();
+ boolean eventInv = false;
+ if (inv != null && inv.getName() != null) {
+ if (inv.getName().equalsIgnoreCase("Conquest Loot")) {
+ eventInv = true;
+ }
+ if (eventInv && !this.lootEditors.contains(uuid)) {
+ event.setCancelled(true);
+ }
+ }
+ }
+
+ public Inventory getInv() {
+ return this.inv;
+ }
+
+ public List getLootList() {
+ return this.lootList;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/task/ConquestTask.java b/ViperCore/src/main/java/com/igodlik3/conquest/task/ConquestTask.java
new file mode 100644
index 0000000..809118d
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/task/ConquestTask.java
@@ -0,0 +1,119 @@
+package com.igodlik3.conquest.task;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.scheduler.*;
+import org.bukkit.configuration.*;
+import com.igodlik3.conquest.*;
+import org.bukkit.entity.*;
+import com.igodlik3.conquest.loot.*;
+import com.igodlik3.conquest.event.*;
+import com.igodlik3.conquest.utils.*;
+import java.util.*;
+import org.bukkit.*;
+
+public class ConquestTask extends BukkitRunnable
+{
+ private Configuration config;
+
+ public ConquestTask() {
+ this.config = (Configuration)Conquest.getInstance().getConfig();
+ }
+
+ public void run() {
+ if (Conquest.getInstance().getConquestManager().getRunningGame() == null) {
+ return;
+ }
+ final ConquestManager manager = Conquest.getInstance().getConquestManager();
+ final ConquestData data = manager.getRunningGameData();
+ final ConquestGame game = manager.getRunningGame();
+ ConquestArea.Type[] values;
+ for (int length = (values = ConquestArea.Type.values()).length, j = 0; j < length; ++j) {
+ final ConquestArea.Type type = values[j];
+ final ConquestArea area = game.getArea(type);
+ final Cuboid cubo = manager.getConquestCubo(area);
+ final List containedPlayers = new ArrayList();
+ final List containedFactions = new ArrayList();
+ for(Player player : Bukkit.getOnlinePlayers()){
+ final FactionPlayer fp = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if (fp.getFaction() != null) {
+ if (cubo.contains(player.getLocation())) {
+ containedPlayers.add(player);
+ if (!containedFactions.contains(fp.getFaction())) {
+ containedFactions.add(fp.getFaction());
+ }
+ }
+ }
+ }
+ if (containedFactions.size() == 0) {
+ data.resetTime(type);
+ data.setFirstCapper(area.getType(), null);
+ }
+ else {
+ if (data.getFirstCapper(area.getType()) != null && !containedFactions.contains(data.getFirstCapper(area.getType()))) {
+ data.setFirstCapper(area.getType(), null);
+ }
+ if (data.getFirstCapper(area.getType()) == null) {
+ data.setFirstCapper(area.getType(), containedPlayers.get(0));
+ }
+ final FactionPlayer fp2 = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(data.getFirstCapper(area.getType()));
+ if (fp2.getFaction() != null && data.capPoint(fp2.getFaction(), type)) {
+ int points = data.getFactionPoints(data.getFirstCapper(area.getType()));
+ points = ((points == -1) ? 1 : (points + 1));
+ data.setFactionsPoints(data.getFirstCapper(area.getType()), points);
+ if (String.valueOf(points).endsWith("0")) {
+ Bukkit.broadcastMessage(Utils.color(this.config.getString("Messages.CONQUEST-CAPPING").replaceAll("%POINTS%", String.valueOf(points)).replaceAll("%AREA%", this.getColor(area.getType()) + area.getType().name()).replaceAll("%FACTION%", fp2.getFaction().getName())));
+ }
+ if (data.getFactionPoints(data.getFirstCapper(area.getType())) >= this.config.getInt("CONQUEST.Required-Points")) {
+ manager.setRunningGame(null);
+ manager.resetRunningGameData();
+ Player player2 = null;
+ for (final Player testPlayer : containedPlayers) {
+ final FactionPlayer fp3 = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(testPlayer);
+ if (fp3.getFaction() == data.getFirstCapper(area.getType())) {
+ player2 = testPlayer;
+ break;
+ }
+ }
+ if (player2 == null) {
+ for(Player testPlayer : Bukkit.getOnlinePlayers()){
+ final FactionPlayer fp4 = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(testPlayer);
+ if (fp4.getFaction() == data.getFirstCapper(area.getType())) {
+ player2 = testPlayer;
+ break;
+ }
+ }
+ }
+ final FactionPlayer fp5 = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player2);
+ Bukkit.broadcastMessage(Utils.color(this.config.getString("Messages.Conquest.CONQUEST-WIN").replaceAll("%FACTION%", fp5.getFaction().getName()).replaceAll("%POINTS%", String.valueOf(this.config.getInt("CONQUEST.Required-Points")))));
+ final ChestKey key = new ChestKey();
+ for (int i = 0; i < this.config.getInt("Conquest.Loot.Key.amount"); ++i) {
+ key.giveKey(player2);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private ChatColor getColor(final ConquestArea.Type type) {
+ switch (type) {
+ case RED: {
+ return ChatColor.RED;
+ }
+ case YELLOW: {
+ return ChatColor.YELLOW;
+ }
+ case BLUE: {
+ return ChatColor.BLUE;
+ }
+ case GREEN: {
+ return ChatColor.GREEN;
+ }
+ default: {
+ return null;
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/utils/Config.java b/ViperCore/src/main/java/com/igodlik3/conquest/utils/Config.java
new file mode 100644
index 0000000..931e14b
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/utils/Config.java
@@ -0,0 +1,88 @@
+package com.igodlik3.conquest.utils;
+
+import org.bukkit.configuration.file.*;
+import com.google.common.base.*;
+import com.google.common.io.*;
+import java.util.logging.*;
+import java.nio.charset.*;
+import org.bukkit.configuration.*;
+import java.io.*;
+import org.bukkit.plugin.*;
+
+public class Config
+{
+ File f;
+ FileConfiguration cfg;
+ String path_;
+ String fileName_;
+ private Plugin main;
+
+ public Config(final String path, final String fileName, final Plugin JavaPluginExtender) {
+ this.main = JavaPluginExtender;
+ this.path_ = path;
+ this.fileName_ = fileName;
+ }
+
+ public void create() {
+ this.f = new File(this.path_, this.fileName_);
+ this.cfg = (FileConfiguration)YamlConfiguration.loadConfiguration(this.f);
+ }
+
+ public void setDefault(final String filename) {
+ final InputStream defConfigStream = this.main.getResource(filename);
+ if (defConfigStream == null) {
+ return;
+ }
+ YamlConfiguration defConfig;
+ if (this.isStrictlyUTF8()) {
+ defConfig = YamlConfiguration.loadConfiguration((Reader)new InputStreamReader(defConfigStream, Charsets.UTF_8));
+ }
+ else {
+ defConfig = new YamlConfiguration();
+ byte[] contents;
+ try {
+ contents = ByteStreams.toByteArray(defConfigStream);
+ }
+ catch (IOException e) {
+ this.main.getLogger().log(Level.SEVERE, "Unexpected failure reading " + filename, e);
+ return;
+ }
+ final String text = new String(contents, Charset.defaultCharset());
+ if (!text.equals(new String(contents, Charsets.UTF_8))) {
+ this.main.getLogger().warning("Default system encoding may have misread " + filename + " from plugin jar");
+ }
+ try {
+ defConfig.loadFromString(text);
+ }
+ catch (InvalidConfigurationException e2) {
+ this.main.getLogger().log(Level.SEVERE, "Cannot load configuration from jar", (Throwable)e2);
+ }
+ }
+ this.cfg.setDefaults((Configuration)defConfig);
+ }
+
+ private boolean isStrictlyUTF8() {
+ return this.main.getDescription().getAwareness().contains(PluginAwareness.Flags.UTF8);
+ }
+
+ public void saveConfig() {
+ try {
+ this.cfg.save(this.f);
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public FileConfiguration getConfig() {
+ return this.cfg;
+ }
+
+ public File toFile() {
+ return this.f;
+ }
+
+ public boolean exists() {
+ return this.f.exists();
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/utils/Cuboid.java b/ViperCore/src/main/java/com/igodlik3/conquest/utils/Cuboid.java
new file mode 100644
index 0000000..6e9c53a
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/utils/Cuboid.java
@@ -0,0 +1,473 @@
+package com.igodlik3.conquest.utils;
+
+import org.bukkit.block.*;
+import org.bukkit.configuration.serialization.*;
+import java.util.logging.*;
+import java.util.*;
+import org.bukkit.*;
+
+public class Cuboid implements Iterable, Cloneable, ConfigurationSerializable
+{
+ protected final String worldName;
+ protected final int x1;
+ protected final int y1;
+ protected final int z1;
+ protected final int x2;
+ protected final int y2;
+ protected final int z2;
+
+ public Cuboid(final Location location1, final Location location2) {
+ if (!location1.getWorld().equals(location2.getWorld())) {
+ Logger.getLogger("Les locations doivent \u00eatre dans un m\u00eame monde.");
+ }
+ this.worldName = location1.getWorld().getName();
+ this.x1 = Math.min(location1.getBlockX(), location2.getBlockX());
+ this.y1 = Math.min(location1.getBlockY(), location2.getBlockY());
+ this.z1 = Math.min(location1.getBlockZ(), location2.getBlockZ());
+ this.x2 = Math.max(location1.getBlockX(), location2.getBlockX());
+ this.y2 = Math.max(location1.getBlockY(), location2.getBlockY());
+ this.z2 = Math.max(location1.getBlockZ(), location2.getBlockZ());
+ }
+
+ public Cuboid(final Location location) {
+ this(location, location);
+ }
+
+ public Cuboid(final Cuboid cuboid) {
+ this(cuboid.getWorld().getName(), cuboid.x1, cuboid.y1, cuboid.z1, cuboid.x2, cuboid.y2, cuboid.z2);
+ }
+
+ private Cuboid(final String string, final int n, final int n2, final int n3, final int n4, final int n5, final int n6) {
+ this.worldName = string;
+ this.x1 = Math.min(n, n4);
+ this.x2 = Math.max(n, n4);
+ this.y1 = Math.min(n2, n5);
+ this.y2 = Math.max(n2, n5);
+ this.z1 = Math.min(n3, n6);
+ this.z2 = Math.max(n3, n6);
+ }
+
+ public Cuboid(final Map map) {
+ this.worldName = (String) map.get("worldName");
+ this.x1 = (int) map.get("x1");
+ this.x2 = (int) map.get("x2");
+ this.y1 = (int)map.get("y1");
+ this.y2 = (int)map.get("y2");
+ this.z1 = (int)map.get("z1");
+ this.z2 = (int) map.get("z2");
+ }
+
+ public Map serialize() {
+ final HashMap hashMap = new HashMap();
+ hashMap.put("worldName", this.worldName);
+ hashMap.put("x1", this.x1);
+ hashMap.put("y1", this.y1);
+ hashMap.put("z1", this.z1);
+ hashMap.put("x2", this.x2);
+ hashMap.put("y2", this.y2);
+ hashMap.put("z2", this.z2);
+ return hashMap;
+ }
+
+ public Location getLowerNE() {
+ return new Location(this.getWorld(), (double)this.x1, (double)this.y1, (double)this.z1);
+ }
+
+ public Location getUpperSW() {
+ return new Location(this.getWorld(), (double)this.x2, (double)this.y2, (double)this.z2);
+ }
+
+ public List getBlocks() {
+ final Iterator iterator = this.iterator();
+ final ArrayList arrayList = new ArrayList();
+ while (iterator.hasNext()) {
+ arrayList.add(iterator.next());
+ }
+ return arrayList;
+ }
+
+ public Location getCenter() {
+ final int i = this.getUpperX() + 1;
+ final int j = this.getUpperY() + 1;
+ final int k = this.getUpperZ() + 1;
+ return new Location(this.getWorld(), this.getLowerX() + (i - this.getLowerX()) / 2.0, this.getLowerY() + (j - this.getLowerY()) / 2.0, this.getLowerZ() + (k - this.getLowerZ()) / 2.0);
+ }
+
+ public World getWorld() {
+ final World world = Bukkit.getWorld(this.worldName);
+ if (world == null) {
+ Logger.getLogger("Le monde " + this.worldName + "n'est pas charg\u00e9 !");
+ }
+ return world;
+ }
+
+ public int getSizeX() {
+ return this.x2 - this.x1 + 1;
+ }
+
+ public int getSizeY() {
+ return this.y2 - this.y1 + 1;
+ }
+
+ public int getSizeZ() {
+ return this.z2 - this.z1 + 1;
+ }
+
+ public int getLowerX() {
+ return this.x1;
+ }
+
+ public int getLowerY() {
+ return this.y1;
+ }
+
+ public int getLowerZ() {
+ return this.z1;
+ }
+
+ public int getUpperX() {
+ return this.x2;
+ }
+
+ public int getUpperY() {
+ return this.y2;
+ }
+
+ public int getUpperZ() {
+ return this.z2;
+ }
+
+ public Block[] corners() {
+ final Block[] arrayOfBlock = new Block[8];
+ final World localWorld = this.getWorld();
+ arrayOfBlock[0] = localWorld.getBlockAt(this.x1, this.y1, this.z1);
+ arrayOfBlock[1] = localWorld.getBlockAt(this.x1, this.y1, this.z2);
+ arrayOfBlock[2] = localWorld.getBlockAt(this.x1, this.y2, this.z1);
+ arrayOfBlock[3] = localWorld.getBlockAt(this.x1, this.y2, this.z2);
+ arrayOfBlock[4] = localWorld.getBlockAt(this.x2, this.y1, this.z1);
+ arrayOfBlock[5] = localWorld.getBlockAt(this.x2, this.y1, this.z2);
+ arrayOfBlock[6] = localWorld.getBlockAt(this.x2, this.y2, this.z1);
+ arrayOfBlock[7] = localWorld.getBlockAt(this.x2, this.y2, this.z2);
+ return arrayOfBlock;
+ }
+
+ public Cuboid expand(final CuboidDirection paramCuboidDirection, final int paramInt) {
+ switch (paramCuboidDirection) {
+ case Both: {
+ return new Cuboid(this.worldName, this.x1 - paramInt, this.y1, this.z1, this.x2, this.y2, this.z2);
+ }
+ case East: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2 + paramInt, this.y2, this.z2);
+ }
+ case Down: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1 - paramInt, this.x2, this.y2, this.z2);
+ }
+ case Horizontal: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2, this.z2 + paramInt);
+ }
+ case South: {
+ return new Cuboid(this.worldName, this.x1, this.y1 - paramInt, this.z1, this.x2, this.y2, this.z2);
+ }
+ case North: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2 + paramInt, this.z2);
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid direction " + paramCuboidDirection);
+ }
+ }
+ }
+
+ public Cuboid shift(final CuboidDirection paramCuboidDirection, final int paramInt) {
+ return this.expand(paramCuboidDirection, paramInt).expand(paramCuboidDirection.opposite(), -paramInt);
+ }
+
+ public Cuboid outset(final CuboidDirection paramCuboidDirection, final int paramInt) {
+ Cuboid localCuboid = null;
+ switch (paramCuboidDirection) {
+ case Unknown: {
+ localCuboid = this.expand(CuboidDirection.North, paramInt).expand(CuboidDirection.South, paramInt).expand(CuboidDirection.East, paramInt).expand(CuboidDirection.West, paramInt);
+ break;
+ }
+ case Up: {
+ localCuboid = this.expand(CuboidDirection.Down, paramInt).expand(CuboidDirection.Up, paramInt);
+ break;
+ }
+ case Vertical: {
+ localCuboid = this.outset(CuboidDirection.Horizontal, paramInt).outset(CuboidDirection.Vertical, paramInt);
+ break;
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid direction " + paramCuboidDirection);
+ }
+ }
+ return localCuboid;
+ }
+
+ public Cuboid inset(final CuboidDirection cuboidDirection, final int n) {
+ return this.outset(cuboidDirection, -n);
+ }
+
+ public boolean contains(final int n, final int n2, final int n3) {
+ return n >= this.x1 && n <= this.x2 && n2 >= this.y1 && n2 <= this.y2 && n3 >= this.z1 && n3 <= this.z2;
+ }
+
+ public boolean contains(final Block block) {
+ return this.contains(block.getLocation());
+ }
+
+ public boolean contains(final Location location) {
+ return this.worldName.equals(location.getWorld().getName()) && this.contains(location.getBlockX(), location.getBlockY(), location.getBlockZ());
+ }
+
+ public int getVolume() {
+ return this.getSizeX() * this.getSizeY() * this.getSizeZ();
+ }
+
+ public byte getAverageLightLevel() {
+ long l = 0L;
+ int i = 0;
+ for (final Block localBlock : this) {
+ if (localBlock.isEmpty()) {
+ l += localBlock.getLightLevel();
+ ++i;
+ }
+ }
+ return (byte)((i > 0) ? ((byte)(l / i)) : 0);
+ }
+
+ public Cuboid contract() {
+ return this.contract(CuboidDirection.Down).contract(CuboidDirection.South).contract(CuboidDirection.East).contract(CuboidDirection.Up).contract(CuboidDirection.North).contract(CuboidDirection.West);
+ }
+
+ public Cuboid contract(final CuboidDirection paramCuboidDirection) {
+ Cuboid localCuboid = this.getFace(paramCuboidDirection.opposite());
+ switch (paramCuboidDirection) {
+ case South: {
+ while (localCuboid.containsOnly(0) && localCuboid.getLowerY() > this.getLowerY()) {
+ localCuboid = localCuboid.shift(CuboidDirection.Down, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, localCuboid.getUpperY(), this.z2);
+ }
+ case North: {
+ while (localCuboid.containsOnly(0) && localCuboid.getUpperY() < this.getUpperY()) {
+ localCuboid = localCuboid.shift(CuboidDirection.Up, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, localCuboid.getLowerY(), this.z1, this.x2, this.y2, this.z2);
+ }
+ case Both: {
+ while (localCuboid.containsOnly(0) && localCuboid.getLowerX() > this.getLowerX()) {
+ localCuboid = localCuboid.shift(CuboidDirection.North, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, localCuboid.getUpperX(), this.y2, this.z2);
+ }
+ case East: {
+ while (localCuboid.containsOnly(0) && localCuboid.getUpperX() < this.getUpperX()) {
+ localCuboid = localCuboid.shift(CuboidDirection.South, 1);
+ }
+ return new Cuboid(this.worldName, localCuboid.getLowerX(), this.y1, this.z1, this.x2, this.y2, this.z2);
+ }
+ case Down: {
+ while (localCuboid.containsOnly(0) && localCuboid.getLowerZ() > this.getLowerZ()) {
+ localCuboid = localCuboid.shift(CuboidDirection.East, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2, localCuboid.getUpperZ());
+ }
+ case Horizontal: {
+ while (localCuboid.containsOnly(0) && localCuboid.getUpperZ() < this.getUpperZ()) {
+ localCuboid = localCuboid.shift(CuboidDirection.West, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, this.y1, localCuboid.getLowerZ(), this.x2, this.y2, this.z2);
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid direction " + paramCuboidDirection);
+ }
+ }
+ }
+
+ public Cuboid getFace(final CuboidDirection paramCuboidDirection) {
+ switch (paramCuboidDirection) {
+ case South: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y1, this.z2);
+ }
+ case North: {
+ return new Cuboid(this.worldName, this.x1, this.y2, this.z1, this.x2, this.y2, this.z2);
+ }
+ case Both: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x1, this.y2, this.z2);
+ }
+ case East: {
+ return new Cuboid(this.worldName, this.x2, this.y1, this.z1, this.x2, this.y2, this.z2);
+ }
+ case Down: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2, this.z1);
+ }
+ case Horizontal: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z2, this.x2, this.y2, this.z2);
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid direction " + paramCuboidDirection);
+ }
+ }
+ }
+
+ public boolean containsOnly(final int paramInt) {
+ for (final Block block : this) {
+ if (block.getTypeId() != paramInt) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public Cuboid getBoundingCuboid(final Cuboid paramCuboid) {
+ if (paramCuboid == null) {
+ return this;
+ }
+ final int i = Math.min(this.getLowerX(), paramCuboid.getLowerX());
+ final int j = Math.min(this.getLowerY(), paramCuboid.getLowerY());
+ final int k = Math.min(this.getLowerZ(), paramCuboid.getLowerZ());
+ final int m = Math.max(this.getUpperX(), paramCuboid.getUpperX());
+ final int n = Math.max(this.getUpperY(), paramCuboid.getUpperY());
+ final int i2 = Math.max(this.getUpperZ(), paramCuboid.getUpperZ());
+ return new Cuboid(this.worldName, i, j, k, m, n, i2);
+ }
+
+ public Block getRelativeBlock(final int n, final int n2, final int n3) {
+ return this.getWorld().getBlockAt(this.x1 + n, this.y1 + n2, this.z1 + n3);
+ }
+
+ public Block getRelativeBlock(final World world, final int n, final int n2, final int n3) {
+ return world.getBlockAt(this.x1 + n, this.y1 + n2, this.z1 + n3);
+ }
+
+ public List getChunks() {
+ final ArrayList arrayList = new ArrayList();
+ final World world = this.getWorld();
+ final int i = this.getLowerX() & 0xFFFFFFF0;
+ final int j = this.getUpperX() & 0xFFFFFFF0;
+ final int k = this.getLowerZ() & 0xFFFFFFF0;
+ final int m = this.getUpperZ() & 0xFFFFFFF0;
+ for (int n = i; n <= j; n += 16) {
+ for (int i2 = k; i2 <= m; i2 += 16) {
+ arrayList.add(world.getChunkAt(n >> 4, i2 >> 4));
+ }
+ }
+ return arrayList;
+ }
+
+ @Override
+ public Iterator iterator() {
+ return new CuboidIterator(this.getWorld(), this.x1, this.y1, this.z1, this.x2, this.y2, this.z2);
+ }
+
+ public Cuboid clone() {
+ return new Cuboid(this);
+ }
+
+ @Override
+ public String toString() {
+ return new String("Cuboid: " + this.worldName + "," + this.x1 + "," + this.y1 + "," + this.z1 + "=>" + this.x2 + "," + this.y2 + "," + this.z2);
+ }
+
+ public enum CuboidDirection
+ {
+ North("North", 0),
+ East("East", 1),
+ South("South", 2),
+ West("West", 3),
+ Up("Up", 4),
+ Down("Down", 5),
+ Horizontal("Horizontal", 6),
+ Vertical("Vertical", 7),
+ Both("Both", 8),
+ Unknown("Unknown", 9);
+
+ private CuboidDirection(final String s, final int n) {
+ }
+
+ public CuboidDirection opposite() {
+ switch (this) {
+ case Both: {
+ return CuboidDirection.South;
+ }
+ case Down: {
+ return CuboidDirection.West;
+ }
+ case East: {
+ return CuboidDirection.North;
+ }
+ case Horizontal: {
+ return CuboidDirection.East;
+ }
+ case Unknown: {
+ return CuboidDirection.Vertical;
+ }
+ case Up: {
+ return CuboidDirection.Horizontal;
+ }
+ case North: {
+ return CuboidDirection.Down;
+ }
+ case South: {
+ return CuboidDirection.Up;
+ }
+ case Vertical: {
+ return CuboidDirection.Both;
+ }
+ default: {
+ return CuboidDirection.Unknown;
+ }
+ }
+ }
+ }
+
+ public class CuboidIterator implements Iterator
+ {
+ private World w;
+ private int baseX;
+ private int baseY;
+ private int baseZ;
+ private int x;
+ private int y;
+ private int z;
+ private int sizeX;
+ private int sizeY;
+ private int sizeZ;
+
+ public CuboidIterator(final World paramWorld, final int paramInt1, final int paramInt2, final int paramInt3, final int paramInt4, final int paramInt5, final int paramInt6) {
+ this.w = paramWorld;
+ this.baseX = paramInt1;
+ this.baseY = paramInt2;
+ this.baseZ = paramInt3;
+ this.sizeX = Math.abs(paramInt4 - paramInt1) + 1;
+ this.sizeY = Math.abs(paramInt5 - paramInt2) + 1;
+ this.sizeZ = Math.abs(paramInt6 - paramInt3) + 1;
+ final boolean x = false;
+ this.z = (x ? 1 : 0);
+ this.y = (x ? 1 : 0);
+ this.x = (x ? 1 : 0);
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.x < this.sizeX && this.y < this.sizeY && this.z < this.sizeZ;
+ }
+
+ @Override
+ public Block next() {
+ final Block block = this.w.getBlockAt(this.baseX + this.x, this.baseY + this.y, this.baseZ + this.z);
+ if (++this.x >= this.sizeX) {
+ this.x = 0;
+ if (++this.y >= this.sizeY) {
+ this.y = 0;
+ ++this.z;
+ }
+ }
+ return block;
+ }
+
+ @Override
+ public void remove() {
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/conquest/utils/Utils.java b/ViperCore/src/main/java/com/igodlik3/conquest/utils/Utils.java
new file mode 100644
index 0000000..89a67c3
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/conquest/utils/Utils.java
@@ -0,0 +1,26 @@
+package com.igodlik3.conquest.utils;
+
+import org.bukkit.*;
+
+public class Utils
+{
+ public static String color(final String stg) {
+ return ChatColor.translateAlternateColorCodes('&', stg);
+ }
+
+ public static String stringifyLocation(final Location location) {
+ return "[" + location.getWorld().getName() + "," + location.getX() + "," + location.getY() + "," + location.getZ() + "]";
+ }
+
+ public static Location destringifyLocation(final String string) {
+ final String[] split = string.substring(1, string.length() - 2).split(",");
+ final World world = Bukkit.getWorld(split[0]);
+ if (world == null) {
+ return null;
+ }
+ final double x = Double.parseDouble(split[1]);
+ final double y = Double.parseDouble(split[2]);
+ final double z = Double.parseDouble(split[3]);
+ return new Location(world, x, y, z);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/enchantfix/EnchantFix.java b/ViperCore/src/main/java/com/igodlik3/enchantfix/EnchantFix.java
new file mode 100644
index 0000000..b393509
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/enchantfix/EnchantFix.java
@@ -0,0 +1,32 @@
+package com.igodlik3.enchantfix;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.plugin.java.*;
+import org.bukkit.event.*;
+import org.bukkit.plugin.*;
+
+public class EnchantFix extends Manager
+{
+ private static EnchantFix instance;
+ private ConfigurationWrapper config;
+
+ public EnchantFix(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ public Configuration getConfig(){
+ return config.getConfig();
+ }
+ public void init() {
+ config = new ConfigurationWrapper("enchant-fix.yml", this.getPlugin());
+ EnchantFix.instance = this;
+ this.getPlugin().getServer().getPluginManager().registerEvents((Listener)new EnchantListener(),getPlugin());
+ }
+
+ public static EnchantFix getInstance() {
+ return EnchantFix.instance;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/enchantfix/EnchantListener.java b/ViperCore/src/main/java/com/igodlik3/enchantfix/EnchantListener.java
new file mode 100644
index 0000000..79dae75
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/enchantfix/EnchantListener.java
@@ -0,0 +1,164 @@
+package com.igodlik3.enchantfix;
+
+import org.bukkit.configuration.*;
+import org.bukkit.enchantments.*;
+import org.bukkit.inventory.*;
+import org.bukkit.event.*;
+import org.bukkit.event.enchantment.*;
+import org.bukkit.event.inventory.*;
+import org.bukkit.inventory.meta.*;
+import org.bukkit.event.player.*;
+import org.bukkit.event.entity.*;
+import java.util.*;
+import org.bukkit.entity.*;
+import org.bukkit.*;
+import net.md_5.bungee.api.chat.*;
+
+public class EnchantListener implements Listener
+{
+ private Configuration config;
+
+ public EnchantListener() {
+ this.config = (Configuration)EnchantFix.getInstance().getConfig();
+ }
+
+ @EventHandler
+ public void onPlayerInteract(final PlayerInteractEvent event) {
+ if (event.getItem() != null && event.getItem().getType() != Material.AIR) {
+ final ItemStack item = event.getItem();
+ if (item.getEnchantments() != null && !item.getEnchantments().isEmpty()) {
+ final Map enchants = (Map)item.getEnchantments();
+ try {
+ for (final String enchant : this.config.getStringList("Enchant-Limiter")) {
+ final String[] parse = enchant.split(":");
+ final Enchantment enchantment = Enchantment.getByName(parse[0]);
+ final int level = Integer.parseInt(parse[1]);
+ if (enchants.containsKey(enchantment) && enchants.get(enchantment) > level) {
+ event.getPlayer().setItemInHand((ItemStack)null);
+ this.notifyAdmins(event.getPlayer());
+ }
+ }
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onEnchantItem(final EnchantItemEvent e) {
+ final Map enchants = (Map)e.getEnchantsToAdd();
+ try {
+ for (final String enchant : this.config.getStringList("Enchant-Limiter")) {
+ final String[] parse = enchant.split(":");
+ final Enchantment enchantment = Enchantment.getByName(parse[0]);
+ final int level = Integer.parseInt(parse[1]);
+ if (enchants.containsKey(enchantment) && enchants.get(enchantment) > level) {
+ enchants.remove(enchantment);
+ if (level <= 0) {
+ continue;
+ }
+ enchants.put(enchantment, level);
+ }
+ }
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ @EventHandler
+ public void onInventoryClick(final InventoryClickEvent e) {
+ if (e.getInventory().getType() == InventoryType.ANVIL && e.getSlotType() == InventoryType.SlotType.RESULT) {
+ final ItemStack item = e.getCurrentItem();
+ try {
+ for (final String blockedEnchantments : this.config.getStringList("Enchant-Limiter")) {
+ final String[] parse = blockedEnchantments.split(":");
+ final Enchantment selectedEnchantment = Enchantment.getByName(parse[0]);
+ final int level = Integer.parseInt(parse[1]);
+ if (item.getType() == Material.ENCHANTED_BOOK) {
+ final EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta)item.getItemMeta();
+ if (bookMeta.getStoredEnchants().containsKey(selectedEnchantment) && bookMeta.getStoredEnchants().get(selectedEnchantment) > level) {
+ e.setCancelled(true);
+ return;
+ }
+ }
+ if (item.getEnchantments().containsKey(selectedEnchantment) && item.getEnchantments().get(selectedEnchantment) > level) {
+ e.setCancelled(true);
+ }
+ }
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ @EventHandler
+ public void onPlayerFish(final PlayerFishEvent event) {
+ final Entity entity = event.getCaught();
+ if (entity != null && entity instanceof ItemStack) {
+ final ItemStack item = (ItemStack)entity;
+ if (item.getEnchantments() != null && !item.getEnchantments().isEmpty()) {
+ final Map enchants = (Map)item.getEnchantments();
+ try {
+ for (final String enchant : this.config.getStringList("Enchant-Limiter")) {
+ final String[] parse = enchant.split(":");
+ final Enchantment enchantment = Enchantment.getByName(parse[0]);
+ final int level = Integer.parseInt(parse[1]);
+ if (enchants.containsKey(enchantment) && enchants.get(enchantment) > level) {
+ item.removeEnchantment(enchantment);
+ if (level <= 0) {
+ continue;
+ }
+ item.addEnchantment(enchantment, level);
+ }
+ }
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onEntityDeath(final EntityDeathEvent event) {
+ final List items = (List)event.getDrops();
+ if (items != null) {
+ for (final ItemStack item : items) {
+ if (item != null && item.getType() != Material.AIR && item.getEnchantments() != null && !item.getEnchantments().isEmpty()) {
+ final Map enchants = (Map)item.getEnchantments();
+ try {
+ for (final String enchant : this.config.getStringList("Enchant-Limiter")) {
+ final String[] parse = enchant.split(":");
+ final Enchantment enchantment = Enchantment.getByName(parse[0]);
+ final int level = Integer.parseInt(parse[1]);
+ if (enchants.containsKey(enchantment) && enchants.get(enchantment) > level) {
+ item.removeEnchantment(enchantment);
+ if (level <= 0) {
+ continue;
+ }
+ item.addEnchantment(enchantment, level);
+ }
+ }
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
+ private void notifyAdmins(final Player player) {
+ final TextComponent text = new TextComponent(ChatColor.translateAlternateColorCodes('&', "&8[&cALERT&8] &c" + player.getName() + " &ehas an illegal item! &6(&cClick here to TP&6)"));
+ text.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tp " + player.getName()));
+ for (Player pls : Bukkit.getOnlinePlayers()){
+ if (pls.hasPermission("illegal.notify")) {
+ pls.spigot().sendMessage((BaseComponent)text);
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/ModMode.java b/ViperCore/src/main/java/com/igodlik3/modmode/ModMode.java
new file mode 100644
index 0000000..c2cdc16
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/ModMode.java
@@ -0,0 +1,70 @@
+package com.igodlik3.modmode;
+
+import com.google.common.collect.Sets;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.plugin.java.*;
+import com.igodlik3.modmode.manager.*;
+import java.util.*;
+import org.bukkit.command.*;
+import com.igodlik3.modmode.commands.*;
+import org.bukkit.event.*;
+import com.igodlik3.modmode.listener.*;
+import org.bukkit.plugin.*;
+
+public class ModMode extends Manager
+{
+ public static ModMode instance;
+ private Set modToggled = Sets.newHashSet();
+ private FreezeManager freezeManager;
+ private ConfigurationWrapper config;
+
+ public Configuration getConfig(){
+ return config.getConfig();
+ }
+
+ public ModMode(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+
+ public void init() {
+ config = new ConfigurationWrapper("modmode.yml", this.getPlugin());
+ config.saveDefault();
+ (ModMode.instance = this).registerManagers();
+ this.registerListeners();
+ this.registerCommands();
+ }
+
+ private void registerCommands() {
+ this.getPlugin().getCommand("mod").setExecutor((CommandExecutor)new CmdModMode());
+ this.getPlugin().getCommand("freeze").setExecutor((CommandExecutor)new CmdFreeze());
+ this.getPlugin().getCommand("staffchat").setExecutor((CommandExecutor)new CmdStaffChat());
+ }
+
+ private void registerListeners() {
+ final PluginManager pm = this.getPlugin().getServer().getPluginManager();
+ pm.registerEvents((Listener)new ItemListener(this.getPlugin()), this.getPlugin());
+ pm.registerEvents((Listener)new ModListener(), this.getPlugin());
+ pm.registerEvents((Listener)new VanishListener(), this.getPlugin());
+ pm.registerEvents((Listener)new ScoreboardListener(), this.getPlugin());
+ }
+
+ private void registerManagers() {
+ (this.freezeManager = new FreezeManager()).runTaskTimer(this.getPlugin(), 20L, (long)(20 * this.getConfig().getInt("Mod-Mode.Freeze.message-delay")));
+ }
+
+ public static ModMode getInstance() {
+ return ModMode.instance;
+ }
+
+ public Set getModToggled() {
+ return this.modToggled;
+ }
+
+ public FreezeManager getFreezeManager() {
+ return this.freezeManager;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdFreeze.java b/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdFreeze.java
new file mode 100644
index 0000000..b86a8f6
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdFreeze.java
@@ -0,0 +1,34 @@
+package com.igodlik3.modmode.commands;
+
+import com.igodlik3.modmode.manager.*;
+import com.igodlik3.modmode.*;
+import org.bukkit.command.*;
+import com.igodlik3.modmode.utils.*;
+import org.bukkit.*;
+import org.bukkit.entity.*;
+
+public class CmdFreeze implements CommandExecutor
+{
+ private FreezeManager manager;
+
+ public CmdFreeze() {
+ this.manager = ModMode.getInstance().getFreezeManager();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (sender.hasPermission("ModMode")) {
+ if (args.length == 0) {
+ sender.sendMessage(Utils.color("&c/ss "));
+ }
+ else {
+ final Player target = Bukkit.getPlayer(args[0]);
+ if (target == null) {
+ sender.sendMessage(Utils.color("&cThis player is not online or doesn't exist !"));
+ return true;
+ }
+ sender.sendMessage(this.manager.freezePlayer(target));
+ }
+ }
+ return false;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdModMode.java b/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdModMode.java
new file mode 100644
index 0000000..4a1f3a3
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdModMode.java
@@ -0,0 +1,59 @@
+package com.igodlik3.modmode.commands;
+
+import com.igodlik3.ItemBuilder;
+import org.bukkit.configuration.*;
+import java.util.*;
+import com.igodlik3.modmode.*;
+import org.bukkit.command.*;
+import org.bukkit.entity.*;
+import org.bukkit.inventory.*;
+import org.bukkit.*;
+import com.igodlik3.modmode.utils.*;
+
+public class CmdModMode implements CommandExecutor
+{
+ private Configuration config;
+ private Set modToggled;
+
+ public CmdModMode() {
+ this.config = (Configuration)ModMode.getInstance().getConfig();
+ this.modToggled = ModMode.getInstance().getModToggled();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (!(sender instanceof Player)) {
+ return true;
+ }
+ final Player player = (Player)sender;
+ final String e = this.config.getString("Messages.STATUT.enabled");
+ final String d = this.config.getString("Messages.STATUT.disabled");
+ if (player.hasPermission("ModMode")) {
+ if (this.modToggled.contains(player.getUniqueId())) {
+ this.modToggled.remove(player.getUniqueId());
+ player.sendMessage(Utils.color(this.config.getString("Messages.MOD-MODE").replaceAll("%STATUT%", d)));
+ player.getInventory().clear();
+ }
+ else {
+ this.modToggled.add(player.getUniqueId());
+ player.sendMessage(Utils.color(this.config.getString("Messages.MOD-MODE").replaceAll("%STATUT%", e)));
+ this.getModItems(player);
+ }
+ }
+ return false;
+ }
+
+ private void getModItems(final Player player) {
+ player.setAllowFlight(true);
+ player.setFlying(true);
+ player.setFlySpeed(0.5f);
+ player.getInventory().clear();
+ player.getInventory().setArmorContents((ItemStack[])null);
+ player.getInventory().setItem(0, new ItemBuilder(Material.COMPASS).displayname(this.config.getString("Messages.MOD-ITEMS.COMPASS")).build());
+ player.getInventory().setItem(1, new ItemBuilder(Material.WOOD_AXE).displayname(this.config.getString("Messages.MOD-ITEMS.AXE")).build());
+ player.getInventory().setItem(2, new ItemBuilder(Material.EYE_OF_ENDER).displayname(this.config.getString("Messages.MOD-ITEMS.RANDOM-TP")).build());
+ player.getInventory().setItem(5, new ItemBuilder(Material.CHEST).displayname(this.config.getString("Messages.MOD-ITEMS.CHEST")).build());
+ player.getInventory().setItem(6, new ItemBuilder(Material.INK_SACK).durability((short)1).displayname(this.config.getString("Messages.MOD-ITEMS.VANISH").replaceAll("%STATUT%", "&cOFF")).build());
+ player.getInventory().setItem(7, new ItemBuilder(Material.BLAZE_ROD).displayname(this.config.getString("Messages.MOD-ITEMS.FREEZE.ITEMS")).build());
+ player.getInventory().setItem(8, new ItemBuilder(Material.BOOK).displayname(this.config.getString("Messages.MOD-ITEMS.INSPECTION")).build());
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdStaffChat.java b/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdStaffChat.java
new file mode 100644
index 0000000..afe7003
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/commands/CmdStaffChat.java
@@ -0,0 +1,41 @@
+package com.igodlik3.modmode.commands;
+
+import org.bukkit.configuration.*;
+import com.igodlik3.modmode.*;
+import org.bukkit.command.*;
+import org.bukkit.entity.*;
+import com.igodlik3.modmode.utils.*;
+import org.bukkit.*;
+
+public class CmdStaffChat implements CommandExecutor
+{
+ private Configuration config;
+
+ public CmdStaffChat() {
+ this.config = (Configuration)ModMode.getInstance().getConfig();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (!(sender instanceof Player)) {
+ return true;
+ }
+ final Player player = (Player)sender;
+ if (player.hasPermission("ModMode.StaffChat")) {
+ if (args.length == 0) {
+ player.sendMessage(Utils.color("&c/sc "));
+ }
+ else {
+ final StringBuilder message = new StringBuilder();
+ for (int i = 0; i < args.length; ++i) {
+ message.append(String.valueOf(args[i]) + " ");
+ }
+ for (Player pls : Bukkit.getOnlinePlayers()){
+ if (pls.hasPermission("ModMode.StaffChat")) {
+ pls.sendMessage(Utils.color(this.config.getString("Mod-Mode.Staff-Chat.format").replaceAll("%PLAYER%", player.getName()).replaceAll("%MESSAGE%", message.toString())));
+ }
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/event/VanishEvent.java b/ViperCore/src/main/java/com/igodlik3/modmode/event/VanishEvent.java
new file mode 100644
index 0000000..1864e73
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/event/VanishEvent.java
@@ -0,0 +1,74 @@
+package com.igodlik3.modmode.event;
+
+import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
+import org.bukkit.event.*;
+import org.bukkit.entity.*;
+import java.util.*;
+import org.bukkit.*;
+
+public class VanishEvent extends Event
+{
+ private static final HandlerList handlers;
+ public static Set vanished;
+ private Player p;
+
+ static {
+ handlers = new HandlerList();
+ VanishEvent.vanished = new HashSet();
+ }
+
+ public VanishEvent(final Player player, final boolean on) {
+ this.p = player;
+ if (on) {
+ this.setVanish();
+ }
+ else {
+ this.unVanish();
+ }
+ }
+
+ public void setVanish() {
+ VanishEvent.vanished.add(this.p);
+ /*
+ Player[] onlinePlayers;
+ for (int length = (onlinePlayers = Bukkit.getOnlinePlayers().toArray(new Player[0])).length, i = 0; i < length; ++i) {
+ final Player player = onlinePlayers[i];
+ if (!player.hasPermission("ModMode.Vanish")) {
+ player.hidePlayer(this.p);
+ }
+ }*/
+ ((CraftPlayer)p).setHidden(true);
+ }
+
+ public void unVanish() {
+ VanishEvent.vanished.remove(this.p);
+ /*
+ Player[] onlinePlayers;
+ for (int length = (onlinePlayers = Bukkit.getOnlinePlayers().toArray(new Player[0])).length, i = 0; i < length; ++i) {
+ final Player player = onlinePlayers[i];
+ player.showPlayer(this.p);
+ }
+ */
+ ((CraftPlayer)p).setHidden(false);
+ }
+
+ public boolean isVanish() {
+ return VanishEvent.vanished.contains(this.p);
+ }
+
+ public String getVanishedPlayers() {
+ return VanishEvent.vanished.toString();
+ }
+
+ public Player getPlayer() {
+ return this.p;
+ }
+
+ public HandlerList getHandlers() {
+ return VanishEvent.handlers;
+ }
+
+ public static HandlerList getHandlerList() {
+ return VanishEvent.handlers;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/listener/ItemListener.java b/ViperCore/src/main/java/com/igodlik3/modmode/listener/ItemListener.java
new file mode 100644
index 0000000..60b1aee
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/listener/ItemListener.java
@@ -0,0 +1,207 @@
+package com.igodlik3.modmode.listener;
+
+import com.igodlik3.ItemBuilder;
+import com.igodlik3.subclaims.FactionsUtils;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.syuu.common.utils.PlayerUtils;
+import net.syuu.popura.faction.FactionType;
+import org.bukkit.configuration.*;
+import com.igodlik3.modmode.manager.*;
+import com.igodlik3.modmode.*;
+import org.bukkit.event.player.*;
+import org.bukkit.event.block.*;
+import java.util.*;
+import org.bukkit.entity.*;
+import com.igodlik3.modmode.event.*;
+import org.bukkit.event.*;
+import com.igodlik3.modmode.utils.*;
+import org.bukkit.inventory.meta.*;
+import org.bukkit.inventory.*;
+import org.bukkit.event.inventory.*;
+import org.bukkit.*;
+
+public class ItemListener implements Listener
+{
+ private Configuration config;
+ private FreezeManager manager;
+ private HCFactionPlugin plugin;
+
+ public ItemListener(HCFactionPlugin instance) {
+ this.config = (Configuration)ModMode.getInstance().getConfig();
+ this.manager = ModMode.getInstance().getFreezeManager();
+ this.plugin = instance;
+ }
+
+ @EventHandler
+ public void onEntityInteract(final PlayerInteractEntityEvent event) {
+ if (event.getRightClicked() instanceof Player) {
+ final Player target = (Player)event.getRightClicked();
+ final Player player = event.getPlayer();
+ if (player.getItemInHand() != null && player.getItemInHand().getType() != Material.AIR) {
+ final ItemStack item = player.getItemInHand();
+ if (item.getType() == Material.BOOK && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equalsIgnoreCase(Utils.color(this.config.getString("Messages.MOD-ITEMS.INSPECTION")))) {
+ if (this.isMod(player)) {
+ player.performCommand("invsee " + target.getName());
+ player.sendMessage(Utils.color(this.config.getString("Messages.MOD-ITEMS.OPENING-INVENTORY").replaceAll("%TARGET%", target.getName())));
+ }
+ else {
+
+ player.setItemInHand(null);
+ PlayerUtils.updateInventory(player);
+ //player.sendMessage(Utils.color(this.config.getString("Messages.MOD-ITEMS.MODE-NOT-TOGGLED")));
+ }
+ }
+ else if (item.getType() == Material.BLAZE_ROD && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equalsIgnoreCase(Utils.color(this.config.getString("Messages.MOD-ITEMS.FREEZE.ITEMS")))) {
+ if (this.isMod(player)) {
+ player.sendMessage(this.manager.freezePlayer(target));
+ }
+ else {
+ player.setItemInHand(null);
+ PlayerUtils.updateInventory(player);
+ //player.sendMessage(Utils.color(this.config.getString("Messages.MOD-ITEMS.MODE-NOT-TOGGLED")));
+ }
+ }
+ }
+ }
+ }
+
+ public Player getCorrectPlayer(Player moderator){
+ for(Player p : Bukkit.getOnlinePlayers()){
+ if(!p.equals(moderator)) {
+ if(FactionsUtils.getFactionAt(p.getLocation()) == null){
+ return p;
+ }
+
+ String name = FactionsUtils.getFactionAt(p.getLocation()).getName();
+
+ if(!name.equals("Spawn")){
+ return p;
+ }
+ }
+ }
+ return null;
+ }
+
+ public Player getRandomPlayer(Player moderator) {
+ final Random r = new Random();
+ final Player[] pls = Bukkit.getOnlinePlayers().toArray(new Player[0]);
+ Player target = pls[r.nextInt(pls.length)];
+
+ while(target.equals(moderator)){
+ target = pls[r.nextInt(pls.length)];
+ }
+
+ if(FactionsUtils.getFactionAt(target.getLocation()) != null){
+ if(FactionsUtils.getFactionAt(target.getLocation()).getName().equals("Spawn")){
+ target = getCorrectPlayer(moderator);
+ }
+ }
+ return target;
+ }
+
+ @EventHandler
+ public void onInteract(final PlayerInteractEvent event) {
+ final Player player = event.getPlayer();
+ if ((event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) && event.getItem() != null && event.getItem().getType() != Material.AIR) {
+ final ItemStack item = event.getItem();
+ if (item.hasItemMeta() && item.getItemMeta().hasDisplayName()) {
+ switch (item.getType()) {
+ case EYE_OF_ENDER: {
+ event.setCancelled(true);
+ if(this.isMod(player)) {
+
+ if(Bukkit.getOnlinePlayers().size() <= 1){
+ player.sendMessage(plugin.configdata.getConfigMessage("only-one-online").replaceAll("&", "§"));
+ return;
+ }
+
+ if(getCorrectPlayer(player) == null) {
+ player.sendMessage(plugin.configdata.getConfigMessage("all-players-in-spawn").replaceAll("&", "§"));
+ return;
+ }
+
+ final Player target = getRandomPlayer(player);
+
+ if (target != player) {
+ player.teleport((Entity) target);
+ player.sendMessage(Utils.color(this.config.getString("Messages.MOD-ITEMS.RANDOM-TELEPORTATION").replaceAll("%PLAYER%", target.getName())));
+ break;
+ }
+ }else{
+ player.setItemInHand(null);
+ PlayerUtils.updateInventory(player);
+ }
+ break;
+ }
+ case INK_SACK: {
+ event.setCancelled(true);
+ if(this.isMod(player)) {
+
+ if (VanishEvent.vanished.contains(player)) {
+ Bukkit.getPluginManager().callEvent((Event) new VanishEvent(player, false));
+ player.setItemInHand(new ItemBuilder(Material.INK_SACK).durability((short) 1).displayname(this.config.getString("Messages.MOD-ITEMS.VANISH").replaceAll("%STATUT%", "&cOFF")).build());
+ break;
+ }
+ Bukkit.getPluginManager().callEvent((Event) new VanishEvent(player, true));
+ player.setItemInHand(new ItemBuilder(Material.INK_SACK).durability((short) 10).displayname(this.config.getString("Messages.MOD-ITEMS.VANISH").replaceAll("%STATUT%", "&aON")).build());
+ }else{
+ player.setItemInHand(null);
+ PlayerUtils.updateInventory(player);
+ }
+
+ break;
+ }
+ case CHEST: {
+
+ event.setCancelled(true);
+ if(this.isMod(player)) {
+
+ final Inventory inv = Bukkit.createInventory((InventoryHolder) null, 54, Utils.color("&bPlayers under level 16"));
+ Player[] onlinePlayers;
+ for (Player p : Bukkit.getOnlinePlayers()) {
+ if (p.getLocation().getY() <= 16.0) {
+ final ItemStack is = new ItemBuilder(Material.SKULL_ITEM).durability((short) 3).displayname("&b" + p.getName()).lore("", "&c�� &eClick to teleport !").build();
+ final SkullMeta meta = (SkullMeta) is.getItemMeta();
+ meta.setOwner(p.getName());
+ is.setItemMeta((ItemMeta) meta);
+ inv.addItem(new ItemStack[]{is});
+ }
+ }
+ player.openInventory(inv);
+ }else{
+ player.setItemInHand(null);
+ PlayerUtils.updateInventory(player);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onInventoryClick(final InventoryClickEvent event) {
+ final Inventory inv = event.getInventory();
+ final Player player = (Player)event.getWhoClicked();
+ if (inv != null && inv.getName() != null && inv.getName().contains("level 16")) {
+ event.setCancelled(true);
+ if (event.getCurrentItem() != null && event.getCurrentItem().getType() != Material.AIR) {
+ final ItemStack item = event.getCurrentItem();
+ if (event.getClickedInventory() == player.getOpenInventory().getTopInventory() && item.getType() == Material.SKULL_ITEM) {
+ player.closeInventory();
+ final Player pls = Bukkit.getPlayer(ChatColor.stripColor(item.getItemMeta().getDisplayName()));
+ if (pls == null) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.MOD-ITEMS.GUI.NOT-ONLINE")));
+ return;
+ }
+ player.teleport((Entity)pls);
+ player.sendMessage(Utils.color(this.config.getString("Messages.MOD-ITEMS.GUI.TELEPORTATION").replaceAll("%PLAYER%", pls.getName())));
+ }
+ }
+ }
+ }
+
+ private boolean isMod(final Player player) {
+ return player.hasPermission("ModMode") && ModMode.getInstance().getModToggled().contains(player.getUniqueId());
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/listener/ModListener.java b/ViperCore/src/main/java/com/igodlik3/modmode/listener/ModListener.java
new file mode 100644
index 0000000..2c9a49e
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/listener/ModListener.java
@@ -0,0 +1,156 @@
+package com.igodlik3.modmode.listener;
+
+import org.bukkit.configuration.*;
+import com.igodlik3.modmode.manager.*;
+import com.igodlik3.modmode.*;
+import com.igodlik3.modmode.utils.*;
+import org.bukkit.command.*;
+import java.util.*;
+import org.bukkit.event.*;
+import org.bukkit.event.inventory.*;
+import org.bukkit.event.block.*;
+import org.bukkit.event.player.*;
+import org.bukkit.*;
+import org.bukkit.event.entity.*;
+import org.bukkit.entity.*;
+import org.bukkit.projectiles.*;
+import org.bukkit.scheduler.BukkitTask;
+
+public class ModListener implements Listener
+{
+ private Configuration config;
+ private FreezeManager manager;
+
+ public ModListener() {
+ this.config = (Configuration)ModMode.getInstance().getConfig();
+ this.manager = ModMode.getInstance().getFreezeManager();
+ }
+
+ @EventHandler
+ public void onPlayerJoin(final PlayerJoinEvent event) {
+ final Player player = event.getPlayer();
+ if (this.config.getBoolean("Mod-Mode.Staff-LeaveJoin-Message") && player.hasPermission("ModMode")) {
+ for(Player pls : Bukkit.getOnlinePlayers()){
+ if (pls.hasPermission("ModMode")) {
+ pls.sendMessage(Utils.color(this.config.getString("Messages.STAFF-JOIN").replaceAll("%PLAYER%", player.getName())));
+ }
+ }
+ }
+ if (this.config.getBoolean("Mod-Mode.Toggle-ModMode-OnJoin")) {
+ player.performCommand("mod");
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onPlayerQuit(final PlayerQuitEvent event) {
+ final Player player = event.getPlayer();
+ if (this.config.getBoolean("Mod-Mode.Staff-LeaveJoin-Message") && player.hasPermission("Xeor.ModMode")) {
+ for(Player pls : Bukkit.getOnlinePlayers()){
+ if (pls.hasPermission("Xeor.ModMode")) {
+ pls.sendMessage(Utils.color(this.config.getString("Messages.STAFF-LEAVE").replaceAll("%PLAYER%", player.getName())));
+ }
+ }
+ }
+ if (this.manager.isFrozen(player) && this.config.getBoolean("Mod-Mode.Freeze.execute-cmd-on-disconnect")) {
+ for (final String stg : this.config.getStringList("Mod-Mode.Freeze.cmds")) {
+ Bukkit.dispatchCommand((CommandSender)Bukkit.getConsoleSender(), stg.replaceAll("%PLAYER%", player.getName()));
+ }
+ }
+ }
+
+ @EventHandler
+ public void onInventoryClick(final InventoryClickEvent event) {
+ final Player player = (Player)event.getWhoClicked();
+ if (this.isMod(player) && event.getClickedInventory() != null) {
+ if (event.getClickedInventory().equals(player.getOpenInventory().getBottomInventory())) {
+ event.setCancelled(true);
+ }
+ else if (this.config.getBoolean("Mod-Mode.Block-InventoryMove.Others-Inventory")) {
+ event.setCancelled(true);
+ }
+ }
+ }
+ @EventHandler
+ public void onBlockPlace(final FoodLevelChangeEvent event) {
+ final Player player = (Player) event.getEntity();
+ if (this.isMod(player)) {
+ event.setFoodLevel(20);
+ }
+ }
+ @EventHandler
+ public void onBlockPlace(final BlockPlaceEvent event) {
+ final Player player = event.getPlayer();
+ if (this.isMod(player) && !event.isCancelled() && this.config.getBoolean("Mod-Mode.Block-Place")) {
+ event.setCancelled(true);
+ }
+ }
+
+ @EventHandler
+ public void onBlockBreak(final BlockBreakEvent event) {
+ final Player player = event.getPlayer();
+ if (this.isMod(player) && !event.isCancelled() && this.config.getBoolean("Mod-Mode.Block-Break")) {
+ event.setCancelled(true);
+ }
+ }
+
+ @EventHandler
+ public void onItemDrop(final PlayerDropItemEvent event) {
+ final Player player = event.getPlayer();
+ if (this.isMod(player) && this.config.getBoolean("Mod-Mode.Block-ItemDrop")) {
+ event.setCancelled(true);
+ }
+ }
+
+ @EventHandler
+ public void onItemDrop(final PlayerPickupItemEvent event) {
+ final Player player = event.getPlayer();
+ if (this.isMod(player) && this.config.getBoolean("Mod-Mode.Block-PickUp")) {
+ event.setCancelled(true);
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onPlayerMove(final PlayerMoveEvent event) {
+ final Player player = event.getPlayer();
+ final Location to = event.getTo();
+ final Location from = event.getFrom();
+ if (this.manager.isFrozen(player) && (to.getBlockX() != from.getBlockX() || to.getBlockZ() != from.getBlockZ())) {
+ event.setTo(from);
+ }
+ }
+
+ @EventHandler
+ public void onEntityDamage(final EntityDamageByEntityEvent event) {
+ if (event.isCancelled() || !(event.getEntity() instanceof Player)) {
+ return;
+ }
+ final Player damaged = (Player)event.getEntity();
+ Entity eDamager = event.getDamager();
+ if (eDamager instanceof Projectile) {
+ final ProjectileSource projectileSource = (ProjectileSource)((Projectile)eDamager).getShooter();
+ if (projectileSource instanceof Player) {
+ eDamager = (Entity)projectileSource;
+ }
+ }
+ if (!(eDamager instanceof Player)) {
+ return;
+ }
+ final Player damager = (Player)eDamager;
+ if (damager == damaged) {
+ return;
+ }
+ if (this.manager.isFrozen(damager)) {
+ event.setCancelled(true);
+ damager.sendMessage(Utils.color("&cYou can't pvp whilst you're frozen !"));
+ return;
+ }
+ if (this.manager.isFrozen(damaged)) {
+ event.setCancelled(true);
+ damager.sendMessage(Utils.color("&cThis player is frozen !"));
+ }
+ }
+
+ private boolean isMod(final Player player) {
+ return player.hasPermission("ModMode") && ModMode.getInstance().getModToggled().contains(player.getUniqueId());
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/listener/ScoreboardListener.java b/ViperCore/src/main/java/com/igodlik3/modmode/listener/ScoreboardListener.java
new file mode 100644
index 0000000..0db86ac
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/listener/ScoreboardListener.java
@@ -0,0 +1,48 @@
+package com.igodlik3.modmode.listener;
+
+import net.libhalt.bukkit.kaede.event.*;
+import com.igodlik3.modmode.*;
+import org.bukkit.entity.*;
+import org.bukkit.event.*;
+import com.igodlik3.modmode.event.*;
+import org.bukkit.*;
+
+public class ScoreboardListener implements Listener
+{
+ private String[] placeholders;
+
+ public ScoreboardListener() {
+ this.placeholders = new String[] { "%VANISH%", "%GAMEMODE%", "%ONLINE%" };
+ }
+
+ @EventHandler
+ public void onScoreboardUpdate(final ScoreboardTextAboutToUpdateEvent event) {
+ final Player player = event.getPlayer();
+ String[] placeholders;
+ for (int length = (placeholders = this.placeholders).length, i = 0; i < length; ++i) {
+ final String placeholder = placeholders[i];
+ if (event.getText() != null && event.getText().contains(placeholder)) {
+ if (ModMode.getInstance().getModToggled().contains(player.getUniqueId())) {
+ event.setText(this.convertPlaceholder(event.getText(), player));
+ }
+ else {
+ event.setText((String)null);
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private String convertPlaceholder(String text, final Player player) {
+ if (text.contains("%VANISH%")) {
+ text = text.replaceAll("%VANISH%", VanishEvent.vanished.contains(player) ? "&aON" : "&cOFF");
+ }
+ if (text.contains("GAMEMODE%")) {
+ text = text.replaceAll("%GAMEMODE%", (player.getGameMode() == GameMode.CREATIVE) ? "&aCreative" : "&cSurvival");
+ }
+ if (text.contains("%ONLINE%")) {
+ text = text.replaceAll("%ONLINE%", "&a" + Bukkit.getOnlinePlayers().size() + "&7/&a" + Bukkit.getMaxPlayers());
+ }
+ return text;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/listener/VanishListener.java b/ViperCore/src/main/java/com/igodlik3/modmode/listener/VanishListener.java
new file mode 100644
index 0000000..992d9e5
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/listener/VanishListener.java
@@ -0,0 +1,57 @@
+package com.igodlik3.modmode.listener;
+
+import org.bukkit.configuration.*;
+import com.igodlik3.modmode.*;
+import com.igodlik3.modmode.event.*;
+import com.igodlik3.modmode.utils.*;
+import org.bukkit.potion.*;
+import org.bukkit.entity.*;
+import org.bukkit.event.*;
+import org.bukkit.*;
+import org.bukkit.event.player.*;
+
+public class VanishListener implements Listener
+{
+ private Configuration config;
+
+ public VanishListener() {
+ this.config = (Configuration)ModMode.getInstance().getConfig();
+ }
+
+ @EventHandler
+ public void onVanishEvent(final VanishEvent event) {
+ final Player player = event.getPlayer();
+ final String e = this.config.getString("Messages.STATUT.enabled");
+ final String d = this.config.getString("Messages.STATUT.disabled");
+ if (event.isVanish()) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.VANISH").replaceAll("%STATUT%", e)));
+ player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 3));
+ }
+ else {
+ player.removePotionEffect(PotionEffectType.NIGHT_VISION);
+ player.sendMessage(Utils.color(this.config.getString("Messages.VANISH").replaceAll("%STATUT%", d)));
+ }
+ }
+
+ @EventHandler
+ public void onPlayerJoin(final PlayerJoinEvent event) {
+ /*
+ final Player player = event.getPlayer();
+ Player[] onlinePlayers;
+ for (int length = (onlinePlayers = Bukkit.getOnlinePlayers().toArray(new Player[0])).length, i = 0; i < length; ++i) {
+ final Player pls = onlinePlayers[i];
+ if (VanishEvent.vanished.contains(pls) && !player.hasPermission("ModMode.Vanish")) {
+ player.hidePlayer(pls);
+ }
+ }
+ */
+ }
+
+ @EventHandler
+ public void onPickUp(final PlayerPickupItemEvent event) {
+ final Player player = event.getPlayer();
+ if (VanishEvent.vanished.contains(player)) {
+ event.setCancelled(true);
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/manager/FreezeManager.java b/ViperCore/src/main/java/com/igodlik3/modmode/manager/FreezeManager.java
new file mode 100644
index 0000000..6dafc17
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/manager/FreezeManager.java
@@ -0,0 +1,60 @@
+package com.igodlik3.modmode.manager;
+
+import org.bukkit.scheduler.*;
+import org.bukkit.configuration.*;
+import com.igodlik3.modmode.*;
+import org.bukkit.entity.*;
+import com.igodlik3.modmode.utils.*;
+import org.bukkit.*;
+import java.util.*;
+
+public class FreezeManager extends BukkitRunnable
+{
+ private Set frozenPlayers;
+ private Configuration config;
+
+ public FreezeManager() {
+ this.frozenPlayers = new HashSet();
+ this.config = (Configuration)ModMode.getInstance().getConfig();
+ }
+
+ public boolean isFrozen(final Player player) {
+ return this.frozenPlayers.contains(player.getUniqueId());
+ }
+
+ public String freezePlayer(final Player player) {
+ if (this.isFrozen(player)) {
+ this.getFrozenPlayers().remove(player.getUniqueId());
+ return Utils.color(this.config.getString("Messages.UN-FROZEN").replaceAll("%PLAYER%", player.getName()));
+ }
+ this.getFrozenPlayers().add(player.getUniqueId());
+ return Utils.color(this.config.getString("Messages.FROZEN").replaceAll("%PLAYER%", player.getName()));
+ }
+
+ public void run() {
+ for (final UUID uuid : this.frozenPlayers) {
+ final Player player = Bukkit.getPlayer(uuid);
+ if (player != null) {
+ final String Line1 = Utils.color(this.config.getString("Messages.MOD-ITEMS.FREEZE.MESSAGE.1"));
+ final String Line2 = Utils.color(this.config.getString("Messages.MOD-ITEMS.FREEZE.MESSAGE.2"));
+ final String Line3 = Utils.color(this.config.getString("Messages.MOD-ITEMS.FREEZE.MESSAGE.3"));
+ final String Line4 = Utils.color(this.config.getString("Messages.MOD-ITEMS.FREEZE.MESSAGE.4"));
+ final String Line5 = Utils.color(this.config.getString("Messages.MOD-ITEMS.FREEZE.MESSAGE.5"));
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 " + Line1);
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588\u2588\u2588");
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588\u2588 " + Line2);
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588 " + Line3);
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588 " + Line4);
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588 " + Line5);
+ player.sendMessage(ChatColor.WHITE + "\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588\u2588\u2588" + ChatColor.BLACK + ChatColor.GOLD + "\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588 ");
+ player.sendMessage(ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588\u2588\u2588" + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + "\u2588\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE);
+ player.sendMessage(ChatColor.RED + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588");
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588");
+ }
+ }
+ }
+
+ public Set getFrozenPlayers() {
+ return this.frozenPlayers;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/modmode/utils/Utils.java b/ViperCore/src/main/java/com/igodlik3/modmode/utils/Utils.java
new file mode 100644
index 0000000..192e80d
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/modmode/utils/Utils.java
@@ -0,0 +1,26 @@
+package com.igodlik3.modmode.utils;
+
+import org.bukkit.*;
+
+public class Utils
+{
+ public static String color(final String stg) {
+ return ChatColor.translateAlternateColorCodes('&', stg);
+ }
+
+ public static String stringifyLocation(final Location location) {
+ return "[" + location.getWorld().getName() + "," + location.getX() + "," + location.getY() + "," + location.getZ() + "]";
+ }
+
+ public static Location destringifyLocation(final String string) {
+ final String[] split = string.substring(1, string.length() - 2).split(",");
+ final World world = Bukkit.getWorld(split[0]);
+ if (world == null) {
+ return null;
+ }
+ final double x = Double.parseDouble(split[1]);
+ final double y = Double.parseDouble(split[2]);
+ final double z = Double.parseDouble(split[3]);
+ return new Location(world, x, y, z);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/stats/GUIListener.java b/ViperCore/src/main/java/com/igodlik3/stats/GUIListener.java
new file mode 100644
index 0000000..28d3718
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/stats/GUIListener.java
@@ -0,0 +1,16 @@
+package com.igodlik3.stats;
+
+import org.bukkit.event.inventory.*;
+import org.bukkit.inventory.*;
+import org.bukkit.event.*;
+
+public class GUIListener implements Listener
+{
+ @EventHandler
+ public void onInventoryClick(final InventoryClickEvent event) {
+ final Inventory inv = event.getInventory();
+ if (inv != null && inv.getName() != null && inv.getName().contains("Stats")) {
+ event.setCancelled(true);
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/stats/Stats.java b/ViperCore/src/main/java/com/igodlik3/stats/Stats.java
new file mode 100644
index 0000000..ef84be3
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/stats/Stats.java
@@ -0,0 +1,40 @@
+package com.igodlik3.stats;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.event.Listener;
+import org.bukkit.plugin.RegisteredServiceProvider;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.milkbowl.vault.permission.Permission;
+
+public class Stats extends Manager
+{
+ private Permission perms;
+ private static Stats instance;
+
+ public Stats(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ public void init() {
+ (Stats.instance = this).setUpPermissions();
+ this.getPlugin().getCommand("stats").setExecutor((CommandExecutor)new StatsCmd());
+ Bukkit.getPluginManager().registerEvents((Listener)new GUIListener(), this.getPlugin());
+ }
+
+ private boolean setUpPermissions() {
+ final RegisteredServiceProvider rsp = this.getPlugin().getServer().getServicesManager().getRegistration(Permission.class);
+ this.perms = (Permission)rsp.getProvider();
+ return this.perms != null;
+ }
+
+ public Permission getPerms() {
+ return this.perms;
+ }
+
+ public static Stats getInstance() {
+ return Stats.instance;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/stats/StatsCmd.java b/ViperCore/src/main/java/com/igodlik3/stats/StatsCmd.java
new file mode 100644
index 0000000..de6cc03
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/stats/StatsCmd.java
@@ -0,0 +1,74 @@
+package com.igodlik3.stats;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.Statistic;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+
+import com.igodlik3.ItemBuilder;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.FactionPlayer;
+
+public class StatsCmd implements CommandExecutor
+{
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage("Only players !");
+ return true;
+ }
+ final Player player = (Player)sender;
+ if (args.length == 0) {
+ this.openStatsInv(player, player);
+ }
+ else {
+ final Player target = Bukkit.getPlayer(args[0]);
+ if (target == null) {
+ player.sendMessage(this.color("&cPlayer not found !"));
+ }
+ else {
+ this.openStatsInv(target, player);
+ }
+ }
+ return true;
+ }
+
+ private double getKDR(final Player player, final int kill, final int mort) {
+ if (mort == 0 && kill == 0) {
+ return 0.0;
+ }
+ if (mort == 0) {
+ return kill;
+ }
+ return Math.round(kill / mort);
+ }
+
+ private void openStatsInv(final Player player, final Player to) {
+ final Inventory inv = Bukkit.createInventory((InventoryHolder)null, 45, this.color("&6Stats of &c" + player.getName()));
+ final FactionPlayer fp = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ inv.setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).unsafeStackSize(true).amount((fp.getKill()== 0) ? 1 : fp.getKill()).displayname("&6Kills&8: &c" +fp.getKill()).build());
+ inv.setItem(1, new ItemBuilder(Material.SKULL_ITEM).unsafeStackSize(true).amount((player.getStatistic(Statistic.DEATHS) == 0) ? 1 : player.getStatistic(Statistic.DEATHS)).displayname("&6Deaths&8: &c" + player.getStatistic(Statistic.DEATHS)).build());
+ inv.setItem(2, new ItemBuilder(Material.ANVIL).displayname("&6Ratio&8: &c" + this.getKDR(player, player.getStatistic(Statistic.PLAYER_KILLS), player.getStatistic(Statistic.DEATHS))).build());
+ inv.setItem(9, new ItemBuilder(Material.BLAZE_POWDER).displayname("&4Faction&8: &c" + (fp.getFaction() != null ? fp.getFaction().getName() : "&cNone")).build());
+ inv.setItem(18, new ItemBuilder(Material.DIAMOND_ORE).unsafeStackSize(true).amount(player.getStatistic(Statistic.MINE_BLOCK, Material.DIAMOND_ORE)).displayname("&6Ores&8: &b" + player.getStatistic(Statistic.MINE_BLOCK, Material.DIAMOND_ORE) + " diamonds(s)").build());
+ inv.setItem(19, new ItemBuilder(Material.EMERALD_ORE).unsafeStackSize(true).amount(player.getStatistic(Statistic.MINE_BLOCK, Material.EMERALD_ORE)).displayname("&6Ores&8: &a" + player.getStatistic(Statistic.MINE_BLOCK, Material.EMERALD_ORE) + " emerald(s)").build());
+ inv.setItem(20, new ItemBuilder(Material.GOLD_ORE).unsafeStackSize(true).amount(player.getStatistic(Statistic.MINE_BLOCK, Material.GOLD_ORE)).displayname("&6Ores&8: &e" + player.getStatistic(Statistic.MINE_BLOCK, Material.GOLD_ORE) + " gold(s)").build());
+ inv.setItem(21, new ItemBuilder(Material.IRON_ORE).unsafeStackSize(true).amount(player.getStatistic(Statistic.MINE_BLOCK, Material.IRON_ORE)).displayname("&6Ores&8: &f" + player.getStatistic(Statistic.MINE_BLOCK, Material.IRON_ORE) + " iron(s)").build());
+ inv.setItem(22, new ItemBuilder(Material.REDSTONE_ORE).unsafeStackSize(true).amount(player.getStatistic(Statistic.MINE_BLOCK, Material.REDSTONE_ORE)).displayname("&6Ores&8: &f" + player.getStatistic(Statistic.MINE_BLOCK, Material.REDSTONE_ORE) + " redstone(s)").build());
+ inv.setItem(23, new ItemBuilder(Material.COAL_ORE).unsafeStackSize(true).amount(player.getStatistic(Statistic.MINE_BLOCK, Material.COAL_ORE)).displayname("&6Ores&8: &f" + player.getStatistic(Statistic.MINE_BLOCK, Material.COAL_ORE) + " coal(s)").build());
+ inv.setItem(24, new ItemBuilder(Material.STONE).unsafeStackSize(true).amount(player.getStatistic(Statistic.MINE_BLOCK, Material.STONE)).displayname("&6Ores&8: &7" + player.getStatistic(Statistic.MINE_BLOCK, Material.STONE) + " stone(s)").build());
+ inv.setItem(27, new ItemBuilder(Material.EMPTY_MAP).displayname("&6Money&8: &c" + fp.getMoney()).build());
+ inv.setItem(28, new ItemBuilder(Material.DIAMOND).displayname("&6Rank&8: &f" + Stats.getInstance().getPerms().getPrimaryGroup(player)).build());
+ to.openInventory(inv);
+ }
+
+ private String color(final String stg) {
+ return ChatColor.translateAlternateColorCodes('&', stg);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/subclaims/FactionsUtils.java b/ViperCore/src/main/java/com/igodlik3/subclaims/FactionsUtils.java
new file mode 100644
index 0000000..6d4517c
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/subclaims/FactionsUtils.java
@@ -0,0 +1,37 @@
+package com.igodlik3.subclaims;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.claim.Position2D;
+import net.syuu.popura.faction.bean.ClaimedRegion;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.entity.*;
+import org.bukkit.*;
+import org.bukkit.event.*;
+import java.util.*;
+
+public class FactionsUtils
+{
+ public static boolean isInOwnTerritory(final Player player) {
+ final Location loc = player.getLocation();
+ return hasFaction(player) && getFactionAt(loc) != null && getFactionAt(loc) == getFaction(player);
+ }
+
+ public static boolean hasFaction(final Player player) {
+ final FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+
+ return factionPlayer.getFaction() != null;
+ }
+
+
+ public static Faction getFactionAt(final Location location) {
+ ClaimedRegion flocation = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getClaimedRegionAt(new Position2D(location.getWorld().getName() , location.getBlockX() , location.getBlockZ()));
+ return flocation == null ? null : flocation.getOwner();
+ }
+
+ public static Faction getFaction(final Player player) {
+ final FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ return factionPlayer.getFaction();
+ }
+
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/subclaims/SubclaimCmd.java b/ViperCore/src/main/java/com/igodlik3/subclaims/SubclaimCmd.java
new file mode 100644
index 0000000..4d4318a
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/subclaims/SubclaimCmd.java
@@ -0,0 +1,38 @@
+package com.igodlik3.subclaims;
+
+import org.bukkit.configuration.*;
+import org.bukkit.command.*;
+import org.bukkit.entity.*;
+import java.util.*;
+import org.bukkit.*;
+
+public class SubclaimCmd implements CommandExecutor
+{
+ private Configuration lang;
+
+ public SubclaimCmd() {
+ this.lang = Subclaims.getInstance().getConfig();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (!(sender instanceof Player)) {
+ return true;
+ }
+ final Player player = (Player)sender;
+ if (args.length == 0) {
+ for (final String stg : this.lang.getStringList("Messages.Subclaim.INFO")) {
+ player.sendMessage(this.color(stg));
+ }
+ }
+ else if (args[0].equalsIgnoreCase("credits")) {
+ sender.sendMessage(this.color("&9Developed by &eiGoDLiK3"));
+ sender.sendMessage(this.color("&9Founded by &6Salvific"));
+ sender.sendMessage(this.color("&aWebsite&7: &cMC-Outlet.com"));
+ }
+ return true;
+ }
+
+ private String color(final String stg) {
+ return ChatColor.translateAlternateColorCodes('&', stg);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/subclaims/SubclaimListener.java b/ViperCore/src/main/java/com/igodlik3/subclaims/SubclaimListener.java
new file mode 100644
index 0000000..1c11d7b
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/subclaims/SubclaimListener.java
@@ -0,0 +1,433 @@
+package com.igodlik3.subclaims;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.FactionRole;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.block.Chest;
+import org.bukkit.block.Sign;
+import org.bukkit.configuration.*;
+import org.bukkit.entity.*;
+import java.util.*;
+import org.bukkit.event.*;
+import org.bukkit.event.player.*;
+import org.bukkit.event.block.*;
+import org.bukkit.block.*;
+import org.bukkit.event.inventory.*;
+import org.bukkit.inventory.*;
+import org.bukkit.material.*;
+import org.bukkit.*;
+
+import javax.management.relation.Role;
+
+public class SubclaimListener implements Listener
+{
+ private BlockFace[] FACES;
+ private Configuration lang;
+ private String title;
+
+ public SubclaimListener() {
+ this.FACES = new BlockFace[] { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST, BlockFace.UP };
+ this.lang = Subclaims.getInstance().getConfig();
+ this.title = this.color(this.lang.getString("Title"));
+ }
+
+ @EventHandler
+ public void onSignChange(final SignChangeEvent event) {
+ final Player player = event.getPlayer();
+ final Block block = this.getAttachedBlock(event.getBlock());
+ if (this.isBlockSubclaimable(block)) {
+ for (final String stg : this.lang.getStringList("Messages.Subclaim.KEY-WORDS")) {
+ if (event.getLine(0).equalsIgnoreCase(stg)) {
+ if (FactionsUtils.getFactionAt(block.getLocation()) == null || !FactionsUtils.isInOwnTerritory(player)) {
+ event.setCancelled(true);
+ this.removeSubclaim(event.getBlock(), "NO-TERRITORY", player);
+ }
+ else if (this.isSubclaim(block)) {
+ event.setCancelled(true);
+ this.removeSubclaim(event.getBlock(), "ALREADY-SUBCLAIM", player);
+ }
+ else {
+ final FactionPlayer fplayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if (event.isCancelled()) {
+ continue;
+ }
+ if (event.getLine(1).equalsIgnoreCase("Admin") || event.getLine(1).equalsIgnoreCase("Leader")) {
+ if (!this.isAllowed(fplayer)) {
+ event.setCancelled(true);
+ this.removeSubclaim(event.getBlock(), "LEADER", player);
+ }
+ else {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.CREATED-SUBCLAIM.LEADER")));
+ event.setLine(0, this.title);
+ event.setLine(1, "Leader");
+ }
+ }
+ else if (event.getLine(1).equalsIgnoreCase("Officer") || event.getLine(1).equalsIgnoreCase("Mod")) {
+ if (fplayer.getRole() != FactionRole.OFFICER && fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER) {
+ event.setCancelled(true);
+ this.removeSubclaim(event.getBlock(), "OFFICIER", player);
+ }
+ else {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.CREATED-SUBCLAIM.OFFICIER")));
+ event.setLine(0, this.title);
+ event.setLine(1, "Officer");
+ }
+ }
+ else {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.CREATED-SUBCLAIM.OWN")));
+ event.setLine(0, this.title);
+ boolean anyNames = false;
+ for (int i = 1; i < event.getLines().length; ++i) {
+ final String s = event.getLines()[i];
+ if (s != null && !s.isEmpty()) {
+ event.setLine(i, s);
+ if (!anyNames) {
+ anyNames = true;
+ }
+ }
+ }
+ if (anyNames) {
+ continue;
+ }
+ event.setLine(1, player.getName());
+ }
+ }
+ }
+ }
+ }
+ }
+ @EventHandler
+ public void onBlockBreak(final BlockPlaceEvent event) {
+ if(event.getBlock().getType() == Material.HOPPER) {
+ for (BlockFace blockFace : BlockFace.values()) {
+ Block block = event.getBlock().getRelative(blockFace);
+ if ( isSubclaim(block)) {
+ event.getPlayer().sendMessage(ChatColor.RED + "Can not place hoppers here");
+ return;
+ }
+ }
+ }
+ }
+ @EventHandler
+ public void onBlockBreak(final BlockBreakEvent event) {
+ final Player player = event.getPlayer();
+ final Block block = event.getBlock();
+ final FactionPlayer fplayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if (player.hasPermission("SubclaimBypass")) {
+ return;
+ }
+ if (this.isBlockSubclaimable(block)) {
+ if (this.isSubclaim(block)) {
+ if (FactionsUtils.getFactionAt(block.getLocation()).isRaidable()) {
+ event.setCancelled(false);
+ }
+ else if (FactionsUtils.getFactionAt(block.getLocation()) != FactionsUtils.getFaction(player)) {
+ event.setCancelled(true);
+ }
+ else if (this.getSign(block).getLine(1).equalsIgnoreCase("Leader")) {
+ if (fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else if (this.getSign(block).getLine(1).equalsIgnoreCase("Officer")) {
+ if (fplayer.getRole() != FactionRole.OFFICER && fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else if (!this.getSign(block).getLine(1).equalsIgnoreCase(player.getName()) && fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else if (this.isDoubleChestSubclaim(block) != null) {
+ final Block doublechest = this.isDoubleChestSubclaim(block);
+ if (FactionsUtils.getFactionAt(doublechest.getLocation()).isRaidable()) {
+ event.setCancelled(false);
+ }
+ else if (FactionsUtils.getFactionAt(doublechest.getLocation()) != FactionsUtils.getFaction(player)) {
+ event.setCancelled(true);
+ }
+ else if (this.getSign(doublechest).getLine(1).equalsIgnoreCase("Leader")) {
+ if (fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else if (this.getSign(doublechest).getLine(1).equalsIgnoreCase("Officer")) {
+ if (fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.OFFICER && fplayer.getRole() != FactionRole.COLEADER && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else {
+ boolean owner = false;
+ for (int i = 1; i < this.getSign(doublechest).getLines().length; ++i) {
+ final String name = this.getSign(doublechest).getLines()[i];
+ if (name.equalsIgnoreCase(player.getName()) && !owner) {
+ owner = true;
+ }
+ }
+ if (!owner && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onSignBreakEvent(final BlockBreakEvent event) {
+ final Player player = event.getPlayer();
+ final Block block = event.getBlock();
+ final FactionPlayer fplayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if (player.hasPermission("SubclaimBypass")) {
+ return;
+ }
+ if (block.getType() == Material.SIGN || (block.getType() == Material.WALL_SIGN && block.getState() instanceof Sign)) {
+ final Sign sign = (Sign)block.getState();
+ if (sign.getLine(0).equalsIgnoreCase(this.color(this.title))) {
+ if (FactionsUtils.getFactionAt(sign.getLocation()).isRaidable()) {
+ event.setCancelled(false);
+ }
+ else if (!FactionsUtils.getFaction(player).equals(FactionsUtils.getFactionAt(sign.getLocation()))) {
+ event.setCancelled(true);
+ }
+ else if (sign.getLine(1).equalsIgnoreCase("Leader")) {
+ if (fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else if (sign.getLine(1).equalsIgnoreCase("Officer")) {
+ if (fplayer.getRole() != FactionRole.OFFICER && fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER && this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else {
+ boolean owner = false;
+ for (int i = 1; i < sign.getLines().length; ++i) {
+ final String name = sign.getLines()[i];
+ if (name.equalsIgnoreCase(player.getName()) && !owner) {
+ owner = true;
+ }
+ }
+ if (!owner && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.DESTROY")));
+ event.setCancelled(true);
+ }
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onInteract(final PlayerInteractEvent event) {
+ final Player player = event.getPlayer();
+ final Block block = event.getClickedBlock();
+ final FactionPlayer fplayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if (player.hasPermission("SubclaimBypass")) {
+ return;
+ }
+ if (event.getAction() == Action.RIGHT_CLICK_BLOCK && this.isBlockSubclaimable(block)) {
+ if (this.isSubclaim(block) && getSign(block) != null) {
+ if (FactionsUtils.getFactionAt(block.getLocation()) == null) {
+ this.getSign(block).getBlock().breakNaturally();
+ }
+ else if (FactionsUtils.getFactionAt(block.getLocation()).isRaidable()) {
+ event.setCancelled(false);
+ }
+ else if (FactionsUtils.getFactionAt(block.getLocation()) != FactionsUtils.getFaction(player)) {
+ event.setCancelled(true);
+ }
+ else if (this.getSign(block).getLine(1).equalsIgnoreCase("Leader")) {
+ if (fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER&& !this.isAllowed(fplayer)) {
+ event.setCancelled(true);
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.OPEN")));
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else if (this.getSign(block).getLine(1).equalsIgnoreCase("Officer")) {
+ if (fplayer.getRole() != FactionRole.OFFICER && fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER && !this.isAllowed(fplayer)) {
+ event.setCancelled(true);
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.OPEN")));
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else {
+ boolean owner = false;
+ for (int i = 1; i < this.getSign(block).getLines().length; ++i) {
+ final String name = this.getSign(block).getLines()[i];
+ if (name.equalsIgnoreCase(player.getName()) && !owner) {
+ owner = true;
+ }
+ }
+ if (!owner && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.OPEN")));
+ event.setCancelled(true);
+ }
+ }
+ }
+ else if (this.isDoubleChestSubclaim(block) != null && getSign(block) != null) {
+ final Block doublechest = this.isDoubleChestSubclaim(block);
+ if (FactionsUtils.getFactionAt(doublechest.getLocation()) == null) {
+ this.getSign(doublechest).getBlock().breakNaturally();
+ }
+ else if (FactionsUtils.getFactionAt(doublechest.getLocation()).isRaidable()) {
+ event.setCancelled(false);
+ }
+ else if (FactionsUtils.getFactionAt(doublechest.getLocation()) != FactionsUtils.getFaction(player)) {
+ event.setCancelled(true);
+ }
+ else if (this.getSign(doublechest).getLine(1).equalsIgnoreCase("Leader")) {
+ if (fplayer.getRole() != FactionRole.COLEADER && fplayer.getRole() != FactionRole.LEADER && !this.isAllowed(fplayer)) {
+ event.setCancelled(true);
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.OPEN")));
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else if (this.getSign(doublechest).getLine(1).equalsIgnoreCase("Officer")) {
+ if (fplayer.getRole() != FactionRole.OFFICER && fplayer.getRole() != FactionRole.LEADER && fplayer.getRole() != FactionRole.COLEADER && !this.isAllowed(fplayer)) {
+ event.setCancelled(true);
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.OPEN")));
+ }
+ else {
+ event.setCancelled(false);
+ }
+ }
+ else {
+ boolean owner2 = false;
+ for (int j = 1; j < this.getSign(doublechest).getLines().length; ++j) {
+ final String name2 = this.getSign(doublechest).getLines()[j];
+ if (name2.equalsIgnoreCase(player.getName()) && !owner2) {
+ owner2 = true;
+ }
+ }
+ if (!owner2 && !this.isAllowed(fplayer)) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.OPEN")));
+ event.setCancelled(true);
+ }
+ }
+ }
+ }
+ }
+
+ private boolean isAllowed(final FactionPlayer fplayer) {
+ return (this.lang.getBoolean("FLeader-Bypass") && fplayer.getRole() == FactionRole.LEADER) || (this.lang.getBoolean("FLeader-Bypass") && fplayer.getRole() == FactionRole.COLEADER) || (this.lang.getBoolean("FMod-Bypass") && fplayer.getRole() == FactionRole.OFFICER);
+ }
+
+
+ private boolean isSubclaim(final Block block) {
+ for (int i = 0; i < this.FACES.length; ++i) {
+ final BlockFace blockFaces = this.FACES[i];
+ if (block.getRelative(blockFaces).getType() == Material.WALL_SIGN && block.getRelative(blockFaces).getState() instanceof Sign) {
+ final Sign sign = (Sign)block.getRelative(blockFaces).getState();
+ if (sign.getLine(0).equalsIgnoreCase(this.title)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private Block isDoubleChestSubclaim(final Block block) {
+ if (this.isBlockSubclaimable(block)) {
+ for (int i = 0; i < this.FACES.length; ++i) {
+ final BlockFace blockFaces = this.FACES[i];
+ if (this.isBlockSubclaimable(block.getRelative(blockFaces))) {
+ final Block block2 = block.getRelative(blockFaces);
+ if (this.isSubclaim(block2)) {
+ return block2;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private Sign getSign(final Block block) {
+ if(block.getState() instanceof Chest){
+ Chest chest = (Chest) block.getState();
+ InventoryHolder ih = chest.getInventory().getHolder();
+ if (ih instanceof DoubleChest){
+ DoubleChest doubleChest = (DoubleChest) ih;
+ Chest left = (Chest) doubleChest.getLeftSide();
+ Chest right = (Chest) doubleChest.getRightSide();
+ Sign sign = getSign0(left.getBlock());
+ if(sign == null){
+ sign = getSign0(right.getBlock());;
+ }
+ return sign;
+ }else{
+ return getSign0(block);
+ }
+ }else{
+ return getSign0(block);
+ }
+ }
+
+ private Sign getSign0(final Block block) {
+ for (int i = 0; i < this.FACES.length; ++i) {
+ final BlockFace blockFaces = this.FACES[i];
+ if (block.getRelative(blockFaces).getType() == Material.WALL_SIGN && block.getRelative(blockFaces).getState() instanceof Sign) {
+ final Sign sign = (Sign)block.getRelative(blockFaces).getState();
+ if(sign.getBlock().getRelative(((org.bukkit.material.Sign)sign.getData()).getAttachedFace()).equals(block)) {
+ return sign;
+ }
+ }
+ }
+ return null;
+ }
+
+ private void removeSubclaim(final Block block, final String path, final Player player) {
+ player.sendMessage(this.color(this.lang.getString("Messages.Subclaim.INVALID-SUBCLAIM." + path)));
+ block.breakNaturally();
+ }
+
+ private boolean isBlockSubclaimable(final Block block) {
+ return block.getType() == Material.CHEST || block.getType() == Material.TRAPPED_CHEST;
+ }
+
+ private Block getAttachedBlock(final Block block) {
+ final MaterialData matData = block.getState().getData();
+ BlockFace face = BlockFace.DOWN;
+ if (matData instanceof Attachable) {
+ face = ((Attachable)matData).getAttachedFace();
+ }
+ return block.getRelative(face);
+ }
+
+ private String color(final String stg) {
+ return ChatColor.translateAlternateColorCodes('&', stg);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/subclaims/Subclaims.java b/ViperCore/src/main/java/com/igodlik3/subclaims/Subclaims.java
new file mode 100644
index 0000000..b13d381
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/subclaims/Subclaims.java
@@ -0,0 +1,36 @@
+package com.igodlik3.subclaims;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.plugin.java.*;
+import org.bukkit.*;
+import org.bukkit.event.*;
+import org.bukkit.plugin.*;
+import org.bukkit.command.*;
+
+public class Subclaims extends Manager
+{
+ private static Subclaims instance;
+
+ public Subclaims(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+ private ConfigurationWrapper config;
+
+ public Configuration getConfig(){
+ return config.getConfig();
+ }
+ public void init() {
+ config = new ConfigurationWrapper("subclaim.yml", this.getPlugin());
+ config.saveDefault();
+ Subclaims.instance = this;
+ Bukkit.getPluginManager().registerEvents((Listener)new SubclaimListener(), this.getPlugin());
+ registerCommand("subclaim" , new SubclaimCmd());
+ }
+
+ public static Subclaims getInstance() {
+ return Subclaims.instance;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/viperfix/ViperFix.java b/ViperCore/src/main/java/com/igodlik3/viperfix/ViperFix.java
new file mode 100644
index 0000000..7fb9780
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/viperfix/ViperFix.java
@@ -0,0 +1,58 @@
+package com.igodlik3.viperfix;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.claim.Position2D;
+import net.syuu.popura.faction.bean.ClaimedRegion;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.plugin.java.*;
+import org.bukkit.plugin.*;
+import org.bukkit.event.entity.*;
+import org.bukkit.entity.*;
+import org.bukkit.event.*;
+import org.bukkit.event.player.*;
+import org.bukkit.event.block.*;
+import org.bukkit.*;
+
+public class ViperFix extends Manager implements Listener
+{
+ public ViperFix(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents((Listener) this, getPlugin());
+ }
+
+ @EventHandler
+ public void onEntityDamageEvent(final EntityDamageEvent event) {
+ final Entity entity = event.getEntity();
+ if (event.getCause() == EntityDamageEvent.DamageCause.SUFFOCATION && entity instanceof Player) {
+ final Player player = (Player)entity;
+ final Location loc = player.getLocation();
+ player.teleport(loc);
+ }
+ }
+
+ @EventHandler
+ public void onVehiclePlace(final PlayerInteractEvent event) {
+ final Player player = event.getPlayer();
+ final FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if (event.getAction() == Action.RIGHT_CLICK_BLOCK && player.getItemInHand() != null && player.getItemInHand().getType() == Material.MINECART) {
+ final Location loc = event.getClickedBlock().getLocation();
+ final ClaimedRegion flo = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getClaimedRegionAt(new Position2D(loc.getWorld().getName() , loc.getBlockX() , loc.getBlockZ()));
+ if (flo != null) {
+ final Faction faction = flo.getOwner();
+ if (factionPlayer.getFaction() == null || factionPlayer.getFaction() != faction) {
+ player.sendMessage(ChatColor.RED + "You can only place minecart on your territory !");
+ }
+ }
+ else {
+ event.setCancelled(true);
+ player.sendMessage(ChatColor.RED + "You can only place minecart on your territory !");
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/vipermisc/Misc.java b/ViperCore/src/main/java/com/igodlik3/vipermisc/Misc.java
new file mode 100644
index 0000000..3900f12
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/vipermisc/Misc.java
@@ -0,0 +1,53 @@
+package com.igodlik3.vipermisc;
+
+import com.igodlik3.vipermisc.listeners.ScoreboardListener;
+import com.igodlik3.vipermisc.sotw.SOTWCmd;
+import com.igodlik3.vipermisc.sotw.SOTWListener;
+import com.igodlik3.vipermisc.sotw.SOTWManager;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.event.Listener;
+import org.bukkit.plugin.Plugin;
+
+/**
+ * Created by libhalt on 2016/12/06.
+ */
+public class Misc extends Manager{
+ public static Misc INSTANCE;
+ private HCFactionPlugin hcfStuff;
+
+ public static Misc getInstance(){
+ return INSTANCE;
+ }
+ public Misc(HCFactionPlugin plugin) {
+ super(plugin);
+ INSTANCE = this;
+ }
+
+ private ConfigurationWrapper config;
+ private SOTWManager sotwManager;
+ public Configuration getConfig(){
+ return config.getConfig();
+ }
+ public void init() {
+ hcfStuff = HCFactionPlugin.getInstance();
+ config = new ConfigurationWrapper("viper-misc.yml", this.getPlugin());
+ config.saveDefault();
+ sotwManager = new SOTWManager();
+ getPlugin().getCommand("sotw").setExecutor(new SOTWCmd());
+
+
+ getPlugin().getServer().getPluginManager().registerEvents((Listener) new ScoreboardListener(), getPlugin());
+ getPlugin().getServer().getPluginManager().registerEvents((Listener)new SOTWListener(), getPlugin());
+ }
+
+ public SOTWManager getSotwManager() {
+ return sotwManager;
+ }
+
+ public HCFactionPlugin getHcfStuff() {
+ return hcfStuff;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/vipermisc/Timer.java b/ViperCore/src/main/java/com/igodlik3/vipermisc/Timer.java
new file mode 100644
index 0000000..e120485
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/vipermisc/Timer.java
@@ -0,0 +1,14 @@
+package com.igodlik3.vipermisc;
+
+public interface Timer
+{
+ boolean isActive();
+
+ long getLeftTime();
+
+ long getTimerEnd();
+
+ void setTimerEnd(final long p0);
+
+ String toString();
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/vipermisc/listeners/ScoreboardListener.java b/ViperCore/src/main/java/com/igodlik3/vipermisc/listeners/ScoreboardListener.java
new file mode 100644
index 0000000..f3adb44
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/vipermisc/listeners/ScoreboardListener.java
@@ -0,0 +1,51 @@
+package com.igodlik3.vipermisc.listeners;
+
+import com.igodlik3.vipermisc.*;
+import com.igodlik3.vipermisc.sotw.*;
+import net.libhalt.bukkit.kaede.event.*;
+import org.bukkit.entity.*;
+import org.bukkit.event.*;
+import net.libhalt.bukkit.kaede.manager.*;
+import net.libhalt.bukkit.kaede.*;
+
+public class ScoreboardListener implements Listener
+{
+ private Misc misc;
+ private final String DECO_LINE;
+ private SOTWManager sotwManager;
+
+ public ScoreboardListener() {
+ this.misc = Misc.getInstance();
+ this.DECO_LINE = Misc.getInstance().getConfig().getString("scoreboard.deco-line");
+ this.sotwManager = Misc.getInstance().getSotwManager();
+ }
+
+ @EventHandler
+ public void onScoreboardUpdate(final ScoreboardTextAboutToUpdateEvent event) {
+ final Player player = event.getPlayer();
+ if (event.getText() != null) {
+ if (event.getText().contains("%deco_line%")) {
+ if (this.shouldDisplayLine(player)) {
+ event.setText(this.DECO_LINE);
+ }
+ else {
+ event.setText((String)null);
+ }
+ }
+ else if (event.getText().contains("%sotw%")) {
+ if (this.sotwManager.isSOTWActive()) {
+ String text2 = event.getText();
+ text2 = text2.replace("%sotw%", this.sotwManager.getTimer().toString());
+ event.setText(text2);
+ }
+ else {
+ event.setText((String)null);
+ }
+ }
+ }
+ }
+
+ private boolean shouldDisplayLine(final Player player) {
+ return true;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWCmd.java b/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWCmd.java
new file mode 100644
index 0000000..408edeb
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWCmd.java
@@ -0,0 +1,51 @@
+package com.igodlik3.vipermisc.sotw;
+
+import com.igodlik3.vipermisc.*;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import org.bukkit.command.*;
+import com.igodlik3.modmode.utils.*;
+import org.bukkit.*;
+
+public class SOTWCmd implements CommandExecutor
+{
+ private SOTWManager sotwManager;
+
+ public SOTWCmd() {
+ this.sotwManager = Misc.getInstance().getSotwManager();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (!sender.hasPermission("Viper.SOTW")) {
+ return true;
+ }
+ if (args.length == 0) {
+ sender.sendMessage(Utils.color("&e/sotw start &7- &6Start the SOTW"));
+ sender.sendMessage(Utils.color("&e/sotw stop &7- &6Stop the SOTW"));
+ }
+ else if (args[0].equalsIgnoreCase("start")) {
+ if (this.sotwManager.isSOTWActive()) {
+ String active = HCFactionPlugin.getInstance().messages.getString("sotw-active").replaceAll("&", "§");
+ sender.sendMessage(active);
+ return true;
+ }
+ if(args.length >= 2) {
+ this.sotwManager.activeSOTW(Integer.valueOf(args[1]));
+
+ }else{
+ this.sotwManager.activeSOTW();
+ }
+ }
+ else if (args[0].equalsIgnoreCase("stop")) {
+ if (!this.sotwManager.isSOTWActive()) {
+ String inactive = HCFactionPlugin.getInstance().messages.getString("sotw-inactive").replaceAll("&", "§");
+ sender.sendMessage(inactive);
+ return true;
+ }
+
+ String stopped = HCFactionPlugin.getInstance().messages.getString("sotw-stopped").replaceAll("&", "§");
+ this.sotwManager.getTimer().setTimerEnd(0L);
+ Bukkit.broadcastMessage(stopped);
+ }
+ return true;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWListener.java b/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWListener.java
new file mode 100644
index 0000000..31e7700
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWListener.java
@@ -0,0 +1,55 @@
+package com.igodlik3.vipermisc.sotw;
+
+import com.igodlik3.vipermisc.*;
+import org.bukkit.entity.*;
+import net.libhalt.bukkit.kaede.*;
+import org.bukkit.event.*;
+import org.bukkit.event.player.*;
+import org.bukkit.event.entity.*;
+import org.bukkit.scheduler.BukkitRunnable;
+
+public class SOTWListener implements Listener
+{
+ private Misc misc;
+ private SOTWManager sotwManager;
+
+ public SOTWListener() {
+ this.misc = Misc.getInstance();
+ this.sotwManager = this.misc.getSotwManager();
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onPlayerJoin(final PlayerJoinEvent event) {
+ if (!this.sotwManager.isSOTWActive()) {
+ return;
+ }
+ final Player player = event.getPlayer();
+ final PlayerData data = misc.getHcfStuff().getPlayerDataManager().getPlayerData(player);
+ if (data != null && data.getPvpTime() > 0) {
+ data.setPvpTime(0);
+ }
+
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST)
+ public void onPlayerRespawn(final PlayerRespawnEvent event) {
+ if (!this.sotwManager.isSOTWActive()) {
+ return;
+ }
+ final Player player = event.getPlayer();
+ final PlayerData data = this.misc.getHcfStuff().getPlayerDataManager().getPlayerData(player);
+ if (data.getPvpTime() > 0) {
+ data.setPvpTime(0);
+ }
+ }
+
+ @EventHandler
+ public void onEntityDamage(final EntityDamageEvent event) {
+ if (event.isCancelled() || !(event.getEntity() instanceof Player) || !this.sotwManager.isSOTWActive()) {
+ return;
+ }
+ if (event.getCause() != EntityDamageEvent.DamageCause.VOID) {
+ event.setCancelled(true);
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWManager.java b/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWManager.java
new file mode 100644
index 0000000..9b86b30
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWManager.java
@@ -0,0 +1,42 @@
+package com.igodlik3.vipermisc.sotw;
+
+import org.bukkit.*;
+import com.igodlik3.vipermisc.*;
+import com.igodlik3.vipermisc.utils.*;
+import org.bukkit.entity.*;
+import net.libhalt.bukkit.kaede.*;
+
+public class SOTWManager
+{
+ private SOTWTimer timer;
+ private HCFactionPlugin core;
+
+ public SOTWManager() {
+ this.timer = new SOTWTimer();
+ this.core = HCFactionPlugin.getInstance();
+ }
+
+ public boolean isSOTWActive() {
+ return this.timer.isActive();
+ }
+
+ public void activeSOTW() {
+ activeSOTW(Misc.getInstance().getConfig().getInt("sotw-defaultTime"));
+ }
+ public void activeSOTW(int value) {
+ for (Player player : Bukkit.getOnlinePlayers()){
+ final PlayerData data = this.core.getPlayerDataManager().getPlayerData(player);
+ if (data.getPvpTime() > 0) {
+ data.setPvpTime(0);
+ }
+ }
+ this.timer.setTimerEnd(System.currentTimeMillis() + 1000 * value);
+
+ String started = HCFactionPlugin.getInstance().messages.getString("sotw-started").replaceAll("&", "§");
+ Bukkit.broadcastMessage(started);
+ }
+
+ public SOTWTimer getTimer() {
+ return this.timer;
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWTimer.java b/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWTimer.java
new file mode 100644
index 0000000..cb1df37
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/vipermisc/sotw/SOTWTimer.java
@@ -0,0 +1,38 @@
+package com.igodlik3.vipermisc.sotw;
+
+import com.igodlik3.vipermisc.*;
+
+public class SOTWTimer implements Timer
+{
+ private long timerEnd;
+
+ @Override
+ public boolean isActive() {
+ return this.getTimerEnd() > System.currentTimeMillis();
+ }
+
+ @Override
+ public long getLeftTime() {
+ return this.getTimerEnd() - System.currentTimeMillis();
+ }
+
+ @Override
+ public long getTimerEnd() {
+ return this.timerEnd;
+ }
+
+ @Override
+ public void setTimerEnd(final long timerEnd) {
+ this.timerEnd = timerEnd;
+ }
+
+ @Override
+ public String toString() {
+ final long left = this.getLeftTime();
+ final long totalSecs = left / 1000L;
+ if (totalSecs >= 3600L) {
+ return String.format("%02d:%02d:%02d", totalSecs / 3600L, totalSecs % 3600L / 60L, totalSecs % 60L);
+ }
+ return String.format("%02d:%02d", totalSecs / 60L, totalSecs % 60L);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/vipermisc/utils/Utils.java b/ViperCore/src/main/java/com/igodlik3/vipermisc/utils/Utils.java
new file mode 100644
index 0000000..fbd9111
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/vipermisc/utils/Utils.java
@@ -0,0 +1,10 @@
+package com.igodlik3.vipermisc.utils;
+
+import org.bukkit.*;
+
+public class Utils
+{
+ public static String color(final String message) {
+ return ChatColor.translateAlternateColorCodes('&', message);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/viperutils/BoostXPListener.java b/ViperCore/src/main/java/com/igodlik3/viperutils/BoostXPListener.java
new file mode 100644
index 0000000..0296b9c
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/viperutils/BoostXPListener.java
@@ -0,0 +1,31 @@
+package com.igodlik3.viperutils;
+
+import org.bukkit.configuration.*;
+import org.bukkit.event.entity.*;
+import org.bukkit.entity.*;
+import org.bukkit.*;
+import org.bukkit.enchantments.*;
+import org.bukkit.inventory.*;
+import org.bukkit.event.*;
+
+public class BoostXPListener implements Listener
+{
+ private Configuration config;
+
+ public BoostXPListener() {
+ this.config = (Configuration)ViperUtils.getInstance().getConfig();
+ }
+
+ @EventHandler
+ public void onEntityDeath(final EntityDeathEvent event) {
+ if (event.getEntity().getKiller() != null && event.getEntity().getKiller() instanceof Player) {
+ final Player player = event.getEntity().getKiller();
+ if (player.getItemInHand() != null && player.getItemInHand().getType() != Material.AIR) {
+ final ItemStack item = player.getItemInHand();
+ if (item.containsEnchantment(Enchantment.LOOT_BONUS_MOBS)) {
+ event.setDroppedExp(event.getDroppedExp() * (item.getEnchantmentLevel(Enchantment.LOOT_BONUS_MOBS) + this.config.getInt("XPBonus-Multiplier")));
+ }
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/viperutils/CmdCredits.java b/ViperCore/src/main/java/com/igodlik3/viperutils/CmdCredits.java
new file mode 100644
index 0000000..defab45
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/viperutils/CmdCredits.java
@@ -0,0 +1,20 @@
+package com.igodlik3.viperutils;
+
+import org.bukkit.command.*;
+import org.bukkit.*;
+
+public class CmdCredits implements CommandExecutor
+{
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (args.length > 0 && args[0].equalsIgnoreCase("credits")) {
+ sender.sendMessage(this.color("&9Developed by &eiGoDLiK3"));
+ sender.sendMessage(this.color("&9Founded by &6Salvific"));
+ sender.sendMessage(this.color("&aWebsite&7: &cMC-Outlet.com"));
+ }
+ return true;
+ }
+
+ private String color(final String stg) {
+ return ChatColor.translateAlternateColorCodes('&', stg);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/viperutils/CmdMuteFaction.java b/ViperCore/src/main/java/com/igodlik3/viperutils/CmdMuteFaction.java
new file mode 100644
index 0000000..afd5a85
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/viperutils/CmdMuteFaction.java
@@ -0,0 +1,46 @@
+package com.igodlik3.viperutils;
+
+import net.syuu.common.command.*;
+import net.syuu.common.command.condition.PermissionCondition;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.FactionDataManager;
+import net.syuu.popura.faction.bean.Faction;
+import org.bukkit.configuration.*;
+import org.bukkit.entity.*;
+import org.bukkit.command.*;
+import org.bukkit.*;
+
+public class CmdMuteFaction extends net.syuu.common.command.Command
+{
+ private Configuration config;
+
+ public CmdMuteFaction() {
+ super("mute");
+ this.config = (Configuration)ViperUtils.getInstance().getConfig();
+ addCondition(new PermissionCondition("factions.mute"));
+ }
+
+ public void proccess(final Player player, final String[] args) {
+ final FactionDataManager factionDataManager = ((PopuraPlugin)PopuraPlugin.getPlugin(PopuraPlugin.class)).getPopura().getFactionDataManager();
+ Faction faction = factionDataManager.getPlayer(player).getFaction();
+ if(args.length > 0){
+ faction = factionDataManager.getFaction(args[0]);
+ }
+ if (faction == null) {
+ return;
+ }
+ final String time = args[1];
+ final String reason = args[2];
+ for (final Player bukkitPlayer : faction.getOnlineMembers()) {
+ Bukkit.dispatchCommand((CommandSender)Bukkit.getConsoleSender(), this.config.getString("mute-cmd").replaceAll("%TIME%", time).replaceAll("%PLAYER%", bukkitPlayer.getName()).replaceAll("%REASON%", reason));
+ }
+ if (this.config.getBoolean("Broadcast.enabled")) {
+ Bukkit.broadcastMessage(this.color(this.config.getString("Broadcast.message").replaceAll("%FACTION%", faction.getName()).replaceAll("%REASON%", reason)).replaceAll("%PLAYER%", player.getName()));
+ }
+ }
+
+
+ private String color(final String stg) {
+ return ChatColor.translateAlternateColorCodes('&', stg);
+ }
+}
diff --git a/ViperCore/src/main/java/com/igodlik3/viperutils/ViperUtils.java b/ViperCore/src/main/java/com/igodlik3/viperutils/ViperUtils.java
new file mode 100644
index 0000000..8e209bf
--- /dev/null
+++ b/ViperCore/src/main/java/com/igodlik3/viperutils/ViperUtils.java
@@ -0,0 +1,38 @@
+package com.igodlik3.viperutils;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.popura.command.faction.FactionCommand;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.plugin.java.*;
+import org.bukkit.*;
+import org.bukkit.event.*;
+import org.bukkit.plugin.*;
+import org.bukkit.command.*;
+
+public class ViperUtils extends Manager
+{
+ private static ViperUtils instance;
+ private ConfigurationWrapper config;
+
+ public ViperUtils(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ public Configuration getConfig(){
+ return config.getConfig();
+ }
+ public void init() {
+ config = new ConfigurationWrapper("viper-utils.yml", this.getPlugin());
+ config.saveDefault();
+ ViperUtils.instance = this;
+ FactionCommand.INSTANCE.addSubCommand(new CmdMuteFaction());
+ Bukkit.getPluginManager().registerEvents((Listener)new BoostXPListener(), getPlugin());
+ this.getPlugin().getCommand("utils").setExecutor((CommandExecutor)new CmdCredits());
+ }
+
+ public static ViperUtils getInstance() {
+ return ViperUtils.instance;
+ }
+}
diff --git a/ViperCore/src/main/java/config/ConfigData.java b/ViperCore/src/main/java/config/ConfigData.java
new file mode 100644
index 0000000..99a046e
--- /dev/null
+++ b/ViperCore/src/main/java/config/ConfigData.java
@@ -0,0 +1,51 @@
+package config;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+
+/**
+ * Created by Brennan on 6/15/2017.
+ */
+public class ConfigData
+{
+
+ HCFactionPlugin plugin;
+ public ConfigData(HCFactionPlugin instance){
+ this.plugin = instance;
+ }
+
+ public void setupDefaultMessages()
+ {
+ if(!isSetup())
+ {
+ plugin.messages.set("nether-portal-in-spawn", "&7(&aViper&7) You cannot enter the portal from spawn.");
+ plugin.messages.set("all-players-in-spawn", "&7(&aViper&7) All players are currently in spawn.");
+ plugin.messages.set("only-one-online", "&7(&aViper&7) You are the only person online.");
+ plugin.messages.set("xp-bottle-created", "&7(&aViper&7) You have bottled the xp.");
+ plugin.messages.set("xp-bottle-received", "&7(&aViper&7) You have un-bottled the xp. ");
+ plugin.messages.set("xp-bottle-inventory", "&7(&aViper&7) You must have one available inventory space.");
+ plugin.messages.set("xp-bottle-insufficient", "&7(&aViper&7) You must have a minimum of 30 XP to bottle.");
+ plugin.messages.set("xp-bottle-name", "&a&lLevel 30 XP Bottle");
+ plugin.messages.set("pearl-stuck-message", "&7(&aViper&7) Plugin prevented you from becoming stuck.");
+ plugin.messages.set("pearl-suffocate-message", "&7(&aViper&7) Plugin prevented you from suffocating.");
+ plugin.messages.set("sotw-started", "&7(&aViper&7) The SOTW has been started.");
+ plugin.messages.set("sotw-stopped", "&7(&aViper&7) The SOTW has been stopped.");
+ plugin.messages.set("sotw-active", "&7(&aViper&7) The SOTW is already active.");
+ plugin.messages.set("sotw-inactive", "&7(&aViper&7) The SOTW is not active.");
+ plugin.messages.saveConfig();
+ }
+ }
+
+ public boolean isSetup()
+ {
+ if(!plugin.messages.contains("nether-portal-in-spawn"))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public String getConfigMessage(String message) {
+ return plugin.messages.getString(message);
+ }
+}
+
diff --git a/ViperCore/src/main/java/config/MyConfig.java b/ViperCore/src/main/java/config/MyConfig.java
new file mode 100644
index 0000000..d5892be
--- /dev/null
+++ b/ViperCore/src/main/java/config/MyConfig.java
@@ -0,0 +1,104 @@
+package config;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Set;
+
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.plugin.java.JavaPlugin;
+
+public class MyConfig
+{
+ private int comments;
+ private MyConfigManager manager;
+
+ private File file;
+ private FileConfiguration config;
+
+ @SuppressWarnings("deprecation")
+ public MyConfig(InputStream configStream, File configFile, int comments, JavaPlugin plugin)
+ {
+ this.comments = comments;
+ this.manager = new MyConfigManager(plugin);
+ this.file = configFile;
+ this.config = YamlConfiguration.loadConfiguration(configStream);
+ }
+
+ public Object get(String path) {return this.config.get(path);}
+
+ public Object get(String path, Object def) {return this.config.get(path, def);}
+
+ public String getString(String path) {return this.config.getString(path);}
+
+ public String getString(String path, String def) {return this.config.getString(path, def);}
+
+ public int getInt(String path) {return this.config.getInt(path);}
+
+ public int getInt(String path, int def) {return this.config.getInt(path, def);}
+
+ public boolean getBoolean(String path) {return this.config.getBoolean(path);}
+
+ public boolean getBoolean(String path, boolean def) {return this.config.getBoolean(path, def);}
+
+ public void createSection(String path) {this.config.createSection(path);}
+
+ public ConfigurationSection getConfigurationSection(String path) {return this.config.getConfigurationSection(path);}
+
+ public double getDouble(String path) {return this.config.getDouble(path);}
+
+ public double getDouble(String path, double def) {return this.config.getDouble(path, def);}
+
+ public List> getList(String path) {return this.config.getList(path);}
+
+ public List> getList(String path, List> def) {return this.config.getList(path, def);}
+
+ public boolean contains(String path) {return this.config.contains(path);}
+
+ public void removeKey(String path) {this.config.set(path, null);}
+
+ public void set(String path, Object value) {this.config.set(path, value);}
+
+ public void set(String path, Object value, String comment)
+ {
+ if(!this.config.contains(path))
+ {
+ this.config.set(manager.getPluginName() + "_COMMENT_" + comments, " " + comment);
+ comments++;
+ }
+ this.config.set(path, value);
+ }
+
+ public void set(String path, Object value, String[] comment)
+ {
+ for(String comm : comment)
+ {
+ if(!this.config.contains(path))
+ {
+ this.config.set(manager.getPluginName() + "_COMMENT_" + comments, " " + comm);
+ comments++;
+ }
+ }
+ this.config.set(path, value);
+ }
+
+ public void setHeader(String[] header)
+ {
+ manager.setHeader(this.file, header);
+ this.comments = header.length + 2;
+ this.reloadConfig();
+ }
+
+ @SuppressWarnings("deprecation")
+ public void reloadConfig() {this.config = YamlConfiguration.loadConfiguration(manager.getConfigContent(file));}
+
+ public void saveConfig()
+ {
+ String config = this.config.saveToString();
+ manager.saveConfig(config, this.file);
+ }
+
+ public Set getKeys() {return this.config.getKeys(false);}
+}
diff --git a/ViperCore/src/main/java/config/MyConfigManager.java b/ViperCore/src/main/java/config/MyConfigManager.java
new file mode 100644
index 0000000..e986590
--- /dev/null
+++ b/ViperCore/src/main/java/config/MyConfigManager.java
@@ -0,0 +1,288 @@
+package config;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.Charset;
+
+import org.bukkit.plugin.java.JavaPlugin;
+
+public class MyConfigManager
+{
+ private JavaPlugin plugin;
+
+ public MyConfigManager(JavaPlugin plugin)
+ {
+ this.plugin = plugin;
+ }
+
+ public MyConfig getNewConfig(String fileName, String[] header)
+ {
+ File file = this.getConfigFile(fileName);
+
+ if(!file.exists())
+ {
+ this.prepareFile(fileName);
+ if(header != null && header.length != 0)
+ this.setHeader(file, header);
+ }
+
+ MyConfig config = new MyConfig(this.getConfigContent(fileName), file, this.getCommentsNum(file), plugin);
+ return config;
+ }
+
+ public MyConfig getNewConfig(String fileName)
+ {
+ return this.getNewConfig(fileName, null);
+ }
+
+ private File getConfigFile(String file)
+ {
+ if(file.isEmpty() || file == null)
+ return null;
+
+ File configFile;
+
+ if(file.contains("/"))
+ {
+ if(file.startsWith("/"))
+ configFile = new File(plugin.getDataFolder() + file.replace("/", File.separator));
+ else configFile = new File(plugin.getDataFolder() + File.separator + file.replace("/", File.separator));
+ }
+ else configFile = new File(plugin.getDataFolder(), file);
+
+ return configFile;
+ }
+
+ public void prepareFile(String filePath, String resource)
+ {
+ File file = this.getConfigFile(filePath);
+
+ if(file.exists())
+ return;
+
+ try
+ {
+ file.getParentFile().mkdirs();
+ file.createNewFile();
+
+ if(resource != null)
+ if(!resource.isEmpty())
+ this.copyResource(plugin.getResource(resource), file);
+
+ }
+ catch (IOException e){e.printStackTrace();}
+ }
+
+ public void prepareFile(String filePath)
+ {
+ this.prepareFile(filePath, null);
+ }
+
+ public void setHeader(File file, String[] header)
+ {
+ if(!file.exists())
+ return;
+
+ try
+ {
+ String currentLine;
+ StringBuilder config = new StringBuilder("");
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+
+ while((currentLine = reader.readLine()) != null)
+ config.append(currentLine + "\n");
+
+ reader.close();
+ config.append("# +----------------------------------------------------+ #\n");
+
+ for(String line : header)
+ {
+ if(line.length() > 50)
+ continue;
+
+ int lenght = (50 - line.length()) / 2;
+ StringBuilder finalLine = new StringBuilder(line);
+
+ for(int i = 0; i < lenght; i++)
+ {
+ finalLine.append(" ");
+ finalLine.reverse();
+ finalLine.append(" ");
+ finalLine.reverse();
+ }
+
+ if(line.length() % 2 != 0)
+ finalLine.append(" ");
+
+ config.append("# < " + finalLine.toString() + " > #\n");
+ }
+ config.append("# +----------------------------------------------------+ #");
+
+ BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+ writer.write(this.prepareConfigString(config.toString()));
+ writer.flush();
+ writer.close();
+ }
+ catch (IOException e){e.printStackTrace();}
+ }
+
+ public InputStream getConfigContent(File file)
+ {
+ if(!file.exists())
+ return null;
+ try
+ {
+ int commentNum = 0;
+
+ String addLine;
+ String currentLine;
+ String pluginName = this.getPluginName();
+
+ StringBuilder whole = new StringBuilder("");
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+
+ while((currentLine = reader.readLine()) != null)
+ {
+ if(currentLine.startsWith("#"))
+ {
+ addLine = currentLine.replaceFirst("#", pluginName + "_COMMENT_" + commentNum + ":");
+ whole.append(addLine + "\n");
+ commentNum++;
+ }
+ else whole.append(currentLine + "\n");
+ }
+
+ String config = whole.toString();
+ InputStream configStream = new ByteArrayInputStream(config.getBytes(Charset.forName("UTF-8")));
+
+ reader.close();
+ return configStream;
+ }
+ catch (IOException e){e.printStackTrace();return null;}
+ }
+
+ private int getCommentsNum(File file)
+ {
+ if(!file.exists())
+ return 0;
+ try
+ {
+ int comments = 0;
+ String currentLine;
+
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+
+ while((currentLine = reader.readLine()) != null)
+ if(currentLine.startsWith("#"))
+ comments++;
+
+ reader.close();
+ return comments;
+ }
+ catch (IOException e){e.printStackTrace();return 0;}
+ }
+
+ public InputStream getConfigContent(String filePath)
+ {
+ return this.getConfigContent(this.getConfigFile(filePath));
+ }
+
+ private String prepareConfigString(String configString)
+ {
+ int lastLine = 0;
+ int headerLine = 0;
+
+ String[] lines = configString.split("\n");
+ StringBuilder config = new StringBuilder("");
+
+ for(String line : lines)
+ {
+ if(line.startsWith(this.getPluginName() + "_COMMENT"))
+ {
+ String comment = "#" + line.trim().substring(line.indexOf(":") + 1);
+
+ if(comment.startsWith("# +-"))
+ {
+ if(headerLine == 0)
+ {
+ config.append(comment + "\n");
+ lastLine = 0;
+ headerLine = 1;
+ }
+ else if(headerLine == 1)
+ {
+ config.append(comment + "\n\n");
+ lastLine = 0;
+ headerLine = 0;
+ }
+ }
+ else
+ {
+ String normalComment;
+ if(comment.startsWith("# ' "))
+ normalComment = comment.substring(0, comment.length() - 1).replaceFirst("# ' ", "# ");
+ else normalComment = comment;
+
+ if(lastLine == 0)
+ config.append(normalComment + "\n");
+ else if(lastLine == 1)
+ config.append("\n" + normalComment + "\n");
+
+ lastLine = 0;
+ }
+ }
+ else
+ {
+ config.append(line + "\n");
+ lastLine = 1;
+ }
+ }
+ return config.toString();
+ }
+
+ public void saveConfig(String configString, File file)
+ {
+ String configuration = this.prepareConfigString(configString);
+
+ try
+ {
+ BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+ writer.write(configuration);
+ writer.flush();
+ writer.close();
+
+ }
+ catch (IOException e){e.printStackTrace();}
+ }
+
+ public String getPluginName()
+ {
+ return plugin.getDescription().getName();
+ }
+
+ private void copyResource(InputStream resource, File file)
+ {
+ try
+ {
+ OutputStream out = new FileOutputStream(file);
+
+ int length;
+ byte[] buf = new byte[1024];
+
+ while((length = resource.read(buf)) > 0)
+ out.write(buf, 0, length);
+
+ out.close();
+ resource.close();
+ }
+ catch (Exception e) {e.printStackTrace();}
+ }
+}
\ No newline at end of file
diff --git a/ViperCore/src/main/java/me/dreamzy/report/ViperReport.java b/ViperCore/src/main/java/me/dreamzy/report/ViperReport.java
new file mode 100644
index 0000000..8674730
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/ViperReport.java
@@ -0,0 +1,95 @@
+package me.dreamzy.report;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.popura.command.faction.FactionCommand;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.plugin.java.*;
+import org.bukkit.*;
+import org.bukkit.event.*;
+import org.bukkit.plugin.*;
+import me.dreamzy.report.stats.*;
+import me.dreamzy.report.reports.*;
+import org.bukkit.command.*;
+
+public class ViperReport extends Manager
+{
+ private static ViperReport instance;
+ private String prefix;
+ private String prefixReportGui;
+ private String prefixReportChatGui;
+ private String prefixReportCheatGui;
+ private StatsManager statsManager;
+ private ReportManager reportManager;
+
+ {
+ this.prefix = "&8[&9Delta&aReport&8]";
+ this.prefixReportGui = "&e\u2022 &9Report &6";
+ this.prefixReportChatGui = "&2Cheat &e";
+ this.prefixReportCheatGui = "&6Chat &e";
+ }
+
+ public ViperReport(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+ private ConfigurationWrapper config;
+ public Configuration getConfig(){
+ return config.getConfig();
+ }
+ public void init() {
+ config = new ConfigurationWrapper("report.yml", this.getPlugin());
+ config.saveDefault();
+ (ViperReport.instance = this).loadManagers();
+ this.loadListeners();
+ this.loadCommands();
+ }
+
+ public void onDisable() {
+ this.statsManager.saveData();
+ }
+
+ private void loadManagers() {
+ (this.statsManager = new StatsManager()).reloadData();
+ this.reportManager = new ReportManager();
+ }
+
+ public void loadListeners() {
+ final PluginManager pm = Bukkit.getPluginManager();
+ pm.registerEvents((Listener)new StatsListener(), this.getPlugin());
+ //pm.registerEvents((Listener)new ReportListener(), this.getPlugin());
+ }
+
+ public void loadCommands() {
+ FactionCommand.INSTANCE.addSubCommand(new CmdStats());
+ //this.getPlugin().getCommand("report").setExecutor((CommandExecutor)new CmdReport());
+ }
+
+ public static ViperReport getInstance() {
+ return ViperReport.instance;
+ }
+
+ public String getPrefix() {
+ return this.prefix;
+ }
+
+ public String getPrefixReportGui() {
+ return this.prefixReportGui;
+ }
+
+ public String getPrefixReportChatGui() {
+ return this.prefixReportChatGui;
+ }
+
+ public String getPrefixReportCheatGui() {
+ return this.prefixReportCheatGui;
+ }
+
+ public StatsManager getStatsManager() {
+ return this.statsManager;
+ }
+
+ public ReportManager getReportManager() {
+ return this.reportManager;
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/reports/CmdReport.java b/ViperCore/src/main/java/me/dreamzy/report/reports/CmdReport.java
new file mode 100644
index 0000000..fa0aaf1
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/reports/CmdReport.java
@@ -0,0 +1,72 @@
+package me.dreamzy.report.reports;
+
+import me.dreamzy.report.*;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.configuration.*;
+import org.bukkit.command.*;
+import org.bukkit.entity.*;
+import me.dreamzy.report.utils.*;
+import org.bukkit.*;
+
+public class CmdReport implements CommandExecutor
+{
+ private ViperReport plugin;
+ private Configuration config;
+ private ReportManager reportManager;
+
+ public CmdReport() {
+ this.plugin = ViperReport.getInstance();
+ this.config = (Configuration)ViperReport.getInstance().getConfig();
+ this.reportManager = this.plugin.getReportManager();
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage(Utils.color(this.config.getString("Messages.NO-PERM")));
+ return true;
+ }
+ final Player player = (Player)sender;
+ if (args.length == 0) {
+ this.sendHelp(player);
+ }
+ else {
+ if (CooldownUtils.isOnCooldown("Report", player)) {
+ sender.sendMessage(Utils.color(this.config.getString("Messages.REPORT-COOLDOWN")).replace("%TIME%", String.valueOf(CooldownUtils.getCooldownForPlayerInt("Report", player))));
+ return true;
+ }
+ final Player cheater = Bukkit.getPlayer(args[0]);
+ if (cheater != null) {
+
+ final FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if (player == cheater) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.SELF-REPORT")));
+ return true;
+ }
+ if (factionPlayer.getFaction() != null) {
+ final ReportData data = this.reportManager.getReportData(factionPlayer.getFaction());
+ if (!data.reportPlayer(cheater.getName())) {
+ player.sendMessage(Utils.color(this.config.getString("Messages.MAX-REPORT-FACTION")).replace("%REPORT_COUNT%", String.valueOf(data.getMAX_REPORT_PER_FACTION())));
+ return true;
+ }
+ }
+ if (this.reportManager.getReport(player) != null) {
+ this.reportManager.getReports().remove(this.reportManager.getReport(player));
+ }
+ final Report report = new Report(player, args[0]);
+ this.reportManager.getReports().add(report);
+ this.reportManager.openReportInventory(player);
+ }
+ else {
+ player.sendMessage(Utils.color(this.config.getString("Messages.REPORT-USAGE")));
+ }
+ }
+ return false;
+ }
+
+ public void sendHelp(final Player player) {
+ for (final String msg : this.config.getStringList("Messages.HELP-CMD")) {
+ player.sendMessage(Utils.color(msg));
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/reports/Report.java b/ViperCore/src/main/java/me/dreamzy/report/reports/Report.java
new file mode 100644
index 0000000..b7038c0
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/reports/Report.java
@@ -0,0 +1,165 @@
+package me.dreamzy.report.reports;
+
+import org.bukkit.entity.*;
+import javax.annotation.*;
+import org.bukkit.configuration.*;
+import me.dreamzy.report.*;
+import net.md_5.bungee.api.chat.*;
+import me.dreamzy.report.utils.*;
+import org.bukkit.*;
+
+public class Report
+{
+ private Player sender;
+ private String reported;
+ @Nullable
+ private String reason;
+ private Configuration config;
+
+ public Report(final Player sender, final String reported) {
+ this.config = (Configuration)ViperReport.getInstance().getConfig();
+ this.sender = sender;
+ this.reported = reported;
+ this.reason = null;
+ }
+
+ public void send() {
+ for (Player staff : Bukkit.getOnlinePlayers()){
+ if (staff.hasPermission("viper.report")) {
+ String msg = Utils.color(this.config.getString("Messages.REPORT-SEND-STAFF"));
+ msg = msg.replace("%PLAYER%", this.reported);
+ msg = msg.replace("%REASON%", this.reason);
+ final TextComponent text = new TextComponent(msg);
+ text.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tp " + this.reported));
+ final Location loc = staff.getLocation();
+ staff.spigot().sendMessage((BaseComponent)text);
+ staff.playSound(loc, Sound.WOLF_GROWL, 0.5f, 0.5f);
+ staff.playSound(loc, Sound.ENDERDRAGON_GROWL, 100.0f, 1.0f);
+ }
+ }
+ this.sender.sendMessage(Utils.color(this.config.getString("Messages.REPORT-SEND")));
+ CooldownUtils.addCooldown("Report", this.sender, 60);
+ ViperReport.getInstance().getReportManager().getReports().remove(this);
+ }
+
+ public Player getSender() {
+ return this.sender;
+ }
+
+ public String getReported() {
+ return this.reported;
+ }
+
+ @Nullable
+ public String getReason() {
+ return this.reason;
+ }
+
+ public Configuration getConfig() {
+ return this.config;
+ }
+
+ public void setSender(final Player sender) {
+ this.sender = sender;
+ }
+
+ public void setReported(final String reported) {
+ this.reported = reported;
+ }
+
+ public void setReason(@Nullable final String reason) {
+ this.reason = reason;
+ }
+
+ public void setConfig(final Configuration config) {
+ this.config = config;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof Report)) {
+ return false;
+ }
+ final Report other = (Report)o;
+ if (!other.canEqual(this)) {
+ return false;
+ }
+ final Object this$sender = this.getSender();
+ final Object other$sender = other.getSender();
+ Label_0065: {
+ if (this$sender == null) {
+ if (other$sender == null) {
+ break Label_0065;
+ }
+ }
+ else if (this$sender.equals(other$sender)) {
+ break Label_0065;
+ }
+ return false;
+ }
+ final Object this$reported = this.getReported();
+ final Object other$reported = other.getReported();
+ Label_0102: {
+ if (this$reported == null) {
+ if (other$reported == null) {
+ break Label_0102;
+ }
+ }
+ else if (this$reported.equals(other$reported)) {
+ break Label_0102;
+ }
+ return false;
+ }
+ final Object this$reason = this.getReason();
+ final Object other$reason = other.getReason();
+ Label_0139: {
+ if (this$reason == null) {
+ if (other$reason == null) {
+ break Label_0139;
+ }
+ }
+ else if (this$reason.equals(other$reason)) {
+ break Label_0139;
+ }
+ return false;
+ }
+ final Object this$config = this.getConfig();
+ final Object other$config = other.getConfig();
+ if (this$config == null) {
+ if (other$config == null) {
+ return true;
+ }
+ }
+ else if (this$config.equals(other$config)) {
+ return true;
+ }
+ return false;
+ }
+
+ protected boolean canEqual(final Object other) {
+ return other instanceof Report;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ final Object $sender = this.getSender();
+ result = result * 59 + (($sender == null) ? 43 : $sender.hashCode());
+ final Object $reported = this.getReported();
+ result = result * 59 + (($reported == null) ? 43 : $reported.hashCode());
+ final Object $reason = this.getReason();
+ result = result * 59 + (($reason == null) ? 43 : $reason.hashCode());
+ final Object $config = this.getConfig();
+ result = result * 59 + (($config == null) ? 43 : $config.hashCode());
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Report(sender=" + this.getSender() + ", reported=" + this.getReported() + ", reason=" + this.getReason() + ", config=" + this.getConfig() + ")";
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/reports/ReportData.java b/ViperCore/src/main/java/me/dreamzy/report/reports/ReportData.java
new file mode 100644
index 0000000..96a070b
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/reports/ReportData.java
@@ -0,0 +1,107 @@
+package me.dreamzy.report.reports;
+
+import me.dreamzy.report.*;
+import net.syuu.popura.faction.bean.Faction;
+
+import java.util.*;
+
+public class ReportData
+{
+ private Faction faction;
+ private Map reportedPlayers;
+ private final int MAX_REPORT_PER_FACTION;
+
+ public ReportData(final Faction faction) {
+ this.MAX_REPORT_PER_FACTION = ViperReport.getInstance().getConfig().getInt("MAX-REPORT-PER-FACTION");
+ this.faction = faction;
+ this.reportedPlayers = new HashMap();
+ }
+
+ public boolean reportPlayer(final String name) {
+ if (this.reportedPlayers.containsKey(name)) {
+ final int reportTime = this.reportedPlayers.put(name, this.reportedPlayers.get(name) + 1);
+ return reportTime < this.MAX_REPORT_PER_FACTION;
+ }
+ this.reportedPlayers.put(name, 1);
+ return true;
+ }
+
+ public Faction getFaction() {
+ return this.faction;
+ }
+
+ public Map getReportedPlayers() {
+ return this.reportedPlayers;
+ }
+
+ public int getMAX_REPORT_PER_FACTION() {
+ return this.MAX_REPORT_PER_FACTION;
+ }
+
+ public void setFaction(final Faction faction) {
+ this.faction = faction;
+ }
+
+ public void setReportedPlayers(final Map reportedPlayers) {
+ this.reportedPlayers = reportedPlayers;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof ReportData)) {
+ return false;
+ }
+ final ReportData other = (ReportData)o;
+ if (!other.canEqual(this)) {
+ return false;
+ }
+ final Object this$faction = this.getFaction();
+ final Object other$faction = other.getFaction();
+ Label_0065: {
+ if (this$faction == null) {
+ if (other$faction == null) {
+ break Label_0065;
+ }
+ }
+ else if (this$faction.equals(other$faction)) {
+ break Label_0065;
+ }
+ return false;
+ }
+ final Object this$reportedPlayers = this.getReportedPlayers();
+ final Object other$reportedPlayers = other.getReportedPlayers();
+ if (this$reportedPlayers == null) {
+ if (other$reportedPlayers == null) {
+ return this.getMAX_REPORT_PER_FACTION() == other.getMAX_REPORT_PER_FACTION();
+ }
+ }
+ else if (this$reportedPlayers.equals(other$reportedPlayers)) {
+ return this.getMAX_REPORT_PER_FACTION() == other.getMAX_REPORT_PER_FACTION();
+ }
+ return false;
+ }
+
+ protected boolean canEqual(final Object other) {
+ return other instanceof ReportData;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ final Object $faction = this.getFaction();
+ result = result * 59 + (($faction == null) ? 43 : $faction.hashCode());
+ final Object $reportedPlayers = this.getReportedPlayers();
+ result = result * 59 + (($reportedPlayers == null) ? 43 : $reportedPlayers.hashCode());
+ result = result * 59 + this.getMAX_REPORT_PER_FACTION();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "ReportData(faction=" + this.getFaction() + ", reportedPlayers=" + this.getReportedPlayers() + ", MAX_REPORT_PER_FACTION=" + this.getMAX_REPORT_PER_FACTION() + ")";
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/reports/ReportListener.java b/ViperCore/src/main/java/me/dreamzy/report/reports/ReportListener.java
new file mode 100644
index 0000000..475e065
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/reports/ReportListener.java
@@ -0,0 +1,70 @@
+package me.dreamzy.report.reports;
+
+import com.igodlik3.ItemBuilder;
+import me.dreamzy.report.*;
+import org.bukkit.event.inventory.*;
+import org.bukkit.entity.*;
+import org.bukkit.event.*;
+import org.bukkit.*;
+import org.bukkit.inventory.*;
+import me.dreamzy.report.utils.*;
+
+public class ReportListener implements Listener
+{
+ private ViperReport plugin;
+ private ReportManager reportManager;
+
+ public ReportListener() {
+ this.plugin = ViperReport.getInstance();
+ this.reportManager = this.plugin.getReportManager();
+ }
+
+ @EventHandler
+ public void onInventoryClick(final InventoryClickEvent event) {
+ final Player player = (Player)event.getWhoClicked();
+ final Inventory inv = event.getInventory();
+ if (inv != null && inv.getName() != null && player.getOpenInventory().getTopInventory() == inv && event.getCurrentItem() != null && event.getCurrentItem().getType() != Material.AIR) {
+ final ItemStack item = event.getCurrentItem();
+ if (inv.getName().equalsIgnoreCase(Utils.color(this.plugin.getPrefixReportGui()))) {
+ event.setCancelled(true);
+ if (item.getType() == Material.DIAMOND_SWORD) {
+ this.openCheatInventory(player);
+ }
+ else {
+ this.openChatInventory(player);
+ }
+ }
+ else if (inv.getName().contains(Utils.color(this.plugin.getPrefixReportChatGui())) || inv.getName().contains(Utils.color(this.plugin.getPrefixReportCheatGui()))) {
+ event.setCancelled(true);
+ final Report report = this.reportManager.getReport(player);
+ if (report == null) {
+ player.closeInventory();
+ return;
+ }
+ report.setReason(item.getItemMeta().getDisplayName());
+ report.send();
+ player.closeInventory();
+ }
+ }
+ }
+
+ public void openChatInventory(final Player player) {
+ final Inventory inv = Bukkit.createInventory((InventoryHolder)player, 27, Utils.color(this.plugin.getPrefixReportChatGui()));
+ inv.setItem(10, new ItemBuilder(Material.DIAMOND_SWORD).displayname(Utils.color("&6Spamming Chat")).build());
+ inv.setItem(12, new ItemBuilder(Material.GOLD_SWORD).displayname(Utils.color("&5Spamming Msg")).build());
+ inv.setItem(14, new ItemBuilder(Material.POTION).displayname(Utils.color("&3Spamming Faction Title")).build());
+ inv.setItem(16, new ItemBuilder(Material.FEATHER).displayname(Utils.color("&cCAPS")).build());
+ inv.setItem(22, new ItemBuilder(Material.BOW).displayname(Utils.color("&dOthers")).build());
+ player.openInventory(inv);
+ }
+
+ public void openCheatInventory(final Player player) {
+ final Inventory inv = Bukkit.createInventory((InventoryHolder)player, 27, Utils.color(this.plugin.getPrefixReportCheatGui()));
+ inv.setItem(10, new ItemBuilder(Material.DIAMOND_SWORD).displayname(Utils.color("&6ForceField")).build());
+ inv.setItem(12, new ItemBuilder(Material.GOLD_SWORD).displayname(Utils.color("&5KillAura")).build());
+ inv.setItem(14, new ItemBuilder(Material.POTION).displayname(Utils.color("&3SpeedHack")).build());
+ inv.setItem(16, new ItemBuilder(Material.FEATHER).displayname(Utils.color("&eFly")).build());
+ inv.setItem(22, new ItemBuilder(Material.BOW).displayname(Utils.color("&dOthers")).build());
+ player.openInventory(inv);
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/reports/ReportManager.java b/ViperCore/src/main/java/me/dreamzy/report/reports/ReportManager.java
new file mode 100644
index 0000000..511e088
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/reports/ReportManager.java
@@ -0,0 +1,60 @@
+package me.dreamzy.report.reports;
+
+import com.igodlik3.ItemBuilder;
+import me.dreamzy.report.*;
+import com.google.common.collect.*;
+import net.syuu.popura.faction.bean.Faction;
+import org.bukkit.entity.*;
+import java.util.*;
+import org.bukkit.*;
+import me.dreamzy.report.utils.*;
+import org.bukkit.inventory.*;
+
+public class ReportManager
+{
+ private List reports;
+ private List reportsData;
+ private ViperReport plugin;
+
+ public ReportManager() {
+ this.reports = Lists.newArrayList();
+ this.reportsData = Lists.newArrayList();
+ this.plugin = ViperReport.getInstance();
+ }
+
+ public Report getReport(final Player player) {
+ for (final Report report : this.reports) {
+ if (report.getSender().getUniqueId().equals(player.getUniqueId())) {
+ return report;
+ }
+ }
+ return null;
+ }
+
+ public ReportData getReportData(final Faction faction) {
+ for (final ReportData data : this.reportsData) {
+ if (data.getFaction().equals(faction)) {
+ return data;
+ }
+ }
+ this.reportsData.add(new ReportData(faction));
+ return this.getReportData(faction);
+ }
+
+ public void openReportInventory(final Player player) {
+ final Inventory inv = Bukkit.createInventory((InventoryHolder)player, 27, Utils.color(this.plugin.getPrefixReportGui()));
+ final ItemStack cheatCategory = new ItemBuilder(Material.DIAMOND_SWORD).displayname(Utils.color("&a&lCheat")).durability((short)0).lore("&8- &eForceField", "&8- &eKillAura", "&8- &eSpeedHack", "&8- &eFly", "&8- &eOthers").build();
+ inv.setItem(11, cheatCategory);
+ final ItemStack chatCategory = new ItemBuilder(Material.PAPER).displayname(Utils.color("&a&lChat")).durability((short)0).lore("&8- &eSpamming Chat", "&8- &eSpamming Msg", "&8- &eSpamming Faction Title", "&8- &eCAPS", "&8- &eOthers").build();
+ inv.setItem(15, chatCategory);
+ player.openInventory(inv);
+ }
+
+ public List getReports() {
+ return this.reports;
+ }
+
+ public List getReportsData() {
+ return this.reportsData;
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/stats/CmdStats.java b/ViperCore/src/main/java/me/dreamzy/report/stats/CmdStats.java
new file mode 100644
index 0000000..dd34302
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/stats/CmdStats.java
@@ -0,0 +1,86 @@
+package me.dreamzy.report.stats;
+
+import net.syuu.common.command.Command;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.command.condition.MustBeInFaction;
+import net.syuu.popura.faction.FactionDataManager;
+import net.syuu.popura.faction.FactionType;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.configuration.*;
+import me.dreamzy.report.*;
+import me.dreamzy.report.utils.*;
+import org.bukkit.*;
+import org.bukkit.entity.*;
+
+public class CmdStats extends Command
+{
+ private StatsManager statsManager;
+ private Configuration config;
+
+ public CmdStats() {
+ super("stat");
+ this.statsManager = ViperReport.getInstance().getStatsManager();
+ this.config = (Configuration)ViperReport.getInstance().getConfig();
+ addAllias("stats");
+ addCondition(new MustBeInFaction());
+ }
+
+ public void proccess(final Player player, final String[] args) {
+ final FactionDataManager factionDataManager = ((PopuraPlugin)PopuraPlugin.getPlugin(PopuraPlugin.class)).getPopura().getFactionDataManager();
+ Faction faction = factionDataManager.getPlayer(player).getFaction();
+ if(args.length > 0){
+ faction = factionDataManager.getFaction(args[0]);
+
+ }
+ if (faction == null) {
+ return;
+ }
+ if (faction.getFactionType() != FactionType.NORMAL) {
+ player.sendMessage(Utils.color("&cInvalid faction."));
+ return;
+ }
+ int totalDiamond = 0;
+ int totalIron = 0;
+ int totalGold = 0;
+ int totalEmerald = 0;
+ int totalCoal = 0;
+ int totalKills = 0;
+ int totalDeaths = 0;
+ for (final FactionPlayer fp : faction.getPlayers()) {
+ totalKills += fp.getKill();
+ totalDeaths = fp.getDeath();
+ Player bukkitPlayer = Bukkit.getPlayer(fp.getName());
+ if (bukkitPlayer != null) {
+ totalDiamond = bukkitPlayer.getStatistic(Statistic.MINE_BLOCK, Material.DIAMOND_ORE);
+ totalIron = bukkitPlayer.getStatistic(Statistic.MINE_BLOCK, Material.IRON_ORE);
+ totalGold = bukkitPlayer.getStatistic(Statistic.MINE_BLOCK, Material.GOLD_ORE);
+ totalEmerald = bukkitPlayer.getStatistic(Statistic.MINE_BLOCK, Material.EMERALD_ORE);
+ totalCoal = bukkitPlayer.getStatistic(Statistic.MINE_BLOCK, Material.COAL_ORE);
+ }
+ else {
+ final StatsData data = this.statsManager.getUser(fp.getUuid().toString());
+ if (data == null) {
+ continue;
+ }
+ totalDiamond = data.getTotalDiamond();
+ totalIron = data.getTotalIron();
+ totalGold = data.getTotalGold();
+ totalEmerald = data.getTotalEmerald();
+ totalCoal = data.getTotalCoal();
+ }
+ }
+ for (String msg : this.config.getStringList("Messages.STATS-CMD")) {
+ msg = msg.replace("%FACTION%", faction.getName());
+ msg = msg.replace("%KILLS%", String.valueOf(totalKills));
+ msg = msg.replace("%DEATHS%", String.valueOf(totalDeaths));
+ msg = msg.replace("%DIAMOND%", String.valueOf(totalDiamond));
+ msg = msg.replace("%IRON%", String.valueOf(totalIron));
+ msg = msg.replace("%GOLD%", String.valueOf(totalGold));
+ msg = msg.replace("%EMERALD%", String.valueOf(totalEmerald));
+ msg = msg.replace("%COAL%", String.valueOf(totalCoal));
+ player.sendMessage(Utils.color(msg));
+ }
+ }
+
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/stats/StatsData.java b/ViperCore/src/main/java/me/dreamzy/report/stats/StatsData.java
new file mode 100644
index 0000000..d372a76
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/stats/StatsData.java
@@ -0,0 +1,106 @@
+package me.dreamzy.report.stats;
+
+import org.bukkit.entity.*;
+import org.bukkit.*;
+
+public class StatsData
+{
+ private int totalDiamond;
+ private int totalIron;
+ private int totalGold;
+ private int totalEmerald;
+ private int totalCoal;
+
+ public StatsData(final Player player) {
+ this.saveStats(player);
+ }
+
+ public StatsData(final int d, final int i, final int g, final int e, final int c) {
+ this.totalDiamond = d;
+ this.totalIron = i;
+ this.totalGold = g;
+ this.totalEmerald = e;
+ this.totalCoal = c;
+ }
+
+ public void saveStats(final Player player) {
+ this.totalDiamond = player.getStatistic(Statistic.MINE_BLOCK, Material.DIAMOND_ORE);
+ this.totalIron = player.getStatistic(Statistic.MINE_BLOCK, Material.IRON_ORE);
+ this.totalGold = player.getStatistic(Statistic.MINE_BLOCK, Material.GOLD_ORE);
+ this.totalEmerald = player.getStatistic(Statistic.MINE_BLOCK, Material.EMERALD_ORE);
+ this.totalCoal = player.getStatistic(Statistic.MINE_BLOCK, Material.COAL_ORE);
+ }
+
+ public int getTotalDiamond() {
+ return this.totalDiamond;
+ }
+
+ public int getTotalIron() {
+ return this.totalIron;
+ }
+
+ public int getTotalGold() {
+ return this.totalGold;
+ }
+
+ public int getTotalEmerald() {
+ return this.totalEmerald;
+ }
+
+ public int getTotalCoal() {
+ return this.totalCoal;
+ }
+
+ public void setTotalDiamond(final int totalDiamond) {
+ this.totalDiamond = totalDiamond;
+ }
+
+ public void setTotalIron(final int totalIron) {
+ this.totalIron = totalIron;
+ }
+
+ public void setTotalGold(final int totalGold) {
+ this.totalGold = totalGold;
+ }
+
+ public void setTotalEmerald(final int totalEmerald) {
+ this.totalEmerald = totalEmerald;
+ }
+
+ public void setTotalCoal(final int totalCoal) {
+ this.totalCoal = totalCoal;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof StatsData)) {
+ return false;
+ }
+ final StatsData other = (StatsData)o;
+ return other.canEqual(this) && this.getTotalDiamond() == other.getTotalDiamond() && this.getTotalIron() == other.getTotalIron() && this.getTotalGold() == other.getTotalGold() && this.getTotalEmerald() == other.getTotalEmerald() && this.getTotalCoal() == other.getTotalCoal();
+ }
+
+ protected boolean canEqual(final Object other) {
+ return other instanceof StatsData;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ result = result * 59 + this.getTotalDiamond();
+ result = result * 59 + this.getTotalIron();
+ result = result * 59 + this.getTotalGold();
+ result = result * 59 + this.getTotalEmerald();
+ result = result * 59 + this.getTotalCoal();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "StatsData(totalDiamond=" + this.getTotalDiamond() + ", totalIron=" + this.getTotalIron() + ", totalGold=" + this.getTotalGold() + ", totalEmerald=" + this.getTotalEmerald() + ", totalCoal=" + this.getTotalCoal() + ")";
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/stats/StatsListener.java b/ViperCore/src/main/java/me/dreamzy/report/stats/StatsListener.java
new file mode 100644
index 0000000..ccb7e9e
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/stats/StatsListener.java
@@ -0,0 +1,29 @@
+package me.dreamzy.report.stats;
+
+import me.dreamzy.report.*;
+import org.bukkit.event.*;
+import org.bukkit.event.player.*;
+
+public class StatsListener implements Listener
+{
+ private StatsManager manager;
+
+ public StatsListener() {
+ this.manager = ViperReport.getInstance().getStatsManager();
+ }
+
+ @EventHandler
+ public void onPlayerJoin(final PlayerJoinEvent event) {
+ this.manager.getUser(event.getPlayer());
+ }
+
+ @EventHandler
+ public void onPlayerQuit(final PlayerQuitEvent event) {
+ this.manager.getUser(event.getPlayer()).saveStats(event.getPlayer());
+ }
+
+ @EventHandler
+ public void onPlayerKick(final PlayerKickEvent event) {
+ this.manager.getUser(event.getPlayer()).saveStats(event.getPlayer());
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/stats/StatsManager.java b/ViperCore/src/main/java/me/dreamzy/report/stats/StatsManager.java
new file mode 100644
index 0000000..be7e12b
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/stats/StatsManager.java
@@ -0,0 +1,56 @@
+package me.dreamzy.report.stats;
+
+import me.dreamzy.report.utils.*;
+import me.dreamzy.report.*;
+import org.bukkit.plugin.java.*;
+import org.bukkit.entity.*;
+import org.bukkit.configuration.*;
+import java.util.*;
+
+public class StatsManager
+{
+ private Map statsMap;
+ private ConfigCreator config;
+
+ public StatsManager() {
+ this.statsMap = new HashMap();
+ this.config = new ConfigCreator("data", ViperReport.getInstance().getPlugin());
+ }
+
+ public StatsData getUser(final Player player) {
+ final String id = player.getUniqueId().toString();
+ if (this.statsMap.containsKey(id)) {
+ return this.statsMap.get(id);
+ }
+ final StatsData data = new StatsData(player);
+ this.statsMap.put(id, data);
+ return data;
+ }
+
+ public StatsData getUser(final String id) {
+ return this.statsMap.get(id);
+ }
+
+ public void reloadData() {
+ final ConfigurationSection section = this.config.getConfigurationSection("data");
+ if (section != null) {
+ for (final String id : section.getKeys(false)) {
+ final String path = String.valueOf(id) + ".";
+ this.statsMap.put(id, new StatsData(section.getInt(String.valueOf(path) + "totalDiamond"), section.getInt(String.valueOf(path) + "totalIron"), section.getInt(String.valueOf(path) + "totalGold"), section.getInt(String.valueOf(path) + "totalEmerald"), section.getInt(String.valueOf(path) + "totalCoal")));
+ }
+ }
+ }
+
+ public void saveData() {
+ final ConfigurationSection section = this.config.createSection("data");
+ for (final String id : this.statsMap.keySet()) {
+ final StatsData data = this.statsMap.get(id);
+ section.set(String.valueOf(id) + ".totalDiamond", (Object)data.getTotalDiamond());
+ section.set(String.valueOf(id) + ".totalIron", (Object)data.getTotalIron());
+ section.set(String.valueOf(id) + ".totalGold", (Object)data.getTotalGold());
+ section.set(String.valueOf(id) + ".totalEmerald", (Object)data.getTotalEmerald());
+ section.set(String.valueOf(id) + ".totalCoal", (Object)data.getTotalCoal());
+ }
+ this.config.save();
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/utils/ConfigCreator.java b/ViperCore/src/main/java/me/dreamzy/report/utils/ConfigCreator.java
new file mode 100644
index 0000000..0dbf3ba
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/utils/ConfigCreator.java
@@ -0,0 +1,92 @@
+package me.dreamzy.report.utils;
+
+import org.bukkit.configuration.file.*;
+import org.bukkit.plugin.java.*;
+import java.io.*;
+
+public class ConfigCreator extends YamlConfiguration
+{
+ private final String fileName;
+ private final JavaPlugin plugin;
+
+ public ConfigCreator(final String fileName, final JavaPlugin plugin) {
+ this(fileName, ".yml", plugin);
+ }
+
+ public ConfigCreator(final String fileName, final String fileExtension, final JavaPlugin plugin) {
+ this.fileName = String.valueOf(fileName) + (fileName.endsWith(fileExtension) ? "" : fileExtension);
+ this.plugin = plugin;
+ this.createFile();
+ }
+
+ public String getFileName() {
+ return this.fileName;
+ }
+
+ public JavaPlugin getPlugin() {
+ return this.plugin;
+ }
+
+ private void createFile() {
+ final File folder = new File(this.plugin.getDataFolder() , "report-data");
+ try {
+ final File file = new File(folder, this.fileName);
+ if (!file.exists()) {
+ if (this.plugin.getResource(this.fileName) != null) {
+ this.plugin.saveResource(this.fileName, false);
+ }
+ else {
+ this.save(file);
+ }
+ }
+ else {
+ this.load(file);
+ this.save(file);
+ }
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public void save() {
+ final File folder = this.plugin.getDataFolder();
+ try {
+ this.save(new File(folder, this.fileName));
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof ConfigCreator)) {
+ return false;
+ }
+ final ConfigCreator config = (ConfigCreator)o;
+ Label_0054: {
+ if (this.fileName != null) {
+ if (this.fileName.equals(config.fileName)) {
+ break Label_0054;
+ }
+ }
+ else if (config.fileName == null) {
+ break Label_0054;
+ }
+ return false;
+ }
+ if (this.plugin != null) {
+ return this.plugin.equals((Object)config.plugin);
+ }
+ return config.plugin == null;
+ }
+
+ public int hashCode() {
+ int result = (this.fileName != null) ? this.fileName.hashCode() : 0;
+ result = 31 * result + ((this.plugin != null) ? this.plugin.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/utils/CooldownUtils.java b/ViperCore/src/main/java/me/dreamzy/report/utils/CooldownUtils.java
new file mode 100644
index 0000000..a68982d
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/utils/CooldownUtils.java
@@ -0,0 +1,58 @@
+package me.dreamzy.report.utils;
+
+import java.util.*;
+import org.bukkit.entity.*;
+
+public class CooldownUtils
+{
+ private static HashMap> cooldown;
+
+ static {
+ CooldownUtils.cooldown = new HashMap>();
+ }
+
+ public static void clearCooldowns() {
+ CooldownUtils.cooldown.clear();
+ }
+
+ public static void createCooldown(final String k) {
+ if (CooldownUtils.cooldown.containsKey(k)) {
+ throw new IllegalArgumentException("Ce cooldown existe d\u00e9j\u00e0");
+ }
+ CooldownUtils.cooldown.put(k, new HashMap());
+ }
+
+ public static HashMap getCooldownMap(final String k) {
+ if (CooldownUtils.cooldown.containsKey(k)) {
+ return CooldownUtils.cooldown.get(k);
+ }
+ return null;
+ }
+
+ public static void addCooldown(final String k, final Player p, final int seconds) {
+ if (!CooldownUtils.cooldown.containsKey(k)) {
+ createCooldown(k);
+ }
+ final long next = System.currentTimeMillis() + seconds * 1000L;
+ CooldownUtils.cooldown.get(k).put(p.getUniqueId(), next);
+ }
+
+ public static boolean isOnCooldown(final String k, final Player p) {
+ return CooldownUtils.cooldown.containsKey(k) && CooldownUtils.cooldown.get(k).containsKey(p.getUniqueId()) && System.currentTimeMillis() <= CooldownUtils.cooldown.get(k).get(p.getUniqueId());
+ }
+
+ public static int getCooldownForPlayerInt(final String k, final Player p) {
+ return (int)((CooldownUtils.cooldown.get(k).get(p.getUniqueId()) - System.currentTimeMillis()) / 1000L);
+ }
+
+ public static long getCooldownForPlayerLong(final String k, final Player p) {
+ return CooldownUtils.cooldown.get(k).get(p.getUniqueId()) - System.currentTimeMillis();
+ }
+
+ public static void removeCooldown(final String k, final Player p) {
+ if (!CooldownUtils.cooldown.containsKey(k)) {
+ throw new IllegalArgumentException(String.valueOf(String.valueOf(k)) + " n'existe pas");
+ }
+ CooldownUtils.cooldown.get(k).remove(p.getUniqueId());
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/utils/Cuboid.java b/ViperCore/src/main/java/me/dreamzy/report/utils/Cuboid.java
new file mode 100644
index 0000000..f90d1dc
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/utils/Cuboid.java
@@ -0,0 +1,473 @@
+package me.dreamzy.report.utils;
+
+import org.bukkit.block.*;
+import org.bukkit.configuration.serialization.*;
+import java.util.logging.*;
+import java.util.*;
+import org.bukkit.*;
+
+public class Cuboid implements Iterable, Cloneable, ConfigurationSerializable
+{
+ protected final String worldName;
+ protected final int x1;
+ protected final int y1;
+ protected final int z1;
+ protected final int x2;
+ protected final int y2;
+ protected final int z2;
+
+ public Cuboid(final Location location1, final Location location2) {
+ if (!location1.getWorld().equals(location2.getWorld())) {
+ Logger.getLogger("Les locations doivent \u00eatre dans un m\u00eame monde.");
+ }
+ this.worldName = location1.getWorld().getName();
+ this.x1 = Math.min(location1.getBlockX(), location2.getBlockX());
+ this.y1 = Math.min(location1.getBlockY(), location2.getBlockY());
+ this.z1 = Math.min(location1.getBlockZ(), location2.getBlockZ());
+ this.x2 = Math.max(location1.getBlockX(), location2.getBlockX());
+ this.y2 = Math.max(location1.getBlockY(), location2.getBlockY());
+ this.z2 = Math.max(location1.getBlockZ(), location2.getBlockZ());
+ }
+
+ public Cuboid(final Location location) {
+ this(location, location);
+ }
+
+ public Cuboid(final Cuboid cuboid) {
+ this(cuboid.getWorld().getName(), cuboid.x1, cuboid.y1, cuboid.z1, cuboid.x2, cuboid.y2, cuboid.z2);
+ }
+
+ private Cuboid(final String string, final int n, final int n2, final int n3, final int n4, final int n5, final int n6) {
+ this.worldName = string;
+ this.x1 = Math.min(n, n4);
+ this.x2 = Math.max(n, n4);
+ this.y1 = Math.min(n2, n5);
+ this.y2 = Math.max(n2, n5);
+ this.z1 = Math.min(n3, n6);
+ this.z2 = Math.max(n3, n6);
+ }
+
+ public Cuboid(final Map map) {
+ this.worldName = (String) map.get("worldName");
+ this.x1 = (int) map.get("x1");
+ this.x2 = (int) map.get("x2");
+ this.y1 = (int) map.get("y1");
+ this.y2 = (int) map.get("y2");
+ this.z1 = (int) map.get("z1");
+ this.z2 = (int) map.get("z2");
+ }
+
+ public Map serialize() {
+ final HashMap hashMap = new HashMap();
+ hashMap.put("worldName", this.worldName);
+ hashMap.put("x1", this.x1);
+ hashMap.put("y1", this.y1);
+ hashMap.put("z1", this.z1);
+ hashMap.put("x2", this.x2);
+ hashMap.put("y2", this.y2);
+ hashMap.put("z2", this.z2);
+ return hashMap;
+ }
+
+ public Location getLowerNE() {
+ return new Location(this.getWorld(), (double)this.x1, (double)this.y1, (double)this.z1);
+ }
+
+ public Location getUpperSW() {
+ return new Location(this.getWorld(), (double)this.x2, (double)this.y2, (double)this.z2);
+ }
+
+ public List getBlocks() {
+ final Iterator iterator = this.iterator();
+ final ArrayList arrayList = new ArrayList();
+ while (iterator.hasNext()) {
+ arrayList.add(iterator.next());
+ }
+ return arrayList;
+ }
+
+ public Location getCenter() {
+ final int i = this.getUpperX() + 1;
+ final int j = this.getUpperY() + 1;
+ final int k = this.getUpperZ() + 1;
+ return new Location(this.getWorld(), this.getLowerX() + (i - this.getLowerX()) / 2.0, this.getLowerY() + (j - this.getLowerY()) / 2.0, this.getLowerZ() + (k - this.getLowerZ()) / 2.0);
+ }
+
+ public World getWorld() {
+ final World world = Bukkit.getWorld(this.worldName);
+ if (world == null) {
+ Logger.getLogger("Le monde " + this.worldName + "n'est pas charg\u00e9 !");
+ }
+ return world;
+ }
+
+ public int getSizeX() {
+ return this.x2 - this.x1 + 1;
+ }
+
+ public int getSizeY() {
+ return this.y2 - this.y1 + 1;
+ }
+
+ public int getSizeZ() {
+ return this.z2 - this.z1 + 1;
+ }
+
+ public int getLowerX() {
+ return this.x1;
+ }
+
+ public int getLowerY() {
+ return this.y1;
+ }
+
+ public int getLowerZ() {
+ return this.z1;
+ }
+
+ public int getUpperX() {
+ return this.x2;
+ }
+
+ public int getUpperY() {
+ return this.y2;
+ }
+
+ public int getUpperZ() {
+ return this.z2;
+ }
+
+ public Block[] corners() {
+ final Block[] arrayOfBlock = new Block[8];
+ final World localWorld = this.getWorld();
+ arrayOfBlock[0] = localWorld.getBlockAt(this.x1, this.y1, this.z1);
+ arrayOfBlock[1] = localWorld.getBlockAt(this.x1, this.y1, this.z2);
+ arrayOfBlock[2] = localWorld.getBlockAt(this.x1, this.y2, this.z1);
+ arrayOfBlock[3] = localWorld.getBlockAt(this.x1, this.y2, this.z2);
+ arrayOfBlock[4] = localWorld.getBlockAt(this.x2, this.y1, this.z1);
+ arrayOfBlock[5] = localWorld.getBlockAt(this.x2, this.y1, this.z2);
+ arrayOfBlock[6] = localWorld.getBlockAt(this.x2, this.y2, this.z1);
+ arrayOfBlock[7] = localWorld.getBlockAt(this.x2, this.y2, this.z2);
+ return arrayOfBlock;
+ }
+
+ public Cuboid expand(final CuboidDirection paramCuboidDirection, final int paramInt) {
+ switch (paramCuboidDirection) {
+ case Both: {
+ return new Cuboid(this.worldName, this.x1 - paramInt, this.y1, this.z1, this.x2, this.y2, this.z2);
+ }
+ case East: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2 + paramInt, this.y2, this.z2);
+ }
+ case Down: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1 - paramInt, this.x2, this.y2, this.z2);
+ }
+ case Horizontal: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2, this.z2 + paramInt);
+ }
+ case South: {
+ return new Cuboid(this.worldName, this.x1, this.y1 - paramInt, this.z1, this.x2, this.y2, this.z2);
+ }
+ case North: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2 + paramInt, this.z2);
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid direction " + paramCuboidDirection);
+ }
+ }
+ }
+
+ public Cuboid shift(final CuboidDirection paramCuboidDirection, final int paramInt) {
+ return this.expand(paramCuboidDirection, paramInt).expand(paramCuboidDirection.opposite(), -paramInt);
+ }
+
+ public Cuboid outset(final CuboidDirection paramCuboidDirection, final int paramInt) {
+ Cuboid localCuboid = null;
+ switch (paramCuboidDirection) {
+ case Unknown: {
+ localCuboid = this.expand(CuboidDirection.North, paramInt).expand(CuboidDirection.South, paramInt).expand(CuboidDirection.East, paramInt).expand(CuboidDirection.West, paramInt);
+ break;
+ }
+ case Up: {
+ localCuboid = this.expand(CuboidDirection.Down, paramInt).expand(CuboidDirection.Up, paramInt);
+ break;
+ }
+ case Vertical: {
+ localCuboid = this.outset(CuboidDirection.Horizontal, paramInt).outset(CuboidDirection.Vertical, paramInt);
+ break;
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid direction " + paramCuboidDirection);
+ }
+ }
+ return localCuboid;
+ }
+
+ public Cuboid inset(final CuboidDirection cuboidDirection, final int n) {
+ return this.outset(cuboidDirection, -n);
+ }
+
+ public boolean contains(final int n, final int n2, final int n3) {
+ return n >= this.x1 && n <= this.x2 && n2 >= this.y1 && n2 <= this.y2 && n3 >= this.z1 && n3 <= this.z2;
+ }
+
+ public boolean contains(final Block block) {
+ return this.contains(block.getLocation());
+ }
+
+ public boolean contains(final Location location) {
+ return this.worldName.equals(location.getWorld().getName()) && this.contains(location.getBlockX(), location.getBlockY(), location.getBlockZ());
+ }
+
+ public int getVolume() {
+ return this.getSizeX() * this.getSizeY() * this.getSizeZ();
+ }
+
+ public byte getAverageLightLevel() {
+ long l = 0L;
+ int i = 0;
+ for (final Block localBlock : this) {
+ if (localBlock.isEmpty()) {
+ l += localBlock.getLightLevel();
+ ++i;
+ }
+ }
+ return (byte)((i > 0) ? ((byte)(l / i)) : 0);
+ }
+
+ public Cuboid contract() {
+ return this.contract(CuboidDirection.Down).contract(CuboidDirection.South).contract(CuboidDirection.East).contract(CuboidDirection.Up).contract(CuboidDirection.North).contract(CuboidDirection.West);
+ }
+
+ public Cuboid contract(final CuboidDirection paramCuboidDirection) {
+ Cuboid localCuboid = this.getFace(paramCuboidDirection.opposite());
+ switch (paramCuboidDirection) {
+ case South: {
+ while (localCuboid.containsOnly(0) && localCuboid.getLowerY() > this.getLowerY()) {
+ localCuboid = localCuboid.shift(CuboidDirection.Down, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, localCuboid.getUpperY(), this.z2);
+ }
+ case North: {
+ while (localCuboid.containsOnly(0) && localCuboid.getUpperY() < this.getUpperY()) {
+ localCuboid = localCuboid.shift(CuboidDirection.Up, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, localCuboid.getLowerY(), this.z1, this.x2, this.y2, this.z2);
+ }
+ case Both: {
+ while (localCuboid.containsOnly(0) && localCuboid.getLowerX() > this.getLowerX()) {
+ localCuboid = localCuboid.shift(CuboidDirection.North, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, localCuboid.getUpperX(), this.y2, this.z2);
+ }
+ case East: {
+ while (localCuboid.containsOnly(0) && localCuboid.getUpperX() < this.getUpperX()) {
+ localCuboid = localCuboid.shift(CuboidDirection.South, 1);
+ }
+ return new Cuboid(this.worldName, localCuboid.getLowerX(), this.y1, this.z1, this.x2, this.y2, this.z2);
+ }
+ case Down: {
+ while (localCuboid.containsOnly(0) && localCuboid.getLowerZ() > this.getLowerZ()) {
+ localCuboid = localCuboid.shift(CuboidDirection.East, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2, localCuboid.getUpperZ());
+ }
+ case Horizontal: {
+ while (localCuboid.containsOnly(0) && localCuboid.getUpperZ() < this.getUpperZ()) {
+ localCuboid = localCuboid.shift(CuboidDirection.West, 1);
+ }
+ return new Cuboid(this.worldName, this.x1, this.y1, localCuboid.getLowerZ(), this.x2, this.y2, this.z2);
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid direction " + paramCuboidDirection);
+ }
+ }
+ }
+
+ public Cuboid getFace(final CuboidDirection paramCuboidDirection) {
+ switch (paramCuboidDirection) {
+ case South: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y1, this.z2);
+ }
+ case North: {
+ return new Cuboid(this.worldName, this.x1, this.y2, this.z1, this.x2, this.y2, this.z2);
+ }
+ case Both: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x1, this.y2, this.z2);
+ }
+ case East: {
+ return new Cuboid(this.worldName, this.x2, this.y1, this.z1, this.x2, this.y2, this.z2);
+ }
+ case Down: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z1, this.x2, this.y2, this.z1);
+ }
+ case Horizontal: {
+ return new Cuboid(this.worldName, this.x1, this.y1, this.z2, this.x2, this.y2, this.z2);
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid direction " + paramCuboidDirection);
+ }
+ }
+ }
+
+ public boolean containsOnly(final int paramInt) {
+ for (final Block block : this) {
+ if (block.getTypeId() != paramInt) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public Cuboid getBoundingCuboid(final Cuboid paramCuboid) {
+ if (paramCuboid == null) {
+ return this;
+ }
+ final int i = Math.min(this.getLowerX(), paramCuboid.getLowerX());
+ final int j = Math.min(this.getLowerY(), paramCuboid.getLowerY());
+ final int k = Math.min(this.getLowerZ(), paramCuboid.getLowerZ());
+ final int m = Math.max(this.getUpperX(), paramCuboid.getUpperX());
+ final int n = Math.max(this.getUpperY(), paramCuboid.getUpperY());
+ final int i2 = Math.max(this.getUpperZ(), paramCuboid.getUpperZ());
+ return new Cuboid(this.worldName, i, j, k, m, n, i2);
+ }
+
+ public Block getRelativeBlock(final int n, final int n2, final int n3) {
+ return this.getWorld().getBlockAt(this.x1 + n, this.y1 + n2, this.z1 + n3);
+ }
+
+ public Block getRelativeBlock(final World world, final int n, final int n2, final int n3) {
+ return world.getBlockAt(this.x1 + n, this.y1 + n2, this.z1 + n3);
+ }
+
+ public List getChunks() {
+ final ArrayList arrayList = new ArrayList();
+ final World world = this.getWorld();
+ final int i = this.getLowerX() & 0xFFFFFFF0;
+ final int j = this.getUpperX() & 0xFFFFFFF0;
+ final int k = this.getLowerZ() & 0xFFFFFFF0;
+ final int m = this.getUpperZ() & 0xFFFFFFF0;
+ for (int n = i; n <= j; n += 16) {
+ for (int i2 = k; i2 <= m; i2 += 16) {
+ arrayList.add(world.getChunkAt(n >> 4, i2 >> 4));
+ }
+ }
+ return arrayList;
+ }
+
+ @Override
+ public Iterator iterator() {
+ return new CuboidIterator(this.getWorld(), this.x1, this.y1, this.z1, this.x2, this.y2, this.z2);
+ }
+
+ public Cuboid clone() {
+ return new Cuboid(this);
+ }
+
+ @Override
+ public String toString() {
+ return new String("Cuboid: " + this.worldName + "," + this.x1 + "," + this.y1 + "," + this.z1 + "=>" + this.x2 + "," + this.y2 + "," + this.z2);
+ }
+
+ public enum CuboidDirection
+ {
+ North("North", 0),
+ East("East", 1),
+ South("South", 2),
+ West("West", 3),
+ Up("Up", 4),
+ Down("Down", 5),
+ Horizontal("Horizontal", 6),
+ Vertical("Vertical", 7),
+ Both("Both", 8),
+ Unknown("Unknown", 9);
+
+ private CuboidDirection(final String s, final int n) {
+ }
+
+ public CuboidDirection opposite() {
+ switch (this) {
+ case Both: {
+ return CuboidDirection.South;
+ }
+ case Down: {
+ return CuboidDirection.West;
+ }
+ case East: {
+ return CuboidDirection.North;
+ }
+ case Horizontal: {
+ return CuboidDirection.East;
+ }
+ case Unknown: {
+ return CuboidDirection.Vertical;
+ }
+ case Up: {
+ return CuboidDirection.Horizontal;
+ }
+ case North: {
+ return CuboidDirection.Down;
+ }
+ case South: {
+ return CuboidDirection.Up;
+ }
+ case Vertical: {
+ return CuboidDirection.Both;
+ }
+ default: {
+ return CuboidDirection.Unknown;
+ }
+ }
+ }
+ }
+
+ public class CuboidIterator implements Iterator
+ {
+ private World w;
+ private int baseX;
+ private int baseY;
+ private int baseZ;
+ private int x;
+ private int y;
+ private int z;
+ private int sizeX;
+ private int sizeY;
+ private int sizeZ;
+
+ public CuboidIterator(final World paramWorld, final int paramInt1, final int paramInt2, final int paramInt3, final int paramInt4, final int paramInt5, final int paramInt6) {
+ this.w = paramWorld;
+ this.baseX = paramInt1;
+ this.baseY = paramInt2;
+ this.baseZ = paramInt3;
+ this.sizeX = Math.abs(paramInt4 - paramInt1) + 1;
+ this.sizeY = Math.abs(paramInt5 - paramInt2) + 1;
+ this.sizeZ = Math.abs(paramInt6 - paramInt3) + 1;
+ final boolean x = false;
+ this.z = (x ? 1 : 0);
+ this.y = (x ? 1 : 0);
+ this.x = (x ? 1 : 0);
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.x < this.sizeX && this.y < this.sizeY && this.z < this.sizeZ;
+ }
+
+ @Override
+ public Block next() {
+ final Block block = this.w.getBlockAt(this.baseX + this.x, this.baseY + this.y, this.baseZ + this.z);
+ if (++this.x >= this.sizeX) {
+ this.x = 0;
+ if (++this.y >= this.sizeY) {
+ this.y = 0;
+ ++this.z;
+ }
+ }
+ return block;
+ }
+
+ @Override
+ public void remove() {
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/utils/FakeEnchantment.java b/ViperCore/src/main/java/me/dreamzy/report/utils/FakeEnchantment.java
new file mode 100644
index 0000000..2711208
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/utils/FakeEnchantment.java
@@ -0,0 +1,50 @@
+package me.dreamzy.report.utils;
+
+import java.lang.reflect.*;
+import org.bukkit.enchantments.*;
+import org.bukkit.inventory.*;
+
+public final class FakeEnchantment extends Enchantment
+{
+ static {
+ try {
+ final Field field = Enchantment.class.getDeclaredField("acceptingNew");
+ field.setAccessible(true);
+ field.set(null, true);
+ }
+ catch (Exception e) {
+ throw new RuntimeException("Can't register enchantment", e);
+ }
+ if (Enchantment.getByName("CA_FAKE") == null) {
+ Enchantment.registerEnchantment((Enchantment)new FakeEnchantment());
+ }
+ }
+
+ public FakeEnchantment() {
+ super(100);
+ }
+
+ public String getName() {
+ return "CA_FAKE";
+ }
+
+ public int getMaxLevel() {
+ return 0;
+ }
+
+ public int getStartLevel() {
+ return 0;
+ }
+
+ public EnchantmentTarget getItemTarget() {
+ return null;
+ }
+
+ public boolean conflictsWith(final Enchantment enchantment) {
+ return false;
+ }
+
+ public boolean canEnchantItem(final ItemStack itemStack) {
+ return false;
+ }
+}
diff --git a/ViperCore/src/main/java/me/dreamzy/report/utils/Utils.java b/ViperCore/src/main/java/me/dreamzy/report/utils/Utils.java
new file mode 100644
index 0000000..5e86dfb
--- /dev/null
+++ b/ViperCore/src/main/java/me/dreamzy/report/utils/Utils.java
@@ -0,0 +1,37 @@
+package me.dreamzy.report.utils;
+
+import me.dreamzy.report.*;
+import org.bukkit.*;
+
+public class Utils
+{
+ public static ViperReport plugin;
+
+ static {
+ Utils.plugin = ViperReport.getInstance();
+ }
+
+ public static String color(final String msg) {
+ return ChatColor.translateAlternateColorCodes('&', msg);
+ }
+
+ public static void msgConsole(final String message, final boolean prefix) {
+ Bukkit.getConsoleSender().sendMessage(color(String.valueOf(prefix ? Utils.plugin.getPrefix() : "") + message));
+ }
+
+ public static String stringifyLocation(final Location location) {
+ return "[" + location.getWorld().getName() + "," + location.getX() + "," + location.getY() + "," + location.getZ() + "]";
+ }
+
+ public static Location destringifyLocation(final String string) {
+ final String[] split = string.substring(1, string.length() - 2).split(",");
+ final World world = Bukkit.getWorld(split[0]);
+ if (world == null) {
+ return null;
+ }
+ final double x = Double.parseDouble(split[1]);
+ final double y = Double.parseDouble(split[2]);
+ final double z = Double.parseDouble(split[3]);
+ return new Location(world, x, y, z);
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/HCFactionPlugin.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/HCFactionPlugin.java
new file mode 100644
index 0000000..902671b
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/HCFactionPlugin.java
@@ -0,0 +1,421 @@
+package net.libhalt.bukkit.kaede;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.regex.Pattern;
+
+import cloth.bugs.FenceGateBug;
+import cloth.pearls.PearlInteractEvent;
+import cloth.portals.NetherPortalEvent;
+import cloth.xp.XpBottleCommand;
+import cloth.xp.XpBottleEvent;
+import com.confinement.filter.Filter;
+import com.google.common.collect.Lists;
+import com.igodlik3.conquest.Conquest;
+import com.igodlik3.enchantfix.EnchantFix;
+import com.igodlik3.modmode.ModMode;
+import com.igodlik3.stats.Stats;
+import com.igodlik3.subclaims.Subclaims;
+import com.igodlik3.viperfix.ViperFix;
+import com.igodlik3.vipermisc.Misc;
+import com.igodlik3.viperutils.ViperUtils;
+import config.MyConfig;
+import config.MyConfigManager;
+import config.ConfigData;
+import me.dreamzy.report.ViperReport;
+import net.libhalt.bukkit.kaede.manager.*;
+import net.libhalt.dev.plugin.armor.ArmorPlugin;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.combattag.CombatTagManager;
+import net.syuu.popura.command.faction.HomeCommand;
+import org.apache.commons.lang.time.DurationFormatUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Statistic;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.craftbukkit.v1_7_R4.SpigotTimings;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import net.libhalt.bukkit.kaede.event.ScoreboardTextAboutToUpdateEvent;
+import net.libhalt.bukkit.kaede.manager.crowbar.CrowbarManager;
+import net.libhalt.bukkit.kaede.support.Support;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.libhalt.bukkit.kaede.utils.MilliToSecondFormatter;
+import org.spigotmc.CustomTimingsHandler;
+
+public class HCFactionPlugin extends JavaPlugin {
+
+ private static HCFactionPlugin INSTANCE;
+ public static HCFactionPlugin getInstance(){
+ return INSTANCE;
+ }
+ private Map , Manager> managersMap = new LinkedHashMap , Manager>();
+ private List> disabled = new ArrayList>();
+ private ConfigurationWrapper lang;
+ private Configuration defaults;
+ public MyConfigManager manager = new MyConfigManager(this);
+ public MyConfig messages = manager.getNewConfig("messages.yml");
+ public ConfigData configdata = new ConfigData(this);
+
+
+ //test
+
+ private long since = System.currentTimeMillis();
+ {
+ INSTANCE = this;
+ List managers = new ArrayList();
+ managers.add(new CrowbarManager(this));
+ //managers.add(new FasterTileEntityManager(this));
+ managers.add(new ShopConfigManager(this));
+
+ managers.add(new MiscDisableManager(this));
+ managers.add(new PotionLimitManager(this));
+ managers.add(new EnchantmentLimitManager(this));
+ managers.add(new EnderPearlManager(this));
+ managers.add(new ReclaimManager(this));
+ //managers.add(new KitManager(this));
+ managers.add(new GlassManager(this));
+ managers.add(new TabManupilator(this));
+
+ managers.add(new PvPTimerManager(this));
+ managers.add(new DeathKillManager(this));
+ managers.add(new CombatLoggerManager(this));
+ managers.add(new PlayerDataManager(this));
+ managers.add(new FreezeManager(this));
+ managers.add(new ScoreboardManager(this));
+ managers.add(new DeathBanManager(this));
+ managers.add(new MobMergeListener(this));
+ managers.add(new LootingManager(this));
+ managers.add(new UnEnchantBookManager(this));
+ managers.add(new EndWorldManager(this));
+ managers.add(new FoundDiamondManager(this));
+ managers.add(new WorldBorderManager(this));
+ managers.add(new DeathSignManager(this));
+ managers.add(new DeathMessageManager(this));
+ managers.add(new CraftingDisableManager(this));
+ managers.add(new EnderchestDisableManager(this));
+ managers.add(new Conquest(this));
+ managers.add(new Subclaims(this));
+ managers.add(new Stats(this));
+ managers.add(new ModMode(this));
+ managers.add(new EnchantFix(this));
+ managers.add(new ViperFix(this));
+ managers.add(new ViperUtils(this));
+ managers.add(new ViperReport(this));
+ managers.add(new Misc(this));
+ managers.add(new HideStreamManager(this));
+ managers.add(new ArmorPlugin(this));
+ managers.add(new ElevatorManager(this));
+ managers.add(new GMelonManager(this));
+ managers.add(new GappleManager(this));
+ managers.add(new HungerFixManager(this));
+ managers.add(new PotionFixManager(this));
+ managers.add(new Filter(this));
+ managers.add(new SwordStatTrack(this));
+
+ for(Manager manager : managers){
+ managersMap.put(manager.getClass(), manager);
+ }
+ }
+
+ @Override
+ public void onEnable() {
+
+ configdata.setupDefaultMessages();
+
+ registerEvents();
+ registerCommands();
+
+ lang = new ConfigurationWrapper("en_US.yml", this);
+ ConfigurationWrapper wrap = new ConfigurationWrapper("modules.yml", this);
+ Configuration config = wrap.getConfig();
+ for(Manager manager : managersMap.values()){
+ if(config.getBoolean(manager.getClass().getSimpleName().replace("Manager", "") , true)){
+ try{
+ manager.init();
+ }catch(OutOfMemoryError rethrow){
+ throw rethrow;
+ }catch(Throwable t){
+ t.printStackTrace();
+ getLogger().severe("Could not enable " + manager.getClass().getSimpleName() + "It is recommended to resolve the problem to prevent unexpected behavior.");
+ }
+ }else{
+ disabled.add(manager.getClass());
+ }
+ }
+ if(!isDisabled(ScoreboardManager.class)){
+ this.initScoreboard();
+ }
+ try(InputStream stream = getResource("en_US.yml"); InputStreamReader reader = new InputStreamReader(stream , "UTF-8")){
+ defaults = YamlConfiguration.loadConfiguration(reader);
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ Support.getInstance().register(this);
+ getCommand("lag").setExecutor(new CommandExecutor() {
+ private DecimalFormat formatter = new DecimalFormat("0.0");
+ @Override
+ public boolean onCommand(CommandSender sendeer, Command command, String s, String[] strings) {
+ double[] ts = Bukkit.getServer().spigot().getTPS();
+ sendeer.sendMessage(ChatColor.GOLD + "TPS from last 1m, 5m, 15m: " + ChatColor.GREEN + formatter.format(ts[0] / 1.0D) + ", " + formatter.format(ts[1]/1.0D) + ", " + formatter.format(ts[2]/ 1.0D));
+ try {
+ CustomTimingsHandler server = SpigotTimings.serverTickTimer;
+ Field totalTimefield = CustomTimingsHandler.class.getDeclaredField("totalTime");
+ Field countfield = CustomTimingsHandler.class.getDeclaredField("count");
+ totalTimefield.setAccessible(true);
+ countfield.setAccessible(true);
+ long time = totalTimefield.getLong(server);
+ long count = countfield.getLong(server);
+ long avg = time / count;
+ double value = avg / 1000.0D / 1000.0D;
+ sendeer.sendMessage(ChatColor.GOLD + "Server has been up for " + DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - since , true , true));
+
+ sendeer.sendMessage(ChatColor.GOLD + "Full tick: " + ChatColor.YELLOW + formatter.format(value )+ "ms");
+
+ } catch (ReflectiveOperationException e) {
+ e.printStackTrace();
+ }
+
+ return true;
+ }
+ });
+ }
+
+ public void registerEvents()
+ {
+ Bukkit.getPluginManager().registerEvents(new PearlInteractEvent(this), this);
+ Bukkit.getPluginManager().registerEvents(new FenceGateBug(this), this);
+ Bukkit.getPluginManager().registerEvents(new NetherPortalEvent(this), this);
+ Bukkit.getPluginManager().registerEvents(new XpBottleEvent(this), this);
+ }
+
+ public void registerCommands()
+ {
+ getCommand("bottle").setExecutor(new XpBottleCommand(this));
+ }
+
+ @Override
+ public void onDisable() {
+ for(Manager manager : managersMap.values()){
+ if(!disabled.contains(manager.getClass())){
+ manager.tear();
+ }
+ }
+ }
+
+ public PvPTimerManager getPvPTimerManager() {
+ return getManager(PvPTimerManager.class);
+ }
+
+ public PlayerDataManager getPlayerDataManager() {
+ return getManager(PlayerDataManager.class);
+ }
+
+ public boolean isDisabled(Class extends Manager> clazz){
+ return disabled.contains(clazz);
+ }
+ @SuppressWarnings("unchecked")
+ public T getManager(Class clazz){
+ return (T) managersMap.get(clazz);
+ }
+ public void initScoreboard() {
+ final ScoreboardManager scoreboardManager = getManager(ScoreboardManager.class);
+ scoreboardManager.init();
+ getServer().getPluginManager().registerEvents(new Listener() {
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void onScoreboardPreUpdate(net.syuu.common.event.ScoreboardPreRenderEvent e){
+ for (String string : scoreboardManager.getConfiguredContext()) {
+ ScoreboardTextAboutToUpdateEvent event = new ScoreboardTextAboutToUpdateEvent(e.getPlayer(), string, scoreboardManager.isAlwaysDisplay());
+ Bukkit.getPluginManager().callEvent(event);
+ if (event.getText() != null) {
+ String result = HCFactionPlugin.this.processTag(e.getPlayer(), event.getText(), scoreboardManager);
+ if (result != null) {
+ result = result.replace(Pattern.quote("|"), "");
+ e.addText(result);
+ }
+ }
+ }
+ List text = Lists.newArrayList();
+ String lastAdded = null;
+ for(String input : e.getTexts()){
+ if(input == null){
+ continue;
+ }
+ if(lastAdded == null){
+ text.add(input);
+ lastAdded = input;
+ }else{
+ if(!input.equalsIgnoreCase(lastAdded)){
+ lastAdded = input;
+ text.add(input);
+ }
+ }
+ }
+ e.getTexts().clear();
+ e.getTexts().addAll(text);
+ if(e.getTexts().size() <= 2){
+ e.getTexts().clear();
+ }
+ }
+ } , this);
+ }
+
+ public String processTag(Player player, String input , ScoreboardManager manager) {
+ String result = input;
+ String str;
+ boolean shouldAlwaysDisplay = manager.isAlwaysDisplay();
+ if (input.contains("%fhome_timer%")) {
+ long left = HomeCommand.INSTANCE.getFHomingUntil(player);
+ if (left <= 0) {
+ if(shouldAlwaysDisplay){
+ if(manager.useDecimalForEnderPearls()){
+ result = input.replace("%fhome_timer%", "0.000");
+ }else{
+ result = input.replace("%fhome_timer%", "00:00");
+ }
+ }else{
+ return null;
+ }
+ }else{
+ /*
+ if(manager.useDecimalForEnderPearls()){
+ result = input.replace("%fhome_timer%", MilliToSecondFormatter.format(left - System.currentTimeMillis()));
+ }else{
+ int data = (int) (left/ 1000.0D);
+ int minutes = (int) (data / 60.0D);
+ int seconds = data % 60;
+ str = String.format("%d:%02d", Integer.valueOf(minutes), Integer.valueOf(seconds) );
+ result = input.replace("%fhome_timer%", str);
+ }*/
+ long value = left - System.currentTimeMillis();
+ if(value < 0){
+ return null;
+ }else {
+ result = input.replace("%fhome_timer%", MilliToSecondFormatter.format( value));
+ }
+ }
+ }
+ if (input.contains("%enderpearl_time%")) {
+ EnderPearlManager enderPearlManager = getManager(EnderPearlManager.class);
+ if (!enderPearlManager.isCooldownActive(player)) {
+ if(shouldAlwaysDisplay){
+ if(manager.useDecimalForEnderPearls()){
+ result = input.replace("%enderpearl_time%", "0.000");
+ }else{
+ result = input.replace("%enderpearl_time%", "00:00");
+ }
+ }else{
+ return null;
+ }
+ }else{
+ if(manager.useDecimalForEnderPearls()){
+ result = input.replace("%enderpearl_time%", MilliToSecondFormatter.format(enderPearlManager.getMillisecondLeft(player)));
+ }else{
+ int data = (int) (enderPearlManager.getMillisecondLeft(player) / 1000.0D);
+ int minutes = (int) (data / 60.0D);
+ int seconds = data % 60;
+ str = String.format("%d:%02d", Integer.valueOf(minutes), Integer.valueOf(seconds) );
+ result = input.replace("%enderpearl_time%", str);
+ }
+ }
+ }
+
+ if (result.contains("%spawntag_time%")) {
+ CombatTagManager combatTag = PopuraPlugin.getInstance().getPopura().getCombatTagManager();
+ if (!combatTag.isCombatTagActive(player)) {
+ if(shouldAlwaysDisplay){
+ if(manager.useDecimalForSpawnTag()){
+ result = input.replace("%spawntag_time%", "0.000");
+ }else{
+ result = input.replace("%spawntag_time%", "00:00");
+ }
+ }else{
+ return null;
+ }
+ }
+ if(manager.useDecimalForSpawnTag()){
+ result = input.replace("%spawntag_time%", MilliToSecondFormatter.format(combatTag.getMillisecondLeft(player)));
+ }else{
+ int data = (int) (combatTag.getMillisecondLeft(player) / 1000.0D);
+ int minutes = (int) (data / 60.0D);
+ int seconds = data % 60;
+ str = String.format("%d:%02d", Integer.valueOf(minutes), Integer.valueOf(seconds) );
+ result = input.replace("%spawntag_time%", str);
+ }
+ }
+ if (result.contains("%pvp_timer%")) {
+ PlayerData data1 = getPlayerDataManager().getPlayerData(player);
+ if (data1 == null || data1.getPvpTime() <= 0) {
+ if(shouldAlwaysDisplay){
+ result = input.replace("%pvp_timer%", "0");
+ }else{
+ return null;
+ }
+ }
+ if(manager.useMinuteSeperatorForPvPTimer()){
+ int data = data1.getPvpTime();
+ int minutes = (int) (data / 60.0D);
+ int seconds = data % 60;
+ String format = "%d:%02d";
+ if(manager.appendZeroForMinuteAsPvPTimer()){
+ format = "%02d:%02d";
+ }
+ str = String.format(format, Integer.valueOf(minutes), Integer.valueOf(seconds) );
+ result = input.replace("%pvp_timer%", str);
+ }else{
+ result = result.replace("%pvp_timer%", String.valueOf(data1.getPvpTime()));
+ }
+ }
+ if (result.contains("%kill%")) {
+ result = result.replace("%kill%", String.valueOf(player.getStatistic(Statistic.PLAYER_KILLS)));
+ }
+ if (result.contains("%death%")) {
+ result = result.replace("%death%", String.valueOf(player.getStatistic(Statistic.DEATHS)));
+ }
+
+ return result;
+ }
+
+ public static String color(String input) {
+ return ChatColor.translateAlternateColorCodes('&', input);
+ }
+ public String getLocalized (Player player , String key , Object... params){
+ String message = key;
+ if(lang.getConfig().contains(key)){
+ message = lang.getConfig().getString(key);
+ }else{
+ if(defaults.contains(key)){
+ lang.getConfig().set(key, defaults.get(key));
+ try {
+ lang.getConfig().save(lang.getFile());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ message = defaults.getString(key);
+ }else{
+ getLogger().severe("Can not find language referense for " + key);
+ }
+ }
+ return color(String.format(message, params));
+ }
+
+ public void sendLocalized(Player player , String key , Object... params){
+ player.sendMessage(getLocalized(player, key, params));
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/PlayerData.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/PlayerData.java
new file mode 100644
index 0000000..443569f
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/PlayerData.java
@@ -0,0 +1,79 @@
+package net.libhalt.bukkit.kaede;
+
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+public class PlayerData {
+ private int pvpTime;
+ private int kills;
+ private boolean killOnLogin;
+ private long combatTagMillisecond;
+ private int lives ;
+ private transient long createdTime;
+ {
+ createdTime = System.currentTimeMillis();
+ }
+ public int getPvpTime() {
+ return this.pvpTime;
+ }
+
+
+ public long getCombatTagMillisecond() {
+ return combatTagMillisecond;
+ }
+
+
+
+ public void setCombatTagMillisecond(long combatTagMillisecond) {
+ this.combatTagMillisecond = combatTagMillisecond;
+ }
+
+
+
+ public void setPvpTime(int pvpTime) {
+ this.pvpTime = pvpTime;
+ }
+
+ public int getKills() {
+ return this.kills;
+ }
+
+ public void setKills(int kills) {
+ this.kills = kills;
+ }
+
+ public boolean isKillOnLogin() {
+ return this.killOnLogin;
+ }
+
+ public void setKillOnLogin(boolean killOnLogin) {
+ this.killOnLogin = killOnLogin;
+ }
+
+
+
+ public int getLives() {
+ return lives;
+ }
+
+
+
+ public void setLives(int lives) {
+ this.lives = lives;
+ }
+
+
+
+ public long getCreatedTime() {
+ return createdTime;
+ }
+
+
+
+ public void setCreatedTime(long createdTime) {
+ this.createdTime = createdTime;
+ }
+
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/PlayerDataManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/PlayerDataManager.java
new file mode 100644
index 0000000..7d5b062
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/PlayerDataManager.java
@@ -0,0 +1,151 @@
+package net.libhalt.bukkit.kaede;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.UUID;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerKickEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.inventory.ItemStack;
+
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class PlayerDataManager extends Manager implements Listener {
+ private HashMap dataMap = new HashMap ();
+ private File playerDataFolder;
+
+ public PlayerDataManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.playerDataFolder = new File(this.getPlugin().getDataFolder(), "playerdata");
+ this.playerDataFolder.mkdir();
+ for(Player player : Bukkit.getOnlinePlayers()){
+ onLogin(player);
+ }
+
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @Override
+ public void tear() {
+ for(Player player : Bukkit.getOnlinePlayers()){
+ onLogout(player);
+ }
+
+ }
+
+ public void onLogin(Player player) {
+ File file = new File(this.playerDataFolder, player.getUniqueId().toString() + ".dat");
+ PlayerData data = new PlayerData();
+ if (file.exists()) {
+ YamlConfiguration dataConfig = YamlConfiguration.loadConfiguration(file);
+ data.setKills(dataConfig.getInt("kills"));
+ if(!dataConfig.contains("pvptimes")){
+ data.setPvpTime(this.getPlugin().getPvPTimerManager().getDefaultPvPTimer());
+ }else {
+ data.setPvpTime(dataConfig.getInt("pvptimes"));
+ }
+ data.setKillOnLogin(false);
+ data.setCombatTagMillisecond(dataConfig.getLong("combatTag" , -1L));
+ data.setLives(dataConfig.getInt("lives"));
+ } else {
+ data.setPvpTime(this.getPlugin().getPvPTimerManager().getDefaultPvPTimer());
+ savePlayerData(player.getUniqueId().toString(), data);
+ }
+
+ this.dataMap.put(player, data);
+ if (data.isKillOnLogin()) {
+ data.setKillOnLogin(false);
+ player.getInventory().setContents(new ItemStack[player.getInventory().getContents().length]);
+ player.getInventory().setArmorContents(new ItemStack[4]);
+ FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if(factionPlayer != null && factionPlayer.getFaction() != null){
+ factionPlayer.getFaction().setDtr(factionPlayer.getFaction().getDtr() + 1);
+ }
+ player.setHealth(0.0D);
+ }
+
+ }
+
+ public void onLogout(Player player) {
+ if (this.dataMap.containsKey(player)) {
+ PlayerData data = this.dataMap.get(player);
+ savePlayerData(player.getUniqueId().toString(), data);
+ dataMap.remove(player);
+ }
+
+ }
+
+ public PlayerData getPlayerData(Player player) {
+ return this.dataMap.get(player);
+ }
+
+ public PlayerData getOfflinePlayerData(String uuidString) {
+ UUID uuid = UUID.fromString(uuidString);
+ File file = new File(this.playerDataFolder, uuid.toString() + ".dat");
+ PlayerData data = new PlayerData();
+ if (file.exists()) {
+ YamlConfiguration dataConfig = YamlConfiguration.loadConfiguration(file);
+ data.setKills(dataConfig.getInt("kills"));
+ data.setPvpTime(dataConfig.getInt("pvptimes"));
+ data.setKillOnLogin(false);
+ data.setLives(dataConfig.getInt("lives"));
+ } else {
+ data.setPvpTime(this.getPlugin().getPvPTimerManager().getDefaultPvPTimer());
+ }
+
+ return data;
+ }
+
+ public void savePlayerData(String uuidString, PlayerData data) {
+ UUID uuid = UUID.fromString(uuidString);
+ File file = new File(this.playerDataFolder, uuid.toString() + ".dat");
+ if(!file.exists()){
+ try {
+ file.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ YamlConfiguration config = new YamlConfiguration();
+ config.set("kills", Integer.valueOf(data.getKills()));
+ config.set("pvptimes", Integer.valueOf(data.getPvpTime()));
+ config.set("killOnLogin", Boolean.valueOf(data.isKillOnLogin()));
+ config.set("combatTag", data.getCombatTagMillisecond());
+ config.set("lives" , data.getLives());
+ try {
+ config.save(file);
+ } catch (IOException var7) {
+ var7.printStackTrace();
+ }
+
+ }
+
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ this.onLogout(event.getPlayer());
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST)
+ public void onPlayerJoin(PlayerJoinEvent event) {
+ this.onLogin(event.getPlayer());
+ }
+
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void onPlayerKick(PlayerKickEvent event) {
+ this.onLogout(event.getPlayer());
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/ScoreboardManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/ScoreboardManager.java
new file mode 100644
index 0000000..c550e69
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/ScoreboardManager.java
@@ -0,0 +1,61 @@
+package net.libhalt.bukkit.kaede;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerKickEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.scoreboard.Scoreboard;
+
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class ScoreboardManager extends Manager implements Listener {
+ private ConfigurationWrapper config;
+
+ public ScoreboardManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("scoreboard.yml", this.getPlugin());
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+
+
+ }
+ public boolean useDecimalForEnderPearls(){
+ return config.getConfig().getBoolean("formatter.ender-pearl.use-decimals");
+ }
+
+ public boolean useDecimalForSpawnTag(){
+ return config.getConfig().getBoolean("formatter.spawn-tag.use-decimals");
+ }
+
+ public boolean isTabsEnabled(){
+ return config.getConfig().getBoolean("drtshock-relation-colors");
+ }
+ public boolean isAlwaysDisplay(){
+ return config.getConfig().getBoolean("always-display" , false);
+ }
+ public boolean useMinuteSeperatorForPvPTimer(){
+ return config.getConfig().getBoolean("formatter.pvp-timer.use-minute-seperator" , false);
+ }
+
+ public boolean appendZeroForMinuteAsPvPTimer(){
+ return config.getConfig().getBoolean("formatter.pvp-timer.append-zero-for-minute" , false);
+ }
+
+ public List getConfiguredContext() {
+ return this.config.getConfig().getStringList("context");
+ }
+
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/event/CombatLoggerDeathEvent.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/event/CombatLoggerDeathEvent.java
new file mode 100644
index 0000000..0370e59
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/event/CombatLoggerDeathEvent.java
@@ -0,0 +1,43 @@
+package net.libhalt.bukkit.kaede.event;
+
+import java.util.UUID;
+
+import org.bukkit.entity.Entity;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+
+public class CombatLoggerDeathEvent extends Event{
+ private static final HandlerList handlers = new HandlerList();
+
+ private Entity loggerEntity;
+ private UUID playerUUID;
+
+
+ public CombatLoggerDeathEvent(Entity loggerEntity, UUID playerUUID) {
+ this.loggerEntity = loggerEntity;
+ this.playerUUID = playerUUID;
+ }
+
+
+
+ public Entity getLoggerEntity() {
+ return loggerEntity;
+ }
+
+
+
+ public UUID getPlayerUUID() {
+ return playerUUID;
+ }
+
+
+
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/event/ScoreboardTextAboutToUpdateEvent.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/event/ScoreboardTextAboutToUpdateEvent.java
new file mode 100644
index 0000000..6363901
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/event/ScoreboardTextAboutToUpdateEvent.java
@@ -0,0 +1,37 @@
+package net.libhalt.bukkit.kaede.event;
+
+import org.bukkit.entity.Player;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent;
+
+public class ScoreboardTextAboutToUpdateEvent extends PlayerEvent{
+ private static final HandlerList handlers = new HandlerList();
+
+ private String text;
+ private boolean shouldAlwaysDisplay;
+ public ScoreboardTextAboutToUpdateEvent(Player who , String text , boolean shouldAlwaysDisplay) {
+ super(who);
+ this.text = text;
+ this.shouldAlwaysDisplay = shouldAlwaysDisplay;
+ }
+
+
+ public boolean isShouldAlwaysDisplay() {
+ return shouldAlwaysDisplay;
+ }
+
+ public String getText() {
+ return text;
+ }
+ public void setText(String text) {
+ this.text = text;
+ }
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/CombatLoggerManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/CombatLoggerManager.java
new file mode 100644
index 0000000..6ccdf65
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/CombatLoggerManager.java
@@ -0,0 +1,381 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.Statistic;
+import org.bukkit.World;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Damageable;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+import org.bukkit.entity.Villager;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockRedstoneEvent;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDeathEvent;
+import org.bukkit.event.player.PlayerInteractEntityEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerKickEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.event.world.ChunkUnloadEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.bukkit.util.Vector;
+
+import com.igodlik3.vipermisc.Misc;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.PlayerData;
+import net.libhalt.bukkit.kaede.event.CombatLoggerDeathEvent;
+import net.libhalt.bukkit.kaede.support.IRegion;
+import net.libhalt.bukkit.kaede.support.RegionSupport;
+import net.libhalt.bukkit.kaede.support.Support;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import net.syuu.popura.listener.FactionListener;
+import net.syuu.popura.util.ImprovedOfflinePlayer;
+
+public class CombatLoggerManager extends Manager implements Listener , CommandExecutor{
+ private Set loggingOut = new HashSet();
+ public CombatLoggerManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ getPlugin().getCommand("logout").setExecutor(this);
+ }
+
+ @Override
+ public void tear() {
+ for(World world : Bukkit.getWorlds()){
+ for(Entity entity : world.getEntities()){
+ if (entity.hasMetadata("CombatTagFra")) {
+ entity.removeMetadata("CombatTagFra", this.getPlugin());
+ entity.removeMetadata("Inventory", this.getPlugin());
+ entity.removeMetadata("Armor", this.getPlugin());
+ entity.remove();
+ }
+ }
+ }
+
+ }
+
+ public void onLogout(Player player) {
+ Damageable dplayer = (Damageable) player;
+ if (!Misc.getInstance().getSotwManager().isSOTWActive() && dplayer.getHealth() >= 0.0D && !player.isDead() && !player.hasMetadata("SafeLogout") && !player.hasPermission("combatlogger.bypass")) {
+ for(RegionSupport support : Support.getInstance().getRegionSupporters()){
+ for(IRegion region : support.getRegionsAt(player.getLocation())){
+ if(region.shouldPvPTimerFreeze()){
+ return;
+ }
+ }
+ }
+ Set allies = Support.getInstance().getEveryoneInTeam(player);
+ for(Entity entity : player.getNearbyEntities(4.0D , 4.0D , 4.0D)){
+ if(entity instanceof Villager){
+ final Villager villager1 = (Villager) entity;
+ if(villager1.getCustomName() != null && villager1.getCustomName().equals(player.getName())){
+ return;
+ }
+ }
+ }
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(player);
+ if(data == null || data.getPvpTime() > 0){
+ return;
+ }
+ for(Entity entity : player.getNearbyEntities(30.0D, 40.0D, 30.0D)){
+ if (entity != player && entity instanceof Player && !allies.contains(entity)) {
+ final Villager villager1 = player.getWorld().spawn(player.getLocation(), Villager.class);
+ villager1.setCustomName(player.getName());
+ villager1.setCustomNameVisible(true);
+ villager1.setMetadata("CombatTagFra", new FixedMetadataValue(this.getPlugin(), player.getUniqueId().toString()));
+ villager1.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, Integer.MAX_VALUE, 100));
+ villager1.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 100));
+ Damageable dvillager = (Damageable) villager1;
+ dvillager.setMaxHealth(50.0D);
+ villager1.setHealth(dvillager.getMaxHealth());
+ villager1.setMetadata("Inventory", new FixedMetadataValue(this.getPlugin(), player.getInventory().getContents()));
+ villager1.setMetadata("Armor", new FixedMetadataValue(this.getPlugin(), player.getInventory().getArmorContents()));
+ (new BukkitRunnable() {
+ @Override
+ public void run() {
+ if (!villager1.isDead()) {
+ villager1.removeMetadata("CombatTagFra", CombatLoggerManager.this.getPlugin());
+ villager1.removeMetadata("Inventory", CombatLoggerManager.this.getPlugin());
+ villager1.removeMetadata("Armor", CombatLoggerManager.this.getPlugin());
+ villager1.remove();
+ }
+
+ }
+ }).runTaskLater(this.getPlugin(), 300L);
+ return;
+
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onEntityDeath(EntityDeathEvent event) {
+ LivingEntity entity = event.getEntity();
+ if (entity.hasMetadata("CombatTagFra")) {
+ LivingEntity villager = entity;
+ Player killer = event.getEntity().getKiller();
+ if (killer != null) {
+ PlayerData items = this.getPlugin().getPlayerDataManager().getPlayerData(killer);
+ String armor = ChatColor.YELLOW + "(CombatLogger) " + ChatColor.RED + villager.getCustomName() + ChatColor.YELLOW + " was slain by " + ChatColor.RED + killer.getName() + ChatColor.DARK_RED + "[" + items.getKills() + "]";
+ Bukkit.broadcastMessage(armor);
+ } else {
+ Bukkit.broadcastMessage(ChatColor.YELLOW + "(CombatLogger)" + ChatColor.RED + villager.getCustomName() + " died.");
+ }
+
+ ItemStack[] var12 = (ItemStack[]) villager.getMetadata("Inventory").get(0).value();
+ ItemStack[] var13 = (ItemStack[]) villager.getMetadata("Armor").get(0).value();
+ Player died = this.getPlugin().getServer().getPlayer(villager.getCustomName());
+ if (died != null) {
+ died.getInventory().setContents(new ItemStack[died.getInventory().getContents().length]);
+ died.getInventory().setArmorContents(new ItemStack[4]);
+ died.setHealth(0.0D);
+ }
+
+ ItemStack[] var11 = var12;
+ int var10 = var12.length;
+
+ ItemStack diedUUID;
+ int offline;
+ for (offline = 0; offline < var10; ++offline) {
+ diedUUID = var11[offline];
+ if (diedUUID != null && diedUUID.getType() != Material.AIR) {
+ entity.getWorld().dropItemNaturally(entity.getLocation(), diedUUID);
+ }
+ }
+
+ var11 = var13;
+ var10 = var13.length;
+
+ for (offline = 0; offline < var10; ++offline) {
+ diedUUID = var11[offline];
+ if (diedUUID != null && diedUUID.getType() != Material.AIR) {
+ entity.getWorld().dropItemNaturally(entity.getLocation(), diedUUID);
+ }
+ }
+
+ String var14 = villager.getMetadata("CombatTagFra").get(0).asString();
+ final UUID theUUID = UUID.fromString(var14);
+ final FactionPlayer killerplayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(killer);
+ killerplayer.setKill(killerplayer.getKill() + 1);
+ final FactionPlayer death = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(theUUID);
+ if (death != null) {
+ death.setDeath(death.getDeath() + 1);
+ final Faction faction = death.getFaction();
+ if (faction != null && died == null) {
+ faction.freezeDTR(PopuraPlugin.getInstance().getPopura().getPopuraConfig().getDtrFreeze());
+ final double dtr = faction.getDtr();
+ faction.setDtr(dtr - 1.0);
+ faction.sendLocalizedText("FACTION_MEMBER_DEATH", death);
+ faction.sendLocalizedText("FACTION_DTR_CHANGE", FactionListener.formatter.format(dtr), faction);
+ }
+ }
+
+ new BukkitRunnable(){
+ @Override
+ public void run() {
+ PopuraPlugin.getInstance().getPopura().getDeathBanManager().ban(theUUID);
+ ImprovedOfflinePlayer improvedOfflinePlayer = new ImprovedOfflinePlayer(theUUID);
+ improvedOfflinePlayer.setHealthFloat(0.0F);
+ org.bukkit.inventory.PlayerInventory playerInventory = improvedOfflinePlayer.getInventory();
+ playerInventory.clear();
+ playerInventory.setArmorContents(new ItemStack[4]);
+ improvedOfflinePlayer.setInventory(playerInventory);
+ }
+ }.runTaskAsynchronously(getPlugin());
+ PlayerData var15 = this.getPlugin().getPlayerDataManager().getOfflinePlayerData(var14);
+ var15.setKillOnLogin(false);
+ this.getPlugin().getPlayerDataManager().savePlayerData(var14, var15);
+ entity.getWorld().strikeLightningEffect(entity.getLocation());
+ String killerName = "UNKNOWN";
+ if(killer != null){
+ killerName = killer.getName();
+ }
+ if(!getPlugin().isDisabled(DeathSignManager.class)){
+ entity.getWorld().dropItemNaturally(entity.getLocation(), getPlugin().getManager(DeathSignManager.class).getDeathSign(killerName, entity.getCustomName()));
+ }
+ if(!getPlugin().isDisabled(DeathKillManager.class)){
+ PlayerData killerData = getPlugin().getPlayerDataManager().getPlayerData(killer);
+ killerData.setKills(killerData.getKills() + 1);
+ killer.setStatistic(Statistic.PLAYER_KILLS, killerData.getKills());
+ }
+
+ CombatLoggerDeathEvent newEevent = new CombatLoggerDeathEvent(entity, UUID.fromString(var14));
+
+ getPlugin().getServer().getPluginManager().callEvent(newEevent);
+ }
+
+ }
+
+ public void onBlockRedstoneChange(BlockRedstoneEvent event)
+ {
+ if(event.getBlock().getType() == Material.STONE_PLATE )
+ {
+ boolean pressedByPlayer=false;
+ for(Entity e : event.getBlock().getChunk().getEntities())
+ {
+
+ if(
+ Location.locToBlock(e.getLocation().getX()) - event.getBlock().getX() <= 1 &&
+ Location.locToBlock(e.getLocation().getZ()) - event.getBlock().getZ() <= 1 &&
+ e instanceof Player
+ )
+ {
+ pressedByPlayer = true;
+ break;
+ }
+
+ }
+ if(!pressedByPlayer)
+ {
+ event.setNewCurrent(0);
+ }
+ }
+ }
+ @EventHandler
+ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
+ if (event.getRightClicked().hasMetadata("CombatTagFra")) {
+ event.setCancelled(true);
+ }
+
+ }
+
+ @EventHandler
+ public void onChunkUnload(ChunkUnloadEvent event) {
+ for(Entity entity : event.getChunk().getEntities()){
+ if (entity.hasMetadata("CombatTagFra") && !entity.isDead()) {
+ event.setCancelled(true);
+ }
+ }
+
+ }
+
+ @EventHandler
+ public void onEntityDamageByEntity(final EntityDamageByEntityEvent event){
+ if(event.getEntity().hasMetadata("CombatTagFra")){
+ String var14 = event.getEntity().getMetadata("CombatTagFra").get(0).asString();
+ if(event.getDamager() instanceof Player){
+ Player player = (Player) event.getDamager();
+ FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ if(factionPlayer != null && factionPlayer.getFaction() != null){
+ for(FactionPlayer others : factionPlayer.getFaction().getPlayers()){
+ if(others.getUuid().toString().equals(var14)){
+ event.setCancelled(true);
+ break;
+ }
+ }
+ }
+ }
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ event.getEntity().setVelocity(new Vector());
+ }
+ }.runTask(getPlugin());
+ }
+ }
+ @EventHandler
+ public void onPlayerJoin(PlayerJoinEvent event) {
+ for(Entity entity : event.getPlayer().getWorld().getEntitiesByClass(Villager.class)){
+ Villager villager = (Villager) entity;
+ if (villager.isCustomNameVisible() && villager.getCustomName().equals(event.getPlayer().getName())) {
+ villager.removeMetadata("CombatTagFra", this.getPlugin());
+ villager.removeMetadata("Inventory", this.getPlugin());
+ villager.removeMetadata("Armor", this.getPlugin());
+ villager.remove();
+ }
+ }
+
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ this.onLogout(event.getPlayer());
+
+ if(event.getPlayer().hasMetadata("SafeLogout")){
+ event.getPlayer().removeMetadata("SafeLogout", getPlugin());
+ }
+ }
+
+ @EventHandler
+ public void onPlayerKick(PlayerKickEvent event) {
+ this.onLogout(event.getPlayer());
+ }
+
+ @EventHandler
+ public void onPlayerMove(PlayerMoveEvent event){
+ Location to = event.getTo();
+ Location from = event.getFrom();
+ if(to.getBlockX() != from.getBlockX() || to.getBlockZ() != from.getBlockZ()){
+ if(loggingOut.contains(event.getPlayer())){
+ loggingOut.remove(event.getPlayer());
+ event.getPlayer().sendMessage(ChatColor.RED + "Your safe logout was cancelled due to block movement.");
+ }
+ }
+ }
+ @Override
+ public boolean onCommand(CommandSender sender, Command arg1, String arg2, String[] args) {
+ if(!(sender instanceof Player)){
+ sender.sendMessage(ChatColor.RED + "Only players");
+ return true;
+ }
+ final Player player = (Player)sender;
+ if(loggingOut.contains(player)){
+ player.sendMessage(ChatColor.GREEN + "Already Logging Out!");
+ return true;
+ }
+ loggingOut.add(player);
+ player.sendMessage(ChatColor.GREEN + "You are logging out in 30 second!");
+ new BukkitRunnable() {
+ int timer = 30;
+ @Override
+ public void run() {
+ if(!player.isOnline() || !loggingOut.contains(player)){
+ cancel();
+ return;
+ }
+ Damageable dplayer = (Damageable) player;
+ if(dplayer.getHealth() < dplayer.getMaxHealth()){
+ player.sendMessage(ChatColor.RED + "Safe Logout Cancelled. Health not max");
+ loggingOut.remove(player);
+ cancel();
+ return;
+
+ }
+ if(timer <= 0){
+ player.setMetadata("SafeLogout", new FixedMetadataValue(getPlugin(), true));
+ player.kickPlayer(ChatColor.GREEN + "Safe Logout");
+ cancel();
+ return;
+ }
+ timer--;
+ player.sendMessage(ChatColor.GREEN + "Logging out: " + timer + " seconds");
+ }
+ }.runTaskTimer(getPlugin(), 20, 20);
+ return false;
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/CraftingDisableManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/CraftingDisableManager.java
new file mode 100644
index 0000000..6ed4aa2
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/CraftingDisableManager.java
@@ -0,0 +1,61 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.bukkit.Material;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.PrepareItemCraftEvent;
+import org.bukkit.inventory.ItemStack;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class CraftingDisableManager extends Manager implements Listener{
+
+ private ConfigurationWrapper config;
+ private Map> disabledCrafting = new HashMap<>();
+ public CraftingDisableManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ config = new ConfigurationWrapper("disable-crafting.yml", getPlugin());
+ reload();
+ getPlugin().getServer().getPluginManager().registerEvents(this, getPlugin());
+
+ }
+
+ @Override
+ public void reload() {
+ disabledCrafting.clear();
+ ConfigurationSection section = config.getConfig().getConfigurationSection("disabled-crafting");
+ for(String key : section.getKeys(false)){
+ List bytes = section.getShortList(key);
+ Material material = null;
+ try{
+ material = Material.valueOf(key);;
+ }catch(IllegalArgumentException e){
+ getPlugin().getLogger().severe("While reading CraftingDisabled, " + key + " could not be parased as material");
+ continue;
+ }
+ disabledCrafting.put(material, bytes);
+ }
+ }
+
+
+ @EventHandler
+ public void onCraft(PrepareItemCraftEvent event){
+ ItemStack item = event.getInventory().getResult();
+ if(disabledCrafting.containsKey(item.getType()) && disabledCrafting.get(item.getType()).contains(item.getDurability())){
+ event.getInventory().setResult(new ItemStack(Material.AIR));
+ }
+ }
+
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathBanManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathBanManager.java
new file mode 100644
index 0000000..980b996
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathBanManager.java
@@ -0,0 +1,394 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+import java.util.Map.Entry;
+
+import com.google.common.collect.Lists;
+import net.libhalt.dev.plugin.armor.utils.Color;
+import net.syuu.popura.PopuraPlugin;
+import org.apache.commons.lang.time.DurationFormatUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.PlayerDeathEvent;
+import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
+import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result;
+import org.bukkit.permissions.Permission;
+import org.bukkit.permissions.PermissionDefault;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.PlayerData;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class DeathBanManager extends Manager implements Listener , CommandExecutor {
+ private ConfigurationWrapper config;
+ private long deathBan;
+ private File plDataFolder;
+ private Map deathBanByPerm = new HashMap();
+ private int limit;
+ private List messageLives = Lists.newArrayList();
+ private List messageHelpLive = Lists.newArrayList();
+ public DeathBanManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("death-bans.yml", this.getPlugin());
+ this.plDataFolder = new File(this.getPlugin().getDataFolder(), "deathbans");
+ this.plDataFolder.mkdirs();
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ this.reload();
+ getPlugin().getCommand("lives").setExecutor(this);
+ }
+
+ @Override
+ public void reload() {
+ this.deathBanByPerm.clear();
+ limit = this.config.getConfig().getInt("live-limit" , 100);
+ if(this.config.getConfig().contains("death-ban-by-perm")){
+ ConfigurationSection section = this.config.getConfig().getConfigurationSection("death-ban-by-perm");
+ for(String string : section.getKeys(false)){
+ this.deathBanByPerm.put(this.config.getConfig().getString("death-ban-by-perm." + string) , Integer.valueOf(string));
+ if(getPlugin().getServer().getPluginManager().getPermission(string) == null){
+ Permission perm = new Permission(string, PermissionDefault.FALSE);
+ getPlugin().getServer().getPluginManager().addPermission(perm);
+ }
+ }
+ }
+ this.deathBan = this.config.getConfig().getLong("death-ban") * 1000L;
+
+
+ messageLives = Color.translate(config.getConfig().getStringList("message-live"));
+ messageHelpLive = Color.translate(config.getConfig().getStringList("message-help-live"));
+ }
+
+ @EventHandler
+ public void onAsyncPlayerLogin(AsyncPlayerPreLoginEvent event) {
+ final UUID uuid = event.getUniqueId();
+ File file = new File(this.plDataFolder, uuid.toString() + ".yml");
+ PlayerData offlineData = getPlugin().getPlayerDataManager().getOfflinePlayerData(uuid.toString());
+ if (file.exists()) {
+ YamlConfiguration data = YamlConfiguration.loadConfiguration(file);
+ long until = data.getLong("ban_until");
+ if (System.currentTimeMillis() < until) {
+ long left = until - System.currentTimeMillis();
+ if(!PopuraPlugin.getInstance().getPopura().isEotw() && offlineData.getLives() > 0){
+
+ offlineData.setLives(offlineData.getLives() - 1);
+ data.set("ban_until", 0L);
+ file.delete();
+ getPlugin().getPlayerDataManager().savePlayerData(uuid.toString(), offlineData);
+ new BukkitRunnable() {
+
+ @Override
+ public void run() {
+ Player player = Bukkit.getPlayer(uuid);
+ if(player != null){
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(player);
+ getPlugin().sendLocalized(player, "NOTIFICATION_LIVE_CONSUMED", String.valueOf(data.getLives()));
+ }
+ }
+ }.runTaskLater(getPlugin(), 100);
+
+ return;
+ }
+ event.setKickMessage(getPlugin().getLocalized(null, "DEATH_BANNED", DurationFormatUtils.formatDurationWords(left, true, true)));
+ event.setLoginResult(Result.KICK_BANNED);
+ } else {
+ file.delete();
+ }
+ }
+
+ }
+
+ public long getDeathBan(Player player){
+ if(PopuraPlugin.getInstance().getPopura().isEotw()){
+ return 1000 * 60 * 24 * 356;
+ }
+ long ban = deathBan;
+ for(Entry entry : deathBanByPerm.entrySet()){
+ if(entry.getValue() * 1000L < ban && player.hasPermission(entry.getKey())){
+ ban = entry.getValue() * 1000L;
+ }
+ }
+ return ban;
+ }
+ @EventHandler
+ public void onPlayerDeath(final PlayerDeathEvent event) {
+ (new BukkitRunnable() {
+ @Override
+ public void run() {
+ DeathBanManager.this.ban(event.getEntity());
+ }
+ }).runTaskLater(this.getPlugin(), 10L);
+ }
+
+ public void ban(Player player) {
+ File file = new File(this.plDataFolder, player.getUniqueId().toString() + ".yml");
+ if (!file.exists()) {
+ try {
+ file.createNewFile();
+ } catch (IOException var6) {
+ var6.printStackTrace();
+ }
+ }
+
+ YamlConfiguration data = YamlConfiguration.loadConfiguration(file);
+ long duration = getDeathBan(player);
+ data.set("ban_until", Long.valueOf(System.currentTimeMillis() + duration));
+
+ try {
+ data.save(file);
+ } catch (IOException var5) {
+ var5.printStackTrace();
+ }
+
+ player.kickPlayer(ChatColor.RED + "You are deathbanned for " + DurationFormatUtils.formatDurationWords(duration, true, true));
+ }
+
+ @Override
+ public boolean onCommand(final CommandSender sender, Command arg1, String arg2, String[] args) {
+ if(args.length == 0){
+ if(sender instanceof Player){
+ Player player = ((Player)sender);
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(player);
+ for(String message : messageLives){
+ player.sendMessage(message.replace("%live%" , String.valueOf(data.getLives())));
+ }
+ }else {
+ sender.sendMessage(ChatColor.GREEN + "Note: use /lives help for list of command");
+ }
+ }else if(args[0].equalsIgnoreCase("help")){
+ for(String message : messageHelpLive){
+ sender.sendMessage(message);
+ }
+ }else if(args[0].equalsIgnoreCase("check")){
+ if(args.length < 2){
+ sender.sendMessage(ChatColor.RED + "/lives check - check the live of player. works only for online player");
+ return true;
+ }
+ String name = args[1];
+ Player target = Bukkit.getPlayer(name);
+ if(target == null){
+ sender.sendMessage(ChatColor.RED + "That player is not online");
+ return true;
+ }
+ int lives = getPlugin().getPlayerDataManager().getPlayerData(target).getLives();
+ sender.sendMessage(ChatColor.GREEN + target.getName() + " has " + lives + " lives left.");
+ }else if(args[0].equalsIgnoreCase("set")){
+ if(!sender.hasPermission("live.admin")){
+ sender.sendMessage(ChatColor.RED + "No Permission");
+ return true;
+
+ }
+ if(args.length < 3){
+ sender.sendMessage(ChatColor.RED + "/lives set - set the live of target by name. works only for online players");
+ return true;
+ }
+ final String name = args[1];
+ final String input = args[2];
+ final Player target = Bukkit.getPlayer(name);
+ final int amount;
+ try{
+ amount = Integer.valueOf(input);
+ }catch(IllegalArgumentException e){
+ sender.sendMessage(ChatColor.RED + input + " does not look like a integer to me.");
+ return true;
+ }
+
+ if (amount > limit) {
+ sender.sendMessage(ChatColor.RED + "Too many lives. Limit is " + limit);
+ return true;
+ }
+ if(target == null){
+ final int famount = amount;
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ final UUID uuid = Bukkit.getOfflinePlayer(name).getUniqueId();
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ PlayerData data = getPlugin().getPlayerDataManager().getOfflinePlayerData(uuid.toString());
+ data.setLives(famount);
+ sender.sendMessage(ChatColor.GREEN + name + "'s live is now " + data.getLives());
+ getPlugin().getPlayerDataManager().savePlayerData(uuid.toString(), data);
+ }
+ }.runTask(getPlugin());
+ }
+ }.runTaskAsynchronously(getPlugin());
+ }else {
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(target);
+ data.setLives(amount);
+ sender.sendMessage(ChatColor.GREEN + target.getName() + "'s live is now " + data.getLives());
+ }
+ }else if(args[0].equalsIgnoreCase("add")){
+ if(/*!sender.hasPermission("live.admin") || */sender instanceof Player){
+ sender.sendMessage(ChatColor.RED + "No Permission");
+ return true;
+ }
+ if(args.length < 3){
+ sender.sendMessage(ChatColor.RED + "/lives add - adds live by name. only online players");
+ return true;
+ }
+ final String name = args[1];
+ String input = args[2];
+ Player target = Bukkit.getPlayer(name);
+ int amount = 0;
+ try{
+ amount = Integer.valueOf(input);
+ }catch(IllegalArgumentException e){
+ sender.sendMessage(ChatColor.RED + input + " does not look like a integer to me.");
+ return true;
+ }
+ if(target != null){
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(target);
+
+ if(data.getLives() + amount > limit){
+ sender.sendMessage(ChatColor.RED + "You have too many lives. Limit is " + limit);
+ return true;
+ }
+ data.setLives(data.getLives() + amount);
+ sender.sendMessage(ChatColor.GREEN + target.getName() + "'s live is now " + data.getLives());
+ }else{
+ final int famount = amount;
+ new BukkitRunnable() {
+
+ @Override
+ public void run() {
+ final UUID uuid = Bukkit.getOfflinePlayer(name).getUniqueId();
+ new BukkitRunnable() {
+
+ @Override
+ public void run() {
+ PlayerData data = getPlugin().getPlayerDataManager().getOfflinePlayerData(uuid.toString());
+
+ if(data.getLives() + famount > limit){
+ sender.sendMessage(ChatColor.RED + "You have too many lives. Limit is " + limit);
+ return;
+ }
+ data.setLives(data.getLives() + famount);
+ sender.sendMessage(ChatColor.GREEN + name + "'s live is now " + data.getLives());
+ getPlugin().getPlayerDataManager().savePlayerData(uuid.toString(), data);
+ }
+ }.runTask(getPlugin());
+ }
+ }.runTaskAsynchronously(getPlugin());
+ }
+ }else if(args[0].equalsIgnoreCase("send")){
+ if(!(sender instanceof Player)){
+ sender.sendMessage(ChatColor.RED + "Must be player to send lives");
+ return true;
+ }
+ if(!sender.hasPermission("live.send")){
+ sender.sendMessage(ChatColor.RED + "No Permission");
+ return true;
+ }
+ if(args.length < 3){
+ sender.sendMessage(ChatColor.RED + "/lives send ");
+ return true;
+ }
+ final String name = args[1];
+ String input = args[2];
+ Player target = Bukkit.getPlayer(name);
+ int amount = 0;
+ try{
+ amount = Integer.valueOf(input);
+ }catch(IllegalArgumentException e){
+ sender.sendMessage(ChatColor.RED + input + " does not look like a integer to me.");
+ return true;
+ }
+
+ final PlayerData self = getPlugin().getPlayerDataManager().getPlayerData((Player) sender);
+ if(self.getLives() < amount || amount <= 0){
+ sender.sendMessage(ChatColor.RED + "Not enough lives");
+ return true;
+ }
+ if(target != null){
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(target);
+ if(data.getLives() + amount > limit){
+ sender.sendMessage(ChatColor.RED + "You have too many lives. Limit is " + limit);
+ return true;
+ }
+ self.setLives(self.getLives() - amount);
+ data.setLives(data.getLives() + amount);
+ sender.sendMessage(ChatColor.GREEN + "Successfuly send lives to " + target.getName() + ". " + target.getName() + " now has " + data.getLives() + " lives left.");
+ }else{
+ final int famount = amount;
+ new BukkitRunnable() {
+
+ @Override
+ public void run() {
+ final UUID uuid = Bukkit.getOfflinePlayer(name).getUniqueId();
+ new BukkitRunnable() {
+
+ @Override
+ public void run() {
+ PlayerData data = getPlugin().getPlayerDataManager().getOfflinePlayerData(uuid.toString());
+ if(data.getLives() + famount > limit){
+ sender.sendMessage(ChatColor.RED + "You have too many lives. Limit is " + limit);
+ return;
+ }
+ self.setLives(self.getLives() - famount);
+ data.setLives(data.getLives() + famount);
+ sender.sendMessage(ChatColor.GREEN + name + "'s live is now " + data.getLives());
+ getPlugin().getPlayerDataManager().savePlayerData(uuid.toString(), data);
+ }
+ }.runTask(getPlugin());
+ }
+ }.runTaskAsynchronously(getPlugin());
+ }
+ }else if(args[0].equalsIgnoreCase("revive")){
+ if(!sender.hasPermission("live.admin") && !sender.hasPermission("live.revive")){
+ sender.sendMessage(ChatColor.RED + "No Permission");
+ return true;
+ }
+ if(args.length < 2){
+ sender.sendMessage(ChatColor.RED + "/lives revive ");
+ return true;
+ }
+ final String name = args[1];
+ Player target = Bukkit.getPlayer(name);
+
+
+ if(target != null){
+ File file = new File(this.plDataFolder, target.getUniqueId().toString() + ".yml");
+ file.delete();
+ sender.sendMessage(ChatColor.GREEN + "Revived that person successfully");
+ }else{
+ new BukkitRunnable() {
+
+ @Override
+ public void run() {
+ final UUID uuid = Bukkit.getOfflinePlayer(name).getUniqueId();
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ File file = new File(plDataFolder, uuid.toString() + ".yml");
+ file.delete();
+ sender.sendMessage(ChatColor.GREEN + "Revived that person successfully");
+ }
+ }.runTask(getPlugin());
+ }
+ }.runTaskAsynchronously(getPlugin());
+ }
+ }
+ return true;
+ }
+
+
+
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathKillManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathKillManager.java
new file mode 100644
index 0000000..996afe8
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathKillManager.java
@@ -0,0 +1,55 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import org.bukkit.Statistic;
+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.PlayerDeathEvent;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.PlayerData;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class DeathKillManager extends Manager implements Listener {
+ public DeathKillManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @EventHandler(priority = EventPriority.LOW)
+ public void onDeath(PlayerDeathEvent event) {
+ Player died = event.getEntity();
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(died);
+ if(System.currentTimeMillis() - data.getCreatedTime() < 10000){
+ return;
+ }
+ Player killer = died.getKiller();
+ died.getWorld().strikeLightningEffect(died.getLocation());
+ if (killer != null) {
+ PlayerData killerData = this.getPlugin().getPlayerDataManager().getPlayerData(killer);
+ PlayerData diedData = this.getPlugin().getPlayerDataManager().getPlayerData(died);
+ killerData.setKills(killerData.getKills() + 1);
+ killer.setStatistic(Statistic.PLAYER_KILLS, killerData.getKills());
+ /*
+ String message = ChatColor.RED + died.getName() + ChatColor.DARK_RED + "[" + diedData.getKills() + "] " + ChatColor.YELLOW + "was slain by " + ChatColor.RED + killer.getName() + ChatColor.DARK_RED + "[" + killerData.getKills() + "]";
+ if (killer.getItemInHand() != null) {
+ ItemStack item = killer.getItemInHand();
+ String name;
+ if (item.getItemMeta().hasDisplayName()) {
+ name = item.getItemMeta().getDisplayName();
+ } else {
+ name = item.getType().name().toLowerCase().replace("_", " ");
+ }
+
+ message = message + ChatColor.YELLOW + " using a " + ChatColor.RED + name;
+ }
+
+ event.setDeathMessage(message);
+ */
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathMessageManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathMessageManager.java
new file mode 100644
index 0000000..dc08f4f
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathMessageManager.java
@@ -0,0 +1,136 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import org.apache.commons.lang.WordUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.entity.Entity;
+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.PlayerDeathEvent;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.PlayerData;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class DeathMessageManager extends Manager implements Listener{
+
+ private ConfigurationWrapper config;
+ public DeathMessageManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ config = new ConfigurationWrapper("death-messages.yml", getPlugin());
+ getPlugin().getServer().getPluginManager().registerEvents(this, getPlugin());
+ }
+
+ public String tranlasteAndGet(String message){
+ return ChatColor.translateAlternateColorCodes('&', config.getConfig().getString(message));
+ }
+
+
+ public String toReadable(ItemStack item){
+ if(item.hasItemMeta()){
+ ItemMeta meta = item.getItemMeta();
+ if(meta.hasDisplayName()){
+ return meta.getDisplayName();
+ }
+ }
+ return toReadable(item.getType());
+ }
+ public String toReadable(Enum enu){
+ return WordUtils.capitalize(enu.name().replace("_", " ").toLowerCase());
+ }
+
+ @EventHandler
+ public void onEntityDeath(PlayerDeathEvent event){
+ Player player = event.getEntity();
+ DamageCause cause = player.getLastDamageCause() == null ? DamageCause.CUSTOM : player.getLastDamageCause().getCause();
+ if(!config.getConfig().contains(cause.name())){
+ cause = DamageCause.CUSTOM;
+ }
+ String message = null;
+ if(cause == DamageCause.ENTITY_ATTACK){
+ if(player.getLastDamageCause() instanceof EntityDamageByEntityEvent){
+ EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) player.getLastDamageCause();
+ if(damageEvent.getDamager() instanceof Player){
+ Player damager = (Player) damageEvent.getDamager();
+ if(damager.getItemInHand() != null && damager.getItemInHand().getType() != Material.AIR){
+ message = tranlasteAndGet("ENTITY_ATTACK.PLAYER");
+ message = message.replace("{killer.hand}", toReadable(damager.getItemInHand()));
+
+ }else{
+ message = tranlasteAndGet("ENTITY_ATTACK.PLAYER_NOITEM");
+ }
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(damager);
+ if (data != null) {
+ message = message.replace("{killer}", damager.getName());
+ message = message.replace("{killer.kills}", String.valueOf(data.getKills()));
+ }
+ }else{
+ message = tranlasteAndGet("ENTITY_ATTACK.ENTITY");
+ message = message.replace("{killer}", toReadable(damageEvent.getDamager().getType()));
+ }
+ }else{
+ message = tranlasteAndGet("ENTITY_ATTACK.ENTITY");
+ message = message.replace("{killer}", "Unknown");
+ }
+ }else if(cause == DamageCause.PROJECTILE){
+ if(player.getLastDamageCause() instanceof EntityDamageByEntityEvent){
+ EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) player.getLastDamageCause();
+ if(damageEvent.getDamager() instanceof Projectile){
+ Projectile projectile = (Projectile) damageEvent.getDamager();
+ if(projectile.getShooter() instanceof Player){
+
+ Player damager = (Player) projectile.getShooter();
+ if(damager.getItemInHand() != null && damager.getItemInHand().getType() != Material.AIR){
+ message = tranlasteAndGet("PROJECTILE.PLAYER");
+ message = message.replace("{killer.hand}", toReadable(damager.getItemInHand()));
+
+ }else{
+ message = tranlasteAndGet("PROJECTILE.PLAYER_NOITEM");
+ }
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(damager);
+ message = message.replace("{killer}", damager.getName());
+ message = message.replace("{killer.kills}", String.valueOf(data.getKills()));
+ }else if(projectile.getShooter() instanceof Entity){
+ message = tranlasteAndGet("PROJECTILE.ENTITY");
+ message = message.replace("{killer}", toReadable(((Entity)projectile.getShooter()).getType()));
+ }else{
+
+ message = tranlasteAndGet("PROJECTILE.ENTITY");
+ message = message.replace("{killer}", "Unknown");
+ }
+ }else{
+ message = tranlasteAndGet("PROJECTILE.ENTITY");
+ message = message.replace("{killer}", "Unknown");
+
+ }
+ }else{
+ message = tranlasteAndGet("ENTITY_ATTACK.ENTITY");
+ message = message.replace("{killer}", "Unknown");
+ }
+ }else if(cause == DamageCause.CUSTOM){
+ message = tranlasteAndGet("UNKNOWN");
+
+ }else if(cause != null){
+ message = tranlasteAndGet(cause.name());
+ }
+ if(message != null){
+ message = message.replace("{player}", player.getName());
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(player);
+ message = message.replace("{player.kills}", String.valueOf(data.getKills()));
+ event.setDeathMessage(message);
+ Bukkit.getLogger().info(message);
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathSignManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathSignManager.java
new file mode 100644
index 0000000..0e85fb0
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/DeathSignManager.java
@@ -0,0 +1,120 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.HashMap;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.block.BlockState;
+import org.bukkit.block.Sign;
+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.BlockBreakEvent;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.entity.PlayerDeathEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.PlayerData;
+import net.libhalt.bukkit.kaede.utils.ItemStackUtils;
+import net.libhalt.bukkit.kaede.utils.Manager;
+public class DeathSignManager extends Manager implements Listener{
+
+ private static final DateFormat dateFormat = new SimpleDateFormat("MM/dd hh:mm:ss");
+ public DeathSignManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+ @EventHandler(ignoreCancelled = true , priority = EventPriority.MONITOR)
+ public void onBlockBreak(BlockBreakEvent event){
+ BlockState blockState = event.getBlock().getState();
+ if(blockState instanceof Sign){
+ final Sign sign = (Sign) blockState;
+ if(sign.getLine(0).startsWith(ChatColor.RED.toString())){
+ if(sign.getLine(1).startsWith(ChatColor.YELLOW.toString())){
+ if(sign.getLine(2).startsWith(ChatColor.GREEN.toString())){
+ if(sign.getLine(3).startsWith(ChatColor.BLACK.toString())){
+ event.getBlock().setType(Material.AIR);
+ ItemStack item = new ItemStack(Material.SIGN);
+ ItemStackUtils.setItemTitle(item , sign.getLine(0) + "'s Death Sign");
+ ItemStackUtils.setItemLore(item, Arrays.asList(new String[]{sign.getLine(1) , sign.getLine(2) , sign.getLine(3)}));
+ event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), item);
+
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onBlockPlace(BlockPlaceEvent event){
+ ItemStack item = event.getItemInHand();
+ final Player player = event.getPlayer();
+ if(item != null && item.getType() == Material.SIGN){
+ BlockState blockState = event.getBlock().getState();
+ if(blockState instanceof Sign){
+ ItemMeta meta = item.getItemMeta();
+ final Sign sign = (Sign) blockState;
+ if(meta.hasDisplayName() && meta.hasLore()){
+ String display = item.getItemMeta().getDisplayName();
+ if(display.startsWith(ChatColor.RED.toString()) && display.endsWith("'s Death Sign")){
+ sign.setLine(0, display.replace("'s Death Sign", ""));
+ sign.setLine(1, meta.getLore().get(0));
+ sign.setLine(2, meta.getLore().get(1));
+ sign.setLine(3, meta.getLore().get(2));
+ new BukkitRunnable() {
+
+ @Override
+ public void run() {
+ player.closeInventory();
+ }
+ }.runTask(getPlugin());
+ new BukkitRunnable() {
+
+ @Override
+ public void run() {
+ sign.update();
+ }
+ }.runTaskLater(getPlugin() , 10);
+ }
+ }
+ }
+ }
+ }
+
+ @EventHandler(priority =EventPriority.LOW )
+ public void onPlayerDeath(PlayerDeathEvent event){
+ Player died = event.getEntity();
+ String killer = "Unknown";
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(died);
+ if(System.currentTimeMillis() - data.getCreatedTime() < 10000){
+ return;
+ }
+ if(died.getKiller() != null){
+ killer = died.getKiller().getName();
+ HashMap over = died.getKiller().getInventory().addItem(getDeathSign(killer, died.getName()));
+ for (ItemStack item : over.values()) {
+ died.getKiller().getWorld().dropItem(died.getKiller().getLocation(), item);
+ }
+ }else{
+ died.getWorld().dropItemNaturally(died.getLocation(), getDeathSign(killer, died.getName()));
+ }
+ }
+ public ItemStack getDeathSign(String killer, String death ){
+ ItemStack sign = new ItemStack(Material.SIGN);
+ ItemStackUtils.setItemTitle(sign, ChatColor.RED + death + "'s Death Sign");
+ ItemStackUtils.setItemLore(sign, Arrays.asList(new String[] {ChatColor.YELLOW + "Slain by" , ChatColor.GREEN + killer , ChatColor.BLACK + dateFormat.format(System.currentTimeMillis())}));
+ return sign;
+ }
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ElevatorManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ElevatorManager.java
new file mode 100644
index 0000000..ebd6aa3
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ElevatorManager.java
@@ -0,0 +1,149 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import com.igodlik3.vipermisc.utils.Utils;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.popura.Popura;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.claim.Position2D;
+import net.syuu.popura.combattag.CombatTagManager;
+import net.syuu.popura.faction.bean.ClaimedRegion;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.Sign;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+import org.bukkit.entity.Vehicle;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.block.SignChangeEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.event.vehicle.VehicleExitEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+public class ElevatorManager extends Manager implements Listener
+{
+ private HCFactionPlugin core;
+ public ElevatorManager(final HCFactionPlugin plugin) {
+ super(plugin);
+ this.core = HCFactionPlugin.getInstance();
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @EventHandler
+ public void onPlayerInteract(final PlayerInteractEvent event) {
+ final Player player = event.getPlayer();
+ if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
+ final Block b = event.getClickedBlock();
+ if (!this.isInTerritory(player, b.getLocation())) {
+ return;
+ }
+ if (b.getType() == Material.SIGN || b.getType() == Material.SIGN_POST || b.getType() == Material.WALL_SIGN) {
+ final Sign s = (Sign)b.getState();
+ if (s.getLines().length >= 2) {
+ if (s.getLine(0).equalsIgnoreCase(ChatColor.BLUE + "[Elevator]") && s.getLine(1).equalsIgnoreCase(ChatColor.GREEN + "Up")) {
+
+ final Location l = b.getLocation();
+ Location downSignLocation = null;
+ for (int i = l.getBlockY() + 1; i <= 256; ++i) {
+ final Location testLocation = new Location(l.getWorld(), (double)l.getBlockX(), (double)i, (double)l.getBlockZ());
+ final Block testBlock = testLocation.getBlock();
+ if (testBlock.getType() == Material.SIGN || testBlock.getType() == Material.SIGN_POST || testBlock.getType() == Material.WALL_SIGN) {
+ final Sign testSign = (Sign)testBlock.getState();
+ if (testSign.getLines().length >= 2) {
+ if (testSign.getLine(0).equalsIgnoreCase(ChatColor.BLUE + "[Elevator]") && testSign.getLine(1).equalsIgnoreCase(ChatColor.GREEN + "Down")) {
+ downSignLocation = testBlock.getLocation();
+ break;
+ }
+ if (testSign.getLine(0).equalsIgnoreCase(ChatColor.BLUE + "[Elevator]") && testSign.getLine(1).equalsIgnoreCase(ChatColor.GREEN + "Up")) {
+ downSignLocation = null;
+ break;
+ }
+ }
+ }
+ }
+ if (downSignLocation == null) {
+ event.getPlayer().sendMessage(ChatColor.RED + "I was not able to locate the upper floor!");
+ event.getPlayer().sendMessage(ChatColor.RED + "Make sure that the [Elevator] Down sign is above this one!");
+ }
+ else {
+
+ if(PopuraPlugin.getInstance().getPopura().getCombatTagManager().isCombatTagActive(player)){
+ event.getPlayer().sendMessage(ChatColor.RED + "You can not do this while in combat.");
+ return;
+ }
+ event.getPlayer().teleport(downSignLocation.add(0.5, 0.0, 0.5));
+ }
+ }
+ else if (s.getLine(0).equalsIgnoreCase(ChatColor.BLUE + "[Elevator]") && s.getLine(1).equalsIgnoreCase(ChatColor.GREEN + "Down")) {
+ final Location l = b.getLocation();
+ Location upSignLocation = null;
+ for (int i = l.getBlockY() - 1; i >= 0; --i) {
+ final Location testLocation = new Location(l.getWorld(), (double)l.getBlockX(), (double)i, (double)l.getBlockZ());
+ final Block testBlock = testLocation.getBlock();
+ if (testBlock.getType() == Material.SIGN || testBlock.getType() == Material.SIGN_POST || testBlock.getType() == Material.WALL_SIGN) {
+ final Sign testSign = (Sign)testBlock.getState();
+ if (testSign.getLines().length >= 1) {
+ if (testSign.getLine(0).equalsIgnoreCase(ChatColor.BLUE + "[Elevator]") && testSign.getLine(1).equalsIgnoreCase(ChatColor.GREEN + "Down")) {
+ upSignLocation = null;
+ break;
+ }
+ if (testSign.getLine(0).equalsIgnoreCase(ChatColor.BLUE + "[Elevator]") && testSign.getLine(1).equalsIgnoreCase(ChatColor.GREEN + "Up")) {
+ upSignLocation = testBlock.getLocation();
+ break;
+ }
+ }
+ }
+ }
+ if (upSignLocation == null) {
+ event.getPlayer().sendMessage(ChatColor.RED + "I was not able to locate the lower floor!");
+ event.getPlayer().sendMessage(ChatColor.RED + "Make sure that the [Elevator] Up sign is below this one!");
+ } else {
+
+ if(PopuraPlugin.getInstance().getPopura().getCombatTagManager().isCombatTagActive(player)){
+ event.getPlayer().sendMessage(ChatColor.RED + "You can not do this while in combat.");
+ return;
+ }
+ event.getPlayer().teleport(upSignLocation.add(0.5, 0.0, 0.5));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onSignChange(final SignChangeEvent event) {
+ if (event.getLines().length >= 2 && event.getLine(0).equalsIgnoreCase("[Elevator]")) {
+ event.setLine(0, ChatColor.BLUE + "[Elevator]");
+ if (event.getLine(1).equalsIgnoreCase("Up")) {
+ event.setLine(1, ChatColor.GREEN + "Up");
+ }
+ else if (event.getLine(1).equalsIgnoreCase("Down")) {
+ event.setLine(1, ChatColor.GREEN + "Down");
+ }
+ else {
+ event.setLine(1, ChatColor.RED + event.getLine(1));
+ }
+ }
+ }
+
+ private boolean isInTerritory(final Player player, final Location location) {
+ ClaimedRegion claimedRegion = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getClaimedRegionAt(new Position2D(location.getWorld().getName() , location.getBlockX() , location.getBlockZ()));
+ if(claimedRegion == null){
+ return false;
+ }
+ final FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(player);
+ return claimedRegion.getOwner().getPlayers().contains(factionPlayer);
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnchantmentLimitManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnchantmentLimitManager.java
new file mode 100644
index 0000000..608e78d
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnchantmentLimitManager.java
@@ -0,0 +1,193 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.bukkit.Material;
+import org.bukkit.enchantments.Enchantment;
+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.enchantment.EnchantItemEvent;
+import org.bukkit.event.entity.EntityDeathEvent;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryType;
+import org.bukkit.event.inventory.InventoryType.SlotType;
+import org.bukkit.event.player.PlayerFishEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.event.player.PlayerPickupItemEvent;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.EnchantmentStorageMeta;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class EnchantmentLimitManager extends Manager implements Listener {
+ private ConfigurationWrapper config;
+ private Map enchantmentLimits = new HashMap();
+ private boolean checkExsitingItem = false;
+ public EnchantmentLimitManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("enchantment-limiter.yml", this.getPlugin());
+ this.reload();
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @Override
+ public void reload() {
+ checkExsitingItem = this.config.getConfig().getBoolean("remove-invalid-enchantments" , false);
+ this.enchantmentLimits.clear();
+ for(String string : this.config.getConfig().getConfigurationSection("enchantment-limit").getKeys(false)){
+ int limit = this.config.getConfig().getInt("enchantment-limit." + string, Integer.MIN_VALUE);
+ if (limit == Integer.MIN_VALUE) {
+ this.getPlugin().getLogger().warning("Illegal level found for " + string + " in enchantment-limiter");
+ } else {
+ Enchantment enchantment = null;
+
+ try {
+ enchantment = Enchantment.getByName(string.toUpperCase());
+ } catch (IllegalArgumentException var6) {
+ this.getPlugin().getLogger().warning("Illegal enchantment " + string + " found in enchantment-limiter");
+ continue;
+ }
+ if(enchantment == null){
+ this.getPlugin().getLogger().warning("Null Enchantment at " + string);
+
+ }
+
+ this.enchantmentLimits.put(enchantment, Integer.valueOf(limit));
+ }
+ }
+
+ }
+
+ @EventHandler
+ public void onPlayerFish(PlayerFishEvent event){
+ if(event.getCaught() instanceof Item){
+ Item item = (Item) event.getCaught();
+ ItemStack stack = item.getItemStack();
+ if(apply(stack , true)){
+ item.setItemStack(stack);
+ }
+ }
+ }
+ @EventHandler
+ public void onItemPickup(PlayerPickupItemEvent event) {
+ if (event.getItem() != null && this.apply(event.getItem().getItemStack())) {
+ getPlugin().sendLocalized(event.getPlayer() , "ILLGEL_ENCHANTMENT");
+ }
+
+ }
+
+ @EventHandler
+ public void onPlayerInteract(PlayerInteractEvent event) {
+ if (this.apply(event.getItem())) {
+ getPlugin().sendLocalized(event.getPlayer() , "ILLGEL_ENCHANTMENT");
+ }
+
+ }
+
+ @EventHandler
+ public void onInventoryClick(InventoryClickEvent event) {
+ if(event.getSlotType() == SlotType.RESULT && event.getClickedInventory().getType() == InventoryType.ANVIL){
+ Inventory inventory = event.getInventory();
+ if (this.apply(event.getCursor() , true) || this.apply(event.getCurrentItem() , true)) {
+ getPlugin().sendLocalized((Player)event.getWhoClicked(), "ILLGEL_ENCHANTMENT");
+ }
+ }else if (this.apply(event.getCursor()) || this.apply(event.getCurrentItem())) {
+ getPlugin().sendLocalized((Player)event.getWhoClicked(), "ILLGEL_ENCHANTMENT");
+ }
+
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST)
+ public void onEntityDeath(EntityDeathEvent event){
+ if(event.getEntity() instanceof Player){
+ return;
+ }
+ for(ItemStack item : event.getDrops()){
+ apply(item , true);
+ }
+ }
+ @EventHandler
+ public void onEnchantItem(EnchantItemEvent event){
+ Iterator> iter = event.getEnchantsToAdd().entrySet().iterator();
+ boolean applied = false;
+ while(iter.hasNext()){
+ Entry value = iter.next();
+ if(this.enchantmentLimits.containsKey(value.getKey())){
+ int max = this.enchantmentLimits.get(value.getKey());
+ if(value.getValue() > max){
+ value.setValue(max);
+ applied = true;
+ }
+ if(value.getValue() <= 0){
+ iter.remove();
+ }
+ }
+ }
+
+ }
+ public boolean apply(ItemStack stack){
+ return this.apply(stack , false);
+ }
+
+ public boolean apply(ItemStack stack , boolean force) {
+ if (stack == null) {
+ return false;
+ } else {
+ if(!force && !checkExsitingItem && stack.getType() != Material.ENCHANTED_BOOK){
+ return false;
+ }
+ ItemMeta meta = stack.getItemMeta();
+ boolean applied = false;
+ if(meta instanceof EnchantmentStorageMeta){
+ EnchantmentStorageMeta enchantmentStorage = (EnchantmentStorageMeta) meta;
+ for(Enchantment enchantment : this.enchantmentLimits.keySet()){
+ if(enchantmentStorage.hasEnchant(enchantment)){
+ int level = enchantmentStorage.getStoredEnchantLevel(enchantment);
+ if (this.enchantmentLimits.containsKey(enchantment)) {
+ int max = this.enchantmentLimits.get(enchantment).intValue();
+ if (level > max) {
+ applied = true;
+ enchantmentStorage.removeStoredEnchant(enchantment);
+ if(max > 0){
+ enchantmentStorage.addStoredEnchant(enchantment, max , true);
+ }
+ }
+ }
+ }
+ }
+ stack.setItemMeta(enchantmentStorage);
+ }
+ for(Enchantment enchantment : this.enchantmentLimits.keySet()){
+ if(stack.containsEnchantment(enchantment)){
+ int level = stack.getEnchantmentLevel(enchantment);
+ if (this.enchantmentLimits.containsKey(enchantment)) {
+ int max = this.enchantmentLimits.get(enchantment).intValue();
+ if (level > max) {
+ applied = true;
+ stack.removeEnchantment(enchantment);
+ if(max > 0){
+ stack.addUnsafeEnchantment(enchantment, max);
+ }
+ }
+ }
+ }
+ }
+
+ return applied;
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EndWorldManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EndWorldManager.java
new file mode 100644
index 0000000..965abad
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EndWorldManager.java
@@ -0,0 +1,168 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.libhalt.bukkit.kaede.PlayerData;
+import org.bukkit.*;
+import org.bukkit.World.Environment;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityTeleportEvent;
+import org.bukkit.event.player.PlayerChangedWorldEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.bukkit.util.Vector;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+import java.io.IOException;
+
+public class EndWorldManager extends Manager implements Listener {
+ private Vector leave;
+ private float leaveYaw;
+ private float leavePitch;
+ private Vector enter;
+
+ private float enterYaw;
+ private float enterPitch;
+ private ConfigurationWrapper config;
+
+ public EndWorldManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("world-end.yml", this.getPlugin());
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ this.getPlugin().getCommand("setendexit").setExecutor(new CommandExecutor() {
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
+ Player player = ((Player)sender);
+ leave = player.getLocation().toVector();
+ leaveYaw = player.getLocation().getYaw();
+ leavePitch = player.getLocation().getPitch();
+ config.getConfig().set("end-exit" , leave.getBlockX() + "," + leave.getBlockY() + "," + leave.getBlockZ() + "," + leaveYaw + "," + leavePitch);
+ try {
+ config.getConfig().save(config.getFile());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ player.sendMessage("End exit set");
+ return true;
+ }
+ });
+ this.getPlugin().getCommand("setendspawn").setExecutor(new CommandExecutor() {
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
+ Player player = ((Player)sender);
+ enter = player.getLocation().toVector();
+ enterYaw = player.getLocation().getYaw();
+ enterPitch = player.getLocation().getPitch();
+ config.getConfig().set("end-spawn" , enter.getBlockX() + "," + enter.getBlockY() + "," + enter.getBlockZ() + "," + enterYaw + "," + enterPitch);
+ try {
+ config.getConfig().save(config.getFile());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ player.sendMessage("End spawn set");
+
+ return true;
+ }
+ });
+ this.reload();
+ }
+
+
+ @Override
+ public void reload() {
+
+ String string = this.config.getConfig().getString("end-exit");
+ String[] result = string.split(",");
+ leave = new Vector(Integer.valueOf(result[0]).intValue() , Integer.valueOf(result[1]).intValue() , Integer.valueOf(result[2]).intValue());
+ leaveYaw = Float.valueOf(result[3]);
+ leavePitch = Float.valueOf(result[4]);
+
+ YamlConfiguration actualConfig = YamlConfiguration.loadConfiguration(this.config.getFile());
+ if(actualConfig.contains("end-spawn")){
+ String enter = actualConfig.getString("end-spawn");
+ String[] resultenter = enter.split(",");
+ this.enter = new Vector(Integer.valueOf(resultenter[0]).intValue() , Integer.valueOf(resultenter[1]).intValue() , Integer.valueOf(resultenter[2]).intValue());
+ enterYaw = Float.valueOf(result[3]);
+
+ enterPitch = Float.valueOf(result[4]);
+ }
+ }
+ @EventHandler
+ public void onWorldTeleport(final PlayerChangedWorldEvent event){
+
+ new BukkitRunnable(){
+ @Override
+ public void run() {
+ PlayerData data = getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer());
+ if (data.getPvpTime() > 0) {
+ return;
+ }
+ final World world = getWorld(World.Environment.THE_END);
+ if(event.getPlayer().getWorld() == world){
+ event.getPlayer().teleport(enter.toLocation(world, enterYaw, enterPitch));
+ }
+ }
+ }.runTaskLater(getPlugin() , 1);
+ }
+ @EventHandler
+ public void onWorldChange(final PlayerTeleportEvent event){
+ if(event.getTo().getWorld() != event.getFrom().getWorld()){
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer());
+ if (data.getPvpTime() > 0) {
+ event.getPlayer().sendMessage(ChatColor.RED + "You may not change world while pvp timer is enabled.");
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+ @EventHandler
+ public void onPlayerMove(final PlayerMoveEvent event) {
+ final Location from = event.getFrom();
+ final Location to = event.getTo();
+ final Player player = event.getPlayer();
+ if ((from.getBlockX() != to.getBlockX() || from.getBlockZ() != to.getBlockZ() || from.getBlockY() != to.getBlockY())) {
+ World.Environment environment = player.getWorld().getEnvironment();
+ if (environment == World.Environment.NORMAL) {
+ if (player.getLocation().getBlock().getType() == Material.ENDER_PORTAL) {
+
+
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer());
+ if (data.getPvpTime() > 0) {
+ return;
+ }
+ final World world = this.getWorld(World.Environment.THE_END);
+ player.teleport(enter.toLocation(world, enterYaw, enterPitch));
+ }
+ }else if(environment == World.Environment.THE_END) {
+ if( (player.getLocation().add(0.0, -1.0, 0.0).getBlock().getType() == Material.STATIONARY_WATER || player.getLocation().getBlock().getType() == Material.STATIONARY_WATER)) {
+
+ final World world = this.getWorld(World.Environment.NORMAL);
+ player.teleport(leave.toLocation(world ,leaveYaw , leavePitch));
+
+ }
+ }
+ }
+ }
+
+ public World getWorld(final World.Environment environment) {
+ for (final World world : Bukkit.getWorlds()) {
+ if (world.getEnvironment() == environment) {
+ return world;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnderPearlManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnderPearlManager.java
new file mode 100644
index 0000000..5708ddc
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnderPearlManager.java
@@ -0,0 +1,97 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.syuu.common.utils.PlayerUtils;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Event.Result;
+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.player.PlayerInteractEvent;
+import org.bukkit.event.player.PlayerKickEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class EnderPearlManager extends Manager implements Listener {
+
+ public static Map expire = new HashMap();
+ private ConfigurationWrapper config;
+ private long cooldownDuration = 10000L;
+
+ public EnderPearlManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("cooldowns.yml", this.getPlugin());
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ reload();
+ }
+
+ @Override
+ public void reload() {
+ this.cooldownDuration = this.config.getConfig().getInt("enderpearl-cooldown") * 1000L;
+ }
+
+ public long getMillisecondLeft(Player player) {
+ return this.expire.containsKey(player) ? Math.max(this.expire.get(player).longValue() - System.currentTimeMillis(), 0L) : 0L;
+ }
+
+ public static boolean isCooldownActive(Player player) {
+ return EnderPearlManager.expire.containsKey(player) ? System.currentTimeMillis() < EnderPearlManager.expire.get(player).longValue() : false;
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ this.expire.remove(event.getPlayer());
+ }
+
+ @EventHandler
+ public void onPlayerKick(PlayerKickEvent event) {
+ this.expire.remove(event.getPlayer());
+ }
+
+ @EventHandler(priority = EventPriority.MONITOR )
+ public void onPlayerTeleport(PlayerTeleportEvent event){
+ if(event.getCause() == PlayerTeleportEvent.TeleportCause.ENDER_PEARL) {
+ if (event.isCancelled() || event.getTo().equals(event.getFrom())) {
+ this.expire.remove(event.getPlayer());
+ }
+ }
+ }
+ @EventHandler(priority = EventPriority.MONITOR )
+ public void onPlayerInteract(PlayerInteractEvent event) {
+ if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.hasItem() && event.getItem().getType() == Material.ENDER_PEARL) {
+ final Block block = event.getClickedBlock();
+ if (block.getType().isSolid() && !(block.getState() instanceof InventoryHolder)) {
+ return;
+ }
+ }
+ Action action = event.getAction();
+ if (event.hasItem() && event.getItem().getType() == Material.ENDER_PEARL && (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK)) {
+ Player player = event.getPlayer();
+ PlayerUtils.updateInventory(player);
+
+ if (this.isCooldownActive(player)) {
+ event.setUseItemInHand(Result.DENY);
+ int time = (int) (this.getMillisecondLeft(player) / 1000.0D);
+ getPlugin().sendLocalized(player, "ENDERPEARL_COOLDOWN", String.valueOf(time));
+ } else {
+ this.expire.put(player, Long.valueOf(System.currentTimeMillis() + this.cooldownDuration));
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnderchestDisableManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnderchestDisableManager.java
new file mode 100644
index 0000000..83b4a43
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/EnderchestDisableManager.java
@@ -0,0 +1,29 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import org.bukkit.Material;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class EnderchestDisableManager extends Manager implements Listener {
+ public EnderchestDisableManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @EventHandler
+ public void onPlayerInteract(PlayerInteractEvent event) {
+ if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == Material.ENDER_CHEST && !event.getPlayer().hasPermission("disabled.bypass.enderchest")) {
+ event.setCancelled(true);
+ }
+
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FasterTileEntityManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FasterTileEntityManager.java
new file mode 100644
index 0000000..f8d8710
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FasterTileEntityManager.java
@@ -0,0 +1,116 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.block.BlockState;
+import org.bukkit.block.BrewingStand;
+import org.bukkit.block.Furnace;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.inventory.FurnaceBurnEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class FasterTileEntityManager /*extends Manager implements Listener */{
+ /*
+ private ConfigurationWrapper config;
+ private Map activeStands = new HashMap();
+ private int brewingStandMultipliar;
+ private int furnaceMultipliar;
+
+ public FasterTileEntityManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("tile-entity-multiplier.yml", this.getPlugin());
+ this.reload();
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ (new FasterTileEntityManager.BrewingUpdateTask()).runTaskTimer(this.getPlugin(), 1L, 1L);
+ }
+
+ @Override
+ public void reload() {
+ this.brewingStandMultipliar = this.config.getConfig().getInt("potionbrewer-speed-multiplier") - 1;
+ this.furnaceMultipliar = this.config.getConfig().getInt("furnace-speed-multiplier") - 1;
+ }
+
+ @EventHandler
+ public void onPlayerInteract(PlayerInteractEvent event) {
+ if (this.brewingStandMultipliar > 1 && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
+ BlockState state = event.getClickedBlock().getState();
+ if (state instanceof BrewingStand) {
+ this.activeStands.put(state.getLocation(), (BrewingStand) state);
+ }
+ }
+
+ }
+
+ @EventHandler
+ public void onFurnaceBurn(FurnaceBurnEvent event) {
+ BlockState state = event.getBlock().getState();
+ if (this.furnaceMultipliar > 1 && state instanceof Furnace) {
+ (new FasterTileEntityManager.FurnaceUpdateTask((Furnace) state)).runTaskTimer(this.getPlugin(), 1L, 1L);
+ }
+
+ }
+
+ public class BrewingUpdateTask extends BukkitRunnable {
+ @Override
+ public void run() {
+ Iterator> iter = FasterTileEntityManager.this.activeStands.entrySet().iterator();
+
+ while (iter.hasNext()) {
+ Entry entry = iter.next();
+ if ((!entry.getValue().getChunk().isLoaded() ) || entry.getKey().getBlock().getType() != Material.BREWING_STAND) {
+ iter.remove();
+ } else {
+ BrewingStand stand = entry.getValue();
+ if (stand.getBrewingTime() > 1) {
+ stand.setBrewingTime(Math.max(1, stand.getBrewingTime() - FasterTileEntityManager.this.brewingStandMultipliar));
+ }
+ }
+ }
+
+ }
+ }
+
+ public class FurnaceUpdateTask extends BukkitRunnable {
+ private Furnace furnace;
+
+ public FurnaceUpdateTask(Furnace furnace) {
+ this.furnace = furnace;
+ }
+
+ @Override
+ public void run() {
+ if(furnace.getLocation().getBlock().getType() != Material.BURNING_FURNACE && furnace.getLocation().getBlock().getType() != Material.FURNACE ){
+ this.cancel();
+ return;
+ }
+ if (this.furnace.getBurnTime() <= 1) {
+ this.cancel();
+ return;
+ }
+ this.furnace.setCookTime((short) (this.furnace.getCookTime() + FasterTileEntityManager.this.furnaceMultipliar));
+ this.furnace.setBurnTime((short) Math.max(1, this.furnace.getBurnTime() - FasterTileEntityManager.this.furnaceMultipliar));
+ this.furnace.update();
+ if (this.furnace.getBurnTime() <= 1) {
+ this.cancel();
+ }
+
+ }
+ }
+ */
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FoundDiamondManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FoundDiamondManager.java
new file mode 100644
index 0000000..b66cd22
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FoundDiamondManager.java
@@ -0,0 +1,96 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import com.google.common.collect.Sets;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+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.BlockBreakEvent;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.metadata.FixedMetadataValue;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+import java.util.Set;
+import java.util.UUID;
+
+public class FoundDiamondManager extends Manager implements Listener {
+ private FixedMetadataValue tag;
+ private Set noNotifications = Sets.newHashSet();
+
+ public FoundDiamondManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ this.tag = new FixedMetadataValue(this.getPlugin(), Boolean.TRUE);
+ getPlugin().getCommand("td").setExecutor(new CommandExecutor() {
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String s, String[] strings) {
+ UUID uuid = ((Player)sender).getUniqueId();
+ if(noNotifications.contains(uuid)){
+ noNotifications.remove(uuid);
+ getPlugin().sendLocalized((Player)sender , "FOUND_DIAMOND_NOTIFICATION_ON");
+ }else{
+ noNotifications.add(uuid);
+ getPlugin().sendLocalized((Player)sender , "FOUND_DIAMOND_NOTIFICATION_OFF");
+ }
+ return false;
+ }
+ });
+ }
+
+ @EventHandler
+ public void onPlayerQUit(PlayerQuitEvent event){
+ noNotifications.remove(event.getPlayer().getUniqueId());
+ }
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ Block block = event.getBlock();
+ if (block.getType() == Material.DIAMOND_ORE) {
+ block.setMetadata("PlacedBlock", this.tag);
+ }
+
+ }
+
+ @EventHandler
+ public void onBlockBreak(BlockBreakEvent event) {
+ Block base = event.getBlock();
+ if (base.getType() == Material.DIAMOND_ORE && !base.hasMetadata("PlacedBlock")) {
+ int total = 0;
+
+ for (int x = -3; x < 4; ++x) {
+ for (int y = -3; y < 4; ++y) {
+ for (int z = -3; z < 4; ++z) {
+ Block block = event.getBlock().getRelative(x, y, z);
+ if (block.getType() == Material.DIAMOND_ORE && !block.hasMetadata("PlacedBlock")) {
+ ++total;
+ block.setMetadata("PlacedBlock", this.tag);
+ }
+ }
+ }
+ }
+ for(Player player : Bukkit.getOnlinePlayers()){
+ if(!noNotifications.contains(player.getUniqueId())){
+ if(total <= 1){
+ player.sendMessage("[FD] " + ChatColor.AQUA + event.getPlayer().getName() + " found " + total + " diamond.");
+ }else {
+ player.sendMessage("[FD] " + ChatColor.AQUA + event.getPlayer().getName() + " found " + total + " diamonds.");
+ }
+ }
+ }
+ }
+
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FreezeManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FreezeManager.java
new file mode 100644
index 0000000..55524cb
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/FreezeManager.java
@@ -0,0 +1,158 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+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.PotionSplashEvent;
+import org.bukkit.event.entity.ProjectileLaunchEvent;
+import org.bukkit.event.player.PlayerKickEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class FreezeManager extends Manager implements Listener, CommandExecutor {
+ private List frozen = new ArrayList();
+
+ public FreezeManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ (new BukkitRunnable() {
+ @Override
+ public void run() {
+ for(Player player : frozen){
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588\u2588\u2588");
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588\u2588");
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588");
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588 " + getPlugin().getLocalized(player, "FREEZE_MESSAGE"));
+ player.sendMessage(ChatColor.WHITE + "\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.BLACK + "\u2588" + ChatColor.GOLD + "\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588\u2588" + getPlugin().getLocalized(player, "FREEZE_MESSAGE_LINE2"));
+ player.sendMessage(ChatColor.WHITE + "\u2588" + ChatColor.RED + "\u2588" + ChatColor.GOLD + "\u2588\u2588\u2588" + ChatColor.BLACK + ChatColor.GOLD + "\u2588\u2588" + ChatColor.RED + "\u2588" + ChatColor.WHITE + "\u2588");
+ player.sendMessage(new StringBuilder().append(ChatColor.WHITE).append(ChatColor.RED).append("\u2588").append(ChatColor.GOLD).append("\u2588\u2588\u2588").append(ChatColor.BLACK).append("\u2588").append(ChatColor.GOLD).append("\u2588\u2588\u2588").append(ChatColor.RED).append("\u2588").append(ChatColor.WHITE).toString());
+ player.sendMessage(ChatColor.RED + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588");
+ }
+
+ }
+ }).runTaskTimer(this.getPlugin(), 100L, 100L);
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ this.getPlugin().getCommand("ss").setExecutor(this);
+ }
+
+ @EventHandler
+ public void onMove(PlayerMoveEvent event) {
+ Location from = event.getFrom();
+ Location to = event.getTo();
+ if ((from.getX() != to.getX() || from.getZ() != to.getZ()) && this.frozen.contains(event.getPlayer())) {
+ event.setTo(event.getFrom());
+ }
+
+ }
+ @EventHandler
+ public void onProjectileLaunch(ProjectileLaunchEvent event){
+ if(frozen.contains(event.getEntity().getShooter())){
+ event.setCancelled(true);
+ }
+ }
+ @EventHandler
+ public void onEntityDamageByEntity(EntityDamageByEntityEvent event){
+ if(frozen.contains(event.getEntity())){
+ event.setCancelled(true);
+ }
+ if(frozen.contains(event.getDamager())){
+ event.setCancelled(true);
+ }
+ if (event.getDamager() instanceof Projectile) {
+ Projectile projectile1 = (Projectile) event.getDamager();
+ if (projectile1.getShooter() instanceof Player) {
+ Player player = (Player) projectile1.getShooter();
+ if(frozen.contains(player)){
+ event.setCancelled(true);
+ }
+ }
+ }
+ }
+ @EventHandler
+ public void onPlayerTelport(PlayerTeleportEvent event){
+ if(event.getCause() == TeleportCause.ENDER_PEARL && this.frozen.contains(event.getPlayer())){
+ event.setTo(event.getFrom());
+ }
+ }
+
+ @EventHandler
+ public void onSplash(PotionSplashEvent event) {
+ if(!frozen.isEmpty()){
+ try {
+ Field eventField = PotionSplashEvent.class.getDeclaredField("affectedEntities");
+ eventField.setAccessible(true);
+ Map, ?> affectedEntities = (Map, ?>)eventField.get(event);
+ Iterator> iterator = affectedEntities.entrySet().iterator();
+ while(iterator.hasNext()) {
+ Entry, ?> entry = (Entry, ?>)iterator.next();
+ if(frozen.contains(entry.getKey())) {
+ iterator.remove();
+ }
+ }
+ eventField.set(event, affectedEntities);
+ }catch(Exception exception) {
+ }
+ }
+
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ this.frozen.remove(event.getPlayer());
+ }
+
+ @EventHandler
+ public void onPlayerKick(PlayerKickEvent event) {
+ this.frozen.remove(event.getPlayer());
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command arg1, String arg2, String[] args) {
+ if (sender.hasPermission("command.ss.use")) {
+ if (args.length == 0) {
+ sender.sendMessage(ChatColor.RED + "/ss ");
+ } else {
+ Player player = this.getPlugin().getServer().getPlayer(args[0]);
+ if (player == null) {
+ sender.sendMessage(ChatColor.RED + args[0] + " is not online");
+ return true;
+ }
+
+ if (!this.frozen.contains(player)) {
+ sender.sendMessage(ChatColor.RED + "You have frozen " + player.getName());
+ this.frozen.add(player);
+ } else {
+ sender.sendMessage(ChatColor.RED + "You have un-frozen " + player.getName());
+ this.frozen.remove(player);
+ }
+ }
+ } else {
+ sender.sendMessage(ChatColor.RED + "No Permission");
+ }
+
+ return true;
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GMelonManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GMelonManager.java
new file mode 100644
index 0000000..6994bb5
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GMelonManager.java
@@ -0,0 +1,37 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.Material;
+import org.bukkit.Server;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.Recipe;
+import org.bukkit.inventory.ShapedRecipe;
+import org.bukkit.inventory.ShapelessRecipe;
+
+public class GMelonManager extends Manager implements Listener {
+ public GMelonManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+
+ final Server server = getPlugin().getServer();
+ final ShapelessRecipe gmelon = new ShapelessRecipe(new ItemStack(Material.SPECKLED_MELON));
+ gmelon.addIngredient(1, Material.GOLD_NUGGET);
+ gmelon.addIngredient(1, Material.MELON);
+ server.addRecipe((Recipe)gmelon);
+ ShapedRecipe shapedRecipe = new ShapedRecipe(new ItemStack(Material.GOLDEN_APPLE));
+ shapedRecipe.shape(" G " , "GAG" , " G ");
+ shapedRecipe.setIngredient('G' , Material.GOLD_INGOT);
+ shapedRecipe.setIngredient('A' , Material.APPLE);
+ server.addRecipe(shapedRecipe);
+ }
+
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GappleManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GappleManager.java
new file mode 100644
index 0000000..4e8ed23
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GappleManager.java
@@ -0,0 +1,80 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.Server;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerItemConsumeEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.Recipe;
+import org.bukkit.inventory.ShapelessRecipe;
+
+import java.util.HashMap;
+
+public class GappleManager extends Manager implements Listener , CommandExecutor {
+ private HashMap player_cooldown;
+ private ConfigurationWrapper config;
+
+ public YamlConfiguration getConfig(){
+ return config.getConfig();
+ }
+ public GappleManager(HCFactionPlugin plugin) {
+ super(plugin);
+ this.player_cooldown = new HashMap();
+ }
+
+ @Override
+ public void init() {
+ getPlugin().getServer().getPluginManager().registerEvents(this , getPlugin());
+ this.config = new ConfigurationWrapper("gapple.yml", this.getPlugin());
+ getPlugin().getCommand("gapplecooldown").setExecutor(this);
+ }
+
+ public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
+ final Player p = (Player)sender;
+ if (!sender.hasPermission("gapplecooldown.version")) {
+ p.sendMessage(ChatColor.translateAlternateColorCodes('&', this.getConfig().getString("NoPermission message")));
+ }
+ else if (sender.hasPermission("gapplecooldown.version")) {
+ p.sendMessage("This server is running GappleCooldown " + ChatColor.RED + "v1.0.1" + ChatColor.RESET + ".");
+ }
+ return false;
+ }
+
+ @EventHandler
+ public void Gapple_Cooldown(final PlayerItemConsumeEvent e) {
+ final Player p = e.getPlayer();
+ final ItemStack apple = new ItemStack(Material.GOLDEN_APPLE, 1, (short)1);
+ if (e.getItem().getType().equals((Object)Material.GOLDEN_APPLE) && e.getItem().getData().equals((Object)apple.getData())) {
+ if (!this.player_cooldown.containsKey(p.getName())) {
+ this.player_cooldown.put(p.getName(), false);
+ e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', this.getConfig().getString("Eat message")));
+ }
+ if (!this.player_cooldown.get(p.getName())) {
+ Bukkit.getScheduler().runTaskLater(getPlugin(), (Runnable)new Runnable() {
+ @Override
+ public void run() {
+ player_cooldown.put(p.getName(), false);
+ p.sendMessage(ChatColor.translateAlternateColorCodes('&', getConfig().getString("Expiry message")));
+ }
+ }, (long)(this.getConfig().getInt("Cooldown time") * 1200));
+ this.player_cooldown.put(p.getName(), true);
+ }
+ else {
+ e.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', this.getConfig().getString("Cooldown message")));
+ e.setCancelled(true);
+ }
+ }
+ }
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GlassManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GlassManager.java
new file mode 100644
index 0000000..a8a4ea2
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/GlassManager.java
@@ -0,0 +1,275 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.PlayerData;
+import net.libhalt.bukkit.kaede.support.IRegion;
+import net.libhalt.bukkit.kaede.support.RegionSupport;
+import net.libhalt.bukkit.kaede.support.Support;
+import net.libhalt.bukkit.kaede.support.builtin.ShockDTRFactionRegion;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.common.command.CommandRegistry;
+import net.syuu.common.command.annotation.SimpleCommand;
+import net.syuu.popura.Popura;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.claim.Position2D;
+import net.syuu.popura.faction.FactionType;
+import net.syuu.popura.faction.bean.ClaimedRegion;
+import net.syuu.popura.faction.bean.Faction;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class GlassManager extends Manager implements Listener
+{
+ private Map> pvpTagCaches = Maps.newHashMap();
+ private Map> combatTagCaches = Maps.newHashMap();
+ private Faction orecave = null;
+
+ public GlassManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ public void init(){
+ getPlugin().getServer().getPluginManager().registerEvents(this , getPlugin());
+ new BukkitRunnable(){
+ @Override
+ public void run() {
+ refetchAndCache();
+ }
+ }.runTaskLater(getPlugin() , 5);
+ new BukkitRunnable(){
+ @Override
+ public void run() {
+ refetchAndCache();
+ }
+ }.runTaskLater(getPlugin() , 300);
+ CommandRegistry.getInstance().registerSimpleCommand(this);
+ }
+ @SimpleCommand(name = "glassplayermap" , requireop = true)
+ public void send (Player player , String[] args){
+ player.sendMessage(combatTagCaches.containsKey(player.getUniqueId()) ? combatTagCaches.get(player.getUniqueId()).toString() : "null");
+ player.sendMessage(pvpTagCaches.containsKey(player.getUniqueId()) ? pvpTagCaches.get(player.getUniqueId()).toString() : "null");
+
+ }
+
+ public void refetchAndCache(){
+ pvpTagCaches = Maps.newHashMap();
+ combatTagCaches = Maps.newHashMap();
+ orecave= PopuraPlugin.getInstance().getPopura().getFactionDataManager().getFaction("OreCave");
+
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event){
+ combatTagCaches.remove(event.getPlayer().getUniqueId());
+ pvpTagCaches.remove(event.getPlayer().getUniqueId());
+ }
+
+ public void calculateAndCache(Player player) {
+ List cached = Lists.newArrayList();
+ List combatCached = Lists.newArrayList();
+
+ for (ClaimedRegion claimedRegion : PopuraPlugin.getInstance().getPopura().getFactionDataManager().getClaimedRegions()) {
+ if(claimedRegion.getWorld().equals(player.getWorld().getName())) {
+ Location location = player.getLocation();
+ Location regionMaxLocation = location.clone();
+ Location regionMinLocation = location.clone();
+ regionMaxLocation.setX(claimedRegion.getMaxX());
+ regionMaxLocation.setZ(claimedRegion.getMaxZ());
+ regionMinLocation.setX(claimedRegion.getMinX());
+ regionMinLocation.setZ(claimedRegion.getMinZ());
+ if(location.distanceSquared(regionMaxLocation) < Math.pow(16 * 12 , 2) || location.distanceSquared(regionMinLocation) < Math.pow(16 * 12 , 2)) {
+ ShockDTRFactionRegion region = new ShockDTRFactionRegion(claimedRegion);
+ if (!region.canPvPTimedPlayerEnter((FactionPlayer) null)) {
+ cached.add(region);
+ }
+ if(!region.canCombatTagedPlayerEnter()){
+ combatCached.add(region);
+ }
+ }
+ }
+ }
+ combatTagCaches.put(player.getUniqueId() , combatCached);
+ pvpTagCaches.put(player.getUniqueId() , cached);
+ }
+ @EventHandler
+ public void onRegionCacheInvalidate(net.syuu.popura.event.RegionCacheInvalidateEvent event){
+ refetchAndCache();
+ }
+ @EventHandler
+ public void onPlayerTeleport(final PlayerTeleportEvent event) {
+ if (event.getCause() == PlayerTeleportEvent.TeleportCause.ENDER_PEARL) {
+ this.onPlayerMoved((PlayerMoveEvent)event);
+ }
+ }
+
+ @EventHandler
+ public void onPlayerMoved(PlayerMoveEvent event) {
+ Location from = event.getFrom();
+ Location to = event.getTo();
+ if((int)(from.getChunk().getX() / 3.0D) != (int)(to.getChunk().getX() / 3.0D)|| (int)(from.getChunk().getZ() / 3.0D) != (int)(to.getChunk().getZ() / 3.0D)){
+ calculateAndCache(event.getPlayer());
+ }
+ if(from.getBlockX() != to.getBlockX() || to.getBlockZ() != from.getBlockZ()){
+ if(getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer()) == null){
+ return;
+ }
+ boolean renderPvPTag = ((!getPlugin().isDisabled(PvPTimerManager.class) && getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer()).getPvpTime() > 0 ));
+ boolean combatTag = PopuraPlugin.getInstance().getPopura().getCombatTagManager().isCombatTagActive(event.getPlayer());
+ boolean isKitmap = getPlugin().isDisabled(PvPTimerManager.class);
+
+ boolean rendered = false;
+ List locations = Lists.newArrayList();
+ if(combatTag){
+ List combatTagCache = combatTagCaches.get(event.getPlayer().getUniqueId());
+ if(combatTagCache == null){
+ calculateAndCache(event.getPlayer());
+ combatTagCache = combatTagCaches.get(event.getPlayer().getUniqueId());
+ }
+ String worldName = to.getWorld().getName();
+ for(IRegion region : combatTagCache){
+ if(region.getWorld().equals(worldName)) {
+ if (Support.getInstance().isInIgnoreWorld(region, to)) {
+ event.setTo(from);
+ }
+ locations.addAll(this.renderGlass(region, event.getPlayer(), to));
+
+ }
+ }
+ }else if(renderPvPTag){
+ FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(event.getPlayer());
+ String worldName = to.getWorld().getName();
+ List pvpTagCache = pvpTagCaches.get(event.getPlayer().getUniqueId());
+ if(pvpTagCache == null){
+ calculateAndCache(event.getPlayer());
+ pvpTagCache = pvpTagCaches.get(event.getPlayer().getUniqueId());
+ }
+ for(IRegion region : pvpTagCache){
+ if(region.getWorld().equals(worldName)) {
+ if (region instanceof ShockDTRFactionRegion) {
+ if (!((ShockDTRFactionRegion) region).canPvPTimedPlayerEnter(factionPlayer)) {
+ if (Support.getInstance().isInIgnoreWorld(region, to)) {
+ event.setTo(from);
+ }
+ locations.addAll(this.renderGlass(region, event.getPlayer(), to));
+ }
+ } else {
+ if (!region.canPvPTimedPlayerEnter(event.getPlayer())) {
+ if (Support.getInstance().isInIgnoreWorld(region, to)) {
+ event.setTo(from);
+ }
+ locations.addAll(this.renderGlass(region, event.getPlayer(), to));
+ }
+ }
+ }
+ }
+ } else if(isKitmap){
+ if(event.getPlayer().getInventory().getHelmet() == null) {
+
+ ClaimedRegion fromRegion = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getClaimedRegionAt(new Position2D(from.getWorld().getName(), from.getBlockX(), from.getBlockZ()));
+ ClaimedRegion toRegion = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getClaimedRegionAt(new Position2D(to.getWorld().getName(), to.getBlockX(), to.getBlockZ()));
+
+
+ if (fromRegion != null && fromRegion != toRegion) {
+ if (fromRegion.getOwner().getName().equalsIgnoreCase("Spawn")){
+ event.setTo(from);
+ }
+ }
+ if(fromRegion != null && fromRegion.getOwner().getName().equalsIgnoreCase("Spawn")){
+ locations.addAll(this.renderGlass(new ShockDTRFactionRegion(fromRegion), event.getPlayer(), to));
+
+ }
+ }
+ }
+ if(orecave != null) {
+ locations.addAll(this.renderGlass(new ShockDTRFactionRegion(orecave.getClaimedRegion()), event.getPlayer(), to));
+
+ }
+ if(locations.isEmpty()) {
+ PopuraPlugin.getInstance().getPopura().getCombatTagManager().removeGlass(event.getPlayer());
+
+ }else{
+ PopuraPlugin.getInstance().getPopura().getCombatTagManager().update(event.getPlayer(), locations);
+ }
+ }
+
+ }
+ public List renderGlass(IRegion spawn, Player player, Location to) {
+ if (spawn == null) {
+ return Lists.newArrayList();
+ } else {
+ int closerx = closestNumber(to.getBlockX(),spawn.getMinX(), spawn.getMaxX() );
+ int closerz = closestNumber(to.getBlockZ(),spawn.getMinZ(), spawn.getMaxZ());
+ boolean updateX = Math.abs(to.getX() - closerx) < 10.0D;
+ boolean updateZ = Math.abs(to.getZ() - closerz) < 10.0D;
+ if (!updateX && !updateZ) {
+ return Lists.newArrayList();
+ } else {
+ List toUpdate = new ArrayList();
+ int y;
+ int x;
+ Location location;
+ if (updateX) {
+ for (y = -2; y < 3; ++y) {
+ for (x = -4; x < 4; ++x) {
+ if (isInBetween(spawn.getMinZ(), spawn.getMaxZ(), to.getBlockZ() + x)) {
+ location = new Location(to.getWorld(), closerx, to.getBlockY() + y, to.getBlockZ() + x);
+ if (!toUpdate.contains(location) && !location.getBlock().getType().isOccluding()) {
+ toUpdate.add(location);
+ }
+ }
+ }
+ }
+ }
+
+ if (updateZ) {
+ for (y = -2; y < 3; ++y) {
+ for (x = -4; x < 4; ++x) {
+ if (isInBetween(spawn.getMinX(), spawn.getMaxX(), to.getBlockX() + x)) {
+ location = new Location(to.getWorld(), to.getBlockX() + x, to.getBlockY() + y, closerz);
+ if (!toUpdate.contains(location) && !location.getBlock().getType().isOccluding()) {
+ toUpdate.add(location);
+ }
+ }
+ }
+ }
+ }
+ return toUpdate;
+ }
+ }
+ }
+
+ public static boolean isInBetween(final int xone, final int xother, final int mid) {
+ final int distance = Math.abs(xone - xother);
+ return distance == Math.abs(mid - xone) + Math.abs(mid - xother);
+ }
+
+ public static int closestNumber(final int from, final int... numbers) {
+ int distance = Math.abs(numbers[0] - from);
+ int idx = 0;
+ for (int c = 1; c < numbers.length; ++c) {
+ final int cdistance = Math.abs(numbers[c] - from);
+ if (cdistance < distance) {
+ idx = c;
+ distance = cdistance;
+ }
+ }
+ return numbers[idx];
+ }
+
+
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/HideStreamManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/HideStreamManager.java
new file mode 100644
index 0000000..4c50b83
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/HideStreamManager.java
@@ -0,0 +1,43 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.Material;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.PrepareItemCraftEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class HideStreamManager extends Manager implements Listener{
+
+ public HideStreamManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ getPlugin().getServer().getPluginManager().registerEvents(this, getPlugin());
+
+ }
+
+
+ @EventHandler
+ public void onCraft(PlayerJoinEvent event){
+ event.setJoinMessage(null);
+ }
+ @EventHandler
+ public void onCraft(PlayerQuitEvent event){
+ event.setQuitMessage(null);
+ }
+
+
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/HungerFixManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/HungerFixManager.java
new file mode 100644
index 0000000..7e75108
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/HungerFixManager.java
@@ -0,0 +1,36 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.FoodLevelChangeEvent;
+import org.bukkit.event.entity.PotionSplashEvent;
+import org.bukkit.event.player.PlayerItemConsumeEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.projectiles.ProjectileSource;
+
+import java.util.List;
+import java.util.Random;
+
+public class HungerFixManager extends Manager implements Listener {
+
+ public HungerFixManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @EventHandler
+ public void FixIt(final FoodLevelChangeEvent e) {
+ if (e.getFoodLevel() < ((Player)e.getEntity()).getFoodLevel() && new Random().nextInt(100) > 4) {
+ e.setCancelled(true);
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/LootingManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/LootingManager.java
new file mode 100644
index 0000000..35c3de7
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/LootingManager.java
@@ -0,0 +1,34 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityDeathEvent;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class LootingManager extends Manager implements Listener {
+ public LootingManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @EventHandler
+ public void onEntityDeath(EntityDeathEvent event) {
+ double multiplier = 1.5D;
+ if (event.getEntity().getKiller() != null) {
+ Player player = event.getEntity().getKiller();
+ if (player.getItemInHand() != null && player.getItemInHand().containsEnchantment(Enchantment.LOOT_BONUS_MOBS)) {
+ multiplier = player.getItemInHand().getEnchantmentLevel(Enchantment.LOOT_BONUS_MOBS) + 1;
+ }
+ }
+
+ event.setDroppedExp((int) (event.getDroppedExp() * multiplier));
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/MiscDisableManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/MiscDisableManager.java
new file mode 100644
index 0000000..f3c6319
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/MiscDisableManager.java
@@ -0,0 +1,76 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.faction.bean.FactionPlayer;
+import org.bukkit.Material;
+import org.bukkit.World.Environment;
+import org.bukkit.block.Block;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.entity.EntityExplodeEvent;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.event.entity.EntitySpawnEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+public class MiscDisableManager extends Manager implements Listener {
+ public MiscDisableManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @EventHandler
+ public void onEntityExplode(EntityExplodeEvent event) {
+ event.blockList().clear();
+ }
+
+ @EventHandler
+ public void onBlockPlace(BlockPlaceEvent event) {
+ Block block = event.getBlock();
+ if (block.getType() == Material.MOB_SPAWNER && block.getWorld().getEnvironment() == Environment.NETHER) {
+ FactionPlayer factionPlayer = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getPlayer(event.getPlayer());
+ if(factionPlayer != null && factionPlayer.getFaction() != null && factionPlayer.getFaction().getName().equalsIgnoreCase("GlowstoneMtn")){
+ return;
+ }
+ event.setCancelled(true);
+ getPlugin().sendLocalized(event.getPlayer(), "NETHER_SPAWNER_PROTECTED");
+ }
+
+ }
+ @EventHandler
+ public void onBlockBreak(final EntitySpawnEvent event) {
+ if(event.getEntity() instanceof LivingEntity && !(event.getEntity() instanceof Player)){
+ new BukkitRunnable(){
+ @Override
+ public void run() {
+
+ LivingEntity livingEntity = (LivingEntity) event.getEntity();
+ livingEntity.getEquipment().setHelmet(null);
+ livingEntity.getEquipment().setChestplate(null);
+ livingEntity.getEquipment().setLeggings(null);
+ livingEntity.getEquipment().setBoots(null);
+ livingEntity.getEquipment().setItemInHand(null);
+ livingEntity.setCanPickupItems(false);
+ }
+ }.runTaskLater(getPlugin() , 3);
+ }
+
+ }
+ @EventHandler
+ public void onBlockBreak(BlockBreakEvent event) {
+ Block block = event.getBlock();
+ if (block.getType() == Material.MOB_SPAWNER && block.getWorld().getEnvironment() == Environment.NETHER) {
+ event.setCancelled(true);
+ getPlugin().sendLocalized(event.getPlayer(), "NETHER_SPAWNER_PROTECTED");
+ }
+
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/MobMergeListener.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/MobMergeListener.java
new file mode 100644
index 0000000..416c0be
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/MobMergeListener.java
@@ -0,0 +1,125 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.libhalt.dev.plugin.armor.utils.Color;
+import org.apache.commons.lang.WordUtils;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.entity.*;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDeathEvent;
+import org.bukkit.event.entity.EntityPortalEnterEvent;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+import java.util.List;
+
+public class MobMergeListener extends Manager implements Listener {
+ public MobMergeListener(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+
+ @Override
+ public void init() {
+ new BukkitRunnable() {
+ public void run() {
+ for (final World world : getPlugin().getServer().getWorlds()) {
+ if (world.getEnvironment() != World.Environment.THE_END) {
+ for (final Entity entity : world.getEntities()) {
+ if (entity instanceof Monster || entity instanceof Cow) {
+ final LivingEntity living = (LivingEntity)entity;
+ if (entity.isDead()) {
+ continue;
+ }
+ List nearBy = entity.getNearbyEntities(3.0, 3.0, 3.0);
+ if(entity instanceof Cow){
+ int cowCount = 0;
+ for(Entity entity1 : nearBy){
+ if(entity1 instanceof Cow){
+ cowCount ++;
+ }
+ }
+ if(cowCount < 33){
+ continue;
+ }
+ }
+ for (final Entity otherEntity : nearBy) {
+ if (entity.getType() == otherEntity.getType() && otherEntity != living && !otherEntity.isDead()) {
+ final LivingEntity otherMonster = (LivingEntity)otherEntity;
+ int increment = 1;
+ final String name = getNameForEntity(otherEntity.getType());
+ if (otherMonster.getCustomName() != null && otherMonster.getCustomName().endsWith(name)) {
+ increment = Integer.valueOf(ChatColor.stripColor(otherMonster.getCustomName().replace(name, "").trim()));
+ }
+ if (living.getCustomName() != null && living.getCustomName().endsWith(name)) {
+ final String customName = living.getCustomName().replace(name, "").trim();
+ final int value = Integer.valueOf(ChatColor.stripColor(customName));
+ living.setCustomName(Color.translate("&a&l") + (Math.min(300 , value + increment)) + name);
+ living.setCustomNameVisible(false);
+ }else {
+ living.setCustomName(Color.translate("&a&l")+ (Math.min(300 , 1 + increment)) + name);
+ living.setCustomNameVisible(false);
+ }
+ otherMonster.remove();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }.runTaskTimer((Plugin)this.getPlugin(), 50L, 50L);
+ this.getPlugin().getServer().getPluginManager().registerEvents((Listener)this, (Plugin)this.getPlugin());
+ }
+
+ public String getNameForEntity(final EntityType entityType) {
+ return " " + Color.translate("&f&l")+ WordUtils.capitalize(entityType.name().replace("_", " ").toLowerCase());
+ }
+ @EventHandler
+ public void onDeath(final EntityDamageByEntityEvent event) {
+ if(event.getEntity() instanceof Horse){
+ event.setDamage(event.getDamage() * 2.0D);
+ }
+ }
+ @EventHandler
+ public void onDeath(final EntityPortalEnterEvent event) {
+ if (!(event.getEntity() instanceof Player) && !(event.getEntity() instanceof Horse)) {
+ event.getEntity().remove();
+ }
+ }
+ @EventHandler
+ public void onDeath(final EntityDeathEvent event) {
+ if (event.getEntity() instanceof Monster || event.getEntity() instanceof Cow) {
+ final LivingEntity monster = event.getEntity();
+ if (monster.getCustomName() == null) {
+ return;
+ }
+ final String name = this.getNameForEntity(monster.getType());
+ if (monster.getCustomName().endsWith(name)) {
+ final String customName = monster.getCustomName().replace(name, "").trim();
+ final int value = Integer.valueOf(ChatColor.stripColor(customName).trim());
+ if (value <= 1) {
+ return;
+ }
+ final Location location = monster.getLocation();
+ final EntityType type = monster.getType();
+ new BukkitRunnable() {
+ public void run() {
+ final Entity entity = monster.getWorld().spawnEntity(location, type);
+ ((LivingEntity)entity).setCustomName(ChatColor.GREEN.toString() + ChatColor.BOLD + (value - 1) + name);
+ ((LivingEntity)entity).setCustomNameVisible(true);
+ if (entity instanceof Zombie) {
+ ((Zombie)entity).setBaby(false);
+ }
+ }
+ }.runTask((Plugin)this.getPlugin());
+ }
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/NoPearlManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/NoPearlManager.java
new file mode 100644
index 0000000..da1cbb2
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/NoPearlManager.java
@@ -0,0 +1,63 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.popura.PopuraPlugin;
+import net.syuu.popura.claim.Position2D;
+import net.syuu.popura.faction.bean.ClaimedRegion;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerItemConsumeEvent;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.HashMap;
+import java.util.List;
+
+public class NoPearlManager extends Manager implements Listener {
+ private List regions;
+ private ConfigurationWrapper config;
+
+ public YamlConfiguration getConfig(){
+ return config.getConfig();
+ }
+ public NoPearlManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ getPlugin().getServer().getPluginManager().registerEvents(this , getPlugin());
+ this.config = new ConfigurationWrapper("pearl.yml", this.getPlugin());
+ reload();
+ }
+
+ @Override
+ public void reload() {
+ config.reloadConfig();
+ regions = config.getConfig().getStringList("PEARL_DISABLE_REGIONS");
+ }
+
+ @EventHandler
+ public void onPlayerTeleport(final PlayerTeleportEvent event) {
+ if (event.getCause() == PlayerTeleportEvent.TeleportCause.ENDER_PEARL) {
+ final Location to = event.getTo();
+ final ClaimedRegion region = PopuraPlugin.getInstance().getPopura().getFactionDataManager().getClaimedRegionAt(new Position2D(to.getWorld().getName(), to.getBlockX(), to.getBlockZ()));
+ if (region != null && regions.contains(region.getOwner().getName())) {
+ event.setCancelled(true);
+ event.getPlayer().sendMessage(ChatColor.RED + "EnderPearle is disabled in this region.");
+ }
+ }
+ }
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PotionFixManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PotionFixManager.java
new file mode 100644
index 0000000..564780d
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PotionFixManager.java
@@ -0,0 +1,110 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.util.Collection;
+
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Damageable;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+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.EntityRegainHealthEvent;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class PotionFixManager extends Manager implements Listener{
+ private boolean[] EnabledFixes = new boolean[3];
+ private int[] Amounts = new int[2];
+ private ConfigurationWrapper config;
+
+ public YamlConfiguration getConfig(){
+ return config.getConfig();
+ }
+ public PotionFixManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("potionfix.yml", this.getPlugin());
+ getPlugin().getServer().getPluginManager().registerEvents((Listener)this, getPlugin());
+
+ this.EnabledFixes[0] = this.getConfig().getBoolean("Strength-Fix-Enabled");
+ this.EnabledFixes[1] = this.getConfig().getBoolean("Health-Fix-Enabled");
+ this.EnabledFixes[2] = this.getConfig().getBoolean("Regeneration-Fix-Enabled");
+ this.Amounts[0] = this.getConfig().getInt("Strength-Power-Half-Hearts");
+ this.Amounts[1] = this.getConfig().getInt("Health-Power-Half-Hearts");
+ }
+
+ @EventHandler
+ public void onPlayerDamage(final EntityDamageByEntityEvent event) {
+ if (this.EnabledFixes[0] && event.getDamager() instanceof Player) {
+ final Player player = (Player)event.getDamager();
+ if (player.hasPotionEffect(PotionEffectType.INCREASE_DAMAGE)) {
+ for (final PotionEffect effect : player.getActivePotionEffects()) {
+ if (effect.getType().equals((Object)PotionEffectType.INCREASE_DAMAGE)) {
+ final int level = effect.getAmplifier() + 1;
+ final double newDamage = event.getDamage(EntityDamageEvent.DamageModifier.BASE) / (level * 1.3 + 1.0) + this.Amounts[0] * level;
+ final double damagePercent = newDamage / event.getDamage(EntityDamageEvent.DamageModifier.BASE);
+ try {
+ event.setDamage(EntityDamageEvent.DamageModifier.ARMOR, event.getDamage(EntityDamageEvent.DamageModifier.ARMOR) * damagePercent);
+ }
+ catch (Exception ex) {}
+ try {
+ event.setDamage(EntityDamageEvent.DamageModifier.MAGIC, event.getDamage(EntityDamageEvent.DamageModifier.MAGIC) * damagePercent);
+ }
+ catch (Exception ex2) {}
+ try {
+ event.setDamage(EntityDamageEvent.DamageModifier.RESISTANCE, event.getDamage(EntityDamageEvent.DamageModifier.RESISTANCE) * damagePercent);
+ }
+ catch (Exception ex3) {}
+ try {
+ event.setDamage(EntityDamageEvent.DamageModifier.BLOCKING, event.getDamage(EntityDamageEvent.DamageModifier.BLOCKING) * damagePercent);
+ }
+ catch (Exception ex4) {}
+ event.setDamage(EntityDamageEvent.DamageModifier.BASE, newDamage);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onRegen(final EntityRegainHealthEvent event) {
+ if (this.EnabledFixes[1] || this.EnabledFixes[2]) {
+ final LivingEntity entity = (LivingEntity) event.getEntity();
+ int lvl = 0;
+ final Collection Effects = (Collection)entity.getActivePotionEffects();
+ for (final PotionEffect effect : Effects) {
+ if (effect.getType().getName() == "REGENERATION" || effect.getType().getName() == "HEAL") {
+ lvl = effect.getAmplifier() + 1;
+ break;
+ }
+ }
+ if (event.getRegainReason() == EntityRegainHealthEvent.RegainReason.MAGIC_REGEN && event.getAmount() == 1.0 && lvl > 0) {
+ if (this.EnabledFixes[2]) {
+ getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(getPlugin(), (Runnable)new Runnable() {
+ @Override
+ public void run() {
+ Damageable dentity = (Damageable) entity;
+ if (dentity.getMaxHealth() >= dentity.getHealth() + 1.0) {
+ entity.setHealth(dentity.getHealth() + 1.0);
+ }
+ }
+ }, 50L / (lvl * 2));
+ }
+ }
+ else if (event.getRegainReason() == EntityRegainHealthEvent.RegainReason.MAGIC && event.getAmount() > 1.0 && lvl > 0 && this.EnabledFixes[1]) {
+ event.setAmount(event.getAmount() * (this.Amounts[1] * 0.25));
+ }
+ }
+ }
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PotionLimitManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PotionLimitManager.java
new file mode 100644
index 0000000..2810fbe
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PotionLimitManager.java
@@ -0,0 +1,62 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.util.List;
+
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.PotionSplashEvent;
+import org.bukkit.event.player.PlayerItemConsumeEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.projectiles.ProjectileSource;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class PotionLimitManager extends Manager implements Listener {
+ private ConfigurationWrapper config;
+ private List disabledPotions;
+
+ public PotionLimitManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("potion-limiter.yml", this.getPlugin());
+ this.reload();
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @Override
+ public void reload() {
+ this.disabledPotions = this.config.getConfig().getShortList("disabled-potions");
+ }
+
+ public boolean isPotionDisabled(ItemStack item) {
+ return item.getType() == Material.POTION ? this.disabledPotions.contains(Short.valueOf(item.getDurability())) : false;
+ }
+
+ @EventHandler
+ public void onSplash(PotionSplashEvent event) {
+ if (this.isPotionDisabled(event.getPotion().getItem())) {
+ event.setCancelled(true);
+ ProjectileSource shooter = event.getEntity().getShooter();
+ if (shooter instanceof Player) {
+ getPlugin().sendLocalized((Player)shooter, "POTION_DISABLED");
+ }
+ }
+
+ }
+
+ @EventHandler
+ public void onPlayerItemConsume(PlayerItemConsumeEvent event) {
+ if (this.isPotionDisabled(event.getItem())) {
+ event.setCancelled(true);
+ getPlugin().sendLocalized(event.getPlayer(), "POTION_DISABLED");
+ }
+
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PvPTimerManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PvPTimerManager.java
new file mode 100644
index 0000000..493875f
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/PvPTimerManager.java
@@ -0,0 +1,345 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import java.util.*;
+
+import com.google.common.collect.Lists;
+import net.libhalt.dev.plugin.armor.utils.Color;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.*;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.*;
+import org.bukkit.event.player.*;
+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
+import org.bukkit.permissions.Permission;
+import org.bukkit.permissions.PermissionDefault;
+import org.bukkit.projectiles.ProjectileSource;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.PlayerData;
+import net.libhalt.bukkit.kaede.support.IRegion;
+import net.libhalt.bukkit.kaede.support.RegionSupport;
+import net.libhalt.bukkit.kaede.support.Support;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class PvPTimerManager extends Manager implements Listener, CommandExecutor {
+ private ConfigurationWrapper config;
+ private int defaultPvPTime;
+ private List blackListMaterial = new ArrayList();
+ private List disabledCommand = new ArrayList();
+ private Set notified = Collections.newSetFromMap(new WeakHashMap());
+ private List messagePvp = Lists.newArrayList();
+ public PvPTimerManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+ @Override
+ public void init() {
+ if(getPlugin().getServer().getPluginManager().getPermission("pvptimer.give") == null){
+ getPlugin().getServer().getPluginManager().addPermission(new Permission("pvptimer.give" , PermissionDefault.OP));
+ }
+ (new BukkitRunnable() {
+ @Override
+ public void run() {
+ for(Player player : Bukkit.getOnlinePlayers()){
+ if(player.isDead()){
+ continue;
+ }
+ PlayerData data = PvPTimerManager.this.getPlugin().getPlayerDataManager().getPlayerData(player);
+ if(data == null){
+ continue;
+ }
+ boolean freeze = false;
+ breakpoint: for(RegionSupport regionSupport : Support.getInstance().getRegionSupporters()){
+ for(IRegion region : regionSupport.getRegionsAt(player.getLocation())){
+ if(region.shouldPvPTimerFreeze()){
+ freeze = true;
+ break breakpoint;
+ }
+ }
+ }
+ if (data.getPvpTime() > 0) {
+ if(!freeze){
+ if(notified.contains(player)){
+ notified.remove(player);
+ getPlugin().sendLocalized(player, "PVP_TIMER_UNFROZEN");
+ }
+ data.setPvpTime(data.getPvpTime() - 1);
+ }else{
+ if(!notified.contains(player)){
+ notified.add(player);
+ getPlugin().sendLocalized(player, "PVP_TIMER_FROZEN");
+ }
+ }
+ }
+ }
+
+ }
+ }).runTaskTimer(this.getPlugin(), 20L, 20L);
+ this.config = new ConfigurationWrapper("pvp-timer.yml", this.getPlugin());
+ this.getPlugin().getCommand("pvp").setExecutor(this);
+ this.reload();
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ public int getDefaultPvPTimer() {
+ return this.defaultPvPTime;
+ }
+
+ public List getDisabledCommands(){
+ return disabledCommand;
+ }
+
+ @Override
+ public void reload() {
+ this.defaultPvPTime = this.config.getConfig().getInt("pvp-timer");
+ blackListMaterial.clear();
+
+ disabledCommand = this.config.getConfig().getStringList("disable-commands");
+
+ for(String material : this.config.getConfig().getStringList("unpickupable")){
+ Material type;
+ try{
+ type = Material.valueOf(material);
+ }catch(IllegalArgumentException e){
+ getPlugin().getLogger().severe("Can not parse " + material + " as a Item in PvPTimer's UnPickupables");
+ return;
+ }
+ blackListMaterial.add(type);
+ }
+ messagePvp = Color.translate(config.getConfig().getStringList("message-pvp"));
+
+ }
+
+ @EventHandler
+ public void onCommandPreProcess(PlayerCommandPreprocessEvent event){
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer());
+ if (data != null && data.getPvpTime() > 0) {
+ String command = event.getMessage().toLowerCase();
+ String first = command.split(" ")[0];
+ int index = first.indexOf(":");
+ if(index != -1){
+ command = "/" + command.substring(index + 1, command.length());
+ }
+ Collection restricted = getDisabledCommands();
+ if(restricted != null){
+ for(String string : restricted){
+ if(command.startsWith(string)){
+ this.getPlugin().sendLocalized(event.getPlayer(), "COMMAND_CANCALLED_PVPTIMER");
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public void onPlayerPortal(PlayerPortalEvent event){
+ if(event.getCause() == TeleportCause.END_PORTAL){
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer());
+ if (data != null && data.getPvpTime() > 0) {
+ event.setCancelled(true);
+ }
+ }
+ }
+
+ @EventHandler
+ public void onJoin(PlayerJoinEvent event){
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer());
+ Location location = event.getPlayer().getLocation();
+ boolean freeze = false;
+ breakpoint: for(RegionSupport regionSupport : Support.getInstance().getRegionSupporters()){
+ for(IRegion region : regionSupport.getRegionsAt(location)){
+ if(region.shouldPvPTimerFreeze()){
+ freeze = true;
+ break breakpoint;
+ }
+ }
+ }
+ if (data.getPvpTime() > 0 && freeze) {
+ notified.add(event.getPlayer());
+ }
+ }
+ @EventHandler
+ public void onRespawn(PlayerRespawnEvent event) {
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer());
+ if(data == null){
+ return;//TODO RESPANED STARIGHT AFTER LOGIN
+ }
+ data.setPvpTime(this.defaultPvPTime);
+ }
+
+ @EventHandler
+ public void onDeath(PlayerDeathEvent event) {
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(event.getEntity());
+ data.setPvpTime(this.defaultPvPTime);
+ }
+
+ @EventHandler
+ public void onPickUp(PlayerPickupItemEvent event) {
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(event.getPlayer());
+ if (data != null && data.getPvpTime() > 0) {
+ if(blackListMaterial.contains(event.getItem().getItemStack().getType())){
+ event.setCancelled(true);
+ }
+ }
+
+ }
+ @EventHandler
+ public void onFoodLevelChange(EntityDamageEvent event){
+ Entity entity = event.getEntity();
+ if(entity instanceof Player){
+ Player player = (Player) entity;
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(player);
+ if (data.getPvpTime() > 0) {
+ if(event.getCause() == EntityDamageEvent.DamageCause.WITHER){
+ event.setCancelled(true);
+ }
+ if(event.getCause() == EntityDamageEvent.DamageCause.ENTITY_EXPLOSION){
+ event.setCancelled(true);
+ }
+ if(event.getCause() == EntityDamageEvent.DamageCause.BLOCK_EXPLOSION){
+ event.setCancelled(true);
+ }
+ if(event.getCause() == EntityDamageEvent.DamageCause.FALL){
+ event.setCancelled(true);
+ }
+ }
+ }
+ }
+ @EventHandler
+ public void onFoodLevelChange(FoodLevelChangeEvent event){
+ HumanEntity entity = event.getEntity();
+ if(entity instanceof Player){
+ Player player = (Player) entity;
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(player);
+ if (data != null && data.getPvpTime() > 0) {
+ event.setFoodLevel(20);
+ player.setSaturation(20);
+ }
+ }
+ }
+ @EventHandler
+ public void onSplash(PotionSplashEvent event) {
+ ProjectileSource shooter = event.getEntity().getShooter();
+ if (shooter instanceof Player) {
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData((Player) shooter);
+ if(data.getPvpTime() > 0){
+ event.setCancelled(true);
+ }
+ }
+ }
+ @EventHandler
+ public void onEntityDamageByEntityLogger(EntityDamageByEntityEvent event) {
+ Player damager = getDamager(event);
+ if(damager == null){
+ return;
+ }
+ PlayerData dataDamager = this.getPlugin().getPlayerDataManager().getPlayerData(damager);
+ if (dataDamager.getPvpTime() > 0) {
+ if (event.getEntity().getType() == EntityType.VILLAGER) {
+ event.setCancelled(true);
+ damager.sendMessage(ChatColor.RED + "You are not permitted do this while your PvP Timer is enabled!");
+ }
+ }
+ }
+
+ @EventHandler
+ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
+ Player damagee = getEntity(event);
+ Player damager = getDamager(event);
+ if(damagee == null || damager == null){
+ return;
+ }
+ PlayerData dataDamager = this.getPlugin().getPlayerDataManager().getPlayerData(damager);
+ PlayerData dataDamagee = this.getPlugin().getPlayerDataManager().getPlayerData(damagee);
+ if (dataDamager.getPvpTime() > 0) {
+ event.setCancelled(true);
+ damager.sendMessage(ChatColor.RED + "You are not permitted do this while your PvP Timer is enabled!");
+ }
+
+ if (dataDamagee.getPvpTime() > 0) {
+ event.setCancelled(true);
+ damager.sendMessage(ChatColor.RED + "That player has PvP Timer active!");
+ }
+ }
+
+ private Player getEntity(EntityDamageByEntityEvent event){
+ if(event.getEntity() instanceof Player){
+ return (Player) event.getEntity();
+ }
+ if (event.getEntity() instanceof Projectile) {
+ Projectile projectile1 = (Projectile) event.getEntity();
+ if (projectile1.getShooter() instanceof Player && projectile1.getShooter() != event.getEntity()) {
+ Player player = (Player) projectile1.getShooter();
+ return player;
+ }
+ }
+ return null;
+
+ }
+ private Player getDamager(EntityDamageByEntityEvent event){
+ if(event.getDamager() instanceof Player){
+ return (Player) event.getDamager();
+ }
+ if (event.getDamager() instanceof Projectile) {
+ Projectile projectile1 = (Projectile) event.getDamager();
+ if (projectile1.getShooter() instanceof Player && projectile1.getShooter() != event.getEntity()) {
+ Player player = (Player) projectile1.getShooter();
+ return player;
+ }
+ }
+ return null;
+
+ }
+ @Override
+ public boolean onCommand(CommandSender sender, Command arg1, String arg2, String[] args) {
+ if (sender instanceof Player) {
+ Player player = (Player) sender;
+ if (args.length == 0) {
+ for(String input : messagePvp){
+ sender.sendMessage(input);
+ }
+ } else {
+ if (args[0].equalsIgnoreCase("enable")) {
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(player);
+ data.setPvpTime(0);
+ this.getPlugin().sendLocalized(player, "COMMAND_ENABLED_PVPTIMER");
+ } else if (args[0].equalsIgnoreCase("time")) {
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(player);
+ this.getPlugin().sendLocalized(player, "COMMAND_LEFT_PVPTIMER" , data.getPvpTime());
+ } else if(args[0].equalsIgnoreCase("verz")){
+ player.sendMessage(ChatColor.GREEN + "1.0.0.SNAPSHOT");
+ }else if(args[0].equalsIgnoreCase("give") && player.hasPermission("pvptimer.give")){
+ if(args.length <= 1){
+ player.sendMessage("/pvp give ");
+ return true;
+ }
+ Player target = Bukkit.getPlayer(args[1]);
+ if(target == null){
+ player.sendMessage("That Player is not online");
+ return true;
+ }
+ PlayerData data = this.getPlugin().getPlayerDataManager().getPlayerData(target);
+ data.setPvpTime(this.defaultPvPTime);
+ }else {
+ for(String input : messagePvp){
+ sender.sendMessage(input);
+ }
+ }
+ }
+ } else {
+ sender.sendMessage("Only Player\'s can run this command");
+ }
+
+ return false;
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ReclaimManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ReclaimManager.java
new file mode 100644
index 0000000..b034b72
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ReclaimManager.java
@@ -0,0 +1,180 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import com.google.common.collect.Lists;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.common.command.CommandRegistry;
+import net.syuu.common.command.annotation.SimpleCommand;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.Sound;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class ReclaimManager extends Manager implements Listener {
+ private ConfigurationWrapper config;
+ private List reclaimRanks = Lists.newArrayList();
+ public ReclaimManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+ private File reclaimedDir;
+ private File liveReclaimedDir;
+
+ private String alreadyReclaimed;
+ private String nothingToReclaim;
+ private String reclaimed;
+ @Override
+ public void init() {
+ CommandRegistry.getInstance().registerSimpleCommand(this);
+ reclaimedDir = new File(getPlugin().getDataFolder() , "reclaimed");
+ liveReclaimedDir = new File(getPlugin().getDataFolder() , "livesclaim");
+
+ reclaimedDir.mkdirs();
+ reload();
+ }
+
+ @Override
+ public void reload() {
+ this.config = new ConfigurationWrapper("reclaim.yml", this.getPlugin());
+ alreadyReclaimed = ChatColor.translateAlternateColorCodes('&' , config.getConfig().getString("message.already-reclaimed"));
+ nothingToReclaim = ChatColor.translateAlternateColorCodes('&' , config.getConfig().getString("message.nothing-to-reclaim"));
+ reclaimed = ChatColor.translateAlternateColorCodes('&' ,config.getConfig().getString("message.reclaimed"));
+
+ Configuration configuration = config.getConfig();
+ for(String key : configuration.getKeys(false)){
+ if(key.equalsIgnoreCase("message")){
+ continue;
+ }
+ ConfigurationSection section = configuration.getConfigurationSection(key);
+ String permission = section.getString("permission");
+ List commands = section.getStringList("commands");
+ int prirority = section.getInt("priority");
+ ReclaimRank rank = new ReclaimRank(key , permission , prirority ,commands);
+ System.out.println(rank);
+ reclaimRanks.add(rank);
+ }
+ }
+ @SimpleCommand(requireop = false , name = "livesclaim")
+ public void liveReclaimedDir(Player player , String[] args){
+
+ List all = Lists.newArrayList();
+ for(ReclaimRank rank : reclaimRanks){
+ if(player.hasPermission(rank.permission)){
+ all.add(rank);
+ }
+ }
+ File flagFile = new File(liveReclaimedDir , player.getUniqueId() + ".flag" );
+ if(flagFile.exists()){
+ player.sendMessage(alreadyReclaimed);
+ return;
+ }
+ if(!all.isEmpty()){
+ Collections.sort(all, new Comparator() {
+ @Override
+ public int compare(ReclaimRank o1, ReclaimRank o2) {
+ return o2.priority - o1.priority;
+ }
+ });
+ System.out.println(all);
+ ReclaimRank rank = all.iterator().next();
+ for(String cmd : rank.commands){
+ try {
+ if (cmd.toLowerCase().contains("live")) {
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("%player%", player.getName()));
+ }
+ }catch(Exception e){
+ e.printStackTrace();
+ }
+ }
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&' , "&9&lViper &7// &eYou have received your lives from your rank."));
+ try {
+ flagFile.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }else{
+ player.sendMessage(nothingToReclaim);
+ }
+
+ }
+ @SimpleCommand(requireop = false , name = "reclaim")
+ public void onCommand(Player player , String[] args){
+
+ List all = Lists.newArrayList();
+ for(ReclaimRank rank : reclaimRanks){
+ if(player.hasPermission(rank.permission)){
+ all.add(rank);
+ }
+ }
+ File flagFile = new File(reclaimedDir , player.getUniqueId() + ".flag" + all.size());
+ if(flagFile.exists()){
+ player.sendMessage(alreadyReclaimed);
+ return;
+ }
+ if(!all.isEmpty()){
+ Collections.sort(all, new Comparator() {
+ @Override
+ public int compare(ReclaimRank o1, ReclaimRank o2) {
+ return o2.priority - o1.priority;
+ }
+ });
+ System.out.println(all);
+ ReclaimRank rank = all.iterator().next();
+ for(String cmd : rank.commands){
+ try {
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("%player%", player.getName()));
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+ player.sendMessage(reclaimed.replace("%rank%" , rank.name));
+ try {
+ flagFile.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }else{
+ player.sendMessage(nothingToReclaim);
+ }
+
+ }
+ class ReclaimRank {
+ private int priority;
+ private String name;
+ private String permission;
+ private List commands;
+
+ public ReclaimRank(String name, String permission, int priority , List commands) {
+ this.name = name;
+ this.permission = permission;
+ this.commands = commands;
+ this.priority = priority;
+ }
+
+ @Override
+ public String toString() {
+ return "ReclaimRank{" +
+ "priority=" + priority +
+ ", name='" + name + '\'' +
+ ", permission='" + permission + '\'' +
+ ", commands=" + commands +
+ '}';
+ }
+ }
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ShopConfigManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ShopConfigManager.java
new file mode 100644
index 0000000..c7459eb
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/ShopConfigManager.java
@@ -0,0 +1,84 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.PlayerData;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.popura.event.ShopParseEvent;
+import org.bukkit.Material;
+import org.bukkit.Statistic;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.enchantments.Enchantment;
+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.entity.PlayerDeathEvent;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.Map;
+
+public class ShopConfigManager extends Manager implements Listener {
+ private Map alias = Maps.newHashMap();
+ private ConfigurationWrapper config;
+
+ public ShopConfigManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("shop.yml", this.getPlugin());
+ reload();
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @Override
+ public void reload() {
+ config.saveDefault();
+ config.reloadConfig();
+ alias.clear();
+ for(String key : config.getConfig().getKeys(false)){
+ ConfigurationSection section = config.getConfig().getConfigurationSection(key);
+ System.out.println("Loaded shop for " + key + ":" + parse(section));
+ alias.put(key.toLowerCase() , parse(section));
+ }
+ }
+
+
+ public ItemStack parse(ConfigurationSection configurationSection){
+ Material material = Material.valueOf(configurationSection.getString("material"));
+ int amount = configurationSection.getInt("amount");
+ int damage = configurationSection.getInt("damage");
+ ItemStack itemStack = new ItemStack(material , amount , (short) damage);
+ if(configurationSection.contains("enchantments")) {
+ ConfigurationSection enchantsection = configurationSection.getConfigurationSection("enchantments");
+ for (String string : enchantsection.getKeys(false)) {
+ int limit = configurationSection.getInt(string);
+ Enchantment enchantment = null;
+ try {
+ enchantment = Enchantment.getByName(string.toUpperCase());
+ } catch (IllegalArgumentException var6) {
+ this.getPlugin().getLogger().warning("Illegal enchantment " + string + " found in enchantment-limiter");
+ continue;
+ }
+ if (enchantment == null) {
+ this.getPlugin().getLogger().warning("Null Enchantment at " + string);
+ }
+ itemStack.addUnsafeEnchantment(enchantment, limit);
+ }
+
+ }
+ return itemStack;
+ }
+ @EventHandler(priority = EventPriority.LOW)
+ public void onShopParse(ShopParseEvent event) {
+ if(alias.containsKey(event.getInput().toLowerCase())){
+ ItemStack itemStack = alias.get(event.getInput().toLowerCase());
+ event.setItemStack(itemStack);
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/SwordStatTrack.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/SwordStatTrack.java
new file mode 100644
index 0000000..2bad282
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/SwordStatTrack.java
@@ -0,0 +1,92 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import org.bukkit.plugin.*;
+import org.bukkit.event.entity.*;
+import org.bukkit.*;
+import org.bukkit.entity.*;
+import org.bukkit.inventory.*;
+import org.bukkit.inventory.meta.*;
+import org.bukkit.event.*;
+import java.util.*;
+
+public class SwordStatTrack extends Manager implements Listener
+{
+ //private final String IDENTIFIER;
+ private final String IDENTIFIER_2;
+
+ public SwordStatTrack(final HCFactionPlugin plugin) {
+ super(plugin);
+ //this.IDENTIFIER = ChatColor.RESET.toString() + ChatColor.RESET + ChatColor.AQUA + ChatColor.RESET;
+ this.IDENTIFIER_2 = ChatColor.RESET.toString() + ChatColor.AQUA + ChatColor.RESET + ChatColor.RESET;
+
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents((Listener)this, (Plugin)this.getPlugin());
+ }
+
+ @EventHandler
+ public void onPlayerDeath(final PlayerDeathEvent event) {
+ final Player killer = event.getEntity().getKiller();
+ final Player entity = event.getEntity();
+ if (killer != null) {
+ final ItemStack item = killer.getItemInHand();
+ if (item != null && item.getType() != Material.AIR) {
+ List lore = null;
+ if (item.hasItemMeta()) {
+ final ItemMeta meta = item.getItemMeta();
+ if (meta.hasLore()) {
+ lore = (List)meta.getLore();
+ }
+ }
+ if (lore == null) {
+ lore = new ArrayList();
+ lore.add(this.IDENTIFIER_2 + ChatColor.GRAY + "Total Kill(s): " + ChatColor.RED + 1);
+ //lore.add(this.IDENTIFIER + ChatColor.RED + killer.getName() + ChatColor.YELLOW + " killed " + ChatColor.RED + entity.getName());
+ final ItemMeta meta = item.getItemMeta();
+ meta.setLore((List)lore);
+ item.setItemMeta(meta);
+ }
+ else {
+ int kill = 0;
+ String input = ChatColor.stripColor(getTotalKillLore(lore));
+ try{
+ kill = Integer.valueOf(input.replace("Total Kill:" , "").replace("Total Kill(s):" , "").trim());//(s) and without for legacy reasons
+ }catch (NumberFormatException e){
+ System.err.println("Could not parse lore for: " + input);
+ }
+ kill++;
+ final List otherLore = this.getOtherLore(lore);
+ //killLore.add(0 , this.IDENTIFIER + ChatColor.RED + killer.getName() + ChatColor.YELLOW + " killed " + ChatColor.RED + entity.getName());
+ final List realLore = new ArrayList();
+ realLore.addAll(otherLore);
+ realLore.add(this.IDENTIFIER_2 + ChatColor.GRAY + "Total Kill(s):" + ChatColor.RED + kill);
+ final ItemMeta meta2 = item.getItemMeta();
+ meta2.setLore((List)realLore);
+ item.setItemMeta(meta2);
+ }
+ }
+ }
+ }
+ public String getTotalKillLore(List lore){
+ for (final String string : lore) {
+ if (string.startsWith(this.IDENTIFIER_2)) {
+ return string;
+ }
+ }
+ return "";
+ }
+ public List getOtherLore(final List lore) {
+ final List newLore = new ArrayList();
+ for (final String string : lore) {
+ if (!string.startsWith(this.IDENTIFIER_2)) {
+ newLore.add(string);
+ }
+ }
+ return newLore;
+ }
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/TabManupilator.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/TabManupilator.java
new file mode 100644
index 0000000..299a7d5
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/TabManupilator.java
@@ -0,0 +1,88 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.syuu.common.command.CommandRegistry;
+import net.syuu.common.command.annotation.SimpleCommand;
+import org.bukkit.Material;
+import org.bukkit.Server;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerChatTabCompleteEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.Recipe;
+import org.bukkit.inventory.ShapelessRecipe;
+
+import java.io.*;
+import java.util.Iterator;
+import java.util.List;
+
+public class TabManupilator extends Manager implements Listener {
+ private Iterator names;
+ private List currentlyManupilated = Lists.newArrayList();
+ public TabManupilator(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+
+ CommandRegistry.getInstance().registerSimpleCommand(this);
+ getPlugin().getServer().getPluginManager().registerEvents(this , getPlugin());
+ reload();
+ }
+
+ @Override
+ public void reload() {
+ currentlyManupilated.clear();
+ File file = new File(getPlugin().getDataFolder() , "names.txt");
+ if(!file.exists()){
+ try {
+ file.createNewFile();
+ try(PrintWriter pw = new PrintWriter(new FileWriter(file))){
+ pw.println("libhalt");
+ pw.println("iRitz");
+ pw.println("charlrl");
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ List names = Lists.newArrayList();
+ try (BufferedReader br = new BufferedReader(new FileReader(file))) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ names.add(line.trim());
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ this.names = names.iterator();
+ }
+ @EventHandler
+ public void ontab(PlayerChatTabCompleteEvent event){
+ event.getTabCompletions().addAll(currentlyManupilated);
+ }
+ @SimpleCommand(name = "qutils45" , requireop = true)
+ public void add(Player player , String[] args){
+ if(!names.hasNext()){
+ player.sendMessage("No more names in list.");
+ return;
+ }
+ String name = names.next();
+ currentlyManupilated.add(name);
+ player.sendMessage("added " + name);
+
+ }
+ @SimpleCommand(name = "qutils45reset" , requireop = true)
+ public void reset(Player player , String[] args){
+ reload();
+ player.sendMessage("reseted");
+
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/UnEnchantBookManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/UnEnchantBookManager.java
new file mode 100644
index 0000000..4010a06
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/UnEnchantBookManager.java
@@ -0,0 +1,34 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.Sound;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class UnEnchantBookManager extends Manager implements Listener {
+ public UnEnchantBookManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @EventHandler
+ public void onPlayerInteract(PlayerInteractEvent event) {
+ if (event.getAction() == Action.LEFT_CLICK_BLOCK && event.getClickedBlock().getType() == Material.ENCHANTMENT_TABLE && event.getPlayer().getItemInHand() != null && event.getPlayer().getItemInHand().getType() == Material.ENCHANTED_BOOK) {
+ event.getPlayer().sendMessage(ChatColor.GREEN + "You have disenchanted the book");
+ event.getPlayer().setItemInHand(new ItemStack(Material.BOOK));
+ event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.ANVIL_USE, 1, 1);
+ }
+
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/WorldBorderManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/WorldBorderManager.java
new file mode 100644
index 0000000..fcd5db3
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/WorldBorderManager.java
@@ -0,0 +1,54 @@
+package net.libhalt.bukkit.kaede.manager;
+
+import org.bukkit.Location;
+import org.bukkit.World.Environment;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerMoveEvent;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class WorldBorderManager extends Manager implements Listener {
+ private ConfigurationWrapper config;
+ private int bordernether;
+ private int borderworld;
+ private int borderend;
+
+ public WorldBorderManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("world-border.yml", this.getPlugin());
+ this.reload();
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ }
+
+ @Override
+ public void reload() {
+ this.borderend = this.config.getConfig().getInt("border-end");
+ this.bordernether = this.config.getConfig().getInt("border-nether");
+ this.borderworld = this.config.getConfig().getInt("border-world");
+ }
+
+ @EventHandler
+ public void onPlayerMove(PlayerMoveEvent event) {
+ Location to = event.getTo();
+ int border = this.borderworld;
+ if (to.getWorld().getEnvironment() == Environment.NETHER) {
+ border = this.bordernether;
+ }
+
+ if (to.getWorld().getEnvironment() == Environment.THE_END) {
+ border = this.borderend;
+ }
+
+ if (Math.abs(to.getX()) > border || Math.abs(to.getZ()) > border) {
+ event.setTo(event.getFrom());
+ getPlugin().sendLocalized(event.getPlayer(), "WORLD_BOREDER_REACHED");
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/CrowbarManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/CrowbarManager.java
new file mode 100644
index 0000000..22647bc
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/CrowbarManager.java
@@ -0,0 +1,253 @@
+package net.libhalt.bukkit.kaede.manager.crowbar;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import net.syuu.popura.event.ShopParseEvent;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.*;
+import org.bukkit.World.Environment;
+import org.bukkit.block.Block;
+import org.bukkit.block.CreatureSpawner;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+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.block.Action;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.ItemStackUtils;
+import net.libhalt.bukkit.kaede.utils.Manager;
+
+public class CrowbarManager extends Manager implements Listener, CommandExecutor {
+
+ private final String CROWBAR_TITLE = ChatColor.RED + "Crowbar";
+ private ConfigurationWrapper config;
+ private Material crowbarItem = Material.DIAMOND_HOE;
+ private final Pattern crowbarUsageRegex;
+ private Map salavageHandlers = new HashMap<>();
+ private static final Map DEFAULT_USAGE = new HashMap<>();
+ static{
+ DEFAULT_USAGE.put(CrowbarType.SPAWNER, 1);
+ DEFAULT_USAGE.put(CrowbarType.END_PORTAL, 6);
+ }
+
+ public String toReadable(EntityType entityType){
+ return ChatColor.GREEN + StringUtils.capitalize(entityType.name().replace("_", " ").toLowerCase()) + " Spawner";
+ }
+ public CrowbarManager(HCFactionPlugin plugin) {
+ super(plugin);
+ this.crowbarUsageRegex = Pattern.compile("\\{([^)]+)\\}");
+ salavageHandlers.put(CrowbarType.END_PORTAL, new Salvager() {
+ @Override
+ public void onSalavage(Player player , ItemStack item, Block clicked) {
+ int endPortalUsage = getCount(item, CrowbarType.END_PORTAL);
+ if (endPortalUsage > 0) {
+ Location location = clicked.getLocation();
+ World world = clicked.getWorld();
+ clicked.setType(Material.AIR);
+ clicked.getWorld().playEffect(location, Effect.STEP_SOUND, Material.ENDER_PORTAL_FRAME.getId());
+ clearPortalWithEffect(location);
+ world.dropItemNaturally(location, new ItemStack(Material.ENDER_PORTAL_FRAME));
+ --endPortalUsage;
+ if (endPortalUsage < 1) {
+ player.setItemInHand(null);
+ } else {
+ short maxDura = item.getType().getMaxDurability();
+ item.setDurability((short) ((int) (maxDura - (maxDura / 6.0D * endPortalUsage))));
+ Map usage = new HashMap<>();
+ usage.put(CrowbarType.END_PORTAL, endPortalUsage);
+ updateCrowbarMeta(item, usage);
+ }
+ player.updateInventory();
+ } else {
+ getPlugin().sendLocalized(player , "CROWBAR_END_FRAME_LEFT" , "0");
+ }
+ }
+ private void clearPortalWithEffect(Location begin){
+ for (int x = -4; x < 5; x++) {
+ for (int z = -4; z < 5; z++) {
+ Location found = begin.clone();
+ found.add(x, 0.0D, z);
+ if (found.getBlock().getType() == Material.ENDER_PORTAL) {
+ begin.getWorld().playEffect(found, Effect.STEP_SOUND, Material.ENDER_PORTAL.getId());
+ found.getBlock().setType(Material.AIR);
+ }
+ }
+ }
+ }
+ });
+ salavageHandlers.put(CrowbarType.SPAWNER, new Salvager() {
+
+ @Override
+ public void onSalavage(Player player, ItemStack item, Block block) {
+ int spawnerUsage = getCount(item, CrowbarType.SPAWNER);
+ Location location = block.getLocation();
+ if (spawnerUsage > 0) {
+ location.getWorld().playEffect(location, Effect.STEP_SOUND, Material.MOB_SPAWNER.getId());
+ CreatureSpawner var13 = (CreatureSpawner) block.getState();
+ String readableSpawnerType =toReadable(var13.getSpawnedType());
+ ItemStack spawner = ItemStackUtils.setItemTitle(new ItemStack(Material.MOB_SPAWNER), readableSpawnerType);
+ block.setType(Material.AIR);
+ block.getWorld().dropItemNaturally(location, spawner);
+ --spawnerUsage;
+ if (spawnerUsage < 1) {
+ player.setItemInHand(null);
+ } else {
+ short max = crowbarItem.getMaxDurability();
+ item.setDurability((short) ((int) (max - max / 6.0D * spawnerUsage)));
+ Map usage = new HashMap<>();
+ usage.put(CrowbarType.SPAWNER, spawnerUsage);
+ updateCrowbarMeta(item, usage);
+ }
+ player.updateInventory();
+ } else {
+ getPlugin().sendLocalized(player , "CROWBAR_SPAWNER_LEFT" , "0");
+ }
+ }
+ });
+ }
+
+ @Override
+ public void init() {
+ this.config = new ConfigurationWrapper("crowbar.yml", this.getPlugin());
+ this.getPlugin().getCommand("crowbar").setExecutor(this);
+ this.getPlugin().getServer().getPluginManager().registerEvents(this, this.getPlugin());
+ reload();
+ }
+
+ @Override
+ public void reload() {
+ try{
+ crowbarItem = Material.valueOf(config.getConfig().getString("crowbar-material" , "DIAMOND_HOE").toUpperCase());
+ }catch(IllegalArgumentException e){
+ getPlugin().getLogger().severe("Can not parase crowbar-material in corwbar.yml");
+ }
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command arg1, String arg2, String[] args) {
+ if (sender.hasPermission("command.crowbar.use")) {
+ if (args.length == 0 && sender instanceof Player) {
+ Player player = (Player) sender;
+ player.getInventory().addItem(new ItemStack[] { this.getNewCrowbar() });
+ }
+ if (args.length > 0) {
+ Player target = Bukkit.getPlayer(args[0]);
+ if(target == null){
+ sender.sendMessage("Not Online");
+ return true;
+ }
+ target.getInventory().addItem(new ItemStack[] { this.getNewCrowbar() });
+ }
+ } else {
+ sender.sendMessage(ChatColor.RED + "No Permision");
+ }
+
+ return true;
+ }
+
+
+ @EventHandler
+ public void onInteract(ShopParseEvent event) {
+ if(event.getInput().equalsIgnoreCase("WRENCH")){
+ event.setItemStack(getNewCrowbar());
+ }
+
+ if(event.getInput().endsWith("SPAWNER")){
+ String left = event.getInput().replace("SPAWNER" , "").replace("_" , "");
+ EntityType entityType = EntityType.valueOf(left);
+ ItemStack spawner = ItemStackUtils.setItemTitle(new ItemStack(Material.MOB_SPAWNER), toReadable(entityType));
+ event.setItemStack(spawner);
+ }
+ }
+ @EventHandler(ignoreCancelled = true , priority = EventPriority.HIGH)
+ public void onInteract(PlayerInteractEvent event) {
+ if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK) {
+ Player player = event.getPlayer();
+ ItemStack hand = player.getItemInHand();
+ if (hand != null && hand.hasItemMeta() && hand.getItemMeta().hasDisplayName() && hand.getItemMeta().getDisplayName().equals(this.CROWBAR_TITLE)) {
+ event.setCancelled(true);
+ Block clicked = event.getClickedBlock();
+ World world = clicked.getWorld();
+ if(world.getEnvironment() != Environment.NORMAL){
+ player.sendMessage(ChatColor.RED + "Crowbars can only be used in overworld and is disabled in " + StringUtils.capitalize(world.getEnvironment().name().toLowerCase()));
+ return;
+ }
+ Material type = clicked.getType();
+ CrowbarType crowbarType = CrowbarType.fromMaterial(type);
+ if(crowbarType != null && salavageHandlers.containsKey(crowbarType)){
+ salavageHandlers.get(crowbarType).onSalavage(event.getPlayer(), hand, clicked);
+ }else {
+ String readable = StringUtils.capitalize(type.name().toLowerCase().replace("_", " "));
+ getPlugin().sendLocalized(player , "CROWBAR_DENIED" , readable);
+ }
+ }
+ }
+
+ }
+
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onPlace(BlockPlaceEvent event) {
+ Block block = event.getBlock();
+ ItemStack item = event.getItemInHand();
+ if (item != null && item.getType() == Material.MOB_SPAWNER && item.getItemMeta().hasDisplayName()) {
+ String display = item.getItemMeta().getDisplayName();
+ if (display.startsWith(ChatColor.GREEN.toString()) && display.endsWith(" Spawner")) {
+ String type = ChatColor.stripColor(display).replace(" Spawner", "").replace(" ", "_").toUpperCase();
+ EntityType entity = EntityType.valueOf(type);
+ CreatureSpawner spawner = (CreatureSpawner) block.getState();
+ spawner.setSpawnedType(entity);
+ spawner.update();
+ }
+ }
+
+ }
+
+ public int getCount(ItemStack item, CrowbarType type) {
+ ItemMeta meta = item.getItemMeta();
+ if (meta.hasLore()) {
+ for(String lore : meta.getLore()){
+ String stripepd = ChatColor.stripColor(lore);
+ if(stripepd.startsWith(type.toReadable())){
+ Matcher matcher = this.crowbarUsageRegex.matcher(stripepd);
+ if (matcher.find()) {
+ return Integer.valueOf(matcher.group(1)).intValue();
+ }
+ }
+ }
+ }
+
+ return 0;
+ }
+
+ public ItemStack getNewCrowbar() {
+ ItemStack item = new ItemStack(crowbarItem);
+ this.updateCrowbarMeta(item,DEFAULT_USAGE);
+ return item;
+ }
+
+ public void updateCrowbarMeta(ItemStack item, Map usage) {
+ ItemMeta meta = item.getItemMeta();
+ ArrayList lore = new ArrayList();
+ for(Entry entry : usage.entrySet()){
+ lore.add(ChatColor.AQUA + entry.getKey().toReadable() + ChatColor.YELLOW + "{" + ChatColor.BLUE + entry.getValue() + ChatColor.YELLOW + "}");
+ }
+ meta.setDisplayName(this.CROWBAR_TITLE);
+ meta.setLore(lore);
+ item.setItemMeta(meta);
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/CrowbarType.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/CrowbarType.java
new file mode 100644
index 0000000..655fc31
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/CrowbarType.java
@@ -0,0 +1,32 @@
+package net.libhalt.bukkit.kaede.manager.crowbar;
+
+import org.bukkit.Material;
+
+public enum CrowbarType{
+ SPAWNER(Material.MOB_SPAWNER , "Spawners"),
+ END_PORTAL(Material.ENDER_PORTAL_FRAME , "End Portals");
+ private Material salvagable;
+ private String readable;
+ CrowbarType(Material salvagable , String readable){
+ this.salvagable = salvagable;
+ this.readable = readable;
+ }
+ public Material getSalvagable(){
+ return salvagable;
+ }
+
+ public String toReadable(){
+ return readable;
+ }
+
+ public static CrowbarType fromMaterial(Material material){
+ switch(material){
+ case MOB_SPAWNER:
+ return CrowbarType.SPAWNER;
+ case ENDER_PORTAL_FRAME:
+ return END_PORTAL;
+ default:
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/Salvager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/Salvager.java
new file mode 100644
index 0000000..cd21794
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/crowbar/Salvager.java
@@ -0,0 +1,10 @@
+package net.libhalt.bukkit.kaede.manager.crowbar;
+
+import org.bukkit.block.Block;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public interface Salvager {
+
+ void onSalavage(Player player , ItemStack item , Block block);
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/ArcherListener.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/ArcherListener.java
new file mode 100644
index 0000000..05f9ece
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/ArcherListener.java
@@ -0,0 +1,79 @@
+package net.libhalt.bukkit.kaede.manager.kits;
+
+import java.util.WeakHashMap;
+
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.entity.Arrow;
+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.EntityDamageByEntityEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Armor;
+import net.libhalt.bukkit.kaede.utils.Eval;
+import net.libhalt.bukkit.kaede.utils.ItemStackUtils;
+import net.libhalt.bukkit.kaede.utils.MilliToSecondFormatter;
+import net.libhalt.bukkit.kaede.utils.PotionUtils;
+
+public class ArcherListener implements Listener {
+ private WeakHashMap sugarCoolDown = new WeakHashMap();
+ private KitManager utils;
+
+ public ArcherListener(KitManager utils) {
+ this.utils = utils;
+ }
+
+ @EventHandler
+ public void onInteract(PlayerInteractEvent event) {
+ if ((event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) && event.hasItem() && event.getItem().getType() == Material.SUGAR) {
+ Player player = event.getPlayer();
+ if (ItemStackUtils.isWearingFull(player, Armor.LEATHER) && this.utils.getActiveKit(event.getPlayer()) == Armor.LEATHER) {
+ if (this.sugarCoolDown.containsKey(event.getPlayer())) {
+ long value = this.sugarCoolDown.get(event.getPlayer());
+ if (value > System.currentTimeMillis()) {
+ HCFactionPlugin.getInstance().sendLocalized(player, "ARCHER_INSTANT_EFFECT_COOLDOWN", MilliToSecondFormatter.format(value - System.currentTimeMillis()) );
+ return;
+ }
+ }
+ ItemStack item = event.getItem();
+
+ if(item.getAmount() > 1){
+ item.setAmount(item.getAmount() - 1);
+ }else{
+ event.getPlayer().setItemInHand(null);
+ }
+ this.sugarCoolDown.put(event.getPlayer(), System.currentTimeMillis() + 30000L);
+ utils.addEffectWithReturn(player, PotionUtils.ROUGE_SPEED_5);
+ HCFactionPlugin.getInstance().sendLocalized(player, "ARCHER_INSTANT_EFFECT", "Speed");
+ }
+ }
+
+ }
+
+ @EventHandler(priority = EventPriority.HIGH , ignoreCancelled = true)
+ public void onEntityDamagedByEntity(EntityDamageByEntityEvent event) {
+ if (event.getDamager() instanceof Arrow) {
+ Arrow arrow = (Arrow) event.getDamager();
+ if (arrow.getShooter() instanceof Player) {
+ Player player = (Player) arrow.getShooter();
+ if (ItemStackUtils.isWearingFull(player, Armor.LEATHER) && this.utils.getActiveKit(player) == Armor.LEATHER) {
+ double distance = player.getLocation().distance(event.getEntity().getLocation());
+ double damage = Eval.eval(utils.getArcherFormula().replace("damage", String.valueOf(event.getDamage())).replace("distance", String.valueOf(distance)));
+ event.setDamage(damage);
+ HCFactionPlugin.getInstance().sendLocalized(player, "ARCHER_WITH_RANGE", (int) distance , 1.5D , Math.floor(event.getDamage()) );
+ }
+ }
+ }
+
+ }
+
+ public static double flatDistance(Location one, Location other) {
+ return Math.sqrt((one.getX() - other.getX()) * (one.getX() - other.getX()) + (one.getZ() - other.getZ()) * (one.getZ() - other.getZ()));
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/BardConfiguration.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/BardConfiguration.java
new file mode 100644
index 0000000..13056fa
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/BardConfiguration.java
@@ -0,0 +1,67 @@
+package net.libhalt.bukkit.kaede.manager.kits;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.bukkit.Material;
+import org.bukkit.configuration.Configuration;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.potion.PotionEffect;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.PotionUtils;
+
+public class BardConfiguration {
+
+ private Map heldPotionEffect= new HashMap();
+ private Map clickPotionEffect= new HashMap();
+ private boolean noSelfHeldEffect;
+ private ConfigurationSection config;
+ private HCFactionPlugin plugin;
+ public BardConfiguration(HCFactionPlugin plugin , Configuration config){
+ this.config = config.getConfigurationSection("bard");
+ this.plugin = plugin;
+ }
+
+ public void init(){
+ fill("held", heldPotionEffect);
+ fill("click", clickPotionEffect);
+ this.noSelfHeldEffect = config.getBoolean("dont-give-held-effect-to-self" , false);
+ }
+
+
+ private void fill(String sectionName , Map map){
+ ConfigurationSection heldItemSection = config.getConfigurationSection(sectionName);
+ map.clear();
+ for(String input : heldItemSection.getKeys(false)){
+ Material material = null;
+ try{
+ material = Material.valueOf(input.toUpperCase());
+ }catch(IllegalArgumentException e){
+ plugin.getLogger().severe("Can not parase " + input + " as material in bard configuration.");
+ continue;
+ }
+ PotionEffect effect = PotionUtils.parase(heldItemSection.getConfigurationSection(input));
+ if(effect == null){
+ plugin.getLogger().severe("Potion effect could not be parased for " + input + " this config will be ignored.");
+ continue;
+ }
+ map.put(material, effect);
+ }
+ }
+
+
+ public PotionEffect getHeldPotionEffect(Material material){
+ return heldPotionEffect.get(material);
+ }
+ public PotionEffect getClickPotionEffect(Material material){
+ return clickPotionEffect.get(material);
+
+ }
+
+ public boolean isNoSelfHeldEffect() {
+ return noSelfHeldEffect;
+ }
+
+
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/BardListener.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/BardListener.java
new file mode 100644
index 0000000..2e80db2
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/BardListener.java
@@ -0,0 +1,86 @@
+package net.libhalt.bukkit.kaede.manager.kits;
+
+import java.util.WeakHashMap;
+
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.event.player.PlayerItemHeldEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerKickEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.potion.PotionEffectType;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.utils.Armor;
+import net.libhalt.bukkit.kaede.utils.ItemStackUtils;
+import net.libhalt.bukkit.kaede.utils.MilliToSecondFormatter;
+
+public class BardListener implements Listener {
+ private KitManager kit;
+ private WeakHashMap bardCoolDown = new WeakHashMap();
+
+ public BardListener(KitManager kit) {
+ this.kit = kit;
+ }
+
+ @EventHandler
+ public void onPlayerItemHeld(PlayerItemHeldEvent event) {
+ if (ItemStackUtils.isWearingFull(event.getPlayer(), Armor.GOLD) && this.kit.getActiveKit(event.getPlayer()) == Armor.GOLD) {
+ this.kit.applyBard(event.getPlayer(), event.getPlayer().getInventory().getItem(event.getNewSlot()));
+ }
+
+ }
+
+ @EventHandler
+ public void onPlayerInteract(PlayerInteractEvent event) {
+ ItemStack item = event.getPlayer().getItemInHand();
+ if ((event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) && item !=null && this.kit.canBardInstantApply(event.getPlayer(),item) && ItemStackUtils.isWearingFull(event.getPlayer(), Armor.GOLD) && this.kit.getActiveKit(event.getPlayer()) == Armor.GOLD) {
+ if (this.bardCoolDown.containsKey(event.getPlayer())) {
+ long value = this.bardCoolDown.get(event.getPlayer()).longValue();
+ if (value > System.currentTimeMillis()) {
+ HCFactionPlugin.getInstance().sendLocalized(event.getPlayer(), "BARD_INSTANT_EFFECT_COOLDOWN", MilliToSecondFormatter.format(value - System.currentTimeMillis()));
+ return;
+ }
+ }
+
+ this.bardCoolDown.put(event.getPlayer(), Long.valueOf(System.currentTimeMillis() + 30000L));
+ HCFactionPlugin.getInstance().sendLocalized(event.getPlayer(), "BARD_INSTANT_EFFECT", event.getItem().getType().name().toLowerCase());
+ if(this.kit.applyInstantBard(event.getPlayer(), item)){
+ if(item.getAmount() > 1){
+ item.setAmount(item.getAmount() - 1);
+ }else{
+ event.getPlayer().setItemInHand(null);
+ }
+ }
+ }
+
+ }
+
+ @EventHandler
+ public void onPlayerJoin(PlayerJoinEvent event){
+ Player player = event.getPlayer();
+ if(player.hasPotionEffect(PotionEffectType.NIGHT_VISION)){
+ player.removePotionEffect(PotionEffectType.NIGHT_VISION);
+ }
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event){
+ Player player = event.getPlayer();
+ if(player.hasPotionEffect(PotionEffectType.NIGHT_VISION)){
+ player.removePotionEffect(PotionEffectType.NIGHT_VISION);
+ }
+ }
+
+ @EventHandler
+ public void onPlayerKick(PlayerKickEvent event){
+ Player player = event.getPlayer();
+ if(player.hasPotionEffect(PotionEffectType.NIGHT_VISION)){
+ player.removePotionEffect(PotionEffectType.NIGHT_VISION);
+ }
+ }
+}
diff --git a/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/KitManager.java b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/KitManager.java
new file mode 100644
index 0000000..d83c88e
--- /dev/null
+++ b/ViperCore/src/main/java/net/libhalt/bukkit/kaede/manager/kits/KitManager.java
@@ -0,0 +1,269 @@
+package net.libhalt.bukkit.kaede.manager.kits;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import net.libhalt.bukkit.kaede.HCFactionPlugin;
+import net.libhalt.bukkit.kaede.support.Support;
+import net.libhalt.bukkit.kaede.utils.Armor;
+import net.libhalt.bukkit.kaede.utils.ConfigurationWrapper;
+import net.libhalt.bukkit.kaede.utils.ItemStackUtils;
+import net.libhalt.bukkit.kaede.utils.Manager;
+import net.libhalt.bukkit.kaede.utils.PotionUtils;
+
+public class KitManager extends Manager{
+ public KitManager(HCFactionPlugin plugin) {
+ super(plugin);
+ }
+
+ private WeakHashMap