[CHORE] Backport from 1.20.3

This commit is contained in:
2024-01-02 00:14:41 +02:00
parent dfa8a3d55f
commit 556dd63c8f
20 changed files with 88 additions and 142 deletions

View File

@@ -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
}

View File

@@ -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;
}
}

View File

@@ -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"