diff --git a/src/main/kotlin/com/github/zly2006/enclosure/EnclosureArea.kt b/src/main/kotlin/com/github/zly2006/enclosure/EnclosureArea.kt index f6b765a..583d61c 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/EnclosureArea.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/EnclosureArea.kt @@ -6,6 +6,7 @@ import com.github.zly2006.enclosure.gui.EnclosureScreenHandler import com.github.zly2006.enclosure.network.play.SyncPermissionS2CPacket import com.github.zly2006.enclosure.utils.* import com.github.zly2006.enclosure.utils.Serializable2Text.SerializationSettings +import com.mojang.authlib.GameProfile import net.fabricmc.fabric.api.networking.v1.PacketByteBufs import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking import net.minecraft.nbt.NbtCompound @@ -72,6 +73,12 @@ open class EnclosureArea : PersistentState, EnclosureView { override var father: PermissionHolder? = null internal set val uuid: UUID + class ForceLoadTicket( + val executor: GameProfile, + var remainingTicks: Int, + val level: Int + ) + var ticket: ForceLoadTicket? = null override val fullName: String get() = if (father != null) { @@ -124,6 +131,14 @@ open class EnclosureArea : PersistentState, EnclosureView { } else { null } + ticket = if (compound.contains("ticket", NbtElement.COMPOUND_TYPE.toInt())) { + val ticket = compound.getCompound("ticket") + ForceLoadTicket( + GameProfile(ticket.getUuid("executor"), ticket.getString("executor_name")), + ticket.getInt("remaining_ticks"), + ticket.getInt("level") + ) + } else null } operator fun Map.get(perm: Permission): Boolean? { @@ -205,6 +220,14 @@ open class EnclosureArea : PersistentState, EnclosureView { if (music != null) { nbt.putString("music", music.toString()) } + if (ticket != null) { + val ticketNbt = NbtCompound() + ticketNbt.putUuid("executor", ticket!!.executor.id) + ticketNbt.putString("executor_name", ticket!!.executor.name) + ticketNbt.putInt("remaining_ticks", ticket!!.remainingTicks) + ticketNbt.putInt("level", ticket!!.level) + nbt.put("ticket", ticketNbt) + } return nbt } diff --git a/src/main/kotlin/com/github/zly2006/enclosure/command/AdminSubcommand.kt b/src/main/kotlin/com/github/zly2006/enclosure/command/AdminSubcommand.kt index 3c73710..f6fefd8 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/command/AdminSubcommand.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/command/AdminSubcommand.kt @@ -17,7 +17,7 @@ import net.minecraft.util.math.BlockPos fun BuilderScope<*>.registerAdmin() { literal("admin") { literal("reload") { - permission("enclosure.command.admin.reload", BuilderScope.Companion.DefaultPermission.OP) + permission("enclosure.command.admin.reload") literal("all") { executes { ServerMain.reloadCommon() @@ -39,7 +39,7 @@ fun BuilderScope<*>.registerAdmin() { } } literal("limit_exceeded") { - permission("enclosure.command.admin.limit_exceeded", BuilderScope.Companion.DefaultPermission.OP) + permission("enclosure.command.admin.limit_exceeded") literal("size") { executes { ServerMain.getAllEnclosures().flatMap { @@ -77,7 +77,7 @@ fun BuilderScope<*>.registerAdmin() { } } literal("visited") { - permission("enclosure.command.admin.visited", BuilderScope.Companion.DefaultPermission.OP) + permission("enclosure.command.admin.visited") argument("player", EntityArgumentType.player()) { literal("get") { executes { @@ -102,7 +102,7 @@ fun BuilderScope<*>.registerAdmin() { } } literal("closest") { - permission("enclosure.command.admin.closest", BuilderScope.Companion.DefaultPermission.OP) + permission("enclosure.command.admin.closest") executes { val enclosure = ServerMain.getAllEnclosures(source.world).areas .minByOrNull { @@ -125,7 +125,7 @@ fun BuilderScope<*>.registerAdmin() { } } literal("perm-info") { - permission("enclosure.command.admin.perm_info", BuilderScope.Companion.DefaultPermission.OP) + permission("enclosure.command.admin.perm_info") argument(permissionArgument(com.github.zly2006.enclosure.utils.Permission.Target.Both)) { executes { val permission = Permission.getValue(StringArgumentType.getString(this, "permission")) @@ -139,7 +139,7 @@ fun BuilderScope<*>.registerAdmin() { } } literal("clients") { - permission("enclosure.command.admin.clients", BuilderScope.Companion.DefaultPermission.OP) + permission("enclosure.command.admin.clients") executes { EnclosureInstalledC2SPacket.installedClientMod.forEach { source.sendMessage( diff --git a/src/main/kotlin/com/github/zly2006/enclosure/command/BuilderScope.kt b/src/main/kotlin/com/github/zly2006/enclosure/command/BuilderScope.kt index 1faec68..f29885d 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/command/BuilderScope.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/command/BuilderScope.kt @@ -175,13 +175,12 @@ class BuilderScope(var parent: T) { "enclosure.bypass" to DefaultPermission.OP ) } - fun permission(s: String, defaultPermission: DefaultPermission) { - val old = parent.requirement + fun permission(s: String, defaultPermission: DefaultPermission = DefaultPermission.OP) { if (!map.containsKey(s)) { map[s] = defaultPermission } parent.requires { source -> - checkPermission(source, s) && old.test(source) + checkPermission(source, s) } } } diff --git a/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureCommand.kt b/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureCommand.kt index 4cce12f..2f29be7 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureCommand.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureCommand.kt @@ -213,6 +213,7 @@ fun register(dispatcher: CommandDispatcher, access: Command literal("experimental") { registerMusic() + registerForceLoad() } } return dispatcher.register(node.parent) diff --git a/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureSelector.kt b/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureSelector.kt deleted file mode 100644 index 1b79e03..0000000 --- a/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureSelector.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.github.zly2006.enclosure.command - -import com.google.gson.JsonObject -import com.mojang.brigadier.StringReader -import com.mojang.brigadier.arguments.ArgumentType -import com.mojang.brigadier.context.CommandContext -import com.mojang.brigadier.suggestion.Suggestions -import com.mojang.brigadier.suggestion.SuggestionsBuilder -import net.minecraft.command.CommandRegistryAccess -import net.minecraft.command.argument.serialize.ArgumentSerializer -import net.minecraft.command.argument.serialize.ArgumentSerializer.ArgumentTypeProperties -import net.minecraft.network.PacketByteBuf -import net.minecraft.registry.Registries -import net.minecraft.registry.Registry -import java.util.* -import java.util.concurrent.CompletableFuture - -class EnclosureSelector( - var owner: UUID? = null, - var name: String, - var parent: String, - var createdBefore: Long, - var createdAfter: Long, -) { - -} - -class EnclosureArgumentType: ArgumentType { - override fun parse(reader: StringReader?): EnclosureSelector { - TODO("Not yet implemented") - } - - override fun listSuggestions(context: CommandContext, builder: SuggestionsBuilder): CompletableFuture { - return super.listSuggestions(context, builder) - } - - -} - -class EnclosureArgumentSerializer: ArgumentSerializer { - class Properties: ArgumentTypeProperties { - override fun createType(commandRegistryAccess: CommandRegistryAccess?): EnclosureArgumentType { - TODO("Not yet implemented") - } - - override fun getSerializer(): ArgumentSerializer { - TODO("Not yet implemented") - } - } - - override fun writePacket(properties: Properties?, buf: PacketByteBuf?) { - TODO("Not yet implemented") - } - - override fun fromPacket(buf: PacketByteBuf?): Properties { - TODO("Not yet implemented") - } - - override fun getArgumentTypeProperties(argumentType: EnclosureArgumentType?): Properties { - TODO("Not yet implemented") - } - - override fun writeJson(properties: Properties?, json: JsonObject?) { - TODO("Not yet implemented") - } -} - -fun registerArgType(commandRegistryAccess: CommandRegistryAccess) { - Registry.register( - Registries.COMMAND_ARGUMENT_TYPE, - "enclosure:enclosure", - // EnclosureArgumentType::class.java, - EnclosureArgumentSerializer() - ) -} diff --git a/src/main/kotlin/com/github/zly2006/enclosure/command/ForceLoadSubcommand.kt b/src/main/kotlin/com/github/zly2006/enclosure/command/ForceLoadSubcommand.kt new file mode 100644 index 0000000..c883044 --- /dev/null +++ b/src/main/kotlin/com/github/zly2006/enclosure/command/ForceLoadSubcommand.kt @@ -0,0 +1,41 @@ +package com.github.zly2006.enclosure.command + +import com.github.zly2006.enclosure.EnclosureArea +import com.github.zly2006.enclosure.utils.checkPermission +import me.lucko.fabric.api.permissions.v0.Options +import net.minecraft.server.command.ServerCommandSource +import net.minecraft.server.world.ChunkLevelType +import net.minecraft.server.world.ChunkLevels +import net.minecraft.server.world.ChunkTicketType + +fun BuilderScope<*>.registerForceLoad() { + fun forceLoad(source: ServerCommandSource, area: EnclosureArea, ticks: Int, level: Int) { + if (checkPermission(source, "enclosure.bypass")) { + + } + } + + literal("force-load") { + argument(landArgument()) { + literal("blocks") { + permission("enclosure.command.force_load") + val level = ChunkLevels.getLevelFromType(ChunkLevelType.BLOCK_TICKING) + executes { + val maxTime = Options.get(source, "enclosure.load.max_time", 21600) { it.toInt() } + val land = getEnclosure(this) + ChunkTicketType.FORCED + forceLoad(source, land, maxTime * 20, level) + } + } + literal("entities") { + permission("enclosure.command.force_load") + val level = ChunkLevels.getLevelFromType(ChunkLevelType.ENTITY_TICKING) + executes { + val maxTime = Options.get(source, "enclosure.load.max_time", 21600) { it.toInt() } + val land = getEnclosure(this) + forceLoad(source, land, maxTime * 20, level) + } + } + } + } +} diff --git a/src/main/kotlin/com/github/zly2006/enclosure/command/MusicSubcommand.kt b/src/main/kotlin/com/github/zly2006/enclosure/command/MusicSubcommand.kt index 2921385..2239776 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/command/MusicSubcommand.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/command/MusicSubcommand.kt @@ -9,6 +9,7 @@ import net.minecraft.server.command.CommandManager fun BuilderScope<*>.registerMusic() { literal("music") { literal("set") { + permission("enclosure.command.music.set") argument( CommandManager.argument("music", IdentifierArgumentType.identifier()) .suggests(SuggestionProviders.AVAILABLE_SOUNDS)