Skip to content

Commit

Permalink
Bunch of fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Patbox committed Jul 19, 2024
1 parent 35dca91 commit 89f249c
Show file tree
Hide file tree
Showing 16 changed files with 103 additions and 43 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ fabric_version=0.100.0+1.21

maven_group = eu.pb4

mod_version = 0.9.5
mod_version = 0.9.6

minecraft_version_supported = ">=1.20.5-"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,10 @@ public static <T> T createUnsafe(Class<T> clazz) {
return CommonImplUtils.createUnsafe(clazz);
}

public static boolean isServerNetworkingThreadWithContext() {
return isServerNetworkingThread() && PacketContext.get().getPacketListener() != null;
}

public interface ResourcePackChangeCallback {
void onResourcePackChange(ServerCommonNetworkHandler handler, UUID uuid, boolean oldStatus, boolean newStatus);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class CommonCommands {
))
.append("] ")
).append(Text.literal("[")
.append(Text.literal("Github")
.append(Text.literal("GitHub")
.setStyle(Style.EMPTY.withColor(Formatting.BLUE).withUnderline(true)
.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, CommonImpl.GITHUB_URL))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -544,9 +544,9 @@ public static ItemWithMetadata getItemSafely(PolymerItem item, ItemStack stack,
}

/**
* Marks BlockEntity type as server-side only
* Marks ArmorMaterial as server-side only
*
* @param types BlockEntityTypes
* @param types ArmorMaterials
*/
@SafeVarargs
public static void registerArmorMaterial(RegistryEntry<ArmorMaterial>... types) {
Expand All @@ -558,9 +558,9 @@ public static void registerArmorMaterial(RegistryEntry<ArmorMaterial>... types)
}

/**
* Checks if BlockEntity is server-side only
* Checks if ArmorMaterial is server-side only
*
* @param type BlockEntities type
* @param type ArmorMaterials
*/
public static boolean isPolymerArmorMaterial(RegistryEntry<ArmorMaterial> type) {
return ARMOR_MATERIALS.contains(type.value());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@ public static <T extends EnchantmentLevelBasedValue> MapCodec<T> ofEnchantmentLe
return new PolymerMapCodec<T>(codec, EnchantmentLevelBasedValue.Constant.TYPE_CODEC, new EnchantmentLevelBasedValue.Constant(0));
}

public Object fallbackValue() {
return fallbackValue;
}

public MapCodec<Object> fallbackCodec() {
return fallbackCodec;
}

@Override
public <T1> Stream<T1> keys(DynamicOps<T1> ops) {
return this.selfCodec.keys(ops);
Expand All @@ -53,7 +61,7 @@ public <T1> DataResult<T> decode(DynamicOps<T1> ops, MapLike<T1> input) {

@Override
public <T1> RecordBuilder<T1> encode(T input, DynamicOps<T1> ops, RecordBuilder<T1> prefix) {
if (PolymerCommonUtils.isServerNetworkingThread()) {
if (PolymerCommonUtils.isServerNetworkingThreadWithContext()) {
return this.fallbackCodec.encode(this.fallbackValue, ops, prefix);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package eu.pb4.polymer.core.impl;

import eu.pb4.polymer.common.impl.CommonImplUtils;
import eu.pb4.polymer.common.impl.CompatStatus;
import eu.pb4.polymer.core.api.block.PolymerBlock;
import eu.pb4.polymer.core.api.item.PolymerItem;
import eu.pb4.polymer.core.api.item.PolymerItemUtils;
import eu.pb4.polymer.core.api.utils.PolymerUtils;
import eu.pb4.polymer.core.impl.client.InternalClientRegistry;
Expand All @@ -14,19 +12,17 @@
import eu.pb4.polymer.core.impl.other.ImplPolymerRegistry;
import eu.pb4.polymer.core.impl.other.PolymerTooltipType;
import eu.pb4.polymer.rsm.impl.RegistrySyncExtension;
import it.unimi.dsi.fastutil.objects.Object2BooleanOpenCustomHashMap;
import net.fabricmc.fabric.api.event.registry.RegistryAttribute;
import net.fabricmc.fabric.api.event.registry.RegistryAttributeHolder;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.item.BlockItem;
import net.minecraft.item.tooltip.TooltipType;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.NbtComponent;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket;
import net.minecraft.network.packet.s2c.play.UpdateSelectedSlotS2CPacket;
import net.minecraft.registry.DynamicRegistryManager;
Expand Down Expand Up @@ -266,8 +262,11 @@ public static void pickBlock(ServerPlayerEntity player, BlockPos pos, boolean wi
if (isCreative && withNbt && blockState.hasBlockEntity()) {
var blockEntity = player.getWorld().getBlockEntity(pos);
if (blockEntity != null && (!blockEntity.copyItemDataRequiresOperator() || player.isCreativeLevelTwoOp())) {
NbtCompound nbtCompound = blockEntity.createComponentlessNbtWithIdentifyingData(player.getRegistryManager());
//noinspection deprecation
blockEntity.removeFromCopiedStackNbt(nbtCompound);
BlockItem.setBlockEntityData(itemStack, blockEntity.getType(), nbtCompound);
itemStack.applyComponentsFrom(blockEntity.createComponentMap());
itemStack.set(DataComponentTypes.BLOCK_ENTITY_DATA, NbtComponent.of(blockEntity.createComponentlessNbt(player.getRegistryManager())));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import xyz.nucleoid.packettweaker.PacketContext;

import java.util.function.Function;

Expand Down Expand Up @@ -46,7 +47,7 @@ public abstract class BlockStateMixin implements BlockStateExtra {
@ModifyExpressionValue(method = "<clinit>", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;createCodec(Lcom/mojang/serialization/Codec;Ljava/util/function/Function;)Lcom/mojang/serialization/Codec;"))
private static Codec<BlockState> patchCodec(Codec<BlockState> codec) {
return codec.xmap(Function.identity(), content -> { // Encode
if (PolymerCommonUtils.isServerNetworkingThread() && content.getBlock() instanceof PolymerBlock) {
if (PolymerCommonUtils.isServerNetworkingThreadWithContext() && content.getBlock() instanceof PolymerBlock) {
return PolymerBlockUtils.getPolymerBlockState(content);
}
return content;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public abstract class EntityAttributeMixin {
@ModifyExpressionValue(method = "<clinit>", at = @At(value = "INVOKE", target = "Lnet/minecraft/registry/Registry;getEntryCodec()Lcom/mojang/serialization/Codec;"))
private static Codec<RegistryEntry<EntityAttribute>> patchCodec(Codec<RegistryEntry<EntityAttribute>> codec) {
return codec.xmap(Function.identity(), content -> { // Encode
if (PolymerCommonUtils.isServerNetworkingThread() && PolymerEntityUtils.isPolymerEntityAttribute(content)) {
if (PolymerCommonUtils.isServerNetworkingThreadWithContext() && PolymerEntityUtils.isPolymerEntityAttribute(content)) {
return EntityAttributes.ZOMBIE_SPAWN_REINFORCEMENTS;
}
return content;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,12 @@ private static Supplier<Codec<ItemStack>> patchCodec(Supplier<Codec<ItemStack>>
}
return content;
}, content -> { // Encode
if (PolymerCommonUtils.isServerNetworkingThread()) {
var context = PacketContext.get().getRegistryWrapperLookup();
if (PolymerCommonUtils.isServerNetworkingThreadWithContext()) {
var ctx = PacketContext.get();
if (ctx.getPacketListener() == null) {
return content;
}
var context = ctx.getRegistryWrapperLookup();
var player = PolymerCommonUtils.getPlayerContext();
var lookup = context != null ? context : (player != null ? player.getRegistryManager() : PolymerImplUtils.FALLBACK_LOOKUP);
return PolymerItemUtils.getPolymerItemStack(content, lookup, player);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@

@Mixin(PotionContentsComponent.class)
public abstract class PotionContentsComponentMixin implements TransformingComponent {
@Shadow @Final private Optional<RegistryEntry<Potion>> potion;

@Shadow @Final private List<StatusEffectInstance> customEffects;

@Shadow public abstract int getColor();

@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@Shadow @Final private Optional<RegistryEntry<Potion>> potion;

@Override
public Object polymer$getTransformed(PacketContext context) {
if (!polymer$requireModification(context)) {
Expand All @@ -39,7 +41,7 @@ public abstract class PotionContentsComponentMixin implements TransformingCompon
}

for (StatusEffectInstance statusEffectInstance : this.customEffects) {
if (statusEffectInstance.getEffectType() instanceof PolymerObject) {
if (statusEffectInstance.getEffectType().value() instanceof PolymerObject) {
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,29 +20,9 @@
public abstract class HoverEventMixin {
@ModifyExpressionValue(method = "<clinit>", at = @At(value = "INVOKE", target = "Lcom/mojang/serialization/Codec;xmap(Ljava/util/function/Function;Ljava/util/function/Function;)Lcom/mojang/serialization/Codec;"))
private static Codec<HoverEvent> patchCodec(Codec<HoverEvent> codec) {
return codec.xmap(content -> { // Decode
return codec.xmap(Function.identity(), content -> { // Encode
if (PolymerCommonUtils.isServerNetworkingThread()) {
if (content.getAction() == HoverEvent.Action.SHOW_ITEM) {
var context = PacketContext.get().getRegistryWrapperLookup();
var player = PolymerCommonUtils.getPlayerContext();
var lookup = context != null ? context : (player != null ? player.getRegistryManager() : PolymerImplUtils.FALLBACK_LOOKUP);

return new HoverEvent(HoverEvent.Action.SHOW_ITEM,
new HoverEvent.ItemStackContent(PolymerItemUtils.getRealItemStack(Objects.requireNonNull(content.getValue(HoverEvent.Action.SHOW_ITEM)).asStack(),
lookup)));
}
}
return content;
}, content -> { // Encode
if (PolymerCommonUtils.isServerNetworkingThread()) {
if (content.getAction() == HoverEvent.Action.SHOW_ITEM) {
var context = PacketContext.get().getRegistryWrapperLookup();
var player = PolymerCommonUtils.getPlayerContext();
var stack = Objects.requireNonNull(content.getValue(HoverEvent.Action.SHOW_ITEM)).asStack();
var lookup = context != null ? context : (player != null ? player.getRegistryManager() : PolymerImplUtils.FALLBACK_LOOKUP);
return new HoverEvent(HoverEvent.Action.SHOW_ITEM,
new HoverEvent.ItemStackContent(PolymerItemUtils.getPolymerItemStack(stack, lookup, player)));
} else if (content.getAction() == HoverEvent.Action.SHOW_ENTITY) {
if (content.getAction() == HoverEvent.Action.SHOW_ENTITY) {
var val = Objects.requireNonNull(content.getValue(HoverEvent.Action.SHOW_ENTITY));
if (PolymerEntityUtils.isPolymerEntityType(val.entityType)) {
val = new HoverEvent.EntityContent(val.entityType, val.uuid, val.name);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package eu.pb4.polymer.core.mixin.other;

import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.serialization.MapEncoder;
import com.mojang.serialization.codecs.KeyDispatchCodec;
import eu.pb4.polymer.common.api.PolymerCommonUtils;
import eu.pb4.polymer.core.api.other.PolymerMapCodec;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;

@Mixin(value = KeyDispatchCodec.class, remap = false)
public class KeyDispatchCodecMixin {
@ModifyArg(method = "encode", at = @At(value = "INVOKE", target = "Ljava/util/function/Function;apply(Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 1))
private Object replaceWithObject(Object object, @Local MapEncoder<Object> elementEncoder) {
return elementEncoder instanceof PolymerMapCodec<?> codec
&& PolymerCommonUtils.isServerNetworkingThreadWithContext() ? codec.fallbackValue() : object;
}
@ModifyArg(method = "encode", at = @At(value = "INVOKE", target = "Ljava/util/function/Function;apply(Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 2))
private Object replaceWithObject2(Object object, @Local MapEncoder<Object> elementEncoder) {
return elementEncoder instanceof PolymerMapCodec<?> codec
&& PolymerCommonUtils.isServerNetworkingThreadWithContext() ? codec.fallbackValue() : object;
}
}
3 changes: 2 additions & 1 deletion polymer-core/src/main/resources/polymer-core.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@
"entity.PlayerListS2CPacketAccessor",
"entity.RemoveEntityStatusEffectS2CPacketMixin",
"entity.ServerWorldAccessor",
"item.component.DebugStickStateComponentMixin",
"item.ItemGroupMixin",
"item.ItemGroupsMixin",
"item.ItemStackMixin",
Expand All @@ -63,6 +62,7 @@
"item.ServerPlayNetworkHandlerMixin",
"item.StonecutterScreenHandlerMixin",
"item.component.AttributeModifiersComponentMixin",
"item.component.DebugStickStateComponentMixin",
"item.component.FoodComponentMixin",
"item.component.PotionContentsComponentMixin",
"item.component.SuspiciousStewComponentMixin",
Expand All @@ -78,6 +78,7 @@
"other.IdListAccessor",
"other.IdListMixin",
"other.ItemGroupsAccessor",
"other.KeyDispatchCodecMixin",
"other.PacketCodecsEntriesMixin",
"other.PacketCodecsRegistryEntryListMixin",
"other.PacketCodecsRegistryEntryMixin",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package eu.pb4.polymertest;

import com.mojang.serialization.MapCodec;
import eu.pb4.polymer.core.api.other.PolymerMapCodec;
import net.minecraft.enchantment.EnchantmentEffectContext;
import net.minecraft.enchantment.effect.EnchantmentEntityEffect;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text;
import net.minecraft.text.TextCodecs;
import net.minecraft.util.math.Vec3d;

public record TestEnchantmentEntityEffect(Text text) implements EnchantmentEntityEffect {
public static final MapCodec<TestEnchantmentEntityEffect> CODEC = PolymerMapCodec.ofEnchantmentEntityEffect(
TextCodecs.CODEC.fieldOf("text")
.xmap(TestEnchantmentEntityEffect::new, TestEnchantmentEntityEffect::text));

@Override
public void apply(ServerWorld world, int level, EnchantmentEffectContext context, Entity user, Vec3d pos) {
user.sendMessage(text);
}

@Override
public MapCodec<? extends EnchantmentEntityEffect> getCodec() {
return CODEC;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,7 @@ public void onInitialize() {
FabricDefaultAttributeRegistry.register(ENTITY_3, TestEntity3.createCreeperAttributes());

register(Registries.ENTITY_TYPE, Identifier.of("test", "physics"), PHYSIC_ENTITY_3);
register(Registries.ENCHANTMENT_ENTITY_EFFECT_TYPE, Identifier.of("test", "test"), TestEnchantmentEntityEffect.CODEC);

PolymerEntityUtils.registerType(ENTITY, ENTITY_2, ENTITY_3, PHYSIC_ENTITY_3);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@
}
],
"minecraft:post_attack": [
{
"enchanted": "attacker",
"affected": "attacker",
"effect": {
"type": "test:test",
"text": "Hello World!"
}
},
{
"enchanted": "attacker",
"affected": "victim",
Expand Down

0 comments on commit 89f249c

Please sign in to comment.