Merge remote-tracking branch 'refs/remotes/origin/develop' into feature/leveling
This commit is contained in:
commit
18e7143d5a
@ -6,6 +6,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Entity;
|
||||
@ -13,6 +14,8 @@ import org.bukkit.util.Vector;
|
||||
|
||||
public class UtilMath
|
||||
{
|
||||
public static final double TAU = Math.PI * 2D;
|
||||
|
||||
public static double trim(int degree, double d)
|
||||
{
|
||||
String format = "#.#";
|
||||
@ -332,4 +335,119 @@ public class UtilMath
|
||||
|
||||
return min;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an array of points, arranged in a circle normal to a vector.
|
||||
*
|
||||
* @param center The center of the circle.
|
||||
* @param normal A vector normal to the circle.
|
||||
* @param radius The radius of the circle.
|
||||
* @param points How many points to make up the circle.
|
||||
*
|
||||
* @return An array of points of the form <code>double[point #][x=0, y=1, z=3]</code>.
|
||||
*/
|
||||
public static double[][] normalCircle(Location center, Vector normal, double radius, int points)
|
||||
{
|
||||
return normalCircle(center.toVector(), normal, radius, points);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an array of points, arranged in a circle normal to a vector.
|
||||
*
|
||||
* @param center The center of the circle.
|
||||
* @param normal A vector normal to the circle.
|
||||
* @param radius The radius of the circle.
|
||||
* @param points How many points to make up the circle.
|
||||
*
|
||||
* @return An array of points of the form <code>double[point #][x=0, y=1, z=3]</code>.
|
||||
*/
|
||||
public static double[][] normalCircle(Vector center, Vector normal, double radius, int points)
|
||||
{
|
||||
Vector n = normal.clone().normalize();
|
||||
Vector a = n.clone().add(new Vector(1, 1, 1)).crossProduct(n).normalize();
|
||||
Vector b = n.getCrossProduct(a).normalize();
|
||||
|
||||
double[][] data = new double[points][3];
|
||||
|
||||
double interval = TAU / points;
|
||||
double theta = 0;
|
||||
|
||||
for (int i = 0; i < points; i++)
|
||||
{
|
||||
data[i][0] = center.getX() + (radius * ((Math.cos(theta) * a.getX()) + (Math.sin(theta) * b.getX())));
|
||||
data[i][1] = center.getY() + (radius * ((Math.cos(theta) * a.getY()) + (Math.sin(theta) * b.getY())));
|
||||
data[i][2] = center.getZ() + (radius * ((Math.cos(theta) * a.getZ()) + (Math.sin(theta) * b.getZ())));
|
||||
theta += interval;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Slightly randomize a location with a standard deviation of one.
|
||||
*
|
||||
* @param location The location to randomize.
|
||||
*
|
||||
* @return The original location, now gaussian-randomized.
|
||||
*/
|
||||
public static Location gauss(Location location)
|
||||
{
|
||||
return gauss(location, 1, 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Slightly randomize a vector with a standard deviation of one.
|
||||
*
|
||||
* @param vector The location to randomize.
|
||||
*
|
||||
* @return The randomized vector, now gaussian-randomized.
|
||||
*/
|
||||
public static Vector gauss(Vector vector)
|
||||
{
|
||||
return gauss(vector, 1, 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Slightly randomize a location with a standard deviation of one. <br>
|
||||
*
|
||||
* <b>This method only accepts positive values for all of its arguments.</b> <br>
|
||||
*
|
||||
* A good parameter set for small offsets is (loc, 10, 10, 10).
|
||||
*
|
||||
* @param location The location to randomize.
|
||||
* @param x A granularity control for the x-axis, higher numbers = less randomness
|
||||
* @param y A granularity control for the y-axis, higher numbers = less randomness
|
||||
* @param z A granularity control for the z-axis, higher numbers = less randomness
|
||||
*
|
||||
* @return The original location, now gaussian-randomized
|
||||
*/
|
||||
public static Location gauss(Location location, double x, double y, double z)
|
||||
{
|
||||
return location.clone().add(
|
||||
x <= 0 ? 0 : (ThreadLocalRandom.current().nextGaussian() / x),
|
||||
y <= 0 ? 0 : (ThreadLocalRandom.current().nextGaussian() / y),
|
||||
z <= 0 ? 0 : (ThreadLocalRandom.current().nextGaussian() / z));
|
||||
}
|
||||
|
||||
/**
|
||||
* Slightly randomize a vector with a standard deviation of one. <br>
|
||||
*
|
||||
* <b>This method only accepts positive values for all of its arguments.</b> <br>
|
||||
*
|
||||
* A good parameter set for small offsets is (loc, 10, 10, 10).
|
||||
*
|
||||
* @param vector The location to randomize.
|
||||
* @param x A granularity control for the x-axis, higher numbers = less randomness
|
||||
* @param y A granularity control for the y-axis, higher numbers = less randomness
|
||||
* @param z A granularity control for the z-axis, higher numbers = less randomness
|
||||
*
|
||||
* @return The randomized vector, now gaussian-randomized
|
||||
*/
|
||||
public static Vector gauss(Vector vector, double x, double y, double z)
|
||||
{
|
||||
return vector.clone().add(new Vector(
|
||||
x <= 0 ? 0 : (ThreadLocalRandom.current().nextGaussian() / x),
|
||||
y <= 0 ? 0 : (ThreadLocalRandom.current().nextGaussian() / y),
|
||||
z <= 0 ? 0 : (ThreadLocalRandom.current().nextGaussian() / z)));
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,6 @@ import org.bukkit.World.Environment;
|
||||
import org.bukkit.WorldBorder;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
@ -23,6 +22,11 @@ public class UtilWorld
|
||||
return Bukkit.getServer().getWorld(world);
|
||||
}
|
||||
|
||||
public static boolean isInChunk(Location location, Chunk chunk)
|
||||
{
|
||||
return location.getChunk().getX() == chunk.getX() && location.getChunk().getZ() == chunk.getZ() && chunk.getWorld().equals(location.getChunk().getWorld());
|
||||
}
|
||||
|
||||
public static boolean areChunksEqual(Location first, Location second)
|
||||
{
|
||||
return first.getBlockX() >> 4 == second.getBlockX() >> 4 && first.getBlockZ() >> 4 == second.getBlockZ() >> 4;
|
||||
|
@ -167,6 +167,39 @@ public class ShapeWings extends ShapeGrid implements CosmeticShape
|
||||
"$#########$"
|
||||
};
|
||||
|
||||
public static final String[] MAPLE_LEAF = new String[]
|
||||
{
|
||||
"000000000000000000000000000$000000000000000000000000000",
|
||||
"00000000000000000000000000$$$00000000000000000000000000",
|
||||
"0000000000000000000000000$$#$$0000000000000000000000000",
|
||||
"000000000000000000000000$$###$$000000000000000000000000",
|
||||
"00000000000000000000000$$#####$$00000000000000000000000",
|
||||
"0000000000000000$$$000$$#######$$000$$$0000000000000000",
|
||||
"0000000000000000$#$$$$$#########$$$$$#$0000000000000000",
|
||||
"0000000000000000$$###################$$0000000000000000",
|
||||
"00000000000000000$###################$00000000000000000",
|
||||
"00000000000$$0000$$#################$$0000$$00000000000",
|
||||
"0$$$000000$$$$$000$#################$000$$$$$000000$$$0",
|
||||
"00$$$$$$$$$###$$$0$$###############$$0$$$###$$$$$$$$$00",
|
||||
"00$$############$$$$###############$$$$############$$00",
|
||||
"000$$#############$$###############$$#############$$000",
|
||||
"0000$$###########################################$$0000",
|
||||
"00$$$#############################################$$$00",
|
||||
"$$$#################################################$$$",
|
||||
"00$$$$###########################################$$$$00",
|
||||
"00000$$$#######################################$$$00000",
|
||||
"00000000$$$$###############################$$$$00000000",
|
||||
"00000000000$$$###########################$$$00000000000",
|
||||
"0000000000000$$#########################$$0000000000000",
|
||||
"0000000000000$$#########################$$0000000000000",
|
||||
"0000000000000$##$$$$$$$$$$$#$$$$$$$$$$$##$0000000000000",
|
||||
"000000000000$$$$$000000000$#$000000000$$$$$000000000000",
|
||||
"00000000000000000000000000$#$00000000000000000000000000",
|
||||
"00000000000000000000000000$#$00000000000000000000000000",
|
||||
"00000000000000000000000000$#$00000000000000000000000000",
|
||||
"00000000000000000000000000$#$00000000000000000000000000",
|
||||
"00000000000000000000000000$$$00000000000000000000000000"
|
||||
};
|
||||
|
||||
/**
|
||||
* Default rotation to give the wings a little tilt when displayed on players for instance
|
||||
|
@ -78,6 +78,19 @@ public class SkinData
|
||||
public static final SkinData LARISSA = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTc0NjE0MTUxMzQsInByb2ZpbGVJZCI6Ijg1MmE4YWNmNzMzNzQwZDc5OWVjYjA4ZmQ5OTY1MGI1IiwicHJvZmlsZU5hbWUiOiJLaW5nQ3JhenlfIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9jYThjNDRhOWVmZTY3NzExMDYzMjM5ODEwNDRmOTdjYmM1OWJmZmRlOGI1ODdlMGQzMWE4N2ViMDhhMmExZiJ9fX0=", "Lyac51CrnMK/CI2dWgGQLowAm/ZnQMpf0Ict/gqVrUgJVlGWDIVG77Rd1JyMQDEeESvTmoyivH+usiO0ePW95qjisqT3R43YEmLi85CqctGYqLKeSYpGYwYRz8Euw57LwJAALKOMLhVc2s4h2Or9nTecunG8KSmkCuZc4H1qh3frU+ltuV4HLqgdFUULbIHTggyvqiINov2tBqkkXeEjT7sOcTJCJNgNYU2O7//qg5kJmhso2CKHlRLpmy9LsaUK/Z+BzUmoRbwQgSwr3mz7dFAdlVWWKvKNcgX3nt1et0DIig3JKYmrnQX2Fprg+kWcr3nuizzLgjVwAlADC48P3DN0s/VBty2AYoWie16VNPIM+CV4BF2JRQ34GxZ8XceXbCKURrOjoCBgLGHvIhRW35eicoh26xp3/mwLvk5anPi5StJ/qEuzWJALeWcNbLsnt21m2MZp9h/MxaY6ftWOTzjTr5CYVd/teJyscMnGK4+lcV1dlt12lhbDMv6I+iz8iG9NIzuW5OvGkax90dA/Gq+Cd9FXVThPY4ufxWttHcTqgPB64GfMn6rywRm1B0eO1pJpYc/KlJZlW/PuaO8L1assyJs5KkOypBSy3zc6TO6pzgeOZv+VpQfA/UWpogv6ofmTpgdtwpjLFGSzIKTDXvF6FftALKVlYypG0fYbssA=");
|
||||
public static final SkinData ROWENA = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTc0Njk1MTcxOTgsInByb2ZpbGVJZCI6Ijg1MmE4YWNmNzMzNzQwZDc5OWVjYjA4ZmQ5OTY1MGI1IiwicHJvZmlsZU5hbWUiOiJLaW5nQ3JhenlfIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9jNDY1OGExODY4YzNhNjhhZWVhZmZkOTUxZDQyYmZkN2QxYTRjNGZjNDJjZDI2YTlmYzhkNTNmOTkxMTM1ZCJ9fX0=", "OqXMyH9SMmQ/Pwmb21In29YnCxbsN6yqUxfudN6KNgDwRUK6y072XhW6TIoTh9JQLAUKftpeVB53tk0LxHIxnsuBMrIHvETPDQFysIc/6xq3ABogs+zqFzcp5jk6S73HiD78JxLq5pzfUzhgDPMPuZP5Q/u2q1rYbe6B9lVEJ5sUcxBLUTossgucoR4qXYAlWVQdHRhq85Ol8a+OU7ruw3HackNGto6wt6u2MigCtiHVTt9XhJ/AJE4ScodQ3XwW4L6urpl/lV2OMCsr3mCjjjEz2EMhDbCWxrAorQ9aPpMbDkHBS+4TC1tbMGUlKhj5n+EZBYVaeLr4NGPACPSdT35p/2Zra49+DXn9Xn+681yNEB0ghTdsnsgwXg76+HVPHPqRHQMuTBQGQyGZaaTX/zE0tFjH+osMElLdb8dmz3dC7kQA4A13B2phj3YbMSF1FoU4GvnPKIQn6JIuEd6hd+pRLUW7Y+mgYIHHX1FT0ihrXAyVO6lQQ6rs92gSQr7sxC7tnhPSMFcmh7OcJYcbRpn97GMubthPLanOhVy7CKqjmwIkEVtYgP28idigKwNJ+sJuUONrOu7nMKl1UTD5EEapOacc/np6UhdSw8yW+LnWD/x9ueYz9ksnyRrJgcOa41izo/WCbjPK/j3JVezr9Q3x1yveWuFmdl7CGYdXngw=");
|
||||
public static final SkinData BIFF = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTc0NjEzMDQzNjYsInByb2ZpbGVJZCI6Ijg1MmE4YWNmNzMzNzQwZDc5OWVjYjA4ZmQ5OTY1MGI1IiwicHJvZmlsZU5hbWUiOiJLaW5nQ3JhenlfIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9mOWMyMTE3ZDY0ZWE0ZmUxMWZiY2NhZmE2YzU5YzhlZjY3NDVkZjVkMTZjM2QwMmI4NmI2OTlmZWJjNTA0OGI1In19fQ==", "mJMpEvQ4A02z0S/chgLm5bKrrrd+zmp7A0012AB7b3KlyIHoLKEDDz+ZJgJtvN6skOqed3P+yNVqkxitugXaZZP8Af9J+/TseHn+vOy6CTK5tykRSY3Zb8Zmw1kn36v/SARAVtDIHD53yuPgJayYSAbVB7aknj1Q8XBQGUmZRMRxWWxeD7rQTOwgRYI4YJeKFf4UL9i6zxvOJuHsOAouJ7scu7VohG8vgR77Js/Z8rSu8/aSG+O9AQdzP6h9ixYNFkkQOHm7DseK/5tsWKHM4FYBgjIDKt3ApQokSbhThzGB55BA1qjXZkfCoOb13y1nOMC8WoIL6Ees1qzxG3VloGx2WAZLh+Q+/irwrFDMxk1zeU5fIRuj1c/UIM2HKdxxWgoRdrZ8ww/Jrll6maiOBx7geMn/0aOUbJ2U7gkTif6RG6YNS5YN9ZQDLh72l/akJMxF3SlmuAPmLs2kBghQ6eD2YQKuxWR/Hf1yS1YXtogFVNsGnzC1nda7F48EGL3zI+kCajbDlAGQ32aRt0btbEQ+Gj575kir3Aa53qiZ0YOIYQlhgZdOsTN2NE2s8uuy/15Rgc6K3ydgEmSZfdqyMyW0Dy7pE5TfVL8DumKRVRXdOceT5WfnW7MyqSmdorP5ab1fw2wLOnAVzhJmW8oXXNSs77WJ1/PURclxOWB4IF8=");
|
||||
public static final SkinData CANADA_HAT = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTg2MDE5MDYwNzYsInByb2ZpbGVJZCI6IjdkYTJhYjNhOTNjYTQ4ZWU4MzA0OGFmYzNiODBlNjhlIiwicHJvZmlsZU5hbWUiOiJHb2xkYXBmZWwiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2M2MTExNTNmODdmMjZjMzRmOTdkODIxM2ZmOTk1ZGJlNjcyZWJkNGM0NjRkNGFkNzM5MWFlNDNjMWU3YTllIn19fQ", "QMw6e1FXl/Xrt+BbfPKsz3OHyOxL9CEPffS9grxRLD6gbLbMD84OT3+bge5V9lBFn9PPnTyID+WTF24qHj4ADTTgK94ykNedCEO6R1wS0FZKPI1UjwOxMhIG5ZeVr7+HxITgGU4Xz94IigBkvW//f2ZGelMvS0GLCrm4iCovEBMUzyYJ2dZ4xgzFSH6v+9efK4/SBAJaj8mHjXpDxU58/vskTGI3T9t5sWlZLXgId9vHcMj0GH3Un6yvUXiMkh38V/rAEM8/R8q08xUVyW0e2R38qWQV2+eKvsG8GmJmgkU/78wA9cKGZdrEz0pnr80eGNCbvXqQvC/czYhEhDapgxfndcHLX8q/Zk3I8msNr340E4ZrQL61Yl7KcVC1qEUQVu3cosq5A6ckXLGvv//HSwXVO8M9ThUbuEC8QjiS/fMFufnVa18lHrVulnfb/2KQ4yPsoCHK/zvGtRkWtD1sLOIfehN+sxCLiaz80ILBiwN0oHITfNHpJzoa4kF/OrxxCualp4Sv5o5TXBv7aWsO18v9ixb9o9CmJKKE8MUl5xmRVz4HQD4dyOfcwtPuxmfcYjJrxqBijdQMrcgLzqqMs+DUqcZZlxM7M5GaNUoEvL9tJNGpZaB2OrBw0DTk5wx15XfANCH4egx8X4+Iy2RUoFthHX3BsVazG7fjSiDnUtI=");
|
||||
public static final SkinData AMERICA_HAT = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTg2MDI3MjMyODgsInByb2ZpbGVJZCI6IjNlMjZiMDk3MWFjZDRjNmQ5MzVjNmFkYjE1YjYyMDNhIiwicHJvZmlsZU5hbWUiOiJOYWhlbGUiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzYzMjI0MDhkYzBiZjMxNjU4N2RiNDJiN2Q5ZmViZTUwYWQ4MGY0OGU4Njc5YzI0NTFkOTk3MTdjZmVjNTdkYWQifX19","oRo6DIuhOTaXDkFsgwJ488LWqx5d1QpwtglwG1SdEvkbX1aCMGdZyDm9YIopQRjfBg0uYKQFetOZ1ZkdMmc/aKC5/dm0+Ema7g8AUzjwf4OaSLH1r4C1UJ4ruaNG5diBxNTkYnMa7yT8zvyEr22CA7lUOIgTh8ymBfSGK35RPhsn8jM0hDjdhjemBAlxKpiioByfmAQbwokNBOrXfh/PnKq+iJYg4WpMSZ1zo5Rr0CzLXwu+/T3dvrb6mg7qry7J3Lj5/qn6iIdBcjJBeyvy1sCo45jQ3Rzc6oL/84Vu5Dpn395EqUK8Sa7mdpVpATTcj56TCjkNNtDapXNqyO/IIQuzU4wnBKNQmZefaxRl6LV0DhZ8n8YQaPj6hH/mr2oDsd23+jejjqu6Y95ReTyukp06mIGqgekmrdZV2etML2oMAOTv9ieVvqtfo5gEomYs+NFAL7rMmzjAlhd17VOgqNRMpmJazAHWOYKl8KdOH99wGDe5XcyKHysh+qyHKMvhPJztIeAEaosynF/aGHghH2PM354KCuUVNmdR5G7UZUoG9ZA5ZU3EzZ854jeqxcqw3jzb6qL7A83QNuFqOsb87ugL/jO3QEDdQ9drdf3WAQauQGkU3nYBrls5wxoMrQ+Ceth+FtZw9a1v7dc+DEWOeJKCtOAIskb29pv6OcRe0Wk=");
|
||||
public static final SkinData REVOLUTIONARY = new SkinData("eyJ0aW1lc3RhbXAiOjE0OTg3ODQ5Mzk3NjAsInByb2ZpbGVJZCI6ImIwZDRiMjhiYzFkNzQ4ODlhZjBlODY2MWNlZTk2YWFiIiwicHJvZmlsZU5hbWUiOiJZZWxlaGEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2I4NTBkZDNkYWQ0MjkxYzFhYmU4NGU2OTM2ZmQ3MDM0ZWVlZTk1OTk2MWI3YjE5NDZhODIxYWRlMTFiODI2YjIifX19","U2xBG+ryUacvZq3WreWF2J4QnQERuvp1okqdlkAYECqvVHz0cars78usPuZYD4s3HyOM0eGASzS4zkQERF6Hk8crnG+ZtqvML5kL+TkxK8gEbn2j5qB+YDG0qTx635mYGC77sGaqE/CsZAlhRYU6lyXILW2616Af8B8orOlpyCMRytijp/OfJREK0bC4I1QnB7AJ2QmBYuZJ9l8473858fJOlCVHjbsC/WRcUvepPSYYxvl8Z5NwayyIVnnz3tGVN6hnM7tzil/gQmsmDwGhlSyify/MEGssvd0sHLTlccA7XX98tyUFHXU84L5MJuNKg/uXTYz+9cRPIgJaptJNfqCoEa/ape+YHlOlK2lm5qRvubvp931X+VwFbcrEuaIFgbqr9cof5JW6DYfpVKvcngi9+K9IzgtPG59Jro5kxb70IfQhZcDkcHGo1pz5Tj7cdJdD7crBeIBaE/EoKU6iaSOrUFoILEdpcWQfaToRnk4L/JMet7zPXBNE/D/vEgQLGLNX7byofdCXSD9njtjLWmHg4rCzwuUqaiWnTCYIkkdg/mFuRQ3oTRRTzdlLXsK90Pz0XU9N6gBhWA9pxhzDJR7YK+mdXODALuMXE6zcCsbVuWhqbnN+EByGdjT9X1QPSN+/5iV9d5JyweiJrF7arf2PmxgEIb9OSjePNKRmHoo=");
|
||||
public static final SkinData MELON_PERSON = new SkinData("eyJ0aW1lc3RhbXAiOjE1MDEzNjA2OTU5MDgsInByb2ZpbGVJZCI6ImNiZDIwN2M3ZDNkZDQwYTg5NTBiZGQ4ZTU4M2IyYjY1IiwicHJvZmlsZU5hbWUiOiJBbGVzc2FuZHJvQ2Vydm8iLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzNiNDQwYjc5NWY3ZGNjZGNiODY3MzBjYzMyYzE0MGQ4NzM2NmRjNDU2YWZhZjA4Y2VkNjE1OTEyOWViMCJ9fX0=","U5yXWm6A0R4gzZRFWeeI0IUwOlpjOUogDIJyPX1b9ItcT1CMkKF/oc2IKmbMJGhwktzV8U3YKh8J3IHHomJYMiZN6WH8QNyzAiw4uaaWd2JFtG5LYRLFI7DPiaXrRW0Wdz4IffFBZ5yyDOIOLcGCExLrxyeKAO7yNah6IMgEbtY8wX6uZYFWkxRx7Orbici2zsDakghXUFcnvNE+plmK3Gxjb45RtYfWeurGzcsCEEjkRK/aQ4aohvCkx5sc4Bl3ObWiDVJ9FvHzPSd09zjnIpL9jyxKQTscbeRFKasjtbJLEbq/yq5cAjI9uGYbPkBG9C1JgmWDZBz9a0bCwRokihKtYJbDAs1417qcyzoH0ylLt85fz+XM7G+MIHba8hZ3aJFZughyslsCg/+5jAm+Ci9yQJgYFf3yHFUrmVktHz+dsWdgrfDqIMXKJWXVKccvHMD0u+yKCMxW6C4RxZmOgnAqYfvPUJqTrAW4FpbFuPBTpFsGYF7QfgIekib8aXsUr0hCh1HqEYqICVXT8Jr38A4ySMZ1NKnbRzEsDwL/4gE5YDtza+qcanY2Ewl906Z+m3uMXXXKM7uYq47RyOYWYyOcyJhr9n7C1pEbyoaTt1m4+u9j9TEMX/8oN7qCSvDhkBH5M+XIt6OJhu7bJObW0HjqUo6yADUx3srK9cX9Rpw=");
|
||||
|
||||
public static final SkinData APPLE = new SkinData("eyJ0aW1lc3RhbXAiOjE1MDEzNjMzODU3NzAsInByb2ZpbGVJZCI6IjQzYTgzNzNkNjQyOTQ1MTBhOWFhYjMwZjViM2NlYmIzIiwicHJvZmlsZU5hbWUiOiJTa3VsbENsaWVudFNraW42Iiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8zNWUyZTA5NTk3MTJkY2QzMzU3Y2MzY2VhODVmOTliM2ZkODA5Nzg1NWM3NTRiOWIxNzFmOTYzNTE0MjI1ZCJ9fX0=", "tK+zKZp42fBhSLoXyFMwJ7AYubID12WUhhp9At4YA7A6SuYHj022IrkxWjsl8e7stsd+gmMsPbr25HMHH8JXRQhzH+5qRa3PBVqhYFUHWI7jrrmTk7krhwZOg+Ozw0+TU4nqyRZGeZxwKiy0DcpO7tsgcFQtbJTG27jh4ZGlkqANDHYsqi8BiOXVz51yquuf8x8Bgml+0wyuCrkgUo2a0iXB5la9zs/HnxFJbHi/IHn+a2+RqGa49JhgMCykKkohsgPEqcuCBuUbqs8pxdnUHTqCxmZ/XKjgXq3NpFkfp2RYynDTW5RfZdEbo+D+cbivZgrehBtJatJd8vZu+kmuxwxYR0mdre4MrlRcgn1CpSvPk5/EJrkst8TVv1iEtUeR2l82umw+QfemNOgrOP3K/DT+JX6faRskrLP7J6JAIWP04dEuDI83t1Y7UPX/tSsGOrA2PO/VR8670dwCMS5Wc60RLhT98PKs0ctFaPK4RQRp4XbOw7jtWiNUZ+iy7JOUFLKcoTZNOFqoXs1IVs2JZ/nHJHkzLXkvaHzeM5KlYiq8igCy3XF5CQvVrTsFYX+PELkq+2wpyVgSHITqhUZl96mDAWMFm8IepE0JEkTfp8VrTTXeym3LL5Ecu7Azeoh7SiKf5lSKyLro3hp2N+JvN8l0BPB8qpZAjs4VJd79dns=");
|
||||
public static final SkinData MELON = new SkinData("eyJ0aW1lc3RhbXAiOjE1MDEzNjMzNTc0MjcsInByb2ZpbGVJZCI6ImJiMDgwOTFhOTJlZDQzYWQ5NGYxZWRmZDc0NmIwYTJjIiwicHJvZmlsZU5hbWUiOiJJcDRuZHgiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzFjNDA4MWM4ZjRmY2RjODE5Y2VjZDZmOTRmM2ViZmFiZTBkMDMxMTVkZjJjNjYyODIwYTdhZWJhODljMmUifX19", "qHvPSsGfSDapqJlLxk1BQb2cVFbjggbDbQWCaHkzpfCx7yTojSR29ywqg0F5rLabZ7Q13wG7l2CUkdCsK4urO1qx2MpSK3iVL/mG2x2O3m3Hg7FUU6fcaupP9T8V36n8HNag5uM3lbtnzoNmhwuCS6EbzRbgk5cL38jRwPod4Bxea/UKOBFmrl506Y2pjg0gi3nZVHPmnweNC3kV8FwmHHfFUt2T6QrvULKANLfxTYmIJj9jrG5CZ3oGQj6vnHo0iA5NpMpUYAqLSKrAV2GTVZ8U7SEcTkUgLkXfd7UnNKGWVoH93LUtRyti71fwtx5q591xfqdbRiMQZBz5r5U0kUg9HrCuz8nUaCX4ox9vPJp3TktlRT8cqRyadm+bqVHPccnS0Wt/7HTMC85X1VhB+5EawHdx8umkky404mEJbPcWZZlXfbsDchASMq2tgfeZZufgJX/DY/qyVz8L1Pmp9IXuqnzvV2CaUwjKtyc8gd6ZrOGOmYovhth/IgvRUaChB248Wwh2qe3sQz0PYxAuFMP0D3mf8ctLFmVyR3bPKtxJYW6vrLiZ8a6lg1houf/pQMF4q5HQSzW7Nbic7gR766TXgy5dRxavyToPRuFkCnI3EQwmleeYg88pazcGRWGOEueAM1/4dbNjNsAoif8fCSI3/1UT7lgvcCAinDJe6AE=");
|
||||
public static final SkinData ORANGE = new SkinData("eyJ0aW1lc3RhbXAiOjE1MDEzNjU4OTA3MDMsInByb2ZpbGVJZCI6ImNhYjI4ODVkMTUxNjQ1OTNhZmI2MDkwODJlOTE2NmU3IiwicHJvZmlsZU5hbWUiOiJGYW5jeV9MdWR3aWciLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzU5ZTNlMGUxOTZjY2I3MjRhMjI1NzRmYzdjNjdhNmM2OGVlNDIwZjE3ZWM5MzI3YTUyNjYxZDcyNGQ5OGU1YzcifX19", "Bjj4N79wGgpPDV4oBDtB6B2dva3gN6pP+siJ9r309oJ1LXqPB9kbBIe7bquTKXAJgrNWuK2phASVoFdvJUbc7pazpk5h2ZDdPqWCnP8H7Oq2BtRpCJuvOnINZFGURzkdhbrfnvgoN7WEm3MsdZ6I702ZHrC15rVwTvimKV0bD3kq5W18nYZL446SxdBqKilK1Uly4582ZuEajZ3xsJfdVohPFNDKKu5z3HWPkcPu6jIi4/ACMsxSk7SYic3ZnwN+ULgHAoWymfcta3zmHeNDqYn+68iJRE1+WYHvkXlrO3gdgDqWD2MIyDCvFkLPuPZ/W93zr6V+WAXpH1Pgh6+Sw24EiIKnHR1paCo7eJI+1c4BlYgAwctj36pyRHh7N8Po5GSi7vQKrzoMLoBBJqRVKK5gbIVOWxBBKnhK+q2va5ZVoYPhBb808i4HA538dLk3qeAhVKX/x0uyAGtKgIKa4OlxcBk40LKQ1a/NnC7vOSB6lWLE1PiVoZ8yhe2pJQKy+7nztWehrO1g0IcwLYZSjraAiZ17Zx1fFHYp+4qnjncYewvGDXrcIofG7EEpSCNzY/HsagykPZMyPPSDcwuDZHI08JIPTRkwXTzae2BDggkF4d6PxyLryZE3BnG7lSb6yMKYvsDqpkhuqsUPI4put1DKJEFx+hIlT0I5kVI3rQc=");
|
||||
public static final SkinData STRAWBERRY = new SkinData("eyJ0aW1lc3RhbXAiOjE1MDEzNjU4NjE1MTEsInByb2ZpbGVJZCI6ImFkMWM2Yjk1YTA5ODRmNTE4MWJhOTgyMzY0OTllM2JkIiwicHJvZmlsZU5hbWUiOiJGdXJrYW5iejAwIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82NmE4ZDlmM2YxOWNmZDZlZGNmNzFjOWM0ZjNhZDA5OGYzZTk1OWE5OTBkNjEyZjQ5YzI1MTgxNzM1M2JjYmUxIn19fQ==", "wxroo0ThDSb1B69kNyZsdtpg5qPxjWSt+LX3hg3KvgxziiNhMVmsLVks6+yz2vaeHPDyqckFO+eaVyb1wCuczFCOxLCKBHVhhBFKEbaF5NZTS0HOK6fvY6jxxETX93TmANgWm9MzrcVMGKvBck/gOI40+kxcVJKUg0Jb3yGQcuY820thGB95qznHDLIbnnTaB3mJr4yog2intDOqSF7I0fnd5U0Qceaor2u0WWiXaVr+SKvA8D9xvOfrc+IGYV55EHuQu1o3fl5qfK1mBASG9xWACCyTdoOkt06MsJCTxxo60ZE1nnL5m3a27XJ5HeiVNKjjrMOqlTfieBN8H0sWxfzMJ5gjFmGjxq6qhnAjn8Gr/SyhDbnTHILOTbh/V8XdZCwqYD7XI/3///LyPCEfoLmPsFnMd9M8V3DIiDJ3GvD8qTQd54vYHnUw6yR/mA6ONx1OxHBHprIaP5urq9MNIljg2PtVtOzSWypObpf3kR+ZhUC0t8hqiapsLAvpzkb7FO12db0Hwr+4NIbZQ8ZYTe0ds2Zb8Iq1BMWOZ16ffwnDnaqulhQN+nIAA+61Q4k5y2sa60lmvr23yX3AV3Ywop13k1Gvc/amrA+ni66i5ezXMa4+V22fUEAqb+VrEF6IMg4Vac50HIbvIpM1QaWP4fqoHE5lHjCRwmqGjEL9WXQ=");
|
||||
public static final SkinData PINEAPPLE = new SkinData("eyJ0aW1lc3RhbXAiOjE1MDEzNjU5Mjc3OTMsInByb2ZpbGVJZCI6ImJiMDgwOTFhOTJlZDQzYWQ5NGYxZWRmZDc0NmIwYTJjIiwicHJvZmlsZU5hbWUiOiJJcDRuZHgiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzczMjVlYmI5NmE3YWYzZTg3ZThiNmNhOWE4YzE5ZTllOWVlZDgxYjU4Y2RhZWUzNTIyMTg2NTc0YzgyN2Y0In19fQ==", "wrrEvFHwXhSivSnSN1VbXwjfZ7JrdizB4kAGCpOgYu090M087cJUoWan5KfjMN4N9DjmxmWt6M/yE25+47iu3grzaxnsIAUY+b7HzYzk1nrII3R9LLRbOF6cr6ug2c9scQ1wTsWHpul8y5U/vNekTN8+rRBBurmzUR+50M/wXh+mVFhVFtI2QFwDOZZWz4Tz/mPqGiRAtfT1UcPmGS9d5qETqWQlOAbtdlhuYQADNKSf3pIizRvbJKrEtDI6+deqzzGj35L7LdnsOO+k0qFz5m75AdbOty0l11ID1XGXf604iOocvNk/mO4oO+C7Na2jdwazgd7TJ0H+7qAz2suXflco+ALGcRJob3ysBleHBY2l1IpCWH6SPQG+mQvyOfi356dS4HM/QnPBswLJZ+q7rpkAyW8nArLP49/s+ou0PRs75EiFM61xzFoQRt1fLhx7X+IP2QYy7KIMWw5oRJvLKedu2bDTilMq5lyj6o7I7mfKIou8+O4P30eOwBFTPpjPe3BLMws7/Muwqh4TeSdTIuEkTca8qxb8RUv136DJkmkMJTYiZg7kNHLRL0oP8Hz1o8sCX9w6MElyHeRv/h+sE6PHP3zApjr3+wAun6CFBnLvtVcOA5/zvYQcNbzN2sdwWf7V+djN5Eqq78FduhK1MqiYXpJq9pM/cM3beM1rXE4=");
|
||||
public static final SkinData GREEN_APPLE = new SkinData("eyJ0aW1lc3RhbXAiOjE1MDEzNjU4MTM1MzIsInByb2ZpbGVJZCI6ImE5MGI4MmIwNzE4NTQ0ZjU5YmE1MTZkMGY2Nzk2NDkwIiwicHJvZmlsZU5hbWUiOiJJbUZhdFRCSCIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjY3OGNmNjAzOTg2ZTM4NDcwNjkyZjgwYWJlNDE4ZjM5YTJjYWQ3N2Q4Nzc4YWY4NTc0NmU5MTkzMzdjZmQ2In19fQ==", "xAm3i+xi9OynV2uaqdF0VTws0qCsH3SP3zeEa5gUZejbhzXA7/i4JZC2+Ag9ULj4AaTbZhc1mFMB9+XAozmrWr+BEQjaD8/sbyQIirzUAk/X6ZTCKkp7Xk46mFlKjd4IVvoUSopCa/HCTRZTugjqJrPbdy232/UVC9JBShAcMq7pD7rmH5+O/vVtMcrtT8MjY95vnlhyXyNpDwYhCW9YlmZcG5fS5nPaq8k8mCaNe/fILVf2T/hQqqMTuZiqQk53L+5C8aiU4nySrGATB3UK1OwVTB7t3gen4MQtUT0ursOKoLLbxWboQWjsFYOxycfDeccOcB50iHfqCW8UmARt8mUT17RfWQvwIqlv1uThdnKsFZjx3LAodPAzcqyIoyR8EbCEeV82pDtYG5X7gT/pV/inYDgrLT7ZmONRk2x1TzTC3PicKNXu40OcOU63yaB/nvQY3FURNVCpvWXwPD1QyZBYfKtO4no1/TfPoZPcdGz9E1Xor74AlDAUJTlGQ5+OlQldJiwHvmPxTPJKdgOJLXRVUHcFLV32VtWnmrBRq9pm3qO3MTEVytB4XVaGmsf3zqcwrVur910CpPxDjyXqe1NvxN2I/43FAQInL3iX/NqOpwsx7alSIUe3ZhdqP6l8SSTDK0Sp+1GtvGrvRiX/8dStDfAsNCN0HxvxQQUVM2w=");
|
||||
public static final SkinData PLUM = new SkinData("eyJ0aW1lc3RhbXAiOjE1MDEzNjQyMzY0NjMsInByb2ZpbGVJZCI6IjBiZTU2MmUxNzIyODQ3YmQ5MDY3MWYxNzNjNjA5NmNhIiwicHJvZmlsZU5hbWUiOiJ4Y29vbHgzIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9lZWIzZjU5NzlhNWVhMGI4MmM4NTUyNmZkYjg0ZjI2YTY4YmY1YTI1NDQ5YzRiNTk2NWU5Y2IxYzQ5NDM5YWY0In19fQ==", "jC6e7Cy7wGmvqSUjIYXwPXQZjAVxnOMoST+IKy/m/g4uklandxhBT9HJskBI+rtVjz67psyLmY941gAtqIbLkRxEhAeT/Qc3iRMV9MN7Ac7b3UaQsnO5gnY3IBZZxSTJhX8oxyTXD+c9k4lsjladzxXA3DcmEn0Cqp0t0oFQA5mEYpa1qGB6NCoXvi5deXNID3PQJjj+PLkohoLKhsDEqbYb3djwGTDKWYGFAwuF7KnA3cuPXa5KN6sPbM7qdjnF3Gke9bkinTn8F7cXVxEpcqAxiUyv8Wv/umHRaEBuDf9yxrDaberkRQu+YIqK6fw805QwcxQePiG/qMU9yZAOuPoolp/SUROHF69pjN9lI8O5Vs08f/K3rSIpgyU16K+lUmE1XIPukUBjNsK2mRTLfJgv8csilzS5jWmVzjr859l0Inr51tGtfQ3VEyUJtIowcOh9GfZWTvaYeDnyGhRUaEpPOmCo1QLIbedAbq51+gYykeQMTmRc+joxxN9SBlF252d7ncOcVAChHxmcFWbPbhV2lMfSTxGmKAx1T9dmw22Z0WTM0NkMG7EsG7wFz1U8f0OY4lyrtVUM7Oy8pc8RuRPhOgQGAvuhA58k6DLgmOpMOVBuEkoOFpZaJKWgVMQI+u9g6COC7WRTF/Z3EW//BFQ09L+uSAPaeyD8rzFqbCo=");
|
||||
|
||||
|
||||
// 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
|
||||
|
@ -1025,14 +1025,15 @@ public class UtilEnt
|
||||
}
|
||||
|
||||
// Nicer than doing entity.getMetadata(key).get(0);
|
||||
public static Object GetMetadata(Entity entity, String key)
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T GetMetadata(Entity entity, String key)
|
||||
{
|
||||
if (!entity.hasMetadata(key))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return entity.getMetadata(key).get(0).value();
|
||||
return (T) entity.getMetadata(key).get(0).value();
|
||||
}
|
||||
|
||||
public static void removeMetadata(Entity entity, String key)
|
||||
|
@ -418,4 +418,22 @@ public class UtilParticle
|
||||
PlayParticleToAll(particleType, location, color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1f, count, dist);
|
||||
}
|
||||
|
||||
public static void playColoredParticle(java.awt.Color color, ParticleType particleType, Location location, int count, ViewDist dist, Player... players)
|
||||
{
|
||||
if (particleType != ParticleType.RED_DUST
|
||||
&& particleType != ParticleType.MOB_SPELL_AMBIENT)
|
||||
return;
|
||||
PlayParticle(particleType, location, color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1f, count, dist, players);
|
||||
}
|
||||
|
||||
public static void playColoredParticleToAll(java.awt.Color color, ParticleType particleType, Location location, int count, ViewDist dist)
|
||||
{
|
||||
if (particleType != ParticleType.RED_DUST && particleType != ParticleType.MOB_SPELL_AMBIENT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
PlayParticleToAll(particleType, location, color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1f, count, dist);
|
||||
}
|
||||
|
||||
}
|
@ -9,6 +9,7 @@ import mineplex.serverdata.Region;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
@ -43,14 +44,7 @@ public class UtilServer
|
||||
|
||||
public static List<Player> getSortedPlayers()
|
||||
{
|
||||
return getSortedPlayers(new Comparator<Player>()
|
||||
{
|
||||
@Override
|
||||
public int compare(Player o1, Player o2)
|
||||
{
|
||||
return o1.getName().compareTo(o2.getName());
|
||||
}
|
||||
});
|
||||
return getSortedPlayers(Comparator.comparing(HumanEntity::getName));
|
||||
}
|
||||
|
||||
public static List<Player> getSortedPlayers(Comparator<Player> comparator)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -48,7 +48,7 @@
|
||||
<dependency>
|
||||
<groupId>com.mineplex</groupId>
|
||||
<artifactId>anticheat</artifactId>
|
||||
<version>1.5</version>
|
||||
<version>1.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.tukaani</groupId>
|
||||
|
@ -45,7 +45,7 @@ public class CoreClient
|
||||
|
||||
public UUID getUniqueId()
|
||||
{
|
||||
return this._uuid;
|
||||
return _uuid;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
@ -134,20 +134,20 @@ public class CoreClient
|
||||
|
||||
public void undisguise()
|
||||
{
|
||||
this._disguisedName = null;
|
||||
this._disguisedSkin = null;
|
||||
this._disguisedRank = null;
|
||||
this._disguisedUUID = null;
|
||||
_disguisedName = null;
|
||||
_disguisedSkin = null;
|
||||
_disguisedRank = null;
|
||||
_disguisedUUID = null;
|
||||
}
|
||||
|
||||
public String getDisguisedAs()
|
||||
{
|
||||
return this._disguisedName;
|
||||
return _disguisedName;
|
||||
}
|
||||
|
||||
public String getDisguisedSkin()
|
||||
{
|
||||
return this._disguisedSkin;
|
||||
return _disguisedSkin;
|
||||
}
|
||||
|
||||
public Rank getDisguisedRank()
|
||||
@ -157,32 +157,32 @@ public class CoreClient
|
||||
|
||||
public UUID getDisguisedAsUUID()
|
||||
{
|
||||
return this._disguisedUUID;
|
||||
return _disguisedUUID;
|
||||
}
|
||||
|
||||
public boolean isDisguised()
|
||||
{
|
||||
if (this._disguisedName == null)
|
||||
if (_disguisedName == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return !this._name.equalsIgnoreCase(this._disguisedName);
|
||||
return !_name.equalsIgnoreCase(_disguisedName);
|
||||
}
|
||||
|
||||
public void disguise(String name, UUID uuid, Rank rank)
|
||||
{
|
||||
this._disguisedName = name;
|
||||
this._disguisedUUID = uuid;
|
||||
this._disguisedRank = rank;
|
||||
_disguisedName = name;
|
||||
_disguisedUUID = uuid;
|
||||
_disguisedRank = rank;
|
||||
}
|
||||
|
||||
public Rank getRealOrDisguisedRank()
|
||||
{
|
||||
if (this._disguisedRank != null)
|
||||
if (_disguisedRank != null)
|
||||
{
|
||||
return this._disguisedRank;
|
||||
return _disguisedRank;
|
||||
}
|
||||
return this.GetRank();
|
||||
return GetRank();
|
||||
}
|
||||
|
||||
public void setNetworkSessionLoginTime(long loginTime)
|
||||
|
@ -92,7 +92,7 @@ public class UpdateRank extends CommandBase<CoreClientManager>
|
||||
if (Plugin.Get(p).GetRank() != Plugin.Get(p).GetRank(true))
|
||||
Plugin.Get(p).resetTemp();
|
||||
|
||||
OnlineRankUpdateEvent event = new OnlineRankUpdateEvent(caller, Plugin.Get(caller).GetRank(), rank, true);
|
||||
OnlineRankUpdateEvent event = new OnlineRankUpdateEvent(caller, Plugin.Get(caller).GetRank(), rank, false);
|
||||
Plugin.Get(p).SetRank(rank, false);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
|
||||
|
@ -462,6 +462,15 @@ public enum Achievement
|
||||
new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"},
|
||||
AchievementCategory.CASTLE_ASSAULT),
|
||||
|
||||
CASTLE_ASSAULT_ALCHEMIST_KIT("Alchemist", 0,
|
||||
new String[]{"Castle Assault.AlchemistKitKills", "Castle Assault TDM.AlchemistKitKills"},
|
||||
new String[]{"Kill opponents while wearing the Alchemist Kit"},
|
||||
new int[][]{new int[]{0, 100, 500}, new int[]{0, 150, 750}, new int[]{0, 250, 1000}, new int[]{0, 500, 1500}, new int[]{0, 1000, 2500}, new int[]{0, 1500, 3500}, new int[]{0, 2000, 4500}, new int[]{0, 3000, 6000}, new int[]{0, 5000, 10000}, new int[]{0, 10000, 100000}},
|
||||
new int[]{50, 100, 250, 500, 1000, 1500, 3000, 5000, 10000, 20000},
|
||||
"Initiate",
|
||||
new String[]{"Novice I", "Novice II", "Novice III", "Novice IV", "Novice V", "Master I", "Master II", "Master III", "Master IV", "GRANDMASTER"},
|
||||
AchievementCategory.CASTLE_ASSAULT),
|
||||
|
||||
CASTLE_ASSAULT_WINNER("Assault", 0,
|
||||
new String[]{"Castle Assault.Wins", "Castle Assault TDM.Wins"},
|
||||
new String[]{"Win games of Castle Assault"},
|
||||
@ -1226,7 +1235,62 @@ public enum Achievement
|
||||
new String[]{"Gem Hunters.ChestsOpened"},
|
||||
new String[]{"+1 for each chest opened"},
|
||||
new int[]{50,100,200,400,1000},
|
||||
AchievementCategory.GEM_HUNTERS);
|
||||
AchievementCategory.GEM_HUNTERS),
|
||||
|
||||
MOBA_GOLD_EARNED("Gold Farmer", 0,
|
||||
new String[]{"Heroes of GWEN.GoldEarned"},
|
||||
new String[]{"Earn Gold"},
|
||||
new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}},
|
||||
new int[]{100000,500000,1000000,2500000,5000000},
|
||||
"I",
|
||||
new String[] {"II","III","IV","V","X"},
|
||||
AchievementCategory.MOBA),
|
||||
|
||||
MOBA_KILLS("Champion Slayer", 0,
|
||||
new String[]{"Heroes of GWEN.Kills"},
|
||||
new String[]{"Kill players"},
|
||||
new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}},
|
||||
new int[]{100,250,500,1000,5000},
|
||||
"I",
|
||||
new String[] {"II","III","IV","V","X"},
|
||||
AchievementCategory.MOBA),
|
||||
|
||||
MOBA_WINS_ASSASSIN("Assassin Victor", 0,
|
||||
new String[]{"Heroes of GWEN.Assassin.Wins"},
|
||||
new String[]{"Win Games as an Assassin"},
|
||||
new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}},
|
||||
new int[]{10,50,100,250,500},
|
||||
"I",
|
||||
new String[] {"II","III","IV","V","X"},
|
||||
AchievementCategory.MOBA),
|
||||
|
||||
MOBA_WINS_HUNTER("Hunter Victor", 0,
|
||||
new String[]{"Heroes of GWEN.Hunter.Wins"},
|
||||
new String[]{"Win Games as a Hunter"},
|
||||
new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}},
|
||||
new int[]{10,50,100,250,500},
|
||||
"I",
|
||||
new String[] {"II","III","IV","V","X"},
|
||||
AchievementCategory.MOBA),
|
||||
|
||||
MOBA_WINS_MAGE("Mage Victor", 0,
|
||||
new String[]{"Heroes of GWEN.Mage.Wins"},
|
||||
new String[]{"Win Games as a Mage"},
|
||||
new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}},
|
||||
new int[]{10,50,100,250,500},
|
||||
"I",
|
||||
new String[] {"II","III","IV","V","X"},
|
||||
AchievementCategory.MOBA),
|
||||
|
||||
MOBA_WINS_WARRIOR("Warrior Victor", 0,
|
||||
new String[]{"Heroes of GWEN.Warrior.Wins"},
|
||||
new String[]{"Win Games as a Warrior"},
|
||||
new int[][] {new int[] {0,0,1000}, new int[] {0,0,5000}, new int[]{0,0,10000}, new int[]{0,0,25000}, new int[]{0,0,50000}},
|
||||
new int[]{10,50,100,250,500},
|
||||
"I",
|
||||
new String[] {"II","III","IV","V","X"},
|
||||
AchievementCategory.MOBA),
|
||||
;
|
||||
|
||||
private String _name;
|
||||
private String[] _desc;
|
||||
|
@ -43,7 +43,7 @@ public enum AchievementCategory
|
||||
StatDisplay.fromGame("Wins", GameDisplay.SkywarsTeams, "Wins"), StatDisplay.fromGame("Games Played", GameDisplay.SkywarsTeams, "Wins", "Losses"),
|
||||
StatDisplay.fromGame("Kills", GameDisplay.SkywarsTeams, "Kills"), StatDisplay.fromGame("Deaths", GameDisplay.SkywarsTeams, "Deaths"),
|
||||
StatDisplay.fromGame("Gems Earned", GameDisplay.SkywarsTeams, "GemsEarned") },
|
||||
Material.FEATHER, 0, GameCategory.SURVIVAL, "Destructor Kit", false, GameDisplay.Skywars.getGameId(), GameDisplay.SkywarsTeams.getGameId()),
|
||||
Material.FEATHER, 0, GameCategory.SURVIVAL, "Earth Kit", false, GameDisplay.Skywars.getGameId(), GameDisplay.SkywarsTeams.getGameId()),
|
||||
|
||||
UHC("Ultra Hardcore", null,
|
||||
new StatDisplay[] {
|
||||
@ -220,7 +220,7 @@ public enum AchievementCategory
|
||||
Material.EMERALD, 0, GameCategory.SURVIVAL, null, false, GameDisplay.GemHunters.getGameId()),
|
||||
|
||||
MOBA("Heroes of GWEN", null,
|
||||
new StatDisplay[] {StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED, null, StatDisplay.fromGame("Gold Earned", GameDisplay.MOBA, "GoldEarned")},
|
||||
new StatDisplay[] {StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED, null, StatDisplay.fromGame("Gold Earned", GameDisplay.MOBA, "GoldEarned")},
|
||||
Material.PRISMARINE_SHARD, 0, GameCategory.CLASSICS, null, false, GameDisplay.MOBA.getGameId());
|
||||
|
||||
private String _name;
|
||||
|
@ -31,7 +31,7 @@ import mineplex.core.stats.StatsManager;
|
||||
|
||||
public class AchievementPage extends ShopPageBase<AchievementManager, AchievementShop>
|
||||
{
|
||||
private static int ACHIEVEMENT_MIDDLE_INDEX = 31;
|
||||
private static final int ACHIEVEMENT_MIDDLE_INDEX = 31;
|
||||
|
||||
private AchievementCategory _category;
|
||||
private StatsManager _statsManager;
|
||||
|
@ -1,6 +1,5 @@
|
||||
package mineplex.core.antihack;
|
||||
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
@ -10,11 +9,7 @@ import java.util.concurrent.ThreadLocalRandom;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
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 javax.xml.bind.DatatypeConverter;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -48,6 +43,7 @@ import com.mineplex.anticheat.checks.combat.KillauraTypeF;
|
||||
import com.mineplex.anticheat.checks.move.Glide;
|
||||
import com.mineplex.anticheat.checks.move.HeadRoll;
|
||||
import com.mineplex.anticheat.checks.move.Speed;
|
||||
import com.mineplex.anticheat.checks.move.Timer;
|
||||
import com.mineplex.anticheat.checks.move.Toggle;
|
||||
import com.mineplex.anticheat.checks.player.BadPackets;
|
||||
|
||||
@ -76,6 +72,7 @@ import mineplex.core.common.Rank;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.common.util.UtilTime;
|
||||
import mineplex.core.preferences.Preference;
|
||||
import mineplex.core.preferences.PreferencesManager;
|
||||
import mineplex.core.punish.Category;
|
||||
@ -84,11 +81,16 @@ import mineplex.core.punish.PunishClient;
|
||||
import mineplex.core.punish.Punishment;
|
||||
import mineplex.core.punish.PunishmentResponse;
|
||||
import mineplex.serverdata.commands.ServerCommandManager;
|
||||
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;
|
||||
|
||||
@ReflectivelyCreateMiniPlugin
|
||||
public class AntiHack extends MiniPlugin
|
||||
{
|
||||
private static final Map<Class<? extends Check>, CheckThresholds> CHECKS = ImmutableMap.<Class<? extends Check>, CheckThresholds>builder()
|
||||
public static final Map<Class<? extends Check>, CheckThresholds> CHECKS = ImmutableMap.<Class<? extends Check>, CheckThresholds>builder()
|
||||
.put(KillauraTypeA.class, new CheckThresholds("Kill Aura", 25, 45, 60))
|
||||
.put(KillauraTypeB.class, new CheckThresholds("High CPS", 0, 0, Integer.MAX_VALUE))
|
||||
.put(KillauraTypeC.class, new CheckThresholds("Reach", 25, Integer.MAX_VALUE, Integer.MAX_VALUE))
|
||||
@ -100,11 +102,12 @@ public class AntiHack extends MiniPlugin
|
||||
.put(Speed.class, new CheckThresholds("Speed", 1000, 2000, 3500))
|
||||
.put(HeadRoll.class, new CheckThresholds("Illegal Movement", 0, 0, 1000))
|
||||
.put(Toggle.class, new CheckThresholds("AutoSneak", 100, 200, 300))
|
||||
.put(Timer.class, new CheckThresholds("Timer", 1000, 2000, 3000))
|
||||
.build();
|
||||
|
||||
private static final CheckThresholds NOOP_THRESHOLD = new CheckThresholds("Unknown", Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
|
||||
|
||||
private static final Map<Class<? extends Check>, AntiHackAction> ACTIONS = ImmutableMap.<Class<? extends Check>, AntiHackAction>builder()
|
||||
public static final Map<Class<? extends Check>, AntiHackAction> ACTIONS = ImmutableMap.<Class<? extends Check>, AntiHackAction>builder()
|
||||
.put(KillauraTypeA.class, new ImmediateBanAction(200))
|
||||
.put(KillauraTypeD.class, new BanwaveAction(1500))
|
||||
.put(KillauraTypeF.class, new BanwaveAction(600))
|
||||
@ -112,6 +115,7 @@ public class AntiHack extends MiniPlugin
|
||||
.put(Speed.class, new ImmediateBanAction(10000))
|
||||
.put(HeadRoll.class, new ImmediateBanAction(2000))
|
||||
.put(Toggle.class, new ImmediateBanAction(500))
|
||||
.put(Timer.class, new ImmediateBanAction(15000))
|
||||
.put(BadPackets.class, new GEPBanAction(300))
|
||||
.put(KillauraTypeB.class, new GEPBanAction(100))
|
||||
.build();
|
||||
@ -158,7 +162,7 @@ public class AntiHack extends MiniPlugin
|
||||
require(GuardianManager.class);
|
||||
_banWaveManager = require(BanWaveManager.class);
|
||||
|
||||
Bukkit.getServicesManager().register(MineplexLink.class, new MineplexLinkImpl(), this._plugin, ServicePriority.Normal);
|
||||
Bukkit.getServicesManager().register(MineplexLink.class, new MineplexLinkImpl(), _plugin, ServicePriority.Normal);
|
||||
|
||||
ServerCommandManager.getInstance().registerCommandType(MajorViolationCommand.class, violation ->
|
||||
{
|
||||
@ -167,10 +171,14 @@ public class AntiHack extends MiniPlugin
|
||||
for (Player player : Bukkit.getOnlinePlayers())
|
||||
{
|
||||
if (_detailedMessages.contains(player.getName()))
|
||||
{
|
||||
player.spigot().sendMessage(detailed);
|
||||
}
|
||||
else if (_clientManager.Get(player).GetRank().has(Rank.HELPER) && (violation.getOriginatingServer().equals(_thisServer) || _preferences.get(player).isActive(Preference.GLOBAL_GWEN_REPORTS)))
|
||||
{
|
||||
player.spigot().sendMessage(minimal);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
new GwenExtremePrejudice(UtilServer.getPlugin());
|
||||
@ -228,6 +236,13 @@ public class AntiHack extends MiniPlugin
|
||||
});
|
||||
|
||||
_punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, hoursBanned, true, after);
|
||||
if (UtilServer.getGroup().equals("Clans"))
|
||||
{
|
||||
_punish.getClansPunish().loadClient(coreClient.getUniqueId(), client ->
|
||||
{
|
||||
_punish.getClansPunish().ban(client, null, AntiHack.NAME, UtilTime.convert(90L, UtilTime.TimeUnit.DAYS, UtilTime.TimeUnit.MILLISECONDS), ChatColor.stripColor(finalMessage).replace("\n", ""), null, ban -> {});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
if (coreClient.GetRank().has(Rank.TWITCH))
|
||||
@ -241,6 +256,7 @@ public class AntiHack extends MiniPlugin
|
||||
else
|
||||
{
|
||||
runBanAnimation(player, () ->
|
||||
{
|
||||
doPunish.accept(result ->
|
||||
{
|
||||
if (result == PunishmentResponse.Punished)
|
||||
@ -250,8 +266,8 @@ public class AntiHack extends MiniPlugin
|
||||
_banWaveManager.flagDone(coreClient);
|
||||
}
|
||||
_pendingBan.remove(player);
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
}, custom);
|
||||
}
|
||||
@ -266,14 +282,21 @@ public class AntiHack extends MiniPlugin
|
||||
|
||||
Consumer<Consumer<PunishmentResponse>> doPunish = after ->
|
||||
{
|
||||
_punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, getHoursBanned(player), true, after);
|
||||
final int hoursBanned = getHoursBanned(player);
|
||||
_punish.AddPunishment(coreClient.getName(), Category.Hacking, info.getMessage(), AntiHack.NAME, 3, true, hoursBanned, true, after);
|
||||
String[] serverSplit = info.getServer().split("-");
|
||||
if (serverSplit.length > 0 && serverSplit[0].equals("Clans"))
|
||||
{
|
||||
_punish.getClansPunish().loadClient(coreClient.getUniqueId(), client ->
|
||||
{
|
||||
_punish.getClansPunish().ban(client, null, AntiHack.NAME, UtilTime.convert(90L, UtilTime.TimeUnit.DAYS, UtilTime.TimeUnit.MILLISECONDS), ChatColor.stripColor(info.getMessage()).replace("\n", ""), null, ban -> {});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
if (coreClient.GetRank().has(Rank.TWITCH))
|
||||
{
|
||||
doPunish.accept(response ->
|
||||
{
|
||||
});
|
||||
doPunish.accept(response -> {});
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -332,15 +355,19 @@ public class AntiHack extends MiniPlugin
|
||||
public void on(EntityDamageEvent event)
|
||||
{
|
||||
if (_pendingBan.contains(event.getEntity()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void on(EntityDamageByEntityEvent event)
|
||||
{
|
||||
if (_pendingBan.contains(event.getDamager()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
public int getPunishments(Player player)
|
||||
{
|
||||
@ -414,7 +441,9 @@ public class AntiHack extends MiniPlugin
|
||||
}
|
||||
|
||||
if (_ignoredChecks.contains(event.getCheckClass()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ACTIONS.getOrDefault(event.getCheckClass(), NOOP_ACTION).handle(event);
|
||||
|
||||
@ -434,7 +463,7 @@ public class AntiHack extends MiniPlugin
|
||||
MajorViolationCommand command = new MajorViolationCommand(_thisServer, event.getPlayer().getName(), CheckManager.getCheckSimpleName(event.getCheckClass()), event.getViolations(), event.getMessage());
|
||||
ServerCommandManager.getInstance().publishCommand(command);
|
||||
|
||||
this._cooldown.put(key, event.getViolations());
|
||||
_cooldown.put(key, event.getViolations());
|
||||
}
|
||||
}
|
||||
|
||||
@ -525,6 +554,6 @@ public class AntiHack extends MiniPlugin
|
||||
|
||||
public void setStrict(boolean strict)
|
||||
{
|
||||
this._strict = strict;
|
||||
_strict = strict;
|
||||
}
|
||||
}
|
@ -62,7 +62,7 @@ public class BanWaveManager extends MiniPlugin
|
||||
|
||||
CoreClient client = _clientManager.Get(player);
|
||||
|
||||
if (this._repository.insertBanWaveInfo(client.getAccountId(), timeToBan, CheckManager.getCheckSimpleName(checkClass), newMessage, vl, server))
|
||||
if (_repository.insertBanWaveInfo(client.getAccountId(), timeToBan, CheckManager.getCheckSimpleName(checkClass), newMessage, vl, server))
|
||||
{
|
||||
runAsync(() ->
|
||||
{
|
||||
|
@ -5,7 +5,6 @@ import java.sql.PreparedStatement;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import mineplex.core.common.util.UtilTasks;
|
||||
import mineplex.core.database.MinecraftRepository;
|
||||
import mineplex.serverdata.database.DBPool;
|
||||
import mineplex.serverdata.database.RepositoryBase;
|
||||
|
||||
|
@ -28,7 +28,12 @@ public class PartyInfoMetadata extends AnticheatMetadata
|
||||
@Override
|
||||
public JsonElement build(UUID player)
|
||||
{
|
||||
Party party = require(PartyManager.class).getPartyByPlayer(player);
|
||||
PartyManager pm = require(PartyManager.class);
|
||||
if (pm == null)
|
||||
{
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
Party party = pm.getPartyByPlayer(player);
|
||||
if (party != null)
|
||||
{
|
||||
JsonObject partyData = new JsonObject();
|
||||
|
@ -9,6 +9,7 @@ import java.util.UUID;
|
||||
import net.minecraft.server.v1_8_R3.MinecraftServer;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
|
||||
@ -49,6 +50,8 @@ public class ViolationInfoMetadata extends AnticheatMetadata
|
||||
private static final String KEY_Z = "z";
|
||||
private static final String KEY_YAW = "yaw";
|
||||
private static final String KEY_PITCH = "pitch";
|
||||
private static final String KEY_PING = "ping";
|
||||
private static final String KEY_SERVER_TPS = "server-tps";
|
||||
|
||||
private static final JsonObject VAL_CHECK_DISABLED;
|
||||
|
||||
@ -143,11 +146,13 @@ public class ViolationInfoMetadata extends AnticheatMetadata
|
||||
location.addProperty(KEY_PITCH, MUTABLE_LOCATION.getPitch());
|
||||
|
||||
playerInfo.add(KEY_LOCATION, location);
|
||||
playerInfo.addProperty(KEY_PING, Math.min(((CraftPlayer) event.getPlayer()).getHandle().ping, 1000));
|
||||
|
||||
JsonObject data = new JsonObject();
|
||||
data.add(KEY_CURRENT_TIME, currentTime);
|
||||
data.add(KEY_VIOLATION_INFO, violationInfo);
|
||||
data.add(KEY_PLAYER_INFO, playerInfo);
|
||||
data.addProperty(KEY_SERVER_TPS, MinecraftServer.getServer().recentTps[0]);
|
||||
|
||||
violations.add(data);
|
||||
}
|
||||
|
@ -149,7 +149,6 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
|
||||
private int _visualTick;
|
||||
|
||||
private ArrayList<String> _voteList;
|
||||
private List<Pair<String, String>> _youtubers;
|
||||
|
||||
private String _creeperName;
|
||||
|
||||
@ -182,18 +181,8 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
|
||||
{
|
||||
_voteList.add("http://vote1.mineplex.com");
|
||||
_voteList.add("http://vote2.mineplex.com");
|
||||
_voteList.add("http://vote3.mineplex.com");
|
||||
}
|
||||
|
||||
_youtubers = new ArrayList<>();
|
||||
if (!ClansBonus)
|
||||
{
|
||||
_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("RustyDawgT", "https://www.youtube.com/user/RustyDawgT?sub_confirmation=1"));
|
||||
}
|
||||
_youtubers.add(Pair.create("SamitoD", "https://www.youtube.com/user/SamitoD?sub_confirmation=1"));
|
||||
|
||||
_creeperName = "Carl";
|
||||
|
||||
updateOffSet();
|
||||
@ -240,19 +229,9 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
|
||||
{
|
||||
_voteList.add("http://vote1.mineplex.com");
|
||||
_voteList.add("http://vote2.mineplex.com");
|
||||
_voteList.add("http://vote3.mineplex.com");
|
||||
}
|
||||
_canVote = true;
|
||||
|
||||
_youtubers = new ArrayList<>();
|
||||
if (!ClansBonus)
|
||||
{
|
||||
_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("RustyDawgT", "https://www.youtube.com/user/RustyDawgT?sub_confirmation=1"));
|
||||
}
|
||||
_youtubers.add(Pair.create("SamitoD", "https://www.youtube.com/user/SamitoD?sub_confirmation=1"));
|
||||
|
||||
if (npcManager != null)
|
||||
{
|
||||
_carlNpc = _npcManager.getNpcByName(_creeperName + " the Creeper");
|
||||
@ -1005,7 +984,6 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
|
||||
if (canVote(player)) availableRewards++;
|
||||
if (_playWireManager.Get(player) != null && _playWireManager.Get(player).getAccountId() != -1 && _playWireManager.canRedeemTickets(_playWireManager.Get(player))) availableRewards++;
|
||||
if (_youtubeManager.canYoutube(player)) availableRewards++;
|
||||
if (_youtubeManager.canSpecificYoutube(player)) availableRewards++;
|
||||
if (canRank(player) && _clientManager.hasRank(player, Rank.ULTRA) && isPastAugust()) availableRewards++;
|
||||
if (canDaily(player)) availableRewards++;
|
||||
if (getPollManager().getNextPoll(_pollManager.Get(player), _clientManager.Get(player).GetRank()) != null) availableRewards++;
|
||||
@ -1165,7 +1143,7 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
|
||||
{
|
||||
if (Recharge.Instance.use(player, "Carl Inform", 240000, false, false))
|
||||
{
|
||||
if (_pollManager.hasPoll(player) || canVote(player) || _youtubeManager.canSpecificYoutube(player) || _youtubeManager.canYoutube(player) || (_playWireManager.Get(player) != null && _playWireManager.Get(player).getAccountId() != -1 && _playWireManager.canRedeemTickets(_playWireManager.Get(player))) || (canRank(player) && _clientManager.hasRank(player, Rank.ULTRA) && isPastAugust()) || canDaily(player) || PowerPlayClubButton.isAvailable(player, _powerPlayClubRepository))
|
||||
if (_pollManager.hasPoll(player) || canVote(player) || _youtubeManager.canYoutube(player) || (_playWireManager.Get(player) != null && _playWireManager.Get(player).getAccountId() != -1 && _playWireManager.canRedeemTickets(_playWireManager.Get(player))) || (canRank(player) && _clientManager.hasRank(player, Rank.ULTRA) && isPastAugust()) || canDaily(player) || PowerPlayClubButton.isAvailable(player, _powerPlayClubRepository))
|
||||
{
|
||||
if (_showCarl.containsKey(player.getName()))
|
||||
{
|
||||
@ -1187,23 +1165,6 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
|
||||
return _voteList.get(index);
|
||||
}
|
||||
|
||||
public Pair<String, String> getSpecificCreator()
|
||||
{
|
||||
long sqlTime = getSqlTime();
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTimeInMillis(sqlTime);
|
||||
int date = calendar.get(Calendar.DAY_OF_YEAR);
|
||||
if (_youtubers.size() >= 1)
|
||||
{
|
||||
int index = date % _youtubers.size();
|
||||
return _youtubers.get(index);
|
||||
}
|
||||
else
|
||||
{
|
||||
return Pair.create("MineplexGames", "http://youtube.com/mineplexgamesofficial?sub_confirmation=1");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for disabling rank rewards during first month of release
|
||||
* @return
|
||||
|
@ -12,7 +12,6 @@ import mineplex.core.bonuses.gui.buttons.PlayWireButton;
|
||||
import mineplex.core.bonuses.gui.buttons.PollButton;
|
||||
import mineplex.core.bonuses.gui.buttons.PowerPlayClubButton;
|
||||
import mineplex.core.bonuses.gui.buttons.RankBonusButton;
|
||||
import mineplex.core.bonuses.gui.buttons.SpecificChannelButton;
|
||||
import mineplex.core.bonuses.gui.buttons.TwitterButton;
|
||||
import mineplex.core.bonuses.gui.buttons.VoteButton;
|
||||
import mineplex.core.bonuses.gui.buttons.YoutubeButton;
|
||||
@ -33,10 +32,9 @@ public class BonusGui extends SimpleGui
|
||||
private final int CLAIM_TIPS_SLOT = 30;
|
||||
private final int POWER_PLAY_SLOT = 16;
|
||||
private final int CARL_SPINNER_SLOT = 14;
|
||||
private final int YOUTUBE_SLOT = 22;
|
||||
private final int YOUTUBE_SLOT = 24;
|
||||
private final int TWITTER_SLOT = 34;
|
||||
private final int PLAY_WIRE_SLOT = 32;
|
||||
private final int SPECIFIC_YOUTUBE_SLOT = 24;
|
||||
|
||||
private static final int INV_SIZE = 54;
|
||||
|
||||
@ -65,8 +63,6 @@ public class BonusGui extends SimpleGui
|
||||
setItem(CARL_SPINNER_SLOT, new CarlSpinButton(getPlugin(), player, manager, rewardManager));
|
||||
|
||||
setItem(PLAY_WIRE_SLOT, new PlayWireButton(playWireManager, player));
|
||||
|
||||
setItem(SPECIFIC_YOUTUBE_SLOT, new SpecificChannelButton(player, youtubeManager));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -34,7 +34,7 @@ public class SpecificChannelButton implements GuiItem
|
||||
@Override
|
||||
public void setup()
|
||||
{
|
||||
_channel = Managers.get(BonusManager.class).getSpecificCreator();
|
||||
_channel = Pair.create("", "");
|
||||
if (_youtubeManager.canSpecificYoutube(_player))
|
||||
{
|
||||
_item = new ItemBuilder(Material.APPLE)
|
||||
|
@ -377,7 +377,25 @@ public class Chat extends MiniPlugin
|
||||
}
|
||||
|
||||
if (!event.isCancelled())
|
||||
{
|
||||
String oldMessage = event.getMessage();
|
||||
if (!_clientManager.Get(sender).GetRank().has(Rank.ADMIN))
|
||||
{
|
||||
int capsCount = 0;
|
||||
for (char c : oldMessage.toCharArray())
|
||||
{
|
||||
if (Character.isUpperCase(c))
|
||||
{
|
||||
capsCount++;
|
||||
}
|
||||
}
|
||||
if (capsCount > 30)
|
||||
{
|
||||
event.setMessage(oldMessage.toLowerCase());
|
||||
}
|
||||
}
|
||||
_playerLastMessage.put(sender.getUniqueId(), new MessageData(event.getMessage()));
|
||||
}
|
||||
|
||||
for (Function<AsyncPlayerChatEvent, Boolean> filter : _lowPriorityFilters)
|
||||
{
|
||||
|
@ -63,7 +63,7 @@ public abstract class CommandBase<PluginType extends MiniPlugin> implements ICom
|
||||
|
||||
public void setRequiredRank(Rank rank)
|
||||
{
|
||||
this._requiredRank = rank;
|
||||
_requiredRank = rank;
|
||||
}
|
||||
|
||||
public Rank[] GetSpecificRanks()
|
||||
|
@ -1,5 +1,6 @@
|
||||
package mineplex.core.cosmetic;
|
||||
|
||||
import mineplex.core.punish.Punish;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
@ -41,19 +42,23 @@ import mineplex.core.twofactor.TwoFactorAuth;
|
||||
public class CosmeticManager extends MiniPlugin
|
||||
{
|
||||
private final TwoFactorAuth _twofactor = Managers.require(TwoFactorAuth.class);
|
||||
private InventoryManager _inventoryManager;
|
||||
private GadgetManager _gadgetManager;
|
||||
private MountManager _mountManager;
|
||||
private PetManager _petManager;
|
||||
private TreasureManager _treasureManager;
|
||||
private BoosterManager _boosterManager;
|
||||
private final InventoryManager _inventoryManager;
|
||||
private final GadgetManager _gadgetManager;
|
||||
private final MountManager _mountManager;
|
||||
private final PetManager _petManager;
|
||||
private final TreasureManager _treasureManager;
|
||||
private final BoosterManager _boosterManager;
|
||||
private final Punish _punish;
|
||||
|
||||
private CosmeticShop _shop;
|
||||
|
||||
private boolean _showInterface = true;
|
||||
private int _interfaceSlot = 4;
|
||||
|
||||
public CosmeticManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager, GadgetManager gadgetManager, MountManager mountManager, PetManager petManager, TreasureManager treasureManager, BoosterManager boosterManager)
|
||||
public CosmeticManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager,
|
||||
InventoryManager inventoryManager, GadgetManager gadgetManager, MountManager mountManager,
|
||||
PetManager petManager, TreasureManager treasureManager, BoosterManager boosterManager,
|
||||
Punish punish)
|
||||
{
|
||||
super("Cosmetic Manager", plugin);
|
||||
|
||||
@ -63,6 +68,7 @@ public class CosmeticManager extends MiniPlugin
|
||||
_petManager = petManager;
|
||||
_treasureManager = treasureManager;
|
||||
_boosterManager = boosterManager;
|
||||
_punish = punish;
|
||||
|
||||
_shop = new CosmeticShop(this, clientManager, donationManager, _moduleName);
|
||||
}
|
||||
@ -243,6 +249,11 @@ public class CosmeticManager extends MiniPlugin
|
||||
return _boosterManager;
|
||||
}
|
||||
|
||||
public Punish getPunishManager()
|
||||
{
|
||||
return _punish;
|
||||
}
|
||||
|
||||
public void displayUI(Player player)
|
||||
{
|
||||
_shop.attemptShopOpen(player);
|
||||
|
@ -0,0 +1,25 @@
|
||||
package mineplex.core.cosmetic.ui.button.open;
|
||||
|
||||
import mineplex.core.cosmetic.ui.page.FlagPage;
|
||||
import mineplex.core.cosmetic.ui.page.HatPage;
|
||||
import mineplex.core.cosmetic.ui.page.Menu;
|
||||
import mineplex.core.gadget.types.Gadget;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* @author J Teissler
|
||||
* @date 6/26/17
|
||||
*/
|
||||
public class OpenFlags extends OpenPageButton
|
||||
{
|
||||
public OpenFlags(Menu menu, Gadget active)
|
||||
{
|
||||
super(menu, active);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void leftClick(Player player)
|
||||
{
|
||||
getMenu().getShop().openPageForPlayer(player, new FlagPage(getMenu().getPlugin(), getMenu().getShop(), getMenu().getClientManager(), getMenu().getDonationManager(), "Flags - 1", player));
|
||||
}
|
||||
}
|
@ -33,13 +33,17 @@ public class ArrowTrailPage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.ARROW_TRAIL) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -32,13 +32,17 @@ public class BalloonsPage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (gadget.isActive(getPlayer()))
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17 || slot == 26)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -22,9 +22,6 @@ import mineplex.core.gadget.types.OutfitGadget;
|
||||
import mineplex.core.shop.item.IButton;
|
||||
import mineplex.core.shop.item.ShopItem;
|
||||
|
||||
/**
|
||||
* Created by shaun on 14-09-15.
|
||||
*/
|
||||
public class CostumePage extends GadgetPage
|
||||
{
|
||||
public CostumePage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player)
|
||||
|
@ -33,13 +33,17 @@ public class DeathEffectPage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.DEATH) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -33,13 +33,17 @@ public class DoubleJumpPage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.DOUBLE_JUMP) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -0,0 +1,106 @@
|
||||
package mineplex.core.cosmetic.ui.page;
|
||||
|
||||
import mineplex.core.account.CoreClientManager;
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.cosmetic.CosmeticManager;
|
||||
import mineplex.core.cosmetic.ui.CosmeticShop;
|
||||
import mineplex.core.donation.DonationManager;
|
||||
import mineplex.core.gadget.types.Gadget;
|
||||
import mineplex.core.gadget.types.GadgetType;
|
||||
import mineplex.core.shop.item.IButton;
|
||||
import mineplex.core.shop.item.ShopItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class FlagPage extends GadgetPage
|
||||
{
|
||||
private int _page;
|
||||
|
||||
public FlagPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name,
|
||||
Player player)
|
||||
{
|
||||
this(plugin, shop, clientManager, donationManager, name, player, 0);
|
||||
}
|
||||
|
||||
public FlagPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name,
|
||||
Player player, int page)
|
||||
{
|
||||
super(plugin, shop, clientManager, donationManager, name, player, false);
|
||||
_page = page;
|
||||
buildPage();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildPage()
|
||||
{
|
||||
// chose a beginning slot
|
||||
int slot = 10;
|
||||
|
||||
// grab all flags
|
||||
List<Gadget> list = getPlugin().getGadgetManager().getGadgets(GadgetType.FLAG);
|
||||
|
||||
if(list != null)
|
||||
{
|
||||
int size = list.size();
|
||||
int limit = (_page + 1) * 28;
|
||||
|
||||
// loop through the flags for a specific page
|
||||
for (int i = _page * 28; i < limit && i < size; ++i)
|
||||
{
|
||||
Gadget gadget = list.get(i);
|
||||
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.FLAG) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
// back arrow
|
||||
if (size > 28)
|
||||
{
|
||||
if (_page > 0)
|
||||
{
|
||||
addButton(45, new ShopItem(Material.ARROW, C.cGreen + "◀ Previous Page (" + C.cWhite + _page + C.cGreen + ")", new String[]{}, 1, false),
|
||||
(player, clickType) ->
|
||||
{
|
||||
FlagPage page = new FlagPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "Flags - " + (_page), player, _page - 1);
|
||||
getShop().openPageForPlayer(player, page);
|
||||
});
|
||||
}
|
||||
|
||||
// next arrow
|
||||
if (_page < (size - 1) / 28)
|
||||
{
|
||||
addButton(53, new ShopItem(Material.ARROW, C.cGreen + "(" + C.cWhite + (_page + 2) + C.cGreen + ") Next Page ►", new String[]{}, 1, false),
|
||||
(player, clickType) ->
|
||||
{
|
||||
FlagPage page = new FlagPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "Flags - " + (_page + 2), player, _page + 1);
|
||||
getShop().openPageForPlayer(player, page);
|
||||
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
public void onClick(Player player, ClickType clickType)
|
||||
{
|
||||
getShop().openPageForPlayer(getPlayer(), new Menu(getPlugin(), getShop(), getClientManager(), getDonationManager(), player));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -12,7 +12,6 @@ import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.BannerMeta;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import mineplex.core.account.CoreClientManager;
|
||||
@ -21,7 +20,6 @@ import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.LineFormat;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.common.util.UtilText;
|
||||
import mineplex.core.common.util.banner.CountryFlag;
|
||||
import mineplex.core.cosmetic.CosmeticManager;
|
||||
import mineplex.core.cosmetic.ui.CosmeticShop;
|
||||
import mineplex.core.cosmetic.ui.button.GadgetButton;
|
||||
@ -42,11 +40,19 @@ import mineplex.core.shop.page.ShopPageBase;
|
||||
public class GadgetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
{
|
||||
public GadgetPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player)
|
||||
{
|
||||
this(plugin, shop, clientManager, donationManager, name, player, true);
|
||||
}
|
||||
|
||||
public GadgetPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player, boolean build)
|
||||
{
|
||||
super(plugin, shop, clientManager, donationManager, name, player, 54);
|
||||
|
||||
if (build)
|
||||
{
|
||||
buildPage();
|
||||
}
|
||||
}
|
||||
|
||||
protected void buildPage()
|
||||
{
|
||||
@ -60,13 +66,17 @@ public class GadgetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getInventoryManager().Get(getPlayer()).getItemCount(gadget.getDisplayName()) > 0)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17 || slot == 26)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
@ -366,19 +376,6 @@ public class GadgetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
meta.setLore(itemLore);
|
||||
gadgetItemStack.setItemMeta(meta);
|
||||
|
||||
if (gadget.getGadgetType() == GadgetType.ARROW_TRAIL || gadget.getGadgetType() == GadgetType.DEATH
|
||||
|| gadget.getGadgetType() == GadgetType.PARTICLE || gadget.getGadgetType() == GadgetType.DOUBLE_JUMP)
|
||||
{
|
||||
if (gadget.getCost(GlobalCurrency.TREASURE_SHARD) == -8)
|
||||
{
|
||||
gadgetItemStack = CountryFlag.USA.getBanner();
|
||||
BannerMeta bannerMeta = (BannerMeta) gadgetItemStack.getItemMeta();
|
||||
bannerMeta.setDisplayName(C.cGreen + C.Bold + gadget.getName());
|
||||
bannerMeta.setLore(meta.getLore());
|
||||
gadgetItemStack.setItemMeta(bannerMeta);
|
||||
}
|
||||
}
|
||||
|
||||
addButton(slot, new ShopItem(gadgetItemStack, false, false).hideInfo(), new DeactivateGadgetButton(gadget, this));
|
||||
}
|
||||
else
|
||||
@ -389,19 +386,6 @@ public class GadgetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
meta.setLore(itemLore);
|
||||
gadgetItemStack.setItemMeta(meta);
|
||||
|
||||
if (gadget.getGadgetType() == GadgetType.ARROW_TRAIL || gadget.getGadgetType() == GadgetType.DEATH
|
||||
|| gadget.getGadgetType() == GadgetType.PARTICLE || gadget.getGadgetType() == GadgetType.DOUBLE_JUMP)
|
||||
{
|
||||
if (gadget.getCost(GlobalCurrency.TREASURE_SHARD) == -8)
|
||||
{
|
||||
gadgetItemStack = CountryFlag.USA.getBanner();
|
||||
BannerMeta bannerMeta = (BannerMeta) gadgetItemStack.getItemMeta();
|
||||
bannerMeta.setDisplayName(C.cGreen + C.Bold + gadget.getName());
|
||||
bannerMeta.setLore(meta.getLore());
|
||||
gadgetItemStack.setItemMeta(bannerMeta);
|
||||
}
|
||||
}
|
||||
|
||||
/*if (gadget instanceof MorphStray)
|
||||
{
|
||||
gadgetItemStack = UtilItem.getVersionSpecificItem(_player, UtilPlayer.PlayerVersion._1_9, gadgetItemStack);
|
||||
|
@ -38,13 +38,17 @@ public class HatPage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.HAT) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -31,13 +31,17 @@ public class KitSelectorPage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.KIT_SELECTOR) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17 || slot == 26 || slot == 35)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -5,6 +5,9 @@ import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import mineplex.core.common.util.banner.CountryFlag;
|
||||
import mineplex.core.cosmetic.ui.button.open.OpenFlags;
|
||||
import mineplex.core.itemstack.ItemBuilder;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -14,7 +17,6 @@ import mineplex.core.common.currency.GlobalCurrency;
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.LineFormat;
|
||||
import mineplex.core.common.util.UtilText;
|
||||
import mineplex.core.common.util.UtilUI;
|
||||
import mineplex.core.cosmetic.CosmeticManager;
|
||||
import mineplex.core.cosmetic.ui.CosmeticShop;
|
||||
import mineplex.core.cosmetic.ui.button.open.OpenArrowTrails;
|
||||
@ -40,6 +42,9 @@ import mineplex.core.mount.Mount;
|
||||
import mineplex.core.pet.PetType;
|
||||
import mineplex.core.shop.item.ShopItem;
|
||||
import mineplex.core.shop.page.ShopPageBase;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.BannerMeta;
|
||||
|
||||
public class Menu extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
{
|
||||
@ -64,35 +69,46 @@ public class Menu extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
|
||||
List<String> shardLore = new ArrayList<String>();
|
||||
shardLore.add(" ");
|
||||
shardLore.add(C.cGray + "This seems like it might come in");
|
||||
shardLore.add(C.cGray + "handy. Maybe I can collect more!");
|
||||
shardLore.add(C.cGray + "These seem like they might come in");
|
||||
shardLore.add(C.cGray + "handy. Maybe I should collect more!");
|
||||
|
||||
ShopItem shards = new ShopItem(Material.PRISMARINE_SHARD, C.cAqua + C.Bold + treasureShards + " Treasure Shards", shardLore.toArray(new String[0]), 0, false);
|
||||
|
||||
// Cosmetic Items
|
||||
int[] slots = UtilUI.getIndicesFor(15, 0, 5, 1);
|
||||
/*int particleSlot = 9;//slots[0];
|
||||
int arrowSlot = 11;//slots[1];
|
||||
int jumpSlot = 13;//slots[2];
|
||||
int deathSlot = 15;//slots[3];
|
||||
int gadgetSlot = 27;//slots[4];
|
||||
int morphSlot = 29;//slots[5];
|
||||
int mountSlot = 31;//slots[6];
|
||||
int petSlot = 33;//slots[7];
|
||||
int hatSlot = 35;//slots[8];
|
||||
int costumeSlot = 45;//slots[9];
|
||||
int musicSlot = 47;//slots[10];
|
||||
int tauntSlot = 49;//slots[11];
|
||||
int winEffectSlot = 51;
|
||||
int gameModifierSlot = 53;*/
|
||||
int particleSlot = slots[0], arrowSlot = slots[1], jumpSlot = slots[2],
|
||||
deathSlot = slots[3], gadgetSlot = slots[4], morphSlot = slots[5],
|
||||
mountSlot = slots[6], petSlot = slots[7], hatSlot = slots[8],
|
||||
costumeSlot = slots[9], musicSlot = slots[10], tauntSlot = slots[11],
|
||||
winEffectSlot = slots[12], gameModifierSlot = slots[13], balloonsSlot = slots[14],
|
||||
kitSelectorSlot = balloonsSlot + 4;
|
||||
int deathSlot = 19;
|
||||
int jumpSlot = 28;
|
||||
int particleSlot = 1;
|
||||
int winEffectSlot = 13;
|
||||
int shardSlot = 22;
|
||||
int arrowSlot = 10;
|
||||
int tauntSlot = 31;
|
||||
int gameModifierSlot = 21;
|
||||
int kitSelectorSlot = 23;
|
||||
int musicSlot = 48;
|
||||
int mountSlot = 50;
|
||||
int balloonsSlot = 47;
|
||||
int petSlot = 51;
|
||||
int gadgetSlot = 49;
|
||||
int hatSlot = 7;
|
||||
int flagSlot = 34;
|
||||
int morphSlot = 25;
|
||||
int costumeSlot = 16;
|
||||
|
||||
addItem(shardSlot, shards);
|
||||
|
||||
ItemStack pane = new ItemBuilder(Material.STAINED_GLASS_PANE).setData((byte)15).setTitle(C.cBlack).build();
|
||||
for (int i = 0; i <= 45; i += 9) addItem(i, pane.clone());
|
||||
for (int i = 8; i <= 53; i += 9) addItem(i, pane.clone());
|
||||
for (int i = 37; i <= 43; ++i) addItem(i, pane.clone());
|
||||
for (int i = 2; i <= 6; ++i) addItem(i, pane.clone());
|
||||
for (int i = 11; i <= 29; i += 9) addItem(i, pane.clone());
|
||||
for (int i = 15; i <= 33; i += 9) addItem(i, pane.clone());
|
||||
addItem(12, pane.clone());
|
||||
addItem(14, pane.clone());
|
||||
addItem(30, pane.clone());
|
||||
addItem(32, pane.clone());
|
||||
addItem(46, pane.clone());
|
||||
addItem(52, pane.clone());
|
||||
|
||||
addItem(kitSelectorSlot + 2, shards);
|
||||
|
||||
EnumMap<GadgetType, Integer> ownedCount = new EnumMap<>(GadgetType.class);
|
||||
EnumMap<GadgetType, Integer> maxCount = new EnumMap<>(GadgetType.class);
|
||||
@ -187,13 +203,13 @@ public class Menu extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
if (petActive != null) addGlow(petSlot);
|
||||
|
||||
type = GadgetType.HAT;
|
||||
lore = getLore(ownedCount.get(type), maxCount.get(type), "Hats are in this year. Wear them on your head to impress the ladies.", VISIBILITY_HUB, enabled.get(type));
|
||||
lore = getLore(ownedCount.get(type), maxCount.get(type), "Hats are in this year. Wear them on your head to impress the others.", VISIBILITY_HUB, enabled.get(type));
|
||||
addButton(hatSlot, new ShopItem(Material.GOLD_HELMET, "Hats", lore, 1, false), new OpenHats(this, enabled.get(type)));
|
||||
if (enabled.containsKey(type)) addGlow(hatSlot);
|
||||
|
||||
type = GadgetType.COSTUME;
|
||||
// -4 Fixes more than the real costumes being counted (Happens because of the hub games costumes
|
||||
lore = getLore(ownedCount.get(type) - 4, maxCount.get(type) - 4, "Sometimes going out calls for special clothes! Gain bonus effects for matching outfit.", VISIBILITY_HUB, enabled.get(type));
|
||||
lore = getLore(ownedCount.get(type), maxCount.get(type) - 4, "Sometimes going out calls for special clothes! Gain bonus effects for matching outfit.", VISIBILITY_HUB, enabled.get(type));
|
||||
addButton(costumeSlot, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", lore, 1, false), new OpenCostumes(this, enabled.get(type)));
|
||||
if (enabled.containsKey(type)) addGlow(costumeSlot);
|
||||
|
||||
@ -227,6 +243,19 @@ public class Menu extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
lore = getLore(ownedCount.get(type), maxCount.get(type), "Click here to select different particles to indicate which kit you have selected!", VISIBILITY_GAME_HUB, enabled.get(type));
|
||||
addButton(kitSelectorSlot, new ShopItem(Material.LEVER, "Kit Selector Particles", lore, 1, false), new OpenKitSelector(this, enabled.get(type)));
|
||||
if (enabled.containsKey(type)) addGlow(kitSelectorSlot);
|
||||
|
||||
type = GadgetType.FLAG;
|
||||
lore = getLore(ownedCount.get(type), maxCount.get(type), "Show off your country's flag!", VISIBILITY_HUB, enabled.get(type));
|
||||
addButton(flagSlot, new ShopItem(Material.BANNER, "Flags", lore, 1, false), new OpenFlags(this, enabled.get(type)));
|
||||
if (enabled.containsKey(type)) addGlow(flagSlot);
|
||||
|
||||
// Copy over banner design
|
||||
BannerMeta banner = (BannerMeta) CountryFlag.MINEPLEX.getBanner().getItemMeta();
|
||||
BannerMeta meta = ((BannerMeta) getItem(flagSlot).getItemMeta());
|
||||
meta.setBaseColor(banner.getBaseColor());
|
||||
meta.setPatterns(banner.getPatterns());
|
||||
meta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
|
||||
getItem(flagSlot).setItemMeta(meta);
|
||||
}
|
||||
|
||||
private String[] getLore(int ownedCount, int maxCount, String info, String visibility, Gadget enabled)
|
||||
|
@ -32,14 +32,20 @@ public class MorphPage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.MORPH) == gadget)
|
||||
{
|
||||
if (!(gadget instanceof MorphBlock))
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17 || slot == 26 || slot == 35)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -46,9 +46,11 @@ public class MountPage extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
addMount(mount, slot);
|
||||
slot++;
|
||||
|
||||
if (slot == 17 || slot == 26)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -14,9 +14,6 @@ import mineplex.core.gadget.types.GadgetType;
|
||||
import mineplex.core.shop.item.ShopItem;
|
||||
import mineplex.core.shop.item.IButton;
|
||||
|
||||
/**
|
||||
* Created by shaun on 14-09-15.
|
||||
*/
|
||||
public class MusicPage extends GadgetPage
|
||||
{
|
||||
public MusicPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player)
|
||||
@ -34,9 +31,11 @@ public class MusicPage extends GadgetPage
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -31,13 +31,17 @@ public class ParticlePage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.PARTICLE) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17 || slot == 26 || slot == 35)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -231,16 +231,23 @@ public class PetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17 || slot == 26)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
slot = 49;
|
||||
for (PetExtra petExtra : PetExtra.values())
|
||||
{
|
||||
List<String> itemLore = new ArrayList<String>();
|
||||
|
||||
if (!getPlugin().getPetManager().hasActivePet(getPlayer().getName()))
|
||||
if (getPlugin().getPunishManager().GetClient(_player.getName()).IsMuted())
|
||||
{
|
||||
itemLore.add(C.cRed + "You may not rename pets while muted!");
|
||||
getInventory().setItem(slot, new ShopItem(petExtra.getMaterial(), (byte)0, C.cRed + petExtra.getName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false).getHandle());
|
||||
}
|
||||
else if (!getPlugin().getPetManager().hasActivePet(getPlayer().getName()))
|
||||
{
|
||||
itemLore.add(C.cWhite + "You must have an active pet to use this!");
|
||||
getInventory().setItem(slot, new ShopItem(petExtra.getMaterial(), (byte)0, C.cRed + petExtra.getName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false).getHandle());
|
||||
|
@ -38,13 +38,17 @@ public class TauntPage extends GadgetPage
|
||||
addGadget(gadget, slot);
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.TAUNT) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 26)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -49,13 +49,17 @@ public class WinEffectPage extends GadgetPage
|
||||
}
|
||||
|
||||
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.WIN_EFFECT) == gadget)
|
||||
{
|
||||
addGlow(slot);
|
||||
}
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot == 17 || slot == 26)
|
||||
if (slot % 9 == 8)
|
||||
{
|
||||
slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()
|
||||
{
|
||||
|
@ -1,9 +1,14 @@
|
||||
package mineplex.core.cosmetic.ui.page.custompet.name;
|
||||
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.UtilItem;
|
||||
import mineplex.core.itemstack.ItemBuilder;
|
||||
import mineplex.core.punish.PunishClient;
|
||||
import net.minecraft.server.v1_8_R3.ItemStack;
|
||||
import net.minecraft.server.v1_8_R3.Items;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import mineplex.core.account.CoreClientManager;
|
||||
@ -34,6 +39,7 @@ public class CustomPetTagPage extends ShopPageBase<CosmeticManager, CosmeticShop
|
||||
getButtonMap().put(0, new CloseCustomPetButton());
|
||||
getButtonMap().put(1, new CloseCustomPetButton());
|
||||
getButtonMap().put(2, new SelectCustomPetTagButton(this));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -250,6 +250,19 @@ public class MobCommand extends MultiCommandBase<Creature>
|
||||
}
|
||||
argHandle.add(arg);
|
||||
}
|
||||
|
||||
else if (arg.equalsIgnoreCase("wither"))
|
||||
{
|
||||
for (Entity ent : entSet)
|
||||
{
|
||||
if (ent instanceof Skeleton)
|
||||
{
|
||||
((Skeleton) ent).setSkeletonType(SkeletonType.WITHER);
|
||||
}
|
||||
}
|
||||
|
||||
argHandle.add(arg);
|
||||
}
|
||||
}
|
||||
for (String arg : argHandle)
|
||||
argSet.remove(arg);
|
||||
|
@ -228,6 +228,9 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
if (!spawnedIn)
|
||||
{
|
||||
refreshTrackers(disguise.getEntity().getBukkitEntity());
|
||||
} else
|
||||
{
|
||||
disguise.markSpawnedIn();
|
||||
}
|
||||
|
||||
disguise.onDisguise(true);
|
||||
@ -360,6 +363,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
final Packet packet = packetInfo.getPacket();
|
||||
final Player owner = packetInfo.getPlayer();
|
||||
final PacketVerifier packetVerifier = packetInfo.getVerifier();
|
||||
final int protocol = ((CraftPlayer) owner).getHandle().getProtocol();
|
||||
|
||||
if (packet instanceof PacketPlayOutPlayerInfo)
|
||||
{
|
||||
@ -406,7 +410,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
{
|
||||
packetInfo.setCancelled(true);
|
||||
|
||||
handleSpawnPackets(packetInfo.getVerifier(), latestDisguise);
|
||||
handleSpawnPackets(packetInfo.getVerifier(), latestDisguise, protocol);
|
||||
}
|
||||
else if (latestDisguise.isHideIfNotDisguised())
|
||||
{
|
||||
@ -436,7 +440,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
if (latestDisguise != null && containsSpawnDisguise(owner, latestDisguise) && owner.getEntityId() != entityId)
|
||||
{
|
||||
packetInfo.setCancelled(true);
|
||||
handlePacket(latestDisguise.getMetadataPacket(), packetVerifier);
|
||||
handlePacket(latestDisguise.modifyMetaPacket(protocol, latestDisguise.getMetadataPacket()), packetVerifier);
|
||||
}
|
||||
}
|
||||
else if (packet instanceof PacketPlayOutEntityEquipment)
|
||||
@ -475,7 +479,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
_handlingPacket = false;
|
||||
}
|
||||
|
||||
private void handleSpawnPackets(PacketVerifier packetVerifier, DisguiseBase disguise)
|
||||
private void handleSpawnPackets(PacketVerifier packetVerifier, DisguiseBase disguise, int protocol)
|
||||
{
|
||||
if (disguise instanceof DisguisePlayer)
|
||||
{
|
||||
@ -493,14 +497,14 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
handlePacket(infoPacket, packetVerifier);
|
||||
}
|
||||
|
||||
handlePacket(pDisguise.getSpawnPacket(), packetVerifier);
|
||||
handlePacket(pDisguise.modifySpawnPacket(protocol, pDisguise.getSpawnPacket()), packetVerifier);
|
||||
|
||||
for (Packet packet : pDisguise.getEquipmentPackets())
|
||||
{
|
||||
handlePacket(packet, packetVerifier);
|
||||
}
|
||||
|
||||
handlePacket(pDisguise.getMetadataPacket(), packetVerifier);
|
||||
handlePacket(pDisguise.modifyMetaPacket(protocol, pDisguise.getMetadataPacket()), packetVerifier);
|
||||
|
||||
if (pDisguise.getSleepingDirection() != null)
|
||||
{
|
||||
@ -556,7 +560,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
}
|
||||
else
|
||||
{
|
||||
handlePacket(disguise.getSpawnPacket(), packetVerifier);
|
||||
handlePacket(disguise.modifySpawnPacket(protocol, disguise.getSpawnPacket()), packetVerifier);
|
||||
|
||||
if (disguise instanceof DisguiseLiving)
|
||||
{
|
||||
@ -644,10 +648,12 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
{
|
||||
if (tester.test(player))
|
||||
{
|
||||
if (disguise.getEntity() == ((CraftPlayer) player).getHandle())
|
||||
EntityPlayer nmsPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (disguise.getEntity() == nmsPlayer)
|
||||
continue;
|
||||
|
||||
UtilPlayer.sendPacket(player, disguise.getMetadataPacket());
|
||||
int protocol = nmsPlayer.getProtocol();
|
||||
UtilPlayer.sendPacket(player, disguise.modifyMetaPacket(protocol, disguise.getMetadataPacket()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,26 +1,21 @@
|
||||
package mineplex.core.disguise.disguises;
|
||||
|
||||
import mineplex.core.common.DummyEntity;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import net.minecraft.server.v1_8_R3.DataWatcher;
|
||||
import net.minecraft.server.v1_8_R3.Entity;
|
||||
import net.minecraft.server.v1_8_R3.EntityPlayer;
|
||||
import net.minecraft.server.v1_8_R3.EntityTrackerEntry;
|
||||
import net.minecraft.server.v1_8_R3.IntHashMap;
|
||||
import net.minecraft.server.v1_8_R3.MinecraftServer;
|
||||
import net.minecraft.server.v1_8_R3.Packet;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityMetadata;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo;
|
||||
import net.minecraft.server.v1_8_R3.WorldServer;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.*;
|
||||
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
|
||||
import mineplex.core.common.DummyEntity;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
|
||||
public abstract class DisguiseBase
|
||||
{
|
||||
@ -37,6 +32,8 @@ public abstract class DisguiseBase
|
||||
*/
|
||||
private boolean _hideIfNotDisguised = false;
|
||||
|
||||
protected boolean _spawnedIn = false;
|
||||
|
||||
public DisguiseBase(EntityType entityType, org.bukkit.entity.Entity entity)
|
||||
{
|
||||
if (entity == null)
|
||||
@ -72,15 +69,7 @@ public abstract class DisguiseBase
|
||||
DataWatcher.watch(1, getEntity().getDataWatcher().getShort(1), net.minecraft.server.v1_8_R3.Entity.META_AIR, (int) getEntity().getDataWatcher().getShort(1));
|
||||
}
|
||||
|
||||
public abstract Packet getSpawnPacket();
|
||||
|
||||
public Packet getMetadataPacket()
|
||||
{
|
||||
UpdateDataWatcher();
|
||||
return new PacketPlayOutEntityMetadata(getEntity().getId(), DataWatcher, true);
|
||||
}
|
||||
|
||||
public void resendMetadata()
|
||||
protected void sendToWatchers(Predicate<Integer> protocolPredicate, Supplier<Packet> supplier)
|
||||
{
|
||||
if (getEntity() == null || !getEntity().getBukkitEntity().isValid() || !(getEntity().world instanceof WorldServer))
|
||||
return;
|
||||
@ -90,13 +79,56 @@ public abstract class DisguiseBase
|
||||
if (tracker.get(getEntity().getId()) == null)
|
||||
return;
|
||||
|
||||
Packet packet = getMetadataPacket();
|
||||
Packet packet = supplier.get();
|
||||
if (packet == null)
|
||||
return;
|
||||
|
||||
for (EntityPlayer player : tracker.get(getEntity().getId()).trackedPlayers)
|
||||
{
|
||||
UtilPlayer.sendPacket(player.getBukkitEntity(), packet);
|
||||
int protocol = player.getProtocol();
|
||||
if (!protocolPredicate.test(protocol))
|
||||
continue;
|
||||
|
||||
if (packet instanceof PacketPlayOutEntityMetadata)
|
||||
{
|
||||
player.playerConnection.sendPacket(modifyMetaPacket(protocol, packet));
|
||||
} else if (packet instanceof PacketPlayOutSpawnEntityLiving)
|
||||
{
|
||||
player.playerConnection.sendPacket(modifySpawnPacket(protocol, packet));
|
||||
} else
|
||||
{
|
||||
player.playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void sendToWatchers(Supplier<Packet> supplier)
|
||||
{
|
||||
sendToWatchers(x -> true, supplier);
|
||||
}
|
||||
|
||||
public abstract Packet getSpawnPacket();
|
||||
|
||||
public Packet modifySpawnPacket(int protocol, Packet packet)
|
||||
{
|
||||
return packet;
|
||||
}
|
||||
|
||||
public Packet getMetadataPacket()
|
||||
{
|
||||
UpdateDataWatcher();
|
||||
return new PacketPlayOutEntityMetadata(getEntity().getId(), DataWatcher, true);
|
||||
}
|
||||
|
||||
public void resendMetadata()
|
||||
{
|
||||
sendToWatchers(this::getMetadataPacket);
|
||||
}
|
||||
|
||||
public Packet modifyMetaPacket(int protocol, Packet packet)
|
||||
{
|
||||
return packet;
|
||||
}
|
||||
|
||||
public void setSoundDisguise(DisguiseBase soundDisguise)
|
||||
{
|
||||
@ -182,6 +214,11 @@ public abstract class DisguiseBase
|
||||
|
||||
}
|
||||
|
||||
public void markSpawnedIn()
|
||||
{
|
||||
_spawnedIn = true;
|
||||
}
|
||||
|
||||
public void setHideIfNotDisguised(boolean hideIfNotDisguised)
|
||||
{
|
||||
this._hideIfNotDisguised = hideIfNotDisguised;
|
||||
@ -197,7 +234,7 @@ public abstract class DisguiseBase
|
||||
return this._disguiseType;
|
||||
}
|
||||
|
||||
public void setEntity(net.minecraft.server.v1_8_R3.Entity entity)
|
||||
public void setEntity(Entity entity)
|
||||
{
|
||||
_entity.clear();
|
||||
_entity = new WeakReference<>(entity);
|
||||
|
@ -1,9 +1,16 @@
|
||||
package mineplex.core.disguise.disguises;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.MathHelper;
|
||||
import net.minecraft.server.v1_8_R3.Packet;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving;
|
||||
import org.bukkit.entity.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import com.mineplex.MetadataRewriter;
|
||||
import com.mineplex.ProtocolVersion;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.*;
|
||||
import net.minecraft.server.v1_8_R3.DataWatcher.WatchableObject;
|
||||
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
public abstract class DisguiseCreature extends DisguiseInsentient
|
||||
{
|
||||
@ -18,9 +25,9 @@ public abstract class DisguiseCreature extends DisguiseInsentient
|
||||
PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving();
|
||||
packet.a = getEntity().getId();
|
||||
packet.b = (byte) getDisguiseType().getTypeId();
|
||||
packet.c = (int) MathHelper.floor(getEntity().locX*32D);
|
||||
packet.d = (int) MathHelper.floor(getEntity().locY * 32.0D);
|
||||
packet.e = (int) MathHelper.floor(getEntity().locZ*32D);
|
||||
packet.c = MathHelper.floor(getEntity().locX * 32.0D);
|
||||
packet.d = MathHelper.floor(getEntity().locY * 32.0D);
|
||||
packet.e = MathHelper.floor(getEntity().locZ * 32.0D);
|
||||
packet.i = (byte) ((int) (getEntity().yaw * 256.0F / 360.0F));
|
||||
packet.j = (byte) ((int) (getEntity().pitch * 256.0F / 360.0F));
|
||||
packet.k = (byte) ((int) (getEntity().yaw * 256.0F / 360.0F));
|
||||
@ -70,4 +77,97 @@ public abstract class DisguiseCreature extends DisguiseInsentient
|
||||
|
||||
return packet;
|
||||
}
|
||||
|
||||
// ---- Metadata processing
|
||||
|
||||
// This WON'T be post-processed by the Spigot metadata processor
|
||||
|
||||
@Override
|
||||
public Packet modifySpawnPacket(int protocol, Packet packet)
|
||||
{
|
||||
if (protocol >= ProtocolVersion.v1_10_PRE)
|
||||
{
|
||||
PacketPlayOutSpawnEntityLiving newSpawn = (PacketPlayOutSpawnEntityLiving) getSpawnPacket();
|
||||
|
||||
// Allow the entity type to be changed (needed on 1.11+)
|
||||
newSpawn.b = getTypeId(protocol >= ProtocolVersion.v1_11);
|
||||
|
||||
boolean hasArms = false;
|
||||
List<WatchableObject> meta = DataWatcher.b();
|
||||
|
||||
if (meta != null)
|
||||
{
|
||||
// Run the meta through our Spigot rewriter
|
||||
meta = MetadataRewriter.rewrite(getTypeId(false), protocol, meta).objects;
|
||||
|
||||
// Remove indexes >= 12 on 1.11+
|
||||
if (protocol >= ProtocolVersion.v1_11)
|
||||
{
|
||||
Iterator<WatchableObject> iter = meta.iterator();
|
||||
while (iter.hasNext())
|
||||
{
|
||||
WatchableObject next = iter.next();
|
||||
if (next.getIndex().a() == 6)
|
||||
{
|
||||
hasArms = true;
|
||||
} else if (next.getIndex().a() >= 12)
|
||||
{
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
{
|
||||
meta = new ArrayList<>();
|
||||
}
|
||||
|
||||
if (!hasArms)
|
||||
{
|
||||
WatchableObject<Byte> arms = new WatchableObject<>(0, 0, null,
|
||||
new DataIndex<>(6, DataType.BYTE), (byte) 0);
|
||||
meta.add(arms);
|
||||
}
|
||||
|
||||
newSpawn.m = meta;
|
||||
return newSpawn;
|
||||
}
|
||||
|
||||
return packet;
|
||||
}
|
||||
|
||||
protected int getTypeId(boolean separate)
|
||||
{
|
||||
return getDisguiseType().getTypeId();
|
||||
}
|
||||
|
||||
// This WILL be post-processed by Spigot's metadata processor
|
||||
|
||||
@Override
|
||||
public Packet modifyMetaPacket(int protocol, Packet packet)
|
||||
{
|
||||
if (protocol >= ProtocolVersion.v1_10_PRE)
|
||||
{
|
||||
PacketPlayOutEntityMetadata newMeta = new PacketPlayOutEntityMetadata();
|
||||
newMeta.a = getEntityId();
|
||||
|
||||
List<WatchableObject> meta = MetadataRewriter.rewrite(getTypeId(false), protocol, DataWatcher.c()).objects;
|
||||
|
||||
for (int i = 0; i < meta.size(); i++)
|
||||
{
|
||||
WatchableObject object = meta.get(i);
|
||||
int index = object.getIndex().a();
|
||||
if (index >= 6)
|
||||
{
|
||||
index--;
|
||||
meta.set(i, new WatchableObject(0, 0, null,
|
||||
new DataIndex(index, object.getIndex().b()), object.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
newMeta.b = meta;
|
||||
return newMeta;
|
||||
}
|
||||
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,17 @@
|
||||
package mineplex.core.disguise.disguises;
|
||||
|
||||
import org.bukkit.entity.*;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.EntityGuardian;
|
||||
|
||||
public class DisguiseGuardian extends DisguiseCreature
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
public class DisguiseGuardian extends DisguiseMutable
|
||||
{
|
||||
private static final int GUARDIAN_ID = 68;
|
||||
private static final int ELDER_GUARDIAN_ID = 4;
|
||||
|
||||
private int target = 0;
|
||||
private boolean elder = false;
|
||||
|
||||
public DisguiseGuardian(org.bukkit.entity.Entity entity)
|
||||
{
|
||||
super(EntityType.GUARDIAN, entity);
|
||||
@ -15,17 +21,31 @@ public class DisguiseGuardian extends DisguiseCreature
|
||||
|
||||
public void setTarget(int target)
|
||||
{
|
||||
this.target = target;
|
||||
|
||||
DataWatcher.watch(17, target, EntityGuardian.META_TARGET, target);
|
||||
}
|
||||
|
||||
public void setElder(boolean elder)
|
||||
{
|
||||
DataWatcher.watch(16, Integer.valueOf(DataWatcher.getInt(16) | 4), EntityGuardian.META_ELDER, (byte) (DataWatcher.getInt(16) | 4));
|
||||
this.elder = elder;
|
||||
|
||||
int oldValue = DataWatcher.getInt(16);
|
||||
int newValue = elder ? oldValue | 4 : oldValue & ~4;
|
||||
|
||||
DataWatcher.watch(16, Integer.valueOf(newValue), EntityGuardian.META_ELDER, (byte) newValue);
|
||||
|
||||
mutate();
|
||||
}
|
||||
|
||||
public boolean isElder()
|
||||
{
|
||||
return (this.DataWatcher.getInt(16) & 4) != 0;
|
||||
return elder;
|
||||
}
|
||||
|
||||
public int getTarget()
|
||||
{
|
||||
return target;
|
||||
}
|
||||
|
||||
protected String getHurtSound()
|
||||
@ -37,4 +57,10 @@ public class DisguiseGuardian extends DisguiseCreature
|
||||
|
||||
return "mob.guardian.hit";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getTypeId(boolean separate)
|
||||
{
|
||||
return separate && isElder() ? ELDER_GUARDIAN_ID : GUARDIAN_ID;
|
||||
}
|
||||
}
|
||||
|
@ -2,14 +2,24 @@ package mineplex.core.disguise.disguises;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.EntityHorse;
|
||||
|
||||
import org.bukkit.entity.*;
|
||||
|
||||
import com.google.common.base.Optional;
|
||||
|
||||
public class DisguiseHorse extends DisguiseAnimal
|
||||
import net.minecraft.server.v1_8_R3.EntityAgeable;
|
||||
import net.minecraft.server.v1_8_R3.EntityHorse;
|
||||
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Horse;
|
||||
|
||||
public class DisguiseHorse extends DisguiseMutable
|
||||
{
|
||||
private static final int HORSE_ID = 100;
|
||||
private static final int DONKEY_ID = 31;
|
||||
private static final int MULE_ID = 32;
|
||||
private static final int ZOMBIE_HORSE_ID = 29;
|
||||
private static final int SKELETON_HORSE_ID = 28;
|
||||
|
||||
private Horse.Variant variant = Horse.Variant.HORSE;
|
||||
|
||||
public DisguiseHorse(org.bukkit.entity.Entity entity)
|
||||
{
|
||||
super(EntityType.HORSE, entity);
|
||||
@ -19,11 +29,25 @@ public class DisguiseHorse extends DisguiseAnimal
|
||||
DataWatcher.a(20, Integer.valueOf(0), EntityHorse.META_VARIANT, 0);
|
||||
DataWatcher.a(21, String.valueOf(""), EntityHorse.META_OWNER, Optional.<UUID> absent());
|
||||
DataWatcher.a(22, Integer.valueOf(0), EntityHorse.META_ARMOR, 0);
|
||||
|
||||
DataWatcher.a(12, new Byte((byte)0), EntityAgeable.META_BABY, false);
|
||||
}
|
||||
|
||||
public boolean isBaby()
|
||||
{
|
||||
return DataWatcher.getByte(12) < 0;
|
||||
}
|
||||
|
||||
public void setBaby()
|
||||
{
|
||||
DataWatcher.watch(12, new Byte((byte) ( -1 )), EntityAgeable.META_BABY, true);
|
||||
}
|
||||
|
||||
public void setType(Horse.Variant horseType)
|
||||
{
|
||||
DataWatcher.watch(19, Byte.valueOf((byte) horseType.ordinal()), EntityHorse.META_TYPE, horseType.ordinal());
|
||||
this.variant = horseType;
|
||||
mutate();
|
||||
}
|
||||
|
||||
public Horse.Variant getType()
|
||||
@ -72,4 +96,23 @@ public class DisguiseHorse extends DisguiseAnimal
|
||||
{
|
||||
DataWatcher.watch(22, Integer.valueOf(i), EntityHorse.META_ARMOR, i);
|
||||
}
|
||||
|
||||
// 1.11 and up require separate entity ids
|
||||
@Override
|
||||
protected int getTypeId(boolean separate)
|
||||
{
|
||||
if (separate && variant != Horse.Variant.HORSE)
|
||||
{
|
||||
switch (variant)
|
||||
{
|
||||
case DONKEY: return DONKEY_ID;
|
||||
case MULE: return MULE_ID;
|
||||
case UNDEAD_HORSE: return ZOMBIE_HORSE_ID;
|
||||
case SKELETON_HORSE: return SKELETON_HORSE_ID;
|
||||
default: return HORSE_ID;
|
||||
}
|
||||
}
|
||||
|
||||
return HORSE_ID;
|
||||
}
|
||||
}
|
||||
|
@ -1,95 +1,15 @@
|
||||
package mineplex.core.disguise.disguises;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.EntitySlime;
|
||||
import net.minecraft.server.v1_8_R3.MathHelper;
|
||||
import net.minecraft.server.v1_8_R3.Packet;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
public class DisguiseMagmaCube extends DisguiseInsentient
|
||||
/**
|
||||
* Magma cubes are essentially identical to slimes for disguise purposes
|
||||
*/
|
||||
public class DisguiseMagmaCube extends DisguiseSlime
|
||||
{
|
||||
public DisguiseMagmaCube(org.bukkit.entity.Entity entity)
|
||||
public DisguiseMagmaCube(Entity entity)
|
||||
{
|
||||
super(EntityType.MAGMA_CUBE, entity);
|
||||
|
||||
DataWatcher.a(16, new Byte((byte) 1), EntitySlime.META_SIZE, 1);
|
||||
}
|
||||
|
||||
public void SetSize(int i)
|
||||
{
|
||||
DataWatcher.watch(16, new Byte((byte) i), EntitySlime.META_SIZE, i);
|
||||
}
|
||||
|
||||
public int GetSize()
|
||||
{
|
||||
return DataWatcher.getByte(16);
|
||||
}
|
||||
|
||||
public Packet getSpawnPacket()
|
||||
{
|
||||
PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving();
|
||||
packet.a = getEntity().getId();
|
||||
packet.b = (byte) 62;
|
||||
packet.c = (int) MathHelper.floor(getEntity().locX * 32D);
|
||||
packet.d = (int) MathHelper.floor(getEntity().locY * 32.0D);
|
||||
packet.e = (int) MathHelper.floor(getEntity().locZ * 32D);
|
||||
packet.i = (byte) ((int) (getEntity().yaw * 256.0F / 360.0F));
|
||||
packet.j = (byte) ((int) (getEntity().pitch * 256.0F / 360.0F));
|
||||
packet.k = (byte) ((int) (getEntity().yaw * 256.0F / 360.0F));
|
||||
packet.uuid = getEntity().getUniqueID();
|
||||
|
||||
double var2 = 3.9D;
|
||||
double var4 = 0;
|
||||
double var6 = 0;
|
||||
double var8 = 0;
|
||||
|
||||
if (var4 < -var2)
|
||||
{
|
||||
var4 = -var2;
|
||||
}
|
||||
|
||||
if (var6 < -var2)
|
||||
{
|
||||
var6 = -var2;
|
||||
}
|
||||
|
||||
if (var8 < -var2)
|
||||
{
|
||||
var8 = -var2;
|
||||
}
|
||||
|
||||
if (var4 > var2)
|
||||
{
|
||||
var4 = var2;
|
||||
}
|
||||
|
||||
if (var6 > var2)
|
||||
{
|
||||
var6 = var2;
|
||||
}
|
||||
|
||||
if (var8 > var2)
|
||||
{
|
||||
var8 = var2;
|
||||
}
|
||||
|
||||
packet.f = (int) (var4 * 8000.0D);
|
||||
packet.g = (int) (var6 * 8000.0D);
|
||||
packet.h = (int) (var8 * 8000.0D);
|
||||
|
||||
packet.l = DataWatcher;
|
||||
packet.m = DataWatcher.b();
|
||||
|
||||
return packet;
|
||||
}
|
||||
|
||||
protected String getHurtSound()
|
||||
{
|
||||
return "mob.slime." + (GetSize() > 1 ? "big" : "small");
|
||||
}
|
||||
|
||||
protected float getVolume()
|
||||
{
|
||||
return 0.4F * (float) GetSize();
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package mineplex.core.disguise.disguises;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import com.mineplex.ProtocolVersion;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.Packet;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy;
|
||||
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
/**
|
||||
* Represents a disguise that can "mutate" from one entity type to another.
|
||||
*/
|
||||
public abstract class DisguiseMutable extends DisguiseCreature
|
||||
{
|
||||
public DisguiseMutable(EntityType disguiseType, Entity entity)
|
||||
{
|
||||
super(disguiseType, entity);
|
||||
}
|
||||
|
||||
protected void mutate()
|
||||
{
|
||||
// if (!_spawnedIn)
|
||||
// return;
|
||||
|
||||
Predicate<Integer> pred = v -> v >= ProtocolVersion.v1_11;
|
||||
sendToWatchers(pred, this::getDestroyPacket);
|
||||
sendToWatchers(pred, this::getSpawnPacket);
|
||||
sendToWatchers(pred, this::getMetadataPacket);
|
||||
}
|
||||
|
||||
private Packet getDestroyPacket()
|
||||
{
|
||||
return new PacketPlayOutEntityDestroy(new int[] { getEntityId() });
|
||||
}
|
||||
|
||||
protected abstract int getTypeId(boolean separate);
|
||||
}
|
@ -2,11 +2,16 @@ package mineplex.core.disguise.disguises;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.EntitySkeleton;
|
||||
|
||||
import org.bukkit.entity.*;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Skeleton.SkeletonType;
|
||||
|
||||
public class DisguiseSkeleton extends DisguiseMonster
|
||||
public class DisguiseSkeleton extends DisguiseMutable
|
||||
{
|
||||
private static final int SKELETON_ID = 51;
|
||||
private static final int WITHER_SKELETON_ID = 5;
|
||||
|
||||
private SkeletonType type = SkeletonType.NORMAL;
|
||||
|
||||
public DisguiseSkeleton(org.bukkit.entity.Entity entity)
|
||||
{
|
||||
super(EntityType.SKELETON, entity);
|
||||
@ -17,15 +22,24 @@ public class DisguiseSkeleton extends DisguiseMonster
|
||||
public void SetSkeletonType(SkeletonType skeletonType)
|
||||
{
|
||||
DataWatcher.watch(13, Byte.valueOf((byte) skeletonType.getId()), EntitySkeleton.META_TYPE, skeletonType.getId());
|
||||
this.type = skeletonType;
|
||||
mutate();
|
||||
}
|
||||
|
||||
public int GetSkeletonType()
|
||||
public SkeletonType getSkeletonType()
|
||||
{
|
||||
return DataWatcher.getByte(13);
|
||||
return type;
|
||||
}
|
||||
|
||||
protected String getHurtSound()
|
||||
{
|
||||
return "mob.skeleton.hurt";
|
||||
}
|
||||
|
||||
// 1.11 and up require separate entity ids
|
||||
@Override
|
||||
protected int getTypeId(boolean separate)
|
||||
{
|
||||
return separate && type == SkeletonType.WITHER ? WITHER_SKELETON_ID : SKELETON_ID;
|
||||
}
|
||||
}
|
||||
|
@ -4,14 +4,26 @@ import net.minecraft.server.v1_8_R3.EntitySlime;
|
||||
import net.minecraft.server.v1_8_R3.MathHelper;
|
||||
import net.minecraft.server.v1_8_R3.Packet;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving;
|
||||
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
public class DisguiseSlime extends DisguiseInsentient
|
||||
/**
|
||||
* Slimes have an odd type hierarchy, but they're essentially creatures as far as disguises are concerned.
|
||||
*/
|
||||
public class DisguiseSlime extends DisguiseCreature
|
||||
{
|
||||
public DisguiseSlime(org.bukkit.entity.Entity entity)
|
||||
public DisguiseSlime(Entity entity)
|
||||
{
|
||||
super(EntityType.SLIME, entity);
|
||||
this(EntityType.SLIME, entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* For magma cubes
|
||||
*/
|
||||
protected DisguiseSlime(EntityType type, Entity entity)
|
||||
{
|
||||
super(type, entity);
|
||||
DataWatcher.a(16, new Byte((byte) 1), EntitySlime.META_SIZE, 1);
|
||||
}
|
||||
|
||||
@ -25,63 +37,6 @@ public class DisguiseSlime extends DisguiseInsentient
|
||||
return DataWatcher.getByte(16);
|
||||
}
|
||||
|
||||
public Packet getSpawnPacket()
|
||||
{
|
||||
PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving();
|
||||
packet.a = getEntity().getId();
|
||||
packet.b = (byte) 55;
|
||||
packet.c = (int) MathHelper.floor(getEntity().locX * 32D);
|
||||
packet.d = (int) MathHelper.floor(getEntity().locY * 32.0D);
|
||||
packet.e = (int) MathHelper.floor(getEntity().locZ * 32D);
|
||||
packet.i = (byte) ((int) (getEntity().yaw * 256.0F / 360.0F));
|
||||
packet.j = (byte) ((int) (getEntity().pitch * 256.0F / 360.0F));
|
||||
packet.k = (byte) ((int) (getEntity().yaw * 256.0F / 360.0F));
|
||||
packet.uuid = getEntity().getUniqueID();
|
||||
|
||||
double var2 = 3.9D;
|
||||
double var4 = 0;
|
||||
double var6 = 0;
|
||||
double var8 = 0;
|
||||
|
||||
if (var4 < -var2)
|
||||
{
|
||||
var4 = -var2;
|
||||
}
|
||||
|
||||
if (var6 < -var2)
|
||||
{
|
||||
var6 = -var2;
|
||||
}
|
||||
|
||||
if (var8 < -var2)
|
||||
{
|
||||
var8 = -var2;
|
||||
}
|
||||
|
||||
if (var4 > var2)
|
||||
{
|
||||
var4 = var2;
|
||||
}
|
||||
|
||||
if (var6 > var2)
|
||||
{
|
||||
var6 = var2;
|
||||
}
|
||||
|
||||
if (var8 > var2)
|
||||
{
|
||||
var8 = var2;
|
||||
}
|
||||
|
||||
packet.f = (int) (var4 * 8000.0D);
|
||||
packet.g = (int) (var6 * 8000.0D);
|
||||
packet.h = (int) (var8 * 8000.0D);
|
||||
packet.l = DataWatcher;
|
||||
packet.m = DataWatcher.b();
|
||||
|
||||
return packet;
|
||||
}
|
||||
|
||||
protected String getHurtSound()
|
||||
{
|
||||
return "mob.slime." + (GetSize() > 1 ? "big" : "small");
|
||||
|
@ -37,11 +37,9 @@ public class DisguiseCommand extends CommandBase<PlayerDisguiseManager> implemen
|
||||
return;
|
||||
}
|
||||
|
||||
Plugin.runAsync(() ->
|
||||
{
|
||||
new PlayerDisguiseNotification(realName, currentUUID, args[0], args.length > 1 ? args[1] : args[0]).publish();
|
||||
});
|
||||
|
||||
Plugin.disguise(caller, args[0], args.length > 1 ? args[1] : args[0]);
|
||||
String skin = args.length > 1 ? args[1] : args[0];
|
||||
Plugin.tryDisguise(caller, args[0], skin, () -> // onComplete
|
||||
Plugin.runAsync(() -> // task
|
||||
new PlayerDisguiseNotification(realName, currentUUID, args[0], skin).publish()));
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,96 @@
|
||||
package mineplex.core.disguise.playerdisguise;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.google.common.cache.Cache;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
|
||||
/**
|
||||
* Set with contents that expire after X amount of time units. Essentially HashSet reimplemented with a Cache instead of HashMap.
|
||||
* @author Dan
|
||||
*/
|
||||
public class ExpiringSet<E> extends AbstractSet<E> implements Set<E>
|
||||
{
|
||||
private transient Cache<E, Object> cache;
|
||||
|
||||
private static final Object DUMMY = new Object();
|
||||
|
||||
public ExpiringSet(long duration, TimeUnit unit)
|
||||
{
|
||||
this.cache = CacheBuilder.newBuilder().expireAfterWrite(duration, unit).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<E> iterator()
|
||||
{
|
||||
return cache.asMap().keySet().iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forEach(Consumer<? super E> action)
|
||||
{
|
||||
cache.asMap().keySet().forEach(action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeIf(Predicate<? super E> filter)
|
||||
{
|
||||
return cache.asMap().keySet().removeIf(filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Spliterator<E> spliterator()
|
||||
{
|
||||
return cache.asMap().keySet().spliterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<E> stream()
|
||||
{
|
||||
return cache.asMap().keySet().stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<E> parallelStream()
|
||||
{
|
||||
return cache.asMap().keySet().parallelStream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size()
|
||||
{
|
||||
return (int) cache.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o)
|
||||
{
|
||||
return cache.getIfPresent(o) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(E e)
|
||||
{
|
||||
boolean contained = contains(e);
|
||||
cache.put(e, DUMMY);
|
||||
return contained;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object o)
|
||||
{
|
||||
boolean contained = contains(o);
|
||||
cache.invalidate(o);
|
||||
return contained;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear()
|
||||
{
|
||||
cache.invalidateAll();
|
||||
}
|
||||
}
|
@ -1,14 +1,8 @@
|
||||
package mineplex.core.disguise.playerdisguise;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.MinecraftServer;
|
||||
@ -86,7 +80,7 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
|
||||
ILLEGAL_USERNAMES = ImmutableSet.copyOf(Arrays.asList("hypixel", "chiss", "dctr", "blondebug", "dooskee",
|
||||
"tomcallister", "jessiemarcia", "spu_", "sp614x", "deadmau5", "gwen", "mineplex", "samczsun", "sethbling",
|
||||
"xisuma", "cubehamster", "natet_bird", "qwertyuiopthepie"
|
||||
"xisuma", "cubehamster", "natet_bird", "qwertyuiopthepie", "hitler", "adolfhitler"
|
||||
));
|
||||
|
||||
VERY_SPECIAL_PEOPLE = ImmutableSet.copyOf(Arrays.asList(
|
||||
@ -121,14 +115,15 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
private CoreClientManager _clients = require(CoreClientManager.class);
|
||||
private DisguiseManager _disguise = require(DisguiseManager.class);
|
||||
private Punish _punish = require(Punish.class);
|
||||
private CosmeticManager _cosmetics = require(CosmeticManager.class);
|
||||
// private CosmeticManager _cosmetics = require(CosmeticManager.class);
|
||||
private PreferencesManager _prefs = require(PreferencesManager.class);
|
||||
|
||||
private RedisDataRepository<DisguisePlayerBean> _redis;
|
||||
|
||||
// The list of usernames which cannot join because someone else is joining
|
||||
private Set<String> _cannotJoin = Collections.synchronizedSet(new HashSet<>());
|
||||
private Set<String> _loggingIn = Collections.synchronizedSet(new HashSet<>());
|
||||
// Values expire in 30 seconds if they haven't been properly cleaned up
|
||||
private Set<String> _cannotJoin = Collections.synchronizedSet(new ExpiringSet<>(1, TimeUnit.MINUTES));
|
||||
private Set<String> _loggingIn = Collections.synchronizedSet(new ExpiringSet<>(1, TimeUnit.MINUTES));
|
||||
|
||||
private Set<UUID> _pendingDisguise1 = new HashSet<>();
|
||||
|
||||
@ -164,7 +159,7 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
if (disguisePlayer.getProfile().getName().equalsIgnoreCase(event.getPlayer().getName()))
|
||||
{
|
||||
event.setResult(PlayerLoginEvent.Result.KICK_OTHER);
|
||||
event.setKickMessage("Failed to login: The authentication servers are currently down for maintainence");
|
||||
event.setKickMessage("Failed to login: The authentication servers are currently down for maintenance");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -172,7 +167,7 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
if (_cannotJoin.contains(event.getPlayer().getName().toLowerCase()))
|
||||
{
|
||||
event.setResult(PlayerLoginEvent.Result.KICK_OTHER);
|
||||
event.setKickMessage("Failed to login: The authentication servers are currently down for maintainence");
|
||||
event.setKickMessage("Failed to login: The authentication servers are currently down for maintenance");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -231,7 +226,7 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
runSyncLater(() ->
|
||||
{
|
||||
UtilPlayer.message(event.getPlayer(), F.main(getName(), "Attempting to disguise you as " + bean.getGameProfile().getName()));
|
||||
disguise(event.getPlayer(), bean.getGameProfile());
|
||||
tryDisguise(event.getPlayer(), bean.getGameProfile(), () -> { });
|
||||
}, 1);
|
||||
}
|
||||
}
|
||||
@ -423,10 +418,26 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
|
||||
DisguisePlayer disguise = _disguises.remove(caller.getUniqueId());
|
||||
|
||||
undisguise(caller, disguise);
|
||||
|
||||
_mapping.remove(disguise.getName().toLowerCase());
|
||||
|
||||
UtilPlayer.message(caller, F.main("Disguise", "You are no longer disguised!"));
|
||||
getPluginManager().callEvent(new PlayerUndisguisedEvent(caller));
|
||||
removeDisguiseData(caller);
|
||||
}
|
||||
|
||||
public void undisguise(Player caller, DisguisePlayer disguise)
|
||||
{
|
||||
GameProfile originalProfile = disguise.getOriginalProfile();
|
||||
GameProfile currentProfile = ((CraftPlayer) caller).getProfile();
|
||||
boolean sameName = caller.getName().equals(currentProfile.getName());
|
||||
|
||||
if (!sameName)
|
||||
{
|
||||
require(ScoreboardManager.class).handlePlayerQuit(disguise.getName());
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
UtilGameProfile.changeName(currentProfile, originalProfile.getName());
|
||||
@ -447,7 +458,7 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
return;
|
||||
}
|
||||
|
||||
getDisguiseManager().undisguise(caller);
|
||||
getDisguiseManager().undisguise(disguise);
|
||||
|
||||
GameProfile disguisedProfile = disguise.getProfile();
|
||||
|
||||
@ -458,25 +469,21 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
require(FriendManager.class).updatePlayerStatus(originalProfile.getId(), new PlayerStatus(originalProfile.getId(), originalProfile.getName(), _serverName));
|
||||
getPreferencesManager().handlePlayerJoin(caller, true);
|
||||
|
||||
if (!sameName)
|
||||
{
|
||||
require(ScoreboardManager.class).handlePlayerJoin(disguise.getOriginalProfile().getName());
|
||||
|
||||
|
||||
_mapping.remove(disguise.getName().toLowerCase());
|
||||
|
||||
UtilPlayer.message(caller, F.main("Disguise", "You are no longer disguised!"));
|
||||
getPluginManager().callEvent(new PlayerUndisguisedEvent(caller));
|
||||
removeDisguiseData(caller);
|
||||
}
|
||||
}
|
||||
|
||||
public void disguise(Player caller, GameProfile requestedProfile)
|
||||
public void tryDisguise(Player caller, GameProfile requestedProfile, Runnable onComplete)
|
||||
{
|
||||
if (getDisguiseManager().isDisguised(caller))
|
||||
{
|
||||
if (isDisguised(caller))
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Disguise", "You are already disguised. Please undisguise by using /disguise"));
|
||||
}
|
||||
else
|
||||
UtilPlayer.message(caller,
|
||||
F.main("Disguise", "You are already disguised. Please undisguise by using /disguise"));
|
||||
} else
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Disguise", "You are already disguised. Perhaps you are morphed?"));
|
||||
}
|
||||
@ -485,65 +492,106 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
|
||||
if (isDisguised(caller))
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Disguise", "You are already disguised. Please undisguise by using /disguise"));
|
||||
UtilPlayer.message(caller,
|
||||
F.main("Disguise", "You are already disguised. Please undisguise by using /disguise"));
|
||||
return;
|
||||
}
|
||||
|
||||
String requestedUsername = requestedProfile.getName();
|
||||
CoreClient callerClient = getClientManager().Get(caller);
|
||||
|
||||
if (!requestedUsername.equalsIgnoreCase(caller.getName()))
|
||||
String requestedUsername = requestedProfile.getName();
|
||||
if (requestedUsername.equalsIgnoreCase(caller.getName()))
|
||||
{
|
||||
_cannotJoin.add(requestedUsername.toLowerCase());
|
||||
if (doDisguise(caller, requestedProfile, callerClient, callerClient))
|
||||
{
|
||||
onComplete.run();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for (Player other : UtilServer.getPlayersCollection())
|
||||
{
|
||||
if (other.getName().equalsIgnoreCase(requestedUsername))
|
||||
{
|
||||
UtilPlayer.message(caller, C.cRed + F.main("Disguise", "This name is already in use!"));
|
||||
_cannotJoin.remove(requestedUsername.toLowerCase());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!_pendingDisguise.add(requestedUsername.toLowerCase()))
|
||||
if (_pendingDisguise.contains(requestedUsername.toLowerCase()))
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Disguise", "Someone is already disguising as that user"));
|
||||
return;
|
||||
}
|
||||
|
||||
getClientManager().getOrLoadClient(requestedUsername, other ->
|
||||
{
|
||||
if (other != null)
|
||||
{
|
||||
Rank otherRank = other.GetRank();
|
||||
if (otherRank.has(Rank.TWITCH))
|
||||
{
|
||||
UtilPlayer.message(caller,
|
||||
F.main("Disguise", "You can't disguise as staff, YouTubers or Twitchers!"));
|
||||
return;
|
||||
}
|
||||
|
||||
PunishClient pclient = getPunishManager().GetClient(requestedUsername);
|
||||
if (pclient != null && (pclient.IsBanned() || pclient.IsMuted()))
|
||||
{
|
||||
UtilPlayer.message(caller,
|
||||
F.main("Disguise", "You can't disguise as players who are banned/muted!"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (doDisguise(caller, requestedProfile, callerClient, other))
|
||||
{
|
||||
onComplete.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public boolean doDisguise(Player caller, GameProfile requestedProfile, CoreClient callerClient, CoreClient otherClient)
|
||||
{
|
||||
String requestedUsername = requestedProfile.getName();
|
||||
_pendingDisguise.add(requestedUsername.toLowerCase());
|
||||
|
||||
if (!requestedUsername.equalsIgnoreCase(caller.getName()))
|
||||
{
|
||||
_cannotJoin.add(requestedUsername.toLowerCase());
|
||||
} else
|
||||
{
|
||||
DisguisePlayer disguisePlayer = new DisguisePlayer(caller, requestedProfile);
|
||||
disguisePlayer.showInTabList(true, 0);
|
||||
allow(caller);
|
||||
getDisguiseManager().disguise(disguisePlayer, () ->
|
||||
{
|
||||
((CraftPlayer) caller).getProfile().getProperties().clear();
|
||||
((CraftPlayer) caller).getProfile().getProperties().putAll(disguisePlayer.getProfile().getProperties());
|
||||
|
||||
storeDisguiseData(caller, caller.getName(), requestedProfile);
|
||||
getPreferencesManager().handlePlayerJoin(caller, true);
|
||||
|
||||
_disguises.put(caller.getUniqueId(), disguisePlayer);
|
||||
|
||||
_pendingDisguise.remove(requestedUsername.toLowerCase());
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
PlayerPreDisguiseEvent playerPreDisguiseEvent = new PlayerPreDisguiseEvent(caller, requestedUsername);
|
||||
UtilServer.CallEvent(playerPreDisguiseEvent);
|
||||
if (playerPreDisguiseEvent.isCancelled())
|
||||
{
|
||||
UtilPlayer.message(caller, F.main(getName(), "Your disguise was cancelled by something"));
|
||||
_pendingDisguise.remove(requestedUsername.toLowerCase());
|
||||
return;
|
||||
}
|
||||
|
||||
CoreClient callerClient = getClientManager().Get(caller);
|
||||
|
||||
if (!requestedUsername.equalsIgnoreCase(caller.getName()))
|
||||
{
|
||||
getClientManager().getOrLoadClient(requestedUsername, other ->
|
||||
{
|
||||
Rank otherRank = other != null ? other.GetRank() : Rank.ALL;
|
||||
|
||||
if (otherRank.has(Rank.TWITCH))
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Disguise", "You can't disguise as staff, YouTubers or Twitchers!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (other != null)
|
||||
{
|
||||
PunishClient pclient = getPunishManager().GetClient(requestedUsername);
|
||||
if (pclient != null && (pclient.IsBanned() || pclient.IsMuted()))
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Disguise", "You can't disguise as players who are banned/muted!"));
|
||||
return;
|
||||
}
|
||||
_cannotJoin.remove(requestedUsername.toLowerCase());
|
||||
return false;
|
||||
}
|
||||
|
||||
Rank otherRank = otherClient != null ? otherClient.GetRank() : Rank.ALL;
|
||||
callerClient.disguise(requestedUsername, requestedProfile.getId(), otherRank);
|
||||
|
||||
_mapping.put(callerClient.getDisguisedAs().toLowerCase(), callerClient.getName());
|
||||
@ -579,8 +627,7 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
Map map = (Map) playersByName.get(MinecraftServer.getServer().getPlayerList());
|
||||
map.remove(disguisePlayer.getOriginalProfile().getName());
|
||||
map.put(disguisePlayer.getProfile().getName(), disguisePlayer.getEntity());
|
||||
}
|
||||
catch (Throwable t)
|
||||
} catch (Throwable t)
|
||||
{
|
||||
t.printStackTrace();
|
||||
}
|
||||
@ -591,10 +638,12 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
callerProfile.getProperties().putAll(disguisePlayer.getProfile().getProperties());
|
||||
|
||||
callerProfile.getProperties().removeAll(ORIGINAL_UUID_KEY);
|
||||
callerProfile.getProperties().put(ORIGINAL_UUID_KEY, new Property(ORIGINAL_UUID_KEY, caller.getUniqueId().toString()));
|
||||
callerProfile.getProperties()
|
||||
.put(ORIGINAL_UUID_KEY, new Property(ORIGINAL_UUID_KEY, caller.getUniqueId().toString()));
|
||||
|
||||
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getOriginalProfile().getId(), null);
|
||||
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getProfile().getId(), new PlayerStatus(disguisePlayer.getProfile().getId(), requestedUsername, _serverName));
|
||||
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getProfile().getId(),
|
||||
new PlayerStatus(disguisePlayer.getProfile().getId(), requestedUsername, _serverName));
|
||||
|
||||
getPreferencesManager().handlePlayerJoin(caller, true);
|
||||
|
||||
@ -610,29 +659,11 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
|
||||
_cannotJoin.remove(requestedUsername.toLowerCase());
|
||||
});
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
DisguisePlayer disguisePlayer = new DisguisePlayer(caller, requestedProfile);
|
||||
disguisePlayer.showInTabList(true, 0);
|
||||
allow(caller);
|
||||
getDisguiseManager().disguise(disguisePlayer, () ->
|
||||
{
|
||||
((CraftPlayer) caller).getProfile().getProperties().clear();
|
||||
((CraftPlayer) caller).getProfile().getProperties().putAll(disguisePlayer.getProfile().getProperties());
|
||||
|
||||
storeDisguiseData(caller, caller.getName(), requestedProfile);
|
||||
getPreferencesManager().handlePlayerJoin(caller, true);
|
||||
|
||||
_disguises.put(caller.getUniqueId(), disguisePlayer);
|
||||
|
||||
_pendingDisguise.remove(requestedUsername.toLowerCase());
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void disguise(Player caller, String requestedUsername, String requestedSkin)
|
||||
public void tryDisguise(Player caller, String requestedUsername, String requestedSkin, Runnable onComplete)
|
||||
{
|
||||
if (!validateUsername(caller, requestedUsername, true)) return;
|
||||
if (!validateUsername(caller, requestedSkin, false)) return;
|
||||
@ -655,7 +686,7 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
||||
requestedProfile.getProperties().clear();
|
||||
requestedProfile.getProperties().put("textures", skinData.getProperty());
|
||||
|
||||
disguise(caller, requestedProfile);
|
||||
tryDisguise(caller, requestedProfile, onComplete);
|
||||
};
|
||||
|
||||
if (!requestedUsername.equalsIgnoreCase(requestedSkin))
|
||||
|
@ -10,7 +10,19 @@ import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailRedWhite;
|
||||
import mineplex.core.gadget.gadgets.death.DeathMapleLeaf;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpMaple;
|
||||
import mineplex.core.gadget.gadgets.flag.FlagType;
|
||||
import mineplex.core.gadget.gadgets.morph.MorphBobRoss;
|
||||
import mineplex.core.gadget.gadgets.morph.MorphFreedomFighter;
|
||||
import mineplex.core.gadget.gadgets.morph.MorphMelonHead;
|
||||
import mineplex.core.gadget.gadgets.particle.freedom.ParticleAuraNiceness;
|
||||
import mineplex.core.gadget.gadgets.particle.freedom.ParticleCanadian;
|
||||
import mineplex.core.gadget.gadgets.particle.freedom.ParticleFreedomFireworks;
|
||||
import mineplex.core.gadget.gadgets.particle.freedom.ParticleStarSpangled;
|
||||
import mineplex.core.gadget.set.SetCanadian;
|
||||
import mineplex.core.gadget.types.FlagGadget;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@ -47,50 +59,50 @@ import mineplex.core.gadget.event.GadgetCollideEntityEvent;
|
||||
import mineplex.core.gadget.event.GadgetEnableEvent;
|
||||
import mineplex.core.gadget.event.PlayerToggleSwimEvent;
|
||||
import mineplex.core.gadget.event.TauntCommandEvent;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.candycane.ArrowTrailCandyCane;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.cupidslove.ArrowTrailCupid;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.emerald.ArrowTrailEmerald;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.freedom.ArrowTrailFreedom;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.frostlord.ArrowTrailFrostLord;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.halloween.ArrowTrailHalloween;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.howlingwinds.ArrowTrailStorm;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.music.ArrowTrailMusic;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.party.ArrowTrailConfetti;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.shadow.ArrowTrailShadow;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.spring.ArrowTrailSpring;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.titan.ArrowTrailTitan;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.vampire.ArrowTrailBlood;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.wisdom.ArrowTrailEnchant;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCandyCane;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCupid;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailEmerald;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFreedom;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFrostLord;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailHalloween;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailStorm;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailMusic;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailConfetti;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailShadow;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailSpring;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailTitan;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailBlood;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailEnchant;
|
||||
import mineplex.core.gadget.gadgets.balloons.BalloonItem;
|
||||
import mineplex.core.gadget.gadgets.balloons.BalloonType;
|
||||
import mineplex.core.gadget.gadgets.death.candycane.DeathCandyCane;
|
||||
import mineplex.core.gadget.gadgets.death.christmas.DeathPresentDanger;
|
||||
import mineplex.core.gadget.gadgets.death.cupidslove.DeathCupidsBrokenHeart;
|
||||
import mineplex.core.gadget.gadgets.death.emerald.DeathEmerald;
|
||||
import mineplex.core.gadget.gadgets.death.freedom.DeathFreedom;
|
||||
import mineplex.core.gadget.gadgets.death.frostlord.DeathFrostLord;
|
||||
import mineplex.core.gadget.gadgets.death.howlingwinds.DeathStorm;
|
||||
import mineplex.core.gadget.gadgets.death.music.DeathMusic;
|
||||
import mineplex.core.gadget.gadgets.death.party.DeathPinataBurst;
|
||||
import mineplex.core.gadget.gadgets.death.shadow.DeathShadow;
|
||||
import mineplex.core.gadget.gadgets.death.spring.DeathSpring;
|
||||
import mineplex.core.gadget.gadgets.death.titan.DeathTitan;
|
||||
import mineplex.core.gadget.gadgets.death.vampire.DeathBlood;
|
||||
import mineplex.core.gadget.gadgets.death.wisdom.DeathEnchant;
|
||||
import mineplex.core.gadget.gadgets.doublejump.candycane.DoubleJumpCandyCane;
|
||||
import mineplex.core.gadget.gadgets.doublejump.cupidslove.DoubleJumpCupidsWings;
|
||||
import mineplex.core.gadget.gadgets.doublejump.emerald.DoubleJumpEmerald;
|
||||
import mineplex.core.gadget.gadgets.doublejump.freedom.DoubleJumpFreedom;
|
||||
import mineplex.core.gadget.gadgets.doublejump.frostlord.DoubleJumpFrostLord;
|
||||
import mineplex.core.gadget.gadgets.doublejump.halloween.DoubleJumpHalloween;
|
||||
import mineplex.core.gadget.gadgets.doublejump.howlingwinds.DoubleJumpStorm;
|
||||
import mineplex.core.gadget.gadgets.doublejump.music.DoubleJumpMusic;
|
||||
import mineplex.core.gadget.gadgets.doublejump.party.DoubleJumpFirecracker;
|
||||
import mineplex.core.gadget.gadgets.doublejump.shadow.DoubleJumpShadow;
|
||||
import mineplex.core.gadget.gadgets.doublejump.spring.DoubleJumpSpring;
|
||||
import mineplex.core.gadget.gadgets.doublejump.titan.DoubleJumpTitan;
|
||||
import mineplex.core.gadget.gadgets.doublejump.vampire.DoubleJumpBlood;
|
||||
import mineplex.core.gadget.gadgets.doublejump.wisdom.DoubleJumpEnchant;
|
||||
import mineplex.core.gadget.gadgets.death.DeathCandyCane;
|
||||
import mineplex.core.gadget.gadgets.death.DeathPresentDanger;
|
||||
import mineplex.core.gadget.gadgets.death.DeathCupidsBrokenHeart;
|
||||
import mineplex.core.gadget.gadgets.death.DeathEmerald;
|
||||
import mineplex.core.gadget.gadgets.death.DeathFreedom;
|
||||
import mineplex.core.gadget.gadgets.death.DeathFrostLord;
|
||||
import mineplex.core.gadget.gadgets.death.DeathStorm;
|
||||
import mineplex.core.gadget.gadgets.death.DeathMusic;
|
||||
import mineplex.core.gadget.gadgets.death.DeathPinataBurst;
|
||||
import mineplex.core.gadget.gadgets.death.DeathShadow;
|
||||
import mineplex.core.gadget.gadgets.death.DeathSpring;
|
||||
import mineplex.core.gadget.gadgets.death.DeathTitan;
|
||||
import mineplex.core.gadget.gadgets.death.DeathBlood;
|
||||
import mineplex.core.gadget.gadgets.death.DeathEnchant;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCandyCane;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCupidsWings;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpEmerald;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFreedom;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFrostLord;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpHalloween;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpStorm;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpMusic;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFirecracker;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpShadow;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpSpring;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpTitan;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpBlood;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpEnchant;
|
||||
import mineplex.core.gadget.gadgets.gamemodifiers.GameModifierType;
|
||||
import mineplex.core.gadget.gadgets.gamemodifiers.gemhunters.GameModifierMount;
|
||||
import mineplex.core.gadget.gadgets.gamemodifiers.gemhunters.MountType;
|
||||
@ -185,19 +197,19 @@ import mineplex.core.gadget.gadgets.particle.ParticleWingsInfernal;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleWingsLove;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleWingsPixie;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleYinYang;
|
||||
import mineplex.core.gadget.gadgets.particle.candycane.ParticleCandyCane;
|
||||
import mineplex.core.gadget.gadgets.particle.cupidslove.ParticleHeart;
|
||||
import mineplex.core.gadget.gadgets.particle.emerald.ParticleEmerald;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleCandyCane;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleHeart;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleEmerald;
|
||||
import mineplex.core.gadget.gadgets.particle.freedom.ParticleFreedom;
|
||||
import mineplex.core.gadget.gadgets.particle.frostlord.ParticleFrostLord;
|
||||
import mineplex.core.gadget.gadgets.particle.howlingwinds.ParticleRain;
|
||||
import mineplex.core.gadget.gadgets.particle.music.ParticleMusic;
|
||||
import mineplex.core.gadget.gadgets.particle.party.ParticlePartyTime;
|
||||
import mineplex.core.gadget.gadgets.particle.shadow.ParticleFoot;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleFrostLord;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleRain;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleMusic;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticlePartyTime;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleFoot;
|
||||
import mineplex.core.gadget.gadgets.particle.spring.ParticleSpringHalo;
|
||||
import mineplex.core.gadget.gadgets.particle.titan.ParticleTitan;
|
||||
import mineplex.core.gadget.gadgets.particle.vampire.ParticleBlood;
|
||||
import mineplex.core.gadget.gadgets.particle.wisdom.ParticleEnchant;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleTitan;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleBlood;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleEnchant;
|
||||
import mineplex.core.gadget.gadgets.taunts.BlowAKissTaunt;
|
||||
import mineplex.core.gadget.gadgets.taunts.EternalTaunt;
|
||||
import mineplex.core.gadget.gadgets.taunts.RainbowTaunt;
|
||||
@ -366,6 +378,7 @@ public class GadgetManager extends MiniPlugin
|
||||
addSet(new SetMusic(this));
|
||||
addSet(new SetFreedom(this));
|
||||
addSet(new SetSpring(this));
|
||||
addSet(new SetCanadian(this));
|
||||
}
|
||||
|
||||
private void createGadgets()
|
||||
@ -456,34 +469,45 @@ public class GadgetManager extends MiniPlugin
|
||||
addGadget(new MorphGoldPot(this));
|
||||
addGadget(new MorphAwkwardRabbit(this));
|
||||
addGadget(new MorphBobRoss(this, _hologramManager));
|
||||
addGadget(new MorphFreedomFighter(this));
|
||||
addGadget(new MorphMelonHead(this));
|
||||
|
||||
// Particles
|
||||
addGadget(new ParticleFoot(this));
|
||||
addGadget(new ParticleFireRings(this));
|
||||
addGadget(new ParticleFairy(this));
|
||||
addGadget(new ParticleLegend(this));
|
||||
addGadget(new ParticleFrostLord(this));
|
||||
addGadget(new ParticleTitan(this));
|
||||
addGadget(new ParticleCandyCane(this));
|
||||
addGadget(new ParticleCoalFumes(this));
|
||||
addGadget(new ParticlePartyTime(this));
|
||||
addGadget(new ParticleHeart(this));
|
||||
addGadget(new ParticleEmerald(this));
|
||||
addGadget(new ParticleWingsDemons(this));
|
||||
addGadget(new ParticleEnchant(this));
|
||||
addGadget(new ParticleRain(this));
|
||||
addGadget(new ParticleBlood(this));
|
||||
addGadget(new ParticleEnchant(this));
|
||||
addGadget(new ParticleMusic(this));
|
||||
addGadget(new ParticleWingsAngel(this));
|
||||
addGadget(new ParticleWingsInfernal(this));
|
||||
addGadget(new ParticleWingsPixie(this));
|
||||
addGadget(new ParticlePartyTime(this));
|
||||
|
||||
addGadget(new ParticleHeart(this));
|
||||
addGadget(new ParticleCandyCane(this));
|
||||
addGadget(new ParticleFrostLord(this));
|
||||
addGadget(new ParticleLegend(this));
|
||||
addGadget(new ParticleTitan(this));
|
||||
addGadget(new ParticleYinYang(this));
|
||||
addGadget(new ParticleFreedom(this));
|
||||
addGadget(new ParticleChristmasTree(this));
|
||||
addGadget(new ParticleKing(this, _castleManager));
|
||||
|
||||
addGadget(new ParticleWingsPixie(this));
|
||||
addGadget(new ParticleWingsDemons(this));
|
||||
addGadget(new ParticleWingsInfernal(this));
|
||||
addGadget(new ParticleWingsAngel(this));
|
||||
addGadget(new ParticleWingsLove(this));
|
||||
addGadget(new ParticleFireRings(this));
|
||||
addGadget(new ParticleFairy(this));
|
||||
|
||||
addGadget(new ParticleChristmasTree(this));
|
||||
addGadget(new ParticleCoalFumes(this));
|
||||
addGadget(new ParticleSpringHalo(this));
|
||||
addGadget(new ParticleWingsBee(this));
|
||||
addGadget(new ParticleKing(this, _castleManager));
|
||||
|
||||
addGadget(new ParticleFreedom(this));
|
||||
addGadget(new ParticleFreedomFireworks(this));
|
||||
addGadget(new ParticleStarSpangled(this));
|
||||
addGadget(new ParticleAuraNiceness(this));
|
||||
addGadget(new ParticleCanadian(this));
|
||||
|
||||
|
||||
// Arrow Trails
|
||||
addGadget(new ArrowTrailFrostLord(this));
|
||||
@ -500,6 +524,7 @@ public class GadgetManager extends MiniPlugin
|
||||
addGadget(new ArrowTrailFreedom(this));
|
||||
addGadget(new ArrowTrailHalloween(this));
|
||||
addGadget(new ArrowTrailSpring(this));
|
||||
addGadget(new ArrowTrailRedWhite(this));
|
||||
|
||||
// Death Effect
|
||||
addGadget(new DeathFrostLord(this));
|
||||
@ -516,6 +541,7 @@ public class GadgetManager extends MiniPlugin
|
||||
addGadget(new DeathFreedom(this));
|
||||
addGadget(new DeathPresentDanger(this));
|
||||
addGadget(new DeathSpring(this));
|
||||
addGadget(new DeathMapleLeaf(this));
|
||||
|
||||
// Double Jump
|
||||
addGadget(new DoubleJumpFrostLord(this));
|
||||
@ -532,6 +558,7 @@ public class GadgetManager extends MiniPlugin
|
||||
addGadget(new DoubleJumpFreedom(this));
|
||||
addGadget(new DoubleJumpHalloween(this));
|
||||
addGadget(new DoubleJumpSpring(this));
|
||||
addGadget(new DoubleJumpMaple(this));
|
||||
|
||||
// Hat
|
||||
for (HatType hatType : HatType.values())
|
||||
@ -625,6 +652,11 @@ public class GadgetManager extends MiniPlugin
|
||||
addGadget(new BlowAKissTaunt(this));
|
||||
addGadget(new RainbowTaunt(this));
|
||||
|
||||
// Flags
|
||||
addGadget(new FlagGadget(this, FlagType.CANADA));
|
||||
addGadget(new FlagGadget(this, FlagType.USA));
|
||||
|
||||
|
||||
// Kit Selectors
|
||||
addGadget(new WaterWingsKitSelector(this));
|
||||
addGadget(new HaloKitSelector(this));
|
||||
@ -830,6 +862,23 @@ public class GadgetManager extends MiniPlugin
|
||||
return null;
|
||||
}
|
||||
|
||||
public FlagGadget getFlagGadget(FlagType type)
|
||||
{
|
||||
for (Gadget gadget : getGadgets(GadgetType.FLAG))
|
||||
{
|
||||
if(gadget instanceof FlagGadget)
|
||||
{
|
||||
FlagGadget flagGadget = (FlagGadget) gadget;
|
||||
|
||||
if (type.equals(flagGadget.getFlagType()))
|
||||
{
|
||||
return flagGadget;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public BalloonGadget getBalloonGadget(BalloonType balloonType)
|
||||
{
|
||||
for (Gadget gadget : getGadgets(GadgetType.BALLOON))
|
||||
|
@ -9,19 +9,19 @@ import org.bukkit.entity.Player;
|
||||
import mineplex.core.command.CommandBase;
|
||||
import mineplex.core.common.Rank;
|
||||
import mineplex.core.gadget.GadgetManager;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.candycane.ArrowTrailCandyCane;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.frostlord.ArrowTrailFrostLord;
|
||||
import mineplex.core.gadget.gadgets.death.candycane.DeathCandyCane;
|
||||
import mineplex.core.gadget.gadgets.death.frostlord.DeathFrostLord;
|
||||
import mineplex.core.gadget.gadgets.doublejump.candycane.DoubleJumpCandyCane;
|
||||
import mineplex.core.gadget.gadgets.doublejump.frostlord.DoubleJumpFrostLord;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCandyCane;
|
||||
import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFrostLord;
|
||||
import mineplex.core.gadget.gadgets.death.DeathCandyCane;
|
||||
import mineplex.core.gadget.gadgets.death.DeathFrostLord;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCandyCane;
|
||||
import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFrostLord;
|
||||
import mineplex.core.gadget.gadgets.hat.HatType;
|
||||
import mineplex.core.gadget.gadgets.item.ItemCoal;
|
||||
import mineplex.core.gadget.gadgets.item.ItemFreezeCannon;
|
||||
import mineplex.core.gadget.gadgets.item.ItemPartyPopper;
|
||||
import mineplex.core.gadget.gadgets.item.ItemSnowball;
|
||||
import mineplex.core.gadget.gadgets.morph.MorphSnowman;
|
||||
import mineplex.core.gadget.gadgets.particle.frostlord.ParticleFrostLord;
|
||||
import mineplex.core.gadget.gadgets.particle.ParticleFrostLord;
|
||||
import mineplex.core.gadget.types.Gadget;
|
||||
import mineplex.core.mount.Mount;
|
||||
|
||||
|
@ -41,9 +41,12 @@ public class UnlockCosmeticsCommand extends CommandBase<GadgetManager>
|
||||
{
|
||||
addCosmetics(null, caller);
|
||||
}
|
||||
else if (args.length == 1)
|
||||
else if (args.length >= 1)
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("all"))
|
||||
{
|
||||
for (Player player : UtilServer.getPlayers())
|
||||
{
|
||||
Player player = Bukkit.getPlayer(args[0]);
|
||||
if (player != null)
|
||||
{
|
||||
addCosmetics(null, player);
|
||||
@ -51,6 +54,20 @@ public class UnlockCosmeticsCommand extends CommandBase<GadgetManager>
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < args.length; ++i)
|
||||
{
|
||||
Player player = Bukkit.getPlayer(args[i]);
|
||||
if (player != null)
|
||||
{
|
||||
addCosmetics(null, player);
|
||||
UtilPlayer.message(caller, F.main("Unlock Cosmetics", "Added all the cosmetics to " + F.name(player.getName()) + "!"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addCosmetics(GadgetType gadgetType, Player caller)
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.vampire;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Arrow;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.candycane;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.party;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Arrow;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.cupidslove;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.emerald;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import mineplex.core.common.util.*;
|
||||
import org.bukkit.Location;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.wisdom;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.freedom;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import java.awt.Color;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.frostlord;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Arrow;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.halloween;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.HashMap;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.music;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Arrow;
|
@ -0,0 +1,77 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.LineFormat;
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilParticle;
|
||||
import mineplex.core.common.util.UtilText;
|
||||
import mineplex.core.common.util.banner.CountryFlag;
|
||||
import mineplex.core.gadget.GadgetManager;
|
||||
import mineplex.core.gadget.types.ArrowEffectGadget;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Arrow;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
/**
|
||||
* Trails a red and white double helix behind the arrow.
|
||||
*/
|
||||
public class ArrowTrailRedWhite extends ArrowEffectGadget
|
||||
{
|
||||
public ArrowTrailRedWhite(GadgetManager manager)
|
||||
{
|
||||
super(manager, "Red & White Arrows",
|
||||
UtilText.splitLineToArray(C.cRed + "Killing you nicely.", LineFormat.LORE),
|
||||
-8, Material.WOOL, (byte)0);
|
||||
|
||||
setDisplayItem(CountryFlag.CANADA.getBanner());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doTrail(Arrow arrow)
|
||||
{
|
||||
Vector v = arrow.getVelocity();
|
||||
Vector up = UtilAlg.getUp(v);
|
||||
Vector left = UtilAlg.getLeft(v);
|
||||
|
||||
Location loc = arrow.getLocation();
|
||||
|
||||
double amount = 2;
|
||||
double ticks = 15;
|
||||
|
||||
for(int i = 0; i < amount; i++)
|
||||
{
|
||||
double rad = Math.PI*2.0;
|
||||
rad += i/amount * rad;
|
||||
rad += Math.PI*2*(arrow.getTicksLived()%ticks)/ticks;
|
||||
double l = -Math.sin(rad);
|
||||
double u = Math.cos(rad);
|
||||
|
||||
Vector vel = v.clone().add(up.clone().multiply(u)).add(left.clone().multiply(l));
|
||||
vel.multiply(0.4);
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
for(int j = 0; j < 3; ++j)
|
||||
{
|
||||
UtilParticle.playColoredParticleToAll(Color.RED, UtilParticle.ParticleType.RED_DUST, loc.clone().add(vel), 0, UtilParticle.ViewDist.NORMAL);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int j = 0; j < 3; ++j)
|
||||
{
|
||||
UtilParticle.playColoredParticleToAll(Color.WHITE, UtilParticle.ParticleType.RED_DUST, loc.clone().add(vel), 0, UtilParticle.ViewDist.NORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doHitEffect(Arrow arrow)
|
||||
{
|
||||
UtilParticle.PlayParticleToAll(UtilParticle.ParticleType.EXPLODE, arrow.getLocation(), 0, 0, 0, 0, 3, UtilParticle.ViewDist.NORMAL);
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.shadow;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Arrow;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.spring;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.howlingwinds;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Arrow;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.arrowtrail.titan;
|
||||
package mineplex.core.gadget.gadgets.arrowtrail;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Arrow;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.vampire;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.candycane;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.cupidslove;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.emerald;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.wisdom;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.freedom;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.frostlord;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -0,0 +1,45 @@
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import mineplex.core.blood.BloodEvent;
|
||||
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.common.util.banner.CountryFlag;
|
||||
import mineplex.core.gadget.GadgetManager;
|
||||
import mineplex.core.gadget.types.DeathEffectGadget;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
/**
|
||||
* Displays a giant maple leaf at the point of death.
|
||||
*/
|
||||
public class DeathMapleLeaf extends DeathEffectGadget
|
||||
{
|
||||
/** height off the ground of the leaf */
|
||||
private static final double HEIGHT = 3;
|
||||
|
||||
private final ShapeWings _leafOuter = new ShapeWings(UtilParticle.ParticleType.RED_DUST.particleName, new Vector(1.0, 1.0, 1.0), 1, 0, false, 0, ShapeWings.MAPLE_LEAF);
|
||||
private final ShapeWings _leafInner = new ShapeWings(UtilParticle.ParticleType.RED_DUST.particleName, new Vector(0.7, 0, 0), 1, 0, false, 0, ShapeWings.MAPLE_LEAF);
|
||||
|
||||
public DeathMapleLeaf(GadgetManager manager)
|
||||
{
|
||||
super(manager, "Fallen Maple Leaf",
|
||||
UtilText.splitLineToArray(C.cGray + "When you die in " + C.cRed + "Canada" + C.cGray + " you die in real life.", LineFormat.LORE),
|
||||
-8, Material.WOOL, (byte) 0);
|
||||
|
||||
setDisplayItem(CountryFlag.CANADA.getBanner());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlood(Player player, BloodEvent event)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
Location loc = player.getLocation().add(0, HEIGHT, 0);
|
||||
_leafOuter.display(loc);
|
||||
_leafInner.display(loc);
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.music;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.party;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.christmas;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.shadow;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.spring;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.howlingwinds;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.death.titan;
|
||||
package mineplex.core.gadget.gadgets.death;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.vampire;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.candycane;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@ -30,7 +30,7 @@ public class DoubleJumpCandyCane extends DoubleJumpEffectGadget
|
||||
Location loc = player.getLocation();
|
||||
UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 15), loc, 0, 0, 0, 0.15f, 100, ViewDist.NORMAL);
|
||||
UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 1), loc, 0, 0, 0, 0.15f, 100, ViewDist.NORMAL);
|
||||
UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 2), loc, 0, 0, 0, 0.15f, 100, ViewDist.NORMAL);
|
||||
UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 15), loc, 0, 0, 0, 0.15f, 100, ViewDist.NORMAL);
|
||||
}
|
||||
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.cupidslove;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.emerald;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.wisdom;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.party;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.freedom;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
@ -18,7 +18,7 @@ public class DoubleJumpFreedom extends DoubleJumpEffectGadget
|
||||
{
|
||||
super(manager, "Leap of Freedom", UtilText.splitLineToArray(UtilText.colorWords("FREEEEEEEEEEEDOM!",
|
||||
ChatColor.RED, ChatColor.WHITE, ChatColor.BLUE), LineFormat.LORE), -8, Material.WOOL,
|
||||
(byte) 14);
|
||||
(byte) 0);
|
||||
setDisplayItem(CountryFlag.USA.getBanner());
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.frostlord;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
@ -1,4 +1,4 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump.halloween;
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.HashMap;
|
@ -0,0 +1,110 @@
|
||||
package mineplex.core.gadget.gadgets.doublejump;
|
||||
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.LineFormat;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilParticle;
|
||||
import mineplex.core.common.util.UtilText;
|
||||
import mineplex.core.common.util.banner.CountryFlag;
|
||||
import mineplex.core.gadget.GadgetManager;
|
||||
import mineplex.core.gadget.types.DoubleJumpEffectGadget;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
public class DoubleJumpMaple extends DoubleJumpEffectGadget
|
||||
{
|
||||
/**
|
||||
* Amount of particles played per tick as a player flies through the air.
|
||||
*/
|
||||
private static final int PARTICLES = 50;
|
||||
|
||||
/**
|
||||
* Vertical offset of the animation's center from the player's location.
|
||||
*/
|
||||
private static final float Y_OFFSET = 0.95f;
|
||||
|
||||
/**
|
||||
* Divisor of the gaussian distribution of particles as the player flies through the air.
|
||||
*/
|
||||
private static final int DISTRIBUTION = 2;
|
||||
|
||||
/**
|
||||
* Particle ring count when a player launches from the ground.
|
||||
*/
|
||||
private static final int LAUNCH_RINGS = 6;
|
||||
|
||||
/**
|
||||
* The distance between launch rings.
|
||||
*/
|
||||
private static final float RING_SPACING = 0.4f;
|
||||
|
||||
/**
|
||||
* Particles played per 1 unit radius.
|
||||
*/
|
||||
private static final int RING_DENSITY = 8;
|
||||
|
||||
private HashMap<Player, Long> _playerMap = new HashMap<>();
|
||||
|
||||
public DoubleJumpMaple(GadgetManager manager)
|
||||
{
|
||||
super(manager, "Maple Leap",
|
||||
UtilText.splitLineToArray(C.cGray + "Jump higher than the maple trees!", LineFormat.LORE),
|
||||
-8, Material.WOOL, (byte)0);
|
||||
setDisplayItem(CountryFlag.CANADA.getBanner());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doEffect(Player player)
|
||||
{
|
||||
_playerMap.put(player, System.currentTimeMillis() + 1000);
|
||||
|
||||
float limit = (LAUNCH_RINGS * RING_SPACING) + RING_SPACING;
|
||||
|
||||
for (float r = RING_SPACING; r < limit; r++)
|
||||
{
|
||||
double[][] points = UtilMath.normalCircle(player.getLocation(), player.getVelocity(), r, Math.round(RING_DENSITY * r));
|
||||
|
||||
for (int i = 0; i < points.length; i++)
|
||||
{
|
||||
UtilParticle.PlayParticleToAll(UtilParticle.ParticleType.EXPLODE, new Location(player.getWorld(), points[i][0], points[i][1], points[i][2]),
|
||||
null, 0, 1, UtilParticle.ViewDist.NORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onUpdate(UpdateEvent event)
|
||||
{
|
||||
if(event.getType() != UpdateType.FASTEST)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for(Iterator<Map.Entry<Player, Long>> it = _playerMap.entrySet().iterator(); it.hasNext();)
|
||||
{
|
||||
Map.Entry<Player, Long> e = it.next();
|
||||
|
||||
if(e.getValue() <= System.currentTimeMillis())
|
||||
{
|
||||
it.remove();
|
||||
continue;
|
||||
}
|
||||
|
||||
Location loc = e.getKey().getLocation().add(0, Y_OFFSET, 0);
|
||||
|
||||
for (int i = 0; i < PARTICLES; ++i)
|
||||
{
|
||||
UtilParticle.playColoredParticleToAll(java.awt.Color.RED, UtilParticle.ParticleType.RED_DUST,
|
||||
UtilMath.gauss(loc, DISTRIBUTION, DISTRIBUTION, DISTRIBUTION), 0, UtilParticle.ViewDist.NORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user