From bed2545b0414ea1ddb2d713afaeb4a5fe28633e0 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Fri, 8 Aug 2014 20:48:15 -0500 Subject: [PATCH] Added back buttons for sub menus. Added Gem booster pack and booster count display. Added reason and admin to mute message Fixed inventory tracking. --- .../.externalToolBuilders/asdf.launch | 3 +- Plugins/Mineplex.Core/.project | 2 +- .../core/inventory/ClientInventory.java | 28 +++++- .../mineplex/core/inventory/ClientItem.java | 6 ++ .../mineplex/core/inventory/GemBooster.java | 29 ++++++ .../core/inventory/InventoryManager.java | 92 +++++++++++++++--- .../inventory/data/InventoryRepository.java | 74 +++----------- .../mineplex/core/inventory/data/Item.java | 18 ++-- .../core/inventory/ui/page/GadgetPage.java | 1 + .../mineplex/core/inventory/ui/page/Menu.java | 45 ++++++++- .../core/inventory/ui/page/MountPage.java | 5 +- .../core/inventory/ui/page/PetTagPage.java | 3 +- .../src/mineplex/core/punish/Punish.java | 4 +- Website/LOCWebsite.suo | Bin 474624 -> 474624 bytes 14 files changed, 212 insertions(+), 98 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/inventory/GemBooster.java diff --git a/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch b/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch index 88af961d4..c531d22bb 100644 --- a/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch +++ b/Plugins/Mineplex.Core/.externalToolBuilders/asdf.launch @@ -1,6 +1,7 @@ + @@ -10,7 +11,7 @@ - + diff --git a/Plugins/Mineplex.Core/.project b/Plugins/Mineplex.Core/.project index 62da8a3cf..83838c414 100644 --- a/Plugins/Mineplex.Core/.project +++ b/Plugins/Mineplex.Core/.project @@ -12,7 +12,7 @@ org.eclipse.ui.externaltools.ExternalToolBuilder - full,incremental, + auto,full,incremental, LaunchConfigHandle diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ClientInventory.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ClientInventory.java index 8f8ff2ecc..501bddf52 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ClientInventory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ClientInventory.java @@ -1,14 +1,32 @@ package mineplex.core.inventory; -import java.util.ArrayList; -import java.util.List; +import mineplex.core.common.util.NautHashMap; public class ClientInventory { - public List Items = new ArrayList(); - + public NautHashMap Items = new NautHashMap(); + public int getChestCount() { - return 0; + return Items.containsKey("LootChest") ? Items.get("LootChest").Count : 0; + } + + public void addItem(ClientItem item) + { + if (!Items.containsKey(item.Item.Name)) + Items.put(item.Item.Name, new ClientItem(item.Item, 0)); + + Items.get(item.Item.Name).Count += item.Count; + } + + public void removeItem(ClientItem item) + { + if (!Items.containsKey(item.Item.Name)) + return; + + Items.get(item.Item.Name).Count -= item.Count; + + if (Items.get(item.Item.Name).Count == 0) + Items.remove(item.Item.Name); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ClientItem.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ClientItem.java index 1faa80d4f..26a47144b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ClientItem.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ClientItem.java @@ -6,4 +6,10 @@ public class ClientItem { public Item Item; public int Count; + + public ClientItem(Item item, int count) + { + Item = item; + Count = count; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/GemBooster.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/GemBooster.java new file mode 100644 index 000000000..955c44465 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/GemBooster.java @@ -0,0 +1,29 @@ +package mineplex.core.inventory; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.common.CurrencyType; +import mineplex.core.common.util.C; +import mineplex.core.shop.item.SalesPackageBase; + +public class GemBooster extends SalesPackageBase +{ + public GemBooster(int gemBoosters) + { + super("20 Gem Booster Pack", Material.EMERALD, (byte)0, new String[] + { + C.cYellow + "1000 Coins", + " ", + C.cWhite + "Use in game lobbies to boost gems earned for all.", + C.cWhite + "Your Gem Boosters: " + C.cGreen + gemBoosters + }, 1000); + + KnownPackage = false; + } + + @Override + public void Sold(Player player, CurrencyType currencyType) + { + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java index 42b7364e3..4a23656e3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java @@ -1,8 +1,11 @@ package mineplex.core.inventory; +import java.util.List; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -16,8 +19,7 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.NautHashMap; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.types.Gadget; -import mineplex.core.gadget.types.GadgetType; + import mineplex.core.inventory.data.Category; import mineplex.core.inventory.data.InventoryRepository; import mineplex.core.inventory.data.Item; @@ -27,7 +29,9 @@ import mineplex.core.mount.MountManager; import mineplex.core.pet.PetManager; public class InventoryManager extends MiniClientPlugin -{ +{ + private static Object _inventoryLock = new Object(); + private GadgetManager _gadgetManager; private MountManager _mountManager; private PetManager _petManager; @@ -36,8 +40,8 @@ public class InventoryManager extends MiniClientPlugin private InventoryRepository _repository; - private NautHashMap _items; - private NautHashMap _categories; + private NautHashMap _items = new NautHashMap(); + private NautHashMap _categories = new NautHashMap(); public InventoryManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager, GadgetManager gadgetManager, MountManager mountManager, PetManager petManager) { @@ -51,21 +55,79 @@ public class InventoryManager extends MiniClientPlugin _repository = new InventoryRepository(plugin); - /* - for (GadgetType gadgetType : GadgetType.values()) + Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(GetPlugin(), new Runnable() { - if (!_categories.containsKey(gadgetType.name())) - _repository.addCategory(new Category(0, gadgetType.name())); - - for (Gadget gadget : _gadgetManager.getGadgets(gadgetType)) + public void run() { - if (!_items.containsKey(gadget.GetName())) - _repository.addItem(new Item(0, gadget.GetName(), null)); + updateItems(); + updateCategories(); } - } - */ + }, 20L); } + private void updateItems() + { + List items = _repository.retrieveItems(); + + synchronized (_inventoryLock) + { + for (Item item : items) + { + _items.put(item.Name, item); + } + } + } + + private void updateCategories() + { + List categories = _repository.retrieveCategories(); + + synchronized (_inventoryLock) + { + for (Category category : categories) + { + _categories.put(category.Name, category); + } + } + } + + public void addItemToInventory(final Player player, final String category, final String item, final int count) + { + final String uuidString = player.getUniqueId().toString(); + + Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() + { + public void run() + { + synchronized (_inventoryLock) + { + if (!_categories.containsKey(category)) + { + _repository.addCategory(category); + } + } + + updateCategories(); + + synchronized (_inventoryLock) + { + if (!_items.containsKey(item)) + { + _repository.addItem(item, _categories.get(category).Id); + } + } + + updateItems(); + + synchronized (_inventoryLock) + { + _repository.incrementClientInventoryItem(uuidString, _items.get(item).Id, count); + Get(player).addItem(new ClientItem(_items.get(item), count)); + } + } + }); + } + @Override protected ClientInventory AddPlayer(String player) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/InventoryRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/InventoryRepository.java index 64b290d74..37d1c186e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/InventoryRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/InventoryRepository.java @@ -1,6 +1,5 @@ package mineplex.core.inventory.data; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; @@ -8,7 +7,6 @@ import java.util.List; import org.bukkit.plugin.java.JavaPlugin; -import mineplex.core.common.util.NautHashMap; import mineplex.core.database.RepositoryBase; import mineplex.core.database.ResultSetCallable; import mineplex.core.database.column.ColumnInt; @@ -18,18 +16,18 @@ import mineplex.core.inventory.ClientItem; public class InventoryRepository extends RepositoryBase { - private static String CREATE_INVENTORY_TABLE = "CREATE TABLE IF NOT EXISTS items (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), categoryId INT, rarity INT, PRIMARY KEY (id), FOREIGN KEY (categoryId) REFERENCES itemCategories(id), INDEX uniqueNameCategoryIndex (name, categoryId));"; - private static String CREATE_INVENTORY_CATEGORY_TABLE = "CREATE TABLE IF NOT EXISTS itemCategories (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY (id), INDEX nameIndex (name));"; + private static String CREATE_INVENTORY_TABLE = "CREATE TABLE IF NOT EXISTS items (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), categoryId INT, rarity INT, PRIMARY KEY (id), FOREIGN KEY (categoryId) REFERENCES itemCategories(id), UNIQUE INDEX uniqueNameCategoryIndex (name, categoryId));"; + private static String CREATE_INVENTORY_CATEGORY_TABLE = "CREATE TABLE IF NOT EXISTS itemCategories (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY (id), UNIQUE INDEX nameIndex (name));"; private static String CREATE_INVENTORY_RELATION_TABLE = "CREATE TABLE IF NOT EXISTS accountInventory (id INT NOT NULL AUTO_INCREMENT, accountId INT NOT NULL, itemId INT NOT NULL, count INT NOT NULL, PRIMARY KEY (id), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (itemId) REFERENCES items(id), UNIQUE INDEX accountItemIndex (accountId, itemId));"; - private static String INSERT_ITEM = "INSERT INTO items (name, categoryId, rarity) VALUES (?, ?, ?);"; - private static String RETRIEVE_ITEMS = "SELECT items.id, items.name, itemCategories.id, itemCategories.name, rarity FROM items INNER JOIN itemCategories ON itemCategories.id = items.categoryId;"; + private static String INSERT_ITEM = "INSERT INTO items (name, categoryId) VALUES (?, ?);"; + private static String RETRIEVE_ITEMS = "SELECT items.id, items.name, itemCategories.name FROM items INNER JOIN itemCategories ON itemCategories.id = items.categoryId;"; - private static String INSERT_CATEGORY = "INSERT INTO category (name) VALUES (?);"; + private static String INSERT_CATEGORY = "INSERT INTO itemCategories (name) VALUES (?);"; private static String RETRIEVE_CATEGORIES = "SELECT id, name FROM itemCategories;"; - private static String INSERT_CLIENT_INVENTORY = "INSERT INTO accountInventory (accountId, itemId, count) SELECT accounts.id, ?, ? FROM accounts WHERE accounts.uuid = ? ON DUPLICATE KEY UPDATE count=VALUES(count);"; - private static String RETRIEVE_CLIENT_INVENTORY = "SELECT items.id, items.name, ic.id, ic.name as category, count FROM accountInventory AS ai INNER JOIN items ON items.id = ai.itemId INNER JOIN itemCategories AS ic ON ic.id = items.categoryId INNER JOIN accounts ON accounts.id = ai.accountId WHERE accounts.uuid = ?;"; + private static String INSERT_CLIENT_INVENTORY = "INSERT INTO accountInventory (accountId, itemId, count) SELECT accounts.id, ?, ? FROM accounts WHERE accounts.uuid = ? ON DUPLICATE KEY UPDATE count=count + VALUES(count);"; + private static String RETRIEVE_CLIENT_INVENTORY = "SELECT items.name, ic.name as category, count FROM accountInventory AS ai INNER JOIN items ON items.id = ai.itemId INNER JOIN itemCategories AS ic ON ic.id = items.categoryId INNER JOIN accounts ON accounts.id = ai.accountId WHERE accounts.uuid = ?;"; public InventoryRepository(JavaPlugin plugin) { @@ -67,14 +65,14 @@ public class InventoryRepository extends RepositoryBase return categories; } - public void addItem(Item item) + public void addItem(String name, int categoryId) { - executeUpdate(INSERT_ITEM, new ColumnVarChar("name", 100, item.Name), new ColumnInt("categoryId", item.Category.Id), new ColumnInt("rarity", item.Rarity)); + executeUpdate(INSERT_ITEM, new ColumnVarChar("name", 100, name), new ColumnInt("categoryId", categoryId)); } - public void addCategory(Category category) + public void addCategory(String name) { - executeUpdate(INSERT_CATEGORY, new ColumnVarChar("name", 100, category.Name)); + executeUpdate(INSERT_CATEGORY, new ColumnVarChar("name", 100, name)); } public List retrieveItems() @@ -87,7 +85,7 @@ public class InventoryRepository extends RepositoryBase { while (resultSet.next()) { - items.add(new Item(resultSet.getInt(1), resultSet.getString(2), new Category(resultSet.getInt(3), resultSet.getString(4)), resultSet.getInt(5))); + items.add(new Item(resultSet.getInt(1), resultSet.getString(2), resultSet.getString(3))); } } }); @@ -95,46 +93,9 @@ public class InventoryRepository extends RepositoryBase return items; } - public void updateClientInventories(NautHashMap> clientInventories) + public void incrementClientInventoryItem(String uuid, int itemId, int count) { - PreparedStatement preparedStatement = null; - - try - { - preparedStatement = getConnection().prepareStatement(INSERT_CLIENT_INVENTORY); - - for (String uuid : clientInventories.keySet()) - { - for (ClientItem item : clientInventories.get(uuid)) - { - preparedStatement.setInt(1, item.Item.Id); - preparedStatement.setInt(2, item.Count); - preparedStatement.setString(3, uuid); - - preparedStatement.addBatch(); - } - } - - preparedStatement.executeBatch(); - } - catch (SQLException e) - { - e.printStackTrace(); - } - finally - { - if (preparedStatement != null) - { - try - { - preparedStatement.close(); - } - catch (SQLException e) - { - e.printStackTrace(); - } - } - } + executeUpdate(INSERT_CLIENT_INVENTORY, new ColumnInt("itemid", itemId), new ColumnInt("count", count), new ColumnVarChar("uuid", 100, uuid)); } public ClientInventory loadClientInformation(String uuid) @@ -147,12 +108,7 @@ public class InventoryRepository extends RepositoryBase { while (resultSet.next()) { - ClientItem item = new ClientItem(); - - item.Item = new Item(resultSet.getInt(1), resultSet.getString(2), new Category(resultSet.getInt(3), resultSet.getString(4))); - item.Count = resultSet.getInt(4); - - clientInventory.Items.add(item); + clientInventory.addItem(new ClientItem(new Item(resultSet.getString(1), resultSet.getString(2)), resultSet.getInt(3))); } } }, new ColumnVarChar("uuid", 100, uuid)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/Item.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/Item.java index 71256be94..5f4b3efdb 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/Item.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/Item.java @@ -2,21 +2,19 @@ package mineplex.core.inventory.data; public class Item { - public int Id = -1; + public int Id; public String Name; - public Category Category; - public int Rarity = 0; + public String Category; - public Item(int id, String name, Category category, int rarity) + public Item(String name, String category) + { + this(-1, name, category); + } + + public Item(int id, String name, String category) { Id = id; Name = name; Category = category; - Rarity = rarity; - } - - public Item(int id, String name, Category category) - { - this(id, name, category, 0); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/GadgetPage.java index fff32e67d..d36bcf243 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/GadgetPage.java @@ -109,6 +109,7 @@ public class GadgetPage extends ShopPageBase { public void run() { + Plugin.addItemToInventory(Player, gadget.getGadgetType().name(), gadget.GetName(), 1); Shop.OpenPageForPlayer(Player, new Menu(Plugin, Shop, ClientManager, DonationManager, player)); } }, null, gadget, CurrencyType.Coins, Player)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/Menu.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/Menu.java index ba2184aff..783147bb9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/Menu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/Menu.java @@ -4,10 +4,13 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import mineplex.core.account.CoreClientManager; +import mineplex.core.common.CurrencyType; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; +import mineplex.core.inventory.GemBooster; import mineplex.core.inventory.InventoryManager; import mineplex.core.inventory.ui.InventoryShop; import mineplex.core.inventory.ui.button.DeactivateGadgetButton; @@ -20,6 +23,8 @@ import mineplex.core.inventory.ui.button.OpenParticles; import mineplex.core.inventory.ui.button.OpenPets; import mineplex.core.mount.Mount; import mineplex.core.shop.item.ShopItem; +import mineplex.core.shop.item.SingleButton; +import mineplex.core.shop.page.ConfirmationPage; import mineplex.core.shop.page.ShopPageBase; public class Menu extends ShopPageBase @@ -36,7 +41,44 @@ public class Menu extends ShopPageBase { AddItem(11, new ShopItem(175, DonationManager.Get(Player.getName()).getCoins() + " Coins", 1, false)); AddItem(13, new ShopItem(Material.CHEST, Plugin.Get(Player).getChestCount() + " Chests", 1, false)); - AddItem(15, new ShopItem(Material.EMERALD, DonationManager.Get(Player.getName()).GetGems() + " Gems", 1, false)); + + int gemBoosters = Plugin.Get(Player).Items.containsKey("Gem Booster") ? Plugin.Get(Player).Items.get("Gem Booster").Count : 0; + final GemBooster gemBoosterItem = new GemBooster(gemBoosters); + + if (DonationManager.Get(Player.getName()).GetBalance(CurrencyType.Coins) >= gemBoosterItem.GetCost(CurrencyType.Coins)) + { + AddButton(15, new ShopItem( + gemBoosterItem.GetDisplayMaterial(), + gemBoosterItem.GetDisplayName(), + gemBoosterItem.GetDescription(), + 1, + false), + new SingleButton() + { + @Override + public void Clicked(Player player) + { + Shop.OpenPageForPlayer(Player, new ConfirmationPage(Plugin, Shop, ClientManager, DonationManager, new Runnable() + { + public void run() + { + Plugin.addItemToInventory(Player, "Utility", "Gem Booster", 20); + Shop.OpenPageForPlayer(Player, new Menu(Plugin, Shop, ClientManager, DonationManager, Player)); + } + }, null, gemBoosterItem, CurrencyType.Coins, Player)); + } + } + ); + } + else + { + AddItem(15, new ShopItem( + gemBoosterItem.GetDisplayMaterial(), + gemBoosterItem.GetDisplayName(), + gemBoosterItem.GetDescription(), + 1, + false)); + } AddButton(27, new ShopItem(Material.NETHER_STAR, "Particle Effects", 1, false), new OpenParticles(this)); AddButton(29, new ShopItem(Material.BOW, "Gadgets", 1, false), new OpenGadgets(this)); @@ -46,7 +88,6 @@ public class Menu extends ShopPageBase if (Plugin.getGadgetManager().getActive(Player, GadgetType.Particle) != null) { - System.out.println("found active particle."); Gadget gadget = Plugin.getGadgetManager().getActive(Player, GadgetType.Particle); AddButton(36, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/MountPage.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/MountPage.java index 11df3849e..2e3883dd8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/MountPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/MountPage.java @@ -86,15 +86,16 @@ public class MountPage extends ShopPageBase }); } - public void purchaseMount(final Player player, final Mount _mount) + public void purchaseMount(final Player player, final Mount mount) { Shop.OpenPageForPlayer(Player, new ConfirmationPage(Plugin, Shop, ClientManager, DonationManager, new Runnable() { public void run() { + Plugin.addItemToInventory(Player, "Mount", mount.GetName(), 1); Shop.OpenPageForPlayer(Player, new Menu(Plugin, Shop, ClientManager, DonationManager, player)); } - }, null, _mount, CurrencyType.Coins, Player)); + }, null, mount, CurrencyType.Coins, Player)); } public void activateMount(Player player, Mount _mount) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/PetTagPage.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/PetTagPage.java index d0144c045..46091ddb1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/PetTagPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/ui/page/PetTagPage.java @@ -98,7 +98,8 @@ public class PetTagPage extends ShopPageBase Plugin.getPetManager().Get(Player).GetPets().put(_pet.GetPetType(), token.PetName); - Player.closeInventory(); + Plugin.addItemToInventory(Player, "Pet", _pet.GetPetType().toString(), 1); + Shop.OpenPageForPlayer(Player, new Menu(Plugin, Shop, ClientManager, DonationManager, Player)); } }, null, _petPurchase ? _pet : tag, CurrencyType.Coins, Player)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java b/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java index 324958a50..ae364e196 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java @@ -97,7 +97,7 @@ public class Punish extends MiniPlugin if (client != null && client.IsMuted()) { - event.getPlayer().sendMessage(F.main(GetName(), "Shh, you're muted for " + C.cGreen + UtilTime.convertString(client.GetPunishment(PunishmentSentence.Mute).GetRemaining(), 1, TimeUnit.FIT) + ".")); + event.getPlayer().sendMessage(F.main(GetName(), "Shh, you're muted because " + client.GetPunishment(PunishmentSentence.Mute).GetReason() + " by " + client.GetPunishment(PunishmentSentence.Mute).GetAdmin() + " for " + C.cGreen + UtilTime.convertString(client.GetPunishment(PunishmentSentence.Mute).GetRemaining(), 1, TimeUnit.FIT) + ".")); event.setCancelled(true); } } @@ -109,7 +109,7 @@ public class Punish extends MiniPlugin if (client != null && client.IsMuted()) { - event.getPlayer().sendMessage(F.main(GetName(), "Shh, you're muted for " + C.cGreen + UtilTime.convertString(client.GetPunishment(PunishmentSentence.Mute).GetRemaining(), 1, TimeUnit.FIT) + ".")); + event.getPlayer().sendMessage(F.main(GetName(), "Shh, you're muted because " + client.GetPunishment(PunishmentSentence.Mute).GetReason() + " by " + client.GetPunishment(PunishmentSentence.Mute).GetAdmin() + " for " + C.cGreen + UtilTime.convertString(client.GetPunishment(PunishmentSentence.Mute).GetRemaining(), 1, TimeUnit.FIT) + ".")); event.setMessage(" "); event.setCancelled(true); } diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index cfa74081d99741bf48aba256881866ecf30993bf..17c33e71f53fbac230a776f35563b07e3bde6dc2 100644 GIT binary patch delta 14378 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 BxOM;l delta 14901 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