Fixed shops duplicating after extending

This commit is contained in:
Eric 2017-06-06 18:13:08 +02:00
parent 4c02a77037
commit 3eef8250d2
3 changed files with 99 additions and 54 deletions

View File

@ -17,11 +17,11 @@ import de.epiceric.shopchest.language.LanguageUtils;
import de.epiceric.shopchest.language.LocalizedMessage; import de.epiceric.shopchest.language.LocalizedMessage;
import de.epiceric.shopchest.nms.Hologram; import de.epiceric.shopchest.nms.Hologram;
import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.shop.Shop;
import de.epiceric.shopchest.utils.Callback;
import de.epiceric.shopchest.utils.Permissions; import de.epiceric.shopchest.utils.Permissions;
import de.epiceric.shopchest.utils.ShopUtils; import de.epiceric.shopchest.utils.ShopUtils;
import de.epiceric.shopchest.utils.Utils; import de.epiceric.shopchest.utils.Utils;
import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.Claim;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -59,28 +59,27 @@ public class ChestProtectListener implements Listener {
this.worldGuard = worldGuard; this.worldGuard = worldGuard;
} }
private void remove(final Shop shop, final Block b, Player p) { private void remove(final Shop shop, final Block b, final Player p) {
shopUtils.removeShop(shop, true);
if (shop.getInventoryHolder() instanceof DoubleChest) { if (shop.getInventoryHolder() instanceof DoubleChest) {
DoubleChest dc = (DoubleChest) shop.getInventoryHolder(); DoubleChest dc = (DoubleChest) shop.getInventoryHolder();
final Chest l = (Chest) dc.getLeftSide(); final Chest l = (Chest) dc.getLeftSide();
final Chest r = (Chest) dc.getRightSide(); final Chest r = (Chest) dc.getRightSide();
Bukkit.getScheduler().runTaskLater(plugin, new Runnable() { Location loc = (b.getLocation().equals(l.getLocation()) ? r.getLocation() : l.getLocation());
final Shop newShop = new Shop(shop.getID(), plugin, shop.getVendor(), shop.getProduct(), loc, shop.getBuyPrice(), shop.getSellPrice(), shop.getShopType());
shopUtils.removeShop(shop, true, new Callback(plugin) {
@Override @Override
public void run() { public void onResult(Object result) {
Location loc = (b.getLocation().equals(l.getLocation()) ? r.getLocation() : l.getLocation());
Shop newShop = new Shop(shop.getID(), plugin, shop.getVendor(), shop.getProduct(), loc, shop.getBuyPrice(), shop.getSellPrice(), shop.getShopType());
newShop.create(true); newShop.create(true);
shopUtils.addShop(newShop, true); shopUtils.addShop(newShop, true);
} }
}, 1L); });
return; } else {
shopUtils.removeShop(shop, true);
plugin.debug(String.format("%s broke %s's shop (#%d)", p.getName(), shop.getVendor().getName(), shop.getID()));
p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.SHOP_REMOVED));
} }
plugin.debug(String.format("%s broke %s's shop (#%d)", p.getName(), shop.getVendor().getName(), shop.getID()));
p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.SHOP_REMOVED));
} }
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
@ -130,7 +129,7 @@ public class ChestProtectListener implements Listener {
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent e) { public void onBlockPlace(BlockPlaceEvent e) {
Player p = e.getPlayer(); final Player p = e.getPlayer();
Block b = e.getBlockPlaced(); Block b = e.getBlockPlaced();
if (b.getType().equals(Material.CHEST) || b.getType().equals(Material.TRAPPED_CHEST)) { if (b.getType().equals(Material.CHEST) || b.getType().equals(Material.TRAPPED_CHEST)) {
@ -143,7 +142,7 @@ public class ChestProtectListener implements Listener {
Chest l = (Chest) dc.getLeftSide(); Chest l = (Chest) dc.getLeftSide();
if (shopUtils.isShop(r.getLocation()) || shopUtils.isShop(l.getLocation())) { if (shopUtils.isShop(r.getLocation()) || shopUtils.isShop(l.getLocation())) {
Shop shop; final Shop shop;
if (b.getLocation().equals(r.getLocation())) { if (b.getLocation().equals(r.getLocation())) {
shop = shopUtils.getShop(l.getLocation()); shop = shopUtils.getShop(l.getLocation());
@ -171,12 +170,13 @@ public class ChestProtectListener implements Listener {
for (Resident resident : town.getResidents()) { for (Resident resident : town.getResidents()) {
if (resident.getName().equals(p.getName())) { if (resident.getName().equals(p.getName())) {
if (resident.isMayor()) { if (resident.isMayor()) {
externalPluginsAllowed &= (config.towny_shop_plots_mayor.contains(townBlock.getType().name())); externalPluginsAllowed = (config.towny_shop_plots_mayor.contains(townBlock.getType().name()));
} else if (resident.isKing()) { } else if (resident.isKing()) {
externalPluginsAllowed &= (config.towny_shop_plots_king.contains(townBlock.getType().name())); externalPluginsAllowed = (config.towny_shop_plots_king.contains(townBlock.getType().name()));
} else { } else {
externalPluginsAllowed &= (config.towny_shop_plots_residents.contains(townBlock.getType().name())); externalPluginsAllowed = (config.towny_shop_plots_residents.contains(townBlock.getType().name()));
} }
break;
} }
} }
} catch (Exception ex) { } catch (Exception ex) {
@ -189,45 +189,49 @@ public class ChestProtectListener implements Listener {
com.intellectualcrafters.plot.object.Location loc = com.intellectualcrafters.plot.object.Location loc =
new com.intellectualcrafters.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ()); new com.intellectualcrafters.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ());
externalPluginsAllowed &= Utils.isFlagAllowedOnPlot(loc.getOwnedPlot(), PlotSquaredShopFlag.CREATE_SHOP, p); externalPluginsAllowed = Utils.isFlagAllowedOnPlot(loc.getOwnedPlot(), PlotSquaredShopFlag.CREATE_SHOP, p);
} }
if (externalPluginsAllowed && plugin.hasUSkyBlock() && config.enable_uskyblock_integration) { if (externalPluginsAllowed && plugin.hasUSkyBlock() && config.enable_uskyblock_integration) {
IslandInfo islandInfo = plugin.getUSkyBlock().getIslandInfo(b.getLocation()); IslandInfo islandInfo = plugin.getUSkyBlock().getIslandInfo(b.getLocation());
if (islandInfo != null) { if (islandInfo != null) {
externalPluginsAllowed &= islandInfo.getMembers().contains(p.getName()) || islandInfo.getLeader().equals(p.getName()); externalPluginsAllowed = islandInfo.getMembers().contains(p.getName()) || islandInfo.getLeader().equals(p.getName());
} }
} }
if (externalPluginsAllowed && plugin.hasASkyBlock() && config.enable_askyblock_integration) { if (externalPluginsAllowed && plugin.hasASkyBlock() && config.enable_askyblock_integration) {
Island island = ASkyBlockAPI.getInstance().getIslandAt(b.getLocation()); Island island = ASkyBlockAPI.getInstance().getIslandAt(b.getLocation());
if (island != null) { if (island != null) {
externalPluginsAllowed &= island.getMembers().contains(p.getUniqueId()) || island.getOwner().equals(p.getUniqueId()); externalPluginsAllowed = island.getMembers().contains(p.getUniqueId()) || island.getOwner().equals(p.getUniqueId());
} }
} }
if (externalPluginsAllowed && plugin.hasIslandWorld() && config.enable_islandworld_integration && IslandWorldApi.isInitialized()) { if (externalPluginsAllowed && plugin.hasIslandWorld() && config.enable_islandworld_integration && IslandWorldApi.isInitialized()) {
if (b.getWorld().getName().equals(IslandWorldApi.getIslandWorld().getName())) { if (b.getWorld().getName().equals(IslandWorldApi.getIslandWorld().getName())) {
externalPluginsAllowed &= IslandWorldApi.canBuildOnLocation(p, b.getLocation(), true); externalPluginsAllowed = IslandWorldApi.canBuildOnLocation(p, b.getLocation(), true);
} }
} }
if (externalPluginsAllowed && plugin.hasGriefPrevention() && config.enable_griefprevention_integration) { if (externalPluginsAllowed && plugin.hasGriefPrevention() && config.enable_griefprevention_integration) {
Claim claim = plugin.getGriefPrevention().dataStore.getClaimAt(b.getLocation(), false, null); Claim claim = plugin.getGriefPrevention().dataStore.getClaimAt(b.getLocation(), false, null);
if (claim != null) { if (claim != null) {
externalPluginsAllowed &= claim.allowContainers(p) == null; externalPluginsAllowed = claim.allowContainers(p) == null;
} }
} }
if (externalPluginsAllowed || p.hasPermission(Permissions.EXTEND_PROTECTED)) { if (externalPluginsAllowed || p.hasPermission(Permissions.EXTEND_PROTECTED)) {
if (shop.getVendor().getUniqueId().equals(p.getUniqueId()) || p.hasPermission(Permissions.EXTEND_OTHER)) { if (shop.getVendor().getUniqueId().equals(p.getUniqueId()) || p.hasPermission(Permissions.EXTEND_OTHER)) {
if (b.getRelative(BlockFace.UP).getType() == Material.AIR) { if (b.getRelative(BlockFace.UP).getType() == Material.AIR) {
shopUtils.removeShop(shop, true); final Shop newShop = new Shop(shop.getID(), plugin, shop.getVendor(), shop.getProduct(), shop.getLocation(), shop.getBuyPrice(), shop.getSellPrice(), shop.getShopType());
Shop newShop = new Shop(shop.getID(), plugin, shop.getVendor(), shop.getProduct(), shop.getLocation(), shop.getBuyPrice(), shop.getSellPrice(), shop.getShopType());
newShop.create(true); shopUtils.removeShop(shop, true, new Callback(plugin) {
shopUtils.addShop(newShop, true); @Override
plugin.debug(String.format("%s extended %s's shop (#%d)", p.getName(), shop.getVendor().getName(), shop.getID())); public void onResult(Object result) {
newShop.create(true);
shopUtils.addShop(newShop, true);
plugin.debug(String.format("%s extended %s's shop (#%d)", p.getName(), shop.getVendor().getName(), shop.getID()));
}
});
} else { } else {
e.setCancelled(true); e.setCancelled(true);
p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.CHEST_BLOCKED)); p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.CHEST_BLOCKED));

View File

@ -304,28 +304,44 @@ public abstract class Database {
ResultSet rs = null; ResultSet rs = null;
try { try {
ps = connection.prepareStatement("REPLACE INTO shops (vendor,product,world,x,y,z,buyprice,sellprice,shoptype) VALUES(?,?,?,?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS); if (!shop.hasId()) {
ps = connection.prepareStatement("REPLACE INTO shops (vendor,product,world,x,y,z,buyprice,sellprice,shoptype) VALUES(?,?,?,?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
ps.setString(1, shop.getVendor().getUniqueId().toString()); ps.setString(1, shop.getVendor().getUniqueId().toString());
ps.setString(2, Utils.encode(shop.getProduct())); ps.setString(2, Utils.encode(shop.getProduct()));
ps.setString(3, shop.getLocation().getWorld().getName()); ps.setString(3, shop.getLocation().getWorld().getName());
ps.setInt(4, shop.getLocation().getBlockX()); ps.setInt(4, shop.getLocation().getBlockX());
ps.setInt(5, shop.getLocation().getBlockY()); ps.setInt(5, shop.getLocation().getBlockY());
ps.setInt(6, shop.getLocation().getBlockZ()); ps.setInt(6, shop.getLocation().getBlockZ());
ps.setDouble(7, shop.getBuyPrice()); ps.setDouble(7, shop.getBuyPrice());
ps.setDouble(8, shop.getSellPrice()); ps.setDouble(8, shop.getSellPrice());
ps.setString(9, shop.getShopType().toString()); ps.setString(9, shop.getShopType().toString());
ps.executeUpdate(); ps.executeUpdate();
int shopId = -1; int shopId = -1;
rs = ps.getGeneratedKeys(); rs = ps.getGeneratedKeys();
if (rs.next()) { if (rs.next()) {
shopId = rs.getInt(1); shopId = rs.getInt(1);
}
shop.setId(shopId);
} else {
ps = connection.prepareStatement("REPLACE INTO shops (id,vendor,product,world,x,y,z,buyprice,sellprice,shoptype) VALUES(?,?,?,?,?,?,?,?,?,?)");
ps.setInt(1, shop.getID());
ps.setString(2, shop.getVendor().getUniqueId().toString());
ps.setString(3, Utils.encode(shop.getProduct()));
ps.setString(4, shop.getLocation().getWorld().getName());
ps.setInt(5, shop.getLocation().getBlockX());
ps.setInt(6, shop.getLocation().getBlockY());
ps.setInt(7, shop.getLocation().getBlockZ());
ps.setDouble(8, shop.getBuyPrice());
ps.setDouble(9, shop.getSellPrice());
ps.setString(10, shop.getShopType().toString());
ps.executeUpdate();
} }
shop.setId(shopId); if (callback != null) callback.callSyncResult(shop.getID());
if (callback != null) callback.callSyncResult(shopId);
plugin.debug("Adding shop to database (#" + shop.getID() + ")"); plugin.debug("Adding shop to database (#" + shop.getID() + ")");
} catch (SQLException ex) { } catch (SQLException ex) {
if (callback != null) callback.callSyncError(ex); if (callback != null) callback.callSyncError(ex);

View File

@ -61,8 +61,9 @@ public class ShopUtils {
* Add a shop * Add a shop
* @param shop Shop to add * @param shop Shop to add
* @param addToDatabase Whether the shop should also be added to the database * @param addToDatabase Whether the shop should also be added to the database
* @param callback Callback that - if succeeded - returns the ID the shop had or was given (as {@code int})
*/ */
public void addShop(Shop shop, boolean addToDatabase) { public void addShop(Shop shop, boolean addToDatabase, Callback callback) {
InventoryHolder ih = shop.getInventoryHolder(); InventoryHolder ih = shop.getInventoryHolder();
plugin.debug("Adding shop... (#" + shop.getID() + ")"); plugin.debug("Adding shop... (#" + shop.getID() + ")");
@ -81,17 +82,29 @@ public class ShopUtils {
shopLocation.put(shop.getLocation(), shop); shopLocation.put(shop.getLocation(), shop);
} }
if (addToDatabase) if (addToDatabase) {
plugin.getShopDatabase().addShop(shop, null); plugin.getShopDatabase().addShop(shop, callback);
} else {
if (callback != null) callback.callSyncResult(shop.getID());
}
} }
/** /**
* Remove a shop * Add a shop
* @param shop Shop to add
* @param addToDatabase Whether the shop should also be added to the database
*/
public void addShop(Shop shop, boolean addToDatabase) {
addShop(shop, addToDatabase, null);
}
/** Remove a shop
* @param shop Shop to remove * @param shop Shop to remove
* @param removeFromDatabase Whether the shop should also be removed from the database * @param removeFromDatabase Whether the shop should also be removed from the database
* @param callback Callback that - if succeeded - returns null
*/ */
public void removeShop(Shop shop, boolean removeFromDatabase) { public void removeShop(Shop shop, boolean removeFromDatabase, Callback callback) {
plugin.debug("Removing shop (#" + shop.getID() + ")"); plugin.debug("Removing shop (#" + shop.getID() + ")");
InventoryHolder ih = shop.getInventoryHolder(); InventoryHolder ih = shop.getInventoryHolder();
@ -110,8 +123,20 @@ public class ShopUtils {
shop.removeItem(); shop.removeItem();
shop.removeHologram(); shop.removeHologram();
if (removeFromDatabase) if (removeFromDatabase) {
plugin.getShopDatabase().removeShop(shop, null); plugin.getShopDatabase().removeShop(shop, callback);
} else {
if (callback != null) callback.callSyncResult(null);
}
}
/**
* Remove a shop
* @param shop Shop to remove
* @param removeFromDatabase Whether the shop should also be removed from the database
*/
public void removeShop(Shop shop, boolean removeFromDatabase) {
removeShop(shop, removeFromDatabase, null);
} }
/** /**