Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve entity kill preview #245

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.github.quiltservertools.ledger.mixin.preview;

import net.minecraft.entity.Entity;
import net.minecraft.server.network.EntityTrackerEntry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(EntityTrackerEntry.class)
public interface EntityTrackerEntryAccessor {

@Accessor
Entity getEntity();

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@ import com.github.quiltservertools.ledger.utility.getWorld
import net.minecraft.entity.Entity
import net.minecraft.entity.LivingEntity
import net.minecraft.nbt.StringNbtReader
import net.minecraft.network.packet.s2c.play.EntitiesDestroyS2CPacket
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket
import net.minecraft.registry.Registries
import net.minecraft.server.MinecraftServer
import net.minecraft.server.network.EntityTrackerEntry
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.util.math.Vec3d

Expand All @@ -29,8 +28,9 @@ class EntityKillActionType : AbstractActionType() {
entity.health = entity.defaultMaxHealth.toFloat()
entity.velocity = Vec3d.ZERO
entity.fireTicks = 0
player.networkHandler.sendPacket(EntitySpawnS2CPacket(entity))
preview.spawnedEntityIds.add(entity.id)
val entityTrackerEntry = EntityTrackerEntry(world, entity, 1, false) { }
entityTrackerEntry.startTracking(player)
preview.spawnedEntityTrackers.add(entityTrackerEntry)
}

override fun previewRestore(preview: Preview, player: ServerPlayerEntity) {
Expand All @@ -41,8 +41,9 @@ class EntityKillActionType : AbstractActionType() {
val uuid = tag.getUuid("UUID")
val entity = world?.getEntity(uuid)
entity?.let {
player.networkHandler.sendPacket(EntitiesDestroyS2CPacket(it.id))
preview.removedEntityUuids.add(it.uuid)
val entityTrackerEntry = EntityTrackerEntry(world, entity, 1, false) { }
entityTrackerEntry.stopTracking(player)
preview.removedEntityTrackers.add(entityTrackerEntry)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,12 @@ package com.github.quiltservertools.ledger.actionutils
import com.github.quiltservertools.ledger.actions.ActionType
import com.github.quiltservertools.ledger.commands.subcommands.RestoreCommand
import com.github.quiltservertools.ledger.commands.subcommands.RollbackCommand
import com.github.quiltservertools.ledger.mixin.preview.EntityTrackerEntryAccessor
import com.github.quiltservertools.ledger.utility.Context
import com.github.quiltservertools.ledger.utility.TextColorPallet
import java.util.*
import net.minecraft.item.ItemStack
import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket
import net.minecraft.network.packet.s2c.play.BundleS2CPacket
import net.minecraft.network.packet.s2c.play.EntitiesDestroyS2CPacket
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket
import net.minecraft.server.network.EntityTrackerEntry
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.text.Text
import net.minecraft.util.math.BlockPos
Expand All @@ -22,10 +20,13 @@ class Preview(
private val type: Type
) {
val positions = mutableSetOf<BlockPos>()

// Preview entities that got spawned. Need to removed
val spawnedEntityIds = mutableSetOf<Int>()
val spawnedEntityTrackers = mutableSetOf<EntityTrackerEntry>()

// Preview entities that got removed. Need to be spawned
val removedEntityUuids = mutableSetOf<UUID>()
val removedEntityTrackers = mutableSetOf<EntityTrackerEntry>()

// Preview items that should be modified in screen handlers (true = added, false = removed)
val modifiedItems = mutableMapOf<BlockPos, MutableList<Pair<ItemStack, Boolean>>>()

Expand Down Expand Up @@ -56,22 +57,21 @@ class Preview(

private fun cleanup(player: ServerPlayerEntity) {
// Cleanup preview entities, to keep client and server in sync
val destroyPackets = spawnedEntityIds.map {
EntitiesDestroyS2CPacket(it)
}
player.networkHandler.sendPacket(BundleS2CPacket(destroyPackets))

spawnedEntityIds.forEach {
player.networkHandler.sendPacket(EntitiesDestroyS2CPacket(it))
spawnedEntityTrackers.forEach {
if (!isEntityPresent(it)) {
it.stopTracking(player)
}
}
val spawnPackets = removedEntityUuids.mapNotNull {
val world = player.serverWorld
val entity = world?.getEntity(it)
entity?.let {
EntitySpawnS2CPacket(entity)
removedEntityTrackers.forEach {
if (isEntityPresent(it)) {
it.startTracking(player)
}
}
player.networkHandler.sendPacket(BundleS2CPacket(spawnPackets))
}

private fun isEntityPresent(entityTrackerEntry: EntityTrackerEntry): Boolean {
val entity = (entityTrackerEntry as EntityTrackerEntryAccessor).entity
return entity.world.getEntityById(entity.id) != null
}

fun apply(context: Context) {
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/ledger.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
"entities.VillagerEntityMixin",
"entities.WolfEntityMixin",
"preview.ChestBlockMixin",
"preview.EntityTrackerEntryAccessor",
"preview.LockableContainerBlockEntityMixin",
"preview.LootableContainerBlockEntityMixin",
"preview.ServerPlayerEntityMixin"
Expand Down
Loading