diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java index dcac2d504..b551ca902 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java @@ -55,8 +55,9 @@ public class SkinData public final static SkinData SNOWMAN = new SkinData("eyJ0aW1lc3RhbXAiOjE0NTAwMTk4Nzk5NDIsInByb2ZpbGVJZCI6ImE5ZDBjMDcyYmYxOTQwYTFhMTkzNjhkMDlkNTAwMjZlIiwicHJvZmlsZU5hbWUiOiJTcGlyaXR1c1NhbmN0dXMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzEzMTgxYWViODQzODk3NzM1ZDQwMmIyNDk2OTQxNmZkYjBjZTM0YTZiOTM3ODE2MjQzNzU2ZTlkYWU1OGUzIn19fQ==", "NZvsNu+HQ5uvGWq6O8VNDGq9A145bmk2IkHiz916uRVPMRqqCI/zwhKWNLlFACE/feuLkhYAois29ec6sVVOtHIoNA+S5q1Mb/Vjc3TJQxzqmx2FZOhJiIttFwYuo9WomQKBqrPMSJ9tpQig4wzoqldeeTjWC3dLz7JeX+gkzinryVjG7NNN9L5hXK5/BBxRcrtwmXJfUlSANyrd8RZW7mEUgU8yxlzdqTu0w7bZLjQNd4vciwoF3NelXDorMIIqiHTkuQesG91Njtu25VCUDK3nXbqEnZw2ZtxB5fT5G2Omm/vkNSRXc0P7iqchVowdYQcMlQUsp65xpkBbFS4LwjzDkYIfLmF++hePb8z72Gz77FxhO5sRLGreSH227McyL/0CtWNKm9ZZIfQtZZjEZTj9+eiJMCloCMg3yWa1VBOiLHzz0wY6gGklccIImPyXEg7E0dIK8qYseJMhmmBNZ8pDOkbUDp3mRlrQ2iyClgQkbuR63j79IBUaCxmsa3NnrAtaJklzd9mzkHXfMBh2XT7Gl8AhJS6JK5kCvip1rBBI8yjrsjE/E+lyJFIbC4rXxyMDGZWkcdrd7U4ZFYKiLHbzdFRqX+11qs9xO2BvomGXkATCzYmOf2kQ86R6rNN0+JfE4QpKzj2WWt3C8ky2qpuXZz29p0816E3/qseYtgg="); public final static SkinData TEDDY_BEAR = new SkinData("eyJ0aW1lc3RhbXAiOjE0NTUxMDkzOTE4MjYsInByb2ZpbGVJZCI6ImE5ZDBjMDcyYmYxOTQwYTFhMTkzNjhkMDlkNTAwMjZlIiwicHJvZmlsZU5hbWUiOiJTcGlyaXR1c1NhbmN0dXMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzQ0OTU4ZDdjNjlhZTQ4NGM2NWYzMTM0N2NkY2M5MmM2OWY1NDA2ODA1YjUzNjUyYTc1YThlZDc5OWRmNyJ9fX0=", "sNTRV9jTjLszUmyaqyEG7N8d5RM1jbwMSXi34S2EkVmIjWsowfSMnHRQqqgZfxcyqBM5I7MljtB84IeQWu4rqhyFrM9blWvtowjijFIOgKCs97q2sswv9iauU6ohvgTpgN5B0Q16MJmMIgZU8d8TATtEaIzq2eg6Ve1AJlNnW4huGNsoNfm8WdVU1tZmsYAwtVP/ryvhyj7mHyVF27m0Sm4fZRf/lHH5gEJYB4JHSAoEhjPIQOdkgRMJRrWGOfhhiGs3kEWmsRGfIPFo2ZJfcu+TFV2rd4Q+A1LmY8kimnzdKX3InXeKbk8qzcgqGNro4XFnSiHo1d6/B+N0JeYOTITYRQ6u24rNSUh5ezbG01iikVFCfrgb7UR6utoLK15F4/fmhpex+BJpmyZoXAqk08tZws/5wsIWQ1okrGcbBKWEHhw2ekUc82US21/W53vd657UBg7FuqM4FhkAqmsYPvYLMpNYxxmDJaI8uJyU7cnGFYyBaFlqUxfJUfcFTwWo10JO3yp5FjqeCQa7rFvfpsqw3w2mBpJmlZ5HRjfS5pmhk0QiY0TRfwZfFemkuZYnNbO82qLUm+6zTm0fbC90Swt8nNr/42ajzEoUjnL6VsERIXS5/fPwjftbQAC60ujy8yo66Sp3sSAALNg5zjM+Uizkq2f9Axc+kind22hp10M="); public final static SkinData UNCLE_SAM = new SkinData("eyJ0aW1lc3RhbXAiOjE0NjYxODA0NjY4NTcsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9jYzM1YWRmZTQ3ODBjNmU2NTk4YTJlYzk2ZjdhZGQ5ZDc4NjljMjBlZjRmYjEyNjk2NmJhOGFlMDRlOWRhIn19fQ==", "NmJ+hXmvwQlYFYY7YVQWRr11yBbAfJP+jk11SQ91gUUtJJjb4v8RFbNu5UXNCKxYj3BPtldqshG1maNB0NWJRud7ZyAdHc0JMmR1vtHEge9Hhet4fLyyaZ9rZn4BvD9Guqgv9H/mZzUzrft9TIho0Qbu/U++lVsbZXC2GrJDDMyLnYr9C7f+FUnr0z4WvkNcg23SHBOYkOYT95NSdykIka3c3v+/HvSvuwOnMsfVxqLyCZLpo20vamBJ1uK1dmx2+TVGnUPlofFHRdOXOpJc+YmicJvrsQR6a9zlvnTbU4MYClMOKvjLe6aX5Af+n8Gw3oKcm0PuR8CPLyf9kjcmUF6XMiEXAWWJtCgvhCiFV5/mQQH3cQ1kqk4BDLUxMVhG5tzjKLoQQy39cFM32ee+QFjXlzy59meC8jgvPmOVU3GpJ32XWOtaXMCyeJrhz2QVKRLEr2KZgz8Pd8VrHARXVZsNYEasj8z0cHjgSJqTU9kD90CC+4YpvdyRBRqbNQig5KuGCqUHKgflsEsM7YrFRKP5As1LgqYQfqRAMmLSo47eW0onOwchC9wCqqisPlYSuDRt4Mun/KFGqYh1Sghn8/gzu49La8BpwlekjVEoPEcDaIIgnFzOvgmmgMANkoJ3PzhHoHMoXtObe3eSTi+eYp4qAQVzkTxfF3WXY2fui1M="); - public final static SkinData METAL_MAN = new SkinData("eyJ0aW1lc3RhbXAiOjE0Njg3ODAyMzk2ODYsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9hNzc5YWEzYzk3OTc0Mzk1YTY3MTZkZmQ5MTI4YWM0N2E1MzdlMzljMzdmMGM0ZjZkZjQ1YjJmMGI4ZjVkMiJ9fX0=", "acwmrIdtzzkuntsvQqD+o9UYaI09xzQoPgRXFtvS1hvGgGRbApdG7YbQ3Itjg/8WUl0trAMMJa1IL8TlXaOwTeClOj6if3HW2lJ8yO7E+MXEJoDZcjkxVOK3322NRCBiPG+VbNCwHE7IvT8P4awExvV2nHLbCk7upawxK3oKfR5U+YEq/eLG/UCC1TAnHNLXE0mr+6ZtNut5qgz1u0Y+VNQKI/vdjVit1ttYeBjIWpSszhlP4bH8Iw3u3ZRuDqU4xSAWzj6Qhw9UYm2T3s2N9s2yW3wiagijUEq9stbaw97n3UCqBas58lTBy46w524lBvwbYC1U9jwxPxSUo6L6omhPKZSwgK/u2w4mELvfNI09A4C7RNThnz9wgrT0FPajjXYkt31Ba5qaP7HwcThQu02Bb3gmYfHfMvuDBt8xUk4lFyUuL+lwqUHXlKRkUPGVkDLDpmsnk+y4LvaymNHBBWpOyqpm8y1BTpux02GqCIgK7nHtsRNH3q3yHR1YyM0tc6PKXOst5ex1cGP654/Q0KEUSAvAV5ozj/q5izRlPJNiwu9zPqhfs8oWSBSo/Sfej6p7Fu9u0h0j/k0m86bfZObe2RsCEgBe8GSF35cyYRou0qTvk+00hEr+jpxeat0e9JHe163jI/Ew9XPeGd6eT8GTy4iyJM0O/y1MlsRjUec="); + public final static SkinData METAL_MAN = new SkinData("eyJ0aW1lc3RhbXAiOjE0NzM5OTExNTk3OTQsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS84ZDdlOGQ3MmI0MzI3MjIzZmI1ZjI5OWViN2NiNTVhMTU4OTM4MGYxMWE2ZDIzYmVmZTQ1OWFjNzg3YWY2YTcifX19", "EYXUVtnqtDhaSjBE313TpxriRtW0X7wNdmVR0ARa9qvE8CtP//AhnNxyKkERue1XIyefrYApzM4DWGzU5ZvzraOXg98p/3PSFW5p0PAp14ud/1uJWoq0FuEiJDn7Qo/+K0cuoCVsAn6Bx8nWexxr0XB8ANq/0vpRZpDOPO+irFFGwF8CPbt+7sh09glaHD9q7CM4JzPXrNjLt+ZkhYt7wEuevCXuOONT50tH0BlmfHajs9ai0IiwEwC3R+o0DooMVdCViuVEKWQfMnBDNHN4ZLwEazAcRiFO4VXOG0k/+dbKfX0EwnnygN0qmHKyhQeuR7PUumaRUMHn7sCvWmvgpNzzJMv4f9Biw2SWSI2gpaxHdCoCfFMjCdal+/BbXue6jCvDYq6yQEu+C9BjB3vT633/mbXZZMCl7bRjBzqG/jfeI1ove9o0oSqc4Nx3aA1cOnRE2iMEE74ChgY/sVk4aRVx+GTxKtyRGSzt2V7AvOVlfJh17FQhT/PkiztJ6L1RFLsFKaxQxyiCPgZSXpQ4Dz0iPonxFZl0FjAluElHYb3zn4Uop9sPBqOIeskVUl9zbdlRb7CgDG8a57YkUfs7ZyzzYYmZyt6t08H/PQr++cflY0kfy9eOBDmf9gtes7FLrHHRTE6GJ1+xAkLi5gNEkEUZKZy2embgI5JzuwCIIY8="); public final static SkinData OMEGA_CHEST = new SkinData("eyJ0aW1lc3RhbXAiOjE0NzI1MTAzNzAwOTksInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS85MDM2MjNjMmRkMjdhNWM0Y2NlYzY5MWY3NjM0YTNkMzVkNTRiNDg0YjIzNTdhNWQ1ZWFmYmYwNTRkY2NlIn19fQ==", "cQty4zNF2QgzNuVOHTGGX5YVofApKr01KkQ70bO1n+I9nlkc9qqhcigA+uBYdw4THANFsTRwIrskgTS3TTmuaXYmMUoNnj7gr2Gp7D2t7L53QyJJhIw0hHNDvQucf19SOxhtR9FvW+xnh1JcgOTF3VZxIeRaN4bCtqkeFitCJwts4Z7SlDxB4EFZVsifM+gK4iel9YWYGNnZiQm48lxU+dMFd0cCa4L00ngBExQoWC8zbJc3K9LGdqI1YOMh3bCt81F4jcrPnDycxWwOTj/tBri4yeXK1htq5dAixHwq1EF86gQMnfeIIk6D/BREtVKoXK9K4lstYPHLFiBqkwpijArbC0sZp8s/j88NYUz9PgSJ2z/b5jhPChH2OkoGQOL0/QrxqUZUet+WHaIQtvFoqmcFRCKJQembgJGZV0X86XQxEEtevkNgXPigJVyQ5GVuDCeowRkMGfSadQCBsnmdOVZNshS60tBSDcbd2oWeQUJn1+OJkmz+OktbMbP4ttN6x3+MPMSZoGT1bc1BSRNFRYOBZuNz1zLWsHFRyNLaVS3ep/ktE+Rt5sbapo+r4GjrKGV7Unx6pbfoxcnMVxWZ9X/sMgztQdwYEQlnvAxGvCY/1ZIm3/izqB2zAgG7ZfWzKjU2P5VseKokMjHXrzZX9Uqtn0zpITEaG5HjUpRSaJg="); + public final static SkinData WITCH = new SkinData("eyJ0aW1lc3RhbXAiOjE0NzM5OTEyMTE1NDQsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81NDg1ZDZlMTBhNmNmMmY3Mzg2NmZhMGRiNjEzOWQ5NWViZDM0ZGZiMGY0YzAxMmRkM2YzYWYxMWQ5ZjQxYyJ9fX0=", "cojkGLflVWxwnhDXmHMke7crkeA78iUYOWY7H3YvMJFD+VZi9E7vUahLTTx5ELH+PvcaHJerSDmuV+Nasc3K2n6zlXXb0B7RB/ose/kdPxHAIJee7IbZX0iFNDn6irUSOS4wOYF/BwaqG3HmpoSxV52SGMs6kqTer2Rjg3X+XwYFFiDHAR/gwhfXLzrM1iBc171vgu6T+kx65iBHa/YB/V/mj8FSxwM0f5IsLpgAEdxDL9PvEKQWgWeZ1CAqEXlGnjPkd9oGzW0TgDz2MksBbYZ2kmn/S53kK9vCrVB7egZPS4VBtKpq1P7Jeu8rtgjnAKVFQJZ2lMHnVRuvGTd8JKoPHarUPpU2LURUMaCtHzSv9v/4gjkafnDhqxG4TTcr5hxFV+ho72HQchoeaUXzIO+Yo71zrVqkrS0hw6OtgMIBlvaGaEUsFvGiCZePBEiHojO43AKqJcJAVeT2RAzHcAaBAO79ACGjNKw/oj02rOurLha9i+99bKui96Eg7SS/nPchbmu5YQ9nSpkW+JeYXnBzGGzNG4y02VWgz15L718+8161zXobhuK07qlY9i1nipFbEJedqG0cfS+AUzauETFvS9nMtxhtftYPCIxm40GQj6e77asNCAEElGssaUGKO3bjm348+oF9tR/eBOYWJQ8kL46IQLDRoop7UhG4ewY="); // Comments this out for now, so it doesn't load the player profile // A better way to do this would check for the properties when getting the skull or the skin diff --git a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/commands/PowerPlayCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/commands/PowerPlayCommand.java index edc65deb4..cc305f652 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/commands/PowerPlayCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/commands/PowerPlayCommand.java @@ -5,11 +5,13 @@ import mineplex.core.command.CommandBase; import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.powerplayclub.PowerPlayData; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import java.time.LocalDate; +import java.time.YearMonth; public class PowerPlayCommand extends CommandBase { @@ -37,7 +39,8 @@ public class PowerPlayCommand extends CommandBase return; } - _bonusManager.getPowerPlayClubRepository().Get(player).setSubscribed(true); + PowerPlayData cached = _bonusManager.getPowerPlayClubRepository().getCachedData(player); + cached.getUnclaimedMonths().add(YearMonth.now()); _bonusManager.getPowerPlayClubRepository().addSubscription(_bonusManager.getClientManager().Get(player).getAccountId(), LocalDate.now(), "month"); caller.sendMessage(ChatColor.GREEN + "Gave a month's subscription to " + player.getName()); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/gui/buttons/PowerPlayClubButton.java b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/gui/buttons/PowerPlayClubButton.java index 103bdf28e..b96e421ff 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/gui/buttons/PowerPlayClubButton.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/gui/buttons/PowerPlayClubButton.java @@ -1,13 +1,22 @@ package mineplex.core.bonuses.gui.buttons; +import java.time.LocalDate; +import java.time.YearMonth; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + import mineplex.core.bonuses.BonusManager; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.donation.DonationManager; import mineplex.core.gui.GuiItem; import mineplex.core.inventory.InventoryManager; import mineplex.core.powerplayclub.PowerPlayClubRepository; import mineplex.core.powerplayclub.PowerPlayClubRewards; +import mineplex.core.powerplayclub.PowerPlayData; import mineplex.core.shop.item.ShopItem; import org.bukkit.Material; import org.bukkit.Sound; @@ -15,8 +24,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; - public class PowerPlayClubButton implements GuiItem { @@ -24,6 +31,7 @@ public class PowerPlayClubButton implements GuiItem private Player _player; private PowerPlayClubRepository _powerPlayClubRepository; private InventoryManager _inventoryManager; + private DonationManager _donationManager; private BonusManager _bonusManager; public PowerPlayClubButton(Player player, BonusManager manager) @@ -32,6 +40,7 @@ public class PowerPlayClubButton implements GuiItem _bonusManager = manager; _powerPlayClubRepository = manager.getPowerPlayClubRepository(); _inventoryManager = manager.getInventoryManager(); + _donationManager = manager.getDonationManager(); } @Override @@ -49,18 +58,18 @@ public class PowerPlayClubButton implements GuiItem @Override public void click(ClickType clickType) { - if (isAvailable() && !_bonusManager.getPowerPlayClubRepository().alreadyClaimed(_player)) + if (isAvailable()) { _player.closeInventory(); _player.playSound(_player.getLocation(), Sound.NOTE_PLING, 1, 1.6f); - PowerPlayClubRewards.giveAllItems(_player, _inventoryManager, _powerPlayClubRepository); + PowerPlayClubRewards.giveAllItems(_player, _donationManager, _inventoryManager, _powerPlayClubRepository); } else { _player.playSound(_player.getLocation(), Sound.ITEM_BREAK, 1, 10); - if (_powerPlayClubRepository.alreadyClaimed(_player)) + if (_powerPlayClubRepository.getCachedData(_player).isSubscribed()) { - UtilPlayer.message(_player, F.main("Power Play Club", "Already claimed!")); + UtilPlayer.message(_player, F.main("Power Play Club", "Already claimed! Come back next month!")); } else { @@ -77,58 +86,72 @@ public class PowerPlayClubButton implements GuiItem private void setItem() { - ArrayList lore = new ArrayList<>(); - Material material; - byte data = 0; - String itemName; + final Material material; + final String itemName; + final List lore; - if (isAvailable()) + + PowerPlayData cached = _powerPlayClubRepository.getCachedData(_player); + List unclaimed = cached.getUnclaimedMonths(); + + if (!unclaimed.isEmpty()) { + // Player has unclaimed rewards, even if s/he's not currently subscribed material = Material.GOLD_INGOT; itemName = C.cGreenB + "Power Play Club"; - lore.add(""); - lore.add(C.Reset + "Click to claim!"); - } - else + + lore = buildLore(unclaimed); + lore.add(" "); + lore.add(C.cGold + "Click to claim!"); + + } else if (cached.isSubscribed()) { + // Player is subscribed and has claimed all of his/her rewards material = Material.REDSTONE_BLOCK; itemName = C.cRedB + "Power Play Club"; - } - lore.add(C.cYellow + "Rewards"); - lore.add(" " + C.cWhite + "2 Game Amplifiers"); - lore.add(" " + C.cWhite + "1 Omega Chest"); - for (PowerPlayClubRewards.PowerPlayClubItem prize : PowerPlayClubRewards.septemberItems()) - { - lore.add(" " + C.cWhite + prize.getAmount() + " " + prize.getPrize()); - } - //lore.add(" "); - //lore.add(C.cYellow + "Months left: " + C.cWhite + getMonthsLeft(true)); //TODO: figure this out - if (!isAvailable()) + lore = new ArrayList<>(); + lore.add(C.cRed + "Already claimed!"); + + // TODO: 'come back later!' + + } else { + // Player isn't subscribed; show them the rewards for this current month and tell them to subscribe + material = Material.REDSTONE_BLOCK; + itemName = C.cRedB + "Power Play Club"; + + lore = buildLore(Collections.singletonList(YearMonth.now())); lore.add(" "); - if (_powerPlayClubRepository.alreadyClaimed(_player)) - { - lore.add(C.cRed + "Already claimed!"); - } - else - { - lore.add(C.cRed + "Get Power Play Club months at"); - lore.add(C.cAqua + "mineplex.com/shop"); - } + lore.add(C.cRed + "Get Power Play Club months at"); + lore.add(C.cAqua + "mineplex.com/shop"); } - _item = new ShopItem(material, data, itemName, lore.toArray(new String[0]), 1, false, false); + _item = new ShopItem(material, (byte)0, itemName, lore.toArray(new String[lore.size()]), 1, false, false); + } + + private List buildLore(List unclaimed) + { + List lore = new ArrayList<>(); + lore.add(C.cYellow + "Rewards"); + lore.add(" " + C.cWhite + (PowerPlayClubRewards.AMPLIFIERS_PER_MONTH * unclaimed.size()) + " Game Amplifier"); + lore.add(" " + C.cWhite + (PowerPlayClubRewards.CHESTS_PER_MONTH * unclaimed.size()) + " Omega Chest"); + + PowerPlayClubRewards.rewardsForMonths(unclaimed).forEach(prize -> + { + lore.add(" " + C.cWhite + prize.getPrize()); + }); + return lore; } private boolean isAvailable() { - return _powerPlayClubRepository.canClaim(_player); + return !_powerPlayClubRepository.getCachedData(_player).getUnclaimedMonths().isEmpty(); } public static boolean isAvailable(Player player, PowerPlayClubRepository repo) { - return repo.canClaim(player); + return !repo.getCachedData(player).getUnclaimedMonths().isEmpty(); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index a5c62b29c..293e6b84d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -1,5 +1,9 @@ package mineplex.core.cosmetic.ui.page; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mineplex.core.account.CoreClientManager; import mineplex.core.common.currency.GlobalCurrency; import mineplex.core.common.util.C; @@ -15,6 +19,7 @@ import mineplex.core.cosmetic.ui.button.deactivate.DeactivateGadgetButton; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.event.GadgetChangeEvent; import mineplex.core.gadget.gadgets.morph.MorphBlock; +import mineplex.core.gadget.gadgets.morph.MorphWitch; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.HatGadget; @@ -31,10 +36,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BannerMeta; import org.bukkit.inventory.meta.ItemMeta; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - public class GadgetPage extends ShopPageBase { public GadgetPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player) @@ -277,7 +278,15 @@ public class GadgetPage extends ShopPageBase //Standard if (gadget.ownsGadget(getPlayer())) { - ItemStack gadgetItemStack = new ItemStack(gadget.getDisplayMaterial(), 1, gadget.getDisplayData()); + ItemStack gadgetItemStack; + if (gadget instanceof MorphWitch) + { + gadgetItemStack = ((MorphWitch) gadget).getWitchItem(); + } + else + { + gadgetItemStack = new ItemStack(gadget.getDisplayMaterial(), 1, gadget.getDisplayData()); + } ItemMeta meta = gadgetItemStack.getItemMeta(); meta.setDisplayName(C.cGreen + C.Bold + gadget.getName()); if (gadget.getActive().contains(getPlayer())) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index 708e2a6f1..f2ffcee5d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -5,6 +5,7 @@ import java.util.function.Predicate; import mineplex.core.gadget.event.PlayerToggleSwimEvent; import mineplex.core.gadget.gadgets.morph.swim.SwimManager; +import mineplex.core.treasure.TreasureManager; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -206,6 +207,7 @@ public class GadgetManager extends MiniPlugin private final HologramManager _hologramManager; private final OutfitWindUpSuitBoosterManager _boosterManager; private final IncognitoManager _incognitoManager; + private TreasureManager _treasureManager; private NautHashMap> _gadgets; @@ -341,8 +343,8 @@ public class GadgetManager extends MiniPlugin addGadget(new MorphSnowman(this)); addGadget(new MorphUncleSam(this)); addGadget(new MorphSquid(this)); - // Not being added in this update! - //addGadget(new MorphMetalMan(this)); + addGadget(new MorphWitch(this)); + //addGadget(new MorphMetalMan(this)); // Soon: reward for signup // Particles addGadget(new ParticleFoot(this)); @@ -1152,4 +1154,14 @@ public class GadgetManager extends MiniPlugin } } } + + public void setTreasureManager(TreasureManager treasureManager) + { + _treasureManager = treasureManager; + } + + public TreasureManager getTreasureManager() + { + return _treasureManager; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/commands/UnlockCosmeticsCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/commands/UnlockCosmeticsCommand.java index 889c7ce44..c24411ebd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/commands/UnlockCosmeticsCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/commands/UnlockCosmeticsCommand.java @@ -20,7 +20,7 @@ public class UnlockCosmeticsCommand extends CommandBase public UnlockCosmeticsCommand(GadgetManager plugin) { - super(plugin, Rank.JNR_DEV, new Rank[]{Rank.SNR_MODERATOR}, "unlockCosmetics"); + super(plugin, Rank.JNR_DEV, "unlockCosmetics"); _plugin = plugin; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphMetalMan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphMetalMan.java index 77e2ee795..3722be911 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphMetalMan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphMetalMan.java @@ -29,7 +29,8 @@ public class MorphMetalMan extends MorphGadget public MorphMetalMan(GadgetManager manager) { - super(manager, "Metal Man Morph", UtilText.splitLinesToArray(new String[]{"Placeholder"}, LineFormat.LORE), + super(manager, "Metal Man Morph", UtilText.splitLinesToArray(new String[]{C.cGray + "This powerful suit forged of metal makes the wearer strong enough to even battle the gods", + "", C.cWhite + "Left-click to shoot laser beam"}, LineFormat.LORE), 0, Material.IRON_INGOT, (byte) 0); } @@ -66,7 +67,10 @@ public class MorphMetalMan extends MorphGadget if (!UtilEvent.isAction(event, UtilEvent.ActionType.L)) return; - if (!Recharge.Instance.use(player, getName(), 1000, false, false, "Cosmetics")) + if (player.getItemInHand().getType() != Material.AIR) + return; + + if (!Recharge.Instance.use(player, getName(), 5000, true, false, "Cosmetics")) return; // Creates colored laser @@ -94,25 +98,9 @@ public class MorphMetalMan extends MorphGadget { color = _playerColors.get(player.getUniqueId()); } - MetalManEffect metalManEffect = new MetalManEffect(player.getEyeLocation(), loc, color, Manager.getPlugin()); + MetalManEffect metalManEffect = new MetalManEffect(player.getEyeLocation(), loc, color, this, player); increaseColor(player.getUniqueId()); metalManEffect.start(); - - // Creates the explosion and knockback players - loc.getWorld().createExplosion(loc, 0f); - UtilParticle.PlayParticle(UtilParticle.ParticleType.HUGE_EXPLOSION, loc, 3f, 3f, 3f, 0, 32, UtilParticle.ViewDist.MAX, UtilServer.getPlayers()); - HashMap players = UtilPlayer.getInRadius(loc, 12d); - for (Player ent : players.keySet()) - { - if (Manager.collideEvent(player, this, ent)) - continue; - - double mult = players.get(ent); - - //Knockback - UtilAction.velocity(ent, UtilAlg.getTrajectory(loc, ent.getLocation()), 2 * mult, false, 0, 1 + 1 * mult, 10, true); - } - } public void increaseColor(UUID uuid) @@ -128,7 +116,7 @@ public class MorphMetalMan extends MorphGadget } else { - _playerColors.put(uuid, 0); + _playerColors.put(uuid, 1); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWitch.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWitch.java new file mode 100644 index 000000000..70f8e22ab --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWitch.java @@ -0,0 +1,158 @@ +package mineplex.core.gadget.gadgets.morph; + +import mineplex.core.common.skin.SkinData; +import mineplex.core.common.util.*; +import mineplex.core.disguise.disguises.DisguiseWitch; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.event.GadgetSelectLocationEvent; +import mineplex.core.gadget.types.MorphGadget; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.inventory.ItemStack; + +public class MorphWitch extends MorphGadget +{ + + public MorphWitch(GadgetManager manager) + { + super(manager, "Witch Morph", UtilText.splitLinesToArray(new String[]{C.cWhite + "Press sneak to summon your trusty bat and start brewing"}, LineFormat.LORE), 0, Material.SKULL_ITEM, (byte) 3); + } + + @Override + public void enableCustom(Player player, boolean message) + { + this.applyArmor(player, message); + DisguiseWitch disguiseWitch = new DisguiseWitch(player); + disguiseWitch.setName(player.getName(), Manager.getClientManager().Get(player).GetRank()); + disguiseWitch.setCustomNameVisible(true); + Manager.getDisguiseManager().disguise(disguiseWitch); + } + + @Override + public void disableCustom(Player player, boolean message) + { + this.removeArmor(player); + WitchEffectManager witchEffectManager = WitchEffectManager.getManager(player); + if (witchEffectManager != null) + { + witchEffectManager.stop(); + } + Manager.getDisguiseManager().undisguise(player); + } + + public ItemStack getWitchItem() + { + return SkinData.WITCH.getSkull(); + } + + @EventHandler + public void onSneak(PlayerToggleSneakEvent event) + { + WitchEffectManager witchEffectManager = WitchEffectManager.getManager(event.getPlayer()); + + if (!Recharge.Instance.usable(event.getPlayer(), "Witch Cauldron", true)) + { + return; + } + + if (!event.isSneaking()) + return; + + if (witchEffectManager != null) + { + if (witchEffectManager.hasStarted()) + return; + } + + if (!isActive(event.getPlayer())) + return; + + if (!event.getPlayer().isOnGround()) + { + UtilPlayer.message(event.getPlayer(), F.main("Witch Morph", "You can't place the cauldron there!")); + return; + } + + // Checks if there is a block under the cauldron + Location cauldronLocation = event.getPlayer().getLocation().clone().add(event.getPlayer().getLocation().getDirection()); + cauldronLocation.add(0, 1, 0); + if(cauldronLocation.getBlock().getType() != Material.AIR) + { + UtilPlayer.message(event.getPlayer(), F.main("Witch Morph", "You can't place the cauldron there!")); + return; + } + + // Checks if player is opening a treasure chest/close to a treasure area + if (Manager.getTreasureManager() != null) + { + if (Manager.getTreasureManager().isOpening(event.getPlayer())) + { + UtilPlayer.message(event.getPlayer(), F.main("Witch Morph", "You can't place the cauldron there!")); + return; + } + } + + // Checks if the player is close to a cactus + for (int x = -3; x < 3; x++) + { + for (int z = -3; z < 3; z++) + { + Location possibleCactus = cauldronLocation.clone().add(x, 0, z); + if (possibleCactus.getBlock().getType() == Material.CACTUS) + { + UtilPlayer.message(event.getPlayer(), F.main("Witch Morph", "You can't place the cauldron there!")); + return; + } + } + } + + // Checks if the player is in a Soccer area + GadgetSelectLocationEvent gadgetSelectLocationEvent = new GadgetSelectLocationEvent(event.getPlayer(), this, cauldronLocation.clone().subtract(0, 1, 0)); + gadgetSelectLocationEvent.setShowMessage(true); + Bukkit.getServer().getPluginManager().callEvent(gadgetSelectLocationEvent); + + if (gadgetSelectLocationEvent.isCancelled()) + { + UtilPlayer.message(event.getPlayer(), F.main("Witch Morph", "You can't place the cauldron there!")); + return; + } + + if (!Recharge.Instance.use(event.getPlayer(), "Witch Cauldron", 15000, true, false, "Cosmetics")) + return; + + WitchEffectManager newManager = new WitchEffectManager(event.getPlayer(), cauldronLocation); + newManager.start(); + } + + @EventHandler + public void onUpdate(UpdateEvent updateEvent) + { + if (updateEvent.getType() != UpdateType.TICK) + return; + + long currentTime = System.currentTimeMillis(); + long delay = 5000; + for (Player player : WitchEffectManager.getPlayers()) + { + WitchEffectManager witchEffectManager = WitchEffectManager.getManager(player); + if (witchEffectManager != null) + { + if (witchEffectManager.hasStarted()) + { + if (currentTime - witchEffectManager.getStarted() >= delay) + { + witchEffectManager.stop(); + } + } + } + } + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/WitchEffectManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/WitchEffectManager.java new file mode 100644 index 000000000..ce6598a5d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/WitchEffectManager.java @@ -0,0 +1,80 @@ +package mineplex.core.gadget.gadgets.morph; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import mineplex.core.common.util.UtilServer; +import mineplex.core.gadget.gadgets.particle.unrelated.WitchParticleEffect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Bat; +import org.bukkit.entity.Player; + +public class WitchEffectManager +{ + + private static Map _managers = new HashMap<>(); + + private Player _player; + private Bat _bat; + private Location _location; + private long _started = -1; + private WitchParticleEffect _witchParticleEffect; + + public WitchEffectManager(Player player, Location location) + { + _player = player; + _location = location; + _managers.put(player, this); + } + + public void start() + { + _started = System.currentTimeMillis(); + _location.getBlock().setType(Material.CAULDRON); + _location.getBlock().setData((byte) 3); + + _location.getWorld().strikeLightning(_location); + Bat bat = _location.getWorld().spawn(_location.clone().add(0, 1, 0), Bat.class); + bat.setCustomName(_player.getName() + "'s Magical Bat"); + bat.setCustomNameVisible(true); + _bat = bat; + + _witchParticleEffect = new WitchParticleEffect(_location, UtilServer.getPlugin()); + _witchParticleEffect.start(); + } + + public void stop() + { + _bat.remove(); + _location.getBlock().setType(Material.AIR); + _managers.remove(_player); + _witchParticleEffect.stop(); + } + + public boolean hasStarted() + { + return _started != -1; + } + + public long getStarted() + { + return _started; + } + + public static Set getPlayers() + { + return _managers.keySet(); + } + + public static WitchEffectManager getManager(Player player) + { + if (_managers.containsKey(player)) + { + return _managers.get(player); + } + return null; + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/unrelated/MetalManEffect.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/unrelated/MetalManEffect.java index 7e1b6baa1..5273f0e7e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/unrelated/MetalManEffect.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/unrelated/MetalManEffect.java @@ -1,12 +1,15 @@ package mineplex.core.gadget.gadgets.particle.unrelated; import java.awt.*; +import java.util.HashMap; -import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.*; import mineplex.core.common.util.particles.ColoredParticle; import mineplex.core.common.util.particles.DustSpellColor; +import mineplex.core.gadget.types.Gadget; import org.bukkit.Location; -import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.util.Vector; public class MetalManEffect extends Effect @@ -14,12 +17,18 @@ public class MetalManEffect extends Effect private int _particles = 100; private int _color; + private int _count = 0; private Vector _vector; + private Location _fixedLoc; + private Gadget _gadget; + private Player _player; - public MetalManEffect(Location location, Location target, int color, JavaPlugin javaPlugin) + public MetalManEffect(Location location, Location target, int color, Gadget gadget, Player player) { - super(20, new EffectLocation(location), javaPlugin); + super(-1, new EffectLocation(location), gadget.Manager.getPlugin()); _color = color; + _gadget = gadget; + _player = player; setTargetLocation(new EffectLocation(target)); } @@ -35,16 +44,40 @@ public class MetalManEffect extends Effect link.normalize(); Vector vector = link.multiply(length / _particles); _vector = vector; + _fixedLoc = location.clone().subtract(_vector); } ColoredParticle coloredParticle = new ColoredParticle(UtilParticle.ParticleType.RED_DUST, new DustSpellColor((_color == 0) ? Color.YELLOW : Color.RED), _effectLocation.getLocation().clone()); - Location loc = location.clone().subtract(_vector); - for (int i = 0; i < _particles; i++) - { - loc.add(_vector); - coloredParticle.setLocation(loc); + for (int i = 0; i < 5; i++){ + _fixedLoc.add(_vector); + coloredParticle.setLocation(_fixedLoc); coloredParticle.display(UtilParticle.ViewDist.LONG); } + if (_fixedLoc.getBlock().getType() != Material.AIR || _count == 1000) + { + explode(); + } + _count += 5; + } + + private void explode() + { + this.stop(); + // Creates the explosion and knockback players + Location loc = _fixedLoc; + loc.getWorld().createExplosion(loc, 0f); + UtilParticle.PlayParticle(UtilParticle.ParticleType.EXPLODE, loc, 3f, 3f, 3f, 0, 32, UtilParticle.ViewDist.MAX, UtilServer.getPlayers()); + HashMap players = UtilPlayer.getInRadius(loc, 5d); + for (Player ent : players.keySet()) + { + if (_gadget.Manager.collideEvent(_player, _gadget, ent)) + continue; + + double mult = players.get(ent); + + //Knockback + UtilAction.velocity(ent, UtilAlg.getTrajectory(loc, ent.getLocation()), 2 * mult, false, 0, 1 + 1 * mult, 10, true); + } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/unrelated/WitchParticleEffect.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/unrelated/WitchParticleEffect.java new file mode 100644 index 000000000..4b36d4de1 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/unrelated/WitchParticleEffect.java @@ -0,0 +1,25 @@ +package mineplex.core.gadget.gadgets.particle.unrelated; + +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilServer; +import org.bukkit.Location; +import org.bukkit.plugin.java.JavaPlugin; + +public class WitchParticleEffect extends Effect +{ + + public WitchParticleEffect(Location location, JavaPlugin javaPlugin) + { + super(-1, new EffectLocation(location), javaPlugin); + _delay = 5; + } + + @Override + public void runEffect() + { + UtilParticle.PlayParticle(UtilParticle.ParticleType.WITCH_MAGIC, _effectLocation.getLocation().clone(), + 1f, 1f, 1f, 0f, 20, + UtilParticle.ViewDist.NORMAL, UtilServer.getPlayers()); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PPCPlayerData.java b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PPCPlayerData.java deleted file mode 100644 index f4156ddd7..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PPCPlayerData.java +++ /dev/null @@ -1,26 +0,0 @@ -package mineplex.core.powerplayclub; - -public class PPCPlayerData { - private boolean _subscribed; - private boolean _claimed; - - public void setSubscribed(boolean subscribed) - { - _subscribed = subscribed; - } - - public void setClaimed(boolean claimed) - { - _claimed = claimed; - } - - public boolean hasClaimed() - { - return _claimed; - } - - public boolean hasSubscribed() - { - return _subscribed; - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRepository.java index 2e64c98a0..218b37d1c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRepository.java @@ -1,26 +1,39 @@ package mineplex.core.powerplayclub; -import mineplex.core.MiniClientPlugin; import mineplex.core.account.CoreClientManager; import mineplex.core.account.ILoginProcessor; import mineplex.serverdata.database.DBPool; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import java.sql.*; +import java.sql.Date; import java.time.LocalDate; -import java.util.UUID; +import java.time.YearMonth; +import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; -public class PowerPlayClubRepository extends MiniClientPlugin { +public class PowerPlayClubRepository implements Listener { + // Data loaded by the first ILoginProcessor, waiting for the second + private final Map> _stageOneDataClaims = new HashMap<>(); + + // Cached data produced by combining the first and second ILoginProcessors. + // This data is not guaranteed to be fresh, and should be recalculated before + // giving a player his/her rewards. + private final Map _cachedPlayerData = new HashMap<>(); private final CoreClientManager _clientManager; public PowerPlayClubRepository(JavaPlugin plugin, CoreClientManager clientManager) { - super("PowerPlayClubRepository", plugin); - _clientManager = clientManager; + Bukkit.getPluginManager().registerEvents(this, plugin); + clientManager.addStoredProcedureLoginProcessor(new ILoginProcessor() { @Override public String getName() { @@ -29,7 +42,12 @@ public class PowerPlayClubRepository extends MiniClientPlugin { @Override public void processLoginResultSet(String playerName, UUID uuid, int accountId, ResultSet resultSet) throws SQLException { - PowerPlayClubRepository.this.Get(uuid).setClaimed(resultSet.next()); + List claims = new ArrayList<>(); + while (resultSet.next()) + { + claims.add(YearMonth.of(resultSet.getInt("claimYear"), resultSet.getInt("claimMonth"))); + } + _stageOneDataClaims.put(uuid, claims); } @Override @@ -46,7 +64,16 @@ public class PowerPlayClubRepository extends MiniClientPlugin { @Override public void processLoginResultSet(String playerName, UUID uuid, int accountId, ResultSet resultSet) throws SQLException { - PowerPlayClubRepository.this.Get(uuid).setSubscribed(resultSet.next()); + List subscriptions = new ArrayList<>(); + while (resultSet.next()) + { + LocalDate date = resultSet.getDate("startDate").toLocalDate(); + PowerPlayData.SubscriptionDuration duration = PowerPlayData.SubscriptionDuration.valueOf(resultSet.getString("duration").toUpperCase()); + subscriptions.add(new PowerPlayData.Subscription(date, duration)); + } + + // Now that we have the claims from the first processor and subscriptions from this one, combine them + _cachedPlayerData.put(uuid, PowerPlayData.fromSubsAndClaims(subscriptions, _stageOneDataClaims.remove(uuid))); } @Override @@ -56,6 +83,13 @@ public class PowerPlayClubRepository extends MiniClientPlugin { }); } + @EventHandler + public void onQuit(PlayerQuitEvent event) + { + _stageOneDataClaims.remove(event.getPlayer().getUniqueId()); // Just in case. + _cachedPlayerData.remove(event.getPlayer().getUniqueId()); + } + public CompletableFuture addSubscription(int accountId, LocalDate date, String duration) { return CompletableFuture.supplyAsync(() -> @@ -101,54 +135,75 @@ public class PowerPlayClubRepository extends MiniClientPlugin { }); } - public boolean alreadyClaimed(Player player) + public CompletableFuture loadData(Player player) { - return Get(player).hasClaimed(); + return loadSubscriptions(player).thenCombine(loadClaimMonths(player), PowerPlayData::fromSubsAndClaims); } - public boolean canClaim(Player player) + public CompletableFuture> loadClaimMonths(Player player) { - return Get(player).hasSubscribed() && !Get(player).hasClaimed(); - } + int accountId = _clientManager.Get(player).getAccountId(); - public CompletableFuture hasSubscription(int accountId) - { - return CompletableFuture.supplyAsync(() -> - { - try (Connection connection = DBPool.getAccount().getConnection()) - { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM powerPlaySubs WHERE accountId = ?"); - statement.setInt(1, accountId); - return statement.executeQuery().next(); - - } catch (SQLException e) { - e.printStackTrace(); - } - - return false; - }); - } - - public CompletableFuture hasClaimed(int accountId) - { return CompletableFuture.supplyAsync(() -> { try (Connection connection = DBPool.getAccount().getConnection()) { PreparedStatement statement = connection.prepareStatement("SELECT * FROM powerPlayClaims WHERE accountId = ?"); statement.setInt(1, accountId); - return statement.executeQuery().next(); + ResultSet resultSet = statement.executeQuery(); - } catch (SQLException e) { - e.printStackTrace(); + List claims = new ArrayList<>(); + while (resultSet.next()) + { + claims.add(YearMonth.of(resultSet.getInt("claimYear"), resultSet.getInt("claimMonth"))); + } + return claims; + + } catch (SQLException e) + { + throw new CompletionException(e); } - - return false; }); } - @Override - protected PPCPlayerData addPlayer(UUID uuid) { - return new PPCPlayerData(); + public CompletableFuture> loadSubscriptions(Player player) + { + int accountId = _clientManager.Get(player).getAccountId(); + + return CompletableFuture.supplyAsync(() -> + { + try (Connection connection = DBPool.getAccount().getConnection()) + { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM powerPlaySubs WHERE accountId = ?"); + statement.setInt(1, accountId); + ResultSet resultSet = statement.executeQuery(); + + List subscriptions = new ArrayList<>(); + while (resultSet.next()) + { + LocalDate date = resultSet.getDate("startDate").toLocalDate(); + PowerPlayData.SubscriptionDuration duration = PowerPlayData.SubscriptionDuration.valueOf(resultSet.getString("duration").toUpperCase()); + subscriptions.add(new PowerPlayData.Subscription(date, duration)); + } + return subscriptions; + + } catch (SQLException e) + { + throw new CompletionException(e); + } + }); + } + + public PowerPlayData getCachedData(Player player) + { + return _cachedPlayerData.get(player.getUniqueId()); + } + + public void putCachedData(Player player, PowerPlayData data) + { + if (player.isOnline()) + { + _cachedPlayerData.put(player.getUniqueId(), data); + } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java index c937d4414..96e028df1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java @@ -1,78 +1,42 @@ package mineplex.core.powerplayclub; +import java.time.Month; +import java.time.YearMonth; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +import com.google.common.collect.ImmutableMap; +import mineplex.core.common.currency.GlobalCurrency; +import mineplex.core.common.skin.SkinData; import mineplex.core.common.util.BukkitFuture; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.donation.DonationManager; import mineplex.core.inventory.InventoryManager; import mineplex.core.inventory.data.Item; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.time.Month; -import java.time.Year; -import java.util.*; - public class PowerPlayClubRewards { - private static final Map> rewards = new HashMap<>(); + public static final int AMPLIFIERS_PER_MONTH = 2; + public static final int CHESTS_PER_MONTH = 1; - static - { - setRewards(2016, Month.SEPTEMBER, new PowerPlayClubItem("Squid Morph", 1, new ItemStack(Material.INK_SACK))); - } - - public static List septemberItems() // TODO: figure this out - { - return rewards.values().iterator().next(); - } - - private static void setRewards(int year, Month month, PowerPlayClubItem... items) - { - rewards.put(new RewardMonth(Year.of(year), month), Arrays.asList(items)); - } - - private static class RewardMonth - { - private final Year year; - private final Month month; - - static RewardMonth of(Year year, Month month) - { - return new RewardMonth(year, month); - } - - RewardMonth(Year year, Month month) - { - this.year = year; - this.month = month; - } - - @Override - public boolean equals(Object obj) { - if (obj == null || getClass() != obj.getClass()) return false; - - RewardMonth that = (RewardMonth) obj; - - return Objects.equals(this.year, that.year) && Objects.equals(this.month, that.month); - } - - @Override - public int hashCode() { - return Objects.hash(year, month); - } - } + private static final Map rewards = ImmutableMap.builder() + .put(YearMonth.of(2016, Month.SEPTEMBER), new PowerPlayClubItem("Squid Morph", new ItemStack(Material.INK_SACK))) + .put(YearMonth.of(2016, Month.OCTOBER), new PowerPlayClubItem("Witch Morph", SkinData.WITCH.getSkull())) + .build(); public static class PowerPlayClubItem { private final String _prize; - private final int _amount; private final ItemStack _display; - public PowerPlayClubItem(String prize, int amount, ItemStack display) + PowerPlayClubItem(String prize, ItemStack display) { _prize = prize; - _amount = amount; _display = display; } @@ -81,67 +45,69 @@ public class PowerPlayClubRewards return _prize; } - public int getAmount() - { - return _amount; - } - public ItemStack getDisplay() { return _display; } } + public static List rewardsForMonths(List months) + { + return months.stream().map(rewards::get).collect(Collectors.toList()); + } - public static void giveAllItems(Player player, InventoryManager manager, PowerPlayClubRepository repo) + + public static void giveAllItems(Player player, DonationManager donationManager, InventoryManager inventoryManager, PowerPlayClubRepository repo) { UtilPlayer.message(player, F.main("Power Play Club", "Verifying subscription..")); - repo.attemptClaim(player).thenCompose(BukkitFuture.accept(success -> + repo.attemptClaim(player).thenCompose(success -> { - if (!success) { UtilPlayer.message(player, F.main("Power Play Club", "An unexpected error happened!")); - return; + return CompletableFuture.completedFuture(null); } - repo.Get(player).setClaimed(true); + PowerPlayData cached = repo.getCachedData(player); + List items = rewardsForMonths(cached.getUnclaimedMonths()); - for (PowerPlayClubItem item : septemberItems()) // TODO: figure this out + + // Give normal power play items + items.forEach(item -> { - Item fItem = manager.getItem(item.getPrize()); - if (fItem == null) - { - UtilPlayer.message(player, F.main("Power Play Club", "An unexpected error happened!")); - } - else - { - manager.addItemToInventory(player, fItem.Name, 1); - UtilPlayer.message(player, F.main("Power Play Club", "You received " + item.getAmount() + "x " + F.elem(item.getPrize()) + ".")); - } - } - Item gameAmplifier = manager.getItem("Game Booster"); + donationManager.PurchaseUnknownSalesPackage(null, player.getName(), + donationManager.getClientManager().Get(player).getAccountId(), item.getPrize(), + GlobalCurrency.TREASURE_SHARD, 0, true); + UtilPlayer.message(player, F.main("Power Play Club", "You received the " + + F.elem(item.getPrize()) + ".")); + }); + + // Give amplifiers and chests + Item gameAmplifier = inventoryManager.getItem("Game Booster"); if (gameAmplifier == null) { UtilPlayer.message(player, F.main("Power Play Club", "An unexpected error happened!")); } else { - manager.addItemToInventory(player, gameAmplifier.Name, 2); - UtilPlayer.message(player, F.main("Power Play Club", "You received 2x " + F.elem("Game Boosters") + ".")); + inventoryManager.addItemToInventory(player, gameAmplifier.Name, AMPLIFIERS_PER_MONTH * items.size()); + UtilPlayer.message(player, F.main("Power Play Club", "You received " + (AMPLIFIERS_PER_MONTH * items.size()) + "x " + F.elem("Game Amplifier") + ".")); } - Item omegaChest = manager.getItem("Omega Chest"); + Item omegaChest = inventoryManager.getItem("Omega Chest"); if (omegaChest == null) { UtilPlayer.message(player, F.main("Power Play Club", "An unexpected error happened!")); } else { - manager.addItemToInventory(player, omegaChest.Name, 1); - UtilPlayer.message(player, F.main("Power Play Club", "You received 1x " + F.elem("Omega Chest") + ".")); + inventoryManager.addItemToInventory(player, omegaChest.Name, CHESTS_PER_MONTH * items.size()); + UtilPlayer.message(player, F.main("Power Play Club", "You received " + (CHESTS_PER_MONTH * items.size()) + "x " + F.elem("Omega Chest") + ".")); } - })); + + // Refresh Power Play data on the server + return repo.loadData(player).thenCompose(BukkitFuture.accept(data -> repo.putCachedData(player, data))); + }); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayData.java b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayData.java new file mode 100644 index 000000000..620dac03f --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayData.java @@ -0,0 +1,116 @@ +package mineplex.core.powerplayclub; + +import com.google.common.base.Objects; + +import java.time.LocalDate; +import java.time.YearMonth; +import java.util.*; +import java.util.stream.Collectors; + +public class PowerPlayData +{ + private final boolean _subscribed; + private final List _unclaimedMonths; + + static PowerPlayData fromSubsAndClaims(List subscriptions, List claimedMonths) + { + if (subscriptions.isEmpty()) + { + return new PowerPlayData(false, Collections.emptyList()); + } + + // Build the list of potential claim dates from subscriptions + List claimDates = subscriptions.stream() + .flatMap(sub -> buildMonths(sub).stream()) + .sorted() + .collect(Collectors.toCollection(LinkedList::new)); + + // Determine if player is subscribed + LocalDate latestSub = claimDates.get(claimDates.size() - 1); + final boolean subscribed = latestSub.plusMonths(1).isAfter(LocalDate.now()); + + // Remove already-claimed months + Optional latestClaimed = claimedMonths.stream().collect(Collectors.maxBy(YearMonth::compareTo)); + latestClaimed.ifPresent(latest -> + { + while (!claimDates.isEmpty()) + { + LocalDate claimDate = claimDates.get(0); + YearMonth claimMonth = YearMonth.from(claimDate); + if (latest.equals(claimMonth) || latest.isAfter(claimMonth)) + { + claimDates.remove(0); + + } else + { + break; + } + } + }); + + List unclaimedMonths = claimDates.stream() + .filter(date -> date.isBefore(LocalDate.now()) || date.equals(LocalDate.now())) // Filter dates yet to come + .map(YearMonth::from) + .distinct() + .collect(Collectors.toList()); + + return new PowerPlayData(subscribed, unclaimedMonths); + } + + private static List buildMonths(Subscription subscription) + { + switch (subscription._duration) + { + case MONTH: + return Collections.singletonList(subscription._startDate); + + case YEAR: + List months = new ArrayList<>(); + for (int i = 0; i < 12; i++) + { + months.add(subscription._startDate.plusMonths(i)); + } + return months; + + default: + throw new IllegalStateException("Invalid duration"); + } + } + + static class Subscription { + private final LocalDate _startDate; + private final SubscriptionDuration _duration; + + Subscription(LocalDate startDate, SubscriptionDuration duration) + { + _startDate = startDate; + _duration = duration; + } + } + + enum SubscriptionDuration { + MONTH, YEAR + } + + private PowerPlayData(boolean subscribed, List unclaimedMonths) + { + _subscribed = subscribed; + _unclaimedMonths = unclaimedMonths; + } + + public List getUnclaimedMonths() + { + return _unclaimedMonths; + } + + public boolean isSubscribed() + { + return _subscribed; + } + + @Override + public String toString() + { + return Objects.toStringHelper(this).add("subscribed", _subscribed).add("unclaimed", _unclaimedMonths).toString(); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java index 1dd1b3a8b..a63dc4b6f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java @@ -1,6 +1,5 @@ package mineplex.core.treasure; -import java.util.ArrayList; import java.util.List; import com.google.common.collect.Lists; @@ -63,6 +62,8 @@ public class TreasureManager extends MiniPlugin { _plugin.getServer().getPluginManager().registerEvents(treasureLocation, _plugin); } + + gadgetManager.setTreasureManager(this); } private Block[] setup(Block chestBlock) @@ -145,4 +146,9 @@ public class TreasureManager extends MiniPlugin { return _clientManager; } + + public List getTreasureLocations() + { + return _treasureLocations; + } }