wip: Recipes

This commit is contained in:
Bixilon 2020-07-17 00:09:01 +02:00
parent ee8844636e
commit a37b3ed181
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
16 changed files with 618 additions and 251 deletions

View File

@ -1,42 +0,0 @@
/*
* Codename 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.game.datatypes;
public enum Recipes {
TODO(0, new ChangeableIdentifier("todo"));
final int id;
final ChangeableIdentifier changeableIdentifier;
Recipes(int id, ChangeableIdentifier changeableIdentifier) {
this.id = id;
this.changeableIdentifier = changeableIdentifier;
}
public static Recipes byId(int id) {
return TODO;
}
public static Recipes byName(String name) {
return TODO;
}
public int getId() {
return id;
}
public ChangeableIdentifier getChangeableIdentifier() {
return changeableIdentifier;
}
}

View File

@ -17,16 +17,16 @@ public class Block {
final String mod; final String mod;
final String identifier; final String identifier;
final BlockRotation rotation; final BlockRotation rotation;
final BlockProperty[] properties; final BlockProperties[] properties;
public Block(String mod, String identifier, BlockProperty[] properties, BlockRotation rotation) { public Block(String mod, String identifier, BlockProperties[] properties, BlockRotation rotation) {
this.mod = mod; this.mod = mod;
this.identifier = identifier; this.identifier = identifier;
this.properties = properties; this.properties = properties;
this.rotation = rotation; this.rotation = rotation;
} }
public Block(String mod, String identifier, BlockProperty[] properties) { public Block(String mod, String identifier, BlockProperties[] properties) {
this.mod = mod; this.mod = mod;
this.identifier = identifier; this.identifier = identifier;
this.properties = properties; this.properties = properties;
@ -36,14 +36,14 @@ public class Block {
public Block(String mod, String identifier, BlockRotation rotation) { public Block(String mod, String identifier, BlockRotation rotation) {
this.mod = mod; this.mod = mod;
this.identifier = identifier; this.identifier = identifier;
this.properties = new BlockProperty[0]; this.properties = new BlockProperties[0];
this.rotation = rotation; this.rotation = rotation;
} }
public Block(String mod, String identifier) { public Block(String mod, String identifier) {
this.mod = mod; this.mod = mod;
this.identifier = identifier; this.identifier = identifier;
this.properties = new BlockProperty[0]; this.properties = new BlockProperties[0];
this.rotation = BlockRotation.NONE; this.rotation = BlockRotation.NONE;
} }
@ -59,7 +59,7 @@ public class Block {
return rotation; return rotation;
} }
public BlockProperty[] getProperties() { public BlockProperties[] getProperties() {
return properties; return properties;
} }
@ -78,7 +78,7 @@ public class Block {
out.append(" ("); out.append(" (");
} }
out.append("properties={"); out.append("properties={");
for (BlockProperty property : properties) { for (BlockProperties property : properties) {
out.append(property.name()); out.append(property.name());
out.append(","); out.append(",");
} }

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.game.datatypes.blocks; package de.bixilon.minosoft.game.datatypes.blocks;
public enum BlockProperty { public enum BlockProperties {
NONE, NONE,
// farmland // farmland

View File

@ -12,7 +12,6 @@ package de.bixilon.minosoft.game.datatypes.blocks;
* This software is not affiliated with Mojang AB, the original developer of Minecraft. * This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/ */
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; import de.bixilon.minosoft.protocol.protocol.ProtocolVersion;
import org.json.JSONArray; import org.json.JSONArray;
@ -25,382 +24,382 @@ import java.util.Iterator;
public class Blocks { public class Blocks {
public static Block nullBlock; public static Block nullBlock;
static ArrayList<Block> blockList = new ArrayList<>(); static ArrayList<Block> blockList = new ArrayList<>();
static HashMap<ProtocolVersion, BiMap<Integer, Block>> blockMap = new HashMap<>(); // version -> (protocolId > Item) static HashMap<ProtocolVersion, HashBiMap<Integer, Block>> blockMap = new HashMap<>(); // version -> (protocolId > block)
static HashMap<String, HashMap<String, BlockProperty>> propertiesMapping = new HashMap<>(); static HashMap<String, HashMap<String, BlockProperties>> propertiesMapping = new HashMap<>();
static HashMap<String, BlockRotation> rotationMapping = new HashMap<>(); static HashMap<String, BlockRotation> rotationMapping = new HashMap<>();
static { static {
HashMap<String, BlockProperty> propertyHashMap; HashMap<String, BlockProperties> propertyHashMap;
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 15; i++) { for (int i = 0; i <= 15; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("LEVEL_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("LEVEL_%d", i)));
} }
propertiesMapping.put("level", propertyHashMap); propertiesMapping.put("level", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 5; i++) { for (int i = 0; i <= 5; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("HONEY_LEVEL_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("HONEY_LEVEL_%d", i)));
} }
propertiesMapping.put("honey_level", propertyHashMap); propertiesMapping.put("honey_level", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 15; i++) { for (int i = 0; i <= 15; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("POWER_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("POWER_%d", i)));
} }
propertiesMapping.put("power", propertyHashMap); propertiesMapping.put("power", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 1; i <= 8; i++) { for (int i = 1; i <= 8; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("LAYERS_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("LAYERS_%d", i)));
} }
propertiesMapping.put("layers", propertyHashMap); propertiesMapping.put("layers", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 7; i++) { for (int i = 0; i <= 7; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("DISTANCE_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("DISTANCE_%d", i)));
} }
propertiesMapping.put("distance", propertyHashMap); propertiesMapping.put("distance", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 25; i++) { for (int i = 0; i <= 25; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("AGE_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("AGE_%d", i)));
} }
propertiesMapping.put("age", propertyHashMap); propertiesMapping.put("age", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 7; i++) { for (int i = 0; i <= 7; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("DISTANCE_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("DISTANCE_%d", i)));
} }
propertiesMapping.put("distance", propertyHashMap); propertiesMapping.put("distance", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 7; i++) { for (int i = 0; i <= 7; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("MOISTURE_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("MOISTURE_%d", i)));
} }
propertiesMapping.put("moisture", propertyHashMap); propertiesMapping.put("moisture", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 1; i <= 4; i++) { for (int i = 1; i <= 4; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("PICKLES_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("PICKLES_%d", i)));
} }
propertiesMapping.put("pickles", propertyHashMap); propertiesMapping.put("pickles", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 6; i++) { for (int i = 0; i <= 6; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("BITES_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("BITES_%d", i)));
} }
propertiesMapping.put("bites", propertyHashMap); propertiesMapping.put("bites", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 1; i <= 4; i++) { for (int i = 1; i <= 4; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("DELAY_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("DELAY_%d", i)));
} }
propertiesMapping.put("delay", propertyHashMap); propertiesMapping.put("delay", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 2; i++) { for (int i = 0; i <= 2; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("HATCH_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("HATCH_%d", i)));
} }
propertiesMapping.put("hatch", propertyHashMap); propertiesMapping.put("hatch", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 1; i <= 4; i++) { for (int i = 1; i <= 4; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("EGGS_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("EGGS_%d", i)));
} }
propertiesMapping.put("eggs", propertyHashMap); propertiesMapping.put("eggs", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
for (int i = 0; i <= 24; i++) { for (int i = 0; i <= 24; i++) {
propertyHashMap.put(String.valueOf(i), BlockProperty.valueOf(String.format("NOTE_%d", i))); propertyHashMap.put(String.valueOf(i), BlockProperties.valueOf(String.format("NOTE_%d", i)));
} }
propertiesMapping.put("note", propertyHashMap); propertiesMapping.put("note", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("0", BlockProperty.STAGE_0); propertyHashMap.put("0", BlockProperties.STAGE_0);
propertyHashMap.put("1", BlockProperty.STAGE_1); propertyHashMap.put("1", BlockProperties.STAGE_1);
propertiesMapping.put("stage", propertyHashMap); propertiesMapping.put("stage", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.EAST); propertyHashMap.put("true", BlockProperties.EAST);
propertyHashMap.put("up", BlockProperty.EAST_UP); propertyHashMap.put("up", BlockProperties.EAST_UP);
propertyHashMap.put("side", BlockProperty.EAST_SIDE); propertyHashMap.put("side", BlockProperties.EAST_SIDE);
propertyHashMap.put("false", BlockProperty.NONE); propertyHashMap.put("false", BlockProperties.NONE);
propertyHashMap.put("none", BlockProperty.NONE); propertyHashMap.put("none", BlockProperties.NONE);
propertiesMapping.put("east", propertyHashMap); propertiesMapping.put("east", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.WEST); propertyHashMap.put("true", BlockProperties.WEST);
propertyHashMap.put("up", BlockProperty.WEST_UP); propertyHashMap.put("up", BlockProperties.WEST_UP);
propertyHashMap.put("side", BlockProperty.WEST_SIDE); propertyHashMap.put("side", BlockProperties.WEST_SIDE);
propertyHashMap.put("false", BlockProperty.NONE); propertyHashMap.put("false", BlockProperties.NONE);
propertyHashMap.put("none", BlockProperty.NONE); propertyHashMap.put("none", BlockProperties.NONE);
propertiesMapping.put("west", propertyHashMap); propertiesMapping.put("west", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.SOUTH); propertyHashMap.put("true", BlockProperties.SOUTH);
propertyHashMap.put("up", BlockProperty.SOUTH_UP); propertyHashMap.put("up", BlockProperties.SOUTH_UP);
propertyHashMap.put("side", BlockProperty.SOUTH_SIDE); propertyHashMap.put("side", BlockProperties.SOUTH_SIDE);
propertyHashMap.put("false", BlockProperty.NONE); propertyHashMap.put("false", BlockProperties.NONE);
propertyHashMap.put("none", BlockProperty.NONE); propertyHashMap.put("none", BlockProperties.NONE);
propertiesMapping.put("south", propertyHashMap); propertiesMapping.put("south", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.NORTH); propertyHashMap.put("true", BlockProperties.NORTH);
propertyHashMap.put("up", BlockProperty.NORTH_UP); propertyHashMap.put("up", BlockProperties.NORTH_UP);
propertyHashMap.put("side", BlockProperty.NORTH_SIDE); propertyHashMap.put("side", BlockProperties.NORTH_SIDE);
propertyHashMap.put("false", BlockProperty.NONE); propertyHashMap.put("false", BlockProperties.NONE);
propertyHashMap.put("none", BlockProperty.NONE); propertyHashMap.put("none", BlockProperties.NONE);
propertiesMapping.put("north", propertyHashMap); propertiesMapping.put("north", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.SNOWY); propertyHashMap.put("true", BlockProperties.SNOWY);
propertyHashMap.put("false", BlockProperty.NOT_SNOWY); propertyHashMap.put("false", BlockProperties.NOT_SNOWY);
propertiesMapping.put("snowy", propertyHashMap); propertiesMapping.put("snowy", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.UP); propertyHashMap.put("true", BlockProperties.UP);
propertyHashMap.put("false", BlockProperty.NOT_UP); propertyHashMap.put("false", BlockProperties.NOT_UP);
propertiesMapping.put("up", propertyHashMap); propertiesMapping.put("up", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.DOWN); propertyHashMap.put("true", BlockProperties.DOWN);
propertyHashMap.put("false", BlockProperty.NOT_DOWN); propertyHashMap.put("false", BlockProperties.NOT_DOWN);
propertiesMapping.put("down", propertyHashMap); propertiesMapping.put("down", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.IN_WALL); propertyHashMap.put("true", BlockProperties.IN_WALL);
propertyHashMap.put("false", BlockProperty.NOT_IN_WALL); propertyHashMap.put("false", BlockProperties.NOT_IN_WALL);
propertiesMapping.put("in_wall", propertyHashMap); propertiesMapping.put("in_wall", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.EXTENDED); propertyHashMap.put("true", BlockProperties.EXTENDED);
propertyHashMap.put("false", BlockProperty.NOT_EXTENDED); propertyHashMap.put("false", BlockProperties.NOT_EXTENDED);
propertiesMapping.put("extended", propertyHashMap); propertiesMapping.put("extended", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.POWERED); propertyHashMap.put("true", BlockProperties.POWERED);
propertyHashMap.put("false", BlockProperty.NOT_POWERED); propertyHashMap.put("false", BlockProperties.NOT_POWERED);
propertiesMapping.put("powered", propertyHashMap); propertiesMapping.put("powered", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.OPEN); propertyHashMap.put("true", BlockProperties.OPEN);
propertyHashMap.put("false", BlockProperty.CLOSED); propertyHashMap.put("false", BlockProperties.CLOSED);
propertiesMapping.put("open", propertyHashMap); propertiesMapping.put("open", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.BOTTOM); propertyHashMap.put("true", BlockProperties.BOTTOM);
propertyHashMap.put("false", BlockProperty.NOT_BOTTOM); propertyHashMap.put("false", BlockProperties.NOT_BOTTOM);
propertiesMapping.put("bottom", propertyHashMap); propertiesMapping.put("bottom", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.OCCUPIED); propertyHashMap.put("true", BlockProperties.OCCUPIED);
propertyHashMap.put("false", BlockProperty.NOT_OCCUPIED); propertyHashMap.put("false", BlockProperties.NOT_OCCUPIED);
propertiesMapping.put("occupied", propertyHashMap); propertiesMapping.put("occupied", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.ATTACHED); propertyHashMap.put("true", BlockProperties.ATTACHED);
propertyHashMap.put("false", BlockProperty.NOT_ATTACHED); propertyHashMap.put("false", BlockProperties.NOT_ATTACHED);
propertiesMapping.put("attached", propertyHashMap); propertiesMapping.put("attached", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.DISARMED); propertyHashMap.put("true", BlockProperties.DISARMED);
propertyHashMap.put("false", BlockProperty.ARMED); propertyHashMap.put("false", BlockProperties.ARMED);
propertiesMapping.put("disarmed", propertyHashMap); propertiesMapping.put("disarmed", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.INVERTED); propertyHashMap.put("true", BlockProperties.INVERTED);
propertyHashMap.put("false", BlockProperty.NOT_INVERTED); propertyHashMap.put("false", BlockProperties.NOT_INVERTED);
propertiesMapping.put("inverted", propertyHashMap); propertiesMapping.put("inverted", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.TRIGGERED); propertyHashMap.put("true", BlockProperties.TRIGGERED);
propertyHashMap.put("false", BlockProperty.NOT_TRIGGERED); propertyHashMap.put("false", BlockProperties.NOT_TRIGGERED);
propertiesMapping.put("triggered", propertyHashMap); propertiesMapping.put("triggered", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.CONDITIONAL); propertyHashMap.put("true", BlockProperties.CONDITIONAL);
propertyHashMap.put("false", BlockProperty.UNCONDITIONAL); propertyHashMap.put("false", BlockProperties.UNCONDITIONAL);
propertiesMapping.put("conditional", propertyHashMap); propertiesMapping.put("conditional", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.DRAG); propertyHashMap.put("true", BlockProperties.DRAG);
propertyHashMap.put("false", BlockProperty.NOT_DRAG); propertyHashMap.put("false", BlockProperties.NOT_DRAG);
propertiesMapping.put("drag", propertyHashMap); propertiesMapping.put("drag", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.UNSTABLE); propertyHashMap.put("true", BlockProperties.UNSTABLE);
propertyHashMap.put("false", BlockProperty.STABLE); propertyHashMap.put("false", BlockProperties.STABLE);
propertiesMapping.put("unstable", propertyHashMap); propertiesMapping.put("unstable", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.HANGING); propertyHashMap.put("true", BlockProperties.HANGING);
propertyHashMap.put("false", BlockProperty.NOT_HANGING); propertyHashMap.put("false", BlockProperties.NOT_HANGING);
propertiesMapping.put("hanging", propertyHashMap); propertiesMapping.put("hanging", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.HAS_BOOK); propertyHashMap.put("true", BlockProperties.HAS_BOOK);
propertyHashMap.put("false", BlockProperty.NO_BOOK); propertyHashMap.put("false", BlockProperties.NO_BOOK);
propertiesMapping.put("has_book", propertyHashMap); propertiesMapping.put("has_book", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.HAS_BOTTLE_0); propertyHashMap.put("true", BlockProperties.HAS_BOTTLE_0);
propertyHashMap.put("false", BlockProperty.NO_BOTTLE_0); propertyHashMap.put("false", BlockProperties.NO_BOTTLE_0);
propertiesMapping.put("has_bottle_0", propertyHashMap); propertiesMapping.put("has_bottle_0", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.HAS_BOTTLE_1); propertyHashMap.put("true", BlockProperties.HAS_BOTTLE_1);
propertyHashMap.put("false", BlockProperty.NO_BOTTLE_1); propertyHashMap.put("false", BlockProperties.NO_BOTTLE_1);
propertiesMapping.put("has_bottle_1", propertyHashMap); propertiesMapping.put("has_bottle_1", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.HAS_BOTTLE_2); propertyHashMap.put("true", BlockProperties.HAS_BOTTLE_2);
propertyHashMap.put("false", BlockProperty.NO_BOTTLE_2); propertyHashMap.put("false", BlockProperties.NO_BOTTLE_2);
propertiesMapping.put("has_bottle_2", propertyHashMap); propertiesMapping.put("has_bottle_2", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.PERSISTENT); propertyHashMap.put("true", BlockProperties.PERSISTENT);
propertyHashMap.put("false", BlockProperty.NOT_PERSISTENT); propertyHashMap.put("false", BlockProperties.NOT_PERSISTENT);
propertiesMapping.put("persistent", propertyHashMap); propertiesMapping.put("persistent", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.LIT); propertyHashMap.put("true", BlockProperties.LIT);
propertyHashMap.put("false", BlockProperty.UN_LIT); propertyHashMap.put("false", BlockProperties.UN_LIT);
propertiesMapping.put("lit", propertyHashMap); propertiesMapping.put("lit", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.WATERLOGGED); propertyHashMap.put("true", BlockProperties.WATERLOGGED);
propertyHashMap.put("false", BlockProperty.NOT_WATERLOGGED); propertyHashMap.put("false", BlockProperties.NOT_WATERLOGGED);
propertiesMapping.put("waterlogged", propertyHashMap); propertiesMapping.put("waterlogged", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.LOCKED); propertyHashMap.put("true", BlockProperties.LOCKED);
propertyHashMap.put("false", BlockProperty.UNLOCKED); propertyHashMap.put("false", BlockProperties.UNLOCKED);
propertiesMapping.put("locked", propertyHashMap); propertiesMapping.put("locked", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.EYE); propertyHashMap.put("true", BlockProperties.EYE);
propertyHashMap.put("false", BlockProperty.NO_EYE); propertyHashMap.put("false", BlockProperties.NO_EYE);
propertiesMapping.put("eye", propertyHashMap); propertiesMapping.put("eye", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.ENABLED); propertyHashMap.put("true", BlockProperties.ENABLED);
propertyHashMap.put("false", BlockProperty.DISABLED); propertyHashMap.put("false", BlockProperties.DISABLED);
propertiesMapping.put("enabled", propertyHashMap); propertiesMapping.put("enabled", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.HAS_RECORD); propertyHashMap.put("true", BlockProperties.HAS_RECORD);
propertyHashMap.put("false", BlockProperty.HAS_NO_RECORD); propertyHashMap.put("false", BlockProperties.HAS_NO_RECORD);
propertiesMapping.put("has_record", propertyHashMap); propertiesMapping.put("has_record", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.SHORT); propertyHashMap.put("true", BlockProperties.SHORT);
propertyHashMap.put("false", BlockProperty.LONG); propertyHashMap.put("false", BlockProperties.LONG);
propertiesMapping.put("short", propertyHashMap); propertiesMapping.put("short", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("true", BlockProperty.SIGNAL_FIRE); propertyHashMap.put("true", BlockProperties.SIGNAL_FIRE);
propertyHashMap.put("false", BlockProperty.NOT_SIGNAL_FIRE); propertyHashMap.put("false", BlockProperties.NOT_SIGNAL_FIRE);
propertiesMapping.put("signal_fire", propertyHashMap); propertiesMapping.put("signal_fire", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("harp", BlockProperty.HARP); propertyHashMap.put("harp", BlockProperties.HARP);
propertyHashMap.put("basedrum", BlockProperty.BASEDRUM); propertyHashMap.put("basedrum", BlockProperties.BASEDRUM);
propertyHashMap.put("snare", BlockProperty.SNARE); propertyHashMap.put("snare", BlockProperties.SNARE);
propertyHashMap.put("hat", BlockProperty.HAT); propertyHashMap.put("hat", BlockProperties.HAT);
propertyHashMap.put("bass", BlockProperty.BASS); propertyHashMap.put("bass", BlockProperties.BASS);
propertyHashMap.put("flute", BlockProperty.FLUTE); propertyHashMap.put("flute", BlockProperties.FLUTE);
propertyHashMap.put("bell", BlockProperty.BELL); propertyHashMap.put("bell", BlockProperties.BELL);
propertyHashMap.put("guitar", BlockProperty.GUITAR); propertyHashMap.put("guitar", BlockProperties.GUITAR);
propertyHashMap.put("chime", BlockProperty.CHIME); propertyHashMap.put("chime", BlockProperties.CHIME);
propertyHashMap.put("xylophone", BlockProperty.XYLOPHONE); propertyHashMap.put("xylophone", BlockProperties.XYLOPHONE);
propertyHashMap.put("iron_xylophone", BlockProperty.IRON_XYLOPHONE); propertyHashMap.put("iron_xylophone", BlockProperties.IRON_XYLOPHONE);
propertyHashMap.put("cow_bell", BlockProperty.COW_BELL); propertyHashMap.put("cow_bell", BlockProperties.COW_BELL);
propertyHashMap.put("didgeridoo", BlockProperty.DIDGERIDOO); propertyHashMap.put("didgeridoo", BlockProperties.DIDGERIDOO);
propertyHashMap.put("bit", BlockProperty.BIT); propertyHashMap.put("bit", BlockProperties.BIT);
propertyHashMap.put("banjo", BlockProperty.BANJO); propertyHashMap.put("banjo", BlockProperties.BANJO);
propertyHashMap.put("pling", BlockProperty.PLING); propertyHashMap.put("pling", BlockProperties.PLING);
propertiesMapping.put("instrument", propertyHashMap); propertiesMapping.put("instrument", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("head", BlockProperty.HEAD); propertyHashMap.put("head", BlockProperties.HEAD);
propertyHashMap.put("foot", BlockProperty.FOOT); propertyHashMap.put("foot", BlockProperties.FOOT);
propertiesMapping.put("part", propertyHashMap); propertiesMapping.put("part", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("left", BlockProperty.HINGE_LEFT); propertyHashMap.put("left", BlockProperties.HINGE_LEFT);
propertyHashMap.put("right", BlockProperty.HINGE_RIGHT); propertyHashMap.put("right", BlockProperties.HINGE_RIGHT);
propertiesMapping.put("hinge", propertyHashMap); propertiesMapping.put("hinge", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("x", BlockProperty.AXIS_X); propertyHashMap.put("x", BlockProperties.AXIS_X);
propertyHashMap.put("y", BlockProperty.AXIS_Y); propertyHashMap.put("y", BlockProperties.AXIS_Y);
propertyHashMap.put("z", BlockProperty.AXIS_Z); propertyHashMap.put("z", BlockProperties.AXIS_Z);
propertiesMapping.put("axis", propertyHashMap); propertiesMapping.put("axis", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("floor", BlockProperty.FLOOR); propertyHashMap.put("floor", BlockProperties.FLOOR);
propertyHashMap.put("wall", BlockProperty.WALL); propertyHashMap.put("wall", BlockProperties.WALL);
propertyHashMap.put("ceiling", BlockProperty.CEILING); propertyHashMap.put("ceiling", BlockProperties.CEILING);
propertiesMapping.put("face", propertyHashMap); propertiesMapping.put("face", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("floor", BlockProperty.FLOOR); propertyHashMap.put("floor", BlockProperties.FLOOR);
propertyHashMap.put("ceiling", BlockProperty.CEILING); propertyHashMap.put("ceiling", BlockProperties.CEILING);
propertyHashMap.put("single_wall", BlockProperty.SINGLE_WALL); propertyHashMap.put("single_wall", BlockProperties.SINGLE_WALL);
propertyHashMap.put("double_wall", BlockProperty.DOUBLE_WALL); propertyHashMap.put("double_wall", BlockProperties.DOUBLE_WALL);
propertiesMapping.put("attachment", propertyHashMap); propertiesMapping.put("attachment", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("save", BlockProperty.SAVE); propertyHashMap.put("save", BlockProperties.SAVE);
propertyHashMap.put("load", BlockProperty.LOAD); propertyHashMap.put("load", BlockProperties.LOAD);
propertyHashMap.put("corner", BlockProperty.CORNER); propertyHashMap.put("corner", BlockProperties.CORNER);
propertyHashMap.put("data", BlockProperty.DATA); propertyHashMap.put("data", BlockProperties.DATA);
propertyHashMap.put("compare", BlockProperty.COMPARE); propertyHashMap.put("compare", BlockProperties.COMPARE);
propertyHashMap.put("subtract", BlockProperty.SUBTRACT); propertyHashMap.put("subtract", BlockProperties.SUBTRACT);
propertiesMapping.put("mode", propertyHashMap); propertiesMapping.put("mode", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("top", BlockProperty.HALF_UPPER); propertyHashMap.put("top", BlockProperties.HALF_UPPER);
propertyHashMap.put("upper", BlockProperty.HALF_UPPER); propertyHashMap.put("upper", BlockProperties.HALF_UPPER);
propertyHashMap.put("bottom", BlockProperty.HALF_LOWER); propertyHashMap.put("bottom", BlockProperties.HALF_LOWER);
propertyHashMap.put("lower", BlockProperty.HALF_LOWER); propertyHashMap.put("lower", BlockProperties.HALF_LOWER);
propertiesMapping.put("half", propertyHashMap); propertiesMapping.put("half", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("none", BlockProperty.NONE); propertyHashMap.put("none", BlockProperties.NONE);
propertyHashMap.put("small", BlockProperty.LARGE); propertyHashMap.put("small", BlockProperties.LARGE);
propertyHashMap.put("large", BlockProperty.SMALL); propertyHashMap.put("large", BlockProperties.SMALL);
propertiesMapping.put("leaves", propertyHashMap); propertiesMapping.put("leaves", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("top", BlockProperty.SLAB_TOP); propertyHashMap.put("top", BlockProperties.SLAB_TOP);
propertyHashMap.put("bottom", BlockProperty.SLAB_BOTTOM); propertyHashMap.put("bottom", BlockProperties.SLAB_BOTTOM);
propertyHashMap.put("double", BlockProperty.SLAB_DOUBLE); propertyHashMap.put("double", BlockProperties.SLAB_DOUBLE);
propertyHashMap.put("normal", BlockProperty.TYPE_NORMAL); propertyHashMap.put("normal", BlockProperties.TYPE_NORMAL);
propertyHashMap.put("sticky", BlockProperty.TYPE_STICKY); propertyHashMap.put("sticky", BlockProperties.TYPE_STICKY);
propertyHashMap.put("single", BlockProperty.TYPE_SINGLE); propertyHashMap.put("single", BlockProperties.TYPE_SINGLE);
propertyHashMap.put("left", BlockProperty.TYPE_LEFT); propertyHashMap.put("left", BlockProperties.TYPE_LEFT);
propertyHashMap.put("right", BlockProperty.TYPE_RIGHT); propertyHashMap.put("right", BlockProperties.TYPE_RIGHT);
propertiesMapping.put("type", propertyHashMap); propertiesMapping.put("type", propertyHashMap);
propertyHashMap = new HashMap<>(); propertyHashMap = new HashMap<>();
propertyHashMap.put("straight", BlockProperty.STRAIGHT); propertyHashMap.put("straight", BlockProperties.STRAIGHT);
propertyHashMap.put("inner_left", BlockProperty.INNER_LEFT); propertyHashMap.put("inner_left", BlockProperties.INNER_LEFT);
propertyHashMap.put("inner_right", BlockProperty.INNER_RIGHT); propertyHashMap.put("inner_right", BlockProperties.INNER_RIGHT);
propertyHashMap.put("outer_left", BlockProperty.OUTER_LEFT); propertyHashMap.put("outer_left", BlockProperties.OUTER_LEFT);
propertyHashMap.put("outer_right", BlockProperty.OUTER_RIGHT); propertyHashMap.put("outer_right", BlockProperties.OUTER_RIGHT);
propertyHashMap.put("north_south", BlockProperty.NORTH_SOUTH); propertyHashMap.put("north_south", BlockProperties.NORTH_SOUTH);
propertyHashMap.put("east_west", BlockProperty.EAST_WEST); propertyHashMap.put("east_west", BlockProperties.EAST_WEST);
propertyHashMap.put("south_east", BlockProperty.SOUTH_EAST); propertyHashMap.put("south_east", BlockProperties.SOUTH_EAST);
propertyHashMap.put("south_west", BlockProperty.SOUTH_WEST); propertyHashMap.put("south_west", BlockProperties.SOUTH_WEST);
propertyHashMap.put("north_west", BlockProperty.NORTH_WEST); propertyHashMap.put("north_west", BlockProperties.NORTH_WEST);
propertyHashMap.put("north_east", BlockProperty.NORTH_EAST); propertyHashMap.put("north_east", BlockProperties.NORTH_EAST);
propertyHashMap.put("ascending_east", BlockProperty.ASCENDING_EAST); propertyHashMap.put("ascending_east", BlockProperties.ASCENDING_EAST);
propertyHashMap.put("ascending_west", BlockProperty.ASCENDING_WEST); propertyHashMap.put("ascending_west", BlockProperties.ASCENDING_WEST);
propertyHashMap.put("ascending_north", BlockProperty.ASCENDING_NORTH); propertyHashMap.put("ascending_north", BlockProperties.ASCENDING_NORTH);
propertyHashMap.put("ascending_south", BlockProperty.ASCENDING_SOUTH); propertyHashMap.put("ascending_south", BlockProperties.ASCENDING_SOUTH);
propertiesMapping.put("shape", propertyHashMap); propertiesMapping.put("shape", propertyHashMap);
rotationMapping.put("0", BlockRotation.SOUTH); rotationMapping.put("0", BlockRotation.SOUTH);
@ -436,13 +435,13 @@ public class Blocks {
} }
public static Block getBlockByLegacy(int protocolId, int protocolMetaData) { public static Block getBlockByLegacy(int protocolId, int protocolMetaData) {
int itemId = protocolId << 4 | protocolMetaData; int blockId = protocolId << 4 | protocolMetaData;
return getBlock(itemId, ProtocolVersion.VERSION_1_12_2); return getBlock(blockId, ProtocolVersion.VERSION_1_12_2);
} }
public static Block getBlockByLegacy(int itemIdAndMetaData) { public static Block getBlockByLegacy(int blockIdAndMetaData) {
return getBlock(itemIdAndMetaData, ProtocolVersion.VERSION_1_12_2); return getBlock(blockIdAndMetaData, ProtocolVersion.VERSION_1_12_2);
} }
public static Block getBlock(int protocolId, ProtocolVersion version) { public static Block getBlock(int protocolId, ProtocolVersion version) {
@ -453,7 +452,7 @@ public class Blocks {
} }
public static void load(String mod, JSONObject json, ProtocolVersion version) { public static void load(String mod, JSONObject json, ProtocolVersion version) {
BiMap<Integer, Block> versionMapping = HashBiMap.create(); HashBiMap<Integer, Block> versionMapping = HashBiMap.create();
for (Iterator<String> identifiers = json.keys(); identifiers.hasNext(); ) { for (Iterator<String> identifiers = json.keys(); identifiers.hasNext(); ) {
String identifierName = identifiers.next(); String identifierName = identifiers.next();
JSONObject identifierJSON = json.getJSONObject(identifierName); JSONObject identifierJSON = json.getJSONObject(identifierName);
@ -472,7 +471,7 @@ public class Blocks {
rotation = rotationMapping.get(propertiesJSON.getString("rotation")); rotation = rotationMapping.get(propertiesJSON.getString("rotation"));
propertiesJSON.remove("rotation"); propertiesJSON.remove("rotation");
} }
BlockProperty[] properties = new BlockProperty[propertiesJSON.length()]; BlockProperties[] properties = new BlockProperties[propertiesJSON.length()];
int ii = 0; int ii = 0;
for (Iterator<String> it = propertiesJSON.keys(); it.hasNext(); ) { for (Iterator<String> it = propertiesJSON.keys(); it.hasNext(); ) {
String propertyName = it.next(); String propertyName = it.next();
@ -525,15 +524,15 @@ public class Blocks {
} }
public static Block getBlock(String mod, String identifier) { public static Block getBlock(String mod, String identifier) {
for (Block item : blockList) { for (Block block : blockList) {
if (item.getMod().equals(mod) && item.getIdentifier().equals(identifier)) { if (block.getMod().equals(mod) && block.getIdentifier().equals(identifier)) {
return item; return block;
} }
} }
return null; return null;
} }
public static Block getBlock(String mod, String identifier, BlockProperty[] properties, BlockRotation rotation) { public static Block getBlock(String mod, String identifier, BlockProperties[] properties, BlockRotation rotation) {
for (Block block : blockList) { for (Block block : blockList) {
if (block.getMod().equals(mod) && block.getIdentifier().equals(identifier) && block.getRotation() == rotation && propertiesEquals(block.getProperties(), properties)) { if (block.getMod().equals(mod) && block.getIdentifier().equals(identifier) && block.getRotation() == rotation && propertiesEquals(block.getProperties(), properties)) {
return block; return block;
@ -542,11 +541,11 @@ public class Blocks {
return null; return null;
} }
public static boolean propertiesEquals(BlockProperty[] one, BlockProperty[] two) { public static boolean propertiesEquals(BlockProperties[] one, BlockProperties[] two) {
if (one.length != two.length) { if (one.length != two.length) {
return false; return false;
} }
for (BlockProperty property : one) { for (BlockProperties property : one) {
if (!containsElement(two, property)) { if (!containsElement(two, property)) {
return false; return false;
} }
@ -554,20 +553,21 @@ public class Blocks {
return true; return true;
} }
public static boolean containsElement(BlockProperty[] arr, BlockProperty value) { public static boolean containsElement(BlockProperties[] arr, BlockProperties value) {
for (BlockProperty property : arr) { for (BlockProperties property : arr) {
if (property == value) if (property == value) {
return true; return true;
}
} }
return false; return false;
} }
public static int getBlockId(Block item, ProtocolVersion version) { public static int getBlockId(Block block, ProtocolVersion version) {
int itemId = blockMap.get(version).inverse().get(item); int blockId = blockMap.get(version).inverse().get(block);
if (version.getVersionNumber() <= ProtocolVersion.VERSION_1_12_2.getVersionNumber()) { if (version.getVersionNumber() <= ProtocolVersion.VERSION_1_12_2.getVersionNumber()) {
return itemId >> 4; return blockId >> 4;
} }
return itemId; return blockId;
} }
} }

View File

@ -13,7 +13,6 @@
package de.bixilon.minosoft.game.datatypes.entities.items; package de.bixilon.minosoft.game.datatypes.entities.items;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; import de.bixilon.minosoft.protocol.protocol.ProtocolVersion;
import org.json.JSONObject; import org.json.JSONObject;
@ -25,7 +24,7 @@ import java.util.Iterator;
public class Items { public class Items {
static ArrayList<Item> itemList = new ArrayList<>(); static ArrayList<Item> itemList = new ArrayList<>();
static HashMap<ProtocolVersion, BiMap<Integer, Item>> itemMap = new HashMap<>(); // version -> (protocolId > Item) static HashMap<ProtocolVersion, HashBiMap<Integer, Item>> itemMap = new HashMap<>(); // version -> (protocolId > Item)
public static Item getItemByLegacy(int protocolId, int protocolMetaData) { public static Item getItemByLegacy(int protocolId, int protocolMetaData) {
int itemId = protocolId << 4; int itemId = protocolId << 4;
@ -45,7 +44,7 @@ public class Items {
} }
public static void load(String mod, JSONObject json, ProtocolVersion version) { public static void load(String mod, JSONObject json, ProtocolVersion version) {
BiMap<Integer, Item> versionMapping = HashBiMap.create(); HashBiMap<Integer, Item> versionMapping = HashBiMap.create();
for (Iterator<String> identifiers = json.keys(); identifiers.hasNext(); ) { for (Iterator<String> identifiers = json.keys(); identifiers.hasNext(); ) {
String identifierName = identifiers.next(); String identifierName = identifiers.next();
Item item = getItem(mod, identifierName); Item item = getItem(mod, identifierName);

View File

@ -64,4 +64,16 @@ public class Slot {
} }
return item.toString(); // ToDo display name per Item (from language file) return item.toString(); // ToDo display name per Item (from language file)
} }
@Override
public boolean equals(Object obj) {
if (super.equals(obj)) {
return true;
}
Slot their = (Slot) obj;
// ToDo: check nbt
return their.getItem().equals(getItem()) && their.getItemCount() == getItemCount() && their.getItemMetadata() == getItemMetadata();
}
} }

View File

@ -0,0 +1,58 @@
/*
* Codename 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.game.datatypes.recipes;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
public class Ingredient {
final Slot[] slot;
public Ingredient(Slot[] slot) {
this.slot = slot;
}
public static boolean slotEquals(Slot[] one, Slot[] two) {
if (one.length != two.length) {
return false;
}
for (Slot slot : one) {
if (!containsElement(two, slot)) {
return false;
}
}
return true;
}
public static boolean containsElement(Slot[] arr, Slot value) {
for (Slot slot : arr) {
if (slot.equals(value)) {
return true;
}
}
return false;
}
public Slot[] getSlot() {
return slot;
}
@Override
public boolean equals(Object obj) {
if (super.equals(obj)) {
return true;
}
Ingredient their = (Ingredient) obj;
return slotEquals(getSlot(), their.getSlot());
}
}

View File

@ -0,0 +1,88 @@
/*
* Codename 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.game.datatypes.recipes;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
public class Recipe {
final RecipeProperties property;
Slot result;
String group;
Ingredient[] ingredients;
int height;
int width;
float experience;
int cookingTime;
public Recipe(RecipeProperties property, String group, Ingredient[] ingredients, Slot result) {
this.property = property;
this.group = group;
this.ingredients = ingredients;
this.result = result;
}
public Recipe(int width, int height, RecipeProperties property, String group, Ingredient[] ingredients, Slot result) {
this.width = width;
this.height = height;
this.property = property;
this.group = group;
this.ingredients = ingredients;
this.result = result;
}
public Recipe(RecipeProperties property, String group, Ingredient ingredient, Slot result, float experience, int cookingTime) {
this.property = property;
this.group = group;
this.ingredients = new Ingredient[]{ingredient};
this.result = result;
this.experience = experience;
this.cookingTime = cookingTime;
}
public Recipe(RecipeProperties property) {
this.property = property;
}
public RecipeProperties getProperty() {
return property;
}
public Slot getResult() {
return result;
}
public String getGroup() {
return group;
}
public Ingredient[] getIngredients() {
return ingredients;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public float getExperience() {
return experience;
}
public int getCookingTime() {
return cookingTime;
}
}

View File

@ -0,0 +1,52 @@
/*
* Codename 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.game.datatypes.recipes;
public enum RecipeProperties {
SHAPELESS("crafting_shapeless"),
SHAPED("crafting_shaped"),
SPECIAL_ARMOR_DYE("crafting_special_armordye"),
SPECIAL_BOOK_CLONING("crafting_special_bookcloning"),
SPECIAL_MAP_CLONING("crafting_special_mapcloning"),
SPECIAL_MAP_EXTENDING("crafting_special_mapextending"),
SPECIAL_FIREWORK_ROCKET("crafting_special_firework_rocket"),
SPECIAL_FIREWORK_STAR("crafting_special_firework_star"),
SPECIAL_FIREWORK_STAR_FADE("crafting_special_firework_star_fade"),
SPECIAL_REPAIR_ITEM("crafting_special_repairitem"),
SPECIAL_TIPPED_ARROW("crafting_special_tippedarrow"),
SPECIAL_BANNER_DUPLICATE("crafting_special_bannerduplicate"),
SPECIAL_BANNER_ADD_PATTERN("crafting_special_banneraddpattern"),
SPECIAL_SHIELD_DECORATION("crafting_special_shielddecoration"),
SPECIAL_SHULKER_BOX_COLORING("crafting_special_shulkerboxcoloring"),
SMELTING("smelting");
final String name;
RecipeProperties(String name) {
this.name = name;
}
public static RecipeProperties byName(String name) {
for (RecipeProperties recipeProperty : values()) {
if (recipeProperty.getName().equals(name)) {
return recipeProperty;
}
}
return null;
}
public String getName() {
return name;
}
}

View File

@ -0,0 +1,84 @@
package de.bixilon.minosoft.game.datatypes.recipes;
/*
* Codename 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.
*/
import com.google.common.collect.HashBiMap;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
import de.bixilon.minosoft.protocol.protocol.ProtocolVersion;
import java.util.ArrayList;
import java.util.HashMap;
public class Recipes {
static ArrayList<Recipe> recipeList = new ArrayList<>();
static HashBiMap<Integer, Recipe> recipeIdMap = HashBiMap.create(); // ids for version <= VERSION_1_12_2
static HashMap<ProtocolVersion, HashBiMap<String, Recipe>> recipeNameMap = new HashMap<>(); // names for version >= VERSION_1_13_2
static {
for (ProtocolVersion version : ProtocolVersion.versionMappingArray) {
if (version.getVersionNumber() >= ProtocolVersion.VERSION_1_13_2.getVersionNumber()) {
// add to list
recipeNameMap.put(version, HashBiMap.create());
}
}
}
public static Recipe getRecipeById(int id) {
return recipeIdMap.get(id);
}
public static Recipe getRecipe(String identifier, ProtocolVersion version) {
return recipeNameMap.get(version).get(identifier);
}
public static Recipe getRecipe(RecipeProperties property, Slot result, String group, Ingredient[] ingredients) {
for (Recipe recipe : recipeList) {
if (recipe.getProperty() == property && recipe.getResult().equals(result) && recipe.getGroup().equals(group) && ingredientsEquals(recipe.getIngredients(), ingredients)) {
return recipe;
}
}
return null;
}
public static boolean ingredientsEquals(Ingredient[] one, Ingredient[] two) {
if (one.length != two.length) {
return false;
}
for (Ingredient ingredient : one) {
if (!containsElement(two, ingredient)) {
return false;
}
}
return true;
}
public static boolean containsElement(Ingredient[] arr, Ingredient value) {
for (Ingredient property : arr) {
if (property.equals(value)) {
return true;
}
}
return false;
}
// we don't want that recipes from 1 server will appear on an other. You must call this function before reconnecting do avoid issues
public static void removeCustomRecipes(ProtocolVersion version) {
recipeNameMap.get(version).clear();
}
public static void registerCustomRecipe(ProtocolVersion version, Recipe recipe, String identifier) {
recipeNameMap.get(version).put(identifier, recipe);
}
}

View File

@ -16,6 +16,7 @@ package de.bixilon.minosoft.protocol.network;
import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.Minosoft;
import de.bixilon.minosoft.config.GameConfiguration; import de.bixilon.minosoft.config.GameConfiguration;
import de.bixilon.minosoft.game.datatypes.Player; import de.bixilon.minosoft.game.datatypes.Player;
import de.bixilon.minosoft.game.datatypes.recipes.Recipes;
import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.modding.channels.DefaultPluginChannels; import de.bixilon.minosoft.protocol.modding.channels.DefaultPluginChannels;
import de.bixilon.minosoft.protocol.modding.channels.PluginChannelHandler; import de.bixilon.minosoft.protocol.modding.channels.PluginChannelHandler;
@ -116,6 +117,9 @@ public class Connection {
if (reason == ConnectionReason.GET_VERSION) { if (reason == ConnectionReason.GET_VERSION) {
setReason(ConnectionReason.CONNECT); setReason(ConnectionReason.CONNECT);
connect(); connect();
} else {
// unregister all custom recipes
Recipes.removeCustomRecipes(getVersion());
} }
} }
} }

View File

@ -0,0 +1,86 @@
/*
* Codename 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.protocol.packets.clientbound.play;
import de.bixilon.minosoft.game.datatypes.inventory.Slot;
import de.bixilon.minosoft.game.datatypes.recipes.Ingredient;
import de.bixilon.minosoft.game.datatypes.recipes.Recipe;
import de.bixilon.minosoft.game.datatypes.recipes.RecipeProperties;
import de.bixilon.minosoft.game.datatypes.recipes.Recipes;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InPacketBuffer;
import de.bixilon.minosoft.protocol.protocol.PacketHandler;
public class PacketDeclareRecipes implements ClientboundPacket {
Recipe[] recipes;
@Override
public boolean read(InPacketBuffer buffer) {
switch (buffer.getVersion()) {
case VERSION_1_13_2:
recipes = new Recipe[buffer.readVarInt()];
for (int i = 0; i < recipes.length; i++) {
Recipe recipe;
String identifier = buffer.readString();
String name = buffer.readString();
RecipeProperties type = RecipeProperties.byName(name);
switch (type) {
case SHAPELESS: {
String group = buffer.readString();
Ingredient[] ingredients = buffer.readIngredientArray(buffer.readVarInt());
Slot result = buffer.readSlot();
recipe = new Recipe(type, group, ingredients, result);
break;
}
case SHAPED: {
int width = buffer.readVarInt();
int height = buffer.readVarInt();
String group = buffer.readString();
Ingredient[] ingredients = buffer.readIngredientArray(width * height);
Slot result = buffer.readSlot();
recipe = new Recipe(width, height, type, group, ingredients, result);
break;
}
case SMELTING: {
String group = buffer.readString();
Ingredient ingredient = buffer.readIngredient();
Slot result = buffer.readSlot();
float experience = buffer.readFloat();
int cookingTime = buffer.readVarInt();
recipe = new Recipe(type, group, ingredient, result, experience, cookingTime);
break;
}
default:
recipe = new Recipe(type);
break;
}
Recipes.registerCustomRecipe(buffer.getVersion(), recipe, identifier);
}
return true;
}
return false;
}
@Override
public void log() {
Log.protocol(String.format("Received unlock crafting recipe packet (recipeLength=%d)", recipes.length));
}
@Override
public void handle(PacketHandler h) {
h.handle(this);
}
}

View File

@ -13,7 +13,8 @@
package de.bixilon.minosoft.protocol.packets.clientbound.play; package de.bixilon.minosoft.protocol.packets.clientbound.play;
import de.bixilon.minosoft.game.datatypes.Recipes; import de.bixilon.minosoft.game.datatypes.recipes.Recipe;
import de.bixilon.minosoft.game.datatypes.recipes.Recipes;
import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; import de.bixilon.minosoft.protocol.protocol.InPacketBuffer;
@ -23,8 +24,8 @@ public class PacketUnlockRecipes implements ClientboundPacket {
UnlockRecipeActions action; UnlockRecipeActions action;
boolean isCraftingBookOpen; boolean isCraftingBookOpen;
boolean isFilteringActive; boolean isFilteringActive;
Recipes[] listed; Recipe[] listed;
Recipes[] tagged; Recipe[] tagged;
@Override @Override
@ -34,14 +35,14 @@ public class PacketUnlockRecipes implements ClientboundPacket {
action = UnlockRecipeActions.byId(buffer.readVarInt()); action = UnlockRecipeActions.byId(buffer.readVarInt());
isCraftingBookOpen = buffer.readBoolean(); isCraftingBookOpen = buffer.readBoolean();
isFilteringActive = buffer.readBoolean(); isFilteringActive = buffer.readBoolean();
listed = new Recipes[buffer.readVarInt()]; listed = new Recipe[buffer.readVarInt()];
for (int i = 0; i < listed.length; i++) { for (int i = 0; i < listed.length; i++) {
listed[i] = Recipes.byId(buffer.readVarInt()); listed[i] = Recipes.getRecipeById(buffer.readVarInt());
} }
if (action == UnlockRecipeActions.INITIALIZE) { if (action == UnlockRecipeActions.INITIALIZE) {
tagged = new Recipes[buffer.readVarInt()]; tagged = new Recipe[buffer.readVarInt()];
for (int i = 0; i < tagged.length; i++) { for (int i = 0; i < tagged.length; i++) {
tagged[i] = Recipes.byId(buffer.readVarInt()); tagged[i] = Recipes.getRecipeById(buffer.readVarInt());
} }
} }
return true; return true;
@ -49,14 +50,14 @@ public class PacketUnlockRecipes implements ClientboundPacket {
action = UnlockRecipeActions.byId(buffer.readVarInt()); action = UnlockRecipeActions.byId(buffer.readVarInt());
isCraftingBookOpen = buffer.readBoolean(); isCraftingBookOpen = buffer.readBoolean();
isFilteringActive = buffer.readBoolean(); isFilteringActive = buffer.readBoolean();
listed = new Recipes[buffer.readVarInt()]; listed = new Recipe[buffer.readVarInt()];
for (int i = 0; i < listed.length; i++) { for (int i = 0; i < listed.length; i++) {
listed[i] = Recipes.byName(buffer.readString()); listed[i] = Recipes.getRecipe(buffer.readString(), buffer.getVersion());
} }
if (action == UnlockRecipeActions.INITIALIZE) { if (action == UnlockRecipeActions.INITIALIZE) {
tagged = new Recipes[buffer.readVarInt()]; tagged = new Recipe[buffer.readVarInt()];
for (int i = 0; i < tagged.length; i++) { for (int i = 0; i < tagged.length; i++) {
tagged[i] = Recipes.byName(buffer.readString()); tagged[i] = Recipes.getRecipe(buffer.readString(), buffer.getVersion());
} }
} }
return true; return true;
@ -82,11 +83,11 @@ public class PacketUnlockRecipes implements ClientboundPacket {
return isFilteringActive; return isFilteringActive;
} }
public Recipes[] getListed() { public Recipe[] getListed() {
return listed; return listed;
} }
public Recipes[] getTagged() { public Recipe[] getTagged() {
return tagged; return tagged;
} }

View File

@ -21,6 +21,7 @@ import de.bixilon.minosoft.game.datatypes.entities.items.Items;
import de.bixilon.minosoft.game.datatypes.entities.meta.EntityMetaData; import de.bixilon.minosoft.game.datatypes.entities.meta.EntityMetaData;
import de.bixilon.minosoft.game.datatypes.inventory.Slot; import de.bixilon.minosoft.game.datatypes.inventory.Slot;
import de.bixilon.minosoft.game.datatypes.particle.*; import de.bixilon.minosoft.game.datatypes.particle.*;
import de.bixilon.minosoft.game.datatypes.recipes.Ingredient;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition; import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import de.bixilon.minosoft.nbt.tag.CompoundTag; import de.bixilon.minosoft.nbt.tag.CompoundTag;
import de.bixilon.minosoft.util.BitByte; import de.bixilon.minosoft.util.BitByte;
@ -403,4 +404,24 @@ public class InByteBuffer {
} }
return ret; return ret;
} }
public Ingredient readIngredient() {
return new Ingredient(readSlotArray(readVarInt()));
}
public Ingredient[] readIngredientArray(int length) {
Ingredient[] ret = new Ingredient[length];
for (int i = 0; i < length; i++) {
ret[i] = readIngredient();
}
return ret;
}
public Slot[] readSlotArray(int length) {
Slot[] res = new Slot[length];
for (int i = 0; i < length; i++) {
res[i] = readSlot();
}
return res;
}
} }

View File

@ -590,4 +590,7 @@ public class PacketHandler {
public void handle(PacketTags pkg) { public void handle(PacketTags pkg) {
//ToDo //ToDo
} }
public void handle(PacketDeclareRecipes pkg) {
}
} }

View File

@ -148,6 +148,7 @@ public abstract class Protocol implements ProtocolInterface {
packetClassMapping.put(Packets.Clientbound.PLAY_NBT_QUERY_RESPONSE, PacketNBTQueryResponse.class); packetClassMapping.put(Packets.Clientbound.PLAY_NBT_QUERY_RESPONSE, PacketNBTQueryResponse.class);
packetClassMapping.put(Packets.Clientbound.PLAY_FACE_PLAYER, PacketFacePlayer.class); packetClassMapping.put(Packets.Clientbound.PLAY_FACE_PLAYER, PacketFacePlayer.class);
packetClassMapping.put(Packets.Clientbound.PLAY_TAGS, PacketTags.class); packetClassMapping.put(Packets.Clientbound.PLAY_TAGS, PacketTags.class);
packetClassMapping.put(Packets.Clientbound.PLAY_DECLARE_RECIPES, PacketDeclareRecipes.class);
} }
public static ProtocolVersion getLowestVersionSupported() { public static ProtocolVersion getLowestVersionSupported() {