Merge branch 'develop' of github.com:Mineplex-LLC/Minecraft-PC into update/skyfall

# Conflicts:
#	Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skyfall/Island.java
This commit is contained in:
Sarah 2017-04-05 04:21:14 +02:00
commit e4b79a3731
186 changed files with 5063 additions and 612 deletions

View File

@ -16,6 +16,7 @@ import java.util.logging.Logger;
import mineplex.bungee.api.ApiDeleteCall; import mineplex.bungee.api.ApiDeleteCall;
import mineplex.bungee.api.ApiGetCall; import mineplex.bungee.api.ApiGetCall;
import mineplex.bungee.api.ApiPostCall; import mineplex.bungee.api.ApiPostCall;
import mineplex.bungee.api.HttpCallBase;
import mineplex.bungee.api.token.ARecord; import mineplex.bungee.api.token.ARecord;
import mineplex.bungee.api.token.DnsRecord; import mineplex.bungee.api.token.DnsRecord;
import mineplex.bungee.api.token.DomainRecords; import mineplex.bungee.api.token.DomainRecords;
@ -24,8 +25,8 @@ import mineplex.serverdata.data.BungeeServer;
import mineplex.serverdata.data.DataRepository; import mineplex.serverdata.data.DataRepository;
import mineplex.serverdata.redis.RedisDataRepository; import mineplex.serverdata.redis.RedisDataRepository;
import mineplex.serverdata.servers.ConnectionData; import mineplex.serverdata.servers.ConnectionData;
import mineplex.serverdata.servers.ConnectionData.ConnectionType;
import mineplex.serverdata.servers.ServerManager; import mineplex.serverdata.servers.ServerManager;
import mineplex.serverdata.servers.ConnectionData.ConnectionType;
public class BungeeRotator public class BungeeRotator
{ {
@ -96,8 +97,7 @@ public class BungeeRotator
_repository = new RedisDataRepository<BungeeServer>(ServerManager.getConnection(true, ServerManager.SERVER_STATUS_LABEL), ServerManager.getConnection(false, ServerManager.SERVER_STATUS_LABEL), _repository = new RedisDataRepository<BungeeServer>(ServerManager.getConnection(true, ServerManager.SERVER_STATUS_LABEL), ServerManager.getConnection(false, ServerManager.SERVER_STATUS_LABEL),
Region.ALL, BungeeServer.class, "bungeeServers"); Region.ALL, BungeeServer.class, "bungeeServers");
// Temporarily reassigning to US Redis IP for EU player redirection testing. 10.81.1.156 -> 10.33.53.16 _secondRepository = new RedisDataRepository<BungeeServer>(new ConnectionData("10.81.1.156", 6379, ConnectionType.MASTER, "ServerStatus"), new ConnectionData("10.81.1.156", 6377, ConnectionType.SLAVE, "ServerStatus"),
_secondRepository = new RedisDataRepository<BungeeServer>(new ConnectionData("10.33.53.16", 6379, ConnectionType.MASTER, "ServerStatus"), new ConnectionData("10.33.53.16", 6377, ConnectionType.SLAVE, "ServerStatus"),
Region.ALL, BungeeServer.class, "bungeeServers"); Region.ALL, BungeeServer.class, "bungeeServers");
//_ipRepository = new PlayerStatsRepository(); //_ipRepository = new PlayerStatsRepository();
@ -110,7 +110,7 @@ public class BungeeRotator
try try
{ {
List<BungeeServer> bungeeServers = new ArrayList<BungeeServer>(_repository.getElements()); List<BungeeServer> bungeeServers = new ArrayList<BungeeServer>(_repository.getElements());
//bungeeServers.addAll(_secondRepository.getElements()); bungeeServers.addAll(_secondRepository.getElements());
Collections.sort(bungeeServers, bungeeSorter); Collections.sort(bungeeServers, bungeeSorter);

View File

@ -1,6 +1,7 @@
package mineplex.cache.player; package mineplex.cache.player;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
import mineplex.serverdata.Region; import mineplex.serverdata.Region;
import mineplex.serverdata.redis.RedisDataRepository; import mineplex.serverdata.redis.RedisDataRepository;
@ -32,7 +33,8 @@ public enum PlayerCache
ServerManager.getMasterConnection(), ServerManager.getMasterConnection(),
ServerManager.getSlaveConnection(), ServerManager.getSlaveConnection(),
Region.ALL, Region.ALL,
"accountid" "accountid",
(int) TimeUnit.HOURS.toSeconds(6)
); );
} }

View File

@ -10,58 +10,61 @@ import mineplex.core.common.util.UtilPlayer;
public enum Rank public enum Rank
{ {
//Staff //Staff
LT("Leader", "lt", ChatColor.DARK_RED, "Leaders manage the operation of their respective team \nor projects. They usually operate on affairs within \nthe staff, development, or management team."), LT("Leader", "lt", ChatColor.DARK_RED, "Leaders manage the operation of their respective team \nor projects. They usually operate on affairs within \nthe staff, development, or management team.", 11),
OWNER("Owner", "owner", ChatColor.DARK_RED, "Owners are the founders of Mineplex. \nEach owner manages a different aspect of the \nserver and ensures its efficient operation."), OWNER("Owner", "owner", ChatColor.DARK_RED, "Owners are the founders of Mineplex. \nEach owner manages a different aspect of the \nserver and ensures its efficient operation.", 55),
DEVELOPER("Dev", "dev", ChatColor.DARK_RED, "Developers work behind the scenes to \ncreate new games and features, and fix bugs to \ngive the best experience."), DEVELOPER("Dev", "dev", ChatColor.DARK_RED, "Developers work behind the scenes to \ncreate new games and features, and fix bugs to \ngive the best experience.", 5),
ADMIN("Admin", "adm", ChatColor.DARK_RED, "An Administrators role is to manage \ntheir respective Senior Moderator team \nand all moderators within it."), ADMIN("Admin", "adm", ChatColor.DARK_RED, "An Administrators role is to manage \ntheir respective Senior Moderator team \nand all moderators within it.", 10),
JNR_DEV("Jr.Dev", "jrdev", ChatColor.GOLD, "Junior Developers work behind the scenes to \ncreate new games and features, and fix bugs to \ngive the best experience."), JNR_DEV("Jr.Dev", "jrdev", ChatColor.GOLD, "Junior Developers work behind the scenes to \ncreate new games and features, and fix bugs to \ngive the best experience.", -1),
SUPPORT("Support", "spp", ChatColor.BLUE, "Support agents handle tickets and \nprovide customer service."), SUPPORT("Support", "spp", ChatColor.BLUE, "Support agents handle tickets and \nprovide customer service.", 47),
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>") + "."), 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),
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>") + "."), 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),
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>") + "."), 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),
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>") + "."), 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),
MAPLEAD("MapLead", "mapl", ChatColor.BLUE, "Map Leaders are leaders of the Mineplex Build Team. \nThey oversee the creation of new maps and manage Builders."), 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),
MAPDEV("Builder", "mapd", ChatColor.BLUE, "Builders are members of the Mineplex Build Team. \nThey create many of the maps used across Mineplex."), MAPDEV("Builder", "mapd", ChatColor.BLUE, "Builders are members of the Mineplex Build Team. \nThey create many of the maps used across Mineplex.", 26),
MEDIA("Media", "media", ChatColor.BLUE, "The Media rank is given to talented artists who are\n endorsed to create content for Mineplex."), MEDIA("Media", "media", ChatColor.BLUE, "The Media rank is given to talented artists who are\n endorsed to create content for Mineplex.", -1),
EVENT("Event", "evnt", ChatColor.WHITE, "A member of the official Mineplex Events team!"), EVENT("Event", "evnt", ChatColor.WHITE, "A member of the official Mineplex Events team!", -1),
//Media //Media
YOUTUBE("YouTube", "yt", ChatColor.RED, "A YouTuber who creates content for \nor related to Mineplex."), YOUTUBE("YouTube", "yt", ChatColor.RED, "A YouTuber who creates content for \nor related to Mineplex.", 22),
YOUTUBE_SMALL("YT", "ytsm", ChatColor.DARK_PURPLE, "A YouTuber who creates content for \nor related to Mineplex. \n\nThey have fewer subscribers than full YouTubers."), YOUTUBE_SMALL("YT", "ytsm", ChatColor.DARK_PURPLE, "A YouTuber who creates content for \nor related to Mineplex. \n\nThey have fewer subscribers than full YouTubers.", 20),
TWITCH("Twitch", "tw", ChatColor.DARK_PURPLE, "A Twitch streamer who often features \nMineplex in their streams."), TWITCH("Twitch", "tw", ChatColor.DARK_PURPLE, "A Twitch streamer who often features \nMineplex in their streams.", 21),
//Player //Player
ETERNAL("Eternal", "et", ChatColor.DARK_AQUA, true, "Fantastic and magical, no one \nexcept the time lords truly understand \nthe power of this rank.\n\nThe fifth purchasable rank at Mineplex.com/shop"), ETERNAL("Eternal", "et", ChatColor.DARK_AQUA, true, "Fantastic and magical, no one \nexcept the time lords truly understand \nthe power of this rank.\n\nThe fifth purchasable rank at Mineplex.com/shop", 18),
TITAN("Titan", "t", ChatColor.RED, true, "Ancient myths spoke of a gigantic being \nwith immense power... \n\nThe fourth purchasable rank at Mineplex.com/shop"), TITAN("Titan", "t", ChatColor.RED, true, "Ancient myths spoke of a gigantic being \nwith immense power... \n\nThe fourth purchasable rank at Mineplex.com/shop", 15),
LEGEND("Legend", "l", ChatColor.GREEN, true, "Years they have told stories of this rank, \nonly for the legends to be true. \n\nThe third purchasable rank at Mineplex.com/shop"), LEGEND("Legend", "l", ChatColor.GREEN, true, "Years they have told stories of this rank, \nonly for the legends to be true. \n\nThe third purchasable rank at Mineplex.com/shop", 14),
HERO("Hero", "h", ChatColor.LIGHT_PURPLE, true, "There are many stories of a \nvaliant Hero who was brave enough to \ntame the most fearsome dragon in the land. \n\nThe second purchasable rank at Mineplex.com/shop"), HERO("Hero", "h", ChatColor.LIGHT_PURPLE, true, "There are many stories of a \nvaliant Hero who was brave enough to \ntame the most fearsome dragon in the land. \n\nThe second purchasable rank at Mineplex.com/shop", 13),
ULTRA("Ultra", "u", ChatColor.AQUA, true, "A first step into the stories of the mist. \nOnly those brave enough may enter. \n\nThe first purchasable rank at Mineplex.com/shop"), ULTRA("Ultra", "u", ChatColor.AQUA, true, "A first step into the stories of the mist. \nOnly those brave enough may enter. \n\nThe first purchasable rank at Mineplex.com/shop", 12),
ALL("", "", ChatColor.WHITE, null); ALL("", "", ChatColor.WHITE, null, -1);
private ChatColor _color; private ChatColor _color;
private boolean _donor; private boolean _donor;
private String _description; private String _description;
private int _forumId;
public String Name; public String Name;
public String ScoreboardTag; public String ScoreboardTag;
Rank(String name, String scoreboardTag, ChatColor color, String description) Rank(String name, String scoreboardTag, ChatColor color, String description, int forumId)
{ {
_color = color; _color = color;
Name = name; Name = name;
_donor = false; _donor = false;
_description = description; _description = description;
ScoreboardTag = scoreboardTag; ScoreboardTag = scoreboardTag;
_forumId = forumId;
} }
Rank(String name, String scoreboardTag, ChatColor color, boolean donor, String description) Rank(String name, String scoreboardTag, ChatColor color, boolean donor, String description, int forumId)
{ {
_color = color; _color = color;
Name = name; Name = name;
_donor = donor; _donor = donor;
_description = description; _description = description;
ScoreboardTag = scoreboardTag; ScoreboardTag = scoreboardTag;
_forumId = forumId;
} }
public String getDescription() public String getDescription()
@ -69,6 +72,11 @@ public enum Rank
return _description; return _description;
} }
public void setName(String name)
{
Name = name;
}
public String getRawTag() public String getRawTag()
{ {
if (Name.equalsIgnoreCase("ALL")) if (Name.equalsIgnoreCase("ALL"))
@ -138,4 +146,9 @@ public enum Rank
{ {
return _donor; return _donor;
} }
public int getForumId()
{
return _forumId;
}
} }

View File

@ -71,6 +71,23 @@ public class ShapeWings extends ShapeGrid implements CosmeticShape
"00000$$0000000$$00000" "00000$$0000000$$00000"
}; };
public static final String[] BEE_WING_PATTERN = new String[]
{
"00$$$000$$$00",
"0$###$0$###$0",
"$$$$$$$$$$$$$",
"$#####$#####$",
"$$$$$$$$$$$$$",
"0$#########$0",
"00$$$$$$$$$00",
"0$#########$0",
"$$$$$$$$$$$$$",
"$#####$#####$",
"$$$$$$$$$$$$$",
"0$###$0$###$0",
"00$$$000$$$00"
};
public static final String[] SMALL_BUTTERFLY_WING_PATTERN = new String[] public static final String[] SMALL_BUTTERFLY_WING_PATTERN = new String[]
{ {
"0$$00000000$$0", "0$$00000000$$0",
@ -111,6 +128,30 @@ public class ShapeWings extends ShapeGrid implements CosmeticShape
"000000$000000" "000000$000000"
}; };
public static final String[] FOUR_LEAF_CLOVER = new String[]
{
"$$$$$$$$###$$$$$$$",
"$$$$$$##***#$$$$$$",
"$$$$##****%#$$$$$$",
"$$$#******%#$###$$",
"$$$#***%#%%##***#$",
"$$$$#**%#%#*****#$",
"$$$####*%%#*%%**#$",
"$##***#*%#**##**##",
"#***%%*###******%#",
"#**%##*%###%%%%%%#",
"#**#**%%#**######$",
"$#****%#*****#$$$$",
"$$#*%%%#******#$$$",
"$$#####**%#****#$$",
"$$$$$##**%#***%#$$",
"$$$$$###****%%%#$$",
"$$$$##$#%%%%%##$$$",
"$$$##$$$#####$$$$$",
"$###$$$$$$$$$$$$$$",
"$##$$$$$$$$$$$$$$$"
};
/** /**
* Default rotation to give the wings a little tilt when displayed on players for instance * Default rotation to give the wings a little tilt when displayed on players for instance

View File

@ -64,6 +64,7 @@ public class SkinData
public final static SkinData TURKEY = new SkinData("eyJ0aW1lc3RhbXAiOjE0NzU3NzM2MTc5MDQsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xYzdmYjczMTRkNmY1ZTMzNmVjN2ViNTI1ZGM0ODMzOWNhMjI4ZDk3ODU1MDM3ZDZhNDIwOGZjNzYwNDc1NiJ9fX0=", "eZWi1LOD8ke7MCUAfhspBCnyfCoGM8suFLKtbW6b27CURoRBG3eKIfwLYYeMp3ObjoZ8gCB90s28Qyw5XMzwvvowy9W/b5cYC0OzQ8+GR7tDZoWc28tGqGBM8cmDJIFQgZdceBIIr2lXeAvEJfLbyrus46hPjk8YTiQW2DsBq88BhKIy6Igb1rGqJ1goVERF07b6+/yMdLKCaT8OZFzKLXfo5rY5gr6HLnvsQiNL9aTrl74agXn1GUcP+QVNe7/c9lYmv5vLCBst1YiIPq27NZASZ++Fwyv6+PRlaFZZYtMHVd4UZeYPl7ak1Cdi/1sUcRpkBbJM8AHIrqq0iuXxrLbc6ldQ2cYQKHg9ljIpW/EZanuf6Wgm/LK1JnxXne9GUb/xPzB1EnZ95i8/u9WJa+NixEcfc3pAzDPYncIR8lishFwyBRta6BCG76U3UY2lQr3YD/48AJ49r7+WVU0gOP/h2SDSdAZHEdvkpVJ0w/xA+SevJ7Y7xA5EJ655YMQ0F8f3WUFTf1pFklE5E+fwkMVCWOPw7UMy558IcRSpdWAPPyf8sc7CpDqRk37/vXWRDa+7YBfgskK6B2eXowrzThUOBx+AmDTF3Rv8ZSr1Un0FWGi+GQ5ny7W9dJBMomzyMUbzz9stsCml5XB+6xLP2MD+9lO1bHipKS6qkhtZChE="); public final static SkinData TURKEY = new SkinData("eyJ0aW1lc3RhbXAiOjE0NzU3NzM2MTc5MDQsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xYzdmYjczMTRkNmY1ZTMzNmVjN2ViNTI1ZGM0ODMzOWNhMjI4ZDk3ODU1MDM3ZDZhNDIwOGZjNzYwNDc1NiJ9fX0=", "eZWi1LOD8ke7MCUAfhspBCnyfCoGM8suFLKtbW6b27CURoRBG3eKIfwLYYeMp3ObjoZ8gCB90s28Qyw5XMzwvvowy9W/b5cYC0OzQ8+GR7tDZoWc28tGqGBM8cmDJIFQgZdceBIIr2lXeAvEJfLbyrus46hPjk8YTiQW2DsBq88BhKIy6Igb1rGqJ1goVERF07b6+/yMdLKCaT8OZFzKLXfo5rY5gr6HLnvsQiNL9aTrl74agXn1GUcP+QVNe7/c9lYmv5vLCBst1YiIPq27NZASZ++Fwyv6+PRlaFZZYtMHVd4UZeYPl7ak1Cdi/1sUcRpkBbJM8AHIrqq0iuXxrLbc6ldQ2cYQKHg9ljIpW/EZanuf6Wgm/LK1JnxXne9GUb/xPzB1EnZ95i8/u9WJa+NixEcfc3pAzDPYncIR8lishFwyBRta6BCG76U3UY2lQr3YD/48AJ49r7+WVU0gOP/h2SDSdAZHEdvkpVJ0w/xA+SevJ7Y7xA5EJ655YMQ0F8f3WUFTf1pFklE5E+fwkMVCWOPw7UMy558IcRSpdWAPPyf8sc7CpDqRk37/vXWRDa+7YBfgskK6B2eXowrzThUOBx+AmDTF3Rv8ZSr1Un0FWGi+GQ5ny7W9dJBMomzyMUbzz9stsCml5XB+6xLP2MD+9lO1bHipKS6qkhtZChE=");
public final static SkinData GINGERBREAD = new SkinData("eyJ0aW1lc3RhbXAiOjE0ODAxOTk5MjM0NTUsInByb2ZpbGVJZCI6IjRjOGQ1NjllZWZlMTRkOGE4YzJmMmM4ODA3ODA3ODRmIiwicHJvZmlsZU5hbWUiOiJHaW5nZXJicmVhZE1hbiIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzAyM2IxZGQ5MWQyYjM2Y2FkZTU2NjVjM2Y3ODk3ZmNiOGRlMWFlNjE5YTRlOTYxODU2MzdiMTliZGNmZjQ3In19fQ==", "lND5lQCzd5DKdn+ps82zn55hrSDr12bBLFoSbxetOj7MaYAuHCkJPQQOXdcMh3TLLSgxmQzEWkIHSUo760/2Qfd2uDDOTVfZZqiFjiOwDQ7YQjkokqNaC3U9gEq+LBJ+IgEkwaCsluXYMIK0Wvqx1DFa82pg8bSYGczJfTw/1kQsUUTpmao6ChZw3yrHTPow38onD95f9i6yVcnhSpPfM/JTQuL4N6Jdcql6VRJNSvCHJvEgh6R2p0w7DJhEGIzkFaF3lPdBqw+Mm97fBPvznscd4s6gpH07gUl/T+vlyHyRBLm85Pgm70r4MQ+c/nGOQOXzFMNpO8RIot/uhd7t3bvSi6yFzZQm7P9QLCLm/0C84x0sCugjeN/hVA347FWnuRPcya5xPzlpTWAW7pCjheAz0mvnPUMYT6Wp4CJx6bPdePnaiLFSeK8EyQIU9IUQJgXqMA3cOwqMBdh/0r71fTInPdgXsVxabmGbCgIuK3A2hSgxpcZv9412T0NIJYSTi0s2B3dyAaZJrdF5wa1hIr8au63SWFJww3GEEOF5YObEyVvKj2yS40iaHaRrfn1DeALT0eD0oN1zzK66FKbFuDmZmm4Thel9gKt+QcnR2uHlFLEBUogpIXyeC8zca7SOppANloOpO4mBbf22dXBJogenVd425JWaXOHJ6NVqIBw="); public final static SkinData GINGERBREAD = new SkinData("eyJ0aW1lc3RhbXAiOjE0ODAxOTk5MjM0NTUsInByb2ZpbGVJZCI6IjRjOGQ1NjllZWZlMTRkOGE4YzJmMmM4ODA3ODA3ODRmIiwicHJvZmlsZU5hbWUiOiJHaW5nZXJicmVhZE1hbiIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzAyM2IxZGQ5MWQyYjM2Y2FkZTU2NjVjM2Y3ODk3ZmNiOGRlMWFlNjE5YTRlOTYxODU2MzdiMTliZGNmZjQ3In19fQ==", "lND5lQCzd5DKdn+ps82zn55hrSDr12bBLFoSbxetOj7MaYAuHCkJPQQOXdcMh3TLLSgxmQzEWkIHSUo760/2Qfd2uDDOTVfZZqiFjiOwDQ7YQjkokqNaC3U9gEq+LBJ+IgEkwaCsluXYMIK0Wvqx1DFa82pg8bSYGczJfTw/1kQsUUTpmao6ChZw3yrHTPow38onD95f9i6yVcnhSpPfM/JTQuL4N6Jdcql6VRJNSvCHJvEgh6R2p0w7DJhEGIzkFaF3lPdBqw+Mm97fBPvznscd4s6gpH07gUl/T+vlyHyRBLm85Pgm70r4MQ+c/nGOQOXzFMNpO8RIot/uhd7t3bvSi6yFzZQm7P9QLCLm/0C84x0sCugjeN/hVA347FWnuRPcya5xPzlpTWAW7pCjheAz0mvnPUMYT6Wp4CJx6bPdePnaiLFSeK8EyQIU9IUQJgXqMA3cOwqMBdh/0r71fTInPdgXsVxabmGbCgIuK3A2hSgxpcZv9412T0NIJYSTi0s2B3dyAaZJrdF5wa1hIr8au63SWFJww3GEEOF5YObEyVvKj2yS40iaHaRrfn1DeALT0eD0oN1zzK66FKbFuDmZmm4Thel9gKt+QcnR2uHlFLEBUogpIXyeC8zca7SOppANloOpO4mBbf22dXBJogenVd425JWaXOHJ6NVqIBw=");
public final static SkinData LOVE_DOCTOR = new SkinData("eyJ0aW1lc3RhbXAiOjE0ODQ0MzM1MjQxMjAsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iY2RiZTM2OTM1NGZjMzUxY2RhNGRmY2Y2OWM0MzY3ODcwYjI4ZWE3NDUzYWVjM2IzMjgyM2YyMWMzNTJlNTUifX19", "KD0NsKFlS+9/JpPQdT0Lq2jo942WeHpFevJPR3T9JO/5NVmNprupsWuTgepw14iHoax8/xyP8S4XksYq8hJ30e+gRKXVReqtq4l8JetXJILI7JTL6EHj/Flg4t0O6ASIm3Hr+w86IKrPb0NwHTjHJHvbf0r7k3E/TMLbq0/c7Xgi+JgC0uQd+wIPZhQe92P3O7eGH858X0vsxG0FVzgnEAlHVLmqBCwqxMU5CsBp0JCTVIbtp+JNmveCsfLagP6mi39rUudbueXJQgqLv7H7Zw+ZNINLLaKPNVO6Od8sX3c+CSUQ+Bm9bakYr628k/z0krTdNpLG7OGXWoT3XShW6HXB/z7o7hpuDXJW7HdyvmWv9GVyWLm2USNe7/3Ugs2zWZI1f+t6t+V3EVr3T+nR4zpY/ISdlTsLtV/Daebr0v/V0YlaM0UaASzz16ob3p1cfao7C7BZwKqOBKoSyHpnuLhd70wOtNrhhPDU9dWQBC/l6uojcMJ9lQMsxFmHj4JFqJYl7p/UXnq1vnYBo1P3A//IGl4gL1Hv8U0I14LT77/AMYH57mItgD0/VnE4bvPIFML/4cX7L9qpdLoOAAyfa5P9cAfzhUnVnRRLM016MpGtvY8SfbZ68Of1Xjz/dZ9/fBEcObXPHGX2QNuJRFiWJjRVKjO7ok0qfiVUEmuZr6I="); public final static SkinData LOVE_DOCTOR = new SkinData("eyJ0aW1lc3RhbXAiOjE0ODQ0MzM1MjQxMjAsInByb2ZpbGVJZCI6IjlmY2FlZDhiMTRiNTRmN2ZhNjRjYjYwNDBlNzA1MjcyIiwicHJvZmlsZU5hbWUiOiJMQ2FzdHIxIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iY2RiZTM2OTM1NGZjMzUxY2RhNGRmY2Y2OWM0MzY3ODcwYjI4ZWE3NDUzYWVjM2IzMjgyM2YyMWMzNTJlNTUifX19", "KD0NsKFlS+9/JpPQdT0Lq2jo942WeHpFevJPR3T9JO/5NVmNprupsWuTgepw14iHoax8/xyP8S4XksYq8hJ30e+gRKXVReqtq4l8JetXJILI7JTL6EHj/Flg4t0O6ASIm3Hr+w86IKrPb0NwHTjHJHvbf0r7k3E/TMLbq0/c7Xgi+JgC0uQd+wIPZhQe92P3O7eGH858X0vsxG0FVzgnEAlHVLmqBCwqxMU5CsBp0JCTVIbtp+JNmveCsfLagP6mi39rUudbueXJQgqLv7H7Zw+ZNINLLaKPNVO6Od8sX3c+CSUQ+Bm9bakYr628k/z0krTdNpLG7OGXWoT3XShW6HXB/z7o7hpuDXJW7HdyvmWv9GVyWLm2USNe7/3Ugs2zWZI1f+t6t+V3EVr3T+nR4zpY/ISdlTsLtV/Daebr0v/V0YlaM0UaASzz16ob3p1cfao7C7BZwKqOBKoSyHpnuLhd70wOtNrhhPDU9dWQBC/l6uojcMJ9lQMsxFmHj4JFqJYl7p/UXnq1vnYBo1P3A//IGl4gL1Hv8U0I14LT77/AMYH57mItgD0/VnE4bvPIFML/4cX7L9qpdLoOAAyfa5P9cAfzhUnVnRRLM016MpGtvY8SfbZ68Of1Xjz/dZ9/fBEcObXPHGX2QNuJRFiWJjRVKjO7ok0qfiVUEmuZr6I=");
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=");
// Comments this out for now, so it doesn't load the player profile // 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 // A better way to do this would check for the properties when getting the skull or the skin

View File

@ -312,38 +312,19 @@ public class UtilEnt
public static void removeGoalSelectors(Entity entity) public static void removeGoalSelectors(Entity entity)
{ {
try
{
if (_goalSelector == null)
{
_goalSelector = EntityInsentient.class.getDeclaredField("goalSelector");
_goalSelector.setAccessible(true);
}
if (((CraftEntity)entity).getHandle() instanceof EntityInsentient) if (((CraftEntity)entity).getHandle() instanceof EntityInsentient)
{ {
EntityInsentient creature = (EntityInsentient)((CraftEntity)entity).getHandle(); EntityInsentient creature = (EntityInsentient)((CraftEntity)entity).getHandle();
creature.goalSelector = new PathfinderGoalSelector(((CraftWorld)entity.getWorld()).getHandle().methodProfiler);
}
}
PathfinderGoalSelector goalSelector = new PathfinderGoalSelector(((CraftWorld)entity.getWorld()).getHandle().methodProfiler); public static void removeTargetSelectors(Entity entity)
_goalSelector.set(creature, goalSelector);
}
}
catch (IllegalArgumentException e)
{ {
e.printStackTrace(); if (((CraftEntity)entity).getHandle() instanceof EntityInsentient)
}
catch (IllegalAccessException e)
{ {
e.printStackTrace(); EntityInsentient creature = (EntityInsentient)((CraftEntity)entity).getHandle();
} creature.targetSelector = new PathfinderGoalSelector(((CraftWorld)entity.getWorld()).getHandle().methodProfiler);
catch (NoSuchFieldException e)
{
e.printStackTrace();
}
catch (SecurityException e)
{
e.printStackTrace();
} }
} }

View File

@ -208,11 +208,6 @@ public class UtilServer
} }
} }
public static String getWebServerURL()
{
return getPlugin().getConfig().getString(Constants.WEB_CONFIG_KEY);
}
public static BukkitTask runAsync(Runnable runnable) public static BukkitTask runAsync(Runnable runnable)
{ {
return getPlugin().getServer().getScheduler().runTaskAsynchronously(getPlugin(), runnable); return getPlugin().getServer().getScheduler().runTaskAsynchronously(getPlugin(), runnable);

View File

@ -36,6 +36,7 @@ import mineplex.core.account.command.TestRank;
import mineplex.core.account.command.UpdateRank; import mineplex.core.account.command.UpdateRank;
import mineplex.core.account.event.ClientUnloadEvent; import mineplex.core.account.event.ClientUnloadEvent;
import mineplex.core.account.event.ClientWebResponseEvent; import mineplex.core.account.event.ClientWebResponseEvent;
import mineplex.core.account.event.RankSaveEvent;
import mineplex.core.account.repository.AccountRepository; import mineplex.core.account.repository.AccountRepository;
import mineplex.core.account.repository.token.ClientToken; import mineplex.core.account.repository.token.ClientToken;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
@ -43,6 +44,7 @@ import mineplex.core.common.timing.TimingManager;
import mineplex.core.common.util.Callback; import mineplex.core.common.util.Callback;
import mineplex.core.common.util.UUIDFetcher; import mineplex.core.common.util.UUIDFetcher;
import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTasks; import mineplex.core.common.util.UtilTasks;
import mineplex.core.updater.UpdateType; import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.event.UpdateEvent;
@ -552,6 +554,7 @@ public class CoreClientManager extends MiniPlugin
client.SetRank(newRank, false); client.SetRank(newRank, false);
} }
UtilServer.CallEvent(new RankSaveEvent(uuid, newRank));
} }
}, name, uuid, rank, perm); }, name, uuid, rank, perm);
} }
@ -571,6 +574,8 @@ public class CoreClientManager extends MiniPlugin
if (callback != null) if (callback != null)
callback.run(newRank); callback.run(newRank);
UtilServer.CallEvent(new RankSaveEvent(uuid, newRank));
} }
}, name, uuid, rank, perm); }, name, uuid, rank, perm);
} }

View File

@ -0,0 +1,42 @@
package mineplex.core.account.event;
import java.util.UUID;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import mineplex.core.common.Rank;
public class RankSaveEvent extends Event
{
private static final HandlerList handlers = new HandlerList();
private UUID _uuid;
private Rank _rank;
public RankSaveEvent(UUID uuid, Rank rank)
{
_uuid = uuid;
_rank = rank;
}
public UUID getUUID()
{
return _uuid;
}
public Rank getRank()
{
return _rank;
}
public HandlerList getHandlers()
{
return handlers;
}
public static HandlerList getHandlerList()
{
return handlers;
}
}

View File

@ -16,6 +16,7 @@ import com.google.gson.reflect.TypeToken;
import mineplex.cache.player.PlayerCache; import mineplex.cache.player.PlayerCache;
import mineplex.core.account.ILoginProcessor; import mineplex.core.account.ILoginProcessor;
import mineplex.core.account.event.RankSaveEvent;
import mineplex.core.account.repository.token.LoginToken; import mineplex.core.account.repository.token.LoginToken;
import mineplex.core.account.repository.token.RankUpdateToken; import mineplex.core.account.repository.token.RankUpdateToken;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
@ -204,6 +205,8 @@ public class AccountRepository extends MinecraftRepository
{ {
if (callback != null) if (callback != null)
callback.run(response); callback.run(response);
UtilServer.CallEvent(new RankSaveEvent(uuid, rank));
}); });
}; };

View File

@ -449,7 +449,7 @@ public enum Achievement
CHAMPIONS_SPECIAL_WIN("Champion of Champions", 3000, CHAMPIONS_SPECIAL_WIN("Champion of Champions", 3000,
new String[]{"Champions CTF.SpecialWin"}, new String[]{"Champions CTF.SpecialWin"},
new String[]{"Win the game with 5 more captures than the other team"}, new String[]{"Win the game with 5 more flag captures than the other team"},
new int[]{1}, new int[]{1},
AchievementCategory.CHAMPIONS), AchievementCategory.CHAMPIONS),

View File

@ -112,7 +112,7 @@ public enum AchievementCategory
DRAW_MY_THING("Draw My Thing", null, DRAW_MY_THING("Draw My Thing", null,
new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED }, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED },
Material.BOOK_AND_QUILL, 0, GameCategory.CLASSICS, "Extra Tools Kit", false, GameDisplay.Draw.getGameId()), Material.BOOK_AND_QUILL, 0, GameCategory.CLASSICS, "None", false, GameDisplay.Draw.getGameId()),
CHAMPIONS("Champions", new String[] {"Champions Domination", "Champions TDM", "Champions CTF"}, CHAMPIONS("Champions", new String[] {"Champions Domination", "Champions TDM", "Champions CTF"},
new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED, new StatDisplay("Flags Captured", "Captures") }, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED, new StatDisplay("Flags Captured", "Captures") },

View File

@ -1,203 +1,254 @@
package mineplex.core.aprilfools; package mineplex.core.aprilfools;
import java.util.Calendar; import com.google.common.collect.ImmutableMap;
import mineplex.core.MiniPlugin;
import org.bukkit.Sound; import mineplex.core.aprilfools.command.PirateSongCommand;
import org.bukkit.entity.Player; import mineplex.core.common.Rank;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.twofactor.TwoFactorAuth;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.MiniPlugin; import java.util.Map;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.disguise.DisguiseManager;
import mineplex.core.disguise.disguises.DisguiseCow;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class AprilFoolsManager extends MiniPlugin public class AprilFoolsManager extends MiniPlugin
{ {
public static AprilFoolsManager Instance;
/**
* Manually can be toggled to enable or disable the April Fools activities.
*/
private static final boolean ENABLED = false;
private static final Map<String, String> CHAT_REPLACEMENTS = ImmutableMap.<String, String>builder()
.put("you", "ye")
.put("yes", "aye")
.put("hello", "ahoy")
.put("hey", "ahoy")
.put("hi", "ahoy")
.put("friend", "matey")
.put("friends", "mateys")
.put("chest", "booty")
.put("chests", "booty")
.put("treasure", "booty")
.put("shards", "riches")
.put("sword", "cutlass")
.put("my", "me")
.put("gold", "dubloon")
.put("dog", "seadog")
.put("die", "walk the plank")
.put("kill", "keelhaul")
.put("boat", "ship")
.put("drink", "grog")
.put("water", "grog")
.put("dirt", "flith")
.put("flag", "jolly roger")
.put("am", "be")
.put("are", "be")
.put("your", "yer")
.put("girl", "lass")
.put("woman", "lass")
.put("hell", "davy jones' locker")
.put("nether", "davy jones' locker")
.put("of", "o'")
.put("reward", "bounty")
.put("prize", "bounty")
.put("shoot", "fire in the hole")
.put("clumsy", "landlubber")
.put("clean", "swab")
.put("look", "avast ye")
.put("omg", "shiver my timbers")
.put("wood", "timber")
.put("trash", "poop deck")
.put("noob", "shark bait")
.put("hack", "scurvy")
.put("hacks", "scurvy")
.put("hax", "scurvy")
.put("haks", "scurvy")
.put("hacker", "scurvy")
.put("owner", "captain")
.put("leader", "captain")
.put("lt", "captain")
.put("dev", "firstmate")
.put("developer", "firstmate")
.put("admin", "firstmate")
.build();
private static final Map<Rank, String> RANK_REPLACEMENTS = ImmutableMap.<Rank, String>builder()
.put(Rank.ETERNAL, "Captain")
.put(Rank.TITAN, "FirstMate")
.put(Rank.LEGEND, "Boatswain")
.put(Rank.HERO, "Gunner")
.put(Rank.ULTRA, "Parrot")
.build();
private static AprilFoolsManager _instance;
private final AprilFoolsRepository _repository;
private final TwoFactorAuth _twoFA;
private boolean _enabled; private boolean _enabled;
private DisguiseManager _disguiseManager; private boolean _enabledTitle;
private CoreClientManager _clientManager;
protected AprilFoolsManager(JavaPlugin plugin, CoreClientManager clientManager, DisguiseManager disguiseManager) public AprilFoolsManager()
{ {
super("April Fools", plugin); super("April Fools");
_disguiseManager = disguiseManager; _instance = this;
_clientManager = clientManager; _repository = new AprilFoolsRepository();
_twoFA = require(TwoFactorAuth.class);
setEnabled(true);
_enabledTitle = UtilServer.isHubServer() || UtilServer.isTestServer();
Calendar c = Calendar.getInstance(); if (_enabled)
_enabled = (c.get(Calendar.MONTH) == Calendar.APRIL && c.get(Calendar.DAY_OF_MONTH) == 1); {
for (Map.Entry<Rank, String> entry : RANK_REPLACEMENTS.entrySet())
{
entry.getKey().setName(entry.getValue());
}
}
} }
public static void Initialize(JavaPlugin plugin, CoreClientManager clientManager, DisguiseManager disguiseManager) @Override
public void addCommands()
{ {
Instance = new AprilFoolsManager(plugin, clientManager, disguiseManager); addCommand(new PirateSongCommand(this));
} }
@EventHandler @EventHandler(priority = EventPriority.LOWEST)
public void updateEnabled(UpdateEvent event) public void chat(AsyncPlayerChatEvent event)
{
if (!_enabled || _twoFA.isAuthenticating(event.getPlayer()))
{ {
if (event.getType() != UpdateType.SLOW)
return; return;
Calendar c = Calendar.getInstance();
_enabled = (c.get(Calendar.MONTH) == Calendar.APRIL && c.get(Calendar.DAY_OF_MONTH) == 1);
} }
@EventHandler(priority = EventPriority.LOW) String message = event.getMessage();
public void chatAdd(AsyncPlayerChatEvent event) String pirateMessage = "";
for (String word : message.split(" "))
{ {
if (!_enabled) String wordLower = word.toLowerCase();
return; wordLower = wordLower.replaceAll("[^a-zA-Z0-9]", "");
String[] words = event.getMessage().split(" "); if (CHAT_REPLACEMENTS.containsKey(wordLower))
String out = "";
for (String word : words)
{ {
//Prefix String pirateWord = CHAT_REPLACEMENTS.get(wordLower);
if (Math.random() > 0.85) char[] chars = pirateWord.toCharArray();
if (Character.isUpperCase(word.charAt(0)))
{ {
out += "moo"; chars[0] = Character.toUpperCase(chars[0]);
for (int i=0 ; i<UtilMath.r(2) ; i++)
out += "o";
out += " " + word + " ";
} }
//Suffix pirateWord = String.valueOf(chars);
else if (Math.random() > 0.85) pirateMessage += pirateWord + " ";
{
out += word + " ";
out += "moo";
for (int i=0 ; i<UtilMath.r(2) ; i++)
out += "o";
out += " ";
}
//Swap
else if (Math.random() > 0.99)
{
out += "moo";
for (int i=3 ; i<word.length() ; i++)
out += "o";
out += " ";
} }
else else
{ {
out += word + " "; if (wordLower.length() > 1 && wordLower.charAt(wordLower.length() - 1) == 'g')
}
}
event.setMessage(out);
}
@EventHandler
public void updateText(UpdateEvent event)
{ {
if (!_enabled) int g = word.lastIndexOf('g');
return; char[] chars = word.toCharArray();
if (event.getType() != UpdateType.SLOW) chars[g] = '\'';
return;
if (Math.random() <= 0.99) word = String.valueOf(chars);
return;
UtilTextMiddle.display("Moo", null, 5, 20, 5);
} }
@EventHandler pirateMessage += word + " ";
public void updateCow(UpdateEvent event)
{
if (!_enabled)
return;
if (event.getType() != UpdateType.FAST)
return;
//Disguise
for (Player player : UtilServer.getPlayers())
{
if (_disguiseManager.getDisguise(player) != null)
{
//Moo
if (Math.random() > 0.8)
{
if (_disguiseManager.getDisguise(player) instanceof DisguiseCow)
{
player.getWorld().playSound(player.getLocation(), Sound.COW_IDLE, (float)Math.random() + 0.5f, (float)Math.random() + 0.5f);
} }
} }
continue; double random = Math.random();
}
//Disguise if (random > 0.85)
DisguiseCow disguise = new DisguiseCow(player); {
disguise.setName(getName(player), _clientManager.Get(player).GetRank()); pirateMessage += "matey!";
disguise.setCustomNameVisible(true);
_disguiseManager.disguise(disguise);
}
} }
else if (random > 0.7)
{
String ar = "ar";
public boolean isActive() for (int i = 0; i < 10; i++)
{ {
return _enabled; if (Math.random() > 0.75)
}
public String getName(Player player)
{
//Name
int index = 0;
boolean hitVowel = false;
for (int i=0 ; i<player.getName().length()-2 && i<5 ; i++)
{
//Detect vowel ;o
if (player.getName().toLowerCase().charAt(i) == 'a' ||
player.getName().toLowerCase().charAt(i) == 'e' ||
player.getName().toLowerCase().charAt(i) == 'i' ||
player.getName().toLowerCase().charAt(i) == 'o' ||
player.getName().toLowerCase().charAt(i) == 'u')
{
hitVowel = true;
}
//Post vowel consonant - stop here
else if (hitVowel)
{ {
break; break;
} }
index = i+1; ar += "r";
} }
String name = "Moo" + player.getName().substring(index, player.getName().length()); pirateMessage += "a" + ar + "gh";
if (name.length() > 16)
name = name.substring(0, 16);
return name;
} }
else if (random > 0.55)
public void setEnabled(boolean b)
{ {
Calendar c = Calendar.getInstance(); pirateMessage += "scallywag";
_enabled = b && (c.get(Calendar.MONTH) == Calendar.APRIL && c.get(Calendar.DAY_OF_MONTH) == 1); }
event.setMessage(pirateMessage.trim());
}
@EventHandler
public void updateRandomMessage(UpdateEvent event)
{
if (!_enabled || !_enabledTitle || event.getType() != UpdateType.SLOW)
{
return;
}
String message = null;
double random = Math.random();
if (random > 0.99)
{
message = "Aye Aye Captain!";
}
else if (random > 0.98)
{
message = "Arggggggh";
}
else if (random > 0.97)
{
message = "Mateyy!";
}
else if (random > 0.96)
{
message = "Shiver me timbers!";
}
if (message == null)
{
return;
}
UtilTextMiddle.display("", message, 10, 40, 10);
}
public AprilFoolsRepository getRepository()
{
return _repository;
}
public void setEnabled(boolean enabled)
{
_enabled = ENABLED && enabled;
}
public boolean isEnabled()
{
return _enabled;
}
public static AprilFoolsManager getInstance()
{
if (_instance == null)
{
_instance = new AprilFoolsManager();
}
return _instance;
} }
} }

View File

@ -0,0 +1,48 @@
package mineplex.core.aprilfools;
import mineplex.core.account.CoreClient;
import mineplex.serverdata.database.DBPool;
import mineplex.serverdata.database.RepositoryBase;
import mineplex.serverdata.database.column.ColumnInt;
import mineplex.serverdata.database.column.ColumnVarChar;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class AprilFoolsRepository extends RepositoryBase
{
private static final String GET_TREASURE = "SELECT * FROM aprilFoolsTreasure WHERE accountId=?;";
private static final String INSERT_TREASURE = "INSERT INTO aprilFoolsTreasure VALUES (?,?);";
public AprilFoolsRepository()
{
super(DBPool.getAccount());
}
public void getTreasure(Consumer<List<Integer>> response, CoreClient client)
{
executeQuery(GET_TREASURE, resultSet ->
{
List<Integer> found = new ArrayList<>();
while (resultSet.next())
{
found.add(resultSet.getInt("treasureId"));
}
response.accept(found);
}, new ColumnInt("accountId", client.getAccountId()));
}
public void saveTreasure(CoreClient client, int treasureId)
{
int accountId = client.getAccountId();
executeInsert(INSERT_TREASURE, null,
new ColumnInt("accountId", accountId),
new ColumnInt("treasureId", treasureId)
);
}
}

View File

@ -0,0 +1,48 @@
package mineplex.core.aprilfools.command;
import mineplex.core.aprilfools.AprilFoolsManager;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.UtilTextMiddle;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
public class PirateSongCommand extends CommandBase<AprilFoolsManager>
{
private static final String[] PIRATE_SONG = {
"Are you ready kids?",
"Aye aye captain!",
"I can't hear you!",
"AYE AYE CAPTAIN!",
"OOOOOOOOOOOOH",
"Who lives in a pineapple under the sea?",
"Spongebob Squarepants!"
};
public PirateSongCommand(AprilFoolsManager plugin)
{
super(plugin, Rank.ADMIN, "piratesong");
}
@Override
public void Execute(Player caller, String[] args)
{
Plugin.runSyncTimer(new BukkitRunnable()
{
int index = 0;
@Override
public void run()
{
if (index == PIRATE_SONG.length)
{
cancel();
return;
}
UtilTextMiddle.display("", PIRATE_SONG[index++], 10, 60, 10);
}
}, 20, 100);
}
}

View File

@ -190,6 +190,7 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
{ {
_youtubers.add(Pair.create("Sigils", "https://www.youtube.com/user/SigilsPlaysGames?sub_confirmation=1")); _youtubers.add(Pair.create("Sigils", "https://www.youtube.com/user/SigilsPlaysGames?sub_confirmation=1"));
_youtubers.add(Pair.create("SallyGreenGamer", "https://www.youtube.com/channel/UCt8eypdLUND5CBvgXzEZrxw?sub_confirmation=1")); _youtubers.add(Pair.create("SallyGreenGamer", "https://www.youtube.com/channel/UCt8eypdLUND5CBvgXzEZrxw?sub_confirmation=1"));
_youtubers.add(Pair.create("RustyDawgT", "https://www.youtube.com/user/RustyDawgT?sub_confirmation=1"));
} }
_youtubers.add(Pair.create("SamitoD", "https://www.youtube.com/user/SamitoD?sub_confirmation=1")); _youtubers.add(Pair.create("SamitoD", "https://www.youtube.com/user/SamitoD?sub_confirmation=1"));
@ -248,6 +249,7 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
{ {
_youtubers.add(Pair.create("Sigils", "https://www.youtube.com/user/SigilsPlaysGames?sub_confirmation=1")); _youtubers.add(Pair.create("Sigils", "https://www.youtube.com/user/SigilsPlaysGames?sub_confirmation=1"));
_youtubers.add(Pair.create("SallyGreenGamer", "https://www.youtube.com/channel/UCt8eypdLUND5CBvgXzEZrxw?sub_confirmation=1")); _youtubers.add(Pair.create("SallyGreenGamer", "https://www.youtube.com/channel/UCt8eypdLUND5CBvgXzEZrxw?sub_confirmation=1"));
_youtubers.add(Pair.create("RustyDawgT", "https://www.youtube.com/user/RustyDawgT?sub_confirmation=1"));
} }
_youtubers.add(Pair.create("SamitoD", "https://www.youtube.com/user/SamitoD?sub_confirmation=1")); _youtubers.add(Pair.create("SamitoD", "https://www.youtube.com/user/SamitoD?sub_confirmation=1"));
@ -405,14 +407,14 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
if (event.getType() != UpdateType.TICK) if (event.getType() != UpdateType.TICK)
return; return;
_animation.itemClean();
if (_canVote) if (_canVote)
return; return;
if (!_enabled) if (!_enabled)
return; return;
_animation.itemClean();
if (!_animationRunning) if (!_animationRunning)
return; return;

View File

@ -48,13 +48,13 @@ public class AnimationCarl extends Animation
for (int i = 50; i < 60; i++) for (int i = 50; i < 60; i++)
{ {
Item gem = _creeper.getWorld().dropItem(_creeper.getLocation().add(0.5, 1.5, 0.5), ItemStackFactory.Instance.CreateStack(Material.EMERALD, (byte) 0, 1, " " + i)); Item gem = _creeper.getWorld().dropItem(_creeper.getLocation().add(0.5, 1.5, 0.5), ItemStackFactory.Instance.CreateStack(Material.EMERALD, (byte) 0, 1, " " + i));
Item coin = _creeper.getWorld().dropItem(_creeper.getLocation().add(0.5, 1.5, 0.5), ItemStackFactory.Instance.CreateStack(Material.DOUBLE_PLANT, (byte) 0, 1, " " + i)); Item shard = _creeper.getWorld().dropItem(_creeper.getLocation().add(0.5, 1.5, 0.5), ItemStackFactory.Instance.CreateStack(Material.PRISMARINE_SHARD, (byte) 0, 1, " " + i));
_items.add(gem); _items.add(gem);
_items.add(coin); _items.add(shard);
Vector vel = new Vector(Math.sin(i * 9/5d), 0, Math.cos(i * 9/5d)); Vector vel = new Vector(Math.sin(i * 9/5d), 0, Math.cos(i * 9/5d));
UtilAction.velocity(gem, vel, Math.abs(Math.sin(i * 12/3000d)), false, 0, 0.2 + Math.abs(Math.cos(i * 12/3000d))*0.6, 1, false); UtilAction.velocity(gem, vel, Math.abs(Math.sin(i * 12/3000d)), false, 0, 0.2 + Math.abs(Math.cos(i * 12/3000d))*0.6, 1, false);
UtilAction.velocity(coin, vel, Math.abs(Math.sin(UtilMath.r(i) * 30/3000d)), false, 0, 0.2 + Math.abs(Math.cos(UtilMath.r(i) * 30/3000d))*0.6, 1, false); UtilAction.velocity(shard, vel, Math.abs(Math.sin(UtilMath.r(i) * 30/3000d)), false, 0, 0.2 + Math.abs(Math.cos(UtilMath.r(i) * 30/3000d))*0.6, 1, false);
} }
} }
@ -62,11 +62,11 @@ public class AnimationCarl extends Animation
{ {
for (int i = 50; i < 60; i++) for (int i = 50; i < 60; i++)
{ {
Item coin = _creeper.getWorld().dropItem(_creeper.getLocation().add(0.5, 1.5, 0.5), ItemStackFactory.Instance.CreateStack(Material.DOUBLE_PLANT, (byte) 0, 1, " " + i)); Item shard = _creeper.getWorld().dropItem(_creeper.getLocation().add(0.5, 1.5, 0.5), ItemStackFactory.Instance.CreateStack(Material.PRISMARINE_SHARD, (byte) 0, 1, " " + i));
_items.add(coin); _items.add(shard);
Vector vel = new Vector(Math.sin(UtilMath.r(i) * 7/5d), 0, Math.cos(UtilMath.r(i) * 7/5d)); Vector vel = new Vector(Math.sin(UtilMath.r(i) * 7/5d), 0, Math.cos(UtilMath.r(i) * 7/5d));
UtilAction.velocity(coin, vel, Math.abs(Math.sin(UtilMath.r(i) * 7/3000d)), false, 0, 0.2 + Math.abs(Math.cos(UtilMath.r(i) * 7/3000d))*0.6, 1, false); UtilAction.velocity(shard, vel, Math.abs(Math.sin(UtilMath.r(i) * 7/3000d)), false, 0, 0.2 + Math.abs(Math.cos(UtilMath.r(i) * 7/3000d))*0.6, 1, false);
} }
} }

View File

@ -205,22 +205,6 @@ public class Chat extends MiniPlugin
return true; return true;
} }
@EventHandler
public void removeChat(AsyncPlayerChatEvent event)
{
if (event.isCancelled())
return;
if (event.isAsynchronous())
{
for (Iterator<Player> playerIterator = event.getRecipients().iterator(); playerIterator.hasNext();)
{
if (!_preferences.get(playerIterator.next()).isActive(Preference.SHOW_CHAT))
playerIterator.remove();
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onSignChange(SignChangeEvent event) public void onSignChange(SignChangeEvent event)
{ {
@ -403,6 +387,11 @@ public class Chat extends MiniPlugin
return; return;
} }
} }
if (event.isAsynchronous())
{
event.getRecipients().removeIf(player -> !_preferences.get(player).isActive(Preference.SHOW_CHAT));
}
} }
private boolean msgContainsHack(String msg) private boolean msgContainsHack(String msg)

View File

@ -5,6 +5,8 @@ import org.bukkit.entity.Player;
import mineplex.core.chat.Chat; import mineplex.core.chat.Chat;
import mineplex.core.command.CommandBase; import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank; 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.common.util.UtilServer;
public class BroadcastCommand extends CommandBase<Chat> public class BroadcastCommand extends CommandBase<Chat>
@ -17,6 +19,12 @@ public class BroadcastCommand extends CommandBase<Chat>
@Override @Override
public void Execute(Player caller, String[] args) public void Execute(Player caller, String[] args)
{ {
if (args.length == 0)
{
UtilPlayer.message(caller, F.main("Broadcast", "What are you broadcasting?"));
return;
}
String announcement = ""; String announcement = "";
for (String arg : args) for (String arg : args)

View File

@ -135,12 +135,12 @@ public abstract class CommandBase<PluginType extends MiniPlugin> implements ICom
return matches; return matches;
} }
protected List<String> tabCompletePlayerNames(CommandSender sender, String commandLabel, String[] args) protected List<String> tabCompletePlayerNames(CommandSender sender, String[] args)
{ {
return tabCompletePlayerNames(sender, commandLabel, args, t -> true); return tabCompletePlayerNames(sender, args, t -> true);
} }
protected List<String> tabCompletePlayerNames(CommandSender sender, String commandLabel, String[] args, Predicate<Player> filter) protected List<String> tabCompletePlayerNames(CommandSender sender, String[] args, Predicate<Player> filter)
{ {
if (sender instanceof Player) if (sender instanceof Player)
{ {

View File

@ -1,23 +1,26 @@
package mineplex.core.cosmetic.ui.page; package mineplex.core.cosmetic.ui.page;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import mineplex.core.account.CoreClientManager; import mineplex.core.account.CoreClientManager;
import mineplex.core.common.currency.GlobalCurrency; import mineplex.core.common.currency.GlobalCurrency;
import mineplex.core.common.util.C; import mineplex.core.common.util.C;
import mineplex.core.cosmetic.CosmeticManager; import mineplex.core.cosmetic.CosmeticManager;
import mineplex.core.cosmetic.ui.CosmeticShop; import mineplex.core.cosmetic.ui.CosmeticShop;
import mineplex.core.donation.DonationManager; import mineplex.core.donation.DonationManager;
import mineplex.core.gadget.gadgets.outfit.freezesuit.OutfitFreezeSuit;
import mineplex.core.gadget.gadgets.outfit.ravesuit.OutfitRaveSuit; import mineplex.core.gadget.gadgets.outfit.ravesuit.OutfitRaveSuit;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuit; import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuit;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksSuit;
import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.Gadget;
import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.GadgetType;
import mineplex.core.gadget.types.ItemGadget; import mineplex.core.gadget.types.ItemGadget;
import mineplex.core.gadget.types.OutfitGadget; import mineplex.core.gadget.types.OutfitGadget;
import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.IButton;
import mineplex.core.shop.item.ShopItem; import mineplex.core.shop.item.ShopItem;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
/** /**
* Created by shaun on 14-09-15. * Created by shaun on 14-09-15.
@ -42,11 +45,13 @@ public class CostumePage extends GadgetPage
OutfitGadget outfitGadget = ((OutfitGadget) gadget); OutfitGadget outfitGadget = ((OutfitGadget) gadget);
int offset = 0; int offset;
if (gadget instanceof OutfitRaveSuit) offset = 0; if (gadget instanceof OutfitRaveSuit) offset = 0;
else if (gadget instanceof OutfitSpaceSuit) offset = 1; else if (gadget instanceof OutfitSpaceSuit) offset = 1;
else offset = 2; else if (gadget instanceof OutfitFreezeSuit) offset = 2;
else if (gadget instanceof OutfitStPatricksSuit) offset = 3;
else offset = 4;
slot = offset + 1 + 18; //1 buffer to left, 18 = 2 lines down slot = offset + 1 + 18; //1 buffer to left, 18 = 2 lines down

View File

@ -175,6 +175,11 @@ public class GadgetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
itemLore.add(C.cBlack); itemLore.add(C.cBlack);
itemLore.add(C.cBlue + "Found in Love Chests"); itemLore.add(C.cBlue + "Found in Love Chests");
} }
else if (gadget.getCost(GlobalCurrency.TREASURE_SHARD) == -18)
{
itemLore.add(C.cBlack);
itemLore.add(C.cBlue + "Found in St Patrick's Chests");
}
//Rank Unlocks //Rank Unlocks
else if (gadget.getCost(GlobalCurrency.TREASURE_SHARD) == -10) else if (gadget.getCost(GlobalCurrency.TREASURE_SHARD) == -10)

View File

@ -113,6 +113,11 @@ public class MountPage extends ShopPageBase<CosmeticManager, CosmeticShop>
itemLore.add(C.cBlack); itemLore.add(C.cBlack);
itemLore.add(C.cBlue + "Found in Thankful Treasure"); itemLore.add(C.cBlue + "Found in Thankful Treasure");
} }
else if (mount.getCost(GlobalCurrency.TREASURE_SHARD) == -18)
{
itemLore.add(C.cBlack);
itemLore.add(C.cBlue + "Found in St Patrick's Chests");
}
else if (mount.getCost(GlobalCurrency.TREASURE_SHARD) == -14) else if (mount.getCost(GlobalCurrency.TREASURE_SHARD) == -14)
{ {
itemLore.add(C.cBlack); itemLore.add(C.cBlack);

View File

@ -22,6 +22,8 @@ import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType; 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.account.CoreClientManager;
import mineplex.core.common.currency.GlobalCurrency; import mineplex.core.common.currency.GlobalCurrency;
@ -111,6 +113,11 @@ public class PetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
itemLore.add(C.cBlack); itemLore.add(C.cBlack);
itemLore.add(C.cBlue + "Found in Haunted Chests"); itemLore.add(C.cBlue + "Found in Haunted Chests");
} }
else if (pet.getPrice() == -18)
{
itemLore.add(C.cBlack);
itemLore.add(C.cBlue + "Found in St Patrick's Chests");
}
else if (pet.getPrice() == -14) else if (pet.getPrice() == -14)
{ {
itemLore.add(C.cBlack); itemLore.add(C.cBlack);
@ -165,9 +172,13 @@ public class PetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
itemLore.add(C.cBlack); itemLore.add(C.cBlack);
itemLore.add(C.cGreen + "Click to Disable"); itemLore.add(C.cGreen + "Click to Disable");
addButton(slot, new ShopItem(pet.getMaterial(), pet.getData(), ItemStack item = pet.getDisplayItem();
pet.getName() + " (" + C.cWhite + petName + C.cGreen + ")", ItemMeta itemMeta = item.getItemMeta();
itemLore.toArray(new String[itemLore.size()]), 1, false, false), new DeactivatePetButton(this, getPlugin().getPetManager())); itemMeta.setDisplayName(C.cGreen + C.Bold + pet.getName() + C.cGreen + " (" + C.cWhite + petName + C.cGreen + ")");
itemMeta.setLore(itemLore);
item.setItemMeta(itemMeta);
addButton(slot, new ShopItem(item, false, false).hideInfo(), new DeactivatePetButton(this, getPlugin().getPetManager()));
addGlow(slot); addGlow(slot);
} }
@ -175,29 +186,14 @@ public class PetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
{ {
itemLore.add(C.cBlack); itemLore.add(C.cBlack);
itemLore.add(C.cGreen + "Click to Enable"); itemLore.add(C.cGreen + "Click to Enable");
/*
ItemStack petItem = ItemStackFactory.Instance.CreateStack(pet.getMaterial(), pet.getData(), 1,
pet.getName() + " (" + C.cWhite + petName + C.cGreen + ")", itemLore);
IButton iButton = new ActivatePetButton(pet, this); ItemStack item = pet.getDisplayItem();
ItemMeta itemMeta = item.getItemMeta();
itemMeta.setDisplayName(C.cGreen + C.Bold + pet.getName() + C.cGreen + " (" + C.cWhite + petName + C.cGreen + ")");
itemMeta.setLore(itemLore);
item.setItemMeta(itemMeta);
if (pet.equals(PetType.SHULKER)) addButton(slot, new ShopItem(item, false, false).hideInfo(), new ActivatePetButton(pet, this));
{
petItem = UtilItem.getVersionSpecificItem(_player, UtilPlayer.PlayerVersion._1_9, petItem);
if (petItem.getType().equals(Material.BARRIER))
{
iButton = null;
}
else
{
// Does not set the item stack yet
//petItem.setType(Material.getMaterial(201));
}
}*/
addButton(slot, new ShopItem(pet.getMaterial(), pet.getData(),
pet.getName() + " (" + C.cWhite + petName + C.cGreen + ")",
itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivatePetButton(pet, this));
//addButton(slot, new ShopItem(petItem, false, false), iButton); //addButton(slot, new ShopItem(petItem, false, false), iButton);
} }
} }

View File

@ -7,6 +7,7 @@ import java.util.function.Consumer;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import mineplex.core.common.Constants;
import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilServer;
import mineplex.core.server.remotecall.JsonWebCall; import mineplex.core.server.remotecall.JsonWebCall;
import mineplex.core.thread.ThreadPool; import mineplex.core.thread.ThreadPool;
@ -17,7 +18,7 @@ import mineplex.serverdata.database.DatabaseRunnable;
@Deprecated @Deprecated
public class BasicMSSQLProvider implements MSSQLProvider public class BasicMSSQLProvider implements MSSQLProvider
{ {
private final String _webAddress = UtilServer.getWebServerURL(); private final String _webAddress = Constants.WEB_ADDRESS;
// Queue for failed processes // Queue for failed processes
private final Object QUEUE_LOCK = new Object(); private final Object QUEUE_LOCK = new Object();

View File

@ -19,6 +19,10 @@ public class DisguiseCommand extends CommandBase<PlayerDisguiseManager> implemen
{ {
if (args == null || args.length == 0) if (args == null || args.length == 0)
{ {
Plugin.runAsync(() ->
{
new PlayerDisguiseNotification(Plugin.getRealName(caller), caller.getUniqueId(), caller.getName()).publish();
});
Plugin.undisguise(caller); Plugin.undisguise(caller);
return; return;
} }
@ -28,6 +32,11 @@ public class DisguiseCommand extends CommandBase<PlayerDisguiseManager> implemen
return; return;
} }
Plugin.runAsync(() ->
{
new PlayerDisguiseNotification(Plugin.getRealName(caller), caller.getUniqueId(), args[0], args.length > 1 ? args[1] : args[0]).publish();
});
Plugin.disguise(caller, args[0], args.length > 1 ? args[1] : args[0]); Plugin.disguise(caller, args[0], args.length > 1 ? args[1] : args[0]);
} }
} }

View File

@ -331,6 +331,12 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
} }
} }
public String getRealName(Player caller)
{
CoreClient coreClient = _clients.Get(caller);
return coreClient == null ? caller.getName() : coreClient.getName();
}
public void undisguise(Player caller) public void undisguise(Player caller)
{ {
if (!isDisguised(caller)) if (!isDisguised(caller))
@ -462,17 +468,9 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
if (!requestedUsername.equalsIgnoreCase(caller.getName())) if (!requestedUsername.equalsIgnoreCase(caller.getName()))
{ {
Rank otherRank = Rank.ALL; getClientManager().getOrLoadClient(requestedUsername, other ->
CoreClient other = new CoreClient(requestedUsername, requestedProfile.getId());
try
{ {
getClientManager().LoadClient(other, requestedProfile.getId(), caller.getAddress().getAddress().getHostAddress()); Rank otherRank = other != null ? other.GetRank() : Rank.ALL;
otherRank = other.GetRank();
}
catch (NullPointerException exception)
{
other = null;
}
if (otherRank.has(Rank.TWITCH)) if (otherRank.has(Rank.TWITCH))
{ {
@ -556,6 +554,7 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
_cannotJoin.remove(requestedUsername.toLowerCase()); _cannotJoin.remove(requestedUsername.toLowerCase());
}); });
});
} }
else else
{ {

View File

@ -0,0 +1,57 @@
package mineplex.core.disguise.playerdisguise;
import java.util.UUID;
import mineplex.serverdata.commands.ServerCommand;
public class PlayerDisguiseNotification extends ServerCommand
{
private String _realPlayerName;
private UUID _playerUUID;
private boolean _disguising;
private String _disguisedName;
private String _disguisedSkin;
public PlayerDisguiseNotification(String realPlayerName, UUID playerUUID, String disguisedName, String disguisedSkin)
{
_realPlayerName = realPlayerName;
_playerUUID = playerUUID;
_disguising = true;
_disguisedName = disguisedName;
_disguisedSkin = disguisedSkin;
}
public PlayerDisguiseNotification(String realPlayerName, UUID playerUUID, String disguisedName)
{
_realPlayerName = realPlayerName;
_playerUUID = playerUUID;
_disguising = false;
_disguisedName = disguisedName;
_disguisedSkin = null;
}
public String getRealPlayerName()
{
return _realPlayerName;
}
public UUID getPlayerUUID()
{
return _playerUUID;
}
public boolean isDisguising()
{
return _disguising;
}
public String getDisguisedName()
{
return _disguisedName;
}
public String getDisguisedSkin()
{
return _disguisedSkin;
}
}

View File

@ -47,6 +47,6 @@ public class AddFriend extends CommandBase<FriendManager>
@Override @Override
public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args) public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args)
{ {
return tabCompletePlayerNames(sender, commandLabel, args); return tabCompletePlayerNames(sender, args);
} }
} }

View File

@ -2,8 +2,10 @@ package mineplex.core.gadget;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.function.Predicate; import java.util.function.Predicate;
@ -28,7 +30,6 @@ import mineplex.core.account.CoreClientManager;
import mineplex.core.achievement.AchievementManager; import mineplex.core.achievement.AchievementManager;
import mineplex.core.blockrestore.BlockRestore; import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.common.util.F; import mineplex.core.common.util.F;
import mineplex.core.common.util.NautHashMap;
import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilPlayer;
@ -153,6 +154,10 @@ import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitBoots;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitChestplate; import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitChestplate;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitHelmet; import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitHelmet;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitLeggings; import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitLeggings;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksBoots;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksChestplate;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksHat;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksLeggings;
import mineplex.core.gadget.gadgets.outfit.windupsuit.OutfitWindUpSuitBoosterManager; import mineplex.core.gadget.gadgets.outfit.windupsuit.OutfitWindUpSuitBoosterManager;
import mineplex.core.gadget.gadgets.particle.ParticleChristmasTree; import mineplex.core.gadget.gadgets.particle.ParticleChristmasTree;
import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes; import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes;
@ -160,6 +165,7 @@ import mineplex.core.gadget.gadgets.particle.ParticleFairy;
import mineplex.core.gadget.gadgets.particle.ParticleFireRings; import mineplex.core.gadget.gadgets.particle.ParticleFireRings;
import mineplex.core.gadget.gadgets.particle.ParticleLegend; import mineplex.core.gadget.gadgets.particle.ParticleLegend;
import mineplex.core.gadget.gadgets.particle.ParticleWingsAngel; import mineplex.core.gadget.gadgets.particle.ParticleWingsAngel;
import mineplex.core.gadget.gadgets.particle.ParticleWingsBee;
import mineplex.core.gadget.gadgets.particle.ParticleWingsDemons; import mineplex.core.gadget.gadgets.particle.ParticleWingsDemons;
import mineplex.core.gadget.gadgets.particle.ParticleWingsInfernal; import mineplex.core.gadget.gadgets.particle.ParticleWingsInfernal;
import mineplex.core.gadget.gadgets.particle.ParticleWingsLove; import mineplex.core.gadget.gadgets.particle.ParticleWingsLove;
@ -179,6 +185,7 @@ import mineplex.core.gadget.gadgets.particle.vampire.ParticleBlood;
import mineplex.core.gadget.gadgets.particle.wisdom.ParticleEnchant; import mineplex.core.gadget.gadgets.particle.wisdom.ParticleEnchant;
import mineplex.core.gadget.gadgets.taunts.BlowAKissTaunt; import mineplex.core.gadget.gadgets.taunts.BlowAKissTaunt;
import mineplex.core.gadget.gadgets.taunts.EternalTaunt; import mineplex.core.gadget.gadgets.taunts.EternalTaunt;
import mineplex.core.gadget.gadgets.taunts.RainbowTaunt;
import mineplex.core.gadget.gadgets.wineffect.WinEffectBabyChicken; import mineplex.core.gadget.gadgets.wineffect.WinEffectBabyChicken;
import mineplex.core.gadget.gadgets.wineffect.WinEffectFlames; import mineplex.core.gadget.gadgets.wineffect.WinEffectFlames;
import mineplex.core.gadget.gadgets.wineffect.WinEffectHalloween; import mineplex.core.gadget.gadgets.wineffect.WinEffectHalloween;
@ -206,6 +213,7 @@ import mineplex.core.gadget.set.SetWisdom;
import mineplex.core.gadget.set.suits.SetFreezeSuit; import mineplex.core.gadget.set.suits.SetFreezeSuit;
import mineplex.core.gadget.set.suits.SetRaveSuit; import mineplex.core.gadget.set.suits.SetRaveSuit;
import mineplex.core.gadget.set.suits.SetSpaceSuit; import mineplex.core.gadget.set.suits.SetSpaceSuit;
import mineplex.core.gadget.set.suits.SetStPatricksSuit;
import mineplex.core.gadget.types.ArrowEffectGadget; import mineplex.core.gadget.types.ArrowEffectGadget;
import mineplex.core.gadget.types.BalloonGadget; import mineplex.core.gadget.types.BalloonGadget;
import mineplex.core.gadget.types.DeathEffectGadget; import mineplex.core.gadget.types.DeathEffectGadget;
@ -253,10 +261,10 @@ public class GadgetManager extends MiniPlugin
private TreasureManager _treasureManager; private TreasureManager _treasureManager;
private SoulManager _soulManager; private SoulManager _soulManager;
private NautHashMap<GadgetType, List<Gadget>> _gadgets; private Map<GadgetType, List<Gadget>> _gadgets;
private final NautHashMap<Player, Long> _lastMove = new NautHashMap<>(); private final Map<Player, Long> _lastMove = new HashMap<>();
private final NautHashMap<Player, NautHashMap<GadgetType, Gadget>> _playerActiveGadgetMap = new NautHashMap<>(); private final Map<Player, Map<GadgetType, Gadget>> _playerActiveGadgetMap = new HashMap<>();
private final HashSet<GadgetSet> _sets = new HashSet<>(); private final HashSet<GadgetSet> _sets = new HashSet<>();
@ -315,8 +323,11 @@ public class GadgetManager extends MiniPlugin
addSet(new SetRaveSuit(this)); addSet(new SetRaveSuit(this));
addSet(new SetSpaceSuit(this)); addSet(new SetSpaceSuit(this));
addSet(new SetFreezeSuit(this)); addSet(new SetFreezeSuit(this));
addSet(new SetStPatricksSuit(this));
// Hidden in this update // Hidden in this update
//addSet(new SetWindUpSuit(this)); //addSet(new SetWindUpSuit(this));
// Sets
addSet(new SetParty(this)); addSet(new SetParty(this));
addSet(new SetCupidsLove(this)); addSet(new SetCupidsLove(this));
addSet(new SetEmerald(this)); addSet(new SetEmerald(this));
@ -330,7 +341,7 @@ public class GadgetManager extends MiniPlugin
private void createGadgets() private void createGadgets()
{ {
_gadgets = new NautHashMap<>(); _gadgets = new HashMap<>();
// Items // Items
addGadget(new ItemEtherealPearl(this)); addGadget(new ItemEtherealPearl(this));
@ -350,6 +361,8 @@ public class GadgetManager extends MiniPlugin
addGadget(new ItemBow(this)); addGadget(new ItemBow(this));
addGadget(new ItemLovePotion(this)); addGadget(new ItemLovePotion(this));
addGadget(new ItemFlowerGift(this)); addGadget(new ItemFlowerGift(this));
// NEXT MONTH'S PPC
//addGadget(new ItemBubbleBlaster(this));
// Costume // Costume
addGadget(new OutfitRaveSuitHelmet(this)); addGadget(new OutfitRaveSuitHelmet(this));
@ -373,6 +386,11 @@ public class GadgetManager extends MiniPlugin
addGadget(new OutfitFreezeSuitLeggings(this)); addGadget(new OutfitFreezeSuitLeggings(this));
addGadget(new OutfitFreezeSuitBoots(this)); addGadget(new OutfitFreezeSuitBoots(this));
addGadget(new OutfitStPatricksHat(this));
addGadget(new OutfitStPatricksChestplate(this));
addGadget(new OutfitStPatricksLeggings(this));
addGadget(new OutfitStPatricksBoots(this));
addGadget(new OutfitTeam(this, "Team Helmet", -1, ArmorSlot.HELMET, Material.LEATHER_HELMET, (byte)0)); addGadget(new OutfitTeam(this, "Team Helmet", -1, ArmorSlot.HELMET, Material.LEATHER_HELMET, (byte)0));
addGadget(new OutfitTeam(this, "Team Shirt", -1, ArmorSlot.CHEST, Material.LEATHER_CHESTPLATE, (byte)0)); addGadget(new OutfitTeam(this, "Team Shirt", -1, ArmorSlot.CHEST, Material.LEATHER_CHESTPLATE, (byte)0));
addGadget(new OutfitTeam(this, "Team Pants", -1, ArmorSlot.LEGS, Material.LEATHER_LEGGINGS, (byte)0)); addGadget(new OutfitTeam(this, "Team Pants", -1, ArmorSlot.LEGS, Material.LEATHER_LEGGINGS, (byte)0));
@ -432,6 +450,7 @@ public class GadgetManager extends MiniPlugin
addGadget(new ParticleFreedom(this)); addGadget(new ParticleFreedom(this));
addGadget(new ParticleChristmasTree(this)); addGadget(new ParticleChristmasTree(this));
addGadget(new ParticleWingsLove(this)); addGadget(new ParticleWingsLove(this));
addGadget(new ParticleWingsBee(this));
// Arrow Trails // Arrow Trails
addGadget(new ArrowTrailFrostLord(this)); addGadget(new ArrowTrailFrostLord(this));
@ -561,6 +580,7 @@ public class GadgetManager extends MiniPlugin
// TAUNTS!!! // TAUNTS!!!
addGadget(new EternalTaunt(this)); addGadget(new EternalTaunt(this));
addGadget(new BlowAKissTaunt(this)); addGadget(new BlowAKissTaunt(this));
addGadget(new RainbowTaunt(this));
// Gem Hunters Mounts // Gem Hunters Mounts
for (MountType mount : MountType.values()) for (MountType mount : MountType.values())
@ -1035,7 +1055,7 @@ public class GadgetManager extends MiniPlugin
public void setActive(Player player, Gadget gadget) public void setActive(Player player, Gadget gadget)
{ {
if (!_playerActiveGadgetMap.containsKey(player)) if (!_playerActiveGadgetMap.containsKey(player))
_playerActiveGadgetMap.put(player, new NautHashMap<GadgetType, Gadget>()); _playerActiveGadgetMap.put(player, new HashMap<>());
_playerActiveGadgetMap.get(player).put(gadget.getGadgetType(), gadget); _playerActiveGadgetMap.get(player).put(gadget.getGadgetType(), gadget);
} }
@ -1043,7 +1063,7 @@ public class GadgetManager extends MiniPlugin
public Gadget getActive(Player player, GadgetType gadgetType) public Gadget getActive(Player player, GadgetType gadgetType)
{ {
if (!_playerActiveGadgetMap.containsKey(player)) if (!_playerActiveGadgetMap.containsKey(player))
_playerActiveGadgetMap.put(player, new NautHashMap<GadgetType, Gadget>()); _playerActiveGadgetMap.put(player, new HashMap<>());
return _playerActiveGadgetMap.get(player).get(gadgetType); return _playerActiveGadgetMap.get(player).get(gadgetType);
} }
@ -1051,7 +1071,7 @@ public class GadgetManager extends MiniPlugin
public void removeActive(Player player, Gadget gadget) public void removeActive(Player player, Gadget gadget)
{ {
if (!_playerActiveGadgetMap.containsKey(player)) if (!_playerActiveGadgetMap.containsKey(player))
_playerActiveGadgetMap.put(player, new NautHashMap<GadgetType, Gadget>()); _playerActiveGadgetMap.put(player, new HashMap<>());
_playerActiveGadgetMap.get(player).remove(gadget.getGadgetType()); _playerActiveGadgetMap.get(player).remove(gadget.getGadgetType());
} }

View File

@ -86,7 +86,7 @@ public class GameModifierMineStrikeSkin extends GameModifierGadget
@Override @Override
public void enableCustom(Player player, boolean message) public void enableCustom(Player player, boolean message)
{ {
Manager.getGameModifiers(getGameType()).stream().filter(getWeaponFilter(_weapon)).forEach(g -> g.disable(player)); Manager.getGameModifiers(getGameType()).stream().filter(getWeaponFilter(_weapon).and(weapon -> weapon != this)).forEach(g -> g.disable(player));
super.enableCustom(player, message); super.enableCustom(player, message);
} }

View File

@ -0,0 +1,121 @@
package mineplex.core.gadget.gadgets.item;
import java.awt.Color;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilGear;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilText;
import mineplex.core.common.util.particles.ColoredParticle;
import mineplex.core.common.util.particles.DustSpellColor;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.Ammo;
import mineplex.core.gadget.types.ItemGadget;
import mineplex.core.itemstack.ItemStackFactory;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class ItemBubbleBlaster extends ItemGadget
{
private Map<ArmorStand, Player> _armorStands = new HashMap<>();
public ItemBubbleBlaster(GadgetManager manager)
{
super(manager, "Bubble Blaster", UtilText.splitLinesToArray(new String[]{C.cGray + "Placeholder"}, LineFormat.LORE),
-14, Material.DIAMOND_BARDING, (byte) 0, 5000, new Ammo("Bubble", "Bubble", Material.DIAMOND_BARDING, (byte) 0, new String[]{C.cGray + "Placeholder"}, -5, 1));
}
@Override
public void disableCustom(Player player, boolean message)
{
super.disableCustom(player, message);
}
@Override
public void ActivateCustom(Player player)
{
}
@Override
@EventHandler
public void Activate(PlayerInteractEvent event)
{
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK)
return;
if (UtilBlock.usable(event.getClickedBlock()))
return;
if (!UtilGear.isMat(event.getPlayer().getItemInHand(), this.getDisplayMaterial()))
return;
Player player = event.getPlayer();
if (!isActive(player))
return;
event.setCancelled(true);
player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(getDisplayMaterial(), getDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(getName()) + " " + getName())));
// TODO CHANGE COLOR IF RAINBOW
// TODO COOLDOWN AFTER MAX OF 5 SECONDS HOLDING
// TODO LAUNCH MULTIPLE WHILE HOLDING
ArmorStand armorStand = player.getWorld().spawn(player.getLocation().add(0, 1, 0), ArmorStand.class);
armorStand.setItemInHand(new ItemStack(Material.STAINED_GLASS, 1, (byte) UtilMath.random.nextInt(15)));
armorStand.setSmall(true);
armorStand.setVisible(false);
_armorStands.put(armorStand, player);
double x = UtilMath.random(0.5, 1) - 1.25, z = UtilMath.random(0.5, 1) - 1.25;
double sub = UtilMath.random(0.5, 1);
if (sub > 0.75)
UtilAction.velocity(armorStand, player.getLocation().getDirection().add(new Vector(x, 0, z)), 0.25, false, 0, 0.5, 1, false);
else
UtilAction.velocity(armorStand, player.getLocation().getDirection().subtract(new Vector(x, 0, z)), 0.25, false, 0, 0.5, 1, false);
}
@EventHandler
public void updateArmorStand(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
Iterator<Map.Entry<ArmorStand, Player>> iterator = _armorStands.entrySet().iterator();
while (iterator.hasNext())
{
Map.Entry<ArmorStand, Player> entry = iterator.next();
ArmorStand armorStand = entry.getKey();
Player player = entry.getValue();
if (armorStand.getTicksLived() >= 20)
{
ColoredParticle coloredParticle = new ColoredParticle(UtilParticle.ParticleType.RED_DUST, new DustSpellColor(Color.WHITE), armorStand.getLocation());
coloredParticle.display();
armorStand.remove();
iterator.remove();
}
}
}
}

View File

@ -4,6 +4,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Item; import org.bukkit.entity.Item;
@ -32,12 +34,14 @@ import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.morph.managers.UtilMorph; import mineplex.core.gadget.gadgets.morph.managers.UtilMorph;
import mineplex.core.gadget.types.MorphGadget; import mineplex.core.gadget.types.MorphGadget;
import mineplex.core.itemstack.ItemBuilder; import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.packethandler.IPacketHandler;
import mineplex.core.packethandler.PacketInfo;
import mineplex.core.recharge.Recharge; import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType; import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.event.UpdateEvent;
import mineplex.core.visibility.VisibilityManager; import mineplex.core.visibility.VisibilityManager;
public class MorphPumpkinKing extends MorphGadget public class MorphPumpkinKing extends MorphGadget implements IPacketHandler
{ {
private static final int CROWN_POINTS = 12; private static final int CROWN_POINTS = 12;
@ -57,6 +61,7 @@ public class MorphPumpkinKing extends MorphGadget
-1, -1,
Material.PUMPKIN, (byte)0); Material.PUMPKIN, (byte)0);
manager.getPacketManager().addPacketHandler(this, true, PacketPlayInUseEntity.class);
} }
@Override @Override
@ -124,6 +129,19 @@ public class MorphPumpkinKing extends MorphGadget
} }
} }
@Override
public void handle(PacketInfo packetInfo)
{
if (packetInfo.getPacket() instanceof PacketPlayInUseEntity)
{
PacketPlayInUseEntity packetPlayInUseEntity = (PacketPlayInUseEntity) packetInfo.getPacket();
if (packetPlayInUseEntity.action == PacketPlayInUseEntity.EnumEntityUseAction.ATTACK)
for (JackOBomb bomb : _bombs)
if (bomb._ent.getEntityId() == packetPlayInUseEntity.a)
packetInfo.setCancelled(true);
}
}
private class JackOBomb private class JackOBomb
{ {
private Player _user; private Player _user;
@ -151,6 +169,12 @@ public class MorphPumpkinKing extends MorphGadget
{ {
return true; return true;
} }
if (!_user.isOnline())
{
Manager.getDisguiseManager().undisguise(_disguise);
_ent.remove();
_done = true;
}
if (System.currentTimeMillis() >= _detonation) if (System.currentTimeMillis() >= _detonation)
{ {
UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, _ent.getLocation(), null, 0, 1, ViewDist.NORMAL); UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, _ent.getLocation(), null, 0, 1, ViewDist.NORMAL);

View File

@ -63,6 +63,12 @@ public class MorphSquid extends MorphGadget implements IThrown
{ {
removeArmor(player); removeArmor(player);
UtilMorph.undisguise(player, Manager.getDisguiseManager()); UtilMorph.undisguise(player, Manager.getDisguiseManager());
if (player.getInventory().getBoots() != null && player.getInventory().getBoots().getType() == Material.DIAMOND_BOOTS)
{
player.getInventory().setBoots(new ItemStack(Material.AIR));
player.removePotionEffect(PotionEffectType.SPEED);
}
} }
@EventHandler @EventHandler

View File

@ -0,0 +1,15 @@
package mineplex.core.gadget.gadgets.outfit.stpatricks;
import org.bukkit.Material;
import mineplex.core.gadget.GadgetManager;
public class OutfitStPatricksBoots extends OutfitStPatricksSuit
{
public OutfitStPatricksBoots(GadgetManager manager)
{
super(manager, "Leprechaun's Boots", -18, ArmorSlot.BOOTS, Material.LEATHER_BOOTS, (byte) 0, "St Patrick's Boots");
}
}

View File

@ -0,0 +1,15 @@
package mineplex.core.gadget.gadgets.outfit.stpatricks;
import org.bukkit.Material;
import mineplex.core.gadget.GadgetManager;
public class OutfitStPatricksChestplate extends OutfitStPatricksSuit
{
public OutfitStPatricksChestplate(GadgetManager manager)
{
super(manager, "Leprechaun's Chest", -18, ArmorSlot.CHEST, Material.LEATHER_CHESTPLATE, (byte) 0, "St Patrick's Chest");
}
}

View File

@ -0,0 +1,15 @@
package mineplex.core.gadget.gadgets.outfit.stpatricks;
import org.bukkit.Material;
import mineplex.core.gadget.GadgetManager;
public class OutfitStPatricksHat extends OutfitStPatricksSuit
{
public OutfitStPatricksHat(GadgetManager manager)
{
super(manager, "Leprechaun's Hat", -18, ArmorSlot.HELMET, Material.LEATHER_HELMET, (byte) 0, "St Patrick's Hat");
}
}

View File

@ -0,0 +1,15 @@
package mineplex.core.gadget.gadgets.outfit.stpatricks;
import org.bukkit.Material;
import mineplex.core.gadget.GadgetManager;
public class OutfitStPatricksLeggings extends OutfitStPatricksSuit
{
public OutfitStPatricksLeggings(GadgetManager manager)
{
super(manager, "Leprechaun's Pants", -18, ArmorSlot.LEGS, Material.LEATHER_LEGGINGS, (byte) 0, "St Patrick's Pants");
}
}

View File

@ -0,0 +1,117 @@
package mineplex.core.gadget.gadgets.outfit.stpatricks;
import java.util.HashSet;
import java.util.Iterator;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilText;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.types.OutfitGadget;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class OutfitStPatricksSuit extends OutfitGadget
{
private HashSet<Item> _items = new HashSet<>();
public OutfitStPatricksSuit(GadgetManager manager, String name, int cost, OutfitGadget.ArmorSlot slot, Material mat, byte data, String... altNames)
{
super(manager, name, UtilText.splitLinesToArray(new String[]{C.cGray + "Wherever a Leprechaun goes he leaves behind a trail of gold and a hint of spring."}, LineFormat.LORE), cost, slot, mat, data, altNames);
setColor(Color.fromRGB(0, 153, 0));
ItemStack displayItem = new ItemStack(mat, 1, data);
if (displayItem.getItemMeta() instanceof LeatherArmorMeta)
{
LeatherArmorMeta leatherArmorMeta = (LeatherArmorMeta) displayItem.getItemMeta();
leatherArmorMeta.setColor(Color.fromRGB(0, 153, 0));
displayItem.setItemMeta(leatherArmorMeta);
}
setDisplayItem(displayItem);
}
@Override
public void enableCustom(Player player, boolean message)
{
applyArmor(player, message);
}
@Override
public void disableCustom(Player player, boolean message)
{
removeArmor(player, message);
}
@EventHandler
public void onUpdate(UpdateEvent event)
{
// Prevents event running 4 times
if (getSlot() != ArmorSlot.HELMET)
return;
if (event.getType() == UpdateType.TICK)
cleanItems();
if (event.getType() == UpdateType.FASTER)
{
for (Player player : getActive())
{
if (setActive(player))
{
ItemStack itemStack = new ItemStack(Material.GOLD_INGOT);
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(player.getName() + "DROPPED" + System.currentTimeMillis() + UtilMath.random.nextInt());
itemStack.setItemMeta(itemMeta);
Item gold = player.getWorld().dropItem(player.getLocation().add(0.5, 1.5, 0.5), itemStack);
_items.add(gold);
gold.setVelocity(new Vector((Math.random() - 0.5) * 0.3, Math.random() - 0.4, (Math.random() - 0.5) * 0.3));
}
}
}
}
@EventHandler
public void onItemPickup(PlayerPickupItemEvent event)
{
// Prevents event running 4 times
if (getSlot() != ArmorSlot.HELMET)
return;
if (_items.contains(event.getItem()))
{
event.setCancelled(true);
}
}
private boolean setActive(Player player)
{
return getSet() != null && getSet().isActive(player);
}
public void cleanItems()
{
Iterator<Item> it = _items.iterator();
while (it.hasNext())
{
Item item = it.next();
if (item.getTicksLived() >= 20)
{
item.remove();
it.remove();
}
}
}
}

View File

@ -0,0 +1,55 @@
package mineplex.core.gadget.gadgets.particle;
import java.awt.Color;
import java.time.Month;
import java.time.YearMonth;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import mineplex.core.common.shape.ShapeWings;
import mineplex.core.common.util.C;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilText;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.types.ParticleGadget;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class ParticleWingsBee extends ParticleGadget
{
private ShapeWings _wingsBlack = new ShapeWings(UtilParticle.ParticleType.RED_DUST.particleName, new Vector(1, 1, 1), 1, 0, '$', ShapeWings.DEFAULT_ROTATION, ShapeWings.BEE_WING_PATTERN);
private ShapeWings _wingsYellow = new ShapeWings(UtilParticle.ParticleType.RED_DUST.particleName, new Vector(1, 1, 1), 1, 0, '#', ShapeWings.DEFAULT_ROTATION, ShapeWings.BEE_WING_PATTERN);
public ParticleWingsBee(GadgetManager manager)
{
super(manager, "Bumblebee's Wings",
UtilText.splitLineToArray(C.cGray + "Float like a butterfly and sting like a bee with these new spring wings!", LineFormat.LORE),
-14, Material.WOOL, (byte) 4, YearMonth.of(2017, Month.APRIL));
}
@Override
public void playParticle(Player player, UpdateEvent event)
{
Location loc = player.getLocation().add(0, 1, 0).add(player.getLocation().getDirection().multiply(-0.4));
if (Manager.isMoving(player))
{
if (event.getType() == UpdateType.TICK)
{
_wingsBlack.displayColoredParticle(loc, Color.BLACK);
_wingsYellow.displayColoredParticle(loc, Color.YELLOW);
}
return;
}
if (event.getType() == UpdateType.FAST)
{
_wingsBlack.displayColored(loc, Color.BLACK);
_wingsYellow.displayColored(loc, Color.YELLOW);
}
}
}

View File

@ -25,7 +25,7 @@ public class BlowAKissTaunt extends TauntGadget
public BlowAKissTaunt(GadgetManager manager) public BlowAKissTaunt(GadgetManager manager)
{ {
super(manager, "Blow A Kiss", UtilText.splitLinesToArray(new String[]{ super(manager, "Blow A Kiss", UtilText.splitLinesToArray(new String[]{
C.cWhite + "Type /taunt in game to blow a kiss at your enemies.", C.cWhite + "Use /taunt in game to blow a kiss at your enemies.",
C.cRed + "Cannot be used while in PvP!"}, LineFormat.LORE), C.cRed + "Cannot be used while in PvP!"}, LineFormat.LORE),
-17, Material.GLASS, (byte) 0); -17, Material.GLASS, (byte) 0);
setDisplayItem(ItemStackFactory.Instance.createCustomPotion(PotionType.INSTANT_HEAL)); setDisplayItem(ItemStackFactory.Instance.createCustomPotion(PotionType.INSTANT_HEAL));

View File

@ -0,0 +1,68 @@
package mineplex.core.gadget.gadgets.taunts;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilText;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.types.TauntGadget;
import mineplex.core.particleeffects.EffectLocation;
import mineplex.core.particleeffects.RainbowTauntEffect;
import mineplex.core.recharge.Recharge;
public class RainbowTaunt extends TauntGadget
{
private static final int COOLDOWN = 30000;
private static final int PVP_COOLDOWN = 10000;
public RainbowTaunt(GadgetManager manager)
{
super(manager, "Rainbow Taunt", UtilText.splitLinesToArray(new String[]
{
C.cGray + "At the end of every Rainbow they say there is a pot of Gold.",
"",
C.cWhite + "Use /taunt in game to use this taunt.",
C.cGreen + "Can be used while in PvP!"
},
LineFormat.LORE), -18, Material.WOOL, (byte) 11);
setCanPlayWithPvp(false);
setPvpCooldown(PVP_COOLDOWN);
setShouldPlay(false);
}
@Override
public void onStart(Player player)
{
if (!Recharge.Instance.use(player, getName(), COOLDOWN, true, false, "Cosmetics"))
return;
Vector dir = player.getLocation().getDirection();
Vector sideA = dir.clone().setX(-dir.getZ()).setZ(dir.getX());
Vector sideB = dir.clone().setX(dir.getZ()).setZ(-dir.getX());
Location start = player.getLocation().clone().add(sideA.multiply(4).toLocation(player.getWorld()));
Location end = player.getLocation().clone().add(sideB.multiply(4).toLocation(player.getWorld()));
RainbowTauntEffect rainbowTauntEffect = new RainbowTauntEffect(start, Manager.getPlugin());
rainbowTauntEffect.setTargetLocation(new EffectLocation(end));
rainbowTauntEffect.start();
}
@Override
public void onPlay(Player player)
{
}
@Override
public void onFinish(Player player)
{
}
}

View File

@ -0,0 +1,22 @@
package mineplex.core.gadget.set.suits;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksBoots;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksChestplate;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksHat;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksLeggings;
import mineplex.core.gadget.types.GadgetSet;
public class SetStPatricksSuit extends GadgetSet
{
public SetStPatricksSuit(GadgetManager manager)
{
super(manager, "St Patrick's Suit", "You're so rich that gold falls out of your pocket with every step!",
manager.getGadget(OutfitStPatricksHat.class),
manager.getGadget(OutfitStPatricksChestplate.class),
manager.getGadget(OutfitStPatricksLeggings.class),
manager.getGadget(OutfitStPatricksBoots.class));
}
}

View File

@ -26,6 +26,7 @@ public abstract class MorphGadget extends Gadget
public void applyArmor(Player player, boolean message) public void applyArmor(Player player, boolean message)
{ {
Manager.removeGadgetType(player, GadgetType.MORPH, this); Manager.removeGadgetType(player, GadgetType.MORPH, this);
Manager.removeGadgetType(player, GadgetType.COSTUME);
_active.add(player); _active.add(player);

View File

@ -1,5 +1,7 @@
package mineplex.core.gadget.types; package mineplex.core.gadget.types;
import java.time.YearMonth;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -30,6 +32,11 @@ public abstract class ParticleGadget extends Gadget
super(manager, GadgetType.PARTICLE, name, desc, cost, mat, data, 1, altNames); super(manager, GadgetType.PARTICLE, name, desc, cost, mat, data, 1, altNames);
} }
public ParticleGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data, YearMonth yearMonth, String...altNames)
{
super(manager, GadgetType.PARTICLE, name, desc, cost, mat, data, yearMonth, 1, altNames);
}
@Override @Override
public void enableCustom(Player player, boolean message) public void enableCustom(Player player, boolean message)
{ {

View File

@ -70,6 +70,7 @@ public abstract class TauntGadget extends Gadget
@Override @Override
public void disableCustom(Player player, boolean message) public void disableCustom(Player player, boolean message)
{ {
super.disableCustom(player, message);
finish(player); finish(player);
} }

View File

@ -110,6 +110,7 @@ public abstract class WinEffectGadget extends Gadget
} }
finally finally
{ {
UtilServer.getPlayersCollection().forEach(UtilPlayer::showForAll);
_player = null; _player = null;
_baseLocation = null; _baseLocation = null;
_team.clear(); _team.clear();

View File

@ -35,6 +35,6 @@ public class MessageAdminCommand extends CommandBase<MessageManager>
@Override @Override
public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args) public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args)
{ {
return tabCompletePlayerNames(sender, commandLabel, args); return tabCompletePlayerNames(sender, args);
} }
} }

View File

@ -45,6 +45,6 @@ public class MessageCommand extends CommandBase<MessageManager>
@Override @Override
public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args) public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args)
{ {
return tabCompletePlayerNames(sender, commandLabel, args); return tabCompletePlayerNames(sender, args);
} }
} }

View File

@ -11,6 +11,8 @@ import org.bukkit.entity.Chicken;
import org.bukkit.entity.EnderDragon; import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilAlg;
@ -29,7 +31,7 @@ public class DragonData extends MountData
public float Pitch = 0; public float Pitch = 0;
public Vector Velocity = new Vector(0,0,0); public Vector Velocity = new Vector(0,0,0);
public Entity Chicken; public Chicken Chicken;
public DragonData(DragonMount dragonMount, Player rider) public DragonData(DragonMount dragonMount, Player rider)
{ {
@ -50,6 +52,7 @@ public class DragonData extends MountData
rider.getWorld().playSound(rider.getLocation(), Sound.ENDERDRAGON_GROWL, 20f, 1f); rider.getWorld().playSound(rider.getLocation(), Sound.ENDERDRAGON_GROWL, 20f, 1f);
Chicken = rider.getWorld().spawn(rider.getLocation(), Chicken.class); Chicken = rider.getWorld().spawn(rider.getLocation(), Chicken.class);
Chicken.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 99999999, 1));
Dragon.setPassenger(Chicken); Dragon.setPassenger(Chicken);
Chicken.setPassenger(getOwner()); Chicken.setPassenger(getOwner());

View File

@ -35,6 +35,7 @@ import mineplex.core.mount.types.MountMule;
import mineplex.core.mount.types.MountNightmareSteed; import mineplex.core.mount.types.MountNightmareSteed;
import mineplex.core.mount.types.MountSlime; import mineplex.core.mount.types.MountSlime;
import mineplex.core.mount.types.MountSpider; import mineplex.core.mount.types.MountSpider;
import mineplex.core.mount.types.MountStPatricksHorse;
import mineplex.core.mount.types.MountTitan; import mineplex.core.mount.types.MountTitan;
import mineplex.core.mount.types.MountUndead; import mineplex.core.mount.types.MountUndead;
import mineplex.core.mount.types.MountValentinesSheep; import mineplex.core.mount.types.MountValentinesSheep;
@ -48,7 +49,7 @@ public class MountManager extends MiniPlugin
private DisguiseManager _disguiseManager; private DisguiseManager _disguiseManager;
private List<Mount<?>> _types; private List<Mount<?>> _types;
private NautHashMap<Player, Mount<?>> _playerActiveMountMap = new NautHashMap<Player, Mount<?>>(); private NautHashMap<Player, Mount<?>> _playerActiveMountMap = new NautHashMap<>();
public MountManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager, BlockRestore blockRestore, DisguiseManager disguiseManager) public MountManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager, BlockRestore blockRestore, DisguiseManager disguiseManager)
{ {
@ -79,10 +80,10 @@ public class MountManager extends MiniPlugin
_types.add(new MountValentinesSheep(this)); _types.add(new MountValentinesSheep(this));
_types.add(new MountFreedomHorse(this)); _types.add(new MountFreedomHorse(this));
_types.add(new MountNightmareSteed(this)); _types.add(new MountNightmareSteed(this));
// Hidden in this update
_types.add(new MountChicken(this)); _types.add(new MountChicken(this));
_types.add(new MountCake(this)); _types.add(new MountCake(this));
_types.add(new MountLoveTrain(this)); _types.add(new MountLoveTrain(this));
_types.add(new MountStPatricksHorse(this));
//_types.add(new MountSheep(this)); //_types.add(new MountSheep(this));
} }

View File

@ -50,6 +50,8 @@ public class MountSlime extends Mount<SingleEntityMountData<Slime>>
mount.getEntity().setCustomName(player.getName() + "'s " + getName()); mount.getEntity().setCustomName(player.getName() + "'s " + getName());
UtilEnt.removeTargetSelectors(mount.getEntity());
//Inform //Inform
UtilPlayer.message(player, F.main("Mount", "You spawned " + F.elem(getName()) + ".")); UtilPlayer.message(player, F.main("Mount", "You spawned " + F.elem(getName()) + "."));

View File

@ -0,0 +1,115 @@
package mineplex.core.mount.types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.entity.Horse;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.HorseJumpEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import mineplex.core.common.util.C;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilText;
import mineplex.core.mount.HorseMount;
import mineplex.core.mount.MountManager;
import mineplex.core.mount.SingleEntityMountData;
import mineplex.core.particleeffects.RainbowTrailEffect;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class MountStPatricksHorse extends HorseMount
{
private HashSet<Item> _items = new HashSet<>();
private Map<SingleEntityMountData<Horse>, RainbowTrailEffect> _trailMap = new HashMap<>();
public MountStPatricksHorse(MountManager manager)
{
super(manager, "Rainbow Horse",
UtilText.splitLinesToArray(new String[]{C.cGray + "You know the cow that jumped over the moon? Total show off."}, LineFormat.LORE),
Material.CAULDRON_ITEM, (byte) 0, -18, Horse.Color.WHITE, Horse.Style.WHITE, Horse.Variant.HORSE, 1, null);
}
@Override
public void enableCustom(Player player)
{
super.enableCustom(player);
SingleEntityMountData<Horse> horseData = getActive().get(player);
horseData.getEntity().getInventory().setArmor(new ItemStack(Material.GOLD_BARDING));
_trailMap.put(horseData, new RainbowTrailEffect(horseData.getEntity(), Manager.getPlugin(), _items));
_trailMap.get(horseData).start();
}
@Override
public void disable(Player player)
{
super.disable(player);
List<SingleEntityMountData<Horse>> toRemove = new ArrayList<>();
for (SingleEntityMountData<Horse> horseData : _trailMap.keySet())
{
if (horseData.getOwner().equals(player))
toRemove.add(horseData);
}
for (SingleEntityMountData<Horse> horseData : toRemove)
{
_trailMap.get(horseData).stop();
_trailMap.remove(horseData);
}
}
@EventHandler
public void horseJump(HorseJumpEvent event)
{
for (SingleEntityMountData<Horse> horseData : _trailMap.keySet())
{
if (horseData.getEntity().equals(event.getEntity()))
{
if (Recharge.Instance.use(horseData.getOwner(), getName(), 2500, false, false, "Cosmetics"))
{
_trailMap.get(horseData).setJumping(true);
}
}
}
}
@EventHandler
public void onItemPickup(PlayerPickupItemEvent event)
{
if (_items.contains(event.getItem()))
{
event.setCancelled(true);
}
}
@EventHandler
public void onUpdate(UpdateEvent event)
{
if (event.getType() == UpdateType.TICK)
cleanItems();
}
public void cleanItems()
{
Iterator<Item> it = _items.iterator();
while (it.hasNext())
{
Item item = it.next();
if (item.getTicksLived() >= 20)
{
item.remove();
it.remove();
}
}
}
}

View File

@ -4,6 +4,12 @@ import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import com.mojang.authlib.GameProfile;
import mineplex.core.aprilfools.AprilFoolsManager;
import mineplex.core.common.skin.SkinData;
import mineplex.core.disguise.DisguiseManager;
import mineplex.core.disguise.disguises.DisguisePlayer;
import mineplex.core.utils.UtilGameProfile;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
@ -84,6 +90,8 @@ public class NpcManager extends MiniPlugin
final Map<UUID, Npc> _npcMap = new HashMap<>(); final Map<UUID, Npc> _npcMap = new HashMap<>();
private final Set<UUID> _npcDeletingPlayers = new HashSet<>(); private final Set<UUID> _npcDeletingPlayers = new HashSet<>();
private final DisguiseManager _disguise;
public NpcManager(JavaPlugin plugin, Creature creature) public NpcManager(JavaPlugin plugin, Creature creature)
{ {
super("NpcManager", plugin); super("NpcManager", plugin);
@ -100,6 +108,8 @@ public class NpcManager extends MiniPlugin
_plugin.getServer().getPluginManager().registerEvents(this, _plugin); _plugin.getServer().getPluginManager().registerEvents(this, _plugin);
_disguise = require(DisguiseManager.class);
try try
{ {
loadNpcs(); loadNpcs();
@ -295,15 +305,17 @@ public class NpcManager extends MiniPlugin
public Entity spawnNpc(Npc npc) public Entity spawnNpc(Npc npc)
{ {
LivingEntity entity = (LivingEntity) _creature.SpawnEntity(npc.getLocation(), EntityType.valueOf(npc.getDatabaseRecord().getEntityType())); LivingEntity entity = (LivingEntity) _creature.SpawnEntity(npc.getLocation(), EntityType.valueOf(npc.getDatabaseRecord().getEntityType()));
String name = null;
if (npc.getDatabaseRecord().getName() == null) if (npc.getDatabaseRecord().getName() == null)
{ {
entity.setCustomNameVisible(false); entity.setCustomNameVisible(false);
entity.setCustomName(ChatColor.RESET.toString()); entity.setCustomName(ChatColor.RESET.toString());
name = entity.getCustomName();
} }
else else
{ {
String name = npc.getDatabaseRecord().getName(); name = npc.getDatabaseRecord().getName();
for (ChatColor color : ChatColor.values()) for (ChatColor color : ChatColor.values())
name = name.replace("(" + color.name().toLowerCase() + ")", color.toString()); name = name.replace("(" + color.name().toLowerCase() + ")", color.toString());
name = ChatColor.translateAlternateColorCodes('&', name); name = ChatColor.translateAlternateColorCodes('&', name);

View File

@ -0,0 +1,33 @@
package mineplex.core.particleeffects;
import java.awt.Color;
import org.bukkit.Location;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import mineplex.core.common.shape.ShapeWings;
import mineplex.core.common.util.UtilParticle;
public class CloverEffect extends Effect
{
private ShapeWings _cloverBlack = new ShapeWings(UtilParticle.ParticleType.RED_DUST.particleName, new Vector(1, 1, 1), 1, 0, '#', ShapeWings.DEFAULT_ROTATION, ShapeWings.FOUR_LEAF_CLOVER);
private ShapeWings _cloverDarkGreen = new ShapeWings(UtilParticle.ParticleType.RED_DUST.particleName, new Vector(1, 1, 1), 1, 0, '%', ShapeWings.DEFAULT_ROTATION, ShapeWings.FOUR_LEAF_CLOVER);
private ShapeWings _cloverGreen = new ShapeWings(UtilParticle.ParticleType.RED_DUST.particleName, new Vector(1, 1, 1), 1, 0, '*', ShapeWings.DEFAULT_ROTATION, ShapeWings.FOUR_LEAF_CLOVER);
public CloverEffect(JavaPlugin plugin, Location location)
{
super(-1, new EffectLocation(location), plugin, 1);
}
@Override
public void runEffect()
{
Location location = getEffectLocation().getLocation();
_cloverBlack.displayColored(location, Color.BLACK);
_cloverDarkGreen.displayColored(location, new Color(0, 100, 0));
_cloverGreen.displayColored(location, Color.GREEN);
}
}

View File

@ -0,0 +1,63 @@
package mineplex.core.particleeffects;
import java.awt.Color;
import org.bukkit.Location;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.particles.ColoredParticle;
import mineplex.core.common.util.particles.DustSpellColor;
public class RainbowTauntEffect extends Effect
{
private static final int PARTICLES = 25;
private static final double HEIGHT = 4;
private static final Color RED = new Color(255, 0, 0);
private static final Color ORANGE = new Color(255, 127, 0);
private static final Color YELLOW = new Color(255, 255, 0);
private static final Color GREEN = new Color(0, 255, 0);
private static final Color BLUE = new Color(0, 0, 255);
private static final Color INDIGO = new Color(75, 0, 130);
private static final Color VIOLET = new Color(143, 0, 255);
public RainbowTauntEffect(Location start, JavaPlugin javaPlugin)
{
super(16, new EffectLocation(start), javaPlugin, 5);
}
@Override
public void runEffect()
{
Location location = getEffectLocation().getFixedLocation();
Location target = getTargetLocation().getFixedLocation();
Color[] colors = new Color[]{VIOLET, INDIGO, BLUE, GREEN, YELLOW, ORANGE, RED};
for (int i = 0; i < 7; i++)
{
line(location.clone().add(0, 0.25 * i, 0), target.clone().add(0, 0.25 * i, 0), colors[i]);
}
}
private void line(Location startLocation, Location targetLocation, Color color)
{
Vector link = targetLocation.toVector().subtract(startLocation.toVector());
float length = (float) link.length();
float pitch = (float) (4 * HEIGHT / Math.pow(length, 2));
for (int i = 0; i < PARTICLES; i++)
{
Vector v = link.clone().normalize().multiply(length * i / PARTICLES);
float x = ((float) i / PARTICLES) * length - length / 2;
float y = (float) (-pitch * Math.pow(x, 2) + HEIGHT);
startLocation.add(v).add(0, y, 0);
ColoredParticle coloredParticle = new ColoredParticle(UtilParticle.ParticleType.RED_DUST,
new DustSpellColor(color), startLocation);
coloredParticle.display();
startLocation.subtract(0, y, 0).subtract(v);
}
}
}

View File

@ -0,0 +1,113 @@
package mineplex.core.particleeffects;
import java.awt.Color;
import java.util.HashSet;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.particles.ColoredParticle;
import mineplex.core.common.util.particles.DustSpellColor;
public class RainbowTrailEffect extends Effect
{
private HashSet<Item> _items;
private long _count, _jumpingTimer = 0;
private boolean _isJumping = false;
private Entity _entity;
private Color _red = new Color(255, 0, 0);
private Color _orange = new Color(255, 127, 0);
private Color _yellow = new Color(255, 255, 0);
private Color _green = new Color(0, 255, 0);
private Color _blue = new Color(0, 0, 255);
private Color _indigo = new Color(75, 0, 130);
private Color _violet = new Color(143, 0, 255);
private Color _color = _red;
public RainbowTrailEffect(Entity entity, JavaPlugin javaPlugin, HashSet<Item> items)
{
super(-1, new EffectLocation(entity), javaPlugin);
_entity = entity;
_items = items;
}
@Override
public void runEffect()
{
if (!_entity.isValid() || _entity.isDead())
{
stop();
return;
}
ColoredParticle coloredParticle = new ColoredParticle(UtilParticle.ParticleType.RED_DUST,
new DustSpellColor(_color), _effectLocation.getLocation().clone().add(0, .5, 0));
for (int i = 0; i < 7; i++)
{
coloredParticle.setLocation(_effectLocation.getLocation().clone().add(0, .5, 0));
coloredParticle.display();
if (_isJumping)
{
coloredParticle.setLocation(_effectLocation.getLocation().clone().add(.25, .5, 0));
coloredParticle.display();
coloredParticle.setLocation(_effectLocation.getLocation().clone().add(0, .5, .25));
coloredParticle.display();
}
}
if (_isJumping)
{
_jumpingTimer++;
if (_jumpingTimer >= 30)
{
setJumping(false);
_jumpingTimer = 0;
}
}
_count++;
if (_count % 5 == 0)
{
if (_color.equals(_red))
_color = _orange;
else if (_color.equals(_orange))
_color = _yellow;
else if (_color.equals(_yellow))
_color = _green;
else if (_color.equals(_green))
_color = _blue;
else if (_color.equals(_blue))
_color = _indigo;
else if (_color.equals(_indigo))
_color = _violet;
else
_color = _red;
}
if (_count == Long.MAX_VALUE - 1)
_count = 0;
}
public void setJumping(boolean jumping)
{
_isJumping = jumping;
if (_isJumping)
{
ItemStack itemStack = new ItemStack(Material.GOLD_INGOT);
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName("DROPPED" + System.currentTimeMillis() + UtilMath.random.nextInt());
itemStack.setItemMeta(itemMeta);
Item gold = _entity.getWorld().dropItem(_entity.getLocation().add(0.5, 1.5, 0.5), itemStack);
_items.add(gold);
gold.setVelocity(new Vector((Math.random()-0.5)*0.3, Math.random()-0.4, (Math.random()-0.5)*0.3));
}
}
}

View File

@ -1,6 +1,5 @@
package mineplex.core.party.command.cli; package mineplex.core.party.command.cli;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -39,7 +38,7 @@ public class PartyInviteCommand extends CommandBase<PartyManager>
Player player = (Player) sender; Player player = (Player) sender;
Party party = Plugin.getPartyByPlayer(player); Party party = Plugin.getPartyByPlayer(player);
return tabCompletePlayerNames(sender, commandLabel, args, other -> party == null || !party.isMember(other)); return tabCompletePlayerNames(sender, args, other -> party == null || !party.isMember(other));
} }
return null; return null;

View File

@ -50,7 +50,7 @@ public class PartyKickCommand extends CommandBase<PartyManager>
if (party != null && party.isOwner(player)) if (party != null && party.isOwner(player))
{ {
return tabCompletePlayerNames(sender, commandLabel, args, other -> other != player && party.isMember(other)); return tabCompletePlayerNames(sender, args, other -> other != player && party.isMember(other));
} }
} }

View File

@ -77,7 +77,7 @@ public class PartyTransferOwnerCommand extends CommandBase<PartyManager>
if (party != null && party.isOwner(player)) if (party != null && party.isOwner(player))
{ {
return tabCompletePlayerNames(sender, commandLabel, args, other -> other != player && party.isMember(other)); return tabCompletePlayerNames(sender, args, other -> other != player && party.isMember(other));
} }
} }

View File

@ -38,7 +38,7 @@ public class PartyGUIInviteCommand extends CommandBase<PartyManager>
Player player = (Player) sender; Player player = (Player) sender;
Party party = Plugin.getPartyByPlayer(player); Party party = Plugin.getPartyByPlayer(player);
return tabCompletePlayerNames(sender, commandLabel, args, other -> party == null || !party.isMember(other)); return tabCompletePlayerNames(sender, args, other -> party == null || !party.isMember(other));
} }
return null; return null;

View File

@ -396,6 +396,20 @@ public class PetManager extends MiniClientPlugin<PetClient>
UtilEnt.silence(villager, true); UtilEnt.silence(villager, true);
_trueLovePets.put(zombie, new TrueLoveData(player, zombie, villager)); _trueLovePets.put(zombie, new TrueLoveData(player, zombie, villager));
} }
else if (petType.equals(PetType.LEPRECHAUN))
{
Zombie zombie = (Zombie) pet;
zombie.setBaby(true);
UtilEnt.silence(zombie, true);
zombie.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1, false, false));
zombie.getEquipment().setHelmet(SkinData.LEPRECHAUN.getSkull());
zombie.getEquipment().setChestplate(ItemStackFactory.Instance.createColoredLeatherArmor(1, org.bukkit.Color.fromRGB(0, 153, 0)));
zombie.getEquipment().setLeggings(ItemStackFactory.Instance.createColoredLeatherArmor(2, org.bukkit.Color.fromRGB(0, 153, 0)));
zombie.getEquipment().setBoots(ItemStackFactory.Instance.createColoredLeatherArmor(3, org.bukkit.Color.fromRGB(0, 153, 0)));
}
_activePetOwnerTypes.put(player.getName(), petType); _activePetOwnerTypes.put(player.getName(), petType);
_activePetOwners.put(player.getName(), pet); _activePetOwners.put(player.getName(), pet);

View File

@ -6,7 +6,9 @@ import java.util.Optional;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import mineplex.core.common.skin.SkinData;
import mineplex.core.pet.sales.PetSalesPackage; import mineplex.core.pet.sales.PetSalesPackage;
public enum PetType public enum PetType
@ -30,7 +32,8 @@ public enum PetType
BLAZE("Grim Reaper", EntityType.BLAZE, -8, "Aww isn't he so cute with his little wings and little scythe?"), BLAZE("Grim Reaper", EntityType.BLAZE, -8, "Aww isn't he so cute with his little wings and little scythe?"),
GINGERBREAD_MAN("Gingerbread Man", EntityType.ZOMBIE, -16, "Looks like you can catch him after all."), GINGERBREAD_MAN("Gingerbread Man", EntityType.ZOMBIE, -16, "Looks like you can catch him after all."),
CUPID_PET("Cupid", EntityType.ZOMBIE, -17, "Sometimes you need a little extra help finding true Love. Why not have Cupid help you out?", Material.BOW, (byte) 0), CUPID_PET("Cupid", EntityType.ZOMBIE, -17, "Sometimes you need a little extra help finding true Love. Why not have Cupid help you out?", Material.BOW, (byte) 0),
TRUE_LOVE_PET("True Love", EntityType.ZOMBIE, -14, "Sometimes love means chasing the person of your dreams until you catch them.", Material.APPLE, YearMonth.of(2017, Month.FEBRUARY)) TRUE_LOVE_PET("True Love", EntityType.ZOMBIE, -14, "Sometimes love means chasing the person of your dreams until you catch them.", Material.APPLE, YearMonth.of(2017, Month.FEBRUARY)),
LEPRECHAUN("Leprechaun", EntityType.ZOMBIE, -18, "Apparently this little guy lost his Pot of Gold in the war.", SkinData.LEPRECHAUN.getSkull())
// TODO CHECK IF LOBBY IS 1.9+ // TODO CHECK IF LOBBY IS 1.9+
// Not in this update // Not in this update
//SHULKER("Shulker Pet", EntityType.BAT, 0, "Is it a turtle or an alien? Either way its shot can be really UPLIFTING.") //SHULKER("Shulker Pet", EntityType.BAT, 0, "Is it a turtle or an alien? Either way its shot can be really UPLIFTING.")
@ -42,6 +45,7 @@ public enum PetType
private final Material _material; private final Material _material;
private final byte _data; private final byte _data;
private YearMonth _yearMonth; private YearMonth _yearMonth;
private ItemStack _displayItem;
PetType(String name, EntityType entityType, int price) PetType(String name, EntityType entityType, int price)
{ {
@ -84,6 +88,12 @@ public enum PetType
_yearMonth = yearMonth; _yearMonth = yearMonth;
} }
PetType(String name, EntityType entityType, int price, String lore, ItemStack displayItem)
{
this(name, entityType, price, lore);
_displayItem = displayItem;
}
public String getName() public String getName()
{ {
return _name; return _name;
@ -114,6 +124,15 @@ public enum PetType
return _data; return _data;
} }
public ItemStack getDisplayItem()
{
if (_displayItem == null)
{
return new ItemStack(_material, 1, _data);
}
return _displayItem;
}
public YearMonth getYearMonth() public YearMonth getYearMonth()
{ {
return _yearMonth; return _yearMonth;

View File

@ -10,6 +10,7 @@ import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -195,6 +196,11 @@ public class Portal extends MiniPlugin
*/ */
public void sendPlayer(final Player player, String serverName) public void sendPlayer(final Player player, String serverName)
{ {
if (player.getGameMode() == GameMode.SPECTATOR)
{
player.setSpectatorTarget(null);
}
ByteArrayOutputStream b = new ByteArrayOutputStream(); ByteArrayOutputStream b = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(b); DataOutputStream out = new DataOutputStream(b);

View File

@ -0,0 +1,44 @@
package mineplex.core.powerplayclub;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class PPCDataRequestEvent extends Event
{
private static final HandlerList handlers = new HandlerList();
private Player _player;
private PowerPlayData _data;
public PPCDataRequestEvent(Player player)
{
_player = player;
_data = null;
}
public Player getPlayer()
{
return _player;
}
public PowerPlayData getData()
{
return _data;
}
public void setData(PowerPlayData data)
{
_data = data;;
}
public HandlerList getHandlers()
{
return handlers;
}
public static HandlerList getHandlerList()
{
return handlers;
}
}

View File

@ -25,6 +25,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.account.CoreClientManager; import mineplex.core.account.CoreClientManager;
import mineplex.core.account.ILoginProcessor; import mineplex.core.account.ILoginProcessor;
import mineplex.core.common.util.UtilServer;
import mineplex.core.donation.DonationManager; import mineplex.core.donation.DonationManager;
import mineplex.serverdata.database.DBPool; import mineplex.serverdata.database.DBPool;
@ -121,8 +122,16 @@ public class PowerPlayClubRepository implements Listener {
_cachedPlayerData.remove(event.getPlayer().getUniqueId()); _cachedPlayerData.remove(event.getPlayer().getUniqueId());
} }
@EventHandler
public void onDataRequested(PPCDataRequestEvent event)
{
event.setData(getCachedData(event.getPlayer()));
}
public CompletableFuture<Void> addSubscription(int accountId, LocalDate date, String duration) public CompletableFuture<Void> addSubscription(int accountId, LocalDate date, String duration)
{ {
UtilServer.CallEvent(new SubscriptionAddEvent(accountId, duration));
return CompletableFuture.supplyAsync(() -> return CompletableFuture.supplyAsync(() ->
{ {
try (Connection connection = DBPool.getAccount().getConnection()) try (Connection connection = DBPool.getAccount().getConnection())
@ -133,7 +142,8 @@ public class PowerPlayClubRepository implements Listener {
statement.setString(3, duration); statement.setString(3, duration);
statement.executeUpdate(); statement.executeUpdate();
} catch (SQLException e) }
catch (SQLException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -36,6 +36,7 @@ public class PowerPlayClubRewards
.put(YearMonth.of(2017, Month.JANUARY), new UnknownSalesPackageItem("Over Easy Morph")) .put(YearMonth.of(2017, Month.JANUARY), new UnknownSalesPackageItem("Over Easy Morph"))
.put(YearMonth.of(2017, Month.FEBRUARY), new PetItem(PetType.TRUE_LOVE_PET)) .put(YearMonth.of(2017, Month.FEBRUARY), new PetItem(PetType.TRUE_LOVE_PET))
.put(YearMonth.of(2017, Month.MARCH), new UnknownSalesPackageItem("Gold Pot Morph")) .put(YearMonth.of(2017, Month.MARCH), new UnknownSalesPackageItem("Gold Pot Morph"))
.put(YearMonth.of(2017, Month.APRIL), new UnknownSalesPackageItem("Bumblebee's Wings"))
.build(); .build();
public interface PowerPlayClubItem public interface PowerPlayClubItem

View File

@ -0,0 +1,38 @@
package mineplex.core.powerplayclub;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class SubscriptionAddEvent extends Event
{
private static final HandlerList handlers = new HandlerList();
private int _accountId;
private String _duration;
public SubscriptionAddEvent(int accountId, String duration)
{
_accountId = accountId;
_duration = duration;
}
public int getAccountId()
{
return _accountId;
}
public String getDuration()
{
return _duration;
}
public HandlerList getHandlers()
{
return handlers;
}
public static HandlerList getHandlerList()
{
return handlers;
}
}

View File

@ -143,6 +143,6 @@ public class PunishCommand extends CommandBase<Punish>
@Override @Override
public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args) public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args)
{ {
return tabCompletePlayerNames(sender, commandLabel, args); return tabCompletePlayerNames(sender, args);
} }
} }

View File

@ -9,6 +9,7 @@ import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import mineplex.core.Managers;
import mineplex.core.account.CoreClientManager; import mineplex.core.account.CoreClientManager;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
import mineplex.core.common.util.banner.CountryFlag; import mineplex.core.common.util.banner.CountryFlag;
@ -91,6 +92,10 @@ import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitBoots;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitChestplate; import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitChestplate;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitHelmet; import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitHelmet;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitLeggings; import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitLeggings;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksBoots;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksChestplate;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksHat;
import mineplex.core.gadget.gadgets.outfit.stpatricks.OutfitStPatricksLeggings;
import mineplex.core.gadget.gadgets.particle.ParticleChristmasTree; import mineplex.core.gadget.gadgets.particle.ParticleChristmasTree;
import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes; import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes;
import mineplex.core.gadget.gadgets.particle.ParticleFairy; import mineplex.core.gadget.gadgets.particle.ParticleFairy;
@ -113,6 +118,7 @@ import mineplex.core.gadget.gadgets.particle.shadow.ParticleFoot;
import mineplex.core.gadget.gadgets.particle.vampire.ParticleBlood; import mineplex.core.gadget.gadgets.particle.vampire.ParticleBlood;
import mineplex.core.gadget.gadgets.particle.wisdom.ParticleEnchant; import mineplex.core.gadget.gadgets.particle.wisdom.ParticleEnchant;
import mineplex.core.gadget.gadgets.taunts.BlowAKissTaunt; import mineplex.core.gadget.gadgets.taunts.BlowAKissTaunt;
import mineplex.core.gadget.gadgets.taunts.RainbowTaunt;
import mineplex.core.gadget.gadgets.wineffect.WinEffectBabyChicken; import mineplex.core.gadget.gadgets.wineffect.WinEffectBabyChicken;
import mineplex.core.gadget.gadgets.wineffect.WinEffectFlames; import mineplex.core.gadget.gadgets.wineffect.WinEffectFlames;
import mineplex.core.gadget.gadgets.wineffect.WinEffectHalloween; import mineplex.core.gadget.gadgets.wineffect.WinEffectHalloween;
@ -140,6 +146,7 @@ import mineplex.core.mount.types.MountMule;
import mineplex.core.mount.types.MountNightmareSteed; import mineplex.core.mount.types.MountNightmareSteed;
import mineplex.core.mount.types.MountSlime; import mineplex.core.mount.types.MountSlime;
import mineplex.core.mount.types.MountSpider; import mineplex.core.mount.types.MountSpider;
import mineplex.core.mount.types.MountStPatricksHorse;
import mineplex.core.mount.types.MountUndead; import mineplex.core.mount.types.MountUndead;
import mineplex.core.mount.types.MountValentinesSheep; import mineplex.core.mount.types.MountValentinesSheep;
import mineplex.core.mount.types.MountZombie; import mineplex.core.mount.types.MountZombie;
@ -157,9 +164,11 @@ import mineplex.core.reward.rewards.PowerPlayReward;
import mineplex.core.reward.rewards.RankReward; import mineplex.core.reward.rewards.RankReward;
import mineplex.core.reward.rewards.RuneAmplifierReward; import mineplex.core.reward.rewards.RuneAmplifierReward;
import mineplex.core.reward.rewards.SpinTicketReward; import mineplex.core.reward.rewards.SpinTicketReward;
import mineplex.core.reward.rewards.TitleReward;
import mineplex.core.reward.rewards.TreasureShardReward; import mineplex.core.reward.rewards.TreasureShardReward;
import mineplex.core.reward.rewards.UnknownPackageReward; import mineplex.core.reward.rewards.UnknownPackageReward;
import mineplex.core.stats.StatsManager; import mineplex.core.stats.StatsManager;
import mineplex.core.titles.tracks.TrackManager;
import mineplex.core.treasure.TreasureType; import mineplex.core.treasure.TreasureType;
public class RewardManager public class RewardManager
@ -167,6 +176,7 @@ public class RewardManager
private EnumMap<RewardPool.Type, RewardPool> _rewardPools; private EnumMap<RewardPool.Type, RewardPool> _rewardPools;
private Random _random; private Random _random;
private final TrackManager _trackManager = Managers.require(TrackManager.class);
private CoreClientManager _clientManager; private CoreClientManager _clientManager;
private DonationManager _donationManager; private DonationManager _donationManager;
private InventoryManager _inventoryManager; private InventoryManager _inventoryManager;
@ -414,6 +424,37 @@ public class RewardManager
addMineStrikeSkin(Type.MINESTRIKE, MineStrikeSkin.P90_Asiimov, rarity, 100, 1000); addMineStrikeSkin(Type.MINESTRIKE, MineStrikeSkin.P90_Asiimov, rarity, 100, 1000);
addMineStrikeSkin(Type.MINESTRIKE, MineStrikeSkin.SG553_Pulse, rarity, 100, 1000); addMineStrikeSkin(Type.MINESTRIKE, MineStrikeSkin.SG553_Pulse, rarity, 100, 1000);
// Titles
addTitle(Type.NORMAL, "shrug", rarity, 10, 500);
addTitle(Type.NORMAL, "tableflip", rarity, 10, 500);
addTitle(Type.NORMAL, "tablerespecter", rarity, 15, 500);
addTitle(Type.NORMAL, "tableflip-disgusted", rarity, 15, 500);
addTitle(Type.NORMAL, "tableflip-enraged", rarity, 15, 500);
addTitle(Type.NORMAL, "tableflip-riot", rarity, 10, 500);
addTitle(Type.NORMAL, "teddy-bear", rarity, 10, 500);
addTitle(Type.NORMAL, "disgust", rarity, 10, 500);
addTitle(Type.NORMAL, "old-man", rarity, 5, 500);
addTitle(Type.NORMAL, "jake", rarity, 5, 500);
addTitle(Type.NORMAL, "finn", rarity, 5, 500);
addTitle(Type.NORMAL, "finn-and-jake", rarity, 5, 500);
addTitle(Type.NORMAL, "boxer", rarity, 5, 500);
addTitle(Type.NORMAL, "zoidberg", rarity, 5, 500);
addTitle(Type.OMEGA, "shrug", rarity, 10, 500);
addTitle(Type.OMEGA, "tableflip", rarity, 10, 500);
addTitle(Type.OMEGA, "tablerespecter", rarity, 15, 500);
addTitle(Type.OMEGA, "tableflip-disgusted", rarity, 15, 500);
addTitle(Type.OMEGA, "tableflip-enraged", rarity, 15, 500);
addTitle(Type.OMEGA, "tableflip-riot", rarity, 10, 500);
addTitle(Type.OMEGA, "teddy-bear", rarity, 10, 500);
addTitle(Type.OMEGA, "disgust", rarity, 10, 500);
addTitle(Type.OMEGA, "old-man", rarity, 5, 500);
addTitle(Type.OMEGA, "jake", rarity, 5, 500);
addTitle(Type.OMEGA, "finn", rarity, 5, 500);
addTitle(Type.OMEGA, "finn-and-jake", rarity, 5, 500);
addTitle(Type.OMEGA, "boxer", rarity, 5, 500);
addTitle(Type.OMEGA, "zoidberg", rarity, 5, 500);
// VALENTINES // VALENTINES
//Hats //Hats
@ -553,6 +594,11 @@ public class RewardManager
addPetReward(Type.LOVECHEST, PetType.CUPID_PET, rarity, 50, 500); addPetReward(Type.LOVECHEST, PetType.CUPID_PET, rarity, 50, 500);
addGadget(Type.LOVECHEST, getGadget(WinEffectLoveIsABattlefield.class), rarity, 100, 500); addGadget(Type.LOVECHEST, getGadget(WinEffectLoveIsABattlefield.class), rarity, 100, 500);
// ST PATRICKS
addGadget(Type.STPATRICKS, getGadget(OutfitStPatricksChestplate.class), rarity, 50);
addGadget(Type.STPATRICKS, getGadget(OutfitStPatricksLeggings.class), rarity, 50);
addGadget(Type.STPATRICKS, getGadget(OutfitStPatricksBoots.class), rarity, 50);
} }
public void addLegendary() public void addLegendary()
@ -624,6 +670,38 @@ public class RewardManager
addMineStrikeSkin(Type.MINESTRIKE, MineStrikeSkin.XM1014_Pig_Gun, rarity, 10, 7500); addMineStrikeSkin(Type.MINESTRIKE, MineStrikeSkin.XM1014_Pig_Gun, rarity, 10, 7500);
addMineStrikeSkin(Type.MINESTRIKE, MineStrikeSkin.M4A4_Enderman, rarity, 10, 7500); addMineStrikeSkin(Type.MINESTRIKE, MineStrikeSkin.M4A4_Enderman, rarity, 10, 7500);
// Titles
addTitle(Type.NORMAL, "ayyye", rarity, 25, 500);
addTitle(Type.NORMAL, "ameno", rarity, 15, 5000);
addTitle(Type.NORMAL, "magician", rarity, 25, 5000);
addTitle(Type.NORMAL, "fireball", rarity, 75, 5000);
addTitle(Type.NORMAL, "magic-missile", rarity, 75, 5000);
addTitle(Type.NORMAL, "pewpewpew", rarity, 75, 5000);
addTitle(Type.NORMAL, "stardust", rarity, 60, 5000);
addTitle(Type.NORMAL, "blow-a-kiss", rarity, 60, 5000);
addTitle(Type.NORMAL, "cool-guy", rarity, 60, 5000);
addTitle(Type.NORMAL, "deal-with-it", rarity, 60, 5000);
addTitle(Type.NORMAL, "party-time", rarity, 55, 5000);
addTitle(Type.NORMAL, "lalala", rarity, 30, 5000);
addTitle(Type.NORMAL, "gotta-go", rarity, 30, 5000);
addTitle(Type.NORMAL, "whaaat", rarity, 30, 5000);
addTitle(Type.OMEGA, "ayyye", rarity, 25, 500);
addTitle(Type.OMEGA, "ameno", rarity, 15, 5000);
addTitle(Type.OMEGA, "magician", rarity, 25, 5000);
addTitle(Type.OMEGA, "fireball", rarity, 75, 5000);
addTitle(Type.OMEGA, "magic-missile", rarity, 75, 5000);
addTitle(Type.OMEGA, "pewpewpew", rarity, 75, 5000);
addTitle(Type.OMEGA, "stardust", rarity, 60, 5000);
addTitle(Type.OMEGA, "blow-a-kiss", rarity, 60, 5000);
addTitle(Type.OMEGA, "cool-guy", rarity, 60, 5000);
addTitle(Type.OMEGA, "deal-with-it", rarity, 60, 5000);
addTitle(Type.OMEGA, "party-time", rarity, 55, 5000);
addTitle(Type.OMEGA, "lalala", rarity, 30, 5000);
addTitle(Type.OMEGA, "gotta-go", rarity, 30, 5000);
addTitle(Type.OMEGA, "whaaat", rarity, 30, 5000);
//WINTER //WINTER
//Arrow Trails //Arrow Trails
@ -770,6 +848,14 @@ public class RewardManager
addGadget(Type.LOVECHEST, getGadget(MorphLoveDoctor.class), rarity, 30, 5000); addGadget(Type.LOVECHEST, getGadget(MorphLoveDoctor.class), rarity, 30, 5000);
addGadget(Type.LOVECHEST, getGadget(BlowAKissTaunt.class), rarity, 50, 5000); addGadget(Type.LOVECHEST, getGadget(BlowAKissTaunt.class), rarity, 50, 5000);
addGadget(Type.LOVECHEST, getGadget(ParticleWingsLove.class), rarity, 10, 5000); addGadget(Type.LOVECHEST, getGadget(ParticleWingsLove.class), rarity, 10, 5000);
// ST PATRICKS
addGadget(Type.STPATRICKS, getGadget(RainbowTaunt.class), rarity, 30);
addGadget(Type.STPATRICKS, getGadget(OutfitStPatricksHat.class), rarity, 15);
addPetReward(Type.STPATRICKS, PetType.LEPRECHAUN, rarity, 30);
addMount(Type.STPATRICKS, getMount(MountStPatricksHorse.class), rarity, 30);
} }
public UnknownPackageReward addMount(Type type, Mount<?> mount, RewardRarity rarity, int weight) public UnknownPackageReward addMount(Type type, Mount<?> mount, RewardRarity rarity, int weight)
@ -855,6 +941,11 @@ public class RewardManager
return addGadget(type, gadget, gadget.getDisplayName() + " (Minestrike Weapon Skin)", rarity, weight, shards); return addGadget(type, gadget, gadget.getDisplayName() + " (Minestrike Weapon Skin)", rarity, weight, shards);
} }
public void addTitle(Type type, String trackName, RewardRarity rarity, int weight, int shards)
{
addReward(type, new TitleReward(_trackManager.getTrackById(trackName), rarity, weight, shards));
}
public UnknownPackageReward addHat(Type type, HatType hatType, RewardRarity rarity, int weight) public UnknownPackageReward addHat(Type type, HatType hatType, RewardRarity rarity, int weight)
{ {
return addHat(type, hatType, rarity, weight, getShards(rarity)); return addHat(type, hatType, rarity, weight, getShards(rarity));

View File

@ -64,6 +64,7 @@ public class RewardPool
GINGERBREAD(false, 1), GINGERBREAD(false, 1),
MINESTRIKE(true, 2), MINESTRIKE(true, 2),
LOVECHEST(false, 1), LOVECHEST(false, 1),
STPATRICKS(false, 1),
CARL_SPINNER(true); CARL_SPINNER(true);
private boolean _useDuplicates; private boolean _useDuplicates;

View File

@ -21,6 +21,7 @@ public enum RewardType
MINESTRIKE_CHEST( 0, 2, 16, 0), MINESTRIKE_CHEST( 0, 2, 16, 0),
LOVE_CHEST( 0, 6, 18, 0), LOVE_CHEST( 0, 6, 18, 0),
VALENTINES_GIFT( 0, 7, 20, 20), VALENTINES_GIFT( 0, 7, 20, 20),
ST_PATRICKS( 0, 6, 18, 0),
SPINNER_FILLER( 0.1, 1, 4, 20), SPINNER_FILLER( 0.1, 1, 4, 20),
SPINNER_REAL( 0.000001, 0.05, 0.4, 5); SPINNER_REAL( 0.000001, 0.05, 0.4, 5);

View File

@ -0,0 +1,49 @@
package mineplex.core.reward.rewards;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import mineplex.core.Managers;
import mineplex.core.reward.Reward;
import mineplex.core.reward.RewardData;
import mineplex.core.reward.RewardRarity;
import mineplex.core.reward.RewardType;
import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackManager;
public class TitleReward extends Reward
{
private final ItemStack ITEM_STACK = new ItemStack(Material.BOOK);
private final TrackManager _trackManager = Managers.require(TrackManager.class);
private final Track _track;
public TitleReward(Track track, RewardRarity rarity, int weight, int shardValue)
{
super(rarity, weight, shardValue);
if (track == null)
{
throw new IllegalStateException();
}
_track = track;
}
@Override
protected RewardData giveRewardCustom(Player player, RewardType rewardType)
{
_trackManager.unlockTrack(player, _track);
return getFakeRewardData(player);
}
@Override
public RewardData getFakeRewardData(Player player)
{
return new RewardData(getRarity().getDarkColor() + "Title", getRarity().getColor() + _track.getLongName(), ITEM_STACK, getRarity());
}
@Override
public boolean canGiveReward(Player player)
{
return !_trackManager.hasTrack(player, _track);
}
}

View File

@ -4,6 +4,8 @@ import mineplex.core.MiniPlugin;
import mineplex.core.account.CoreClientManager; import mineplex.core.account.CoreClientManager;
import mineplex.core.donation.DonationManager; import mineplex.core.donation.DonationManager;
import mineplex.core.itemstack.ItemBuilder; import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.lifetimes.Lifetime;
import mineplex.core.lifetimes.Lifetimed;
import mineplex.core.shop.ShopBase; import mineplex.core.shop.ShopBase;
import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.IButton;
@ -12,7 +14,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public abstract class ShopPageInventory<PluginType extends MiniPlugin, ShopType extends ShopBase<PluginType>> extends public abstract class ShopPageInventory<PluginType extends Lifetimed, ShopType extends ShopBase<PluginType>> extends
ShopPageBase ShopPageBase
{ {
private int _page; private int _page;

View File

@ -0,0 +1,31 @@
package mineplex.core.teamspeak;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class TeamspeakClientInfo
{
private Map<Integer, Date> _linkedAccounts = new HashMap<>();
public TeamspeakClientInfo(Map<Integer, Date> linkedAccounts)
{
_linkedAccounts = new HashMap<>(linkedAccounts);
}
public Map<Integer, Date> getLinkedAccounts()
{
return Collections.unmodifiableMap(_linkedAccounts);
}
public void unlink(int account)
{
_linkedAccounts.remove(account);
}
public void link(int id, Date now)
{
_linkedAccounts.put(id, now);
}
}

View File

@ -0,0 +1,373 @@
package mineplex.core.teamspeak;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
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.bonuses.BonusManager;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTime;
import mineplex.core.teamspeak.commands.TeamspeakCommand;
import mineplex.core.teamspeak.redis.TeamspeakLinkRequest;
import mineplex.core.teamspeak.redis.TeamspeakLinkResponse;
import mineplex.core.teamspeak.redis.TeamspeakUnlinkRequest;
import mineplex.core.teamspeak.redis.TeamspeakUnlinkResponse;
import mineplex.serverdata.commands.ServerCommandManager;
@ReflectivelyCreateMiniPlugin
public class TeamspeakManager extends MiniClientPlugin<TeamspeakClientInfo> implements ILoginProcessor
{
public static final String TEAMSPEAK_CHANNEL_NAME = "Teamspeak Rank Channel";
public static final int MAX_LINKED_ACCOUNTS = 5;
private final CoreClientManager _clientManager = require(CoreClientManager.class);
private final TeamspeakRepository _repository = new TeamspeakRepository();
private final Map<UUID, BukkitTask> _requestMap = new HashMap<>();
private TeamspeakManager()
{
super("TeamSpeak Manager");
ServerCommandManager.getInstance().registerCommandType(TeamspeakLinkResponse.class, response ->
{
BukkitTask task = _requestMap.remove(response.getRequest().getCommandId());
if (task == null)
return;
task.cancel();
Player sender = Bukkit.getPlayer(response.getRequest().getCaller());
if (sender == null)
return;
switch (response.getResponse())
{
case TOKEN_VALID:
Date now = new Date();
Get(sender).link(response.getId(), now);
runAsync(() ->
{
_repository.save(_clientManager.getAccountId(sender), response.getId(), now);
});
UtilPlayer.message(sender, F.main("Teamspeak", "Congrats! You've successfully linked your Teamspeak account!"));
break;
case TOKEN_INVALID:
UtilPlayer.message(sender, F.main("Teamspeak", "Uh oh! That's not the token you were given!"));
break;
}
});
ServerCommandManager.getInstance().registerCommandType(TeamspeakUnlinkResponse.class, response ->
{
BukkitTask task = _requestMap.remove(response.getRequest().getCommandId());
if (task == null)
return;
task.cancel();
Player sender = Bukkit.getPlayer(response.getRequest().getCaller());
if (sender == null)
return;
switch (response.getResponse())
{
case UNLINKED:
Get(sender).unlink(response.getRequest().getId());
runAsync(() ->
{
_repository.delete(_clientManager.getAccountId(sender), response.getRequest().getId());
});
UtilPlayer.message(sender, F.main("Teamspeak", "You've unlinked your Teamspeak account!"));
break;
}
});
_clientManager.addStoredProcedureLoginProcessor(this);
}
@Override
public void processLoginResultSet(String playerName, UUID uuid, int accountId, ResultSet resultSet) throws SQLException
{
Map<Integer, Date> dates = new HashMap<>();
while (resultSet.next())
{
int teamspeakId = resultSet.getInt("teamspeakId");
Date linkDate = resultSet.getDate("linkDate");
dates.put(teamspeakId, linkDate);
}
Set(uuid, new TeamspeakClientInfo(dates));
}
@Override
public String getQuery(int accountId, String uuid, String name)
{
return String.format(TeamspeakRepository.GET_ALL_PLAYER_IDS, accountId);
}
@Override
protected TeamspeakClientInfo addPlayer(UUID uuid)
{
return new TeamspeakClientInfo(Collections.emptyMap());
}
public void link(Player caller, String token)
{
if (_requestMap.containsKey(caller.getUniqueId()))
{
UtilPlayer.message(caller, F.main("Teamspeak", "Please wait until your current request has been processed"));
return;
}
TeamspeakClientInfo info = Get(caller);
if (info.getLinkedAccounts().size() >= MAX_LINKED_ACCOUNTS)
{
UtilPlayer.message(caller, F.main("Teamspeak", "You have too many linked accounts! Please unlink one using /teamspeak unlink"));
return;
}
UtilPlayer.message(caller, F.main("Teamspeak", "Linking your account..."));
TeamspeakLinkRequest linkRequest = new TeamspeakLinkRequest(
caller.getUniqueId(),
token
);
linkRequest.publish();
_requestMap.put(linkRequest.getCommandId(), runSyncLater(() ->
{
if (!caller.isOnline())
return;
UtilPlayer.message(caller, F.main("Teamspeak", "It seems something has gone wrong - your request couldn't be processed"));
_requestMap.remove(linkRequest.getCommandId());
}, 20L * 5));
}
public void unlink(Player caller, String arg)
{
int id;
try
{
id = Integer.parseInt(arg);
}
catch (NumberFormatException ex)
{
UtilPlayer.message(caller, F.main("Teamspeak", F.elem(arg) + " is not a number"));
return;
}
if (_requestMap.containsKey(caller.getUniqueId()))
{
UtilPlayer.message(caller, F.main("Teamspeak", "Please wait until your current request has been processed"));
return;
}
TeamspeakClientInfo info = Get(caller);
if (!info.getLinkedAccounts().containsKey(id))
{
UtilPlayer.message(caller, F.main("Teamspeak", "You have not linked to that account"));
return;
}
UtilPlayer.message(caller, F.main("Teamspeak", "Unlinking your account..."));
TeamspeakUnlinkRequest unlinkRequest = new TeamspeakUnlinkRequest(
caller.getUniqueId(),
id
);
unlinkRequest.publish();
_requestMap.put(unlinkRequest.getCommandId(), runSyncLater(() ->
{
if (!caller.isOnline())
return;
UtilPlayer.message(caller, F.main("Teamspeak", "It seems something has gone wrong - your request couldn't be processed"));
_requestMap.remove(unlinkRequest.getCommandId());
}, 20L * 5));
}
@Override
public void addCommands()
{
addCommand(new TeamspeakCommand(this));
}
public void displayUnlinkPrompt(Player caller, String strPage)
{
TeamspeakClientInfo info = Get(caller);
List<Map.Entry<Integer, Date>> linkedAccounts = new ArrayList<>(info.getLinkedAccounts().entrySet());
if (linkedAccounts.size() == 0)
{
UtilPlayer.message(caller, F.main("Teamspeak", "You have no linked Teamspeak accounts!"));
return;
}
int totalPages = (int) Math.ceil(linkedAccounts.size() / 8.0);
int page;
try
{
page = Integer.parseInt(strPage);
}
catch (NumberFormatException ex)
{
UtilPlayer.message(caller, F.main("Teamspeak", F.elem(strPage) + " is not a number!"));
return;
}
page = page - 1;
if (page < 0)
{
UtilPlayer.message(caller, F.main("Teamspeak", "Page numbers must be greater than zero!"));
return;
}
else if (page >= totalPages)
{
UtilPlayer.message(caller, F.main("Teamspeak", "You only have " + F.elem(totalPages) + " pages of linked accounts, that number is too big!"));
return;
}
String header = "[" +
ChatColor.RESET + C.cWhite + C.Bold + "Teamspeak Accounts (" + (page + 1) + "/" + totalPages + ")" +
ChatColor.RESET + C.cAqua + C.Strike + "]";
int headerChars = ChatColor.stripColor(header).length();
int numEqualsInHeader = (50 - headerChars) / 2;
header = C.cAqua + C.Strike + StringUtils.repeat("=", numEqualsInHeader) + header + StringUtils.repeat("=", numEqualsInHeader);
caller.sendMessage(header);
int start = page * 8;
List<Map.Entry<Integer, Date>> subList = start < linkedAccounts.size() ? linkedAccounts.subList(start, Math.min(linkedAccounts.size(), start + 8)) : Collections.emptyList();
for (Map.Entry<Integer, Date> data : subList)
{
BaseComponent[] hover = new ComponentBuilder("")
.append("ID: ")
.color(ChatColor.YELLOW)
.append(String.valueOf(data.getKey()), ComponentBuilder.FormatRetention.NONE)
.color(ChatColor.WHITE)
.create();
ComponentBuilder builder = new ComponentBuilder("")
.append("Unlink")
.color(ChatColor.RED)
.bold(true)
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Click to unlink this account. All your ranks on Teamspeak will be removed").color(ChatColor.RED).create()))
.event(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/teamspeak unlink " + data.getKey()))
.append(" - ", ComponentBuilder.FormatRetention.NONE)
.color(ChatColor.WHITE)
.append("Account linked on " + UtilTime.date(data.getValue().getTime()))
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hover))
.color(ChatColor.GRAY);
caller.spigot().sendMessage(builder.create());
}
int chars = ChatColor.stripColor(header).length();
int numEquals = (chars - 3) / 2;
ComponentBuilder pageSwitch = new ComponentBuilder("")
.append(StringUtils.repeat("=", numEquals) + "[")
.strikethrough(true)
.color(ChatColor.AQUA)
.append(" ", ComponentBuilder.FormatRetention.NONE)
.append("<", ComponentBuilder.FormatRetention.NONE)
.bold(true);
if (page > 0)
{
BaseComponent[] prev = new ComponentBuilder("")
.append("Go to page " + page)
.color(ChatColor.GREEN)
.create();
pageSwitch
.color(ChatColor.GREEN)
.event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/teamspeak list " + (page)))
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, prev));
}
else
{
pageSwitch
.color(ChatColor.GRAY);
}
pageSwitch.append(" ", ComponentBuilder.FormatRetention.NONE)
.append(">", ComponentBuilder.FormatRetention.NONE)
.bold(true);
if (page + 1 < totalPages)
{
BaseComponent[] next = new ComponentBuilder("")
.append("Go to page " + (page + 2))
.color(ChatColor.GREEN)
.create();
pageSwitch
.color(ChatColor.GREEN)
.event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/teamspeak list " + (page + 2)))
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, next));
}
else
{
pageSwitch
.color(ChatColor.GRAY);
}
pageSwitch
.append(" ", ComponentBuilder.FormatRetention.NONE)
.append("]" + StringUtils.repeat("=", numEquals), ComponentBuilder.FormatRetention.NONE)
.strikethrough(true)
.color(ChatColor.AQUA);
caller.spigot().sendMessage(pageSwitch.create());
}
}

View File

@ -0,0 +1,57 @@
package mineplex.core.teamspeak;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import mineplex.serverdata.database.DBPool;
import mineplex.serverdata.database.RepositoryBase;
@SuppressWarnings("WeakerAccess")
public class TeamspeakRepository extends RepositoryBase
{
TeamspeakRepository()
{
super(DBPool.getAccount());
}
public static final String GET_ALL_PLAYER_IDS = "SELECT `teamspeakId`, `linkDate` FROM accountTeamspeak WHERE accountId = %s;";
public static final String SAVE_PLAYER_ID = "INSERT INTO accountTeamspeak (accountId, teamspeakId, linkDate) VALUES (?, ?, ?);";
public static final String DELETE_PLAYER_ID = "DELETE FROM accountTeamspeak WHERE accountId = ? AND teamspeakId = ?;";
public void save(int accountId, int id, Date now)
{
try (Connection connection = getConnection())
{
try (PreparedStatement statement = connection.prepareStatement(SAVE_PLAYER_ID))
{
statement.setInt(1, accountId);
statement.setInt(2, id);
statement.setDate(3, new java.sql.Date(now.getTime()));
statement.executeUpdate();
}
}
catch (SQLException ex)
{
ex.printStackTrace();
}
}
public void delete(int accountId, int id)
{
try (Connection connection = getConnection())
{
try (PreparedStatement statement = connection.prepareStatement(DELETE_PLAYER_ID))
{
statement.setInt(1, accountId);
statement.setInt(2, id);
statement.executeUpdate();
}
}
catch (SQLException ex)
{
ex.printStackTrace();
}
}
}

View File

@ -0,0 +1,29 @@
package mineplex.core.teamspeak.commands;
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.teamspeak.TeamspeakManager;
public class LinkCommand extends CommandBase<TeamspeakManager>
{
public LinkCommand(TeamspeakManager plugin)
{
super(plugin, Rank.ALL, "link");
}
@Override
public void Execute(Player caller, String[] args)
{
if (args.length == 0)
{
UtilPlayer.message(caller, F.main("Teamspeak", "No token specified. Join the " + F.elem(TeamspeakManager.TEAMSPEAK_CHANNEL_NAME) + " on Teamspeak and type " + F.elem("!link") + " to link an account"));
return;
}
Plugin.link(caller, args[0]);
}
}

View File

@ -0,0 +1,23 @@
package mineplex.core.teamspeak.commands;
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.teamspeak.TeamspeakManager;
public class ListCommand extends CommandBase<TeamspeakManager>
{
public ListCommand(TeamspeakManager plugin)
{
super(plugin, Rank.ALL, "list");
}
@Override
public void Execute(Player caller, String[] args)
{
Plugin.displayUnlinkPrompt(caller, args.length == 0 ? "1" : args[0]);
}
}

View File

@ -0,0 +1,28 @@
package mineplex.core.teamspeak.commands;
import org.bukkit.entity.Player;
import mineplex.core.command.MultiCommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.teamspeak.TeamspeakManager;
public class TeamspeakCommand extends MultiCommandBase<TeamspeakManager>
{
public TeamspeakCommand(TeamspeakManager plugin)
{
super(plugin, Rank.ALL, "teamspeak", "ts");
AddCommand(new LinkCommand(plugin));
AddCommand(new ListCommand(plugin));
AddCommand(new UnlinkCommand(plugin));
}
@Override
protected void Help(Player caller, String[] args)
{
UtilPlayer.message(caller, F.main("Teamspeak", "To link a new Teamspeak account, run " + F.elem("/teamspeak link")));
UtilPlayer.message(caller, F.main("Teamspeak", "To list all linked Teamspeak accounts, run " + F.elem("/teamspeak list")));
}
}

View File

@ -0,0 +1,29 @@
package mineplex.core.teamspeak.commands;
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.teamspeak.TeamspeakManager;
public class UnlinkCommand extends CommandBase<TeamspeakManager>
{
public UnlinkCommand(TeamspeakManager plugin)
{
super(plugin, Rank.ALL, "unlink");
}
@Override
public void Execute(Player caller, String[] args)
{
if (args.length == 0)
{
UtilPlayer.message(caller, F.main("Teamspeak", "No account specified!"));
return;
}
Plugin.unlink(caller, args[0]);
}
}

View File

@ -0,0 +1,27 @@
package mineplex.core.teamspeak.redis;
import java.util.UUID;
import mineplex.serverdata.commands.ServerCommand;
public class TeamspeakLinkRequest extends ServerCommand
{
private final UUID _caller;
private final String _token;
public TeamspeakLinkRequest(UUID caller, String token)
{
this._caller = caller;
this._token = token;
}
public UUID getCaller()
{
return _caller;
}
public String getToken()
{
return _token;
}
}

View File

@ -0,0 +1,42 @@
package mineplex.core.teamspeak.redis;
import com.google.gson.annotations.SerializedName;
import mineplex.serverdata.commands.ServerCommand;
public class TeamspeakLinkResponse extends ServerCommand
{
private final Response _response;
private final TeamspeakLinkRequest _request;
private final int _id;
public TeamspeakLinkResponse(Response response, TeamspeakLinkRequest request, int id)
{
_response = response;
_request = request;
_id = id;
}
public Response getResponse()
{
return _response;
}
public TeamspeakLinkRequest getRequest()
{
return _request;
}
public int getId()
{
return _id;
}
public enum Response
{
@SerializedName("token-valid")
TOKEN_VALID,
@SerializedName("token-invalid")
TOKEN_INVALID
}
}

View File

@ -0,0 +1,27 @@
package mineplex.core.teamspeak.redis;
import java.util.UUID;
import mineplex.serverdata.commands.ServerCommand;
public class TeamspeakUnlinkRequest extends ServerCommand
{
private final UUID _caller;
private final int _id;
public TeamspeakUnlinkRequest(UUID caller, int id)
{
this._caller = caller;
this._id = id;
}
public UUID getCaller()
{
return _caller;
}
public int getId()
{
return _id;
}
}

View File

@ -0,0 +1,33 @@
package mineplex.core.teamspeak.redis;
import com.google.gson.annotations.SerializedName;
import mineplex.serverdata.commands.ServerCommand;
public class TeamspeakUnlinkResponse extends ServerCommand
{
private final Response _response;
private final TeamspeakUnlinkRequest _request;
public TeamspeakUnlinkResponse(Response response, TeamspeakUnlinkRequest request)
{
this._response = response;
this._request = request;
}
public Response getResponse()
{
return _response;
}
public TeamspeakUnlinkRequest getRequest()
{
return _request;
}
public enum Response
{
@SerializedName(value = "unlinked")
UNLINKED
}
}

View File

@ -3,6 +3,7 @@ package mineplex.core.titles;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -37,6 +38,7 @@ import org.bukkit.Sound;
import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -70,6 +72,7 @@ import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.packethandler.IPacketHandler; import mineplex.core.packethandler.IPacketHandler;
import mineplex.core.packethandler.PacketHandler; import mineplex.core.packethandler.PacketHandler;
import mineplex.core.packethandler.PacketInfo; import mineplex.core.packethandler.PacketInfo;
import mineplex.core.titles.commands.GiveTrackCommand;
import mineplex.core.titles.commands.TrackCommand; import mineplex.core.titles.commands.TrackCommand;
import mineplex.core.titles.tracks.Track; import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackFormat; import mineplex.core.titles.tracks.TrackFormat;
@ -301,21 +304,7 @@ public class Titles extends MiniDbClientPlugin<TitleData> implements IPacketHand
tracks.removeIf(track -> track.getRequirements().getTier(player) == null && track.hideIfUnowned()); tracks.removeIf(track -> track.getRequirements().getTier(player) == null && track.hideIfUnowned());
tracks.sort((a, b) -> tracks.sort(Comparator.comparing(Track::getShortName));
{
if (a.hideIfUnowned() && !b.hideIfUnowned())
{
return -1;
}
else if (!a.hideIfUnowned() && b.hideIfUnowned())
{
return 1;
}
else
{
return a.getShortName().compareTo(b.getShortName());
}
});
String bookTitle = C.cGreen + "Titles"; String bookTitle = C.cGreen + "Titles";
@ -762,6 +751,13 @@ public class Titles extends MiniDbClientPlugin<TitleData> implements IPacketHand
if (packetInfo.getPacket() instanceof PacketPlayOutNamedEntitySpawn) if (packetInfo.getPacket() instanceof PacketPlayOutNamedEntitySpawn)
{ {
PacketPlayOutNamedEntitySpawn packet = (PacketPlayOutNamedEntitySpawn) packetInfo.getPacket(); PacketPlayOutNamedEntitySpawn packet = (PacketPlayOutNamedEntitySpawn) packetInfo.getPacket();
Entity entity = UtilEnt.getEntityById(packet.a);
if (!(entity instanceof Player))
{
return;
}
Player owner = (Player) UtilEnt.getEntityById(packet.a); Player owner = (Player) UtilEnt.getEntityById(packet.a);
if (_gadgetManager.getActive(owner, GadgetType.MORPH) == null) if (_gadgetManager.getActive(owner, GadgetType.MORPH) == null)
{ {

View File

@ -0,0 +1,79 @@
package mineplex.core.titles.commands;
import java.util.List;
import java.util.stream.Collectors;
import org.bukkit.command.CommandSender;
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.titles.tracks.ItemizedTrack;
import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackManager;
public class GiveTrackCommand extends CommandBase<TrackManager>
{
public GiveTrackCommand(TrackManager plugin)
{
super(plugin, Rank.ADMIN, "givetrack" );
}
@Override
public void Execute(Player caller, String[] args)
{
if (args.length < 2)
{
UtilPlayer.message(caller, F.help("/givetrack <player> <trackid>", "Give a player an unlockable track", GetRequiredRank()));
return;
}
String player = args[0];
String track = args[1];
Track trackObj = Plugin.getTrackById(track);
if (trackObj == null)
{
UtilPlayer.message(caller, F.main(Plugin.getName(), "That is not a track" ));
return;
}
if (!(trackObj instanceof ItemizedTrack))
{
UtilPlayer.message(caller, F.main(Plugin.getName(), "That is not an unlockable track" ));
return;
}
Plugin.unlockTrack(player, track, result -> {
switch (result)
{
case PLAYER_NOT_FOUND:
UtilPlayer.message(caller, F.main(Plugin.getName(), "That player has never joined Mineplex!"));
break;
case UNKNOWN_ERROR:
UtilPlayer.message(caller, F.main(Plugin.getName(), "Oops. Something has gone wrong while giving " + F.elem(player) + " the track " + F.elem(track) + "!"));
break;
case SUCCESS:
UtilPlayer.message(caller, F.main(Plugin.getName(), "Successfully gave " + F.elem(player) + " the track " + F.elem(track) + "!"));
break;
}
});
}
@Override
public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args)
{
if (args.length == 1)
{
return tabCompletePlayerNames(sender, args);
}
if (args.length == 2)
{
return getMatches(args[1], Plugin.getAllTracks().stream().filter(track -> track instanceof ItemizedTrack).map(Track::getId).collect(Collectors.toList()));
}
return null;
}
}

View File

@ -1,5 +1,8 @@
package mineplex.core.titles.commands; package mineplex.core.titles.commands;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import mineplex.core.Managers; import mineplex.core.Managers;
@ -10,6 +13,7 @@ import mineplex.core.common.Rank;
import mineplex.core.common.util.F; import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilPlayer;
import mineplex.core.titles.Titles; import mineplex.core.titles.Titles;
import mineplex.core.titles.tracks.ItemizedTrack;
import mineplex.core.titles.tracks.Track; import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackManager; import mineplex.core.titles.tracks.TrackManager;
@ -52,4 +56,17 @@ public class TrackCommand extends CommandBase<Titles>
} }
Plugin.setOrToggleTrackForPlayer(caller, track, args.length > 1); Plugin.setOrToggleTrackForPlayer(caller, track, args.length > 1);
} }
@Override
public List<String> onTabComplete(CommandSender sender, String commandLabel, String[] args)
{
if (args.length == 1)
{
if (sender instanceof Player)
{
return getMatches(args[0], _trackManager.getAllTracks().stream().filter(track -> track.getRequirements().getTier((Player) sender) != null).map(Track::getId));
}
}
return null;
}
} }

View File

@ -0,0 +1,35 @@
package mineplex.core.titles.tracks;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.entity.Player;
import mineplex.core.Managers;
import mineplex.core.inventory.InventoryManager;
public class ItemizedTrack extends Track
{
private final InventoryManager _inventoryManager = Managers.require(InventoryManager.class);
public ItemizedTrack(String trackId, String shortName, String description, boolean hideIfUnowned)
{
super(trackId, shortName, description, hideIfUnowned);
special();
}
public ItemizedTrack(String trackId, ChatColor color, String shortName, String longName, String description)
{
super(trackId, color, shortName, longName, description);
special();
}
public ItemizedTrack(String trackId, ChatColor color, String shortName, String longName, String description, boolean hideIfUnowned)
{
super(trackId, color, shortName, longName, description, hideIfUnowned);
special();
}
public boolean owns(Player player) {
return _inventoryManager.Get(player).getItemCount("track." + getId()) > 0;
}
}

View File

@ -50,7 +50,7 @@ public class Track implements Listener
{ {
// Book limits // Book limits
Validate.isTrue(shortName.length() <= 16, "Short name cannot be longer than 16 characters"); Validate.isTrue(shortName.length() <= 16, "Short name cannot be longer than 16 characters");
Validate.isTrue(trackId.length() <= 16, "ID cannot be longer than 16 characters"); Validate.isTrue(trackId.length() <= 32, "ID cannot be longer than 32 characters");
this._id = trackId; this._id = trackId;
this._shortName = shortName; this._shortName = shortName;

View File

@ -5,9 +5,42 @@ import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
import mineplex.core.titles.tracks.award.AprilFools2017Track;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import mineplex.core.MiniPlugin; import mineplex.core.MiniPlugin;
import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.Callback;
import mineplex.core.inventory.InventoryManager;
import mineplex.core.titles.commands.GiveTrackCommand;
import mineplex.core.titles.tracks.award.Bridges2017Track;
import mineplex.core.titles.tracks.custom.DongerTrack;
import mineplex.core.titles.tracks.custom.EarlyBirdTrack;
import mineplex.core.titles.tracks.custom.HappyGaryTrack;
import mineplex.core.titles.tracks.custom.LeaderTrack;
import mineplex.core.titles.tracks.custom.SnekTrack;
import mineplex.core.titles.tracks.custom.TableFlipTrack;
import mineplex.core.titles.tracks.custom.TrackBuilder;
import mineplex.core.titles.tracks.custom.WizardTrack;
import mineplex.core.titles.tracks.standard.GemCollectorTrack;
import mineplex.core.titles.tracks.standard.HolidayCheerTrack;
import mineplex.core.titles.tracks.standard.LevelerTrack;
import mineplex.core.titles.tracks.standard.LuckyTrack;
import mineplex.core.titles.tracks.standard.MineplexMasteryTrack;
import mineplex.core.titles.tracks.standard.PartyAnimalTrack;
import mineplex.core.titles.tracks.standard.PeacefulTrack;
import mineplex.core.titles.tracks.standard.PerfectionistTrack;
import mineplex.core.titles.tracks.standard.PowerPlayTrack;
import mineplex.core.titles.tracks.standard.SweetToothTrack;
import mineplex.core.titles.tracks.standard.TreasureHunterTrack;
import mineplex.core.titles.tracks.standard.UnluckyTrack;
import mineplex.core.titles.tracks.standard.WarriorTrack;
@ReflectivelyCreateMiniPlugin @ReflectivelyCreateMiniPlugin
public class TrackManager extends MiniPlugin public class TrackManager extends MiniPlugin
@ -15,6 +48,9 @@ public class TrackManager extends MiniPlugin
private final Map<Class<? extends Track>, Track> _registeredTracks = new LinkedHashMap<>(); private final Map<Class<? extends Track>, Track> _registeredTracks = new LinkedHashMap<>();
private final Map<String, Track> _trackById = new HashMap<>(); private final Map<String, Track> _trackById = new HashMap<>();
private final InventoryManager _inventoryManager = require(InventoryManager.class);
private final CoreClientManager _coreClientManager = require(CoreClientManager.class);
private TrackManager() private TrackManager()
{ {
super("Track Manager"); super("Track Manager");
@ -42,10 +78,73 @@ public class TrackManager extends MiniPlugin
// registerTrack(new SurvivorTrack()); // registerTrack(new SurvivorTrack());
registerTrack(new LevelerTrack()); registerTrack(new LevelerTrack());
registerTrack(new PerfectionistTrack()); registerTrack(new PerfectionistTrack());
// Awarded tracks
registerTrack(new Bridges2017Track());
registerTrack(new AprilFools2017Track());
// Custom tracks
// registerTrack(track("lenny", "Lenny", "( ͡° ͜ʖ ͡°)"));
// registerTrack(track("lenny-disgusted", "Disgusted Lenny", "( ͡ಠ ʖ̯ ͡ಠ)"));
// registerTrack(track("lenny-winking", "Winking Lenny", "( ͡~ ͜ʖ ͡°)"));
registerTrack(track("ayyye", "Ayyye", "(づ ̄ ³ ̄)づ"));
registerTrack(track("ameno", "Ameno", "༼ つ ◕_◕ ༽つ Gib me gems"));
// registerTrack(track("unknown", "Unknown", "(☞゚ヮ゚)☞"));
registerTrack(track("shrug", "Shrug", "¯\\_(ツ)_/¯"));
registerTrack(track("tableflip", "Tableflip", "(╯°□°)╯︵ ┻━┻"));
registerTrack(track("tablerespecter", "Table Respecter", "┬─┬ノ(ಠ_ಠ)"));
registerTrack(track("tableflip-disgusted", "Disgusted Flip", "Disgusted Tableflip", "(╯ಠ_ಠ╯︵ ┳━┳"));
// registerTrack(track("tableflip-donger", "Donger Flip", "ヽ༼ຈل͜ຈ༽ノ︵┻━┻"));
registerTrack(track("tableflip-enraged", "Enraged Flip", "(ノಠдಠ)ノ︵┻━┻"));
registerTrack(track("tableflip-riot", "Rioting Flip", "(┛◉Д◉)┛彡┻━┻"));
registerTrack(track("magician", "Magician", "(ノ◕ヮ◕)ノ*:・゚✧"));
registerTrack(track("teddy-bear", "Teddy Bear", "ʕ•ᴥ•ʔ"));
registerTrack(track("disgust", "Disgust", "ಠ_ಠ"));
registerTrack(track("old-man", "Old Man", "໒( •̀ ╭ ͟ʖ╮ •́ )७"));
registerTrack(track("jake", "Jake", "(❍ᴥ❍ʋ)"));
registerTrack(track("finn", "Finn", "| (• ◡•)|"));
registerTrack(track("finn-and-jake", "Finn 'n Jake", "| (• ◡•)| (❍ᴥ❍ʋ)"));
registerTrack(track("boxer", "Boxer", "(ง'̀-'́)ง"));
registerTrack(track0("zoidberg", "Zoidberg", "Why not?", "(\\/) (°,,°) (\\/)"));
registerTrack(track("crying", "Crying", "(ಥ﹏ಥ)"));
// registerTrack(track("unknown", "Unknown", "(◕‿◕✿)"));
registerTrack(track("fireball", "Fireball", "༼つಠ益ಠ༽つ ─=≡ΣO))"));
registerTrack(track("stardust", "Stardust", "(つ◕౪◕)つ━☆゚.*・。゚"));
registerTrack(track("magic-missile", "Magic Missile", "( °-°)シ ミ★ ミ☆"));
registerTrack(track("blow-a-kiss", "Blowing a Kiss", "♡(´ε` )"));
registerTrack(track("pewpewpew", "PEWPEWPEW", "(☞^o^)☞"));
// registerTrack(track("pewpew", "pew pew", "(☞゚ヮ゚)☞"));
registerTrack(track("cool-guy", "Cool Guy", "(⌐■_■)"));
// registerTrack(track("unknown", "Unknown", "(ง •̀ω•́)ง✧"));
// registerTrack(track("unknown", "Unknown", "(╯⊙ ⊱ ⊙╰ )"));
registerTrack(track("party-time", "Party Time", "♪~ ᕕ(ᐛ)ᕗ"));
registerTrack(track1("whats-a-liter", "What's a Liter?", "also wats a leader"));
registerTrack(animatedTrack("deal-with-it", "Deal With It", "(⌐■_■)", "( •_•);( •_•)>⌐■-■;(⌐■_■);( •_•)>⌐■-■", 5));
registerTrack(animatedTrack("this-guy", "This Guy", "(☞゚ヮ゚)☞", "(☞゚ヮ゚)☞;☜(゚ヮ゚☜)", 5));
registerTrack(animatedTrack("lalala", "La La La", "♪┏(・o・) ┛", "♪┏(・o・) ┛;♪┗ ( ・o・) ┓♪;┏ ( ・o・) ┛♪;┗ (・o・ ) ┓♪;┏(・o・)┛♪", 1));
registerTrack(animatedTrack("gotta-go", "Gotta Go", "┬┴┬┴┤(・_├┬┴┬┴", "┬┴┬┴┤(・_├┬┴┬┴;┬┴┬┴┤ (・├┬┴┬┴;┬┴┬┴┤ (├┬┴┬┴;┬┴┬┴┤ (・├┬┴┬┴", 5));
// registerTrack(animatedTrack("unknown", "Unknown", "o°▽°)o", "o°▽°)o;(o_△_)o;(o°▽°)o", 5));
registerTrack(animatedTrack("rolling-around", "Rolling Around", "(゚‐゚)", "(.-.);(:I );(゚‐゚);( I:)", 4));
// registerTrack(animatedTrack("unknown", "Unknown", "('ω')", "('ω');( ε: );(.ω.);( :3 );('ω');( ε: );(.ω.);( :3 )", 5));
// registerTrack(animatedTrack("whee", "Whee", "(゚ー゚)", "(゚ー゚);( ゚ー);( ゚);(  );(゚ );(ー゚ );(゚ー゚)", 1));
// registerTrack(animatedTrack("lets-spin", "Let's Spin", "I Say, Let's Spin", "(・ω・)", "( ・ω);( ・);( );(・ );(ω・ );(・ω・)", 1));
// registerTrack(animatedTrack("unknown", "Unknown", "(^∀^)", "(^∀^);( ^∀);( ^);(  );(^ );(∀^ );(^∀^)", 5));
registerTrack(animatedTrack("whaaat", "Whaaaaaat?", "(°o°)", "(°o°);(°o。);(。o。);(。o°);(°o°);(°o。);(。o。);(。o°)", 5));
// registerTrack(animatedTrack("spinning", "Spinning", "(゚◇゚)", "(゚◇゚);( ゚◇);( ゚);(  );(゚ );(◇゚ );(゚◇", 5));
// registerTrack(animatedTrack("unknown", "Unknown", "(・∇・)", "(・∇・);( ・∇);( ・);(  );(・ );(∇・ );(・∇・)", 5));
}
@Override
public void addCommands()
{
addCommand(new GiveTrackCommand(this));
} }
private void registerTrack(Track track) private void registerTrack(Track track)
{ {
if (_trackById.containsKey(track.getId()))
throw new IllegalArgumentException("Duplicate id: " + track.getId());
_registeredTracks.put(track.getClass(), track); _registeredTracks.put(track.getClass(), track);
_trackById.put(track.getId(), track); _trackById.put(track.getId(), track);
} }
@ -62,6 +161,144 @@ public class TrackManager extends MiniPlugin
public final List<Track> getAllTracks() public final List<Track> getAllTracks()
{ {
return new ArrayList<>(_registeredTracks.values()); return new ArrayList<>(_trackById.values());
}
public boolean hasTrack(Player player, Track track)
{
return _inventoryManager.Get(player).getItemCount("track." + track.getId()) > 0;
}
public void unlockTrack(Player player, Track track)
{
unlockTrack(player, track, null);
}
public void unlockTrack(Player player, Track track, Consumer<TrackGiveResult> consumer)
{
unlockTrack(player.getName(), track.getId(), consumer);
}
public void unlockTrack(String player, String track, Consumer<TrackGiveResult> consumer)
{
_coreClientManager.getOrLoadClient(player, client ->
{
if (client == null)
{
if (consumer != null)
consumer.accept(TrackGiveResult.PLAYER_NOT_FOUND);
return;
}
runAsync(() ->
{
Callback<Boolean> successCallback = success ->
{
if (success)
{
if (consumer != null)
consumer.accept(TrackGiveResult.SUCCESS);
}
else
{
if (consumer != null)
consumer.accept(TrackGiveResult.UNKNOWN_ERROR);
}
};
Player playerObj = Bukkit.getPlayer(client.getUniqueId());
if (playerObj != null)
{
_inventoryManager.addItemToInventory(successCallback, playerObj, "track." + track, 1);
}
else
{
_inventoryManager.addItemToInventoryForOffline(successCallback, client.getAccountId(), "track." + track, 1);
}
});
});
}
public enum TrackGiveResult
{
PLAYER_NOT_FOUND,
UNKNOWN_ERROR,
SUCCESS
}
// Begin helper methods
private ItemizedTrack animatedTrack(String id, String name, String desc, String frames, int ticks)
{
return TrackBuilder.builder(id)
.withShortName(name)
.withDescription(desc)
.setFrames(frames.split(";"))
.setTicks(ticks)
.withColor(ChatColor.GOLD)
.setHideIfUnowned(true)
.build();
}
private ItemizedTrack animatedTrack(String id, String name, String longName, String desc, String frames, int ticks)
{
return TrackBuilder.builder(id)
.withShortName(name)
.withLongName(longName)
.withDescription(desc)
.setFrames(frames.split(";"))
.setTicks(ticks)
.withColor(ChatColor.GOLD)
.setHideIfUnowned(true)
.build();
}
private ItemizedTrack track(String id, String name, String tierName)
{
return TrackBuilder.builder(id)
.withShortName(name)
.withDescription(tierName)
.setTierName(tierName)
.withColor(ChatColor.GOLD)
.setTierColor(ChatColor.GOLD)
.setHideIfUnowned(true)
.build();
}
private ItemizedTrack track0(String id, String shortName, String desc, String tierName)
{
return TrackBuilder.builder(id)
.withShortName(shortName)
.withDescription(desc)
.setTierName(tierName)
.withColor(ChatColor.GOLD)
.setTierColor(ChatColor.GOLD)
.setHideIfUnowned(true)
.build();
}
private ItemizedTrack track1(String id, String name, String desc)
{
return TrackBuilder.builder(id)
.withShortName(name)
.withDescription(desc)
.setTierName(name)
.withColor(ChatColor.GOLD)
.setTierColor(ChatColor.GOLD)
.setHideIfUnowned(true)
.build();
}
private ItemizedTrack track(String id, String shortName, String longName, String tierName)
{
return TrackBuilder.builder(id)
.withShortName(shortName)
.withLongName(longName)
.withDescription(tierName)
.setTierName(tierName)
.withColor(ChatColor.GOLD)
.setTierColor(ChatColor.GOLD)
.setHideIfUnowned(true)
.build();
} }
} }

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 AprilFools2017Track extends ItemizedTrack
{
public AprilFools2017Track()
{
super(
"aprilfools-2017",
ChatColor.LIGHT_PURPLE,
"Fools 2017",
"2017 April Fools Treasure Hunt",
"This track is awarded to players who found all the chests in the 2017 April Fools Event",
true);
special();
getRequirements()
.addTier(new TrackTier(
"2017 April Fools",
null,
this::owns,
new TrackFormat(ChatColor.LIGHT_PURPLE, ChatColor.DARK_PURPLE)
)); }
}

View File

@ -0,0 +1,31 @@
package mineplex.core.titles.tracks.award;
import net.md_5.bungee.api.ChatColor;
import mineplex.core.titles.tracks.TrackFormat;
import mineplex.core.titles.tracks.TrackTier;
import mineplex.core.titles.tracks.ItemizedTrack;
public class Bridges2017Track extends ItemizedTrack
{
public Bridges2017Track()
{
super(
"tournament-br-2017",
ChatColor.GOLD,
"BotB 2017",
"2017 Bridges Champion",
"This track is awarded to the winners of the 2017 BotB Tournament",
true);
special();
getRequirements()
.addTier(new TrackTier(
"2017 Bridges Champion",
null,
this::owns,
new TrackFormat(ChatColor.GOLD, ChatColor.GOLD)
));
}
}

View File

@ -1,4 +1,4 @@
package mineplex.core.titles.tracks; package mineplex.core.titles.tracks.custom;
import java.util.Set; import java.util.Set;
@ -6,6 +6,10 @@ import net.md_5.bungee.api.ChatColor;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackFormat;
import mineplex.core.titles.tracks.TrackTier;
public class DongerTrack extends Track public class DongerTrack extends Track
{ {
private static final Set<String> OWNERS = Sets.newHashSet( private static final Set<String> OWNERS = Sets.newHashSet(
@ -13,7 +17,7 @@ public class DongerTrack extends Track
"a20d59d1-cfd8-4116-ac27-45d9c7eb4a97" "a20d59d1-cfd8-4116-ac27-45d9c7eb4a97"
); );
protected DongerTrack() public DongerTrack()
{ {
super("donger", ChatColor.AQUA, "Donger", "Donger", "ヽ༼ຈل͜ຈ༽ノ", true); super("donger", ChatColor.AQUA, "Donger", "Donger", "ヽ༼ຈل͜ຈ༽ノ", true);
special(); special();

View File

@ -1,4 +1,4 @@
package mineplex.core.titles.tracks; package mineplex.core.titles.tracks.custom;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -15,12 +15,15 @@ import com.google.common.collect.Sets;
import mineplex.core.Managers; import mineplex.core.Managers;
import mineplex.core.account.CoreClientManager; import mineplex.core.account.CoreClientManager;
import mineplex.core.account.ILoginProcessor; import mineplex.core.account.ILoginProcessor;
import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackFormat;
import mineplex.core.titles.tracks.TrackTier;
public class EarlyBirdTrack extends Track public class EarlyBirdTrack extends Track
{ {
private final Set<UUID> _wonEternal = Sets.newConcurrentHashSet(); private final Set<UUID> _wonEternal = Sets.newConcurrentHashSet();
protected EarlyBirdTrack() public EarlyBirdTrack()
{ {
super("early-bird", ChatColor.AQUA, "Early Bird", "Early Bird", "This track is unlocked by receiving the Eternal rank from chickens in the 2016 Thanksgiving Event", true); super("early-bird", ChatColor.AQUA, "Early Bird", "Early Bird", "This track is unlocked by receiving the Eternal rank from chickens in the 2016 Thanksgiving Event", true);
special(); special();

View File

@ -1,4 +1,4 @@
package mineplex.core.titles.tracks; package mineplex.core.titles.tracks.custom;
import java.util.Set; import java.util.Set;
@ -9,12 +9,15 @@ import com.google.common.collect.Sets;
import mineplex.core.Managers; import mineplex.core.Managers;
import mineplex.core.account.CoreClientManager; import mineplex.core.account.CoreClientManager;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackFormat;
import mineplex.core.titles.tracks.TrackTier;
public class HappyGaryTrack extends Track public class HappyGaryTrack extends Track
{ {
private final CoreClientManager _coreClientManager = Managers.require(CoreClientManager.class); private final CoreClientManager _coreClientManager = Managers.require(CoreClientManager.class);
protected HappyGaryTrack() public HappyGaryTrack()
{ {
super("happygary", ChatColor.GOLD, "Happy Gary", "Happy Gary", "", true); super("happygary", ChatColor.GOLD, "Happy Gary", "Happy Gary", "", true);
special(); special();

View File

@ -1,16 +1,19 @@
package mineplex.core.titles.tracks; package mineplex.core.titles.tracks.custom;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import mineplex.core.Managers; import mineplex.core.Managers;
import mineplex.core.account.CoreClientManager; import mineplex.core.account.CoreClientManager;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackFormat;
import mineplex.core.titles.tracks.TrackTier;
public class LeaderTrack extends Track public class LeaderTrack extends Track
{ {
private final CoreClientManager _coreClientManager = Managers.require(CoreClientManager.class); private final CoreClientManager _coreClientManager = Managers.require(CoreClientManager.class);
protected LeaderTrack() public LeaderTrack()
{ {
super("leader", ChatColor.DARK_RED, "Leader", "What's a Leader?", "also wat does dev mean", true); super("leader", ChatColor.DARK_RED, "Leader", "What's a Leader?", "also wat does dev mean", true);
special(); special();

View File

@ -1,4 +1,4 @@
package mineplex.core.titles.tracks; package mineplex.core.titles.tracks.custom;
import java.util.Set; import java.util.Set;
@ -6,13 +6,17 @@ import net.md_5.bungee.api.ChatColor;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import mineplex.core.titles.tracks.Track;
import mineplex.core.titles.tracks.TrackFormat;
import mineplex.core.titles.tracks.TrackTier;
public class SnekTrack extends Track public class SnekTrack extends Track
{ {
private static final Set<String> OWNERS = Sets.newHashSet( private static final Set<String> OWNERS = Sets.newHashSet(
"b86b54da-93dd-46f9-be33-27bd92aa36d7" "b86b54da-93dd-46f9-be33-27bd92aa36d7"
); );
protected SnekTrack() public SnekTrack()
{ {
super("snek", ChatColor.DARK_GREEN, "Snek", "Snek", "oh you have do me a frighten", true); super("snek", ChatColor.DARK_GREEN, "Snek", "Snek", "oh you have do me a frighten", true);
special(); special();

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