Merge pull request #47 from dmulloy2/master

Merge changes from fork
This commit is contained in:
Dan Mulloy 2017-01-16 13:55:24 -05:00 committed by GitHub
commit 5a39b6fd62
21 changed files with 323 additions and 162 deletions

View File

@ -1,6 +1,8 @@
ChestShop
================================
My fork of ChestShop. Downloads can be found here: [http://ci.dmulloy2.net/job/ChestShop](http://ci.dmulloy2.net/job/ChestShop)
ChestShop is an awesome plugin for managing your server's economy.
By using chests and signs, you can effectively create your own market!
@ -28,6 +30,4 @@ To install external dependencies, place your .jar into the main folder and launc
Links
--------------------------------
* [Forum Thread](http://forums.bukkit.org/threads/4150/)
* [BukkitDev site](http://dev.bukkit.org/server-mods/chestshop/)
* [Bug Tracker](http://dev.bukkit.org/server-mods/chestshop/tickets/?status=+)
* [Downloads](http://ci.dmulloy2.net/job/ChestShop)

41
pom.xml
View File

@ -10,9 +10,9 @@
<description>Chest-and-sign shop plugin for Bukkit</description>
<scm>
<connection>scm:git:git://github.com/Acrobot/ChestShop-3</connection>
<developerConnection>scm:git:ssh://git@github.com/Acrobot/ChestShop-3.git</developerConnection>
<url>https://github.com/Acrobot/ChestShop-3</url>
<connection>scm:git:git://github.com/dmulloy2/ChestShop-3</connection>
<developerConnection>scm:git:ssh://git@github.com/dmulloy2/ChestShop-3.git</developerConnection>
<url>https://github.com/dmulloy2/ChestShop-3</url>
</scm>
<repositories>
@ -30,11 +30,7 @@
</repository>
<repository>
<id>vault-repo</id>
<url>http://nexus.theyeticave.net/content/repositories/pub_releases</url>
</repository>
<repository>
<id>heroes-repo</id>
<url>http://nexus.theyeticave.net/content/repositories/pub_snapshots/</url>
<url>http://nexus.hc.to/content/repositories/pub_releases/</url>
</repository>
<repository>
<id>authme-repo</id>
@ -69,9 +65,9 @@
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.8.8-R0.1-SNAPSHOT</version>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.11-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
@ -95,7 +91,7 @@
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>Vault</artifactId>
<version>1.5.2</version>
<version>1.6.6</version>
<scope>provided</scope>
<exclusions>
<exclusion>
@ -130,16 +126,12 @@
<dependency>
<groupId>com.herocraftonline.heroes</groupId>
<artifactId>Heroes</artifactId>
<version>1.5.5.6-SNAPSHOT</version>
<version>1.5.5</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
</exclusion>
<exclusion>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
@ -241,11 +233,10 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.t00thpick1</groupId>
<artifactId>residence</artifactId>
<version>3.0.0q-SNAPSHOT</version>
<groupId>com.bekvon.bukkit.residence</groupId>
<artifactId>Residence</artifactId>
<version>4.5.3.0</version>
<scope>provided</scope>
<exclusions>
<exclusion>
@ -274,8 +265,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>

View File

@ -1,14 +1,19 @@
package com.Acrobot.Breeze.Configuration;
import com.Acrobot.Breeze.Configuration.Annotations.PrecededBySpace;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Scanner;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Scanner;
import com.Acrobot.Breeze.Configuration.Annotations.PrecededBySpace;
/**
* A class which can be used to make configs easier to load
@ -71,18 +76,13 @@ public class Configuration {
* @return If the file ends with space
*/
public static boolean endsWithSpace(File file) {
try {
Scanner scanner = new Scanner(file);
try (Scanner scanner = new Scanner(file)) {
String lastLine = "";
while (scanner.hasNextLine()) {
lastLine = scanner.nextLine();
}
if (scanner != null) {
scanner.close();
}
return lastLine.isEmpty();
} catch (FileNotFoundException e) {
e.printStackTrace();

View File

@ -1,10 +1,11 @@
package com.Acrobot.Breeze.Database;
import javax.persistence.Entity;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.persistence.Entity;
/**
* Database class, which can be used to connect to JDBC
*
@ -49,7 +50,7 @@ public class Database {
return false;
}
String tableName = ((javax.persistence.Table) clazz.getAnnotation(javax.persistence.Table.class)).name();
String tableName = clazz.getAnnotation(javax.persistence.Table.class).name();
Table table = getTable(tableName);
EntityParser parser = new EntityParser(clazz);

View File

@ -406,7 +406,7 @@ public class Base64 {
byte[] ALPHABET = getAlphabet(options);
// 1 2 3
// 1 2 3
// 01234567890123456789012345678901 Bit position
// --------000000001111111122222222 Array position from threeBytes
// --------| || || || | Six bit groups to index ALPHABET
@ -1106,8 +1106,8 @@ public class Base64 {
else {
// There's a bad input character in the Base64 stream.
throw new java.io.IOException(String.format(
"Bad Base64 input character decimal %d in array position %d", ((int) source[i]) & 0xFF, i));
} // end else:
"Bad Base64 input character decimal %d in array position %d", (source[i]) & 0xFF, i));
} // end else:
} // each input character
byte[] out = new byte[outBuffPosn];
@ -1164,7 +1164,7 @@ public class Base64 {
boolean dontGunzip = (options & DONT_GUNZIP) != 0;
if ((bytes != null) && (bytes.length >= 4) && (!dontGunzip)) {
int head = ((int) bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
int head = (bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
if (java.util.zip.GZIPInputStream.GZIP_MAGIC == head) {
java.io.ByteArrayInputStream bais = null;
java.util.zip.GZIPInputStream gzis = null;
@ -1515,7 +1515,7 @@ public class Base64 {
out.close();
} catch (Exception ex) {
}
} // end finally
} // end finally
} // end encodeFileToFile
@ -1545,7 +1545,7 @@ public class Base64 {
out.close();
} catch (Exception ex) {
}
} // end finally
} // end finally
} // end decodeFileToFile
@ -1683,7 +1683,7 @@ public class Base64 {
else {
// Must have broken out from above.
throw new java.io.IOException("Improperly padded Base64 input.");
} // end
} // end
} // end else: decode
} // end else: get data

View File

@ -1,17 +1,32 @@
package com.Acrobot.Breeze.Utils;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
/**
* @author Acrobot
*/
public class InventoryUtil {
private static Boolean legacyContents = null;
private static ItemStack[] getStorageContents(Inventory inventory) {
if (legacyContents == null) {
try {
inventory.getStorageContents();
legacyContents = false;
} catch (NoSuchMethodError e) {
legacyContents = true;
}
}
return legacyContents ? inventory.getContents() : inventory.getStorageContents();
}
/**
* Returns the amount of the item inside the inventory
*
@ -49,7 +64,7 @@ public class InventoryUtil {
* @return Is the inventory empty?
*/
public static boolean isEmpty(Inventory inventory) {
for (ItemStack stack : inventory.getContents()) {
for (ItemStack stack : getStorageContents(inventory)) {
if (!MaterialUtil.isEmpty(stack)) {
return false;
}
@ -89,7 +104,7 @@ public class InventoryUtil {
return true;
}
for (ItemStack iStack : inventory.getContents()) {
for (ItemStack iStack : getStorageContents(inventory)) {
if (left <= 0) {
return true;
}
@ -125,7 +140,7 @@ public class InventoryUtil {
int amountLeft = item.getAmount();
for (int currentSlot = 0; currentSlot < inventory.getSize() && amountLeft > 0; currentSlot++) {
for (int currentSlot = 0; currentSlot < effectiveSize(inventory) && amountLeft > 0; currentSlot++) {
ItemStack currentItem = inventory.getItem(currentSlot);
ItemStack duplicate = item.clone();
@ -152,6 +167,12 @@ public class InventoryUtil {
return amountLeft;
}
// Don't use the armor slots or extra slots
private static int effectiveSize(Inventory inventory)
{
return getStorageContents(inventory).length;
}
/**
* Adds an item to the inventor
*

View File

@ -38,11 +38,21 @@ import com.Acrobot.ChestShop.Signs.RestrictedSign;
import com.Acrobot.ChestShop.UUIDs.NameManager;
import com.Acrobot.ChestShop.Updater.Updater;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.message.Message;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
import org.mcstats.Metrics;
@ -81,6 +91,7 @@ public class ChestShop extends JavaPlugin {
Configuration.pairFileAndClass(loadFile("config.yml"), Properties.class);
Configuration.pairFileAndClass(loadFile("local.yml"), Messages.class);
turnOffDatabaseLogging();
handleMigrations();
itemDatabase = new ItemDatabase();
@ -114,6 +125,46 @@ public class ChestShop extends JavaPlugin {
startUpdater();
}
private void turnOffDatabaseLogging() {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
org.apache.logging.log4j.core.config.Configuration config = ctx.getConfiguration();
LoggerConfig loggerConfig = config.getLoggerConfig("");
loggerConfig.addFilter(new AbstractFilter() {
@Override
public Result filter(org.apache.logging.log4j.core.Logger logger, Level level, Marker marker, String msg, Object... params) {
return filter(logger.getName(), level);
}
@Override
public Result filter(org.apache.logging.log4j.core.Logger logger, Level level, Marker marker, Object msg, Throwable t) {
return filter(logger.getName(), level);
}
@Override
public Result filter(org.apache.logging.log4j.core.Logger logger, Level level, Marker marker, Message msg, Throwable t) {
return filter(logger.getName(), level);
}
@Override
public Result filter(LogEvent event) {
return filter(event.getLoggerName(), event.getLevel());
}
private Result filter(String classname, Level level) {
if (level.isAtLeastAsSpecificAs(Level.ERROR) && !classname.contains("SqliteDatabaseType")) {
return Result.NEUTRAL;
}
if (classname.contains("SqliteDatabaseType") || classname.contains("TableUtils")) {
return Result.DENY;
} else {
return Result.NEUTRAL;
}
}
});
}
private void handleMigrations() {
File versionFile = loadFile("version");
YamlConfiguration previousVersion = YamlConfiguration.loadConfiguration(versionFile);
@ -212,8 +263,9 @@ public class ChestShop extends JavaPlugin {
registerEvent(new ItemInfoListener());
registerEvent(new GarbageTextListener());
if (this.getServer().getPluginManager().getPlugin("AuthMe") != null && this.getServer().getPluginManager().getPlugin("AuthMe").isEnabled()){
Plugin authMe = getServer().getPluginManager().getPlugin("AuthMe");
if (authMe != null && authMe.isEnabled()) {
registerEvent(new AuthMeChestShopListener());
}

View File

@ -137,4 +137,4 @@ public class Properties {
@PrecededBySpace
@ConfigurationComment("How much Heroes exp should people get for creating a ChestShop?")
public static double HEROES_EXP = 100;
}
}

View File

@ -1,5 +1,11 @@
package com.Acrobot.ChestShop.Containers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryType;
@ -7,45 +13,49 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
/**
* @author Acrobot
*/
public class AdminInventory implements Inventory {
@Override
public int getSize() {
return Integer.MAX_VALUE;
}
@Override
public int getMaxStackSize() {
return Integer.MAX_VALUE;
}
@Override
public void setMaxStackSize(int i) {
}
@Override
public String getName() {
return "Admin inventory";
}
@Override
public ItemStack getItem(int i) {
return null;
}
@Override
public void setItem(int i, ItemStack itemStack) {
}
@Override
public HashMap<Integer, ItemStack> addItem(ItemStack... itemStacks) {
return new HashMap<Integer, ItemStack>();
}
@Override
public HashMap<Integer, ItemStack> removeItem(ItemStack... itemStacks) {
return new HashMap<Integer, ItemStack>();
}
@Override
public ItemStack[] getContents() {
return new ItemStack[]{
new ItemStack(Material.CHEST, 1),
@ -53,37 +63,56 @@ public class AdminInventory implements Inventory {
};
}
@Override
public void setContents(ItemStack[] itemStacks) {
}
@Override
public ItemStack[] getStorageContents() {
return new ItemStack[0];
}
@Override
public void setStorageContents(ItemStack[] itemStacks) throws IllegalArgumentException {
}
@Override
public boolean contains(int i) {
return true;
}
@Override
public boolean contains(Material material) {
return true;
}
@Override
public boolean contains(ItemStack itemStack) {
return true;
}
@Override
public boolean contains(int i, int i1) {
return true;
}
@Override
public boolean contains(Material material, int i) {
return true;
}
@Override
public boolean contains(ItemStack itemStack, int i) {
return true;
}
@Override
public boolean containsAtLeast(ItemStack itemStack, int i) {
return true;
}
@Override
public HashMap<Integer, ? extends ItemStack> all(int i) {
HashMap<Integer, ItemStack> items = new HashMap<Integer, ItemStack>();
items.put(1, new ItemStack(i, Integer.MAX_VALUE));
@ -91,6 +120,7 @@ public class AdminInventory implements Inventory {
return items;
}
@Override
public HashMap<Integer, ? extends ItemStack> all(Material material) {
if (material.getMaxDurability() != 0) {
HashMap<Integer, ItemStack> items = new HashMap<Integer, ItemStack>();
@ -105,6 +135,7 @@ public class AdminInventory implements Inventory {
return all(material.getId());
}
@Override
public HashMap<Integer, ? extends ItemStack> all(ItemStack itemStack) {
HashMap<Integer, ItemStack> items = new HashMap<Integer, ItemStack>();
@ -116,58 +147,78 @@ public class AdminInventory implements Inventory {
return items;
}
@Override
public int first(int i) {
return 0;
}
@Override
public int first(Material material) {
return 0;
}
@Override
public int first(ItemStack itemStack) {
return 0;
}
@Override
public int firstEmpty() {
return 0;
}
@Override
public void remove(int i) {
}
@Override
public void remove(Material material) {
}
@Override
public void remove(ItemStack itemStack) {
}
@Override
public void clear(int i) {
}
@Override
public void clear() {
}
@Override
public List<HumanEntity> getViewers() {
return new ArrayList<HumanEntity>();
}
@Override
public String getTitle() {
return "Admin inventory";
}
@Override
public InventoryType getType() {
return null;
}
@Override
public InventoryHolder getHolder() {
return null;
}
@Override
public ListIterator<ItemStack> iterator() {
return null;
}
@Override
public ListIterator<ItemStack> iterator(int i) {
return null;
}
@Override
public Location getLocation() {
return null;
}
}

View File

@ -40,4 +40,4 @@ public class AuthMeChestShopListener implements Listener {
event.setCancelled(TransactionOutcome.CLIENT_DOES_NOT_HAVE_PERMISSION);
}
}
}

View File

@ -63,6 +63,9 @@ public class SignBreak implements Listener {
public static void onSignBreak(BlockBreakEvent event) {
if (!canBlockBeBroken(event.getBlock(), event.getPlayer())) {
event.setCancelled(true);
if (isSign(event.getBlock())) {
event.getBlock().getState().update();
}
}
}
@ -118,7 +121,6 @@ public class SignBreak implements Listener {
boolean canBeBroken = true;
for (Sign sign : attachedSigns) {
sign.update();
if (!canBeBroken || !ChestShopSign.isValid(sign)) {
continue;

View File

@ -1,18 +1,28 @@
package com.Acrobot.ChestShop.Listeners.Economy.Plugins;
import com.Acrobot.ChestShop.ChestShop;
import com.Acrobot.ChestShop.Events.Economy.*;
import com.Acrobot.ChestShop.UUIDs.NameManager;
import java.math.BigDecimal;
import javax.annotation.Nullable;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.RegisteredServiceProvider;
import javax.annotation.Nullable;
import java.math.BigDecimal;
import com.Acrobot.ChestShop.ChestShop;
import com.Acrobot.ChestShop.Events.Economy.AccountCheckEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyAddEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyAmountEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyCheckEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyFormatEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyHoldEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencySubtractEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyTransferEvent;
/**
* Represents a Vault connector
@ -20,11 +30,11 @@ import java.math.BigDecimal;
* @author Acrobot
*/
public class VaultListener implements Listener {
private final Economy provider;
private static Economy provider;
private VaultListener(Economy provider) {
this.provider = provider;
}
private VaultListener(Economy provider) { VaultListener.provider = provider; }
public static Economy getProvider() { return provider; }
public boolean transactionCanFail() {
return provider.getName().equals("Gringotts") || provider.getName().equals("GoldIsMoney") || provider.getName().equals("MultiCurrency");
@ -61,10 +71,16 @@ public class VaultListener implements Listener {
return;
}
double balance = provider.getBalance(NameManager.getLastSeenName(event.getAccount()), event.getWorld().getName());
double balance = 0;
//String lastSeen = NameManager.getLastSeenName(event.getAccount());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount());
if (balance > Double.MAX_VALUE) {
balance = Double.MAX_VALUE;
if (lastSeen != null) {
balance = provider.getBalance(lastSeen, event.getWorld().getName());
if (balance > Double.MAX_VALUE) {
balance = Double.MAX_VALUE;
}
}
event.setAmount(balance);
@ -77,9 +93,15 @@ public class VaultListener implements Listener {
}
World world = event.getWorld();
//String lastSeen = NameManager.getLastSeenName(event.getAccount());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount());
if (provider.has(NameManager.getLastSeenName(event.getAccount()), world.getName(), event.getDoubleAmount())) {
event.hasEnough(true);
if (lastSeen != null) {
if (provider.has(lastSeen, world.getName(), event.getDoubleAmount())) {
event.hasEnough(true);
}
} else {
event.hasEnough(false);
}
}
@ -90,10 +112,10 @@ public class VaultListener implements Listener {
}
World world = event.getWorld();
//String lastSeen = NameManager.getLastSeenName(event.getAccount());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount());
if (!provider.hasAccount(NameManager.getLastSeenName(event.getAccount()), world.getName())) {
event.hasAccount(false);
}
event.hasAccount(lastSeen != null && provider.hasAccount(lastSeen, world.getName()));
}
@EventHandler
@ -103,7 +125,6 @@ public class VaultListener implements Listener {
}
String formatted = provider.format(event.getDoubleAmount());
event.setFormattedAmount(formatted);
}
@ -114,8 +135,12 @@ public class VaultListener implements Listener {
}
World world = event.getWorld();
//String lastSeen = NameManager.getLastSeenName(event.getTarget());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getTarget());
provider.depositPlayer(NameManager.getLastSeenName(event.getTarget()), world.getName(), event.getDoubleAmount());
if (lastSeen != null) {
provider.depositPlayer(lastSeen, world.getName(), event.getDoubleAmount());
}
}
@EventHandler
@ -125,8 +150,12 @@ public class VaultListener implements Listener {
}
World world = event.getWorld();
//String lastSeen = NameManager.getLastSeenName(event.getTarget());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getTarget());
provider.withdrawPlayer(NameManager.getLastSeenName(event.getTarget()), world.getName(), event.getDoubleAmount());
if (lastSeen != null) {
provider.withdrawPlayer(lastSeen, world.getName(), event.getDoubleAmount());
}
}
@EventHandler
@ -152,18 +181,27 @@ public class VaultListener implements Listener {
return;
}
if (!provider.hasAccount(NameManager.getLastSeenName(event.getAccount()), event.getWorld().getName())) {
//String lastSeen = NameManager.getLastSeenName(event.getAccount());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount());
String world = event.getWorld().getName();
if (lastSeen == null) {
event.canHold(false);
return;
}
EconomyResponse response = provider.depositPlayer(NameManager.getLastSeenName(event.getAccount()), event.getWorld().getName(), event.getDoubleAmount());
if (!provider.hasAccount(lastSeen, world)) {
event.canHold(false);
return;
}
EconomyResponse response = provider.depositPlayer(lastSeen, world, event.getDoubleAmount());
if (!response.transactionSuccess()) {
event.canHold(false);
return;
}
provider.withdrawPlayer(NameManager.getLastSeenName(event.getAccount()), event.getWorld().getName(), event.getDoubleAmount());
provider.withdrawPlayer(lastSeen, world, event.getDoubleAmount());
}
}

View File

@ -1,16 +1,14 @@
package com.Acrobot.ChestShop.Listeners.Player;
import com.Acrobot.Breeze.Utils.NameUtil;
import com.Acrobot.ChestShop.ChestShop;
import com.Acrobot.ChestShop.UUIDs.NameManager;
import com.Acrobot.ChestShop.UUIDs.PlayerDTO;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import java.util.UUID;
import com.Acrobot.ChestShop.ChestShop;
import com.Acrobot.ChestShop.UUIDs.NameManager;
import com.Acrobot.ChestShop.UUIDs.PlayerDTO;
/**
* @author Acrobot
@ -24,20 +22,8 @@ public class PlayerConnect implements Listener {
Bukkit.getScheduler().runTaskAsynchronously(ChestShop.getPlugin(), new Runnable() {
@Override
public void run() {
String playerName = NameUtil.stripUsername(playerDTO.getName());
UUID uuid = NameManager.getUUID(playerName);
if (uuid != null && !playerDTO.getUniqueId().equals(uuid)) {
Bukkit.getScheduler().runTask(ChestShop.getPlugin(), new Runnable() {
@Override
public void run() {
Bukkit.getPlayer(playerDTO.getUniqueId()).kickPlayer("[ChestShop]" +
"Unfortunately, this username was already used by " +
"another player.");
}
});
}
// String playerName = NameUtil.stripUsername(playerDTO.getName());
// UUID uuid = NameManager.getUUID(playerName);
NameManager.storeUsername(playerDTO);
}

View File

@ -6,6 +6,7 @@ import com.Acrobot.ChestShop.Configuration.Properties;
import com.Acrobot.ChestShop.Containers.AdminInventory;
import com.Acrobot.ChestShop.Events.PreTransactionEvent;
import com.Acrobot.ChestShop.Events.TransactionEvent;
import com.Acrobot.ChestShop.Listeners.Economy.Plugins.VaultListener;
import com.Acrobot.ChestShop.Permission;
import com.Acrobot.ChestShop.Plugins.ChestShop;
import com.Acrobot.ChestShop.Security;
@ -45,12 +46,11 @@ import static org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK;
public class PlayerInteract implements Listener {
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public static void onInteract(PlayerInteractEvent event) {
public static void onInteract(PlayerInteractEvent event)
{
Block block = event.getClickedBlock();
if (block == null) {
if (block == null)
return;
}
Action action = event.getAction();
Player player = event.getPlayer();
@ -68,12 +68,10 @@ public class PlayerInteract implements Listener {
return;
}
if (!isSign(block) || player.getItemInHand().getType() == Material.SIGN) { // Blocking accidental sign edition
if (!isSign(block) || player.getItemInHand().getType() == Material.SIGN) // Blocking accidental sign edition
return;
}
Sign sign = (Sign) block.getState();
if (!ChestShopSign.isValid(sign)) {
return;
}
@ -95,17 +93,14 @@ public class PlayerInteract implements Listener {
event.setCancelled(true);
}
//Bukkit.getLogger().info("ChestShop - DEBUG - "+block.getWorld().getName()+": "+block.getLocation().getBlockX()+", "+block.getLocation().getBlockY()+", "+block.getLocation().getBlockZ());
PreTransactionEvent pEvent = preparePreTransactionEvent(sign, player, action);
if (pEvent == null) {
if (pEvent == null)
return;
}
Bukkit.getPluginManager().callEvent(pEvent);
if (pEvent.isCancelled()) {
if (pEvent.isCancelled())
return;
}
TransactionEvent tEvent = new TransactionEvent(pEvent, sign);
Bukkit.getPluginManager().callEvent(tEvent);
@ -118,14 +113,19 @@ public class PlayerInteract implements Listener {
String material = sign.getLine(ITEM_LINE);
String ownerName = NameManager.getFullUsername(name);
UUID uuid = NameManager.getUUID(ownerName);
if (uuid == null) {
if (ownerName == null || ownerName.isEmpty())
return null;
UUID uuid = NameManager.getUUID(ownerName);
if (uuid == null)
return null;
}
OfflinePlayer owner = Bukkit.getOfflinePlayer(uuid);
// check if player exists in economy
if(!ChestShopSign.isAdminShop(sign) && (owner == null || owner.getName() == null || !VaultListener.getProvider().hasAccount(owner)))
return null;
Action buy = Properties.REVERSE_BUTTONS ? LEFT_CLICK_BLOCK : RIGHT_CLICK_BLOCK;
double price = (action == buy ? PriceUtil.getBuyPrice(prices) : PriceUtil.getSellPrice(prices));
@ -133,7 +133,6 @@ public class PlayerInteract implements Listener {
Inventory ownerInventory = (ChestShopSign.isAdminShop(sign) ? new AdminInventory() : chest != null ? chest.getInventory() : null);
ItemStack item = MaterialUtil.getItem(material);
if (item == null || !NumberUtil.isInteger(quantity)) {
player.sendMessage(Messages.prefix(Messages.INVALID_SHOP_DETECTED));
return null;

View File

@ -25,7 +25,7 @@ public class EconomicModule implements Listener {
CurrencyAddEvent currencyAddEvent = new CurrencyAddEvent(BigDecimal.valueOf(event.getPrice()),
event.getOwner().getUniqueId(),
event.getSign().getWorld());
ChestShop.callEvent(currencyAddEvent);
ChestShop.callEvent(currencyAddEvent); // java.lang.StackOverflowError
CurrencySubtractEvent currencySubtractEvent = new CurrencySubtractEvent(BigDecimal.valueOf(event.getPrice()), event.getClient());
ChestShop.callEvent(currencySubtractEvent);

View File

@ -32,6 +32,10 @@ public class ShopRefundListener implements Listener {
}
String ownerName = NameManager.getFullUsername(event.getSign().getLine(NAME_LINE));
if (ownerName.isEmpty()) {
return;
}
UUID owner = NameManager.getUUID(ownerName);
CurrencyAddEvent currencyEvent = new CurrencyAddEvent(BigDecimal.valueOf(refundPrice), owner, event.getSign().getWorld());

View File

@ -76,7 +76,10 @@ public class ItemDatabase {
* @param code Item code
* @return ItemStack represented by this code
*/
public ItemStack getFromCode(String code) {
public ItemStack getFromCode(String code)
{
// TODO java.lang.StackOverflowError - http://pastebin.com/eRD8wUFM - Corrupt item DB?
try {
int id = Base62.decode(code);
Item item = itemDao.queryBuilder().where().eq("id", id).queryForFirst();

View File

@ -1,10 +1,10 @@
package com.Acrobot.ChestShop.Plugins;
import com.Acrobot.ChestShop.Events.Protection.ProtectionCheckEvent;
import net.t00thpick1.residence.Residence;
import net.t00thpick1.residence.api.ResidenceAPI;
import net.t00thpick1.residence.api.areas.ResidenceArea;
import net.t00thpick1.residence.api.flags.FlagManager;
import com.bekvon.bukkit.residence.Residence;
import com.bekvon.bukkit.residence.api.ResidenceApi;
import com.bekvon.bukkit.residence.containers.Flags;
import com.bekvon.bukkit.residence.protection.ClaimedResidence;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
@ -25,10 +25,10 @@ public class ResidenceChestProtection implements Listener {
Block block = event.getBlock();
Player player = event.getPlayer();
ResidenceArea area = ResidenceAPI.getResidenceManager().getByLocation(block.getLocation());
ClaimedResidence residence = ResidenceApi.getResidenceManager().getByLoc(block.getLocation());
if (area != null) {
if (!area.allowAction(player.getName(), FlagManager.CONTAINER) && !Residence.getInstance().isAdminMode(player)) {
if (residence != null) {
if (!residence.getPermissions().playerHas(player, Flags.container, true) && !Residence.isResAdminOn(player)) {
//Doesn't have permissions to that chest.
event.setResult(Event.Result.DENY);
}

View File

@ -81,7 +81,10 @@ public class ChestShopSign {
if (player == null) return false;
if (sign == null) return true;
return NameManager.canUseName(player, sign.getLine(NAME_LINE));
String name = sign.getLine(NAME_LINE);
if (name == null || name.isEmpty()) return true;
return NameManager.canUseName(player, name);
}
public static boolean isValidPreparedSign(String[] lines) {

View File

@ -9,20 +9,24 @@ import com.Acrobot.ChestShop.Signs.ChestShopSign;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.j256.ormlite.dao.Dao;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Level;
/**
* Lets you save/cache username and UUID relations
*
* @author Andrzej Pomirski (Acrobot)
*/
@SuppressWarnings("UnusedAssignment") //I deliberately set the variables to null while initializing
@SuppressWarnings("UnusedAssignment") // I deliberately set the variables to null while initializing
public class NameManager {
private static Dao<Account, String> accounts;
@ -35,9 +39,9 @@ public class NameManager {
return lastSeenName.get(uuid);
}
if (Bukkit.getOfflinePlayer(uuid).getName() != null) {
String lastSeen = Bukkit.getOfflinePlayer(uuid).getName();
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
String lastSeen = player.getName();
if (lastSeen != null) {
lastSeenName.put(uuid, lastSeen);
return lastSeen;
}
@ -46,25 +50,32 @@ public class NameManager {
try {
account = accounts.queryBuilder().selectColumns("lastSeenName", "name").where().eq("uuid", uuid).queryForFirst();
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (SQLException ex) {
Bukkit.getLogger().log(Level.WARNING, "[ChestShop] Failed to find last seen name for " + uuid + ":", ex);
}
if (account == null) {
return "";
return null;
}
if (account.getLastSeenName() != null) {
lastSeenName.put(uuid, account.getLastSeenName());
} else if (account.getName() != null) {
lastSeenName.put(uuid, account.getName());
lastSeen = account.getLastSeenName();
if (lastSeen != null) {
lastSeenName.put(uuid, lastSeen);
return lastSeen;
}
return account.getLastSeenName();
lastSeen = account.getName();
if (lastSeen != null) {
lastSeenName.put(uuid, lastSeen);
return lastSeen;
}
return null;
}
public static UUID getUUID(String username) {
Validate.notEmpty(username, "user cannot be null or empty!");
if (usernameToUUID.containsKey(username)) {
return usernameToUUID.get(username);
}
@ -194,6 +205,7 @@ public class NameManager {
account = new Account(player.getName(), player.getUniqueId());
if (!usernameToUUID.inverse().containsKey(uuid)) {
usernameToUUID.remove(player.getName()); // https://github.com/dmulloy2/ChestShop-3/issues/11
usernameToUUID.inverse().put(uuid, player.getName());
}
@ -207,10 +219,17 @@ public class NameManager {
}
public static void dropUsername(final Player player) {
final UUID uuid = player.getUniqueId();
if (player == null) return;
if (usernameToUUID.containsValue(uuid)) {
usernameToUUID.inverse().remove(uuid);
final UUID uuid = player.getUniqueId();
if (uuid == null) return;
try {
if (usernameToUUID.containsValue(uuid)) {
usernameToUUID.inverse().remove(uuid);
}
} catch (NullPointerException e) {
// Sigh...
}
String shortName = NameUtil.stripUsername(player.getName());
@ -227,7 +246,7 @@ public class NameManager {
return false;
}
return shortenedName.equals(name) || Permission.otherName(player, name) || player.getUniqueId().equals(getUUID(name));
return shortenedName.equals(name) || Permission.otherName(player, name) || (!name.isEmpty() && player.getUniqueId().equals(getUUID(name)));
}
public static boolean isAdminShop(UUID uuid) {

View File

@ -1,17 +1,8 @@
name: ChestShop
main: com.Acrobot.ChestShop.ChestShop
version: ${project.version}
#for CButD
dev-url: http://dev.bukkit.org/server-mods/chestshop/
author: Acrobot
description: >
A chest shop for economy plugins.
author: [Acrobot, dmulloy2, L4BORG]
description: A chest shop for economy plugins.
depend: [Vault]
softdepend: [LWC, Lockette, Deadbolt, OddItem, WorldGuard, Heroes, SimpleChestLock, Residence]