-
-
Notifications
You must be signed in to change notification settings - Fork 837
/
Operations.java
131 lines (115 loc) · 4.21 KB
/
Operations.java
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* Copyright (C) WorldEdit team and contributors
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.function.operation;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extension.platform.Capability;
import com.sk89q.worldedit.function.task.Task;
import javax.annotation.Nullable;
/**
* Operation helper methods.
*/
public final class Operations {
private Operations() {
}
private static RunContext BASIC_CONTEXT = new RunContext();
/**
* Complete a given operation synchronously until it completes.
*
* @param op operation to execute
* @throws WorldEditException WorldEdit exception
*/
public static void complete(Operation op) throws WorldEditException {
while (op != null) {
op = op.resume(BASIC_CONTEXT);
}
}
/**
* Complete a given operation synchronously until it completes. Catch all
* errors that is not {@link MaxChangedBlocksException} for legacy reasons.
*
* @param op operation to execute
* @throws MaxChangedBlocksException thrown when too many blocks have been changed
*/
public static void completeLegacy(Operation op) throws MaxChangedBlocksException {
while (op != null) {
try {
op = op.resume(BASIC_CONTEXT);
} catch (MaxChangedBlocksException e) {
throw e;
} catch (WorldEditException e) {
throw new RuntimeException(e);
}
}
}
/**
* Complete a given operation synchronously until it completes. Re-throw all
* {@link WorldEditException} exceptions as
* {@link RuntimeException}s.
*
* @param op operation to execute
*/
public static void completeBlindly(Operation op) {
while (op != null) {
try {
op = op.resume(BASIC_CONTEXT);
} catch (WorldEditException e) {
throw new RuntimeException(e);
}
}
}
/**
* Complete a given operation in a queue until it completes.
*
* <p>
* Uses default
* </p>
*
* @param op operation to execute
*/
public static void completeQueued(Operation op) {
completeQueued(op, null, null);
}
/**
* Complete a given operation in a queue until it completes.
*
* @param op operation to execute
* @param actor The actor to complete this with, or null for console
* @param editSession The edit session
* @return The task that this creates
*/
public static <T> Task<T> completeQueued(Operation op, @Nullable Actor actor, @Nullable EditSession editSession) {
checkNotNull(op);
if (actor == null) {
actor = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.USER_COMMANDS).getConsoleCommandSender();
}
actor.print("Added operation to queue.");
Operation operation = op;
if (editSession != null && !(op instanceof FlushOperation)) {
operation = new OperationQueue(op, new FlushOperation(actor, editSession));
}
Task<T> task = new Task<>(operation);
WorldEdit.getInstance().getTaskManager().getTaskQueue(actor).offer(task);
return task;
}
}