mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-19 12:25:12 -04:00
cli: wip target parser
This commit is contained in:
parent
fbcbc5d0ee
commit
f5f797ff3f
@ -17,9 +17,9 @@ import de.bixilon.minosoft.commands.util.CommandReader
|
|||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
|
||||||
interface ArgumentParser<T> {
|
interface ArgumentParser<T> {
|
||||||
val examples: List<T>
|
val examples: List<Any?>
|
||||||
val placeholder: ChatComponent
|
val placeholder: ChatComponent
|
||||||
|
|
||||||
fun parse(reader: CommandReader): T
|
fun parse(reader: CommandReader): T
|
||||||
fun getSuggestions(reader: CommandReader): List<T>
|
fun getSuggestions(reader: CommandReader): List<Any?>
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import de.bixilon.minosoft.commands.parser.brigadier._int.IntParser
|
|||||||
import de.bixilon.minosoft.commands.parser.brigadier._long.LongParser
|
import de.bixilon.minosoft.commands.parser.brigadier._long.LongParser
|
||||||
import de.bixilon.minosoft.commands.parser.brigadier.bool.BooleanParser
|
import de.bixilon.minosoft.commands.parser.brigadier.bool.BooleanParser
|
||||||
import de.bixilon.minosoft.commands.parser.brigadier.string.StringParser
|
import de.bixilon.minosoft.commands.parser.brigadier.string.StringParser
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.TargetParser
|
||||||
import de.bixilon.minosoft.data.registries.factory.DefaultFactory
|
import de.bixilon.minosoft.data.registries.factory.DefaultFactory
|
||||||
|
|
||||||
object ArgumentParserFactories : DefaultFactory<ArgumentParserFactory<*>>(
|
object ArgumentParserFactories : DefaultFactory<ArgumentParserFactory<*>>(
|
||||||
@ -28,4 +29,6 @@ object ArgumentParserFactories : DefaultFactory<ArgumentParserFactory<*>>(
|
|||||||
IntParser,
|
IntParser,
|
||||||
LongParser,
|
LongParser,
|
||||||
StringParser,
|
StringParser,
|
||||||
|
|
||||||
|
TargetParser,
|
||||||
)
|
)
|
||||||
|
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target
|
||||||
|
|
||||||
|
import de.bixilon.kutil.uuid.UUIDUtil.toUUID
|
||||||
|
import de.bixilon.minosoft.commands.errors.ExpectedArgumentError
|
||||||
|
import de.bixilon.minosoft.commands.parser.ArgumentParser
|
||||||
|
import de.bixilon.minosoft.commands.parser.factory.ArgumentParserFactory
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.EntityTarget
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.name.InvalidNameError
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.name.NameEntityTarget
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.uuid.InvalidUUIDError
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.uuid.UUIDEntityTarget
|
||||||
|
import de.bixilon.minosoft.commands.util.CommandReader
|
||||||
|
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
|
import de.bixilon.minosoft.util.BitByte.isBitMask
|
||||||
|
import de.bixilon.minosoft.util.KUtil.toResourceLocation
|
||||||
|
|
||||||
|
class TargetParser(
|
||||||
|
val single: Boolean = false,
|
||||||
|
val onlyPlayers: Boolean = false,
|
||||||
|
val playerName: String = DEFAULT_PLAYER_NAME,
|
||||||
|
) : ArgumentParser<EntityTarget> {
|
||||||
|
override val examples: List<Any?> = listOf(playerName, "@a", "@p")
|
||||||
|
override val placeholder = ChatComponent.of("<target>")
|
||||||
|
|
||||||
|
override fun parse(reader: CommandReader): EntityTarget {
|
||||||
|
if (!reader.canPeekNext()) {
|
||||||
|
throw ExpectedArgumentError(reader)
|
||||||
|
}
|
||||||
|
return if (reader.peek() == '@'.code) {
|
||||||
|
reader.parseSelector()
|
||||||
|
} else {
|
||||||
|
parseEntityIdentifier(reader)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun CommandReader.parseSelector(): EntityTarget {
|
||||||
|
TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun parseEntityIdentifier(reader: CommandReader): EntityTarget {
|
||||||
|
val result = reader.readResult { reader.readUnquotedString() }
|
||||||
|
if (result.result == null) {
|
||||||
|
throw ExpectedArgumentError(reader)
|
||||||
|
}
|
||||||
|
if (result.result.length < 16) {
|
||||||
|
val name = result.result
|
||||||
|
if (ProtocolDefinition.MINECRAFT_NAME_VALIDATOR.matcher(name).matches()) {
|
||||||
|
return NameEntityTarget(name)
|
||||||
|
}
|
||||||
|
throw InvalidNameError(reader, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return UUIDEntityTarget(result.result.toUUID())
|
||||||
|
} catch (ignored: Throwable) {
|
||||||
|
throw InvalidUUIDError(reader, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getSuggestions(reader: CommandReader): List<Any?> {
|
||||||
|
return examples // ToDo
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object : ArgumentParserFactory<TargetParser> {
|
||||||
|
override val RESOURCE_LOCATION: ResourceLocation = "minecraft:entity".toResourceLocation()
|
||||||
|
const val DEFAULT_PLAYER_NAME = "Bixilon"
|
||||||
|
|
||||||
|
override fun build(connection: PlayConnection?) = TargetParser(playerName = connection?.player?.name ?: DEFAULT_PLAYER_NAME)
|
||||||
|
|
||||||
|
override fun read(buffer: PlayInByteBuffer): TargetParser {
|
||||||
|
val flags = buffer.readUnsignedByte()
|
||||||
|
val single = flags.isBitMask(0x01)
|
||||||
|
val onlyPlayers = flags.isBitMask(0x02)
|
||||||
|
return TargetParser(single, onlyPlayers, buffer.connection.player.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.properties.*
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.properties.rotation.PitchRotation
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.properties.rotation.YawRotation
|
||||||
|
|
||||||
|
data class TargetProperties(
|
||||||
|
val selector: TargetSelectors,
|
||||||
|
var x: Double?,
|
||||||
|
var y: Double?,
|
||||||
|
var z: Double?,
|
||||||
|
var distance: DistanceProperty?,
|
||||||
|
var volumeX: Double?,
|
||||||
|
var volumeY: Double?,
|
||||||
|
var volumeZ: Double?,
|
||||||
|
var scores: Any?, // ToDo
|
||||||
|
var tag: Any?, // ToDo
|
||||||
|
var team: Any?, // ToDo,
|
||||||
|
var sort: Sorting?,
|
||||||
|
var limit: Int? = null,
|
||||||
|
var level: IntRange? = null,
|
||||||
|
var gamemode: GamemodeProperty? = null,
|
||||||
|
var name: NameProperty? = null,
|
||||||
|
var xRotation: PitchRotation? = null,
|
||||||
|
var yRotation: YawRotation? = null,
|
||||||
|
var type: TypeProperty? = null,
|
||||||
|
var nbt: Any? = null, // ToDo
|
||||||
|
var advancements: Any? = null, // ToDo
|
||||||
|
var predicate: Any? = null, // ToDo
|
||||||
|
)
|
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target
|
||||||
|
|
||||||
|
enum class TargetSelectors(val char: Char) {
|
||||||
|
NEAREST('p'),
|
||||||
|
RANDOM('r'),
|
||||||
|
ALL_PLAYERS('a'),
|
||||||
|
ALL_ENTITIES('e'),
|
||||||
|
;
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties
|
||||||
|
|
||||||
|
class DistanceProperty(
|
||||||
|
val min: Double = 0.0,
|
||||||
|
val max: Double = Double.MAX_VALUE,
|
||||||
|
) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
check(min >= 0.0) { "Minimum distance can not be below 0" }
|
||||||
|
check(max >= min) { "Maximum distance can not be smaller than minimum distance" }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.TargetProperties
|
||||||
|
import de.bixilon.minosoft.data.abilities.Gamemodes
|
||||||
|
import de.bixilon.minosoft.data.entities.entities.Entity
|
||||||
|
import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
|
||||||
|
class GamemodeProperty(
|
||||||
|
val gamemode: Gamemodes,
|
||||||
|
val negated: Boolean,
|
||||||
|
) : TargetProperty {
|
||||||
|
|
||||||
|
override fun passes(properties: TargetProperties, connection: PlayConnection, entity: Entity): Boolean {
|
||||||
|
if (entity !is PlayerEntity) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (negated) {
|
||||||
|
return entity.gamemode != gamemode
|
||||||
|
}
|
||||||
|
return entity.gamemode == gamemode
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.TargetProperties
|
||||||
|
import de.bixilon.minosoft.data.entities.entities.Entity
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
|
||||||
|
class NameProperty(
|
||||||
|
val name: String,
|
||||||
|
val negated: Boolean,
|
||||||
|
) : TargetProperty {
|
||||||
|
|
||||||
|
override fun passes(properties: TargetProperties, connection: PlayConnection, entity: Entity): Boolean {
|
||||||
|
// ToDo: Check player name?
|
||||||
|
if (negated) {
|
||||||
|
return entity.customName?.message != name
|
||||||
|
}
|
||||||
|
return entity.customName?.message == name
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties
|
||||||
|
|
||||||
|
enum class Sorting {
|
||||||
|
NEAREST,
|
||||||
|
FURTHEST,
|
||||||
|
RANDOM,
|
||||||
|
ARBITRARY,
|
||||||
|
;
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.TargetProperties
|
||||||
|
import de.bixilon.minosoft.data.entities.entities.Entity
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
|
||||||
|
interface TargetProperty {
|
||||||
|
|
||||||
|
fun passes(properties: TargetProperties, connection: PlayConnection, entity: Entity): Boolean
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.TargetProperties
|
||||||
|
import de.bixilon.minosoft.data.entities.entities.Entity
|
||||||
|
import de.bixilon.minosoft.data.registries.entities.EntityType
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
|
||||||
|
class TypeProperty(
|
||||||
|
val type: EntityType,
|
||||||
|
val negated: Boolean,
|
||||||
|
) : TargetProperty {
|
||||||
|
|
||||||
|
override fun passes(properties: TargetProperties, connection: PlayConnection, entity: Entity): Boolean {
|
||||||
|
if (negated) {
|
||||||
|
return entity.type != type
|
||||||
|
}
|
||||||
|
return entity.type == type
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties.rotation
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.entities.EntityRotation
|
||||||
|
|
||||||
|
class PitchRotation(
|
||||||
|
override val min: Float = -90.0f,
|
||||||
|
override val max: Float = 90.0f,
|
||||||
|
) : RotationProperty {
|
||||||
|
|
||||||
|
override fun getValue(rotation: EntityRotation): Double {
|
||||||
|
return rotation.pitch
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties.rotation
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.TargetProperties
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.properties.TargetProperty
|
||||||
|
import de.bixilon.minosoft.data.entities.EntityRotation
|
||||||
|
import de.bixilon.minosoft.data.entities.entities.Entity
|
||||||
|
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||||
|
|
||||||
|
interface RotationProperty : TargetProperty {
|
||||||
|
val min: Float
|
||||||
|
val max: Float
|
||||||
|
|
||||||
|
|
||||||
|
fun getValue(rotation: EntityRotation): Double
|
||||||
|
|
||||||
|
|
||||||
|
override fun passes(properties: TargetProperties, connection: PlayConnection, entity: Entity): Boolean {
|
||||||
|
val rotation = getValue(entity.rotation)
|
||||||
|
|
||||||
|
return rotation in min..max
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.properties.rotation
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.entities.EntityRotation
|
||||||
|
|
||||||
|
class YawRotation(
|
||||||
|
override val min: Float = -180.0f,
|
||||||
|
override val max: Float = 180.0f,
|
||||||
|
) : RotationProperty {
|
||||||
|
|
||||||
|
override fun getValue(rotation: EntityRotation): Double {
|
||||||
|
return rotation.yaw
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.targets
|
||||||
|
|
||||||
|
interface EntityTarget
|
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.errors.parser.ParserError
|
||||||
|
import de.bixilon.minosoft.commands.util.CommandReader
|
||||||
|
import de.bixilon.minosoft.commands.util.ReadResult
|
||||||
|
|
||||||
|
class TargetParseError(
|
||||||
|
reader: CommandReader,
|
||||||
|
result: ReadResult<*>,
|
||||||
|
) : ParserError(reader, result)
|
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.name
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.errors.parser.ParserError
|
||||||
|
import de.bixilon.minosoft.commands.util.CommandReader
|
||||||
|
import de.bixilon.minosoft.commands.util.ReadResult
|
||||||
|
|
||||||
|
class InvalidNameError(
|
||||||
|
reader: CommandReader,
|
||||||
|
result: ReadResult<String?>,
|
||||||
|
) : ParserError(reader, result)
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.name
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.EntityTarget
|
||||||
|
|
||||||
|
class NameEntityTarget(
|
||||||
|
val name: String,
|
||||||
|
) : EntityTarget {
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "{Bixilon}"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return name.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (other !is NameEntityTarget) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return name == other.name
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.uuid
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.errors.parser.ParserError
|
||||||
|
import de.bixilon.minosoft.commands.util.CommandReader
|
||||||
|
import de.bixilon.minosoft.commands.util.ReadResult
|
||||||
|
|
||||||
|
class InvalidUUIDError(
|
||||||
|
reader: CommandReader,
|
||||||
|
result: ReadResult<String?>,
|
||||||
|
) : ParserError(reader, result)
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.uuid
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.EntityTarget
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class UUIDEntityTarget(
|
||||||
|
val uuid: UUID,
|
||||||
|
) : EntityTarget {
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "{$uuid}"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return uuid.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (other !is UUIDEntityTarget) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return uuid == other.uuid
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2020-2022 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.commands.parser.minecraft.target
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.name.InvalidNameError
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.name.NameEntityTarget
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.uuid.InvalidUUIDError
|
||||||
|
import de.bixilon.minosoft.commands.parser.minecraft.target.targets.identifier.uuid.UUIDEntityTarget
|
||||||
|
import de.bixilon.minosoft.commands.util.CommandReader
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.junit.jupiter.api.assertThrows
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
|
||||||
|
internal class TargetParserTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testName() {
|
||||||
|
val reader = CommandReader("Bixilon")
|
||||||
|
val parser = TargetParser()
|
||||||
|
assertEquals(parser.parse(reader), NameEntityTarget("Bixilon"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testInvalidName() {
|
||||||
|
val reader = CommandReader("Bi§ilon")
|
||||||
|
val parser = TargetParser()
|
||||||
|
assertThrows<InvalidNameError> { parser.parse(reader) }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testUUID() {
|
||||||
|
val reader = CommandReader("9e6ce7c5-40d3-483e-8e5a-b6350987d65f")
|
||||||
|
val parser = TargetParser()
|
||||||
|
assertEquals(parser.parse(reader), UUIDEntityTarget(UUID.fromString("9e6ce7c5-40d3-483e-8e5a-b6350987d65f")))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testTrimmedUUID() {
|
||||||
|
val reader = CommandReader("9e6ce7c540d3483e8e5ab6350987d65f")
|
||||||
|
val parser = TargetParser()
|
||||||
|
assertEquals(parser.parse(reader), UUIDEntityTarget(UUID.fromString("9e6ce7c5-40d3-483e-8e5a-b6350987d65f")))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testInvalidUUID() {
|
||||||
|
val reader = CommandReader("9g6ce7c540d3483e8e5ab6350987d65f")
|
||||||
|
val parser = TargetParser()
|
||||||
|
assertThrows<InvalidUUIDError> { parser.parse(reader) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testTooShortUUID() {
|
||||||
|
val reader = CommandReader("9e6ce7c540d3483e8e5ab63")
|
||||||
|
val parser = TargetParser()
|
||||||
|
assertThrows<InvalidUUIDError> { parser.parse(reader) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testTooLongUUID() {
|
||||||
|
val reader = CommandReader("9e6ce7c540d3483e8e5ab6350987d65f123")
|
||||||
|
val parser = TargetParser()
|
||||||
|
assertThrows<InvalidUUIDError> { parser.parse(reader) }
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user