Implement basic entity metadata mapping to remap fireworks for boosting.

This commit is contained in:
md_5 2016-12-22 22:29:00 +11:00
parent b728aea382
commit 6104354fa1
3 changed files with 99 additions and 0 deletions

View File

@ -19,6 +19,12 @@
<description>Proxy component of the Elastic Portal Suite</description> <description>Proxy component of the Elastic Portal Suite</description>
<dependencies> <dependencies>
<dependency>
<groupId>com.flowpowered</groupId>
<artifactId>flow-nbt</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>io.netty</groupId> <groupId>io.netty</groupId>
<artifactId>netty-codec-http</artifactId> <artifactId>netty-codec-http</artifactId>

View File

@ -1,7 +1,11 @@
package net.md_5.bungee.entitymap; package net.md_5.bungee.entitymap;
import com.flowpowered.nbt.stream.NBTInputStream;
import com.google.common.base.Throwables;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
import java.io.IOException;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.DefinedPacket;
@ -101,6 +105,91 @@ public abstract class EntityMap
} }
} }
protected static void rewriteMetaVarInt(ByteBuf packet, int oldId, int newId, int metaIndex)
{
int readerIndex = packet.readerIndex();
short index;
while ( ( index = packet.readUnsignedByte() ) != 0xFF )
{
int type = DefinedPacket.readVarInt( packet );
switch ( type )
{
case 0:
packet.skipBytes( 1 ); // byte
break;
case 1:
if ( index == metaIndex )
{
int position = packet.readerIndex();
rewriteVarInt( packet, oldId, newId, position );
packet.readerIndex( position );
}
DefinedPacket.readVarInt( packet );
break;
case 2:
packet.skipBytes( 4 ); // float
break;
case 3:
case 4:
DefinedPacket.readString( packet );
break;
case 5:
if ( packet.readShort() != -1 )
{
packet.skipBytes( 3 ); // byte, short
int position = packet.readerIndex();
if ( packet.readByte() != 0 )
{
packet.readerIndex( position );
try
{
new NBTInputStream( new ByteBufInputStream( packet ), false ).readTag();
} catch ( IOException ex )
{
throw Throwables.propagate( ex );
}
}
}
break;
case 6:
packet.skipBytes( 1 ); // boolean
break;
case 7:
packet.skipBytes( 12 ); // float, float, float
break;
case 8:
packet.readLong();
break;
case 9:
if ( packet.readBoolean() )
{
packet.skipBytes( 8 ); // long
}
break;
case 10:
DefinedPacket.readVarInt( packet );
break;
case 11:
if ( packet.readBoolean() )
{
packet.skipBytes( 16 ); // long, long
}
break;
case 12:
DefinedPacket.readVarInt( packet );
break;
default:
throw new IllegalArgumentException( "Unknown meta type " + type );
}
}
packet.readerIndex( readerIndex );
}
// Handles simple packets // Handles simple packets
private static void rewrite(ByteBuf packet, int oldId, int newId, boolean[] ints, boolean[] varints) private static void rewrite(ByteBuf packet, int oldId, int newId, boolean[] ints, boolean[] varints)
{ {

View File

@ -147,6 +147,10 @@ class EntityMap_1_11 extends EntityMap
rewriteInt( packet, oldId, newId, packet.readerIndex() ); rewriteInt( packet, oldId, newId, packet.readerIndex() );
} }
break; break;
case 0x39 /* EntityMetadata : PacketPlayOutEntityMetadata */:
DefinedPacket.readVarInt( packet ); // Entity ID
rewriteMetaVarInt( packet, oldId, newId, 7 ); // fireworks (et al)
break;
} }
packet.readerIndex( readerIndex ); packet.readerIndex( readerIndex );
} }