Skip to content

Commit 9773398

Browse files
committed
render door pushing for players in third person
1 parent 82ee92b commit 9773398

File tree

8 files changed

+106
-13
lines changed

8 files changed

+106
-13
lines changed

src/main/java/galena/oreganized/client/OreganizedClient.java

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import galena.oreganized.world.IDoorProgressHolder;
1313
import net.minecraft.ChatFormatting;
1414
import net.minecraft.client.Minecraft;
15+
import net.minecraft.client.model.geom.ModelPart;
1516
import net.minecraft.client.renderer.ItemBlockRenderTypes;
1617
import net.minecraft.client.renderer.RenderType;
1718
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
@@ -100,6 +101,10 @@ public static void registerGuiOverlays(RegisterGuiOverlaysEvent event) {
100101
event.registerAbove(VanillaGuiOverlay.FROSTBITE.id(), "stunning", new StunningOverlay());
101102
}
102103

104+
public static void renderThirdPersonArm(ModelPart arm, boolean rightArm) {
105+
arm.xRot = -1.7F;
106+
arm.yRot = rightArm ? -0.1F : 0.2F;
107+
}
103108

104109
@Mod.EventBusSubscriber(modid = Oreganized.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE)
105110
public static class ForgeBusEvents {

src/main/java/galena/oreganized/content/block/HeavyDoorBlockEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player
122122
stopUsing(state, level, pos, player);
123123
}
124124

125-
return InteractionResult.sidedSuccess(level.isClientSide);
125+
return InteractionResult.FAIL;
126126
}
127127

128128
}

src/main/java/galena/oreganized/mixin/PlayerMixin.java

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package galena.oreganized.mixin;
22

3+
import galena.oreganized.network.OreganizedNetwork;
4+
import galena.oreganized.network.packet.DoorPushingPacket;
35
import galena.oreganized.world.IDoorProgressHolder;
6+
import net.minecraft.server.level.ServerPlayer;
47
import net.minecraft.world.entity.player.Player;
5-
import org.checkerframework.checker.units.qual.A;
8+
import net.minecraftforge.network.PacketDistributor;
69
import org.spongepowered.asm.mixin.Mixin;
710
import org.spongepowered.asm.mixin.Unique;
811
import org.spongepowered.asm.mixin.injection.At;
@@ -24,30 +27,42 @@ public class PlayerMixin implements IDoorProgressHolder {
2427
return oreganised$leadDoorOpeningProgress;
2528
}
2629

30+
@Unique
31+
private void oreganized$syncProgress(boolean pushing) {
32+
var self = (Player) (Object) this;
33+
34+
if (self instanceof ServerPlayer) {
35+
var packet = new DoorPushingPacket(self.getUUID(), pushing);
36+
OreganizedNetwork.CHANNEL.send(PacketDistributor.DIMENSION.with(self.level()::dimension), packet);
37+
}
38+
}
39+
2740
@Unique
2841
@Override
2942
public int oreganised$incrementOpeningProgress() {
3043
var self = (Player) (Object) this;
3144
oreganised$lastPress = self.level().getGameTime();
45+
oreganized$syncProgress(true);
3246
return ++oreganised$leadDoorOpeningProgress;
3347
}
3448

3549
@Unique
3650
@Override
3751
public void oreganised$resetOpeningProgress() {
3852
oreganised$leadDoorOpeningProgress = 0;
53+
oreganized$syncProgress(false);
3954
}
4055

4156
@Inject(
4257
method = "tick",
4358
at = @At("HEAD")
4459
)
4560
private void oreganised$onTick(CallbackInfo ci) {
46-
if(oreganised$leadDoorOpeningProgress == 0) return;
61+
if (oreganised$leadDoorOpeningProgress == 0) return;
4762
var self = (Player) (Object) this;
48-
if(self.level() == null) return;
63+
if (self.level() == null || self.level().isClientSide) return;
4964
var time = self.level().getGameTime();
50-
if(time - oreganised$lastPress > 6) oreganised$resetOpeningProgress();
65+
if (time - oreganised$lastPress > 6) oreganised$resetOpeningProgress();
5166
}
5267

5368
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package galena.oreganized.mixin.client;
2+
3+
import galena.oreganized.client.OreganizedClient;
4+
import galena.oreganized.world.IDoorProgressHolder;
5+
import net.minecraft.client.model.HumanoidModel;
6+
import net.minecraft.world.entity.LivingEntity;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
12+
@Mixin(HumanoidModel.class)
13+
public class HumanoidModelMixin<T extends LivingEntity> {
14+
15+
@Inject(method = "poseRightArm", at = @At(value = "HEAD"), cancellable = true)
16+
public void poseRightArm(T entity, CallbackInfo ci) {
17+
if (!(entity instanceof IDoorProgressHolder progressHolder)) return;
18+
if (progressHolder.oreganised$getOpeningProgress() == 0) return;
19+
20+
var model = (HumanoidModel<T>) (Object) this;
21+
OreganizedClient.renderThirdPersonArm(model.rightArm, true);
22+
23+
ci.cancel();
24+
}
25+
26+
@Inject(method = "poseLeftArm", at = @At(value = "HEAD"), cancellable = true)
27+
public void poseLeftArm(T entity, CallbackInfo ci) {
28+
if (!(entity instanceof IDoorProgressHolder progressHolder)) return;
29+
if (progressHolder.oreganised$getOpeningProgress() == 0) return;
30+
31+
var model = (HumanoidModel<T>) (Object) this;
32+
OreganizedClient.renderThirdPersonArm(model.leftArm, false);
33+
34+
ci.cancel();
35+
}
36+
37+
}

src/main/java/galena/oreganized/network/OreganizedNetwork.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package galena.oreganized.network;
22

33
import galena.oreganized.Oreganized;
4+
import galena.oreganized.network.packet.DoorPushingPacket;
45
import galena.oreganized.network.packet.GargoyleParticlePacket;
56
import net.minecraftforge.network.NetworkRegistry;
67
import net.minecraftforge.network.simple.SimpleChannel;
@@ -18,5 +19,6 @@ public static void register() {
1819
int id = 0;
1920

2021
CHANNEL.registerMessage(id++, GargoyleParticlePacket.class, GargoyleParticlePacket::write, GargoyleParticlePacket::from, GargoyleParticlePacket::handle);
22+
CHANNEL.registerMessage(id++, DoorPushingPacket.class, DoorPushingPacket::write, DoorPushingPacket::from, DoorPushingPacket::handle);
2123
}
2224
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package galena.oreganized.network.packet;
2+
3+
import galena.oreganized.world.IDoorProgressHolder;
4+
import net.minecraft.client.Minecraft;
5+
import net.minecraft.network.FriendlyByteBuf;
6+
import net.minecraftforge.network.NetworkEvent;
7+
8+
import java.util.UUID;
9+
import java.util.function.Supplier;
10+
11+
public record DoorPushingPacket(UUID player, boolean pushing) {
12+
13+
public void write(FriendlyByteBuf buffer) {
14+
buffer.writeUUID(player);
15+
buffer.writeBoolean(pushing);
16+
}
17+
18+
public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
19+
var context = contextSupplier.get();
20+
context.enqueueWork(() -> {
21+
var level = Minecraft.getInstance().level;
22+
if (level == null) return;
23+
24+
var player = level.getPlayerByUUID(player());
25+
if (player instanceof IDoorProgressHolder progressHolder) {
26+
if (pushing) progressHolder.oreganised$incrementOpeningProgress();
27+
else progressHolder.oreganised$resetOpeningProgress();
28+
}
29+
});
30+
31+
context.setPacketHandled(true);
32+
}
33+
34+
public static DoorPushingPacket from(FriendlyByteBuf buffer) {
35+
var player = buffer.readUUID();
36+
var pushing = buffer.readBoolean();
37+
return new DoorPushingPacket(player, pushing);
38+
}
39+
40+
}

src/main/java/galena/oreganized/network/packet/GargoyleParticlePacket.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,7 @@
88

99
import java.util.function.Supplier;
1010

11-
public class GargoyleParticlePacket {
12-
13-
private final BlockPos pos;
14-
15-
public GargoyleParticlePacket(BlockPos pos) {
16-
this.pos = pos;
17-
}
11+
public record GargoyleParticlePacket(BlockPos pos) {
1812

1913
public void write(FriendlyByteBuf buffer) {
2014
buffer.writeBlockPos(pos);

src/main/resources/oreganized.mixins.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"MobEffectInstanceMixin", "PillagerMixin", "PlayerMixin"
99
],
1010
"client": [
11-
"client.GuiAccessor", "client.GuiMixin", "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin"
11+
"client.GuiAccessor", "client.GuiMixin", "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin", "client.HumanoidModelMixin"
1212
],
1313
"server": [],
1414
"injectors": {

0 commit comments

Comments
 (0)