Skip to content

Commit d6fa9af

Browse files
committed
change: fix EntityProjection interpolation from 000 at spawn
1 parent eadb50c commit d6fa9af

3 files changed

Lines changed: 60 additions & 19 deletions

File tree

src/main/java/cn/zbx1425/projectme/ProjectMe.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.minecraft.util.Util;
1717
import net.minecraft.world.entity.EntityType;
1818
import net.minecraft.world.entity.MobCategory;
19+
import net.minecraft.world.phys.Vec3;
1920
import net.neoforged.bus.api.IEventBus;
2021
import net.neoforged.bus.api.SubscribeEvent;
2122
import net.neoforged.fml.ModList;
@@ -35,7 +36,9 @@
3536

3637
import java.util.ArrayList;
3738
import java.util.List;
39+
import java.util.Random;
3840
import java.util.UUID;
41+
import java.util.concurrent.ThreadLocalRandom;
3942
import java.util.function.Supplier;
4043

4144
@Mod(ProjectMe.MOD_ID)
@@ -117,7 +120,7 @@ public static void onServerTick(ServerTickEvent.Pre event) {
117120
if (synchronizer == null) return;
118121
if (event.getServer().getTickCount() % CONFIG.syncInterval.value == 0) {
119122
synchronizer.notifyPlayerPresence(event.getServer().getPlayerList().getPlayers());
120-
// synchronizer.mockPlayerPresence(new Vec3(random.nextDouble(-5, 5), -60, random.nextDouble(-5, 5)));
123+
// synchronizer.mockPlayerPresence();
121124
}
122125
}
123126

src/main/java/cn/zbx1425/projectme/sync/RedisMessage.java

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
import net.minecraft.world.phys.Vec3;
1212

1313
import java.io.IOException;
14-
import java.util.Random;
15-
import java.util.UUID;
14+
import java.util.*;
1615

1716
public class RedisMessage {
1817

@@ -62,17 +61,36 @@ public RedisMessage andWithPlayer(ServerPlayer player, boolean isVisible) {
6261
return this;
6362
}
6463

65-
private static final UUID MOCK_PLAYER_UUID = UUID.fromString("8f50bdf3-cb09-4e29-ab76-dc1cf9db86a1");
66-
public static RedisMessage mockPlayerPresence(Vec3 position) {
67-
RedisMessage result = beginPlayerPresence(1);
68-
result.content.writeUUID(MOCK_PLAYER_UUID);
69-
result.content.writeBoolean(true);
70-
result.content.writeUtf("MalayP");
71-
result.content.writeResourceKey(Level.OVERWORLD);
72-
Vec3.STREAM_CODEC.encode(result.content, position);
73-
result.content.writeFloat(0);
74-
result.content.writeFloat(0);
75-
result.content.writeFloat(0);
64+
private static final ArrayDeque<UUID> mockPlayers = new ArrayDeque<>();
65+
private static final Random random = new Random();
66+
67+
public static List<RedisMessage> mockPlayerPresence() {
68+
List<RedisMessage> result = new ArrayList<>();
69+
if (random.nextInt(100) < 1) {
70+
if (random.nextBoolean() || mockPlayers.size() >= 20) {
71+
if (!mockPlayers.isEmpty()) {
72+
UUID playerLeft = mockPlayers.pop();
73+
RedisMessage absencePacket = playerAbsence(playerLeft);
74+
absencePacket.resetInitiator(0);
75+
result.add(absencePacket);
76+
}
77+
} else {
78+
mockPlayers.add(UUID.randomUUID());
79+
}
80+
}
81+
RedisMessage presencePacket = beginPlayerPresence(mockPlayers.size());
82+
for (UUID player : mockPlayers) {
83+
presencePacket.content.writeUUID(player);
84+
presencePacket.content.writeBoolean(true);
85+
presencePacket.content.writeUtf(player.toString().substring(0, 8));
86+
presencePacket.content.writeResourceKey(Level.OVERWORLD);
87+
Vec3.STREAM_CODEC.encode(presencePacket.content, new Vec3(random.nextDouble(-10, 10), -60, random.nextDouble(-10, 10)));
88+
presencePacket.content.writeFloat(0);
89+
presencePacket.content.writeFloat(0);
90+
presencePacket.content.writeFloat(0);
91+
}
92+
presencePacket.resetInitiator(0);
93+
result.add(presencePacket);
7694
return result;
7795
}
7896

@@ -121,6 +139,14 @@ public boolean isFromSelf() {
121139
return initiator == INSTANCE_ID;
122140
}
123141

142+
public void resetInitiator(long initiator) {
143+
this.initiator = initiator;
144+
int writerIndex = this.content.writerIndex();
145+
this.content.writerIndex(1);
146+
this.content.writeLong(initiator);
147+
this.content.writerIndex(writerIndex);
148+
}
149+
124150
public enum Action {
125151
PLAYER_PRESENCE, PLAYER_ABSENCE
126152
}

src/main/java/cn/zbx1425/projectme/sync/Synchronizer.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ public void notifyPlayerPresence(List<ServerPlayer> players) {
6666
});
6767
}
6868

69-
public void mockPlayerPresence(Vec3 position) {
70-
RedisMessage.mockPlayerPresence(position).publishAsync(redisConn);
69+
public void mockPlayerPresence() {
70+
for (RedisMessage message : RedisMessage.mockPlayerPresence()) {
71+
message.publishAsync(redisConn);
72+
}
7173
}
7274

7375
protected void handlePlayerPresence(UUID player, String playerName, ResourceKey<Level> level, Vec3 position,
@@ -82,8 +84,12 @@ protected void handlePlayerPresence(UUID player, String playerName, ResourceKey<
8284
return;
8385
}
8486
if (currentEntity == null || currentEntity.isRemoved()
87+
|| currentEntity.level().getEntity(currentEntity.getId()) == null
8588
|| !currentEntity.level().dimension().equals(level)) {
8689
if (currentEntity != null) {
90+
if (currentEntity.level().getEntity(currentEntity.getId()) == null && !currentEntity.isRemoved()) {
91+
ProjectMe.LOGGER.debug("EntityProjection not in level while not removed, for {}", player);
92+
}
8793
currentEntity.discard();
8894
currentProjections.remove(player);
8995
}
@@ -93,18 +99,24 @@ protected void handlePlayerPresence(UUID player, String playerName, ResourceKey<
9399
CompoundTag entityInitData = new CompoundTag();
94100
entityInitData.putString("id", ProjectMe.id("projection").toString());
95101
entityInitData.store("projectingPlayer", UUIDUtil.CODEC, player);
102+
entityInitData.putLong("addedAt", System.currentTimeMillis());
96103
entityInitData.putBoolean("NoGravity", true);
97104
entityInitData.putString("CustomName", playerName);
98-
EntityProjection entity = (EntityProjection) EntityType.loadEntityRecursive(entityInitData, targetLevel, EntitySpawnReason.COMMAND, newEntity -> {
99-
newEntity.moveOrInterpolateTo(position, yRotBody, xRot);
105+
EntityProjection entity = (EntityProjection) EntityType.loadEntityRecursive(entityInitData, targetLevel, EntitySpawnReason.DIMENSION_TRAVEL, newEntity -> {
106+
newEntity.setPos(position);
107+
newEntity.setYRot(yRotHead);
108+
newEntity.setXRot(xRot);
109+
newEntity.setYHeadRot(yRotHead);
110+
newEntity.setYBodyRot(yRotBody);
100111
return newEntity;
101112
});
102113
if (entity == null) return;
103114
if (!targetLevel.tryAddFreshEntityWithPassengers(entity)) return;
104115
currentProjections.put(player, entity);
105116
} else {
106-
currentEntity.moveOrInterpolateTo(position, yRotBody, xRot);
117+
currentEntity.moveOrInterpolateTo(position, yRotHead, xRot);
107118
currentEntity.setYHeadRot(yRotHead);
119+
currentEntity.setYBodyRot(yRotBody);
108120
}
109121
});
110122
}

0 commit comments

Comments
 (0)