Skip to content

Commit cd711ae

Browse files
committedMar 13, 2025··
Add bee scarves. Fix S2C ghost slot crash
1 parent 1e39855 commit cd711ae

File tree

8 files changed

+98
-107
lines changed

8 files changed

+98
-107
lines changed
 

‎gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G
88
loader_version = 0.16.10
99

1010
# Mod Properties
11-
mod_version = 1.3.3
11+
mod_version = 1.4.0
1212
maven_group = blue.endless
1313
archives_base_name = scarves
1414

‎src/main/java/blue/endless/scarves/ScarfItem.java

+48-2
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,40 @@
22

33
import java.util.ArrayList;
44
import java.util.List;
5+
import java.util.Map;
6+
import java.util.Optional;
7+
import java.util.Set;
58

69
import blue.endless.scarves.api.FabricSquare;
710
import blue.endless.scarves.api.RepeatType;
811
import blue.endless.scarves.api.ScarfDesign;
12+
import dev.emi.trinkets.api.TrinketComponent;
13+
import dev.emi.trinkets.api.TrinketInventory;
914
import dev.emi.trinkets.api.TrinketItem;
15+
import dev.emi.trinkets.api.TrinketsApi;
1016
import io.github.queerbric.pride.PrideFlag;
17+
import net.minecraft.entity.LivingEntity;
18+
import net.minecraft.entity.player.PlayerEntity;
1119
import net.minecraft.item.Item;
20+
import net.minecraft.item.ItemStack;
21+
import net.minecraft.registry.Registries;
22+
import net.minecraft.util.ActionResult;
23+
import net.minecraft.util.Hand;
1224
import net.minecraft.util.Identifier;
1325
import net.minecraft.util.Rarity;
1426

1527
public class ScarfItem extends TrinketItem {
1628
public static final String ID = "scarf";
1729
public static final int MAX_CREATIVE_SCARF_LENGTH = 8;
1830

31+
private static final Set<Identifier> TRY_TO_EQUIP = Set.of(Identifier.of("minecraft", "bee"));
32+
1933
public ScarfItem() {
2034
super(new Item.Settings()
2135
.component(ScarfDesign.COMPONENT, new ScarfDesign(RepeatType.FROM_START, 0, List.of()))
2236
.rarity(Rarity.UNCOMMON));
2337
}
2438

25-
26-
2739
public static ScarfDesign createScarf(PrideFlag flag, int minLength) {
2840
List<FabricSquare> pattern = new ArrayList<>();
2941
for(int col : flag.getColors()) {
@@ -34,4 +46,38 @@ public static ScarfDesign createScarf(PrideFlag flag, int minLength) {
3446

3547
return new ScarfDesign(RepeatType.FROM_START, repeatCount, List.copyOf(pattern));
3648
}
49+
50+
@Override
51+
public ActionResult useOnEntity(ItemStack stack, PlayerEntity user, LivingEntity entity, Hand hand) {
52+
System.out.println("Clicked on "+Registries.ENTITY_TYPE.getId(entity.getType()));
53+
54+
if (TRY_TO_EQUIP.contains(Registries.ENTITY_TYPE.getId(entity.getType()))) {
55+
if (entity.getEntityWorld().isClient) return ActionResult.SUCCESS;
56+
57+
Optional<TrinketComponent> component = TrinketsApi.getTrinketComponent(entity);
58+
if (component.isPresent()) {
59+
Map<String, Map<String, TrinketInventory>> inventoryMap = component.get().getInventory();
60+
Map<String, TrinketInventory> headGroup = inventoryMap.get("head");
61+
if (headGroup == null) {
62+
System.out.println("No head group!");
63+
} else {
64+
65+
TrinketInventory scarfInventory = headGroup.get("left_scarf");
66+
if (scarfInventory == null) {
67+
System.out.println("No left_scarf!");
68+
} else {
69+
//Yeet the old item outta there
70+
ItemStack oldItem = scarfInventory.removeStack(0);
71+
scarfInventory.setStack(0, stack);
72+
user.setStackInHand(hand, oldItem);
73+
}
74+
}
75+
}
76+
77+
return ActionResult.SUCCESS;
78+
}
79+
80+
81+
return ActionResult.PASS;
82+
}
3783
}

‎src/main/java/blue/endless/scarves/client/ScarvesClient.java

+1-84
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,6 @@ public void onInitializeClient() {
3636

3737
ColorProviderRegistry.ITEM.register(ScarvesClient::getScarfTint, ScarvesItems.SCARF);
3838

39-
40-
//MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(MinecraftClient.getInstance().player);
41-
//PlayerEntityModel.getModelData(Dilation.NONE, 0).getRoot().createPart(64, 64);
42-
//PlayerEntityModel<ClientPlayerEntity> model = new PlayerEntityModel<>(ctx.getPart(slim ? EntityModelLayers.PLAYER_SLIM : EntityModelLayers.PLAYER), slim)
43-
44-
//PlayerEntityModel<ClientPlayerEntity> model = new PlayerEntityModel<ClientPlayerEntity>(.getRoot(), false);
4539
}
4640

4741
public static int getScarfTint(ItemStack stack, int index) {
@@ -73,96 +67,19 @@ public static void afterEntities(WorldRenderContext ctx) {
7367
for(Entity entity : ctx.world().getEntities()) {
7468
if (entity instanceof IScarfHaver scarfHaver) {
7569

76-
/*
77-
Map<String, Matrix4f> registrations = ModelExtractor.extract(entity, tickDelta);
78-
Matrix4f bodyMatrix = registrations.get("body");
79-
if (bodyMatrix != null) {
80-
if (entity instanceof AbstractClientPlayerEntity player) {
81-
//MORE DEBUG
82-
System.out.println("\n"+bodyMatrix.toString());
83-
}
84-
85-
86-
Vec3d lerpedPosD = entity.getLerpedPos(tickDelta);
87-
Vector4f lerpedPos = new Vector4f((float) lerpedPosD.x, (float) lerpedPosD.y, (float) lerpedPosD.z, 1);
88-
89-
ctx.matrixStack().push();
90-
91-
Matrix4f bodyRotation = new Matrix4f().rotationY((float) -(scarfHaver.iScarfHaver_getBodyYaw(tickDelta) * Math.PI / 180d));
92-
93-
Vector4f a = new Vector4f(-4/16f, 0, -2/16f, 1);
94-
Vector4f b = new Vector4f(-4/16f, 12/16f, -2/16f, 1);
95-
Vector4f c = new Vector4f( 4/16f, 12/16f, -2/16f, 1);
96-
Vector4f d = new Vector4f( 4/16f, 0, -2/16f, 1);
97-
98-
a.add(0, -1.501f, 0, 0).mul(-1, -1, 1, 1);
99-
b.add(0, -1.501f, 0, 0).mul(-1, -1, 1, 1);
100-
c.add(0, -1.501f, 0, 0).mul(-1, -1, 1, 1);
101-
d.add(0, -1.501f, 0, 0).mul(-1, -1, 1, 1);
102-
103-
bodyMatrix.transform(a);
104-
bodyMatrix.transform(b);
105-
bodyMatrix.transform(c);
106-
bodyMatrix.transform(d);
107-
108-
a.add(0,0,-0.25f, 0);
109-
b.add(0,0,-0.25f, 0);
110-
c.add(0,0,-0.25f, 0);
111-
d.add(0,0,-0.25f, 0);
112-
113-
bodyRotation.transform(a);
114-
bodyRotation.transform(b);
115-
bodyRotation.transform(c);
116-
bodyRotation.transform(d);
117-
118-
a.add(lerpedPos);
119-
b.add(lerpedPos);
120-
c.add(lerpedPos);
121-
d.add(lerpedPos);
122-
123-
ScarfRenderer.quad(
124-
a,
125-
b,
126-
c,
127-
d,
128-
129-
new FabricSquare(Identifier.of("minecraft", "block/white_wool")),
130-
131-
ctx.consumers(),
132-
ctx.matrixStack(),
133-
LightmapTextureManager.pack(15,15)
134-
);
135-
136-
ctx.matrixStack().pop();
137-
}*/
138-
13970
try {
140-
//final boolean tickDeprived = (entity instanceof ITickDeprivationAware depAware) ?
141-
// depAware.scarves_isTickDeprived(ctx.world().getTime()) :
142-
// false;
143-
//final boolean tickDeprived = false;
14471

14572
scarfHaver.iScarfHaver_getAttachments(ctx.tickCounter().getTickDelta(false)).forEach( it-> {
146-
//Physics - gravity and collisions run on the tick thread
73+
14774
List<ScarfNode> nodes = it.nodes();
14875
if (nodes.isEmpty()) return;
149-
/*
150-
nodes.get(0).pullTowards(it.getLocation());
151-
if (nodes.size()>1) for(int i=1; i<nodes.size(); i++) {
152-
ScarfNode prev = nodes.get(i-1);
153-
ScarfNode cur = nodes.get(i);
154-
cur.pullTowards(prev.position);
155-
}*/
15676

15777
//Rendering
15878
Vec3d prev = it.getLocation();
15979
Vec3d prevUp = new Vec3d(0,1,0).multiply(ScarfNode.FABRIC_SQUARE_WIDTH);
16080
for(int i=0; i<nodes.size(); i++) {
16181
ScarfNode cur = nodes.get(i);
16282
Vec3d lerpedPos = cur.getLerpedPosition(tickDelta);
163-
//Vec3d lerpedPos = (tickDeprived) ?
164-
// cur.getPosition() :
165-
// cur.getLerpedPosition(ctx.tickCounter().getTickDelta(false));
16683

16784
BlockPos curPos = new BlockPos(
16885
(int) lerpedPos.x,

‎src/main/java/blue/endless/scarves/ghost/GhostInventoryNetworking.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ public class GhostInventoryNetworking {
1818

1919
public static void init() {
2020
PayloadTypeRegistry.playC2S().register(Payload.ID, Payload.CODEC);
21+
PayloadTypeRegistry.playS2C().register(Payload.ID, Payload.CODEC);
2122

2223
ServerPlayNetworking.registerGlobalReceiver(Payload.ID, (payload, context) -> {
2324
if (payload.slot() < 0) return;
2425

2526
context.server().execute(() -> {
26-
System.out.println("Received Ghost on server: "+payload.slot+" -> "+payload.stack.toString());
2727
if (context.player().currentScreenHandler instanceof GhostInventoryHolder gui) {
2828
gui.getGhostInventory().setGhostItem(payload.slot(), payload.stack());
2929
gui.getGhostInventory().markDirty();
@@ -34,9 +34,9 @@ public static void init() {
3434

3535
@Environment(EnvType.CLIENT)
3636
public static void initClient() {
37-
PayloadTypeRegistry.playS2C().register(Payload.ID, Payload.CODEC);
37+
38+
3839
ClientPlayNetworking.registerGlobalReceiver(Payload.ID, (payload, context) -> {
39-
System.out.println("Received Ghost on client: "+payload.slot+" -> "+payload.stack.toString());
4040
if (payload.slot() < 0) return;
4141

4242
context.client().execute(() -> {

‎src/main/java/blue/endless/scarves/mixin/ClientPlayerEntityMixin.java

+12-14
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,25 @@
77
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
88

99
import com.google.common.collect.ImmutableList;
10-
import com.mojang.authlib.GameProfile;
1110

1211
import blue.endless.scarves.api.AnchoredSlot;
1312
import blue.endless.scarves.client.IScarfHaver;
1413
import net.minecraft.client.network.AbstractClientPlayerEntity;
15-
import net.minecraft.client.world.ClientWorld;
1614
import net.minecraft.util.Identifier;
1715

1816
@Mixin(AbstractClientPlayerEntity.class)
1917
public abstract class ClientPlayerEntityMixin {
20-
@Inject(method="<init>(Lnet/minecraft/world/ClientWorld;Lcom/mojang/authlib/GameProfile;)V", at = @At("TAIL"))
21-
public void afterInit(ClientWorld world, GameProfile profile, CallbackInfo info) {
22-
System.out.println("ClientPlayer Init");
23-
IScarfHaver scarfHaver = (IScarfHaver) this;
24-
ImmutableList<AnchoredSlot> slotConfig = ImmutableList.<AnchoredSlot>builder()
25-
.add(new AnchoredSlot("body", new Vector3f(-0.19f, -0.25f, 0f), Identifier.of("trinkets", "head/left_scarf/0")))
26-
.add(new AnchoredSlot("body", new Vector3f( 0.19f, -0.25f, 0f), Identifier.of("trinkets", "head/right_scarf/0")))
27-
//TODO: This works *terribly*. There's a lot more work to be done matching up registration points with model locations.
28-
//.add(new AnchoredSlot("left_arm", new Vector3f( 0, 0, 0), Identifier.of("minecraft", "weapon.offhand")))
29-
.build();
30-
31-
scarfHaver.iScarfHaver_setAnchoredSlots(slotConfig);
18+
@Inject(method="<init>", at = @At("TAIL"))
19+
public void afterInit(CallbackInfo info) {
20+
if (this instanceof IScarfHaver scarfHaver) {
21+
ImmutableList<AnchoredSlot> slotConfig = ImmutableList.<AnchoredSlot>builder()
22+
.add(new AnchoredSlot("body", new Vector3f( 0.19f, -0.30f, 0.1f), Identifier.of("trinkets", "head/left_scarf/0")))
23+
.add(new AnchoredSlot("body", new Vector3f(-0.19f, -0.30f, 0.1f), Identifier.of("trinkets", "head/right_scarf/0")))
24+
//TODO: This works *terribly*. There's a lot more work to be done matching up registration points with model locations.
25+
//.add(new AnchoredSlot("left_arm", new Vector3f( 0, 0, 0), Identifier.of("minecraft", "weapon.offhand")))
26+
.build();
27+
28+
scarfHaver.iScarfHaver_setAnchoredSlots(slotConfig);
29+
}
3230
}
3331
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package blue.endless.scarves.mixin;
2+
3+
import org.joml.Vector3f;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.injection.At;
6+
import org.spongepowered.asm.mixin.injection.Inject;
7+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
8+
9+
import com.google.common.collect.ImmutableList;
10+
11+
import blue.endless.scarves.api.AnchoredSlot;
12+
import blue.endless.scarves.client.IScarfHaver;
13+
import net.minecraft.entity.passive.BeeEntity;
14+
import net.minecraft.util.Identifier;
15+
16+
@Mixin(BeeEntity.class)
17+
public class MixinBeeScarfHaver {
18+
19+
@Inject(method="<init>", at = @At("TAIL"))
20+
public void afterInit(CallbackInfo info) {
21+
if (this instanceof IScarfHaver scarfHaver) {
22+
ImmutableList<AnchoredSlot> slotConfig = ImmutableList.<AnchoredSlot>builder()
23+
.add(new AnchoredSlot("", new Vector3f( 3.5f/16f, -18/16f, 4/16f), Identifier.of("trinkets", "head/left_scarf/0")))
24+
.build();
25+
26+
scarfHaver.iScarfHaver_setAnchoredSlots(slotConfig);
27+
}
28+
}
29+
}

‎src/main/resources/assets/scarves/lang/en_us.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"trinkets.slot.chest.right_scarf": "Right Scarf",
88
"tag.trinkets.slot.head.left_scarf": "Left Scarf",
99
"tag.trinkets.slot.head.right_scarf": "Right Scarf",
10-
"tag.trinkets.item.head.left_scarf": "Eligible for Left Scarf slot",
11-
"tag.trinkets.item.head.right_scarf": "Eligible for Right Scarf slot",
10+
"tag.item.trinkets.head.left_scarf": "Eligible for Left Scarf slot",
11+
"tag.item.trinkets.head.right_scarf": "Eligible for Right Scarf slot",
1212

1313
"gui.scarves.pattern_length": "Pattern Length: %s",
1414
"gui.scarves.repetitions": "Repetitions: %s",

‎src/main/resources/scarves.mixins.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
],
99
"client": [
1010
"EntityScarfHaverMixin",
11-
"ClientPlayerEntityMixin"
11+
"ClientPlayerEntityMixin",
12+
"MixinBeeScarfHaver"
1213
],
1314
"injectors": {
1415
"defaultRequire": 1

0 commit comments

Comments
 (0)
Please sign in to comment.