summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt
blob: 9c3ca4f8719b825dc5948d8394713800be73badd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package io.dico.parcels2.command

import io.dico.dicore.command.CommandException
import io.dico.dicore.command.ExecutionContext
import io.dico.dicore.command.Validate
import io.dico.dicore.command.annotation.Cmd
import io.dico.dicore.command.annotation.Flag
import io.dico.parcels2.ParcelsPlugin
import io.dico.parcels2.PlayerProfile
import io.dico.parcels2.Privilege
import io.dico.parcels2.command.ParcelTarget.Companion.ID
import io.dico.parcels2.command.ParcelTarget.Kind

class CommandsAdmin(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {

    @Cmd("setowner")
    @RequireParcelPrivilege(Privilege.ADMIN)
    fun ParcelScope.cmdSetowner(target: PlayerProfile): Any? {
        parcel.owner = target

        val fakeString = if (target.isFake) " (fake)" else ""
        return "${target.notNullName}$fakeString is the new owner of (${parcel.id.idString})"
    }

    @Cmd("dispose")
    @RequireParcelPrivilege(Privilege.ADMIN)
    fun ParcelScope.cmdDispose(): Any? {
        parcel.dispose()
        return "Data of (${parcel.id.idString}) has been disposed"
    }

    @Cmd("reset")
    @RequireParcelPrivilege(Privilege.ADMIN)
    fun ParcelScope.cmdReset(context: ExecutionContext, @Flag sure: Boolean): Any? {
        Validate.isTrue(!parcel.hasBlockVisitors, "A process is already running in this parcel")
        if (!sure) return areYouSureMessage(context)

        parcel.dispose()
        world.blockManager.clearParcel(parcel.id).reportProgressUpdates(context, "Reset")
        return "Data of (${parcel.id.idString}) has been disposed"
    }

    @Cmd("swap")
    @RequireParcelPrivilege(Privilege.ADMIN)
    fun ParcelScope.cmdSwap(context: ExecutionContext,
                            @Kind(ID) target: ParcelTarget,
                            @Flag sure: Boolean): Any? {
        Validate.isTrue(!parcel.hasBlockVisitors, "A process is already running in this parcel")
        if (!sure) return areYouSureMessage(context)

        val parcel2 = (target as ParcelTarget.ByID).getParcel()
            ?: throw CommandException("Invalid parcel target")

        // Validate.isTrue(parcel2.world == world, "Parcel must be in the same world")
        Validate.isTrue(!parcel2.hasBlockVisitors, "A process is already running in this parcel")

        val data = parcel.data
        parcel.copyData(parcel2.data)
        parcel2.copyData(data)

        world.blockManager.swapParcels(parcel.id, parcel2.id).reportProgressUpdates(context, "Swap")
        return null
    }

}