From 3d3f9012fff51ebba57a839a166ba2f33bb6a4ee Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Thu, 4 Dec 2014 23:41:49 -0800 Subject: [PATCH] Added some base Clans shops. Added support for Gold Refactored failed db call code a bit. --- .../core/common/util/RunnableStatus.java | 6 ++ .../core/database/RepositoryBase.java | 62 +++++-------- .../core/donation/DonationManager.java | 83 ++++++++++++++++++ .../src/mineplex/core/donation/Donor.java | 11 +++ .../repository/DonationRepository.java | 21 +++++ .../game/clans/shop/BuildingPage.java | 5 +- .../src/mineplex/game/clans/shop/PvpItem.java | 25 ++++++ .../game/clans/shop/PvpShopButton.java | 42 +++++++++ Website/LOCWebsite.suo | Bin 474624 -> 474624 bytes 9 files changed, 214 insertions(+), 41 deletions(-) create mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/RunnableStatus.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpItem.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/RunnableStatus.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/RunnableStatus.java new file mode 100644 index 000000000..409cfc0fc --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/RunnableStatus.java @@ -0,0 +1,6 @@ +package mineplex.core.common.util; + +public interface RunnableStatus +{ + public boolean run(); +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java b/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java index 973c7da2d..dd157d0af 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java @@ -11,7 +11,6 @@ import java.util.Iterator; import mineplex.core.common.util.NautHashMap; import mineplex.core.database.column.Column; import mineplex.core.logger.Logger; -import mineplex.core.timing.TimingManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -229,14 +228,7 @@ public abstract class RepositoryBase implements Listener } catch (Exception exception) { - Logger.Instance.log(errorMessage + exception.getMessage()); - - databaseRunnable.incrementFailCount(); - - synchronized (_queueLock) - { - _failedQueue.put(databaseRunnable, errorMessage); - } + processFailedDatabaseCall(databaseRunnable, exception.getMessage(), errorMessage); } } }); @@ -244,6 +236,25 @@ public abstract class RepositoryBase implements Listener asyncThread.start(); } + protected void processFailedDatabaseCall(DatabaseRunnable databaseRunnable, String errorPreMessage, String runnableMessage) + { + if (databaseRunnable.getFailedCounts() < 4) + { + databaseRunnable.incrementFailCount(); + + synchronized (_queueLock) + { + _failedQueue.put(databaseRunnable, runnableMessage); + } + + Logger.Instance.log(errorPreMessage + runnableMessage); + } + else + { + Logger.Instance.log("Abandoning database call : " + runnableMessage); + } + } + @EventHandler public void processDatabaseQueue(UpdateEvent event) { @@ -259,37 +270,8 @@ public abstract class RepositoryBase implements Listener { for (Iterator runnablesIterator = _failedQueue.keySet().iterator(); runnablesIterator.hasNext();) { - final DatabaseRunnable databaseRunnable = runnablesIterator.next(); - - Thread asyncThread = new Thread(new Runnable() - { - public void run() - { - try - { - databaseRunnable.run(); - } - catch (Exception exception) - { - Logger.Instance.log(_failedQueue.get(databaseRunnable) + exception.getMessage()); - - if (databaseRunnable.getFailedCounts() < 4) - { - synchronized (_queueLock) - { - _failedQueue.put(databaseRunnable, _failedQueue.get(databaseRunnable)); - } - } - else - { - Logger.Instance.log("Abandoning database call : " + _failedQueue.get(databaseRunnable)); - } - } - } - }); - - runnablesIterator.remove(); - asyncThread.start(); + DatabaseRunnable databaseRunnable = runnablesIterator.next(); + handleDatabaseCall(databaseRunnable, _failedQueue.get(databaseRunnable)); } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java index 70049fe90..b17cb0aa7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java @@ -30,6 +30,7 @@ public class DonationManager extends MiniPlugin private NautHashMap> _gemQueue = new NautHashMap>(); private NautHashMap> _coinQueue = new NautHashMap>(); + private NautHashMap> _goldQueue = new NautHashMap>(); public DonationManager(JavaPlugin plugin, String webAddress) { @@ -301,6 +302,88 @@ public class DonationManager extends MiniPlugin //Clean _coinQueue.clear(); } + + public void RewardGold(Callback callback, String caller, String name, UUID uuid, int amount) + { + RewardGold(callback, caller, name, uuid, amount, true); + } + + public void RewardGold(final Callback callback, final String caller, final String name, final UUID uuid, final int amount, final boolean updateTotal) + { + _repository.rewardGold(new Callback() + { + public void run(Boolean success) + { + if (success) + { + if (updateTotal) + { + Donor donor = Get(name); + + if (donor != null) + { + donor.addGold(amount); + } + } + + if (callback != null) + callback.run(true); + } + } + }, caller, name, uuid.toString(), amount); + } + + public void RewardGoldLater(final String caller, final Player player, final int amount) + { + if (!_goldQueue.containsKey(player)) + _goldQueue.put(player, new NautHashMap()); + + int totalAmount = amount; + + if (_goldQueue.get(player).containsKey(caller)) + totalAmount += _goldQueue.get(player).get(caller); + + _goldQueue.get(player).put(caller, totalAmount); + + //Do Temp Change + Donor donor = Get(player.getName()); + + if (donor != null) + donor.addGold(amount); + } + + @EventHandler + public void UpdateGoldQueue(UpdateEvent event) + { + if (event.getType() != UpdateType.SLOWER) + return; + + for (Player player : _goldQueue.keySet()) + { + String caller = null; + int total = 0; + + for (String curCaller : _goldQueue.get(player).keySet()) + { + caller = curCaller; + total += _goldQueue.get(player).get(curCaller); + } + + if (caller == null) + continue; + + //Actually Add Gold + RewardGold(null, caller, player.getName(), player.getUniqueId(), total, false); + + System.out.println("Queue Added [" + player + "] with Gold [" + total + "] for [" + caller + "]"); + + //Clean + _goldQueue.get(player).clear(); + } + + //Clean + _goldQueue.clear(); + } public void applyKits(String playerName) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java index a1f2ef1dd..af5dcd692 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/Donor.java @@ -12,6 +12,7 @@ public class Donor { private int _gems; private int _coins; + private int _gold; private boolean _donated; private List _salesPackagesOwned; private List _unknownSalesPackagesOwned; @@ -159,9 +160,19 @@ public class Donor { _coins += amount; } + + public void addGold(int amount) + { + _gold += amount; + } public List getCoinTransactions() { return _coinTransactions; } + + public int getGold() + { + return _gold; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java index 8166c808e..755c35f28 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java @@ -13,6 +13,7 @@ import mineplex.core.database.column.ColumnVarChar; import mineplex.core.donation.repository.token.GemRewardToken; import mineplex.core.donation.repository.token.PurchaseToken; import mineplex.core.donation.repository.token.UnknownPurchaseToken; +import mineplex.core.logger.Logger; import mineplex.core.server.remotecall.AsyncJsonWebCall; import mineplex.core.server.remotecall.JsonWebCall; import mineplex.core.server.util.TransactionResponse; @@ -23,6 +24,7 @@ public class DonationRepository extends RepositoryBase private static String CREATE_GEM_TRANSACTION_TABLE = "CREATE TABLE IF NOT EXISTS accountGemTransactions (id INT NOT NULL AUTO_INCREMENT, accounts_uuid VARCHAR(100), reason VARCHAR(100), gems INT, PRIMARY KEY (id), FOREIGN KEY (accounts_uuid) REFERENCES accounts(uuid), INDEX gemUuidIndex (accounts_uuid));"; private static String INSERT_COIN_TRANSACTION = "INSERT INTO accountCoinTransactions(accounts_uuid, reason, coins) VALUES(?, ?, ?);"; private static String UPDATE_ACCOUNT_COINS = "UPDATE accounts SET coins = coins + ? WHERE uuid = ?;"; + private static String UPDATE_ACCOUNT_GOLD = "UPDATE accounts SET gold = gold + ? WHERE uuid = ?;"; private static String UPDATE_NULL_ACCOUNT_GEMS_AND_COINS_ = "UPDATE accounts SET gems = ?, coins = ? WHERE uuid = ? AND gems IS NULL AND coins IS NULL;"; private String _webAddress; @@ -174,6 +176,25 @@ public class DonationRepository extends RepositoryBase } }), "Error updating player coin amount in DonationRepository : "); } + + public void rewardGold(final Callback callback, final String giver, final String name, final String uuid, final int gold) + { + final GemRewardToken token = new GemRewardToken(); + token.Source = giver; + token.Name = name; + token.Amount = gold; + + handleDatabaseCall(new DatabaseRunnable(new Runnable() + { + public void run() + { + if (executeUpdate(UPDATE_ACCOUNT_GOLD, new ColumnInt("gold", gold), new ColumnVarChar("uuid", 100, uuid)) < 1) + { + Logger.Instance.log("Account gold wasn't updated for " + name); + } + } + }), "Error updating player gold amount in DonationRepository : "); + } @Override protected void initialize() diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingPage.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingPage.java index 607cbca6e..69bf2b835 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingPage.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingPage.java @@ -1,5 +1,7 @@ package mineplex.game.clans.shop; +import org.bukkit.Material; + import mineplex.core.account.CoreClientManager; import mineplex.core.donation.DonationManager; import mineplex.core.shop.page.ShopPageBase; @@ -15,6 +17,7 @@ public class BuildingPage extends ShopPageBase @Override protected void BuildPage() { - + PvpItem item = new PvpItem(Material.STONE, (byte)0, 1, "Stone", 25, 64); + AddButton(1, item, new PvpShopButton(this, item)); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpItem.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpItem.java new file mode 100644 index 000000000..5d6aca0f7 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpItem.java @@ -0,0 +1,25 @@ +package mineplex.game.clans.shop; + +import org.bukkit.Material; + +import mineplex.core.common.util.C; +import mineplex.core.shop.item.ShopItem; + +public class PvpItem extends ShopItem +{ + private static String LEFT_CLICK_BUY = C.cWhite + "Left-Click to Buy 1"; + + public PvpItem(Material type, byte data, int displayAmount, String name, int price, int bulkCount) + { + super(type, data, name, new String[] + { + C.cYellow + C.Bold + name, + C.cWhite + " ", + LEFT_CLICK_BUY, + C.cWhite + "Costs " + C.cGreen + "$" + price, + C.cWhite + " ", + C.cWhite + "Shift Left-Click to Buy " + bulkCount, + C.cWhite + "Costs " + C.cGreen + "$" + (price * bulkCount), + }, 0, false, false); + } +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java new file mode 100644 index 000000000..1117664e5 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java @@ -0,0 +1,42 @@ +package mineplex.game.clans.shop; + +import org.bukkit.entity.Player; + +import mineplex.core.shop.item.ComplexButton; +import mineplex.core.shop.page.ShopPageBase; +import mineplex.game.clans.clans.ClansManager; + +public class PvpShopButton> extends ComplexButton +{ + protected PageType Page; + protected PvpItem Item; + + public PvpShopButton(PageType page, PvpItem item) + { + Page = page; + Item = item; + } + + @Override + public void ClickedLeft(Player player) + { + int balance = Page.getDonationManager().Get(player.getName()).getGold(); + + + } + + @Override + public void ClickedShiftLeft(Player player) + { + } + + @Override + public void ClickedRight(Player player) + { + } + + @Override + public void ClickedShiftRight(Player player) + { + } +} diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index 3db6bb26feb29f9cbda9e2f540bc9cd02bba5ddc..738ecd2f8fc778751654d8dae418c9eeee1bee10 100644 GIT binary patch delta 13081 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