Skip to content

Commit

Permalink
Fixed compatibility with synatra connector
Browse files Browse the repository at this point in the history
  • Loading branch information
Sollace committed Oct 31, 2024
1 parent b3a46b0 commit 253ff32
Show file tree
Hide file tree
Showing 17 changed files with 88 additions and 96 deletions.
4 changes: 2 additions & 2 deletions src/main/java/com/minelittlepony/unicopia/Race.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public record Race (
boolean canInteractWithClouds
) implements Affine {
public static final String DEFAULT_ID = "unicopia:unset";
public static final Registry<Race> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race"), DEFAULT_ID);
public static final Registry<Race> COMMAND_REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race/grantable"), DEFAULT_ID);
public static final Registry<Race> REGISTRY = RegistryUtils.createSynced(Unicopia.id("race"), DEFAULT_ID);
public static final Registry<Race> COMMAND_REGISTRY = RegistryUtils.createSynced(Unicopia.id("race/grantable"), DEFAULT_ID);
public static final RegistryKey<? extends Registry<Race>> REGISTRY_KEY = REGISTRY.getKey();
private static final DynamicCommandExceptionType UNKNOWN_RACE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("commands.race.fail", id));
private static final Function<Race, Composite> COMPOSITES = Util.memoize(race -> new Composite(race, null, null));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import net.minecraft.registry.Registry;

public interface Abilities {
Registry<Ability<?>> REGISTRY = RegistryUtils.createSimple(Unicopia.id("abilities"));
Registry<Ability<?>> REGISTRY = RegistryUtils.createSynced(Unicopia.id("abilities"));
PacketCodec<RegistryByteBuf, Ability<?>> PACKET_CODEC = PacketCodecs.registryValue(REGISTRY.getKey());
Map<AbilitySlot, Set<Ability<?>>> BY_SLOT = new EnumMap<>(AbilitySlot.class);
BiFunction<AbilitySlot, Race.Composite, List<Ability<?>>> BY_SLOT_AND_COMPOSITE_RACE = Util.memoize((slot, race) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,16 +149,14 @@ public NbtCompound writeTrackedNbt(WrapperLookup lookup) {
}

@Override
public void read(ByteBuf buffer, WrapperLookup lookup) {
public void read(RegistryByteBuf buffer, WrapperLookup lookup) {
byte contentType = buffer.readByte();
if (contentType == 1) {
readTrackedNbt(PacketCodecs.NBT_COMPOUND.decode(buffer), lookup);
} else {
T spell = this.spell.get();
if (spell != null) {
spell.getDataTracker().load(MsgTrackedValues.TrackerEntries.PACKET_CODEC.decode(
buffer instanceof RegistryByteBuf r ? r : new RegistryByteBuf(buffer, owner.asEntity().getRegistryManager())
), lookup);
spell.getDataTracker().load(MsgTrackedValues.TrackerEntries.PACKET_CODEC.decode(buffer), buffer.getRegistryManager());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,14 @@

public final class SpellType<T extends Spell> implements Affine, SpellPredicate<T> {
public static final Identifier EMPTY_ID = Unicopia.id("none");
public static final SpellType<?> EMPTY_KEY = builder(t -> null).affinity(Affinity.NEUTRAL).color(0xFFFFFF).unobtainable().build(EMPTY_ID);

public static final Registry<SpellType<?>> REGISTRY = RegistryUtils.createSimple(Unicopia.id("spells"));
public static final Registry<SpellType<?>> REGISTRY = RegistryUtils.createSynced(Unicopia.id("spells"), EMPTY_ID.toString());
public static final RegistryKey<? extends Registry<SpellType<?>>> REGISTRY_KEY = REGISTRY.getKey();
public static final Codec<SpellType<?>> CODEC = REGISTRY.getCodec();
public static final PacketCodec<RegistryByteBuf, SpellType<?>> PACKET_CODEC = PacketCodecs.registryValue(REGISTRY_KEY);

public static final SpellType<?> EMPTY_KEY = register(EMPTY_ID.getPath(), builder(t -> null).affinity(Affinity.NEUTRAL).color(0xFFFFFF).unobtainable());

private static final DynamicCommandExceptionType UNKNOWN_SPELL_TYPE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("spell_type.unknown", id));

public static final SpellType<PlacementControlSpell> PLACE_CONTROL_SPELL = register("place_controller", SpellType.<PlacementControlSpell>builder(PlacementControlSpell::new).affinity(Affinity.NEUTRAL).unobtainable().stackable().shape(GemstoneItem.Shape.DONUT));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

public record AfflictionType<T extends Affliction>(Identifier id, MapCodec<T> codec, PacketCodec<? super RegistryByteBuf, T> packetCodec) {
public static final String DEFAULT_ID = "unicopia:apply_status_effect";
public static final Registry<AfflictionType<?>> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("affliction_type"), DEFAULT_ID);
public static final Registry<AfflictionType<?>> REGISTRY = RegistryUtils.createSynced(Unicopia.id("affliction_type"), DEFAULT_ID);
public static final Codec<Affliction> CODEC = CodecUtils.apply(REGISTRY.getCodec()
.dispatch("type", Affliction::getType, AfflictionType::codec), elementCodec -> Codec
.withAlternative(elementCodec, Codec.list(elementCodec), afflictions -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import net.minecraft.registry.tag.FluidTags;

@Pseudo
@Mixin(targets = "net.minecraftforge.common.extensions.IForgeBoat")
@Mixin(targets = "net.neoforged.neoforge.common.extensions.IAbstractBoatExtension")
interface MixinIForgeBoat {
@ModifyVariable(
method = "canBoatInFluid(Lnet/minecraft/fluid/FluidState;)Z",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.minelittlepony.unicopia.mixin.forgified;

import java.util.function.Consumer;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;

import net.minecraft.network.listener.ClientCommonPacketListener;
import net.minecraft.network.packet.Packet;

@Pseudo
@Mixin(targets = "net.neoforged.neoforge.network.bundle.PacketAndPayloadAcceptor")
interface MixinPacketAndPayloadAcceptor<L extends ClientCommonPacketListener> extends Consumer<Packet<? extends L>> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Coerce;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import com.minelittlepony.unicopia.network.track.Trackable;

import net.minecraft.entity.Entity;
import net.minecraft.network.listener.ClientPlayPacketListener;
import net.minecraft.network.packet.Packet;
import net.minecraft.server.network.EntityTrackerEntry;
import net.minecraft.server.network.ServerPlayerEntity;
Expand All @@ -29,8 +29,12 @@ private void unicopia_onTick(CallbackInfo info) {
Trackable.of(entity).getDataTrackers().tick(this::sendSyncPacket);
}

@Inject(method = "sendPackets", at = @At("RETURN"))
private void unicopia_onSendPackets(ServerPlayerEntity player, Consumer<Packet<ClientPlayPacketListener>> sender, CallbackInfo info) {
Trackable.of(entity).getDataTrackers().sendInitial(player, sender);
@SuppressWarnings("unchecked")
@Inject(method = "sendPackets", at = @At("RETURN"), require = 0)
private void unicopia_onSendPackets(ServerPlayerEntity player, @Coerce Object sender, CallbackInfo info) {
// NEO: Consumer<Packet<ClientPlayPacketListener>> replaced with PacketAndPayloadAcceptor<ClientPlayPacketListener>
if (sender instanceof Consumer s) {
Trackable.of(entity).getDataTrackers().sendInitial(player, s);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,14 @@ private void onCopyFrom(ServerPlayerEntity oldPlayer, boolean alive, CallbackInf
get().copyFrom(((Equine.Container<Pony>)oldPlayer).get(), alive);
}

@Inject(method = "trySleep(Lnet/minecraft/util/math/BlockPos;)Lcom/mojang/datafixers/util/Either;", at = @At(
@Inject(method = {
"trySleep(Lnet/minecraft/util/math/BlockPos;)Lcom/mojang/datafixers/util/Either;",
// NEO: https://github.com/neoforged/NeoForge/blob/62eb61a8e0c726faa30eaa3f4998ba1101368ee4/patches/net/minecraft/server/level/ServerPlayer.java.patch#L77
"lambda$0()Lcom/mojang/datafixers/util/Either;"
}, at = @At(
value = "FIELD",
target = "net/minecraft/entity/player/PlayerEntity$SleepFailureReason.NOT_POSSIBLE_NOW:Lnet/minecraft/entity/player/PlayerEntity$SleepFailureReason;"
), cancellable = true)
), cancellable = true, require = 0)
private void onTrySleep(BlockPos pos, CallbackInfoReturnable<Either<PlayerEntity.SleepFailureReason, Unit>> info) {
if (get().getSpecies().isNocturnal() && get().asWorld().getGameRules().getBoolean(UGameRules.DO_NOCTURNAL_BAT_PONIES)) {
((PlayerEntity)this).sendMessage(Text.translatable("block.unicopia.bed.no_sleep.nocturnal"), true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@

import com.minelittlepony.unicopia.util.Untyped;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.network.RegistryByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.codec.PacketCodecs;
import net.minecraft.registry.DynamicRegistryManager;
import net.minecraft.registry.RegistryWrapper.WrapperLookup;

public class DataTracker {
Expand Down Expand Up @@ -86,7 +87,7 @@ public synchronized Optional<MsgTrackedValues.TrackerEntries> getDirtyPairs(Wrap
return getInitialPairs(lookup);
}

Map<Integer, ByteBuf> updates = writePersistentObjects(lookup, false);
Map<Integer, byte[]> updates = writePersistentObjects(lookup, false);

if (dirtyIndices.isEmpty() && updates.isEmpty()) {
return Optional.empty();
Expand All @@ -98,21 +99,21 @@ public synchronized Optional<MsgTrackedValues.TrackerEntries> getDirtyPairs(Wrap
for (int i : toSend) {
pairs.add(codecs.get(i));
}
return Optional.of(new MsgTrackedValues.TrackerEntries(id, false, pairs, Untyped.cast(updates)));
return Optional.of(new MsgTrackedValues.TrackerEntries(id, false, pairs, updates));
}

private Map<Integer, ByteBuf> writePersistentObjects(WrapperLookup lookup, boolean initial) {
Map<Integer, ByteBuf> updates = new HashMap<>();
private Map<Integer, byte[]> writePersistentObjects(WrapperLookup lookup, boolean initial) {
Map<Integer, byte[]> updates = new HashMap<>();
for (int i = 0; i < persistentObjects.size(); i++) {
TrackableObject<?> o = persistentObjects.get(i);
TrackableObject.Status status = initial ? TrackableObject.Status.NEW : o.getStatus();
int id = i;
o.write(status, lookup).ifPresent(data -> updates.put(id, data));
o.write(status, lookup).ifPresent(data -> updates.put(id, data.copy().array()));
}
return updates;
}

public synchronized void load(MsgTrackedValues.TrackerEntries values, WrapperLookup lookup) {
public synchronized void load(MsgTrackedValues.TrackerEntries values, DynamicRegistryManager lookup) {
if (values.wipe()) {
codecs.clear();
codecs.addAll(values.values());
Expand All @@ -129,7 +130,7 @@ public synchronized void load(MsgTrackedValues.TrackerEntries values, WrapperLoo
for (var entry : values.objects().entrySet()) {
TrackableObject<?> o = persistentObjects.get(entry.getKey());
if (o != null) {
o.read(entry.getValue(), lookup);
o.read(new RegistryByteBuf(Unpooled.wrappedBuffer(entry.getValue()), lookup), lookup);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,17 @@
import java.util.function.Supplier;

import com.minelittlepony.unicopia.network.Channel;

import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.entity.Entity;
import net.minecraft.network.listener.ClientPlayPacketListener;
import net.minecraft.network.packet.Packet;
import net.minecraft.registry.RegistryWrapper.WrapperLookup;
import net.minecraft.registry.DynamicRegistryManager;
import net.minecraft.server.network.ServerPlayerEntity;

public class DataTrackerManager {
private final Entity entity;
private final WrapperLookup lookup;
private final DynamicRegistryManager lookup;
final boolean isClient;
private final List<DataTracker> trackers = new ObjectArrayList<>();
private final List<ObjectTracker<?>> objectTrackers = new ObjectArrayList<>();
Expand Down Expand Up @@ -44,13 +45,11 @@ public synchronized DataTracker checkoutTracker() {
packetEmitters.add((sender, initial) -> {
var update = initial ? tracker.getInitialPairs(lookup) : tracker.getDirtyPairs(lookup);
if (update.isPresent()) {
try (var payload = new MsgTrackedValues(
sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(new MsgTrackedValues(
entity.getId(),
Optional.empty(),
update
)) {
sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(payload));
}
)));
}
});
return tracker;
Expand All @@ -62,13 +61,11 @@ public synchronized <T extends TrackableObject<T>> ObjectTracker<T> checkoutTrac
packetEmitters.add((sender, initial) -> {
var update = initial ? tracker.getInitialPairs(lookup) : tracker.getDirtyPairs(lookup);
if (update.isPresent()) {
try (var payload = new MsgTrackedValues(
sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(new MsgTrackedValues(
entity.getId(),
update,
Optional.empty()
)) {
sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(payload));
}
)));
}
});
return tracker;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.minelittlepony.unicopia.network.track;

import java.io.Closeable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
Expand All @@ -10,10 +9,8 @@
import java.util.Set;
import java.util.UUID;

import com.minelittlepony.unicopia.util.serialization.PacketCodecUtils;
import com.sollace.fabwork.api.packets.Handled;

import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.RegistryByteBuf;
Expand All @@ -25,7 +22,7 @@ public record MsgTrackedValues(
int owner,
Optional<TrackerObjects> updatedObjects,
Optional<TrackerEntries> updatedTrackers
) implements Handled<PlayerEntity>, AutoCloseable {
) implements Handled<PlayerEntity> {
public static final PacketCodec<RegistryByteBuf, MsgTrackedValues> PACKET_CODEC = PacketCodec.tuple(
PacketCodecs.INTEGER, MsgTrackedValues::owner,
PacketCodecs.optional(TrackerObjects.PACKET_CODEC), MsgTrackedValues::updatedObjects,
Expand All @@ -35,54 +32,28 @@ public record MsgTrackedValues(

@Override
public void handle(PlayerEntity sender) {
try (this) {
Entity entity = sender.getWorld().getEntityById(owner);
if (entity instanceof Trackable trackable) {
trackable.getDataTrackers().load(this);
}
Entity entity = sender.getWorld().getEntityById(owner);
if (entity instanceof Trackable trackable) {
trackable.getDataTrackers().load(this);
}
}

public record TrackerObjects(int id, Set<UUID> removedValues, Map<UUID, ByteBuf> values) implements Closeable {
public record TrackerObjects(int id, Set<UUID> removedValues, Map<UUID, byte[]> values) {
public static final PacketCodec<RegistryByteBuf, TrackerObjects> PACKET_CODEC = PacketCodec.tuple(
PacketCodecs.INTEGER, TrackerObjects::id,
Uuids.PACKET_CODEC.collect(PacketCodecs.toCollection(HashSet::new)), TrackerObjects::removedValues,
PacketCodecs.map(HashMap::new, Uuids.PACKET_CODEC, PacketCodecUtils.REGISTRY_BUFFER), TrackerObjects::values,
PacketCodecs.map(HashMap::new, Uuids.PACKET_CODEC, PacketCodecs.BYTE_ARRAY), TrackerObjects::values,
TrackerObjects::new
);

@Override
public void close() {
values.values().forEach(buf -> {
if (buf.refCnt() > 0) {
buf.release();
}
});
}
}

public record TrackerEntries(int id, boolean wipe, List<DataTracker.Pair<?>> values, Map<Integer, ByteBuf> objects) implements Closeable {
public record TrackerEntries(int id, boolean wipe, List<DataTracker.Pair<?>> values, Map<Integer, byte[]> objects) {
public static final PacketCodec<RegistryByteBuf, TrackerEntries> PACKET_CODEC = PacketCodec.tuple(
PacketCodecs.INTEGER, TrackerEntries::id,
PacketCodecs.BOOL, TrackerEntries::wipe,
DataTracker.Pair.PACKET_CODEC.collect(PacketCodecs.toCollection(ArrayList::new)), TrackerEntries::values,
PacketCodecs.map(HashMap::new, PacketCodecs.INTEGER, PacketCodecUtils.REGISTRY_BUFFER), TrackerEntries::objects,
PacketCodecs.map(HashMap::new, PacketCodecs.INTEGER, PacketCodecs.BYTE_ARRAY), TrackerEntries::objects,
TrackerEntries::new
);

@Override
public void close() {
objects.values().forEach(buf -> {
if (buf.refCnt() > 0) {
buf.release();
}
});
}
}

@Override
public void close() {
updatedObjects.ifPresent(TrackerObjects::close);
updatedObjects.ifPresent(TrackerObjects::close);
}
}
Loading

0 comments on commit 253ff32

Please sign in to comment.