diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java index 8d5cd7db5..43fdbacdc 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java @@ -20,6 +20,7 @@ public enum Rank CMOD("C.Mod", "cmod", ChatColor.GOLD, "Clans Moderators are members of the Clans Management Senior Mod team. \nTheir duties include moderation and support within the Clans servers. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), EVENT_MODERATOR("Sr.Mod", "srmod_event", ChatColor.GOLD, "Senior Moderators are members of a special \nSenior Moderator team where they have to fulfill specific tasks. \nJust like Moderators, you can always ask them for help. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 44, DyeColor.ORANGE), SNR_MODERATOR("Sr.Mod", "srmod", ChatColor.GOLD, "Senior Moderators are members of a special \nSenior Moderator team where they have to fulfill specific tasks. \nJust like Moderators, you can always ask them for help. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 44, DyeColor.ORANGE), + CMA("Mod", "mod_cma", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), MODERATOR("Mod", "mod", ChatColor.GOLD, "Moderators enforce rules and provide help to \nanyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 32, DyeColor.ORANGE), HELPER("Trainee", "train", ChatColor.GOLD, "Trainees are moderators-in-training. \nTheir duties include enforcing the rules and \nproviding help to anyone with questions or concerns. \n\nFor assistance, contact them using " + F.elem("/a ") + ".", 24, DyeColor.ORANGE), MAPLEAD("MapLead", "mapl", ChatColor.BLUE, "Map Leaders are leaders of the Mineplex Build Team. \nThey oversee the creation of new maps and manage Builders.", 25, DyeColor.BLUE), diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/ApiHost.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/ApiHost.java index a6dd1cbae..b1593c552 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/ApiHost.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/ApiHost.java @@ -71,6 +71,11 @@ public class ApiHost return getAPIHost("ENDERCHEST"); } + public static ApiHost getBanner() + { + return getAPIHost("BANNER"); + } + private String _host; private int _port; diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/MothershipCommand.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/MothershipCommand.java new file mode 100644 index 000000000..cf04491b8 --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/api/mothership/MothershipCommand.java @@ -0,0 +1,18 @@ +package mineplex.core.common.api.mothership; + +import mineplex.serverdata.commands.ServerCommand; + +public class MothershipCommand extends ServerCommand +{ + private Action action; + + public Action getAction() + { + return action; + } + + public enum Action + { + CLEANUP, START + } +} diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java index 0ab1c909f..54e4974b8 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java @@ -79,6 +79,11 @@ public class Schematic } public SchematicData paste(Location originLocation, boolean ignoreAir, boolean worldEditOffset) + { + return paste(originLocation, ignoreAir, worldEditOffset, true); + } + + public SchematicData paste(Location originLocation, boolean ignoreAir, boolean worldEditOffset, boolean quickSet) { if(worldEditOffset && hasWorldEditOffset()) { @@ -144,9 +149,16 @@ public class Schematic continue; } } - - UtilBlock.setQuick(originLocation.getWorld(), startX + x, startY + y, startZ + z, materialId, _blockData[index]); - + + if (quickSet) + { + UtilBlock.setQuick(originLocation.getWorld(), startX + x, startY + y, startZ + z, materialId, _blockData[index]); + } + else + { + originLocation.getWorld().getBlockAt(startX + x, startY + y, startZ + z).setTypeIdAndData(materialId, _blockData[index], false); + } + BlockVector bv = new BlockVector(x,y,z); output.getBlocksRaw().add(bv); 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 55d6fd4ab..88dde15c3 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 @@ -67,6 +67,7 @@ public class SkinData public final static SkinData LEPRECHAUN = new SkinData("eyJ0aW1lc3RhbXAiOjE0ODc4NzI5Mjg1ODIsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS80ZTBkZjZhZGNiNzkzMzM5ZjFhOGNkM2E0ZGQ2ZThjNGQ2ZWFjYmU5NWMzZDA5OTI4NDMyMWFiZGI5MTgwOSJ9fX0=", "cyIYHTdzvVBOyYoiJZTvNS8Et5pzqBNxuz6GQspE2lBkW2Bj82JNv5oczsf3oxYAG4zxdb96G8+7UKBmoJdvx0x6UD7Dk0dnKrwpXfOhe+jRxtwMGMsdYCb8URWaoIoeKpxdCmAtjgV6FI8zDy2Yzi+MF4O9e4VqH0tMBoD2/CZScQwNEzc4YXf2M2fglKn9uK2+xrgLV+XS+SNdIn7BRiNlQf96u6N2G0lO+eb09LbIfIgAgfnyLiARccWa+VNo6gwlCFyRMnwOlgqxL5XA5Um4kkx2ZReRRCDFQ4NV5eLBktLd5wpECyOuY7v7S3zLqwbhwG47gS8hnXqmtHG5RW0RUQZEryg638Cw7hwr2k09iStfok8WeZUIJ+fuUWgdArvbtN36a2pCXyFdqzp+E8xzSF4E9SQv0K+1lNj+w4L58dh8pddeKK8m5bpjINj4xZ6nf7reWYQAX/imVNYTXTW8JqYnF+++xViBwmfeeM3PmEg+wyTduh+M25nyhGcqn5l+UyQ9aMzzdNs2aEdx12fOm1sOFXjHrHWeo6ciEm7sY1SDjiJ99VVXuGHCJWBtxq/B+c+vC/Cj8itEYOetwe5NKrgI99pZjG+KiRr4L0n8/NA3Px7SbKUUpHse80pNMjGfFW4pAOyFXJaKHrObWT2iL2AnTe+yfdY4sf/JZT4="); public final static SkinData BUGS_BUNNY = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTA0NzE5MDU2MTgsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS84MmUyMjRkMGJkZGJmNjRiODIzMmUxNWRhNGRkN2NjN2NiYTYzM2NiODkyMTFhYjVjNDRhODU0ZjM1NDhlZWRiIn19fQ==", "QtM7YGNpqGcTnlUCTtQsQIEc8VGvL8cxWzAvN4LjYZrY4Fv15ysEVSPWPmRL/FJTRyUFCrJFO/0miVbuIEsGyUnsgHJAr9qkeyMvfD3+pZtKU1FkS58VNQkL/YaPDms7XPy1BPNo+ynQnVevdVCNDOvs2244Px3UljtuReBteKqL8QGMR1K6FFCQuKKvcvYsljdM8RV91r2yuT9UDxnzMRghWyRZuthvCeGL85g1LQxCnzJ0NUqIqCDrTWa8jeuncLnmRooKZYGsQjCAVOSFRk4KytD+fv8xgNK2igqBgVcqAINl5IjrFt7yyPQ2FVBbshETsjewusa6eZSBoy1Lc17G7bcndoOdwGMuztLjHPMzxFpIV1RkbZrngjcSTE/IQdSw79NlzMOEMKjE/34M7xcSnSZA1xwW33g+/xq+pNbqcXu85e7VXkziWDhHREp9ITT4YjrVdrss1yfYBzZgRmmLyaMpVmVsecKB9adpuZkhGzKIVrQHDGYEHoqoRnsRGJREdZQPxaSWp4+DSxpV/0oJXJWDz+XFztbcVbBcjBOD9kpFP0s+R5t1WA2B+jsf9J3LdsUUDbBiWikBwbAXKhHxTWWKv6OZLZovhgvGnW2lXQsHglEKuD7jE/mnFj4SF2qRO2N37AUjaG8AGQtTVhxW5JneIiBA0dbKIk06yoY="); public final static SkinData SLENDERMAN = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTA0NzUyNzk4NTUsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9hMWNkOTI5OTFmYTRjZGQ2MGVlZDNhZTM3ZmI5NWRmZjFkNWNkOGNiZmYwYWFjMzE4MmQ0ODU2NDU5NTIzYyJ9fX0=", "OVqWFLCekyZcdGli6kPBKNh8/VYPhKZGNqlAvSOKc3RLgh4pIkI6TDPr/Y+VQdhz1wZozARFYSeoDJJJ4nZTi7gi3rVPG2rL1ZnKo7so5hdT8caEzSTRmgwPKzo03ZhEEsW9AEJo9mpiUxGSJdBlgEb9UgodpYFW1IjRC09CcBUqzRWP8QGZTSFSN5x9emQ97DyiFmt0NFWubHCKHdb7CExhchPRtbahL3hOEzPY8/Y+Irl9OZjx7jONE7O/sYItCuZoXc3FaTgCV0riiXHCgH2eA54s5TQVWumtp3FU7VIcKR6pm/o61+GusvqhNgdFNk9XSHWMUyp+HNU0R8sConZQN/eaVx9laJmUUb4zNZ7hX/hLYV+r9LFU1NXOeIZWJPShD+bYfZgEorIpD+EAL4BHht/f5e6a1IZUDBWb001PFibby2t9WWjoDVKz4McbxZ2Xui7EHKFG1K3biPibhWx6fvnOeJ2xW6UDIZcD+TCXwlW/knkFt44Xpyv3oNHk3UNkyrQgghd6qkc3gZHxP8PQCNvKIyK1I+pHR6JMZvSStp7ZQRDpvsvIUyOJvq+7Bs7lFYs8hcJHMzEB+8PYlH2k7P7iLuA6ZYFUmvOW1LLq0+hvxK96ZdNEsJdmMkVVTZBRw7vsZ4GPbkdp2cMOFH2lHcQj80xKqVbd43IqFDA="); + public final static SkinData BOB_ROSS = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTU2NjEyOTc2NTcsInByb2ZpbGVJZCI6IjdkYTJhYjNhOTNjYTQ4ZWU4MzA0OGFmYzNiODBlNjhlIiwicHJvZmlsZU5hbWUiOiJHb2xkYXBmZWwiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVhNzZhN2NlMzZlZGRiYmZhNWMzMmJhZmVhYmUyNmQ3ZWJlNWRlOTBkNzYyYzJmNWY3OTQ1ZTQ1ODUxOTU2ZDYifX19", "b7pUQSZ1UkMZJNSqdaBPGWfm+rfvFkEh58pBvYTG2RBPwVju1kKinb1LfsyYhFKlyPvL1jfqi30udmb0302QvE0SKg7p3txxULa3Hr94+eCJWFxrOxUNorRT9E+TurJxH6jimu6KW1p6goPn77/kgNaWb9xn3+E84+vH0z9ETjgc5G0aYLT+cSzThUorhvOQ7DRLfRgSWiFxfm3Er0g+waLfDEeNNAd6OJ5k3X+kgM/+V6QTIFofnZZ6NdZZInTARAVol2H0pRfQfAuVYfJyVyvA0uF+ZX+wlMuBTG1MeyWjZgI1iUKmGaQADXsAV796kT+Z+tAXpbRYYYZnxil5jx5P4druiHvaQfV2KK3lbKm2uH9M3SZr5d57C3V24BKRRWGS4C9INzgO8ORIIomes7kp0gECS4MnSMI6hcl0JsXVlaAy88BgmT/PKxM+3q4PCQE1N9fTCuhoil7vVYIU3uBXwFUE7NTAOUdBee+3TtMstIu2WP8rtEZBVpGH9CmomaLTCzPZSdXGY31goOFXSRYMNi8j4ykuBgP0qJqimipWH0rBF1bMdHqMu359h62tTLRKipHWXPxj4N8c/n1CVPYjuXH9X3f1HAU4DnET+v93Vb/uzbx8rXFrz6jLPwAjSlJ8Th3VE+4ey/ZBHWPB+SuHetN+e0r/LYxiqwwlnwI="); // 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.Common/src/mineplex/core/common/util/UtilBlock.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java index 91c93c620..acfa65274 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java @@ -378,7 +378,45 @@ public class UtilBlock { return fullSolid.contains(block); } - + + /** + * Determines whether a block is a bottom slab. + * + * @param block The block object. + * + * @return true if block is a bottom slab. + */ + public static boolean bottomSlab(Block block) + { + return bottomSlab(block.getType().getId(), block.getData()); + } + + /** + * Determines whether a block is a bottom slab. + * + * @param block The block id + * @param data The block data + * + * @return true if block is a bottom slab. + */ + public static boolean bottomSlab(int block, byte data) + { + switch (block) + { + case 44: + if (data >= 0 && data <= 7) return true; + break; + case 182: + if (data == 0) return true; + break; + case 126: + if (data >= 0 && data <= 5) return true; + break; + } + + return false; + } + public static boolean usable(Block block) { if (block == null) return false; diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java index 635bedba2..580b337f5 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java @@ -694,9 +694,9 @@ public class UtilEnt return ent.isOnGround(); } - AxisAlignedBB box = ((CraftEntity)ent).getHandle().getBoundingBox().shrink(0.05, 0, 0.05); - Location bottom_corner_1 = new Location(ent.getWorld(), box.a, ent.getLocation().getY()-0.05, box.c); - Location bottom_corner_2 = new Location(ent.getWorld(), box.d, ent.getLocation().getY()-0.05, box.f); + AxisAlignedBB box = ((CraftEntity)ent).getHandle().getBoundingBox(); + Location bottom_corner_1 = new Location(ent.getWorld(), box.a, ent.getLocation().getY()-0.1, box.c); + Location bottom_corner_2 = new Location(ent.getWorld(), box.d, ent.getLocation().getY()-0.1, box.f); for(Block b : UtilBlock.getInBoundingBox(bottom_corner_1, bottom_corner_2)){ if(UtilBlock.solid(b)) return true; diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java index bfc5e4ec8..19b7b6059 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java @@ -1,5 +1,6 @@ package mineplex.core.common.util; +import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -1145,6 +1146,11 @@ public class UtilPlayer return entityPlayer.activeContainer != entityPlayer.defaultContainer; } + public static String getIp(Player player) + { + return player.getAddress().getAddress().getHostAddress(); + } + /* * Returns whether the UUID belongs to a slim skin */ diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java index 5eb91a337..5eccc50b9 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/particles/effects/LineParticle.java @@ -56,7 +56,7 @@ public class LineParticle if (_direction == null) { - direction = UtilAlg.getTrajectory(start, end).normalize(); + _direction = UtilAlg.getTrajectory(start, end).normalize(); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 419b8b977..1d1dd47c4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -59,9 +59,16 @@ public enum Achievement GLOBAL_EGG_HUNTER_2017("2017 Egg Hunter", 4000, new String[]{"Global.Easter Eggs 2017"}, - new String[]{"Find 200 Easter Egg Baskets,", + new String[]{"Find 35 Easter Egg Baskets,", "during Easter 2017"}, - new int[]{200}, + new int[]{35}, + AchievementCategory.HOLIDAY), + + GLOBAL_ALIEN_INVASION("2017 Alien Hub Defender", 4000, + new String[]{"Global.Alien Invasion 2017"}, + new String[]{"Kill 300 Aliens in the Lobby,", + "during the Alien Invasion event"}, + new int[]{300}, AchievementCategory.HOLIDAY), //Bridges @@ -373,7 +380,7 @@ public enum Achievement new String[]{"Win 30 games of Master Builders"}, new int[]{30}, AchievementCategory.MASTER_BUILDERS), - + //Castle Siege CASTLE_SIEGE_WINS("FOR THE KING!", 600, new String[]{"Castle Siege.ForTheKing"}, @@ -398,6 +405,70 @@ public enum Achievement new String[]{"Do 50% or more of the damage to the king"}, new int[]{1}, AchievementCategory.CASTLE_SIEGE), + + //Castle Assault + CASTLE_ASSAULT_KILL_STREAK("Kill Streak", 0, + new String[]{"Castle Assault.KillStreak", "Castle Assault TDM.KillStreak"}, + new String[]{"Earn Kill Streak Rewards"}, + new int[][]{new int[]{0, 50, 500}, new int[]{0, 100, 750}, new int[]{0, 150, 1000}, new int[]{0, 200, 1500}, new int[]{0, 400, 2000}, new int[]{0, 500, 2500}, new int[]{0, 1000, 3000}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4000}, new int[]{0, 5000, 100000}}, + new int[]{10, 20, 50, 100, 200, 250, 500, 750, 1000, 2000}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_ASSAULT), + + CASTLE_ASSAULT_FIRST_BLOOD("First Blood", 0, + new String[]{"Castle Assault.FirstBlood", "Castle Assault TDM.FirstBlood"}, + new String[]{"Obtain the first kill in a Match"}, + new int[][]{new int[]{0, 100, 100}, new int[]{0, 150, 200}, new int[]{0, 200, 300}, new int[]{0, 250, 400}, new int[]{0, 500, 500}}, + new int[]{2, 5, 10, 25, 50}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V"}, + AchievementCategory.CASTLE_ASSAULT), + + CASTLE_ASSAULT_FIGHTER_KIT("Fighter", 0, + new String[]{"Castle Assault.FighterKitKills", "Castle Assault TDM.FighterKitKills"}, + new String[]{"Kill opponents while wearing the Fighter Kit"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_ASSAULT), + + CASTLE_ASSAULT_TANK_KIT("Tank", 0, + new String[]{"Castle Assault.TankKitKills", "Castle Assault TDM.TankKitKills"}, + new String[]{"Kill opponents while wearing the Tank Kit"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_ASSAULT), + + CASTLE_ASSAULT_ARCHER_KIT("Archer", 0, + new String[]{"Castle Assault.ArcherKitKills", "Castle Assault TDM.ArcherKitKills"}, + new String[]{"Kill opponents while wearing the Archer Kit"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_ASSAULT), + + CASTLE_ASSAULT_DEMOLITIONIST_KIT("Demolitionist", 0, + new String[]{"Castle Assault.DemolitionistKitKills", "Castle Assault TDM.DemolitionistKitKills"}, + new String[]{"Kill opponents while wearing the Demolitionist Kit"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_ASSAULT), + + CASTLE_ASSAULT_WINNER("Assault", 0, + new String[]{"Castle Assault.Wins", "Castle Assault TDM.Wins"}, + new String[]{"Win games of Castle Assault"}, + new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}}, + new int[]{2, 5, 25, 50, 100, 150, 250, 500, 1000, 2000}, + "Initiate", + new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"}, + AchievementCategory.CASTLE_ASSAULT), //Champions CHAMPIONS_WINS("Champion", 600, @@ -1135,17 +1206,36 @@ public enum Achievement private String _name; private String[] _desc; private String[] _stats; + private int[][] _levelUpRewards; private int[] _levels; + private String _defaultLevelName; + private String[] _levelNames; private int _gems; private AchievementCategory _category; + Achievement(String name, int gems, String[] stats, String[] desc, int[][] levelUpRewards, int[] levels, String defaultLevelName, String[] levelNames, AchievementCategory category) + { + _name = name; + _gems = gems; + _desc = desc; + _stats = stats; + _levelUpRewards = levelUpRewards; + _levels = levels; + _defaultLevelName = defaultLevelName; + _levelNames = levelNames; + _category = category; + } + Achievement(String name, int gems, String[] stats, String[] desc, int[] levels, AchievementCategory category) { _name = name; _gems = gems; _desc = desc; _stats = stats; + _levelUpRewards = new int[][] {}; _levels = levels; + _levelNames = new String[] {}; + _defaultLevelName = ""; _category = category; } @@ -1228,11 +1318,26 @@ public enum Achievement { return _stats; } + + public int[][] getLevelUpRewards() + { + return _levelUpRewards; + } public int[] getLevels() { return _levels; } + + public String getDefaultLevelName() + { + return _defaultLevelName; + } + + public String[] getLevelNames() + { + return _levelNames; + } public int getMaxLevel() { @@ -1248,6 +1353,11 @@ public enum Achievement { return _levels.length == 1; } + + public boolean hasLevelNames() + { + return _levelNames.length > 0; + } public AchievementCategory getCategory() { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 37805a3be..3a2d752df 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -84,7 +84,11 @@ public enum AchievementCategory WIZARDS("Wizards", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, Material.BLAZE_ROD, 0, GameCategory.SURVIVAL, "Witch Doctor Kit", false, GameDisplay.Wizards.getGameId()), - + + CASTLE_ASSAULT("Castle Assault", new String[] {"Castle Assault", "Castle Assault TDM"}, + new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.CROWNS_EARNED }, + Material.DIAMOND_CHESTPLATE, 0, GameCategory.CLASSICS, null, false, GameDisplay.CastleAssault.getGameId(), GameDisplay.CastleAssaultTDM.getGameId()), + CASTLE_SIEGE("Castle Siege", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, new StatDisplay("Kills as Defenders"), new StatDisplay("Deaths as Defenders"), new StatDisplay("Kills as Undead"), new StatDisplay("Deaths as Undead"), StatDisplay.GEMS_EARNED }, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/StatDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/StatDisplay.java index a4dc577ed..8609bb12a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/StatDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/StatDisplay.java @@ -89,6 +89,7 @@ public class StatDisplay public static final StatDisplay KILLS = new StatDisplay("Kills"); public static final StatDisplay DEATHS = new StatDisplay("Deaths"); public static final StatDisplay GEMS_EARNED = new StatDisplay("Gems Earned", "GemsEarned"); + public static final StatDisplay CROWNS_EARNED = new StatDisplay("Crowns Earned", "CrownsEarned"); public static final StatDisplay TIME_IN_GAME = new StatDisplay("Time In Game", "TimeInGame"); public static final StatDisplay GAMES_PLAYED = new StatDisplay("Games Played", "Wins", "Losses"); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java index e2825bfde..0ff566c82 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java @@ -107,6 +107,14 @@ public class AchievementMainPage extends ShopPageBase 1) continue; @@ -121,6 +129,8 @@ public class AchievementMainPage extends ShopPageBase 0) + { lore.add(" "); + } } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java index b0912addd..3915059e8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementPage.java @@ -3,6 +3,15 @@ package mineplex.core.achievement.ui.page; import java.util.ArrayList; import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.Achievement; import mineplex.core.achievement.AchievementCategory; @@ -20,14 +29,6 @@ import mineplex.core.shop.page.ShopPageBase; import mineplex.core.stats.PlayerStats; import mineplex.core.stats.StatsManager; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - public class AchievementPage extends ShopPageBase { private static int ACHIEVEMENT_MIDDLE_INDEX = 31; @@ -68,6 +69,7 @@ public class AchievementPage extends ShopPageBase= achievement.getMaxLevel(); if (!hasUnlocked) @@ -80,7 +82,16 @@ public class AchievementPage extends ShopPageBase lore = new ArrayList(); lore.add(" "); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java index b59982c6f..ea10db00a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java @@ -80,6 +80,8 @@ import mineplex.core.preferences.Preference; import mineplex.core.preferences.PreferencesManager; import mineplex.core.punish.Category; import mineplex.core.punish.Punish; +import mineplex.core.punish.PunishClient; +import mineplex.core.punish.Punishment; import mineplex.core.punish.PunishmentResponse; import mineplex.serverdata.commands.ServerCommandManager; @@ -199,7 +201,7 @@ public class AntiHack extends MiniPlugin runSync(() -> _banned.remove(uuid)); } - public void doBan(Player player, Class cause, boolean gep) + public void doBan(Player player, Class cause, boolean gep, int hoursBanned) { runSync(() -> { @@ -208,7 +210,7 @@ public class AntiHack extends MiniPlugin CoreClient coreClient = _clientManager.Get(player); String id = generateId(); - String finalMessage = "[GWEN] " + id; + String finalMessage = "[GWEN Cheat Detection]\n\nBan Token:\n" + org.bukkit.ChatColor.GRAY + id; JsonObject custom = new JsonObject(); custom.addProperty("ban-reason", CheckManager.getCheckSimpleName(cause)); if (gep) @@ -225,7 +227,7 @@ public class AntiHack extends MiniPlugin new GwenBanNotification(_thisServer, player.getName(), player.getUniqueId().toString(), coreClient.GetRank().name(), CheckManager.getCheckSimpleName(cause), id, gep).publish(); }); - _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, -1, true, after); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, hoursBanned, true, after); }; if (coreClient.GetRank().has(Rank.TWITCH)) @@ -264,7 +266,7 @@ public class AntiHack extends MiniPlugin Consumer> doPunish = after -> { - _punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, -1, true, after); + _punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, getHoursBanned(player), true, after); }; if (coreClient.GetRank().has(Rank.TWITCH)) @@ -340,6 +342,46 @@ public class AntiHack extends MiniPlugin event.setCancelled(true); } + public int getPunishments(Player player) + { + PunishClient punishClient = require(Punish.class).GetClient(player.getName()); + + if (punishClient == null) + { + return -1; + } + + int totalPunishments = 0; + + if (punishClient.GetPunishments().containsKey(Category.Hacking)) + { + for (Punishment punishment : punishClient.GetPunishments().get(Category.Hacking)) + { + if (punishment.GetAdmin().equalsIgnoreCase(NAME) && punishment.GetReason().contains("[GWEN")) + { + totalPunishments++; + } + } + } + + return totalPunishments; + } + + public int getHoursBanned(Player player) + { + switch (getPunishments(player)) + { + case 0: + return 5 * 24; + case 1: + return 14 * 24; + case 2: + return 30 * 24; + default: + return -1; + } + } + public void announceBan(Player player) { Bukkit.getServer().broadcastMessage(String.format(USER_HAS_BEEN_BANNED, player.getName())); @@ -427,7 +469,7 @@ public class AntiHack extends MiniPlugin .append("A").color(ChatColor.AQUA).obfuscated(true) .append(" GWEN > ", ComponentBuilder.FormatRetention.NONE).color(ChatColor.RED).bold(true) .append(violation.getPlayerName(), ComponentBuilder.FormatRetention.NONE).color(ChatColor.GOLD) - .append(" failed " + violation.getHackType() + " VL" + violation.getViolations() + " in server", ComponentBuilder.FormatRetention.NONE).color(ChatColor.YELLOW) + .append(" failed " + violation.getHackType() + " VL" + violation.getViolations() + " in server ", ComponentBuilder.FormatRetention.NONE).color(ChatColor.YELLOW) .append(violation.getOriginatingServer(), ComponentBuilder.FormatRetention.NONE).color(ChatColor.YELLOW) .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/server " + violation.getOriginatingServer())) .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java index 6840ec600..f58f843a9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/BanwaveAction.java @@ -23,9 +23,11 @@ public class BanwaveAction extends AntiHackAction @Override public void handle(PlayerViolationEvent event) { + AntiHack _antiHack = Managers.get(AntiHack.class); + if (event.getViolations() >= (Math.floor(getMinVl() * .9)) && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { - Managers.get(AntiHack.class).doBan(event.getPlayer(), event.getCheckClass(), true); + _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); return; } if (event.getViolations() >= this.getMinVl()) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java index 0fbaa3377..4f09f49f0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/GEPBanAction.java @@ -15,9 +15,11 @@ public class GEPBanAction extends AntiHackAction @Override public void handle(PlayerViolationEvent event) { + AntiHack _antiHack = Managers.get(AntiHack.class); + if (event.getViolations() >= this.getMinVl() && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { - Managers.get(AntiHack.class).doBan(event.getPlayer(), event.getCheckClass(), true); + _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); } } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java index 1016ba9c5..6062d9629 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/actions/ImmediateBanAction.java @@ -15,14 +15,16 @@ public class ImmediateBanAction extends AntiHackAction @Override public void handle(PlayerViolationEvent event) { + AntiHack _antiHack = Managers.get(AntiHack.class); + if (event.getViolations() >= (Math.floor(getMinVl() * .9)) && event.getPlayer().getMetadata("GWENEXTREMEPREJUDICE").get(0).asBoolean()) { - Managers.get(AntiHack.class).doBan(event.getPlayer(), event.getCheckClass(), true); + _antiHack.doBan(event.getPlayer(), event.getCheckClass(), true, _antiHack.getHoursBanned(event.getPlayer())); return; } if (event.getViolations() >= this.getMinVl()) { - Managers.get(AntiHack.class).doBan(event.getPlayer(), event.getCheckClass(), false); + _antiHack.doBan(event.getPlayer(), event.getCheckClass(), false, _antiHack.getHoursBanned(event.getPlayer())); } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java index 668c60db2..7123a383c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/banwave/BanWaveManager.java @@ -1,5 +1,13 @@ package mineplex.core.antihack.banwave; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +import com.google.gson.JsonObject; +import com.mineplex.anticheat.checks.Check; +import com.mineplex.anticheat.checks.CheckManager; + import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; @@ -8,16 +16,6 @@ import mineplex.core.antihack.AntiHack; import mineplex.core.antihack.logging.AntihackLogger; import mineplex.core.antihack.redisnotifications.GwenBanwaveNotification; import mineplex.core.common.util.UtilServer; -import mineplex.serverdata.commands.ServerCommandManager; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerJoinEvent; - -import com.google.gson.JsonObject; -import com.mineplex.anticheat.checks.Check; -import com.mineplex.anticheat.checks.CheckManager; @ReflectivelyCreateMiniPlugin public class BanWaveManager extends MiniPlugin @@ -60,7 +58,7 @@ public class BanWaveManager extends MiniPlugin runAsync(() -> { String id = AntiHack.generateId(); - String newMessage = "[GWEN] [BanWave] " + id; + String newMessage = "[GWEN Cheat Detection]\n\nToken: " + id; CoreClient client = _clientManager.Get(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java new file mode 100644 index 000000000..48f092b2e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountManager.java @@ -0,0 +1,94 @@ +package mineplex.core.antihack.compedaccount; + +import java.util.logging.Level; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +import com.google.gson.JsonObject; + +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.account.CoreClient; +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.api.ApiHost; +import mineplex.core.common.api.ApiWebCall; +import mineplex.core.common.util.UtilPlayer; + +@ReflectivelyCreateMiniPlugin +public class CompromisedAccountManager extends MiniPlugin +{ + private final CompromisedAccountRepository _repository = new CompromisedAccountRepository(); + + private final CoreClientManager _clientManager = require(CoreClientManager.class); + + private final ApiWebCall _apiCall; + + private CompromisedAccountManager() + { + super("CompedAccount"); + + String url = "http://" + ApiHost.getBanner().getHost() + ":" + ApiHost.getBanner().getPort() + "/"; + _apiCall = new ApiWebCall(url); + } + + public void submitImmediateBan(Player player) + { + _repository.insertPunishment(_clientManager.getAccountId(player), UtilPlayer.getIp(player), "immediate").whenComplete((res, err) -> + { + if (err != null) + { + getPlugin().getLogger().log(Level.SEVERE, "An unexpected error occurred while submitting immediate ban of " + player.getName(), err); + } + }); + } + + public void submitPendingDelayedBan(Player player) + { + _repository.insertPunishment(_clientManager.getAccountId(player), UtilPlayer.getIp(player), "predelayed").whenComplete((res, err) -> + { + if (err != null) + { + getPlugin().getLogger().log(Level.SEVERE, "An unexpected error occurred while submitting delayed ban of " + player.getName(), err); + } + }); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) + { + runAsync(() -> + { + JsonObject response = _apiCall.post("api/server/login/" + event.getPlayer().getName(), JsonObject.class, getPlayerInfo(event.getPlayer())); + if (response != null && response.get("error") != null) + { + getPlugin().getLogger().log(Level.SEVERE, "Response from Banner: " + response); + } + }); + } + + public void triggerPriorityBan(Player player, PriorityCause cause) + { + runAsync(() -> + { + JsonObject response = _apiCall.post("api/banner/trigger/" + player.getName(), JsonObject.class, new TriggerPriorityInfo(getPlayerInfo(player), cause)); + if (response != null && response.get("error") != null) + { + getPlugin().getLogger().log(Level.SEVERE, "Response from Banner: " + response); + } + }); + } + + private PlayerInfo getPlayerInfo(Player player) + { + CoreClient coreClient = _clientManager.Get(player); + return new PlayerInfo( + player.getName(), + coreClient.getName(), + player.getUniqueId(), + coreClient.getAccountId(), + UtilPlayer.getIp(player) + ); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountRepository.java new file mode 100644 index 000000000..c9af4fa35 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/CompromisedAccountRepository.java @@ -0,0 +1,46 @@ +package mineplex.core.antihack.compedaccount; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.concurrent.CompletableFuture; + +import mineplex.core.common.util.UtilServer; +import mineplex.serverdata.database.DBPool; +import mineplex.serverdata.database.RepositoryBase; + +public class CompromisedAccountRepository extends RepositoryBase +{ + private static final String INSERT_BAN = "INSERT INTO gwenPunishments (accountId, ip, type) VALUES (?, ?, ?)"; + + public CompromisedAccountRepository() + { + super(DBPool.getAccount()); + } + + public CompletableFuture insertPunishment(int accountId, String ip, String type) + { + CompletableFuture future = new CompletableFuture<>(); + + CompletableFuture.runAsync(() -> { + try (Connection connection = getConnection()) + { + try (PreparedStatement preparedStatement = connection.prepareStatement(INSERT_BAN)) + { + preparedStatement.setInt(1, accountId); + preparedStatement.setString(2, ip); + preparedStatement.setString(3, type); + preparedStatement.executeUpdate(); + } + } + catch (SQLException ex) + { + future.completeExceptionally(ex); + return; + } + future.complete(null); + }); + + return future; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PlayerInfo.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PlayerInfo.java new file mode 100644 index 000000000..d80ccf5b9 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PlayerInfo.java @@ -0,0 +1,62 @@ +package mineplex.core.antihack.compedaccount; + +import java.util.Objects; +import java.util.UUID; + +public class PlayerInfo +{ + private final String _name; + private final String _realName; + private final UUID _uuid; + private final int _accountId; + private final String _ip; + + public PlayerInfo(String name, String realName, UUID uuid, int accountId, String ip) + { + _name = name; + _realName = realName; + _uuid = uuid; + _accountId = accountId; + _ip = ip; + } + + public String getName() + { + return _name; + } + + public String getRealName() + { + return _realName; + } + + public UUID getUuid() + { + return _uuid; + } + + public int getAccountId() + { + return _accountId; + } + + public String getIp() + { + return _ip; + } + + @Override + public boolean equals(Object o) + { + if (this == o) return true; + if (!(o instanceof PlayerInfo)) return false; + PlayerInfo that = (PlayerInfo) o; + return _accountId == that._accountId; + } + + @Override + public int hashCode() + { + return Objects.hash(_accountId); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PriorityCause.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PriorityCause.java new file mode 100644 index 000000000..697432b38 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/PriorityCause.java @@ -0,0 +1,7 @@ +package mineplex.core.antihack.compedaccount; + +public enum PriorityCause +{ + JOIN_GAME, + CHAT +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/TriggerPriorityInfo.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/TriggerPriorityInfo.java new file mode 100644 index 000000000..aea9654e2 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/compedaccount/TriggerPriorityInfo.java @@ -0,0 +1,23 @@ +package mineplex.core.antihack.compedaccount; + +public class TriggerPriorityInfo +{ + private final PlayerInfo _target; + private final PriorityCause _cause; + + public TriggerPriorityInfo(PlayerInfo target, PriorityCause cause) + { + _target = target; + _cause = cause; + } + + public PlayerInfo getTarget() + { + return _target; + } + + public PriorityCause getCause() + { + return _cause; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java index 9b1934c9c..8ef17f337 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java @@ -1,9 +1,12 @@ package mineplex.core.donation; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import org.bukkit.entity.Player; @@ -15,10 +18,14 @@ import mineplex.core.MiniClientPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; +import mineplex.core.account.ILoginProcessor; +import mineplex.core.account.event.ClientUnloadEvent; import mineplex.core.account.event.ClientWebResponseEvent; import mineplex.core.common.currency.GlobalCurrency; +import mineplex.core.donation.command.CrownCommand; import mineplex.core.donation.command.GemCommand; import mineplex.core.donation.command.ShardCommand; +import mineplex.core.donation.crown.CrownRepository; import mineplex.core.donation.gold.GoldRepository; import mineplex.core.donation.repository.DonationRepository; import mineplex.core.donation.repository.token.DonorTokenWrapper; @@ -40,7 +47,10 @@ public class DonationManager extends MiniClientPlugin private static final Gson GSON = new Gson(); private final Map> _attemptUntilSuccess = new HashMap<>(); - + + private final Map _crownBalance = new ConcurrentHashMap<>(); + private final CrownRepository _crownRepository; + private final CoreClientManager _clientManager = require(CoreClientManager.class); private final DonationRepository _repository; @@ -52,6 +62,36 @@ public class DonationManager extends MiniClientPlugin _repository = new DonationRepository(); _goldRepository = new GoldRepository(); + + _crownRepository = new CrownRepository(); + _clientManager.addStoredProcedureLoginProcessor(new ILoginProcessor() + { + @Override + public String getName() + { + return "crown-balance-loader"; + } + + @Override + public void processLoginResultSet(String playerName, UUID uuid, int accountId, ResultSet resultSet) throws SQLException + { + boolean hasRow = resultSet.next(); + if (hasRow) + { + _crownBalance.put(uuid, resultSet.getInt(1)); + } + else + { + _crownBalance.put(uuid, 0); + } + } + + @Override + public String getQuery(int accountId, String uuid, String name) + { + return "SELECT crownCount FROM accountCrowns WHERE accountId=" + accountId + ";"; + } + }); UtilScheduler.runEvery(UpdateType.FAST, this::processCoinAttemptQueue); } @@ -61,6 +101,7 @@ public class DonationManager extends MiniClientPlugin { addCommand(new GemCommand(this)); addCommand(new ShardCommand(this)); + addCommand(new CrownCommand(this)); } @EventHandler @@ -75,6 +116,88 @@ public class DonationManager extends MiniClientPlugin { return _goldRepository; } + + public int getCrowns(Player player) + { + return getCrowns(player.getUniqueId()); + } + + public int getCrowns(UUID uuid) + { + return _crownBalance.computeIfAbsent(uuid, key -> 0); + } + + /** + * Adds an unknown sales package to the specified {@link Player} + * + * @param callback The callback which will be called on the main thread. Possible responses are: + * {@link TransactionResponse#InsufficientFunds}, when the player does not have enough of the currency + * {@link TransactionResponse#Success}, when everything worked fine + * {@link TransactionResponse#Failed}, when an known exception occured + * {@link TransactionResponse#AlreadyOwns}, when the player already owns the package + */ + public void purchaseUnknownSalesPackageCrown(Player player, String packageName, int cost, boolean oneTimePurchase, Consumer callback) + { + purchaseUnknownSalesPackageCrown(_clientManager.Get(player), packageName, cost, oneTimePurchase, callback); + } + + /** + * Adds an unknown sales package to the specified {@link CoreClient} + * + * @param callback The callback which will be called on the main thread. Possible responses are: + * {@link TransactionResponse#InsufficientFunds}, when the player does not have enough of the currency + * {@link TransactionResponse#Success}, when everything worked fine + * {@link TransactionResponse#Failed}, when an known exception occured + * {@link TransactionResponse#AlreadyOwns}, when the player already owns the package + */ + public void purchaseUnknownSalesPackageCrown(CoreClient client, String packageName, int cost, boolean oneTimePurchase, Consumer callback) + { + Donor donor = Get(client.getUniqueId()); + + if (donor != null) + { + if (oneTimePurchase && donor.ownsUnknownSalesPackage(packageName)) + { + if (callback != null) + { + callback.accept(TransactionResponse.AlreadyOwns); + } + + return; + } + } + + _crownRepository.consumeCrowns(result -> + { + if (result == TransactionResponse.Success) + { + if (_crownBalance.containsKey(client.getUniqueId())) + { + _crownBalance.put(client.getUniqueId(), _crownBalance.get(client.getUniqueId()) - cost); + } + _repository.purchaseUnknownSalesPackage(client.getName(), packageName, GlobalCurrency.GEM, 0, response -> + { + if (response == TransactionResponse.Success) + { + if (donor != null) + { + donor.addOwnedUnknownSalesPackage(packageName); + donor.addBalance(GlobalCurrency.GEM, 0); + } + } + + if (callback != null) + { + callback.accept(response); + } + }); + } + else if (callback != null) + { + callback.accept(result); + } + }, client.getAccountId(), cost); + } /** * Adds an unknown sales package to the specified {@link Player} @@ -187,6 +310,26 @@ public class DonationManager extends MiniClientPlugin callback.accept(response); }); } + + public void rewardCrowns(int crowns, Player player) + { + rewardCrowns(crowns, player, null); + } + + public void rewardCrowns(int crowns, Player player, Consumer completed) + { + _crownRepository.rewardCrowns(success -> + { + if (success) + { + _crownBalance.merge(player.getUniqueId(), crowns, Integer::sum); + } + if (completed != null) + { + completed.accept(success); + } + }, _clientManager.Get(player).getAccountId(), crowns); + } /** * Rewards the specified {@link Player} with {@code amount} of {@code currency} because of {@code reason} @@ -405,4 +548,10 @@ public class DonationManager extends MiniClientPlugin { return _clientManager; } + + @EventHandler + public void unloadCrownBalance(ClientUnloadEvent event) + { + _crownBalance.remove(event.getUniqueId()); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/command/CrownCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/command/CrownCommand.java new file mode 100644 index 000000000..72800e748 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/command/CrownCommand.java @@ -0,0 +1,91 @@ +package mineplex.core.donation.command; + +import org.bukkit.entity.Player; + +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.common.util.UtilServer; +import mineplex.core.donation.DonationManager; + +public class CrownCommand extends CommandBase +{ + public CrownCommand(DonationManager plugin) + { + super(plugin, Rank.ADMIN, "crown"); + } + + @Override + public void Execute(final Player caller, String[] args) + { + if (args.length < 2) + { + UtilPlayer.message(caller, F.main("Crown", "Missing Args: " + F.elem("/crown "))); + return; + } + + String targetName = args[0]; + + int amount; + + try + { + amount = Integer.parseInt(args[1]); + } + catch (NumberFormatException ex) + { + UtilPlayer.message(caller, F.main("Crown", "Invalid crown Amount")); + return; + } + + if (targetName.equalsIgnoreCase("@a")) + { + rewardAllCrowns(caller, amount); + } + else + { + Player target = UtilPlayer.searchExact(targetName); + if (target != null) + { + rewardCrowns(caller, target, amount); + } + else + { + UtilPlayer.message(caller, F.main("Crown", "Could not find player " + F.name(targetName))); + } + } + } + + private void rewardAllCrowns(Player caller, int crowns) + { + if (crowns > 1000) + { + UtilPlayer.message(caller, F.main("Crown", "You can only give everybody 1000 crowns at a time.")); + return; + } + + for (Player player : UtilServer.getPlayers()) + { + Plugin.rewardCrowns(crowns, player); + } + + UtilPlayer.message(caller, F.main("Crown", "Gave everyone " + F.elem(crowns + " crowns"))); + } + + private void rewardCrowns(Player caller, Player target, int crowns) + { + Plugin.rewardCrowns(crowns, target, completed -> + { + if (completed) + { + UtilPlayer.message(caller, F.main("Crown", "You gave " + F.elem(crowns + " crowns") + " to " + F.name(target.getName()) + ".")); + UtilPlayer.message(target, F.main("Crown", F.name(caller.getName()) + " gave you " + F.elem(crowns + " crowns") + ".")); + } + else + { + UtilPlayer.message(caller, F.main("Crown", "There was an error giving " + F.elem(crowns + " crowns") + " to " + F.name(target.getName()) + ".")); + } + }); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java new file mode 100644 index 000000000..49fd9364d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/crown/CrownRepository.java @@ -0,0 +1,117 @@ +package mineplex.core.donation.crown; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import org.bukkit.Bukkit; + +import mineplex.core.common.util.Callback; +import mineplex.core.common.util.UtilServer; +import mineplex.core.server.util.TransactionResponse; +import mineplex.serverdata.database.DBPool; + +public class CrownRepository +{ + private static final String CREATE_TABLE = "CREATE TABLE accountCrowns (accountId INT(11) NOT NULL, crownCount INT NOT NULL, PRIMARY KEY (accountId), FOREIGN KEY (accountId) REFERENCES accounts(id));"; + private static final String REWARD_ACCOUNT_CROWNS = "INSERT INTO accountCrowns (accountId, crownCount) VALUES (?, ?) ON DUPLICATE KEY UPDATE crownCount=crownCount+VALUES(crownCount);"; + private static final String CONSUME_ACCOUNT_CROWNS = "UPDATE accountCrowns SET crownCount=(crownCount - ?) WHERE accountId=? AND crownCount >= ?;"; + private static final String SET_ACCOUNT_CROWNS = "INSERT INTO accountCrowns (accountId, crownCount) VALUES (?, ?) ON DUPLICATE KEY UPDATE crownCount=VALUES(crownCount);"; + + public CrownRepository() {} + + public void rewardCrowns(final Callback callback, final int accountId, final int crowns) + { + Bukkit.getScheduler().runTaskAsynchronously(UtilServer.getPlugin(), () -> + { + try (Connection connection = DBPool.getAccount().getConnection()) + { + PreparedStatement statement = connection.prepareStatement(REWARD_ACCOUNT_CROWNS); + statement.setInt(1, accountId); + statement.setInt(2, crowns); + statement.executeUpdate(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(true)); + } + } + catch (SQLException e) + { + e.printStackTrace(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(false)); + } + } + }); + } + + public void consumeCrowns(final Callback callback, final int accountId, final int crowns) + { + Bukkit.getScheduler().runTaskAsynchronously(UtilServer.getPlugin(), () -> + { + try (Connection connection = DBPool.getAccount().getConnection()) + { + String baseStmt = "INSERT INTO accountCrowns (accountId, crownCount) VALUES (" + accountId + ", 0) ON DUPLICATE KEY UPDATE crownCount=crownCount;"; + PreparedStatement statement = connection.prepareStatement(baseStmt + CONSUME_ACCOUNT_CROWNS); + statement.setInt(1, crowns); + statement.setInt(2, accountId); + statement.setInt(3, crowns); + statement.execute(); + + statement.getMoreResults(); + + final TransactionResponse response = statement.getUpdateCount() > 0 ? TransactionResponse.Success : TransactionResponse.InsufficientFunds; + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(response)); + } + } + catch (SQLException e) + { + e.printStackTrace(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(TransactionResponse.Failed)); + } + } + }); + } + + public void setCrowns(final Callback callback, final int accountId, final int crowns) + { + if (crowns < 0) + { + throw new IllegalArgumentException("Crowns cannot be negative"); + } + + Bukkit.getScheduler().runTaskAsynchronously(UtilServer.getPlugin(), () -> + { + try (Connection connection = DBPool.getAccount().getConnection()) + { + PreparedStatement statement = connection.prepareStatement(SET_ACCOUNT_CROWNS); + statement.setInt(1, accountId); + statement.setInt(2, crowns); + statement.executeUpdate(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(true)); + } + } + catch (SQLException e) + { + e.printStackTrace(); + + if (callback != null) + { + Bukkit.getScheduler().runTask(UtilServer.getPlugin(), () -> callback.run(false)); + } + } + }); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/explosion/Explosion.java b/Plugins/Mineplex.Core/src/mineplex/core/explosion/Explosion.java index dedb8c37b..02601d751 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/explosion/Explosion.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/explosion/Explosion.java @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import java.util.UUID; +import java.util.concurrent.TimeUnit; import mineplex.core.MiniPlugin; import mineplex.core.blockrestore.BlockRestore; @@ -38,10 +39,11 @@ import org.bukkit.util.Vector; public class Explosion extends MiniPlugin { - private boolean _regenerateGround = false; + private boolean _regenerateGround; + private long _regenerateTime; private boolean _temporaryDebris = true; private boolean _enableDebris = false; - private boolean _tntSpread = true; + private boolean _tntSpread; private boolean _liquidDamage = true; private HashSet _explosionBlocks = new HashSet(); @@ -52,6 +54,8 @@ public class Explosion extends MiniPlugin super("Block Restore", plugin); _blockRestore = blockRestore; + + resetConfiguration(); } @EventHandler @@ -134,7 +138,7 @@ public class Explosion extends MiniPlugin else { int heightDiff = cur.getLocation().getBlockY() - event.getEntity().getLocation().getBlockY(); - _blockRestore.add(cur, 0, (byte) 0, (long) (20000 + (heightDiff * 3000) + Math.random() * 2900)); + _blockRestore.add(cur, 0, (byte) 0, (long) (_regenerateTime + (heightDiff * 3000) + Math.random() * 2900)); } } @@ -276,6 +280,11 @@ public class Explosion extends MiniPlugin _regenerateGround = regenerate; } + public void setRegenerateTime(long time) + { + _regenerateTime = time; + } + public void SetDebris(boolean value) { _enableDebris = value; @@ -296,6 +305,13 @@ public class Explosion extends MiniPlugin _temporaryDebris = value; } + public void resetConfiguration() + { + _regenerateGround = false; + _regenerateTime = TimeUnit.SECONDS.toMillis(20); + _tntSpread = true; + } + public HashSet GetExplosionBlocks() { return _explosionBlocks; @@ -326,7 +342,14 @@ public class Explosion extends MiniPlugin if (removeBlock) { - cur.setType(Material.AIR); + if (_regenerateGround) + { + _blockRestore.add(cur, 0, (byte) 0, (long) (_regenerateTime + (cur.getLocation().getBlockY() * 3000) + (Math.random() * 1500))); + } + else + { + cur.setType(Material.AIR); + } } } @@ -356,12 +379,16 @@ public class Explosion extends MiniPlugin _explosionBlocks.add(fall); } - } } }, 1); } - + + private void addToRegenerate(Block block) + { + + } + public void setEnabled(boolean var) { if (var) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index e35168a9b..e0d211e34 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -10,6 +10,7 @@ import java.util.Set; import java.util.UUID; import java.util.function.Predicate; +import mineplex.core.gadget.gadgets.morph.MorphBobRoss; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -454,6 +455,7 @@ public class GadgetManager extends MiniPlugin addGadget(new MorphLoveDoctor(this)); addGadget(new MorphGoldPot(this)); addGadget(new MorphAwkwardRabbit(this)); + addGadget(new MorphBobRoss(this, _hologramManager)); // Particles addGadget(new ParticleFoot(this)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java new file mode 100644 index 000000000..7217d82c6 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBobRoss.java @@ -0,0 +1,630 @@ +package mineplex.core.gadget.gadgets.morph; + +import java.time.Month; +import java.time.YearMonth; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; +import mineplex.core.hologram.Hologram; +import mineplex.core.hologram.HologramManager; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; + +import com.mojang.authlib.GameProfile; + +import mineplex.core.common.skin.SkinData; +import mineplex.core.disguise.disguises.DisguisePlayer; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.morph.managers.UtilMorph; +import mineplex.core.gadget.types.MorphGadget; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilGameProfile; + +/** + * Bob Ross morph for Power Play Club (June 2017) + */ +public class MorphBobRoss extends MorphGadget +{ + /** The inventory slot in which the paint brush is placed */ + private static final int PAINT_BRUSH_SLOT = 2; + + /** Max # of blocks that can be destroyed every quarter second, per player */ + private static final int DESTROY_LIMIT = 4; + + /** The # of seconds for which paint blocks exist */ + private static final int PAINT_SECONDS = 30; + + /** The # of minutes after which the code will stop trying to remove paint */ + private static final int PAINT_EXPIRE = 10; + + /** Height above a player's location at which quotes are to be displayed */ + private static final double QUOTE_HEIGHT = 2.25; + + /** The number of seconds for which quotes are displayed */ + private static final int QUOTE_PERSISTENCE = 10; + + /** Cooldown key for changing paint colors */ + private static final String COLOR_KEY = "Change Paint Color"; + + /** Cooldown time for changing paint colors (milliseconds) */ + private static final long COLOR_COOLDOWN = 220; + + /** Cooldown key for displaying a Bob Ross quote above head */ + private static final String QUOTE_KEY = "Bob Ross Quote"; + + /** Cooldown time for displaying a Bob Ross quote (milliseconds) */ + private static final long QUOTE_COOLDOWN = 10100; + + /** Distance (in blocks) from which the quotes can be seen */ + private static final int VIEW_DISTANCE = 14; + + /** Quote attribution for bob */ + private static final String ATTRIBUTION = C.cGray + "- " + C.cYellow + "Bob Ross"; + + /** Formatted name for the clean brush */ + private static final String BRUSH_NAME = C.cYellow + "Clean Paintbrush"; + + /** Determines the order in which colors are selected */ + private static final byte[] COLOR_ORDER = { + (byte) 1, + (byte) 14, + (byte) 11, + (byte) 10, + (byte) 2, + (byte) 6, + (byte) 12, + (byte) 4, + (byte) 5, + (byte) 13, + (byte) 9, + (byte) 15, + (byte) 7, + (byte) 8, + (byte) 0, + (byte) 3 + }; + + /** Paint colors for displaying in players' hotbars */ + private static final String[] PAINT_COLORS = { + C.cBlackB + "Midnight Black", + C.cRedB + "Alizarin Crimson", + C.cDGreenB + "Sap Green", + C.cGoldB + "Van Dyke Brown", + C.cDBlueB + "Prussian Blue", + C.cDPurpleB + "Studio Purple", + C.cDAquaB + "Phthalo Green", + C.cGrayB + "Dusty Gray", + C.cDGrayB + "Tundora Gray", + C.cPurpleB + "Soft Flower Pink", + C.cGreenB + "Lima Green", + C.cYellowB + "Cadmium Yellow", + C.cBlueB + "Danube Blue", + C.cPurpleB + "Soft Magenta", + C.cGoldB + "Yellow Ochre", + C.cWhiteB + "Titanium White" + }; + + /** Brush types for displaying in players' hotbars */ + private static final String[] PAINT_BRUSHES = { + "Landscape Brush", + "Foliage Brush", + "Background Brush", + "Blender Brush", + "Oval Brush", + "Round Brush", + "Fan Brush", + "Painting Knife" + }; + + /** List of wholesome Bob Ross quotes. */ + private static final String[][] QUOTES = { + {"We don't make mistakes,", "just happy little accidents."}, + {"Anything that you're willing to practice,", "you can do."}, + {"There's nothing wrong with having a tree as a friend."}, + {"Let's get a little crazy here!"}, + {"Express yourself to others through painting."}, + {"All you need to paint is a few tools,", "a little instruction,", "and a vision in your mind."}, + {"I can't think of anything more", "rewarding than being able to express", "yourself to others through painting."}, + {"The secret to doing anything is", "believing that you can do it."}, + {"Anything that you believe you can do strong enough,", "you can do."}, + {"Wash the brush, just beat the devil out of it!"}, + {"Beat the devil out of it!"}, + {"I started painting as a hobby when I was little."}, + {"Anybody can do what I do."}, + {"I believe talent is just a pursued interest."}, + {"Mix up a little more shadow color here,", "then we can put us a little shadow right in there."}, + {"You have unlimited power on this canvas!"}, + {"Believe that you can do it cause you can do it."}, + {"There's nothing in the world", "that breeds success like success."}, + {"Lets build a happy little cloud."}, + {"Lets build some happy little trees."}, + {"Everyday is a good day when you paint."}, + {"The only thing worse than", "yellow snow is green snow."}, + {"Look around.", "Look at what we have.", "Beauty is everywhere—", "you only have to look to see it."}, + {"Just go out and talk to a tree.", "Make friends with it."}, + {"How do you make a round circle with a square knife?", "That’s your challenge for the day."}, + {"Water's like me. It's laaazy...", "Boy, it always looks for the easiest way to do things"}, + {"Oooh, if you have never been to Alaska,", "go there while it is still wild."}, + {"If I paint something,", "I don't want to have to explain what it is."}, + {"We artists are a different breed of people.", "We're a happy bunch."}, + {"Any way you want it to be, that's just right."}, + {"As my son Steve says, just 'smoosh' it in there."}, + {"Use odorless paint-thinner.", "If it's not odorless, you'll find yourself", "working alone very, very quickly."}, + {"Let's just blend this little rascal here, ha!", "Happy as we can be."}, + {"Clouds are very, very free."}, + {"Maybe in our world there lives a", "happy little tree over there."}, + {"Shwooop! Hehe.", "You have to make those little noises,", "or it just doesn't work."}, + {"No pressure. Just relax and watch it happen."}, + {"Find freedom on this canvas."}, + {"It’s so important to do something every", "day that will make you happy."}, + {"Every day is a good day when you paint."}, + {"Hi, I'm Bob Ross!"}, + {"Everyone needs a friend."}, + {"Don’t forget to tell these special", "people in your life just how special", "they are to you."}, + {"I taught my son to paint mountains like these!"}, + {"You need the dark in order to show the light."}, + {"In nature, dead trees are just", "as normal as live trees."}, + {"This is happy place;", "little squirrels live here and play."}, + {"It’s life.", "It’s interesting.", "It’s fun."}, + {"I really believe that", "if you practice enough you could paint the", "'Mona Lisa' with a two-inch brush."}, + {"Don't be afraid to go out on a limb,", "because that's where the fruit is!"} + }; + + /** Map of items in players' inventories */ + private final Map _inventoryItems = new HashMap<>(); + + private final Map _paintColors = new HashMap<>(); + + /** Blocks that have been painted */ + private final List _paintBlocks = new ArrayList<>(); + + private final HologramManager _holograms; + + public MorphBobRoss(GadgetManager manager, HologramManager holograms) + { + super(manager, "Bob Ross Morph", UtilText.splitLinesToArray(new String[] { + C.cGray + "Become the creator of your own world!", + C.cGray + "Leave a trail of paint behind you as you walk.", + "", + C.cGreen + "Hold " + C.cWhite + "your " + C.cYellow + "paintbrush" + C.cWhite + " (stick) to paint.", + "", + C.cGreen + "Left" + C.cWhite + " and " + C.cGreen + "right click" + C.cWhite + " on your", + C.cYellow + "paintbrush" + C.cWhite + " and " + C.cYellow + "paints" + C.cWhite + " (dyes)", + C.cWhite + "to change paint colors.", + "", + C.cGreen + "Crouch " + C.cWhite + "to say a Bob Ross quote." + }, LineFormat.LORE), -14, Material.PAINTING, (byte) 0, YearMonth.of(2017, Month.JUNE)); + + _holograms = holograms; + } + + /** + * Sets the player's skin to Bob Ross, then gives the player a 'paintbrush' item. + */ + @Override + public void enableCustom(Player player, boolean message) + { + applyArmor(player, message); + + GameProfile profile = UtilGameProfile.getGameProfile(player); + profile.getProperties().clear(); + profile.getProperties().put("textures", SkinData.BOB_ROSS.getProperty()); + + DisguisePlayer disguisePlayer = new DisguisePlayer(player, profile); + disguisePlayer.showInTabList(true, 0); + UtilMorph.disguise(player, disguisePlayer, Manager); + + givePaintbrush(player); + } + + /** + * Restores the player's skin and takes their 'paintbrush' item away. + */ + @Override + public void disableCustom(Player player, boolean message) + { + removeArmor(player); + UtilMorph.undisguise(player, Manager.getDisguiseManager()); + + takePaintbrush(player); + } + + /** + * Detect when a player clicks their paint brush item. + */ + @EventHandler + public void handlePlayerInteract(PlayerInteractEvent event) + { + if (!isActive(event.getPlayer())) + { + return; + } + + if (!_inventoryItems.containsKey(event.getPlayer().getUniqueId())) + { + return; + } + + if (!_inventoryItems.get(event.getPlayer().getUniqueId()).equals(event.getPlayer().getItemInHand())) + { + return; + } + + if (UtilEvent.isAction(event, UtilEvent.ActionType.L)) + { + if (Recharge.Instance.use(event.getPlayer(), COLOR_KEY, COLOR_COOLDOWN, false, false)) + { + changePaintColor(event.getPlayer(), true); + } + } + else if (UtilEvent.isAction(event, UtilEvent.ActionType.R)) + { + if (Recharge.Instance.use(event.getPlayer(), COLOR_KEY, COLOR_COOLDOWN, false, false)) + { + changePaintColor(event.getPlayer(), false); + } + } + } + + /** + * Display a Bob Ross quote above players' heads when they sneak. + * Destroy old paint after a certain amount of time has elapsed. + */ + @EventHandler + public void updateEvent(UpdateEvent event) + { + if (event.getType() == UpdateType.FASTER) // do paint removal + { + int limit = 0; + int offset = 0; + + // destroy paint blocks that are too old + while (!_paintBlocks.isEmpty() + && offset < _paintBlocks.size() + && _paintBlocks.get(offset).time < System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(PAINT_SECONDS) + && limit < DESTROY_LIMIT * getActive().size()) + { + Block block = _paintBlocks.get(offset).block; + + if (block.getType() == Material.CARPET) + { + _paintBlocks.remove(offset); + block.setType(Material.AIR); + limit++; + } + else + { + // stop trying to remove paint after a certain amount of time + if (_paintBlocks.get(offset).time > System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(PAINT_EXPIRE)) + { + _paintBlocks.remove(offset); + } + else + { + offset++; + } + } + } + } + else if (event.getType() == UpdateType.TICK) // do quote displaying + { + for (Player player : getActive()) + { + if (player.isSneaking()) + { + if (Recharge.Instance.use(player, QUOTE_KEY, QUOTE_COOLDOWN, false, false)) + { + // select quote + String[] quote = QUOTES[ThreadLocalRandom.current().nextInt(0, QUOTES.length)]; + final Collection holograms = new ArrayList<>(); + + // add attribution + holograms.add(new Hologram(_holograms, player.getLocation().add(0, QUOTE_HEIGHT, 0), ATTRIBUTION)); + + // display the quote + double offset = 0.3; + for (int i = quote.length - 1; i >= 0; --i) + { + holograms.add(new Hologram(_holograms, player.getLocation().add(0, QUOTE_HEIGHT + offset, 0), + C.cWhite + quote[i])); + offset += 0.25; + } + + for (Hologram hologram : holograms) + { + hologram.setViewDistance(VIEW_DISTANCE); + hologram.setFollowEntity(player); + hologram.start(); + } + + // remove hologram a certain number of seconds later + Bukkit.getServer().getScheduler().runTaskLater(UtilServer.getPlugin(), () -> + holograms.forEach(Hologram::stop), QUOTE_PERSISTENCE * 20); + } + } + } + } + else if (event.getType() == UpdateType.FASTEST) + { + for (Player player : getActive()) + { + if (_inventoryItems.containsKey(player.getUniqueId())) + { + ItemStack item = _inventoryItems.get(player.getUniqueId()); + + if (item.getType() == Material.STICK && player.getItemInHand().equals(item)) + { + togglePainting(player); + } + else if (!player.getItemInHand().equals(item) && item.getType() != Material.STICK) + { + togglePainting(player); + } + } + } + } + } + + /** + * When a player moves, paint the ground below them if they have it enabled. + */ + @EventHandler + public void paintGround(PlayerMoveEvent event) + { + Player player = event.getPlayer(); + + if (!isActive(player)) + { + return; + } + + // check if the player has been issued a paintbrush + if (_inventoryItems.containsKey(player.getUniqueId())) + { + ItemStack item = _inventoryItems.get(player.getUniqueId()); + + if (item.getType() == Material.STICK) + { + return; // player is not painting, do nothing + } + + Block block = player.getLocation().getBlock(); + Block down = block.getRelative(BlockFace.DOWN); + + boolean carpet = block.getType() == Material.CARPET; + + // check that there is room to paint and that the block below is solid and not more paint. + if ((block.isEmpty() || carpet) && UtilBlock.fullSolid(down) && !UtilBlock.bottomSlab(down)) + { + int index; + PaintedBlock blk = new PaintedBlock(block); + + if (carpet) // if block is a carpet + { + // remove old paint if it was painted + if ((index = _paintBlocks.indexOf(blk)) != -1) + { + _paintBlocks.remove(index); + } + else // if it's non-paint carpet + { + return; // don't paint + } + } + + // mark block as painted + _paintBlocks.add(blk); + + // actually paint block + block.setType(Material.CARPET); + block.setData((byte) (15 - item.getData().getData())); + } + } + } + + /** + * Clean hash maps on player disconnect. + */ + @EventHandler + public void onPlayerDisconnect(PlayerQuitEvent event) + { + if (isActive(event.getPlayer())) + { + UUID uuid = event.getPlayer().getUniqueId(); + _inventoryItems.remove(uuid); + _paintColors.remove(uuid); + } + } + + /** + * Cycle the selected paint color for a player. + * + * @param reverse Whether to cycle backwards through colors. + */ + private void changePaintColor(Player player, boolean reverse) + { + ItemStack item = _inventoryItems.remove(player.getUniqueId()); + byte data = selectPaintColor(player, reverse); + + ItemStack newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, + PAINT_COLORS[data] + " " + PAINT_BRUSHES[ThreadLocalRandom.current().nextInt(0, PAINT_BRUSHES.length)]); + + _inventoryItems.put(player.getUniqueId(), newItem); + player.getInventory().remove(item); + player.getInventory().setItem(PAINT_BRUSH_SLOT, newItem); + player.updateInventory(); + } + + /** + * Toggle whether a player is currently painting or not. + */ + private void togglePainting(Player player) + { + ItemStack item = _inventoryItems.remove(player.getUniqueId()); + + ItemStack newItem; + if (item.getType() == Material.STICK) + { + byte data = selectPaintColor(player, false); + newItem = ItemStackFactory.Instance.CreateStack(Material.INK_SACK, data, 1, + PAINT_COLORS[data] + " " + PAINT_BRUSHES[ThreadLocalRandom.current().nextInt(0, PAINT_BRUSHES.length)]); + } + else + { + if (_paintColors.containsKey(player.getUniqueId())) + { + _paintColors.remove(player.getUniqueId()); + } + + newItem = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, BRUSH_NAME); + } + + _inventoryItems.put(player.getUniqueId(), newItem); + player.getInventory().remove(item); + player.getInventory().setItem(PAINT_BRUSH_SLOT, newItem); + player.updateInventory(); + } + + /** + * Changes the paint color currently assigned to a player. + * If one is not assigned, a new one will be given. + * + * @param player The player to whom to assign the paint color. + * @param reverse Whether to reverse through paint colors when choosing a new one. + * + * @return the dye data value for the newly selected color. + */ + private byte selectPaintColor(Player player, boolean reverse) + { + UUID uuid = player.getUniqueId(); + + int value; + + if (!_paintColors.containsKey(uuid)) + { + value = ThreadLocalRandom.current().nextInt(0, 16); + _paintColors.put(uuid, value); + } + else + { + value = _paintColors.get(uuid); + + if (reverse) + { + if (--value < 0) + { + value = 15; + } + } + else + { + if (++value > 15) + { + value = 0; + } + } + + _paintColors.put(uuid, value); + } + + return COLOR_ORDER[value]; + } + + /** + * Give a paintbrush item to a player. + */ + private void givePaintbrush(Player player) + { + if (!_inventoryItems.containsKey(player.getUniqueId())) + { + ItemStack item = ItemStackFactory.Instance.CreateStack(Material.STICK, (byte) 0, 1, BRUSH_NAME); + player.getInventory().setItem(PAINT_BRUSH_SLOT, item); + _inventoryItems.put(player.getUniqueId(), item); + player.updateInventory(); + } + } + + /** + * Take the paintbrush item from the player + */ + private void takePaintbrush(Player player) + { + // check that paintbrush has been issued + if (_inventoryItems.containsKey(player.getUniqueId())) + { + ItemStack item = _inventoryItems.remove(player.getUniqueId()); + + // if player has paintbrush, take it + if (player.getInventory().contains(item)) + { + player.getInventory().remove(item); + } + + player.updateInventory(); + } + } + + /** + * Data class holding information on blocks which have been painted + */ + private class PaintedBlock + { + /** The time at which the block was painted */ + long time; + + /** The block which was painted */ + Block block; + + /** + * Construct a PaintedBlock + * + * @param block The block which has been painted. + */ + public PaintedBlock(Block block) + { + this.block = block; + this.time = System.currentTimeMillis(); + } + + /** + * Overrides default equals behavior to have comparisons between + * multiple {@link PaintedBlock} objects match comparisons between + * their contained {@link PaintedBlock#block} fields. + */ + @Override + public boolean equals(Object o) + { + if (o instanceof PaintedBlock) + { + return block.equals(((PaintedBlock) o).block); + } + else + { + return super.equals(o); + } + } + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index cc5ba27d4..6f6f38241 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -14,6 +14,8 @@ public enum GameDisplay Barbarians("A Barbarians Life", Material.WOOD_AXE, (byte)0, GameCategory.EXTRA, 2, false), BossBattles("Boss Battles", Material.SKULL_ITEM, (byte) 0, GameCategory.EVENT, 55, false), Bridge("The Bridges", Material.IRON_PICKAXE, (byte)0, GameCategory.SURVIVAL, 3, true), + CastleAssault("Castle Assault", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 67, true), + CastleAssaultTDM("Castle Assault TDM", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 68, false), CastleSiege("Castle Siege", Material.DIAMOND_CHESTPLATE, (byte)0, GameCategory.CLASSICS, 4, true), ChampionsDominate("Champions Domination", "Champions", Material.BEACON, (byte)0, GameCategory.CHAMPIONS, 6, true), ChampionsTDM("Champions TDM", "Champions", Material.GOLD_SWORD, (byte)0, GameCategory.CHAMPIONS, 5, true), @@ -49,6 +51,7 @@ public enum GameDisplay Smash("Super Smash Mobs", Material.SKULL_ITEM, (byte)4, GameCategory.CLASSICS, 34, true), SmashDomination("Super Smash Mobs Domination", "Super Smash Mobs", Material.SKULL_ITEM, (byte)4, GameCategory.EXTRA, 36, false), SmashTeams("Super Smash Mobs Teams", "Super Smash Mobs", Material.SKULL_ITEM, (byte)4, GameCategory.TEAM_VARIANT, 35, false), + SmashTraining("Super Smash Mobs Training", "Super Smash Mobs", Material.SKULL_ITEM, (byte)4, GameCategory.EXTRA, 34, false), Snake("Snake", Material.WOOL, (byte)0, GameCategory.ARCADE, 37, true), SneakyAssassins("Sneaky Assassins", Material.INK_SACK, (byte)0, GameCategory.ARCADE, 38, true), SnowFight("Snow Fight", Material.SNOW_BALL, (byte)0, GameCategory.EXTRA, 39, false), @@ -99,6 +102,8 @@ public enum GameDisplay StrikeGames("Strike Games", Material.DIAMOND_LEGGINGS, (byte) 0, GameCategory.SURVIVAL, 66, false), + AlienInvasion("Alien Invasion", Material.ENDER_STONE, (byte) 0, GameCategory.EVENT, 69, false), + Event("Mineplex Event", Material.CAKE, (byte)0, GameCategory.EVENT, 999, false), Brawl("Brawl", Material.DIAMOND, (byte) 0, GameCategory.EVENT, 998, false); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java index f873ea35c..880190c79 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java @@ -24,20 +24,21 @@ import org.bukkit.util.Vector; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilPlayer; +/** + * Floating text object with interaction and entity follow capabilities. + */ public class Hologram { - public enum HologramTarget { - BLACKLIST, WHITELIST; - } - private Packet _destroy1_8; + /** * 1.7 packets uses both EntityIDs while 1.8 uses only the first. */ - private ArrayList _entityIds = new ArrayList(); + private ArrayList _entityIds = new ArrayList<>(); private Entity _followEntity; private HologramManager _hologramManager; private String[] _hologramText = new String[0]; + /** * Keeps track of the holograms movements. This fixes offset that * occasionally happens when moving a hologram around. @@ -49,7 +50,7 @@ public class Hologram { private Packet[] _packets1_8; private Packet[] _packets1_9; private HashSet _playersInList = new HashSet<>(); - private ArrayList _playersTracking = new ArrayList(); + private ArrayList _playersTracking = new ArrayList<>(); private boolean _removeEntityDeath; private HologramTarget _target = HologramTarget.BLACKLIST; private int _viewDistance = 70; @@ -60,15 +61,42 @@ public class Hologram { private long _maxLifetime = -1; private long _startTime; - public Hologram(HologramManager hologramManager, Location location, String... text) { - this(hologramManager, location, false, -1l, text); + /** + * Construct a standard hologram. + * + * @param hologramManager The hologram manager. + * @param location The location at which to display the hologram. + * @param text An array of text lines which the hologram should display. + */ + public Hologram(HologramManager hologramManager, Location location, String... text) + { + this(hologramManager, location, false, -1L, text); } - public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, String... text) { - this(hologramManager, location, hideBoundingBox, -1l, text); + /** + * Construct a hologram with a specified bounding box. + * + * @param hologramManager The hologram manager. + * @param location The location at which to display the hologram. + * @param hideBoundingBox Whether to hide the bounding box of the hologram. + * @param text An array of text lines which the hologram should display. + */ + public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, String... text) + { + this(hologramManager, location, hideBoundingBox, -1L, text); } - public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, long maxLifetime, String... text) { + /** + * Construct a hologram with a limited lifetime. + * + * @param hologramManager The hologram manager. + * @param location The location at which to display the hologram. + * @param hideBoundingBox Whether to hide the bounding box of the hologram. + * @param maxLifetime The max lifetime of the hologram, specified in milliseconds. + * @param text An array of text lines which the hologram should display. + */ + public Hologram(HologramManager hologramManager, Location location, boolean hideBoundingBox, long maxLifetime, String... text) + { _hologramManager = hologramManager; _location = location.clone(); _maxLifetime = maxLifetime; @@ -76,9 +104,16 @@ public class Hologram { setText(text); } - public Hologram setInteraction(HologramInteraction interact) { + /** + * Set the interaction handler for the hologram. + * + * @param interact The handler. + * + * @return the original hologram object. + */ + public Hologram setInteraction(HologramInteraction interact) + { _interaction = interact; - return this; } @@ -89,37 +124,50 @@ public class Hologram { /** * Adds the player to the Hologram to be effected by Whitelist or Blacklist */ - public Hologram addPlayer(Player player) { + public Hologram addPlayer(Player player) + { return addPlayer(player.getUniqueId()); } /** * Adds the player to the Hologram to be effected by Whitelist or Blacklist */ - public Hologram addPlayer(UUID player) { + public Hologram addPlayer(UUID player) + { _playersInList.add(player); return this; } /** - * Warning! Bounding box if hidden will hide holograms for 1.8 to 1.8.2 + * Hides the bounding box for the hologram.
+ * + * Warning! Bounding box if hidden will hide holograms for 1.8 to 1.8.2 * - * @return + * @return the original hologram object. */ - public Hologram setHideBoundingBox() { + public Hologram setHideBoundingBox() + { _hideBoundingBox = true; return this; } /** - * Is there a player entry in the hologram for Whitelist and Blacklist + * @return if there is a player entry in the holograms whitelist/blacklist. */ - public boolean containsPlayer(Player player) { + public boolean containsPlayer(Player player) + { return _playersInList.contains(player.getUniqueId()); } - protected Packet getDestroyPacket() { - if (_makeDestroyPackets) { + /** + * Generates a packet to destroy the hologram client-side. + * + * @return the packet. + */ + protected Packet getDestroyPacket() + { + if (_makeDestroyPackets) + { makeDestroyPacket(); _makeDestroyPackets = false; } @@ -127,32 +175,44 @@ public class Hologram { return _destroy1_8; } - public Entity getEntityFollowing() { + /** + * @return the entity that this hologram is currently following. + */ + public Entity getEntityFollowing() + { return _followEntity; } /** - * Get who can see the hologram - * - * @Whitelist = Only people added can see the hologram - * @Blacklist = Anyone but people added can see the hologram + * @return The functionality that is currently being used for the object's internal + * player list. + * {@link HologramTarget#WHITELIST} = Only people added can see the hologram + * {@link HologramTarget#BLACKLIST} = Anyone but people added can see the hologram */ - public HologramTarget getHologramTarget() { + public HologramTarget getHologramTarget() + { return _target; } /** - * Get the hologram location + * @return the current location of the hologram. */ - public Location getLocation() { + public Location getLocation() + { return _location.clone(); } - protected ArrayList getNearbyPlayers() { - ArrayList nearbyPlayers = new ArrayList(); + /** + * @return A list of players that can currently see the hologram. + */ + protected ArrayList getNearbyPlayers() + { + ArrayList nearbyPlayers = new ArrayList<>(); - for (Player player : getLocation().getWorld().getPlayers()) { - if (isVisible(player)) { + for (Player player : getLocation().getWorld().getPlayers()) + { + if (isVisible(player)) + { nearbyPlayers.add(player); } } @@ -160,26 +220,37 @@ public class Hologram { return nearbyPlayers; } - protected ArrayList getPlayersTracking() { + /** + * @return The list of players that are in the holograms whitelist or blacklist. + */ + protected ArrayList getPlayersTracking() + { return _playersTracking; } - protected void checkSpawnPackets() { - if (_makeSpawnPackets) { + /** + * Generates hologram spawn packets if they have not been created already. + */ + protected void checkSpawnPackets() + { + if (_makeSpawnPackets) + { makeSpawnPackets(); _makeSpawnPackets = false; } } /** - * Get the text in the hologram + * @return the current text being displayed by the hologram. */ - public String[] getText() { + public String[] getText() + { // We reverse it again as the hologram would otherwise display the text // from the bottom row to the top row String[] reversed = new String[_hologramText.length]; - for (int i = 0; i < reversed.length; i++) { + for (int i = 0; i < reversed.length; i++) + { reversed[i] = _hologramText[reversed.length - (i + 1)]; } @@ -187,27 +258,45 @@ public class Hologram { } /** - * Get the view distance the hologram is viewable from. Default is 70 + * @return the view distance the hologram is viewable from. Default is 70 */ - public int getViewDistance() { + public int getViewDistance() + { return _viewDistance; } /** - * Is the hologram holograming? + * @return Is the hologram holograming? */ - public boolean isInUse() { + public boolean isInUse() + { return _lastMovement != null; } - public boolean isRemoveOnEntityDeath() { + /** + * @return whether to delete the hologram when the entity it is following dies. + */ + public boolean isRemoveOnEntityDeath() + { return _removeEntityDeath; } - public boolean isVisible(Player player) { - if (getLocation().getWorld() == player.getWorld()) { - if ((getHologramTarget() == HologramTarget.WHITELIST) == containsPlayer(player)) { - if (getLocation().distance(player.getLocation()) < getViewDistance()) { + /** + * Determines whether the hologram is visible to a player based on view distance, whitelist / + * blacklist, and current world. + * + * @param player The player to check. + * + * @return whether the hologram is visible to the player. + */ + public boolean isVisible(Player player) + { + if (getLocation().getWorld() == player.getWorld()) + { + if ((getHologramTarget() == HologramTarget.WHITELIST) == containsPlayer(player)) + { + if (getLocation().distance(player.getLocation()) < getViewDistance()) + { return true; } } @@ -216,34 +305,49 @@ public class Hologram { return false; } - private void makeDestroyPacket() { + /** + * Generates a packet to destroy the hologram client-side. + */ + private void makeDestroyPacket() + { int[] entityIds1_8 = new int[_entityIds.size()]; - for (int i = 0; i < _entityIds.size(); i++) { + for (int i = 0; i < _entityIds.size(); i++) + { entityIds1_8[i] = _entityIds.get(i); } _destroy1_8 = new PacketPlayOutEntityDestroy(entityIds1_8); } - private void makeSpawnPackets() { + /** + * Generates spawn packets for the hologram. + */ + private void makeSpawnPackets() + { _packets1_8 = new Packet[_hologramText.length]; _packets1_9 = new Packet[_hologramText.length]; - if (_entityIds.size() < _hologramText.length) { + if (_entityIds.size() < _hologramText.length) + { _makeDestroyPackets = true; - for (int i = _entityIds.size(); i < _hologramText.length; i++) { + for (int i = _entityIds.size(); i < _hologramText.length; i++) + { _entityIds.add(Integer.valueOf(UtilEnt.getNewEntityId())); } - } else { + } + else + { _makeDestroyPackets = true; - while (_entityIds.size() > _hologramText.length) { + while (_entityIds.size() > _hologramText.length) + { _entityIds.remove(_hologramText.length); } } - for (int textRow = 0; textRow < _hologramText.length; textRow++) { + for (int textRow = 0; textRow < _hologramText.length; textRow++) + { PacketPlayOutSpawnEntityLiving packet1_8 = makeSpawnPacket1_8(textRow, _entityIds.get(textRow), _hologramText[textRow]); PacketPlayOutSpawnEntityLiving packet1_9 = makeSpawnPacket1_9(textRow, _entityIds.get(textRow), _hologramText[textRow]); @@ -253,7 +357,7 @@ public class Hologram { } /** - * Used for sending 1.9 clients holograms with no bounding boxes + * Used for sending 1.9 clients holograms with no bounding boxes. */ private PacketPlayOutSpawnEntityLiving makeSpawnPacket1_9(int textRow, int entityId, String lineOfText) { @@ -269,7 +373,11 @@ public class Hologram { return packet; } - private PacketPlayOutSpawnEntityLiving makeSpawnPacket1_8(int textRow, int entityId, String lineOfText) { + /** + * Used for sending 1.8 clients holograms. + */ + private PacketPlayOutSpawnEntityLiving makeSpawnPacket1_8(int textRow, int entityId, String lineOfText) + { PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving(); DataWatcher watcher = new DataWatcher(null); @@ -290,86 +398,122 @@ public class Hologram { } /** - * Removes the player from the Hologram so they are no longer effected by - * Whitelist or Blacklist + * Removes a player from the Hologram so they are no longer effected by + * whitelist or blacklist. + * + * @param player The player to remove. + * + * @return the original hologram object. */ - public Hologram removePlayer(Player player) { + public Hologram removePlayer(Player player) + { return removePlayer(player.getUniqueId()); } /** * Removes the player from the Hologram so they are no longer effected by - * Whitelist or Blacklist + * whitelist or blacklist + * + * @param player The player to remove. + * + * @return the original hologram object. */ - public Hologram removePlayer(UUID player) { + public Hologram removePlayer(UUID player) + { _playersInList.remove(player); return this; } /** - * If the entity moves, the hologram will update its position to appear - * relative to the movement. - * - * @Please note the hologram updates every tick. + * Sets an entity to which the hologram will remain relative to in position. + * + * @param entityToFollow the entity which to follow. + * + * @return the original hologram object. */ - public Hologram setFollowEntity(Entity entityToFollow) { + public Hologram setFollowEntity(Entity entityToFollow) + { _followEntity = entityToFollow; - relativeToEntity = entityToFollow == null ? null - : _location.clone().subtract(entityToFollow.getLocation()).toVector(); + + if (entityToFollow != null) + { + relativeToEntity = _location.clone().subtract(entityToFollow.getLocation()).toVector(); + } return this; } /** - * Set who can see the hologram - * - * @Whitelist = Only people added can see the hologram - * @Blacklist = Anyone but people added can see the hologram + * Set how the hologram's internal player list is used. + * + * @param newTarget The target which defines how the list is used. + * {@link HologramTarget#WHITELIST} = Only people added can see the hologram + * {@link HologramTarget#BLACKLIST} = Anyone but people added can see the hologram + * + * @retuen the original hologram object. */ - public Hologram setHologramTarget(HologramTarget newTarget) { + public Hologram setHologramTarget(HologramTarget newTarget) + { _target = newTarget; return this; } /** - * Sets the hologram to appear at this location + * Change the location of the hologram. + * + * @param newLocation the location to which to teleport the hologram. + * + * @return the original hologram object. */ - public Hologram setLocation(Location newLocation) { + public Hologram setLocation(Location newLocation) + { _makeSpawnPackets = true; Location oldLocation = getLocation(); _location = newLocation.clone(); - if (getEntityFollowing() != null) { + if (getEntityFollowing() != null) + { relativeToEntity = _location.clone().subtract(getEntityFollowing().getLocation()).toVector(); } - if (isInUse()) { + + if (isInUse()) + { ArrayList canSee = getNearbyPlayers(); Iterator itel = _playersTracking.iterator(); - while (itel.hasNext()) { + while (itel.hasNext()) + { Player player = itel.next(); - if (!canSee.contains(player)) { + if (!canSee.contains(player)) + { itel.remove(); - if (player.getWorld() == getLocation().getWorld()) { + if (player.getWorld() == getLocation().getWorld()) + { UtilPlayer.sendPacket(player, getDestroyPacket()); } } } + itel = canSee.iterator(); checkSpawnPackets(); - while (itel.hasNext()) { + + while (itel.hasNext()) + { Player player = itel.next(); - if (!_playersTracking.contains(player)) { + if (!_playersTracking.contains(player)) + { _playersTracking.add(player); itel.remove(); UtilPlayer.sendPacket(player, UtilPlayer.is1_9(player) ? _packets1_9 : _packets1_8); } } - if (!canSee.isEmpty()) { + + if (!canSee.isEmpty()) + { _lastMovement.add(new Vector(newLocation.getX() - oldLocation.getX(), newLocation.getY() - oldLocation.getY(), newLocation.getZ() - oldLocation.getZ())); @@ -378,12 +522,38 @@ public class Hologram { int z = (int) Math.floor(32 * _lastMovement.getZ()); Packet[] packets1_8 = new Packet[_hologramText.length]; + Packet[] packets1_9 = new Packet[_hologramText.length]; int i = 0; - if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127) { + // Generate packets for 1.9 clients + x = (int) Math.floor(32 * newLocation.getX()); + z = (int) Math.floor(32 * newLocation.getZ()); + + _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); + + for (Integer entityId : _entityIds) + { + PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); + teleportPacket.a = entityId; + teleportPacket.b = x; + teleportPacket.c = (int) Math.floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); + teleportPacket.d = z; + + packets1_9[i] = teleportPacket; + + i++; + } + + i = 0; + + // Generate move packets for 1.8 clients if the move is small enough. + if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127) + { _lastMovement.subtract(new Vector(x / 32D, y / 32D, z / 32D)); - for (Integer entityId : _entityIds) { + + for (Integer entityId : _entityIds) + { PacketPlayOutEntity.PacketPlayOutRelEntityMove relMove = new PacketPlayOutEntity.PacketPlayOutRelEntityMove(); relMove.a = entityId; @@ -394,80 +564,109 @@ public class Hologram { packets1_8[i] = relMove; i++; } - } else { - x = (int) Math.floor(32 * newLocation.getX()); - z = (int) Math.floor(32 * newLocation.getZ()); - - _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); - - for (Integer entityId : _entityIds) { - PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); - teleportPacket.a = entityId; - teleportPacket.b = x; - teleportPacket.c = (int) Math.floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); - teleportPacket.d = z; - - packets1_8[i] = teleportPacket; - - i++; - } + } + else // Use teleport packets + { + packets1_8 = packets1_9; } - for (Player player : canSee) { - for (Packet packet : packets1_8) { - UtilPlayer.sendPacket(player, packet); + for (Player player : canSee) + { + if (UtilPlayer.is1_9(player)) + { + for (Packet packet : packets1_9) + { + UtilPlayer.sendPacket(player, packet); + } + } + else + { + for (Packet packet : packets1_8) + { + UtilPlayer.sendPacket(player, packet); + } } } } } + return this; } + /** + * @return the time at which the hologram was last started. + */ public long getStartTime() { return _startTime; } + /** + * @return the max time after the hologram was started for which it will live. + */ public long getMaxLifetime() { return _maxLifetime; } - public Hologram setRemoveOnEntityDeath() { + /** + * Set the hologram to stop when the entity it is following dies. + * + * @return the original hologram object. + */ + public Hologram setRemoveOnEntityDeath() + { _removeEntityDeath = true; return this; } - public boolean isEntityId(int entityId) { + /** + * @param entityId an entity id. + * + * @return whether the entity ID is represented by this hologram object. + */ + public boolean isEntityId(int entityId) + { return _entityIds.contains(entityId); } /** * Set the hologram text + * + * @param newLines array of text lines for the hologram to display. + * + * @return the original hologram object. */ - public Hologram setText(String... newLines) { + public Hologram setText(String... newLines) + { String[] newText = new String[newLines.length]; - for (int i = 0; i < newText.length; i++) { + for (int i = 0; i < newText.length; i++) + { newText[i] = newLines[newText.length - (i + 1)]; } if (newText.equals(_hologramText)) + { return this; + } - if (isInUse()) { + if (isInUse()) + { int[] destroy1_8 = new int[0]; - ArrayList packets1_8 = new ArrayList(); + ArrayList packets1_8 = new ArrayList<>(); ArrayList packets1_9 = new ArrayList<>(); - if (_hologramText.length != newText.length) { + if (_hologramText.length != newText.length) + { _makeDestroyPackets = true; } - for (int i = 0; i < Math.max(_hologramText.length, newText.length); i++) { - // If more lines than previously - if (i >= _hologramText.length) { + for (int i = 0; i < Math.max(_hologramText.length, newText.length); i++) + { + if (i >= _hologramText.length) // If more lines than previously + { // Add entity id and send spawn packets // You add a entity id because the new hologram needs int entityId = UtilEnt.getNewEntityId(); @@ -476,14 +675,16 @@ public class Hologram { packets1_8.add(makeSpawnPacket1_8(i, entityId, newText[i])); packets1_9.add(makeSpawnPacket1_9(i, entityId, newText[i])); } - // If less lines than previously - else if (i >= newText.length) { + else if (i >= newText.length) // If less lines than previously + { // Remove entity id and send destroy packets Integer entityId = _entityIds.remove(newText.length); destroy1_8 = Arrays.copyOf(destroy1_8, destroy1_8.length + 1); destroy1_8[destroy1_8.length - 1] = entityId; - } else if (!newText[i].equals(_hologramText[i])) { + } + else if (!newText[i].equals(_hologramText[i])) + { // Send update metadata packets Integer entityId = _entityIds.get(i); @@ -495,10 +696,12 @@ public class Hologram { watcher1_8.a(2, newText[i], EntityArmorStand.META_CUSTOMNAME, newText[i]); watcher1_8.a(3, (byte) 1, EntityArmorStand.META_CUSTOMNAME_VISIBLE, true); } + { watcher1_9.a(0, (byte) 32, EntityArmorStand.META_ENTITYDATA, (byte) 32); watcher1_9.a(2, newText[i], EntityArmorStand.META_CUSTOMNAME, newText[i]); watcher1_9.a(3, (byte) 1, EntityArmorStand.META_CUSTOMNAME_VISIBLE, true); + if (_hideBoundingBox) { watcher1_9.a(10, (byte) 16, EntityArmorStand.META_ARMOR_OPTION, (byte) 16); @@ -510,13 +713,16 @@ public class Hologram { } } - if (destroy1_8.length > 0) { + if (destroy1_8.length > 0) + { packets1_8.add(new PacketPlayOutEntityDestroy(destroy1_8)); packets1_9.add(new PacketPlayOutEntityDestroy(destroy1_8)); } - for (Player player : _playersTracking) { + for (Player player : _playersTracking) + { List packets = UtilPlayer.is1_9(player) ? packets1_9 : packets1_8; + for (Packet packet : packets) { UtilPlayer.sendPacket(player, packet); @@ -532,18 +738,26 @@ public class Hologram { /** * Set the distance the hologram is viewable from. Default is 70 + * + * @param newDistance The distance in blocks. + * + * @return the original hologram object. */ - public Hologram setViewDistance(int newDistance) { + public Hologram setViewDistance(int newDistance) + { _viewDistance = newDistance; return setLocation(getLocation()); } /** - * Start the hologram + * Start the hologram, displaying it to players. + * + * @return the original hologram object. */ - public Hologram start() { - if (!isInUse()) { - + public Hologram start() + { + if (!isInUse()) + { _startTime = System.currentTimeMillis(); _hologramManager.addHologram(this); @@ -553,9 +767,13 @@ public class Hologram { _lastMovement = new Vector(); } + return this; } + /** + * Sends hologram spawn packets to players. + */ private void sendPackets() { checkSpawnPackets(); @@ -566,6 +784,13 @@ public class Hologram { } } + /** + * Generates spawn packets based on minecraft version. + * + * @param player The player for which to generate the packets. + * + * @return the list of packets generated. + */ public Packet[] getSpawnPackets(Player player) { checkSpawnPackets(); @@ -574,13 +799,19 @@ public class Hologram { } /** - * Stop the hologram + * Stop the hologram, effectively destroying it once + * garbage collection has occurred. + * + * @return the original hologram object. */ - public Hologram stop() { - if (isInUse()) { + public Hologram stop() + { + if (isInUse()) + { _hologramManager.removeHologram(this); - for (Player player : _playersTracking) { + for (Player player : _playersTracking) + { UtilPlayer.sendPacket(player, getDestroyPacket()); } @@ -591,4 +822,11 @@ public class Hologram { return this; } + /** + * Enum defining to whom the hologram is displayed. + */ + public enum HologramTarget + { + BLACKLIST, WHITELIST + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java index 618c30f44..88f6547cd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java @@ -4,6 +4,17 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.util.Vector; + +import mineplex.core.MiniPlugin; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.packethandler.IPacketHandler; @@ -14,24 +25,13 @@ import mineplex.core.updater.event.UpdateEvent; import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity; import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity.EnumEntityUseAction; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.util.Vector; - -public class HologramManager implements Listener, IPacketHandler +public class HologramManager extends MiniPlugin implements IPacketHandler { private ArrayList _activeHolograms = new ArrayList(); - public HologramManager(JavaPlugin arcadeManager, PacketHandler packetHandler) + public HologramManager(JavaPlugin plugin, PacketHandler packetHandler) { - Bukkit.getPluginManager().registerEvents(this, arcadeManager); + super("Hologram Manager", plugin); packetHandler.addPacketHandler(this, true, PacketPlayInUseEntity.class); } @@ -81,6 +81,7 @@ public class HologramManager implements Listener, IPacketHandler hologram.stop(); continue; } + if (!hologram.relativeToEntity.equals(following.getLocation().subtract(hologram.getLocation()).toVector())) { // And we do this so in the rare offchance it changes by a decimal. It doesn't start turning wonky. diff --git a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/EnchantedBookBuilder.java b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/EnchantedBookBuilder.java new file mode 100644 index 000000000..f4228e06d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/EnchantedBookBuilder.java @@ -0,0 +1,63 @@ +package mineplex.core.itemstack; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta;; + +public class EnchantedBookBuilder +{ + private Map _enchantments; + private int _amount; + + public EnchantedBookBuilder(int amount) + { + _enchantments = new HashMap<>(); + _amount = amount; + } + + public Map getEnchantments() + { + return _enchantments; + } + + public Integer getLevel(Enchantment enchantment) + { + return _enchantments.getOrDefault(enchantment, 0); + } + + public EnchantedBookBuilder setLevel(Enchantment enchantment, Integer level) + { + if (level <= 0) + { + _enchantments.remove(enchantment); + } + else + { + _enchantments.put(enchantment, level); + } + + return this; + } + + public EnchantedBookBuilder removeEnchantment(Enchantment enchantment) + { + _enchantments.remove(enchantment); + + return this; + } + + public ItemStack build() + { + ItemStack item = new ItemStack(Material.ENCHANTED_BOOK, _amount); + EnchantmentStorageMeta meta = (EnchantmentStorageMeta) item.getItemMeta(); + + _enchantments.entrySet().forEach(entry -> meta.addStoredEnchant(entry.getKey(), entry.getValue(), true)); + item.setItemMeta(meta); + + return item; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java index 14af0f28d..603f5e150 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java @@ -8,8 +8,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; -import mineplex.core.common.util.UtilInput; -import mineplex.core.common.util.UtilInv; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; @@ -26,6 +24,7 @@ import org.bukkit.inventory.meta.LeatherArmorMeta; import org.bukkit.inventory.meta.SkullMeta; import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilInv; public class ItemBuilder { @@ -311,6 +310,18 @@ public class ItemBuilder // newBuilder.potion = potion; newBuilder.setDurability(_durability); + newBuilder.setData(_data); + + newBuilder.setAmount(_amount); + + newBuilder.setUnbreakable(_unbreakable); + + newBuilder.setGlow(_glow); + + newBuilder.setItemFlags(_itemFlags); + + newBuilder.setPlayerHead(_playerHeadName); + return newBuilder; } @@ -389,9 +400,14 @@ public class ItemBuilder public ItemBuilder setTitle(String title) { - _title = (title == null ? null - : (title.length() > 2 && ChatColor.getLastColors(title.substring(0, 2)).length() == 0 ? ChatColor.WHITE : "")) - + title; + if (title == null) + { + _title = null; + } + else + { + _title = ((title.length() > 2 && ChatColor.getLastColors(title.substring(0, 2)).length() == 0) ? ChatColor.WHITE : "") + title; + } return this; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java new file mode 100644 index 000000000..c90639b66 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/Leaderboard.java @@ -0,0 +1,100 @@ +package mineplex.core.leaderboard; + +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Map.Entry; + +import org.bukkit.Location; + +import mineplex.core.Managers; +import mineplex.core.common.Pair; +import mineplex.core.common.util.C; +import mineplex.core.hologram.Hologram; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; + +public class Leaderboard +{ + private String _display; + private Pair _statDisplay; + private String[] _statNames; + private int[] _statIds; + private int _size, _start; + private LeaderboardSQLType _type; + private Location _loc; + private Hologram _holo; + + public Leaderboard(String display, Pair statDisplayNames, String[] statNames, LeaderboardSQLType type, Location displayLoc, int size) + { + this(display, statDisplayNames, statNames, type, displayLoc, size, 0); + } + + public Leaderboard(String display, Pair statDisplayNames, String[] statNames, LeaderboardSQLType type, Location displayLoc, int size, int start) + { + _display = display; + _statDisplay = statDisplayNames; + _statNames = statNames; + _statIds = new int[_statNames.length]; + _type = type; + _size = size; + _loc = displayLoc; + + update(new LinkedHashMap<>()); + } + + public int getSize() + { + return _size; + } + + public int getStart() + { + return _start; + } + + public String[] getStatNames() + { + return _statNames; + } + + public int[] getStatIds() + { + return _statIds; + } + + public LeaderboardSQLType getType() + { + return _type; + } + + public void update(Map names) + { + deconstruct(); + LinkedList display = new LinkedList<>(); + display.add(C.cAqua + _display); + display.add(C.cRed + " "); + int place = _start + 1; + for (Entry entry : names.entrySet()) + { + if (entry.getValue() == 1) + { + display.add(C.cGreen + "#" + place + " " + entry.getKey() + C.cRed + " " + entry.getValue() + " " + _statDisplay.getLeft()); + } + else + { + display.add(C.cGreen + "#" + place + " " + entry.getKey() + C.cRed + " " + entry.getValue() + " " + _statDisplay.getRight()); + } + place++; + } + _holo = new Hologram(Managers.get(LeaderboardManager.class).getHologramManager(), _loc, display.toArray(new String[display.size()])).start(); + } + + public void deconstruct() + { + if (_holo != null) + { + _holo.stop(); + _holo = null; + } + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java index 1ca8b9bc6..88a84c29d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java @@ -1,91 +1,136 @@ package mineplex.core.leaderboard; -import mineplex.core.MiniPlugin; -import mineplex.core.account.CoreClient; -import mineplex.core.account.CoreClientManager; -import mineplex.core.spawn.command.SpawnCommand; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -/** - * Manages dynamic Leaderboard statistics. - * - * Used for recording stat events, retrieving customized leaderboards, etc. - * @author MrTwiggy - * - */ +import mineplex.core.Managers; +import mineplex.core.MiniPlugin; +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilMath; +import mineplex.core.hologram.HologramManager; +import mineplex.core.stats.StatsManager; + public class LeaderboardManager extends MiniPlugin { + private final Map _leaderboards = new HashMap<>(); + private final long REFRESH_RATE; + private final LeaderboardRepository _repo; + private final Map _loading = new HashMap<>(); - private static LeaderboardManager _instance; // Singleton instance of Leaderboard Manager - private StatEventsRepository _statEvents; // 'statEvents' table repository. - private CoreClientManager _clientManager; - private String _serverGroup; - - /** - * Private class constructor to prevent non-singleton instances. - */ - public LeaderboardManager(JavaPlugin plugin, CoreClientManager clientManager) + public LeaderboardManager(JavaPlugin plugin) { super("Leaderboard Manager", plugin); - _instance = this; - _clientManager = clientManager; - _statEvents = new StatEventsRepository(plugin); - _serverGroup = _plugin.getConfig().getString("serverstatus.group"); - } - - /** - * Attempt to trigger a stat event. - * @param player - the player responsible for the statistic - * @param stat - the display name of the statistic to be added - * @param value - the counter value used to increment the statistic - * @return true, if a stat event was successfully triggered and logged, false otherwise. - */ - public boolean attemptStatEvent(Player player, String stat, int gamemode, int value) - { - StatType type = StatType.getType(stat); + _repo = new LeaderboardRepository(plugin); - return (type == null) ? false : onStatEvent(player, type, gamemode, value); - } - - /** - * Trigger a stat event to be recorded. - * @param player - the player responsible for the statistic - * @param type - the unique type id designating the statistic being recorded - * @param gamemode - the unique gamemode id associated with the stat event - * @param value - the counter value used to increment the statistic - * @return true, if the stat event was successfully triggered and logged, false otherwise. - */ - public boolean onStatEvent(final Player player, final StatType type, final int gamemode, final int value) - { - /* - // Asynchronously make DB call to insert stat event. - Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), new Runnable() + addCommand(new CommandBase(this, Rank.DEVELOPER, "cycleleaderboard") { - public void run() + @Override + public void Execute(Player caller, String[] args) { - _statEvents.insertStatEvent(player.getName(), gamemode, _serverGroup, type.getTypeId(), value); + caller.sendMessage(F.main(getName(), "Cycling leaderboards!")); + refreshBoards(); } }); - */ - return true; + REFRESH_RATE = 5 * 60 * 20 + ((UtilMath.r(5) + 1) * 60 * 20); + + runSyncTimer(() -> refreshBoards(), 0, REFRESH_RATE); + + runSyncTimer(() -> + { + Iterator> iterator = _loading.entrySet().iterator(); + while (iterator.hasNext()) + { + Entry entry = iterator.next(); + boolean registered = true; + for (int id : entry.getKey().getStatIds()) + { + if (id == 0) + { + registered = false; + } + } + if (registered) + { + entry.getValue().run(); + iterator.remove(); + } + } + }, 0, 20 * 2); } - @Override - public void addCommands() + private void refreshBoards() { - addCommand(new SetTournamentCommand(this)); + List leaderboards = new ArrayList<>(); + leaderboards.addAll(_leaderboards.values()); + _repo.loadLeaderboards(_leaderboards.values(), boards -> + { + for (int i = 0; i < boards.length && i < leaderboards.size(); i++) + { + leaderboards.get(i).update(boards[i]); + } + }); } - /** - * @return the singleton instance for {@link LeaderboardManager}. - */ - public static LeaderboardManager getInstance() + public HologramManager getHologramManager() { - return _instance; + return Managers.get(HologramManager.class); } -} + + public Leaderboard getLeaderboard(String identifier) + { + return _leaderboards.get(identifier); + } + + public void handleStatIncrease(Map> stats) + { + _repo.insertStats(stats); + } + + public void handleStatIncrease(int accountId, Map stats) + { + _repo.insertStats(accountId, stats); + } + + public void registerLeaderboard(String identifier, Leaderboard board) + { + if (_leaderboards.containsKey(identifier)) + { + board.deconstruct(); + return; + } + final Runnable postLoad = () -> + { + _leaderboards.put(identifier, board); + _repo.loadLeaderboard(board, board::update); + }; + _loading.put(board, postLoad); + for (int i = 0; i < board.getStatNames().length; i++) + { + final int index = i; + Managers.get(StatsManager.class).loadStatId(board.getStatNames()[index], id -> + { + board.getStatIds()[index] = id.intValue(); + }); + } + } + + public void unregisterLeaderboard(String boardIdentifier) + { + if (!_leaderboards.containsKey(boardIdentifier)) + { + return; + } + _leaderboards.remove(boardIdentifier).deconstruct(); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java new file mode 100644 index 000000000..f9b286039 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardRepository.java @@ -0,0 +1,251 @@ +package mineplex.core.leaderboard; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Consumer; + +import org.bukkit.plugin.java.JavaPlugin; + +import mineplex.core.common.util.UtilServer; +import mineplex.serverdata.database.DBPool; +import mineplex.serverdata.database.RepositoryBase; + +public class LeaderboardRepository extends RepositoryBase +{ + private static final String CREATE_TOTAL = "CREATE TABLE accountStatsAllTime (accountId INT NOT NULL, statId INT NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_SEASONAL = "CREATE TABLE accountStatsSeasonal (accountId INT NOT NULL, statId INT NOT NULL, seasonId SMALLINT NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX seasonIndex (seasonId), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id), FOREIGN KEY (seasonId) REFERENCES statSeasons(id));"; + private static final String CREATE_YEARLY = "CREATE TABLE accountStatsYearly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_MONTHLY = "CREATE TABLE accountStatsMonthly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_WEEKLY = "CREATE TABLE accountStatsWeekly (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_DAILY = "CREATE TABLE accountStatsDaily (accountId INT NOT NULL, statId INT NOT NULL, date DATE NOT NULL, value BIGINT NOT NULL, PRIMARY KEY (accountId, statId), INDEX valueIndex (value DESC), INDEX dateIndex (date), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (statId) REFERENCES stats(id));"; + private static final String CREATE_SEASON = "CREATE TABLE statSeasons (id SMALLINT NOT NULL, seasonName VARCHAR(50) NOT NULL, startDate TIMESTAMP NOT NULL DEFAULT '1969-12-31 18:00:01', endDate TIMESTAMP NOT NULL DEFAULT '1969-12-31 18:00:01', PRIMARY KEY (id), UNIQUE INDEX seasonIndex (seasonName), INDEX startIndex (startDate), INDEX endIndex (endDate));"; + + private static final String INSERT_STAT = "INSERT INTO accountStatsAllTime (accountId, statId, value) VALUES (?, ?, ?);"; + private static final String UPDATE_STAT = "UPDATE accountStatsAllTime SET value=value + ? WHERE accountId=? AND statId=?;"; + + private static final String FETCH_STAT_ALL = "SELECT a.name, sl.value FROM accountStatsAllTime AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + + private static final String FETCH_STAT_YEARLY = "SELECT a.name, sl.value FROM accountStatsYearly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_MONTHLY = "SELECT a.name, sl.value FROM accountStatsMonthly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE MONTH(sl.date) = MONTH(CURDATE()) AND YEAR(sl.date) = YEAR(CURDATE()) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_WEEKLY = "SELECT a.name, sl.value FROM accountStatsWeekly AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE YEARWEEK(sl.date, 1) = YEARWEEK(CURDATE(), 1) AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + private static final String FETCH_STAT_DAILY = "SELECT a.name, sl.value FROM accountStatsDaily AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.date = CURDATE() AND sl.statId=%STAT% ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + + private static final String FETCH_STAT_ALL_SEASON = "SELECT a.name, sl.value FROM accountStatsSeasonal AS sl INNER JOIN accounts AS a ON a.id=sl.accountId WHERE sl.statId=%STAT% AND seasonId=(SELECT id FROM statSeasons WHERE now() BETWEEN startDate AND endDate LIMIT 1) ORDER BY sl.value DESC LIMIT %START%,%LIMIT%;"; + + public LeaderboardRepository(JavaPlugin plugin) + { + super(DBPool.getAccount()); + } + + public void insertStats(Map> stats) + { + UtilServer.runAsync(() -> + { + try ( + Connection c = getConnection(); + PreparedStatement updateStat = c.prepareStatement(UPDATE_STAT); + PreparedStatement insertStat = c.prepareStatement(INSERT_STAT); + ) + { + for (Integer accountId : stats.keySet()) + { + for (Integer statId : stats.get(accountId).keySet()) + { + updateStat.setLong(1, stats.get(accountId).get(statId)); + updateStat.setInt(2, accountId); + updateStat.setInt(3, statId); + updateStat.addBatch(); + } + } + int[] rowsAffected = updateStat.executeBatch(); + int i = 0; + for (Integer accountId : stats.keySet()) + { + for (Integer statId : stats.get(accountId).keySet()) + { + if (rowsAffected[i] < 1) + { + insertStat.setInt(1, accountId); + insertStat.setInt(2, statId); + insertStat.setLong(3, stats.get(accountId).get(statId)); + insertStat.addBatch(); + } + i++; + } + } + insertStat.executeBatch(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + }); + } + + public void insertStats(int accountId, Map stats) + { + try ( + Connection c = getConnection(); + PreparedStatement updateStat = c.prepareStatement(UPDATE_STAT); + PreparedStatement insertStat = c.prepareStatement(INSERT_STAT); + ) + { + for (Integer statId : stats.keySet()) + { + updateStat.setLong(1, stats.get(statId)); + updateStat.setInt(2, accountId); + updateStat.setInt(3, statId); + updateStat.addBatch(); + } + int[] rowsAffected = updateStat.executeBatch(); + int i = 0; + for (Integer statId : stats.keySet()) + { + if (rowsAffected[i] < 1) + { + insertStat.setInt(1, accountId); + insertStat.setInt(2, statId); + insertStat.setLong(3, stats.get(statId)); + insertStat.addBatch(); + } + i++; + } + insertStat.executeBatch(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + + public void loadLeaderboard(Leaderboard board, Consumer> leaderboard) + { + Map names = new LinkedHashMap<>(); + try ( + Connection c = getConnection(); + Statement s = c.createStatement(); + ) + { + s.execute(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); + for (int i = 0; i < board.getStatIds().length; i++) + { + try (ResultSet rs = s.getResultSet()) + { + while (rs.next()) + { + names.merge(rs.getString("name"), rs.getInt("value"), Integer::sum); + } + + if (!s.getMoreResults()) + { + break; + } + } + } + } + catch (SQLException ex) + { + ex.printStackTrace(); + } + finally + { + UtilServer.runSync(() -> leaderboard.accept(names)); + } + } + + @SuppressWarnings("unchecked") + public void loadLeaderboards(Collection boards, Consumer[]> leaderboard) + { + UtilServer.runAsync(() -> + { + Map[] leaderboards = new Map[boards.size()]; + StringBuilder queryBuilder = new StringBuilder(); + { + int i = 0; + for (Leaderboard board : boards) + { + queryBuilder.append(board.getType().getStatement(board.getStatIds(), board.getStart(), board.getSize())); + leaderboards[i] = new LinkedHashMap<>(); + i++; + } + } + + if (queryBuilder.length() > 0) + { + try ( + Connection c = getConnection(); + Statement s = c.createStatement(); + ) + { + s.execute(queryBuilder.toString()); + int index = 0; + mainBoardLoop: for (Leaderboard board : boards) + { + for (int i = 0; i < board.getStatIds().length; i++) + { + try (ResultSet rs = s.getResultSet()) + { + while (rs.next()) + { + leaderboards[index].merge(rs.getString("name"), rs.getInt("value"), Integer::sum); + } + + if (!s.getMoreResults()) + { + break mainBoardLoop; + } + } + } + index++; + } + } + catch (SQLException ex) + { + ex.printStackTrace(); + } + finally + { + UtilServer.runSync(() -> leaderboard.accept(leaderboards)); + } + } + else + { + UtilServer.runSync(() -> leaderboard.accept(leaderboards)); + } + }); + } + + public static enum LeaderboardSQLType + { + DAILY(FETCH_STAT_DAILY), + WEEKLY(FETCH_STAT_WEEKLY), + MONTHLY(FETCH_STAT_MONTHLY), + YEARLY(FETCH_STAT_YEARLY), + ALL(FETCH_STAT_ALL), + ALL_SEASON(FETCH_STAT_ALL_SEASON) + ; + + private String _sql; + + private LeaderboardSQLType(String sql) + { + _sql = sql; + } + + public String getStatement(int[] statIds, int start, int limit) + { + StringBuilder statementBuilder = new StringBuilder(); + for (int id : statIds) + { + statementBuilder.append(_sql.replace("%STAT%", String.valueOf(id)).replace("%START%", String.valueOf(start)).replace("%LIMIT%", String.valueOf(limit))); + } + return statementBuilder.toString(); + } + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/SetTournamentCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/SetTournamentCommand.java deleted file mode 100644 index 7e25605bf..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/SetTournamentCommand.java +++ /dev/null @@ -1,27 +0,0 @@ -package mineplex.core.leaderboard; - -import mineplex.core.command.CommandBase; -import mineplex.core.common.Rank; - -import org.bukkit.entity.Player; - -public class SetTournamentCommand extends CommandBase -{ - public SetTournamentCommand(LeaderboardManager plugin) - { - super(plugin, Rank.ADMIN, "settournament", "set-tournament"); - } - - @Override - public void Execute(Player caller, String[] args) - { - // TODO: Implement set tournament command. - /*if (args.length == 3) - { - String statType = args[0]; - int gamemode = Integer.parseInt(args[1]); - int value = Integer.parseInt(args[2]); - LeaderboardManager.getInstance().attemptStatEvent(caller, statType, gamemode, value); - }*/ - } -} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java deleted file mode 100644 index 3acf6a2f8..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java +++ /dev/null @@ -1,59 +0,0 @@ -package mineplex.core.leaderboard; - -import mineplex.core.database.MinecraftRepository; -import mineplex.serverdata.database.DBPool; -import mineplex.serverdata.database.RepositoryBase; -import mineplex.serverdata.database.column.ColumnInt; -import mineplex.serverdata.database.column.ColumnVarChar; - -import org.bukkit.plugin.java.JavaPlugin; - - -/** - * StatEventsRepository offers the ability to insert and log newly generated stat events. - * - * Intended for the purpose of statistical tracking of players. - * @author MrTwiggy - * - */ -public class StatEventsRepository extends RepositoryBase -{ - - // Insert or update stat events query - /*private static String INSERT_EVENT = - "INSERT INTO statEvents(accountId, gamemode, serverGroup, type, value, date) " - + "VALUES (?, ?, ?, ?, ?, CURRENT_DATE()) " - + "ON DUPLICATE KEY UPDATE value=value+";*/ - - private static String INSERT_EVENT = - "INSERT INTO statEvents(accountId, gamemode, serverGroup, type, value, date) " - + "SELECT accounts.id, ?, ?, ?, ?, CURRENT_DATE() " - + "FROM accounts WHERE name = ? " - + "ON DUPLICATE KEY UPDATE value=value+"; - - /** - * Class constructor - * @param plugin - the plugin responsible for instantiating this repository. - */ - public StatEventsRepository(JavaPlugin plugin) - { - super(DBPool.getAccount()); - } - - - /** - * Insert (or update) a new stat event record for today into the repository. - * @param accountId - the id of the account responsible for the stat event. - * @param gamemode - the id of the gamemode type at the time of the stat event. - * @param serverGroup - the server group id associated with the stat event. - * @param type - the type of stat event to be inserted (id of type). - * @param value - the integer based value denoting the actual statistic being logged. - */ - public void insertStatEvent(String playerName, int gamemode, String serverGroup, int type, int value) - { - // Hacky string concatanation - Don't judge me!! - // TODO: How to handle outside value block parameters - executeUpdate(INSERT_EVENT + value + ";", new ColumnInt("gamemode", gamemode), new ColumnVarChar("serverGroup", 100, serverGroup), - new ColumnInt("type", type), new ColumnInt("value", value), new ColumnVarChar("name", 100, playerName)); - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatType.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatType.java deleted file mode 100644 index 10663bae0..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatType.java +++ /dev/null @@ -1,48 +0,0 @@ -package mineplex.core.leaderboard; - -/** - * An enumeration delegating the various types of statistics to be dynamically tracked. - * @author MrTwiggy - * - */ -public enum StatType -{ - WIN(1), - LOSS(2), - KILL(3), - DEATH(4); - - private int _typeId; // Unique id for stat type - public int getTypeId() { return _typeId; } - - /** - * Private class constructor - * @param typeId - the unique identifying id for this {@link StatType} - */ - private StatType(int typeId) - { - _typeId = typeId; - } - - /** - * @param stat - the display name for the stat type - * @return the {@link StatType} corresponding to the passed in {@code stat}, if one exists, - * null otherwise. - */ - public static StatType getType(String stat) - { - switch(stat.toUpperCase().trim()) - { - case "WINS": - return WIN; - case "LOSSES": - return LOSS; - case "KILLS": - return KILL; - case "DEATHS": - return DEATH; - default: - return null; - } - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java index 1857154fc..02388b67c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/powerplayclub/PowerPlayClubRewards.java @@ -38,6 +38,7 @@ public class PowerPlayClubRewards .put(YearMonth.of(2017, Month.MARCH), new UnknownSalesPackageItem("Gold Pot Morph")) .put(YearMonth.of(2017, Month.APRIL), new UnknownSalesPackageItem("Bumblebee's Wings")) .put(YearMonth.of(2017, Month.MAY), new UnknownSalesPackageItem("King")) + .put(YearMonth.of(2017, Month.JUNE), new UnknownSalesPackageItem("Bob Ross Morph")) .build(); public interface PowerPlayClubItem diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferenceMainMenu.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferenceMainMenu.java index ab07a6d8f..d8ee17525 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferenceMainMenu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferenceMainMenu.java @@ -30,7 +30,7 @@ public class PreferenceMainMenu extends Menu protected Button[] setUp(Player player) { Rank rank = getPlugin().getClientManager().Get(player).GetRank(); - boolean exclusive = rank.has(Rank.HELPER) || rank == Rank.YOUTUBE_SMALL || rank == Rank.YOUTUBE || rank == Rank.TWITCH; + boolean exclusive = rank.has(Rank.MAPDEV) || rank == Rank.YOUTUBE_SMALL || rank == Rank.YOUTUBE || rank == Rank.TWITCH; Button[] buttons = new Button[exclusive ? INV_SIZE_MAX : INV_SIZE_MIN]; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/ProgressiveKit.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/ProgressiveKit.java index fa4469b55..88a1a5180 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/ProgressiveKit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/ProgressiveKit.java @@ -296,4 +296,14 @@ public interface ProgressiveKit ViewDist.NORMAL, displayTo); } } + + default boolean usesXp() + { + return true; + } + + default boolean crownsEnabled() + { + return false; + } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/data/KitUpgradeProcessor.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/data/KitUpgradeProcessor.java index e8cff97ee..e090dae6b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/data/KitUpgradeProcessor.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/data/KitUpgradeProcessor.java @@ -1,6 +1,6 @@ package mineplex.core.progression.data; -import mineplex.core.server.util.TransactionResponse; +import java.util.function.Consumer; import org.bukkit.Sound; import org.bukkit.entity.Player; @@ -11,6 +11,7 @@ import mineplex.core.common.util.F; import mineplex.core.progression.KitProgressionManager; import mineplex.core.progression.ProgressiveKit; import mineplex.core.progression.math.Calculations; +import mineplex.core.server.util.TransactionResponse; import mineplex.core.shop.confirmation.ConfirmationCallback; import mineplex.core.shop.confirmation.ConfirmationProcessor; @@ -39,27 +40,40 @@ public class KitUpgradeProcessor implements ConfirmationProcessor { String packageName = _kit.getInternalName() + "." + _upgradeLevel; int cost = Calculations.getGemsCost(_upgradeLevel); + if (!_kit.usesXp()) + { + cost = Calculations.getGemsCostXpLess(_upgradeLevel); + } + + Consumer handler = response -> + { + if (response == TransactionResponse.Success) + { + _kit.upgrade(_upgradeLevel, _player.getUniqueId()); + + _player.playSound(_player.getLocation(), Sound.CAT_MEOW, 5.0f, 1.0f); + _player.sendMessage(F.main("Kit Progression", "Purchased upgrades for " + _kit.getDisplayName() + " level " + _upgradeLevel)); + + callback.resolve("Success! You now own this upgrade!"); + } + else if (response == TransactionResponse.InsufficientFunds) + { + callback.reject("Insufficient funds!"); + } + else + { + callback.reject("There was an error processing your transaction. Try again later"); + } + }; + // Use UnknownPackages for this right now as it handles overspending gems properly - _manager.getDonationManager().purchaseUnknownSalesPackage(_player, packageName, GlobalCurrency.GEM, cost, false, - data -> - { - if (data == TransactionResponse.Success) - { - _kit.upgrade(_upgradeLevel, _player.getUniqueId()); - - _player.playSound(_player.getLocation(), Sound.CAT_MEOW, 5.0f, 1.0f); - _player.sendMessage(F.main("Kit Progression", "Purchased upgrades for " + _kit.getDisplayName() + " level " + _upgradeLevel)); - - callback.resolve("Success! You now own this upgrade!"); - } - else if (data == TransactionResponse.InsufficientFunds) - { - callback.reject("Insufficient funds!"); - } - else - { - callback.reject("There was an error processing your transaction. Try again later"); - } - }); + if (_kit.crownsEnabled()) + { + _manager.getDonationManager().purchaseUnknownSalesPackageCrown(_player, packageName, cost, false, handler); + } + else + { + _manager.getDonationManager().purchaseUnknownSalesPackage(_player, packageName, GlobalCurrency.GEM, cost, false, handler); + } } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeDetailsButton.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeDetailsButton.java index 911a8087d..11a12c356 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeDetailsButton.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeDetailsButton.java @@ -1,14 +1,18 @@ package mineplex.core.progression.gui.buttons; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + import com.google.common.collect.Lists; + import mineplex.core.common.util.C; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.menu.IconButton; +import mineplex.core.progression.ProgressiveKit; import mineplex.core.progression.math.Calculations; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - -import java.util.List; /** * Representing this kits Abilities in a GUI @@ -18,11 +22,13 @@ public class KitUpgradeDetailsButton extends IconButton private ItemStack _item; - public KitUpgradeDetailsButton(int level, List details) + public KitUpgradeDetailsButton(ProgressiveKit kit, Player player, int level, List details) { super(null); - - ItemBuilder builder = new ItemBuilder(Material.SLIME_BALL); + + int current = kit.getUpgradeLevel(player.getUniqueId()); + + ItemBuilder builder = new ItemBuilder(Material.STAINED_CLAY).setData((current >= level) ? (short)5 : (short)14); builder.setTitle(C.cYellow + "Level " + level + " upgrades"); @@ -34,7 +40,19 @@ public class KitUpgradeDetailsButton extends IconButton } lore.add(""); - lore.add(C.cGray + "Unlocks at kit level " + C.cGreen + Calculations.getLevelRequiredFor(level)); + if (kit.usesXp()) + { + lore.add(C.cGray + "Unlocks at kit level " + C.cGreen + Calculations.getLevelRequiredFor(level)); + } + else + { + String currency = C.cGreen + "%cost% Gems"; + if (kit.crownsEnabled()) + { + currency = C.cGold + "%cost% Crowns"; + } + lore.add(C.cGray + "Unlocks with " + currency.replace("%cost%", Calculations.getGemsCostXpLess(level) + "")); + } builder.setLore(lore.toArray(new String[lore.size()])); _item = builder.build(); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeMenuButton.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeMenuButton.java index 0bd36086c..263f69476 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeMenuButton.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/buttons/KitUpgradeMenuButton.java @@ -1,5 +1,6 @@ package mineplex.core.progression.gui.buttons; +import mineplex.core.common.currency.GlobalCurrency; import mineplex.core.common.util.C; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.progression.KitProgressionManager; @@ -47,14 +48,20 @@ public class KitUpgradeMenuButton extends KitButton //The difference between the players current level, and the next upgrade level int diff = nextUpgradeLevelPlayer - level; + int balance = plugin.getDonationManager().Get(player).getBalance(GlobalCurrency.GEM); + if (kit.crownsEnabled()) + { + balance = plugin.getDonationManager().getCrowns(player); + } + //This ONLY flashes if their next upgrade level isn't their same one. - _flash = Calculations.isUpgradeLevelEligible(level) && (nextUpgradeLevel > upgradeLevel); + _flash = (kit.usesXp() ? (Calculations.isUpgradeLevelEligible(level) && (nextUpgradeLevel > upgradeLevel)) : (Calculations.isUpgradeLevelEligibleXpLess(balance) && upgradeLevel < Calculations.getNextUpgradeLevelXpLess(upgradeLevel))); ChatColor color = Calculations.getColor(level, nextUpgradeLevelPlayer); - if(kit.showUpgrades()) + if (kit.showUpgrades()) { - ItemBuilder builder = lore(new ItemBuilder(Material.ENCHANTMENT_TABLE), upgradeLevel, color, diff); + ItemBuilder builder = kit.usesXp() ? lore(new ItemBuilder(Material.ENCHANTMENT_TABLE), upgradeLevel, color, diff) : lore(new ItemBuilder(Material.ENCHANTMENT_TABLE), upgradeLevel); builder.setTitle(C.cYellow + "Upgrade Level " + upgradeLevel); _item = builder.build(); } @@ -138,4 +145,13 @@ public class KitUpgradeMenuButton extends KitButton ChatColor.WHITE + "Click to view Upgrade and XP tracking"); return builder; } -} + + private ItemBuilder lore(ItemBuilder builder, int upgradeLevel) + { + builder.setLore(" ", + ChatColor.WHITE + "Upgrade Level: " + ChatColor.GREEN + upgradeLevel + " out of 5", + "", + ChatColor.WHITE + "Click to view Upgrades"); + return builder; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitDisplayMenu.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitDisplayMenu.java index 2a9d73b67..e32104822 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitDisplayMenu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitDisplayMenu.java @@ -63,8 +63,11 @@ public class KitDisplayMenu extends KitMenu */ private void setUpNextMenuButtons(Button[] buttons, Player player) { - buttons[48] = new KitXPButton(getKit(), player, getPlugin()); - buttons[50] = new KitUpgradeMenuButton(getKit(), player, getPlugin()); + if (getKit().usesXp()) + { + buttons[48] = new KitXPButton(getKit(), player, getPlugin()); + } + buttons[getKit().usesXp() ? 50 : 49] = new KitUpgradeMenuButton(getKit(), player, getPlugin()); } /** @@ -90,7 +93,7 @@ public class KitDisplayMenu extends KitMenu int index = 0; for(int i : UPGRADE_SLOTS) { - buttons[i] = new KitUpgradeDetailsButton(index + 1, details.get(index++)); + buttons[i] = new KitUpgradeDetailsButton(getKit(), player, index + 1, details.get(index++)); } return; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitInformationTrackerMenu.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitInformationTrackerMenu.java index 42d1aa723..9a61c872f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitInformationTrackerMenu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/gui/guis/KitInformationTrackerMenu.java @@ -59,11 +59,13 @@ public class KitInformationTrackerMenu extends KitMenu Button[] buttons = new Button[52]; buttons[0] = new BackButton(new KitDisplayMenu(getKit(), getPlugin())); - - setUpXP(buttons, player); - - setUpLevel(buttons, player); - + + if (getKit().usesXp()) + { + setUpXP(buttons, player); + setUpLevel(buttons, player); + } + setUpUpgrade(buttons, player); return buttons; @@ -155,10 +157,10 @@ public class KitInformationTrackerMenu extends KitMenu Map> details = getKit().getUpgradeDetails(); int index = 0; - for(int i : UPGRADE_SLOTS) + for (int i : (getKit().usesXp() ? UPGRADE_SLOTS : LEVEL_SLOTS)) { List list = details.get(index++); - KitUpgradeDetailsButton detailsButton = new KitUpgradeDetailsButton(index, list); + KitUpgradeDetailsButton detailsButton = new KitUpgradeDetailsButton(getKit(), player, index, list); ItemBuilder itemStack = new ItemBuilder(detailsButton.getItemStack()); if (getKit().ownsUpgrade(player.getUniqueId(), index)) @@ -168,12 +170,18 @@ public class KitInformationTrackerMenu extends KitMenu else if (getKit().canPurchaseUpgrade(player.getUniqueId(), index)) { itemStack.setGlow(true); - itemStack.addLore("Costs " + C.cGreen + Calculations.getGemsCost(index) + C.cGray + " gems"); + if (getKit().usesXp()) + { + itemStack.addLore("Costs " + (getKit().crownsEnabled() ? C.cGold : C.cGreen) + Calculations.getGemsCost(index) + C.cGray + (getKit().crownsEnabled() ? " crowns" : " gems")); + } itemStack.addLore(C.cGreen + "Click to purchase this upgrade!"); } else { - itemStack.addLore("Costs " + C.cGreen + Calculations.getGemsCost(index) + C.cGray + " gems"); + if (getKit().usesXp()) + { + itemStack.addLore("Costs " + (getKit().crownsEnabled() ? C.cGold : C.cGreen) + Calculations.getGemsCost(index) + C.cGray + (getKit().crownsEnabled() ? " crowns" : " gems")); + } itemStack.addLore(C.cRed + "You cannot purchase this upgrade!"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java b/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java index b4a6ac726..51299c6d0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/progression/math/Calculations.java @@ -1,10 +1,12 @@ package mineplex.core.progression.math; -import com.google.common.collect.Maps; -import net.md_5.bungee.api.ChatColor; - +import java.util.HashMap; import java.util.Map; +import com.google.common.collect.Maps; + +import net.md_5.bungee.api.ChatColor; + /** * This class handles all the math and static fields needed for Kit Progressions * You can find some util methods in here as well that relate to numbers @@ -15,6 +17,7 @@ public class Calculations private static final int[] LEVELS = new int[100]; private static final int[] UPGRADE_LEVELS = {5, 10, 30, 75, 100}; private static final Map GEMS_FOR_UPGRADE = Maps.newHashMap(); + private static final Map GEMS_FOR_XPLESS_UPGRADE = new HashMap<>(); static { @@ -23,6 +26,11 @@ public class Calculations { GEMS_FOR_UPGRADE.put(level, level * 1000); } + GEMS_FOR_XPLESS_UPGRADE.put(1, 1000); + GEMS_FOR_XPLESS_UPGRADE.put(2, 5000); + GEMS_FOR_XPLESS_UPGRADE.put(3, 15000); + GEMS_FOR_XPLESS_UPGRADE.put(4, 50000); + GEMS_FOR_XPLESS_UPGRADE.put(5, 100000); } /** @@ -79,6 +87,20 @@ public class Calculations { return GEMS_FOR_UPGRADE.containsKey(currentLevel); } + + public static boolean isUpgradeLevelEligibleXpLess(int gems) + { + boolean afford = false; + + for (int cost : GEMS_FOR_XPLESS_UPGRADE.values()) + { + if (cost <= gems) + { + afford = true; + } + } + return afford; + } /** * Determines if the players current level, and his gems, are what he needs to level up this upgrade @@ -91,6 +113,11 @@ public class Calculations { return GEMS_FOR_UPGRADE.containsKey(currentLevel) && GEMS_FOR_UPGRADE.get(currentLevel) <= gems; } + + public static boolean canUpgradeXpLess(int upgradeLevel, int gems) + { + return GEMS_FOR_XPLESS_UPGRADE.containsKey(upgradeLevel) && GEMS_FOR_XPLESS_UPGRADE.get(upgradeLevel) <= gems; + } /** * Get the XP required for the next level @@ -155,7 +182,7 @@ public class Calculations } /** - * Get the next integer upgrade level based of the players current leve; + * Get the next integer upgrade level based of the players current level * * @param currentLevel The players current level * @return The next upgrade level @@ -169,6 +196,20 @@ public class Calculations } return 5; } + + public static int getNextUpgradeLevelXpLess(int currentLevel) + { + int current = 5; + for (int level : GEMS_FOR_XPLESS_UPGRADE.keySet()) + { + if (level < current && level > currentLevel) + { + current = level; + } + } + + return current; + } /** * Get the next level the player needs to reach to unlock an upgrade @@ -215,4 +256,9 @@ public class Calculations { return GEMS_FOR_UPGRADE.get(getLevelRequiredFor(upgradeLevel)); } + + public static int getGemsCostXpLess(int upgradeLevel) + { + return GEMS_FOR_XPLESS_UPGRADE.get(upgradeLevel); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 29804bc5b..c4290ff84 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -21,6 +21,7 @@ import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTasks; +import mineplex.core.leaderboard.LeaderboardManager; import mineplex.core.stats.command.GiveStatCommand; import mineplex.core.stats.command.MasterBuilderUnban; import mineplex.core.stats.command.SetLevelCommand; @@ -39,6 +40,7 @@ public class StatsManager extends MiniDbClientPlugin private final CoreClientManager _coreClientManager; private final StatsRepository _repository; + private final LeaderboardManager _leaderboard; private final Map _stats = new HashMap<>(); private final Map> _statUploadQueue = new HashMap<>(); @@ -50,11 +52,21 @@ public class StatsManager extends MiniDbClientPlugin _repository = new StatsRepository(); _coreClientManager = clientManager; + + _leaderboard = new LeaderboardManager(plugin); UtilScheduler.runAsyncEvery(UpdateType.SEC, () -> { - save(_statUploadQueue, _repository::saveStats, "increment"); - save(_statUploadQueueOverRidable, map -> _repository.saveStats(map, true), "override"); + save(_statUploadQueue, map -> + { + _repository.saveStats(map); + _leaderboard.handleStatIncrease(map); + }, "increment"); + save(_statUploadQueueOverRidable, map -> + { + _repository.saveStats(map, true); + _leaderboard.handleStatIncrease(map); + }, "override"); }); for (Stat stat : _repository.retrieveStats()) @@ -88,6 +100,16 @@ public class StatsManager extends MiniDbClientPlugin return stats; }); } + + public void loadStatId(String statName, Consumer idConsumer) + { + registerNewStat(statName, () -> + { + final int statId = _stats.get(statName); + + runSync(() -> idConsumer.accept(Integer.valueOf(statId))); + }); + } /** @@ -115,6 +137,7 @@ public class StatsManager extends MiniDbClientPlugin * * @param value The value, must be greater or equal to zero */ + @Deprecated public void setStat(Player player, String statName, long value) { if (value < 0) @@ -148,6 +171,7 @@ public class StatsManager extends MiniDbClientPlugin * * @param value The value, must be greater or equal to zero */ + @Deprecated public void setStat(final int accountId, final String statName, final long value) { if (value < 0) @@ -161,7 +185,8 @@ public class StatsManager extends MiniDbClientPlugin _repository.saveStats(uploadQueue, true); }); } - + + @Deprecated private void addToOverRidableQueue(String statName, CoreClient client, long value) { if (client.getAccountId() == -1) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/TrackManager.java b/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/TrackManager.java index 30072b414..eddb79bf6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/TrackManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/TrackManager.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; +import mineplex.core.titles.tracks.award.AlienInvasionTrack; import mineplex.core.titles.tracks.award.AprilFools2017Track; import net.md_5.bungee.api.ChatColor; @@ -82,6 +83,7 @@ public class TrackManager extends MiniPlugin // Awarded tracks registerTrack(new Bridges2017Track()); registerTrack(new AprilFools2017Track()); + registerTrack(new AlienInvasionTrack()); // Custom tracks // registerTrack(track("lenny", "Lenny", "( ͡° ͜ʖ ͡°)")); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/award/AlienInvasionTrack.java b/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/award/AlienInvasionTrack.java new file mode 100644 index 000000000..def482e21 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/titles/tracks/award/AlienInvasionTrack.java @@ -0,0 +1,30 @@ +package mineplex.core.titles.tracks.award; + +import mineplex.core.titles.tracks.ItemizedTrack; +import mineplex.core.titles.tracks.TrackFormat; +import mineplex.core.titles.tracks.TrackTier; +import net.md_5.bungee.api.ChatColor; + +public class AlienInvasionTrack extends ItemizedTrack +{ + + public AlienInvasionTrack() + { + super( + "alien-invasion", + ChatColor.GREEN, + "Alien", + "Alien Invasion", + "This track is awarded to players who survived the Alien Invasion Event.", + true); + + special(); + + getRequirements() + .addTier(new TrackTier( + "Alien Invasion", + null, + this::owns, + new TrackFormat(ChatColor.GREEN, ChatColor.DARK_GREEN) + )); } +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/ClansBanManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/ClansBanManager.java index 56c12bdec..8b3d18877 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/ClansBanManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/ClansBanManager.java @@ -117,7 +117,7 @@ public class ClansBanManager extends MiniPlugin event.getPlayer().removePotionEffect(PotionEffectType.JUMP); for (Player staff : UtilServer.GetPlayers()) { - if (_clientManager.hasRank(staff, Rank.CMOD)) + if (_clientManager.Get(staff).GetRank().has(null, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, false)) { UtilPlayer.message(staff, F.main(getName(), F.elem(event.getPlayer().getName()) + " has logged out while frozen!")); } @@ -266,7 +266,7 @@ public class ClansBanManager extends MiniPlugin player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 999999, -10)); for (Player alert : UtilServer.GetPlayers()) { - if (_clientManager.hasRank(alert, Rank.CMOD)) + if (_clientManager.Get(staff).GetRank().has(null, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, false)) { UtilPlayer.message(alert, F.main(getName(), F.elem(player.getName()) + " has been frozen by " + F.elem(staff.getName()) + "!")); } @@ -287,7 +287,7 @@ public class ClansBanManager extends MiniPlugin player.removePotionEffect(PotionEffectType.JUMP); for (Player alert : UtilServer.GetPlayers()) { - if (_clientManager.hasRank(alert, Rank.CMOD)) + if (_clientManager.Get(staff).GetRank().has(null, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, false)) { UtilPlayer.message(alert, F.main(getName(), F.elem(player.getName()) + " has been unfrozen by " + F.elem(staff.getName()) + "!")); continue; @@ -312,4 +312,4 @@ public class ClansBanManager extends MiniPlugin callback.run(target); } -} \ No newline at end of file +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/ClansBanCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/ClansBanCommand.java index 6cca5d188..3275072c5 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/ClansBanCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/ClansBanCommand.java @@ -13,7 +13,7 @@ public class ClansBanCommand extends CommandBase { public ClansBanCommand(ClansBanManager plugin) { - super(plugin, Rank.CMOD, "cbans", "cb", "cban", "cp", "cpunish", "clanspunish", "clanpunish"); + super(plugin, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, "cbans", "cb", "cban", "cp", "cpunish", "clanspunish", "clanpunish"); } @Override diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/FreezeCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/FreezeCommand.java index fedad6275..1a75c70d7 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/FreezeCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/FreezeCommand.java @@ -16,7 +16,7 @@ public class FreezeCommand extends CommandBase { public FreezeCommand(ClansBanManager plugin) { - super(plugin, Rank.CMOD, "freeze"); + super(plugin, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, "freeze"); } @Override @@ -41,4 +41,4 @@ public class FreezeCommand extends CommandBase Plugin.freeze(target, caller); } } -} \ No newline at end of file +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/UnfreezeCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/UnfreezeCommand.java index 7114d0e79..13e4aa098 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/UnfreezeCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ban/commands/UnfreezeCommand.java @@ -16,7 +16,7 @@ public class UnfreezeCommand extends CommandBase { public UnfreezeCommand(ClansBanManager plugin) { - super(plugin, Rank.CMOD, "unfreeze"); + super(plugin, Rank.ADMIN, new Rank[] {Rank.CMOD, Rank.CMA}, "unfreeze"); } @Override @@ -41,4 +41,4 @@ public class UnfreezeCommand extends CommandBase Plugin.unfreeze(target, caller); } } -} \ No newline at end of file +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index 3421cb3d8..a4b0a0b88 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -184,7 +184,7 @@ public class Hub extends JavaPlugin implements IRelation String boosterGroup = serverConfiguration.getServerGroup().getBoosterGroup(); ThankManager thankManager = new ThankManager(this, clientManager, donationManager); BoosterManager boosterManager = new BoosterManager(this, boosterGroup, clientManager, donationManager, inventoryManager, thankManager); - HubManager hubManager = new HubManager(this, blockRestore, clientManager, incognito, donationManager, inventoryManager, conditionManager, disguiseManager, new TaskManager(this, clientManager), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, new HologramManager(this, packetHandler), npcManager, personalServerManager, packetHandler, punish, serverStatusManager, customDataManager, thankManager, boosterManager, castleManager); + HubManager hubManager = new HubManager(this, blockRestore, clientManager, incognito, donationManager, inventoryManager, conditionManager, disguiseManager, new TaskManager(this, clientManager), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, hologramManager, npcManager, personalServerManager, packetHandler, punish, serverStatusManager, customDataManager, thankManager, boosterManager, castleManager); QueueManager queueManager = new QueueManager(this, clientManager, donationManager, eloManager, partyManager); ServerManager serverManager = new ServerManager(this, clientManager, donationManager, portal, partyManager, serverStatusManager, hubManager, queueManager, boosterManager); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java new file mode 100644 index 000000000..8e022d3fb --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -0,0 +1,370 @@ +package mineplex.hub.modules; + +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +import org.bukkit.Bukkit; +import org.bukkit.DyeColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Skeleton; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.BlockVector; + +import mineplex.core.Managers; +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.achievement.Achievement; +import mineplex.core.blockrestore.BlockRestore; +import mineplex.core.command.CommandBase; +import mineplex.core.common.Pair; +import mineplex.core.common.Rank; +import mineplex.core.common.block.schematic.Schematic; +import mineplex.core.common.block.schematic.SchematicData; +import mineplex.core.common.block.schematic.UtilSchematic; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.creature.Creature; +import mineplex.core.stats.StatsManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilVariant; +import mineplex.hub.server.ServerManager; + +@ReflectivelyCreateMiniPlugin +public class AlienInvasion extends MiniPlugin +{ + + private static final String SCHEMATIC_PATH = ".." + File.separator + ".." + File.separator + "update" + File.separator + "files" + File.separator + "UFO.schematic"; + private static final int[][] UFO_SPAWNS = { + { + 0, 81, -14 + }, + { + 15, 91, -11 + }, + { + -10, 94, 5 + }, + { + -25, 97, -26 + }, + { + -17, 94, -47 + }, + { + 20, 95, -55, + }, + { + 45, 106, -23 + }, + { + 50, 110, 16 + }, + { + -33, 125, 5 + }, + { + 30, 102, 10 + } + }; + /** + * Bob Ross is not an alien + */ + private static final String[] ALIEN_SPEAK = { + "Every day is a good day when you paint", + "Beat the devil out of it", + "Happy little clouds", + "Happy little trees", + "I believe", + "I wonder if anyone can see these messages", + "Get involved", + "Ruff", + "Hey you, I see you using the game log output. You should totally go to Moppletop's wall on enjin and say HOI" + }; + private static final ItemStack HELMET = new ItemStack(Material.GLASS); + + private final BlockRestore _restore; + private final Creature _creature; + private final StatsManager _stats; + private final ServerManager _serverManager; + + private final World _world; + + private Schematic _schematic; + private boolean _active; + private int _lastUFOIndex; + private Location _beam; + + private final Set _ufoBlocks; + private final Set _beaconBlocks; + private final Set _aliens; + + public AlienInvasion() + { + super("Alien Invasion"); + + _restore = require(BlockRestore.class); + _creature = require(Creature.class); + _stats = require(StatsManager.class); + _serverManager = Managers.get(ServerManager.class); + + _world = Bukkit.getWorld("world"); + + _ufoBlocks = new HashSet<>(200); + _beaconBlocks = new HashSet<>(); + _aliens = new HashSet<>(); + + addCommand(new CommandBase(this, Rank.ADMIN, "alien-animation-start") + { + @Override + public void Execute(Player caller, String[] args) + { + startAnimation(); + } + }); + addCommand(new CommandBase(this, Rank.ADMIN, "alien-animation-stop") + { + @Override + public void Execute(Player caller, String[] args) + { + stopAnimation(); + } + }); + + startAnimation(); + } + + public void startAnimation() + { + if (_active) + { + return; + } + + try + { + _schematic = UtilSchematic.loadSchematic(new File(SCHEMATIC_PATH)); + } + catch (IOException e) + { + e.printStackTrace(); + return; + } + + _lastUFOIndex = 0; + _active = true; + + _world.setTime(18000); + + for (Player player : Bukkit.getOnlinePlayers()) + { + player.playSound(player.getLocation(), Sound.ENDERDRAGON_DEATH, 1, 0.5F); + } + + UtilTextMiddle.display(C.cGreen + "Aliens Are Invading", "Defend the Hub!"); + } + + public void sendPlayerToInstance(Player player) + { + _serverManager.selectServer(player, "UFO"); + } + + public void stopAnimation() + { + if (!_active) + { + return; + } + + _active = false; + + for (Block block : _ufoBlocks) + { + block.setType(Material.AIR); + } + + _ufoBlocks.clear(); + + for (LivingEntity entity : _aliens) + { + entity.remove(); + } + + _aliens.clear(); + + for (Block block : _beaconBlocks) + { + _restore.restore(block); + } + + _beaconBlocks.clear(); + + _world.setTime(6000); + } + + @EventHandler + public void updateUFOSpwawn(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC || !_active || _lastUFOIndex == UFO_SPAWNS.length) + { + return; + } + + int[] cords = UFO_SPAWNS[_lastUFOIndex]; + Location location = new Location(_world, cords[0], cords[1], cords[2]); + + location.subtract(5, 0, 5); + + UtilParticle.PlayParticleToAll(ParticleType.FIREWORKS_SPARK, location, 5F, 5F, 5F, 1, 50, ViewDist.LONG); + + SchematicData data = _schematic.paste(location, true, false, false); + Location beam = data.getDataLocationMap().getIronLocations(DyeColor.LIME).get(0); + + for (BlockVector vector : data.getBlocks()) + { + Location block = location.add(vector); + + _ufoBlocks.add(block.getBlock()); + + location.subtract(vector); + } + + if (_lastUFOIndex == 0) + { + // Spawn a beacon + Block ground = beam.getBlock(); + + while (ground.getType() == Material.AIR) + { + ground = ground.getRelative(BlockFace.DOWN); + } + + ground = ground.getRelative(BlockFace.UP); + _beam = ground.getLocation(); + + for (Pair> pair : UtilBlock.getBeaconBlocks(ground.getLocation(), (byte) 5)) + { + Block block = pair.getLeft().getBlock(); + + _restore.add(block, pair.getRight().getLeft().getId(), pair.getRight().getRight(), Long.MAX_VALUE); + _beaconBlocks.add(block); + } + } + + _lastUFOIndex++; + } + + @EventHandler + public void updateAlienSpawn(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST || !_active || _beam == null || _aliens.size() > 20) + { + return; + } + + _creature.SetForce(true); + + Location random = UtilAlg.getRandomLocation(_beam.clone().add(0, 5, 0), 30, 4, 30); + random.setYaw(UtilMath.r(180)); + + Skeleton skeleton = UtilVariant.spawnWitherSkeleton(random); + skeleton.getEquipment().setHelmet(HELMET); + skeleton.setCustomNameVisible(true); + skeleton.setCustomName(C.cGreenB + "Alien"); + UtilEnt.vegetate(skeleton); + + _aliens.add(skeleton); + + _creature.SetForce(false); + } + + @EventHandler + public void updateSendToInstance(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC || !_active || _beam == null) + { + return; + } + + for (Player player : Bukkit.getOnlinePlayers()) + { + if (UtilMath.offsetSquared(player.getLocation(), _beam) > 9) + { + continue; + } + + sendPlayerToInstance(player); + } + } + + @EventHandler + public void interactAlien(EntityDamageByEntityEvent event) + { + Entity entity = event.getEntity(); + Entity damager = event.getDamager(); + + if (!_aliens.contains(entity)) + { + return; + } + + if (damager instanceof Player) + { + Player player = (Player) damager; + + sendAlienSpeak(player); + } + else if (damager instanceof EnderPearl) + { + ((LivingEntity) entity).setHealth(0); + _aliens.remove(entity); + + Projectile projectile = (Projectile) damager; + Player shooter = (Player) projectile.getShooter(); + + shooter.playSound(shooter.getLocation(), Sound.NOTE_PLING, 1, 1.8F); + _stats.incrementStat(shooter, Achievement.GLOBAL_ALIEN_INVASION.getStats()[0], 1); + } + } + + @EventHandler + public void interactAlien(PlayerInteractAtEntityEvent event) + { + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + + if (!_aliens.contains(entity)) + { + return; + } + + sendAlienSpeak(player); + } + + private void sendAlienSpeak(Player player) + { + player.sendMessage(C.cGreen + C.Scramble + ALIEN_SPEAK[UtilMath.r(ALIEN_SPEAK.length)]); + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java index a305c124b..cc37b55a6 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java @@ -787,6 +787,16 @@ public class ServerManager extends MiniPlugin implements BrawlShopProvider { return _statusManager; } + + public ShopBase getCastleAssaultShop() + { + return _serverNpcShopMap.get("Castle Assault"); + } + + public ShopBase getCastleAssaultTDMShop() + { + return _serverNpcShopMap.get("Castle Assault TDM"); + } public ShopBase getCastleSiegeShop() { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java index 5bfebcbdd..07e52532f 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -21,6 +21,8 @@ import mineplex.hub.server.ui.button.SelectBHButton; import mineplex.hub.server.ui.button.SelectBLDButton; import mineplex.hub.server.ui.button.SelectBRButton; import mineplex.hub.server.ui.button.SelectBawkButton; +import mineplex.hub.server.ui.button.SelectCAButton; +import mineplex.hub.server.ui.button.SelectCATDMButton; import mineplex.hub.server.ui.button.SelectCLANSButton; import mineplex.hub.server.ui.button.SelectCSButton; import mineplex.hub.server.ui.button.SelectCTFButton; @@ -61,16 +63,33 @@ public class ServerGameMenu extends ShopPageBase @Override protected void buildPage() { - add(1, Material.EGG, C.cYellowB + "Bawk Bawk Battles " + C.cGray + "Challenges", new String[] + add(0, Material.EGG, C.cYellowB + "Bawk Bawk Battles " + C.cGray + "Challenges", new String[] { - (_extraValue ? C.cAquaB : C.cWhiteB) + "NEW GAME", C.Reset + "", C.Reset + "Follow Bawk Bawk's instructions", C.Reset + "Complete different tasks", C.Reset + "If you lose, chickens will devour you!" }, "BBB", "Bawk_Bawk_Battles", new SelectBawkButton(this)); + + add(2, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Assault " + C.cGray + "Fast Paced PvP", new String[] + { + (_extraValue ? C.cAquaB : C.cWhiteB) + "NEW UPDATES", + C.Reset + "", + C.Reset + "Combatants must battle to", + C.Reset + "win the day for their king", + C.Reset + "at all costs!", + }, "CA", "Castle_Assault", new SelectCAButton(this)); + + add(4, Material.DIAMOND_CHESTPLATE, C.cYellowB + "Castle Assault TDM " + C.cGray + "Team PvP", new String[] + { + (_extraValue ? C.cAquaB : C.cWhiteB) + "NEW GAME", + C.Reset + "", + C.Reset + "Combatants must battle to", + C.Reset + "win glory for their team", + C.Reset + "by slaying the enemy!", + }, "CATDM", "Castle_Assault_TDM", new SelectCATDMButton(this)); - add(4, Material.QUARTZ_BLOCK, C.cYellowB + "Speed Builders " + C.cGray + "Competitive Building", new String[] + add(6, Material.QUARTZ_BLOCK, C.cYellowB + "Speed Builders " + C.cGray + "Competitive Building", new String[] { C.Reset + "", C.Reset + "Memorize Gwen the Guardian's builds", @@ -78,7 +97,7 @@ public class ServerGameMenu extends ShopPageBase C.Reset + "The least correct builder is eliminated.", }, "SB", "Speed_Builders", new SelectSBButton(this)); - add(7, Material.TNT, C.cYellowB + "Dragon Escape " + C.cGray + "Fast Paced Parkour", new String[] + add(8, Material.TNT, C.cYellowB + "Dragon Escape " + C.cGray + "Fast Paced Parkour", new String[] { (_extraValue ? C.cAquaB : C.cWhiteB) + "FEATURED ARCADE GAME", C.Reset + "", @@ -631,6 +650,16 @@ public class ServerGameMenu extends ShopPageBase { getPlugin().getCtfShop().attemptShopOpen(player); } + + public void openCA(Player player) + { + getPlugin().getCastleAssaultShop().attemptShopOpen(player); + } + + public void openCATDM(Player player) + { + getPlugin().getCastleAssaultTDMShop().attemptShopOpen(player); + } public void openCS(Player player) { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcShop.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcShop.java index eb087afa5..4bda13c2c 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcShop.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcShop.java @@ -25,7 +25,6 @@ public class ServerNpcShop extends ShopBase { switch (_serverGroup.getPrefix().toUpperCase()) { - case "SSM": case "SKY": case "HG": return new ServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player, _serverGroup); @@ -39,6 +38,9 @@ public class ServerNpcShop extends ShopBase case "SF": return new SkyfallServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player); + case "SSM": + return new SuperSmashMobsServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player, _serverGroup); + default: return new ServerNpcPage(getPlugin(), this, getClientManager(), getDonationManager(), _serverGroup.getServerNpcName(), player, _serverGroup.getPrefix()); } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SuperSmashMobsServerTypePage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SuperSmashMobsServerTypePage.java new file mode 100644 index 000000000..f2c611800 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SuperSmashMobsServerTypePage.java @@ -0,0 +1,54 @@ +package mineplex.hub.server.ui; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; +import mineplex.core.donation.DonationManager; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.shop.page.ShopPageBase; +import mineplex.hub.server.ServerManager; +import mineplex.serverdata.data.ServerGroup; + +public class SuperSmashMobsServerTypePage extends ShopPageBase + +{ + private final ServerGroup _serverGroup; + + public SuperSmashMobsServerTypePage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, + DonationManager donationManager, Player player, ServerGroup group) + { + super(plugin, shop, clientManager, donationManager, "Super Smash Mobs ", player, 27); + _serverGroup = group; + + buildPage(); + } + + @Override + protected void buildPage() + { + setItem(12, new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 4).setTitle(C.Reset + C.cGold + "Play " + C.cYellow + "Super Smash Mobs") + .addLore(new String[] + { + C.Reset + "", + C.Reset + C.cGreen + "Click to Play", + }).build()); + + setItem(14, new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 3).setTitle(C.Reset + C.cYellow + "Super Smash Mobs " + C.cGold + "Training") + .addLore(new String[] + { + C.Reset + "", + C.Reset + C.cGreen + "Click to Play", + }).build()); + + getButtonMap().put(12, (player, __) -> getShop().openPageForPlayer(player, new ServerTypePage(getPlugin(), getShop(), getClientManager(), getDonationManager(), player, _serverGroup))); + getButtonMap().put(14, (player, __) -> getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "SSM Training", player, "SSMT"))); + } + + public void Update() + { + getButtonMap().clear(); + buildPage(); + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCAButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCAButton.java new file mode 100644 index 000000000..6ab3a36c8 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCAButton.java @@ -0,0 +1,23 @@ +package mineplex.hub.server.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; + +public class SelectCAButton implements IButton +{ + private ServerGameMenu _menu; + + public SelectCAButton(ServerGameMenu menu) + { + _menu = menu; + } + + @Override + public void onClick(Player player, ClickType clickType) + { + _menu.openCA(player); + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCATDMButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCATDMButton.java new file mode 100644 index 000000000..409d0c4b4 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCATDMButton.java @@ -0,0 +1,23 @@ +package mineplex.hub.server.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; + +public class SelectCATDMButton implements IButton +{ + private ServerGameMenu _menu; + + public SelectCATDMButton(ServerGameMenu menu) + { + _menu = menu; + } + + @Override + public void onClick(Player player, ClickType clickType) + { + _menu.openCATDM(player); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java index 50a7acec4..197d76ff0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -1,10 +1,10 @@ package nautilus.game.arcade; +import static mineplex.core.Managers.require; + import java.io.File; import java.util.HashMap; -import net.minecraft.server.v1_8_R3.MinecraftServer; - import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -52,7 +52,6 @@ import mineplex.core.ignore.IgnoreManager; import mineplex.core.incognito.IncognitoManager; import mineplex.core.inventory.InventoryManager; import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.leaderboard.LeaderboardManager; import mineplex.core.memory.MemoryFix; import mineplex.core.message.MessageManager; import mineplex.core.monitor.LagMeter; @@ -83,12 +82,10 @@ import mineplex.core.visibility.VisibilityManager; import mineplex.core.website.WebsiteLinkManager; import mineplex.minecraft.game.core.combat.CombatManager; import mineplex.minecraft.game.core.damage.DamageManager; - import nautilus.game.arcade.anticheatmetadata.GameInfoMetadata; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.GameServerConfig; - -import static mineplex.core.Managers.require; +import net.minecraft.server.v1_8_R3.MinecraftServer; public class Arcade extends JavaPlugin { @@ -167,7 +164,6 @@ public class Arcade extends JavaPlugin incognito.setPreferencesManager(preferenceManager); Creature creature = new Creature(this); - LeaderboardManager leaderboardManager = new LeaderboardManager(this, _clientManager); Teleport teleport = new Teleport(this, _clientManager); Portal portal = new Portal(); new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion(), GenericServer.HUB); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index 3e6d3fa66..a79a7a7bb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -4,8 +4,7 @@ import java.io.File; import java.util.ArrayList; import java.util.HashSet; -import net.minecraft.server.v1_8_R3.EntityLiving; - +import mineplex.core.google.GoogleSheetsManager; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -39,6 +38,7 @@ import mineplex.core.MiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.AchievementManager; +import mineplex.core.antihack.compedaccount.PriorityCause; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.blood.Blood; import mineplex.core.bonuses.BonusManager; @@ -124,7 +124,6 @@ import mineplex.minecraft.game.core.condition.ConditionManager; import mineplex.minecraft.game.core.damage.DamageManager; import mineplex.minecraft.game.core.fire.Fire; import mineplex.serverdata.Region; - import nautilus.game.arcade.addons.SoupAddon; import nautilus.game.arcade.booster.GameBoosterManager; import nautilus.game.arcade.command.CancelNextGameCommand; @@ -169,6 +168,7 @@ import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; import nautilus.game.arcade.managers.lobby.legacy.LegacyGameLobbyManager; import nautilus.game.arcade.player.ArcadePlayer; import nautilus.game.arcade.shop.ArcadeShop; +import net.minecraft.server.v1_8_R3.EntityLiving; public class ArcadeManager extends MiniPlugin implements IRelation { @@ -235,7 +235,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation private NextBestGameManager _nextBestGameManager; private TrackManager _trackManager; private QuestManager _questManager; - + private GoogleSheetsManager _sheetsManager; private IncognitoManager _incognitoManager; private TaskManager _taskManager; @@ -266,11 +266,11 @@ public class ArcadeManager extends MiniPlugin implements IRelation private final Titles _titles; public ArcadeManager(Arcade plugin, ServerStatusManager serverStatusManager, GameServerConfig serverConfig, - CoreClientManager clientManager, DonationManager donationManager, DamageManager damageManager, - StatsManager statsManager, IncognitoManager incognitoManager, AchievementManager achievementManager, DisguiseManager disguiseManager, Creature creature, Teleport teleport, Blood blood, Chat chat, - Portal portal, PreferencesManager preferences, InventoryManager inventoryManager, PacketHandler packetHandler, - CosmeticManager cosmeticManager, ProjectileManager projectileManager, PetManager petManager, HologramManager hologramManager, PollManager pollManager, - NpcManager npcManager, CustomDataManager customDataManager, Punish punish, EloManager eloManager, ThankManager thankManager, BoosterManager boosterManager) + CoreClientManager clientManager, DonationManager donationManager, DamageManager damageManager, + StatsManager statsManager, IncognitoManager incognitoManager, AchievementManager achievementManager, DisguiseManager disguiseManager, Creature creature, Teleport teleport, Blood blood, Chat chat, + Portal portal, PreferencesManager preferences, InventoryManager inventoryManager, PacketHandler packetHandler, + CosmeticManager cosmeticManager, ProjectileManager projectileManager, PetManager petManager, HologramManager hologramManager, PollManager pollManager, + NpcManager npcManager, CustomDataManager customDataManager, Punish punish, EloManager eloManager, ThankManager thankManager, BoosterManager boosterManager) { super("Game Manager", plugin); @@ -498,7 +498,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation scoreboard.get(ArcadeScoreboardLine.PLAYERS_NAME).write(C.cYellow + C.Bold + "Players"); scoreboard.get(ArcadeScoreboardLine.KIT_NAME).write(C.cGray + C.Bold + "Kit"); - scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGreen + C.Bold + "Gems"); scoreboard.get(ArcadeScoreboardLine.SERVER_NAME).write(C.cAqua + C.Bold + "Server"); scoreboard.get(ArcadeScoreboardLine.SERVER_VALUE).write(_plugin.getConfig().getString("serverstatus.name")); } @@ -523,7 +522,16 @@ public class ArcadeManager extends MiniPlugin implements IRelation } scoreboard.get(ArcadeScoreboardLine.PLAYERS_VALUE).write(_gameManager.getValidPlayersForGameStart().size() + "/" + GetPlayerFull()); - scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.Get(scoreboard.getOwner()).getBalance(GlobalCurrency.GEM)); + if (GetGame() != null && GetGame().CrownsEnabled) + { + scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGold + C.Bold + "Crowns"); + scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.getCrowns(scoreboard.getOwner())); + } + else + { + scoreboard.get(ArcadeScoreboardLine.GEM_NAME).write(C.cGreen + C.Bold + "Gems"); + scoreboard.get(ArcadeScoreboardLine.GEM_VALUE).write(donationManager.Get(scoreboard.getOwner()).getBalance(GlobalCurrency.GEM)); + } if (GetGame() != null) { @@ -581,6 +589,8 @@ public class ArcadeManager extends MiniPlugin implements IRelation _trackManager = require(TrackManager.class); _titles = require(Titles.class); Titles.BOOK_SLOT = 4; + + _sheetsManager = require(GoogleSheetsManager.class); } @Override @@ -946,21 +956,21 @@ public class ArcadeManager extends MiniPlugin implements IRelation } //Recruiting else */if (_game == null || _game.GetState() == GameState.Recruit) + { + if (_game != null && _game.GetCountdown() != -1) { - if (_game != null && _game.GetCountdown() != -1) - { - event.setMotd(ChatColor.GREEN + "Starting in " + _game.GetCountdown() + " Seconds" + extrainformation); - } - else - { - event.setMotd(ChatColor.GREEN + "Recruiting" + extrainformation); - } + event.setMotd(ChatColor.GREEN + "Starting in " + _game.GetCountdown() + " Seconds" + extrainformation); } - //In Progress else { - event.setMotd(ChatColor.YELLOW + "In Progress" + extrainformation); + event.setMotd(ChatColor.GREEN + "Recruiting" + extrainformation); } + } + //In Progress + else + { + event.setMotd(ChatColor.YELLOW + "In Progress" + extrainformation); + } if (UtilServer.isTestServer(false)) event.setMotd(ChatColor.GOLD + "Private Mineplex Test Server"); @@ -2059,16 +2069,21 @@ public class ArcadeManager extends MiniPlugin implements IRelation public TrackManager getTrackManager() { - return this._trackManager; + return _trackManager; } public Titles getTitles() { - return this._titles; + return _titles; } public QuestManager getQuestManager() { return _questManager; } -} + + public GoogleSheetsManager getSheetsManager() + { + return _sheetsManager; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index 66bef53c0..27c8bde8c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -1,12 +1,13 @@ package nautilus.game.arcade; +import nautilus.game.arcade.game.games.alieninvasion.AlienInvasion; +import nautilus.game.arcade.game.games.smash.SuperSmashTraining; import org.bukkit.Material; import mineplex.core.common.MinecraftVersion; import mineplex.core.common.Pair; import mineplex.core.game.GameCategory; import mineplex.core.game.GameDisplay; - import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.games.baconbrawl.BaconBrawl; import nautilus.game.arcade.game.games.barbarians.Barbarians; @@ -25,6 +26,8 @@ import nautilus.game.arcade.game.games.build.modes.DukesOfDecoration; import nautilus.game.arcade.game.games.build.modes.TeamBuild; import nautilus.game.arcade.game.games.buildmavericks.BuildMavericks; import nautilus.game.arcade.game.games.cards.Cards; +import nautilus.game.arcade.game.games.castleassault.CastleAssault; +import nautilus.game.arcade.game.games.castleassault.CastleAssaultTDM; import nautilus.game.arcade.game.games.castlesiege.CastleSiege; import nautilus.game.arcade.game.games.champions.ChampionsCTF; import nautilus.game.arcade.game.games.champions.ChampionsDominate; @@ -130,6 +133,8 @@ public enum GameType Basketball(Basketball.class, GameDisplay.Basketball), BossBattles(BossBattles.class, GameDisplay.BossBattles), Bridge(Bridge.class, GameDisplay.Bridge), + CastleAssault(CastleAssault.class, GameDisplay.CastleAssault), + CastleAssaultTDM(CastleAssaultTDM.class, GameDisplay.CastleAssaultTDM), CastleSiege(CastleSiege.class, GameDisplay.CastleSiege), ChampionsCTF(ChampionsCTF.class, GameDisplay.ChampionsCTF), ChampionsDominate(ChampionsDominate.class, GameDisplay.ChampionsDominate), @@ -182,6 +187,7 @@ public enum GameType Smash(SoloSuperSmash.class, GameDisplay.Smash), SmashDomination(SuperSmashDominate.class, GameDisplay.SmashDomination), SmashTeams(TeamSuperSmash.class, GameDisplay.SmashTeams, new GameType[]{GameType.Smash}, false), + SmashTraining(SuperSmashTraining.class, GameDisplay.SmashTraining), Snake(Snake.class, GameDisplay.Snake), SneakyAssassins(SneakyAssassins.class, GameDisplay.SneakyAssassins), SnowFight(SnowFight.class, GameDisplay.SnowFight), @@ -223,7 +229,9 @@ public enum GameType BouncyBalls(BouncyBalls.class, GameDisplay.BouncyBalls), Valentines(Valentines.class, GameDisplay.Valentines), - + + AlienInvasion(AlienInvasion.class, GameDisplay.AlienInvasion), + Event(EventGame.class, GameDisplay.Event, new GameType[]{ GameType.BaconBrawl, GameType.Barbarians, GameType.Bridge, GameType.Build, GameType.Build, GameType.Cards, GameType.CastleSiege, GameType.ChampionsDominate, GameType.ChampionsTDM, GameType.Christmas, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 5e8c129c9..259e84a0b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -1,27 +1,61 @@ package nautilus.game.arcade.game; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; - +import com.google.common.collect.Lists; +import com.mojang.authlib.GameProfile; +import mineplex.core.Managers; +import mineplex.core.antihack.AntiHack; +import mineplex.core.arcadeevents.CoreGameStartEvent; +import mineplex.core.arcadeevents.CoreGameStopEvent; +import mineplex.core.command.CommandCenter; +import mineplex.core.common.Rank; +import mineplex.core.common.util.*; +import mineplex.core.disguise.disguises.DisguisePlayer; +import mineplex.core.elo.EloPlayer; +import mineplex.core.elo.EloTeam; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.lifetimes.Lifetimed; +import mineplex.core.lifetimes.ListenerComponent; +import mineplex.core.lifetimes.PhasedLifetime; +import mineplex.core.packethandler.IPacketHandler; +import mineplex.core.packethandler.PacketInfo; +import mineplex.core.quests.event.QuestInteractEvent; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilGameProfile; +import mineplex.minecraft.game.classcombat.event.ClassCombatCreatureAllowSpawnEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import nautilus.game.arcade.ArcadeFormat; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.events.PlayerGameRespawnEvent; +import nautilus.game.arcade.events.PlayerStateChangeEvent; +import nautilus.game.arcade.game.GameTeam.PlayerState; +import nautilus.game.arcade.game.games.build.Build; +import nautilus.game.arcade.game.games.draw.Draw; +import nautilus.game.arcade.game.games.speedbuilders.SpeedBuilders; +import nautilus.game.arcade.game.modules.AntiExpOrbModule; +import nautilus.game.arcade.game.modules.Module; +import nautilus.game.arcade.kit.*; +import nautilus.game.arcade.managers.chat.ChatStatData; +import nautilus.game.arcade.managers.lobby.LobbyManager; +import nautilus.game.arcade.quest.ChestOpenQuestTracker; +import nautilus.game.arcade.quest.CollectQuestTracker; +import nautilus.game.arcade.quest.KillEntityQuestTracker; +import nautilus.game.arcade.quest.KillQuestTracker; +import nautilus.game.arcade.quest.ParticipateQuestTracker; +import nautilus.game.arcade.quest.PlayGameQuestTracker; +import nautilus.game.arcade.quest.QuestTracker; +import nautilus.game.arcade.quest.WinQuestTracker; +import nautilus.game.arcade.scoreboard.GameScoreboard; +import nautilus.game.arcade.stats.*; +import nautilus.game.arcade.wineffect.WinEffectManager; +import nautilus.game.arcade.world.WorldData; import net.minecraft.server.v1_8_R3.EntityItem; import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity; - import org.apache.commons.lang3.tuple.Triple; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; @@ -41,88 +75,12 @@ import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.world.WorldLoadEvent; -import org.bukkit.inventory.PlayerInventory; import org.bukkit.scoreboard.NameTagVisibility; import org.bukkit.scoreboard.Team; import org.bukkit.util.Vector; -import com.google.common.collect.Lists; -import com.mojang.authlib.GameProfile; - -import mineplex.core.Managers; -import mineplex.core.antihack.AntiHack; -import mineplex.core.arcadeevents.CoreGameStartEvent; -import mineplex.core.arcadeevents.CoreGameStopEvent; -import mineplex.core.command.CommandCenter; -import mineplex.core.common.Rank; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.NautHashMap; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTabTitle; -import mineplex.core.common.util.UtilTextMiddle; -import mineplex.core.common.util.UtilTime; -import mineplex.core.disguise.disguises.DisguisePlayer; -import mineplex.core.elo.EloPlayer; -import mineplex.core.elo.EloTeam; -import mineplex.core.itemstack.ItemBuilder; -import mineplex.core.lifetimes.Lifetimed; -import mineplex.core.lifetimes.ListenerComponent; -import mineplex.core.lifetimes.PhasedLifetime; -import mineplex.core.packethandler.IPacketHandler; -import mineplex.core.packethandler.PacketInfo; -import mineplex.core.quests.event.QuestInteractEvent; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.core.utils.UtilGameProfile; -import mineplex.minecraft.game.classcombat.event.ClassCombatCreatureAllowSpawnEvent; -import mineplex.minecraft.game.core.combat.DeathMessageType; -import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; - -import nautilus.game.arcade.ArcadeFormat; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.events.PlayerGameRespawnEvent; -import nautilus.game.arcade.events.PlayerStateChangeEvent; -import nautilus.game.arcade.game.GameTeam.PlayerState; -import nautilus.game.arcade.game.games.build.Build; -import nautilus.game.arcade.game.games.draw.Draw; -import nautilus.game.arcade.game.games.speedbuilders.SpeedBuilders; -import nautilus.game.arcade.game.modules.AntiExpOrbModule; -import nautilus.game.arcade.game.modules.Module; -import nautilus.game.arcade.kit.ChampionsKit; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.KitAvailability; -import nautilus.game.arcade.kit.Perk; -import nautilus.game.arcade.kit.ProgressingKit; -import nautilus.game.arcade.managers.chat.ChatStatData; -import nautilus.game.arcade.managers.lobby.LobbyManager; -import nautilus.game.arcade.quest.ChestOpenQuestTracker; -import nautilus.game.arcade.quest.CollectQuestTracker; -import nautilus.game.arcade.quest.KillEntityQuestTracker; -import nautilus.game.arcade.quest.KillQuestTracker; -import nautilus.game.arcade.quest.ParticipateQuestTracker; -import nautilus.game.arcade.quest.PlayGameQuestTracker; -import nautilus.game.arcade.quest.QuestTracker; -import nautilus.game.arcade.quest.WinQuestTracker; -import nautilus.game.arcade.scoreboard.GameScoreboard; -import nautilus.game.arcade.stats.AssistsStatTracker; -import nautilus.game.arcade.stats.DamageDealtStatTracker; -import nautilus.game.arcade.stats.DamageTakenStatTracker; -import nautilus.game.arcade.stats.DeathsStatTracker; -import nautilus.game.arcade.stats.ExperienceStatTracker; -import nautilus.game.arcade.stats.GamesPlayedStatTracker; -import nautilus.game.arcade.stats.KillsStatTracker; -import nautilus.game.arcade.stats.LoseStatTracker; -import nautilus.game.arcade.stats.StatTracker; -import nautilus.game.arcade.stats.WinStatTracker; -import nautilus.game.arcade.wineffect.WinEffectManager; -import nautilus.game.arcade.world.WorldData; +import java.util.*; +import java.util.Map.Entry; public abstract class Game extends ListenerComponent implements Lifetimed { @@ -261,6 +219,8 @@ public abstract class Game extends ListenerComponent implements Lifetimed public boolean WorldSoilTrample = false; public boolean WorldBoneMeal = false; public boolean WorldChunkUnload = false; + + public boolean AllowFlintAndSteel = false; public int HungerSet = -1; public int HealthSet = -1; @@ -325,6 +285,8 @@ public abstract class Game extends ListenerComponent implements Lifetimed public final ChatStatData BlankLine = new ChatStatData().blankLine(); // Gems + public boolean CrownsEnabled = false; + public double GemMultiplier = 1; public boolean GemHunterEnabled = true; public boolean GemBoosterEnabled = true; @@ -343,6 +305,7 @@ public abstract class Game extends ListenerComponent implements Lifetimed public Location SpectatorSpawn = null; public boolean FirstKill = true; + public int FirstKillReward = 10; public String Winner = "Nobody"; public GameTeam WinnerTeam = null; @@ -2501,8 +2464,8 @@ public abstract class Game extends ListenerComponent implements Lifetimed public void cleanupCommands() { - this._debugCommands.forEach(command -> CommandCenter.Instance.removeCommand(command)); - this._debugCommands.clear(); + _debugCommands.forEach(command -> CommandCenter.Instance.removeCommand(command)); + _debugCommands.clear(); } public T getModule(Class clazz) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java new file mode 100644 index 000000000..ffe7e847f --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Alien.java @@ -0,0 +1,101 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.utils.UtilVariant; +import nautilus.game.arcade.ArcadeManager; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftLivingEntity; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +public class Alien +{ + + private static final int RADIUS = 3; + private static final ItemStack BLASTER = new ItemStack(Material.DIAMOND_BARDING); + private static final ItemStack HELMET = new ItemStack(Material.GLASS); + + private final ArcadeManager _manager; + private ArmorStand _stand; + private Skeleton _skeleton; + private Location _center; + + private double _theta; + + public Alien(ArcadeManager manager, Location location) + { + _manager = manager; + _stand = location.getWorld().spawn(location, ArmorStand.class); + _skeleton = UtilVariant.spawnWitherSkeleton(location); + _center = location; + + _stand.setSmall(true); + _stand.setVisible(false); + _stand.setGravity(false); + _stand.setPassenger(_skeleton); + _stand.setRemoveWhenFarAway(false); + + _skeleton.setMaxHealth(3); + _skeleton.setRemoveWhenFarAway(false); + + EntityEquipment equipment = _skeleton.getEquipment(); + equipment.setItemInHand(BLASTER); + equipment.setHelmet(HELMET); + + UtilEnt.silence(_stand, true); + UtilEnt.vegetate(_skeleton); + + _theta = Math.random(); + } + + public void update() + { + double x = RADIUS * Math.cos(_theta); + double z = RADIUS * Math.sin(_theta); + + _center.add(x, 0, z); + ((CraftLivingEntity) _stand).getHandle().setPosition(_center.getX(), _center.getY(), _center.getZ()); + _center.subtract(x, 0, z); + + _theta += Math.PI / 30; + + if (Math.random() < 0.9) + { + return; + } + + Vector last = null; + + for (Player player : UtilPlayer.getNearby(_skeleton.getLocation(), 20)) + { + last = UtilAlg.getTrajectory(_skeleton.getEyeLocation(), player.getEyeLocation()); + + new PhaserProjectile(_manager, _skeleton, last); + } + + if (last != null) + { + UtilEnt.CreatureLook(_skeleton, last); + } + } + + public boolean isValid() + { + boolean remove = !_stand.isValid() || !_skeleton.isValid(); + + if (remove) + { + _stand.remove(); + _skeleton.remove(); + } + + return !remove; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java new file mode 100644 index 000000000..a89a178f4 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/AlienInvasion.java @@ -0,0 +1,502 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.ExperienceOrb; +import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.entity.ItemSpawnEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scoreboard.Team; + +import mineplex.core.common.Pair; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.titles.tracks.Track; +import mineplex.core.titles.tracks.TrackManager; +import mineplex.core.titles.tracks.award.AlienInvasionTrack; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilVariant; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.events.PlayerKitGiveEvent; +import nautilus.game.arcade.game.SoloGame; +import nautilus.game.arcade.game.games.alieninvasion.kit.KitPlayer; +import nautilus.game.arcade.game.games.dragonescape.DragonScore; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; + +public class AlienInvasion extends SoloGame +{ + + private static final String[] DESCRIPTION = { + "You've been captured by Aliens!", + "Parkour your way to the end.", + "Use the Paintball Gun to kill Aliens.", + "Watch out for UFOs!" + }; + private static final Comparator SCORE_SORTER = (o1, o2) -> + { + if (o1.Score > o2.Score) + { + return 1; + } + else if (o1.Score < o2.Score) + { + return -1; + } + + return 0; + }; + private static final String GAME_COMPLETED_STAT = "Alien Invasion Chest Given"; + + private final List _sources = new ArrayList<>(); + private final List _targets = new ArrayList<>(); + private final ArrayList _path = new ArrayList<>(); + + private int _lastBeamId; + private long _lastBeam; + private long _nextBeam; + + private final List _score = new ArrayList<>(16); + + private final Set _aliens = new HashSet<>(); + + public AlienInvasion(ArcadeManager manager) + { + super(manager, GameType.AlienInvasion, new Kit[]{new KitPlayer(manager)}, DESCRIPTION); + + WorldTimeSet = 18000; + DamagePvP = false; + DamageFall = false; + HungerSet = 20; + + manager.GetCreature().SetDisableCustomDrops(true); + + new CompassModule() + .register(this); + + for (World world : Bukkit.getWorlds()) + { + world.setTime(18000); + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST || !InProgress()) + { + return; + } + + Scoreboard.writeNewLine(); + + sortScores(); + + Scoreboard.writeGroup(_score.subList(0, Math.min(14, _score.size())), score -> + { + ChatColor col = IsAlive(score.Player) ? ChatColor.GREEN : ChatColor.RED; + return Pair.create(col + score.Player.getName(), (int) score.Score); + }, true); + + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public void ParseData() + { + // Setup all Beam Sources + List sources = WorldData.GetDataLocs("LIME"); + + for (Location location : sources) + { + _sources.add(new BeamSource(location)); + } + + Location start = WorldData.GetDataLocs("RED").get(0); + Location last = start; + List targets = WorldData.GetDataLocs("BLACK"); + ArrayList path = new ArrayList<>(); + path.addAll(targets); + path.addAll(WorldData.GetDataLocs("BROWN")); + + while (!path.isEmpty()) + { + Location closestPath = UtilAlg.findClosest(last, path); + + if (targets.contains(closestPath)) + { + _targets.add(closestPath); + } + + _path.add(closestPath); + path.remove(closestPath); + last = closestPath; + } + + int id = 0; + + for (Location target : _targets) + { + BeamSource source = getClosestSource(target); + + source.addBeam(Manager, id++, target); + } + } + + private BeamSource getClosestSource(Location location) + { + BeamSource best = null; + double bestDist = Double.MAX_VALUE; + + for (BeamSource source : _sources) + { + double dist = UtilMath.offsetSquared(source.getSource(), location); + + if (best == null || dist < bestDist) + { + best = source; + bestDist = dist; + } + } + + return best; + } + + @EventHandler + public void prepare(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + { + return; + } + + for (Player player : GetPlayers(true)) + { + _score.add(new DragonScore(player, 0)); + } + + for (Team team : Scoreboard.getHandle().getTeams()) + { + team.setCanSeeFriendlyInvisibles(true); + } + } + + @EventHandler + public void live(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Live) + { + return; + } + + _lastBeam = System.currentTimeMillis(); + _nextBeam = 10000; + + for (Player player : GetPlayers(true)) + { + player.sendMessage(F.main("Game", C.cYellow + "Double Tab Space to use your double jump!")); + } + + ItemStack glass = new ItemStack(Material.GLASS); + + CreatureAllowOverride = true; + for (Location location : WorldData.GetDataLocs("BLUE")) + { + Skeleton skeleton = UtilVariant.spawnWitherSkeleton(location); + + skeleton.setMaxHealth(4); + skeleton.getEquipment().setHelmet(glass); + } + + for (Location location : WorldData.GetDataLocs("LIGHT_BLUE")) + { + _aliens.add(new Alien(Manager, location)); + } + CreatureAllowOverride = false; + } + + @EventHandler + public void invisibility(PlayerKitGiveEvent event) + { + Manager.GetCondition().Factory().Invisible(GetName(), event.getPlayer(), event.getPlayer(), 40, 0, false, false, false); + } + + @EventHandler + public void updateAliens(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK || !IsLive()) + { + return; + } + + for (Alien alien : _aliens) + { + alien.update(); + } + + _aliens.removeIf(alien -> !alien.isValid()); + } + + @EventHandler + public void updateBeam(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST || !IsLive()) + { + return; + } + + Beam beam = getSuitableBeam(); + + if (beam == null) + { + return; + } + + _lastBeam = System.currentTimeMillis(); + _nextBeam -= 100; + _lastBeamId++; + + Manager.runSyncTimer(new BukkitRunnable() + { + @Override + public void run() + { + if (beam.update()) + { + for (Entry entry : UtilPlayer.getInRadius(beam.getLastLocation(), 20).entrySet()) + { + Manager.GetDamage().NewDamageEvent(entry.getKey(), null, null, DamageCause.CUSTOM, 20 * entry.getValue(), false, true, false, GetName(), "Photon Torpedo"); + } + + int killIfBefore = 0; + + for (int i = 0; i < _path.size(); i++) + { + if (UtilMath.offsetSquared(beam.getLastLocation(), _path.get(i++)) < 25) + { + killIfBefore = i; + break; + } + } + + for (DragonScore score : _score) + { + if (score.Score <= killIfBefore) + { + Manager.GetDamage().NewDamageEvent(score.Player, null, null, DamageCause.CUSTOM, 9999, false, true, false, GetName(), "Photon Torpedo"); + } + } + + cancel(); + } + } + }, 0, 2); + } + + private Beam getSuitableBeam() + { + if (!UtilTime.elapsed(_lastBeam, _nextBeam)) + { + return null; + } + + for (BeamSource beamSource : _sources) + { + Beam beam = beamSource.getFromId(_lastBeamId); + + if (beam != null) + { + return beam; + } + } + + return null; + } + + @EventHandler + public void updatePlayerTracker(UpdateEvent event) + { + if (event.getType() != UpdateType.FASTEST || !IsLive()) + { + return; + } + + for (Player player : GetPlayers(true)) + { + DragonScore score = getScore(player); + double currentScore = score.Score; + int newScore = 0; + Location location = UtilAlg.findClosest(player.getLocation(), _path); + + if (UtilMath.offsetSquared(player.getLocation(), location) > 100) + { + break; + } + + for (int i = 0; i < _path.size(); i++) + { + Location a = _path.get(i); + + if (location.equals(a)) + { + newScore = i; + } + } + + if (newScore > currentScore) + { + score.Score = newScore; + + // Reward title + if (score.Score == _path.size() - 1) + { + if (Manager.GetStatsManager().Get(player).getStat(GAME_COMPLETED_STAT) == 0) + { + Manager.GetStatsManager().incrementStat(player, GAME_COMPLETED_STAT, 1); + + Manager.getInventoryManager().addItemToInventory(success -> + { + if (success) + { + player.sendMessage(F.main("Game", "Unlocked 1 " + C.cAqua + "Omega Chest" + C.mBody + ".")); + } + else + { + player.sendMessage(F.main("Game", "Failed to give you your Omega Chest, you should inform a staff member!")); + } + + }, player, "Omega Chest", 1); + } + + TrackManager trackManager = Manager.getTrackManager(); + Track track = trackManager.getTrack(AlienInvasionTrack.class); + + if (trackManager.hasTrack(player, track)) + { + continue; + } + + trackManager.unlockTrack(player, track, result -> + { + switch (result) + { + case UNKNOWN_ERROR: + player.sendMessage(F.main("Game", "Oops, somehow I could not give you the title track, you should inform a staff member!")); + break; + case SUCCESS: + player.sendMessage(F.main("Game", "Unlocked " + track.getColor() + track.getLongName() + C.mBody + " Title!")); + break; + } + }); + } + } + } + } + + @EventHandler + public void itemSpawn(ItemSpawnEvent event) + { + if (!IsLive()) + { + return; + } + + event.setCancelled(true); + } + + @EventHandler + public void entitySpawn(EntitySpawnEvent event) + { + if (event.getEntity() instanceof ExperienceOrb) + { + event.setCancelled(true); + } + } + + @Override + public void EndCheck() + { + if (!IsLive()) + { + return; + } + + List alive = GetPlayers(true); + + for (DragonScore score : _score) + { + if (score.Score == _path.size() - 1 || alive.isEmpty()) + { + sortScores(); + List players = new ArrayList<>(_score.size()); + + for (DragonScore score1 : _score) + { + AddGems(score1.Player, score1.Score, "Map Progress", false, false); + players.add(score1.Player); + } + + Collections.reverse(players); + AnnounceEnd(players); + SetState(GameState.End); + return; + } + } + } + + private void sortScores() + { + _score.sort(SCORE_SORTER); + } + + private DragonScore getScore(Player player) + { + for (DragonScore score : _score) + { + if (score.Player.equals(player)) + { + return score; + } + } + + return null; + } + + @Override + public Location GetSpectatorLocation() + { + if (SpectatorSpawn == null) + { + return new Location(WorldData.World, 0, 158, 0); + } + + return SpectatorSpawn; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java new file mode 100644 index 000000000..bfbff6594 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/Beam.java @@ -0,0 +1,65 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.particles.effects.LineParticle; +import nautilus.game.arcade.ArcadeManager; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; + +import java.util.Set; + +public class Beam extends LineParticle +{ + + private static final int EXPLOSION_RADIUS = 20; + private static final int BEAM_BLOCK_TIME = 1500; + + private final ArcadeManager _manager; + private final Location _target; + private final int _id; + + public Beam(ArcadeManager manager, int id, BeamSource source, Location target) + { + super(source.getSource(), target, null, 1, Integer.MAX_VALUE, null, ParticleType.FIREWORKS_SPARK, UtilServer.getPlayers()); + + _manager = manager; + _id = id; + _target = target; + } + + @Override + public boolean update() + { + super.update(); + Location last = getLastLocation(); + boolean hit = UtilMath.offset(last, _target) < 5; + + if (hit) + { + last.getWorld().playSound(last, Sound.EXPLODE, 2f, 0.75f); + UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, last, 4, 1, 4, 0.5F, 10, ViewDist.LONG); + + Set blocks = UtilBlock.getInRadius(last, EXPLOSION_RADIUS).keySet(); + //blocks.removeIf(block -> block.getRelative(BlockFace.DOWN).getType() == Material.AIR); + + blocks.forEach(block -> MapUtil.QuickChangeBlockAt(block.getLocation(), Material.AIR)); + } + else + { + last.getWorld().playSound(last, Sound.ZOMBIE_REMEDY, 2f, 0.75f); + _manager.GetBlockRestore().add(last.getBlock(), Material.SEA_LANTERN.getId(), (byte) 0, BEAM_BLOCK_TIME); + } + + return hit; + } + + public int getId() + { + return _id; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/BeamSource.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/BeamSource.java new file mode 100644 index 000000000..9d796b99d --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/BeamSource.java @@ -0,0 +1,43 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import nautilus.game.arcade.ArcadeManager; +import org.bukkit.Location; + +import java.util.ArrayList; +import java.util.List; + +public class BeamSource +{ + + private final Location _source; + private final List _beams; + + BeamSource(Location source) + { + _source = source; + _beams = new ArrayList<>(5); + } + + public void addBeam(ArcadeManager manager, int id, Location target) + { + _beams.add(new Beam(manager, id, this, target)); + } + + public Location getSource() + { + return _source; + } + + public Beam getFromId(int id) + { + for (Beam beam : _beams) + { + if (beam.getId() == id) + { + return beam; + } + } + + return null; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java new file mode 100644 index 000000000..4d9c61e4b --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/PhaserProjectile.java @@ -0,0 +1,89 @@ +package nautilus.game.arcade.game.games.alieninvasion; + +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilServer; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeManager; +import org.bukkit.Sound; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Snowball; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.util.Vector; + +public class PhaserProjectile implements Listener +{ + + private static final int SHARDS_PER_HIT = 5; + + private ArcadeManager _manager; + private Projectile _projectile; + + public PhaserProjectile(ArcadeManager manager, LivingEntity player) + { + this(manager, player, player.getLocation().getDirection()); + } + + public PhaserProjectile(ArcadeManager manager, LivingEntity player, Vector direction) + { + _manager = manager; + + _projectile = player.launchProjectile(Snowball.class); + _projectile.setVelocity(direction.multiply(2)); + + UtilServer.RegisterEvents(this); + } + + @EventHandler + public void damage(CustomDamageEvent event) + { + if (_projectile == null || event.GetProjectile() == null || !event.GetProjectile().equals(_projectile) || event.GetReason() != null && event.GetReason().contains("Blaster")) + { + return; + } + + Projectile projectile = event.GetProjectile(); + LivingEntity damagee = event.GetDamageeEntity(); + Player damager = event.GetDamagerPlayer(true); + + if (event.GetDamagerEntity(true) instanceof Player) + { + if (damagee instanceof Player) + { + projectile.remove(); + return; + } + + _manager.GetGame().AddGems(damager, SHARDS_PER_HIT, "Aliens Hit", false, true); + damager.playSound(damager.getLocation(), Sound.CHICKEN_EGG_POP, 1, 0.7F); + } + + event.SetCancelled("Blaster Snowball"); + + UtilParticle.PlayParticle(ParticleType.CLOUD, projectile.getLocation(), 0.5F, 0.5F, 0.5F, 0.05F, 5, ViewDist.NORMAL); + _manager.GetDamage().NewDamageEvent(damagee, damager, projectile, DamageCause.CUSTOM, 3, false, true, true, UtilEnt.getName(damager), "Blaster"); + UtilServer.Unregister(this); + } + + @EventHandler + public void cleanup(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + { + return; + } + + if (_projectile == null || _projectile.isDead() || !_projectile.isValid()) + { + UtilServer.Unregister(this); + } + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java new file mode 100644 index 000000000..eeb707bf6 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/KitPlayer.java @@ -0,0 +1,41 @@ +package nautilus.game.arcade.game.games.alieninvasion.kit; + +import mineplex.core.common.util.C; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkDoubleJump; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class KitPlayer extends Kit +{ + + private static final Perk[] PERKS = { + new PerkDoubleJump("Leap", 1, 1, true, 10000, true), + new PerkBlaster() + }; + + private static final ItemStack[] PLAYER_ITEMS = { + new ItemBuilder(Material.DIAMOND_BARDING) + .setTitle(C.cBlue + C.Scramble + "ABC " + C.cAqua + "Super Snow Blaster 3000" + C.cBlue + C.Scramble + " ABC") + .build() + }; + + private static final ItemStack IN_HAND = new ItemStack(Material.DIAMOND_BARDING); + + public KitPlayer(ArcadeManager manager) + { + super(manager, "Player", KitAvailability.Free, new String[0], PERKS, EntityType.SKELETON, IN_HAND); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().addItem(PLAYER_ITEMS); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/PerkBlaster.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/PerkBlaster.java new file mode 100644 index 000000000..9e11a80d5 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/alieninvasion/kit/PerkBlaster.java @@ -0,0 +1,58 @@ +package nautilus.game.arcade.game.games.alieninvasion.kit; + +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.recharge.Recharge; +import nautilus.game.arcade.game.games.alieninvasion.PhaserProjectile; +import nautilus.game.arcade.kit.Perk; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; + +public class PerkBlaster extends Perk +{ + + public PerkBlaster() + { + super("Space Blaster", new String[0]); + } + + @EventHandler + public void interact(PlayerInteractEvent event) + { + if (event.isCancelled()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + if (UtilBlock.usable(event.getClickedBlock())) + { + return; + } + + Player player = event.getPlayer(); + + if (event.getItem() == null || event.getItem().getType() != Material.DIAMOND_BARDING) + { + return; + } + + if (!hasPerk(player)) + { + return; + } + + if (!Recharge.Instance.use(player, GetName(), 200, false, false)) + { + return; + } + + new PhaserProjectile(Manager, player); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java index 1a0458b5d..1a9bb27c5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java @@ -239,7 +239,38 @@ public class Build extends Game "Clown", "Windmill", "Alligator", "Police", "Igloo", "Gift", "Bumblebee", "Jellyfish", "Speedboat", "Fall", "Summer", "Autumn", "Winter", "Disco", "Moose", - "Water Gun", "Astronaut", "Wither", "Meteor" + "Water Gun", "Astronaut", "Wither", "Meteor", + "Airplane", "Alarm clock", "Alien", "Alligator", "Ant", "Apple", "Arm", "Autumn", "Baby", "Ball", + "Balloon", "Banana", "Barn", "Base", "Baseball", "Basketball", "Bat", "Bathroom", "Battery", "Beach", + "Bear", "Beaver", "Bed", "Beehive", "Bell", "Bicycle", "Bike", "Bird", "Birthday cake", "Blocks", + "Boat", "Bone", "Book", "Boot", "Bottle", "Bowtie", "Boy", "Bracelet", "Brain", "Branch", + "Bread", "Bridge", "Bubble", "Bug", "Bunny", "Bus", "Cage", "Cake", "Camera", "Cape", + "Carrot", "Castle", "Cat", "Cave", "Chair", "Chalk", "Cheek", "Cheese", "Cheeseburger", "Cherry", + "Chess", "Chicken", "Chin", "Christmas", "Circle", "Circus", "Clock", "Cloud", "Coal", "Coat", + "Coconut", "Computer", "Cone", "Cookie", "Corn", "Cow", "Crab", "Crib", "Cup", "Cupcake", + "Desert", "Desk", "Dinosaur", "Dog", "Doll", "Dominoes", "Door", "Doormat", "Drum", "Duck", + "Ear", "Ears", "Egg", "Electricity", "Elephant", "Eraser", "Eyes", "Face", "Farm", "Fishing pole", + "Fist", "Flamingo", "Flashlight", "Flower", "Flute", "Fly", "Football", "Forest", "Fountain", "Frenchfries", + "Frog", "Garbage", "Garden", "Gate", "Ghost", "Gingerbread man", "Giraffe", "Girl", "Glasses", "Grapes", + "Grass", "Graveyard", "Hair dryer", "Halloween", "Hat", "Head", "Heart", "Hippo", "Hockey", "Hook", + "Hopscotch", "Horse", "Hospital", "House", "Hula hoop", "Ice", "Icecream", "Jacket", "Jar", "Jellyfish", + "Jungle", "Kangaroo", "Key", "Kitchen", "Kite", "Knot", "Lamp", "Lawnmower", "Leaf", "Light", + "Lightbulb", "Lighthouse", "Lightsaber", "Lips", "Lipstick", "Lobster", "Lollipop", "Mail", "Mailman", "Mattress", + "Milk", "Money", "Monkey", "Moon", "Mosquito", "Mouse", "Mouth", "Muffin", "Mushroom", "Music", + "Nail", "Newspaper", "Nightmare", "Nose", "Ocean", "Orange", "Owl", "Pajamas", "Palace", "Park", + "Party", "Peach", "Peanut", "Pen", "Pencil", "Penguin", "Person", "Photograph", "Piano", "Pie", + "Pig", "Pillow", "Pineapple", "Ping pong", "Pinwheel", "Pirate", "Pizza", "Plate", "Pool Party", "Popcorn", + "Popsicle", "Potato", "Pretzel", "Prison", "Puppet", "Purse", "Queen", "Rain", "Rainbow", "Restaurant", + "Rhinoceros", "Ring", "River", "Road", "Robot", "Rocket", "Rocking chair", "Roof", "Round", "Rug", + "Ruins", "Saddle", "Sailboat", "Salt and pepper", "Scale", "School", "Scissors", "Seahorse", "Seashell", "Seesaw", + "Shark", "Sheep", "Shirt", "Shoe", "Shopping cart", "Shovel", "Skate", "Skateboard", "Ski", "Skirt", + "Slide", "Smile", "Snail", "Snake", "Snowball", "Snowflake", "Snowman", "Soap", "Socks", "Soda", + "Song", "Spaceship", "Spider", "Spider web", "Spoon", "Spring", "Stage", "Stairs", "Star", "State", + "Statue", "Stingray", "Stoplight", "Storm", "Suitcase", "Summer", "Sun", "Sunflower", "Swimming pool", "Swing", + "Swordfish", "Tail", "Taxi", "Teapot", "Telephone", "Thief", "Toast", "Toothbrush", "Torch", "Treasure", + "Tree", "Truck", "Trumpet", "Turtle", "TV", "Vest", "Violin", "Volcano", "Washing machine", "Water", + "Waterfall", "Watering can", "Whale", "Whisk", "Whistle", "Windmill", "Winter", "Worm", "Wrench", "Yo-yo", + "Zoo", }; _christmasWords = new String[] diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java new file mode 100644 index 000000000..9d651ad84 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssault.java @@ -0,0 +1,1493 @@ +package nautilus.game.arcade.game.games.castleassault; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.WeakHashMap; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Chest; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.EnderCrystal; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Entity; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Painting; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.entity.Zombie; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFormEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.ItemDespawnEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Dispenser; +import org.bukkit.material.MaterialData; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.util.Vector; + +import mineplex.core.Managers; +import mineplex.core.common.Pair; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTextBottom; +import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.leaderboard.Leaderboard; +import mineplex.core.leaderboard.LeaderboardManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; +import mineplex.core.loot.ChestLoot; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.FirstBloodEvent; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.GemData; +import nautilus.game.arcade.game.TeamGame; +import nautilus.game.arcade.game.games.castleassault.data.KillStreakData; +import nautilus.game.arcade.game.games.castleassault.data.ObjectiveTNTSpawner; +import nautilus.game.arcade.game.games.castleassault.data.TeamCrystal; +import nautilus.game.arcade.game.games.castleassault.data.TeamKing; +import nautilus.game.arcade.game.games.castleassault.kits.KitArcher; +import nautilus.game.arcade.game.games.castleassault.kits.KitDemolitionist; +import nautilus.game.arcade.game.games.castleassault.kits.KitFighter; +import nautilus.game.arcade.game.games.castleassault.kits.KitPlayer; +import nautilus.game.arcade.game.games.castleassault.kits.KitTank; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; + +public class CastleAssault extends TeamGame +{ + private static final int MAX_FLINT_AND_STEEL_USES = 4; + private static final int ITEMS_PER_CHEST = 5; + private static final long TIME_TILL_REFILL = 2 * 60 * 1000; + + private long _lastRefill; + + private ItemBuilder _flintAndSteel; + private ItemBuilder _wearableTnt; + + private Map _streakData = new WeakHashMap<>(); + private Map> _crystals = new HashMap<>(); + private Map _kings = new HashMap<>(); + private List _tntCarry = new ArrayList<>(); + + private List _chests = new ArrayList<>(); + + private ChestLoot _rangedGear = new ChestLoot(true); + private ChestLoot _rodsAndGaps = new ChestLoot(true); + private ChestLoot _potionGearCommon = new ChestLoot(true); + private ChestLoot _potionGearRare = new ChestLoot(true); + private ChestLoot _miscGear = new ChestLoot(); + + private ObjectiveTNTSpawner _tntSpawner; + private Map _teamKills = new HashMap<>(); + + private boolean _writeScoreboard = true; + + private boolean _killsAreObjective = false; + + @SuppressWarnings("deprecation") + public CastleAssault(ArcadeManager manager) + { + super(manager, GameType.CastleAssault, + new Kit[] + { + //new KitAlchemist(manager), + new KitArcher(manager), + new KitDemolitionist(manager), + //new KitEnchanter(manager), + new KitFighter(manager), + //new KitHardline(manager), + //new KitNinja(manager), + new KitTank(manager) + }, + new String[] + { + "Destroy enemy sentry crystals with running TNT", + "After the crystals are destroyed you must slay their king", + "First team to kill the enemy king wins", + "Chests refill every 2 minutes", + "TNT Respawns every 1 minute" + } + ); + + _help = new String[] + { + "Use the TNT spawning platforms to run TNT to the enemy crystals to destroy them!", + "The enemy king is invulnerable until you destroy the two sentry crystals on each sentry tower", + "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", + "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" + }; + + this.StrictAntiHack = true; + this.HungerSet = 20; + this.DeathOut = false; + this.DeathSpectateSecs = 5; + this.CreatureAllow = false; + this.DeathDropItems = false; + this.WorldWeatherEnabled = false; + this.AllowParticles = false; + this.SoupEnabled = false; + this.InventoryClick = true; + this.InventoryOpenChest = true; + this.InventoryOpenBlock = true; + this.ItemDrop = true; + this.ItemPickup = true; + this.AllowFlintAndSteel = true; + this.BlockPlaceAllow.add(Material.FIRE.getId()); + this.CrownsEnabled = true; + this.FirstKillReward = 20; + this.GemKillDeathRespawn = 1; + this.GameTimeout = -1; + + new CompassModule() + .setGiveCompass(true) + .setGiveCompassToSpecs(true) + .setGiveCompassToAlive(false) + .register(this); + + _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); + _wearableTnt = new ItemBuilder(Material.TNT).setTitle(C.cRed + "TNT").addLore(C.cRedB + "Right Click with Weapon to " + F.name("Detonate")); + generateLoot(); + + if (manager.IsRewardStats()) + { + if (manager.GetLobby() instanceof NewGameLobbyManager) + { + Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); + if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault.Wins"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULT_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault.Kills"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); + } + } + } + } + + private void generateLoot() + { + { + _rangedGear.addLoot(new ItemStack(Material.BOW), 3); + _rangedGear.addLoot(Material.ARROW, 3, 8, 16); + } + { + _rodsAndGaps.addLoot(new ItemStack(Material.FISHING_ROD), 3); + _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); + } + { + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)8194).build(), 2); + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); + } + { + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); + } + { + _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); + _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); + _miscGear.addLoot(_flintAndSteel.build(), 2); + _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); + } + } + + private void fillChest(Block block) + { + if (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST) + { + return; + } + Chest chest = (Chest) block.getState(); + + chest.getBlockInventory().clear(); + int[] slots = UtilMath.random.ints(ITEMS_PER_CHEST, 0, chest.getBlockInventory().getSize()).toArray(); + + for (int slot : slots) + { + double chance = UtilMath.random.nextDouble(); + double subChance = UtilMath.random.nextDouble(); + + ChestLoot loot = _miscGear; + if (chance <= 0.6) + { + loot = _rodsAndGaps; + } + if (chance <= 0.5) + { + loot = _potionGearCommon; + if (subChance <= 0.45) + { + loot = _potionGearRare; + } + } + if (chance <= 0.3) + { + loot = _rangedGear; + } + chest.getBlockInventory().setItem(slot, loot.getLoot()); + } + } + + public ItemStack getNewFlintAndSteel(boolean kitItem) + { + if (kitItem) + { + return _flintAndSteel.clone().setLore(C.cGold + "Kit Item").build(); + } + return _flintAndSteel.build(); + } + + public void writeScoreboard() + { + if (!_writeScoreboard) + { + return; + } + Scoreboard.reset(); + Scoreboard.write(C.cDRedB + GetName()); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "Chest Refill"); + long refillTime = _lastRefill + TIME_TILL_REFILL - System.currentTimeMillis(); + if (!IsLive()) + { + refillTime = TIME_TILL_REFILL; + } + Scoreboard.write(UtilTime.MakeStr(refillTime)); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "TNT Spawn"); + long tntTime = _tntSpawner.getNextTNT(); + if (!IsLive()) + { + tntTime = 60000; + } + if (_tntSpawner.isSpawned()) + { + Scoreboard.write("Spawned"); + } + else + { + Scoreboard.write(UtilTime.MakeStr(tntTime)); + } + Scoreboard.writeNewLine(); + GameTeam red = GetTeam(ChatColor.RED); + long redCrystals = _crystals.get(red).stream().filter(TeamCrystal::isActive).count(); + GameTeam blue = GetTeam(ChatColor.AQUA); + long blueCrystals = _crystals.get(blue).stream().filter(TeamCrystal::isActive).count(); + if (redCrystals > 0) + { + Scoreboard.write(_kings.get(red).getName(true)); + Scoreboard.write(redCrystals + "/2 Crystals Active"); + } + else + { + Scoreboard.write(_kings.get(red).getName(true) + " Health"); + Scoreboard.write(_kings.get(red).getHealth() + ""); + } + Scoreboard.writeNewLine(); + if (blueCrystals > 0) + { + Scoreboard.write(_kings.get(blue).getName(true)); + Scoreboard.write(blueCrystals + "/2 Crystals Active"); + } + else + { + Scoreboard.write(_kings.get(blue).getName(true) + " Health"); + Scoreboard.write(_kings.get(blue).getHealth() + ""); + } + Scoreboard.draw(); + } + + public void writeFinalScoreboard(String deadKing, String winKing, String warrior) + { + _writeScoreboard = false; + Scoreboard.reset(); + Scoreboard.writeNewLine(); + Scoreboard.write(deadKing + "'s " + C.cWhite + "castle has been conquered"); + Scoreboard.write(C.cWhite + "by " + winKing + "'s " + C.cWhite + "army with the help of"); + Scoreboard.write(warrior + C.cWhite + "!"); + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public void ParseData() + { + for (Location chestLoc : WorldData.GetDataLocs("BROWN")) + { + Block block = chestLoc.getBlock(); + block.setType(Material.CHEST); + fillChest(block); + _chests.add(block); + } + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + Location redKing = WorldData.GetDataLocs("RED").get(0); + Location blueKing = WorldData.GetDataLocs("BLUE").get(0); + Vector redBlue = UtilAlg.getTrajectory(redKing, blueKing); + Vector blueRed = UtilAlg.getTrajectory(blueKing, redKing); + redKing.setPitch(UtilAlg.GetPitch(redBlue)); + redKing.setYaw(UtilAlg.GetYaw(redBlue)); + blueKing.setPitch(UtilAlg.GetPitch(blueRed)); + blueKing.setYaw(UtilAlg.GetYaw(blueRed)); + _crystals.put(red, Arrays.asList(new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(0)), new TeamCrystal(red, WorldData.GetDataLocs("PINK").get(1)))); + _crystals.put(blue, Arrays.asList(new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(0)), new TeamCrystal(blue, WorldData.GetDataLocs("LIGHT_BLUE").get(1)))); + this.CreatureAllowOverride = true; + _kings.put(red, new TeamKing(red, "King Jon", redKing)); + _kings.put(blue, new TeamKing(blue, "King Ryan", blueKing)); + for (Kit kit : GetKits()) + { + List spawns = WorldData.GetCustomLocs(kit.GetName().toUpperCase()); + for (Location spawn : spawns) + { + Entity ent = kit.SpawnEntity(spawn); + Manager.GetLobby().addKitLocation(ent, kit, spawn); + } + } + this.CreatureAllowOverride = false; + _tntSpawner = new ObjectiveTNTSpawner(WorldData.GetDataLocs("BLACK")); + } + + @Override + public void EndCheck() + { + if (!IsLive()) + { + return; + } + + List teamsAlive = new ArrayList<>(); + + for (GameTeam team : GetTeamList()) + { + if (team.GetPlayers(true).size() > 0) + { + teamsAlive.add(team); + } + } + + if (teamsAlive.size() <= 1) + { + //Announce + if (teamsAlive.size() > 0) + { + GameTeam winner = teamsAlive.get(0); + TeamKing king = _kings.get(winner); + TeamKing dead = _kings.values().stream().filter(k -> k.getOwner().GetColor() != king.getOwner().GetColor()).findFirst().get(); + AnnounceEnd(winner); + writeFinalScoreboard(dead.getName(false), king.getName(false), dead.getOwner().GetColor() + "Quitters"); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == winner.GetColor()) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) + { + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } + } + + { + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) {}; + + @EventHandler + public void onUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + if (IsLive()) + { + if (UtilTime.elapsed(_lastRefill, TIME_TILL_REFILL)) + { + _lastRefill = System.currentTimeMillis(); + _chests.forEach(this::fillChest); + Bukkit.broadcastMessage(C.cGreenB + "Chests have refilled!"); + } + + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + TeamKing redKing = _kings.get(red); + TeamKing blueKing = _kings.get(blue); + redKing.update(_crystals.get(red).stream().filter(TeamCrystal::isActive).count() > 0); + if (redKing.isDead()) + { + AnnounceEnd(blue); + writeFinalScoreboard(redKing.getName(false), blueKing.getName(false), blue.GetColor() + redKing.getLastDamager()); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (player.getName().equals(redKing.getLastDamager())) + { + AddGems(player, 20, "King Slayer", false, false); + } + if (team.GetColor() == ChatColor.AQUA) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) + { + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } + } + + { + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + blueKing.update(_crystals.get(blue).stream().filter(TeamCrystal::isActive).count() > 0); + if (blueKing.isDead()) + { + AnnounceEnd(red); + writeFinalScoreboard(blueKing.getName(false), redKing.getName(false), red.GetColor() + blueKing.getLastDamager()); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (player.getName().equals(blueKing.getLastDamager())) + { + AddGems(player, 20, "King Slayer", false, false); + } + if (team.GetColor() == ChatColor.RED) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) + { + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } + } + + { + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + + _tntSpawner.update(); + if (!_killsAreObjective) + { + if (_tntSpawner.isSpawned()) + { + _killsAreObjective = true; + } + } + } + if (InProgress()) + { + writeScoreboard(); + } + } + + @EventHandler + public void onEditSettings(GameStateChangeEvent event) + { + if (event.GetGame() != this) + { + return; + } + + if (event.GetState() == GameState.Live) + { + _lastRefill = System.currentTimeMillis(); + _tntSpawner.onStart(); + Manager.GetDamage().SetEnabled(false); + Manager.GetExplosion().setEnabled(false); + Manager.GetCreature().SetDisableCustomDrops(true); + } + + if (event.GetState() == GameState.End) + { + Manager.GetDamage().SetEnabled(true); + Manager.GetExplosion().setEnabled(true); + Manager.GetCreature().SetDisableCustomDrops(false); + } + + if (event.GetState() == GameState.Dead) + { + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_DAILY_KILLS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULT_KILLS"); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void handleDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + event.SetBroadcastType(DeathMessageType.Detailed); + } + + @EventHandler + public void disableDamageLevel(CustomDamageEvent event) + { + event.SetDamageToLevel(false); + } + + @EventHandler + public void BlockFade(BlockFadeEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockBurn(BlockBurnEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockDecay(LeavesDecayEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void hangingBreak(HangingBreakEvent event) + { + if (event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) + { + event.setCancelled(true); + } + } + + @EventHandler + public void noFlow(BlockFromToEvent event) + { + if (!IsLive()) + { + return; + } + + Block block = event.getBlock(); + if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(true); + } + if (event.getToBlock().getType() == Material.ICE) + { + event.setCancelled(true); + } + } + + @EventHandler + public void onBlockChange(BlockFormEvent e) + { + if (!IsLive()) + { + return; + } + if (e.getNewState().getType() == Material.ICE) + { + e.setCancelled(true); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.WATER_BUCKET) + { + player.getItemInHand().setType(Material.BUCKET); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + return; + } + for (BlockFace bf : BlockFace.values()) + { + Block relative = block.getRelative(bf); + if (relative.getType().toString().contains("LAVA") || (relative.getType().toString().contains("WATER") && relative.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + } + else if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerFillBucket(PlayerBucketFillEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @EventHandler(ignoreCancelled=true) + public void onBlockDispense(BlockDispenseEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getItem().getType() == Material.WATER_BUCKET) + { + Block dispenser = event.getBlock(); + + MaterialData mat = dispenser.getState().getData(); + Dispenser disp_mat = (Dispenser)mat; + BlockFace face = disp_mat.getFacing(); + Block block = dispenser.getRelative(face); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + return; + } + for (BlockFace bf : BlockFace.values()) + { + if (block.getRelative(bf).getType().toString().contains("LAVA") || (block.getRelative(bf).getType().toString().contains("WATER") && block.getRelative(bf).getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onCombatDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.GetLog().GetKiller() == null) + { + return; + } + + if (!event.GetLog().GetKiller().IsPlayer()) + { + return; + } + + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + { + return; + } + + AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); + if (_killsAreObjective) + { + _teamKills.merge(GetTeam(player), 1, Integer::sum); + if (GetTeam(player).GetColor() == ChatColor.RED) + { + GameTeam enemy = GetTeam(ChatColor.AQUA); + TeamCrystal[] crystals = _crystals.get(enemy).stream().filter(TeamCrystal::isActive).toArray(size -> new TeamCrystal[size]); + if (crystals.length > 0) + { + if (_teamKills.getOrDefault(GetTeam(player), 0) % 20 == 0) + { + crystals[UtilMath.r(crystals.length)].destroy(); + if (crystals.length > 1) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(enemy).getName(false)) + " is now vulnerable!")); + } + } + } + else + { + _kings.get(enemy).handleDamage(player.getName(), 10, true); + } + } + else + { + GameTeam enemy = GetTeam(ChatColor.RED); + TeamCrystal[] crystals = _crystals.get(enemy).stream().filter(TeamCrystal::isActive).toArray(size -> new TeamCrystal[size]); + if (crystals.length > 0) + { + if (_teamKills.getOrDefault(GetTeam(player), 0) % 20 == 0) + { + crystals[UtilMath.r(crystals.length)].destroy(); + if (crystals.length > 1) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(enemy.GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(enemy).getName(false)) + " is now vulnerable!")); + } + } + } + else + { + _kings.get(enemy).handleDamage(player.getName(), 10, true); + } + } + } + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + player.setLevel(player.getLevel() + 1); + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); + KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); + boolean hardLine = GetKit(player).GetName().equals("Hardline"); + if (data.addKill(hardLine)) + { + AddStat(player, "KillStreak", 1, false, false); + ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); + } + if (UtilMath.isEven(data.getKills())) + { + Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cDPurple + data.getKills() + " player Kill Streak") + "!")); + } + } + + @EventHandler + public void TNTExplosion(ExplosionPrimeEvent event) + { + if (!event.getEntity().hasMetadata("THROWER")) + { + return; + } + float radius = event.getRadius(); + event.setRadius(0f); + + Player player = UtilPlayer.searchExact(((MetadataValue)UtilEnt.GetMetadata(event.getEntity(), "THROWER")).asString()); + if (player == null) + { + return; + } + if (GetTeam(player) == null) + { + return; + } + if (GetKit(player).GetName().equals("Demolitionist")) + { + radius += 3; + } + + Map nearby = UtilPlayer.getInRadius(event.getEntity().getLocation(), radius); + for (Player near : nearby.keySet()) + { + if (UtilPlayer.isSpectator(near)) + { + continue; + } + if (near.getEntityId() != player.getEntityId() && GetTeam(near).GetColor() == GetTeam(player).GetColor()) + { + continue; + } + if (near.getEntityId() == player.getEntityId() && event.getEntity().hasMetadata("OBJECTIVE_TNT")) + { + continue; + } + + double mult = nearby.get(near); + + int highestBlastProt = 0; + int blastProtEPF = 0; + for (ItemStack item : near.getInventory().getArmorContents()) + { + if (item != null && item.getEnchantments().containsKey(Enchantment.PROTECTION_EXPLOSIONS)) + { + blastProtEPF += (2 * item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)); + if (item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS) > highestBlastProt) + { + highestBlastProt = item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); + } + } + } + blastProtEPF = Math.min(blastProtEPF, 20); + + double damage = 8 * mult; + damage = damage * (1 - (blastProtEPF / 25)); + + double knockbackReduction = 1 - (highestBlastProt * 0.15); + + near.damage(damage, event.getEntity()); + UtilAction.velocity(near, UtilAlg.getTrajectory(event.getEntity().getLocation(), near.getLocation()), 1 * mult * knockbackReduction, false, 0, mult * knockbackReduction, 10, true); + } + + if (event.getEntity().hasMetadata("OBJECTIVE_TNT")) + { + List crystals = new ArrayList<>(); + + for (List c : _crystals.values()) + { + crystals.addAll(c); + } + for (TeamCrystal crystal : crystals) + { + if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), crystal.getLocation()) <= radius) + { + crystal.destroy(); + AddGems(player, 40, "Crystal Destruction", false, true); + long remaining = crystals.stream().filter(b -> b.getOwner().GetColor() == crystal.getOwner().GetColor()).filter(TeamCrystal::isActive).count(); + if (remaining > 0) + { + Bukkit.broadcastMessage(F.main("Game", "One of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " has been destroyed!")); + } + else + { + Bukkit.broadcastMessage(F.main("Game", "All of " + F.elem(crystal.getOwner().GetFormattedName() + "'s Crystals") + " have been destroyed and " + F.elem(_kings.get(crystal.getOwner()).getName(false)) + " is now vulnerable!")); + } + } + } + for (TeamKing king : _kings.values()) + { + if (king.isDead() && !king.getOwner().HasPlayer(player) && UtilMath.offset(event.getEntity().getLocation(), king.getLocation()) <= radius) + { + king.handleDamage(player.getName(), 50); + } + } + } + } + + @EventHandler + public void TNTThrow(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.L)) + { + return; + } + + Player player = event.getPlayer(); + + if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) + { + return; + } + + if (!IsAlive(player)) + { + return; + } + + event.setCancelled(true); + + if (!Manager.GetGame().CanThrowTNT(player.getLocation())) + { + // Inform + UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throwing TNT") + " here.")); + return; + } + + UtilInv.remove(player, Material.TNT, (byte) 0, 1); + UtilInv.Update(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + + tnt.setFuseTicks(60); + + double throwMult = 1; + + if (GetKit(player).GetName().equals("Demolitionist")) + { + throwMult = ((KitDemolitionist)GetKit(player)).getThrowMultiplier(player); + } + + UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5 * throwMult, false, 0, 0.1, 10, false); + + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + } + + @EventHandler + public void onLaunch(ProjectileHitEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getEntity() instanceof EnderPearl && event.getEntity().getShooter() != null && event.getEntity().getShooter() instanceof Entity) + { + Entity shooter = (Entity) event.getEntity().getShooter(); + if (_tntCarry.contains(shooter)) + { + return; + } + Location teleport = event.getEntity().getLocation(); + teleport.setPitch(shooter.getLocation().getPitch()); + teleport.setYaw(shooter.getLocation().getYaw()); + shooter.teleport(teleport); + } + if (event.getEntity() instanceof Arrow) + { + Manager.runSyncLater(event.getEntity()::remove, 1L); + } + } + + @EventHandler + public void onOpenChest(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.CHEST) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + { + event.setCancelled(true); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onDamage(EntityDamageEvent event) + { + if (!IsLive()) + { + return; + } + if (Manager.GetLobby().getKits().containsKey(event.getEntity())) + { + event.setCancelled(true); + return; + } + if (event.getEntity() instanceof EnderCrystal) + { + event.setCancelled(true); + return; + } + if (event.getEntity() instanceof Zombie) + { + event.setCancelled(true); + if (event instanceof EntityDamageByEntityEvent) + { + if (!event.getEntity().getCustomName().contains("Ryan") && !event.getEntity().getCustomName().contains("Jon")) + { + return; + } + GameTeam owner = event.getEntity().getCustomName().contains("Ryan") ? GetTeam(ChatColor.AQUA) : GetTeam(ChatColor.RED); + EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event; + if (e.getDamager() instanceof Player) + { + Player p = (Player) e.getDamager(); + if (UtilPlayer.isSpectator(p)) + { + return; + } + if (owner.HasPlayer(p)) + { + return; + } + if (_crystals.get(owner).stream().filter(TeamCrystal::isActive).count() > 0) + { + UtilPlayer.message(p, F.main("Game", "You cannot attack the enemy king until your team has destroyed his protective crystals!")); + return; + } + TeamKing king = _kings.get(owner); + if (king.handleDamage(p.getName(), e.getDamage())) + { + for (Player alert : owner.GetPlayers(true)) + { + if (Recharge.Instance.use(alert, "KingDamageAlert", 5000, false, false)) + { + alert.sendMessage(king.getName(true) + " is under attack!"); + } + } + } + } + } + } + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) + { + if (!IsLive()) + { + return; + } + + ItemStack drop = event.getItemDrop().getItemStack(); + if (drop.hasItemMeta() && drop.getItemMeta().hasLore() && drop.getItemMeta().getLore().stream().map(ChatColor::stripColor).anyMatch(lore -> lore.equals("Kit Item"))) + { + event.setCancelled(true); + return; + } + + event.getItemDrop().remove(); + } + + @EventHandler + public void craftItem(PrepareItemCraftEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getInventory().getResult().getType() == Material.FLINT_AND_STEEL) + { + event.getInventory().setResult(_flintAndSteel.build()); + } + } + + @EventHandler + public void onInvClick(InventoryClickEvent event) + { + if (!IsLive()) + { + return; + } + ItemStack current = event.getCurrentItem(); + if (event.getAction() == InventoryAction.HOTBAR_SWAP || event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) + { + current = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); + } + if (current == null || !current.hasItemMeta()) + { + return; + } + if (current.getItemMeta().hasDisplayName() && current.getItemMeta().getDisplayName().equals(C.cRed + "TNT")) + { + event.setCancelled(true); + return; + } + if (event.getView().getTopInventory() != null && event.getView().getTopInventory().getType() == InventoryType.CHEST) + { + if (current.getItemMeta().hasLore()) + { + for (String lore : current.getItemMeta().getLore()) + { + if (ChatColor.stripColor(lore).equalsIgnoreCase("Kit Item")) + { + event.setCancelled(true); + break; + } + } + } + + } + } + + @EventHandler + public void onFirstBlood(FirstBloodEvent event) + { + if (!IsLive()) + { + return; + } + + AddStat(event.getPlayer(), "FirstBlood", 1, true, false); + } + + @EventHandler + public void onPearl(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + if (event.getItem() != null && event.getItem().getType() == Material.ENDER_PEARL) + { + Player player = (Player) event.getPlayer(); + if (!Recharge.Instance.use(player, "Enderpearl", 4000, true, true)) + { + event.setCancelled(true); + player.updateInventory(); + } + } + } + + @EventHandler + public void onItemDespawn(ItemDespawnEvent event) + { + if (!IsLive()) + { + return; + } + + if (_tntSpawner.isSpawned()) + { + if (_tntSpawner.getItem().getEntityId() == event.getEntity().getEntityId()) + { + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPickup(PlayerPickupItemEvent event) + { + if (!IsLive()) + { + return; + } + if (UtilPlayer.isSpectator(event.getPlayer())) + { + return; + } + + if (_tntSpawner.isSpawned() && event.getItem().getEntityId() == _tntSpawner.getItem().getEntityId()) + { + event.setCancelled(true); + if (!_tntCarry.contains(event.getPlayer())) + { + _tntSpawner.pickup(); + _tntCarry.add(event.getPlayer()); + event.getPlayer().setMetadata("OLD_HELM", new FixedMetadataValue(UtilServer.getPlugin(), event.getPlayer().getInventory().getHelmet())); + event.getPlayer().setMetadata("TNT_START", new FixedMetadataValue(UtilServer.getPlugin(), System.currentTimeMillis())); + event.getPlayer().getInventory().setHelmet(_wearableTnt.build()); + UtilPlayer.message(event.getPlayer(), F.main("Game", "You picked up " + F.skill("TNT") + ".")); + UtilPlayer.message(event.getPlayer(), F.main("Game", F.elem("Right-Click") + " to detonate yourself.")); + UtilPlayer.message(event.getPlayer(), F.main("Game", "Run to the enemy Crystal and Detonate to destroy it.")); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void TNTUse(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!_tntCarry.contains(player)) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + event.setCancelled(true); + + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + _tntCarry.remove(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + + @EventHandler + public void TNTExpire(UpdateEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getType() != UpdateType.FASTER) + { + return; + } + + Bukkit.getOnlinePlayers().forEach(player -> + { + player.getInventory().remove(_wearableTnt.build()); + }); + + Iterator tntIterator = _tntCarry.iterator(); + + while (tntIterator.hasNext()) + { + Player player = tntIterator.next(); + + if (player.isDead() || UtilTime.elapsed(player.getMetadata("TNT_START").get(0).asLong(), 60000)) + { + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + + if (!player.isDead()) + { + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + } + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + + tntIterator.remove(); + continue; + } + + List crystals = new ArrayList<>(); + + for (List c : _crystals.values()) + { + crystals.addAll(c); + } + for (TeamCrystal crystal : crystals) + { + if (crystal.isActive() && !crystal.getOwner().HasPlayer(player) && UtilMath.offset(player.getLocation(), crystal.getLocation()) <= 3) + { + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + + if (!player.isDead()) + { + player.getInventory().setHelmet((ItemStack) player.getMetadata("OLD_HELM").get(0).value()); + } + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + + tntIterator.remove(); + } + } + + UtilTextBottom.display(GetTeam(player).GetColor() + player.getName() + " has the TNT!", UtilServer.getPlayers()); + UtilFirework.playFirework(player.getEyeLocation(), Type.BURST, GetTeam(player).GetColorBase(), false, false); + if (player.getInventory().getHelmet() == null || player.getInventory().getHelmet().getType() == Material.AIR) + { + player.getInventory().setHelmet(_wearableTnt.build()); + } + } + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) + { + Player player = event.getEntity(); + + _streakData.getOrDefault(player, new KillStreakData()).reset(); + + if (!_tntCarry.contains(player)) + { + return; + } + + player.removeMetadata("OLD_HELM", UtilServer.getPlugin()); + player.removeMetadata("TNT_START", UtilServer.getPlugin()); + _tntCarry.remove(player); + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation(), TNTPrimed.class); + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + UtilEnt.SetMetadata(tnt, "OBJECTIVE_TNT", true); + tnt.setFuseTicks(0); + UtilPlayer.message(player, F.main("Game", "You used " + F.skill("Detonate") + ".")); + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) + { + if (!_tntSpawner.canPlaceFireAt(event.getBlock())) + { + event.setCancelled(true); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java new file mode 100644 index 000000000..959288efe --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/CastleAssaultTDM.java @@ -0,0 +1,1076 @@ +package nautilus.game.arcade.game.games.castleassault; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.WeakHashMap; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Chest; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Entity; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Painting; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFormEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Dispenser; +import org.bukkit.material.MaterialData; +import org.bukkit.metadata.MetadataValue; + +import mineplex.core.Managers; +import mineplex.core.common.Pair; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.leaderboard.Leaderboard; +import mineplex.core.leaderboard.LeaderboardManager; +import mineplex.core.leaderboard.LeaderboardRepository.LeaderboardSQLType; +import mineplex.core.loot.ChestLoot; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.combat.DeathMessageType; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.FirstBloodEvent; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.GemData; +import nautilus.game.arcade.game.TeamGame; +import nautilus.game.arcade.game.games.castleassault.data.KillStreakData; +import nautilus.game.arcade.game.games.castleassault.kits.KitArcher; +import nautilus.game.arcade.game.games.castleassault.kits.KitDemolitionist; +import nautilus.game.arcade.game.games.castleassault.kits.KitFighter; +import nautilus.game.arcade.game.games.castleassault.kits.KitPlayer; +import nautilus.game.arcade.game.games.castleassault.kits.KitTank; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager; + +public class CastleAssaultTDM extends TeamGame +{ + private static final int MAX_FLINT_AND_STEEL_USES = 4; + private static final int ITEMS_PER_CHEST = 5; + private static final long TIME_TILL_REFILL = 2 * 60 * 1000; + private static final int KILLS_TO_WIN = 50; + + private long _lastRefill; + + private ItemBuilder _flintAndSteel; + + private Map _streakData = new WeakHashMap<>(); + private Map _teamKills = new HashMap<>(); + + private List _chests = new ArrayList<>(); + + private ChestLoot _rangedGear = new ChestLoot(true); + private ChestLoot _rodsAndGaps = new ChestLoot(true); + private ChestLoot _potionGearCommon = new ChestLoot(true); + private ChestLoot _potionGearRare = new ChestLoot(true); + private ChestLoot _miscGear = new ChestLoot(); + + private boolean _writeScoreboard = true; + + @SuppressWarnings("deprecation") + public CastleAssaultTDM(ArcadeManager manager) + { + super(manager, GameType.CastleAssaultTDM, + new Kit[] + { + //new KitAlchemist(manager), + new KitArcher(manager), + new KitDemolitionist(manager), + //new KitEnchanter(manager), + new KitFighter(manager), + //new KitHardline(manager), + //new KitNinja(manager), + new KitTank(manager) + }, + new String[] + { + "Work with your team", + "To slay the enemy.", + "First team to 50 kills", + "Wins the game and glory!" + } + ); + + _help = new String[] + { + "Purchase kit upgrades by earning and spending crowns from games", + "Each kit has special starter items, be sure to use them to your advantage in fights", + "Go on Kill Streaks to earn Kill Streak Rewards to obtain better armor & weapons!", + "Chests refill every 2 minutes with potions, golden applegates, fishing rods, and other useful PvP items!" + }; + + this.StrictAntiHack = true; + this.HungerSet = 20; + this.DeathOut = false; + this.DeathSpectateSecs = 5; + this.CreatureAllow = false; + this.DeathDropItems = false; + this.WorldWeatherEnabled = false; + this.AllowParticles = false; + this.SoupEnabled = false; + this.InventoryClick = true; + this.InventoryOpenChest = true; + this.InventoryOpenBlock = true; + this.ItemDrop = true; + this.ItemPickup = true; + this.AllowFlintAndSteel = true; + this.BlockPlaceAllow.add(Material.FIRE.getId()); + this.CrownsEnabled = true; + this.FirstKillReward = 20; + this.GemKillDeathRespawn = 1; + this.GameTimeout = -1; + + new CompassModule() + .setGiveCompass(true) + .setGiveCompassToSpecs(true) + .setGiveCompassToAlive(false) + .register(this); + + _flintAndSteel = new ItemBuilder(Material.FLINT_AND_STEEL).setData((short) (Material.FLINT_AND_STEEL.getMaxDurability() - MAX_FLINT_AND_STEEL_USES)); + generateLoot(); + + if (manager.IsRewardStats()) + { + if (manager.GetLobby() instanceof NewGameLobbyManager) + { + Map> lobbyCustomLocs = ((NewGameLobbyManager)manager.GetLobby()).getCustomLocs(); + if (lobbyCustomLocs.containsKey("TOP_DAILY_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULTTDM_DAILY_WINS", new Leaderboard("Top Daily Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_DAILY_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_DAILY_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULTTDM_DAILY_KILLS", new Leaderboard("Top Daily Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.DAILY, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_WINS")) + { + Location loc = lobbyCustomLocs.get("TOP_WINS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULTTDM_WINS", new Leaderboard("Top Wins", Pair.create("Win", "Wins"), new String[] {"Castle Assault TDM.Wins"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); + } + if (lobbyCustomLocs.containsKey("TOP_KILLS")) + { + Location loc = lobbyCustomLocs.get("TOP_KILLS").get(0); + Managers.get(LeaderboardManager.class).registerLeaderboard("TOP_CASTLEASSAULTTDM_KILLS", new Leaderboard("Top Kills", Pair.create("Kill", "Kills"), new String[] {"Castle Assault TDM.Kills"}, LeaderboardSQLType.ALL_SEASON, loc, 10)); + } + } + } + } + + private void generateLoot() + { + { + _rangedGear.addLoot(new ItemStack(Material.BOW), 3); + _rangedGear.addLoot(Material.ARROW, 3, 8, 16); + } + { + _rodsAndGaps.addLoot(new ItemStack(Material.FISHING_ROD), 3); + _rodsAndGaps.addLoot(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build(), 3); + } + { + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)8194).build(), 2); + _potionGearCommon.addLoot(new ItemBuilder(Material.POTION).setData((short)16417).build(), 2); + } + { + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8193).build(), 2); + _potionGearRare.addLoot(new ItemBuilder(Material.POTION).setData((short)8195).build(), 2); + } + { + _miscGear.addLoot(new ItemStack(Material.ENDER_PEARL), 2); + _miscGear.addLoot(new ItemStack(Material.WATER_BUCKET), 2); + _miscGear.addLoot(_flintAndSteel.build(), 2); + _miscGear.addLoot(new ItemStack(Material.SNOW_BALL, 16), 3); + } + } + + private void fillChest(Block block) + { + if (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST) + { + return; + } + Chest chest = (Chest) block.getState(); + + chest.getBlockInventory().clear(); + int[] slots = UtilMath.random.ints(ITEMS_PER_CHEST, 0, chest.getBlockInventory().getSize()).toArray(); + + for (int slot : slots) + { + double chance = UtilMath.random.nextDouble(); + double subChance = UtilMath.random.nextDouble(); + + ChestLoot loot = _miscGear; + if (chance <= 0.6) + { + loot = _rodsAndGaps; + } + if (chance <= 0.5) + { + loot = _potionGearCommon; + if (subChance <= 0.45) + { + loot = _potionGearRare; + } + } + if (chance <= 0.3) + { + loot = _rangedGear; + } + chest.getBlockInventory().setItem(slot, loot.getLoot()); + } + } + + public ItemStack getNewFlintAndSteel(boolean kitItem) + { + if (kitItem) + { + return _flintAndSteel.clone().setLore(C.cGold + "Kit Item").build(); + } + return _flintAndSteel.build(); + } + + public void writeScoreboard() + { + if (!_writeScoreboard) + { + return; + } + Scoreboard.reset(); + Scoreboard.write(C.cDRedB + GetName()); + Scoreboard.writeNewLine(); + Scoreboard.write(C.cGreenB + "Chest Refill"); + long refillTime = _lastRefill + TIME_TILL_REFILL - System.currentTimeMillis(); + if (!IsLive()) + { + refillTime = TIME_TILL_REFILL; + } + Scoreboard.write(UtilTime.MakeStr(refillTime)); + Scoreboard.writeNewLine(); + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + Scoreboard.write(red.GetFormattedName() + " Team Kills"); + Scoreboard.write(_teamKills.get(red) + "/" + KILLS_TO_WIN); + Scoreboard.writeNewLine(); + Scoreboard.write(blue.GetFormattedName() + " Team Kills"); + Scoreboard.write(_teamKills.get(blue) + "/" + KILLS_TO_WIN); + Scoreboard.draw(); + } + + public void writeFinalScoreboard(String winner, int kills) + { + _writeScoreboard = false; + Scoreboard.reset(); + Scoreboard.writeNewLine(); + Scoreboard.write(winner + C.cWhite + " has won"); + Scoreboard.write(C.cWhite + "with " + C.cGreen + kills + C.cWhite + " kills!"); + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public void ParseData() + { + for (Location chestLoc : WorldData.GetDataLocs("BROWN")) + { + Block block = chestLoc.getBlock(); + block.setType(Material.CHEST); + fillChest(block); + _chests.add(block); + } + GameTeam red = GetTeam(ChatColor.RED); + _teamKills.put(red, 0); + GameTeam blue = GetTeam(ChatColor.AQUA); + _teamKills.put(blue, 0); + this.CreatureAllowOverride = true; + for (Kit kit : GetKits()) + { + List spawns = WorldData.GetCustomLocs(kit.GetName().toUpperCase()); + for (Location spawn : spawns) + { + Entity ent = kit.SpawnEntity(spawn); + Manager.GetLobby().addKitLocation(ent, kit, spawn); + } + } + this.CreatureAllowOverride = false; + } + + @Override + public void EndCheck() + { + if (!IsLive()) + { + return; + } + + List teamsAlive = new ArrayList<>(); + + for (GameTeam team : GetTeamList()) + { + if (team.GetPlayers(true).size() > 0) + { + teamsAlive.add(team); + } + } + + if (teamsAlive.size() <= 1) + { + //Announce + if (teamsAlive.size() > 0) + { + GameTeam winner = teamsAlive.get(0); + AnnounceEnd(winner); + writeFinalScoreboard(winner.GetColor() + winner.GetName(), _teamKills.get(winner)); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == winner.GetColor()) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) + { + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } + } + + { + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) {}; + + @EventHandler + public void onUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + if (IsLive()) + { + if (UtilTime.elapsed(_lastRefill, TIME_TILL_REFILL)) + { + _lastRefill = System.currentTimeMillis(); + _chests.forEach(this::fillChest); + Bukkit.broadcastMessage(C.cGreenB + "Chests have refilled!"); + } + + GameTeam red = GetTeam(ChatColor.RED); + GameTeam blue = GetTeam(ChatColor.AQUA); + if (_teamKills.get(blue).intValue() >= KILLS_TO_WIN) + { + AnnounceEnd(blue); + writeFinalScoreboard(blue.GetColor() + blue.GetName(), _teamKills.get(blue)); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == ChatColor.AQUA) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) + { + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } + } + + { + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + if (_teamKills.get(red).intValue() >= KILLS_TO_WIN) + { + AnnounceEnd(red); + writeFinalScoreboard(red.GetColor() + red.GetName(), _teamKills.get(red)); + for (GameTeam team : GetTeamList()) + { + for (Player player : team.GetPlayers(true)) + { + if (team.GetColor() == ChatColor.RED) + { + AddGems(player, 100, "Winning Team", false, false); + } + else + { + AddGems(player, 50, "Losing Team", false, false); + } + if (player.isOnline()) + { + AddGems(player, 10, "Participation", false, false); + } + + int crowns = 0; + for (Entry data : GetGems(player).entrySet()) + { + if (data.getKey().equals("Kills")) + { + crowns += data.getValue().Gems; + } + } + + { + int streak = _streakData.getOrDefault(player, new KillStreakData()).getBestStreak(); + if (streak >= 2 && streak < 4) + { + AddGems(player, 0.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 4 && streak < 6) + { + AddGems(player, 1 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 6 && streak < 8) + { + AddGems(player, 1.5 * crowns, streak + " Player Kill Streak", false, false); + } + else if (streak >= 8) + { + AddGems(player, 2 * crowns, streak + " Player Kill Streak", false, false); + } + } + } + } + SetState(GameState.End); + return; + } + } + if (InProgress()) + { + writeScoreboard(); + } + } + + @EventHandler + public void onEditSettings(GameStateChangeEvent event) + { + if (event.GetGame() != this) + { + return; + } + + if (event.GetState() == GameState.Live) + { + _lastRefill = System.currentTimeMillis(); + Manager.GetDamage().SetEnabled(false); + Manager.GetExplosion().setEnabled(false); + Manager.GetCreature().SetDisableCustomDrops(true); + } + + if (event.GetState() == GameState.End) + { + Manager.GetDamage().SetEnabled(true); + Manager.GetExplosion().setEnabled(true); + Manager.GetCreature().SetDisableCustomDrops(false); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULTTDM_DAILY_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULTTDM_DAILY_KILLS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULTTDM_WINS"); + Managers.get(LeaderboardManager.class).unregisterLeaderboard("TOP_CASTLEASSAULTTDM_KILLS"); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void handleDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + event.SetBroadcastType(DeathMessageType.Detailed); + } + + @EventHandler + public void disableDamageLevel(CustomDamageEvent event) + { + event.SetDamageToLevel(false); + } + + @EventHandler + public void BlockFade(BlockFadeEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockBurn(BlockBurnEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void BlockDecay(LeavesDecayEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void hangingBreak(HangingBreakEvent event) + { + if (event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) + { + event.setCancelled(true); + } + } + + @EventHandler + public void noFlow(BlockFromToEvent event) + { + if (!IsLive()) + { + return; + } + + Block block = event.getBlock(); + if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(true); + } + if (event.getToBlock().getType() == Material.ICE) + { + event.setCancelled(true); + } + } + + @EventHandler + public void onBlockChange(BlockFormEvent e) + { + if (!IsLive()) + { + return; + } + if (e.getNewState().getType() == Material.ICE) + { + e.setCancelled(true); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + if (player.getItemInHand().getType() == Material.WATER_BUCKET) + { + player.getItemInHand().setType(Material.BUCKET); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + return; + } + for (BlockFace bf : BlockFace.values()) + { + Block relative = block.getRelative(bf); + if (relative.getType().toString().contains("LAVA") || (relative.getType().toString().contains("WATER") && relative.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + } + else if (player.getItemInHand().getType() == Material.LAVA_BUCKET) + { + event.setCancelled(true); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled=true) + public void onPlayerFillBucket(PlayerBucketFillEvent event) + { + if (!IsLive()) + { + return; + } + + Player player = event.getPlayer(); + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA) + { + event.setCancelled(true); + player.sendBlockChange(block.getLocation(), block.getType(), block.getData()); + } + } + + @EventHandler(ignoreCancelled=true) + public void onBlockDispense(BlockDispenseEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getItem().getType() == Material.WATER_BUCKET) + { + Block dispenser = event.getBlock(); + + MaterialData mat = dispenser.getState().getData(); + Dispenser disp_mat = (Dispenser)mat; + BlockFace face = disp_mat.getFacing(); + Block block = dispenser.getRelative(face); + if (block.getType().toString().contains("LAVA") || (block.getType().toString().contains("WATER") && block.getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + return; + } + for (BlockFace bf : BlockFace.values()) + { + if (block.getRelative(bf).getType().toString().contains("LAVA") || (block.getRelative(bf).getType().toString().contains("WATER") && block.getRelative(bf).getType() != Material.WATER_LILY)) + { + event.setCancelled(true); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onCombatDeath(CombatDeathEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.GetLog().GetKiller() == null) + { + return; + } + + if (!event.GetLog().GetKiller().IsPlayer()) + { + return; + } + + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + { + return; + } + + AddStat(player, GetKit(player).GetName() + "KitKills", 1, false, false); + _teamKills.merge(GetTeam(player), 1, Integer::sum); + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + player.setLevel(player.getLevel() + 1); + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setTitle(C.cPurple + "Golden Applegate").build()); + KillStreakData data = _streakData.computeIfAbsent(player, (key) -> new KillStreakData()); + boolean hardLine = GetKit(player).GetName().equals("Hardline"); + if (data.addKill(hardLine)) + { + AddStat(player, "KillStreak", 1, false, false); + ((KitPlayer)GetKit(player)).awardKillStreak(player, hardLine ? (data.getKills() + 1) : data.getKills()); + } + if (UtilMath.isEven(data.getKills())) + { + Bukkit.broadcastMessage(F.main("Game", C.cGreen + C.Bold + player.getName() + ChatColor.RESET + " is on a " + F.elem(C.cDPurple + data.getKills() + " player Kill Streak") + "!")); + } + } + + @EventHandler + public void TNTExplosion(ExplosionPrimeEvent event) + { + if (!event.getEntity().hasMetadata("THROWER")) + { + return; + } + + float radius = event.getRadius(); + event.setRadius(0f); + + Player player = UtilPlayer.searchExact(((MetadataValue)UtilEnt.GetMetadata(event.getEntity(), "THROWER")).asString()); + if (player == null) + { + return; + } + if (GetTeam(player) == null) + { + return; + } + + if (GetKit(player).GetName().equals("Demolitionist")) + { + radius += 3; + } + + Map nearby = UtilPlayer.getInRadius(event.getEntity().getLocation(), radius); + for (Player near : nearby.keySet()) + { + if (UtilPlayer.isSpectator(near)) + { + continue; + } + if (near.getEntityId() != player.getEntityId() && GetTeam(near).GetColor() == GetTeam(player).GetColor()) + { + continue; + } + + double mult = nearby.get(near); + + int highestBlastProt = 0; + int blastProtEPF = 0; + for (ItemStack item : near.getInventory().getArmorContents()) + { + if (item != null && item.getEnchantments().containsKey(Enchantment.PROTECTION_EXPLOSIONS)) + { + blastProtEPF += (2 * item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)); + if (item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS) > highestBlastProt) + { + highestBlastProt = item.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); + } + } + } + blastProtEPF = Math.min(blastProtEPF, 20); + + double damage = 8 * mult; + damage = damage * (1 - (blastProtEPF / 25)); + + double knockbackReduction = 1 - (highestBlastProt * 0.15); + + near.damage(damage, event.getEntity()); + UtilAction.velocity(near, UtilAlg.getTrajectory(event.getEntity().getLocation(), near.getLocation()), 1 * mult * knockbackReduction, false, 0, mult * knockbackReduction, 10, true); + } + } + + @EventHandler + public void TNTThrow(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.L)) + { + return; + } + + Player player = event.getPlayer(); + + if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) + { + return; + } + + if (!IsAlive(player)) + { + return; + } + + event.setCancelled(true); + + if (!Manager.GetGame().CanThrowTNT(player.getLocation())) + { + // Inform + UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throwing TNT") + " here.")); + return; + } + + UtilInv.remove(player, Material.TNT, (byte) 0, 1); + UtilInv.Update(player); + + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + + tnt.setFuseTicks(60); + + double throwMult = 1; + + if (GetKit(player).GetName().equals("Demolitionist")) + { + throwMult = ((KitDemolitionist)GetKit(player)).getThrowMultiplier(player); + } + + UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5 * throwMult, false, 0, 0.1, 10, false); + + UtilEnt.SetMetadata(tnt, "THROWER", player.getName()); + } + + @EventHandler + public void onLaunch(ProjectileHitEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getEntity() instanceof EnderPearl && event.getEntity().getShooter() != null && event.getEntity().getShooter() instanceof Entity) + { + Entity shooter = (Entity) event.getEntity().getShooter(); + Location teleport = event.getEntity().getLocation(); + teleport.setPitch(shooter.getLocation().getPitch()); + teleport.setYaw(shooter.getLocation().getYaw()); + shooter.teleport(teleport); + } + if (event.getEntity() instanceof Arrow) + { + Manager.runSyncLater(event.getEntity()::remove, 1L); + } + } + + @EventHandler + public void onOpenChest(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.CHEST) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) + { + if (!IsLive()) + { + return; + } + + ItemStack drop = event.getItemDrop().getItemStack(); + if (drop.hasItemMeta() && drop.getItemMeta().hasLore() && drop.getItemMeta().getLore().stream().map(ChatColor::stripColor).anyMatch(lore -> lore.equals("Kit Item"))) + { + event.setCancelled(true); + return; + } + + event.getItemDrop().remove(); + } + + @EventHandler + public void craftItem(PrepareItemCraftEvent event) + { + if (!IsLive()) + { + return; + } + + if (event.getInventory().getResult().getType() == Material.FLINT_AND_STEEL) + { + event.getInventory().setResult(_flintAndSteel.build()); + } + } + + @EventHandler + public void onInvClick(InventoryClickEvent event) + { + if (!IsLive()) + { + return; + } + if (event.getView().getTopInventory() != null && event.getView().getTopInventory().getType() == InventoryType.CHEST) + { + ItemStack current = event.getCurrentItem(); + if (event.getAction() == InventoryAction.HOTBAR_SWAP || event.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD) + { + current = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); + } + + if (current != null && current.hasItemMeta()) + { + if (current.getItemMeta().hasLore()) + { + for (String lore : current.getItemMeta().getLore()) + { + if (ChatColor.stripColor(lore).equalsIgnoreCase("Kit Item")) + { + event.setCancelled(true); + break; + } + } + } + } + } + } + + @EventHandler + public void onFirstBlood(FirstBloodEvent event) + { + if (!IsLive()) + { + return; + } + + AddStat(event.getPlayer(), "FirstBlood", 1, true, false); + } + + @EventHandler + public void onPearl(PlayerInteractEvent event) + { + if (!IsLive()) + { + return; + } + + if (!UtilEvent.isAction(event, ActionType.R)) + { + return; + } + + if (event.getItem() != null && event.getItem().getType() == Material.ENDER_PEARL) + { + Player player = (Player) event.getPlayer(); + if (!Recharge.Instance.use(player, "Enderpearl", 4000, true, true)) + { + event.setCancelled(true); + player.updateInventory(); + } + } + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) + { + Player player = event.getEntity(); + + _streakData.getOrDefault(player, new KillStreakData()).reset(); + } + + @EventHandler(ignoreCancelled = true) + public void onDamage(EntityDamageEvent event) + { + if (!IsLive()) + { + return; + } + if (Manager.GetLobby().getKits().containsKey(event.getEntity())) + { + event.setCancelled(true); + return; + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/CapturePoint.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/CapturePoint.java new file mode 100644 index 000000000..43709f165 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/CapturePoint.java @@ -0,0 +1,71 @@ +package nautilus.game.arcade.game.games.castleassault.data; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import nautilus.game.arcade.game.GameTeam; + +public class CapturePoint +{ + private static final int POINTS_TO_CAPTURE = 100; + private static final long TIME_PER_POINT = 1000; + private static final int POINTS_PER_TICK = 1; + + private Location _loc; + + private long _lastCap; + private int _points = 0; + private GameTeam _owner = null; + + public CapturePoint(GameTeam owner, Location loc) + { + _owner = owner; + + _loc = loc; + } + + public int getMaxPoints() + { + return POINTS_TO_CAPTURE; + } + + public int getPoints() + { + return _points; + } + + public boolean isCaptured() + { + return _points >= POINTS_TO_CAPTURE; + } + + public void update() + { + if (!UtilTime.elapsed(_lastCap, TIME_PER_POINT)) + { + return; + } + + int capping = 0; + for (Player player : UtilPlayer.getInRadius(_loc, 3.5).keySet()) + { + if (UtilPlayer.isSpectator(player)) + { + continue; + } + if (_owner.HasPlayer(player)) + { + continue; + } + capping++; + } + + if (capping > 0 && _points < POINTS_TO_CAPTURE) + { + _lastCap = System.currentTimeMillis(); + _points += POINTS_PER_TICK; + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/KillStreakData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/KillStreakData.java new file mode 100644 index 000000000..1e86d8266 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/KillStreakData.java @@ -0,0 +1,47 @@ +package nautilus.game.arcade.game.games.castleassault.data; + +public class KillStreakData +{ + private static final int[] REWARDED_STREAKS = {2, 4, 6, 8}; + private int _kills; + private int _bestStreak; + + public KillStreakData() + { + _kills = 0; + _bestStreak = 0; + } + + public int getKills() + { + return _kills; + } + + public int getBestStreak() + { + return Math.max(_bestStreak, _kills); + } + + public boolean addKill(boolean hardLine) + { + _kills++; + for (int streak : REWARDED_STREAKS) + { + if ((_kills + (hardLine ? 1 : 0)) == streak) + { + return true; + } + } + + return false; + } + + public void reset() + { + if (_kills > _bestStreak) + { + _bestStreak = _kills; + } + _kills = 0; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/ObjectiveTNTSpawner.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/ObjectiveTNTSpawner.java new file mode 100644 index 000000000..076913cf1 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/ObjectiveTNTSpawner.java @@ -0,0 +1,100 @@ +package nautilus.game.arcade.game.games.castleassault.data; + +import java.util.List; + +import org.bukkit.Color; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Item; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilTime; + +public class ObjectiveTNTSpawner +{ + private static final long TNT_SPAWN_DELAY = 60000; + private List _locs; + private Location _lastSpawnLoc; + private Item _entity; + private long _lastPickedUp; + + public ObjectiveTNTSpawner(List locs) + { + _locs = locs; + _lastSpawnLoc = null; + _entity = null; + _lastPickedUp = System.currentTimeMillis(); + } + + public Item getItem() + { + return _entity; + } + + public boolean isSpawned() + { + return _entity != null; + } + + public boolean canPlaceFireAt(Block block) + { + for (Location loc : _locs) + { + if (UtilMath.offsetSquared(loc, block.getLocation()) <= 9) + { + return false; + } + } + + return true; + } + + public long getNextTNT() + { + return (_lastPickedUp + TNT_SPAWN_DELAY) - System.currentTimeMillis(); + } + + public void spawn() + { + Location spawn = _locs.get(UtilMath.r(_locs.size())); + spawn.getBlock().getRelative(BlockFace.DOWN).setType(Material.REDSTONE_BLOCK); + _lastSpawnLoc = spawn.clone(); + _entity = spawn.getWorld().dropItem(spawn, new ItemStack(Material.TNT)); + UtilFirework.playFirework(spawn, Type.BURST, Color.RED, false, false); + } + + public void pickup() + { + _entity.getLocation().getBlock().getRelative(BlockFace.DOWN).setType(Material.IRON_BLOCK); + _entity.remove(); + _entity = null; + _lastSpawnLoc = null; + _lastPickedUp = System.currentTimeMillis(); + } + + public void update() + { + if (!isSpawned() && UtilTime.elapsed(_lastPickedUp, TNT_SPAWN_DELAY)) + { + spawn(); + } + else if (isSpawned()) + { + _entity.teleport(_lastSpawnLoc); + if (!_entity.isValid() || _entity.isDead()) + { + _entity = _lastSpawnLoc.getWorld().dropItem(_lastSpawnLoc, new ItemStack(Material.TNT)); + } + } + } + + public void onStart() + { + _lastPickedUp = System.currentTimeMillis(); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamCrystal.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamCrystal.java new file mode 100644 index 000000000..e44bc9e9a --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamCrystal.java @@ -0,0 +1,54 @@ +package nautilus.game.arcade.game.games.castleassault.data; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.EnderCrystal; + +import nautilus.game.arcade.game.GameTeam; + +public class TeamCrystal +{ + private Location _loc; + private GameTeam _owner; + private EnderCrystal _crystal; + private boolean _destroyed; + + public TeamCrystal(GameTeam owner, Location loc) + { + _owner = owner; + _loc = loc; + + spawn(); + } + + public GameTeam getOwner() + { + return _owner; + } + + public Location getLocation() + { + return _loc; + } + + public boolean isActive() + { + return !_destroyed; + } + + public void spawn() + { + _destroyed = false; + _crystal = _loc.getWorld().spawn(_loc, EnderCrystal.class); + _loc.getBlock().getRelative(0, -2, 0).setType(Material.BEACON); + } + + public void destroy() + { + _destroyed = true; + _crystal.remove(); + _crystal = null; + _loc.getBlock().getRelative(0, -2, 0).setType(Material.SMOOTH_BRICK); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java new file mode 100644 index 000000000..c12c1dd5b --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/TeamKing.java @@ -0,0 +1,128 @@ +package nautilus.game.arcade.game.games.castleassault.data; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Zombie; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilTime; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.game.GameTeam; + +public class TeamKing +{ + private static final int MAX_HEALTH = 600; + private Location _loc; + private String _name; + private GameTeam _owner; + private Zombie _entity; + private int _health; + private String _lastDamager; + private long _lastDamage; + + public TeamKing(GameTeam owner, String name, Location loc) + { + _owner = owner; + _loc = loc; + _name = name; + _health = MAX_HEALTH; + _entity = (Zombie) loc.getWorld().spawnEntity(loc, EntityType.ZOMBIE); + UtilEnt.vegetate(_entity, true); + _entity.getEquipment().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setUnbreakable(true).build()); + _entity.getEquipment().setChestplate(new ItemBuilder(Material.DIAMOND_CHESTPLATE).setUnbreakable(true).build()); + _entity.getEquipment().setLeggings(new ItemBuilder(Material.DIAMOND_LEGGINGS).setUnbreakable(true).build()); + _entity.getEquipment().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setUnbreakable(true).build()); + _entity.setRemoveWhenFarAway(false); + _entity.setCustomName(owner.GetColor() + name); + } + + public GameTeam getOwner() + { + return _owner; + } + + public Location getLocation() + { + return _loc; + } + + public String getName(boolean bold) + { + return _owner.GetColor() + (bold ? C.Bold : "") + _name; + } + + public String getLastDamager() + { + return _lastDamager; + } + + public int getHealth() + { + return Math.max(_health, 0); + } + + public boolean isDead() + { + return getHealth() <= 0; + } + + public void update(boolean beaconsAlive) + { + _entity.teleport(_loc); + for (int y = 0; y <= 4; y++) + { + for (int x = -4; x <= 4; x++) + { + for (int z = -4; z <= 4; z++) + { + Block block = _loc.clone().add(x, y, z).getBlock(); + if ((block.getType() != Material.IRON_FENCE && block.getType() != Material.IRON_BLOCK) || !beaconsAlive) + { + block.setType(Material.AIR); + } + if (beaconsAlive) + { + if (x == -4 || x == 4 || z == -4 || z == 4) + { + if (y != 4) + { + block.setType(Material.IRON_FENCE); + } + } + if (y == 4) + { + block.setType(Material.IRON_BLOCK); + } + } + } + } + } + } + + public boolean handleDamage(String player, double damage) + { + return handleDamage(player, damage, false); + } + + public boolean handleDamage(String player, double damage, boolean force) + { + if (!UtilTime.elapsed(_lastDamage, 400) && !force) + { + return false; + } + + _lastDamager = player; + _lastDamage = System.currentTimeMillis(); + + int dmg = (int)Math.ceil(damage); + + _health -= dmg; + + UtilEnt.PlayDamageSound(_entity); + + return true; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalData.java new file mode 100644 index 000000000..a64e7f68c --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalData.java @@ -0,0 +1,55 @@ +package nautilus.game.arcade.game.games.castleassault.data.medals; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.ChatColor; + +import mineplex.core.common.util.C; + +public class MedalData +{ + private Map _medalScore; + + public MedalData() + { + _medalScore = new HashMap<>(); + } + + public Double getScore(MedalType type) + { + return _medalScore.computeIfAbsent(type, key -> 0D); + } + + public void addScore(MedalType kingDmg, Double score) + { + _medalScore.merge(kingDmg, score, Double::sum); + } + + public static enum MedalLevel + { + GOLD(C.cGold + "Gold", ChatColor.GOLD), + SILVER(C.cGray + "Silver", ChatColor.GRAY), + BRONZE(C.cWhite + "Bronze", ChatColor.WHITE) + ; + + private String _name; + private ChatColor _color; + + private MedalLevel(String name, ChatColor color) + { + _name = name; + _color = color; + } + + public String getName() + { + return _name; + } + + public ChatColor getColor() + { + return _color; + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalType.java new file mode 100644 index 000000000..47abb13c9 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/data/medals/MedalType.java @@ -0,0 +1,21 @@ +package nautilus.game.arcade.game.games.castleassault.data.medals; + +public enum MedalType +{ + ELIM("Eliminations"), + KING_DMG("Damage on King"), + OBJECTIVE_KILL("Objective Kills") + ; + + private String _name; + + private MedalType(String name) + { + _name = name; + } + + public String getName() + { + return _name; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitAlchemist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitAlchemist.java new file mode 100644 index 000000000..d42c40ae0 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitAlchemist.java @@ -0,0 +1,32 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitAlchemist extends KitPlayer +{ + public KitAlchemist(ArcadeManager manager) + { + super(manager, "Alchemist", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.POTION); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.POTION).setData((short)8194).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.POTION).setData((short)8193).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitArcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitArcher.java new file mode 100644 index 000000000..94efc77d0 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitArcher.java @@ -0,0 +1,137 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkFletcher; + +public class KitArcher extends KitPlayer +{ + public KitArcher(ArcadeManager manager) + { + super(manager, "Archer", KitAvailability.Free, + new String[] + { + C.cGrayB + "Starting Kit:", + C.cGray + "Diamond Sword", + C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", + C.cGray + "10 Fletched Arrows", + C.cGreenB + "Starting Ability:", + C.cGreen + "Fletcher: Obtain 1 Fletched Arrow every 7 seconds (Max of 10)" + }, + new Perk[][] + { + new Perk[] {new PerkFletcher(7, 10, true, false)}, + new Perk[] {new PerkFletcher(7, 16, true, false)}, + new Perk[] {new PerkFletcher(7, 24, true, false)}, + new Perk[] {new PerkFletcher(7, 32, true, false)}, + new Perk[] {new PerkFletcher(7, 32, true, false)}, + new Perk[] {new PerkFletcher(7, 32, true, false)} + }, + new String[][] + { + { + C.cGray + "Increase maximum and starting amount of Fletched Arrows to 16" + }, + { + C.cGray + "Increase maximum and starting amount of Fletched Arrows to 24", + C.cGray + "Obtain a Power I Enchantment on your Bow" + }, + { + C.cGray + "Increase maximum and starting amount of Fletched Arrows to 32", + }, + { + C.cGray + "Obtain a Power II Enchantment on your Bow" + }, + { + C.cGray + "Receive a Feather Falling IV Enchantment on your Diamond Boots" + } + }, + Material.BOW); + } + + @Override + public void GiveItems(Player player) + { + giveRegeneration(player); + + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 0) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(10).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 1) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(16).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 2) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).addEnchantment(Enchantment.ARROW_DAMAGE, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(24).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 3) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).addEnchantment(Enchantment.ARROW_DAMAGE, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(32).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 4) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).addEnchantment(Enchantment.ARROW_DAMAGE, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(32).setTitle(F.item("Fletched Arrow")).build()); + } + else if (level == 5) + { + player.getInventory().setItem(1, new ItemBuilder(Material.BOW).addEnchantment(Enchantment.ARROW_DAMAGE, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ARROW).setAmount(32).setTitle(F.item("Fletched Arrow")).build()); + } + + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + if (level < 5) + { + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else + { + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_FALL, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + } + + @Override + public void awardKillStreak(Player player, int streak) + { + if (streak == 2) + { + player.sendMessage(C.cRedB + "You have received 8 Arrows as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.ARROW).setAmount(8).setTitle(F.item("Fletched Arrow")).build()); + } + else if (streak == 4) + { + player.sendMessage(C.cRedB + "You have received 12 Arrows as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.ARROW).setAmount(12).setTitle(F.item("Fletched Arrow")).build()); + } + else if (streak == 6) + { + player.sendMessage(C.cRedB + "You have received a Punch I book as a Kill Streak Reward!"); + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.ARROW_KNOCKBACK, 1).build()); + } + else if (streak == 8) + { + player.sendMessage(C.cRedB + "You have received 32 Arrows as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.ARROW).setAmount(32).setTitle(F.item("Fletched Arrow")).build()); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitBuilder.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitBuilder.java new file mode 100644 index 000000000..9e3134e75 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitBuilder.java @@ -0,0 +1,32 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitBuilder extends KitPlayer +{ + public KitBuilder(ArcadeManager manager) + { + super(manager, "Builder", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.STONE); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.STONE).setAmount(64).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.WOOD).setAmount(64).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitDemolitionist.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitDemolitionist.java new file mode 100644 index 000000000..5af012192 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitDemolitionist.java @@ -0,0 +1,152 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkBomberHG; + +public class KitDemolitionist extends KitPlayer +{ + public KitDemolitionist(ArcadeManager manager) + { + super(manager, "Demolitionist", KitAvailability.Free, + new String[] + { + C.cGrayB + "Starting Kit:", + C.cGray + "Diamond Sword, Flint and Steel", + C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", + C.cGray + "Blast Protection IV on all Armor", + C.cGray + "2 Throwing TNT", + C.cGreenB + "Passive Ability:", + C.cGreen + "3 Block Range Increase on TNT Damage", + C.cGreenB + "Starting Ability:", + C.cGreen + "Bombmaker: Obtain 1 Throwing TNT every 10 seconds (Max of 2)" + }, + new Perk[][] + { + new Perk[] {new PerkBomberHG(10, 2, true)}, + new Perk[] {new PerkBomberHG(10, 4, true)}, + new Perk[] {new PerkBomberHG(10, 6, true)}, + new Perk[] {new PerkBomberHG(10, 4, true)}, + new Perk[] {new PerkBomberHG(10, 4, true)}, + new Perk[] {new PerkBomberHG(10, 6, true)} + }, + new String[][] + { + { + C.cGray + "Increase maximum and starting amount of Throwing TNT to 4" + }, + { + C.cGray + "Increase maximum and starting amount of Throwing TNT to 6" + }, + { + C.cGray + "Reduce maximum and starting amount of Throwing TNT to 4", + C.cGray + "Increase range of Throwing TNT by 1.5 times" + }, + { + C.cGray + "Increase range of Throwing TNT by 2.5 times" + }, + { + C.cGray + "Increase maximum and starting amount of Throwing TNT to 6", + C.cGray + "Increase range of Throwing TNT by 3 times" + } + }, + Material.TNT); + } + + public double getThrowMultiplier(Player player) + { + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 3) + { + return 1.5; + } + else if (level == 4) + { + return 2.5; + } + else if (level == 5) + { + return 3; + } + + return 1; + } + + @Override + public void GiveItems(Player player) + { + giveRegeneration(player); + + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setUnbreakable(true).build()); + + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 0) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(2).build()); + } + else if (level == 1) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); + } + else if (level == 2) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(6).build()); + } + else if (level == 3) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); + } + else if (level == 4) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); + } + else if (level == 5) + { + player.getInventory().setItem(1, getGame().getNewFlintAndSteel(true)); + player.getInventory().setItem(2, new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(6).build()); + } + + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 4).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) + { + if (streak == 2) + { + player.sendMessage(C.cRedB + "You have received 2 Throwing TNT as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(2).build()); + } + else if (streak == 4) + { + player.sendMessage(C.cRedB + "You have received 3 Throwing TNT as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(3).build()); + } + else if (streak == 6) + { + player.sendMessage(C.cRedB + "You have received 4 Throwing TNT as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(4).build()); + } + else if (streak == 8) + { + player.sendMessage(C.cRedB + "You have received 5 Throwing TNT as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.TNT).setTitle(F.item("Throwing TNT")).setAmount(5).build()); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitEnchanter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitEnchanter.java new file mode 100644 index 000000000..fc15f48ba --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitEnchanter.java @@ -0,0 +1,35 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitEnchanter extends KitPlayer +{ + public KitEnchanter(ArcadeManager manager) + { + super(manager, "Enchanter", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.ENCHANTED_BOOK); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new EnchantedBookBuilder(1).setLevel(Enchantment.DAMAGE_ALL, 1).build()); + player.getInventory().setItem(2, new EnchantedBookBuilder(1).setLevel(Enchantment.PROTECTION_ENVIRONMENTAL, 1).build()); + player.getInventory().setItem(3, new ItemBuilder(Material.EXP_BOTTLE).setAmount(32).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java new file mode 100644 index 000000000..986bfb915 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitFighter.java @@ -0,0 +1,130 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitFighter extends KitPlayer +{ + public KitFighter(ArcadeManager manager) + { + super(manager, "Fighter", KitAvailability.Free, + new String[] + { + C.cGrayB + "Starting Kit:", + C.cGray + "Diamond Sword", + C.cGray + "1 Golden Applegate", + C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", + C.cGreenB + "Passive Ability:", + C.cGreen + "Bloodlust: Deal half a heart more damage for 3 seconds after killing an enemy" + }, + new Perk[][] + { + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)}, + new Perk[] {new PerkBloodlust(1, 3)} + }, + new String[][] + { + { + C.cGray + "Increase starting amount of Golden Applegates to 2" + }, + { + C.cGray + "Obtain a Fishing Rod" + }, + { + C.cGray + "Obtain a Sharpness I Enchantment on your Diamond Sword" + }, + { + C.cGray + "Obtain a Knockback II Enchantment on your Fishing Rod", + C.cGray + "Increase starting amount of Golden Applegates to 3" + }, + { + C.cGray + "Obtain a Sharpness II Enchantment on your Diamond Sword" + } + }, + Material.DIAMOND_SWORD); + } + + @Override + public void GiveItems(Player player) + { + giveRegeneration(player); + + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 0) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (level == 1) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (level == 2) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (level == 3) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(2).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (level == 4) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).addEnchantment(Enchantment.KNOCKBACK, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(3).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (level == 5) + { + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).addEnchantment(Enchantment.DAMAGE_ALL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.FISHING_ROD).addEnchantment(Enchantment.KNOCKBACK, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.GOLDEN_APPLE).setAmount(3).setTitle(C.cPurple + "Golden Applegate").build()); + } + + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) + { + if (streak == 2) + { + player.sendMessage(C.cRedB + "You have received a Golden Applegate as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (streak == 4) + { + player.sendMessage(C.cRedB + "You have received a Splash Healing II Potion as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.POTION).setData((short)16421).build()); + } + else if (streak == 6) + { + player.sendMessage(C.cRedB + "You have received a Speed II Potion as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.POTION).setData((short)8290).build()); + } + else if (streak == 8) + { + player.sendMessage(C.cRedB + "You have received a Fire Aspect I book as a Kill Streak Reward!"); + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.FIRE_ASPECT, 1).build()); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitHardline.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitHardline.java new file mode 100644 index 000000000..7cb59e5f4 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitHardline.java @@ -0,0 +1,30 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitHardline extends KitPlayer +{ + public KitHardline(ArcadeManager manager) + { + super(manager, "Hardline", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.GOLDEN_APPLE); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitNinja.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitNinja.java new file mode 100644 index 000000000..acb2f4590 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitNinja.java @@ -0,0 +1,33 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkFallModifier; + +public class KitNinja extends KitPlayer +{ + public KitNinja(ArcadeManager manager) + { + super(manager, "Ninja", KitAvailability.Free, new String[] {}, new Perk[] {new PerkFallModifier(0.5)}, Material.ENDER_PEARL); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.WATER_BUCKET).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.ENDER_PEARL).setAmount(2).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java new file mode 100644 index 000000000..ac445dd49 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitPlayer.java @@ -0,0 +1,65 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.castleassault.CastleAssault; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.ProgressingKit; + +public abstract class KitPlayer extends ProgressingKit +{ + private boolean _progressionEnabled = false; + + public KitPlayer(ArcadeManager manager, String name, KitAvailability availability, String[] description, Perk[] perks, Material holding) + { + super(manager, name, "castleassault" + name.toLowerCase(), availability, description, perks, EntityType.ZOMBIE, new ItemStack(holding)); + } + + public KitPlayer(ArcadeManager manager, String name, KitAvailability availability, String[] description, Perk[][] perks, String[][] upgradeDetails, Material holding) + { + super(manager, name, "castleassault" + name.toLowerCase(), availability, description, perks, upgradeDetails, EntityType.ZOMBIE, new ItemStack(holding)); + + _progressionEnabled = true; + } + + public abstract void awardKillStreak(Player player, int streak); + + protected CastleAssault getGame() + { + return (CastleAssault) Manager.GetGame(); + } + + protected void giveRegeneration(Player player) + { + player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20 * 5, 3)); + } + + @Override + public void SpawnCustom(LivingEntity ent) {} + + @Override + public boolean showUpgrades() + { + return _progressionEnabled; + } + + @Override + public boolean crownsEnabled() + { + return true; + } + + @Override + public boolean usesXp() + { + return false; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java new file mode 100644 index 000000000..c6b01406f --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitTank.java @@ -0,0 +1,143 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import mineplex.core.common.util.C; +import mineplex.core.itemstack.EnchantedBookBuilder; +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitTank extends KitPlayer +{ + public KitTank(ArcadeManager manager) + { + super(manager, "Tank", KitAvailability.Free, + new String[] + { + C.cGrayB + "Starting Kit:", + C.cGray + "Diamond Sword", + C.cGray + "Diamond Helmet, Iron Chestplate, Iron Leggings, Diamond Boots", + C.cGray + "Protection I on Iron Armor" + }, + new Perk[][] + { + new Perk[] {}, + new Perk[] {}, + new Perk[] {}, + new Perk[] {}, + new Perk[] {}, + new Perk[] {} + }, + new String[][] + { + { + C.cGray + "Obtain a Protection II Enchantment on your Iron Armor" + }, + { + C.cGray + "Obtain a Protection I Enchantment on your Diamond Helmet" + }, + { + C.cGray + "Obtain a Protection I Enchantment on your Diamond Boots" + }, + { + C.cGray + "Obtain a Protection II Enchantment on your Diamond Helmet", + C.cGray + "Obtain a Protection II Enchantment on your Diamond Boots" + }, + { + C.cGray + "Obtain a Protection III Enchantment on your Iron Chestplate", + C.cGray + "Obtain a Protection III Enchantment on your Iron Leggings" + } + }, + Material.DIAMOND_CHESTPLATE); + } + + @Override + public void GiveItems(Player player) + { + giveRegeneration(player); + + player.getInventory().setItem(0, new ItemBuilder(Material.DIAMOND_SWORD).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + + int level = getUpgradeLevel(player.getUniqueId()); + if (level == 0) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 1) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 2) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 3) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 4) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + else if (level == 5) + { + player.getInventory().setHelmet(new ItemBuilder(Material.DIAMOND_HELMET).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 3).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 3).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.DIAMOND_BOOTS).addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 2).setLore(C.cGold + "Kit Item").setUnbreakable(true).build()); + } + } + + @Override + public void awardKillStreak(Player player, int streak) + { + if (streak == 2) + { + player.sendMessage(C.cRedB + "You have received a Golden Applegate as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.GOLDEN_APPLE).setAmount(1).setTitle(C.cPurple + "Golden Applegate").build()); + } + else if (streak == 4) + { + player.sendMessage(C.cRedB + "You have received a Regeneration II Potion as a Kill Streak Reward!"); + player.getInventory().addItem(new ItemBuilder(Material.POTION).setData((short)8289).build()); + } + else if (streak == 6) + { + player.sendMessage(C.cRedB + "You have received a Resistance I Potion as a Kill Streak Reward!"); + ItemStack item = new ItemBuilder(Material.POTION).setData((short)8205).build(); + PotionMeta pm = (PotionMeta) item.getItemMeta(); + pm.clearCustomEffects(); + pm.addCustomEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 20 * 60, 0), true); + item.setItemMeta(pm); + player.getInventory().addItem(item); + } + else if (streak == 8) + { + player.sendMessage(C.cRedB + "You have received a Thorns II book as a Kill Streak Reward!"); + player.getInventory().addItem(new EnchantedBookBuilder(1).setLevel(Enchantment.THORNS, 2).build()); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitWorkman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitWorkman.java new file mode 100644 index 000000000..0cb37d4e1 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/KitWorkman.java @@ -0,0 +1,33 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; + +import mineplex.core.itemstack.ItemBuilder; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitWorkman extends KitPlayer +{ + public KitWorkman(ArcadeManager manager) + { + super(manager, "Workman", KitAvailability.Free, new String[] {}, new Perk[] {}, Material.DIAMOND_PICKAXE); + } + + @Override + public void GiveItems(Player player) + { + player.getInventory().setItem(0, new ItemBuilder(Material.IRON_SWORD).setUnbreakable(true).build()); + player.getInventory().setItem(1, new ItemBuilder(Material.DIAMOND_PICKAXE).addEnchantment(Enchantment.DIG_SPEED, 2).setUnbreakable(true).build()); + player.getInventory().setItem(2, new ItemBuilder(Material.DIAMOND_SPADE).addEnchantment(Enchantment.DIG_SPEED, 2).setUnbreakable(true).build()); + player.getInventory().setHelmet(new ItemBuilder(Material.IRON_HELMET).setUnbreakable(true).build()); + player.getInventory().setChestplate(new ItemBuilder(Material.IRON_CHESTPLATE).setUnbreakable(true).build()); + player.getInventory().setLeggings(new ItemBuilder(Material.IRON_LEGGINGS).setUnbreakable(true).build()); + player.getInventory().setBoots(new ItemBuilder(Material.IRON_BOOTS).setUnbreakable(true).build()); + } + + @Override + public void awardKillStreak(Player player, int streak) {} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/PerkBloodlust.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/PerkBloodlust.java new file mode 100644 index 000000000..9dc21c017 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castleassault/kits/PerkBloodlust.java @@ -0,0 +1,135 @@ +package nautilus.game.arcade.game.games.castleassault.kits; + +import java.util.Map; +import java.util.WeakHashMap; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.PlayerDeathEvent; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import nautilus.game.arcade.kit.Perk; + +public class PerkBloodlust extends Perk +{ + private Map _lusting = new WeakHashMap<>(); + + private double _damageBoost; + private int _duration; + + public PerkBloodlust(double damageBoost, int duration) + { + super("Bloodlust", + new String[] + { + C.cGray + "Deal an extra " + (damageBoost / 2) + " hearts of damage for " + duration + " seconds after a kill.", + } + ); + + _damageBoost = damageBoost; + _duration = duration; + } + + @EventHandler + public void onDeath(PlayerDeathEvent event) + { + Integer id = _lusting.remove(event.getEntity()); + if (id != null) + { + Bukkit.getScheduler().cancelTask(id.intValue()); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onCombatDeath(CombatDeathEvent event) + { + if (event.GetLog().GetKiller() == null) + { + return; + } + + if (!event.GetLog().GetKiller().IsPlayer()) + { + return; + } + + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + { + return; + } + + if (!Kit.HasKit(player)) + { + return; + } + + if (!Manager.GetGame().IsAlive(player)) + { + return; + } + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + if (!hasPerk(player)) + { + return; + } + + Integer id = _lusting.remove(player); + if (id != null) + { + Bukkit.getScheduler().cancelTask(id.intValue()); + } + + player.sendMessage(C.cRed + "You are now channeling bloodlust for 3 seconds!"); + _lusting.put(player, Bukkit.getScheduler().runTaskLater(UtilServer.getPlugin(), () -> _lusting.remove(player), _duration * 20).getTaskId()); + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void damageIncrease(EntityDamageByEntityEvent event) + { + if (event.getCause() == DamageCause.FIRE_TICK) + return; + + if (event.getDamage() <= 1) + return; + + if (!(event.getDamager() instanceof Player)) + return; + + Player damager = (Player) event.getDamager(); + + if (!Kit.HasKit(damager)) + { + return; + } + + if (!hasPerk(damager)) + { + return; + } + + if (!Manager.IsAlive(damager)) + { + return; + } + + if (!_lusting.containsKey(damager)) + { + return; + } + + event.setDamage(event.getDamage() + _damageBoost); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java index c3b1332e3..43e8de9d6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/draw/Draw.java @@ -189,7 +189,38 @@ public class Draw extends SoloGame "Piano", "Guitar", "Trumpet", "Drums", "Flute", "Helicopter", "Plane", "Football", "Tennis", "Hockey", "Water", "Ocean", "Microsoft", "Twitter", "Godzilla", "Building", "House", "Rainbow", "Barbie", "Girl", "Boy", "Children", "Bomb", "Explosion", "Gun", "Tank", "Penguin", "Eagle", "America", "Kangaroo", "Sea", "Raspberry", - "Strawberry", "Jam", "Sandwich", "Owl", "Watermelon", "Australia", "Canada", "United States", "Diary" + "Strawberry", "Jam", "Sandwich", "Owl", "Watermelon", "Australia", "Canada", "United States", "Diary", + "Airplane", "Alarm clock", "Alien", "Alligator", "Ant", "Apple", "Arm", "Autumn", "Baby", "Ball", + "Balloon", "Banana", "Barn", "Base", "Baseball", "Basketball", "Bat", "Bathroom", "Battery", "Beach", + "Bear", "Beaver", "Bed", "Beehive", "Bell", "Bicycle", "Bike", "Bird", "Birthday cake", "Blocks", + "Boat", "Bone", "Book", "Boot", "Bottle", "Bowtie", "Boy", "Bracelet", "Brain", "Branch", + "Bread", "Bridge", "Bubble", "Bug", "Bunny", "Bus", "Cage", "Cake", "Camera", "Cape", + "Carrot", "Castle", "Cat", "Cave", "Chair", "Chalk", "Cheek", "Cheese", "Cheeseburger", "Cherry", + "Chess", "Chicken", "Chin", "Christmas", "Circle", "Circus", "Clock", "Cloud", "Coal", "Coat", + "Coconut", "Computer", "Cone", "Cookie", "Corn", "Cow", "Crab", "Crib", "Cup", "Cupcake", + "Desert", "Desk", "Dinosaur", "Dog", "Doll", "Dominoes", "Door", "Doormat", "Drum", "Duck", + "Ear", "Ears", "Egg", "Electricity", "Elephant", "Eraser", "Eyes", "Face", "Farm", "Fishing pole", + "Fist", "Flamingo", "Flashlight", "Flower", "Flute", "Fly", "Football", "Forest", "Fountain", "Frenchfries", + "Frog", "Garbage", "Garden", "Gate", "Ghost", "Gingerbread man", "Giraffe", "Girl", "Glasses", "Grapes", + "Grass", "Graveyard", "Hair dryer", "Halloween", "Hat", "Head", "Heart", "Hippo", "Hockey", "Hook", + "Hopscotch", "Horse", "Hospital", "House", "Hula hoop", "Ice", "Icecream", "Jacket", "Jar", "Jellyfish", + "Jungle", "Kangaroo", "Key", "Kitchen", "Kite", "Knot", "Lamp", "Lawnmower", "Leaf", "Light", + "Lightbulb", "Lighthouse", "Lightsaber", "Lips", "Lipstick", "Lobster", "Lollipop", "Mail", "Mailman", "Mattress", + "Milk", "Money", "Monkey", "Moon", "Mosquito", "Mouse", "Mouth", "Muffin", "Mushroom", "Music", + "Nail", "Newspaper", "Nightmare", "Nose", "Ocean", "Orange", "Owl", "Pajamas", "Palace", "Park", + "Party", "Peach", "Peanut", "Pen", "Pencil", "Penguin", "Person", "Photograph", "Piano", "Pie", + "Pig", "Pillow", "Pineapple", "Ping pong", "Pinwheel", "Pirate", "Pizza", "Plate", "Pool Party", "Popcorn", + "Popsicle", "Potato", "Pretzel", "Prison", "Puppet", "Purse", "Queen", "Rain", "Rainbow", "Restaurant", + "Rhinoceros", "Ring", "River", "Road", "Robot", "Rocket", "Rocking chair", "Roof", "Round", "Rug", + "Ruins", "Saddle", "Sailboat", "Salt and pepper", "Scale", "School", "Scissors", "Seahorse", "Seashell", "Seesaw", + "Shark", "Sheep", "Shirt", "Shoe", "Shopping cart", "Shovel", "Skate", "Skateboard", "Ski", "Skirt", + "Slide", "Smile", "Snail", "Snake", "Snowball", "Snowflake", "Snowman", "Soap", "Socks", "Soda", + "Song", "Spaceship", "Spider", "Spider web", "Spoon", "Spring", "Stage", "Stairs", "Star", "State", + "Statue", "Stingray", "Stoplight", "Storm", "Suitcase", "Summer", "Sun", "Sunflower", "Swimming pool", "Swing", + "Swordfish", "Tail", "Taxi", "Teapot", "Telephone", "Thief", "Toast", "Toothbrush", "Torch", "Treasure", + "Tree", "Truck", "Trumpet", "Turtle", "TV", "Vest", "Violin", "Volcano", "Washing machine", "Water", + "Waterfall", "Watering can", "Whale", "Whisk", "Whistle", "Windmill", "Winter", "Worm", "Wrench", "Yo-yo", + "Zoo" }; _christmasWords = new String[] diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java index 0cf783f9a..e7c0ebbb2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/lobbers/kits/KitJumper.java @@ -29,7 +29,7 @@ public class KitJumper extends ProgressingKit }; private static final Perk[] PERKS = { - new PerkDoubleJump("Double Jump", 1.2, 1.2, false, 6000, true), + new PerkDoubleJump("Double Jump", 1.2, 1.2, false, 3000, true), new PerkDummy("Feathered Boots", Collections.singletonList(C.cGray + "You take no fall damage.").toArray(new String[1])), new PerkCraftman() }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java index 6dd3ab954..ecf16a805 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java @@ -1,16 +1,36 @@ package nautilus.game.arcade.game.games.smash; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import org.bukkit.ChatColor; -import org.bukkit.Color; +import com.google.common.collect.Sets; +import mineplex.core.blockrestore.BlockRestore; +import mineplex.core.common.Rank; +import mineplex.core.common.util.*; +import mineplex.core.disguise.disguises.DisguiseBase; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.hologram.Hologram; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.mount.Mount; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeFormat; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.DebugCommand; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.GameTeam.PlayerState; +import nautilus.game.arcade.game.games.smash.events.SmashActivateEvent; +import nautilus.game.arcade.game.games.smash.kits.*; +import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; +import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.managers.PerkSpreadsheetModule; +import org.bukkit.*; import org.bukkit.FireworkEffect.Type; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.entity.EnderCrystal; import org.bukkit.entity.LivingEntity; @@ -18,70 +38,18 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.*; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -import org.bukkit.event.entity.ItemSpawnEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitRunnable; -import com.google.common.collect.Sets; - -import mineplex.core.blockrestore.BlockRestore; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilFirework; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTextMiddle; -import mineplex.core.hologram.Hologram; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; - -import nautilus.game.arcade.ArcadeFormat; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.GameTeam.PlayerState; -import nautilus.game.arcade.game.games.smash.kits.KitBlaze; -import nautilus.game.arcade.game.games.smash.kits.KitChicken; -import nautilus.game.arcade.game.games.smash.kits.KitCow; -import nautilus.game.arcade.game.games.smash.kits.KitCreeper; -import nautilus.game.arcade.game.games.smash.kits.KitEnderman; -import nautilus.game.arcade.game.games.smash.kits.KitGolem; -import nautilus.game.arcade.game.games.smash.kits.KitGuardian; -import nautilus.game.arcade.game.games.smash.kits.KitMagmaCube; -import nautilus.game.arcade.game.games.smash.kits.KitPig; -import nautilus.game.arcade.game.games.smash.kits.KitSheep; -import nautilus.game.arcade.game.games.smash.kits.KitSkeletalHorse; -import nautilus.game.arcade.game.games.smash.kits.KitSkeleton; -import nautilus.game.arcade.game.games.smash.kits.KitSkySquid; -import nautilus.game.arcade.game.games.smash.kits.KitSlime; -import nautilus.game.arcade.game.games.smash.kits.KitSnowman; -import nautilus.game.arcade.game.games.smash.kits.KitSpider; -import nautilus.game.arcade.game.games.smash.kits.KitWitch; -import nautilus.game.arcade.game.games.smash.kits.KitWitherSkeleton; -import nautilus.game.arcade.game.games.smash.kits.KitWolf; -import nautilus.game.arcade.game.games.smash.kits.KitZombie; -import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; -import nautilus.game.arcade.game.modules.compass.CompassModule; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.Perk; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; public abstract class SuperSmash extends Game { @@ -125,9 +93,89 @@ public abstract class SuperSmash extends Game WorldWaterDamage = 1000; HideTeamSheep = true; ReplaceTeamsWithKits = true; + + manager.GetExplosion().SetRegenerate(true); + manager.GetExplosion().setRegenerateTime(TimeUnit.SECONDS.toMillis(30)); + new CompassModule() .setGiveCompassToAlive(true) .register(this); + + new PerkSpreadsheetModule(this, "SMASH_KITS"); + + registerDebugCommand(new DebugCommand("cooldown", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + for (Player other : UtilServer.getPlayers()) + { + Recharge.Instance.Reset(other); + } + + Announce(C.cWhiteB + caller.getName() + C.cAquaB + " reset cooldowns!"); + } + }); + registerDebugCommand(new DebugCommand("nextsmash", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + _nextPowerup = System.currentTimeMillis() + 1000; + Announce(C.cWhiteB + caller.getName() + C.cAquaB + " spawned a smash crystal!"); + } + }); + registerDebugCommand(new DebugCommand("smash", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + giveSmashItem(caller); + } + }); + registerDebugCommand(new DebugCommand("kit", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + String kit = ""; + + for (int i = 0; i < args.length; i++) + { + kit += args[i] + " "; + } + + kit = kit.trim(); + + for (Kit kits : GetKits()) + { + if (kit.equalsIgnoreCase(kits.GetName())) + { + SetKit(caller, kits, true); + return; + } + } + + caller.sendMessage(F.main("Kit", "Sorry that is not a kit!")); + } + }); + registerDebugCommand(new DebugCommand("lives", Rank.ADMIN) + { + @Override + public void Execute(Player caller, String[] args) + { + Announce(C.cWhiteB + caller.getName() + C.cAquaB + " reset their lives!"); + + if (!IsAlive(caller)) + { + SetPlayerState(caller, PlayerState.IN); + RespawnPlayer(caller); + caller.sendMessage(F.main("Revive", "You are back in the game!")); + } + + _lives.put(caller, MAX_LIVES); + } + }); } @EventHandler(priority = EventPriority.HIGH) @@ -153,18 +201,6 @@ public abstract class SuperSmash extends Game { SetPlayerState(event.getEntity(), PlayerState.OUT); } - - // I think this causes players to sometimes be invisible - // DisguiseManager disguiseManager = Manager.GetDisguise(); - // DisguiseBase disguise = - // disguiseManager.getActiveDisguise(event.getEntity()); - // - // if (disguise == null) - // { - // return; - // } - // - // disguiseManager.undisguise(disguise); } @EventHandler @@ -227,12 +263,12 @@ public abstract class SuperSmash extends Game @EventHandler public void triggerSuper(PlayerInteractEvent event) { - if (!IsLive()) + if (!IsLive() || !UtilEvent.isAction(event, UtilEvent.ActionType.R)) { return; } - if (event.getMaterial() != Material.NETHER_STAR) + if (event.getMaterial() != null && event.getMaterial() != Material.NETHER_STAR) { return; } @@ -251,6 +287,15 @@ public abstract class SuperSmash extends Game continue; } + SmashActivateEvent smashActivateEvent = new SmashActivateEvent(player); + + UtilServer.CallEvent(smashActivateEvent); + + if (smashActivateEvent.isCancelled()) + { + return; + } + UtilInv.remove(player, Material.NETHER_STAR, (byte) 0, 1); player.setHealth(player.getMaxHealth()); @@ -507,6 +552,13 @@ public abstract class SuperSmash extends Game } } + // Deactivate morph if active + Gadget gadget = Manager.getCosmeticManager().getGadgetManager().getActive(player, GadgetType.MORPH); + if (gadget != null) + { + gadget.disable(player); + } + _playerKit.put(player, kit); if (announce) @@ -522,37 +574,15 @@ public abstract class SuperSmash extends Game @EventHandler(priority = EventPriority.LOWEST) public void abilityDescription(PlayerInteractEvent event) { - if (event.isCancelled()) - { - return; - } - Player player = event.getPlayer(); ItemStack itemStack = player.getItemInHand(); - if (itemStack == null) + if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getItemMeta().getDisplayName() == null || itemStack.getItemMeta().getLore() == null || !displayKitInfo(player)) { return; } - if (itemStack.getItemMeta() == null) - { - return; - } - - ItemMeta itemMeta = itemStack.getItemMeta(); - - if (itemMeta.getDisplayName() == null) - { - return; - } - - if (itemMeta.getLore() == null) - { - return; - } - - if (GetState() != GameState.Recruit) + if (itemStack.getType() == Material.WATCH || itemStack.getType() == Material.BED) { return; } @@ -697,81 +727,9 @@ public abstract class SuperSmash extends Game return _lives; } - @EventHandler - public void debugCommands(PlayerCommandPreprocessEvent event) + protected boolean displayKitInfo(Player player) { - if (!UtilServer.isTestServer()) - { - return; - } - - String message = event.getMessage(); - Player player = event.getPlayer(); - - if (message.startsWith("/cooldown")) - { - event.setCancelled(true); - - for (Player other : UtilServer.getPlayers()) - { - Recharge.Instance.Reset(other); - } - - Announce(C.cWhiteB + player.getName() + C.cAquaB + " reset cooldowns!"); - } - else if (message.startsWith("/nextsmash")) - { - event.setCancelled(true); - - _nextPowerup = System.currentTimeMillis() + 1000; - Announce(C.cWhiteB + player.getName() + C.cAquaB + " spawned a smash crystal!"); - } - else if (message.startsWith("/smash")) - { - event.setCancelled(true); - - giveSmashItem(player); - } - else if (message.startsWith("/kit")) - { - event.setCancelled(true); - - String[] args = message.split(" "); - String kit = ""; - - for (int i = 1; i < args.length; i++) - { - kit += args[i] + " "; - } - - kit = kit.trim(); - - for (Kit kits : GetKits()) - { - if (kit.equalsIgnoreCase(kits.GetName())) - { - SetKit(player, kits, true); - return; - } - } - - player.sendMessage(F.main("Kit", "Sorry that is not a kit!")); - } - else if (message.startsWith("/lives")) - { - event.setCancelled(true); - - Announce(C.cWhiteB + player.getName() + C.cAquaB + " reset their lives!"); - - if (!IsAlive(player)) - { - SetPlayerState(player, PlayerState.IN); - RespawnPlayer(player); - player.sendMessage(F.main("Revive", "You are back in the game!")); - } - - _lives.put(player, MAX_LIVES); - } + return GetState() == GameState.Recruit; } public void setNextPowerupTime(long time) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java new file mode 100644 index 000000000..064ce150a --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmashTraining.java @@ -0,0 +1,233 @@ +package nautilus.game.arcade.game.games.smash; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilTime; +import mineplex.core.hologram.Hologram; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.games.smash.events.SmashActivateEvent; +import nautilus.game.arcade.game.modules.TrainingGameModule; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; + +public class SuperSmashTraining extends SuperSmash +{ + + private static final long GAME_TIME = TimeUnit.HOURS.toMillis(3); + private static final long GAME_WARN_TIME = GAME_TIME - TimeUnit.MINUTES.toMillis(5); + private static final String[] INFO_HOLOGRAM = { + C.cYellow + "Select a " + C.cGreen + "Kit", + C.cYellow + "Jump off the island to use your abilities", + C.cYellow + "You can then " + C.cGreen + "PVP" + C.cYellow + " other players", + C.cYellow + "Click the " + C.cGreen + "Bed" + C.cYellow + " to return to this island" + }; + + private Location _borderA; + private Location _borderB; + private Function _safeFunction = player -> !UtilAlg.inBoundingBox(player.getLocation(), _borderA, _borderB); + private Map _lastDeath; + + private boolean _announceEnd; + + public SuperSmashTraining(ArcadeManager manager) + { + super(manager, GameType.SmashTraining, new String[]{ + "Super Smash Mobs Training Ground" + }); + + DamageTeamSelf = true; + DeathSpectateSecs = 0; + PrepareTime = 500; + GiveClock = false; + HungerSet = 20; + + _lastDeath = new HashMap<>(); + + new TrainingGameModule() + .setSkillFunction(_safeFunction) + .setDamageFunction(_safeFunction) + .register(this); + } + + @Override + public void ParseData() + { + List locations = WorldData.GetDataLocs("BROWN"); + + _borderA = locations.get(0); + _borderB = locations.get(1); + } + + @EventHandler + public void customTeamGeneration(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Recruit) + { + return; + } + + GameTeam players = GetTeamList().get(0); + players.SetColor(ChatColor.YELLOW); + players.SetName("Players"); + players.setDisplayName(C.cYellowB + "Players"); + } + + @EventHandler + public void live(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Live) + { + return; + } + + List locations = WorldData.GetDataLocs("BLUE"); + + for (Location location : locations) + { + spawnInfoHologram(location); + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + + Scoreboard.writeNewLine(); + + List alive = GetPlayers(true); + + Scoreboard.write(C.cYellowB + "Players"); + + if (alive.size() > 9) + { + Scoreboard.write(alive.size() + " Alive"); + } + else + { + for (Player player : alive) + { + Scoreboard.write(player.getName()); + } + } + + Scoreboard.writeNewLine(); + + Scoreboard.write(C.cYellowB + "Time"); + Scoreboard.write(UtilTime.MakeStr(System.currentTimeMillis() - GetStateTime())); + + Scoreboard.writeNewLine(); + + Scoreboard.draw(); + } + + @Override + public List getWinners() + { + return null; + } + + @Override + public List getLosers() + { + return null; + } + + @Override + @EventHandler + public void playerDeath(PlayerDeathEvent event) + { + _lastDeath.put(event.getEntity().getUniqueId(), System.currentTimeMillis()); + } + + @EventHandler + public void cleanlastDeath(UpdateEvent event) + { + if (!IsLive() || event.getType() != UpdateType.FAST) + { + return; + } + + for (Player player : GetPlayers(true)) + { + if (_safeFunction.apply(player)) + { + _lastDeath.remove(player.getUniqueId()); + } + } + } + + @EventHandler + public void smashActivate(SmashActivateEvent event) + { + if (!_safeFunction.apply(event.getPlayer())) + { + event.setCancelled(true); + } + } + + @Override + public void EndCheck() + { + if (!IsLive()) + { + return; + } + + if (UtilTime.elapsed(GetStateTime(), GAME_TIME)) + { + SetState(GameState.Dead); + Announce(C.cRedB + "Game Over! Resetting the map, you will be able to play again."); + } + else if (UtilTime.elapsed(GetStateTime(), GAME_WARN_TIME) && !_announceEnd) + { + _announceEnd = true; + Announce(C.cRedB + "The Game Will End In 5 Minutes."); + } + } + + @Override + public long getNewSmashTime() + { + return (long) (System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(2) + TimeUnit.MINUTES.toMillis(2) * Math.random()); + } + + @Override + protected boolean displayKitInfo(Player player) + { + if (_lastDeath.containsKey(player.getUniqueId())) + { + return UtilTime.elapsed(_lastDeath.get(player.getUniqueId()), 4000); + } + + return super.displayKitInfo(player) || !_safeFunction.apply(player); + } + + private void spawnInfoHologram(Location location) + { + CreatureAllowOverride = true; + + new Hologram(getArcadeManager().getHologramManager(), location, true, INFO_HOLOGRAM).start(); + + CreatureAllowOverride = false; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/events/SmashActivateEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/events/SmashActivateEvent.java new file mode 100644 index 000000000..44b89f7ef --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/events/SmashActivateEvent.java @@ -0,0 +1,42 @@ +package nautilus.game.arcade.game.games.smash.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; + +public class SmashActivateEvent extends PlayerEvent implements Cancellable +{ + + private static final HandlerList HANDLERS = new HandlerList(); + + private boolean _cancelled; + + public SmashActivateEvent(Player who) + { + super(who); + } + + @Override + public boolean isCancelled() + { + return _cancelled; + } + + @Override + public void setCancelled(boolean b) + { + _cancelled = b; + } + + public HandlerList getHandlers() + { + return HANDLERS; + } + + public static HandlerList getHandlerList() + { + return HANDLERS; + } + +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java index 37399886a..b248334df 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitBlaze.java @@ -29,9 +29,9 @@ import nautilus.game.arcade.kit.perks.PerkSpeed; public class KitBlaze extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.5, 0.25, 5), - new PerkDoubleJump("Double Jump", 1, 1, false), - new PerkKnockbackFire(1.50), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkKnockbackFire(), new PerkSpeed(0), new PerkInferno(), new PerkFirefly(), @@ -70,6 +70,7 @@ public class KitBlaze extends SmashKit new ItemStack(Material.CHAINMAIL_BOOTS), new ItemStack(Material.CHAINMAIL_LEGGINGS), new ItemStack(Material.CHAINMAIL_CHESTPLATE), + new ItemStack(Material.CHAINMAIL_HELMET) }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitChicken.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitChicken.java index 6e4f0b442..434bef8f3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitChicken.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitChicken.java @@ -25,8 +25,8 @@ public class KitChicken extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(4.5, 2.0, 0.2, 2), - new PerkFlap(0.8, 0.8, false), + new PerkSmashStats(), + new PerkFlap(), new PerkEggGun(), new PerkChickenRocket(), new SmashChicken() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCow.java index 33b49741d..7d9c1bf3f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCow.java @@ -26,8 +26,8 @@ public class KitCow extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.1, 0.25, 6.5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkCowStampede(), new PerkCowAngryHerd(), new PerkCowMilkSpiral(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java index 9503a5c9f..6d56a56ad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitCreeper.java @@ -25,8 +25,8 @@ import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitCreeper extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.65, 0.4, 3.5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkCreeperElectricity(), new PerkCreeperSulphurBomb(), new PerkCreeperExplode(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java index 0b2307689..cb1e1d08d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitEnderman.java @@ -1,23 +1,11 @@ package nautilus.game.arcade.game.games.smash.kits; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map.Entry; - -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.inventory.ItemStack; - import mineplex.core.common.util.C; import mineplex.core.common.util.UtilInv; +import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.disguise.disguises.DisguiseEnderman; import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.game.games.smash.perks.PerkSmashStats; @@ -31,14 +19,21 @@ import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.kit.perks.PerkDoubleJump; import nautilus.game.arcade.kit.perks.event.PerkBlockGrabEvent; import nautilus.game.arcade.kit.perks.event.PerkBlockThrowEvent; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.inventory.ItemStack; public class KitEnderman extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(7, 1.3, 0.25, 6), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), - new PerkBlink("Blink", 16, 6000), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkBlink("Blink"), new PerkBlockToss(), new PerkEndermanTeleport(), new SmashEnderman() @@ -82,8 +77,6 @@ public class KitEnderman extends SmashKit }; - public HashMap _disguises = new HashMap(); - public KitEnderman(ArcadeManager manager) { super(manager, "Enderman", KitAvailability.Gem, 3000, PERKS, EntityType.ENDERMAN, IN_HAND, DisguiseEnderman.class); @@ -93,9 +86,7 @@ public class KitEnderman extends SmashKit public void GiveItems(Player player) { disguise(player); - - _disguises.put(player, (DisguiseEnderman) Manager.GetDisguise().getActiveDisguise(player)); - + UtilInv.Clear(player); player.getInventory().addItem(PLAYER_ITEMS[0], PLAYER_ITEMS[1]); @@ -111,54 +102,51 @@ public class KitEnderman extends SmashKit @EventHandler public void BlockGrab(PerkBlockGrabEvent event) { - SetBlock(_disguises.get(event.GetPlayer()), event.GetId(), event.GetData()); + setBlock(event.GetPlayer(), event.GetId(), event.GetData()); } @EventHandler public void BlockThrow(PerkBlockThrowEvent event) { - SetBlock(_disguises.get(event.GetPlayer()), 0, (byte) 0); + setBlock(event.GetPlayer(), 0, (byte) 0); } @EventHandler public void Death(PlayerDeathEvent event) { - SetBlock(_disguises.get(event.getEntity()), 0, (byte) 0); - } - - public void SetBlock(DisguiseEnderman disguise, int id, byte data) - { - if (disguise == null) - { - return; - } - - disguise.SetCarriedId(id); - disguise.SetCarriedData(data); - - Manager.GetDisguise().updateDisguise(disguise); + setBlock(event.getEntity(), 0, (byte) 0); } @EventHandler - public void cleanDisguises(UpdateEvent event) + public void damage(CustomDamageEvent event) { - if (event.getType() != UpdateType.FAST) + Player player = event.GetDamageePlayer(); + + if (player == null) { return; } - - for (Iterator> iterator = _disguises.entrySet().iterator(); iterator.hasNext();) - { - Entry current = iterator.next(); - if (!Manager.GetDisguise().isDisguised(current.getKey())) - { - iterator.remove(); - } - else if (Manager.GetDisguise().getActiveDisguise(current.getKey()) != current.getValue()) - { - iterator.remove(); - } + DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); + + if (player != null && disguise != null && disguise instanceof DisguiseEnderman) + { + // Endermen drop their held block when damaged. This means the client renders it this way, so we need to resend the correct data on the next tick. + Manager.runSyncLater(() -> Manager.GetDisguise().updateDisguise(disguise), 1); + } + } + + public void setBlock(Player player, int id, byte data) + { + DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); + + if (player != null && disguise != null && disguise instanceof DisguiseEnderman) + { + DisguiseEnderman disguiseEnderman = (DisguiseEnderman) disguise; + disguiseEnderman.SetCarriedId(id); + disguiseEnderman.SetCarriedData(data); + + Manager.GetDisguise().updateDisguise(disguiseEnderman); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java index 00c38f95f..649a3c072 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java @@ -27,8 +27,8 @@ public class KitGolem extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(7, 1.0, 0.2, 8), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkSlow(0), new PerkFissure(), new PerkIronHook(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGuardian.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGuardian.java index 45129c462..6d81d90b6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGuardian.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGuardian.java @@ -26,8 +26,8 @@ public class KitGuardian extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(4, 1.25, 0.25, 4.5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkWhirlpoolBlade(), new PerkWaterSplash(), new PerkTargetLazer(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java index e252a2e64..745f725a6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitMagmaCube.java @@ -30,8 +30,8 @@ public class KitMagmaCube extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.75, 0.35, 5), - new PerkDoubleJump("Double Jump", 1.2, 1, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkMagmaBoost(), new PerkMagmaBlast(), new PerkFlameDash(), @@ -63,6 +63,14 @@ public class KitMagmaCube extends SmashKit ChatColor.RESET + "", ChatColor.RESET + "Right-Click again to end Flame Dash early.", }), + ItemStackFactory.Instance.CreateStack(Material.BLAZE_POWDER, (byte) 0, 1, + C.cYellow + C.Bold + "Passive" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Fuel the Fire", + new String[] + { + ChatColor.RESET + "Each kill increases your size, damage", + ChatColor.RESET + "armor and decreases your knockback taken.", + ChatColor.RESET + "Resets on death.", + }), ItemStackFactory.Instance.CreateStack(Material.NETHER_STAR, (byte) 0, 1, C.cYellow + C.Bold + "Smash Crystal" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Meteor Shower", new String[] @@ -89,21 +97,21 @@ public class KitMagmaCube extends SmashKit public void GiveItems(Player player) { disguise(player); - + DisguiseMagmaCube disguise = (DisguiseMagmaCube) Manager.GetDisguise().getActiveDisguise(player); - + disguise.SetSize(1); - + UtilInv.Clear(player); player.getInventory().addItem(PLAYER_ITEMS[0], PLAYER_ITEMS[1]); if (Manager.GetGame().GetState() == GameState.Recruit) - player.getInventory().addItem(PLAYER_ITEMS[2]); + player.getInventory().addItem(PLAYER_ITEMS[2], PLAYER_ITEMS[3]); - player.getInventory().setArmorContents(PLAYER_ARMOR);; + player.getInventory().setArmorContents(PLAYER_ARMOR); } - + @EventHandler public void fireResistance(UpdateEvent event) { @@ -111,19 +119,19 @@ public class KitMagmaCube extends SmashKit { return; } - + if (Manager.GetGame() == null) { return; } - + for (Player player : Manager.GetGame().GetPlayers(true)) { if (!HasKit(player)) { continue; } - + player.setFireTicks(0); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitPig.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitPig.java index c97306a50..fb92a55d0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitPig.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitPig.java @@ -33,8 +33,8 @@ public class KitPig extends SmashKit private static final float ENERGY_PER_TICK_SMASH = 0.02F; private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.5, 0.25, 5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkPigBaconBounce(), new PerkPigBaconBomb(), new PerkPigZombie(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSheep.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSheep.java index 00dd730ee..7d6c3403d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSheep.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSheep.java @@ -27,9 +27,9 @@ public class KitSheep extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.7, 0.25, 5), - new PerkDoubleJump("Double Jump", 1, 1, false), - new PerkLazer(40, 7000), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkLazer(), new PerkWoolBomb(), new PerkWoolCloud(), new SmashSheep() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java index 0872b37ce..e034fe899 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java @@ -32,8 +32,8 @@ public class KitSkeletalHorse extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.4, 0.3, 6.5), - new PerkDoubleJump("Double Jump", 1, 1, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkHorseKick(), new PerkBoneRush(), new PerkDeadlyBones(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java index 07f123e5b..8237cf19a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeleton.java @@ -35,13 +35,13 @@ public class KitSkeleton extends SmashKit private static double ARROW_DAMAGE = 6; private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.25, 0.2, 6), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), - new PerkFletcher(3, 3, false), - new PerkKnockbackArrow(1.5), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkFletcher(), + new PerkKnockbackArrow(), new PerkBoneExplosion(), - new PerkRopedArrow("Roped Arrow", 1, 5000), - new PerkBarrage(5, 300, true, false, true), + new PerkRopedArrow("Roped Arrow"), + new PerkBarrage(), new SmashSkeleton() }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkySquid.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkySquid.java index 7e0c0bf36..a831fa700 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkySquid.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkySquid.java @@ -26,10 +26,10 @@ public class KitSkySquid extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.5, 0.25, 5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkSuperSquid(), - new PerkInkBlast(7, 2), + new PerkInkBlast(), new PerkFishFlurry(), new SmashSquid() }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java index f439afb7c..0a5c66d2c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java @@ -25,8 +25,8 @@ public class KitSlime extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.75, 0.35, 3), - new PerkDoubleJump("Double Jump", 1.2, 1, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkSlimeSlam(), new PerkSlimeRocket(), new SmashSlime() @@ -66,7 +66,7 @@ public class KitSlime extends SmashKit }; private static final ItemStack[] PLAYER_ARMOR = { - null, + new ItemStack(Material.CHAINMAIL_BOOTS), null, new ItemStack(Material.CHAINMAIL_CHESTPLATE), new ItemStack(Material.CHAINMAIL_HELMET), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSnowman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSnowman.java index c8af47cc9..adfb1ce7b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSnowman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSnowman.java @@ -26,16 +26,6 @@ import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitSnowman extends SmashKit { - private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.4, 0.3, 6), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), - new PerkDamageSnow(1, 0.4), - new PerkArcticAura(), - new PerkBlizzard(), - new PerkIcePath(), - new SmashSnowman() - }; - private static final ItemStack IN_HAND = new ItemStack(Material.SNOW_BALL); private static final ItemStack[] PLAYER_ITEMS = { @@ -80,7 +70,15 @@ public class KitSnowman extends SmashKit public KitSnowman(ArcadeManager manager) { - super(manager, "Snowman", KitAvailability.Gem, 5000, PERKS, EntityType.SNOWMAN, IN_HAND, DisguiseSnowman.class); + super(manager, "Snowman", KitAvailability.Gem, 5000, new Perk[] { + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkDamageSnow(), + new PerkArcticAura(), + new PerkBlizzard(), + new PerkIcePath(), + new SmashSnowman() }, + EntityType.SNOWMAN, IN_HAND, DisguiseSnowman.class); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java index 67cac165b..343ad990b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSpider.java @@ -26,7 +26,7 @@ public class KitSpider extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.5, 0.25, 6), + new PerkSmashStats(), new PerkSpiderLeap(), new PerkNeedler(), new PerkWebShot(), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitch.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitch.java index 34657771c..72a7f2c85 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitch.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitch.java @@ -25,8 +25,8 @@ public class KitWitch extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.5, 0.3, 5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkWitchPotion(), new PerkBatWave(), new SmashWitch() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitherSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitherSkeleton.java index 8efef7fe6..5c9587963 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitherSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWitherSkeleton.java @@ -27,8 +27,8 @@ public class KitWitherSkeleton extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.2, 0.3, 6), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), new PerkWitherSkull(), new PerkWitherImage(), new SmashWitherSkeleton() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java index 0de6382fa..7e758f379 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitWolf.java @@ -24,8 +24,8 @@ public class KitWolf extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(5, 1.6, 0.25, 5), - new PerkDoubleJump("Wolf Jump", 1.0, 1.0, true), + new PerkSmashStats(), + new PerkDoubleJump("Wolf Jump"), new PerkWolf(), new SmashWolf() }; @@ -68,7 +68,7 @@ public class KitWolf extends SmashKit private static final ItemStack[] PLAYER_ARMOR = { null, new ItemStack(Material.CHAINMAIL_LEGGINGS), - new ItemStack(Material.IRON_CHESTPLATE), + new ItemStack(Material.CHAINMAIL_CHESTPLATE), null }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitZombie.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitZombie.java index 62ea7dc0a..5fd207064 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitZombie.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitZombie.java @@ -32,11 +32,11 @@ public class KitZombie extends SmashKit { private static final Perk[] PERKS = { - new PerkSmashStats(6, 1.25, 0.25, 5), - new PerkDoubleJump("Double Jump", 0.9, 0.9, false), - new PerkFletcher(2, 2, false), - new PerkKnockbackArrow(1.5), - new PerkOvercharge(6, 250, true), + new PerkSmashStats(), + new PerkDoubleJump("Double Jump"), + new PerkFletcher(), + new PerkKnockbackArrow(), + new PerkOvercharge(), new PerkZombieBile(), new PerkDeathsGrasp(), new SmashZombie() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java index 2b5d00808..534ab5f3b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkSmashStats.java @@ -17,68 +17,95 @@ public class PerkSmashStats extends Perk private double _damage; private double _knockbackTaken; private double _regen; - - public PerkSmashStats(double damage, double knockbackTaken, double regen, double armor) + private double _armor; + + public PerkSmashStats() { - super("Smash Stats", new String[] - { - - (C.cAqua + "Damage: " + C.cWhite + damage) + C.cWhite + " " + (C.cAqua + "Knockback Taken: " + C.cWhite + (int)(knockbackTaken*100) + "%"), - (C.cAqua + "Armor: " + C.cWhite + armor) + C.cWhite + " " + (C.cAqua + "Health Regeneration: " + C.cWhite + regen + " per Second"), - }); - - _damage = damage; - _knockbackTaken = knockbackTaken; - _regen = regen; - } - + super("Smash Stats"); + } + + @Override + public void setupValues() + { + _damage = getPerkDouble("Damage", _damage); + _knockbackTaken = getPerkPercentage("Knockback Taken", _knockbackTaken); + _regen = getPerkDouble("Regeneration", _regen); + _armor = getPerkDouble("Armor", _armor); + + setDesc( + (C.cAqua + "Damage: " + C.cWhite + _damage) + C.cWhite + " " + (C.cAqua + "Knockback Taken: " + C.cWhite + (int) (_knockbackTaken * 100) + "%"), + (C.cAqua + "Armor: " + C.cWhite + _armor) + C.cWhite + " " + (C.cAqua + "Health Regeneration: " + C.cWhite + _regen + " per Second") + ); + } + @EventHandler(priority = EventPriority.HIGH) public void Damage(CustomDamageEvent event) { if (event.GetCause() != DamageCause.ENTITY_ATTACK) + { return; - + } + Player damager = event.GetDamagerPlayer(false); - if (damager == null) return; - - if (!Kit.HasKit(damager)) + + if (damager == null || !Kit.HasKit(damager) || !Manager.IsAlive(damager)) + { return; - - if (!Manager.IsAlive(damager)) - return; - + } + double mod = _damage - event.GetDamageInitial(); - + event.AddMod(damager.getName(), "Attack", mod, true); } - + @EventHandler(priority = EventPriority.HIGH) public void Knockback(CustomDamageEvent event) { Player damagee = event.GetDamageePlayer(); - if (damagee == null) return; - + if (damagee == null) + { + return; + } + if (!Kit.HasKit(damagee)) + { return; - + } + if (!Manager.IsAlive(damagee)) + { return; - + } + event.AddKnockback("Knockback Multiplier", _knockbackTaken); } - + @EventHandler public void Regeneration(UpdateEvent event) { if (event.getType() != UpdateType.SEC) + { return; - + } + for (Player player : Manager.GetGame().GetPlayers(true)) { if (!Kit.HasKit(player)) + { continue; - + } + UtilPlayer.health(player, _regen); } } + + public double getArmour() + { + return _armor; + } + + public void setArmor(double armor) + { + _armor = armor; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java index 8bddb995c..cb0c4f566 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/SmashUltimate.java @@ -1,15 +1,5 @@ package nautilus.game.arcade.game.games.smash.perks; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; - import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; @@ -17,10 +7,14 @@ import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; - import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.kit.Perk; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import java.util.*; public class SmashUltimate extends Perk { @@ -40,6 +34,12 @@ public class SmashUltimate extends Perk _length = length; } + @Override + public void setupValues() + { + _length = getPerkTime("Duration", _length); + } + public void activate(Player player) { _lastUltimate.put(player.getUniqueId(), System.currentTimeMillis()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java index 29cd6d704..811fbae19 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkFirefly.java @@ -34,29 +34,45 @@ import nautilus.game.arcade.kit.perks.data.FireflyData; public class PerkFirefly extends SmashPerk { - - private static final int COOLDOWN = 12000; - private static final int DURATION = 2750; - private static final int DAMAGE = 7; - - private static final int RADIUS_NORMAL = 4; - private static final float VELOCITY_NORMAL = 0.7F; - - private static final int RADIUS_SMASH = 7; - private static final float VELOCITY_SMASH = 0.79F; - - private static final int HIT_FREQUENCY = 2000; - private static final int WARMUP_TIME = 1500; - private static final int MIN_CANCEL_DAMAGE = 4; - private static final int KNOCKBACK_MAGNITUDE = 2; - private Set _data = new HashSet(); - + private int _cooldown; + private int _duration ; + private int _damage; + + private int _radiusNormal; + private float _velocityNormal; + + private int _radiusSmash; + private float _velocitySmash; + + private int _hitFrequency; + private int _warmupTime; + private int _minCancelDamage; + private int _knockbackMagnitude; + + private Set _data = new HashSet<>(); + private int _tick = 0; - + public PerkFirefly() { - super("Firefly", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Firefly" }); + super("Firefly", new String[]{C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Firefly"}); + } + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _duration = getPerkInt("Duration (ms)"); + _damage = getPerkInt("Damage"); + _radiusNormal = getPerkInt("Radius Normal"); + _velocityNormal = getPerkFloat("Velocity Normal"); + _radiusSmash = getPerkInt("Radius Smash"); + _velocitySmash = getPerkFloat("Velocity Smash"); + _hitFrequency = getPerkInt("Hit Frequency (ms)"); + _warmupTime = getPerkInt("Warmup Time (ms)"); + _minCancelDamage = getPerkInt("Min Cancel Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); } @EventHandler @@ -94,7 +110,7 @@ public class PerkFirefly extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -126,7 +142,7 @@ public class PerkFirefly extends SmashPerk Iterator dataIterator = _data.iterator(); //There are a lot of magic numbers here, they are all arbitrary sound and particle values. - + while (dataIterator.hasNext()) { FireflyData data = dataIterator.next(); @@ -134,15 +150,15 @@ public class PerkFirefly extends SmashPerk Player player = data.Player; boolean superActive = isSuperActive(data.Player); String skillName = superActive ? "Phoenix" : GetName(); - + if (UtilPlayer.isSpectator(player)) { dataIterator.remove(); continue; } - + // Warmup - if (!UtilTime.elapsed(data.Time, WARMUP_TIME) && !superActive) + if (!UtilTime.elapsed(data.Time, _warmupTime) && !superActive) { UtilAction.zeroVelocity(player); player.getWorld().playSound(player.getLocation(), Sound.EXPLODE, 0.2f, 0.6f); @@ -151,14 +167,14 @@ public class PerkFirefly extends SmashPerk // Sound and Effect UtilParticle.PlayParticleToAll(ParticleType.FIREWORKS_SPARK, player.getLocation().add(0, 1, 0), 0.6f, 0.6f, 0.6f, 0, 10, ViewDist.LONG); - float progress = (float) (System.currentTimeMillis() - data.Time) / WARMUP_TIME; + float progress = (float) (System.currentTimeMillis() - data.Time) / _warmupTime; player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 0.5f, 1f + progress); } // Velocity - else if (!UtilTime.elapsed(data.Time, DURATION) || superActive) + else if (!UtilTime.elapsed(data.Time, _duration) || superActive) { - UtilAction.velocity(player, player.getLocation().getDirection().multiply(superActive ? VELOCITY_SMASH : VELOCITY_NORMAL).add(new Vector(0, 0.15, 0))); + UtilAction.velocity(player, player.getLocation().getDirection().multiply(superActive ? _velocitySmash : _velocityNormal).add(new Vector(0, 0.15, 0))); player.getWorld().playSound(player.getLocation(), Sound.EXPLODE, 0.6f, 1.2f); // Sound and Effect @@ -176,7 +192,7 @@ public class PerkFirefly extends SmashPerk player.getWorld().playSound(player.getLocation(), Sound.EXPLODE, 0.75f, 0.75f); } - for (Player other : UtilPlayer.getNearby(player.getLocation(), superActive ? RADIUS_SMASH : RADIUS_NORMAL)) + for (Player other : UtilPlayer.getNearby(player.getLocation(), superActive ? _radiusSmash : _radiusNormal)) { if (other.equals(player)) { @@ -192,10 +208,10 @@ public class PerkFirefly extends SmashPerk if (_tick % 12 == 0) { - if (Recharge.Instance.use(other, GetName() + " hit by " + player.getName(), HIT_FREQUENCY, false, false)) - { + if (Recharge.Instance.use(other, GetName() + " hit by " + player.getName(), _hitFrequency, false, false)) + { // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, true, false, player.getName(), skillName); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, true, false, player.getName(), skillName); UtilPlayer.message(other, F.main("Game", F.elem(Manager.GetColor(player) + player.getName()) + " hit you with " + F.elem(skillName) + ".")); } @@ -212,11 +228,11 @@ public class PerkFirefly extends SmashPerk @EventHandler public void FireflyDamage(CustomDamageEvent event) { - if (event.GetDamage() < MIN_CANCEL_DAMAGE) + if (event.GetDamage() < _minCancelDamage) { return; } - + if (!(event.GetDamagerEntity(true) instanceof Player)) { return; @@ -232,7 +248,7 @@ public class PerkFirefly extends SmashPerk { continue; } - + if (!UtilTime.elapsed(data.Time, 1250) && !isSuperActive(data.Player)) { if (isTeamDamage(data.Player, event.GetDamagerPlayer(true))) @@ -256,7 +272,7 @@ public class PerkFirefly extends SmashPerk { return; } - - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkInferno.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkInferno.java index 7eb44eca3..2099330c5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkInferno.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/PerkInferno.java @@ -30,13 +30,14 @@ public class PerkInferno extends SmashPerk { private static final float MAX_ENERGY = 0.999F; - private static final float ENERGY_PER_TICK = 0.025F; - private static final float ENERGY_PER_ITEM = 0.035F; + + private float _energyTick = 0.025F; + private float _energyItem = 0.035F; - private static final double ITEM_EXPIRE_TIME = 0.7; - private static final double ITEM_BURN_TIME = 0.5; - private static final double ITEM_DAMAGE = 0.25; - private static final float ITEM_VELOCITY_MAGNITUDE = 1.6F; + private double _itemExpireTime = 0.7; + private double _itemBurnTime = 0.5; + private double _itemDamage = 0.25; + private float _itemVelocityMagnitude = 1.6F; private Map _active = new HashMap<>(); @@ -45,6 +46,17 @@ public class PerkInferno extends SmashPerk super("Inferno", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Inferno" }); } + @Override + public void setupValues() + { + _energyTick = getPerkFloat("Energy Tick"); + _energyItem = getPerkFloat("Energy Item"); + _itemExpireTime = getPerkDouble("Expire Time"); + _itemBurnTime = getPerkDouble("Burn Time"); + _itemDamage = getPerkDouble("Damage"); + _itemVelocityMagnitude = getPerkFloat("Velocity Magnitude"); + } + @EventHandler public void EnergyUpdate(UpdateEvent event) { @@ -62,7 +74,7 @@ public class PerkInferno extends SmashPerk if (!player.isBlocking()) { - player.setExp(Math.min(MAX_ENERGY, player.getExp() + ENERGY_PER_TICK)); + player.setExp(Math.min(MAX_ENERGY, player.getExp() + _energyTick)); } } } @@ -130,7 +142,7 @@ public class PerkInferno extends SmashPerk continue; } - cur.setExp(cur.getExp() - ENERGY_PER_ITEM); + cur.setExp(cur.getExp() - _energyItem); if (cur.getExp() <= 0) { @@ -140,10 +152,10 @@ public class PerkInferno extends SmashPerk // Fire Item fire = cur.getWorld().dropItem(cur.getEyeLocation(), new ItemStack(Material.BLAZE_POWDER)); - Manager.GetFire().Add(fire, cur, ITEM_EXPIRE_TIME, 0, ITEM_BURN_TIME, ITEM_DAMAGE, GetName(), false); + Manager.GetFire().Add(fire, cur, _itemExpireTime, 0, _itemBurnTime, _itemDamage, GetName(), false); fire.teleport(cur.getEyeLocation()); - fire.setVelocity(cur.getLocation().getDirection().add(getRandomVector()).multiply(ITEM_VELOCITY_MAGNITUDE)); + fire.setVelocity(cur.getLocation().getDirection().add(getRandomVector()).multiply(_itemVelocityMagnitude)); // Effect cur.getWorld().playSound(cur.getLocation(), Sound.GHAST_FIREBALL, 0.1f, 1f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/SmashBlaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/SmashBlaze.java index 6fba264a3..26e91f7b1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/SmashBlaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/blaze/SmashBlaze.java @@ -10,13 +10,11 @@ import nautilus.game.arcade.kit.Perk; public class SmashBlaze extends SmashUltimate { - private static final int DURATION = 18000; - public SmashBlaze() { - super("Phoenix", new String[] {}, Sound.BLAZE_DEATH, DURATION); + super("Phoenix", new String[] {}, Sound.BLAZE_DEATH, 0); } - + @Override public void activate(Player player) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java index a671bd243..5669de319 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkChickenRocket.java @@ -44,12 +44,12 @@ import nautilus.game.arcade.kit.perks.data.ChickenMissileData; public class PerkChickenRocket extends SmashPerk { - private static final int COOLDOWN = 7000; - private static final int MIN_TIME = 200; - private static final int MAX_TIME = 4000; - private static final int HIT_BOX_RADIUS = 2; - private static final int DAMAGE_RADIUS = 3; - private static final int DAMAGE = 8; + private int _cooldown; + private int _minTime; + private int _maxTime; + private int _hitBoxRadius; + private int _damageRadius; + private int _damage; private Set _data = new HashSet<>(); @@ -59,6 +59,17 @@ public class PerkChickenRocket extends SmashPerk + " instantly recharges if you hit a player." }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _minTime = getPerkInt("Min Time (ms)"); + _maxTime = getPerkTime("Max Time (ms)"); + _hitBoxRadius = getPerkInt("Hit Box Radius"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void Missile(PlayerInteractEvent event) { @@ -94,7 +105,7 @@ public class PerkChickenRocket extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -131,14 +142,14 @@ public class PerkChickenRocket extends SmashPerk data.Chicken.setVelocity(data.Direction); data.Chicken.getWorld().playSound(data.Chicken.getLocation(), Sound.CHICKEN_HURT, 0.3f, 1.5f); - if (!UtilTime.elapsed(data.Time, MIN_TIME)) + if (!UtilTime.elapsed(data.Time, _minTime)) { continue; } boolean detonate = false; - if (UtilTime.elapsed(data.Time, MAX_TIME)) + if (UtilTime.elapsed(data.Time, _maxTime)) { detonate = true; } @@ -146,11 +157,11 @@ public class PerkChickenRocket extends SmashPerk { List team = TeamSuperSmash.getTeam(Manager, data.Player, true); // Hit Entity - for (Entity ent : UtilEnt.getInRadius(data.Chicken.getLocation(), HIT_BOX_RADIUS).keySet()) + for (Entity ent : UtilEnt.getInRadius(data.Chicken.getLocation(), _hitBoxRadius).keySet()) { if (ent instanceof Arrow) { - if (((Arrow) ent).isOnGround()) + if (ent.isOnGround()) { continue; } @@ -192,7 +203,7 @@ public class PerkChickenRocket extends SmashPerk { List team = TeamSuperSmash.getTeam(Manager, data.Player, true); // Damage - for (LivingEntity ent : UtilEnt.getInRadius(data.Chicken.getLocation(), DAMAGE_RADIUS).keySet()) + for (LivingEntity ent : UtilEnt.getInRadius(data.Chicken.getLocation(), _damageRadius).keySet()) { if (ent.equals(data.Player)) { @@ -212,7 +223,7 @@ public class PerkChickenRocket extends SmashPerk } // Damage Event - Manager.GetDamage().NewDamageEvent(ent, data.Player, null, DamageCause.PROJECTILE, DAMAGE, false, true, false, data.Player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(ent, data.Player, null, DamageCause.PROJECTILE, _damage, false, true, false, data.Player.getName(), GetName()); UtilAction.velocity(ent, UtilAlg.getTrajectory2d(data.Chicken, ent), 1.6, true, 0.8, 0, 10, true); } @@ -226,7 +237,6 @@ public class PerkChickenRocket extends SmashPerk data.Chicken.remove(); dataIterator.remove(); - continue; } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkEggGun.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkEggGun.java index df35fda05..6162c7276 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkEggGun.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkEggGun.java @@ -33,9 +33,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkEggGun extends SmashPerk { - private static final int COOLDOWN = 2500; - private static final int DURATION = 750; - private static final int DAMAGE = 1; + private int _cooldown; + private int _duration; + private int _damage; private Map _active = new HashMap<>(); @@ -44,6 +44,14 @@ public class PerkEggGun extends SmashPerk super("Egg Blaster", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Egg Blaster" }); } + @Override + public void setupValues() + { + _cooldown = getPerkInt("Cooldown (ms)"); + _duration = getPerkInt("Duration (ms)"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -79,7 +87,7 @@ public class PerkEggGun extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -114,7 +122,7 @@ public class PerkEggGun extends SmashPerk continue; } - if (UtilTime.elapsed(_active.get(key), DURATION)) + if (UtilTime.elapsed(_active.get(key), _duration)) { _active.remove(key); continue; @@ -150,7 +158,7 @@ public class PerkEggGun extends SmashPerk return; } - if (event.GetDamage() >= DAMAGE) + if (event.GetDamage() >= _damage) { return; } @@ -160,7 +168,7 @@ public class PerkEggGun extends SmashPerk Egg egg = (Egg) event.GetProjectile(); // Damage Event - Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), (LivingEntity) egg.getShooter(), egg, DamageCause.PROJECTILE, DAMAGE, true, true, false, UtilEnt.getName((LivingEntity) egg + Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), (LivingEntity) egg.getShooter(), egg, DamageCause.PROJECTILE, _damage, true, true, false, UtilEnt.getName((LivingEntity) egg .getShooter()), GetName()); UtilAction.zeroVelocity(event.GetDamageeEntity()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java index 6464c22d1..507104549 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/PerkFlap.java @@ -21,19 +21,26 @@ public class PerkFlap extends SmashPerk { private static final float MAX_ENERGY = 0.999F; - private static final float ENERGY_PER_TICK = 0.03F; - private static final float ENERGY_PER_FLAP = 0.17F; - private static final int COOLDOWN = 80; - + + private int _cooldown; + private float _energyPerTick; + private float _energyPerFlap; private double _power; private boolean _control; - public PerkFlap(double power, double heightLimit, boolean control) + public PerkFlap() { super("Flap", new String[] { C.cYellow + "Tap Jump Twice" + C.cGray + " to " + C.cGreen + "Flap" }); + } - _power = power; - _control = control; + @Override + public void setupValues() + { + _cooldown = getPerkInt("Cooldown (ms)"); + _energyPerTick = getPerkFloat("Energy Per Tick"); + _energyPerFlap = getPerkFloat("Energy Per Flap"); + _power = getPerkDouble("Power"); + _control = getPerkBoolean("Control"); } @EventHandler @@ -78,12 +85,12 @@ public class PerkFlap extends SmashPerk player.getWorld().playSound(player.getLocation(), Sound.BAT_TAKEOFF, (float) (0.3 + player.getExp()), (float) (Math.random() / 2 + 1)); // Set Recharge - Recharge.Instance.use(player, GetName(), COOLDOWN, false, false); + Recharge.Instance.use(player, GetName(), _cooldown, false, false); // Energy if (!isSuperActive(player)) { - player.setExp(Math.max(0f, player.getExp() - ENERGY_PER_FLAP)); + player.setExp(Math.max(0f, player.getExp() - _energyPerFlap)); } } @@ -109,7 +116,7 @@ public class PerkFlap extends SmashPerk if (UtilEnt.isGrounded(player) || UtilBlock.solid(player.getLocation().subtract(0, 2, 0).getBlock())) { - player.setExp(Math.min(MAX_ENERGY, player.getExp() + ENERGY_PER_TICK)); + player.setExp(Math.min(MAX_ENERGY, player.getExp() + _energyPerTick)); player.setAllowFlight(true); } else if (Recharge.Instance.usable(player, GetName()) && player.getExp() > 0) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/SmashChicken.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/SmashChicken.java index 605499efc..baad365ac 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/SmashChicken.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/chicken/SmashChicken.java @@ -9,11 +9,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashChicken extends SmashUltimate { - private static final int DURATION = 20000; - public SmashChicken() { - super("Aerial Gunner", new String[] {}, Sound.CHICKEN_IDLE, DURATION); + super("Aerial Gunner", new String[] {}, Sound.CHICKEN_IDLE, 0); } /** diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowAngryHerd.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowAngryHerd.java index 18ea1df4e..b653ee985 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowAngryHerd.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowAngryHerd.java @@ -37,14 +37,14 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkCowAngryHerd extends SmashPerk { - private static final int COOLDOWN_NORMAL = 13000; - private static final int COOLDOWN_SMASH = 6000; - private static final int MAX_TIME = 2500; - private static final int STUCK_TIME = 300; - private static final int FORCE_MOVE = 350; - private static final float HIT_BOX_RADIUS = 2.2F; - private static final int HIT_FREQUENCY = 600; - private static final int DAMAGE = 5; + private int _cooldownNormal; + private int _cooldownSmash; + private int _maxTime; + private int _stuckTime; + private int _forceMove; + private float _hitBoxRadius; + private int _hitFrequency; + private int _damage; private List _active = new ArrayList<>(); @@ -53,6 +53,19 @@ public class PerkCowAngryHerd extends SmashPerk super("Angry Herd", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Angry Herd" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkTime("Cooldown Smash"); + _maxTime = getPerkInt("Max Time (ms)"); + _stuckTime = getPerkInt("Stuck Time (ms)"); + _forceMove = getPerkInt("Force Move (ms)"); + _hitBoxRadius = getPerkFloat("Hit Box Radius"); + _hitFrequency = getPerkInt("Hit Frequency (ms)"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void shoot(PlayerInteractEvent event) { @@ -83,7 +96,7 @@ public class PerkCowAngryHerd extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? COOLDOWN_SMASH : COOLDOWN_NORMAL, true, true)) + if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? _cooldownSmash : _cooldownNormal, true, true)) { return; } @@ -129,7 +142,7 @@ public class PerkCowAngryHerd extends SmashPerk DataCowCharge data = activeIter.next(); // Expire - if (UtilTime.elapsed(data.Time, MAX_TIME)) + if (UtilTime.elapsed(data.Time, _maxTime)) { if (data.Cow.isValid()) { @@ -149,7 +162,7 @@ public class PerkCowAngryHerd extends SmashPerk } // Stuck Remove - if (UtilTime.elapsed(data.LastMoveTime, STUCK_TIME)) + if (UtilTime.elapsed(data.LastMoveTime, _stuckTime)) { if (data.Cow.isValid()) { @@ -172,7 +185,7 @@ public class PerkCowAngryHerd extends SmashPerk } // Move - if (UtilTime.elapsed(data.LastMoveTime, FORCE_MOVE) && UtilEnt.isGrounded(data.Cow)) + if (UtilTime.elapsed(data.LastMoveTime, _forceMove) && UtilEnt.isGrounded(data.Cow)) { data.Cow.setVelocity(data.Direction.clone().add(new Vector(0, 0.75, 0))); } @@ -199,12 +212,12 @@ public class PerkCowAngryHerd extends SmashPerk continue; } - if (UtilMath.offset(player, data.Cow) < HIT_BOX_RADIUS) + if (UtilMath.offset(player, data.Cow) < _hitBoxRadius) { - if (Recharge.Instance.use(player, "Hit by " + data.Player.getName(), HIT_FREQUENCY, false, false)) + if (Recharge.Instance.use(player, "Hit by " + data.Player.getName(), _hitFrequency, false, false)) { // Damage Event - Manager.GetDamage().NewDamageEvent(player, data.Player, null, data.Cow.getLocation(), DamageCause.CUSTOM, DAMAGE, true, true, false, UtilEnt.getName(data.Player), GetName()); + Manager.GetDamage().NewDamageEvent(player, data.Player, null, data.Cow.getLocation(), DamageCause.CUSTOM, _damage, true, true, false, UtilEnt.getName(data.Player), GetName()); UtilParticle.PlayParticleToAll(ParticleType.LARGE_EXPLODE, data.Cow.getLocation().add(0, 1, 0), 1f, 1f, 1f, 0, 12, ViewDist.LONG); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java index e909decf2..c373de9fb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowMilkSpiral.java @@ -30,10 +30,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkCowMilkSpiral extends SmashPerk { - private static final int COOLDOWN_NORMAL = 11000; - private static final int COOLDOWN_SMASH = 6000; - private static final int HIT_BOX_RADIUS = 2; - private static final int DAMAGE = 6; + private int _cooldownNormal; + private int _cooldownSmash; + private int _hitBoxRadius; + private int _damage; private Set _active = new HashSet<>(); @@ -42,6 +42,15 @@ public class PerkCowMilkSpiral extends SmashPerk super("Milk Spiral", new String[] { C.cYellow + "Right Click" + C.cGray + " with Spade to " + C.cGreen + "Milk Spiral", C.cGray + "Crouch to cancel movement for Milk Spiral" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkTime("Cooldown Smash"); + _hitBoxRadius = getPerkInt("Hit Box Radius"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -72,7 +81,7 @@ public class PerkCowMilkSpiral extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? COOLDOWN_SMASH : COOLDOWN_NORMAL, true, true)) + if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? _cooldownSmash : _cooldownNormal, true, true)) { return; } @@ -104,14 +113,14 @@ public class PerkCowMilkSpiral extends SmashPerk for (Player player : Manager.GetGame().GetPlayers(true)) { - if (player.equals(data.Player)) + if (player.equals(data.Player) || !Recharge.Instance.use(player, GetName() + " Rate", 3000, false, false)) { continue; } - if (UtilMath.offset(player.getLocation().add(0, 1, 0), data.Spiral) < HIT_BOX_RADIUS) + if (UtilMath.offset(player.getLocation().add(0, 1, 0), data.Spiral) < _hitBoxRadius) { - Manager.GetDamage().NewDamageEvent(player, data.Player, null, DamageCause.CUSTOM, DAMAGE, true, false, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(player, data.Player, null, DamageCause.CUSTOM, _damage, true, false, false, player.getName(), GetName()); UtilParticle.PlayParticle(isSuperActive(player) ? ParticleType.RED_DUST : ParticleType.FIREWORKS_SPARK, player.getLocation().add(0, 1, 0), 0.2f, 0.2f, 0.2f, 0.3f, 30, ViewDist.LONG, UtilServer.getPlayers()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowStampede.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowStampede.java index 5b7a16647..b95f1d738 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowStampede.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/PerkCowStampede.java @@ -30,6 +30,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkCowStampede extends SmashPerk { + + private long _speedTime; + private Map _sprintTime = new HashMap<>(); private Map _sprintStr = new HashMap<>(); @@ -38,6 +41,12 @@ public class PerkCowStampede extends SmashPerk super("Stampede", new String[] { C.cGray + "Build up Speed Levels as you sprint.", C.cGray + "+1 damage for each Speed Level.", }); } + @Override + public void setupValues() + { + _speedTime = getPerkTime("Speed Time"); + } + @EventHandler public void update(UpdateEvent event) { @@ -77,7 +86,7 @@ public class PerkCowStampede extends SmashPerk } // Upgrade Speed - if (!UtilTime.elapsed(time, 3000)) + if (!UtilTime.elapsed(time, _speedTime)) { continue; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/SmashCow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/SmashCow.java index d3aaa527d..70da2c10e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/SmashCow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/cow/SmashCow.java @@ -14,13 +14,21 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashCow extends SmashUltimate { - private static final int DURATION = 30000; - private static final int DAMAGE_BUFF = 1; - private static final int HEALTH = 30; + private int _damageBuff; + private int _health; public SmashCow() { - super("Mooshroom Madness", new String[] {}, Sound.COW_IDLE, DURATION); + super("Mooshroom Madness", new String[] {}, Sound.COW_IDLE, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _damageBuff = getPerkInt("Damage Buff"); + _health = getPerkInt("Health"); } @Override @@ -33,8 +41,8 @@ public class SmashCow extends SmashUltimate kit.disguise(player, DisguiseMooshroom.class); // Health - player.setMaxHealth(HEALTH); - player.setHealth(HEALTH); + player.setMaxHealth(_health); + player.setHealth(_health); // Sound player.getWorld().playSound(player.getLocation(), Sound.COW_HURT, 5f, 0.25f); @@ -67,7 +75,7 @@ public class SmashCow extends SmashUltimate if (isUsingUltimate(player)) { - event.AddMod(player.getName(), GetName(), DAMAGE_BUFF, false); + event.AddMod(player.getName(), GetName(), _damageBuff, false); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperElectricity.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperElectricity.java index a92cb53b5..476e3eca9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperElectricity.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperElectricity.java @@ -25,10 +25,10 @@ import nautilus.game.arcade.kit.Perk; public class PerkCreeperElectricity extends Perk { - private static final int DURATION = 2000; - private static final int SHOCK = 1; - private static final int DAMAGE = 4; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _duration; + private int _shock; + private int _damage; + private float _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -37,6 +37,15 @@ public class PerkCreeperElectricity extends Perk super("Lightning Shield", new String[] { "When hit by a non-melee attack, you gain " + C.cGreen + "Lightning Shield" }); } + @Override + public void setupValues() + { + _duration = getPerkTime("Duration"); + _shock = getPerkInt("Shock"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Shield(CustomDamageEvent event) { @@ -103,7 +112,7 @@ public class PerkCreeperElectricity extends Perk continue; } - if (UtilTime.elapsed(_active.get(key), DURATION)) + if (UtilTime.elapsed(_active.get(key), _duration)) { shieldIterator.remove(); @@ -152,12 +161,12 @@ public class PerkCreeperElectricity extends Perk // Elec damagee.getWorld().strikeLightningEffect(damagee.getLocation()); - Manager.GetCondition().Factory().Shock(GetName(), event.GetDamagerEntity(false), event.GetDamageeEntity(), SHOCK, false, false); + Manager.GetCondition().Factory().Shock(GetName(), event.GetDamagerEntity(false), event.GetDamageeEntity(), _shock, false, false); SetPowered(damagee, false); // Damage Event - Manager.GetDamage().NewDamageEvent(event.GetDamagerEntity(false), damagee, null, DamageCause.LIGHTNING, DAMAGE, true, true, false, damagee.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(event.GetDamagerEntity(false), damagee, null, DamageCause.LIGHTNING, _damage, true, true, false, damagee.getName(), GetName()); } public DisguiseCreeper GetDisguise(Player player) @@ -211,6 +220,6 @@ public class PerkCreeperElectricity extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java index e07b996fa..911b45a06 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperExplode.java @@ -1,36 +1,9 @@ package nautilus.game.arcade.game.games.smash.perks.creeper; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.UUID; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.block.Block; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.player.PlayerInteractEvent; - -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.*; import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.disguise.disguises.DisguiseCreeper; import mineplex.core.recharge.Recharge; @@ -40,24 +13,56 @@ import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; + +import java.util.*; public class PerkCreeperExplode extends SmashPerk { - private static final int COOLDOWN = 8000; - private static final int WARMUP = 1500; - private static final int RADIUS_NORMAL = 8; - private static final int RADIUS_SMASH = 24; - private static final int DAMAGE_NORMAL = 20; - private static final int DAMAGE_SMASH = 30; - private static final int SPAWN_REMOVAL_RADIUS = 14; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _cooldown; + private int _warmup; + private int _radiusNormal; + private int _radiusSmash; + private int _damageNormal; + private int _damageSmash; + private double _damageReduction; + private int _spawnRemovalRadius; + private float _knockbackMagnitude; + private int _blockDestroyRadius; + private int _blockRegeneration; private Map _active = new HashMap<>(); + private Map _removedSpawns = new HashMap<>(); public PerkCreeperExplode() { - super("Explode", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Shovel use " + C.cGreen + "Explosive Leap" }); + super("Explode", new String[]{C.cYellow + "Right-Click" + C.cGray + " with Shovel use " + C.cGreen + "Explosive Leap"}); + } + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _warmup = getPerkInt("Warmup (ms)"); + _radiusNormal = getPerkInt("Radius Normal"); + _radiusSmash = getPerkInt("Radius Smash"); + _damageNormal = getPerkInt("Damage Normal"); + _damageSmash = getPerkInt("Damage Smash"); + _damageReduction = getPerkPercentage("Damage Reduction"); + _spawnRemovalRadius = (int) Math.pow(getPerkInt("Spawn Removal Radius"), 2); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + _blockDestroyRadius = getPerkInt("Block Destroy Radius"); + _blockRegeneration = getPerkTime("Block Regeneration Time"); } @EventHandler @@ -95,7 +100,7 @@ public class PerkCreeperExplode extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -134,18 +139,19 @@ public class PerkCreeperExplode extends SmashPerk UtilAction.zeroVelocity(player); // Sound - player.getWorld().playSound(player.getLocation(), Sound.CREEPER_HISS, (float) (0.5 + elapsed), (float) (0.5 + elapsed)); + float volume = (float) 0.5F + elapsed / 1000F; + player.getWorld().playSound(player.getLocation(), Sound.CREEPER_HISS, volume, volume); IncreaseSize(player); - player.setExp(Math.min(0.999f, elapsed / (float) WARMUP)); + player.setExp(Math.min(0.999f, elapsed / (float) _warmup)); // Not Detonated - if (!UtilTime.elapsed(_active.get(key), WARMUP)) + if (!UtilTime.elapsed(_active.get(key), _warmup)) { continue; } - + player.setExp(0); chargeIterator.remove(); @@ -172,29 +178,23 @@ public class PerkCreeperExplode extends SmashPerk } // Blocks - Collection blocks = UtilBlock.getInRadius(player.getLocation(), 12).keySet(); - Iterator iter = blocks.iterator(); + Collection blocks = UtilBlock.getInRadius(player.getLocation(), _blockDestroyRadius).keySet(); - while (iter.hasNext()) - { - Block b = iter.next(); + blocks.removeIf(b -> b.getType() == Material.STATIONARY_LAVA || b.getType() == Material.LAVA || b.getType() == Material.BEDROCK); - if (b.getType() == Material.STATIONARY_LAVA || b.getType() == Material.LAVA || b.getType() == Material.BEDROCK) - { - iter.remove(); - } - } Manager.GetExplosion().BlockExplosion(blocks, player.getLocation(), false); // Remove Spawns - Iterator spawnIterator = Manager.GetGame().GetTeam(player).GetSpawns().iterator(); - while (spawnIterator.hasNext()) - { - Location spawn = spawnIterator.next(); + Iterator iterator = Manager.GetGame().GetTeam(player).GetSpawns().iterator(); - if (UtilMath.offset(player.getLocation(), spawn) < SPAWN_REMOVAL_RADIUS) + while (iterator.hasNext()) + { + Location spawn = iterator.next(); + + if (UtilMath.offsetSquared(player.getLocation(), spawn) < _spawnRemovalRadius) { - spawnIterator.remove(); + _removedSpawns.put(spawn, System.currentTimeMillis()); + iterator.remove(); } } @@ -209,8 +209,8 @@ public class PerkCreeperExplode extends SmashPerk } } - double maxRange = isSuperActive(player) ? RADIUS_SMASH : RADIUS_NORMAL; - double damage = isSuperActive(player) ? DAMAGE_SMASH : DAMAGE_NORMAL; + double maxRange = isSuperActive(player) ? _radiusSmash : _radiusNormal; + double damage = isSuperActive(player) ? _damageSmash : _damageNormal; // Damage for (LivingEntity ent : UtilEnt.getInRadius(player.getLocation(), maxRange).keySet()) @@ -245,7 +245,22 @@ public class PerkCreeperExplode extends SmashPerk } } } - + + @EventHandler + public void toggleSneak(PlayerToggleSneakEvent event) + { + Player player = event.getPlayer(); + + if (!_active.containsKey(player.getUniqueId()) || isSuperActive(player)) + { + return; + } + + _active.remove(player.getUniqueId()); + DecreaseSize(player); + UtilPlayer.message(player, F.main("Skill", "You cancelled " + F.skill(GetName()) + ".")); + } + public void activate(Player player) { _active.put(player.getUniqueId(), System.currentTimeMillis()); @@ -316,7 +331,8 @@ public class PerkCreeperExplode extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddMod(GetName(), event.GetDamage() * -0.25); + event.AddKnockback(GetName(), _knockbackMagnitude); } @EventHandler @@ -338,4 +354,43 @@ public class PerkCreeperExplode extends SmashPerk DecreaseSize(player); } + + @EventHandler + public void damageReduction(CustomDamageEvent event) + { + Player player = event.GetDamageePlayer(); + + if (player == null) + { + return; + } + + if (_active.containsKey(player.getUniqueId())) + { + event.AddMod("Damage Reduction", -event.GetDamage() * _damageReduction); + } + } + + @EventHandler + public void addDestroyedSpawns(UpdateEvent event) + { + if (event.getType() != UpdateType.SLOW) + { + return; + } + + GameTeam team = Manager.GetGame().GetTeamList().get(0); + Iterator iterator = _removedSpawns.keySet().iterator(); + + while (iterator.hasNext()) + { + Location spawn = iterator.next(); + + if (UtilTime.elapsed(_removedSpawns.get(spawn), _blockRegeneration)) + { + team.GetSpawns().add(spawn); + iterator.remove(); + } + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java index 111271be2..df921ff65 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/PerkCreeperSulphurBomb.java @@ -1,5 +1,17 @@ package nautilus.game.arcade.game.games.smash.perks.creeper; +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.projectile.IThrown; +import mineplex.core.projectile.ProjectileUser; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -9,41 +21,110 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.projectile.IThrown; -import mineplex.core.projectile.ProjectileUser; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; -public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown +public class PerkCreeperSulphurBomb extends SmashPerk { - - private static final int COOLDOWN = 3000; - private static final float DAMAGE = 6.5F; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + + private static ItemStack POWDER = new ItemStack(Material.SULPHUR); + + private int _cooldown; + private float _damage; + private float _knockbackMagnitude; + private float _damagePowder; + + private final IThrown _sulphurThrown = new IThrown() + { + @Override + public void Collide(LivingEntity target, Block block, ProjectileUser data) + { + Explode(data); + + if (target == null) + { + return; + } + + // Damage Event + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damage, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); + } + + @Override + public void Idle(ProjectileUser data) + { + Explode(data); + } + + @Override + public void Expire(ProjectileUser data) + { + Explode(data); + } + + private void Explode(ProjectileUser data) + { + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, data.getThrown().getLocation(), 0, 0, 0, 0, 1, ViewDist.MAX, UtilServer.getPlayers()); + data.getThrown().getWorld().playSound(data.getThrown().getLocation(), Sound.EXPLODE, 1f, 1.5f); + data.getThrown().remove(); + } + }; + private final IThrown _powderThrown = new IThrown() + { + @Override + public void Collide(LivingEntity target, Block block, ProjectileUser data) + { + Explode(data); + + if (target == null) + { + return; + } + + // Damage Event + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damagePowder, false, true, false, UtilEnt.getName(data.getThrower()), GetName()); + } + + @Override + public void Idle(ProjectileUser data) + { + Explode(data); + } + + @Override + public void Expire(ProjectileUser data) + { + Explode(data); + } + + private void Explode(ProjectileUser data) + { + UtilParticle.PlayParticleToAll(ParticleType.EXPLODE, data.getThrown().getLocation(), 0, 0, 0, 0, 1, ViewDist.LONG); + data.getThrown().getWorld().playSound(data.getThrown().getLocation(), Sound.EXPLODE, 1f, 2f); + data.getThrown().remove(); + _sulphur.remove(data.getThrower().getUniqueId()); + } + }; + + private Map _sulphur = new HashMap<>(); public PerkCreeperSulphurBomb() { super("Sulphur Bomb", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Sulphur Bomb" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkFloat("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + _damagePowder = getPerkFloat("Damage Powder"); + } + @EventHandler public void ShootWeb(PlayerInteractEvent event) { @@ -79,7 +160,7 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -90,9 +171,10 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.COAL, (byte) 0)); - UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); + _sulphur.put(player.getUniqueId(), ent); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, true, null, 1f, 1f, null, 1, UpdateType.SLOW, 0.6f); + UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); + Manager.GetProjectile().AddThrow(ent, player, _sulphurThrown, -1, true, true, true, true, null, 1f, 1f, null, 1, UpdateType.SLOW, 0.6f); // Inform UtilPlayer.message(player, F.main("Game", "You used " + F.skill(GetName()) + ".")); @@ -101,37 +183,27 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown player.getWorld().playSound(player.getLocation(), Sound.CREEPER_DEATH, 2f, 1.5f); } - @Override - public void Collide(LivingEntity target, Block block, ProjectileUser data) + @EventHandler + public void dropPowder(UpdateEvent event) { - Explode(data); - - if (target == null) + if (event.getType() != UpdateType.FASTER) { return; } - - // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, DAMAGE, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); - } - @Override - public void Idle(ProjectileUser data) - { - Explode(data); - } + for (Map.Entry entry : _sulphur.entrySet()) + { + Player player = UtilPlayer.searchExact(entry.getKey()); - @Override - public void Expire(ProjectileUser data) - { - Explode(data); - } + if (player == null) + { + continue; + } - public void Explode(ProjectileUser data) - { - UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, data.getThrown().getLocation(), 0, 0, 0, 0, 1, ViewDist.MAX, UtilServer.getPlayers()); - data.getThrown().getWorld().playSound(data.getThrown().getLocation(), Sound.EXPLODE, 1f, 1.5f); - data.getThrown().remove(); + Item item = entry.getValue(); + Item powder = item.getWorld().dropItem(item.getLocation(), POWDER); + Manager.GetProjectile().AddThrow(powder, player, _powderThrown, -1, true, true, true, true, 1F); + } } @EventHandler @@ -142,6 +214,6 @@ public class PerkCreeperSulphurBomb extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/SmashCreeper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/SmashCreeper.java index b20752818..2792d9577 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/SmashCreeper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/creeper/SmashCreeper.java @@ -11,7 +11,7 @@ public class SmashCreeper extends SmashUltimate public SmashCreeper() { - super("Atomic Blast", new String[] {}, Sound.CREEPER_HISS, 1600); + super("Atomic Blast", new String[] {}, Sound.CREEPER_HISS, 0); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlink.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlink.java index c7f8c30ff..486149217 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlink.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlink.java @@ -24,12 +24,17 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkBlink extends SmashPerk { - private static final float INCREMENTAITON = 0.2F; + private static final float INCREMENTATION = 0.2F; private String _name; private double _range; private int _recharge; + public PerkBlink(String name) + { + this(name, 0, 0); + } + public PerkBlink(String name, double range, int recharge) { super(name, new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + name }); @@ -39,6 +44,13 @@ public class PerkBlink extends SmashPerk _recharge = recharge; } + @Override + public void setupValues() + { + _range = getPerkDouble("Range"); + _recharge = getPerkTime("Cooldown"); + } + @EventHandler public void Blink(PlayerInteractEvent event) { @@ -79,7 +91,7 @@ public class PerkBlink extends SmashPerk return; } - LineParticle lineParticle = new LineParticle(player.getEyeLocation(), player.getLocation().getDirection(), INCREMENTAITON, _range, null, ParticleType.SMOKE, UtilServer.getPlayers()); + LineParticle lineParticle = new LineParticle(player.getEyeLocation(), player.getLocation().getDirection(), INCREMENTATION, _range, null, ParticleType.SMOKE, UtilServer.getPlayers()); while (!lineParticle.update()) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java index afa59acd8..3e48a23da 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkBlockToss.java @@ -42,10 +42,11 @@ import nautilus.game.arcade.kit.perks.event.PerkBlockThrowEvent; public class PerkBlockToss extends SmashPerk implements IThrown { - private static final int COOLDOWN = 2000; - private static final int CHARGE_TIME = 1200; - private static final int DAMAGE = 9; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _cooldown; + private int _chargeTime; + private int _damage; + private int _maxDamage; + private float _knockbackMagnitude; private Map _hold = new HashMap<>(); private Set _charged = new HashSet<>(); @@ -56,6 +57,16 @@ public class PerkBlockToss extends SmashPerk implements IThrown super("Block Toss", new String[] { C.cYellow + "Hold Block" + C.cGray + " to " + C.cGreen + "Grab Block", C.cYellow + "Release Block" + C.cGray + " to " + C.cGreen + "Throw Block" }); } + @Override + public void setupValues() + { + _cooldown = getPerkInt("Cooldown (ms)"); + _chargeTime = getPerkInt("Charge Time (ms)"); + _damage = getPerkInt("Damage"); + _maxDamage = getPerkInt("Max Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Grab(PlayerInteractEvent event) { @@ -154,7 +165,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown // Charged Tick if (!_charged.contains(key)) { - if (System.currentTimeMillis() - _hold.get(key).Time > CHARGE_TIME) + if (System.currentTimeMillis() - _hold.get(key).Time > _chargeTime) { _charged.add(key); player.getWorld().playEffect(player.getLocation(), Effect.CLICK1, 0); @@ -167,7 +178,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown UUID key = cur.getUniqueId(); Recharge.Instance.recharge(cur, GetName()); - Recharge.Instance.use(cur, GetName(), COOLDOWN, false, true); + Recharge.Instance.use(cur, GetName(), _cooldown, false, true); BlockTossData data = _hold.remove(key); @@ -180,7 +191,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown long charge = System.currentTimeMillis() - data.Time; // Throw - double mult = Math.min(1.4, 1.4 * ((double) charge / CHARGE_TIME)); + double mult = Math.min(1.4, 1.4 * ((double) charge / _chargeTime)); // Action UtilAction.velocity(block, cur.getLocation().getDirection(), mult, false, 0.2, 0, 1, true); @@ -201,7 +212,7 @@ public class PerkBlockToss extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, data.getThrown().getVelocity().length() * DAMAGE, true, true, false, UtilEnt.getName(data + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, Math.min(_maxDamage, data.getThrown().getVelocity().length() * _damage), true, true, false, UtilEnt.getName(data .getThrower()), GetName()); // Block to Item @@ -260,6 +271,6 @@ public class PerkBlockToss extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkEndermanTeleport.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkEndermanTeleport.java index 5fcc81787..c8a116dee 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkEndermanTeleport.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/PerkEndermanTeleport.java @@ -28,8 +28,8 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkEndermanTeleport extends SmashPerk { - private static final int COOLDOWN = 5000; - private static final float CHARGE_PER_TICK = 0.015F; + private int _cooldown = 5000; + private float _chargeTick = 0.015F; private Map _target = new HashMap<>(); private Map _charge = new HashMap<>(); @@ -39,6 +39,13 @@ public class PerkEndermanTeleport extends SmashPerk super("Teleport", new String[] { C.cYellow + "Hold Sneak" + C.cGray + " to " + C.cGreen + "Teleport" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _chargeTick = getPerkFloat("Charge Per Tick"); + } + @EventHandler public void update(UpdateEvent event) { @@ -86,14 +93,14 @@ public class PerkEndermanTeleport extends SmashPerk // Same Block - Increase Charge else if (block.equals(_target.get(key))) { - _charge.put(key, _charge.get(key) + CHARGE_PER_TICK); + _charge.put(key, _charge.get(key) + _chargeTick); UtilTextMiddle.display(null, UtilTextMiddle.progress(_charge.get(key)), 0, 10, 10, player); if (_charge.get(key) >= 1) { UtilTextMiddle.display(null, C.cGreen + "Teleported", 0, 10, 10, player); - Recharge.Instance.useForce(player, GetName(), COOLDOWN); + Recharge.Instance.useForce(player, GetName(), _cooldown); while (block.getRelative(BlockFace.UP).getType() != Material.AIR) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/SmashEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/SmashEnderman.java index ec4d33f6b..8f99fed1b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/SmashEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/enderman/SmashEnderman.java @@ -33,18 +33,29 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashEnderman extends SmashUltimate { - private static final int DURATION = 30000; - private static final int DRAGON_VELOCITY_MAGNITUDE = 40; - private static final int HIT_COOLDOWN = 1000; - private static final int DAMAGE_RADIUS = 6; - private static final int DAMAGE = 20; - private static final int KNOCKBACK_MAGNITUDE = 4; + private int _dragonVelocity; + private int _hitCooldown; + private int _damageRadius; + private int _damage; + private int _knockbackMagnitude; private Map _dragons = new HashMap<>(); public SmashEnderman() { - super("Ender Dragon", new String[] {}, Sound.ENDERDRAGON_GROWL, DURATION); + super("Ender Dragon", new String[] {}, Sound.ENDERDRAGON_GROWL, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _dragonVelocity = getPerkInt("Dragon Velocity"); + _hitCooldown = getPerkTime("Hit Cooldown"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); } @Override @@ -105,7 +116,7 @@ public class SmashEnderman extends SmashUltimate } // Move - Location target = player.getLocation().add(player.getLocation().getDirection().multiply(DRAGON_VELOCITY_MAGNITUDE)); + Location target = player.getLocation().add(player.getLocation().getDirection().multiply(_dragonVelocity)); ((CraftEnderDragon) dragon).getHandle().setTargetBlock(target.getBlockX(), target.getBlockY(), target.getBlockZ()); } } @@ -179,10 +190,10 @@ public class SmashEnderman extends SmashUltimate continue; } - if (UtilMath.offset(dragon.getLocation().add(0, 4, 0), other.getLocation()) < DAMAGE_RADIUS && Recharge.Instance.use(other, "Hit By Dragon", HIT_COOLDOWN, false, false)) + if (UtilMath.offset(dragon.getLocation().add(0, 4, 0), other.getLocation()) < _damageRadius && Recharge.Instance.use(other, "Hit By Dragon", _hitCooldown, false, false)) { // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, true, false, player.getName(), GetName()); } } } @@ -196,7 +207,7 @@ public class SmashEnderman extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @EventHandler(priority = EventPriority.LOW) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/PerkFissure.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/PerkFissure.java index ad8cd2688..e625809ba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/PerkFissure.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/PerkFissure.java @@ -24,7 +24,7 @@ import nautilus.game.arcade.kit.perks.data.FissureData; public class PerkFissure extends Perk { - private static final int COOLDOWN = 8000; + private int _cooldown; private Set _active = new HashSet<>(); @@ -33,6 +33,12 @@ public class PerkFissure extends Perk super("Fissure", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Fissure" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + } + @EventHandler public void Leap(PlayerInteractEvent event) { @@ -69,7 +75,7 @@ public class PerkFissure extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/SmashGolem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/SmashGolem.java index a92739364..0cfd4b163 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/SmashGolem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/golem/SmashGolem.java @@ -25,14 +25,23 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashGolem extends SmashUltimate { - private static final int DURATION = 16000; - private static final int HIT_FREQUENCY = 400; - private static final int DAMAGE_RADIUS = 2; - private static final int EFFECT_RADIUS = 5; + private int _hitFrequency; + private int _damageRadius; + private int _effectRadius; public SmashGolem() { - super("Earthquake", new String[] {}, Sound.IRONGOLEM_HIT, DURATION); + super("Earthquake", new String[] {}, Sound.IRONGOLEM_HIT, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _hitFrequency = getPerkInt("Hit Frequency (ms)"); + _damageRadius = getPerkInt("Damage Radius"); + _effectRadius = getPerkInt("Effect Radius"); } @Override @@ -71,7 +80,7 @@ public class SmashGolem extends SmashUltimate boolean grounded = false; - for (Block block : UtilBlock.getInRadius(other.getLocation(), DAMAGE_RADIUS).keySet()) + for (Block block : UtilBlock.getInRadius(other.getLocation(), _damageRadius).keySet()) { if (block.getType() != Material.AIR) { @@ -89,13 +98,13 @@ public class SmashGolem extends SmashUltimate Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, 1 + 2 * Math.random(), false, false, false, other.getName(), GetName()); // Velocity - if (Recharge.Instance.use(other, GetName() + " Hit", HIT_FREQUENCY, false, false)) + if (Recharge.Instance.use(other, GetName() + " Hit", _hitFrequency, false, false)) { UtilAction.velocity(other, new Vector(Math.random() - 0.5, Math.random() * 0.2, Math.random() - 0.5), Math.random() * 1 + 1, false, 0, 0.1 + Math.random() * 0.2, 2, true); } // Effect - for (Block block : UtilBlock.getInRadius(other.getLocation(), EFFECT_RADIUS).keySet()) + for (Block block : UtilBlock.getInRadius(other.getLocation(), _effectRadius).keySet()) { if (Math.random() < 0.98) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkTargetLazer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkTargetLazer.java index b90cdfd24..3930d138f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkTargetLazer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkTargetLazer.java @@ -37,11 +37,11 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkTargetLazer extends SmashPerk { - private static final int COOLDOWN = 15000; - private static final int MAX_RANGE = 11; - private static final int MAX_TIME = 8000; - private static final int DAMAGE_INCREASE = 3; - private static final int KNOCKBACK_INCREASE = 1; + private int _cooldown; + private int _maxRange; + private int _maxTime; + private int _damageIncrease; + private int _knockbackIncrease; private Set _data = new HashSet<>(); @@ -49,7 +49,17 @@ public class PerkTargetLazer extends SmashPerk { super("Target Laser", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Pickaxe to use " + C.cGreen + "Target Laser" }); } - + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _maxRange = getPerkInt("Max Range"); + _maxTime = getPerkTime("Max Time"); + _damageIncrease = getPerkInt("Damage Increase"); + _knockbackIncrease = getPerkInt("Knockback Increase"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -103,7 +113,7 @@ public class PerkTargetLazer extends SmashPerk double d = UtilMath.offset(player, other); - if (d > MAX_RANGE) + if (d > _maxRange) { continue; } @@ -121,7 +131,7 @@ public class PerkTargetLazer extends SmashPerk { if (data.getAttacker().equals(player)) { - if (data.getTimeElapsed() < MAX_TIME) + if (data.getTimeElapsed() < _maxTime) { return; } @@ -180,7 +190,7 @@ public class PerkTargetLazer extends SmashPerk UtilParticle.PlayParticle(ParticleType.MAGIC_CRIT, data.getTarget().getLocation().add(0, 0.5, 0.5), 1F, 0.5F, 1F, 0.1F, 10, ViewDist.LONG, data.getAttacker()); - if (UtilMath.offset(data.getTarget(), data.getAttacker()) > MAX_RANGE || data.getTimeElapsed() > MAX_TIME) + if (UtilMath.offset(data.getTarget(), data.getAttacker()) > _maxRange || data.getTimeElapsed() > _maxTime) { long time = data.getTimeElapsed() / 1000; double damage = 0.5 * time; @@ -192,7 +202,7 @@ public class PerkTargetLazer extends SmashPerk data.getAttacker().sendMessage(F.main("Game", "Your laser broke, dealing damage to " + F.name(data.getTarget().getName())) + "."); Manager.GetDamage().NewDamageEvent(data.getTarget(), data.getAttacker(), null, DamageCause.CUSTOM, damage, false, true, false, data.getAttacker().getName(), GetName()); - Recharge.Instance.use(data.getAttacker(), GetName(), COOLDOWN, true, true); + Recharge.Instance.use(data.getAttacker(), GetName(), _cooldown, true, true); iterator.remove(); } @@ -219,8 +229,8 @@ public class PerkTargetLazer extends SmashPerk if (data.getAttacker().equals(damager) && data.getTarget().equals(damagee)) { - event.AddMod(GetName(), DAMAGE_INCREASE); - event.AddKnockback(GetName(), KNOCKBACK_INCREASE); + event.AddMod(GetName(), _damageIncrease); + event.AddKnockback(GetName(), _knockbackIncrease); data.getAttacker().playEffect(damagee.getLocation().add(0, 0.5, 0), Effect.STEP_SOUND, Material.REDSTONE_BLOCK); } } @@ -230,18 +240,8 @@ public class PerkTargetLazer extends SmashPerk public void death(PlayerDeathEvent event) { Player player = event.getEntity(); - - Iterator iterator = _data.iterator(); - - while (iterator.hasNext()) - { - TargetLazerData data = iterator.next(); - - if (data.getTarget().equals(player) || data.getAttacker().equals(player)) - { - iterator.remove(); - } - } + + _data.removeIf(data -> data.getTarget().equals(player) || data.getAttacker().equals(player)); } private void setLazerTarget(Player disguised, Player target) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkThorns.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkThorns.java index 4e1e99010..a590a3f83 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkThorns.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkThorns.java @@ -13,15 +13,23 @@ import nautilus.game.arcade.kit.Perk; public class PerkThorns extends Perk { - private static final int MAX_HEALTH = 10; - private static final float DAMAGE_DECREASE = 0.66F; - private static final float KNOCKBACK_DECREASE = 0.66F; + private int _maxHealth; + private double _damageDecrease; + private double _knockbackDecrease; public PerkThorns() { super("Thorns", new String[] { C.cGray + "Takes 66% less damage and knockback from projectiles", C.cGray + "when under 10 health."}); } + @Override + public void setupValues() + { + _maxHealth = getPerkInt("Max Health"); + _damageDecrease = getPerkPercentage("Damage Decrease"); + _knockbackDecrease = getPerkPercentage("Knockback Decrease"); + } + @EventHandler(priority = EventPriority.HIGHEST) public void damage(CustomDamageEvent event) { @@ -38,10 +46,10 @@ public class PerkThorns extends Perk return; } - if (player.getHealth() < MAX_HEALTH) + if (player.getHealth() < _maxHealth) { - event.AddMult(GetName(), null, DAMAGE_DECREASE, false); - event.AddKnockback(GetName(), KNOCKBACK_DECREASE); + event.AddMult(GetName(), null, _damageDecrease, false); + event.AddKnockback(GetName(), _knockbackDecrease); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java index 653344a77..c233cebf0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWaterSplash.java @@ -1,13 +1,15 @@ package nautilus.game.arcade.game.games.smash.perks.guardian; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.TeamSuperSmash; +import nautilus.game.arcade.kit.Perk; import org.bukkit.Effect; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -17,36 +19,18 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.util.Vector; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; - -import nautilus.game.arcade.game.games.smash.TeamSuperSmash; -import nautilus.game.arcade.kit.Perk; +import java.util.*; public class PerkWaterSplash extends Perk { - private static final int COOLDOWN = 12000; - private static final int VELOCITY_Y = 1; - private static final int RADIUS = 5; - private static final int MIN_AIR_TIME = 750; - private static final int SECOND_BOOST_TIME = 800; - private static final int DAMAGE = 12; + private int _cooldown; + private float _velocityY; + private int _radius; + private int _minAirTime; + private int _secondBoostTime; + private float _secondBoostVelocity; + private int _damage; private Map _active = new HashMap<>(); private Set _usedSecondBoost = new HashSet<>(); @@ -55,7 +39,19 @@ public class PerkWaterSplash extends Perk { super("Water Splash", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Sword to use " + C.cGreen + "Water Splash", C.cYellow + "Hold Block" + C.cGray + " to " + C.cGreen + "Bounce higher with Water Splash" }); } - + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _velocityY = getPerkFloat("Y Velocity"); + _radius = getPerkInt("Radius"); + _minAirTime = getPerkInt("Min Air Time (ms)"); + _secondBoostTime = getPerkInt("Second Boost Time (ms)"); + _secondBoostVelocity = getPerkFloat("Second Boost Velocity"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -86,16 +82,16 @@ public class PerkWaterSplash extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } - UtilAction.velocity(player, new Vector(0, VELOCITY_Y, 0)); + UtilAction.velocity(player, new Vector(0, _velocityY, 0)); _active.put(player.getUniqueId(), System.currentTimeMillis()); List team = TeamSuperSmash.getTeam(Manager, player, true); - for (Player other : UtilPlayer.getNearby(player.getLocation(), RADIUS)) + for (Player other : UtilPlayer.getNearby(player.getLocation(), _radius)) { if (team.contains(other)) { @@ -144,14 +140,14 @@ public class PerkWaterSplash extends Perk UtilParticle.PlayParticleToAll(ParticleType.DRIP_WATER, player.getLocation(), 0.5F, 0.5F, 0.5F, 0.01F, 10, ViewDist.LONG); - if (UtilEnt.isGrounded(player) && UtilTime.elapsed(_active.get(uuid), MIN_AIR_TIME)) + if (UtilEnt.isGrounded(player) && UtilTime.elapsed(_active.get(uuid), _minAirTime)) { iterator.remove(); _usedSecondBoost.remove(uuid); UtilParticle.PlayParticleToAll(ParticleType.FIREWORKS_SPARK, player.getEyeLocation(), 0, 0, 0, 0.5F, 50, ViewDist.LONG); - for (Block block : UtilBlock.getInRadius(player.getLocation(), RADIUS).keySet()) + for (Block block : UtilBlock.getInRadius(player.getLocation(), _radius).keySet()) { if (Math.random() > 0.5) { @@ -163,7 +159,7 @@ public class PerkWaterSplash extends Perk player.getWorld().playSound(player.getLocation(), Sound.SPLASH2, 2, 0); - Map nearby = UtilPlayer.getInRadius(player.getLocation(), RADIUS); + Map nearby = UtilPlayer.getInRadius(player.getLocation(), _radius); List team = TeamSuperSmash.getTeam(Manager, player, true); for (Player other : nearby.keySet()) @@ -175,15 +171,15 @@ public class PerkWaterSplash extends Perk double power = nearby.get(other); - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE * power, true, true, false, player.getName(), GetName()); - Manager.GetCondition().Factory().Falling(GetName(), other, player, DAMAGE, false, true); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage * power, true, true, false, player.getName(), GetName()); + Manager.GetCondition().Factory().Falling(GetName(), other, player, _damage, false, true); } } - else if (UtilTime.elapsed(_active.get(uuid), SECOND_BOOST_TIME) && !_usedSecondBoost.contains(uuid) && player.isBlocking()) + else if (UtilTime.elapsed(_active.get(uuid), _secondBoostTime) && !_usedSecondBoost.contains(uuid) && player.isBlocking()) { _usedSecondBoost.add(uuid); - Vector direction = player.getLocation().getDirection().setY(0.2); + Vector direction = player.getLocation().getDirection().multiply(_secondBoostVelocity); UtilAction.velocity(player, direction); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWhirlpoolBlade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWhirlpoolBlade.java index e738a721a..337655ec7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWhirlpoolBlade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/PerkWhirlpoolBlade.java @@ -37,11 +37,11 @@ import nautilus.game.arcade.kit.Perk; public class PerkWhirlpoolBlade extends Perk implements IThrown { - private static final int COOLDOWN = 5000; - private static final int EXPIRE_TIME = 3000; - private static final float VELOCITY = 1.6F; - private static final float HIT_BOX = 0.5F; - private static final int DAMAGE = 5; + private int _cooldown; + private int _expireTime; + private float _velocity; + private float _hitBox; + private int _damage; private Set _items = new HashSet<>(); @@ -49,7 +49,17 @@ public class PerkWhirlpoolBlade extends Perk implements IThrown { super("Whirlpool Axe", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Whirlpool Axe" }); } - + + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _expireTime = getPerkTime("Expire Time"); + _velocity = getPerkFloat("Velocity"); + _hitBox = getPerkFloat("Hit Box"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -80,7 +90,7 @@ public class PerkWhirlpoolBlade extends Perk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -89,8 +99,8 @@ public class PerkWhirlpoolBlade extends Perk implements IThrown Item item = player.getWorld().dropItem(player.getEyeLocation(), new ItemStack(Material.PRISMARINE_SHARD)); - item.setVelocity(player.getLocation().getDirection().multiply(VELOCITY)); - Manager.GetProjectile().AddThrow(item, player, this, EXPIRE_TIME, true, true, true, false, false, HIT_BOX); + item.setVelocity(player.getLocation().getDirection().multiply(_velocity)); + Manager.GetProjectile().AddThrow(item, player, this, _expireTime, true, true, true, false, false, _hitBox); _items.add(item); } @@ -131,7 +141,7 @@ public class PerkWhirlpoolBlade extends Perk implements IThrown return; } - CustomDamageEvent event = Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, DAMAGE, false, true, true, data.getThrower().getName(), GetName()); + CustomDamageEvent event = Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, _damage, false, true, true, data.getThrower().getName(), GetName()); if(event.IsCancelled()) { return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashAnimationData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashAnimationData.java index e891ca5cf..1e5a8d420 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashAnimationData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashAnimationData.java @@ -98,7 +98,7 @@ public class SmashAnimationData { _ticks++; - if (_ticks % 10 == 0) + if (_ticks % 5 == 0) { _blockRadius++; @@ -133,13 +133,13 @@ public class SmashAnimationData } LineParticle lineParticle = new LineParticle(player.getEyeLocation(), _target.getEyeLocation(), vector, 0.2, offset, null, ParticleType.WITCH_MAGIC, UtilServer.getPlayers()); - + while (!lineParticle.update()) { } player.getWorld().playSound(player.getLocation(), Sound.ZOMBIE_REMEDY, 1, 0.75F); - UtilAction.velocity(player, vector.setY(player.getLocation().getY() - 3 > _target.getLocation().getY() ? 0 : 0.5).multiply(0.5)); + UtilAction.velocity(player, vector.setY(player.getLocation().getY() - 3 > _target.getLocation().getY() ? 0 : 0.5).multiply(0.7)); _manager.GetDamage().NewDamageEvent(player, _player, null, DamageCause.CUSTOM, VELOCITY_DAMAGE, false, true, false, _player.getName(), "Mini Guardian"); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashGuardian.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashGuardian.java index 78e133ba2..952490cf2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashGuardian.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/guardian/SmashGuardian.java @@ -27,16 +27,25 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashGuardian extends SmashUltimate { - private static final int DURATION = 10000; private static final int GUARDIANS = 4; - private static final int RADIUS = 15; - private static final int DAMAGE = 40; + + private int _radius; + private int _damage; private Set _data = new HashSet<>(); public SmashGuardian() { - super("Rise of the Guardian", new String[] {}, Sound.AMBIENCE_THUNDER, DURATION); + super("Rise of the Guardian", new String[] {}, Sound.AMBIENCE_THUNDER, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _radius = getPerkInt("Radius"); + _damage = getPerkInt("Damage"); } @Override @@ -46,7 +55,7 @@ public class SmashGuardian extends SmashUltimate Manager.GetGame().CreatureAllowOverride = true; - _data.add(new SmashAnimationData(Manager, player, GUARDIANS, DURATION)); + _data.add(new SmashAnimationData(Manager, player, GUARDIANS, getLength())); Manager.GetGame().CreatureAllowOverride = false; } @@ -64,7 +73,7 @@ public class SmashGuardian extends SmashUltimate if (data.getPlayer().equals(player)) { - Map inRadius = UtilPlayer.getInRadius(data.getTarget().getLocation(), RADIUS); + Map inRadius = UtilPlayer.getInRadius(data.getTarget().getLocation(), _radius); List team = TeamSuperSmash.getTeam(Manager, player, true); for (Player other : inRadius.keySet()) { @@ -73,11 +82,11 @@ public class SmashGuardian extends SmashUltimate continue; } - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE * inRadius.get(other), true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage * inRadius.get(other), true, true, false, player.getName(), GetName()); } data.getTarget().getWorld().strikeLightningEffect(data.getTarget().getLocation()); - UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, data.getTarget().getLocation().add(0, 2, 0), RADIUS, 1, RADIUS, 1F, 30, ViewDist.MAX); + UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, data.getTarget().getLocation().add(0, 2, 0), _radius, 1, _radius, 1F, 30, ViewDist.MAX); player.getWorld().playSound(data.getTarget().getLocation(), Sound.EXPLODE, 5, 0.5F); data.getElder().remove(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkFlameDash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkFlameDash.java index f8030aaeb..45fe2b378 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkFlameDash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkFlameDash.java @@ -35,10 +35,10 @@ import nautilus.game.arcade.kit.perks.data.FireflyData; public class PerkFlameDash extends Perk { - private static final int COOLDOWN = 8000; - private static final int TIME = 800; - private static final int DAMAGE_RADIUS = 3; - private static final int KNOCKBACK_MAGNITUDE = 2; + private int _cooldown; + private int _time; + private int _damageRadius; + private int _knockbackMagnitude; private Set _data = new HashSet(); @@ -47,6 +47,15 @@ public class PerkFlameDash extends Perk super("Flame Dash", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to use " + C.cGreen + "Flame Dash" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _time = getPerkInt("Time (ms)"); + _damageRadius = getPerkInt("Damage Radius"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -96,14 +105,14 @@ public class PerkFlameDash extends Perk } else { - Recharge.Instance.use(player, GetName(), COOLDOWN, true, true); + Recharge.Instance.use(player, GetName(), _cooldown, true, true); } return; } Recharge.Instance.recharge(player, GetName()); - Recharge.Instance.use(player, GetName(), COOLDOWN, true, true); + Recharge.Instance.use(player, GetName(), _cooldown, true, true); _data.add(new FireflyData(player)); @@ -130,7 +139,7 @@ public class PerkFlameDash extends Perk FireflyData data = dataIterator.next(); // Move - if (!UtilTime.elapsed(data.Time, TIME)) + if (!UtilTime.elapsed(data.Time, _time)) { Vector vel = data.Location.getDirection(); vel.setY(0); @@ -148,7 +157,7 @@ public class PerkFlameDash extends Perk // End else { - for (Player other : UtilPlayer.getNearby(data.Player.getLocation(), DAMAGE_RADIUS)) + for (Player other : UtilPlayer.getNearby(data.Player.getLocation(), _damageRadius)) { if (other.equals(data.Player)) { @@ -191,6 +200,6 @@ public class PerkFlameDash extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java index 036734ecd..a5ea688f4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBlast.java @@ -43,13 +43,12 @@ import nautilus.game.arcade.kit.Perk; public class PerkMagmaBlast extends Perk { - private static final int COOLDOWN = 6000; - private static final float FIREBALL_VELOCITY = 0.2F; - private static final int FIRE_TICKS = 40; - private static final int VELOCITY_RADIUS = 8; - private static final int FIRE_RADIUS = 2; - private static final int DAMAGE = 8; - + private int _cooldown; + private float _velocity; + private int _fireTicks; + private int _velocityRadius; + private int _fireRadius; + private int _damage; private Map _proj = new HashMap<>(); @@ -58,6 +57,17 @@ public class PerkMagmaBlast extends Perk super("Magma Blast", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Magma Blast" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _velocity = getPerkFloat("Velocity"); + _fireTicks = getPerkInt("Fire Ticks"); + _velocityRadius = getPerkInt("Velocity Radius"); + _fireRadius = getPerkInt("Fire Radius"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void Shoot(PlayerInteractEvent event) { @@ -88,7 +98,7 @@ public class PerkMagmaBlast extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -103,7 +113,7 @@ public class PerkMagmaBlast extends Perk ball.setBounce(false); ball.teleport(player.getEyeLocation().add(player.getLocation().getDirection().multiply(1))); - Vector dir = player.getLocation().getDirection().multiply(FIREBALL_VELOCITY); + Vector dir = player.getLocation().getDirection().multiply(_velocity); EntityLargeFireball eFireball = ((CraftLargeFireball) ball).getHandle(); eFireball.dirX = dir.getX(); @@ -165,24 +175,29 @@ public class PerkMagmaBlast extends Perk { return; } - + + proj.remove(); + Player shooter = (Player) proj.getShooter(); // Velocity Players - Map hitMap = UtilPlayer.getInRadius(proj.getLocation(), VELOCITY_RADIUS); + Map hitMap = UtilPlayer.getInRadius(proj.getLocation(), _velocityRadius); List team = TeamSuperSmash.getTeam(Manager, shooter, false); for (Player cur : hitMap.keySet()) { if(team.contains(cur)) { - { - continue; - } + continue; } double range = hitMap.get(cur); - Manager.GetDamage().NewDamageEvent(cur, shooter, proj, DamageCause.PROJECTILE, range * DAMAGE, false, true, false, shooter.getName(), GetName()); + if (range > 0.8) + { + range = 1; + } + + Manager.GetDamage().NewDamageEvent(cur, shooter, proj, DamageCause.PROJECTILE, range * _damage, false, true, false, shooter.getName(), GetName()); // Velocity UtilAction.velocity(cur, UtilAlg.getTrajectory(proj.getLocation().add(0, -0.5, 0), cur.getEyeLocation()), 1 + 2 * range, false, 0, 0.2 + 0.4 * range, 1.2, true); @@ -222,9 +237,9 @@ public class PerkMagmaBlast extends Perk } } - if (UtilMath.offset(player, proj) < FIRE_RADIUS) + if (UtilMath.offset(player, proj) < _fireRadius) { - player.setFireTicks(FIRE_TICKS); + player.setFireTicks(_fireTicks); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java index 3b06175aa..49256518c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/PerkMagmaBoost.java @@ -1,14 +1,5 @@ package nautilus.game.arcade.game.games.smash.perks.magmacube; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; - import mineplex.core.common.util.C; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -20,21 +11,42 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; - import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.kit.Perk; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; public class PerkMagmaBoost extends Perk { - private static final int MAX_STACKS = 3; + private static final ItemStack BOOTS = new ItemStack(Material.IRON_BOOTS); + private static final ItemStack CHESTPLATE = new ItemStack(Material.IRON_CHESTPLATE); + private static final ItemStack HELMET = new ItemStack(Material.IRON_HELMET); + + private int _maxStacks; private Map _kills = new HashMap<>(); public PerkMagmaBoost() { - super("Fuel the Fire", new String[] { C.cGray + "Kills give +1 Damage, -15% Knockback Taken and +1 Size.", C.cGray + "Kill bonuses can stack " + MAX_STACKS + " times, and reset on death.", }); + super("Fuel the Fire", new String[0]); + } + + @Override + public void setupValues() + { + _maxStacks = getPerkInt("Max Stacks"); + + setDesc(C.cGray + "Kills give +1 Damage, -15% Knockback Taken and +1 Size.", C.cGray + "Kill bonuses can stack " + _maxStacks + " times, and reset on death."); } @EventHandler @@ -50,7 +62,7 @@ public class PerkMagmaBoost extends Perk public void kill(CombatDeathEvent event) { Player killed = (Player) event.GetEvent().getEntity(); - + _kills.remove(killed.getUniqueId()); if (event.GetLog().GetKiller() == null) @@ -80,14 +92,28 @@ public class PerkMagmaBoost extends Perk size += _kills.get(key); } - size = Math.min(MAX_STACKS, size); + size = Math.min(_maxStacks, size); + + // Adjust armour + if (size == 1) + { + killer.getInventory().setBoots(BOOTS); + } + else if (size == 2) + { + killer.getInventory().setChestplate(CHESTPLATE); + } + else if (size == 3) + { + killer.getInventory().setHelmet(HELMET); + } _kills.put(key, size); slime.SetSize(size + 1); Manager.GetDisguise().updateDisguise(slime); - - killer.setExp(0.99F * (size / (float) MAX_STACKS)); + + killer.setExp(0.99F * (size / (float) _maxStacks)); } @EventHandler(priority = EventPriority.HIGHEST) @@ -104,7 +130,7 @@ public class PerkMagmaBoost extends Perk } Player damager = event.GetDamagerPlayer(false); - + if (damager == null) { return; @@ -116,12 +142,12 @@ public class PerkMagmaBoost extends Perk } UUID key = damager.getUniqueId(); - + if (!_kills.containsKey(key)) { return; } - + event.AddMod(damager.getName(), GetName(), _kills.get(key), false); } @@ -132,12 +158,12 @@ public class PerkMagmaBoost extends Perk { return; } - + if (event.GetCause() != DamageCause.ENTITY_ATTACK) { return; } - + Player damagee = event.GetDamageePlayer(); if (damagee == null) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/SmashMagmacube.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/SmashMagmacube.java index 5f2a61ba2..12a35888b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/SmashMagmacube.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/magmacube/SmashMagmacube.java @@ -17,9 +17,7 @@ import nautilus.game.arcade.kit.perks.data.MeteorShowerData; public class SmashMagmacube extends SmashUltimate { - - private static final int DURATION = 12000; - + private List _meteors = new ArrayList<>(); public SmashMagmacube() @@ -30,7 +28,7 @@ public class SmashMagmacube extends SmashUltimate @Override public void activate(Player player) { - _meteors.add(new MeteorShowerData(player, UtilPlayer.getTarget(player, UtilBlock.blockPassSet, 128).getLocation(), DURATION)); + _meteors.add(new MeteorShowerData(player, UtilPlayer.getTarget(player, UtilBlock.blockPassSet, 128).getLocation(), getLength())); } @EventHandler @@ -40,17 +38,7 @@ public class SmashMagmacube extends SmashUltimate { return; } - - Iterator meteorIter = _meteors.iterator(); - while (meteorIter.hasNext()) - { - MeteorShowerData data = meteorIter.next(); - - if (data.update()) - { - meteorIter.remove(); - } - } + _meteors.removeIf(MeteorShowerData::update); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java index c14f70a82..2160c60a5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBomb.java @@ -40,14 +40,14 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkPigBaconBomb extends SmashPerk { - private static final float ENERGY_PER_PIG = 0.35F; - private static final float ENERGY_PER_PIG_DISGUISED_FACTOR = 0.7F; - private static final int COOLDOWN = 100; - private static final int PIG_MAX_TICKS = 80; - private static final float PIG_SPEED = 1.2F; - private static final int PIG_EXPLODE_RADIUS = 2; - private static final int PIG_EXPLODE_DAMAGE = 4; - private static final int PIG_EXPLODE_DAMAGE_RADIUS = 4; + private float _energyPig; + private float _energyPigDisguiseFactor; + private int _cooldown; + private int _maxTicks; + private float _pigSpeed; + private int _explodeRadius; + private int _explodeDamage; + private int _explodeDamageRadius; private Map> _pigs = new HashMap>(); @@ -56,6 +56,19 @@ public class PerkPigBaconBomb extends SmashPerk super("Baby Bacon Bomb", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to " + C.cGreen + "Baby Bacon Bomb" }); } + @Override + public void setupValues() + { + _energyPig = getPerkFloat("Energy Per Pig"); + _energyPigDisguiseFactor = getPerkFloat("Energy Per Pig Disguise Factor"); + _cooldown = getPerkInt("Cooldown (ms)"); + _maxTicks = getPerkInt("Pig Max Ticks"); + _pigSpeed = getPerkFloat("Pig Speed"); + _explodeRadius = getPerkInt("Pig Explode Radius"); + _explodeDamage = getPerkInt("Pig Explode Damage"); + _explodeDamageRadius = getPerkInt("Pig Explode Damage Radius"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -86,13 +99,13 @@ public class PerkPigBaconBomb extends SmashPerk return; } - float energy = ENERGY_PER_PIG; + float energy = _energyPig; DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); if (disguise != null && disguise instanceof DisguisePigZombie) { - energy = energy * ENERGY_PER_PIG_DISGUISED_FACTOR; + energy = energy * _energyPigDisguiseFactor; } // Energy @@ -103,7 +116,7 @@ public class PerkPigBaconBomb extends SmashPerk } // Recharge - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, false, false)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, false, false)) { return; } @@ -112,7 +125,7 @@ public class PerkPigBaconBomb extends SmashPerk player.setExp(Math.max(0f, player.getExp() - energy)); // Velocity - UtilAction.velocity(player, player.getLocation().getDirection(), 0.8, true, 0.9, 0, 1, true); + UtilAction.velocity(player, player.getLocation().getDirection(), 0.8, true, 1.2, 0, 1, true); // Sound player.getWorld().playSound(player.getLocation(), Sound.PIG_IDLE, 2f, 0.75f); @@ -163,7 +176,7 @@ public class PerkPigBaconBomb extends SmashPerk { Pig pig = pigIterator.next(); - if (!pig.isValid() || pig.getTicksLived() > PIG_MAX_TICKS) + if (!pig.isValid() || pig.getTicksLived() > _maxTicks) { PigExplode(pigIterator, pig, player); continue; @@ -176,9 +189,9 @@ public class PerkPigBaconBomb extends SmashPerk continue; } - UtilEnt.CreatureMoveFast(pig, target.getLocation(), PIG_SPEED); + UtilEnt.CreatureMoveFast(pig, target.getLocation(), _pigSpeed); - if (UtilMath.offset(target, pig) < PIG_EXPLODE_RADIUS) + if (UtilMath.offset(target, pig) < _explodeRadius) { PigExplode(pigIterator, pig, player); } @@ -196,7 +209,7 @@ public class PerkPigBaconBomb extends SmashPerk pig.getWorld().playSound(pig.getLocation(), Sound.PIG_DEATH, 1f, 2f); // Damage - Map targets = UtilEnt.getInRadius(pig.getLocation(), PIG_EXPLODE_DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(pig.getLocation(), _explodeDamageRadius); for (LivingEntity cur : targets.keySet()) { @@ -206,7 +219,7 @@ public class PerkPigBaconBomb extends SmashPerk } // Damage Event - Manager.GetDamage().NewDamageEvent(cur, owner, null, DamageCause.CUSTOM, PIG_EXPLODE_DAMAGE, false, true, false, owner.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, owner, null, DamageCause.CUSTOM, _explodeDamage, false, true, false, owner.getName(), GetName()); } // Remove diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java index 87e993d45..720dc9145 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigBaconBounce.java @@ -40,17 +40,29 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkPigBaconBounce extends SmashPerk implements IThrown { - private static final float ENERGY_PER_BACON = 0.2F; - private static final float ENERGY_PER_BACON_DISGUISED_FACTOR = 0.7F; - private static final int COOLDOWN = 100; - private static final int HEALTH_PER_BACON = 1; - private static final int BACON_DAMAGE = 4; + private float _energyBacon; + private float _energyBaconDisgtuiseFactor; + private float _energyBaconBack; + private int _cooldown; + private int _healthBacon; + private int _damageBacon; public PerkPigBaconBounce() { super("Bouncy Bacon", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Bouncy Bacon", }); } + @Override + public void setupValues() + { + _energyBacon = getPerkFloat("Energy Per Bacon"); + _energyBaconDisgtuiseFactor = getPerkFloat("Energy Per Bacon Disguise Factor"); + _energyBaconBack = getPerkFloat("Energy Per Bacon Back"); + _cooldown = getPerkInt("Cooldown (ms)"); + _healthBacon = getPerkInt("Health Per Bacon"); + _damageBacon = getPerkInt("Bacon Damage"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -81,13 +93,13 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown return; } - float energy = ENERGY_PER_BACON; + float energy = _energyBacon; DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); if (disguise != null && disguise instanceof DisguisePigZombie) { - energy = energy * ENERGY_PER_BACON_DISGUISED_FACTOR; + energy = energy * _energyBaconDisgtuiseFactor; } // Energy @@ -98,7 +110,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown } // Recharge - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, false, false)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, false, false)) { return; } @@ -109,7 +121,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown // Launch Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.PORK, (byte) 0, 1, "Bacon" + System.currentTimeMillis())); UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 0.4f); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, .8F); ent.setPickupDelay(9999); // Sound @@ -130,7 +142,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, BACON_DAMAGE, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, _damageBacon, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); Item item = (Item) data.getThrown(); item.setItemStack(new ItemStack(Material.GRILLED_PORK)); @@ -181,7 +193,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown event.getItem().remove(); // Restore Energy - event.getPlayer().setExp(Math.min(0.999f, event.getPlayer().getExp() + 0.05f)); + event.getPlayer().setExp(Math.min(0.999f, event.getPlayer().getExp() + _energyBaconBack)); // Sound event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.EAT, 2f, 1f); @@ -189,7 +201,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown // Heal if (event.getItem().getItemStack().getType() == Material.GRILLED_PORK) { - UtilPlayer.health(event.getPlayer(), HEALTH_PER_BACON); + UtilPlayer.health(event.getPlayer(), _healthBacon); UtilParticle.PlayParticle(ParticleType.HEART, event.getPlayer().getLocation().add(0, 0.5, 0), 0.2f, 0.2f, 0.2f, 0, 4, ViewDist.LONG, UtilServer.getPlayers()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigZombie.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigZombie.java index 306f0ed3b..d3dff4e75 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigZombie.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/PerkPigZombie.java @@ -24,7 +24,7 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkPigZombie extends SmashPerk { - private static final int MIN_HEALTH = 6; + private int _minHealth; public Set _active = new HashSet<>(); @@ -33,6 +33,12 @@ public class PerkPigZombie extends SmashPerk super("Nether Pig", new String[] { C.cGray + "Become Nether Pig when HP is below 6.", C.cGray + "Return to Pig when HP is 10 or higher." }); } + @Override + public void setupValues() + { + _minHealth = getPerkInt("Min Health"); + } + @EventHandler public void Check(UpdateEvent event) { @@ -86,7 +92,7 @@ public class PerkPigZombie extends SmashPerk // Not Active else { - if (player.getHealth() <= 0 || (!isSuperActive(player) && player.getHealth() > MIN_HEALTH)) + if (player.getHealth() <= 0 || (!isSuperActive(player) && player.getHealth() > _minHealth)) { continue; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/SmashPig.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/SmashPig.java index e8300adde..7bbbc05f6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/SmashPig.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/pig/SmashPig.java @@ -8,11 +8,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashPig extends SmashUltimate { - private static final int DURATION = 40000; - public SmashPig() { - super("Pig Stink", new String[] {}, Sound.PIG_IDLE, DURATION); + super("Pig Stink", new String[] {}, Sound.PIG_IDLE, 0); } @Override @@ -24,7 +22,7 @@ public class SmashPig extends SmashUltimate { if (!player.equals(other)) { - Manager.GetCondition().Factory().Confuse(GetName() + " " + player.getName(), other, player, DURATION / 1000, 0, false, false, false); + Manager.GetCondition().Factory().Confuse(GetName() + " " + player.getName(), other, player, getLength() / 1000, 0, false, false, false); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/sheep/SmashSheep.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/sheep/SmashSheep.java index 61e49baba..520123ea9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/sheep/SmashSheep.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/sheep/SmashSheep.java @@ -26,9 +26,9 @@ import nautilus.game.arcade.kit.perks.data.HomingSheepData; public class SmashSheep extends SmashUltimate { - private static final int DAMAGE_RADIUS = 10; - private static final int DAMAGE = 20; - private static final int KNOCKBACK_MAGNITUDE = 3; + private int _damageRadius; + private int _damage; + private int _knockbackMagnitude; private List _sheep = new ArrayList<>(); @@ -37,6 +37,14 @@ public class SmashSheep extends SmashUltimate super("Homing Sheeples", new String[] {}, Sound.SHEEP_IDLE, 0); } + @Override + public void setupValues() + { + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @Override public void activate(Player player) { @@ -91,7 +99,7 @@ public class SmashSheep extends SmashUltimate double scale = 0.4 + 0.6 * Math.min(1, data.Sheep.getTicksLived() / 60d); // Players - Map players = UtilPlayer.getInRadius(data.Sheep.getLocation(), DAMAGE_RADIUS); + Map players = UtilPlayer.getInRadius(data.Sheep.getLocation(), _damageRadius); for (Player player : players.keySet()) { @@ -101,7 +109,7 @@ public class SmashSheep extends SmashUltimate } // Damage Event - Manager.GetDamage().NewDamageEvent(player, data.Shooter, null, DamageCause.CUSTOM, DAMAGE * scale, true, true, false, data.Shooter.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(player, data.Shooter, null, DamageCause.CUSTOM, _damage * scale, true, true, false, data.Shooter.getName(), GetName()); } UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, data.Sheep.getLocation(), 0, 0, 0, 0, 1, ViewDist.MAX, UtilServer.getPlayers()); @@ -118,6 +126,6 @@ public class SmashSheep extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkBoneRush.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkBoneRush.java index f1d281713..1f09e42d9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkBoneRush.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkBoneRush.java @@ -39,13 +39,13 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkBoneRush extends SmashPerk implements IThrown { - private static final int COOLDOWN = 10000; - private static final float DAMAGE_NORMAL = 0.7F; - private static final int DAMAGE_SMASH = 3; - private static final int KNOCKBACK_NORMAL = 10; - private static final int KNOCKBACK_SMASH = 6; - private static final int EXPIRE_TIME = 2000; - private static final float Y_LIMIT = 0.25F; + private int _cooldown; + private float _damageNormal; + private int _damageSmash; + private int _knockbackNormal; + private int _knockbackSmash; + private int _expireTime; + private float _yLimit; private Map _active = new HashMap<>(); @@ -54,6 +54,18 @@ public class PerkBoneRush extends SmashPerk implements IThrown super("Bone Rush", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to use " + C.cGreen + "Bone Rush", C.cGray + "Crouch to avoid movement with " + C.cGreen + "Bone Rush" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damageNormal = getPerkFloat("Damage Normal"); + _damageSmash = getPerkInt("Damage Smash"); + _knockbackNormal = getPerkInt("Knockback Normal"); + _knockbackSmash = getPerkInt("Knockback Smash"); + _expireTime = getPerkTime("Expire Time"); + _yLimit = getPerkFloat("Y Limit"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -89,7 +101,7 @@ public class PerkBoneRush extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -141,7 +153,7 @@ public class PerkBoneRush extends SmashPerk implements IThrown // Velocity Vector dir = player.getLocation().getDirection(); - double limit = isSuperActive(player) ? Y_LIMIT + 0.1 : Y_LIMIT; + double limit = isSuperActive(player) ? _yLimit + 0.1 : _yLimit; if (dir.getY() > limit) { @@ -159,7 +171,7 @@ public class PerkBoneRush extends SmashPerk implements IThrown { Item bone = player.getWorld().dropItem(player.getLocation().add(Math.random() * 5 - 2.5, Math.random() * 3, Math.random() * 5 - 2.5), new ItemStack(Material.BONE)); UtilAction.velocity(bone, dir, 0.6 + 0.3 * Math.random(), false, 0, 0.1 + Math.random() * 0.05, 0.3, false); - Manager.GetProjectile().AddThrow(bone, player, this, EXPIRE_TIME, true, true, true, true, 0.5f); + Manager.GetProjectile().AddThrow(bone, player, this, _expireTime, true, true, true, true, 0.5f); } } } @@ -174,12 +186,12 @@ public class PerkBoneRush extends SmashPerk implements IThrown if (event.GetReason().contains(GetName())) { - event.AddKnockback(GetName(), KNOCKBACK_NORMAL); + event.AddKnockback(GetName(), _knockbackNormal); } if (event.GetReason().contains("Bone Storm")) { - event.AddKnockback(GetName(), KNOCKBACK_SMASH); + event.AddKnockback(GetName(), _knockbackSmash); } } @@ -216,7 +228,7 @@ public class PerkBoneRush extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, isSuperActive(damager) ? DAMAGE_SMASH : DAMAGE_NORMAL, false, true, false, UtilEnt.getName(data.getThrower()), reason); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, isSuperActive(damager) ? _damageSmash : _damageNormal, false, true, false, UtilEnt.getName(data.getThrower()), reason); UtilAction.velocity(target, data.getThrown().getVelocity()); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkDeadlyBones.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkDeadlyBones.java index ca13e82ac..0708471b7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkDeadlyBones.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkDeadlyBones.java @@ -1,11 +1,14 @@ package nautilus.game.arcade.game.games.smash.perks.skeletalhorse; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Item; @@ -14,28 +17,16 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.*; public class PerkDeadlyBones extends SmashPerk { - private static final int RATE = 400; - private static final int TICKS = 50; - private static final int DAMAGE_RADIUS = 4; - private static final int DAMAGE = 4; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _rate; + private int _ticks ; + private int _damageRadius; + private int _damage; + private float _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -44,6 +35,16 @@ public class PerkDeadlyBones extends SmashPerk super("Deadly Bones", new String[] { C.cGray + "Drop explosive bones when you take damage." }); } + @Override + public void setupValues() + { + _rate = getPerkInt("Rate (ms)"); + _ticks = getPerkInt("Ticks"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void damageActivate(CustomDamageEvent event) { @@ -64,7 +65,7 @@ public class PerkDeadlyBones extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), RATE, false, false)) + if (!Recharge.Instance.use(player, GetName(), _rate, false, false)) { return; } @@ -91,7 +92,7 @@ public class PerkDeadlyBones extends SmashPerk for (Item item : itemListCopy) { // Not Ready - if (item.isValid() && item.getTicksLived() < TICKS) + if (item.isValid() && item.getTicksLived() < _ticks) { continue; } @@ -109,7 +110,7 @@ public class PerkDeadlyBones extends SmashPerk } // Damage - Map targets = UtilEnt.getInRadius(item.getLocation(), DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(item.getLocation(), _damageRadius); for (LivingEntity cur : targets.keySet()) { @@ -118,7 +119,7 @@ public class PerkDeadlyBones extends SmashPerk continue; } - Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, DAMAGE * targets.get(cur) + 1, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, _damage * targets.get(cur) + 1, true, true, false, player.getName(), GetName()); } // Remove @@ -135,6 +136,6 @@ public class PerkDeadlyBones extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java index a343c4a12..130eec05e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/PerkHorseKick.java @@ -37,10 +37,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkHorseKick extends SmashPerk { - private static final int COOLDOWN = 6000; - private static final float DAMAGE = 6.5F; - private static final int KICK_TIME = 1000; - private static final int KNOCKBACK_MAGNITUDE = 4; + private int _cooldown; + private float _damage; + private int _kickTime; + private float _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -49,6 +49,15 @@ public class PerkHorseKick extends SmashPerk super("Bone Kick", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Bone Kick" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkFloat("Damage"); + _kickTime = getPerkInt("Kick Time (ms)"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -84,7 +93,7 @@ public class PerkHorseKick extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -119,7 +128,7 @@ public class PerkHorseKick extends SmashPerk } // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, true, false, player.getName(), GetName()); // Sound player.getWorld().playSound(player.getLocation(), Sound.SKELETON_HURT, 4f, 0.6f); @@ -158,7 +167,7 @@ public class PerkHorseKick extends SmashPerk continue; } - if (!player.isValid() || player.getHealth() <= 0 || UtilTime.elapsed(_active.get(key), KICK_TIME)) + if (!player.isValid() || player.getHealth() <= 0 || UtilTime.elapsed(_active.get(key), _kickTime)) { playerIterator.remove(); @@ -192,6 +201,6 @@ public class PerkHorseKick extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/SmashSkeletalHorse.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/SmashSkeletalHorse.java index 058c4c3d8..a66b39c55 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/SmashSkeletalHorse.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeletalhorse/SmashSkeletalHorse.java @@ -10,11 +10,9 @@ import nautilus.game.arcade.kit.Perk; public class SmashSkeletalHorse extends SmashUltimate { - private static final int DURATION = 20000; - public SmashSkeletalHorse() { - super("Bone Storm", new String[] {}, Sound.HORSE_SKELETON_DEATH, DURATION); + super("Bone Storm", new String[] {}, Sound.HORSE_SKELETON_DEATH, 0); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBarrage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBarrage.java index d8089da13..8dc18f5ad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBarrage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBarrage.java @@ -33,6 +33,7 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import org.jooq.util.derby.sys.Sys; public class PerkBarrage extends SmashPerk { @@ -48,6 +49,11 @@ public class PerkBarrage extends SmashPerk private boolean _noDelay; private boolean _useExp; + public PerkBarrage() + { + this(0, 0, false, false); + } + public PerkBarrage(int max, int tick, boolean remove, boolean noDelay) { this(max, tick, remove, noDelay, false); @@ -63,6 +69,16 @@ public class PerkBarrage extends SmashPerk _noDelay = noDelay; } + @Override + public void setupValues() + { + _max = getPerkInt("Max", _max); + _tick = getPerkInt("Tick", _tick); + _remove = getPerkBoolean("Remove", _remove); + _noDelay = getPerkBoolean("No Delay", _noDelay); + _useExp = getPerkBoolean("Exp Bar", _useExp); + } + @EventHandler public void BarrageDrawBow(PlayerInteractEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBoneExplosion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBoneExplosion.java index 5fe9a20db..37f301290 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBoneExplosion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/PerkBoneExplosion.java @@ -23,16 +23,25 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkBoneExplosion extends SmashPerk { - private static final int COOLDOWN = 10000; - private static final int DAMAGE_RADIUS = 7; - private static final int DAMAGE = 6; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private int _cooldown; + private int _damageRadius; + private int _damage; + private float _knockbackMagnitude; public PerkBoneExplosion() { super("Bone Explosion", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Bone Explosion" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -68,12 +77,12 @@ public class PerkBoneExplosion extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } - Map nearby = UtilPlayer.getInRadius(player.getLocation(), DAMAGE_RADIUS); + Map nearby = UtilPlayer.getInRadius(player.getLocation(), _damageRadius); for (Player other : nearby.keySet()) { @@ -86,7 +95,7 @@ public class PerkBoneExplosion extends SmashPerk UtilPlayer.message(other, F.main("Game", F.elem(Manager.GetColor(player) + player.getName()) + " used " + F.skill(GetName()) + ".")); // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE * nearby.get(other), true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage * nearby.get(other), true, true, false, player.getName(), GetName()); } // Inform @@ -104,6 +113,6 @@ public class PerkBoneExplosion extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/SmashSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/SmashSkeleton.java index bb86fdbcf..1e5e9c635 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/SmashSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/skeleton/SmashSkeleton.java @@ -20,14 +20,12 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSkeleton extends SmashUltimate { - - private static final int DURATION = 10000; - - private Set _arrows = new HashSet(); + + private Set _arrows = new HashSet<>(); public SmashSkeleton() { - super("Arrow Storm", new String[] {}, Sound.SKELETON_HURT, DURATION); + super("Arrow Storm", new String[] {}, Sound.SKELETON_HURT, 0); } @EventHandler @@ -71,15 +69,7 @@ public class SmashSkeleton extends SmashUltimate { return; } - - for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) - { - Projectile arrow = arrowIterator.next(); - if (arrow.isDead() || !arrow.isValid()) - { - arrowIterator.remove(); - } - } + _arrows.removeIf(arrow -> arrow.isDead() || !arrow.isValid()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeRocket.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeRocket.java index a9994d4a1..c8659cd43 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeRocket.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeRocket.java @@ -43,11 +43,11 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkSlimeRocket extends SmashPerk implements IThrown { - private static final int COOLDOWN = 6000; - private static final float ENERGY_PER_TICK = 0.004F; - private static final int KNOCKBACK_MAGNITUDE = 3; - private static final int MAX_ENERGY_TIME = 3000; - private static final int MAX_HOLD_TIME = 5000; + private int _cooldown = 6000; + private float _energyTick = 0.004F; + private int _knockbackMagnitude = 3; + private int _maxEnergyTime = 3000; + private int _maxHoldTime = 5000; private Map _charge = new HashMap<>(); private Map _owner = new HashMap<>(); @@ -58,6 +58,16 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown super("Slime Rocket", new String[] { C.cYellow + "Hold/Release Block" + C.cGray + " to use " + C.cGreen + "Slime Rocket" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _energyTick = getPerkFloat("Energy Per Tick"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + _maxEnergyTime = getPerkTime("Max Energy Time"); + _maxHoldTime = getPerkTime("Max Hold Time"); + } + @EventHandler public void EnergyUpdate(UpdateEvent event) { @@ -101,7 +111,7 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown continue; } - player.setExp((float) Math.min(0.999, player.getExp() + ENERGY_PER_TICK)); + player.setExp((float) Math.min(0.999, player.getExp() + _energyTick)); } } @@ -140,7 +150,7 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -187,13 +197,13 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown double elapsed = Math.min(3, (double) (System.currentTimeMillis() - time) / 1000d); // Use Energy - if (!UtilTime.elapsed(time, MAX_ENERGY_TIME)) + if (!UtilTime.elapsed(time, _maxEnergyTime)) { player.setExp((float) Math.max(0, player.getExp() - 0.01f)); } // AutoFire - if (UtilTime.elapsed(time, MAX_HOLD_TIME)) + if (UtilTime.elapsed(time, _maxHoldTime)) { FireRocket(player); chargeIterator.remove(); @@ -310,7 +320,7 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeSlam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeSlam.java index 6d27af729..fc36d01bb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeSlam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/PerkSlimeSlam.java @@ -1,42 +1,32 @@ package nautilus.game.arcade.game.games.smash.perks.slime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; public class PerkSlimeSlam extends SmashPerk { - private static final int COOLDOWN = 6000; - private static final int HIT_BOX = 2; - private static final int START_TIME = 1000; - private static final int DAMAGE_RATE_LIMIT = 500; - private static final int DAMAGE = 7; - private static final int KNOCKBACK_MAGNITUDE = 2; + private int _cooldown; + private int _hitBox; + private int _startTime; + private int _damageRateLimit; + private int _damage; + private int _knockbackMagnitude; private Map _live = new HashMap<>(); @@ -45,6 +35,17 @@ public class PerkSlimeSlam extends SmashPerk super("Slime Slam", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Slime Slam" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _hitBox = getPerkInt("Hit Box"); + _startTime = getPerkTime("Start Time"); + _damageRateLimit = getPerkInt("Damage Rate Limit (ms)"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void Leap(PlayerInteractEvent event) { @@ -75,7 +76,7 @@ public class PerkSlimeSlam extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -114,7 +115,7 @@ public class PerkSlimeSlam extends SmashPerk continue; } - if (UtilMath.offset(player, other) < HIT_BOX) + if (UtilMath.offset(player, other) < _hitBox) { doSlam(player, other); _live.remove(player.getUniqueId()); @@ -138,7 +139,7 @@ public class PerkSlimeSlam extends SmashPerk continue; } - if (!UtilTime.elapsed(_live.get(key), START_TIME)) + if (!UtilTime.elapsed(_live.get(key), _startTime)) { continue; } @@ -151,7 +152,7 @@ public class PerkSlimeSlam extends SmashPerk { if (damagee instanceof Player) { - if (!Recharge.Instance.use((Player) damagee, GetName() + " Hit", DAMAGE_RATE_LIMIT, false, false)) + if (!Recharge.Instance.use((Player) damagee, GetName() + " Hit", _damageRateLimit, false, false)) { return; } @@ -160,10 +161,10 @@ public class PerkSlimeSlam extends SmashPerk // Recoil Event if (!isSuperActive(damager)) { - Manager.GetDamage().NewDamageEvent(damager, damagee, null, DamageCause.CUSTOM, DAMAGE / 4, true, true, false, damager.getName(), GetName() + " Recoil"); + Manager.GetDamage().NewDamageEvent(damager, damagee, null, DamageCause.CUSTOM, _damage / 4, true, true, false, damager.getName(), GetName() + " Recoil"); // Damage Event - Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, DAMAGE, true, true, false, damager.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, _damage, true, true, false, damager.getName(), GetName()); } // Inform @@ -179,6 +180,6 @@ public class PerkSlimeSlam extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java index 16bfccd4e..c88f97ffd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/slime/SmashSlime.java @@ -26,13 +26,21 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSlime extends SmashUltimate { - private static final int DURATION = 19000; - private static final int HIT_BOX = 5; - private static final int DAMAGE = 8; + private int _hitBox; + private int _damage; public SmashSlime() { - super("Giga Slime", new String[] {}, Sound.SLIME_ATTACK, DURATION); + super("Giga Slime", new String[] {}, Sound.SLIME_ATTACK, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _hitBox = getPerkInt("Hit Box"); + _damage = getPerkInt("Damage"); } @Override @@ -53,7 +61,7 @@ public class SmashSlime extends SmashUltimate player.setExp(0.99f); - Manager.GetCondition().Factory().Speed(GetName(), player, player, DURATION / 1000, 2, false, false, false); + Manager.GetCondition().Factory().Speed(GetName(), player, player, getLength() / 1000, 2, false, false, false); } @@ -128,9 +136,9 @@ public class SmashSlime extends SmashUltimate continue; } - if (UtilMath.offset(player.getLocation().add(0, 3, 0), other.getLocation()) < HIT_BOX) + if (UtilMath.offset(player.getLocation().add(0, 3, 0), other.getLocation()) < _hitBox) { - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, false, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, false, false, player.getName(), GetName()); UtilParticle.PlayParticle(ParticleType.SLIME, other.getLocation().add(0, 0.6, 0), 1f, 1f, 1f, 0, 20, ViewDist.LONG, UtilServer.getPlayers()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java index aa0ed0242..766b6aa89 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkArcticAura.java @@ -2,6 +2,7 @@ package nautilus.game.arcade.game.games.smash.perks.snowman; import java.util.Map; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -15,14 +16,21 @@ import nautilus.game.arcade.kit.Perk; public class PerkArcticAura extends Perk { - private static final int DURATION = 2000; - private static final int RANGE = 5; + private int _duration; + private int _range; public PerkArcticAura() { super("Arctic Aura", new String[] { "You freeze things around you, slowing enemies." }); } + @Override + public void setupValues() + { + _duration = getPerkTime("Duration"); + _range = getPerkInt("Range"); + } + @EventHandler public void SnowAura(UpdateEvent event) { @@ -43,13 +51,18 @@ public class PerkArcticAura extends Perk continue; } - double range = RANGE * player.getExp(); + double range = _range * player.getExp(); Map blocks = UtilBlock.getInRadius(player.getLocation(), range); for (Block block : blocks.keySet()) { - Manager.GetBlockRestore().snow(block, (byte) 1, (byte) 1, (int) (DURATION * (1 + blocks.get(block))), 250, 0); + if (block.getType() == Material.SNOW_BLOCK) + { + continue; + } + + Manager.GetBlockRestore().snow(block, (byte) 1, (byte) 1, (int) (_duration * (1 + blocks.get(block))), 250, 0); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkIcePath.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkIcePath.java index 3916424a9..e48443b28 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkIcePath.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/PerkIcePath.java @@ -28,8 +28,8 @@ import nautilus.game.arcade.kit.perks.data.IcePathData; public class PerkIcePath extends Perk { - private static final int COOLDOWN = 12000; - private static final int MELT_TIME = 6000; + private int _cooldown; + private int _meltTime; private Set _data = new HashSet<>(); @@ -38,6 +38,13 @@ public class PerkIcePath extends Perk super("Ice Path", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Ice Path" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _meltTime = getPerkTime("Melt Time"); + } + @EventHandler public void Skill(PlayerInteractEvent event) { @@ -68,7 +75,7 @@ public class PerkIcePath extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -105,7 +112,7 @@ public class PerkIcePath extends Perk else { block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, 79); - Manager.GetBlockRestore().add(block, 79, (byte) 0, MELT_TIME); + Manager.GetBlockRestore().add(block, 79, (byte) 0, _meltTime); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/SmashSnowman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/SmashSnowman.java index d63314583..bcff8ef4b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/SmashSnowman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/snowman/SmashSnowman.java @@ -40,19 +40,29 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSnowman extends SmashUltimate { - private static final int DURATION = 20000; - private static final int TURRET_HEALTH = 40; - private static final int RATE = 250; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; private static final int COOLDOWN = 1000; + private int _duration; + private int _turretHealth; + private int _rate; + private float _knockbackMagnitude; + private Map _snowball = new HashMap<>(); private Map _turret = new HashMap<>(); public SmashSnowman() { - super("Snow Turret", new String[] {}, Sound.STEP_SNOW, DURATION); + super("Snow Turret", new String[] {}, Sound.STEP_SNOW, 0); + } + + @Override + public void setupValues() + { + _duration = getPerkTime("Duration"); + _turretHealth = getPerkInt("Turret Health"); + _rate = getPerkInt("Rate"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); } @Override @@ -72,8 +82,8 @@ public class SmashSnowman extends SmashUltimate UtilEnt.vegetate(ent); UtilEnt.ghost(ent, true, false); - ent.setMaxHealth(TURRET_HEALTH); - ent.setHealth(TURRET_HEALTH); + ent.setMaxHealth(_turretHealth); + ent.setHealth(_turretHealth); UtilAction.velocity(ent, player.getLocation().getDirection(), 1, false, 0, 0.2, 1, false); @@ -122,7 +132,7 @@ public class SmashSnowman extends SmashUltimate { Snowman snowman = turretIter.next(); - if(snowman.getTicksLived() >= (DURATION/50.0)) + if(snowman.getTicksLived() >= (_duration /50.0)) { UtilParticle.PlayParticle(ParticleType.SNOWBALL_POOF, snowman.getLocation().add(0, 1, 0), 0.4f, 0.4f, 0.4f, 0, 12, ViewDist.LONG, UtilServer.getPlayers()); snowman.remove(); @@ -131,7 +141,7 @@ public class SmashSnowman extends SmashUltimate } else { - double amount = 1 - snowman.getTicksLived() / (DURATION/50.0); + double amount = 1 - snowman.getTicksLived() / (_duration /50.0); snowman.setCustomName(UtilText.getProgress(C.cGreen, amount, C.cRed, false)); snowman.setCustomNameVisible(true); } @@ -205,13 +215,7 @@ public class SmashSnowman extends SmashUltimate UtilAction.velocity(damagee, proj.getVelocity().multiply(0.3).add(new Vector(0, 0.3, 0))); - // Damage Event - if (!(damagee instanceof LivingEntity)) - { - return; - } - - if (!Recharge.Instance.use((Player) damagee, GetName() + " Hit", RATE, false, false)) + if (!Recharge.Instance.use((Player) damagee, GetName() + " Hit", _rate, false, false)) { return; } @@ -242,7 +246,7 @@ public class SmashSnowman extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java index d65af9d03..40101f6ab 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkNeedler.java @@ -31,10 +31,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkNeedler extends SmashPerk { - private static final int COOLDOWN_NORMAL = 2000; - private static final int COOLDOWN_SMASH = 600; - private static final float DAMAGE = 1.1F; - private static final int MAX_TICKS = 300; + private long _cooldownNormal; + private long _cooldownSmash; + private double _damage; + private int _maxTicks; private Map _active = new HashMap<>(); private Set _arrows = new HashSet<>(); @@ -44,6 +44,15 @@ public class PerkNeedler extends SmashPerk super("Needler", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Needler" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkInt("Cooldown Normal (ms)"); + _cooldownSmash = getPerkInt("Cooldown Smash (ms)"); + _damage = getPerkDouble("Damage"); + _maxTicks = getPerkInt("Max Ticks"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -74,12 +83,12 @@ public class PerkNeedler extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? COOLDOWN_SMASH : COOLDOWN_NORMAL, !isSuperActive(player), !isSuperActive(player))) + if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? _cooldownSmash : _cooldownNormal, !isSuperActive(player), !isSuperActive(player))) { return; } - _active.put(player.getUniqueId(), 8); + _active.put(player.getUniqueId(), 7); UtilPlayer.message(player, F.main("Skill", "You used " + F.skill(GetName()) + ".")); } @@ -156,7 +165,7 @@ public class PerkNeedler extends SmashPerk event.GetProjectile().remove(); // Damage Event - Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), damager, null, DamageCause.THORNS, DAMAGE, true, true, false, damager.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), damager, null, DamageCause.THORNS, _damage, true, true, false, damager.getName(), GetName()); if (!isTeamDamage(damager, event.GetDamageePlayer())) { @@ -176,7 +185,7 @@ public class PerkNeedler extends SmashPerk { Arrow arrow = arrowIterator.next(); - if (arrow.isOnGround() || !arrow.isValid() || arrow.getTicksLived() > MAX_TICKS) + if (arrow.isOnGround() || !arrow.isValid() || arrow.getTicksLived() > _maxTicks) { arrowIterator.remove(); arrow.remove(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java index dc62b516e..7db5d925c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkSpiderLeap.java @@ -26,8 +26,8 @@ import nautilus.game.arcade.kit.Perk; public class PerkSpiderLeap extends Perk { - private static final float ENERGY_PER_TICK = 0.005F; - private static final float ENERGY_PER_LEAP = 0.17F; + private float _energyTick; + private float _energyJump; private Set _secondJump = new HashSet<>(); private Set _finalJump = new HashSet<>(); @@ -38,6 +38,13 @@ public class PerkSpiderLeap extends Perk + "Wall Climb requires Energy (Experience Bar)." }); } + @Override + public void setupValues() + { + _energyTick = getPerkFloat("Energy Per Tick"); + _energyJump = getPerkFloat("Energy Per Jump"); + } + @EventHandler public void WallClimb(UpdateEvent event) { @@ -62,19 +69,19 @@ public class PerkSpiderLeap extends Perk _secondJump.remove(player.getUniqueId()); } - player.setExp(Math.min(0.999F, player.getExp() + (grounded ? ENERGY_PER_TICK * 2 : ENERGY_PER_TICK))); + player.setExp(Math.min(0.999F, player.getExp() + (grounded ? _energyTick * 2 : _energyTick))); continue; } - player.setExp(Math.max(0, player.getExp() - ENERGY_PER_TICK)); + player.setExp(Math.max(0, player.getExp() - _energyTick)); if (player.getExp() <= 0) { continue; } - if (player.getExp() >= ENERGY_PER_LEAP) + if (player.getExp() >= _energyJump) { _finalJump.remove(player.getUniqueId()); } @@ -116,7 +123,7 @@ public class PerkSpiderLeap extends Perk // Disable Flight player.setAllowFlight(false); - if (player.getExp() < ENERGY_PER_LEAP) + if (player.getExp() < _energyJump) { if (!_finalJump.contains(player.getUniqueId())) { @@ -132,7 +139,7 @@ public class PerkSpiderLeap extends Perk UtilAction.velocity(player, 1.0, 0.2, 1.0, true); // Energy - player.setExp(Math.max(0, player.getExp() - ENERGY_PER_LEAP)); + //player.setExp(Math.max(0, player.getExp() - _energyJump)); // Sound player.getWorld().playSound(player.getLocation(), Sound.SPIDER_IDLE, 1f, 1.5f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkWebShot.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkWebShot.java index 1fdd08267..ec2bb90fa 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkWebShot.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/PerkWebShot.java @@ -30,15 +30,23 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWebShot extends SmashPerk implements IThrown { - private static final int COOLDOWN_NORMAL = 10000; - private static final int COOLDOWN_SMASH = 1000; - private static final int WEBS = 20; + private int _cooldownNormal = 10000; + private int _cooldownSmash = 1000; + private int _webs = 20; public PerkWebShot() { super("Spin Web", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Spin Web" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkTime("Cooldown Smash"); + _webs = getPerkInt("Webs"); + } + @EventHandler public void ShootWeb(PlayerInteractEvent event) { @@ -69,7 +77,7 @@ public class PerkWebShot extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? COOLDOWN_SMASH : COOLDOWN_NORMAL, !isSuperActive(player), !isSuperActive(player))) + if (!Recharge.Instance.use(player, GetName(), isSuperActive(player) ? _cooldownSmash : _cooldownNormal, !isSuperActive(player), !isSuperActive(player))) { return; } @@ -79,7 +87,7 @@ public class PerkWebShot extends SmashPerk implements IThrown // Boost UtilAction.velocity(player, 1.2, 0.2, 1.2, true); - for (int i = 0; i < WEBS; i++) + for (int i = 0; i < _webs; i++) { Item ent = player.getWorld().dropItem(player.getLocation().add(0, 0.5, 0), ItemStackFactory.Instance.CreateStack(Material.WEB, (byte) 0, 1, "Web " + player.getName() + " " + i)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/SmashSpider.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/SmashSpider.java index 3ffcf8635..b0ed1055e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/SmashSpider.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/spider/SmashSpider.java @@ -22,13 +22,11 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSpider extends SmashUltimate { - private static final int DURATION = 30000; - private Map _preHealth = new HashMap<>(); public SmashSpider() { - super("Spider Nest", new String[] {}, Sound.SPIDER_DEATH, DURATION); + super("Spider Nest", new String[] {}, Sound.SPIDER_DEATH, 0); } @Override @@ -61,11 +59,11 @@ public class SmashSpider extends SmashUltimate continue; } - Manager.GetBlockRestore().add(block, 30, (byte) 0, (int) (DURATION + 5000 * Math.random())); + Manager.GetBlockRestore().add(block, 30, (byte) 0, (int) (getLength() + 5000 * Math.random())); } // Regen - Manager.GetCondition().Factory().Regen(GetName(), player, player, DURATION / 1000, 2, false, false, false); + Manager.GetCondition().Factory().Regen(GetName(), player, player, getLength() / 1000, 2, false, false, false); } @EventHandler(priority = EventPriority.HIGH) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java index 184f1b135..276650c3e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkFishFlurry.java @@ -1,11 +1,17 @@ package nautilus.game.arcade.game.games.smash.perks.squid; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.projectile.IThrown; +import mineplex.core.projectile.ProjectileUser; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.smash.perks.SmashPerk; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -18,39 +24,16 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.util.Vector; -import mineplex.core.common.util.C; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.projectile.IThrown; -import mineplex.core.projectile.ProjectileUser; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import java.util.*; public class PerkFishFlurry extends SmashPerk implements IThrown { - private static final int COOLDOWN = 24000; - private static final float DAMAGE = 2.6F; - private static final int START_TIME = 2000; - private static final int END_TIME = 6000; - private static final float KNOCKBACK_MAGNITUDE = 1.5F; + private int _cooldown; + private float _damage; + private int _startTime; + private int _endTime; + private float _knockbackMagnitude; private List _active = new ArrayList<>(); @@ -59,6 +42,16 @@ public class PerkFishFlurry extends SmashPerk implements IThrown super("Fish Flurry", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to use " + C.cGreen + "Fish Flurry" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkFloat("Damage"); + _startTime = getPerkTime("Start Time"); + _endTime = getPerkTime("End Time"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void shoot(PlayerInteractEvent event) { @@ -128,7 +121,7 @@ public class PerkFishFlurry extends SmashPerk implements IThrown if (!blocks.isEmpty()) { - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -157,7 +150,7 @@ public class PerkFishFlurry extends SmashPerk implements IThrown // particles for (Block block : data.Blocks) { - UtilParticle.PlayParticle(ParticleType.SPLASH, block.getLocation().add(0.5, 1, 0.5), 0.25f, 0, 0.25f, 0, 3, ViewDist.LONG, UtilServer.getPlayers()); + UtilParticle.PlayParticleToAll(ParticleType.SPLASH, block.getLocation().add(0.5, 1, 0.5), 0.25f, 0, 0.25f, 0, 1, ViewDist.LONG); } // sound @@ -167,12 +160,12 @@ public class PerkFishFlurry extends SmashPerk implements IThrown block.getWorld().playSound(block.getLocation(), Math.random() > 0.5 ? Sound.SPLASH : Sound.SPLASH2, 0.5f, 1f); } - if (!UtilTime.elapsed(data.StartTime, START_TIME)) + if (!UtilTime.elapsed(data.StartTime, _startTime)) { continue; } - if (!UtilTime.elapsed(data.StartTime, END_TIME)) + if (!UtilTime.elapsed(data.StartTime, _endTime)) { Item fish = block.getWorld().dropItem(block.getLocation().add(0.5, 1.5, 0.5), ItemStackFactory.Instance.CreateStack(Material.RAW_FISH, (byte) UtilMath.r(4), 1, "Fish" + Math.random())); @@ -195,7 +188,7 @@ public class PerkFishFlurry extends SmashPerk implements IThrown if (target != null) { // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, DAMAGE, false, true, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damage, false, true, false, UtilEnt.getName(data.getThrower()), GetName()); UtilParticle.PlayParticle(ParticleType.EXPLODE, target.getLocation().add(0, 1, 0), 1f, 1f, 1f, 0, 12, ViewDist.LONG, UtilServer.getPlayers()); } @@ -223,7 +216,7 @@ public class PerkFishFlurry extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); event.setKnockbackOrigin(event.GetDamageeEntity().getLocation().add(Math.random() - 0.5, -0.1, Math.random() - 0.5)); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java index 80f6d91a5..b2e1a00fc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkInkBlast.java @@ -36,19 +36,27 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkInkBlast extends SmashPerk implements IThrown { - private static final int COOLDOWN = 6000; - private static final float PROJECTILE_VELOCITY = 0.15F; - private static final int KNOCKBACK_MAGNITUDE = 3; - + private int _cooldown; + private float _spread; + private float _projectileVelocity; + private int _knockbackMagnitude; private int _bullets; private double _damagePerBullet; - public PerkInkBlast(int bullets, double damagePerBullet) + public PerkInkBlast() { super("Ink Shotgun", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Ink Shotgun" }); + } - _bullets = bullets; - _damagePerBullet = damagePerBullet; + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _spread = getPerkFloat("Spread"); + _projectileVelocity = getPerkFloat("Projectile Velocity"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + _bullets = getPerkInt("Bullets"); + _damagePerBullet = getPerkDouble("Damage Per Bullet"); } @EventHandler @@ -86,7 +94,7 @@ public class PerkInkBlast extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -100,9 +108,9 @@ public class PerkInkBlast extends SmashPerk implements IThrown Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), ItemStackFactory.Instance.CreateStack(Material.INK_SACK, (byte) 0, 1, "Ink" + Math .random())); - Vector random = new Vector(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5); + Vector random = new Vector((Math.random() - 0.5) * _spread, (Math.random() - 0.5) * _spread, (Math.random() - 0.5) * _spread); random.normalize(); - random.multiply(PROJECTILE_VELOCITY); + random.multiply(_projectileVelocity); if (i == 0) { @@ -164,6 +172,6 @@ public class PerkInkBlast extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkSuperSquid.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkSuperSquid.java index dc203d554..13dff7e65 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkSuperSquid.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/PerkSuperSquid.java @@ -31,8 +31,8 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkSuperSquid extends SmashPerk { - private static final int COOLDOWN = 8000; - private static final int VELOCITY_TIME = 1100; + private int _cooldown; + private int _velocityTime; private Map _active = new HashMap<>(); @@ -41,6 +41,13 @@ public class PerkSuperSquid extends SmashPerk super("Super Squid", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Super Squid", }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _velocityTime = getPerkInt("Velocity Time (ms)"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -76,7 +83,7 @@ public class PerkSuperSquid extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -112,7 +119,7 @@ public class PerkSuperSquid extends SmashPerk continue; } - if (UtilTime.elapsed(_active.get(cur.getUniqueId()), VELOCITY_TIME)) + if (UtilTime.elapsed(_active.get(cur.getUniqueId()), _velocityTime)) { _active.remove(cur.getUniqueId()); continue; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/SmashSquid.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/SmashSquid.java index 118449e13..f7cc4b4e5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/SmashSquid.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/squid/SmashSquid.java @@ -38,18 +38,29 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashSquid extends SmashUltimate { - private static final int DURATION = 24000; - private static final int RATE = 1600; - private static final int MAX_RANGE = 100; - private static final int DAMAGE = 16; - private static final int DAMAGE_RADIUS = 8; - private static final int KNOCKBACK_MAGNITUDE = 3; + private int _rate; + private int _maxRange; + private int _damage; + private int _damageRadius; + private int _knockbackMagnitude; public SmashSquid() { - super("Storm Squid", new String[] {}, Sound.SPLASH2, DURATION); + super("Storm Squid", new String[] {}, Sound.SPLASH2, 0); } - + + @Override + public void setupValues() + { + super.setupValues(); + + _rate = getPerkInt("Rate (ms)"); + _maxRange = getPerkInt("Max Range"); + _damage = getPerkInt("Damage"); + _damageRadius = getPerkInt("Damage Radius"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @Override public void activate(Player player) { @@ -98,7 +109,7 @@ public class SmashSquid extends SmashUltimate return; } - Block block = UtilPlayer.getTarget(player, UtilBlock.blockAirFoliageSet, MAX_RANGE); + Block block = UtilPlayer.getTarget(player, UtilBlock.blockAirFoliageSet, _maxRange); if (block == null) { @@ -107,7 +118,7 @@ public class SmashSquid extends SmashUltimate final Location loc = block.getLocation().add(0.5, 0.5, 0.5); - if (!Recharge.Instance.use(player, GetName() + " Strike", RATE, false, false)) + if (!Recharge.Instance.use(player, GetName() + " Strike", _rate, false, false)) { return; } @@ -124,7 +135,7 @@ public class SmashSquid extends SmashUltimate // Warning player.getWorld().spigot().strikeLightningEffect(loc, false); - Map targets = UtilEnt.getInRadius(loc, DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(loc, _damageRadius); for (LivingEntity cur : targets.keySet()) { @@ -134,7 +145,7 @@ public class SmashSquid extends SmashUltimate } // Damage Event - Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, DAMAGE * targets.get(cur), false, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, _damage * targets.get(cur), false, true, false, player.getName(), GetName()); // Velocity UtilAction.velocity(cur, UtilAlg.getTrajectory(loc, cur.getLocation()), 3 * targets.get(cur), false, 0, 1 * targets.get(cur), 2, true); @@ -245,6 +256,6 @@ public class SmashSquid extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java index 6433024c5..298f58edf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkBatWave.java @@ -44,14 +44,15 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkBatWave extends SmashPerk { - - private static final int COOLDOWN = 8000; + private static final int LEASH_COOLDOWN = 500; - private static final int HIT_COOLDOWN = 200; - private static final int HIT_BOX = 2; - private static final int DAMAGE = 3; - private static final int DISABLE_DAMAGE = 20; - private static final float KNOCKBACK_MAGNITUDE = 1.75F; + + private int _cooldown; + private int _hitCooldown; + private int _hitBox; + private int _damage; + private int _disableDamage; + private float _knockbackMagnitude; private static final String LEASH = "Leash Bats"; private static final String HIT = "Hit By Bat"; @@ -69,6 +70,17 @@ public class PerkBatWave extends SmashPerk + C.cGreen + "Bat Leash" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _hitCooldown = getPerkInt("Hit Cooldown (ms)"); + _hitBox = getPerkInt("Hit Box"); + _damage = getPerkInt("Damage"); + _disableDamage = getPerkInt("Disable Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -106,7 +118,7 @@ public class PerkBatWave extends SmashPerk UUID key = player.getUniqueId(); - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, false, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, false, true)) { if (_active.containsKey(key)) { @@ -138,7 +150,7 @@ public class PerkBatWave extends SmashPerk else { // Inform - Recharge.Instance.use(player, GetName(), COOLDOWN, true, true); + Recharge.Instance.use(player, GetName(), _cooldown, true, true); } } else @@ -219,10 +231,10 @@ public class PerkBatWave extends SmashPerk continue; } - if (UtilEnt.hitBox(bat.getLocation(), other, HIT_BOX, null)) + if (UtilEnt.hitBox(bat.getLocation(), other, _hitBox, null)) { // Damage Event - Manager.GetDamage().NewDamageEvent(other, cur, null, DamageCause.CUSTOM, DAMAGE, true, true, false, cur.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, cur, null, DamageCause.CUSTOM, _damage, true, true, false, cur.getName(), GetName()); // Effect bat.getWorld().playSound(bat.getLocation(), Sound.BAT_HURT, 1f, 1f); @@ -231,7 +243,7 @@ public class PerkBatWave extends SmashPerk bat.remove(); // Recharge on hit - Recharge.Instance.useForce(other, HIT, HIT_COOLDOWN); + Recharge.Instance.useForce(other, HIT, _hitCooldown); } } } @@ -281,7 +293,7 @@ public class PerkBatWave extends SmashPerk bat.remove(); } - _bats.remove(player); + _bats.remove(player.getUniqueId()); } } @@ -299,7 +311,7 @@ public class PerkBatWave extends SmashPerk { _damageTaken.put(key, (_damageTaken.get(key) + event.GetDamage())); - if (_damageTaken.get(key) >= DISABLE_DAMAGE) + if (event.GetCause() == DamageCause.ENTITY_ATTACK || _damageTaken.get(key) >= _disableDamage) { Clear(player); } @@ -311,6 +323,6 @@ public class PerkBatWave extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java index 02dd04394..217f01b77 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/PerkWitchPotion.java @@ -40,11 +40,11 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWitchPotion extends SmashPerk implements IThrown { - private static final int COOLDOWN = 2000; - private static final int RANGE_NOMRAL = 3; - private static final int DAMAGE_DIRECT = 7; - private static final int DAMAGE_DISTANCE = 6; - private static final int KNOCKBACK_MAGNITUDE = 2; + private int _cooldown; + private int _range; + private int _damageDirect; + private int _damageDistance; + private int _knockbackMagnitude; private List _proj = new ArrayList<>(); @@ -53,6 +53,16 @@ public class PerkWitchPotion extends SmashPerk implements IThrown super("Daze Potion", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to use " + C.cGreen + "Daze Potion" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _range = getPerkInt( "Range"); + _damageDirect = getPerkInt("Damage Direct"); + _damageDistance = getPerkInt("Damage Distance"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -88,7 +98,7 @@ public class PerkWitchPotion extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -137,7 +147,7 @@ public class PerkWitchPotion extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } @Override @@ -153,18 +163,20 @@ public class PerkWitchPotion extends SmashPerk implements IThrown for (Player player : directHit) { - Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, DAMAGE_DIRECT, true, true, false, thrower.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, _damageDirect, true, true, false, thrower.getName(), GetName()); + Manager.GetCondition().Factory().Slow(GetName(), target, thrower, 2, 1, true, true, false, false); } players.removeAll(directHit); - Vector a = data.getThrown().getLocation().subtract(RANGE_NOMRAL, RANGE_NOMRAL, RANGE_NOMRAL).toVector(); - Vector b = data.getThrown().getLocation().add(RANGE_NOMRAL, RANGE_NOMRAL, RANGE_NOMRAL).toVector(); + Vector a = data.getThrown().getLocation().subtract(_range, _range, _range).toVector(); + Vector b = data.getThrown().getLocation().add(_range, _range, _range).toVector(); for (Player player : players) { if(!UtilEnt.isInsideBoundingBox(player, a, b)) continue; - Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, DAMAGE_DISTANCE, true, true, false, thrower.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, _damageDistance, true, true, false, thrower.getName(), GetName()); + Manager.GetCondition().Factory().Slow(GetName(), target, thrower, 2, 0, true, true, false, false); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/SmashWitch.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/SmashWitch.java index c8c048c3b..560a09453 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/SmashWitch.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witch/SmashWitch.java @@ -43,20 +43,33 @@ import nautilus.game.arcade.kit.perks.data.SonicBoomData; public class SmashWitch extends SmashUltimate { - private static final int DURATION = 20000; - private static final int COOLDOWN = 1200; - private static final int MAX_TIME = 12000; - private static final int HIT_BOX = 4; - private static final int DAMAGE_RADIUS = 10; - private static final int DAMAGE = 12; - private static final int FLAP_COOLDOWN = 40; - private static final int KNOCKBACK_MAGNITUDE = 2; + private int _cooldown; + private int _maxTime; + private int _hitBox; + private int _damageRadius; + private int _damage; + private int _flapCooldown; + private int _knockbackMagnitude; private List _sonic = new ArrayList<>(); public SmashWitch() { - super("Bat Form", new String[] {}, Sound.BAT_HURT, DURATION); + super("Bat Form", new String[] {}, Sound.BAT_HURT, 0); + } + + @Override + public void setupValues() + { + super.setupValues(); + + _cooldown = getPerkInt("Cooldown (ms)"); + _maxTime = getPerkTime("Max Time"); + _hitBox = getPerkInt("Hit Box"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _flapCooldown = getPerkInt("Flap Cooldown (ms)"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); } @Override @@ -148,7 +161,7 @@ public class SmashWitch extends SmashUltimate return; } - if (!Recharge.Instance.use(player, GetName() + " Screech", COOLDOWN, false, false)) + if (!Recharge.Instance.use(player, GetName() + " Screech", _cooldown, false, false)) { return; } @@ -174,7 +187,7 @@ public class SmashWitch extends SmashUltimate SonicBoomData data = sonicIter.next(); // Time Boom - if (UtilTime.elapsed(data.Time, MAX_TIME)) + if (UtilTime.elapsed(data.Time, _maxTime)) { sonicIter.remove(); explode(data); @@ -202,7 +215,7 @@ public class SmashWitch extends SmashUltimate continue; } - if (UtilMath.offset(player.getLocation().add(0, 1, 0), data.Location) < HIT_BOX) + if (UtilMath.offset(player.getLocation().add(0, 1, 0), data.Location) < _hitBox) { sonicIter.remove(); explode(data); @@ -226,7 +239,7 @@ public class SmashWitch extends SmashUltimate data.Location.getWorld().playSound(data.Location, Sound.EXPLODE, 1f, 1.5f); // Damage - Map targets = UtilEnt.getInRadius(data.Location, DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(data.Location, _damageRadius); for (LivingEntity cur : targets.keySet()) { @@ -235,7 +248,7 @@ public class SmashWitch extends SmashUltimate continue; } - Manager.GetDamage().NewDamageEvent(cur, data.Shooter, null, DamageCause.CUSTOM, DAMAGE * targets.get(cur) + 0.5, true, false, false, data.Shooter.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, data.Shooter, null, DamageCause.CUSTOM, _damage * targets.get(cur) + 0.5, true, false, false, data.Shooter.getName(), GetName()); } } @@ -272,7 +285,7 @@ public class SmashWitch extends SmashUltimate player.getWorld().playSound(player.getLocation(), Sound.BAT_TAKEOFF, (float) (0.3 + player.getExp()), (float) (Math.random() / 2 + 0.5)); // Set Recharge - Recharge.Instance.use(player, GetName() + " Flap", FLAP_COOLDOWN, false, false); + Recharge.Instance.use(player, GetName() + " Flap", _flapCooldown, false, false); } @EventHandler @@ -316,6 +329,6 @@ public class SmashWitch extends SmashUltimate return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java index ba5a90767..605ea110c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherImage.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.Map; import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; @@ -32,13 +33,14 @@ import mineplex.core.utils.UtilVariant; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.game.games.smash.perks.SmashPerk; +import org.bukkit.util.Vector; public class PerkWitherImage extends SmashPerk { - private static final int COOLDOWN = 12000; - private static final int SWAP_COOLDOWN = 2000; - private static final int TARGET_RADIUS = 15; + private int _cooldown; + private int _swapCooldown; + private int _targetRadius; private Map _skeletons = new HashMap<>(); @@ -48,6 +50,14 @@ public class PerkWitherImage extends SmashPerk + "Wither Swap" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _swapCooldown = getPerkTime("Swap Cooldown"); + _targetRadius = getPerkInt("Target Radius"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -85,7 +95,7 @@ public class PerkWitherImage extends SmashPerk if (!_skeletons.containsKey(player.getUniqueId())) { - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -101,7 +111,7 @@ public class PerkWitherImage extends SmashPerk skel.setMaxHealth(20); skel.setHealth(skel.getMaxHealth()); - for (Player other : UtilPlayer.getNearby(skel.getLocation(), TARGET_RADIUS)) + for (Player other : UtilPlayer.getNearby(skel.getLocation(), _targetRadius)) { if (player.equals(other) || UtilPlayer.isSpectator(other) || isTeamDamage(player, other)) { @@ -127,7 +137,7 @@ public class PerkWitherImage extends SmashPerk _skeletons.put(player.getUniqueId(), skel); - Recharge.Instance.use(player, "Wither Swap", SWAP_COOLDOWN / 4, false, false); + Recharge.Instance.use(player, "Wither Swap", _swapCooldown / 4, false, false); // Sound player.getWorld().playSound(player.getLocation(), Sound.WITHER_SPAWN, 1f, 1f); @@ -137,16 +147,20 @@ public class PerkWitherImage extends SmashPerk } else { - if (!Recharge.Instance.use(player, "Wither Swap", SWAP_COOLDOWN, true, false)) + if (!Recharge.Instance.use(player, "Wither Swap", _swapCooldown, true, false)) { return; } Skeleton skel = _skeletons.get(player.getUniqueId()); + Vector oldSkeletonVector = skel.getVelocity().clone(); + Vector oldPlayerVector = player.getVelocity().clone(); Location loc = skel.getLocation(); skel.teleport(player.getLocation()); + UtilAction.velocity(skel, oldPlayerVector); player.teleport(loc); + UtilAction.velocity(player, oldSkeletonVector); // Sound player.getWorld().playSound(player.getLocation(), Sound.WITHER_SPAWN, 1f, 2f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherSkull.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherSkull.java index 8f6845044..bd2c99b0e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherSkull.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/PerkWitherSkull.java @@ -40,10 +40,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWitherSkull extends SmashPerk { - private static final int COOLDOWN_NORMAL = 6000; - private static final int COOLDOWN_SMASH = 1000; - private static final int DAMAGE = 12; - private static final float KNOCKBACK_MAGNITUDE = 1.5F; + private int _cooldownNormal; + private int _cooldownSmash; + private int _damage; + private float _knockbackMagnitude; private Map _active = new HashMap<>(); private Set _ignoreControl = new HashSet<>(); @@ -53,6 +53,15 @@ public class PerkWitherSkull extends SmashPerk super("Wither Skull", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Wither Skull" }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkTime("Cooldown Smash"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler(priority = EventPriority.LOW) // Happen BEFORE super is // triggered public void activate(PlayerInteractEvent event) @@ -88,7 +97,7 @@ public class PerkWitherSkull extends SmashPerk return; } - if (!Recharge.Instance.use(player, GetName(), smash ? COOLDOWN_SMASH : COOLDOWN_NORMAL, !smash, !smash)) + if (!Recharge.Instance.use(player, GetName(), smash ? _cooldownSmash : _cooldownNormal, !smash, !smash)) { return; } @@ -211,7 +220,7 @@ public class PerkWitherSkull extends SmashPerk } // Damage Event - Manager.GetDamage().NewDamageEvent(player, (LivingEntity) skull.getShooter(), null, DamageCause.CUSTOM, DAMAGE * players.get(player) * scale, true, true, false, UtilEnt.getName( + Manager.GetDamage().NewDamageEvent(player, (LivingEntity) skull.getShooter(), null, DamageCause.CUSTOM, _damage * players.get(player) * scale, true, true, false, UtilEnt.getName( (LivingEntity) skull.getShooter()), GetName()); } } @@ -224,6 +233,6 @@ public class PerkWitherSkull extends SmashPerk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/SmashWitherSkeleton.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/SmashWitherSkeleton.java index 717328a64..59d232b8b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/SmashWitherSkeleton.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/witherskeleton/SmashWitherSkeleton.java @@ -28,11 +28,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashWitherSkeleton extends SmashUltimate { - private static final int DURAITON = 18000; - public SmashWitherSkeleton() { - super("Wither Form", new String[] {}, Sound.WITHER_SPAWN, DURAITON); + super("Wither Form", new String[] {}, Sound.WITHER_SPAWN, 0); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java index a5968ac4e..dfc79d277 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/PerkWolf.java @@ -41,13 +41,13 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkWolf extends SmashPerk { - private static final int TACKLE_COOLDOWN_NORMAL = 8000; - private static final int TACKLE_COOLDOWN_SMASH = 1600; - private static final int WOLF_HEALTH = 30; - private static final float WOLF_HIT_BOX = 2.5F; - private static final int WOLF_MAX_TICKS = 70; - private static final int TACKLE_DAMAGE = 5; - private static final int STRIKE_DAMAGE = 7; + private int _cooldownNormal; + private int _cooldownSmash; + private int _wolfHealth; + private float _hitBox; + private int _maxTicks; + private int _tackleDamage; + private int _strikeDamage; private static final String CUB_TACKLE = "Cub Tackle"; private static final String WOLF_STRIKE = "Wolf Strike"; @@ -67,6 +67,18 @@ public class PerkWolf extends SmashPerk + "Right-Click" + C.cGray + " with Spade to use " + C.cGreen + WOLF_STRIKE, C.cGray + "Wolf Strike deals 300% Knockback to tackled opponents.", }); } + @Override + public void setupValues() + { + _cooldownNormal = getPerkTime("Cooldown Normal"); + _cooldownSmash = getPerkInt("Cooldown Smash (ms)"); + _wolfHealth = getPerkInt("Wolf Health"); + _hitBox = getPerkFloat("Hit Box"); + _maxTicks = getPerkInt("Max Ticks"); + _tackleDamage = getPerkInt("Tackle Damage"); + _strikeDamage = getPerkInt("Strike Damage"); + } + @EventHandler public void tackleTrigger(PlayerInteractEvent event) { @@ -99,7 +111,7 @@ public class PerkWolf extends SmashPerk boolean smash = isSuperActive(player); - if (!Recharge.Instance.use(player, CUB_TACKLE, smash ? TACKLE_COOLDOWN_SMASH : TACKLE_COOLDOWN_NORMAL, !smash, !smash)) + if (!Recharge.Instance.use(player, CUB_TACKLE, smash ? _cooldownSmash : _cooldownNormal, !smash, !smash)) { return; } @@ -115,7 +127,7 @@ public class PerkWolf extends SmashPerk UtilEnt.vegetate(wolf); - wolf.setMaxHealth(WOLF_HEALTH); + wolf.setMaxHealth(_wolfHealth); wolf.setHealth(wolf.getMaxHealth()); UtilAction.velocity(wolf, player.getLocation().getDirection(), 1.8, false, 0, 0.2, 1.2, true); @@ -152,7 +164,7 @@ public class PerkWolf extends SmashPerk continue; } - if (UtilEnt.hitBox(wolf.getLocation(), other, WOLF_HIT_BOX, null)) + if (UtilEnt.hitBox(wolf.getLocation(), other, _hitBox, null)) { if (other.equals(tackleGetOwner(wolf))) { @@ -166,7 +178,7 @@ public class PerkWolf extends SmashPerk } } - if (!wolf.isValid() || (UtilEnt.isGrounded(wolf) && wolf.getTicksLived() > WOLF_MAX_TICKS)) + if (!wolf.isValid() || (UtilEnt.isGrounded(wolf) && wolf.getTicksLived() > _maxTicks)) { wolf.remove(); wolfIterator.remove(); @@ -195,7 +207,7 @@ public class PerkWolf extends SmashPerk UtilAction.zeroVelocity(damagee); // Damage - Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, TACKLE_DAMAGE, false, true, false, damager.getName(), CUB_TACKLE); + Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, _tackleDamage, false, true, false, damager.getName(), CUB_TACKLE); // Sound damagee.getWorld().playSound(damagee.getLocation(), Sound.WOLF_GROWL, 1.5f, 1.5f); @@ -220,14 +232,14 @@ public class PerkWolf extends SmashPerk Wolf wolf = wolfIterator.next(); LivingEntity ent = _tackle.get(wolf); - if (!wolf.isValid() || !ent.isValid() || wolf.getTicksLived() > WOLF_MAX_TICKS) + if (!wolf.isValid() || !ent.isValid() || wolf.getTicksLived() > _maxTicks) { wolf.remove(); wolfIterator.remove(); continue; } - if (UtilMath.offset(wolf, ent) < WOLF_HIT_BOX) + if (UtilMath.offset(wolf, ent) < _hitBox) { Manager.GetCondition().Factory().Slow(CUB_TACKLE, ent, wolf, 0.9, 1, false, false, false, false); UtilAction.velocity(ent, new Vector(0, -0.3, 0)); @@ -362,7 +374,7 @@ public class PerkWolf extends SmashPerk continue; } - if (UtilEnt.hitBox(player.getLocation().add(0, 1, 0), other, WOLF_HIT_BOX, null)) + if (UtilEnt.hitBox(player.getLocation().add(0, 1, 0), other, _hitBox, null)) { strikeHit(player, other); playerIterator.remove(); @@ -404,7 +416,7 @@ public class PerkWolf extends SmashPerk } } - Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, STRIKE_DAMAGE, true, true, false, damager.getName(), WOLF_STRIKE); + Manager.GetDamage().NewDamageEvent(damagee, damager, null, DamageCause.CUSTOM, _strikeDamage, true, true, false, damager.getName(), WOLF_STRIKE); // Sound damagee.getWorld().playSound(damagee.getLocation(), Sound.WOLF_BARK, 1.5f, 1f); @@ -476,7 +488,7 @@ public class PerkWolf extends SmashPerk if (count > 0) { - event.AddMod(damager.getName(), "Ravage", Math.min(2, count), false); + event.AddMod(damager.getName(), "Ravage", Math.min(3, count), false); // Sound damager.getWorld().playSound(damager.getLocation(), Sound.WOLF_BARK, (float) (0.5 + count * 0.25), (float) (1 + count * 0.25)); @@ -509,17 +521,7 @@ public class PerkWolf extends SmashPerk continue; } - Iterator timeIterator = _repeat.get(uuid).iterator(); - - while (timeIterator.hasNext()) - { - long time = timeIterator.next(); - - if (UtilTime.elapsed(time, 3000)) - { - timeIterator.remove(); - } - } + _repeat.get(uuid).removeIf(time -> UtilTime.elapsed(time, 3000)); // Exp player.setExp(Math.min(0.999f, _repeat.get(uuid).size() / 9f)); @@ -527,7 +529,6 @@ public class PerkWolf extends SmashPerk if(_repeat.get(uuid).isEmpty()) { playerIterator.remove(); - continue; } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/SmashWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/SmashWolf.java index eee6b9ca7..52d88a686 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/SmashWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/wolf/SmashWolf.java @@ -13,11 +13,9 @@ import nautilus.game.arcade.game.games.smash.perks.SmashUltimate; public class SmashWolf extends SmashUltimate { - private static final int DURATION = 30000; - public SmashWolf() { - super("Frenzy", new String[] {}, Sound.WOLF_HOWL, DURATION); + super("Frenzy", new String[] {}, Sound.WOLF_HOWL, 0); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkOvercharge.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkOvercharge.java index 92edcd250..e73c127fe 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkOvercharge.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkOvercharge.java @@ -40,13 +40,17 @@ public class PerkOvercharge extends SmashPerk private int _tick; private boolean _useExp; - public PerkOvercharge(int max, int tick, boolean useExpBar) + public PerkOvercharge() { super("Corrupted Arrow", new String[] { C.cYellow + "Charge" + C.cGray + " your Bow to use " + C.cGreen + "Corrupted Arrow" }); + } - _useExp = useExpBar; - _max = max; - _tick = tick; + @Override + public void setupValues() + { + _max = getPerkInt("Max"); + _tick = getPerkInt("Tick"); + _useExp = getPerkBoolean("Use Exp"); } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkZombieBile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkZombieBile.java index cea58d3c1..7fb954e14 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkZombieBile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/zombie/PerkZombieBile.java @@ -39,10 +39,10 @@ import nautilus.game.arcade.game.games.smash.perks.SmashPerk; public class PerkZombieBile extends SmashPerk implements IThrown { - private static final int COOLDOWN = 10000; - private static final int ITEMS = 3; - private static final int DAMAGE = 3; - private static final int KNOCKBACK_MAGNITUDE = 1; + private int _cooldown; + private int _items; + private int _damage; + private int _knockbackMagnitude; private Map _active = new HashMap<>(); @@ -51,6 +51,15 @@ public class PerkZombieBile extends SmashPerk implements IThrown super("Spew Bile", new String[] { C.cYellow + "Hold Block" + C.cGray + " to use " + C.cGreen + "Spew Bile" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _items = getPerkInt("Items"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void activate(PlayerInteractEvent event) { @@ -81,7 +90,7 @@ public class PerkZombieBile extends SmashPerk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -131,7 +140,7 @@ public class PerkZombieBile extends SmashPerk implements IThrown } // Projectiles - for (int i = 0; i < ITEMS; i++) + for (int i = 0; i < _items; i++) { Vector rand = new Vector((Math.random() - 0.5) * 0.525, (Math.random() - 0.5) * 0.525, (Math.random() - 0.5) * 0.525); @@ -164,7 +173,7 @@ public class PerkZombieBile extends SmashPerk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, DAMAGE, true, false, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.CUSTOM, _damage, true, false, false, UtilEnt.getName(data.getThrower()), GetName()); data.getThrown().remove(); } @@ -189,6 +198,6 @@ public class PerkZombieBile extends SmashPerk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/TrainingGameModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/TrainingGameModule.java new file mode 100644 index 000000000..3305ba089 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/TrainingGameModule.java @@ -0,0 +1,358 @@ +package nautilus.game.arcade.game.modules; + +import mineplex.core.common.events.EntityVelocityChangeEvent; +import mineplex.core.common.util.*; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.ProgressingKit; +import nautilus.game.arcade.managers.LobbyEnt; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityCombustEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.*; +import java.util.function.Function; + +public class TrainingGameModule extends Module +{ + + private static final String RETURN_TO_SPAWN_RECHARGE = "Return To Select A Kit"; + private static final int RETURN_TO_SPAWN_COOLDOWN = 8000; + private static final ItemStack RETURN_TO_SPAWN_ITEM = new ItemBuilder(Material.BED) + .setTitle(C.cGreenB + RETURN_TO_SPAWN_RECHARGE) + .addLore("Click to return to the spawn island", "where you can select a new kit.") + .build(); + + private final Set _kits; + private Function _teamFunction; + private Function _skillFunction; + private Function _damageFunction; + + public TrainingGameModule() + { + _kits = new HashSet<>(); + } + + @EventHandler + public void live(GameStateChangeEvent event) + { + if (event.GetState() != Game.GameState.Live) + { + return; + } + + List locations = getGame().WorldData.GetDataLocs("PURPLE"); + int i = 0; + getGame().CreatureAllowOverride = true; + + for (Kit kit : getGame().GetKits()) + { + Location location = locations.get(i++); + Entity entity = kit.SpawnEntity(location); + + _kits.add(new LobbyEnt(entity, location, kit)); + } + + Location average = UtilAlg.getAverageLocation(locations); + + for (LobbyEnt entity : _kits) + { + UtilEnt.CreatureLook(entity.GetEnt(), average); + } + + getGame().CreatureAllowOverride = false; + } + + @Override + public void cleanup() + { + for (LobbyEnt lobbyEnt : _kits) + { + lobbyEnt.GetEnt().remove(); + } + + _kits.clear(); + } + + @EventHandler + public void kitMove(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + + for (LobbyEnt ent : _kits) + { + Location location = ent.GetLocation(); + + ((CraftEntity) ent.GetEnt()).getHandle().setPosition(location.getX(), location.getY(), location.getZ()); + } + } + + @EventHandler + public void kitInteract(PlayerInteractEntityEvent event) + { + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + LobbyEnt lobbyEnt = getFromEntity(entity); + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + if (lobbyEnt != null) + { + getGame().getArcadeManager().Clear(player); + getGame().SetKit(event.getPlayer(), lobbyEnt.GetKit(), true); + event.setCancelled(true); + } + } + + @EventHandler + public void kitCombust(EntityCombustEvent event) + { + if (getFromEntity(event.getEntity()) != null) + { + event.setCancelled(true); + } + } + + @EventHandler + public void kitDamage(CustomDamageEvent event) + { + if (getFromEntity(event.GetDamageeEntity()) != null) + { + event.SetCancelled("Kit NPC"); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void playerLogin(PlayerLoginEvent event) + { + Player player = event.getPlayer(); + Game game = getGame(); + GameTeam team = _teamFunction == null ? game.GetTeamList().get(0) : _teamFunction.apply(player); + + team.AddPlayer(player, true); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void playerJoin(PlayerJoinEvent event) + { + Player player = event.getPlayer(); + + if (UtilPlayer.isSpectator(player)) + { + return; + } + + GameTeam team = getGame().GetTeam(player); + + team.SpawnTeleport(player); + + getGame().getArcadeManager().runSyncLater(() -> + { + Kit kit = null; + + for (Kit otherKit : getGame().GetKits()) + { + if (otherKit instanceof ProgressingKit) + { + ProgressingKit progressingKit = (ProgressingKit) otherKit; + + if (progressingKit.isDefault(player.getUniqueId())) + { + kit = progressingKit; + break; + } + } + } + + if (kit == null) + { + kit = getGame().GetKits()[0]; + } + + getGame().SetKit(player, kit, true); + }, 1); + } + + + @EventHandler(priority = EventPriority.LOWEST) + public void playerInteract(PlayerInteractEvent event) + { + if (_skillFunction == null) + { + return; + } + + Player player = event.getPlayer(); + + if (!_skillFunction.apply(player)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void playerInteract(EntityDamageEvent event) + { + if (_skillFunction == null || !(event.getEntity() instanceof Player)) + { + return; + } + + Player player = (Player) event.getEntity(); + + if (!_skillFunction.apply(player)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void entityDamage(CustomDamageEvent event) + { + if (!(event.GetDamageeEntity() instanceof Player)) + { + return; + } + + Player player = event.GetDamageePlayer(); + + if (!event.isCancelled()) + { + Recharge.Instance.useForce(player, RETURN_TO_SPAWN_RECHARGE, RETURN_TO_SPAWN_COOLDOWN); + + if (event.GetDamagerEntity(true) instanceof Player) + { + Recharge.Instance.useForce(event.GetDamagerPlayer(true), RETURN_TO_SPAWN_RECHARGE, RETURN_TO_SPAWN_COOLDOWN); + } + } + + if (_damageFunction == null) + { + return; + } + + if (!_damageFunction.apply(player)) + { + event.SetCancelled("Training Area"); + } + } + + @EventHandler + public void entityVelocity(EntityVelocityChangeEvent event) + { + Entity entity = event.getEntity(); + + if (!(entity instanceof Player)) + { + return; + } + + Player player = (Player) entity; + + if (!_damageFunction.apply(player)) + { + event.setCancelled(true); + } + } + + @EventHandler + public void giveReturnToSpawn(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + + for (Player player : getGame().GetPlayers(true)) + { + if (player.getInventory().contains(RETURN_TO_SPAWN_ITEM)) + { + continue; + } + + player.getInventory().setItem(8, RETURN_TO_SPAWN_ITEM); + } + } + + @EventHandler + public void interactReturnToSpawn(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + ItemStack itemStack = player.getItemInHand(); + + if (itemStack == null || !itemStack.isSimilar(RETURN_TO_SPAWN_ITEM)) + { + return; + } + + if (event.isCancelled()) + { + player.sendMessage(F.main("Game", "You are already at the " + F.greenElem("Kit Selection Island") + ".")); + return; + } + + if (Recharge.Instance.usable(player, RETURN_TO_SPAWN_RECHARGE)) + { + getGame().RespawnPlayer(player); + } + else + { + player.sendMessage(F.main("Game", "You can't return to the " + F.greenElem("Kit Selection Island") + " if you are in " + F.greenElem("PVP") + ".")); + } + } + + public TrainingGameModule setTeamFunction(Function function) + { + _teamFunction = function; + return this; + } + + public TrainingGameModule setSkillFunction(Function function) + { + _skillFunction = function; + return this; + } + + public TrainingGameModule setDamageFunction(Function function) + { + _damageFunction = function; + return this; + } + + private LobbyEnt getFromEntity(Entity entity) + { + for (LobbyEnt lobbyEnt : _kits) + { + if (lobbyEnt.GetEnt().equals(entity)) + { + return lobbyEnt; + } + } + + return null; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java index 18a51d276..a727a304a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java @@ -1,9 +1,7 @@ package nautilus.game.arcade.kit; import nautilus.game.arcade.ArcadeManager; - -import org.bukkit.Bukkit; -import org.bukkit.Material; +import nautilus.game.arcade.managers.PerkSpreadsheetModule; import org.bukkit.entity.Player; import org.bukkit.event.Listener; @@ -17,57 +15,79 @@ public abstract class Perk implements Listener private boolean _display; private int _upgradeLevel; - + + protected PerkSpreadsheetModule _spreadsheet; + + public Perk(String name) + { + this(name, new String[0], true); + } + public Perk(String name, String[] perkDesc) { this(name, perkDesc, true); } - + public Perk(String name, String[] perkDesc, boolean display) { _perkName = name; _perkDesc = perkDesc; _display = display; } - + public boolean hasPerk(Player player) - { + { if (Manager.GetGame() == null) { return false; } - + if (!Manager.GetGame().IsLive()) { return false; } - + if (!(Kit instanceof ProgressingKit)) { return Kit.HasKit(player); } - + ProgressingKit progressingKit = (ProgressingKit) Kit; - + return Kit.HasKit(player) && progressingKit.getUpgradeLevel(player.getUniqueId()) == _upgradeLevel; } - + public void setUpgradeLevel(int upgradeLevel) { _upgradeLevel = upgradeLevel; } - + public void SetHost(Kit kit) { Manager = kit.Manager; Kit = kit; } + public final void setSpreadsheet(PerkSpreadsheetModule spreadsheet) + { + _spreadsheet = spreadsheet; + setupValues(); + } + + public void setupValues() + { + } + public String GetName() - { + { return _perkName; } - + + public void setDesc(String... desc) + { + _perkDesc = desc; + } + public String[] GetDesc() { return _perkDesc; @@ -77,8 +97,8 @@ public abstract class Perk implements Listener { return _display; } - - public void Apply(Player player) + + public void Apply(Player player) { //Null Default } @@ -93,8 +113,92 @@ public abstract class Perk implements Listener // When listener has been registered } - public Material getIcon() + private String getPerkObject(String id) { - return Material.SLIME_BALL; + String key = _spreadsheet.getKey(Kit, this, id); + + if (!_spreadsheet.getDataMap().containsKey(key)) + { + return null; + } + + return _spreadsheet.getDataMap().get(key); } -} + + protected boolean getPerkBoolean(String id) + { + return Boolean.valueOf(getPerkObject(id)); + } + + protected int getPerkInt(String id) + { + return Integer.parseInt(getPerkObject(id)); + } + + protected double getPerkDouble(String id) + { + return Double.parseDouble(getPerkObject(id)); + } + + protected float getPerkFloat(String id) + { + return Float.parseFloat(getPerkObject(id)); + } + + protected double getPerkPercentage(String id) + { + String value = getPerkObject(id); + value = value.substring(0, value.length() - 1); + double doubleValue = Double.parseDouble(value); + return doubleValue / 100; + } + + protected int getPerkTime(String id) + { + return getPerkInt(id) * 1000; + } + + protected boolean getPerkBoolean(String id, boolean defaultV) + { + String v = getPerkObject(id); + return v != null ? Boolean.valueOf(v) : defaultV; + } + + protected int getPerkInt(String id, int defaultV) + { + String v = getPerkObject(id); + return v != null ? Integer.valueOf(v) : defaultV; + } + + protected double getPerkDouble(String id, double defaultV) + { + String v = getPerkObject(id); + return v != null ? Double.valueOf(v) : defaultV; + } + + protected double getPerkFloat(String id, float defaultV) + { + String v = getPerkObject(id); + return v != null ? Float.valueOf(v) : defaultV; + } + + protected double getPerkPercentage(String id, double defaultV) + { + String value = getPerkObject(id); + + if (value == null) + { + return defaultV; + } + + value = value.substring(0, value.length() - 1); + double doubleValue = Double.parseDouble(value); + return doubleValue / 100; + } + + protected int getPerkTime(String id, int defaultV) + { + int v = getPerkInt(id, Integer.MIN_VALUE); + return v == Integer.MIN_VALUE ? defaultV : v * 1000; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/ProgressingKit.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/ProgressingKit.java index 75cf10209..ff7c6fdeb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/ProgressingKit.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/ProgressingKit.java @@ -18,7 +18,6 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.scheduler.BukkitRunnable; @@ -319,7 +318,23 @@ public abstract class ProgressingKit extends Kit implements ProgressiveKit { PlayerKit playerKit = _dataManager.get(player); Donor donor = Manager.GetDonation().Get(Bukkit.getPlayer(player)); - return Calculations.canUpgrade(Calculations.getNextUpgradeLevel(playerKit.getLevel(getInternalName())), donor.getBalance(GlobalCurrency.GEM)) && playerKit.getLevel(getInternalName()) >= Calculations.getLevelRequiredFor(upgradeLevel); + int balance = donor.getBalance(GlobalCurrency.GEM); + + if (crownsEnabled()) + { + if (getUpgradeLevel(player) != (upgradeLevel - 1)) + { + return false; + } + balance = Manager.GetDonation().getCrowns(player); + } + + if (!usesXp()) + { + return Calculations.canUpgradeXpLess(upgradeLevel, balance); + } + + return Calculations.canUpgrade(Calculations.getNextUpgradeLevel(playerKit.getLevel(getInternalName())), balance) && playerKit.getLevel(getInternalName()) >= Calculations.getLevelRequiredFor(upgradeLevel); } @Override @@ -427,7 +442,7 @@ public abstract class ProgressingKit extends Kit implements ProgressiveKit public static String receiveItem(String item, int amount) { - return "Receive " + (amount == 1 ? (UtilText.startsWithVowel(item) ? "an" :" a") : C.cGreen + amount) + " " + item; + return "Receive " + (amount == 1 ? (UtilText.startsWithVowel(item) ? "an" :"a") : C.cGreen + amount) + " " + item; } public static String click(boolean left, String comp) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlizzard.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlizzard.java index 68a30fba8..f96d40048 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlizzard.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlizzard.java @@ -1,5 +1,6 @@ package nautilus.game.arcade.kit.perks; +import java.util.Map; import java.util.WeakHashMap; import org.bukkit.Sound; @@ -26,7 +27,11 @@ import nautilus.game.arcade.kit.Perk; public class PerkBlizzard extends Perk { - private WeakHashMap _snowball = new WeakHashMap(); + + private float _energyTick; + private float _energyPerBall; + + private Map _snowball = new WeakHashMap<>(); public PerkBlizzard() { @@ -36,6 +41,13 @@ public class PerkBlizzard extends Perk }); } + @Override + public void setupValues() + { + _energyTick = getPerkFloat("Energy Per Tick"); + _energyPerBall = getPerkFloat("Energy Per Ball"); + } + @EventHandler public void EnergyUpdate(UpdateEvent event) { @@ -50,7 +62,7 @@ public class PerkBlizzard extends Perk if (player.isBlocking()) continue; - player.setExp((float) Math.min(0.999, player.getExp()+(1f/60f))); + player.setExp((float) Math.min(0.999, player.getExp()+ _energyTick)); } } @@ -72,7 +84,7 @@ public class PerkBlizzard extends Perk if (player.getExp() < 0.1) continue; - player.setExp((float) Math.max(0, player.getExp()-(1f/9f))); + player.setExp(Math.max(0, player.getExp() - _energyPerBall)); for (int i=0 ; i<4 ; i++) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBomberHG.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBomberHG.java index 947e7a3aa..7edda2765 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBomberHG.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBomberHG.java @@ -1,6 +1,16 @@ package nautilus.game.arcade.kit.perks; import java.util.HashSet; +import java.util.Set; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; import mineplex.core.common.util.F; @@ -13,20 +23,18 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.kit.Perk; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.PlayerDropItemEvent; - public class PerkBomberHG extends Perk { private int _spawnRate; private int _max; - + private boolean _onlyRestrictNamed; + public PerkBomberHG(int spawnRate, int max) + { + this(spawnRate, max, false); + } + + public PerkBomberHG(int spawnRate, int max, boolean onlyRestrictNamed) { super("Explosives", new String[] { @@ -35,6 +43,7 @@ public class PerkBomberHG extends Perk _spawnRate = spawnRate; _max = max; + _onlyRestrictNamed = onlyRestrictNamed; } public void Apply(Player player) @@ -53,13 +62,19 @@ public class PerkBomberHG extends Perk if (!Kit.HasKit(cur)) continue; + if (!hasPerk(cur)) + continue; + if (!Manager.GetGame().IsAlive(cur)) continue; if (!Recharge.Instance.use(cur, GetName(), _spawnRate*1000, false, false)) continue; - if (UtilInv.contains(cur, Material.TNT, (byte)0, _max)) + if (_onlyRestrictNamed ? UtilInv.contains(cur, F.item("Throwing TNT"), Material.TNT, (byte)0, _max) : UtilInv.contains(cur, Material.TNT, (byte)0, _max)) + continue; + + if (UtilPlayer.isSpectator(cur)) continue; //Add @@ -75,7 +90,13 @@ public class PerkBomberHG extends Perk if (event.isCancelled()) return; - if (!UtilInv.IsItem(event.getItemDrop().getItemStack(), Material.TNT, (byte)0)) + if (_onlyRestrictNamed ? !UtilInv.IsItem(event.getItemDrop().getItemStack(), F.item("Throwing TNT"), Material.TNT, (byte)0) : !UtilInv.IsItem(event.getItemDrop().getItemStack(), Material.TNT, (byte)0)) + return; + + if (!Kit.HasKit(event.getPlayer())) + return; + + if (!hasPerk(event.getPlayer())) return; //Cancel @@ -91,23 +112,33 @@ public class PerkBomberHG extends Perk //boolean containerOpen = !(event.getView().getTopInventory().getHolder() instanceof Player); boolean clickInContainer = event.getClickedInventory() != null && !(event.getClickedInventory().getHolder() instanceof Player); - if(clickInContainer) + if (clickInContainer) { return; } + + if (!(event.getWhoClicked() instanceof Player)) + return; + + if (!Kit.HasKit((Player)event.getWhoClicked())) + return; + + if (!hasPerk((Player)event.getWhoClicked())) + return; + UtilInv.DisallowMovementOf(event, "Throwing TNT", Material.TNT, (byte) 0, true); } @EventHandler public void TNTDeathRemove(PlayerDeathEvent event) { - HashSet remove = new HashSet(); + Set remove = new HashSet<>(); - for (org.bukkit.inventory.ItemStack item : event.getDrops()) - if (UtilInv.IsItem(item, Material.TNT, (byte)0)) + for (ItemStack item : event.getDrops()) + if (_onlyRestrictNamed ? UtilInv.IsItem(item, "Throwing TNT", Material.TNT, (byte)0) : UtilInv.IsItem(item, Material.TNT, (byte)0)) remove.add(item); - for (org.bukkit.inventory.ItemStack item : remove) + for (ItemStack item : remove) event.getDrops().remove(item); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDamageSnow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDamageSnow.java index 1c97ba2fd..5c8d642b6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDamageSnow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDamageSnow.java @@ -12,7 +12,12 @@ public class PerkDamageSnow extends Perk { private int _damage; private double _knockback; - + + public PerkDamageSnow() + { + this(0, 0); + } + public PerkDamageSnow(int damage, double knockback) { super("Snow Attack", new String[] @@ -23,7 +28,14 @@ public class PerkDamageSnow extends Perk _damage = damage; _knockback = knockback; } - + + @Override + public void setupValues() + { + _damage = getPerkInt("Damage"); + _knockback = getPerkDouble("Knockback"); + } + @EventHandler(priority = EventPriority.HIGH) public void Knockback(CustomDamageEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java index 3bcbf1db5..5b2cfef50 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDeathsGrasp.java @@ -41,10 +41,12 @@ import nautilus.game.arcade.kit.Perk; public class PerkDeathsGrasp extends Perk { private Map _live = new HashMap<>(); - private HashMap _weakness = new HashMap(); - - private static final long LEAP_DURATION = 1000; - private static final long WEAKNESS_DURATION = 1000; + private HashMap _weakness = new HashMap<>(); + + private int _cooldown; + private int _damage; + private int _leapDuration; + private int _weaknessDuration; public PerkDeathsGrasp() { @@ -55,6 +57,15 @@ public class PerkDeathsGrasp extends Perk }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkInt("Damage"); + _leapDuration = getPerkInt("Leap Duration (ms)"); + _weaknessDuration = getPerkInt("Weakness Duration (ms)"); + } + @EventHandler public void leap(PlayerInteractEvent event) { @@ -75,7 +86,7 @@ public class PerkDeathsGrasp extends Perk if (!Kit.HasKit(player)) return; - if (!Recharge.Instance.use(player, GetName(), 12000, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) return; UtilAction.velocity(player, player.getLocation().getDirection(), 1.4, false, 0, 0.2, 1.2, true); @@ -97,7 +108,6 @@ public class PerkDeathsGrasp extends Perk { return; } - //Leap End & Collide for(Iterator> it = _live.entrySet().iterator(); it.hasNext();) @@ -110,7 +120,7 @@ public class PerkDeathsGrasp extends Perk return; } - if (UtilEnt.isGrounded(player) && UtilTime.elapsed(e.getValue(), LEAP_DURATION)) + if (UtilEnt.isGrounded(player) && UtilTime.elapsed(e.getValue(), _leapDuration)) { it.remove(); return; @@ -119,7 +129,7 @@ public class PerkDeathsGrasp extends Perk List team = TeamSuperSmash.getTeam(Manager, player, true); for (Player other : Manager.GetGame().GetPlayers(true)) { - if(team.contains(other)) + if(UtilPlayer.isSpectator(player) || team.contains(other)) { continue; } @@ -142,7 +152,7 @@ public class PerkDeathsGrasp extends Perk continue; } - if (!UtilTime.elapsed(_weakness.get(ent), WEAKNESS_DURATION)) + if (!UtilTime.elapsed(_weakness.get(ent), _weaknessDuration)) { continue; } @@ -155,7 +165,7 @@ public class PerkDeathsGrasp extends Perk { //Damage Event Manager.GetDamage().NewDamageEvent(damagee, damager, null, - DamageCause.CUSTOM, 6, false, true, false, + DamageCause.CUSTOM, _damage, false, true, false, damager.getName(), GetName()); UtilAction.velocity(damagee, UtilAlg.getTrajectory2d(damagee, damager), 1.6, false, 0, 1.2, 1.8, true); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java index 1af48f4f8..164794a2e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java @@ -29,7 +29,12 @@ public class PerkDoubleJump extends Perk private boolean _displayForce; private HashSet _disabled = new HashSet(); - + + public PerkDoubleJump(String name) + { + this(name, 0, 0, false); + } + public PerkDoubleJump(String name, double power, double heightLimit, boolean control) { super(name, new String[] @@ -70,6 +75,14 @@ public class PerkDoubleJump extends Perk _displayForce = displayForce; } + @Override + public void setupValues() + { + _power = getPerkDouble("Power", _power); + _heightMax = getPerkDouble("Height Limit", _heightMax); + _control = getPerkBoolean("Control", _control); + } + @EventHandler public void FlightHop(PlayerToggleFlightEvent event) { @@ -114,7 +127,7 @@ public class PerkDoubleJump extends Perk } } - Recharge.Instance.useForce(player, "Double Jump", 500); + //Recharge.Instance.useForce(player, "Double Jump", 500); } @EventHandler @@ -134,8 +147,8 @@ public class PerkDoubleJump extends Perk if (_recharge > 0 && !Recharge.Instance.usable(player, GetName())) continue; - if (!Recharge.Instance.usable(player, "Double Jump")) - continue; +// if (!Recharge.Instance.usable(player, "Double Jump")) +// continue; if (player.isOnGround() || (UtilBlock.solid(player.getLocation().getBlock().getRelative(BlockFace.DOWN)) && UtilBlock.solid(player.getLocation().getBlock()))) player.setAllowFlight(true); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFallModifier.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFallModifier.java index bb8decc97..3068c6bc4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFallModifier.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFallModifier.java @@ -1,13 +1,16 @@ package nautilus.game.arcade.kit.perks; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.kit.Perk; - import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import mineplex.core.Managers; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import mineplex.minecraft.game.core.damage.DamageManager; +import nautilus.game.arcade.kit.Perk; + public class PerkFallModifier extends Perk { private double _fall; @@ -41,4 +44,28 @@ public class PerkFallModifier extends Perk event.AddMod("Fall Modifier", "Reduce damage", _fall, false); } -} + + @EventHandler(priority = EventPriority.HIGH) + public void handle(EntityDamageEvent event) + { + if (Managers.get(DamageManager.class).IsEnabled()) + { + return; + } + if (event.getCause() != DamageCause.FALL) + return; + + if (!(event.getEntity() instanceof Player)) + return; + + Player player = (Player) event.getEntity(); + + if (!Kit.HasKit(player)) + return; + + if (!Manager.IsAlive(player)) + return; + + event.setDamage(event.getDamage() * _fall); + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java index 3867996c0..ee99aa27a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFletcher.java @@ -39,7 +39,12 @@ public class PerkFletcher extends Perk private int _slot; private boolean _instant = true; private String _name; - + + public PerkFletcher() + { + this(0, 0, false); + } + public PerkFletcher(int time, int max, boolean remove) { this(time, max, remove, -1); @@ -75,6 +80,16 @@ public class PerkFletcher extends Perk _name = name; } + @Override + public void setupValues() + { + _time = getPerkInt("Time", _time); + _max = getPerkInt("Max", _max); + _remove = getPerkBoolean("Remove", _remove); + + setDesc("Receive 1 Arrow every " + _time + " seconds. Maximum of " + _max + "."); + } + public boolean isFletchedArrow(ItemStack stack) { if (!UtilGear.isMat(stack, Material.ARROW)) @@ -183,6 +198,9 @@ public class PerkFletcher extends Perk if (!isFletchedArrow(event.getItemDrop().getItemStack())) return; + + if (!hasPerk(event.getPlayer())) + return; //Cancel event.setCancelled(true); @@ -207,6 +225,15 @@ public class PerkFletcher extends Perk @EventHandler public void FletchInvClick(InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player)) + { + return; + } + + if (!hasPerk((Player)event.getWhoClicked())) + { + return; + } UtilInv.DisallowMovementOf(event, _name, Material.ARROW, (byte)0, true); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java index 1f9f786f4..1b86acc73 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java @@ -31,14 +31,21 @@ import nautilus.game.arcade.kit.Perk; public class PerkIronHook extends Perk implements IThrown { - private static final long COOLDOWN = 8000; - private static final int DAMAGE = 4; + private long _cooldown; + private int _damage; public PerkIronHook() { super("Iron Hook", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Pickaxe to " + C.cGreen + "Iron Hook" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _damage = getPerkInt("Damage"); + } + @EventHandler public void Activate(PlayerInteractEvent event) { @@ -69,7 +76,7 @@ public class PerkIronHook extends Perk implements IThrown return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -118,7 +125,7 @@ public class PerkIronHook extends Perk implements IThrown Manager.GetCondition().Factory().Falling(GetName(), target, player, 10, false, true); // Damage Event - Manager.GetDamage().NewDamageEvent(target, player, null, DamageCause.CUSTOM, velocity * DAMAGE, false, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(target, player, null, DamageCause.CUSTOM, velocity * _damage, false, true, false, player.getName(), GetName()); // Inform UtilPlayer.message(target, F.main("Skill", F.name(player.getName()) + " hit you with " + F.skill(GetName()) + ".")); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronSkin.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronSkin.java index ec662a740..9db6fb6d1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronSkin.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronSkin.java @@ -3,23 +3,33 @@ package nautilus.game.arcade.kit.perks; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import mineplex.core.Managers; import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import mineplex.minecraft.game.core.damage.DamageManager; import nautilus.game.arcade.kit.Perk; public class PerkIronSkin extends Perk { private double _reduction; + private boolean _percentage; - public PerkIronSkin(double d) + public PerkIronSkin(double d) + { + this(d, false); + } + + public PerkIronSkin(double d, boolean percentage) { super("Iron Skin", new String[] { - "You take " + d + " less damage from attacks", + "You take " + (d * (percentage ? 100 : 1)) + (percentage ? "%" : "") + " less damage from attacks", }); _reduction = d; + _percentage = percentage; } @EventHandler(priority = EventPriority.HIGH) @@ -40,6 +50,54 @@ public class PerkIronSkin extends Perk if (!Kit.HasKit(damagee)) return; - event.AddMod(damagee.getName(), GetName(), -_reduction, false); + if (!hasPerk(damagee)) + return; + + if (_percentage) + { + event.AddMult(damagee.getName(), GetName(), _reduction, false); + } + else + { + event.AddMod(damagee.getName(), GetName(), -_reduction, false); + } } -} + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void damageDecrease(EntityDamageEvent event) + { + if (Managers.get(DamageManager.class).IsEnabled()) + { + return; + } + + if (event.getCause() == DamageCause.FIRE_TICK) + return; + + if (event.getDamage() <= 1) + return; + + if (!(event.getEntity() instanceof Player)) + return; + + Player damagee = (Player) event.getEntity(); + + if (!Kit.HasKit(damagee)) + return; + + if (!hasPerk(damagee)) + return; + + if (!Manager.IsAlive(damagee)) + return; + + if (_percentage) + { + event.setDamage(event.getDamage() * _reduction); + } + else + { + event.setDamage(event.getDamage() - _reduction); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java index 26f9979a0..b873bbab7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackArrow.java @@ -12,17 +12,27 @@ import nautilus.game.arcade.kit.Perk; public class PerkKnockbackArrow extends Perk { private double _power; - + + public PerkKnockbackArrow() + { + this(0); + } + public PerkKnockbackArrow(double power) { - super("Arrow Knockback", new String[] - { - C.cGray + "Arrows deal " + (int)(power*100) + "% Knockback.", - }); + super("Knockback Arrow"); _power = power; } - + + @Override + public void setupValues() + { + _power = getPerkPercentage("Power", _power); + + setDesc(C.cGray + "Arrows deal " + (int)(_power * 100) + "% Knockback."); + } + @EventHandler(priority = EventPriority.HIGH) public void Knockback(CustomDamageEvent event) { @@ -41,6 +51,6 @@ public class PerkKnockbackArrow extends Perk if (!Manager.IsAlive(damager)) return; - event.AddKnockback("Knockback Arrow", _power); + event.AddKnockback(GetName(), _power); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackFire.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackFire.java index ab071b021..ee6bd4338 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackFire.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkKnockbackFire.java @@ -11,7 +11,12 @@ import nautilus.game.arcade.kit.Perk; public class PerkKnockbackFire extends Perk { private double _power; - + + public PerkKnockbackFire() + { + this(0); + } + public PerkKnockbackFire(double power) { super("Flaming Knockback", new String[] @@ -21,7 +26,13 @@ public class PerkKnockbackFire extends Perk _power = power; } - + + @Override + public void setupValues() + { + _power = getPerkDouble("Power"); + } + @EventHandler(priority = EventPriority.HIGH) public void Knockback(CustomDamageEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLazer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLazer.java index 3d416b319..cb967b8ce 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLazer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLazer.java @@ -42,24 +42,33 @@ public class PerkLazer extends Perk { private static final float MAX_CHARGE = 0.99F; - private static final float CHARGE_PER_TICK = 0.035F; private static final float INCREMENTATION = 0.2F; - private static final float HIT_BOX_RADIUS = 2.5F; - private static final int DAMAGE_RADIUS = 3; - private static final int DAMAGE = 7; - private static final int KNOCKBACK_MAGNITUDE = 3; - private double _range; private long _recharge; + private float _chargePerTick; + private float _hitBoxRadius; + private int _damageRadius; + private int _damage; + private int _knockbackMagnitude; + private double _range; private Set _active = new HashSet<>(); - public PerkLazer(double range, long recharge) + public PerkLazer() { super("Static Laser", new String[] { C.cYellow + "Hold Block" + C.cGray + " with Sword to use " + C.cGreen + "Static Laser" }); + } - _range = range; - _recharge = recharge; + @Override + public void setupValues() + { + _recharge = getPerkTime("Cooldown"); + _chargePerTick = getPerkFloat("Charge Per Tick"); + _hitBoxRadius = getPerkFloat("Hit Box Radius"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + _range = getPerkInt("Range"); } @EventHandler @@ -122,7 +131,7 @@ public class PerkLazer extends Perk if (player.isBlocking()) { - player.setExp(Math.min(MAX_CHARGE, player.getExp() + CHARGE_PER_TICK)); + player.setExp(Math.min(MAX_CHARGE, player.getExp() + _chargePerTick)); player.getWorld().playSound(player.getLocation(), Sound.FIZZ, 0.25f + player.getExp(), 0.75f + player.getExp()); @@ -175,7 +184,7 @@ public class PerkLazer extends Perk particleLoop: while (!lineParticle.update()) { - for (Player other : UtilPlayer.getNearby(lineParticle.getLastLocation(), HIT_BOX_RADIUS)) + for (Player other : UtilPlayer.getNearby(lineParticle.getLastLocation(), _hitBoxRadius)) { if (player.equals(other)) { @@ -193,7 +202,7 @@ public class PerkLazer extends Perk // Firework UtilFirework.playFirework(target, Type.BURST, Color.YELLOW, false, false); - for (LivingEntity other : UtilEnt.getInRadius(target, DAMAGE_RADIUS).keySet()) + for (LivingEntity other : UtilEnt.getInRadius(target, _damageRadius).keySet()) { if (other.equals(player)) { @@ -201,7 +210,7 @@ public class PerkLazer extends Perk } // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, player.getExp() * DAMAGE, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, player.getExp() * _damage, true, true, false, player.getName(), GetName()); } // Inform @@ -224,7 +233,7 @@ public class PerkLazer extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } public void setWoolColor(Player player, DyeColor color) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java index 3d0d4b759..2a206a065 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRopedArrow.java @@ -1,7 +1,6 @@ package nautilus.game.arcade.kit.perks; import java.util.HashSet; -import java.util.Iterator; import org.bukkit.Material; import org.bukkit.Sound; @@ -32,9 +31,14 @@ public class PerkRopedArrow extends SmashPerk private String _name; private double _power; - private long _recharge; + private int _recharge; - public PerkRopedArrow(String name, double power, long recharge) + public PerkRopedArrow(String name) + { + this(name, 0, 0); + } + + public PerkRopedArrow(String name, double power, int recharge) { super(name, new String[] { @@ -46,9 +50,21 @@ public class PerkRopedArrow extends SmashPerk _recharge = recharge; } + @Override + public void setupValues() + { + _power = getPerkDouble("Power", _power); + _recharge = getPerkTime("Cooldown", _recharge); + } + @EventHandler public void Fire(PlayerInteractEvent event) { + if (event.isCancelled()) + { + return; + } + if (event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) return; @@ -106,12 +122,6 @@ public class PerkRopedArrow extends SmashPerk if (event.getType() != UpdateType.SEC) return; - for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) - { - Entity arrow = arrowIterator.next(); - - if (!arrow.isValid()) - arrowIterator.remove(); - } + _arrows.removeIf(arrow -> !arrow.isValid()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlam.java index 9b93d6fe8..db45b760e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlam.java @@ -34,11 +34,11 @@ import nautilus.game.arcade.kit.Perk; public class PerkSeismicSlam extends Perk { - private static final long COOLDOWN = 7000; - private static final long TIME = 1000; - private static final int DAMAGE = 10; - private static final int RADIUS = 8; - private static final float KNOCKBACK_MAGNITUDE = 2.4F; + private long _cooldown; + private long _time; + private int _damage; + private int _radius; + private float _knockbackMagnitude; private Map _live = new HashMap<>(); @@ -47,6 +47,16 @@ public class PerkSeismicSlam extends Perk super("Seismic Slam", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to " + C.cGreen + "Seismic Slam" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _time = getPerkTime("Time"); + _damage = getPerkInt("Damage"); + _radius = getPerkInt("Radius"); + _knockbackMagnitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void deactivateDeath(PlayerDeathEvent event) { @@ -93,7 +103,7 @@ public class PerkSeismicSlam extends Perk return; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) return; // Action @@ -132,7 +142,7 @@ public class PerkSeismicSlam extends Perk continue; } - if (!UtilTime.elapsed(_live.get(player), TIME)) + if (!UtilTime.elapsed(_live.get(player), _time)) { continue; } @@ -141,7 +151,7 @@ public class PerkSeismicSlam extends Perk // Action - Map targets = UtilEnt.getInRadius(player.getLocation(), RADIUS); + Map targets = UtilEnt.getInRadius(player.getLocation(), _radius); for (LivingEntity cur : targets.keySet()) { @@ -156,7 +166,7 @@ public class PerkSeismicSlam extends Perk } // Damage Event - Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, DAMAGE * targets.get(cur) + 0.5, true, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, _damage * targets.get(cur) + 0.5, true, true, false, player.getName(), GetName()); // Condition Manager.GetCondition().Factory().Falling(GetName(), cur, player, 10, false, true); @@ -187,6 +197,6 @@ public class PerkSeismicSlam extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java index 2a2ec4083..073500018 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java @@ -52,13 +52,13 @@ import nautilus.game.arcade.kit.perks.data.WoolBombData; public class PerkWoolBomb extends Perk implements IThrown { - - private static final long RATE = 800; - private static final long COOLDOWN = 8000; - private static final int DAMAGE_RADIUS = 9; - private static final int DAMAGE_EXPLODE = 14; - private static final int DAMAGE_COLLIDE = 4; - private static final int KNOCKBACK_MAGNITUDE = 2; + + private long _cooldown; + private long _rate; + private int _damageRadius; + private int _damageExplode; + private int _damageCollide; + private int _knockbackMagnitude; private Map _thrown = new HashMap<>(); private Map _active = new HashMap<>(); @@ -68,6 +68,17 @@ public class PerkWoolBomb extends Perk implements IThrown super("Wool Mine", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Axe to " + C.cGreen + "Wool Mine" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _rate = getPerkInt("Rate (ms)"); + _damageRadius = getPerkInt("Damage Radius"); + _damageExplode = getPerkInt("Damage Explode"); + _damageCollide = getPerkInt("Damage Collide"); + _knockbackMagnitude = getPerkInt("Knockback Magnitude"); + } + @EventHandler public void skill(PlayerInteractEvent event) { @@ -148,7 +159,7 @@ public class PerkWoolBomb extends Perk implements IThrown player.getWorld().playSound(player.getLocation(), Sound.SHEEP_IDLE, 2f, 1.5f); // Rate - Recharge.Instance.useForce(player, GetName() + " Rate", RATE); + Recharge.Instance.useForce(player, GetName() + " Rate", _rate); // Disguise DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); @@ -211,7 +222,7 @@ public class PerkWoolBomb extends Perk implements IThrown thrown.remove(); // Rate - Recharge.Instance.useForce(player, GetName() + " Rate", RATE); + Recharge.Instance.useForce(player, GetName() + " Rate", _rate); // Inform if (inform) @@ -233,7 +244,7 @@ public class PerkWoolBomb extends Perk implements IThrown return false; } - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return false; } @@ -246,21 +257,18 @@ public class PerkWoolBomb extends Perk implements IThrown data.Block.getWorld().playSound(data.Block.getLocation(), Sound.EXPLODE, 3f, 0.8f); // Damage - Map targets = UtilEnt.getInRadius(data.Block.getLocation().add(0.5, 0.5, 0.5), DAMAGE_RADIUS); + Map targets = UtilEnt.getInRadius(data.Block.getLocation().add(0.5, 0.5, 0.5), _damageRadius); List team = TeamSuperSmash.getTeam(Manager, player, false); for (LivingEntity cur : targets.keySet()) { - if(cur instanceof Player) + if (cur instanceof Player && team.contains(cur)) { - if(team.contains(cur)) - { - continue; - } + continue; } // Damage Event - Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, DAMAGE_EXPLODE * targets.get(cur) + 0.5, false, true, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(cur, player, null, DamageCause.CUSTOM, _damageExplode * targets.get(cur) + 0.5, false, true, false, player.getName(), GetName()); // Condition Manager.GetCondition().Factory().Falling(GetName(), cur, player, 10, false, true); @@ -277,7 +285,7 @@ public class PerkWoolBomb extends Perk implements IThrown } // Rate - Recharge.Instance.useForce(player, GetName() + " Rate", RATE); + Recharge.Instance.useForce(player, GetName() + " Rate", _rate); // Inform if (inform) @@ -327,7 +335,7 @@ public class PerkWoolBomb extends Perk implements IThrown } // Damage Event - Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, DAMAGE_COLLIDE, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); + Manager.GetDamage().NewDamageEvent(target, data.getThrower(), null, DamageCause.PROJECTILE, _damageCollide, true, true, false, UtilEnt.getName(data.getThrower()), GetName()); } @Override @@ -367,7 +375,7 @@ public class PerkWoolBomb extends Perk implements IThrown WoolBombData data = _active.get(key); - if (UtilTime.elapsed(data.Time, COOLDOWN)) + if (UtilTime.elapsed(data.Time, _cooldown)) { detonate.add(player); continue; @@ -400,6 +408,6 @@ public class PerkWoolBomb extends Perk implements IThrown return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMagnitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolCloud.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolCloud.java index 77a9a7740..167606014 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolCloud.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolCloud.java @@ -39,12 +39,12 @@ import nautilus.game.arcade.kit.Perk; public class PerkWoolCloud extends Perk { - private static final long COOLDOWN = 10000; - private static final long MIN_VELOCITY_TIME = 200; - private static final long MAX_VELOCITY_TIME = 1200; - private static final int DAMAGE_RADIUS = 2; - private static final int DAMAGE = 8; - private static final float KNOCKBACK_MAGNITUDE = 2.5F; + private long _cooldown; + private long _minVelocityTime; + private long _maxVelocityTime; + private int _damageRadius; + private int _damage; + private float _knockbackMangitude; private Map _active = new HashMap<>(); @@ -53,6 +53,17 @@ public class PerkWoolCloud extends Perk super("Wooly Rocket", new String[] { C.cYellow + "Right-Click" + C.cGray + " with Spade to " + C.cGreen + "Wooly Rocket" }); } + @Override + public void setupValues() + { + _cooldown = getPerkTime("Cooldown"); + _minVelocityTime = getPerkInt("Min Velocity Time (ms)"); + _maxVelocityTime = getPerkInt("Max Velocity Time (ms)"); + _damageRadius = getPerkInt("Damage Radius"); + _damage = getPerkInt("Damage"); + _knockbackMangitude = getPerkFloat("Knockback Magnitude"); + } + @EventHandler public void Leap(PlayerInteractEvent event) { @@ -84,7 +95,7 @@ public class PerkWoolCloud extends Perk } // Recharge - if (!Recharge.Instance.use(player, GetName(), COOLDOWN, true, true)) + if (!Recharge.Instance.use(player, GetName(), _cooldown, true, true)) { return; } @@ -131,7 +142,7 @@ public class PerkWoolCloud extends Perk UtilParticle.PlayParticle(ParticleType.FLAME, player.getLocation(), 0.2f, 0.2f, 0.2f, 0, 4, ViewDist.LONGER, UtilServer.getPlayers()); - if (!UtilTime.elapsed(_active.get(key), MIN_VELOCITY_TIME)) + if (!UtilTime.elapsed(_active.get(key), _minVelocityTime)) { continue; } @@ -143,17 +154,17 @@ public class PerkWoolCloud extends Perk continue; } - if (UtilMath.offset(player, other) < DAMAGE_RADIUS) + if (UtilMath.offset(player, other) < _damageRadius) { // Damage Event - Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, DAMAGE, true, false, false, player.getName(), GetName()); + Manager.GetDamage().NewDamageEvent(other, player, null, DamageCause.CUSTOM, _damage, true, false, false, player.getName(), GetName()); UtilParticle.PlayParticle(ParticleType.EXPLODE, other.getLocation(), 0f, 0f, 0f, 0, 1, ViewDist.MAX, UtilServer.getPlayers()); UtilParticle.PlayParticle(ParticleType.LAVA, player.getLocation(), 0.2f, 0.2f, 0.2f, 0, 10, ViewDist.MAX, UtilServer.getPlayers()); } } - if (UtilEnt.isGrounded(player) || UtilTime.elapsed(_active.get(key), MAX_VELOCITY_TIME)) + if (UtilEnt.isGrounded(player) || UtilTime.elapsed(_active.get(key), _maxVelocityTime)) { playerIterator.remove(); setWoolColor(player, DyeColor.WHITE); @@ -184,6 +195,6 @@ public class PerkWoolCloud extends Perk return; } - event.AddKnockback(GetName(), KNOCKBACK_MAGNITUDE); + event.AddKnockback(GetName(), _knockbackMangitude); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FireflyData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FireflyData.java index c04f9b167..ad8772b88 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FireflyData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FireflyData.java @@ -1,10 +1,6 @@ package nautilus.game.arcade.kit.perks.data; -import java.util.HashSet; - -import org.bukkit.entity.Entity; - -public class FireflyData +public class FireflyData { public org.bukkit.entity.Player Player; public org.bukkit.Location Location; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FissureData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FissureData.java index 3830cdf9a..0d97a9437 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FissureData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/FissureData.java @@ -3,8 +3,10 @@ package nautilus.game.arcade.kit.perks.data; import java.util.ArrayList; import java.util.HashSet; +import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; @@ -69,12 +71,12 @@ public class FissureData continue; //Move up 1, cant go 2 up - if (UtilBlock.solid(block.getRelative(BlockFace.UP))) + if (isSolid(block.getRelative(BlockFace.UP))) { _loc.add(0, 1, 0); block = _loc.getBlock(); - if (UtilBlock.solid(block.getRelative(BlockFace.UP))) + if (isSolid(block.getRelative(BlockFace.UP))) { return; } @@ -82,12 +84,12 @@ public class FissureData } //Move down 1, cant go 2 down - else if (!UtilBlock.solid(block)) + else if (!isSolid(block)) { _loc.add(0, -1, 0); block = _loc.getBlock(); - if (!UtilBlock.solid(block)) + if (!isSolid(block)) { return; } @@ -139,7 +141,15 @@ public class FissureData if (block.getTypeId() == 2) Host.Manager.GetBlockRestore().add(block, 3, block.getData(), 14000); if (block.getTypeId() == 98) Host.Manager.GetBlockRestore().add(block, 98, (byte) 2, 14000); - Host.Manager.GetBlockRestore().add(up, block.getTypeId(), block.getData(), 10000 - (1000 * _height)); + if (block.getType() == Material.SNOW) + { + Host.Manager.GetBlockRestore().add(block, Material.SNOW_BLOCK.getId(), (byte) 0, 10000 - (1000 * _height)); + Host.Manager.GetBlockRestore().add(up, Material.SNOW_BLOCK.getId(), (byte) 0, 10000 - (1000 * _height)); + } + else + { + Host.Manager.GetBlockRestore().add(up, block.getTypeId(), block.getData(), 10000 - (1000 * _height)); + } _height++; //Effect @@ -212,4 +222,9 @@ public class FissureData _loc = null; _startLoc = null; } + + private boolean isSolid(Block block) + { + return UtilBlock.solid(block) || block.getType() == Material.SNOW; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameAchievementManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameAchievementManager.java index a14d161d7..50c0b8c80 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameAchievementManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameAchievementManager.java @@ -1,11 +1,18 @@ package nautilus.game.arcade.managers; +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + import mineplex.core.achievement.Achievement; import mineplex.core.achievement.AchievementData; import mineplex.core.achievement.AchievementLog; import mineplex.core.common.currency.GlobalCurrency; import mineplex.core.common.util.C; -import mineplex.core.common.util.Callback; import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilPlayer; @@ -16,14 +23,6 @@ import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.Game.GameState; -import org.bukkit.ChatColor; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; - public class GameAchievementManager implements Listener { ArcadeManager Manager; @@ -84,13 +83,21 @@ public class GameAchievementManager implements Listener //Display for (final Achievement type : log.keySet()) { - - AchievementData data = Manager.GetAchievement().get(player, type); String nameLevel = F.elem(C.cGold + C.Bold + type.getName()); - if (type.getMaxLevel() > 1) - nameLevel = F.elem(C.cGold + C.Bold + type.getName() + " " + ChatColor.RESET + C.cYellow + data.getLevel() + C.cGold + "/" + C.cYellow + type.getMaxLevel()); + if (type.getMaxLevel() > 1) + { + if (type.hasLevelNames()) + { + String tier = data.getLevel() == 0 ? type.getDefaultLevelName() : type.getLevelNames()[Math.min(data.getLevel(), type.getLevelNames().length) - 1]; + nameLevel = F.elem(C.cGold + C.Bold + type.getName() + " " + ChatColor.RESET + C.cYellow + " " + tier); + } + else + { + nameLevel = F.elem(C.cGold + C.Bold + type.getName() + " " + ChatColor.RESET + C.cYellow + data.getLevel() + C.cGold + "/" + C.cYellow + type.getMaxLevel()); + } + } String progress = F.elem(C.cGreen + "+" + log.get(type).Amount); @@ -102,17 +109,51 @@ public class GameAchievementManager implements Listener //Finishing for the first time if (!Manager.GetTaskManager().hasCompletedTask(player, type.getName())) { + int gems = type.getGemReward(); + int crowns = 0; + int xp = 0; + if (type.getLevelUpRewards().length > 0) + { + int[] rewards = type.getLevelUpRewards()[type.getLevelUpRewards().length - 1]; + gems += rewards[0]; + crowns += rewards[1]; + xp += rewards[2]; + } UtilPlayer.message(player, ""); - UtilPlayer.message(player, nameLevel + " " + F.elem(C.cAqua + C.Bold + "Completed!") + - " " + F.elem(C.cGreen + C.Bold + "+" + type.getGemReward() + " Gems")); + String inform = nameLevel + " " + F.elem(C.cAqua + C.Bold + "Completed!"); + if (gems > 0) + { + inform += " " + F.elem(C.cGreen + C.Bold + "+" + gems + " Gems"); + } + if (crowns > 0) + { + inform += " " + F.elem(C.cGold + C.Bold + "+" + crowns + " Crowns"); + } + if (xp > 0 && !Manager.GetTaskManager().hasCompletedTask(player, Achievement.GLOBAL_MINEPLEX_LEVEL.getName())) + { + inform += " " + F.elem(C.cYellow + C.Bold + "+" + xp + " XP"); + } + UtilPlayer.message(player, inform); player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); - Manager.GetTaskManager().completedTask(new Callback() + final int finalGems = gems; + final int finalCrowns = crowns; + final int finalXp = xp; + + Manager.GetTaskManager().completedTask(completed -> { - public void run(Boolean completed) + if (finalGems > 0) { - Manager.GetDonation().rewardCurrency(GlobalCurrency.GEM, player, type.getName(), type.getGemReward()); + Manager.GetDonation().rewardCurrency(GlobalCurrency.GEM, player, type.getName(), finalGems); + } + if (finalCrowns > 0) + { + Manager.GetDonation().rewardCrowns(finalCrowns, player); + } + if (finalXp > 0) + { + Manager.GetStatsManager().incrementStat(player, Achievement.GLOBAL_MINEPLEX_LEVEL.getStats()[0], finalXp); } }, player, type.getName()); } @@ -125,9 +166,31 @@ public class GameAchievementManager implements Listener //Multi-Level Achievements else if (log.get(type).LevelUp) { + int gems = 0; + int crowns = 0; + int xp = 0; + if (type.getLevelUpRewards().length > 0) + { + int[] rewards = type.getLevelUpRewards()[Math.min(data.getLevel(), type.getLevelUpRewards().length) - 1]; + gems += rewards[0]; + crowns += rewards[1]; + xp += rewards[2]; + } UtilPlayer.message(player, ""); - UtilPlayer.message(player, nameLevel + " " + progress + - " " + F.elem(C.cAqua + C.Bold + "LEVEL UP!")); + String inform = nameLevel + " " + progress + " " + F.elem(C.cAqua + C.Bold + "LEVEL UP!"); + if (gems > 0) + { + inform += " " + F.elem(C.cGreen + C.Bold + "+" + gems + " Gems"); + } + if (crowns > 0) + { + inform += " " + F.elem(C.cGold + C.Bold + "+" + crowns + " Crowns"); + } + if (xp > 0 && !Manager.GetTaskManager().hasCompletedTask(player, Achievement.GLOBAL_MINEPLEX_LEVEL.getName())) + { + inform += " " + F.elem(C.cYellow + C.Bold + "+" + xp + " XP"); + } + UtilPlayer.message(player, inform); player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); } @@ -179,4 +242,4 @@ public class GameAchievementManager implements Listener UtilPlayer.message(player, ""); UtilPlayer.message(player, ArcadeFormat.Line); } -} +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java index 0c9cf5759..58048fb34 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java @@ -158,8 +158,7 @@ public class GameCreationManager implements Listener Manager.GetDamage().DisableDamageChanges = false; Manager.GetCreature().SetDisableCustomDrops(false); Manager.GetDamage().SetEnabled(true); - Manager.GetExplosion().SetRegenerate(false); - Manager.GetExplosion().SetTNTSpread(true); + Manager.GetExplosion().resetConfiguration(); // Manager.GetAntiStack().SetEnabled(true); Manager.getCosmeticManager().setHideParticles(false); Manager.GetDamage().GetCombatManager().setUseWeaponName(AttackReason.CustomWeaponName); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java index b7a2119d0..a2819e252 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java @@ -54,6 +54,7 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockGrowEvent; import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -1084,41 +1085,40 @@ public class GameFlagManager implements Listener @EventHandler public void WorldWaterDamage(UpdateEvent event) { - if (event.getType() != UpdateType.FAST) - return; - - Game game = Manager.GetGame(); - if (game == null) return; - - if (!game.IsLive()) - return; - - if (game.WorldWaterDamage <= 0) + if (event.getType() != UpdateType.FASTER) { - if (!game.WorldData.GetCustomLocs("WATER_DAMAGE").isEmpty()) - { - game.WorldWaterDamage = 4; - } - else - { - return; - } + return; } - for (GameTeam team : game.GetTeamList()) - for (Player player : team.GetPlayers(true)) - if (player.getLocation().getBlock().getTypeId() == 8 || player.getLocation().getBlock().getRelative(BlockFace.UP).getTypeId() == 8 || - player.getLocation().getBlock().getTypeId() == 9 || player.getLocation().getBlock().getRelative(BlockFace.UP).getTypeId() == 9) - { - //Damage Event - Manager.GetDamage().NewDamageEvent(player, null, null, - DamageCause.DROWNING, game.WorldWaterDamage, true, false, false, - "Water", "Water Damage"); + Game game = Manager.GetGame(); + if (game == null || !game.IsLive()) + { + return; + } - player.getWorld().playSound(player.getLocation(), - Sound.SPLASH, 0.8f, - 1f + (float) Math.random() / 2); - } + if (game.WorldWaterDamage <= 0 && !game.WorldData.GetCustomLocs("WATER_DAMAGE").isEmpty()) + { + game.WorldWaterDamage = 4; + } + + for (Player player : game.GetPlayers(true)) + { + if (!Recharge.Instance.use(player, "Water Damage", 500, false, false)) + { + continue; + } + + Block block = player.getLocation().getBlock(); + Material lower = block.getType(); + Material upper = block.getRelative(BlockFace.UP).getType(); + + if (lower == Material.WATER || lower == Material.STATIONARY_WATER || upper == Material.WATER || upper == Material.STATIONARY_WATER) + { + //Damage Event + Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.DROWNING, game.WorldWaterDamage, true, false, false, "Water", "Water Damage"); + player.getWorld().playSound(player.getLocation(), Sound.SPLASH, 0.8f, 1f + (float) Math.random() / 2); + } + } } @EventHandler(priority = EventPriority.LOWEST) @@ -1172,6 +1172,11 @@ public class GameFlagManager implements Listener if (game.WorldFireSpread) return; + if (event.getCause() == IgniteCause.FLINT_AND_STEEL && game.AllowFlintAndSteel) + { + return; + } + event.setCancelled(true); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameRewardManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameRewardManager.java index f1834bdaf..2e5e4fbdf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameRewardManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameRewardManager.java @@ -80,7 +80,7 @@ public class GameRewardManager implements Listener //First Kill if (game.FirstKill) { - game.AddGems(killer, 10, "First Blood", false, false); + game.AddGems(killer, game.FirstKillReward, "First Blood", false, false); Manager.getPluginManager().callEvent(new FirstBloodEvent(killer)); @@ -191,7 +191,7 @@ public class GameRewardManager implements Listener } // Gem Finder - if (game.GemHunterEnabled) + if (game.GemHunterEnabled && !game.CrownsEnabled) { int gemFinder = Manager.GetAchievement().get(player, Achievement.GLOBAL_GEM_HUNTER).getLevel(); if (gemFinder > 0) @@ -216,7 +216,7 @@ public class GameRewardManager implements Listener } } - if (DoubleGem && game.GemDoubleEnabled) + if (DoubleGem && game.GemDoubleEnabled && !game.CrownsEnabled) gemsToReward += baseGemsEarned; Rank rank = Manager.GetClients().Get(player).GetRank(); @@ -232,17 +232,35 @@ public class GameRewardManager implements Listener shardsToReward += baseShardsEarned * 2; else if (rank.has(Rank.ETERNAL)) shardsToReward += baseShardsEarned * 2.5; - - Manager.GetDonation().rewardCurrency(GlobalCurrency.GEM, player, "Earned " + game.GetName(), gemsToReward); + + if (!game.CrownsEnabled) + { + Manager.GetDonation().rewardCurrency(GlobalCurrency.GEM, player, "Earned " + game.GetName(), gemsToReward); + } + else + { + Manager.GetDonation().rewardCrowns(gemsToReward, player); + } if (accountId != -1) { Manager.GetDonation().rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, player, "Earned", shardsToReward); } - Manager.getTrackManager().getTrack(GemCollectorTrack.class).earnedGems(player, gemsToReward); + if (!game.CrownsEnabled) + { + Manager.getTrackManager().getTrack(GemCollectorTrack.class).earnedGems(player, gemsToReward); + } //Stats - Manager.GetStatsManager().incrementStat(player, "Global.GemsEarned", gemsToReward); - Manager.GetStatsManager().incrementStat(player, game.GetName() + ".GemsEarned", gemsToReward); + if (!game.CrownsEnabled) + { + Manager.GetStatsManager().incrementStat(player, "Global.GemsEarned", gemsToReward); + Manager.GetStatsManager().incrementStat(player, game.GetName() + ".GemsEarned", gemsToReward); + } + else + { + Manager.GetStatsManager().incrementStat(player, "Global.CrownsEarned", gemsToReward); + Manager.GetStatsManager().incrementStat(player, game.GetName() + ".CrownsEarned", gemsToReward); + } } private void changeName(Player player, String newName) @@ -274,7 +292,7 @@ public class GameRewardManager implements Listener UtilPlayer.message(player, ""); UtilPlayer.message(player, ArcadeFormat.Line); - UtilPlayer.message(player, Manager.IsRewardGems() ? "§f§lGems Earned" : "§f§lGame Stats"); + UtilPlayer.message(player, Manager.IsRewardGems() ? (game.CrownsEnabled ? "§f§lCrowns Earned" : "§f§lGems Earned") : "§f§lGame Stats"); UtilPlayer.message(player, ""); int earnedGems = 0; @@ -294,7 +312,7 @@ public class GameRewardManager implements Listener String out = ""; if (Manager.IsRewardGems()) - out += F.elem(C.cGreen + "+" + (int) (gemCount * game.GemMultiplier) + " Gems") + " for "; + out += F.elem((game.CrownsEnabled ? C.cGold : C.cGreen) + "+" + (int) (gemCount * game.GemMultiplier) + (game.CrownsEnabled ? " Crowns" : " Gems")) + " for "; out += F.elem(amountStr + type); UtilPlayer.message(player, out); @@ -313,7 +331,7 @@ public class GameRewardManager implements Listener int totalGems = earnedGems; //Gem Finder - if (game.GemHunterEnabled) + if (game.GemHunterEnabled && !game.CrownsEnabled) { int gemFinder = Manager.GetAchievement().get(player, Achievement.GLOBAL_GEM_HUNTER).getLevel(); if (gemFinder > 0) @@ -341,7 +359,7 @@ public class GameRewardManager implements Listener if (extraGems > 0) { - UtilPlayer.message(player, F.elem(C.cGreen + "+" + extraGems + " Gems") + " for " + + UtilPlayer.message(player, F.elem((game.CrownsEnabled ? C.cGold : C.cGreen) + "+" + extraGems + (game.CrownsEnabled ? " Crowns" : " Gems")) + " for " + F.elem("Online for " + UtilTime.MakeStr(timeOnline) + C.cGreen + " +" + (int) (hoursOnline * 20) + "%")); totalGems += extraGems; @@ -350,7 +368,7 @@ public class GameRewardManager implements Listener } //Double Gem - if (DoubleGem && game.GemDoubleEnabled) + if (DoubleGem && game.GemDoubleEnabled && !game.CrownsEnabled) { UtilPlayer.message(player, F.elem(C.cGreen + "+" + (earnedGems) + " Gems") + " for " + F.elem(C.cDGreen + "Double Gem Weekend")); @@ -393,13 +411,13 @@ public class GameRewardManager implements Listener if (give) { UtilPlayer.message(player, F.elem(C.cWhite + "§lYou now have " + - C.cGreen + C.Bold + (Manager.GetDonation().Get(player.getUniqueId()).getBalance(GlobalCurrency.GEM) + totalGems) + " Gems") + C.cWhite + C.Bold + " and " + + (game.CrownsEnabled ? (C.cGoldB + (Manager.GetDonation().getCrowns(player) + totalGems) + " Crowns") : (C.cGreenB + (Manager.GetDonation().Get(player.getUniqueId()).getBalance(GlobalCurrency.GEM) + totalGems) + " Gems"))) + C.cWhite + C.Bold + " and " + F.elem(C.cAqua + C.Bold + (Manager.GetDonation().Get(player.getUniqueId()).getBalance(GlobalCurrency.TREASURE_SHARD) + shards) + " Treasure Shards")); } else { UtilPlayer.message(player, F.elem(C.cWhite + "§lGame is still in progress...")); - UtilPlayer.message(player, F.elem(C.cWhite + "§lYou may earn more " + C.cGreen + C.Bold + "Gems" + C.cWhite + C.Bold + " when its completed.")); + UtilPlayer.message(player, F.elem(C.cWhite + "§lYou may earn more " + (game.CrownsEnabled ? (C.cGoldB + "Crowns") : (C.cGreenB + "Gems")) + C.cWhite + C.Bold + " when it's completed.")); } UtilPlayer.message(player, ArcadeFormat.Line); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java index 8e7128943..5916af5b1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameStatManager.java @@ -3,17 +3,6 @@ package nautilus.game.arcade.managers; import java.util.HashMap; import java.util.UUID; -import mineplex.core.common.Rank; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.leaderboard.LeaderboardManager; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.GameType; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.game.Game.GameState; -import nautilus.game.arcade.stats.StatTracker; - import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -23,6 +12,16 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import mineplex.core.common.Rank; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game.GameState; +import nautilus.game.arcade.stats.StatTracker; + public class GameStatManager implements Listener { ArcadeManager Manager; @@ -73,11 +72,6 @@ public class GameStatManager implements Listener continue; Manager.GetStatsManager().incrementStat(player, stat, value); - - // Leaderboard hook for logging appropriate stat events - // Note: Rejects stat events that are not of the appropriate types. - int gameId = event.GetGame().GetType().getGameId(); - LeaderboardManager.getInstance().attemptStatEvent(player, stat.split("\\.")[1], gameId, value); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java new file mode 100644 index 000000000..63e90d8d6 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/PerkSpreadsheetModule.java @@ -0,0 +1,152 @@ +package nautilus.game.arcade.managers; + +import mineplex.core.common.Pair; +import mineplex.core.common.util.UtilServer; +import mineplex.core.google.GoogleSheetsManager; +import mineplex.core.google.SheetObjectDeserialiser; +import mineplex.core.slack.SlackAPI; +import mineplex.core.slack.SlackMessage; +import mineplex.core.slack.SlackTeam; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.Perk; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class PerkSpreadsheetModule implements Listener +{ + + private static final SheetObjectDeserialiser> DESERIALISER = values -> Pair.create(values[0], values.length == 1 ? "" : values[1]); + + private final Game _game; + private final Map _dataMap; + private final String _fileName; + + public PerkSpreadsheetModule(Game game, String fileName) + { + _game = game; + _fileName = fileName; + + _dataMap = new HashMap<>(); + + UtilServer.RegisterEvents(this); + + setup(); + } + + @EventHandler + public void cleanup(GameStateChangeEvent event) + { + if (event.GetState() != Game.GameState.End) + { + return; + } + + UtilServer.Unregister(this); + } + + private void setup() + { + // File Name must not be null + Objects.requireNonNull(_fileName); + + GoogleSheetsManager manager = _game.getArcadeManager().getSheetsManager(); + + Map>> map = manager.getSheetData(_fileName); + + for (Map.Entry>> entry : map.entrySet()) + { + String key = entry.getKey(); + List> value = entry.getValue(); + + Kit kit = getFromName(key); + + if (kit == null) + { + manager.log("No kit found for the name " + key); + continue; + } + + Perk currentPerk = null; + + for (List rows : value) + { + try + { + Pair pair = DESERIALISER.deserialise(rows.toArray(new String[0])); + + Perk perk = getFromName(kit, pair.getLeft()); + + if (perk != null) + { + currentPerk = perk; + continue; + } + + if (currentPerk != null) + { + String id = getKey(kit, currentPerk, pair.getLeft()); + _dataMap.put(id, pair.getRight()); + } + } + catch (Exception e) + { + // Continue the loop + } + } + } + + for (Kit kit : _game.GetKits()) + { + for (Perk perk : kit.GetPerks()) + { + perk.setSpreadsheet(this); + } + } + } + + private Kit getFromName(String name) + { + for (Kit kit : _game.GetKits()) + { + if (kit.GetName().equalsIgnoreCase(name)) + { + return kit; + } + } + + return null; + } + + private Perk getFromName(Kit kit, String name) + { + for (Perk perk : kit.GetPerks()) + { + if (perk.GetName().equalsIgnoreCase(name)) + { + return perk; + } + } + + return null; + } + + public String getKey(Kit kit, Perk perk, String value) + { + return kit.GetName() + "." + perk.GetName() + "." + value; + } + + public Map getDataMap() + { + return _dataMap; + } + +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/ProgressingKitManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/ProgressingKitManager.java index 110a8d422..35442c7a3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/ProgressingKitManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/ProgressingKitManager.java @@ -263,6 +263,10 @@ public class ProgressingKitManager implements Listener { return; } + if (!data.getKit().usesXp()) + { + return; + } player.sendMessage(SPACE); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/lobby/current/NewGameLobbyManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/lobby/current/NewGameLobbyManager.java index a0a07de20..11b970117 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/lobby/current/NewGameLobbyManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/lobby/current/NewGameLobbyManager.java @@ -1,24 +1,20 @@ package nautilus.game.arcade.managers.lobby.current; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import mineplex.core.common.util.MapUtil; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.timing.TimingManager; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.GameTeam; -import nautilus.game.arcade.game.games.deathtag.DeathTag; -import nautilus.game.arcade.game.games.hideseek.HideSeek; -import nautilus.game.arcade.game.games.smash.SuperSmash; -import nautilus.game.arcade.game.games.wither.WitherGame; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.KitAvailability; -import nautilus.game.arcade.kit.KitSorter; -import nautilus.game.arcade.kit.NullKit; -import nautilus.game.arcade.managers.LobbyEnt; -import nautilus.game.arcade.managers.lobby.LobbyManager; +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.AbstractMap; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.Material; @@ -32,16 +28,26 @@ import org.bukkit.entity.Sheep; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerArmorStandManipulateEvent; -import java.io.BufferedReader; -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import mineplex.core.common.timing.TimingManager; +import mineplex.core.common.util.MapUtil; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.game.games.deathtag.DeathTag; +import nautilus.game.arcade.game.games.hideseek.HideSeek; +import nautilus.game.arcade.game.games.smash.SuperSmash; +import nautilus.game.arcade.game.games.wither.WitherGame; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.KitSorter; +import nautilus.game.arcade.kit.NullKit; +import nautilus.game.arcade.managers.LobbyEnt; +import nautilus.game.arcade.managers.lobby.LobbyManager; /** * @@ -574,5 +580,15 @@ public class NewGameLobbyManager extends LobbyManager return null; } - -} + + public Map> getCustomLocs() + { + Map> ret = new HashMap<>(); + ret.putAll(_multipleLocs); + for (Entry singleEntry : _singleLocs.entrySet()) + { + ret.put(singleEntry.getKey(), Arrays.asList(singleEntry.getValue())); + } + return ret; + } +} \ No newline at end of file diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java index 5a860af08..0c79be7ef 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPC.java @@ -26,15 +26,10 @@ import mineplex.core.updater.event.UpdateEvent; import mineplex.core.utils.UtilGameProfile; import mineplex.gemhunters.death.event.QuitNPCDespawnEvent; import mineplex.gemhunters.economy.EconomyModule; -import mineplex.gemhunters.loot.InventoryModule; -import mineplex.gemhunters.quest.QuestModule; -import mineplex.gemhunters.quest.QuestPlayerData; public class QuitNPC implements Listener { - // Managers - private final QuitNPCModule _npc; private final DisguiseManager _disguise; // Time @@ -52,10 +47,9 @@ public class QuitNPC implements Listener private final int _gems; - public QuitNPC(QuitNPCModule npc, Player player, long quitMills) + public QuitNPC(Player player, long quitMills) { // Managers - _npc = npc; _disguise = Managers.get(DisguiseManager.class); // Time @@ -162,7 +156,6 @@ public class QuitNPC implements Listener if (killer != null) { - _npc.setKilledBy(_uuid, killer.getName()); Managers.get(EconomyModule.class).addToStore(killer, "Killing " + F.name(_name + "'s") + " NPC", (int) (_gems * EconomyModule.GEM_KILL_FACTOR)); } @@ -192,4 +185,4 @@ public class QuitNPC implements Listener { return _uuid; } -} +} \ No newline at end of file diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java index 1576c696e..109e1039f 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCModule.java @@ -1,40 +1,38 @@ package mineplex.gemhunters.death.quitnpc; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; -import mineplex.core.common.util.UtilPlayer; -import mineplex.gemhunters.economy.CashOutModule; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; import org.bukkit.event.player.PlayerQuitEvent; import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.common.util.F; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; -import mineplex.core.texttutorial.TextTutorialManager; import mineplex.gemhunters.death.event.QuitNPCDespawnEvent; import mineplex.gemhunters.death.event.QuitNPCSpawnEvent; -import mineplex.gemhunters.economy.event.PlayerCashOutCompleteEvent; +import mineplex.gemhunters.economy.CashOutModule; @ReflectivelyCreateMiniPlugin public class QuitNPCModule extends MiniPlugin { - private static final long LOG_OUT_TIME = TimeUnit.SECONDS.toMillis(60); private final CashOutModule _cashOut; private final Map _npcs; - private final Map _killedBy; + + private final String _serverName; + private final QuitNPCRepository _repo; private QuitNPCModule() { @@ -43,7 +41,8 @@ public class QuitNPCModule extends MiniPlugin _cashOut = require(CashOutModule.class); _npcs = new HashMap<>(); - _killedBy = new HashMap<>(); + _serverName = UtilServer.getRegion().name() + ":" + UtilServer.getServerName(); + _repo = new QuitNPCRepository(); } public void spawnNpc(Player player) @@ -73,7 +72,8 @@ public class QuitNPCModule extends MiniPlugin return; } - _npcs.put(player.getUniqueId(), new QuitNPC(this, player, LOG_OUT_TIME)); + _npcs.put(player.getUniqueId(), new QuitNPC(player, LOG_OUT_TIME)); + _repo.insertNpc(player.getUniqueId(), _serverName); } @EventHandler(priority = EventPriority.LOWEST) @@ -93,23 +93,30 @@ public class QuitNPCModule extends MiniPlugin public void npcDespawn(QuitNPCDespawnEvent event) { log("Despawning npc for " + _npcs.remove(event.getNpc().getUniqueId()).getName()); + _repo.deleteNpc(event.getNpc().getUniqueId()); } - @EventHandler - public void playerJoin(PlayerJoinEvent event) + @EventHandler(priority = EventPriority.HIGHEST) + public void onLogin(AsyncPlayerPreLoginEvent event) { - Player player = event.getPlayer(); - UUID key = player.getUniqueId(); - - if (_killedBy.containsKey(key)) + try { - player.sendMessage(F.main("Game", "You were killed while you were logged out. You were killed by " + F.name(_killedBy.remove(key)) + ".")); + String npcServer = _repo.loadNpcServer(event.getUniqueId()).get(); + if (npcServer == null || npcServer.isEmpty()) + { + return; + } + if (npcServer.equals(_serverName)) + { + return; + } + + event.disallow(Result.KICK_OTHER, C.cRed + "You have a combat logger alive on " + npcServer + "! Either wait for it to despawn or join that server directly!"); + } + catch (Exception ex) + { + ex.printStackTrace(); } - } - - public void setKilledBy(UUID dead, String killedBy) - { - _killedBy.put(dead, killedBy); } public QuitNPC getNPC(Player player) @@ -121,5 +128,4 @@ public class QuitNPCModule extends MiniPlugin { return _npcs.containsKey(player.getUniqueId()); } - -} +} \ No newline at end of file diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCRepository.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCRepository.java new file mode 100644 index 000000000..6db02ac7f --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/quitnpc/QuitNPCRepository.java @@ -0,0 +1,69 @@ +package mineplex.gemhunters.death.quitnpc; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import mineplex.core.common.util.UtilServer; +import mineplex.serverdata.database.DBPool; +import mineplex.serverdata.database.RepositoryBase; +import mineplex.serverdata.database.column.ColumnVarChar; + +public class QuitNPCRepository extends RepositoryBase +{ + private static final String GET_DATA = "SELECT serverName FROM gemHuntersQuitNpcs WHERE uuid=?;"; + private static final String INSERT_DATA = "INSERT INTO gemHuntersQuitNpcs (uuid, serverName) VALUES (?, ?);"; + private static final String DELETE_DATA = "DELETE FROM gemHuntersQuitNpcs WHERE uuid=?;"; + + public QuitNPCRepository() + { + super(DBPool.getAccount()); + } + + public CompletableFuture loadNpcServer(UUID uuid) + { + return CompletableFuture.supplyAsync(() -> + { + try (Connection conn = getConnection()) + { + PreparedStatement stmt = conn.prepareStatement(GET_DATA); + stmt.setString(1, uuid.toString()); + + String serverName = null; + + ResultSet resultSet = stmt.executeQuery(); + if (resultSet.next()) + { + serverName = resultSet.getString("serverName"); + } + + return serverName; + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + }); + } + + public void deleteNpc(UUID uuid) + { + final String uuidStr = uuid.toString(); + UtilServer.runAsync(() -> + { + executeUpdate(DELETE_DATA, new ColumnVarChar("uuid", uuidStr.length(), uuidStr)); + }); + } + + public void insertNpc(UUID uuid, String serverName) + { + final String uuidStr = uuid.toString(); + UtilServer.runAsync(() -> + { + executeInsert(INSERT_DATA, null, new ColumnVarChar("uuid", uuidStr.length(), uuidStr), new ColumnVarChar("serverName", serverName.length(), serverName)); + }); + } +} \ No newline at end of file diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java index 88a603396..c4d3b75d8 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/CashOutModule.java @@ -14,6 +14,7 @@ import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.gemhunters.economy.command.CashOutItemCommand; +import mineplex.gemhunters.economy.command.ResetCooldownCommand; import mineplex.gemhunters.economy.event.PlayerCashOutCompleteEvent; import mineplex.gemhunters.spawn.event.PlayerTeleportIntoMapEvent; import org.bukkit.Material; @@ -61,6 +62,7 @@ public class CashOutModule extends MiniPlugin public void addCommands() { addCommand(new CashOutItemCommand(this)); + addCommand(new ResetCooldownCommand(this)); } @EventHandler @@ -164,7 +166,7 @@ public class CashOutModule extends MiniPlugin { kickPlayer(player); } - }, 20); + }, 50); } } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/command/ResetCooldownCommand.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/command/ResetCooldownCommand.java new file mode 100644 index 000000000..f95a82f8f --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/economy/command/ResetCooldownCommand.java @@ -0,0 +1,23 @@ +package mineplex.gemhunters.economy.command; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.recharge.Recharge; +import mineplex.gemhunters.economy.CashOutModule; +import org.bukkit.entity.Player; + +public class ResetCooldownCommand extends CommandBase +{ + + public ResetCooldownCommand(CashOutModule plugin) + { + super(plugin, Rank.DEVELOPER, "resetcashout"); + } + + @Override + public void Execute(Player caller, String[] args) + { + Recharge.Instance.useForce(caller, "Cash Out", 0); + } + +} diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java index deb3644d7..e7bd8f00a 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/join/JoinModule.java @@ -1,32 +1,38 @@ package mineplex.gemhunters.join; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; -import mineplex.core.inventory.InventoryManager; +import mineplex.core.common.util.UtilItem; +import mineplex.core.recharge.Recharge; import mineplex.gemhunters.death.quitnpc.QuitNPC; import mineplex.gemhunters.death.quitnpc.QuitNPCModule; import mineplex.gemhunters.economy.EconomyModule; import mineplex.gemhunters.loot.InventoryModule; -import mineplex.gemhunters.map.ItemMapModule; +import mineplex.gemhunters.loot.LootModule; import mineplex.gemhunters.persistence.PersistenceData; import mineplex.gemhunters.persistence.PersistenceModule; import mineplex.gemhunters.persistence.PersistenceRepository; import mineplex.gemhunters.quest.QuestModule; import mineplex.gemhunters.spawn.SpawnModule; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerJoinEvent; - -import java.util.function.Consumer; +import org.bukkit.inventory.ItemStack; @ReflectivelyCreateMiniPlugin public class JoinModule extends MiniPlugin { + private static final double MAXIMUM_DURABILITY_LOSS = 0.85; private final CoreClientManager _client; private final EconomyModule _economy; + private final LootModule _loot; private final QuestModule _quest; private final PersistenceModule _persistence; private final QuitNPCModule _npc; @@ -39,6 +45,7 @@ public class JoinModule extends MiniPlugin _client = require(CoreClientManager.class); _economy = require(EconomyModule.class); + _loot = require(LootModule.class); _quest = require(QuestModule.class); _persistence = require(PersistenceModule.class); _npc = require(QuitNPCModule.class); @@ -60,9 +67,16 @@ public class JoinModule extends MiniPlugin player.setHealth(data.getHealth()); player.setMaxHealth(data.getMaxHealth()); player.setFoodLevel(data.getHunger()); + loseDurability(data.getItems(), data.getSaveTime()); + for (ItemStack itemStack : data.getItems()) + { + _loot.handleRewardItem(player, itemStack); + } player.getInventory().addItem(data.getItems()); + loseDurability(data.getArmour(), data.getSaveTime()); player.getInventory().setArmorContents(data.getArmour()); _inventory.unlockSlots(player, data.getSlots(), false); + Recharge.Instance.useForce(player, "Cash Out", data.getCashOutTime()); }); player.getInventory().clear(); @@ -81,9 +95,33 @@ public class JoinModule extends MiniPlugin if (!repository.exists(client)) { - _spawn.teleportToSpawn(player); + runSync(() -> _spawn.teleportToSpawn(player)); } }); } + private void loseDurability(ItemStack[] items, long time) + { + long diff = System.currentTimeMillis() - time; + long hours = TimeUnit.MILLISECONDS.toHours(diff); + + for (ItemStack item : items) + { + if (!UtilItem.isSword(item) && !UtilItem.isArmor(item)) + { + continue; + } + + short max = item.getType().getMaxDurability(); + short change = (short) (((double) max / 100D) * hours); + short apply = (short) (item.getDurability() + change); + + if (apply > max * MAXIMUM_DURABILITY_LOSS) + { + apply = (short) (max * MAXIMUM_DURABILITY_LOSS); + } + + item.setDurability(apply); + } + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java index a60f1e7f0..dbff05dc6 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/LootModule.java @@ -1,14 +1,23 @@ package mineplex.gemhunters.loot; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.google.GoogleSheetsManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.gemhunters.economy.EconomyModule; +import mineplex.gemhunters.economy.event.PlayerCashOutCompleteEvent; +import mineplex.gemhunters.loot.command.SpawnChestCommand; +import mineplex.gemhunters.loot.command.UpdateLootCommand; +import mineplex.gemhunters.loot.deserialisers.ChestPropertiesDeserialiser; +import mineplex.gemhunters.loot.deserialisers.LootItemDeserialiser; +import mineplex.gemhunters.loot.event.PlayerChestOpenEvent; +import mineplex.gemhunters.loot.rewards.*; +import mineplex.gemhunters.safezone.SafezoneModule; +import mineplex.gemhunters.spawn.event.PlayerTeleportIntoMapEvent; +import mineplex.gemhunters.world.WorldDataModule; import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; @@ -25,35 +34,8 @@ import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import mineplex.core.MiniPlugin; -import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.google.GoogleSheetsManager; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.gemhunters.economy.EconomyModule; -import mineplex.gemhunters.economy.event.PlayerCashOutCompleteEvent; -import mineplex.gemhunters.loot.command.SpawnChestCommand; -import mineplex.gemhunters.loot.command.UpdateLootCommand; -import mineplex.gemhunters.loot.deserialisers.ChestPropertiesDeserialiser; -import mineplex.gemhunters.loot.deserialisers.LootItemDeserialiser; -import mineplex.gemhunters.loot.event.PlayerChestOpenEvent; -import mineplex.gemhunters.loot.rewards.LootChestReward; -import mineplex.gemhunters.loot.rewards.LootGadgetReward; -import mineplex.gemhunters.loot.rewards.LootItemReward; -import mineplex.gemhunters.loot.rewards.LootRankReward; -import mineplex.gemhunters.loot.rewards.LootShardReward; -import mineplex.gemhunters.safezone.SafezoneModule; -import mineplex.gemhunters.spawn.event.PlayerTeleportIntoMapEvent; -import mineplex.gemhunters.util.SlackSheetsBot; -import mineplex.gemhunters.world.WorldDataModule; +import java.util.*; +import java.util.concurrent.TimeUnit; @ReflectivelyCreateMiniPlugin public class LootModule extends MiniPlugin @@ -200,12 +182,6 @@ public class LootModule extends MiniPlugin } catch (Exception e) { - if (row != 1) - { - SlackSheetsBot.reportParsingError(e, "Chest Loot", key, row); - } - - continue; } } @@ -224,12 +200,6 @@ public class LootModule extends MiniPlugin } catch (Exception e) { - if (row != 1) - { - SlackSheetsBot.reportParsingError(e, "Chest Loot", key, row); - } - - continue; } } @@ -652,14 +622,14 @@ public class LootModule extends MiniPlugin { LootItemReward reward = iterator.next(); - if (player.equals(reward.getPlayer())) + if (player.equals(reward.getPlayer()) && player.getInventory().contains(reward.getItemStack())) { reward.success(); iterator.remove(); } } } - + public final Set getShownPlayers() { return _shownPlayers; diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java index 5ef354ec1..323c184f9 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootChestReward.java @@ -1,5 +1,6 @@ package mineplex.gemhunters.loot.rewards; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -10,14 +11,14 @@ public class LootChestReward extends LootItemReward { private final InventoryManager _inventory; - + private final String _chestName; private final int _amount; - + public LootChestReward(long cashOutDelay, ItemStack itemStack, String chestName, int amount) { super(chestName + " Chest", cashOutDelay, itemStack); - + _inventory = Managers.require(InventoryManager.class); _chestName = chestName; _amount = amount; @@ -26,27 +27,19 @@ public class LootChestReward extends LootItemReward @Override public void onCollectItem() { - + } @Override public void onSuccessful() { - _inventory.addItemToInventory(new Callback() - { - - @Override - public void run(Boolean success) - { - //DebugModule.getInstance().d("Success= " + success); - } - }, _player, _chestName + " Chest", _amount); + _inventory.addItemToInventory(success -> SlackRewardBot.logReward(_player, this, success ? "Success" : "Failure"), _player, _chestName + " Chest", _amount); } @Override public void onDeath() { - + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java index 59f9db30f..03ba74fe6 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootGadgetReward.java @@ -1,5 +1,9 @@ package mineplex.gemhunters.loot.rewards; +import com.sun.org.apache.xpath.internal.operations.Bool; +import mineplex.core.common.util.Callback; +import mineplex.core.server.util.TransactionResponse; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -35,13 +39,11 @@ public class LootGadgetReward extends LootItemReward if (donor.ownsUnknownSalesPackage(_gadget)) { - //DebugModule.getInstance().d("Shard duplicate"); - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", (int) (500 + 1000 * Math.random())); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", (int) (500 + 1000 * Math.random()), success -> SlackRewardBot.logReward(_player, this, (success ? "Success" : "Failure") + " (Shard Dupe)")); } else { - //DebugModule.getInstance().d("Adding gadget"); - _donation.purchaseUnknownSalesPackage(_player, _gadget, GlobalCurrency.TREASURE_SHARD, 0, true, null); + _donation.purchaseUnknownSalesPackage(_player, _gadget, GlobalCurrency.TREASURE_SHARD, 0, true, transaction -> SlackRewardBot.logReward(_player, this, transaction == TransactionResponse.Success ? "Success" : "Failure")); } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java index 58ae67fb3..e0e592fd3 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootRankReward.java @@ -2,6 +2,7 @@ package mineplex.gemhunters.loot.rewards; import java.util.concurrent.TimeUnit; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -70,11 +71,11 @@ public class LootRankReward extends LootItemReward if (newRank == null) { _player.sendMessage(F.main("Loot", "Since you already have eternal ( You are lucky :) ). So instead you can have " + CONSOLATION_PRICE + " shards.")); - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", CONSOLATION_PRICE); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", CONSOLATION_PRICE, success -> SlackRewardBot.logReward(_player, this, (success ? "Success" : "Failure") + " (Shard Dupe)")); return; } - _clientManager.SaveRank(_player.getName(), _player.getUniqueId(), newRank, true); + _clientManager.SaveRank(callback -> SlackRewardBot.logReward(_player, this, callback.Name), _player.getName(), _player.getUniqueId(), newRank, true); } @Override diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java index af1119a73..458e577e1 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/loot/rewards/LootShardReward.java @@ -1,5 +1,6 @@ package mineplex.gemhunters.loot.rewards; +import mineplex.gemhunters.util.SlackRewardBot; import org.bukkit.inventory.ItemStack; import mineplex.core.Managers; @@ -30,7 +31,7 @@ public class LootShardReward extends LootItemReward @Override public void onSuccessful() { - _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", _amount); + _donation.rewardCurrencyUntilSuccess(GlobalCurrency.TREASURE_SHARD, _player, "Earned", _amount, success -> SlackRewardBot.logReward(_player, this, success ? "Success" : "Failure")); } @Override diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/map/ItemMapRenderer.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/map/ItemMapRenderer.java index 8c1e4f865..09d4aca84 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/map/ItemMapRenderer.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/map/ItemMapRenderer.java @@ -279,8 +279,8 @@ public class ItemMapRenderer extends MapRenderer continue; } - byte b0 = (byte) (int) Math.min(127, (double) (mapX * 2.0F) + 0.5D); - byte b1 = (byte) (int) Math.max(-127, (double) (mapZ * 2.0F) + 0.5D); + byte b0 = (byte) (int) Math.min(127, (mapX * 2.0F) + 0.5D); + byte b1 = (byte) (int) Math.max(-127, (mapZ * 2.0F) + 0.5D); byte rotation = (byte) (int) ((l.getYaw() * 16D) / 360D); diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java index dc8fe78ed..fed987d21 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceData.java @@ -16,8 +16,10 @@ public class PersistenceData private final int _slots; private final ItemStack[] _items; private final ItemStack[] _armour; + private final long _saveTime; + private final int _cashOutTime; - public PersistenceData(int gems, Location location, QuestPlayerData questData, int health, int maxHealth, int hunger, int slots, ItemStack[] items, ItemStack[] armour) + public PersistenceData(int gems, Location location, QuestPlayerData questData, int health, int maxHealth, int hunger, int slots, ItemStack[] items, ItemStack[] armour, long saveTime, int cashOutTime) { _gems = gems; _location = location; @@ -28,6 +30,8 @@ public class PersistenceData _items = items; _slots = slots; _armour = armour; + _saveTime = saveTime; + _cashOutTime = cashOutTime; } public int getGems() @@ -75,4 +79,13 @@ public class PersistenceData return _armour; } + public long getSaveTime() + { + return _saveTime; + } + + public int getCashOutTime() + { + return _cashOutTime; + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java index dcf2afde9..322f25d54 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java @@ -1,35 +1,33 @@ package mineplex.gemhunters.persistence; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; + import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.F; import mineplex.core.portal.events.ServerTransferEvent; +import mineplex.core.recharge.Recharge; +import mineplex.core.recharge.RechargeData; import mineplex.gemhunters.death.event.QuitNPCDespawnEvent; import mineplex.gemhunters.economy.CashOutModule; import mineplex.gemhunters.economy.EconomyModule; import mineplex.gemhunters.loot.InventoryModule; import mineplex.gemhunters.quest.QuestModule; import mineplex.gemhunters.quest.QuestPlayerData; -import mineplex.serverdata.commands.ServerTransfer; -import net.minecraft.server.v1_8_R3.EntityItemFrame; -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.EventPriority; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; @ReflectivelyCreateMiniPlugin public class PersistenceModule extends MiniPlugin @@ -95,8 +93,20 @@ public class PersistenceModule extends MiniPlugin int slots = _inventory.getSlots(player); ItemStack[] items = player.getInventory().getContents(); ItemStack[] armour = player.getInventory().getArmorContents(); + long saveTime = System.currentTimeMillis(); + int cashOutTime; + RechargeData rechargeData = Recharge.Instance.Get(player).get("Cash Out"); - PersistenceData data = new PersistenceData(gems, location, quest, health, maxHealth, hunger, slots, items, armour); + if (rechargeData == null) + { + cashOutTime = 0; + } + else + { + cashOutTime = (int) rechargeData.GetRemaining(); + } + + PersistenceData data = new PersistenceData(gems, location, quest, health, maxHealth, hunger, slots, items, armour, saveTime, cashOutTime); runAsync(() -> { diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java index ab34b4bab..cab1e644a 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceRepository.java @@ -6,8 +6,8 @@ import mineplex.gemhunters.quest.QuestPlayerData; import mineplex.serverdata.database.DBPool; import mineplex.serverdata.database.RepositoryBase; import mineplex.serverdata.database.column.ColumnInt; +import mineplex.serverdata.database.column.ColumnTimestamp; import mineplex.serverdata.database.column.ColumnVarChar; -import net.minecraft.server.v1_8_R3.ItemMapEmpty; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -16,6 +16,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.lang.reflect.Constructor; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -25,8 +26,8 @@ public class PersistenceRepository extends RepositoryBase { private static final String GET_DATA = "SELECT * FROM gemHunters WHERE accountId=?;"; - private static final String INSERT_DATA = "INSERT INTO gemHunters VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; - private static final String UPDATE_DATA = "UPDATE gemHunters SET gems=?,health=?,maxHealth=?,hunger=?,x=?,y=?,z=?,yaw=?,pitch=?,quests=?,slots=?,items=?,armour=? WHERE accountId=?;"; + private static final String INSERT_DATA = "INSERT INTO gemHunters VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + private static final String UPDATE_DATA = "UPDATE gemHunters SET gems=?,health=?,maxHealth=?,hunger=?,x=?,y=?,z=?,yaw=?,pitch=?,quests=?,slots=?,items=?,armour=?,saveTime=?,cashOutTime=? WHERE accountId=?;"; private static final String DELETE_DATA = "DELETE FROM gemHunters WHERE accountId=?;"; private static final Gson GSON; private static final ItemStack AIR = new ItemStack(Material.AIR); @@ -98,10 +99,19 @@ public class PersistenceRepository extends RepositoryBase armourList.add(CraftItemStack.deserialize(map)); } + Timestamp saveTime = resultSet.getTimestamp("saveTime"); + + if (saveTime == null) + { + saveTime = new Timestamp(System.currentTimeMillis()); + } + + int cashOutTime = resultSet.getInt("cashOutTime"); + _exists.add(accountId); Location location = new Location(Bukkit.getWorlds().get(0), x, y, z, yaw, pitch); - PersistenceData data = new PersistenceData(gems, location, questData, health, maxHealth, hunger, slots, itemsList.toArray(new ItemStack[0]), armourList.toArray(new ItemStack[0])); + PersistenceData data = new PersistenceData(gems, location, questData, health, maxHealth, hunger, slots, itemsList.toArray(new ItemStack[0]), armourList.toArray(new ItemStack[0]), saveTime.getTime(), cashOutTime); response.accept(data); } }, new ColumnInt("accountId", accountId)); @@ -125,6 +135,8 @@ public class PersistenceRepository extends RepositoryBase ItemStack[] armour = data.getArmour(); List> itemsMap = new ArrayList<>(items.length); List> armourMap = new ArrayList<>(armour.length); + Timestamp saveTime = new Timestamp(data.getSaveTime()); + int cashOutTime = data.getCashOutTime(); for (ItemStack itemStack : items) { @@ -162,6 +174,8 @@ public class PersistenceRepository extends RepositoryBase new ColumnInt("slots", slots), new ColumnVarChar("items", 10000, GSON.toJson(itemsMap)), new ColumnVarChar("armour", 1000, GSON.toJson(armourMap)), + new ColumnTimestamp("saveTime", saveTime), + new ColumnInt("cashOutTime", cashOutTime), new ColumnInt("accountId", accountId) ); } @@ -181,7 +195,9 @@ public class PersistenceRepository extends RepositoryBase new ColumnVarChar("quests", 500, GSON.toJson(data.getQuestData())), new ColumnInt("slots", slots), new ColumnVarChar("items", 10000, GSON.toJson(itemsMap)), - new ColumnVarChar("armour", 1000, GSON.toJson(armourMap)) + new ColumnVarChar("armour", 1000, GSON.toJson(armourMap)), + new ColumnTimestamp("saveTime", saveTime), + new ColumnInt("cashOutTime", cashOutTime) ); } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestNPC.java index 6594d1517..7c377c06d 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestNPC.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/quest/QuestNPC.java @@ -1,5 +1,8 @@ package mineplex.gemhunters.quest; +import mineplex.core.common.util.C; +import mineplex.core.menu.Menu; +import mineplex.gemhunters.util.SimpleNPC; import org.bukkit.Location; import org.bukkit.entity.Villager; import org.bukkit.entity.Villager.Profession; @@ -8,10 +11,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.metadata.FixedMetadataValue; -import mineplex.core.common.util.C; -import mineplex.core.menu.Menu; -import mineplex.gemhunters.util.SimpleNPC; - public class QuestNPC extends SimpleNPC { @@ -19,7 +18,7 @@ public class QuestNPC extends SimpleNPC public QuestNPC(QuestModule quest, Location spawn, Menu menu) { - super(quest.getPlugin(), spawn, Villager.class, C.cGreenB + "NEW - " + C.cYellowB + "Quest Master" + C.cGreenB + " - NEW", null); + super(quest.getPlugin(), spawn, Villager.class, C.cYellowB + "Quest Master", null); _questMenu = menu; _entity.setMetadata("quest_npc", new FixedMetadataValue(quest.getPlugin(), true)); @@ -40,7 +39,6 @@ public class QuestNPC extends SimpleNPC event.setCancelled(true); - //event.getPlayer().sendMessage(F.main("Quest", "The Quest Master is currently disabled but will be available to all players shortly.")); _questMenu.open(event.getPlayer()); } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/safezone/SafezoneModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/safezone/SafezoneModule.java index b9e1ce380..627581b5b 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/safezone/SafezoneModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/safezone/SafezoneModule.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.UUID; import mineplex.core.recharge.Recharge; +import mineplex.gemhunters.death.event.QuitNPCSpawnEvent; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.HumanEntity; @@ -130,6 +131,17 @@ public class SafezoneModule extends MiniPlugin _currentSafezone.remove(player.getUniqueId()); } + @EventHandler + public void quitNpcSpawn(QuitNPCSpawnEvent event) + { + String safezone = getSafezone(event.getPlayer().getLocation()); + + if (safezone != null && safezone.contains(SAFEZONE_DATA_IGNORE)) + { + event.setCancelled(true); + } + } + @EventHandler(priority = EventPriority.HIGHEST) public void entityDamage(EntityDamageEvent event) { diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/SellingNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/SellingNPC.java new file mode 100644 index 000000000..4e6ff2416 --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/SellingNPC.java @@ -0,0 +1,223 @@ +package mineplex.gemhunters.shop; + +import mineplex.core.Managers; +import mineplex.core.common.currency.GlobalCurrency; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilServer; +import mineplex.core.itemstack.ItemBuilder; +import mineplex.gemhunters.economy.EconomyModule; +import mineplex.gemhunters.util.SimpleNPC; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class SellingNPC extends SimpleNPC +{ + + private static final ItemStack CANCEL = new ItemBuilder(Material.REDSTONE_BLOCK) + .setTitle(C.cRedB + "Cancel") + .addLore("", "Click to cancel and return your items.") + .build(); + private static final ItemStack BUFFER = new ItemBuilder(Material.STAINED_GLASS_PANE, (byte) 15) + .setTitle(" ") + .build(); + + private final EconomyModule _economy; + + private final Set _selling; + private final Map _inv; + + private int _total; + + public SellingNPC(JavaPlugin plugin, Location spawn, Class type, String name, boolean vegetated, Set selling) + { + super(plugin, spawn, type, name, null, vegetated); + + _economy = Managers.require(EconomyModule.class); + + _selling = selling; + _inv = new HashMap<>(); + } + + @Override + @EventHandler + public void npcClick(PlayerInteractEntityEvent event) + { + super.npcClick(event); + + if (event.getRightClicked().equals(_entity)) + { + event.setCancelled(true); + + Player player = event.getPlayer(); + Inventory inv = UtilServer.getServer().createInventory(null, 54, _entity.getCustomName()); + + inv.setItem(0, CANCEL); + inv.setItem(8, getConfirm()); + + for (int i = 9; i < 18; i++) + { + inv.setItem(i, BUFFER); + } + + _inv.put(player, inv); + player.openInventory(inv); + } + } + + + @EventHandler + public void inventoryClick(InventoryClickEvent event) + { + if (event.getInventory() == null) + { + return; + } + + Player player = (Player) event.getWhoClicked(); + Inventory inv = _inv.get(player); + + if (inv == null | !event.getInventory().equals(inv)) + { + return; + } + + ItemStack itemStack = event.getCurrentItem(); + ItemStack cursor = event.getCursor(); + + if (itemStack == null || cursor == null) + { + return; + } + + Material type = itemStack.getType(); + + if (type == Material.EMERALD_BLOCK || type == Material.REDSTONE_BLOCK || type == Material.STAINED_GLASS_PANE) + { + if (type == Material.EMERALD_BLOCK) + { + finalise(player); + } + else if (type == Material.REDSTONE_BLOCK) + { + cancel(player); + } + + event.setCancelled(true); + return; + } + + TradeableItem currentItem = fromItemStack(itemStack); + TradeableItem cursorItem = fromItemStack(cursor); + + if (currentItem == null && cursorItem == null) + { + event.setCancelled(true); + player.playSound(player.getLocation(), Sound.VILLAGER_NO, 1, 0.7F); + player.sendMessage(F.main("Shop", "You cannot sell that item.")); + return; + } + + UtilServer.runSyncLater(() -> recalculatePrice(inv), 1); + } + + @EventHandler + public void inventoryClose(InventoryCloseEvent event) + { + Player player = (Player) event.getPlayer(); + + if (_inv.containsKey(player)) + { + cancel(player); + } + } + + private void recalculatePrice(Inventory inv) + { + int price = 0; + + for (ItemStack itemStack : inv.getContents()) + { + TradeableItem tradeableItem = fromItemStack(itemStack); + + if (tradeableItem == null) + { + continue; + } + + price += tradeableItem.getCost() * itemStack.getAmount(); + } + + _total = price; + inv.setItem(8, getConfirm()); + } + + private void finalise(Player player) + { + recalculatePrice(_inv.remove(player)); + player.closeInventory(); + player.playSound(player.getLocation(), Sound.VILLAGER_YES, 1, 0.7F); + _economy.addToStore(player, "Sold Items", _total); + } + + private void cancel(Player player) + { + Inventory inv = _inv.remove(player); + + for (ItemStack itemStack : inv.getContents()) + { + TradeableItem tradeableItem = fromItemStack(itemStack); + + if (tradeableItem == null) + { + continue; + } + + player.getInventory().addItem(itemStack); + } + + player.closeInventory(); + } + + private TradeableItem fromItemStack(ItemStack itemStack) + { + if (itemStack == null) + { + return null; + } + + for (TradeableItem item : _selling) + { + ItemStack itemStack2 = item.getLootItem().getItemStack(); + + if (itemStack.getType() == itemStack2.getType()) + { + return item; + } + } + + return null; + } + + private ItemStack getConfirm() + { + return new ItemBuilder(Material.EMERALD_BLOCK) + .setTitle(C.cGreenB + "Confirm") + .addLore("", "Click to sell these current items", "at a price of " + F.currency(GlobalCurrency.GEM, _total) + ".") + .build(); + } +} diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java index cfe5b13cb..2f8725d8d 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/ShopModule.java @@ -1,19 +1,8 @@ package mineplex.gemhunters.shop; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.bukkit.Location; -import org.bukkit.entity.Villager; -import org.bukkit.event.EventHandler; - import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.common.util.C; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilTime; @@ -24,8 +13,13 @@ import mineplex.core.updater.event.UpdateEvent; import mineplex.gemhunters.loot.deserialisers.LootItemDeserialiser; import mineplex.gemhunters.safezone.SafezoneModule; import mineplex.gemhunters.shop.deserialisers.VillagerPropertiesDeserialiser; -import mineplex.gemhunters.util.SlackSheetsBot; +import mineplex.gemhunters.util.SlackRewardBot; import mineplex.gemhunters.world.WorldDataModule; +import org.bukkit.Location; +import org.bukkit.entity.Villager; +import org.bukkit.event.EventHandler; + +import java.util.*; @ReflectivelyCreateMiniPlugin public class ShopModule extends MiniPlugin @@ -35,16 +29,7 @@ public class ShopModule extends MiniPlugin private static final String VILLAGER_MASTER_SHEET_NAME = "VILLAGER_MASTER"; private static final VillagerPropertiesDeserialiser VILLAGER_PROPERTIES_DESERIALISER = new VillagerPropertiesDeserialiser(); private static final LootItemDeserialiser DESERIALISER = new LootItemDeserialiser(); - private static final SheetObjectDeserialiser COST_DESERIALISER = new SheetObjectDeserialiser() - { - - @Override - public Integer deserialise(String[] values) throws ArrayIndexOutOfBoundsException, NumberFormatException - { - return Integer.parseInt(values[10]); - } - - }; + private static final SheetObjectDeserialiser COST_DESERIALISER = values -> Integer.parseInt(values[10]); private static final int MINIMUM_ITEMS = 1; private static final int MAXIMUM_ITEMS = 5; @@ -77,7 +62,7 @@ public class ShopModule extends MiniPlugin _npcs = new ArrayList<>(); _spawnedIndexes = new HashMap<>(); - runSyncLater(() -> updateVillagerTrades(), 20); + runSyncLater(this::updateVillagerTrades, 20); } public void updateVillagerTrades() @@ -107,12 +92,6 @@ public class ShopModule extends MiniPlugin } catch (Exception e) { - if (row != 1) - { - SlackSheetsBot.reportParsingError(e, "Villager Trades", key, row); - } - - continue; } } continue; @@ -131,12 +110,6 @@ public class ShopModule extends MiniPlugin } catch (Exception e) { - if (row != 1) - { - SlackSheetsBot.reportParsingError(e, "Villager Trades", key, row); - } - - continue; } } @@ -212,20 +185,31 @@ public class ShopModule extends MiniPlugin } int index = getFreeIndex(locations.size(), usedIndexes); - + if (index == -1) { return; } - + Location randomLocation = locations.get(index); randomLocation.setYaw(UtilMath.r(360)); - + usedIndexes.add(index); + String name = NAMES[UtilMath.r(NAMES.length)]; + + name = (properties.isSelling() ? C.cGold + "Buying" : C.cGreen + "Selling") + C.cGray + " - " + C.cWhite + name; + //DebugModule.getInstance().d("Trader at " + UtilWorld.locToStrClean(randomLocation) + " with key=" + key + " and index=" + index + " and max=" + spawned + "/" + max); - _npcs.add(new TraderNPC(_plugin, randomLocation, Villager.class, NAMES[UtilMath.r(NAMES.length)], _safezone.isInSafeZone(randomLocation), properties, getRandomItemSet(_trades.get(key)))); + if (properties.isSelling()) + { + _npcs.add(new TraderNPC(_plugin, randomLocation, Villager.class, name, _safezone.isInSafeZone(randomLocation), properties, getRandomItemSet(_trades.get(key)))); + } + else + { + new SellingNPC(_plugin, randomLocation, Villager.class, name, _safezone.isInSafeZone(randomLocation), _trades.get(key)); + } } } @@ -256,7 +240,7 @@ public class ShopModule extends MiniPlugin return items2; } - private final String capitalise(String s) + private String capitalise(String s) { String right = s.toLowerCase().substring(1); char left = Character.toUpperCase(s.charAt(0)); diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/TraderNPC.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/TraderNPC.java index 0c3572803..dbd7c1668 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/TraderNPC.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/TraderNPC.java @@ -100,14 +100,14 @@ public class TraderNPC extends SimpleNPC if (cost > gems) { - player.sendMessage(F.main(_entity.getCustomName(), "I'm sorry you don't have enough gems to purchase this.")); + player.sendMessage(F.main("Shop", "I'm sorry you don't have enough gems to purchase this.")); player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0.6F); return; } if (!UtilInv.HasSpace(player, itemStack.getType(), itemStack.getAmount())) { - player.sendMessage(F.main(_entity.getCustomName(), "I'm sorry you don't have enough space to hold that.")); + player.sendMessage(F.main("Shop", "I'm sorry you don't have enough space to hold that.")); player.playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 0.6F); return; } @@ -125,7 +125,7 @@ public class TraderNPC extends SimpleNPC String itemName = ItemStackFactory.Instance.GetName(itemStack, true); - player.sendMessage(F.main(_entity.getCustomName(), "Purchased " + F.elem(itemName) + "!")); + player.sendMessage(F.main("Shop", "Purchased " + F.elem(itemName) + "!")); player.playSound(player.getLocation(), Sound.NOTE_PLING, 1, 1.2F); player.getInventory().addItem(itemStack); } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/VillagerProperties.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/VillagerProperties.java index bb94751ea..db5ed3495 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/VillagerProperties.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/VillagerProperties.java @@ -5,16 +5,18 @@ public class VillagerProperties private final String _name; private final String _dataKey; + private final boolean _selling; private final int _spawnRate; private final int _expireRate; private final int _max; private long _lastSpawn; - public VillagerProperties(String name, String dataKey, int spawnRate, int expireRate, int max) + public VillagerProperties(String name, String dataKey, boolean selling, int spawnRate, int expireRate, int max) { _name = name; _dataKey = dataKey; + _selling = selling; _spawnRate = spawnRate; _expireRate = expireRate; _max = max; @@ -32,6 +34,11 @@ public class VillagerProperties return _dataKey; } + public boolean isSelling() + { + return _selling; + } + public final int getSpawnRate() { return _spawnRate; diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/deserialisers/VillagerPropertiesDeserialiser.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/deserialisers/VillagerPropertiesDeserialiser.java index 8d37883a9..423be658c 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/deserialisers/VillagerPropertiesDeserialiser.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/shop/deserialisers/VillagerPropertiesDeserialiser.java @@ -1,5 +1,6 @@ package mineplex.gemhunters.shop.deserialisers; +import com.sun.org.apache.xpath.internal.operations.Bool; import mineplex.core.google.SheetObjectDeserialiser; import mineplex.gemhunters.shop.VillagerProperties; @@ -11,13 +12,15 @@ public class VillagerPropertiesDeserialiser implements SheetObjectDeserialiser + { + + if (_status.Get(clicker).getStatusType() == PlayerStatusType.COMBAT || !Recharge.Instance.usable(clicker, "Cash Out")) + { + clicker.sendMessage(F.main(_moduleName, "You can not do this right now.")); + return; + } + + Location toTeleport = getRandomLocation(); + + if (toTeleport == null) + { + clicker.sendMessage(F.main(_moduleName, "A suitable teleport location could not be found. Please try again in a few seconds.")); + return; + } + + clicker.teleport(toTeleport); + }); + } + } } @EventHandler @@ -174,7 +197,7 @@ public class SpawnModule extends MiniPlugin Block up = block.getRelative(BlockFace.UP); Block down = block.getRelative(BlockFace.DOWN); - if (block.getType() != Material.AIR || down.getType() == Material.AIR || UtilBlock.liquid(down) || UtilBlock.liquid(up) || UtilBlock.liquid(block) || _safezone.isInSafeZone(block.getLocation()) || block.getLocation().getBlockY() > MAX_SPAWNING_Y) + if (block.getType() != Material.AIR || down.getType() == Material.AIR || down.getType() == Material.LEAVES || up.getType() == Material.LEAVES || UtilBlock.liquid(down) || UtilBlock.liquid(up) || UtilBlock.liquid(block) || _safezone.isInSafeZone(block.getLocation()) || block.getLocation().getBlockY() > MAX_SPAWNING_Y) { return false; } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java new file mode 100644 index 000000000..923bae01e --- /dev/null +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackRewardBot.java @@ -0,0 +1,50 @@ +package mineplex.gemhunters.util; + +import mineplex.core.Managers; +import mineplex.core.common.util.UtilServer; +import mineplex.core.monitor.LagMeter; +import mineplex.core.slack.SlackAPI; +import mineplex.core.slack.SlackMessage; +import mineplex.core.slack.SlackTeam; +import mineplex.gemhunters.loot.rewards.LootItemReward; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.net.MalformedURLException; +import java.net.URL; +import java.text.DecimalFormat; + +public class SlackRewardBot +{ + + private static final DecimalFormat FORMAT = new DecimalFormat("0.0"); + private static final String SLACK_CHANNEL_NAME = "#gem-hunters-logging"; + private static final String SLACK_USERNAME = "Gem Hunters"; + private static final String SLACK_ICON = "http://moppletop.github.io/mineplex/chest-image.png"; + + private static LagMeter _lag; + + public static void logReward(Player player, LootItemReward reward, String status) + { + if (_lag == null) + { + _lag = Managers.get(LagMeter.class); + } + + try + { + SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, SLACK_CHANNEL_NAME, new SlackMessage(SLACK_USERNAME, new URL(SLACK_ICON), + "Rewarding a " + reward.getClass().getSimpleName() + + "\nName: " + ChatColor.stripColor(reward.getItemStack().getItemMeta().getDisplayName()) + + "\nPlayer: " + player.getName() + + "\nStatus: *" + status + "*" + + "\nServer: " + UtilServer.getServerName() + " " + UtilServer.getRegion().toString() + + "\nTPS: " + FORMAT.format(_lag.getTicksPerSecond())), + true); + } + catch (MalformedURLException e) + { + } + } + +} diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackSheetsBot.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackSheetsBot.java deleted file mode 100644 index 4523e1642..000000000 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/util/SlackSheetsBot.java +++ /dev/null @@ -1,25 +0,0 @@ -package mineplex.gemhunters.util; - -public class SlackSheetsBot -{ - - private static final String SLACK_CHANNEL_NAME = "#google-sheet-errors"; - private static final String SLACK_USERNAME = "Google Sheets"; - private static final String SLACK_ICON = "http://moppletop.github.io/mineplex/google-sheets-image.png"; - - public static final void reportParsingError(Exception exception, String spreadsheetName, String sheetName, int row) - { - String message = "A parsing error has occured on spreadsheet *" + spreadsheetName + "* sheet *" + sheetName + "* at row *" + row + "*.\n Details: " + exception.getMessage(); - - System.out.println(message); -// try -// { -// SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, SLACK_CHANNEL_NAME, new SlackMessage(SLACK_USERNAME, new URL(SLACK_ICON), message), true); -// } -// catch (MalformedURLException e) -// { -// e.printStackTrace(); -// } - } - -} diff --git a/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/GoogleSheetController.java b/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/GoogleSheetController.java index f6244df65..0c96d03b8 100644 --- a/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/GoogleSheetController.java +++ b/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/GoogleSheetController.java @@ -14,11 +14,23 @@ public class GoogleSheetController public static void main(String[] args) throws InterruptedException { + String sheetToRead = System.getProperty("sheet"); + SpreadsheetType[] types; + + if (sheetToRead == null) + { + types = SpreadsheetType.values(); + } + else + { + types = new SpreadsheetType[]{SpreadsheetType.valueOf(sheetToRead)}; + } + System.out.println("Loading Sheet Provider"); SheetProvider provider = new SheetProvider(); System.out.println("Loaded Sheet Provider"); - for (SpreadsheetType type : SpreadsheetType.values()) + for (SpreadsheetType type : types) { System.out.println("Sleeping..."); Thread.sleep(SLEEP_TIME); @@ -28,10 +40,10 @@ public class GoogleSheetController System.out.println("Done"); System.out.println("Saving to file..."); - + File dir = new File(DATA_STORE_DIR); File file = new File(dir + File.separator + type.name() + ".json"); - + if (!dir.exists()) { System.out.println("mkdir"); @@ -44,12 +56,12 @@ public class GoogleSheetController file.delete(); System.out.println("new File"); file.createNewFile(); - + FileWriter writer = new FileWriter(file); System.out.println("Writing"); writer.write(object.toString()); - + System.out.println("Closing..."); writer.close(); } diff --git a/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/SpreadsheetType.java b/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/SpreadsheetType.java index 7c14a68b4..665bf33fd 100644 --- a/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/SpreadsheetType.java +++ b/Plugins/mineplex-google-sheets/src/mineplex/googlesheets/SpreadsheetType.java @@ -8,13 +8,13 @@ public enum SpreadsheetType GEM_HUNTERS_CHESTS("11Noztgbpu_gUKkc5F4evKKfyxS-Jv1coE0IrBToX_gg"), GEM_HUNTERS_SHOP("1OcYktxVZaW6Fm29Zh6w4Lb-UVyuN8r1x-TFb_3USYYI"), - - QUESTS_SHEET("1Gy1a7GCVopmOLwYE3Sk1DNVCAIwT8ReaLu4wRe0sfDE") + QUESTS_SHEET("1Gy1a7GCVopmOLwYE3Sk1DNVCAIwT8ReaLu4wRe0sfDE"), + SMASH_KITS("1Z_SLBzjiIVqu25PMGw9TwNKR3wd9Y9sX7rSDBl_rpxk") ; private String _id; - private SpreadsheetType(String id) + SpreadsheetType(String id) { _id = id; } @@ -23,5 +23,4 @@ public enum SpreadsheetType { return _id; } - -} +} \ No newline at end of file