Merge remote-tracking branch 'refs/remotes/origin/develop' into feature/leveling

This commit is contained in:
Sam 2017-08-05 22:32:34 +01:00
commit 18e7143d5a
364 changed files with 12081 additions and 3226 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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,9 +171,13 @@ 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);
}
}
});
@ -222,12 +230,19 @@ public class AntiHack extends MiniPlugin
{
Consumer<Consumer<PunishmentResponse>> doPunish = after ->
{
runAsync(() ->
{
new GwenBanNotification(_thisServer, player.getName(), player.getUniqueId().toString(), coreClient.GetRank().name(), CheckManager.getCheckSimpleName(cause), id, gep).publish();
});
runAsync(() ->
{
new GwenBanNotification(_thisServer, player.getName(), player.getUniqueId().toString(), coreClient.GetRank().name(), CheckManager.getCheckSimpleName(cause), id, gep).publish();
});
_punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, hoursBanned, true, after);
_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,17 +256,18 @@ public class AntiHack extends MiniPlugin
else
{
runBanAnimation(player, () ->
doPunish.accept(result ->
{
doPunish.accept(result ->
{
if (result == PunishmentResponse.Punished)
{
if (result == PunishmentResponse.Punished)
{
announceBan(player);
_banned.add(player.getUniqueId());
_banWaveManager.flagDone(coreClient);
}
_pendingBan.remove(player);
})
);
announceBan(player);
_banned.add(player.getUniqueId());
_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,14 +355,18 @@ 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;
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -33,12 +33,16 @@ public class ArrowTrailPage extends GadgetPage
addGadget(gadget, slot);
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.ARROW_TRAIL) == gadget)
addGlow(slot);
{
addGlow(slot);
}
slot++;
if (slot == 17)
slot += 2;
if (slot % 9 == 8)
{
slot += 2;
}
}
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()

View File

@ -32,12 +32,16 @@ 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()

View File

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

View File

@ -33,12 +33,16 @@ public class DeathEffectPage extends GadgetPage
addGadget(gadget, slot);
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.DEATH) == gadget)
addGlow(slot);
{
addGlow(slot);
}
slot++;
if (slot == 17)
slot += 2;
if (slot % 9 == 8)
{
slot += 2;
}
}
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()

View File

@ -33,12 +33,16 @@ public class DoubleJumpPage extends GadgetPage
addGadget(gadget, slot);
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.DOUBLE_JUMP) == gadget)
addGlow(slot);
{
addGlow(slot);
}
slot++;
if (slot == 17)
slot += 2;
if (slot % 9 == 8)
{
slot += 2;
}
}
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()

View File

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

View File

@ -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,10 +40,18 @@ 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);
buildPage();
if (build)
{
buildPage();
}
}
protected void buildPage()
@ -60,12 +66,16 @@ 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);

View File

@ -38,12 +38,16 @@ public class HatPage extends GadgetPage
addGadget(gadget, slot);
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.HAT) == gadget)
addGlow(slot);
{
addGlow(slot);
}
slot++;
if (slot == 17)
slot += 2;
if (slot % 9 == 8)
{
slot += 2;
}
}
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()

View File

@ -31,12 +31,16 @@ 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()

View File

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

View File

@ -32,13 +32,19 @@ public class MorphPage extends GadgetPage
addGadget(gadget, slot);
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.MORPH) == gadget)
if (!(gadget instanceof MorphBlock))
addGlow(slot);
{
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()

View File

@ -46,8 +46,10 @@ 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()

View File

@ -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,8 +31,10 @@ 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()

View File

@ -31,12 +31,16 @@ public class ParticlePage extends GadgetPage
addGadget(gadget, slot);
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.PARTICLE) == gadget)
addGlow(slot);
{
addGlow(slot);
}
slot++;
if (slot == 17 || slot == 26 || slot == 35)
slot += 2;
if (slot % 9 == 8)
{
slot += 2;
}
}
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()

View File

@ -231,8 +231,10 @@ public class PetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
slot++;
if (slot == 17 || slot == 26)
if (slot % 9 == 8)
{
slot += 2;
}
}
slot = 49;
@ -240,7 +242,12 @@ public class PetPage extends ShopPageBase<CosmeticManager, CosmeticShop>
{
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());

View File

@ -38,12 +38,16 @@ public class TauntPage extends GadgetPage
addGadget(gadget, slot);
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.TAUNT) == gadget)
addGlow(slot);
{
addGlow(slot);
}
slot++;
if (slot == 26)
slot += 2;
if (slot % 9 == 8)
{
slot += 2;
}
}
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()

View File

@ -49,12 +49,16 @@ public class WinEffectPage extends GadgetPage
}
if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.WIN_EFFECT) == gadget)
addGlow(slot);
{
addGlow(slot);
}
slot++;
if (slot == 17 || slot == 26)
slot += 2;
if (slot % 9 == 8)
{
slot += 2;
}
}
addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton()

View File

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

View File

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

View File

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

View File

@ -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,14 +79,57 @@ 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)
{
_soundDisguise = 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);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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());
}
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);
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);
if (!sameName)
{
require(ScoreboardManager.class).handlePlayerJoin(disguise.getOriginalProfile().getName());
}
}
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,134 +492,75 @@ 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"));
return;
}
String requestedUsername = requestedProfile.getName();
if (!requestedUsername.equalsIgnoreCase(caller.getName()))
{
_cannotJoin.add(requestedUsername.toLowerCase());
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()))
{
UtilPlayer.message(caller, F.main("Disguise", "Someone is already disguising as that user"));
return;
}
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());
UtilPlayer.message(caller,
F.main("Disguise", "You are already disguised. Please undisguise by using /disguise"));
return;
}
CoreClient callerClient = getClientManager().Get(caller);
if (!requestedUsername.equalsIgnoreCase(caller.getName()))
String requestedUsername = requestedProfile.getName();
if (requestedUsername.equalsIgnoreCase(caller.getName()))
{
getClientManager().getOrLoadClient(requestedUsername, other ->
if (doDisguise(caller, requestedProfile, callerClient, callerClient))
{
Rank otherRank = other != null ? other.GetRank() : Rank.ALL;
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!"));
return;
}
}
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!"));
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()))
{
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;
}
UtilPlayer.message(caller,
F.main("Disguise", "You can't disguise as players who are banned/muted!"));
return;
}
}
callerClient.disguise(requestedUsername, requestedProfile.getId(), otherRank);
if (doDisguise(caller, requestedProfile, callerClient, other))
{
onComplete.run();
}
});
}
_mapping.put(callerClient.getDisguisedAs().toLowerCase(), callerClient.getName());
public boolean doDisguise(Player caller, GameProfile requestedProfile, CoreClient callerClient, CoreClient otherClient)
{
String requestedUsername = requestedProfile.getName();
_pendingDisguise.add(requestedUsername.toLowerCase());
System.out.println("=================");
System.out.println("Disguising " + caller.getName() + " as:");
System.out.println(requestedProfile.getName() + " id " + requestedProfile.getId());
System.out.println("Properties:");
for (Map.Entry<String, Property> p : requestedProfile.getProperties().entries())
{
System.out.println("\t" + p.getKey() + " " + p.getValue().getName());
System.out.println("\t" + p.getValue().getValue());
System.out.println("\t" + p.getValue().getSignature());
}
System.out.println("=================");
DisguisePlayer disguisePlayer = new DisguisePlayer(caller, requestedProfile);
disguisePlayer.showInTabList(true, 0);
allow(caller);
getDisguiseManager().disguise(disguisePlayer, () ->
{
GameProfile callerProfile = ((CraftPlayer) caller).getProfile();
require(ScoreboardManager.class).handlePlayerQuit(disguisePlayer.getOriginalProfile().getName());
try
{
UtilGameProfile.changeName(callerProfile, disguisePlayer.getProfile().getName());
UtilGameProfile.changeId(callerProfile, disguisePlayer.getProfile().getId());
Field playersByName = PlayerList.class.getDeclaredField("playersByName");
playersByName.setAccessible(true);
Map map = (Map) playersByName.get(MinecraftServer.getServer().getPlayerList());
map.remove(disguisePlayer.getOriginalProfile().getName());
map.put(disguisePlayer.getProfile().getName(), disguisePlayer.getEntity());
}
catch (Throwable t)
{
t.printStackTrace();
}
require(ScoreboardManager.class).handlePlayerJoin(disguisePlayer.getName());
callerProfile.getProperties().clear();
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()));
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getOriginalProfile().getId(), null);
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getProfile().getId(), new PlayerStatus(disguisePlayer.getProfile().getId(), requestedUsername, _serverName));
getPreferencesManager().handlePlayerJoin(caller, true);
_disguises.put(caller.getUniqueId(), disguisePlayer);
UtilPlayer.message(caller, F.main("Disguise", "Disguise Active: " + ChatColor.RESET + requestedUsername));
UtilServer.CallEvent(new PlayerDisguisedEvent(caller));
storeDisguiseData(caller, requestedUsername, requestedProfile);
_pendingDisguise.remove(requestedUsername.toLowerCase());
_cannotJoin.remove(requestedUsername.toLowerCase());
});
});
}
else
if (!requestedUsername.equalsIgnoreCase(caller.getName()))
{
_cannotJoin.add(requestedUsername.toLowerCase());
} else
{
DisguisePlayer disguisePlayer = new DisguisePlayer(caller, requestedProfile);
disguisePlayer.showInTabList(true, 0);
@ -629,10 +577,93 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
_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());
_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());
System.out.println("=================");
System.out.println("Disguising " + caller.getName() + " as:");
System.out.println(requestedProfile.getName() + " id " + requestedProfile.getId());
System.out.println("Properties:");
for (Map.Entry<String, Property> p : requestedProfile.getProperties().entries())
{
System.out.println("\t" + p.getKey() + " " + p.getValue().getName());
System.out.println("\t" + p.getValue().getValue());
System.out.println("\t" + p.getValue().getSignature());
}
System.out.println("=================");
DisguisePlayer disguisePlayer = new DisguisePlayer(caller, requestedProfile);
disguisePlayer.showInTabList(true, 0);
allow(caller);
getDisguiseManager().disguise(disguisePlayer, () ->
{
GameProfile callerProfile = ((CraftPlayer) caller).getProfile();
require(ScoreboardManager.class).handlePlayerQuit(disguisePlayer.getOriginalProfile().getName());
try
{
UtilGameProfile.changeName(callerProfile, disguisePlayer.getProfile().getName());
UtilGameProfile.changeId(callerProfile, disguisePlayer.getProfile().getId());
Field playersByName = PlayerList.class.getDeclaredField("playersByName");
playersByName.setAccessible(true);
Map map = (Map) playersByName.get(MinecraftServer.getServer().getPlayerList());
map.remove(disguisePlayer.getOriginalProfile().getName());
map.put(disguisePlayer.getProfile().getName(), disguisePlayer.getEntity());
} catch (Throwable t)
{
t.printStackTrace();
}
require(ScoreboardManager.class).handlePlayerJoin(disguisePlayer.getName());
callerProfile.getProperties().clear();
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()));
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getOriginalProfile().getId(), null);
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getProfile().getId(),
new PlayerStatus(disguisePlayer.getProfile().getId(), requestedUsername, _serverName));
getPreferencesManager().handlePlayerJoin(caller, true);
_disguises.put(caller.getUniqueId(), disguisePlayer);
UtilPlayer.message(caller, F.main("Disguise", "Disguise Active: " + ChatColor.RESET + requestedUsername));
UtilServer.CallEvent(new PlayerDisguisedEvent(caller));
storeDisguiseData(caller, requestedUsername, requestedProfile);
_pendingDisguise.remove(requestedUsername.toLowerCase());
_cannotJoin.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))

View File

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

View File

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

View File

@ -41,13 +41,30 @@ public class UnlockCosmeticsCommand extends CommandBase<GadgetManager>
{
addCosmetics(null, caller);
}
else if (args.length == 1)
else if (args.length >= 1)
{
Player player = Bukkit.getPlayer(args[0]);
if (player != null)
if (args[0].equalsIgnoreCase("all"))
{
addCosmetics(null, player);
UtilPlayer.message(caller, F.main("Unlock Cosmetics", "Added all the cosmetics to " + F.name(player.getName()) + "!"));
for (Player player : UtilServer.getPlayers())
{
if (player != null)
{
addCosmetics(null, player);
UtilPlayer.message(caller, F.main("Unlock Cosmetics", "Added all the cosmetics to " + F.name(player.getName()) + "!"));
}
}
}
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()) + "!"));
}
}
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
package mineplex.core.gadget.gadgets.arrowtrail.freedom;
package mineplex.core.gadget.gadgets.arrowtrail;
import java.awt.Color;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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