[CHORE] Backport from 1.20.3
This commit is contained in:
@@ -111,8 +111,8 @@ publisher {
|
||||
versionType = "release"
|
||||
changelog = "https://raw.githubusercontent.com/hypherionmc/changelogs/main/craterlib/changelog-forge.md"
|
||||
version = "${minecraft_version}-${project.version}"
|
||||
displayName = "[FORGE 1.20.2] CraterLib - ${project.version}"
|
||||
gameVersions = ["1.20.2"]
|
||||
displayName = "[FORGE 1.20.1/2] CraterLib - ${project.version}"
|
||||
gameVersions = ["1.20", "1.20.1"]
|
||||
loaders = ["forge"]
|
||||
artifact = remapJar
|
||||
}
|
@@ -5,20 +5,17 @@ import com.hypherionmc.craterlib.core.network.CraterNetworkHandler;
|
||||
import com.hypherionmc.craterlib.core.network.CraterPacket;
|
||||
import com.hypherionmc.craterlib.core.network.PacketDirection;
|
||||
import com.hypherionmc.craterlib.core.platform.ClientPlatform;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.network.protocol.Packet;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraftforge.common.util.LogicalSidedProvider;
|
||||
import net.minecraftforge.event.network.CustomPayloadEvent;
|
||||
import net.minecraftforge.fml.LogicalSide;
|
||||
import net.minecraftforge.network.ChannelBuilder;
|
||||
import net.minecraftforge.network.NetworkDirection;
|
||||
import net.minecraftforge.network.SimpleChannel;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.minecraftforge.network.NetworkRegistry;
|
||||
import net.minecraftforge.network.simple.SimpleChannel;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.BiConsumer;
|
||||
@@ -32,6 +29,7 @@ import java.util.function.Supplier;
|
||||
public class ForgeNetworkHandler implements CraterNetworkHandler {
|
||||
|
||||
private static final Map<String, ForgeNetworkHandler> NETWORK_HANDLERS = Maps.newConcurrentMap();
|
||||
private static final String PROTOCOL = Integer.toString(1);
|
||||
|
||||
private final SimpleChannel channel;
|
||||
|
||||
@@ -41,87 +39,52 @@ public class ForgeNetworkHandler implements CraterNetworkHandler {
|
||||
|
||||
private final AtomicInteger packetID = new AtomicInteger();
|
||||
|
||||
private HashMap<Class<?>, Integer> packetMap = new LinkedHashMap<>();
|
||||
|
||||
private ForgeNetworkHandler(SimpleChannel channel, boolean clientRequired, boolean serverRequired) {
|
||||
this.channel = channel;
|
||||
this.clientRequired = clientRequired;
|
||||
this.serverRequired = serverRequired;
|
||||
}
|
||||
|
||||
public synchronized static CraterNetworkHandler of(String modId, boolean clientRequired, boolean serverRequired) {
|
||||
ForgeNetworkHandler handler = NETWORK_HANDLERS.computeIfAbsent(modId, modId1 -> new ForgeNetworkHandler(buildSimpleChannel(modId1, clientRequired, serverRequired), clientRequired, serverRequired));
|
||||
if (handler.clientRequired != clientRequired)
|
||||
throw new IllegalArgumentException("client channel settings mismatch, expected %s, but was %s".formatted(handler.clientRequired, clientRequired));
|
||||
if (handler.serverRequired != serverRequired)
|
||||
throw new IllegalArgumentException("server channel settings mismatch, expected %s, but was %s".formatted(handler.serverRequired, serverRequired));
|
||||
return handler;
|
||||
}
|
||||
|
||||
private static SimpleChannel buildSimpleChannel(String modId, boolean clientAcceptsVanillaOrMissing, boolean serverAcceptsVanillaOrMissing) {
|
||||
ChannelBuilder builder = ChannelBuilder.named(new ResourceLocation(modId, "crater_network"));
|
||||
|
||||
if (clientAcceptsVanillaOrMissing) {
|
||||
builder = builder.optionalClient();
|
||||
}
|
||||
|
||||
if (serverAcceptsVanillaOrMissing) {
|
||||
builder = builder.optionalServer();
|
||||
}
|
||||
|
||||
return builder.simpleChannel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends CraterPacket<T>> void registerPacket(Class<T> clazz, Supplier<T> supplier, PacketDirection packetDirection) {
|
||||
public <T extends CraterPacket<T>> void registerPacket(Class<? extends T> clazz, Supplier<T> supplier, PacketDirection packetDirection) {
|
||||
BiConsumer<T, FriendlyByteBuf> encoder = CraterPacket::write;
|
||||
Function<FriendlyByteBuf, T> decoder = buf -> {
|
||||
T packet = supplier.get();
|
||||
packet.read(buf);
|
||||
return packet;
|
||||
T packet = supplier.get();
|
||||
packet.read(buf);
|
||||
return packet;
|
||||
};
|
||||
|
||||
BiConsumer<T, CustomPayloadEvent.Context> handler = (packet, sup) -> {
|
||||
BiConsumer<T, Supplier<NetworkEvent.Context>> handler = (packet, sup) -> {
|
||||
NetworkEvent.Context context = sup.get();
|
||||
LogicalSide expectedSide = getSideFromDirection(packetDirection);
|
||||
LogicalSide currentSide = sup.getDirection().getReceptionSide();
|
||||
LogicalSide currentSide = context.getDirection().getReceptionSide();
|
||||
|
||||
if (expectedSide != currentSide) {
|
||||
throw new IllegalStateException(String.format("Received message on wrong side, expected %s, was %s", expectedSide, currentSide));
|
||||
}
|
||||
|
||||
sup.enqueueWork(() -> {
|
||||
context.enqueueWork(() -> {
|
||||
Player player;
|
||||
if (packetDirection == PacketDirection.TO_CLIENT) {
|
||||
player = ClientPlatform.INSTANCE.getClientPlayer();
|
||||
} else {
|
||||
player = sup.getSender();
|
||||
player = context.getSender();
|
||||
}
|
||||
packet.handle(player, LogicalSidedProvider.WORKQUEUE.get(expectedSide));
|
||||
});
|
||||
sup.setPacketHandled(true);
|
||||
context.setPacketHandled(true);
|
||||
};
|
||||
|
||||
int id = packetID.getAndIncrement();
|
||||
packetMap.put(clazz, id);
|
||||
|
||||
this.channel
|
||||
.messageBuilder((Class<T>) clazz, id)
|
||||
.encoder(encoder)
|
||||
.decoder(decoder)
|
||||
.consumerNetworkThread(handler)
|
||||
.add();
|
||||
this.channel.registerMessage(this.packetID.getAndIncrement(), (Class<T>) clazz, encoder, decoder, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Packet<?> toServerBound(CraterPacket<?> packet) {
|
||||
return NetworkDirection.PLAY_TO_SERVER.buildPacket(toBuffer(packet), channel.getName()).getThis();
|
||||
//return this.channel.toVanillaPacket(packet, NetworkDirection.PLAY_TO_SERVER);
|
||||
return this.channel.toVanillaPacket(packet, NetworkDirection.PLAY_TO_SERVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Packet<?> toClientBound(CraterPacket<?> packet) {
|
||||
return NetworkDirection.PLAY_TO_CLIENT.buildPacket(toBuffer(packet), channel.getName()).getThis();
|
||||
//return this.channel.toVanillaPacket(packet, NetworkDirection.PLAY_TO_CLIENT);
|
||||
return this.channel.toVanillaPacket(packet, NetworkDirection.PLAY_TO_CLIENT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -129,16 +92,23 @@ public class ForgeNetworkHandler implements CraterNetworkHandler {
|
||||
CraterNetworkHandler.super.sendToServer(packet);
|
||||
}
|
||||
|
||||
public synchronized static CraterNetworkHandler of(String modId, boolean clientRequired, boolean serverRequired) {
|
||||
ForgeNetworkHandler handler = NETWORK_HANDLERS.computeIfAbsent(modId, modId1 -> new ForgeNetworkHandler(buildSimpleChannel(modId1, clientRequired, serverRequired), clientRequired, serverRequired));
|
||||
if (handler.clientRequired != clientRequired) throw new IllegalArgumentException("client channel settings mismatch, expected %s, but was %s".formatted(handler.clientRequired, clientRequired));
|
||||
if (handler.serverRequired != serverRequired) throw new IllegalArgumentException("server channel settings mismatch, expected %s, but was %s".formatted(handler.serverRequired, serverRequired));
|
||||
return handler;
|
||||
}
|
||||
|
||||
private static SimpleChannel buildSimpleChannel(String modId, boolean clientAcceptsVanillaOrMissing, boolean serverAcceptsVanillaOrMissing) {
|
||||
return NetworkRegistry.ChannelBuilder
|
||||
.named(new ResourceLocation(modId, "crater_network"))
|
||||
.networkProtocolVersion(() -> PROTOCOL)
|
||||
.clientAcceptedVersions(clientAcceptsVanillaOrMissing ? NetworkRegistry.acceptMissingOr(PROTOCOL) : PROTOCOL::equals)
|
||||
.serverAcceptedVersions(serverAcceptsVanillaOrMissing ? NetworkRegistry.acceptMissingOr(PROTOCOL) : PROTOCOL::equals)
|
||||
.simpleChannel();
|
||||
}
|
||||
|
||||
private LogicalSide getSideFromDirection(PacketDirection direction) {
|
||||
return direction == PacketDirection.TO_CLIENT ? LogicalSide.CLIENT : LogicalSide.SERVER;
|
||||
}
|
||||
|
||||
protected FriendlyByteBuf toBuffer(CraterPacket<?> message) {
|
||||
var msg = packetMap.get(message.getClass());
|
||||
|
||||
var ret = new FriendlyByteBuf(Unpooled.buffer());
|
||||
ret.writeVarInt(msg);
|
||||
message.write(ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
modLoader = "javafml"
|
||||
loaderVersion = "[48,)"
|
||||
loaderVersion = "[46,)"
|
||||
license = "MIT"
|
||||
issueTrackerURL = "https://github.com/firstdarkdev/craterLib/issues"
|
||||
|
||||
@@ -19,13 +19,13 @@ displayTest = "MATCH_VERSION"
|
||||
[[dependencies.${mod_id}]]
|
||||
modId = "forge"
|
||||
mandatory = true
|
||||
versionRange = "[48,)"
|
||||
versionRange = "[46,)"
|
||||
ordering = "NONE"
|
||||
side = "BOTH"
|
||||
|
||||
[[dependencies.${mod_id}]]
|
||||
modId = "minecraft"
|
||||
mandatory = true
|
||||
versionRange = "[1.20.2,1.20.3)"
|
||||
versionRange = "[1.20,1.20.2)"
|
||||
ordering = "NONE"
|
||||
side = "BOTH"
|
||||
|
Reference in New Issue
Block a user