Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce the change of calling the wrong method in NetworkHandler by reducing access #72

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 41 additions & 59 deletions src/main/java/turniplabs/halplibe/helper/network/NetworkHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
public final class NetworkHandler
{
private static final List<Supplier<NetworkMessage>> messagesToRegisterForServer = new LinkedList<>(Collections.singletonList(
MessageIdsNetworkMessage::new
MessageIdsNetworkMessage::new
));

private static final Map<Short, BiConsumer<NetworkMessage.NetworkContext, UniversalPacket>> packetReaders = new HashMap<>();
Expand All @@ -29,15 +29,15 @@ private NetworkHandler()
{
}

public static void setup()
/**
* Register the UniversalPacket class and apply the internal messages map
*
* @apiNote This method is auto managed by Halplibe
*/
public static void internalNetworkHandlerSetup()
{
Packet.addMapping (88, true, true, UniversalPacket.class );

register();
}

public static void register()
{
packetReaders.clear();
packetIds.clear();

Expand All @@ -46,7 +46,12 @@ public static void register()
}
}

public static void receiveUniversalPacket(NetworkMessage.NetworkContext context, UniversalPacket buffer )
/**
* Receive the universal packet
*
* @apiNote This method is auto managed by Halplibe
*/
public static void internalReceiveUniversalPacket(NetworkMessage.NetworkContext context, UniversalPacket buffer )
{
short type = buffer.readShort();

Expand All @@ -55,7 +60,7 @@ public static void receiveUniversalPacket(NetworkMessage.NetworkContext context,
}

packetReaders.get( type )
.accept( context, buffer );
.accept( context, buffer );
}

/**
Expand All @@ -69,26 +74,11 @@ public static void registerNetworkMessage( Supplier<NetworkMessage> factory )
messagesToRegisterForServer.add(factory);
}

/**
* Register a NetworkMessage, and a thread-unsafe handler for it.
*
* @param <T> The type of the NetworkMessage to send.
* @param factory The factory for this type of message.
*/
@SuppressWarnings({"unused"})
public static <T extends NetworkMessage> void addNetworkMessage( Supplier<T> factory )
private static <T extends NetworkMessage> void addNetworkMessage( Supplier<T> factory )
{
registerNetworkMessage((short) packetIds.size(), factory);
}

/**
* Register a NetworkMessage, and a thread-unsafe handler for it.
*
* @param <T> The type of the NetworkMessage to send.
* @param id The identifier for this message type
* @param factory The factory for this type of message.
*/
@SuppressWarnings({"unused"})
private static <T extends NetworkMessage> void registerNetworkMessage( short id, Supplier<T> factory )
{
registerNetworkMessage( id, getType( factory ), buf -> {
Expand All @@ -98,14 +88,6 @@ private static <T extends NetworkMessage> void registerNetworkMessage( short id,
} );
}

/**
* Register a NetworkMessage, and a thread-unsafe handler for it.
*
* @param <T> The type of the NetworkMessage to send.
* @param type The class of the type of message to send.
* @param id The identifier for this message type
* @param decoder The factory for this type of message.
*/
private static <T extends NetworkMessage> void registerNetworkMessage( short id, Class<T> type, Function<UniversalPacket, T> decoder )
{
packetIds.put( type, id );
Expand All @@ -119,7 +101,7 @@ private static <T extends NetworkMessage> void registerNetworkMessage( short id,
private static <T> Class<T> getType( Supplier<T> supplier )
{
return (Class<T>) supplier.get()
.getClass();
.getClass();
}

private static UniversalPacket encode(NetworkMessage message )
Expand Down Expand Up @@ -206,41 +188,41 @@ public static void sendToAllAround(double x, double y, double z, double radius,
}

private static class MessageIdsNetworkMessage implements NetworkMessage{
Map<Class<?>, Short> packetIds;
Map<Class<?>, Short> packetIds;

public MessageIdsNetworkMessage() {}
public MessageIdsNetworkMessage() {}

public MessageIdsNetworkMessage(Map<Class<?>, Short> packetIds) {
this.packetIds = packetIds;
}
public MessageIdsNetworkMessage(Map<Class<?>, Short> packetIds) {
this.packetIds = packetIds;
}

@Override
public void encodeToUniversalPacket(@NotNull UniversalPacket packet) {
packet.writeShort((short) packetIds.size());
@Override
public void encodeToUniversalPacket(@NotNull UniversalPacket packet) {
packet.writeShort((short) packetIds.size());

for (Map.Entry<Class<?>, Short> entry : packetIds.entrySet()) {
packet.writeShort(entry.getValue());
packet.writeString(entry.getKey().getName());
}
for (Map.Entry<Class<?>, Short> entry : packetIds.entrySet()) {
packet.writeShort(entry.getValue());
packet.writeString(entry.getKey().getName());
}
}

@Override
public void decodeFromUniversalPacket(@NotNull UniversalPacket packet) {
this.packetIds = new HashMap<>();
@Override
public void decodeFromUniversalPacket(@NotNull UniversalPacket packet) {
this.packetIds = new HashMap<>();

final short size = packet.readShort();
final short size = packet.readShort();

try {
for (int i = 0; i < size; i++) {
final short id = packet.readShort();
final Class<?> messageClass = Class.forName(packet.readString());
try {
for (int i = 0; i < size; i++) {
final short id = packet.readShort();
final Class<?> messageClass = Class.forName(packet.readString());

this.packetIds.put(messageClass, id);
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
this.packetIds.put(messageClass, id);
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}

@Override
public void handle(NetworkContext context) {
Expand Down Expand Up @@ -272,4 +254,4 @@ public void handle(NetworkContext context) {
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,14 @@ public void handlePacket(PacketHandler packetHandler) {

@Environment(EnvType.SERVER)
private void handlePacketServer(PacketHandler packetHandler) {
NetworkHandler.receiveUniversalPacket(new NetworkMessage.NetworkContext((
NetworkHandler.internalReceiveUniversalPacket(new NetworkMessage.NetworkContext((
(PacketHandlerServerAccessor)packetHandler).getPlayerEntity()
), this);
}

@Environment(EnvType.CLIENT)
private void handlePacketClient() {
NetworkHandler.receiveUniversalPacket(new NetworkMessage.NetworkContext(
NetworkHandler.internalReceiveUniversalPacket(new NetworkMessage.NetworkContext(
Minecraft.getMinecraft().thePlayer
), this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void beforeGameStartEntrypoint(CallbackInfo ci){

@Inject(method = "startGame", at = @At("TAIL"))
public void afterGameStartEntrypoint(CallbackInfo ci){
NetworkHandler.setup();
NetworkHandler.internalNetworkHandlerSetup();
FabricLoader.getInstance().getEntrypoints("afterGameStart", GameStartEntrypoint.class).forEach(GameStartEntrypoint::afterGameStart);
FabricLoader.getInstance().getEntrypoints("afterClientStart", ClientStartEntrypoint.class).forEach(ClientStartEntrypoint::afterClientStart);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public void recipeEntrypoint(CallbackInfoReturnable<Boolean> cir){
public void beforeGameStartEntrypoint(CallbackInfoReturnable<Boolean> cir){
instance = (MinecraftServer)(Object)this;
Global.isServer = true;
NetworkHandler.setup();
NetworkHandler.internalNetworkHandlerSetup();
FabricLoader.getInstance().getEntrypoints("beforeGameStart", GameStartEntrypoint.class).forEach(GameStartEntrypoint::beforeGameStart);
}

Expand Down