Skip to content

Commit aa2b9a7

Browse files
authored
Merge pull request #126 from Rubenicos/feature/function-action
Add function action
2 parents dd1add7 + f6206c7 commit aa2b9a7

File tree

5 files changed

+87
-6
lines changed

5 files changed

+87
-6
lines changed

api/action/src/main/kotlin/trplugins/menu/api/action/ActionHandle.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import taboolib.common.platform.function.submit
55
import taboolib.library.reflex.Reflex.Companion.invokeConstructor
66
import trplugins.menu.api.action.base.ActionBase
77
import trplugins.menu.api.action.base.ActionEntry
8-
import trplugins.menu.api.action.impl.logic.Break
8+
import trplugins.menu.api.action.base.ActionEval
99
import trplugins.menu.api.action.impl.logic.Delay
1010
import trplugins.menu.util.ClassUtils
1111
import trplugins.menu.util.EvalResult
12+
import java.util.concurrent.atomic.AtomicBoolean
1213
import java.util.function.BiFunction
1314

1415
/**
@@ -71,6 +72,7 @@ class ActionHandle(
7172
val run = mutableListOf<ActionEntry>()
7273
var result = true
7374
var delay = 0L
75+
val allowed = AtomicBoolean(true)
7476

7577
run filter@{
7678
while (actions.hasNext()) {
@@ -79,12 +81,22 @@ class ActionHandle(
7981
continue
8082
}
8183
when {
82-
action.base is Break && action.option.evalCondition(player) -> {
83-
result = false
84-
return@filter
84+
action.base is ActionEval -> {
85+
if (delay > 0) {
86+
submit(delay = delay) {
87+
allowed.set(action.eval(player))
88+
}
89+
} else if (!action.eval(player)) {
90+
result = false
91+
return@filter
92+
}
8593
}
8694
action.base is Delay -> delay += action.base.getDelay(player, action.contents.stringContent())
87-
delay > 0 -> submit(delay = delay) { action.execute(player) }
95+
delay > 0 -> submit(delay = delay) {
96+
if (allowed.get()) {
97+
action.execute(player)
98+
}
99+
}
88100
else -> run.add(action)
89101
}
90102
}

api/action/src/main/kotlin/trplugins/menu/api/action/base/ActionEntry.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ data class ActionEntry(
3131
else proceed.invoke()
3232
}
3333

34+
fun eval(player: ProxyPlayer): Boolean {
35+
var result = true
36+
if (option.evalCondition(player)) {
37+
option.evalPlayers(player) {
38+
if (!(base as ActionEval).onEval(contents, it, player)) {
39+
result = false
40+
}
41+
}
42+
}
43+
return result
44+
}
45+
3446

3547
companion object {
3648

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package trplugins.menu.api.action.base
2+
3+
import taboolib.common.platform.ProxyPlayer
4+
5+
/**
6+
* @author Rubenicos
7+
* @date 2024/11/21 14:42
8+
*/
9+
interface ActionEval {
10+
11+
fun onEval(contents: ActionContents, player: ProxyPlayer, placeholderPlayer: ProxyPlayer = player): Boolean
12+
}
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package trplugins.menu.api.action.impl.logic
22

3+
import taboolib.common.platform.ProxyPlayer
34
import trplugins.menu.api.action.ActionHandle
45
import trplugins.menu.api.action.base.ActionBase
6+
import trplugins.menu.api.action.base.ActionContents
7+
import trplugins.menu.api.action.base.ActionEval
58

69
/**
710
* TrMenu
@@ -10,6 +13,10 @@ import trplugins.menu.api.action.base.ActionBase
1013
* @author Score2
1114
* @since 2022/02/10 22:09
1215
*/
13-
class Break(handle: ActionHandle) : ActionBase(handle) {
16+
class Break(handle: ActionHandle) : ActionBase(handle), ActionEval {
1417
override val regex = "return|break".toRegex()
18+
19+
override fun onEval(contents: ActionContents, player: ProxyPlayer, placeholderPlayer: ProxyPlayer): Boolean {
20+
return false
21+
}
1522
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package trplugins.menu.api.action.impl.script
2+
3+
import taboolib.common.platform.ProxyPlayer
4+
import taboolib.common.util.subList
5+
import trplugins.menu.api.action.ActionHandle
6+
import trplugins.menu.api.action.base.ActionBase
7+
import trplugins.menu.api.action.base.ActionContents
8+
import trplugins.menu.api.action.base.ActionEval
9+
import trplugins.menu.module.display.session
10+
import trplugins.menu.util.Regexs
11+
12+
/**
13+
* @author Rubenicos
14+
* @date 2024/11/21 14:42
15+
*/
16+
class Function(handle: ActionHandle) : ActionBase(handle), ActionEval {
17+
18+
override val regex = "(run-?)?functions?|run".toRegex()
19+
20+
override fun onExecute(contents: ActionContents, player: ProxyPlayer, placeholderPlayer: ProxyPlayer) {
21+
onEval(contents, player, placeholderPlayer)
22+
}
23+
24+
override fun onEval(contents: ActionContents, player: ProxyPlayer, placeholderPlayer: ProxyPlayer): Boolean {
25+
val session = player.session()
26+
val menu = session.menu ?: return true
27+
val func = contents.stringContent().parseContent(placeholderPlayer).split(' ')
28+
29+
menu.settings.internalFunctions.forEach {
30+
if (it.id == func[0]) {
31+
val args = subList(func, 1, func.size)
32+
return !it.compile(session, args).asString().lowercase().matches(Regexs.FALSE)
33+
}
34+
}
35+
return true
36+
}
37+
38+
}

0 commit comments

Comments
 (0)