1
1
package br.com.devsrsouza.kotlinbukkitapi.dsl.player
2
2
3
+ import br.com.devsrsouza.kotlinbukkitapi.KotlinBukkitAPI
3
4
import br.com.devsrsouza.kotlinbukkitapi.dsl.event.displaced
4
5
import br.com.devsrsouza.kotlinbukkitapi.dsl.event.event
5
6
import br.com.devsrsouza.kotlinbukkitapi.dsl.scheduler.task
6
7
import br.com.devsrsouza.kotlinbukkitapi.utils.OnlinePlayerMap
7
- import br.com.devsrsouza.kotlinbukkitapi.utils.onlinePlayerListOf
8
8
import br.com.devsrsouza.kotlinbukkitapi.utils.onlinePlayerMapOf
9
9
import org.bukkit.entity.Player
10
10
import org.bukkit.event.Listener
11
11
import org.bukkit.event.player.AsyncPlayerChatEvent
12
12
import org.bukkit.event.player.PlayerMoveEvent
13
+ import org.bukkit.event.server.PluginDisableEvent
14
+ import org.bukkit.plugin.Plugin
13
15
14
16
typealias ChatInputCallBack = Player .(String ) -> Unit
15
- typealias PlayerCallback = Player .() -> Unit
16
- typealias PlayerMoveFunction = Player .() -> Boolean
17
+ typealias PlayerCallbackFunction <R > = Player .() -> R
18
+ typealias PlayerQuitFunction = PlayerCallbackFunction <Unit >
19
+ typealias PlayerMoveFunction = PlayerCallbackFunction <Boolean >
17
20
18
- fun Player.chatInput (sync : Boolean = false, callback : ChatInputCallBack ) {
19
- PlayerController .inputCallbacks.put(player, ChatInput (sync, callback))
21
+ fun Player.chatInput (sync : Boolean = false, plugin : Plugin = KotlinBukkitAPI . INSTANCE , callback : ChatInputCallBack ) {
22
+ PlayerController .inputCallbacks.put(player, ChatInput (plugin, sync, callback))
20
23
}
21
24
22
- inline fun Player.whenQuit (crossinline callback : PlayerCallback ) {
23
- PlayerController .functionsQuit.add (this ) {
24
- callback.invoke(player)
25
+ fun Player.whenQuit (plugin : Plugin = KotlinBukkitAPI . INSTANCE , callback : PlayerQuitFunction ) {
26
+ PlayerController .functionsQuit.put (this , PlayerCallback (plugin, callback) ) {
27
+ it. callback.invoke(player)
25
28
}
26
29
}
27
30
28
- fun Player.whenMove (callback : PlayerMoveFunction ) {
29
- PlayerController .functionsMove.put(this , callback)
31
+ fun Player.whenMove (plugin : Plugin = KotlinBukkitAPI . INSTANCE , callback : PlayerMoveFunction ) {
32
+ PlayerController .functionsMove.put(this , PlayerCallback (plugin, callback) )
30
33
}
31
34
32
- class ChatInput (val sync : Boolean , val callback : ChatInputCallBack )
35
+ class ChatInput (val plugin : Plugin , val sync : Boolean , val callback : ChatInputCallBack )
36
+ class PlayerCallback <R >(val plugin : Plugin , val callback : PlayerCallbackFunction <R >)
33
37
34
38
object PlayerController : Listener {
35
39
36
40
internal val inputCallbacks = OnlinePlayerMap <ChatInput >()
37
- internal val functionsMove = onlinePlayerMapOf<PlayerMoveFunction >()
38
- val functionsQuit = onlinePlayerListOf ()
41
+ internal val functionsMove = onlinePlayerMapOf<PlayerCallback < Boolean > >()
42
+ internal val functionsQuit = onlinePlayerMapOf< PlayerCallback < Unit >> ()
39
43
40
44
init {
41
45
event<AsyncPlayerChatEvent >(ignoreCancelled = true ) {
@@ -49,11 +53,22 @@ object PlayerController : Listener {
49
53
}
50
54
}
51
55
event<PlayerMoveEvent >(ignoreCancelled = true ) {
52
- if (displaced) {
53
- if (functionsMove[player]?.run { invoke(player) } == true ) {
56
+ if (displaced) {
57
+ if (functionsMove[player]?.run { callback. invoke(player) } == true ) {
54
58
isCancelled = true
55
59
}
56
60
}
57
61
}
62
+ event<PluginDisableEvent > {
63
+ inputCallbacks.entries.filter { it.value.plugin == plugin }.forEach {
64
+ inputCallbacks.remove(it.key)
65
+ }
66
+ functionsMove.entries.filter { it.value.plugin == plugin }.forEach {
67
+ functionsMove.remove(it.key)
68
+ }
69
+ functionsQuit.entries.filter { it.value.plugin == plugin }.forEach {
70
+ functionsQuit.remove(it.key)
71
+ }
72
+ }
58
73
}
59
74
}
0 commit comments