Skip to content

Commit b99f5cb

Browse files
committed
WeatherCommand.kt re-written.
Signed-off-by: Pavel Erokhin (MairwunNx) <MairwunNx@gmail.com>
1 parent 8def801 commit b99f5cb

1 file changed

Lines changed: 59 additions & 269 deletions

File tree

  • src/main/kotlin/com/mairwunnx/projectessentials/core/impl/vanilla/commands
Lines changed: 59 additions & 269 deletions
Original file line numberDiff line numberDiff line change
@@ -1,307 +1,97 @@
11
/**
2-
* This command implementation by Mojang.
3-
* And decompiled with idea source code was converted
4-
* to kotlin code.
5-
* Also added some logic, for example checking on
6-
* permissions, and for some commands shorten aliases.
2+
* ! This command implementation by Mojang Studios!
3+
*
4+
* Decompiled with idea source code was converted to kotlin code.
5+
* But with additions such as permissions checking and etc.
76
*
87
* 1. This can be bad code.
98
* 2. This file can be not formatter pretty.
109
*/
11-
1210
package com.mairwunnx.projectessentials.core.impl.vanilla.commands
1311

14-
15-
import com.mairwunnx.projectessentials.core.api.v1.SETTING_LOC_ENABLED
16-
import com.mairwunnx.projectessentials.core.api.v1.SETTING_WEATHER_COMMAND_DEFAULT_DURATION
1712
import com.mairwunnx.projectessentials.core.api.v1.commands.CommandAPI
1813
import com.mairwunnx.projectessentials.core.api.v1.commands.CommandAliases
19-
import com.mairwunnx.projectessentials.core.api.v1.extensions.hoverEventFrom
20-
import com.mairwunnx.projectessentials.core.api.v1.extensions.textComponentFrom
21-
import com.mairwunnx.projectessentials.core.api.v1.permissions.hasPermission
14+
import com.mairwunnx.projectessentials.core.impl.nativeMappingsConfiguration
2215
import com.mojang.brigadier.CommandDispatcher
23-
import com.mojang.brigadier.arguments.IntegerArgumentType
24-
import com.mojang.brigadier.exceptions.CommandSyntaxException
25-
import net.minecraft.command.CommandException
16+
import com.mojang.brigadier.arguments.IntegerArgumentType.getInteger
17+
import com.mojang.brigadier.arguments.IntegerArgumentType.integer
2618
import net.minecraft.command.CommandSource
2719
import net.minecraft.command.Commands
28-
import net.minecraft.util.text.Style
29-
import net.minecraft.util.text.TranslationTextComponent
30-
31-
/**
32-
* Weather type uses for [WeatherType] enum elements.
33-
* @since 2.0.0-SNAPSHOT.1.
34-
*/
35-
interface IWeatherType {
36-
/**
37-
* Weather type name for permissions checking.
38-
*/
39-
val type: String
40-
}
41-
42-
/**
43-
* Weather type enum class, contains all weather types for
44-
* other essentials modules.
45-
* @since 2.0.0-SNAPSHOT.1.
46-
*/
47-
enum class WeatherType : IWeatherType {
48-
/**
49-
* Sunny in-game weather.
50-
*/
51-
Sunny {
52-
override val type = "clear"
53-
},
54-
55-
/**
56-
* Rainy in-game weather.
57-
*/
58-
Rainy {
59-
override val type = "rain"
60-
},
61-
62-
/**
63-
* Thunder in-game weather.
64-
*/
65-
Thunder {
66-
override val type = "thunder"
67-
}
68-
}
69-
70-
internal object WeatherCommand : VanillaCommandBase() {
71-
private var sunAliases = configuration.take().aliases.sun + "sun"
72-
private var rainAliases = configuration.take().aliases.rain + "rain"
73-
private var thunderAliases = configuration.take().aliases.thunder + "thunder"
20+
import net.minecraft.command.impl.WeatherCommand
7421

22+
internal object WeatherCommand : VanillaCommandBase("weather") {
7523
private val durationArgument = Commands.argument(
76-
"duration", IntegerArgumentType.integer(0, 1000000)
24+
"duration", integer(0, 1000000)
7725
)
7826

79-
private fun tryAssignAliases() {
80-
CommandAliases.aliases["sun"] = (sunAliases + "weather").toMutableList()
81-
CommandAliases.aliases["rain"] = (rainAliases + "weather").toMutableList()
82-
CommandAliases.aliases["thunder"] = (thunderAliases + "weather").toMutableList()
83-
CommandAliases.aliases["weather"] =
84-
(sunAliases + rainAliases + thunderAliases).toMutableList()
85-
}
86-
87-
private fun registerSun(dispatcher: CommandDispatcher<CommandSource>) {
88-
sunAliases.forEach {
89-
dispatcher.register(
90-
Commands.literal(it).executes { p_198861_0_ ->
91-
setClear(
92-
p_198861_0_.source,
93-
generalConfiguration.getIntOrDefault(
94-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
95-
)
96-
)
97-
}.then(
98-
durationArgument.executes { p_198864_0_ ->
99-
setClear(
100-
p_198864_0_.source,
101-
IntegerArgumentType.getInteger(p_198864_0_, "duration") * 20
102-
)
103-
}
104-
)
105-
)
106-
}
107-
}
108-
109-
private fun registerRain(dispatcher: CommandDispatcher<CommandSource>) {
110-
rainAliases.forEach {
111-
dispatcher.register(
112-
Commands.literal(it).executes { p_198860_0_ ->
113-
setRain(
114-
p_198860_0_.source,
115-
generalConfiguration.getIntOrDefault(
116-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
117-
)
118-
)
119-
}.then(
120-
durationArgument.executes { p_198866_0_ ->
121-
setRain(
122-
p_198866_0_.source,
123-
IntegerArgumentType.getInteger(p_198866_0_, "duration") * 20
124-
)
125-
}
126-
)
127-
)
128-
}
129-
}
130-
131-
private fun registerThunder(dispatcher: CommandDispatcher<CommandSource>) {
132-
thunderAliases.forEach {
133-
dispatcher.register(
134-
Commands.literal(it).executes { p_198859_0_ ->
135-
setThunder(
136-
p_198859_0_.source,
137-
generalConfiguration.getIntOrDefault(
138-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
139-
)
140-
)
141-
}.then(
142-
durationArgument.executes { p_198867_0_ ->
143-
setThunder(
144-
p_198867_0_.source,
145-
IntegerArgumentType.getInteger(p_198867_0_, "duration") * 20
146-
)
147-
}
148-
)
149-
)
150-
}
151-
}
152-
153-
fun register(dispatcher: CommandDispatcher<CommandSource>) {
154-
registerSun(dispatcher)
155-
registerRain(dispatcher)
156-
registerThunder(dispatcher)
157-
tryAssignAliases()
158-
CommandAPI.removeCommand("weather")
159-
27+
override fun register(dispatcher: CommandDispatcher<CommandSource>) {
28+
super.register(dispatcher)
29+
short("sun").also { short("rain") }.also { short("thunder") }.also { aliases() }
16030
dispatcher.register(
161-
Commands.literal("weather").then(
162-
Commands.literal("clear").executes { p_198861_0_ ->
163-
setClear(
164-
p_198861_0_.source,
165-
generalConfiguration.getIntOrDefault(
166-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
167-
)
168-
)
31+
Commands.literal(name).then(
32+
Commands.literal("clear").requires {
33+
isAllowed(it, "weather.sun", 2)
34+
}.executes {
35+
WeatherCommand.setClear(it.source, 6000)
16936
}.then(
170-
durationArgument.executes { p_198864_0_ ->
171-
setClear(
172-
p_198864_0_.source,
173-
IntegerArgumentType.getInteger(p_198864_0_, "duration") * 20
174-
)
37+
durationArgument.executes {
38+
WeatherCommand.setClear(it.source, getInteger(it, "duration") * 20)
17539
}
17640
)
17741
).then(
178-
Commands.literal("rain").executes { p_198860_0_ ->
179-
setRain(
180-
p_198860_0_.source,
181-
generalConfiguration.getIntOrDefault(
182-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
183-
)
184-
)
42+
Commands.literal("rain").requires {
43+
isAllowed(it, "weather.rain", 2)
44+
}.executes {
45+
WeatherCommand.setRain(it.source, 6000)
18546
}.then(
186-
durationArgument.executes { p_198866_0_ ->
187-
setRain(
188-
p_198866_0_.source,
189-
IntegerArgumentType.getInteger(p_198866_0_, "duration") * 20
190-
)
47+
durationArgument.executes {
48+
WeatherCommand.setRain(it.source, getInteger(it, "duration") * 20)
19149
}
19250
)
19351
).then(
194-
Commands.literal("thunder").executes { p_198859_0_ ->
195-
setThunder(
196-
p_198859_0_.source,
197-
generalConfiguration.getIntOrDefault(
198-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
199-
)
200-
)
52+
Commands.literal("thunder").requires {
53+
isAllowed(it, "weather.thunder", 2)
54+
}.executes {
55+
WeatherCommand.setThunder(it.source, 6000)
20156
}.then(
202-
durationArgument.executes { p_198867_0_ ->
203-
setThunder(
204-
p_198867_0_.source,
205-
IntegerArgumentType.getInteger(p_198867_0_, "duration") * 20
206-
)
57+
durationArgument.executes {
58+
WeatherCommand.setThunder(it.source, getInteger(it, "duration") * 20)
20759
}
20860
)
20961
)
21062
)
21163
}
21264

213-
private fun checkPermissions(source: CommandSource, weatherType: WeatherType, timed: Boolean) {
214-
try {
215-
if (
216-
!hasPermission(
217-
source.asPlayer(),
218-
if (timed) "native.weather.${weatherType.type}.timed" else "native.weather.${weatherType.type}",
219-
if (timed) 3 else 2
220-
)
221-
) {
222-
throw CommandException(
223-
textComponentFrom(
224-
source.asPlayer(),
225-
generalConfiguration.getBool(SETTING_LOC_ENABLED),
226-
"native.command.restricted"
227-
).setStyle(
228-
Style().setHoverEvent(
229-
hoverEventFrom(
230-
source.asPlayer(),
231-
generalConfiguration.getBool(SETTING_LOC_ENABLED),
232-
"native.command.restricted_hover",
233-
if (timed) "native.weather.${weatherType.type}.timed" else "native.weather.${weatherType.type}",
234-
if (timed) "3" else "2"
235-
)
236-
)
237-
)
238-
)
239-
}
240-
} catch (e: CommandSyntaxException) {
241-
// ignored, because command executed by server.
65+
private fun short(name: String) {
66+
aliasesOf(name).forEach { command ->
67+
CommandAPI.getDispatcher().register(Commands.literal(command).requires {
68+
isAllowed(it, "weather.$name", 2)
69+
}.then(
70+
durationArgument.executes {
71+
val duration = getInteger(it, "duration") * 20
72+
val source = it.source
73+
if (name == "sun") WeatherCommand.setClear(source, duration)
74+
if (name == "rain") WeatherCommand.setRain(source, duration)
75+
if (name == "thunder") WeatherCommand.setThunder(source, duration)
76+
else return@executes -1
77+
}
78+
).executes {
79+
val source = it.source
80+
if (name == "sun") WeatherCommand.setClear(source, 6000)
81+
if (name == "rain") WeatherCommand.setRain(source, 6000)
82+
if (name == "thunder") WeatherCommand.setThunder(source, 6000)
83+
else return@executes -1
84+
})
24285
}
24386
}
24487

245-
private fun setClear(source: CommandSource, time: Int): Int {
246-
checkPermissions(
247-
source,
248-
WeatherType.Sunny,
249-
time != generalConfiguration.getIntOrDefault(
250-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
251-
)
252-
)
253-
source.world.worldInfo.clearWeatherTime = time
254-
source.world.worldInfo.rainTime = 0
255-
source.world.worldInfo.thunderTime = 0
256-
source.world.worldInfo.isRaining = false
257-
source.world.worldInfo.isThundering = false
258-
source.sendFeedback(
259-
TranslationTextComponent(
260-
"commands.weather.set.clear"
261-
), true
262-
)
263-
return time
88+
private fun aliases() {
89+
CommandAliases.aliases["sun"] = (aliasesOf("sun") + "weather").toMutableList()
90+
CommandAliases.aliases["thunder"] = (aliasesOf("thunder") + "weather").toMutableList()
91+
CommandAliases.aliases["rain"] = (aliasesOf("rain") + "weather").toMutableList()
26492
}
26593

266-
private fun setRain(source: CommandSource, time: Int): Int {
267-
checkPermissions(
268-
source,
269-
WeatherType.Rainy,
270-
time != generalConfiguration.getIntOrDefault(
271-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
272-
)
273-
)
274-
source.world.worldInfo.clearWeatherTime = 0
275-
source.world.worldInfo.rainTime = time
276-
source.world.worldInfo.thunderTime = time
277-
source.world.worldInfo.isRaining = true
278-
source.world.worldInfo.isThundering = false
279-
source.sendFeedback(
280-
TranslationTextComponent(
281-
"commands.weather.set.rain"
282-
), true
283-
)
284-
return time
285-
}
286-
287-
private fun setThunder(source: CommandSource, time: Int): Int {
288-
checkPermissions(
289-
source,
290-
WeatherType.Thunder,
291-
time != generalConfiguration.getIntOrDefault(
292-
SETTING_WEATHER_COMMAND_DEFAULT_DURATION, 6000
293-
)
294-
)
295-
source.world.worldInfo.clearWeatherTime = 0
296-
source.world.worldInfo.rainTime = time
297-
source.world.worldInfo.thunderTime = time
298-
source.world.worldInfo.isRaining = true
299-
source.world.worldInfo.isThundering = true
300-
source.sendFeedback(
301-
TranslationTextComponent(
302-
"commands.weather.set.thunder"
303-
), true
304-
)
305-
return time
306-
}
94+
private fun aliasesOf(origin: String) = nativeMappingsConfiguration.aliases[origin]?.let {
95+
return@let it.split(',') + origin
96+
} ?: let { return@let listOf(origin) }
30797
}

0 commit comments

Comments
 (0)