Cherry pick more PRs from master

This commit is contained in:
nathank33 2016-01-17 14:17:19 -08:00
parent 0ba7dda744
commit 203c4aa0b0
12 changed files with 323 additions and 127 deletions

View file

@ -1,11 +1,58 @@
package com.projectkorra.projectkorra;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager;
import me.ryanhamshire.GriefPrevention.Claim;
import me.ryanhamshire.GriefPrevention.GriefPrevention;
import net.sacredlabyrinth.Phaed.PreciousStones.FieldFlag;
import net.sacredlabyrinth.Phaed.PreciousStones.PreciousStones;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.FallingSand;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import com.google.common.reflect.ClassPath;
import com.griefcraft.lwc.LWC;
@ -52,6 +99,7 @@ import com.projectkorra.projectkorra.firebending.Combustion;
import com.projectkorra.projectkorra.firebending.FireBlast;
import com.projectkorra.projectkorra.firebending.FireCombo;
import com.projectkorra.projectkorra.firebending.FireShield;
import com.projectkorra.projectkorra.object.Preset;
import com.projectkorra.projectkorra.storage.DBConnection;
import com.projectkorra.projectkorra.util.BlockCacheElement;
import com.projectkorra.projectkorra.util.Flight;
@ -62,59 +110,12 @@ import com.projectkorra.projectkorra.waterbending.WaterSpout;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.DefaultFlag;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.FallingSand;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager;
import me.ryanhamshire.GriefPrevention.Claim;
import me.ryanhamshire.GriefPrevention.GriefPrevention;
import net.sacredlabyrinth.Phaed.PreciousStones.FieldFlag;
import net.sacredlabyrinth.Phaed.PreciousStones.PreciousStones;
@SuppressWarnings("deprecation")
public class GeneralMethods {
@ -1225,7 +1226,8 @@ public class GeneralMethods {
GeneralMethods.stopBending();
ConfigManager.defaultConfig.reload();
ConfigManager.deathMsgConfig.reload();
ConfigManager.presetConfig.reload();
Preset.loadExternalPresets();
CoreAbility.registerAbilities();
new ComboManager();
new MultiAbilityManager();

View file

@ -1,5 +1,13 @@
package com.projectkorra.projectkorra;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import com.projectkorra.projectkorra.ability.CoreAbility;
import com.projectkorra.projectkorra.ability.util.ComboManager;
import com.projectkorra.projectkorra.ability.util.MultiAbilityManager;
@ -9,6 +17,7 @@ import com.projectkorra.projectkorra.command.Commands;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.earthbending.EarthbendingManager;
import com.projectkorra.projectkorra.firebending.FirebendingManager;
import com.projectkorra.projectkorra.object.Preset;
import com.projectkorra.projectkorra.storage.DBConnection;
import com.projectkorra.projectkorra.util.MetricsLite;
import com.projectkorra.projectkorra.util.RevertChecker;
@ -16,14 +25,6 @@ import com.projectkorra.projectkorra.util.Updater;
import com.projectkorra.projectkorra.util.logging.PKLogHandler;
import com.projectkorra.projectkorra.waterbending.WaterbendingManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;
public class ProjectKorra extends JavaPlugin {
public static ProjectKorra plugin;
@ -51,11 +52,13 @@ public class ProjectKorra extends JavaPlugin {
CoreAbility.registerAbilities();
new ConfigManager();
new GeneralMethods(this);
updater = new Updater(this, "http://projectkorra.com/forums/dev-builds.16/index.rss");
updater = new Updater(this, "http://projectkorra.com/forum/forums/dev-builds.16/index.rss");
new Commands(this);
new MultiAbilityManager();
new ComboManager();
Preset.loadExternalPresets();
DBConnection.host = getConfig().getString("Storage.MySQL.host");
DBConnection.port = getConfig().getInt("Storage.MySQL.port");
DBConnection.pass = getConfig().getString("Storage.MySQL.pass");

View file

@ -1,22 +1,23 @@
package com.projectkorra.projectkorra.command;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import com.projectkorra.projectkorra.Element;
import com.projectkorra.projectkorra.ability.ComboAbility;
import com.projectkorra.projectkorra.ability.CoreAbility;
import com.projectkorra.projectkorra.ability.util.ComboManager;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import java.util.Arrays;
import java.util.List;
/**
* Executor for /bending help. Extends {@link PKCommand}.
*/
public class HelpCommand extends PKCommand {
public HelpCommand() {
super("help", "/bending help", "This command provides information on how to use other commands in ProjectKorra.", new String[] { "help", "h" });
super("help", "/bending help [Topic/Page]", "This command provides information on how to use other commands in ProjectKorra.", new String[] { "help", "h" });
}
@Override
@ -24,15 +25,26 @@ public class HelpCommand extends PKCommand {
if (!hasPermission(sender) || !correctLength(sender, args.size(), 0, 1))
return;
else if (args.size() == 0) {
List<String> strings = new ArrayList<String>();
for (PKCommand command : instances.values()) {
sender.sendMessage(ChatColor.YELLOW + command.getProperUse());
strings.add(command.getProperUse());
}
for (String s : getPage(strings, ChatColor.GOLD + "Commands: <required> [optional]", 1)) {
sender.sendMessage(ChatColor.YELLOW + s);
}
return;
}
String arg = args.get(0).toLowerCase();
if (instances.keySet().contains(arg.toLowerCase())) { //bending help command
if (isNumeric(arg)) {
List<String> strings = new ArrayList<String>();
for (PKCommand command : instances.values()) {
strings.add(command.getProperUse());
}
for (String s : getPage(strings, ChatColor.GOLD + "Commands: <required> [optional]", Integer.valueOf(arg))) {
sender.sendMessage(ChatColor.YELLOW + s);
}
} else if (instances.keySet().contains(arg.toLowerCase())) {//bending help command
instances.get(arg).help(sender, true);
} else if (Arrays.asList(Commands.comboaliases).contains(arg)) { //bending help elementcombo
sender.sendMessage(ChatColor.GOLD + "Proper Usage: " + ChatColor.RED + "/bending display " + arg + ChatColor.GOLD + " or " + ChatColor.RED + "/bending help <Combo Name>");

View file

@ -1,13 +1,18 @@
package com.projectkorra.projectkorra.command;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Abstract representation of a command executor. Implements
* {@link SubCommand}.
@ -183,5 +188,52 @@ public abstract class PKCommand implements SubCommand {
return "chi";
return null;
}
/**
* Returns a boolean if the string provided is numerical.
* @param id
* @return boolean
*/
protected boolean isNumeric(String id) {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition pos = new ParsePosition(0);
formatter.parse(id, pos);
return id.length() == pos.getIndex();
}
/**
* Returns a list for of commands for a page.
* @param entries
* @param title
* @param page
* @return
*/
protected List<String> getPage(List<String> entries, String title, int page) {
List<String> strings = new ArrayList<String>();
Collections.sort(entries);
if (page < 1) {
page = 1;
}
if ((page * 8) - 8 >= entries.size()) {
page = Math.round(entries.size() / 8) + 1;
if (page < 1) {
page = 1;
}
}
strings.add(ChatColor.GOLD + "ProjectKorra " + ChatColor.DARK_GRAY + "- [" + ChatColor.GRAY + page + "/" + (int) Math.ceil((entries.size()+.0)/(8+.0)) + ChatColor.DARK_GRAY + "]");
strings.add(title);
if (entries.size() > ((page * 8) - 8)) {
for (int i = ((page * 8) - 8); i < entries.size(); i++) {
if (entries.get(i) != null) {
strings.add(entries.get(i).toString());
}
if (i >= (page * 8)-1) {
break;
}
}
}
return strings;
}
}

View file

@ -1,19 +1,20 @@
package com.projectkorra.projectkorra.command;
import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.ability.util.MultiAbilityManager;
import com.projectkorra.projectkorra.object.Preset;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.GeneralMethods;
import com.projectkorra.projectkorra.ability.util.MultiAbilityManager;
import com.projectkorra.projectkorra.object.Preset;
/**
* Executor for /bending preset. Extends {@link PKCommand}.
*/
@ -30,7 +31,7 @@ public class PresetCommand extends PKCommand {
@Override
public void execute(CommandSender sender, List<String> args) {
if (!isPlayer(sender) || !correctLength(sender, args.size(), 1, 2)) {
if (!isPlayer(sender) || !correctLength(sender, args.size(), 1, 3)) {
return;
} else if (MultiAbilityManager.hasMultiAbilityBound((Player) sender)) {
sender.sendMessage(ChatColor.RED + "You can't edit your binds right now!");
@ -74,16 +75,44 @@ public class PresetCommand extends PKCommand {
sender.sendMessage(ChatColor.GREEN + "You have deleted your preset named: " + ChatColor.YELLOW + name);
return;
} else if (Arrays.asList(bindaliases).contains(args.get(0)) && hasPermission(sender, "bind")) { //bending preset bind name
if (!Preset.presetExists(player, name)) {
sender.sendMessage(ChatColor.RED + "You don't have a preset with that name.");
return;
}
Preset preset = Preset.getPreset(player, name);
boolean boundAll = Preset.bindPreset(player, preset);
sender.sendMessage(ChatColor.GREEN + "Your bound slots have been set to match the " + ChatColor.YELLOW + name + ChatColor.GREEN + " preset.");
if (!boundAll) {
sender.sendMessage(ChatColor.RED + "Some abilities were not bound because you cannot bend the required element.");
if (args.size() < 3) {
boolean boundAll = false;
if (Preset.presetExists(player, name)) {
Preset preset = Preset.getPreset(player, name);
boundAll = Preset.bindPreset(player, preset);
} else if (Preset.externalPresetExists(name) && hasPermission(sender, "bind.external")) {
boundAll = Preset.bindExternalPreset(player, name);
} else if (!Preset.externalPresetExists(name) && hasPermission(sender, "bind.external")) {
sender.sendMessage(ChatColor.RED + "No external preset with that name exists.");
return;
} else {
sender.sendMessage(ChatColor.RED + "You don't have a preset with that name.");
return;
}
sender.sendMessage(ChatColor.GREEN + "Your bound slots have been set to match the " + ChatColor.YELLOW + name + ChatColor.GREEN + " preset.");
if (!boundAll) {
sender.sendMessage(ChatColor.RED + "Some abilities were not bound because you cannot bend the required element.");
}
} else if (hasPermission(sender, "bind.external.other")) {
if (!Preset.externalPresetExists(name)) {
sender.sendMessage(ChatColor.RED + "No external preset with that name exists.");
return;
}
Player player2 = Bukkit.getPlayer(args.get(2));
if (player2 != null && player2.isOnline()) {
boolean boundAll = Preset.bindExternalPreset(player2, name);
sender.sendMessage(ChatColor.GREEN + "The bound slots of " + ChatColor.YELLOW + player2.getName() + ChatColor.GREEN + " have been set to match the " + ChatColor.YELLOW + name + ChatColor.GREEN + " preset.");
player2.sendMessage(ChatColor.GREEN + "Your bound slots have been set to match the " + ChatColor.YELLOW + name + ChatColor.GREEN + " preset.");
if (!boundAll) {
player2.sendMessage(ChatColor.RED + "Some abilities were not bound, either the preset");
}
return;
} else {
sender.sendMessage(ChatColor.RED + "Player not found.");
}
}
return;
} else if (Arrays.asList(createaliases).contains(args.get(0)) && hasPermission(sender, "create")) { //bending preset create name

View file

@ -30,7 +30,7 @@ public class WhoCommand extends PKCommand {
Map<String, String> staff = new HashMap<String, String>();
public WhoCommand() {
super("who", "/bending who [Player]", "This command will tell you what element all players that are online are (If you don't specify a player) or give you information about the player that you specify.", new String[] { "who", "w" });
super("who", "/bending who [Player/Page]", "This command will tell you what element all players that are online are (If you don't specify a player) or give you information about the player that you specify.", new String[] { "who", "w" });
staff.put("8621211e-283b-46f5-87bc-95a66d68880e", ChatColor.RED + "ProjectKorra Founder"); // MistPhizzle
@ -66,9 +66,13 @@ public class WhoCommand extends PKCommand {
public void execute(CommandSender sender, List<String> args) {
if (!hasPermission(sender) || !correctLength(sender, args.size(), 0, 1)) {
return;
} else if (args.size() == 1) {
} else if (args.size() == 1 && args.get(0).length() > 2) {
whoPlayer(sender, args.get(0));
} else if (args.size() == 0) {
} else if (args.size() == 0 || args.size() == 1) {
int page = 1;
if (args.size() == 1 && isNumeric(args.get(0))) {
page = Integer.valueOf(args.get(0));
}
List<String> players = new ArrayList<String>();
for (Player player : Bukkit.getOnlinePlayers()) {
String playerName = player.getName();
@ -122,8 +126,8 @@ public class WhoCommand extends PKCommand {
if (players.isEmpty()) {
sender.sendMessage(ChatColor.RED + "There is no one online.");
} else {
for (String st : players) {
sender.sendMessage(st);
for (String s : getPage(players, ChatColor.GOLD + "Players:", page)) {
sender.sendMessage(s);
}
}
}

View file

@ -7,19 +7,40 @@ import java.util.ArrayList;
public class ConfigManager {
public static Config presetConfig;
public static Config deathMsgConfig;
public static Config defaultConfig;
public ConfigManager() {
presetConfig = new Config(new File("presets.yml"));
deathMsgConfig = new Config(new File("deathmessages.yml"));
defaultConfig = new Config(new File("config.yml"));
configCheck(ConfigType.DEFAULT);
configCheck(ConfigType.DEATH_MESSAGE);
configCheck(ConfigType.PRESETS);
}
public static void configCheck(ConfigType type) {
FileConfiguration config;
switch (type) {
case PRESETS:
config = presetConfig.get();
ArrayList<String> abilities = new ArrayList<String>();
abilities.add("FireBlast");
abilities.add("AirBlast");
abilities.add("WaterManipulation");
abilities.add("EarthBlast");
abilities.add("FireBurst");
abilities.add("AirBurst");
abilities.add("Torrent");
abilities.add("Shockwave");
abilities.add("AvatarState");
config.addDefault("Example", abilities);
presetConfig.save();
break;
case DEATH_MESSAGE:
config = deathMsgConfig.get();
@ -202,6 +223,7 @@ public class ConfigManager {
config.addDefault("Abilities.AvatarState.PotionEffects.Speed.Enabled", true);
config.addDefault("Abilities.AvatarState.PotionEffects.Speed.Power", 3);
config.addDefault("Abilities.AvatarState.PotionEffects.DamageResistance.Enabled", true);
config.addDefault("Abilities.AvatarState.PotionEffects.DamageResistance.Power", 3);
config.addDefault("Abilities.AvatarState.PotionEffects.FireResistance.Enabled", true);
config.addDefault("Abilities.AvatarState.PotionEffects.FireResistance.Power", 3);
@ -640,6 +662,7 @@ public class ConfigManager {
config.addDefault("Abilities.Earth.EarthSmash.AllowGrab", true);
config.addDefault("Abilities.Earth.EarthSmash.AllowFlight", true);
config.addDefault("Abilities.Earth.EarthSmash.GrabRange", 10);
config.addDefault("Abilities.Earth.EarthSmash.SelectRange", 10);
config.addDefault("Abilities.Earth.EarthSmash.ChargeTime", 1500);
config.addDefault("Abilities.Earth.EarthSmash.Cooldown", 2500);
config.addDefault("Abilities.Earth.EarthSmash.ShootRange", 30);

View file

@ -14,5 +14,9 @@ public enum ConfigType {
/**
* Death Message configuration represented by deathmessages.yml
*/
DEATH_MESSAGE;
DEATH_MESSAGE,
/**
* Preset configuration represented by presets.yml
*/
PRESETS;
}

View file

@ -43,6 +43,7 @@ public class EarthSmash extends EarthAbility {
private long shootAnimationInterval;
private long flightAnimationInterval;
private long liftAnimationInterval;
private double selectRange;
private double grabRange;
private double shootRange;
private double damage;
@ -73,6 +74,7 @@ public class EarthSmash extends EarthAbility {
this.flightDetectionRadius = getConfig().getDouble("Abilities.Earth.EarthSmash.FlightDetectionRadius");
this.allowGrab = getConfig().getBoolean("Abilities.Earth.EarthSmash.AllowGrab");
this.allowFlight = getConfig().getBoolean("Abilities.Earth.EarthSmash.AllowFlight");
this.selectRange = getConfig().getDouble("Abilities.Earth.EarthSmash.SelectRange");
this.grabRange = getConfig().getDouble("Abilities.Earth.EarthSmash.GrabRange");
this.shootRange = getConfig().getDouble("Abilities.Earth.EarthSmash.ShootRange");
this.damage = getConfig().getDouble("Abilities.Earth.EarthSmash.Damage");
@ -89,6 +91,7 @@ public class EarthSmash extends EarthAbility {
if (type == ClickType.SHIFT_DOWN || type == ClickType.SHIFT_UP && !player.isSneaking()) {
if (bPlayer.isAvatarState()) {
selectRange = AvatarState.getValue(selectRange);
grabRange = AvatarState.getValue(grabRange);
chargeTime = 0;
cooldown = 0;
@ -110,13 +113,13 @@ public class EarthSmash extends EarthAbility {
EarthSmash grabbedSmash = aimingAtSmashCheck(player, State.LIFTED);
if (grabbedSmash == null) {
if (bPlayer.isOnCooldown(this)) {
return;
}
grabbedSmash = aimingAtSmashCheck(player, State.SHOT);
}
if (grabbedSmash != null) {
if (bPlayer.isOnCooldown(this)) {
return;
}
grabbedSmash.state = State.GRABBED;
grabbedSmash.grabbedDistance = grabbedSmash.location.distance(player.getEyeLocation());
grabbedSmash.player = player;
@ -168,7 +171,7 @@ public class EarthSmash extends EarthAbility {
if (state == State.START && progressCounter > 1) {
if (!player.isSneaking()) {
if (System.currentTimeMillis() - startTime >= chargeTime) {
origin = getEarthSourceBlock(grabRange);
origin = getEarthSourceBlock(selectRange);
if (origin == null) {
remove();
return;
@ -540,7 +543,7 @@ public class EarthSmash extends EarthAbility {
for (Entity entity : entities) {
if (entity instanceof LivingEntity && entity != player && !affectedEntities.contains(entity)) {
affectedEntities.add(entity);
double damage = currentBlocks.size() / 13 * this.damage;
double damage = currentBlocks.size() / 13.0 * this.damage;
GeneralMethods.damageEntity(player, entity, damage, "EarthSmash");
Vector travelVec = GeneralMethods.getDirection(location, entity.getLocation());
entity.setVelocity(travelVec.setY(knockup).normalize().multiply(knockback));
@ -822,6 +825,14 @@ public class EarthSmash extends EarthAbility {
public void setGrabRange(double grabRange) {
this.grabRange = grabRange;
}
public double getSelectRange() {
return selectRange;
}
public void setSelectRange(double selectRange) {
this.selectRange = selectRange;
}
public double getShootRange() {
return shootRange;

View file

@ -1,13 +1,5 @@
package com.projectkorra.projectkorra.object;
import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.ProjectKorra;
import com.projectkorra.projectkorra.ability.CoreAbility;
import com.projectkorra.projectkorra.storage.DBConnection;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@ -17,6 +9,16 @@ import java.util.List;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import com.projectkorra.projectkorra.BendingPlayer;
import com.projectkorra.projectkorra.ProjectKorra;
import com.projectkorra.projectkorra.ability.CoreAbility;
import com.projectkorra.projectkorra.configuration.ConfigManager;
import com.projectkorra.projectkorra.storage.DBConnection;
/**
* A savable association of abilities and hotbar slots, stored per player.
*
@ -30,6 +32,8 @@ public class Preset {
* presets}, keyed to their UUID
*/
public static ConcurrentHashMap<UUID, List<Preset>> presets = new ConcurrentHashMap<UUID, List<Preset>>();
public static FileConfiguration config = ConfigManager.presetConfig.get();
public static HashMap<String, ArrayList<String>> externalPresets = new HashMap<String, ArrayList<String>>();
static String loadQuery = "SELECT * FROM pk_presets WHERE uuid = ?";
static String loadNameQuery = "SELECT * FROM pk_presets WHERE uuid = ? AND name = ?";
static String deleteQuery = "DELETE FROM pk_presets WHERE uuid = ? AND name = ?";
@ -179,6 +183,25 @@ public class Preset {
}
return null;
}
public static void loadExternalPresets() {
HashMap<String, ArrayList<String>> presets = new HashMap<String, ArrayList<String>>();
for(String name : config.getKeys(false)) {
if (!presets.containsKey(name)) if (!config.getStringList(name).isEmpty() && config.getStringList(name).size() <= 9) {
presets.put(name.toLowerCase(), (ArrayList<String>) config.getStringList(name));
}
}
externalPresets = presets;
}
public static boolean externalPresetExists(String name) {
for (String preset : externalPresets.keySet()) {
if (name.equalsIgnoreCase(preset)) {
return true;
}
}
return false;
}
/**
* Gets the contents of a Preset for the specified Player.
@ -198,6 +221,37 @@ public class Preset {
}
return null;
}
public static boolean bindExternalPreset(Player player, String name) {
boolean boundAll = true;
int slot = 0;
BendingPlayer bPlayer = BendingPlayer.getBendingPlayer(player);
if (bPlayer == null) {
return false;
}
HashMap<Integer, String> abilities = new HashMap<Integer, String>();
if (externalPresetExists(name.toLowerCase())) {
for (String ability : externalPresets.get(name.toLowerCase())) {
slot++;
CoreAbility coreAbil = CoreAbility.getAbility(ability);
if (coreAbil != null) {
abilities.put(slot, coreAbil.getName());
}
}
for (int i = 1; i <= 9; i++) {
if (!bPlayer.canBind(CoreAbility.getAbility(abilities.get(i)))) {
abilities.remove(i);
boundAll = false;
}
}
bPlayer.setAbilities(abilities);
return boundAll;
}
return false;
}
/**
* Deletes the Preset from the database.

View file

@ -35,14 +35,14 @@ public class ActionBar {
return initialised;
}
public static boolean sendActionBar(String message, Player... p) {
public static boolean sendActionBar(String message, Player... player) {
if (!initialised) {
return false;
}
try {
Object o = chatSer.newInstance(message);
Object packet = packetChat.newInstance(o, (byte) 2);
sendTo(packet, p);
sendTo(packet, player);
}
catch (ReflectiveOperationException e) {
e.printStackTrace();
@ -51,8 +51,8 @@ public class ActionBar {
return initialised;
}
private static void sendTo(Object packet, Player... pl) throws ReflectiveOperationException {
for (Player p : pl) {
private static void sendTo(Object packet, Player... player) throws ReflectiveOperationException {
for (Player p : player) {
Object entityplayer = getHandle.invoke(p);
Object PlayerConnection = playerConnection.get(entityplayer);
sendPacket.invoke(PlayerConnection, packet);

View file

@ -33,6 +33,8 @@ permissions:
bending.command.give: true
bending.command.invincible: true
bending.command.check: true
bending.command.preset.bind.external: true
bending.command.preset.bind.external.other: true
bending.admin.debug: true
bending.admin.remove: true
bending.player: