Merge branch 'feature/quests' of github.com:Mineplex-LLC/Minecraft-PC into feature/quests

This commit is contained in:
Sarah 2017-06-01 20:16:08 +02:00
commit 9bfa586f61
248 changed files with 12257 additions and 2282 deletions

View File

@ -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 <message>") + ".", 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 <message>") + ".", 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 <message>") + ".", 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 <message>") + ".", 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 <message>") + ".", 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 <message>") + ".", 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),

View File

@ -71,6 +71,11 @@ public class ApiHost
return getAPIHost("ENDERCHEST");
}
public static ApiHost getBanner()
{
return getAPIHost("BANNER");
}
private String _host;
private int _port;

View File

@ -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
}
}

View File

@ -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);

View File

@ -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

View File

@ -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 <code>true</code> 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 <code>true</code> 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;

View File

@ -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;

View File

@ -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
*/

View File

@ -56,7 +56,7 @@ public class LineParticle
if (_direction == null)
{
direction = UtilAlg.getTrajectory(start, end).normalize();
_direction = UtilAlg.getTrajectory(start, end).normalize();
}
}

View File

@ -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()
{

View File

@ -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 },

View File

@ -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");

View File

@ -107,6 +107,14 @@ public class AchievementMainPage extends ShopPageBase<AchievementManager, Achiev
Achievement achievement = Achievement.values()[i];
if (achievement.getCategory() == category)
{
if (achievement.hasLevelNames())
{
AchievementData data = getPlugin().get(_targetStats, achievement);
String display = (data.getLevel() == 0 ? achievement.getDefaultLevelName() : achievement.getLevelNames()[data.getLevel() - 1]);
lore.add(C.cGold + achievement.getName() + ": " + display);
achievementCount++;
continue;
}
// Don't display achievements that have multiple levels
if (achievement.getMaxLevel() > 1)
continue;
@ -121,6 +129,8 @@ public class AchievementMainPage extends ShopPageBase<AchievementManager, Achiev
}
if (achievementCount > 0)
{
lore.add(" ");
}
}
}
}

View File

@ -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<AchievementManager, AchievementShop>
{
private static int ACHIEVEMENT_MIDDLE_INDEX = 31;
@ -68,6 +69,7 @@ public class AchievementPage extends ShopPageBase<AchievementManager, Achievemen
{
AchievementData data = getPlugin().get(_targetStats, achievement);
boolean singleLevel = achievement.isSingleLevel();
boolean levelNames = achievement.hasLevelNames();
boolean hasUnlocked = data.getLevel() >= achievement.getMaxLevel();
if (!hasUnlocked)
@ -80,7 +82,16 @@ public class AchievementPage extends ShopPageBase<AchievementManager, Achievemen
String itemName = (hasUnlocked ? C.cGreen : C.cRed) + achievement.getName();
if (!singleLevel)
itemName += ChatColor.WHITE + " Level " + data.getLevel() + "/" + achievement.getMaxLevel();
{
if (!levelNames)
{
itemName += ChatColor.WHITE + " Level " + data.getLevel() + "/" + achievement.getMaxLevel();
}
else
{
itemName += ChatColor.GOLD + " " + (data.getLevel() == 0 ? achievement.getDefaultLevelName() : achievement.getLevelNames()[Math.min(data.getLevel(), achievement.getLevelNames().length) - 1]);
}
}
ArrayList<String> lore = new ArrayList<String>();
lore.add(" ");

View File

@ -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<? extends Check> cause, boolean gep)
public void doBan(Player player, Class<? extends Check> 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<Consumer<PunishmentResponse>> 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,

View File

@ -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())

View File

@ -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()));
}
}
}

View File

@ -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()));
}
}
}

View File

@ -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);

View File

@ -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)
);
}
}

View File

@ -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<Void> insertPunishment(int accountId, String ip, String type)
{
CompletableFuture<Void> 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;
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,7 @@
package mineplex.core.antihack.compedaccount;
public enum PriorityCause
{
JOIN_GAME,
CHAT
}

View File

@ -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;
}
}

View File

@ -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<Donor>
private static final Gson GSON = new Gson();
private final Map<GlobalCurrency, LinkedList<CurrencyRewardData>> _attemptUntilSuccess = new HashMap<>();
private final Map<UUID, Integer> _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<Donor>
_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<Donor>
{
addCommand(new GemCommand(this));
addCommand(new ShardCommand(this));
addCommand(new CrownCommand(this));
}
@EventHandler
@ -75,6 +116,88 @@ public class DonationManager extends MiniClientPlugin<Donor>
{
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<TransactionResponse> 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<TransactionResponse> 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<Donor>
callback.accept(response);
});
}
public void rewardCrowns(int crowns, Player player)
{
rewardCrowns(crowns, player, null);
}
public void rewardCrowns(int crowns, Player player, Consumer<Boolean> 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<Donor>
{
return _clientManager;
}
@EventHandler
public void unloadCrownBalance(ClientUnloadEvent event)
{
_crownBalance.remove(event.getUniqueId());
}
}

View File

@ -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<DonationManager>
{
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 <player> <amount>")));
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()) + "."));
}
});
}
}

View File

@ -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<Boolean> 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<TransactionResponse> 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<Boolean> 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));
}
}
});
}
}

View File

@ -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<FallingBlock> _explosionBlocks = new HashSet<FallingBlock>();
@ -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<FallingBlock> 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)

View File

@ -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));

View File

@ -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?", "Thats 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."},
{"Its 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."},
{"Dont 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."},
{"Its life.", "Its interesting.", "Its 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<UUID, ItemStack> _inventoryItems = new HashMap<>();
private final Map<UUID, Integer> _paintColors = new HashMap<>();
/** Blocks that have been painted */
private final List<PaintedBlock> _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<Hologram> 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);
}
}
}
}

View File

@ -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);

View File

@ -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<Integer> _entityIds = new ArrayList<Integer>();
private ArrayList<Integer> _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<UUID> _playersInList = new HashSet<>();
private ArrayList<Player> _playersTracking = new ArrayList<Player>();
private ArrayList<Player> _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. <br>
*
* <b>Warning! Bounding box if hidden will hide holograms for 1.8 to 1.8.2</b>
*
* @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<Player> getNearbyPlayers() {
ArrayList<Player> nearbyPlayers = new ArrayList<Player>();
/**
* @return A list of players that can currently see the hologram.
*/
protected ArrayList<Player> getNearbyPlayers()
{
ArrayList<Player> 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<Player> getPlayersTracking() {
/**
* @return The list of players that are in the holograms whitelist or blacklist.
*/
protected ArrayList<Player> 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<Player> canSee = getNearbyPlayers();
Iterator<Player> 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<Packet> packets1_8 = new ArrayList<Packet>();
ArrayList<Packet> packets1_8 = new ArrayList<>();
ArrayList<Packet> 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<Packet> 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
}
}

View File

@ -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<Hologram> _activeHolograms = new ArrayList<Hologram>();
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.

View File

@ -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<Enchantment, Integer> _enchantments;
private int _amount;
public EnchantedBookBuilder(int amount)
{
_enchantments = new HashMap<>();
_amount = amount;
}
public Map<Enchantment, Integer> 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;
}
}

View File

@ -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;
}

View File

@ -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<String, String> _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<String, String> statDisplayNames, String[] statNames, LeaderboardSQLType type, Location displayLoc, int size)
{
this(display, statDisplayNames, statNames, type, displayLoc, size, 0);
}
public Leaderboard(String display, Pair<String, String> 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<String, Integer> names)
{
deconstruct();
LinkedList<String> display = new LinkedList<>();
display.add(C.cAqua + _display);
display.add(C.cRed + " ");
int place = _start + 1;
for (Entry<String, Integer> 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;
}
}
}

View File

@ -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<String, Leaderboard> _leaderboards = new HashMap<>();
private final long REFRESH_RATE;
private final LeaderboardRepository _repo;
private final Map<Leaderboard, Runnable> _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<LeaderboardManager>(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<Entry<Leaderboard, Runnable>> iterator = _loading.entrySet().iterator();
while (iterator.hasNext())
{
Entry<Leaderboard, Runnable> 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<Leaderboard> 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<Integer, Map<Integer, Long>> stats)
{
_repo.insertStats(stats);
}
public void handleStatIncrease(int accountId, Map<Integer, Long> 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();
}
}

View File

@ -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<Integer, Map<Integer, Long>> 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<Integer, Long> 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<Map<String, Integer>> leaderboard)
{
Map<String, Integer> 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<Leaderboard> boards, Consumer<Map<String, Integer>[]> leaderboard)
{
UtilServer.runAsync(() ->
{
Map<String, Integer>[] 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();
}
}
}

View File

@ -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<LeaderboardManager>
{
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);
}*/
}
}

View File

@ -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));
}
}

View File

@ -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;
}
}
}

View File

@ -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

View File

@ -30,7 +30,7 @@ public class PreferenceMainMenu extends Menu<PreferencesManager>
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];

View File

@ -296,4 +296,14 @@ public interface ProgressiveKit
ViewDist.NORMAL, displayTo);
}
}
default boolean usesXp()
{
return true;
}
default boolean crownsEnabled()
{
return false;
}
}

View File

@ -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<TransactionResponse> 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);
}
}
}
}

View File

@ -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<String> details)
public KitUpgradeDetailsButton(ProgressiveKit kit, Player player, int level, List<String> 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();

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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<Integer, List<String>> details = getKit().getUpgradeDetails();
int index = 0;
for(int i : UPGRADE_SLOTS)
for (int i : (getKit().usesXp() ? UPGRADE_SLOTS : LEVEL_SLOTS))
{
List<String> 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!");
}

View File

@ -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<Integer, Integer> GEMS_FOR_UPGRADE = Maps.newHashMap();
private static final Map<Integer, Integer> 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);
}
}

View File

@ -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<PlayerStats>
private final CoreClientManager _coreClientManager;
private final StatsRepository _repository;
private final LeaderboardManager _leaderboard;
private final Map<String, Integer> _stats = new HashMap<>();
private final Map<CoreClient, Map<String, Long>> _statUploadQueue = new HashMap<>();
@ -50,11 +52,21 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
_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<PlayerStats>
return stats;
});
}
public void loadStatId(String statName, Consumer<Integer> idConsumer)
{
registerNewStat(statName, () ->
{
final int statId = _stats.get(statName);
runSync(() -> idConsumer.accept(Integer.valueOf(statId)));
});
}
/**
@ -115,6 +137,7 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
*
* @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<PlayerStats>
*
* @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<PlayerStats>
_repository.saveStats(uploadQueue, true);
});
}
@Deprecated
private void addToOverRidableQueue(String statName, CoreClient client, long value)
{
if (client.getAccountId() == -1)

View File

@ -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", "( ͡° ͜ʖ ͡°)"));

View File

@ -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)
)); }
}

View File

@ -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);
}
}
}

View File

@ -13,7 +13,7 @@ public class ClansBanCommand extends CommandBase<ClansBanManager>
{
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

View File

@ -16,7 +16,7 @@ public class FreezeCommand extends CommandBase<ClansBanManager>
{
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<ClansBanManager>
Plugin.freeze(target, caller);
}
}
}
}

View File

@ -16,7 +16,7 @@ public class UnfreezeCommand extends CommandBase<ClansBanManager>
{
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<ClansBanManager>
Plugin.unfreeze(target, caller);
}
}
}
}

View File

@ -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);

View File

@ -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<Block> _ufoBlocks;
private final Set<Block> _beaconBlocks;
private final Set<LivingEntity> _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<AlienInvasion>(this, Rank.ADMIN, "alien-animation-start")
{
@Override
public void Execute(Player caller, String[] args)
{
startAnimation();
}
});
addCommand(new CommandBase<AlienInvasion>(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<Location, Pair<Material, Byte>> 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)]);
}
}

View File

@ -787,6 +787,16 @@ public class ServerManager extends MiniPlugin implements BrawlShopProvider
{
return _statusManager;
}
public ShopBase<ServerManager> getCastleAssaultShop()
{
return _serverNpcShopMap.get("Castle Assault");
}
public ShopBase<ServerManager> getCastleAssaultTDMShop()
{
return _serverNpcShopMap.get("Castle Assault TDM");
}
public ShopBase<ServerManager> getCastleSiegeShop()
{

View File

@ -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<ServerManager, QuickShop>
@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<ServerManager, QuickShop>
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<ServerManager, QuickShop>
{
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)
{

View File

@ -25,7 +25,6 @@ public class ServerNpcShop extends ShopBase<ServerManager>
{
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<ServerManager>
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());
}

View File

@ -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<ServerManager, ServerNpcShop>
{
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();
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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,

View File

@ -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 extends Module> T getModule(Class<T> clazz)

View File

@ -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;
}
}

View File

@ -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<DragonScore> 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<BeamSource> _sources = new ArrayList<>();
private final List<Location> _targets = new ArrayList<>();
private final ArrayList<Location> _path = new ArrayList<>();
private int _lastBeamId;
private long _lastBeam;
private long _nextBeam;
private final List<DragonScore> _score = new ArrayList<>(16);
private final Set<Alien> _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<Location> sources = WorldData.GetDataLocs("LIME");
for (Location location : sources)
{
_sources.add(new BeamSource(location));
}
Location start = WorldData.GetDataLocs("RED").get(0);
Location last = start;
List<Location> targets = WorldData.GetDataLocs("BLACK");
ArrayList<Location> 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<Player, Double> 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<Player> alive = GetPlayers(true);
for (DragonScore score : _score)
{
if (score.Score == _path.size() - 1 || alive.isEmpty())
{
sortScores();
List<Player> 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;
}
}

View File

@ -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<Block> 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;
}
}

View File

@ -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<Beam> _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;
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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[]

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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<Location> _locs;
private Location _lastSpawnLoc;
private Item _entity;
private long _lastPickedUp;
public ObjectiveTNTSpawner(List<Location> 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();
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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<MedalType, Double> _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;
}
}
}

View File

@ -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;
}
}

View File

@ -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) {}
}

View File

@ -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());
}
}
}

View File

@ -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) {}
}

View File

@ -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());
}
}
}

View File

@ -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) {}
}

View File

@ -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());
}
}
}

View File

@ -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) {}
}

View File

@ -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) {}
}

View File

@ -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;
}
}

View File

@ -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());
}
}
}

View File

@ -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) {}
}

View File

@ -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<Player, Integer> _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);
}
}

View File

@ -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[]

View File

@ -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()
};

Some files were not shown because too many files have changed in this diff Show More