add commands

This commit is contained in:
Sen 2025-06-04 16:07:20 +02:00
parent 9b0d7bcb72
commit 0732d9edff
Signed by: sen
GPG key ID: 3AC50A6F47D1B722
35 changed files with 366 additions and 95 deletions

View file

@ -375,16 +375,33 @@ public class Proxy {
return this.users.get(user.toLowerCase(Locale.US));
}
public void setUser(String user, User password) {
this.users.put(user.toLowerCase(Locale.US), password);
public void setUser(User usr) {
this.users.put(usr.getUsername().toLowerCase(Locale.US), usr);
}
public void deleteUser(String user) {
user = user.toLowerCase(Locale.US);
this.users.remove(user);
this.players.remove(user);
}
public void setLoggedIn(String user, ProxyHandler handler) {
this.players.put(user.toLowerCase(Locale.US), handler);
user = user.toLowerCase(Locale.US);
User usr = this.users.remove(user);
if(usr != null)
handler.copyFrom(usr);
this.users.put(user, handler);
this.players.put(user, handler);
}
public void setLoggedOut(String user) {
this.players.remove(user.toLowerCase(Locale.US));
user = user.toLowerCase(Locale.US);
ProxyHandler handler = this.players.remove(user);
if(handler != null) {
User usr = new User(handler.getUsername());
usr.copyFrom(handler);
this.users.put(user, usr);
}
}
public boolean isLoggedIn(String user) {
@ -404,6 +421,10 @@ public class Proxy {
private void registerCommands() {
this.register(new CommandHelp());
this.register(new CommandExit());
this.register(new CommandAdmin());
this.register(new CommandRevoke());
this.register(new CommandRegister());
this.register(new CommandDelete());
}
public Map<String, Command> getCommands() {
@ -414,6 +435,26 @@ public class Proxy {
return this.players.values();
}
public List<String> getPlayerNames() {
List<String> list = Lists.newArrayList();
for(ProxyHandler player : this.players.values()) {
list.add(player.getUsername());
}
return list;
}
public Collection<User> getUsers() {
return this.users.values();
}
public List<String> getUserNames() {
List<String> list = Lists.newArrayList();
for(User user : this.users.values()) {
list.add(user.getUsername());
}
return list;
}
public void shutdown() {
this.running = false;
}
@ -445,7 +486,16 @@ public class Proxy {
player.sendMessage(Formatter.DARK_RED + "Internal error trying to execute command");
Log.error(t, "Could not execute '%s'" + (player != null ? " as %s" : ""), line, player != null ? player.getUsername() : null);
}
if(player != null)
if(player != null) {
int redacted = cmd.getRedactedLogArg(argv.length);
if(redacted >= 0 && redacted < argv.length) {
StringBuilder sb = new StringBuilder("/vproxy " + cmd.getName());
for(int z = 0; z < argv.length && z < redacted; z++) {
sb.append(' ').append(argv[z]);
}
line = sb.append(" [<redacted> ...]").toString();
}
Log.info("%s executed: %s", player.getUsername(), line);
}
}
}

View file

@ -15,15 +15,26 @@ public abstract class Command {
public Iterable<String> complete(Proxy proxy, ProxyHandler player, String[] args) {
return null;
}
public int getRedactedLogArg(int args) {
return -1;
}
protected static void sendMessage(ProxyHandler player, String msg) {
if(player != null)
player.sendMessage(Formatter.DARK_PURPLE + msg);
player.sendMessage(msg);
else
Log.info(msg);
Log.info(Formatter.strip(msg));
}
protected static void sendMessage(ProxyHandler player, String fmt, Object ... args) {
sendMessage(player, String.format(fmt, args));
}
protected static void sendInfo(ProxyHandler player, String msg) {
sendMessage(player, Formatter.LIGHT_PURPLE + msg);
}
protected static void sendInfo(ProxyHandler player, String fmt, Object ... args) {
sendInfo(player, String.format(fmt, args));
}
}

View file

@ -0,0 +1,49 @@
package proxy.command;
import com.google.common.collect.Collections2;
import proxy.Proxy;
import proxy.network.ProxyHandler;
import proxy.util.Formatter;
import proxy.util.User;
public class CommandAdmin extends Command {
public String getName() {
return "admin";
}
public String getHelp() {
return "Makes a user an admin or lists admins";
}
public String getArgs() {
return "[username]";
}
public void run(Proxy proxy, ProxyHandler player, String[] args) {
if(args.length == 0) {
int cnt = 0;
for(User user : proxy.getUsers()) {
if(user.isAdmin()) {
sendMessage(player, Formatter.GREEN + user.getUsername());
cnt++;
}
}
sendMessage(player, (cnt == 0 ? Formatter.GRAY + "No admins" : Formatter.DARK_GREEN + (cnt == 1 ? "1 admin" : "%d admins")) + " on this proxy", cnt);
return;
}
User user = proxy.getUser(args[0]);
if(user == null)
throw new RunException("'%s' is not registered", args[0]);
if(user.isAdmin())
throw new RunException("%s is already an admin", user.getUsername());
user.setAdmin(true);
if(user.isOnline())
((ProxyHandler)user).sendMessage(Formatter.GOLD + "You were given proxy admin privileges");
sendInfo(player, "%s is now an admin", user.getUsername());
}
public Iterable<String> complete(Proxy proxy, ProxyHandler player, String[] args) {
return args.length == 1 ? Collections2.filter(proxy.getUserNames(), user -> !proxy.getUser(user).isAdmin()) : null;
}
}

View file

@ -0,0 +1,39 @@
package proxy.command;
import com.google.common.collect.Collections2;
import proxy.Proxy;
import proxy.network.ProxyHandler;
import proxy.util.User;
public class CommandDelete extends Command {
public String getName() {
return "delete";
}
public String getHelp() {
return "Deletes a users profile (console only for admins)";
}
public String getArgs() {
return "<username>";
}
public void run(Proxy proxy, ProxyHandler player, String[] args) {
if(args.length < 1)
throw new RunException("Please provide a username");
User user = proxy.getUser(args[0]);
if(user == null)
throw new RunException("'%s' is not registered", args[0]);
if(player != null && user.isAdmin())
throw new RunException("Only the console can delete users with admin status");
if(user.isOnline())
((ProxyHandler)user).disconnect("Your profile was deleted");
proxy.deleteUser(user.getUsername());
sendInfo(player, "The profile of %s was deleted", user.getUsername());
}
public Iterable<String> complete(Proxy proxy, ProxyHandler player, String[] args) {
return args.length == 1 ? Collections2.filter(proxy.getUserNames(), user -> !proxy.getUser(user).isAdmin()) : null;
}
}

View file

@ -4,6 +4,7 @@ import java.util.Locale;
import proxy.Proxy;
import proxy.network.ProxyHandler;
import proxy.util.Formatter;
public class CommandHelp extends Command {
public String getName() {
@ -20,7 +21,8 @@ public class CommandHelp extends Command {
private static String formatCommand(Command cmd, boolean prefix) {
String args = cmd.getArgs();
return (prefix ? "/vproxy " : "") + cmd.getName() + (args == null || args.isEmpty() ? "" : " " + args);
return (prefix ? Formatter.DARK_GRAY + "/" + Formatter.DARK_GREEN + "vproxy " : "") + Formatter.AQUA + cmd.getName() + (args == null || args.isEmpty() ? "" : Formatter.GREEN + " " + args)
+ Formatter.GRAY + " - " + Formatter.YELLOW + cmd.getHelp();
}
public void run(Proxy proxy, ProxyHandler player, String[] args) {

View file

@ -0,0 +1,52 @@
package proxy.command;
import proxy.Proxy;
import proxy.network.ProxyHandler;
import proxy.util.Formatter;
import proxy.util.User;
public class CommandRegister extends Command {
public String getName() {
return "register";
}
public String getHelp() {
return "Registers a new user or lists users";
}
public String getArgs() {
return "<username> <password>";
}
public int getRedactedLogArg(int args) {
return 1;
}
public void run(Proxy proxy, ProxyHandler player, String[] args) {
if(args.length == 0) {
int cnt = proxy.getUsers().size();
for(User user : proxy.getUsers()) {
sendMessage(player, (user.isAdmin() ? Formatter.GOLD : Formatter.GREEN) + user.getUsername());
}
sendMessage(player, (cnt == 0 ? Formatter.GRAY + "No users" : Formatter.DARK_GREEN + (cnt == 1 ? "1 user" : "%d users")) + " on this proxy", cnt);
return;
}
if(args.length < 2)
throw new RunException("Please provide a username and a password");
if(!Formatter.isValidUser(args[0]))
throw new RunException("'%s' is not a valid username", args[0]);
else if(args[0].length() < 3)
throw new RunException("Username too short, length must be between 3-16 characters");
else if(args[0].length() > 16)
throw new RunException("Username too long, length must be between 3-16 characters");
User user = proxy.getUser(args[0]);
if(user != null)
throw new RunException("%s is already registered", user.getUsername());
if(args[1].isEmpty() || args[1].length() < proxy.getMinimumPasswordLength())
throw new RunException("Password too short, length must be between %d-32 characters", proxy.getMinimumPasswordLength());
else if(args[1].length() > 32)
throw new RunException("Password too long, length must be between %d-32 characters", proxy.getMinimumPasswordLength());
proxy.setUser(User.createUser(args[0], args[1]));
sendInfo(player, "%s was successfully registered", args[0]);
}
}

View file

@ -0,0 +1,36 @@
package proxy.command;
import proxy.Proxy;
import proxy.network.ProxyHandler;
import proxy.util.Formatter;
import proxy.util.User;
public class CommandRevoke extends Command {
public String getName() {
return "revoke";
}
public String getHelp() {
return "Removes a users admin status (console only)";
}
public String getArgs() {
return "<username>";
}
public void run(Proxy proxy, ProxyHandler player, String[] args) {
if(player != null)
throw new RunException("Only the console can revoke admin status");
if(args.length < 1)
throw new RunException("Please provide a username");
User user = proxy.getUser(args[0]);
if(user == null)
throw new RunException("'%s' is not registered", args[0]);
if(!user.isAdmin())
throw new RunException("%s is not an admin", user.getUsername());
user.setAdmin(false);
if(user.isOnline())
((ProxyHandler)user).sendMessage(Formatter.RED + "Your admin privileges were revoked");
sendInfo(player, "%s is no longer an admin", user.getUsername());
}
}

View file

@ -8,6 +8,7 @@ import proxy.packet.L01PacketEncryptionResponse;
import proxy.packet.R00PacketDisconnect;
import proxy.packet.R02PacketLoginSuccess;
import proxy.packet.R03PacketEnableCompression;
import proxy.util.Formatter;
import proxy.util.Log;
public class LoginHandler implements Handler {
@ -22,15 +23,6 @@ public class LoginHandler implements Handler {
private int timer;
private String username;
private static boolean isValidUser(String name) {
for(int z = 0; z < name.length(); z++) {
char ch = name.charAt(z);
if((ch < '0' || ch > '9') && (ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z') && ch != '_')
return false;
}
return true;
}
public LoginHandler(Proxy proxy, Connection connection) {
this.proxy = proxy;
this.connection = connection;
@ -91,7 +83,7 @@ public class LoginHandler implements Handler {
if(this.state != LoginState.INIT)
throw new IllegalStateException("Unexpected hello packet");
this.username = packet.getProfile();
if(this.username.length() < 3 || this.username.length() > 16 || !isValidUser(this.username)) {
if(this.username.length() < 3 || this.username.length() > 16 || !Formatter.isValidUser(this.username)) {
this.disconnect("Invalid username");
return;
}

View file

@ -22,7 +22,7 @@ import proxy.util.User;
import proxy.util.Stack;
import proxy.util.Log;
public class ProxyHandler implements Handler {
public class ProxyHandler extends User implements Handler {
public class ProxyLoginHandler implements Handler {
public void handleEncryptionRequest(R01PacketEncryptionRequest packetIn) {
ProxyHandler.this.server.closeChannel("Online mode auth request received");
@ -59,7 +59,6 @@ public class ProxyHandler implements Handler {
private final Proxy proxy;
private final Connection client;
private final String username;
private Connection server;
@ -73,7 +72,6 @@ public class ProxyHandler implements Handler {
private boolean wasClosed;
private volatile int signPreloaded;
private String completion;
private boolean admin;
private static boolean isAllowedChar(char ch) {
return ch != 167 && ch >= 32 && ch != 127;
@ -99,9 +97,9 @@ public class ProxyHandler implements Handler {
}
public ProxyHandler(Proxy proxy, Connection client, String username) {
super(username);
this.proxy = proxy;
this.client = client;
this.username = username;
}
public String getUsername() {
@ -172,6 +170,10 @@ public class ProxyHandler implements Handler {
}
});
}
public boolean isOnline() {
return true;
}
private void connectToServer() {
this.proxy.setLoggedIn(this.username, this);
@ -275,9 +277,8 @@ public class ProxyHandler implements Handler {
Formatter.DARK_RED + "" + this.proxy.getMinimumPasswordLength() + "-32 characters");
}
else {
this.proxy.setUser(this.username, User.createUser(this.username, password));
this.proxy.setUser(User.createUser(this.username, password));
Log.info("%s registered with password", this.username);
this.admin = true; //false;
this.connectToServer();
}
}
@ -289,13 +290,16 @@ public class ProxyHandler implements Handler {
this.setSign(Formatter.DARK_RED + "" + Formatter.UNDERLINE + "Wrong password", Formatter.DARK_RED + "Please try again");
Log.info("%s failed password attempt %d/%d", this.username, this.passwordAttempts, this.proxy.getMaximumPasswordAttempts());
}
else if(this.proxy.isCheckingCase() && !stored.getName().equals(this.username)) {
this.disconnect("You used the wrong username casing, please use '" + stored.getName() + "' exactly");
else if(this.proxy.isCheckingCase() && !stored.getUsername().equals(this.username)) {
this.disconnect("You used the wrong username casing, please use '" + stored.getUsername() + "' exactly");
Log.info("%s tried to use a different username casing", this.username);
}
else if(this.proxy.getPlayer(this.username) != null) {
this.disconnect("You are already logged in");
Log.info("%s was already logged in from another client", this.username);
}
else {
Log.info("%s logged in with password", this.username);
this.admin = true; //stored.isAdmin();
this.connectToServer();
}
}
@ -387,6 +391,7 @@ public class ProxyHandler implements Handler {
for(ProxyHandler player : this.proxy.getPlayers()) {
player.sendToClient(new S02PacketChat(msg, (byte)1));
}
Log.info(Formatter.strip(msg));
}
}
}
@ -849,7 +854,7 @@ public class ProxyHandler implements Handler {
}
public void handleCombatEvent(S42PacketCombatEvent packetIn) {
this.sendToClient(packetIn);
// this.sendToClient(packetIn);
}
public void handleServerDifficulty(S41PacketServerDifficulty packetIn) {

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class C02PacketUseEntity implements Packet<ProxyHandler>
public class C02PacketUseEntity extends EntityIdPacketServer implements Packet<ProxyHandler>
{
private int entityId;
private C02PacketUseEntity.Action action;
private float hitX;
private float hitY;

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class C0BPacketEntityAction implements Packet<ProxyHandler>
public class C0BPacketEntityAction extends EntityIdPacketServer implements Packet<ProxyHandler>
{
private int entityID;
private C0BPacketEntityAction.Action action;
private int auxData;
@ -17,7 +16,7 @@ public class C0BPacketEntityAction implements Packet<ProxyHandler>
*/
public void readPacketData(PacketBuffer buf) throws IOException
{
this.entityID = buf.readVarIntFromBuffer();
this.entityId = buf.readVarIntFromBuffer();
this.action = (C0BPacketEntityAction.Action)buf.readEnumValue(C0BPacketEntityAction.Action.class);
this.auxData = buf.readVarIntFromBuffer();
}
@ -27,7 +26,7 @@ public class C0BPacketEntityAction implements Packet<ProxyHandler>
*/
public void writePacketData(PacketBuffer buf) throws IOException
{
buf.writeVarIntToBuffer(this.entityID);
buf.writeVarIntToBuffer(this.entityId);
buf.writeEnumValue(this.action);
buf.writeVarIntToBuffer(this.auxData);
}

View file

@ -0,0 +1,10 @@
package proxy.packet;
public class EntityIdPacketClient {
protected int entityId;
public void replaceEntityId(int real, int spoofed) {
if(this.entityId == real)
this.entityId = spoofed;
}
}

View file

@ -0,0 +1,10 @@
package proxy.packet;
public class EntityIdPacketServer {
protected int entityId;
public void replaceEntityId(int real, int spoofed) {
if(this.entityId == spoofed)
this.entityId = real;
}
}

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S01PacketJoinGame implements Packet<ProxyHandler>
public class S01PacketJoinGame extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private boolean hardcoreMode;
private byte gameType;
private int dimension;

View file

@ -7,9 +7,8 @@ import proxy.network.Packet;
import proxy.network.PacketBuffer;
import proxy.util.Stack;
public class S04PacketEntityEquipment implements Packet<ProxyHandler>
public class S04PacketEntityEquipment extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityID;
private int equipmentSlot;
private Stack itemStack;
@ -18,7 +17,7 @@ public class S04PacketEntityEquipment implements Packet<ProxyHandler>
*/
public void readPacketData(PacketBuffer buf) throws IOException
{
this.entityID = buf.readVarIntFromBuffer();
this.entityId = buf.readVarIntFromBuffer();
this.equipmentSlot = buf.readShort();
this.itemStack = buf.readStack();
}
@ -28,7 +27,7 @@ public class S04PacketEntityEquipment implements Packet<ProxyHandler>
*/
public void writePacketData(PacketBuffer buf) throws IOException
{
buf.writeVarIntToBuffer(this.entityID);
buf.writeVarIntToBuffer(this.entityId);
buf.writeShort(this.equipmentSlot);
buf.writeStack(this.itemStack);
}

View file

@ -7,9 +7,8 @@ import proxy.network.Packet;
import proxy.network.PacketBuffer;
import proxy.util.Vec3;
public class S0APacketUseBed implements Packet<ProxyHandler>
public class S0APacketUseBed extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int playerID;
private Vec3 bedPos;
/**
@ -17,7 +16,7 @@ public class S0APacketUseBed implements Packet<ProxyHandler>
*/
public void readPacketData(PacketBuffer buf) throws IOException
{
this.playerID = buf.readVarIntFromBuffer();
this.entityId = buf.readVarIntFromBuffer();
this.bedPos = buf.readVector();
}
@ -26,7 +25,7 @@ public class S0APacketUseBed implements Packet<ProxyHandler>
*/
public void writePacketData(PacketBuffer buf) throws IOException
{
buf.writeVarIntToBuffer(this.playerID);
buf.writeVarIntToBuffer(this.entityId);
buf.writeVector(this.bedPos);
}

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S0BPacketAnimation implements Packet<ProxyHandler>
public class S0BPacketAnimation extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private int type;
/**

View file

@ -9,9 +9,8 @@ import proxy.network.Packet;
import proxy.network.PacketBuffer;
import proxy.util.EntityData;
public class S0CPacketSpawnPlayer implements Packet<ProxyHandler>
public class S0CPacketSpawnPlayer extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private UUID playerId;
private int x;
private int y;

View file

@ -6,10 +6,9 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S0DPacketCollectItem implements Packet<ProxyHandler>
public class S0DPacketCollectItem extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int collectedItemEntityId;
private int entityId;
/**
* Reads the raw packet data from the data stream.

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S12PacketEntityVelocity implements Packet<ProxyHandler>
public class S12PacketEntityVelocity extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityID;
private int motionX;
private int motionY;
private int motionZ;
@ -18,7 +17,7 @@ public class S12PacketEntityVelocity implements Packet<ProxyHandler>
*/
public void readPacketData(PacketBuffer buf) throws IOException
{
this.entityID = buf.readVarIntFromBuffer();
this.entityId = buf.readVarIntFromBuffer();
this.motionX = buf.readShort();
this.motionY = buf.readShort();
this.motionZ = buf.readShort();
@ -29,7 +28,7 @@ public class S12PacketEntityVelocity implements Packet<ProxyHandler>
*/
public void writePacketData(PacketBuffer buf) throws IOException
{
buf.writeVarIntToBuffer(this.entityID);
buf.writeVarIntToBuffer(this.entityId);
buf.writeShort(this.motionX);
buf.writeShort(this.motionY);
buf.writeShort(this.motionZ);

View file

@ -8,18 +8,25 @@ import proxy.network.PacketBuffer;
public class S13PacketDestroyEntities implements Packet<ProxyHandler>
{
private int[] entityIDs;
private int[] entityIds;
public void replaceEntityIds(int real, int spoofed) {
for(int z = 0; z < this.entityIds.length; z++) {
if(this.entityIds[z] == real)
this.entityIds[z] = spoofed;
}
}
/**
* Reads the raw packet data from the data stream.
*/
public void readPacketData(PacketBuffer buf) throws IOException
{
this.entityIDs = new int[buf.readVarIntFromBuffer()];
this.entityIds = new int[buf.readVarIntFromBuffer()];
for (int i = 0; i < this.entityIDs.length; ++i)
for (int i = 0; i < this.entityIds.length; ++i)
{
this.entityIDs[i] = buf.readVarIntFromBuffer();
this.entityIds[i] = buf.readVarIntFromBuffer();
}
}
@ -28,11 +35,11 @@ public class S13PacketDestroyEntities implements Packet<ProxyHandler>
*/
public void writePacketData(PacketBuffer buf) throws IOException
{
buf.writeVarIntToBuffer(this.entityIDs.length);
buf.writeVarIntToBuffer(this.entityIds.length);
for (int i = 0; i < this.entityIDs.length; ++i)
for (int i = 0; i < this.entityIds.length; ++i)
{
buf.writeVarIntToBuffer(this.entityIDs[i]);
buf.writeVarIntToBuffer(this.entityIds[i]);
}
}

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S14PacketEntity implements Packet<ProxyHandler>
public class S14PacketEntity extends EntityIdPacketClient implements Packet<ProxyHandler>
{
protected int entityId;
protected byte posX;
protected byte posY;
protected byte posZ;

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S18PacketEntityTeleport implements Packet<ProxyHandler>
public class S18PacketEntityTeleport extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private int posX;
private int posY;
private int posZ;

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S19PacketEntityHeadLook implements Packet<ProxyHandler>
public class S19PacketEntityHeadLook extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private byte yaw;
/**

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S19PacketEntityStatus implements Packet<ProxyHandler>
public class S19PacketEntityStatus extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private byte logicOpcode;
/**

View file

@ -6,12 +6,17 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S1BPacketEntityAttach implements Packet<ProxyHandler>
public class S1BPacketEntityAttach extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int leash;
private int entityId;
private int vehicleEntityId;
public void replaceEntityId(int real, int spoofed) {
super.replaceEntityId(real, spoofed);
if(this.vehicleEntityId == real)
this.vehicleEntityId = spoofed;
}
/**
* Reads the raw packet data from the data stream.
*/

View file

@ -8,9 +8,8 @@ import proxy.network.Packet;
import proxy.network.PacketBuffer;
import proxy.util.EntityData;
public class S1CPacketEntityMetadata implements Packet<ProxyHandler>
public class S1CPacketEntityMetadata extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private List<EntityData> field_149378_b;
/**

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S1DPacketEntityEffect implements Packet<ProxyHandler>
public class S1DPacketEntityEffect extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private byte effectId;
private byte amplifier;
private int duration;

View file

@ -6,9 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S1EPacketRemoveEntityEffect implements Packet<ProxyHandler>
public class S1EPacketRemoveEntityEffect extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private int effectId;
/**

View file

@ -11,9 +11,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S20PacketEntityProperties implements Packet<ProxyHandler>
public class S20PacketEntityProperties extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private final List<S20PacketEntityProperties.Snapshot> field_149444_b = Lists.<S20PacketEntityProperties.Snapshot>newArrayList();
/**

View file

@ -7,9 +7,8 @@ import proxy.network.Packet;
import proxy.network.PacketBuffer;
import proxy.util.Vec3;
public class S25PacketBlockBreakAnim implements Packet<ProxyHandler>
public class S25PacketBlockBreakAnim extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int breakerId;
private Vec3 position;
private int progress;
@ -18,7 +17,7 @@ public class S25PacketBlockBreakAnim implements Packet<ProxyHandler>
*/
public void readPacketData(PacketBuffer buf) throws IOException
{
this.breakerId = buf.readVarIntFromBuffer();
this.entityId = buf.readVarIntFromBuffer();
this.position = buf.readVector();
this.progress = buf.readUnsignedByte();
}
@ -28,7 +27,7 @@ public class S25PacketBlockBreakAnim implements Packet<ProxyHandler>
*/
public void writePacketData(PacketBuffer buf) throws IOException
{
buf.writeVarIntToBuffer(this.breakerId);
buf.writeVarIntToBuffer(this.entityId);
buf.writeVector(this.position);
buf.writeByte(this.progress);
}

View file

@ -6,10 +6,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S43PacketCamera implements Packet<ProxyHandler>
public class S43PacketCamera extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
/**
* Reads the raw packet data from the data stream.
*/

View file

@ -7,9 +7,8 @@ import proxy.network.ProxyHandler;
import proxy.network.Packet;
import proxy.network.PacketBuffer;
public class S49PacketUpdateEntityNBT implements Packet<ProxyHandler>
public class S49PacketUpdateEntityNBT extends EntityIdPacketClient implements Packet<ProxyHandler>
{
private int entityId;
private NbtCompound tagCompound;
/**

View file

@ -90,6 +90,15 @@ public enum Formatter {
return sb.toString();
}
public static boolean isValidUser(String name) {
for(int z = 0; z < name.length(); z++) {
char ch = name.charAt(z);
if((ch < '0' || ch > '9') && (ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z') && ch != '_')
return false;
}
return true;
}
private Formatter(char code) {
this.value = "\u00a7" + code;
}

View file

@ -8,19 +8,22 @@ import java.security.SecureRandom;
public class User {
private static final Charset UTF_8 = Charset.forName("UTF-8");
private final String username;
private final byte[] hash;
private final byte[] salt;
protected final String username;
private boolean admin;
private byte[] hash;
private byte[] salt;
protected boolean admin;
public User(String username, byte[] hash, byte[] salt) {
public User(String username) {
this.username = username;
}
public void setPassword(byte[] hash, byte[] salt) {
this.hash = hash;
this.salt = salt;
}
public String getName() {
public String getUsername() {
return this.username;
}
@ -36,6 +39,16 @@ public class User {
this.admin = admin;
}
public boolean isOnline() {
return false;
}
public void copyFrom(User user) {
this.hash = user.hash;
this.salt = user.salt;
this.admin = user.admin;
}
private static byte[] hashPassword(String pass, byte[] salt) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
@ -53,6 +66,8 @@ public class User {
SecureRandom rand = new SecureRandom();
byte[] salt = new byte[32];
rand.nextBytes(salt);
return new User(user, hashPassword(pass, salt), salt);
User usr = new User(user);
usr.setPassword(hashPassword(pass, salt), salt);
return usr;
}
}