Syncronize before hacking into the packet list. In addition,
copy over any unprocessed packets into the new list. When we're done, we'll also clean up properly by copying over any remaining packets.
Dieser Commit ist enthalten in:
Ursprung
5a6f3be219
Commit
1710ef343b
@ -214,38 +214,54 @@ class PlayerInjector {
|
|||||||
for (Field field : list.getFields()) {
|
for (Field field : list.getFields()) {
|
||||||
VolatileField overwriter = new VolatileField(field, networkManager, true);
|
VolatileField overwriter = new VolatileField(field, networkManager, true);
|
||||||
|
|
||||||
overwriter.setValue(Collections.synchronizedList(new ArrayList<Packet>() {
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
List<Packet> minecraftList = (List<Packet>) overwriter.getOldValue();
|
||||||
public boolean add(Packet packet) {
|
|
||||||
|
|
||||||
Packet result = null;
|
synchronized(minecraftList) {
|
||||||
|
// The list we'll be inserting
|
||||||
|
List<Packet> hackedList = new ArrayList<Packet>() {
|
||||||
|
@Override
|
||||||
|
public boolean add(Packet packet) {
|
||||||
|
|
||||||
// Check for fake packets and ignored packets
|
Packet result = null;
|
||||||
if (packet instanceof FakePacket) {
|
|
||||||
return true;
|
|
||||||
} else if (ignoredPackets.contains(packet)) {
|
|
||||||
ignoredPackets.remove(packet);
|
|
||||||
} else {
|
|
||||||
result = handlePacketRecieved(packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
// A NULL packet indicate cancelling
|
// Check for fake packets and ignored packets
|
||||||
try {
|
if (packet instanceof FakePacket) {
|
||||||
if (result != null) {
|
return true;
|
||||||
super.add(result);
|
} else if (ignoredPackets.contains(packet)) {
|
||||||
|
ignoredPackets.remove(packet);
|
||||||
} else {
|
} else {
|
||||||
// We'll use the FakePacket marker instead of preventing the filters
|
result = handlePacketRecieved(packet);
|
||||||
sendServerPacket(createNegativePacket(packet), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collection.add contract
|
// A NULL packet indicate cancelling
|
||||||
return true;
|
try {
|
||||||
|
if (result != null) {
|
||||||
|
super.add(result);
|
||||||
|
} else {
|
||||||
|
// We'll use the FakePacket marker instead of preventing the filters
|
||||||
|
sendServerPacket(createNegativePacket(packet), true);
|
||||||
|
}
|
||||||
|
|
||||||
} catch (InvocationTargetException e) {
|
// Collection.add contract
|
||||||
throw new RuntimeException("Reverting cancelled packet failed.", e.getTargetException());
|
return true;
|
||||||
|
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
throw new RuntimeException("Reverting cancelled packet failed.", e.getTargetException());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Add every previously stored packet
|
||||||
|
for (Packet packet : minecraftList) {
|
||||||
|
hackedList.add(packet);
|
||||||
}
|
}
|
||||||
}));
|
|
||||||
|
// Don' keep stale packets around
|
||||||
|
minecraftList.clear();
|
||||||
|
overwriter.setValue(Collections.synchronizedList(hackedList));
|
||||||
|
}
|
||||||
|
|
||||||
overridenLists.add(overwriter);
|
overridenLists.add(overwriter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -341,10 +357,28 @@ class PlayerInjector {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public void cleanupAll() {
|
public void cleanupAll() {
|
||||||
// Clean up
|
// Clean up
|
||||||
for (VolatileField overriden : overridenLists) {
|
for (VolatileField overriden : overridenLists) {
|
||||||
overriden.revertValue();
|
List<Packet> minecraftList = (List<Packet>) overriden.getOldValue();
|
||||||
|
List<Packet> hacketList = (List<Packet>) overriden.getValue();
|
||||||
|
|
||||||
|
if (minecraftList == hacketList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a lock before we modify the list
|
||||||
|
synchronized(hacketList) {
|
||||||
|
try {
|
||||||
|
// Copy over current packets
|
||||||
|
for (Packet packet : (List<Packet>) overriden.getValue()) {
|
||||||
|
minecraftList.add(packet);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
overriden.revertValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
overridenLists.clear();
|
overridenLists.clear();
|
||||||
}
|
}
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren