Skip to content

Commit 80d80fb

Browse files
Added kissing your partner(heart particles) closes #1; new version
1 parent f01651f commit 80d80fb

17 files changed

+123
-70
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
}
77

88
group "de.randombyte"
9-
version "2.1"
9+
version "2.2"
1010

1111
repositories {
1212
jcenter()

src/main/kotlin/de/randombyte/unity/Unity.kt

Lines changed: 63 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.randombyte.unity
22

3+
import com.flowpowered.math.vector.Vector3d
34
import com.google.inject.Inject
45
import de.randombyte.kosp.config.ConfigManager
56
import de.randombyte.kosp.extensions.toOptional
@@ -10,6 +11,8 @@ import de.randombyte.unity.Unity.Companion.NAME
1011
import de.randombyte.unity.Unity.Companion.NUCLEUS_ID
1112
import de.randombyte.unity.Unity.Companion.VERSION
1213
import de.randombyte.unity.commands.*
14+
import de.randombyte.unity.config.Config
15+
import de.randombyte.unity.config.ConfigAccessor
1316
import io.github.nucleuspowered.nucleus.api.service.NucleusMessageTokenService
1417
import ninja.leaping.configurate.commented.CommentedConfigurationNode
1518
import ninja.leaping.configurate.loader.ConfigurationLoader
@@ -19,8 +22,15 @@ import org.spongepowered.api.Sponge
1922
import org.spongepowered.api.command.args.GenericArguments.player
2023
import org.spongepowered.api.command.spec.CommandSpec
2124
import org.spongepowered.api.config.DefaultConfig
25+
import org.spongepowered.api.data.key.Keys
26+
import org.spongepowered.api.data.property.entity.EyeLocationProperty
27+
import org.spongepowered.api.effect.particle.ParticleEffect
28+
import org.spongepowered.api.effect.particle.ParticleTypes
2229
import org.spongepowered.api.entity.living.player.Player
2330
import org.spongepowered.api.event.Listener
31+
import org.spongepowered.api.event.entity.InteractEntityEvent
32+
import org.spongepowered.api.event.filter.Getter
33+
import org.spongepowered.api.event.filter.cause.Root
2434
import org.spongepowered.api.event.game.GameReloadEvent
2535
import org.spongepowered.api.event.game.state.GameInitializationEvent
2636
import org.spongepowered.api.event.game.state.GameStartingServerEvent
@@ -44,7 +54,7 @@ class Unity @Inject constructor(
4454
companion object {
4555
const val ID = "unity"
4656
const val NAME = "Unity"
47-
const val VERSION = "2.1"
57+
const val VERSION = "2.2"
4858
const val AUTHOR = "RandomByte"
4959

5060
const val NUCLEUS_ID = "nucleus"
@@ -63,9 +73,28 @@ class Unity @Inject constructor(
6373
simpleTextTemplateSerialization = true
6474
)
6575

76+
private lateinit var config: Config
77+
78+
private val configAccessor = object : ConfigAccessor() {
79+
override fun get() = config
80+
override fun set(config: Config) {
81+
this@Unity.config = config
82+
saveConfig() // always save config in case of sudden server shutdown
83+
}
84+
}
85+
6686
// <requestee, requesters>
6787
private val unityRequests: MutableMap<UUID, List<UUID>> = mutableMapOf()
6888

89+
private val kissingParticleEffect = lazy {
90+
ParticleEffect.builder()
91+
.type(ParticleTypes.HEART)
92+
.quantity(1)
93+
.offset(Vector3d(0.3, 0.3, 0.3))
94+
.velocity(Vector3d(0.1, 0.1, 0.0))
95+
.build()
96+
}
97+
6998
@Listener
7099
fun onInit(event: GameInitializationEvent) {
71100
registerCommands()
@@ -76,12 +105,14 @@ class Unity @Inject constructor(
76105
@Listener
77106
fun onWorldsLoaded(event: GameStartingServerEvent) {
78107
// do this here to ensure all worlds are loaded for location deserialization
79-
configManager.generate()
108+
loadConfig()
109+
saveConfig()
80110
}
81111

82112
@Listener
83113
fun onReload(event: GameReloadEvent) {
84-
configManager.generate()
114+
loadConfig()
115+
saveConfig()
85116
unityRequests.clear()
86117

87118
logger.info("Reloaded!")
@@ -103,6 +134,16 @@ class Unity @Inject constructor(
103134
})
104135
}
105136

137+
@Listener
138+
fun onKissPartner(event: InteractEntityEvent.Secondary.MainHand, @Root player: Player, @Getter("getTargetEntity") partner: Player) {
139+
if (!config.kissingEnabled || !player.get(Keys.IS_SNEAKING).orElse(false)) return
140+
with (config.unities) {
141+
val unity = getUnity(player.uniqueId) ?: return
142+
if (unity.getOtherMember(player.uniqueId) != partner.uniqueId) return
143+
partner.world.spawnParticles(kissingParticleEffect.value, partner.getProperty(EyeLocationProperty::class.java).get().value)
144+
}
145+
}
146+
106147
private fun registerCommands() {
107148
val removeRequest = { requester: UUID, requestee: UUID ->
108149
unityRequests += (requestee to (unityRequests[requestee] ?: emptyList()).filterNot { it == requester })
@@ -113,7 +154,7 @@ class Unity @Inject constructor(
113154
.permission(PLAYER_PERMISSION)
114155
.arguments(player(PLAYER_ARG.toText()))
115156
.executor(RequestUnityCommand(
116-
configManager,
157+
configAccessor,
117158
addRequest = { requester, requestee ->
118159
val existingRequesters = unityRequests[requestee] ?: emptyList()
119160
if (requester in existingRequesters) return@RequestUnityCommand false
@@ -124,47 +165,55 @@ class Unity @Inject constructor(
124165

125166
.child(CommandSpec.builder()
126167
.permission(PLAYER_PERMISSION)
127-
.executor(HelpCommand(configManager))
168+
.executor(HelpCommand(configAccessor))
128169
.build(), "help")
129170
.child(CommandSpec.builder()
130171
.permission(PLAYER_PERMISSION)
131172
.arguments(player(PLAYER_ARG.toText()))
132-
.executor(AcceptRequestCommand(configManager, this::unityRequests, removeRequest))
173+
.executor(AcceptRequestCommand(configAccessor, this::unityRequests, removeRequest))
133174
.build(), "accept")
134175
.child(CommandSpec.builder()
135176
.permission(PLAYER_PERMISSION)
136177
.arguments(player(PLAYER_ARG.toText()))
137-
.executor(DeclineRequestCommand(configManager, this::unityRequests, removeRequest))
178+
.executor(DeclineRequestCommand(configAccessor, this::unityRequests, removeRequest))
138179
.build(), "decline")
139180
.child(CommandSpec.builder()
140181
.permission(PLAYER_PERMISSION)
141182
.arguments(player(PLAYER_ARG.toText()))
142-
.executor(CancelRequestCommand(configManager, this::unityRequests, removeRequest))
183+
.executor(CancelRequestCommand(configAccessor, this::unityRequests, removeRequest))
143184
.build(), "cancel")
144185
.child(CommandSpec.builder()
145186
.permission(PLAYER_PERMISSION)
146-
.executor(ListUnitiesCommand(configManager))
187+
.executor(ListUnitiesCommand(configAccessor))
147188
.build(), "list")
148189
.child(CommandSpec.builder()
149190
.permission(PLAYER_PERMISSION)
150-
.executor(DivorceCommand(configManager))
191+
.executor(DivorceCommand(configAccessor))
151192
.build(), "divorce")
152193
.child(CommandSpec.builder()
153194
.permission(PLAYER_PERMISSION)
154-
.executor(TeleportCommand(configManager))
195+
.executor(TeleportCommand(configAccessor))
155196
.build(), "teleport", "tp")
156197
.child(CommandSpec.builder()
157198
.permission(PLAYER_PERMISSION)
158-
.executor(GiftCommand(configManager))
199+
.executor(GiftCommand(configAccessor))
159200
.build(), "gift")
160201
.child(CommandSpec.builder()
161202
.permission(PLAYER_PERMISSION)
162-
.executor(HomeCommand(configManager))
203+
.executor(HomeCommand(configAccessor))
163204
.child(CommandSpec.builder()
164205
.permission(PLAYER_PERMISSION)
165-
.executor(SetHomeCommand(configManager))
206+
.executor(SetHomeCommand(configAccessor))
166207
.build(), "set")
167208
.build(), "home")
168209
.build(), "unity", "marry")
169210
}
211+
212+
private fun loadConfig() {
213+
config = configManager.get()
214+
}
215+
216+
private fun saveConfig() {
217+
configManager.save(config)
218+
}
170219
}

src/main/kotlin/de/randombyte/unity/commands/AcceptRequestCommand.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package de.randombyte.unity.commands
22

33
import de.randombyte.kosp.PlayerExecutedCommand
4-
import de.randombyte.kosp.config.ConfigManager
54
import de.randombyte.kosp.extensions.toText
6-
import de.randombyte.unity.Config
75
import de.randombyte.unity.Unity
6+
import de.randombyte.unity.config.Config
7+
import de.randombyte.unity.config.ConfigAccessor
88
import org.spongepowered.api.command.CommandException
99
import org.spongepowered.api.command.CommandResult
1010
import org.spongepowered.api.command.args.CommandContext
@@ -13,7 +13,7 @@ import java.time.Instant
1313
import java.util.*
1414

1515
class AcceptRequestCommand(
16-
val configManager: ConfigManager<Config>,
16+
val configAccessor: ConfigAccessor,
1717
val getRequests: () -> Map<UUID, List<UUID>>,
1818
val removeRequest: (requester: UUID, requestee: UUID) -> Unit
1919
) : PlayerExecutedCommand() {
@@ -23,7 +23,7 @@ class AcceptRequestCommand(
2323
throw CommandException("You don't have a request from '${requester.name}'!".toText())
2424
}
2525

26-
val config = configManager.get()
26+
val config = configAccessor.get()
2727
requireSingle(player, requester, config.unities)
2828

2929
removeRequest(requester.uniqueId, player.uniqueId)
@@ -32,7 +32,7 @@ class AcceptRequestCommand(
3232
member2 = player.uniqueId,
3333
date = Date.from(Instant.now())
3434
))
35-
configManager.save(newConfig)
35+
configAccessor.set(newConfig)
3636

3737
val broadcastMessage = config.texts.unityBroadcast.apply(mapOf(
3838
"member1" to requester.name,

src/main/kotlin/de/randombyte/unity/commands/CancelRequestCommand.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package de.randombyte.unity.commands
22

33
import de.randombyte.kosp.PlayerExecutedCommand
4-
import de.randombyte.kosp.config.ConfigManager
54
import de.randombyte.kosp.extensions.toText
6-
import de.randombyte.unity.Config
75
import de.randombyte.unity.Unity
6+
import de.randombyte.unity.config.ConfigAccessor
87
import org.spongepowered.api.command.CommandException
98
import org.spongepowered.api.command.CommandResult
109
import org.spongepowered.api.command.args.CommandContext
1110
import org.spongepowered.api.entity.living.player.Player
1211
import java.util.*
1312

1413
class CancelRequestCommand(
15-
val configManager: ConfigManager<Config>,
14+
val configAccessor: ConfigAccessor,
1615
val getRequests: () -> Map<UUID, List<UUID>>,
1716
val removeRequest: (requester: UUID, requestee: UUID) -> Unit
1817
) : PlayerExecutedCommand() {
@@ -24,7 +23,7 @@ class CancelRequestCommand(
2423

2524
removeRequest(player.uniqueId, requestee.uniqueId)
2625

27-
val config = configManager.get()
26+
val config = configAccessor.get()
2827
requestee.sendMessage(config.texts.cancelledRequestMessage.apply(mapOf(
2928
"requester" to player.name
3029
)).build())

src/main/kotlin/de/randombyte/unity/commands/DeclineRequestCommand.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package de.randombyte.unity.commands
22

33
import de.randombyte.kosp.PlayerExecutedCommand
4-
import de.randombyte.kosp.config.ConfigManager
54
import de.randombyte.kosp.extensions.toText
6-
import de.randombyte.unity.Config
75
import de.randombyte.unity.Unity
6+
import de.randombyte.unity.config.ConfigAccessor
87
import org.spongepowered.api.command.CommandException
98
import org.spongepowered.api.command.CommandResult
109
import org.spongepowered.api.command.args.CommandContext
1110
import org.spongepowered.api.entity.living.player.Player
1211
import java.util.*
1312

1413
class DeclineRequestCommand(
15-
val configManager: ConfigManager<Config>,
14+
val configAccessor: ConfigAccessor,
1615
val getRequests: () -> Map<UUID, List<UUID>>,
1716
val removeRequest: (requester: UUID, requestee: UUID) -> Unit
1817
) : PlayerExecutedCommand() {
@@ -24,7 +23,7 @@ class DeclineRequestCommand(
2423

2524
removeRequest(requester.uniqueId, player.uniqueId)
2625

27-
val broadcastMessage = configManager.get().texts.declinedRequestBroadcast.apply(mapOf(
26+
val broadcastMessage = configAccessor.get().texts.declinedRequestBroadcast.apply(mapOf(
2827
"requester" to requester.name,
2928
"requestee" to player.name)).build()
3029
broadcast(broadcastMessage)

src/main/kotlin/de/randombyte/unity/commands/DivorceCommand.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package de.randombyte.unity.commands
22

3-
import de.randombyte.kosp.config.ConfigManager
43
import de.randombyte.kosp.config.serializers.duration.SimpleDurationTypeSerializer
54
import de.randombyte.kosp.extensions.getUser
65
import de.randombyte.kosp.extensions.red
7-
import de.randombyte.unity.Config
6+
import de.randombyte.unity.config.Config
7+
import de.randombyte.unity.config.ConfigAccessor
88
import org.spongepowered.api.command.CommandException
99
import org.spongepowered.api.command.CommandResult
1010
import org.spongepowered.api.command.args.CommandContext
@@ -13,8 +13,8 @@ import java.time.Duration
1313
import java.time.Instant
1414

1515
class DivorceCommand(
16-
val configManager: ConfigManager<Config>
17-
) : UnityCommand(getConfig = configManager::get) {
16+
configAccessor: ConfigAccessor
17+
) : UnityCommand(configAccessor) {
1818
override fun executedByUnityMember(player: Player, args: CommandContext, thisUnity: Config.Unity, config: Config): CommandResult {
1919
val firstAllowedDivorceDateMillis = thisUnity.date.toInstant().toEpochMilli().plus(config.divorceCooldown.toMillis())
2020
val remainingMillis = firstAllowedDivorceDateMillis - Instant.now().toEpochMilli()
@@ -24,7 +24,7 @@ class DivorceCommand(
2424
}
2525

2626
val newConfig = config.copy(unities = config.unities - thisUnity)
27-
configManager.save(newConfig)
27+
configAccessor.set(newConfig)
2828

2929
val otherMember = thisUnity.getOtherMember(player.uniqueId)
3030
val otherMemberName = otherMember.getUser()?.name ?: "Unknown"

src/main/kotlin/de/randombyte/unity/commands/GiftCommand.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package de.randombyte.unity.commands
22

3-
import de.randombyte.kosp.config.ConfigManager
43
import de.randombyte.kosp.extensions.getUser
54
import de.randombyte.kosp.extensions.give
65
import de.randombyte.kosp.extensions.toText
7-
import de.randombyte.unity.Config
6+
import de.randombyte.unity.config.Config
7+
import de.randombyte.unity.config.ConfigAccessor
88
import org.spongepowered.api.command.CommandException
99
import org.spongepowered.api.command.CommandResult
1010
import org.spongepowered.api.command.args.CommandContext
1111
import org.spongepowered.api.data.type.HandTypes
1212
import org.spongepowered.api.entity.living.player.Player
1313

1414
class GiftCommand(
15-
val configManager: ConfigManager<Config>
16-
) : UnityCommand(getConfig = configManager::get) {
15+
configAccessor: ConfigAccessor
16+
) : UnityCommand(configAccessor) {
1717
override fun executedByUnityMember(player: Player, args: CommandContext, thisUnity: Config.Unity, config: Config): CommandResult {
1818
val itemInHand = player.getItemInHand(HandTypes.MAIN_HAND)
1919
.orElseThrow { CommandException("You must hold an item in your hand!".toText()) }

src/main/kotlin/de/randombyte/unity/commands/HelpCommand.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
package de.randombyte.unity.commands
22

3-
import de.randombyte.kosp.config.ConfigManager
43
import de.randombyte.kosp.getServiceOrFail
5-
import de.randombyte.unity.Config
4+
import de.randombyte.unity.config.ConfigAccessor
65
import org.spongepowered.api.command.CommandResult
76
import org.spongepowered.api.command.CommandSource
87
import org.spongepowered.api.command.args.CommandContext
98
import org.spongepowered.api.command.spec.CommandExecutor
109
import org.spongepowered.api.service.pagination.PaginationService
1110

1211
class HelpCommand(
13-
val configManager: ConfigManager<Config>
12+
val configAccessor: ConfigAccessor
1413
) : CommandExecutor {
1514
override fun execute(src: CommandSource, args: CommandContext): CommandResult {
16-
val config = configManager.get()
15+
val config = configAccessor.get()
1716

1817
getServiceOrFail(PaginationService::class).builder()
1918
.title(config.texts.helpCommandTitle)

src/main/kotlin/de/randombyte/unity/commands/HomeCommand.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package de.randombyte.unity.commands
22

3-
import de.randombyte.kosp.config.ConfigManager
43
import de.randombyte.kosp.extensions.toText
5-
import de.randombyte.unity.Config
4+
import de.randombyte.unity.config.Config
5+
import de.randombyte.unity.config.ConfigAccessor
66
import org.spongepowered.api.command.CommandException
77
import org.spongepowered.api.command.CommandResult
88
import org.spongepowered.api.command.args.CommandContext
99
import org.spongepowered.api.entity.living.player.Player
1010

1111
class HomeCommand(
12-
configManager: ConfigManager<Config>
13-
) : UnityCommand(getConfig = configManager::get) {
12+
configAccessor: ConfigAccessor
13+
) : UnityCommand(configAccessor) {
1414
override fun executedByUnityMember(player: Player, args: CommandContext, thisUnity: Config.Unity, config: Config): CommandResult {
1515
val home = thisUnity.home ?: throw CommandException("No home set!".toText())
1616
player.location = home

0 commit comments

Comments
 (0)