Skip to content

Commit 9b92ad3

Browse files
committed
Fix entity untracking when removeall
1 parent a056a8d commit 9b92ad3

File tree

9 files changed

+39
-28
lines changed

9 files changed

+39
-28
lines changed

src/main/java/me/senseiwells/replay/mixin/ServerLoginPacketListenerImplMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import com.mojang.authlib.GameProfile;
44
import me.senseiwells.replay.config.ReplayConfig;
5-
import me.senseiwells.replay.player.PlayerRecorder;
65
import me.senseiwells.replay.player.PlayerRecorders;
76
import me.senseiwells.replay.player.predicates.ReplayPlayerContext;
7+
import me.senseiwells.replay.recorder.ReplayRecorder;
88
import net.minecraft.network.protocol.login.ServerboundLoginAcknowledgedPacket;
99
import net.minecraft.server.MinecraftServer;
1010
import net.minecraft.server.network.ServerLoginPacketListenerImpl;
@@ -35,7 +35,7 @@ private void onLoggedIn(
3535
) {
3636
GameProfile profile = this.authenticatedProfile;
3737
if (profile != null && ReplayConfig.getEnabled() && ReplayConfig.predicate.test(new ReplayPlayerContext(this.server, profile))) {
38-
PlayerRecorder recorder = PlayerRecorders.create(this.server, profile);
38+
ReplayRecorder recorder = PlayerRecorders.create(this.server, profile);
3939
recorder.logStart();
4040
recorder.afterLogin();
4141
}

src/main/java/me/senseiwells/replay/mixin/chunk/ChunkHolderMixin.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
44
import me.senseiwells.replay.chunk.ChunkRecorder;
55
import me.senseiwells.replay.ducks.ServerReplay$ChunkRecordable;
6-
import me.senseiwells.replay.recorder.ReplayRecorder;
76
import net.minecraft.network.protocol.Packet;
87
import net.minecraft.server.level.ChunkHolder;
98
import net.minecraft.server.level.ServerPlayer;

src/main/java/me/senseiwells/replay/mixin/chunk/TrackedEntityMixin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ private void onRemoved(CallbackInfo ci) {
9191
public void replay$removeAllRecorders() {
9292
ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(this.entity.getId());
9393
for (ChunkRecorder recorder : this.replay$recorders) {
94+
recorder.onEntityUntracked(this.entity);
95+
9496
recorder.record(packet);
9597
}
9698
this.replay$recorders.clear();
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package me.senseiwells.replay.mixin.studio;
2+
3+
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
4+
import com.replaymod.replaystudio.viaversion.CustomViaPlatform;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
8+
import java.util.logging.Logger;
9+
10+
@Mixin(value = CustomViaPlatform.class, remap = false)
11+
public class CustomViaPlatformMixin {
12+
@ModifyReturnValue(
13+
method = "getLogger",
14+
at = @At("RETURN")
15+
)
16+
private Logger onGetLogger(Logger original) {
17+
// We don't care, shut up, please :)
18+
original.setFilter(log -> false);
19+
return original;
20+
}
21+
}

src/main/kotlin/me/senseiwells/replay/chunk/ChunkRecorder.kt

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,9 @@ import net.minecraft.server.level.ClientInformation
1818
import net.minecraft.server.level.ServerLevel
1919
import net.minecraft.server.level.ServerPlayer
2020
import net.minecraft.world.entity.Entity
21-
import net.minecraft.world.entity.EntityType
2221
import net.minecraft.world.entity.boss.wither.WitherBoss
2322
import net.minecraft.world.level.ChunkPos
2423
import net.minecraft.world.level.levelgen.Heightmap
25-
import net.minecraft.world.phys.Vec3
2624
import org.jetbrains.annotations.ApiStatus.Internal
2725
import java.nio.file.Path
2826
import java.util.concurrent.CompletableFuture
@@ -83,20 +81,7 @@ class ChunkRecorder internal constructor(
8381
}
8482

8583
override fun spawnPlayer() {
86-
val center = this.chunks.center
87-
this.record(ClientboundAddEntityPacket(
88-
this.dummy.id,
89-
this.dummy.uuid,
90-
center.middleBlockX.toDouble(),
91-
100.0,
92-
center.middleBlockZ.toDouble(),
93-
0.0F,
94-
0.0F,
95-
EntityType.PLAYER,
96-
0,
97-
Vec3.ZERO,
98-
0.0
99-
))
84+
this.record(ClientboundAddEntityPacket(this.dummy))
10085
val tracked = this.dummy.entityData.nonDefaultValues
10186
if (tracked != null) {
10287
this.record(ClientboundSetEntityDataPacket(this.dummy.id, tracked))
@@ -149,14 +134,16 @@ class ChunkRecorder internal constructor(
149134
@Internal
150135
fun onEntityTracked(entity: Entity) {
151136
if (entity is WitherBoss) {
152-
((entity as WitherBossAccessor).bossEvent as ChunkRecordable).addRecorder(this)
137+
val recordable = ((entity as WitherBossAccessor).bossEvent as ChunkRecordable)
138+
recordable.addRecorder(this)
153139
}
154140
}
155141

156142
@Internal
157143
fun onEntityUntracked(entity: Entity) {
158144
if (entity is WitherBoss) {
159-
((entity as WitherBossAccessor).bossEvent as ChunkRecordable).removeRecorder(this)
145+
val recordable = ((entity as WitherBossAccessor).bossEvent as ChunkRecordable)
146+
recordable.removeRecorder(this)
160147
}
161148
}
162149

@@ -216,8 +203,7 @@ class ChunkRecorder internal constructor(
216203
return 0L
217204
}
218205

219-
@Internal
220-
internal fun paused(): Boolean {
206+
private fun paused(): Boolean {
221207
return this.lastPaused != 0L
222208
}
223209

src/main/kotlin/me/senseiwells/replay/chunk/ChunkRecorders.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.senseiwells.replay.chunk
22

33
import me.senseiwells.replay.config.ReplayConfig
4+
import me.senseiwells.replay.recorder.ReplayRecorder
45
import net.minecraft.resources.ResourceKey
56
import net.minecraft.server.MinecraftServer
67
import net.minecraft.server.level.ServerLevel
@@ -15,13 +16,13 @@ object ChunkRecorders {
1516
private val closing = HashMap<String, CompletableFuture<Long>>()
1617

1718
@JvmStatic
18-
fun create(level: ServerLevel, from: ChunkPos, to: ChunkPos, name: String): ChunkRecorder {
19+
fun create(level: ServerLevel, from: ChunkPos, to: ChunkPos, name: String): ReplayRecorder {
1920
return this.create(ChunkArea(level, from, to), name)
2021
}
2122

2223
@JvmStatic
2324
@JvmOverloads
24-
fun create(area: ChunkArea, name: String = generateName(area)): ChunkRecorder {
25+
fun create(area: ChunkArea, name: String = generateName(area)): ReplayRecorder {
2526
if (this.chunks.containsKey(area)) {
2627
throw IllegalArgumentException("Recorder for chunk area already exists")
2728
}

src/main/kotlin/me/senseiwells/replay/commands/ReplayCommand.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ object ReplayCommand {
216216
}
217217
val recorder = ChunkRecorders.create(area, id)
218218
recorder.tryStart()
219-
context.source.sendSuccess({ Component.literal("Successfully started chunk replay: ${recorder.recorderName}") }, true)
219+
context.source.sendSuccess({ Component.literal("Successfully started chunk replay: ${recorder.getName()}") }, true)
220220
return 1
221221
}
222222

src/main/kotlin/me/senseiwells/replay/player/PlayerRecorders.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package me.senseiwells.replay.player
22

33
import com.mojang.authlib.GameProfile
44
import me.senseiwells.replay.config.ReplayConfig
5+
import me.senseiwells.replay.recorder.ReplayRecorder
56
import me.senseiwells.replay.rejoin.RejoinedReplayPlayer
67
import net.minecraft.server.MinecraftServer
78
import net.minecraft.server.level.ServerPlayer
@@ -13,15 +14,15 @@ object PlayerRecorders {
1314
private val closing = HashMap<UUID, CompletableFuture<Long>>()
1415

1516
@JvmStatic
16-
fun create(player: ServerPlayer): PlayerRecorder {
17+
fun create(player: ServerPlayer): ReplayRecorder {
1718
if (player is RejoinedReplayPlayer) {
1819
throw IllegalArgumentException("Cannot create a replay for a rejoining player")
1920
}
2021
return this.create(player.server, player.gameProfile)
2122
}
2223

2324
@JvmStatic
24-
fun create(server: MinecraftServer, profile: GameProfile): PlayerRecorder {
25+
fun create(server: MinecraftServer, profile: GameProfile): ReplayRecorder {
2526
if (this.players.containsKey(profile.id)) {
2627
throw IllegalArgumentException("Player already has a recorder")
2728
}

src/main/resources/serverreplay.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"rejoin.ServerConfigurationPacketListenerImplAccessor",
2727
"rejoin.ServerPlayerMixin",
2828
"rejoin.TrackedEntityAccessor",
29+
"studio.CustomViaPlatformMixin",
2930
"studio.ZipReplayFileAccessor"
3031
],
3132
"injectors": {

0 commit comments

Comments
 (0)