mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-15 02:15:34 -04:00
block properties: refactor and improve block properties
This commit is contained in:
parent
28d9f9bbdc
commit
daa52f08c5
@ -15,9 +15,9 @@ package de.bixilon.minosoft.data.commands.parser
|
|||||||
import de.bixilon.minosoft.data.commands.CommandStringReader
|
import de.bixilon.minosoft.data.commands.CommandStringReader
|
||||||
import de.bixilon.minosoft.data.commands.parser.exceptions.*
|
import de.bixilon.minosoft.data.commands.parser.exceptions.*
|
||||||
import de.bixilon.minosoft.data.commands.parser.properties.ParserProperties
|
import de.bixilon.minosoft.data.commands.parser.properties.ParserProperties
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockProperties
|
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockRotations
|
import de.bixilon.minosoft.data.mappings.blocks.BlockRotations
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties
|
||||||
import de.bixilon.minosoft.protocol.network.Connection
|
import de.bixilon.minosoft.protocol.network.Connection
|
||||||
|
|
||||||
class BlockStateParser : CommandParser() {
|
class BlockStateParser : CommandParser() {
|
||||||
@ -38,22 +38,25 @@ class BlockStateParser : CommandParser() {
|
|||||||
val propertyMap = stringReader.readProperties()
|
val propertyMap = stringReader.readProperties()
|
||||||
|
|
||||||
var rotation: BlockRotations? = null
|
var rotation: BlockRotations? = null
|
||||||
val allProperties = HashSet<BlockProperties>()
|
val allProperties: MutableMap<BlockProperties, Any> = mutableMapOf()
|
||||||
for (pair in propertyMap) {
|
for ((groupName, value) in propertyMap) {
|
||||||
|
|
||||||
if (pair.key == "facing" || pair.key == "rotation" || pair.key == "orientation" || pair.key == "axis") {
|
if (BlockState.ROTATION_PROPERTIES.contains(groupName)) {
|
||||||
if (rotation != null) {
|
if (rotation != null) {
|
||||||
throw BlockPropertyDuplicatedCommandParseException(stringReader, pair.key)
|
throw BlockPropertyDuplicatedCommandParseException(stringReader, groupName)
|
||||||
}
|
}
|
||||||
rotation = BlockRotations.ROTATION_MAPPING[pair.value]
|
rotation = BlockRotations.ROTATION_MAPPING[value]
|
||||||
if (rotation == null) {
|
if (rotation == null) {
|
||||||
throw UnknownBlockPropertyCommandParseException(stringReader, pair.value)
|
throw UnknownBlockPropertyCommandParseException(stringReader, value)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val blockPropertyKey = BlockProperties.PROPERTIES_MAPPING[pair.key] ?: throw UnknownBlockPropertyCommandParseException(stringReader, pair.key)
|
val (parsedGroup, parsedValue) = try {
|
||||||
val blockProperty = blockPropertyKey[pair.value] ?: throw UnknownBlockPropertyCommandParseException(stringReader, pair.value)
|
BlockProperties.parseProperty(groupName, value)
|
||||||
allProperties.add(blockProperty)
|
} catch (exception: Throwable) {
|
||||||
|
throw UnknownBlockPropertyCommandParseException(stringReader, value)
|
||||||
|
}
|
||||||
|
allProperties[parsedGroup] = parsedValue
|
||||||
}
|
}
|
||||||
for (state in block.states) {
|
for (state in block.states) {
|
||||||
if (state.bareEquals(BlockState(block, allProperties, rotation ?: BlockRotations.NONE))) {
|
if (state.bareEquals(BlockState(block, allProperties, rotation ?: BlockRotations.NONE))) {
|
||||||
|
@ -1,520 +0,0 @@
|
|||||||
/*
|
|
||||||
* Minosoft
|
|
||||||
* Copyright (C) 2020 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.data.mappings.blocks;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public enum BlockProperties {
|
|
||||||
// rails, doors, daylight sensor, ...
|
|
||||||
REDSTONE_POWERED_YES,
|
|
||||||
REDSTONE_POWERED_NO,
|
|
||||||
REDSTONE_INVERTED_YES,
|
|
||||||
REDSTONE_INVERTED_NO,
|
|
||||||
|
|
||||||
// furnace, candles, redstone torches, ...
|
|
||||||
GENERAL_LIT_YES,
|
|
||||||
GENERAL_LIT_NO,
|
|
||||||
|
|
||||||
// sign, fence, trapdoors, stairs, ...
|
|
||||||
GENERAL_WATERLOGGED_YES,
|
|
||||||
GENERAL_WATERLOGGED_NO,
|
|
||||||
|
|
||||||
// stairs
|
|
||||||
STAIR_DIRECTIONAL_STRAIGHT("shape", "straight"),
|
|
||||||
STAIR_DIRECTIONAL_INNER_LEFT("shape", "inner_left"),
|
|
||||||
STAIR_DIRECTIONAL_INNER_RIGHT("shape", "inner_right"),
|
|
||||||
STAIR_DIRECTIONAL_OUTER_LEFT("shape", "outer_left"),
|
|
||||||
STAIR_DIRECTIONAL_OUTER_RIGHT("shape", "outer_right"),
|
|
||||||
STAIR_HALF_TOP,
|
|
||||||
STAIR_HALF_BOTTOM,
|
|
||||||
|
|
||||||
// slabs
|
|
||||||
SLAB_TYPE_TOP,
|
|
||||||
SLAB_TYPE_BOTTOM,
|
|
||||||
SLAB_TYPE_DOUBLE,
|
|
||||||
|
|
||||||
// farmland
|
|
||||||
FARMLAND_MOISTURE_LEVEL_0,
|
|
||||||
FARMLAND_MOISTURE_LEVEL_1,
|
|
||||||
FARMLAND_MOISTURE_LEVEL_2,
|
|
||||||
FARMLAND_MOISTURE_LEVEL_3,
|
|
||||||
FARMLAND_MOISTURE_LEVEL_4,
|
|
||||||
FARMLAND_MOISTURE_LEVEL_5,
|
|
||||||
FARMLAND_MOISTURE_LEVEL_6,
|
|
||||||
FARMLAND_MOISTURE_LEVEL_7,
|
|
||||||
|
|
||||||
// plants, stairs
|
|
||||||
PLANT_HALF_UPPER,
|
|
||||||
PLANT_HALF_LOWER,
|
|
||||||
|
|
||||||
// fluids
|
|
||||||
FLUID_LEVEL_0("level"),
|
|
||||||
FLUID_LEVEL_1("level"),
|
|
||||||
FLUID_LEVEL_2("level"),
|
|
||||||
FLUID_LEVEL_3("level"),
|
|
||||||
FLUID_LEVEL_4("level"),
|
|
||||||
FLUID_LEVEL_5("level"),
|
|
||||||
FLUID_LEVEL_6("level"),
|
|
||||||
FLUID_LEVEL_7("level"),
|
|
||||||
FLUID_LEVEL_8("level"),
|
|
||||||
FLUID_LEVEL_9("level"),
|
|
||||||
FLUID_LEVEL_10("level"),
|
|
||||||
FLUID_LEVEL_11("level"),
|
|
||||||
FLUID_LEVEL_12("level"),
|
|
||||||
FLUID_LEVEL_13("level"),
|
|
||||||
FLUID_LEVEL_14("level"),
|
|
||||||
FLUID_LEVEL_15("level"),
|
|
||||||
|
|
||||||
// bee hive
|
|
||||||
HONEY_LEVEL_0("honey_level"),
|
|
||||||
HONEY_LEVEL_1("honey_level"),
|
|
||||||
HONEY_LEVEL_2("honey_level"),
|
|
||||||
HONEY_LEVEL_3("honey_level"),
|
|
||||||
HONEY_LEVEL_4("honey_level"),
|
|
||||||
HONEY_LEVEL_5("honey_level"),
|
|
||||||
|
|
||||||
// pistons
|
|
||||||
PISTON_EXTENDED_YES,
|
|
||||||
PISTON_EXTENDED_NO,
|
|
||||||
|
|
||||||
// piston head
|
|
||||||
PISTON_TYPE_NORMAL,
|
|
||||||
PISTON_TYPE_STICKY,
|
|
||||||
PISTON_SHORT_YES,
|
|
||||||
PISTON_SHORT_NO,
|
|
||||||
|
|
||||||
// rails
|
|
||||||
RAILS_DIRECTION_NORTH_SOUTH("shape", "north_south"),
|
|
||||||
RAILS_DIRECTION_SOUTH_EAST("shape", "south_east"),
|
|
||||||
RAILS_DIRECTION_SOUTH_WEST("shape", "south_west"),
|
|
||||||
RAILS_DIRECTION_NORTH_WEST("shape", "north_west"),
|
|
||||||
RAILS_DIRECTION_NORTH_EAST("shape", "north_east"),
|
|
||||||
RAILS_DIRECTION_EAST_WEST("shape", "east_west"),
|
|
||||||
RAILS_DIRECTION_ASCENDING_EAST("shape", "ascending_east"),
|
|
||||||
RAILS_DIRECTION_ASCENDING_WEST("shape", "ascending_west"),
|
|
||||||
RAILS_DIRECTION_ASCENDING_NORTH("shape", "ascending_north"),
|
|
||||||
RAILS_DIRECTION_ASCENDING_SOUTH("shape", "ascending_south"),
|
|
||||||
|
|
||||||
// grass, mycelium
|
|
||||||
GRASS_SNOWY_YES,
|
|
||||||
GRASS_SNOWY_NO,
|
|
||||||
|
|
||||||
// bamboo, sapling, plants
|
|
||||||
PLANTS_STAGE_LEVEL_0,
|
|
||||||
PLANTS_STAGE_LEVEL_1,
|
|
||||||
|
|
||||||
// dispenser
|
|
||||||
DISPENSER_TRIGGERED_YES,
|
|
||||||
DISPENSER_TRIGGERED_NO,
|
|
||||||
|
|
||||||
// leaves
|
|
||||||
LEAVES_DISTANCE_LEVEL_0,
|
|
||||||
LEAVES_DISTANCE_LEVEL_1,
|
|
||||||
LEAVES_DISTANCE_LEVEL_2,
|
|
||||||
LEAVES_DISTANCE_LEVEL_3,
|
|
||||||
LEAVES_DISTANCE_LEVEL_4,
|
|
||||||
LEAVES_DISTANCE_LEVEL_5,
|
|
||||||
LEAVES_DISTANCE_LEVEL_6,
|
|
||||||
LEAVES_DISTANCE_LEVEL_7,
|
|
||||||
LEAVES_PERSISTENT_YES,
|
|
||||||
LEAVES_PERSISTENT_NO,
|
|
||||||
|
|
||||||
// bed
|
|
||||||
BED_PART_HEAD,
|
|
||||||
BED_PART_FOOT,
|
|
||||||
BED_OCCUPIED_YES,
|
|
||||||
BED_OCCUPIED_NO,
|
|
||||||
|
|
||||||
// tnt
|
|
||||||
TNT_UNSTABLE_YES,
|
|
||||||
TNT_UNSTABLE_NO,
|
|
||||||
|
|
||||||
// door
|
|
||||||
DOOR_HINGE_LEFT,
|
|
||||||
DOOR_HINGE_RIGHT,
|
|
||||||
DOOR_OPEN_YES,
|
|
||||||
DOOR_OPEN_NO,
|
|
||||||
|
|
||||||
// fire
|
|
||||||
FIRE_POSITION_NORTH_YES,
|
|
||||||
FIRE_POSITION_NORTH_NO,
|
|
||||||
FIRE_POSITION_SOUTH_YES,
|
|
||||||
FIRE_POSITION_SOUTH_NO,
|
|
||||||
FIRE_POSITION_EAST_YES,
|
|
||||||
FIRE_POSITION_EAST_NO,
|
|
||||||
FIRE_POSITION_WEST_YES,
|
|
||||||
FIRE_POSITION_WEST_NO,
|
|
||||||
FIRE_POSITION_UP_YES,
|
|
||||||
FIRE_POSITION_UP_NO,
|
|
||||||
FIRE_POSITION_DOWN_YES,
|
|
||||||
FIRE_POSITION_DOWN_NO,
|
|
||||||
FIRE_AGE_LEVEL_0,
|
|
||||||
FIRE_AGE_LEVEL_1,
|
|
||||||
FIRE_AGE_LEVEL_2,
|
|
||||||
FIRE_AGE_LEVEL_3,
|
|
||||||
FIRE_AGE_LEVEL_4,
|
|
||||||
FIRE_AGE_LEVEL_5,
|
|
||||||
FIRE_AGE_LEVEL_6,
|
|
||||||
FIRE_AGE_LEVEL_7,
|
|
||||||
FIRE_AGE_LEVEL_8,
|
|
||||||
FIRE_AGE_LEVEL_9,
|
|
||||||
FIRE_AGE_LEVEL_10,
|
|
||||||
FIRE_AGE_LEVEL_11,
|
|
||||||
FIRE_AGE_LEVEL_12,
|
|
||||||
FIRE_AGE_LEVEL_13,
|
|
||||||
FIRE_AGE_LEVEL_14,
|
|
||||||
FIRE_AGE_LEVEL_15,
|
|
||||||
FIRE_AGE_LEVEL_16,
|
|
||||||
FIRE_AGE_LEVEL_17,
|
|
||||||
FIRE_AGE_LEVEL_18,
|
|
||||||
FIRE_AGE_LEVEL_19,
|
|
||||||
FIRE_AGE_LEVEL_20,
|
|
||||||
FIRE_AGE_LEVEL_21,
|
|
||||||
FIRE_AGE_LEVEL_22,
|
|
||||||
FIRE_AGE_LEVEL_23,
|
|
||||||
FIRE_AGE_LEVEL_24,
|
|
||||||
FIRE_AGE_LEVEL_25,
|
|
||||||
|
|
||||||
// noteblock
|
|
||||||
NOTEBLOCK_INSTRUMENT_HARP,
|
|
||||||
NOTEBLOCK_INSTRUMENT_BASE_DRUM("instrument", "basedrum"),
|
|
||||||
NOTEBLOCK_INSTRUMENT_SNARE,
|
|
||||||
NOTEBLOCK_INSTRUMENT_HAT,
|
|
||||||
NOTEBLOCK_INSTRUMENT_BASS,
|
|
||||||
NOTEBLOCK_INSTRUMENT_FLUTE,
|
|
||||||
NOTEBLOCK_INSTRUMENT_BELL,
|
|
||||||
NOTEBLOCK_INSTRUMENT_GUITAR,
|
|
||||||
NOTEBLOCK_INSTRUMENT_CHIME,
|
|
||||||
NOTEBLOCK_INSTRUMENT_XYLOPHONE,
|
|
||||||
NOTEBLOCK_INSTRUMENT_IRON_XYLOPHONE("instrument", "iron_xylophone"),
|
|
||||||
NOTEBLOCK_INSTRUMENT_COW_BELL("instrument", "cow_bell"),
|
|
||||||
NOTEBLOCK_INSTRUMENT_DIDGERIDOO,
|
|
||||||
NOTEBLOCK_INSTRUMENT_BIT,
|
|
||||||
NOTEBLOCK_INSTRUMENT_BANJO,
|
|
||||||
NOTEBLOCK_INSTRUMENT_PLING,
|
|
||||||
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_0,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_1,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_2,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_3,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_4,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_5,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_6,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_7,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_8,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_9,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_10,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_11,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_12,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_13,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_14,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_15,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_16,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_17,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_18,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_19,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_20,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_21,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_22,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_23,
|
|
||||||
NOTEBLOCK_NOTE_LEVEL_24,
|
|
||||||
|
|
||||||
// redstone
|
|
||||||
REDSTONE_POWER_0,
|
|
||||||
REDSTONE_POWER_1,
|
|
||||||
REDSTONE_POWER_2,
|
|
||||||
REDSTONE_POWER_3,
|
|
||||||
REDSTONE_POWER_4,
|
|
||||||
REDSTONE_POWER_5,
|
|
||||||
REDSTONE_POWER_6,
|
|
||||||
REDSTONE_POWER_7,
|
|
||||||
REDSTONE_POWER_8,
|
|
||||||
REDSTONE_POWER_9,
|
|
||||||
REDSTONE_POWER_10,
|
|
||||||
REDSTONE_POWER_11,
|
|
||||||
REDSTONE_POWER_12,
|
|
||||||
REDSTONE_POWER_13,
|
|
||||||
REDSTONE_POWER_14,
|
|
||||||
REDSTONE_POWER_15,
|
|
||||||
REDSTONE_POSITION_NORTH_NONE("north", "none"),
|
|
||||||
REDSTONE_POSITION_NORTH_LOW("north", "low"),
|
|
||||||
REDSTONE_POSITION_NORTH_UP("north", "up"),
|
|
||||||
REDSTONE_POSITION_NORTH_SIDE("north", "side"),
|
|
||||||
REDSTONE_POSITION_NORTH_TALL("north", "tall"),
|
|
||||||
REDSTONE_POSITION_WEST_NONE("west", "none"),
|
|
||||||
REDSTONE_POSITION_WEST_LOW("west", "low"),
|
|
||||||
REDSTONE_POSITION_WEST_UP("west", "up"),
|
|
||||||
REDSTONE_POSITION_WEST_SIDE("west", "side"),
|
|
||||||
REDSTONE_POSITION_WEST_TALL("west", "tall"),
|
|
||||||
REDSTONE_POSITION_SOUTH_NONE("south", "none"),
|
|
||||||
REDSTONE_POSITION_SOUTH_LOW("south", "low"),
|
|
||||||
REDSTONE_POSITION_SOUTH_UP("south", "up"),
|
|
||||||
REDSTONE_POSITION_SOUTH_SIDE("south", "side"),
|
|
||||||
REDSTONE_POSITION_SOUTH_TALL("south", "tall"),
|
|
||||||
REDSTONE_POSITION_EAST_NONE("east", "none"),
|
|
||||||
REDSTONE_POSITION_EAST_LOW("east", "low"),
|
|
||||||
REDSTONE_POSITION_EAST_UP("east", "up"),
|
|
||||||
REDSTONE_POSITION_EAST_SIDE("east", "side"),
|
|
||||||
REDSTONE_POSITION_EAST_TALL("east", "tall"),
|
|
||||||
|
|
||||||
// snow
|
|
||||||
SNOW_LAYERS_LEVEL_1,
|
|
||||||
SNOW_LAYERS_LEVEL_2,
|
|
||||||
SNOW_LAYERS_LEVEL_3,
|
|
||||||
SNOW_LAYERS_LEVEL_4,
|
|
||||||
SNOW_LAYERS_LEVEL_5,
|
|
||||||
SNOW_LAYERS_LEVEL_6,
|
|
||||||
SNOW_LAYERS_LEVEL_7,
|
|
||||||
SNOW_LAYERS_LEVEL_8,
|
|
||||||
|
|
||||||
// fence
|
|
||||||
FENCE_IN_WALL_YES("in_wall"),
|
|
||||||
FENCE_IN_WALL_NO("in_wall"),
|
|
||||||
|
|
||||||
// scaffolding
|
|
||||||
SCAFFOLDING_BOTTOM_YES,
|
|
||||||
SCAFFOLDING_BOTTOM_NO,
|
|
||||||
|
|
||||||
// tripwire
|
|
||||||
TRIPWIRE_DISARMED_YES,
|
|
||||||
TRIPWIRE_DISARMED_NO,
|
|
||||||
TRIPWIRE_IN_AIR_YES("in_air"),
|
|
||||||
TRIPWIRE_IN_AIR_NO("in_air"),
|
|
||||||
|
|
||||||
// tripwire hook
|
|
||||||
TRIPWIRE_ATTACHED_YES,
|
|
||||||
TRIPWIRE_ATTACHED_NO,
|
|
||||||
|
|
||||||
// structure block, comparator
|
|
||||||
STRUCTURE_BLOCK_MODE_SAVE("mode", "save"),
|
|
||||||
STRUCTURE_BLOCK_MODE_LOAD("mode", "load"),
|
|
||||||
STRUCTURE_BLOCK_MODE_CORNER("mode", "corner"),
|
|
||||||
STRUCTURE_BLOCK_MODE_DATA("mode", "data"),
|
|
||||||
STRUCTURE_BLOCK_MODE_COMPARE("mode", "compare"),
|
|
||||||
STRUCTURE_BLOCK_MODE_SUBTRACT("mode", "subtract"),
|
|
||||||
|
|
||||||
// command block
|
|
||||||
COMMAND_BLOCK_CONDITIONAL_YES,
|
|
||||||
COMMAND_BLOCK_CONDITIONAL_NO,
|
|
||||||
|
|
||||||
// double column
|
|
||||||
BUBBLE_COLUMN_DRAG_YES("drag"), // whirlpool
|
|
||||||
BUBBLE_COLUMN_DRAG_NO("drag"), // upwards
|
|
||||||
|
|
||||||
// bell
|
|
||||||
BELL_ATTACHMENT_FLOOR,
|
|
||||||
BELL_ATTACHMENT_CEILING,
|
|
||||||
BELL_ATTACHMENT_SINGLE_WALL("attachment", "single_wall"),
|
|
||||||
BELL_ATTACHMENT_DOUBLE_WALL("attachment", "double_wall"),
|
|
||||||
|
|
||||||
// lantern
|
|
||||||
LANTERN_HANGING_YES,
|
|
||||||
LANTERN_HANGING_NO,
|
|
||||||
|
|
||||||
// sea pickle
|
|
||||||
SEA_PICKLE_PICKLES_LEVEL_1,
|
|
||||||
SEA_PICKLE_PICKLES_LEVEL_2,
|
|
||||||
SEA_PICKLE_PICKLES_LEVEL_3,
|
|
||||||
SEA_PICKLE_PICKLES_LEVEL_4,
|
|
||||||
|
|
||||||
// lectern
|
|
||||||
LECTERN_BOOK_YES("has_book"),
|
|
||||||
LECTERN_BOOK_NO("has_book"),
|
|
||||||
|
|
||||||
// brewing stand
|
|
||||||
BREWING_STAND_BOTTLE_0_YES("has_bottle_0"),
|
|
||||||
BREWING_STAND_BOTTLE_0_NO("has_bottle_0"),
|
|
||||||
BREWING_STAND_BOTTLE_1_YES("has_bottle_1"),
|
|
||||||
BREWING_STAND_BOTTLE_1_NO("has_bottle_1"),
|
|
||||||
BREWING_STAND_BOTTLE_2_YES("has_bottle_2"),
|
|
||||||
BREWING_STAND_BOTTLE_2_NO("has_bottle_2"),
|
|
||||||
|
|
||||||
// chest
|
|
||||||
CHEST_TYPE_SINGLE,
|
|
||||||
CHEST_TYPE_LEFT,
|
|
||||||
CHEST_TYPE_RIGHT,
|
|
||||||
|
|
||||||
// cake
|
|
||||||
CAKES_BITES_LEVEL_0,
|
|
||||||
CAKES_BITES_LEVEL_1,
|
|
||||||
CAKES_BITES_LEVEL_2,
|
|
||||||
CAKES_BITES_LEVEL_3,
|
|
||||||
CAKES_BITES_LEVEL_4,
|
|
||||||
CAKES_BITES_LEVEL_5,
|
|
||||||
CAKES_BITES_LEVEL_6,
|
|
||||||
|
|
||||||
// bamboo
|
|
||||||
BAMBOO_LEAVES_NONE,
|
|
||||||
BAMBOO_LEAVES_SMALL,
|
|
||||||
BAMBOO_LEAVES_LARGE,
|
|
||||||
|
|
||||||
// repeater
|
|
||||||
REPEATER_LOCKED_YES,
|
|
||||||
REPEATER_LOCKED_NO,
|
|
||||||
REPEATER_DELAY_LEVEL_1,
|
|
||||||
REPEATER_DELAY_LEVEL_2,
|
|
||||||
REPEATER_DELAY_LEVEL_3,
|
|
||||||
REPEATER_DELAY_LEVEL_4,
|
|
||||||
|
|
||||||
// end portal frame
|
|
||||||
PORTAL_FRAME_EYE_YES,
|
|
||||||
PORTAL_FRAME_EYE_NO,
|
|
||||||
|
|
||||||
// jukebox
|
|
||||||
JUKEBOX_HAS_RECORD_YES("has_record"),
|
|
||||||
JUKEBOX_HAS_RECORD_NO("has_record"),
|
|
||||||
|
|
||||||
// campfire
|
|
||||||
CAMPFIRE_SIGNAL_FIRE_YES("signal_fire"),
|
|
||||||
CAMPFIRE_SIGNAL_FIRE_NO("signal_fire"),
|
|
||||||
|
|
||||||
// turtle eggs
|
|
||||||
TURTLE_EGGS_EGGS_LEVEL_1("eggs"),
|
|
||||||
TURTLE_EGGS_EGGS_LEVEL_2("eggs"),
|
|
||||||
TURTLE_EGGS_EGGS_LEVEL_3("eggs"),
|
|
||||||
TURTLE_EGGS_EGGS_LEVEL_4("eggs"),
|
|
||||||
TURTLE_EGGS_HATCH_LEVEL_0("hatch"),
|
|
||||||
TURTLE_EGGS_HATCH_LEVEL_1("hatch"),
|
|
||||||
TURTLE_EGGS_HATCH_LEVEL_2("hatch"),
|
|
||||||
|
|
||||||
// respawn anchor
|
|
||||||
RESPAWN_ANCHOR_CHARGES_LEVEL_0,
|
|
||||||
RESPAWN_ANCHOR_CHARGES_LEVEL_1,
|
|
||||||
RESPAWN_ANCHOR_CHARGES_LEVEL_2,
|
|
||||||
RESPAWN_ANCHOR_CHARGES_LEVEL_3,
|
|
||||||
RESPAWN_ANCHOR_CHARGES_LEVEL_4,
|
|
||||||
|
|
||||||
// candles
|
|
||||||
CANDLE_CANDLES_LEVEL_1,
|
|
||||||
CANDLE_CANDLES_LEVEL_2,
|
|
||||||
CANDLE_CANDLES_LEVEL_3,
|
|
||||||
CANDLE_CANDLES_LEVEL_4,
|
|
||||||
|
|
||||||
// grindstone
|
|
||||||
GRINDSTONE_FACE_FLOOR,
|
|
||||||
GRINDSTONE_FACE_WALL,
|
|
||||||
GRINDSTONE_FACE_CEILING,
|
|
||||||
|
|
||||||
// hopper
|
|
||||||
HOPPER_ENABLED_YES,
|
|
||||||
HOPPER_ENABLED_NO,
|
|
||||||
|
|
||||||
// button
|
|
||||||
BUTTON_FACE_FLOOR,
|
|
||||||
BUTTON_FACE_WALL,
|
|
||||||
BUTTON_FACE_CEILING,
|
|
||||||
|
|
||||||
POINTED_DRIPSTONE_THICKNESS_TIP_MERGE("thickness", "tip_merge"),
|
|
||||||
POINTED_DRIPSTONE_THICKNESS_TIP("thickness", "tip"),
|
|
||||||
POINTED_DRIPSTONE_THICKNESS_FRUSTUM("thickness", "frustum"),
|
|
||||||
POINTED_DRIPSTONE_THICKNESS_MIDDLE("thickness", "middle"),
|
|
||||||
POINTED_DRIPSTONE_THICKNESS_BASE("thickness", "base"),
|
|
||||||
POINTED_DRIPSTONE_VERTICAL_DIRECTION_UP("vertical_direction", "up"),
|
|
||||||
POINTED_DRIPSTONE_VERTICAL_DIRECTION_DOWN("vertical_direction", "down"),
|
|
||||||
|
|
||||||
LEGACY_LEAVES_BLOCK_UPDATE_YES("block_update"),
|
|
||||||
LEGACY_LEAVES_BLOCK_UPDATE_NO("block_update"),
|
|
||||||
|
|
||||||
// is smooth cobble stone in < 17w46a a thing? probably (double cobble stone slab is smooth so ... (and even more))
|
|
||||||
LEGACY_SMOOTH_YES,
|
|
||||||
LEGACY_SMOOTH_NO,
|
|
||||||
|
|
||||||
SCULK_SENSOR_PHASE_INACTIVE("sculk_sensor_phase", "inactive"),
|
|
||||||
SCULK_SENSOR_PHASE_ACTIVE("sculk_sensor_phase", "active"),
|
|
||||||
SCULK_SENSOR_PHASE_COOLDOWN("sculk_sensor_phase", "cooldown"),
|
|
||||||
|
|
||||||
DRIPSTONE_TILT_NONE,
|
|
||||||
DRIPSTONE_TILT_UNSTABLE,
|
|
||||||
DRIPSTONE_TILT_PARTIAL,
|
|
||||||
DRIPSTONE_TILT_FULL,
|
|
||||||
|
|
||||||
CAVE_VINES_BERRIES_YES,
|
|
||||||
CAVE_VINES_BERRIES_NO,
|
|
||||||
;
|
|
||||||
|
|
||||||
public static final HashMap<String, HashMap<Object, BlockProperties>> PROPERTIES_MAPPING = new HashMap<>();
|
|
||||||
|
|
||||||
static {
|
|
||||||
// add all to hashmap
|
|
||||||
for (BlockProperties property : values()) {
|
|
||||||
if (!PROPERTIES_MAPPING.containsKey(property.getGroup())) {
|
|
||||||
PROPERTIES_MAPPING.put(property.getGroup(), new HashMap<>());
|
|
||||||
}
|
|
||||||
PROPERTIES_MAPPING.get(property.getGroup()).put(property.getValue(), property);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final String group;
|
|
||||||
private final Object value;
|
|
||||||
|
|
||||||
BlockProperties() {
|
|
||||||
final String name = name();
|
|
||||||
final List<String> split = Arrays.asList(name.split("_"));
|
|
||||||
|
|
||||||
if (name.contains("LEVEL")) {
|
|
||||||
// level with int values
|
|
||||||
int levelIndex = split.indexOf("LEVEL");
|
|
||||||
this.group = split.get(levelIndex - 1).toLowerCase();
|
|
||||||
} else if (split.size() == 3) {
|
|
||||||
// TYPE_NAME_VALUE
|
|
||||||
this.group = split.get(1).toLowerCase();
|
|
||||||
} else if (name.endsWith("YES") || name.endsWith("NO")) {
|
|
||||||
this.group = split.get(split.size() - 2).toLowerCase();
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException(String.format("Could not find group automatically: %s", name));
|
|
||||||
}
|
|
||||||
this.value = getValueByName(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
BlockProperties(String group) {
|
|
||||||
this.group = group;
|
|
||||||
this.value = getValueByName(name());
|
|
||||||
}
|
|
||||||
|
|
||||||
BlockProperties(String group, String value) {
|
|
||||||
this.group = group;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Object getValueByName(String name) {
|
|
||||||
final List<String> split = Arrays.asList(name.split("_"));
|
|
||||||
if (name.contains("LEVEL")) {
|
|
||||||
// level with int values
|
|
||||||
return Integer.parseInt(split.get(split.indexOf("LEVEL") + 1));
|
|
||||||
} else if (name.endsWith("YES")) {
|
|
||||||
return true;
|
|
||||||
} else if (name.endsWith("NO")) {
|
|
||||||
return false;
|
|
||||||
} else if (split.size() == 3) {
|
|
||||||
String value = split.get(2).toLowerCase();
|
|
||||||
try {
|
|
||||||
return Integer.parseInt(value);
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException(String.format("Could not find value automatically: %s", name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGroup() {
|
|
||||||
return this.group;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object getValue() {
|
|
||||||
return this.value;
|
|
||||||
}
|
|
||||||
}
|
|
@ -17,6 +17,7 @@ import com.google.gson.JsonObject
|
|||||||
import com.google.gson.JsonPrimitive
|
import com.google.gson.JsonPrimitive
|
||||||
import de.bixilon.minosoft.Minosoft
|
import de.bixilon.minosoft.Minosoft
|
||||||
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties
|
||||||
import de.bixilon.minosoft.data.text.RGBColor
|
import de.bixilon.minosoft.data.text.RGBColor
|
||||||
import de.bixilon.minosoft.data.world.BlockPosition
|
import de.bixilon.minosoft.data.world.BlockPosition
|
||||||
import de.bixilon.minosoft.gui.rendering.TintColorCalculator
|
import de.bixilon.minosoft.gui.rendering.TintColorCalculator
|
||||||
@ -29,7 +30,7 @@ import kotlin.random.Random
|
|||||||
|
|
||||||
data class BlockState(
|
data class BlockState(
|
||||||
val owner: Block,
|
val owner: Block,
|
||||||
val properties: Set<BlockProperties> = setOf(),
|
val properties: Map<BlockProperties, Any> = mapOf(),
|
||||||
val rotation: BlockRotations = BlockRotations.NONE,
|
val rotation: BlockRotations = BlockRotations.NONE,
|
||||||
val renders: Set<BlockRenderInterface> = setOf(),
|
val renders: Set<BlockRenderInterface> = setOf(),
|
||||||
val tintColor: RGBColor? = null,
|
val tintColor: RGBColor? = null,
|
||||||
@ -71,16 +72,21 @@ data class BlockState(
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (property in obj.properties) {
|
for ((property, value) in obj.properties) {
|
||||||
if (!properties.contains(property)) {
|
properties[property]?.let {
|
||||||
return false
|
if (it != value) {
|
||||||
}
|
return false
|
||||||
|
}
|
||||||
|
} ?: return false
|
||||||
|
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
return if (obj is ResourceLocation) {
|
return if (obj is ResourceLocation) {
|
||||||
super.equals(obj)
|
super.equals(obj)
|
||||||
} else false
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
@ -125,7 +131,7 @@ data class BlockState(
|
|||||||
fun deserialize(owner: Block, data: JsonObject, models: Map<ResourceLocation, BlockModel>): BlockState {
|
fun deserialize(owner: Block, data: JsonObject, models: Map<ResourceLocation, BlockModel>): BlockState {
|
||||||
val (rotation, properties) = data["properties"]?.asJsonObject?.let {
|
val (rotation, properties) = data["properties"]?.asJsonObject?.let {
|
||||||
getProperties(it)
|
getProperties(it)
|
||||||
} ?: Pair(BlockRotations.NONE, mutableSetOf())
|
} ?: Pair(BlockRotations.NONE, mutableMapOf())
|
||||||
val renders: MutableSet<BlockRenderInterface> = mutableSetOf()
|
val renders: MutableSet<BlockRenderInterface> = mutableSetOf()
|
||||||
|
|
||||||
data["render"]?.let {
|
data["render"]?.let {
|
||||||
@ -164,17 +170,17 @@ data class BlockState(
|
|||||||
|
|
||||||
return BlockState(
|
return BlockState(
|
||||||
owner = owner,
|
owner = owner,
|
||||||
properties = properties.toSet(),
|
properties = properties.toMap(),
|
||||||
rotation = rotation,
|
rotation = rotation,
|
||||||
renders = renders.toSet(),
|
renders = renders.toSet(),
|
||||||
tintColor = tintColor
|
tintColor = tintColor
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getProperties(json: JsonObject) : Pair<BlockRotations, MutableSet<BlockProperties>> {
|
private fun getProperties(json: JsonObject): Pair<BlockRotations, MutableMap<BlockProperties, Any>> {
|
||||||
var rotation = BlockRotations.NONE
|
var rotation = BlockRotations.NONE
|
||||||
val properties = mutableSetOf<BlockProperties>()
|
val properties: MutableMap<BlockProperties, Any> = mutableMapOf()
|
||||||
for ((propertyName, propertyJsonValue) in json.entrySet()) {
|
for ((propertyGroup, propertyJsonValue) in json.entrySet()) {
|
||||||
check(propertyJsonValue is JsonPrimitive) { "Not a json primitive!" }
|
check(propertyJsonValue is JsonPrimitive) { "Not a json primitive!" }
|
||||||
val propertyValue: Any = when {
|
val propertyValue: Any = when {
|
||||||
propertyJsonValue.isBoolean -> {
|
propertyJsonValue.isBoolean -> {
|
||||||
@ -193,13 +199,14 @@ data class BlockState(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (propertyName in ROTATION_PROPERTIES) {
|
if (propertyGroup in ROTATION_PROPERTIES) {
|
||||||
rotation = BlockRotations.ROTATION_MAPPING[propertyValue]!!
|
rotation = BlockRotations.ROTATION_MAPPING[propertyValue]!!
|
||||||
} else {
|
} else {
|
||||||
properties.add(BlockProperties.PROPERTIES_MAPPING[propertyName]!![propertyValue]!!)
|
val (blockProperty, value) = BlockProperties.parseProperty(propertyGroup, propertyValue)
|
||||||
|
properties[blockProperty] = value
|
||||||
}
|
}
|
||||||
} catch (exception: NullPointerException) {
|
} catch (exception: NullPointerException) {
|
||||||
throw NullPointerException("Invalid block property $propertyName or value $propertyValue")
|
throw NullPointerException("Invalid block property $propertyGroup or value $propertyValue")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Pair(rotation, properties)
|
return Pair(rotation, properties)
|
||||||
@ -210,4 +217,11 @@ data class BlockState(
|
|||||||
renders.add(BlockRenderer(data, model))
|
renders.add(BlockRenderer(data, model))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// properties
|
||||||
|
|
||||||
|
fun isPowered(): Boolean? {
|
||||||
|
return properties[BlockProperties.POWERED] as Boolean?
|
||||||
|
}
|
||||||
|
// ToDo
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class Attachments {
|
||||||
|
FLOOR,
|
||||||
|
WALL,
|
||||||
|
CEILING,
|
||||||
|
SINGLE_WALL,
|
||||||
|
DOUBLE_WALL,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, Attachments> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Attachments {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class BambooLeaves {
|
||||||
|
NONE,
|
||||||
|
SMALL,
|
||||||
|
LARGE,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, BambooLeaves> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): BambooLeaves {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class BedParts {
|
||||||
|
HEAD,
|
||||||
|
FOOT,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, BedParts> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): BedParts {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BooleanBlocKPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.IntBlockPropertiesSerializer
|
||||||
|
|
||||||
|
enum class BlockProperties {
|
||||||
|
POWERED(BooleanBlocKPropertiesSerializer),
|
||||||
|
TRIGGERED(BooleanBlocKPropertiesSerializer),
|
||||||
|
INVERTED(BooleanBlocKPropertiesSerializer),
|
||||||
|
LIT(BooleanBlocKPropertiesSerializer),
|
||||||
|
WATERLOGGED(BooleanBlocKPropertiesSerializer),
|
||||||
|
STAIR_DIRECTIONAL("shape", Shapes),
|
||||||
|
STAIR_HALF("half", Halves),
|
||||||
|
SLAB_TYPE("type", Halves),
|
||||||
|
MOISTURE_LEVEL("moisture", IntBlockPropertiesSerializer),
|
||||||
|
FLUID_LEVEL("level", IntBlockPropertiesSerializer),
|
||||||
|
HONEY_LEVEL("honey_level", IntBlockPropertiesSerializer),
|
||||||
|
PISTON_EXTENDED("extended", BooleanBlocKPropertiesSerializer),
|
||||||
|
PISTON_TYPE("type", PistonTypes),
|
||||||
|
PISTON_SHORT("short", BooleanBlocKPropertiesSerializer),
|
||||||
|
RAILS_SHAPE("shape", Shapes),
|
||||||
|
SNOWY(BooleanBlocKPropertiesSerializer),
|
||||||
|
STAGE(IntBlockPropertiesSerializer),
|
||||||
|
DISTANCE(IntBlockPropertiesSerializer),
|
||||||
|
LEAVES_PERSISTENT("persistent", BooleanBlocKPropertiesSerializer),
|
||||||
|
BED_PART("part", BedParts),
|
||||||
|
BED_OCCUPIED("occupied", BooleanBlocKPropertiesSerializer),
|
||||||
|
TNT_UNSTABLE("unstable", BooleanBlocKPropertiesSerializer),
|
||||||
|
DOOR_HINGE("hinge", Sides),
|
||||||
|
DOOR_OPEN("open", BooleanBlocKPropertiesSerializer),
|
||||||
|
AGE(IntBlockPropertiesSerializer),
|
||||||
|
INSTRUMENT(Instruments),
|
||||||
|
NOTE(IntBlockPropertiesSerializer),
|
||||||
|
REDSTONE_POWER("power", IntBlockPropertiesSerializer),
|
||||||
|
|
||||||
|
MULTIPART_NORTH("north", MultipartDirectionParser),
|
||||||
|
MULTIPART_WEST("west", MultipartDirectionParser),
|
||||||
|
MULTIPART_SOUTH("south", MultipartDirectionParser),
|
||||||
|
MULTIPART_EAST("east", MultipartDirectionParser),
|
||||||
|
MULTIPART_UP("up", MultipartDirectionParser),
|
||||||
|
MULTIPART_DOWN("down", MultipartDirectionParser),
|
||||||
|
|
||||||
|
SNOW_LAYERS("layers", IntBlockPropertiesSerializer),
|
||||||
|
FENCE_IN_WALL("in_wall", BooleanBlocKPropertiesSerializer),
|
||||||
|
SCAFFOLDING_BOTTOM("bottom", BooleanBlocKPropertiesSerializer),
|
||||||
|
TRIPWIRE_DISARMED("disarmed", BooleanBlocKPropertiesSerializer),
|
||||||
|
TRIPWIRE_IN_AIR("in_air", BooleanBlocKPropertiesSerializer),
|
||||||
|
TRIPWIRE_ATTACHED("attached", BooleanBlocKPropertiesSerializer),
|
||||||
|
STRUCTURE_BLOCK_MODE("mode", StructureBlockModes),
|
||||||
|
COMMAND_BLOCK_CONDITIONAL("conditional", BooleanBlocKPropertiesSerializer),
|
||||||
|
BUBBLE_COLUMN_DRAG("drag", BooleanBlocKPropertiesSerializer),
|
||||||
|
BELL_ATTACHMENT("attachment", Attachments),
|
||||||
|
LANTERN_HANGING("hanging", BooleanBlocKPropertiesSerializer),
|
||||||
|
SEA_PICKLE_PICKLES("pickles", IntBlockPropertiesSerializer),
|
||||||
|
LECTERN_BOOK("has_book", BooleanBlocKPropertiesSerializer),
|
||||||
|
|
||||||
|
BREWING_STAND_BOTTLE_0("has_bottle_0", BooleanBlocKPropertiesSerializer),
|
||||||
|
BREWING_STAND_BOTTLE_1("has_bottle_1", BooleanBlocKPropertiesSerializer),
|
||||||
|
BREWING_STAND_BOTTLE_2("has_bottle_2", BooleanBlocKPropertiesSerializer),
|
||||||
|
|
||||||
|
CHEST_TYPE("type", ChestTypes),
|
||||||
|
|
||||||
|
CAKE_BITES("bites", IntBlockPropertiesSerializer),
|
||||||
|
BAMBOO_LEAVES("leaves", BambooLeaves),
|
||||||
|
REPEATER_LOCKED("locked", BooleanBlocKPropertiesSerializer),
|
||||||
|
REPEATER_DELAY("delay", IntBlockPropertiesSerializer),
|
||||||
|
PORTA_FRAME_EYE("eye", BooleanBlocKPropertiesSerializer),
|
||||||
|
JUKEBOX_HAS_RECORD("has_record", BooleanBlocKPropertiesSerializer),
|
||||||
|
CAMPFIRE_SIGNAL_FIRE("signal_fire", BooleanBlocKPropertiesSerializer),
|
||||||
|
TURTLE_EGS_EGGS("eggs", IntBlockPropertiesSerializer),
|
||||||
|
TURTLE_EGGS_HATCH("hatch", IntBlockPropertiesSerializer),
|
||||||
|
RESPAWN_ANCHOR_CHARGES("charges", IntBlockPropertiesSerializer),
|
||||||
|
CANDLES(IntBlockPropertiesSerializer),
|
||||||
|
FACE("face", Attachments),
|
||||||
|
HOPPER_ENABLED("enabled", BooleanBlocKPropertiesSerializer),
|
||||||
|
|
||||||
|
DRIPSTONE_THICKNESS("thickness", Thicknesses),
|
||||||
|
|
||||||
|
|
||||||
|
LEGACY_BLOCK_UPDATE("block_update", BooleanBlocKPropertiesSerializer),
|
||||||
|
LEGACY_SMOOTH("smooth", BooleanBlocKPropertiesSerializer),
|
||||||
|
SCULK_SENSOR_PHASE("sculk_sensor_phase", SensorPhases),
|
||||||
|
DRIPSTONE_TILT("tilt", Tilts),
|
||||||
|
CAVE_VINES_BERRIES(BooleanBlocKPropertiesSerializer),
|
||||||
|
;
|
||||||
|
|
||||||
|
val group: String
|
||||||
|
val serializer: BlockPropertiesSerializer
|
||||||
|
|
||||||
|
constructor(group: String, serializer: BlockPropertiesSerializer) {
|
||||||
|
this.group = group
|
||||||
|
this.serializer = serializer
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(serializer: BlockPropertiesSerializer) {
|
||||||
|
this.group = name.toLowerCase()
|
||||||
|
this.serializer = serializer
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val PROPERTIES: Map<String, List<BlockProperties>> = run {
|
||||||
|
val map: MutableMap<String, MutableList<BlockProperties>> = mutableMapOf()
|
||||||
|
|
||||||
|
for (value in values()) {
|
||||||
|
val list = map.getOrPut(value.group, { mutableListOf() })
|
||||||
|
list.add(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return@run map.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun parseProperty(group: String, value: Any): Pair<BlockProperties, Any> {
|
||||||
|
PROPERTIES[group]?.let {
|
||||||
|
var retProperty: BlockProperties? = null
|
||||||
|
var retValue: Any? = null
|
||||||
|
|
||||||
|
for (blockProperty in it) {
|
||||||
|
retValue = try {
|
||||||
|
blockProperty.serializer.serialize(value)
|
||||||
|
} catch (exception: Throwable) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
retProperty = blockProperty
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retProperty == null || retValue == null) {
|
||||||
|
throw IllegalArgumentException("Can not parse value $value for group $group")
|
||||||
|
}
|
||||||
|
return Pair(retProperty, retValue)
|
||||||
|
} ?: throw IllegalArgumentException("Can not find group: $group")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class ChestTypes {
|
||||||
|
SINGLE,
|
||||||
|
LEFT,
|
||||||
|
RIGHT,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, ChestTypes> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): ChestTypes {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
|
||||||
|
enum class Halves(
|
||||||
|
vararg val aliases: Any,
|
||||||
|
) {
|
||||||
|
UPPER("top"),
|
||||||
|
LOWER("bottom"),
|
||||||
|
DOUBLE,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<Any, Halves>
|
||||||
|
|
||||||
|
init {
|
||||||
|
val names: MutableMap<Any, Halves> = mutableMapOf()
|
||||||
|
|
||||||
|
for (value in values()) {
|
||||||
|
names[value.name.toLowerCase()] = value
|
||||||
|
for (alias in value.aliases) {
|
||||||
|
names[alias] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NAME_MAP = names.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Halves {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
|
||||||
|
enum class Instruments(
|
||||||
|
vararg val aliases: String,
|
||||||
|
) {
|
||||||
|
HARP,
|
||||||
|
BASE_DRUM("basedrum"),
|
||||||
|
SNARE,
|
||||||
|
HAT,
|
||||||
|
BASS,
|
||||||
|
FLUTE,
|
||||||
|
BELL,
|
||||||
|
GUITAR,
|
||||||
|
CHIME,
|
||||||
|
XYLOPHONE,
|
||||||
|
IRON_XYLOPHONE,
|
||||||
|
COW_BELL,
|
||||||
|
DIDGERIDOO,
|
||||||
|
BIT,
|
||||||
|
BANJO,
|
||||||
|
PLING,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<Any, Instruments>
|
||||||
|
|
||||||
|
init {
|
||||||
|
val names: MutableMap<Any, Instruments> = mutableMapOf()
|
||||||
|
|
||||||
|
for (value in values()) {
|
||||||
|
names[value.name.toLowerCase()] = value
|
||||||
|
for (alias in value.aliases) {
|
||||||
|
names[alias] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NAME_MAP = names.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Instruments {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
|
||||||
|
enum class MultipartDirectionParser(
|
||||||
|
vararg val aliases: Any,
|
||||||
|
) {
|
||||||
|
NONE(false),
|
||||||
|
LOW,
|
||||||
|
UP,
|
||||||
|
SIDE(true),
|
||||||
|
TALL,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<Any, MultipartDirectionParser>
|
||||||
|
|
||||||
|
init {
|
||||||
|
val names: MutableMap<Any, MultipartDirectionParser> = mutableMapOf()
|
||||||
|
|
||||||
|
for (value in values()) {
|
||||||
|
names[value.name.toLowerCase()] = value
|
||||||
|
for (alias in value.aliases) {
|
||||||
|
names[alias] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NAME_MAP = names.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serialize(value: Any): MultipartDirectionParser {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class PistonTypes {
|
||||||
|
NORMAL,
|
||||||
|
STICKY,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, PistonTypes> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): PistonTypes {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class SensorPhases {
|
||||||
|
INACTIVE,
|
||||||
|
ACTIVE,
|
||||||
|
COOLDOWN,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, SensorPhases> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): SensorPhases {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class Shapes {
|
||||||
|
STRAIGHT,
|
||||||
|
INNER_LEFT,
|
||||||
|
INNER_RIGHT,
|
||||||
|
OUTER_LEFT,
|
||||||
|
OUTER_RIGHT,
|
||||||
|
NORTH_SOUTH,
|
||||||
|
SOUTH_EAST,
|
||||||
|
SOUTH_WEST,
|
||||||
|
NORTH_WEST,
|
||||||
|
NORTH_EAST,
|
||||||
|
EAST_WEST,
|
||||||
|
ASCENDING_EAST,
|
||||||
|
ASCENDING_WEST,
|
||||||
|
ASCENDING_NORTH,
|
||||||
|
ASCENDING_SOUTH,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, Shapes> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Shapes {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class Sides {
|
||||||
|
LEFT,
|
||||||
|
RIGHT,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, Sides> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Sides {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class StructureBlockModes {
|
||||||
|
SAVE,
|
||||||
|
LOAD,
|
||||||
|
CORNER,
|
||||||
|
DATA,
|
||||||
|
COMPARE,
|
||||||
|
SUBTRACT,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, StructureBlockModes> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
|
||||||
|
override fun serialize(value: Any): StructureBlockModes {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class Thicknesses {
|
||||||
|
TIP_MERGE,
|
||||||
|
TIP,
|
||||||
|
FRUSTUM,
|
||||||
|
MIDDLE,
|
||||||
|
BASE,
|
||||||
|
UP,
|
||||||
|
DOWN,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, Thicknesses> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Thicknesses {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer
|
||||||
|
import de.bixilon.minosoft.util.KUtil
|
||||||
|
|
||||||
|
enum class Tilts {
|
||||||
|
NONE,
|
||||||
|
UNSTABLE,
|
||||||
|
PARTIAL,
|
||||||
|
FULL,
|
||||||
|
;
|
||||||
|
|
||||||
|
companion object : BlockPropertiesSerializer {
|
||||||
|
private val NAME_MAP: Map<String, Tilts> = KUtil.getEnumValues(values())
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Tilts {
|
||||||
|
return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties.serializer
|
||||||
|
|
||||||
|
interface BlockPropertiesSerializer {
|
||||||
|
|
||||||
|
fun serialize(value: Any): Any
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties.serializer
|
||||||
|
|
||||||
|
object BooleanBlocKPropertiesSerializer : BlockPropertiesSerializer {
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Boolean {
|
||||||
|
if (value is Boolean) {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
return when (value) {
|
||||||
|
"true" -> true
|
||||||
|
"false" -> false
|
||||||
|
else -> throw IllegalArgumentException("Not a boolean: $value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.data.mappings.blocks.properties.serializer
|
||||||
|
|
||||||
|
object IntBlockPropertiesSerializer : BlockPropertiesSerializer {
|
||||||
|
|
||||||
|
override fun serialize(value: Any): Int {
|
||||||
|
return value as Int
|
||||||
|
}
|
||||||
|
}
|
@ -14,12 +14,12 @@ package de.bixilon.minosoft.data.mappings.tweaker
|
|||||||
|
|
||||||
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.Block
|
import de.bixilon.minosoft.data.mappings.blocks.Block
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockProperties
|
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties
|
||||||
|
|
||||||
object TweakBlocks {
|
object TweakBlocks {
|
||||||
val GRASS_BLOCK_SNOWY_YES = BlockState(Block(ResourceLocation("grass")), setOf(BlockProperties.GRASS_SNOWY_YES))
|
val GRASS_BLOCK_SNOWY_YES = BlockState(Block(ResourceLocation("grass")), mapOf(BlockProperties.SNOWY to true))
|
||||||
val GRASS_BLOCK_SNOWY_NO = BlockState(Block(ResourceLocation("grass")), setOf(BlockProperties.GRASS_SNOWY_NO))
|
val GRASS_BLOCK_SNOWY_NO = BlockState(Block(ResourceLocation("grass")), mapOf(BlockProperties.SNOWY to false))
|
||||||
|
|
||||||
val SNOW_RESOURCE_LOCATION = ResourceLocation("snow")
|
val SNOW_RESOURCE_LOCATION = ResourceLocation("snow")
|
||||||
val SNOW_LAYER_RESOURCE_LOCAION = ResourceLocation("snow_layer")
|
val SNOW_LAYER_RESOURCE_LOCAION = ResourceLocation("snow_layer")
|
||||||
|
@ -17,12 +17,12 @@ import com.google.gson.JsonArray
|
|||||||
import com.google.gson.JsonElement
|
import com.google.gson.JsonElement
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import com.google.gson.JsonPrimitive
|
import com.google.gson.JsonPrimitive
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockProperties
|
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockRotations
|
import de.bixilon.minosoft.data.mappings.blocks.BlockRotations
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties
|
||||||
|
|
||||||
open class BlockCondition {
|
open class BlockCondition {
|
||||||
private var blockProperties: MutableList<MutableList<MutableSet<BlockProperties>>> = mutableListOf() // in order of OR AND OR
|
private var blockProperties: MutableList<MutableList<MutableMap<BlockProperties, Any>>> = mutableListOf() // in order of OR AND OR
|
||||||
private var rotation: BlockRotations = BlockRotations.NONE
|
private var rotation: BlockRotations = BlockRotations.NONE
|
||||||
|
|
||||||
constructor(data: JsonElement) {
|
constructor(data: JsonElement) {
|
||||||
@ -41,8 +41,8 @@ open class BlockCondition {
|
|||||||
constructor()
|
constructor()
|
||||||
|
|
||||||
private fun addToProperties(data: JsonObject) {
|
private fun addToProperties(data: JsonObject) {
|
||||||
val current: MutableList<MutableSet<BlockProperties>> = mutableListOf()
|
val current: MutableList<MutableMap<BlockProperties, Any>> = mutableListOf()
|
||||||
for ((propertyName, propertyJsonValue) in data.entrySet()) {
|
for ((groupName, propertyJsonValue) in data.entrySet()) {
|
||||||
check(propertyJsonValue is JsonPrimitive) { "Not a json primitive!" }
|
check(propertyJsonValue is JsonPrimitive) { "Not a json primitive!" }
|
||||||
val propertyValue: Any = when {
|
val propertyValue: Any = when {
|
||||||
propertyJsonValue.isBoolean -> {
|
propertyJsonValue.isBoolean -> {
|
||||||
@ -61,19 +61,20 @@ open class BlockCondition {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (propertyName in BlockState.ROTATION_PROPERTIES) {
|
if (groupName in BlockState.ROTATION_PROPERTIES) {
|
||||||
rotation = BlockRotations.ROTATION_MAPPING[propertyValue]!!
|
rotation = BlockRotations.ROTATION_MAPPING[propertyValue]!!
|
||||||
} else {
|
} else {
|
||||||
BlockProperties.PROPERTIES_MAPPING[propertyName]?.get(propertyValue)?.let {
|
try {
|
||||||
current.add(mutableSetOf(it))
|
current.add(mutableMapOf(BlockProperties.parseProperty(groupName, propertyValue)))
|
||||||
} ?: kotlin.run {
|
} catch (exception: Throwable) {
|
||||||
if (propertyValue is String) {
|
if (propertyValue is String) {
|
||||||
val propertyString: String = propertyValue
|
val propertyString: String = propertyValue
|
||||||
if (propertyString.contains("|")) {
|
if (propertyString.contains("|")) {
|
||||||
val parts = propertyString.split("|")
|
val parts = propertyString.split("|")
|
||||||
val properties = mutableSetOf<BlockProperties>()
|
val properties: MutableMap<BlockProperties, Any> = mutableMapOf()
|
||||||
for (part in parts) {
|
for (part in parts) {
|
||||||
properties.add(BlockProperties.PROPERTIES_MAPPING[propertyName]!![part]!!)
|
val (property, value) = BlockProperties.parseProperty(groupName, part)
|
||||||
|
properties[property] = value
|
||||||
}
|
}
|
||||||
current.add(properties)
|
current.add(properties)
|
||||||
}
|
}
|
||||||
@ -81,19 +82,19 @@ open class BlockCondition {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (exception: NullPointerException) {
|
} catch (exception: NullPointerException) {
|
||||||
throw NullPointerException("Invalid block property $propertyName with value $propertyValue")
|
throw NullPointerException("Invalid block property $groupName with value $propertyValue")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
blockProperties.add(current)
|
blockProperties.add(current)
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun contains(testProperties: MutableSet<BlockProperties>, testRotation: BlockRotations): Boolean {
|
open fun contains(testProperties: Map<BlockProperties, Any>, testRotation: BlockRotations): Boolean {
|
||||||
if (rotation != BlockRotations.NONE && rotation != testRotation) {
|
if (rotation != BlockRotations.NONE && rotation != testRotation) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
outerLoop@ for (propertiesSubSet in blockProperties) {
|
outerLoop@ for (propertiesSubSet in blockProperties) {
|
||||||
for (properties in propertiesSubSet) {
|
for (properties in propertiesSubSet) {
|
||||||
if (testProperties.intersect(properties).isEmpty()) {
|
if (testProperties.keys.intersect(properties.keys).isEmpty()) { // ToDo: Just keys or also values???
|
||||||
continue@outerLoop
|
continue@outerLoop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,7 +105,7 @@ open class BlockCondition {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val TRUE_CONDITION: BlockCondition = object : BlockCondition() {
|
val TRUE_CONDITION: BlockCondition = object : BlockCondition() {
|
||||||
override fun contains(testProperties: MutableSet<BlockProperties>, testRotation: BlockRotations): Boolean {
|
override fun contains(testProperties: Map<BlockProperties, Any>, testRotation: BlockRotations): Boolean {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
package de.bixilon.minosoft.gui.rendering.chunk.models.renderable
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.Directions
|
import de.bixilon.minosoft.data.Directions
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockProperties
|
|
||||||
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
import de.bixilon.minosoft.data.mappings.blocks.BlockState
|
||||||
|
import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties
|
||||||
import de.bixilon.minosoft.data.text.RGBColor
|
import de.bixilon.minosoft.data.text.RGBColor
|
||||||
import de.bixilon.minosoft.data.world.BlockPosition
|
import de.bixilon.minosoft.data.world.BlockPosition
|
||||||
import de.bixilon.minosoft.data.world.World
|
import de.bixilon.minosoft.data.world.World
|
||||||
@ -14,7 +14,6 @@ import de.bixilon.minosoft.gui.rendering.textures.Texture
|
|||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil
|
||||||
import glm_.glm
|
import glm_.glm
|
||||||
import glm_.mat4x4.Mat4
|
import glm_.mat4x4.Mat4
|
||||||
import glm_.toInt
|
|
||||||
import glm_.vec2.Vec2
|
import glm_.vec2.Vec2
|
||||||
import glm_.vec3.Vec3
|
import glm_.vec3.Vec3
|
||||||
import glm_.vec4.Vec4
|
import glm_.vec4.Vec4
|
||||||
@ -171,10 +170,8 @@ class FluidRenderer(private val stillTextureName: String, private val flowingTex
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getLevel(blockState: BlockState): Float {
|
private fun getLevel(blockState: BlockState): Float {
|
||||||
for (property in blockState.properties) {
|
blockState.properties[BlockProperties.FLUID_LEVEL]?.let {
|
||||||
if (property.group == "level") {
|
return (8 - it as Int) * (1f / 8f) - 0.125f
|
||||||
return (8 - property.value.toInt) * (1f / 8f) - 0.125f
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0.8125f
|
return 0.8125f
|
||||||
}
|
}
|
||||||
@ -186,7 +183,7 @@ class FluidRenderer(private val stillTextureName: String, private val flowingTex
|
|||||||
if (blockState.owner.resourceLocation.full.contains(regex)) {
|
if (blockState.owner.resourceLocation.full.contains(regex)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if (blockState.properties.contains(BlockProperties.GENERAL_WATERLOGGED_YES)) {
|
if (blockState.properties[BlockProperties.WATERLOGGED] == true) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
27
src/main/java/de/bixilon/minosoft/util/KUtil.kt
Normal file
27
src/main/java/de/bixilon/minosoft/util/KUtil.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 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.util
|
||||||
|
|
||||||
|
object KUtil {
|
||||||
|
|
||||||
|
fun <T : Enum<*>> getEnumValues(values: Array<T>): Map<String, T> {
|
||||||
|
val ret: MutableMap<String, T> = mutableMapOf()
|
||||||
|
|
||||||
|
for (value in values) {
|
||||||
|
ret[value.name.toLowerCase()] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret.toMap()
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user