Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-11-08 17:20:24 +01:00
Allow packets to be transformed after sent by specifying the current protocol, woo!
Dieser Commit ist enthalten in:
Ursprung
c57d0f60f9
Commit
d6edec3a55
@ -3,18 +3,24 @@ package us.myles.ViaVersion.api;
|
|||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
import lombok.Data;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import us.myles.ViaVersion.api.data.UserConnection;
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
|
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||||
import us.myles.ViaVersion.api.remapper.ValueCreator;
|
import us.myles.ViaVersion.api.remapper.ValueCreator;
|
||||||
import us.myles.ViaVersion.api.type.Type;
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
import us.myles.ViaVersion.api.type.TypeConverter;
|
import us.myles.ViaVersion.api.type.TypeConverter;
|
||||||
import us.myles.ViaVersion.exception.InformativeException;
|
import us.myles.ViaVersion.exception.InformativeException;
|
||||||
import us.myles.ViaVersion.handlers.ViaDecodeHandler;
|
import us.myles.ViaVersion.handlers.ViaDecodeHandler;
|
||||||
|
import us.myles.ViaVersion.packets.Direction;
|
||||||
|
import us.myles.ViaVersion.packets.State;
|
||||||
|
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
||||||
import us.myles.ViaVersion.util.PipelineUtil;
|
import us.myles.ViaVersion.util.PipelineUtil;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -250,10 +256,44 @@ public class PacketWrapper {
|
|||||||
* Be careful not to send packets twice.
|
* Be careful not to send packets twice.
|
||||||
* (Sends it after current)
|
* (Sends it after current)
|
||||||
*
|
*
|
||||||
|
* @param packetProtocol - The protocol version of the packet.
|
||||||
* @throws Exception if it fails to write
|
* @throws Exception if it fails to write
|
||||||
*/
|
*/
|
||||||
|
public void send(Class<? extends Protocol> packetProtocol) throws Exception {
|
||||||
|
if (!isCancelled()) {
|
||||||
|
// Apply current pipeline
|
||||||
|
List<Protocol> protocols = new ArrayList<>(user().get(ProtocolInfo.class).getPipeline().pipes());
|
||||||
|
// Other way if outgoing
|
||||||
|
Collections.reverse(protocols);
|
||||||
|
int index = 0;
|
||||||
|
for (int i = 0; i < protocols.size(); i++) {
|
||||||
|
if (protocols.get(i).getClass().equals(packetProtocol)) {
|
||||||
|
index = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Apply other protocols
|
||||||
|
apply(Direction.OUTGOING, user().get(ProtocolInfo.class).getState(), index, protocols);
|
||||||
|
// Send
|
||||||
|
ByteBuf output = inputBuffer == null ? Unpooled.buffer() : inputBuffer.alloc().buffer();
|
||||||
|
writeToBuffer(output);
|
||||||
|
user().sendRawPacket(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send this packet to the associated user.
|
||||||
|
* Be careful not to send packets twice.
|
||||||
|
* (Sends it after current)
|
||||||
|
* <br />
|
||||||
|
* <b>This method is no longer used, it's favoured to use send(Protocol) as it will handle the pipeline properly.</b>
|
||||||
|
*
|
||||||
|
* @throws Exception if it fails to write
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public void send() throws Exception {
|
public void send() throws Exception {
|
||||||
if (!isCancelled()) {
|
if (!isCancelled()) {
|
||||||
|
// Send
|
||||||
ByteBuf output = inputBuffer == null ? Unpooled.buffer() : inputBuffer.alloc().buffer();
|
ByteBuf output = inputBuffer == null ? Unpooled.buffer() : inputBuffer.alloc().buffer();
|
||||||
writeToBuffer(output);
|
writeToBuffer(output);
|
||||||
user().sendRawPacket(output);
|
user().sendRawPacket(output);
|
||||||
@ -284,6 +324,26 @@ public class PacketWrapper {
|
|||||||
return wrapper;
|
return wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies a pipeline from an index to the wrapper
|
||||||
|
*
|
||||||
|
* @param direction The direction
|
||||||
|
* @param state The state
|
||||||
|
* @param index The index to start from
|
||||||
|
* @param pipeline The pipeline
|
||||||
|
* @return The current packetwrapper
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public PacketWrapper apply(Direction direction, State state, int index, List<Protocol> pipeline) throws Exception {
|
||||||
|
for (int i = index; i < pipeline.size(); i++) { // Copy to prevent from removal.
|
||||||
|
pipeline.get(i).transform(direction, state, this);
|
||||||
|
// Reset the reader for the packetWrapper (So it can be recycled across packets)
|
||||||
|
resetReader();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancel this packet from sending
|
* Cancel this packet from sending
|
||||||
*/
|
*/
|
||||||
|
@ -69,11 +69,9 @@ public class ProtocolPipeline extends Protocol {
|
|||||||
if (direction == Direction.OUTGOING)
|
if (direction == Direction.OUTGOING)
|
||||||
Collections.reverse(protocols);
|
Collections.reverse(protocols);
|
||||||
|
|
||||||
for (Protocol protocol : protocols) { // Copy to prevent from removal.
|
// Apply protocols
|
||||||
protocol.transform(direction, state, packetWrapper);
|
packetWrapper.apply(direction, state, 0, protocols);
|
||||||
// Reset the reader for the packetWrapper (So it can be recycled across packets)
|
|
||||||
packetWrapper.resetReader();
|
|
||||||
}
|
|
||||||
super.transform(direction, state, packetWrapper);
|
super.transform(direction, state, packetWrapper);
|
||||||
|
|
||||||
if (ViaVersion.getInstance().isDebug()) {
|
if (ViaVersion.getInstance().isDebug()) {
|
||||||
|
@ -75,7 +75,7 @@ public class BlockEntity {
|
|||||||
wrapper.write(Type.POSITION, pos);
|
wrapper.write(Type.POSITION, pos);
|
||||||
wrapper.write(Type.UNSIGNED_BYTE, id);
|
wrapper.write(Type.UNSIGNED_BYTE, id);
|
||||||
wrapper.write(Type.NBT, tag);
|
wrapper.write(Type.NBT, tag);
|
||||||
wrapper.send();
|
wrapper.send(Protocol1_9_1_2TO1_9_3_4.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void updateSign(Position pos, String[] lines, UserConnection connection) throws Exception {
|
private static void updateSign(Position pos, String[] lines, UserConnection connection) throws Exception {
|
||||||
@ -83,6 +83,6 @@ public class BlockEntity {
|
|||||||
wrapper.write(Type.POSITION, pos);
|
wrapper.write(Type.POSITION, pos);
|
||||||
for (String s : lines)
|
for (String s : lines)
|
||||||
wrapper.write(Type.STRING, s);
|
wrapper.write(Type.STRING, s);
|
||||||
wrapper.send();
|
wrapper.send(Protocol1_9_1_2TO1_9_3_4.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ public class DeathListener implements Listener {
|
|||||||
wrapper.write(Type.VAR_INT, p.getEntityId());
|
wrapper.write(Type.VAR_INT, p.getEntityId());
|
||||||
wrapper.write(Type.INT, p.getEntityId());
|
wrapper.write(Type.INT, p.getEntityId());
|
||||||
Protocol1_9TO1_8.FIX_JSON.write(wrapper, msg);
|
Protocol1_9TO1_8.FIX_JSON.write(wrapper, msg);
|
||||||
wrapper.send();
|
wrapper.send(Protocol1_9TO1_8.class);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
wrapper.clearInputBuffer();
|
wrapper.clearInputBuffer();
|
||||||
|
@ -57,7 +57,7 @@ public class EntityPackets {
|
|||||||
passengerPacket.write(Type.VAR_INT_ARRAY, new Integer[]{passenger});
|
passengerPacket.write(Type.VAR_INT_ARRAY, new Integer[]{passenger});
|
||||||
tracker.getVehicleMap().put(passenger, vehicle);
|
tracker.getVehicleMap().put(passenger, vehicle);
|
||||||
}
|
}
|
||||||
passengerPacket.send(); // Send the packet
|
passengerPacket.send(Protocol1_9TO1_8.class); // Send the packet
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ public class InventoryPackets {
|
|||||||
wrapper.write(Type.SHORT, property);
|
wrapper.write(Type.SHORT, property);
|
||||||
wrapper.write(Type.SHORT, enchantID);
|
wrapper.write(Type.SHORT, enchantID);
|
||||||
}
|
}
|
||||||
}).send();
|
}).send(Protocol1_9TO1_8.class);
|
||||||
|
|
||||||
wrapper.set(Type.SHORT, 0, (short) (property + 3));
|
wrapper.set(Type.SHORT, 0, (short) (property + 3));
|
||||||
wrapper.set(Type.SHORT, 1, level);
|
wrapper.set(Type.SHORT, 1, level);
|
||||||
@ -230,7 +230,7 @@ public class InventoryPackets {
|
|||||||
wrapper.write(Type.SHORT, slot);
|
wrapper.write(Type.SHORT, slot);
|
||||||
wrapper.write(Type.SHORT, (short) -1);
|
wrapper.write(Type.SHORT, (short) -1);
|
||||||
}
|
}
|
||||||
}).send();
|
}).send(Protocol1_9TO1_8.class);
|
||||||
// Finally reset to simulate throwing item
|
// Finally reset to simulate throwing item
|
||||||
wrapper.set(Type.SHORT, 0, (short) -999); // Set slot to -999
|
wrapper.set(Type.SHORT, 0, (short) -999); // Set slot to -999
|
||||||
}
|
}
|
||||||
@ -285,7 +285,7 @@ public class InventoryPackets {
|
|||||||
wrapper.write(Type.SHORT, slot);
|
wrapper.write(Type.SHORT, slot);
|
||||||
wrapper.write(Type.SHORT, (short) -1);
|
wrapper.write(Type.SHORT, (short) -1);
|
||||||
}
|
}
|
||||||
}).send();
|
}).send(Protocol1_9TO1_8.class);
|
||||||
// Finally reset to simulate throwing item
|
// Finally reset to simulate throwing item
|
||||||
wrapper.set(Type.BYTE, 0, (byte) 0); // Set button to 0
|
wrapper.set(Type.BYTE, 0, (byte) 0); // Set button to 0
|
||||||
wrapper.set(Type.BYTE, 1, (byte) 0); // Set mode to 0
|
wrapper.set(Type.BYTE, 1, (byte) 0); // Set mode to 0
|
||||||
|
@ -107,12 +107,12 @@ public class SpawnPackets {
|
|||||||
Item item = new Item((short) Material.POTION.getId(), (byte) 1, (short) data, null);
|
Item item = new Item((short) Material.POTION.getId(), (byte) 1, (short) data, null);
|
||||||
ItemRewriter.toClient(item); // Rewrite so that it gets the right nbt
|
ItemRewriter.toClient(item); // Rewrite so that it gets the right nbt
|
||||||
// TEMP FIX FOR POTIONS UNTIL WE FIGURE OUT HOW TO TRANSFORM SENT PACKETS
|
// TEMP FIX FOR POTIONS UNTIL WE FIGURE OUT HOW TO TRANSFORM SENT PACKETS
|
||||||
Metadata potion = new Metadata(wrapper.user().get(ProtocolInfo.class).getPipeline().contains(Protocol1_10To1_9_3_4.class) ? 6 : 5, NewType.Slot.getTypeID(), Type.ITEM, item);
|
Metadata potion = new Metadata(5, NewType.Slot.getTypeID(), Type.ITEM, item);
|
||||||
meta.add(potion);
|
meta.add(potion);
|
||||||
wrapper.write(Protocol1_9TO1_8.METADATA_LIST, meta);
|
wrapper.write(Protocol1_9TO1_8.METADATA_LIST, meta);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
metaPacket.send();
|
metaPacket.send(Protocol1_9TO1_8.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -305,7 +305,7 @@ public class SpawnPackets {
|
|||||||
packet.write(Type.VAR_INT, 0);
|
packet.write(Type.VAR_INT, 0);
|
||||||
packet.write(Type.ITEM, new Item(item, (byte) 1, (short) 0, null));
|
packet.write(Type.ITEM, new Item(item, (byte) 1, (short) 0, null));
|
||||||
try {
|
try {
|
||||||
packet.send();
|
packet.send(Protocol1_9TO1_8.class);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ public class EntityTracker extends StoredObject {
|
|||||||
wrapper.write(Type.VAR_INT, 1); // slot
|
wrapper.write(Type.VAR_INT, 1); // slot
|
||||||
wrapper.write(Type.ITEM, item);
|
wrapper.write(Type.ITEM, item);
|
||||||
try {
|
try {
|
||||||
wrapper.send();
|
wrapper.send(Protocol1_9TO1_8.class);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -258,7 +258,7 @@ public class EntityTracker extends StoredObject {
|
|||||||
}
|
}
|
||||||
teamExists = b;
|
teamExists = b;
|
||||||
try {
|
try {
|
||||||
wrapper.send();
|
wrapper.send(Protocol1_9TO1_8.class);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -281,7 +281,7 @@ public class EntityTracker extends StoredObject {
|
|||||||
handleMetadata(entityID, metadataBuffer.get(entityID));
|
handleMetadata(entityID, metadataBuffer.get(entityID));
|
||||||
if (metadataBuffer.get(entityID).size() > 0) {
|
if (metadataBuffer.get(entityID).size() > 0) {
|
||||||
try {
|
try {
|
||||||
wrapper.send();
|
wrapper.send(Protocol1_9TO1_8.class);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren