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

Fix search packet and entity change action extra data #290

Merged
merged 3 commits into from
Oct 15, 2024
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
Expand Up @@ -4,13 +4,15 @@ import com.github.quiltservertools.ledger.utility.TextColorPallet
import com.github.quiltservertools.ledger.utility.UUID
import com.github.quiltservertools.ledger.utility.getWorld
import com.github.quiltservertools.ledger.utility.literal
import com.mojang.brigadier.exceptions.CommandSyntaxException
import net.minecraft.entity.LivingEntity
import net.minecraft.entity.decoration.AbstractDecorationEntity
import net.minecraft.entity.decoration.ItemFrameEntity
import net.minecraft.item.AliasedBlockItem
import net.minecraft.item.BlockItem
import net.minecraft.item.ItemStack
import net.minecraft.nbt.StringNbtReader
import net.minecraft.registry.DynamicRegistryManager
import net.minecraft.registry.Registries
import net.minecraft.server.MinecraftServer
import net.minecraft.server.command.ServerCommandSource
Expand All @@ -23,14 +25,26 @@ class EntityChangeActionType : AbstractActionType() {
override val identifier = "entity-change"

override fun getTranslationType(): String {
val item = Registries.ITEM.get(Identifier.of(extraData))
val item = getStack(DynamicRegistryManager.EMPTY).item
return if (item is BlockItem && item !is AliasedBlockItem) {
"block"
} else {
"item"
}
}

private fun getStack(registryManager: DynamicRegistryManager): ItemStack {
if (extraData == null) return ItemStack.EMPTY
try {
val itemTag = StringNbtReader.parse(extraData)
return ItemStack.fromNbt(registryManager, itemTag).orElse(ItemStack.EMPTY)
} catch (_: CommandSyntaxException) {
// In an earlier version of ledger extraData only stored the item id
val item = Registries.ITEM.get(Identifier.of(extraData))
return item.defaultStack
}
}

override fun getObjectMessage(source: ServerCommandSource): Text {
val text = Text.literal("")
text.append(
Expand All @@ -49,15 +63,12 @@ class EntityChangeActionType : AbstractActionType() {
}
)

if (extraData != null && Identifier.of(extraData) != Identifier.tryParse("minecraft:air")) {
val stack = ItemStack(Registries.ITEM.get(Identifier.of(extraData)))
val stack = getStack(source.registryManager)
if (!stack.isEmpty) {
text.append(Text.literal(" ").append(Text.translatable("text.ledger.action_message.with")).append(" "))
text.append(
Text.translatable(
Util.createTranslationKey(
this.getTranslationType(),
Identifier.of(extraData)
)
stack.translationKey
).setStyle(TextColorPallet.secondaryVariant).styled {
it.withHoverEvent(
HoverEvent(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ object ActionFactory {
action.oldObjectIdentifier = Registries.ENTITY_TYPE.getId(entity.type)

if (itemStack != null) {
action.extraData = Registries.ITEM.getId(itemStack.item).toString()
action.extraData = itemStack.encode(world.registryManager)?.asString()
}
action.oldObjectState = oldEntityTags.asString()
action.objectState = entity.writeNbt(NbtCompound())?.asString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,35 @@ import com.github.quiltservertools.ledger.network.packet.response.ResponseCodes
import com.github.quiltservertools.ledger.network.packet.response.ResponseContent
import com.github.quiltservertools.ledger.network.packet.response.ResponseS2CPacket
import com.github.quiltservertools.ledger.utility.MessageUtils
import com.github.quiltservertools.ledger.utility.TextColorPallet
import com.github.quiltservertools.ledger.utility.launchMain
import kotlinx.coroutines.launch
import me.lucko.fabric.api.permissions.v0.Permissions
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking
import net.minecraft.network.PacketByteBuf
import net.minecraft.network.codec.PacketCodec
import net.minecraft.network.packet.CustomPayload
import net.minecraft.text.Text

data class SearchC2SPacket(val restore: Boolean, val args: String) : CustomPayload {
data class SearchC2SPacket(val args: String, val pages: Int) : CustomPayload {

override fun getId() = ID

companion object : ServerPlayNetworking.PlayPayloadHandler<SearchC2SPacket> {
val ID: CustomPayload.Id<SearchC2SPacket> = CustomPayload.Id(LedgerPacketTypes.SEARCH.id)
val CODEC: PacketCodec<PacketByteBuf, SearchC2SPacket> = CustomPayload.codecOf({ _, _ -> TODO() }, {
SearchC2SPacket(it.readBoolean(), it.readString())
SearchC2SPacket(it.readString(), it.readInt())
})

override fun receive(payload: SearchC2SPacket, context: ServerPlayNetworking.Context) {
val player = context.player()
val sender = context.responseSender()
if (!Permissions.check(player, "ledger.networking", CommandConsts.PERMISSION_LEVEL) ||
!Permissions.check(player, "ledger.commands.rollback", CommandConsts.PERMISSION_LEVEL)
!Permissions.check(player, "ledger.commands.search", CommandConsts.PERMISSION_LEVEL)
) {
ResponseS2CPacket.sendResponse(
ResponseContent(
LedgerPacketTypes.ROLLBACK.id,
LedgerPacketTypes.SEARCH.id,
ResponseCodes.NO_PERMISSION.code
),
sender
Expand All @@ -48,58 +50,34 @@ data class SearchC2SPacket(val restore: Boolean, val args: String) : CustomPaylo
val params = SearchParamArgument.get(payload.args, source)

ResponseS2CPacket.sendResponse(
ResponseContent(LedgerPacketTypes.ROLLBACK.id, ResponseCodes.EXECUTING.code),
ResponseContent(LedgerPacketTypes.SEARCH.id, ResponseCodes.EXECUTING.code),
sender
)

Ledger.launch {
MessageUtils.warnBusy(source)
if (payload.restore) {
val actions = DatabaseManager.selectRestore(params)

source.world.launchMain {
val actionIds = HashSet<Int>()

for (action in actions) {
if (action.restore(source.server)) {
actionIds.add(action.id)
}
}
Ledger.launch {
DatabaseManager.restoreActions(actionIds)
}
Ledger.searchCache[source.name] = params

ResponseS2CPacket.sendResponse(
ResponseContent(
LedgerPacketTypes.ROLLBACK.id,
ResponseCodes.COMPLETED.code
),
sender
)
}
} else {
val actions = DatabaseManager.selectRollback(params)

source.world.launchMain {
val actionIds = HashSet<Int>()
MessageUtils.warnBusy(source)
val results = DatabaseManager.searchActions(params, 1)

for (action in actions) {
if (action.rollback(source.server)) {
actionIds.add(action.id)
}
}
Ledger.launch {
DatabaseManager.rollbackActions(actionIds)
}
ResponseS2CPacket.sendResponse(
ResponseContent(
LedgerPacketTypes.ROLLBACK.id,
ResponseCodes.COMPLETED.code
),
sender
)
}
for (i in 1..payload.pages) {
val page = DatabaseManager.searchActions(results.searchParams, i)
MessageUtils.sendSearchResults(
source,
page,
Text.translatable(
"text.ledger.header.search"
).setStyle(TextColorPallet.primary)
)
}

ResponseS2CPacket.sendResponse(
ResponseContent(
LedgerPacketTypes.SEARCH.id,
ResponseCodes.COMPLETED.code
),
sender
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,6 @@ object NbtUtils {
).cast(NbtOps.INSTANCE) as NbtCompound?
}

return ItemStack.fromNbt(registries, itemTag).get()
return ItemStack.fromNbt(registries, itemTag).orElse(ItemStack.EMPTY)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ public class ClientPlayerInteractionManagerMixin {
method = "interactBlock",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V"
target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;sendSequencedPacket(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/client/network/SequencedPacketCreator;)V"
),
cancellable = true
)
private void onInteractBlock(ClientPlayerEntity player, ClientWorld world, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable<ActionResult> cir) {
private void onInteractBlock(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable<ActionResult> cir) {
if (!InspectCommand.INSTANCE.getInspectOn())
return;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger

object LedgerTest : ClientModInitializer {
val HANDSHAKE = Identifier("ledger", "handshake")
val INSPECT = Identifier("ledger", "inspect")
val SEARCH = Identifier("ledger", "search")
val ACTION = Identifier("ledger", "action")
val HANDSHAKE = Identifier.of("ledger", "handshake")
val INSPECT = Identifier.of("ledger", "inspect")
val SEARCH = Identifier.of("ledger", "search")
val ACTION = Identifier.of("ledger", "action")
val LOGGER: Logger = LogManager.getLogger("LedgerTestmod")

override fun onInitializeClient() {
Expand Down