Skip to content

Commit 5b1ed9f

Browse files
committed
Spear/Trident API go brrr
1 parent 4cd4e83 commit 5b1ed9f

10 files changed

Lines changed: 153 additions & 2 deletions

File tree

library/item/item_extension/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ qslModule {
1212
moduleDependencies {
1313
core {
1414
api("qsl_base")
15+
impl("networking")
1516
}
1617
}
1718
injectedInterface("net/minecraft/class_1753") {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.quiltmc.qsl.item.extension.api.trident;
2+
3+
import net.minecraft.item.Item;
4+
import net.minecraft.item.TridentItem;
5+
6+
public class ProjectileModifyingTridentItem extends TridentItem {
7+
public ProjectileModifyingTridentItem(Item.Settings settings) {
8+
super(settings);
9+
}
10+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.quiltmc.qsl.item.extension.api.trident;
2+
3+
import org.quiltmc.qsl.base.api.util.InjectedInterface;
4+
5+
import net.minecraft.item.TridentItem;
6+
import net.minecraft.util.Identifier;
7+
8+
@InjectedInterface(TridentItem.class)
9+
public interface TridentExtensions {
10+
boolean useVanillaRenderer();
11+
Identifier getRenderTexture();
12+
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package org.quiltmc.qsl.item.extension.api.trident;
2+
3+
public class TridentThrownProjectileEvents {
4+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.quiltmc.qsl.item.extension.impl.trident;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Deque;
5+
6+
import org.quiltmc.loader.api.ModContainer;
7+
import org.quiltmc.qsl.base.api.entrypoint.client.ClientModInitializer;
8+
import org.quiltmc.qsl.networking.api.client.ClientPlayNetworking;
9+
10+
import net.minecraft.item.ItemStack;
11+
import net.minecraft.util.Identifier;
12+
13+
public class TridentClientModInitializer implements ClientModInitializer {
14+
public static final Deque<ItemStack> TRIDENT_QUEUE = new ArrayDeque<>();
15+
16+
public static final Identifier TRIDENT_SPAWN_PACKET_ID = new Identifier("quilt_item_extensions", "trident_spawn_stack");
17+
18+
@Override
19+
public void onInitializeClient(ModContainer mod) {
20+
ClientPlayNetworking.registerGlobalReceiver(TRIDENT_SPAWN_PACKET_ID, (client, handler, buf, responseSender) -> {
21+
TRIDENT_QUEUE.add(buf.readItemStack());
22+
});
23+
}
24+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.quiltmc.qsl.item.extension.mixin.trident;
2+
3+
import org.spongepowered.asm.mixin.Mixin;
4+
import org.spongepowered.asm.mixin.gen.Accessor;
5+
6+
import net.minecraft.entity.projectile.TridentEntity;
7+
import net.minecraft.item.ItemStack;
8+
9+
@Mixin(TridentEntity.class)
10+
public interface TridentEntityAccessor {
11+
@Accessor("tridentStack")
12+
ItemStack getTridentStack();
13+
14+
@Accessor("tridentStack")
15+
void setTridentStack(ItemStack stack);
16+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.quiltmc.qsl.item.extension.mixin.trident;
2+
3+
import org.quiltmc.qsl.item.extension.impl.trident.TridentClientModInitializer;
4+
import org.quiltmc.qsl.networking.api.PacketByteBufs;
5+
import org.quiltmc.qsl.networking.api.ServerPlayNetworking;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
10+
11+
import net.minecraft.entity.Entity;
12+
import net.minecraft.entity.EntityType;
13+
import net.minecraft.entity.projectile.ProjectileEntity;
14+
import net.minecraft.entity.projectile.TridentEntity;
15+
import net.minecraft.network.Packet;
16+
import net.minecraft.network.PacketByteBuf;
17+
import net.minecraft.world.World;
18+
19+
@Mixin(ProjectileEntity.class)
20+
public abstract class TridentEntityMixin extends Entity {
21+
public TridentEntityMixin(EntityType<?> entityType, World world) {
22+
super(entityType, world);
23+
}
24+
25+
@Inject(method = "createSpawnPacket", at = @At("HEAD"))
26+
public void sendTridentStackBeforeSpawnPacket(CallbackInfoReturnable<Packet<?>> cir) {
27+
if ((Object) this instanceof TridentEntity trident) {
28+
PacketByteBuf passedData = PacketByteBufs.create();
29+
passedData.writeItemStack(((TridentEntityAccessor) trident).getTridentStack());
30+
ServerPlayNetworking.send(this.world.getServer().getPlayerManager().getPlayerList(), TridentClientModInitializer.TRIDENT_SPAWN_PACKET_ID, passedData);
31+
}
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.quiltmc.qsl.item.extension.mixin.trident.client;
2+
3+
import org.quiltmc.qsl.item.extension.impl.trident.TridentClientModInitializer;
4+
import org.quiltmc.qsl.item.extension.mixin.trident.TridentEntityAccessor;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
9+
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
10+
11+
import net.minecraft.client.network.ClientPlayNetworkHandler;
12+
import net.minecraft.entity.Entity;
13+
import net.minecraft.entity.EntityType;
14+
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
15+
16+
@Mixin(ClientPlayNetworkHandler.class)
17+
public class ClientPlayNetworkHandlerMixin {
18+
@Inject(method = "onEntitySpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;onSpawnPacket(Lnet/minecraft/network/packet/s2c/play/EntitySpawnS2CPacket;)V"), locals = LocalCapture.CAPTURE_FAILHARD)
19+
public void onEntitySpawnMixin(EntitySpawnS2CPacket packet, CallbackInfo ci, EntityType<?> entityType, Entity entity) {
20+
if (entityType == EntityType.TRIDENT) {
21+
((TridentEntityAccessor) entity).setTridentStack(TridentClientModInitializer.TRIDENT_QUEUE.remove());
22+
}
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.quiltmc.qsl.item.extension.mixin.trident.client;
2+
3+
import org.quiltmc.qsl.item.extension.api.trident.TridentExtensions;
4+
import org.quiltmc.qsl.item.extension.mixin.trident.TridentEntityAccessor;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
9+
10+
import net.minecraft.client.render.entity.TridentEntityRenderer;
11+
import net.minecraft.entity.projectile.TridentEntity;
12+
import net.minecraft.util.Identifier;
13+
14+
@Mixin(TridentEntityRenderer.class)
15+
public class TridentEntityRendererMixin {
16+
@Inject(method = "getTexture(Lnet/minecraft/entity/projectile/TridentEntity;)Lnet/minecraft/util/Identifier;", at = @At(value = "HEAD"), cancellable = true)
17+
public void getTextureMixin(TridentEntity entity, CallbackInfoReturnable<Identifier> cir) {
18+
if(((TridentEntityAccessor) entity).getTridentStack().getItem() instanceof TridentExtensions tridentItem) {
19+
cir.setReturnValue(tridentItem.getRenderTexture());
20+
}
21+
}
22+
}

library/item/item_extension/src/main/resources/quilt_item_extension.mixins.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@
1111
"bow.EntityUseBowMixin",
1212
"crossbow.CrossbowItemAccessor",
1313
"crossbow.CrossbowItemMixin",
14-
"crossbow.EntityUseCrossbowMixin"
14+
"crossbow.EntityUseCrossbowMixin",
15+
"trident.TridentEntityAccessor",
16+
"trident.TridentEntityMixin"
1517
],
1618
"client": [
1719
"bow.client.SkeletonEntityModelMixin",
1820
"client.HeldItemRendererMixin",
19-
"crossbow.client.PlayerEntityRendererMixin"
21+
"crossbow.client.PlayerEntityRendererMixin",
22+
"trident.client.ClientPlayNetworkHandlerMixin",
23+
"trident.client.TridentEntityRendererMixin"
2024
],
2125
"injectors": {
2226
"defaultRequire": 1

0 commit comments

Comments
 (0)