mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 10:55:01 -04:00
text component: remove connection dependency, fix reconnecting possible after failing loading of version mapping
This commit is contained in:
parent
5d75930264
commit
f5e1d94284
@ -24,7 +24,7 @@ class ComponentParser : CommandParser() {
|
|||||||
@Throws(CommandParseException::class)
|
@Throws(CommandParseException::class)
|
||||||
override fun parse(connection: Connection, properties: ParserProperties?, stringReader: CommandStringReader): Any? {
|
override fun parse(connection: Connection, properties: ParserProperties?, stringReader: CommandStringReader): Any? {
|
||||||
try {
|
try {
|
||||||
return BaseComponent(connection.version, stringReader.readJson().asJsonObject)
|
return BaseComponent(connection.version.localeManager, stringReader.readJson().asJsonObject)
|
||||||
} catch (exception: Exception) {
|
} catch (exception: Exception) {
|
||||||
stringReader.skip(-1)
|
stringReader.skip(-1)
|
||||||
throw InvalidComponentCommandParseException(stringReader, stringReader.read().toString(), exception)
|
throw InvalidComponentCommandParseException(stringReader, stringReader.read().toString(), exception)
|
||||||
|
@ -81,11 +81,11 @@ public class Slot {
|
|||||||
if (nbt.containsKey("display")) {
|
if (nbt.containsKey("display")) {
|
||||||
CompoundTag display = nbt.getCompoundTag("display");
|
CompoundTag display = nbt.getCompoundTag("display");
|
||||||
if (display.containsKey("Name")) {
|
if (display.containsKey("Name")) {
|
||||||
this.customDisplayName = ChatComponent.valueOf(this.version, display.getStringTag("Name").getValue());
|
this.customDisplayName = ChatComponent.valueOf(this.version.getLocaleManager(), display.getStringTag("Name").getValue());
|
||||||
}
|
}
|
||||||
if (display.containsKey("Lore")) {
|
if (display.containsKey("Lore")) {
|
||||||
for (StringTag lore : display.getListTag("Lore").<StringTag>getValue()) {
|
for (StringTag lore : display.getListTag("Lore").<StringTag>getValue()) {
|
||||||
this.lore.add(ChatComponent.valueOf(this.version, lore.getValue()));
|
this.lore.add(ChatComponent.valueOf(this.version.getLocaleManager(), lore.getValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,239 +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.versions;
|
|
||||||
|
|
||||||
import com.google.common.collect.HashBiMap;
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import de.bixilon.minosoft.Minosoft;
|
|
||||||
import de.bixilon.minosoft.config.ConfigurationPaths;
|
|
||||||
import de.bixilon.minosoft.data.Mappings;
|
|
||||||
import de.bixilon.minosoft.data.assets.AssetsManager;
|
|
||||||
import de.bixilon.minosoft.data.assets.Resources;
|
|
||||||
import de.bixilon.minosoft.data.locale.minecraft.MinecraftLocaleManager;
|
|
||||||
import de.bixilon.minosoft.protocol.protocol.ConnectionStates;
|
|
||||||
import de.bixilon.minosoft.protocol.protocol.Packets;
|
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
|
|
||||||
import de.bixilon.minosoft.util.CountUpAndDownLatch;
|
|
||||||
import de.bixilon.minosoft.util.Util;
|
|
||||||
import de.bixilon.minosoft.util.logging.Log;
|
|
||||||
import de.bixilon.minosoft.util.logging.LogLevels;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
public class Version {
|
|
||||||
private final int versionId;
|
|
||||||
private final int protocolId;
|
|
||||||
private final HashMap<ConnectionStates, HashBiMap<Packets.Serverbound, Integer>> serverboundPacketMapping;
|
|
||||||
private final HashMap<ConnectionStates, HashBiMap<Packets.Clientbound, Integer>> clientboundPacketMapping;
|
|
||||||
String versionName;
|
|
||||||
VersionMapping mapping;
|
|
||||||
boolean isGettingLoaded;
|
|
||||||
private AssetsManager assetsManager;
|
|
||||||
private MinecraftLocaleManager localeManager;
|
|
||||||
|
|
||||||
public Version(String versionName, int versionId, int protocolId, HashMap<ConnectionStates, HashBiMap<Packets.Serverbound, Integer>> serverboundPacketMapping, HashMap<ConnectionStates, HashBiMap<Packets.Clientbound, Integer>> clientboundPacketMapping) {
|
|
||||||
this.versionName = versionName;
|
|
||||||
this.versionId = versionId;
|
|
||||||
this.protocolId = protocolId;
|
|
||||||
this.serverboundPacketMapping = serverboundPacketMapping;
|
|
||||||
this.clientboundPacketMapping = clientboundPacketMapping;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Packets.Clientbound getPacketByCommand(ConnectionStates state, int command) {
|
|
||||||
if (this.clientboundPacketMapping.containsKey(state) && this.clientboundPacketMapping.get(state).containsValue(command)) {
|
|
||||||
return this.clientboundPacketMapping.get(state).inverse().get(command);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getCommandByPacket(Packets.Serverbound packet) {
|
|
||||||
if (this.serverboundPacketMapping.containsKey(packet.getState()) && this.serverboundPacketMapping.get(packet.getState()).containsKey(packet)) {
|
|
||||||
return this.serverboundPacketMapping.get(packet.getState()).get(packet);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<ConnectionStates, HashBiMap<Packets.Clientbound, Integer>> getClientboundPacketMapping() {
|
|
||||||
return this.clientboundPacketMapping;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<ConnectionStates, HashBiMap<Packets.Serverbound, Integer>> getServerboundPacketMapping() {
|
|
||||||
return this.serverboundPacketMapping;
|
|
||||||
}
|
|
||||||
|
|
||||||
public VersionMapping getMapping() {
|
|
||||||
return this.mapping;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMapping(VersionMapping mapping) {
|
|
||||||
this.mapping = mapping;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isGettingLoaded() {
|
|
||||||
return this.isGettingLoaded;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGettingLoaded(boolean gettingLoaded) {
|
|
||||||
this.isGettingLoaded = gettingLoaded;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isFlattened() {
|
|
||||||
return this.versionId >= ProtocolDefinition.FLATTING_VERSION_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getVersionName() {
|
|
||||||
return this.versionName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVersionName(String versionName) {
|
|
||||||
this.versionName = versionName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getVersionId() {
|
|
||||||
return this.versionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return getVersionId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (super.equals(obj)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (obj == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (hashCode() != obj.hashCode()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return getVersionName().equals(this.versionName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return getVersionName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getProtocolId() {
|
|
||||||
return this.protocolId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isLoaded() {
|
|
||||||
return getMapping() != null && getMapping().isFullyLoaded();
|
|
||||||
}
|
|
||||||
|
|
||||||
public AssetsManager getAssetsManager() {
|
|
||||||
return this.assetsManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAssetsManager(AssetsManager assetsManager) {
|
|
||||||
this.assetsManager = assetsManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MinecraftLocaleManager getLocaleManager() {
|
|
||||||
return this.localeManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initializeAssetManger(CountUpAndDownLatch latch) throws Exception {
|
|
||||||
if (this.assetsManager != null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!isFlattened() && getVersionId() != ProtocolDefinition.PRE_FLATTENING_VERSION_ID) {
|
|
||||||
this.assetsManager = Versions.PRE_FLATTENING_VERSION.getAssetsManager();
|
|
||||||
this.localeManager = Versions.PRE_FLATTENING_VERSION.getLocaleManager();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.assetsManager = new AssetsManager(Minosoft.getConfig().getBoolean(ConfigurationPaths.BooleanPaths.DEBUG_VERIFY_ASSETS), Resources.getAssetVersionByVersion(this));
|
|
||||||
this.assetsManager.downloadAllAssets(latch);
|
|
||||||
this.localeManager = new MinecraftLocaleManager(this);
|
|
||||||
this.localeManager.load(this, Minosoft.getConfig().getString(ConfigurationPaths.StringPaths.GENERAL_LANGUAGE));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void load(CountUpAndDownLatch latch) throws Exception {
|
|
||||||
if (isLoaded()) {
|
|
||||||
// already loaded
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!isFlattened() && this != Versions.PRE_FLATTENING_VERSION && !Versions.PRE_FLATTENING_VERSION.isLoaded()) {
|
|
||||||
// no matter what, we need the version mapping for all pre flattening versions
|
|
||||||
Versions.PRE_FLATTENING_VERSION.load(latch);
|
|
||||||
}
|
|
||||||
if (isGettingLoaded()) {
|
|
||||||
// async: we don't wanna load this version twice, skip
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
latch.countUp();
|
|
||||||
this.isGettingLoaded = true;
|
|
||||||
initializeAssetManger(latch);
|
|
||||||
Log.verbose(String.format("Loading mappings for version %s...", this));
|
|
||||||
long startTime = System.currentTimeMillis();
|
|
||||||
|
|
||||||
if (this.mapping == null) {
|
|
||||||
this.mapping = new VersionMapping(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getVersionId() == ProtocolDefinition.PRE_FLATTENING_VERSION_ID && Versions.PRE_FLATTENING_MAPPING == null) {
|
|
||||||
Versions.PRE_FLATTENING_MAPPING = this.mapping;
|
|
||||||
} else {
|
|
||||||
this.mapping.setParentMapping(Versions.PRE_FLATTENING_MAPPING);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HashMap<String, JsonObject> files;
|
|
||||||
try {
|
|
||||||
files = Util.readJsonTarStream(AssetsManager.readAssetAsStreamByHash(Resources.getAssetVersionByVersion(this).getMinosoftMappings()));
|
|
||||||
} catch (Exception e) {
|
|
||||||
// should not happen, but if this version is not flattened, we can fallback to the flatten mappings. Some things might not work...
|
|
||||||
Log.printException(e, LogLevels.VERBOSE);
|
|
||||||
if (isFlattened() || getVersionId() == ProtocolDefinition.FLATTING_VERSION_ID) {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
files = new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
latch.addCount(Mappings.VALUES.length);
|
|
||||||
for (Mappings mapping : Mappings.VALUES) {
|
|
||||||
JsonObject data = null;
|
|
||||||
if (files.containsKey(mapping.getFilename() + ".json")) {
|
|
||||||
data = files.get(mapping.getFilename() + ".json");
|
|
||||||
}
|
|
||||||
if (data == null) {
|
|
||||||
loadVersionMappings(mapping, ProtocolDefinition.DEFAULT_MOD, null);
|
|
||||||
latch.countDown();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (String mod : data.keySet()) {
|
|
||||||
loadVersionMappings(mapping, mod, data.getAsJsonObject(mod));
|
|
||||||
}
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
if (!files.isEmpty()) {
|
|
||||||
Log.verbose(String.format("Loaded mappings for version %s in %dms (%s)", this, (System.currentTimeMillis() - startTime), getVersionName()));
|
|
||||||
} else {
|
|
||||||
Log.verbose(String.format("Could not load mappings for version %s. Some features will be unavailable.", this));
|
|
||||||
}
|
|
||||||
this.isGettingLoaded = false;
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadVersionMappings(Mappings type, String mod, @Nullable JsonObject data) {
|
|
||||||
this.mapping.load(type, mod, data, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* 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.versions
|
||||||
|
|
||||||
|
import com.google.common.collect.HashBiMap
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
import de.bixilon.minosoft.Minosoft
|
||||||
|
import de.bixilon.minosoft.config.ConfigurationPaths
|
||||||
|
import de.bixilon.minosoft.data.Mappings
|
||||||
|
import de.bixilon.minosoft.data.assets.AssetsManager
|
||||||
|
import de.bixilon.minosoft.data.assets.Resources
|
||||||
|
import de.bixilon.minosoft.data.locale.minecraft.MinecraftLocaleManager
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.ConnectionStates
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.Packets.Clientbound
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.Packets.Serverbound
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
|
import de.bixilon.minosoft.util.CountUpAndDownLatch
|
||||||
|
import de.bixilon.minosoft.util.Util
|
||||||
|
import de.bixilon.minosoft.util.logging.Log
|
||||||
|
import de.bixilon.minosoft.util.logging.LogLevels
|
||||||
|
|
||||||
|
data class Version(
|
||||||
|
var versionName: String,
|
||||||
|
val versionId: Int,
|
||||||
|
val protocolId: Int,
|
||||||
|
val serverboundPacketMapping: Map<ConnectionStates, HashBiMap<Serverbound, Int>>,
|
||||||
|
val clientboundPacketMapping: Map<ConnectionStates, HashBiMap<Clientbound, Int>>,
|
||||||
|
) {
|
||||||
|
var isLoaded = false
|
||||||
|
var isGettingLoaded = false
|
||||||
|
val mapping: VersionMapping = VersionMapping(this)
|
||||||
|
lateinit var assetsManager: AssetsManager
|
||||||
|
lateinit var localeManager: MinecraftLocaleManager
|
||||||
|
|
||||||
|
fun getPacketByCommand(state: ConnectionStates, command: Int): Clientbound? {
|
||||||
|
return clientboundPacketMapping[state]?.inverse()?.get(command)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCommandByPacket(packet: Serverbound): Int? {
|
||||||
|
return serverboundPacketMapping[packet.state]?.get(packet)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isFlattened(): Boolean {
|
||||||
|
return versionId >= ProtocolDefinition.FLATTING_VERSION_ID
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun initializeAssetManger(latch: CountUpAndDownLatch) {
|
||||||
|
if (this::assetsManager.isInitialized) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!isFlattened() && versionId != ProtocolDefinition.PRE_FLATTENING_VERSION_ID) {
|
||||||
|
assetsManager = Versions.PRE_FLATTENING_VERSION.assetsManager
|
||||||
|
localeManager = Versions.PRE_FLATTENING_VERSION.localeManager
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assetsManager = AssetsManager(Minosoft.getConfig().getBoolean(ConfigurationPaths.BooleanPaths.DEBUG_VERIFY_ASSETS), Resources.getAssetVersionByVersion(this))
|
||||||
|
assetsManager.downloadAllAssets(latch)
|
||||||
|
localeManager = MinecraftLocaleManager(this)
|
||||||
|
localeManager.load(this, Minosoft.getConfig().getString(ConfigurationPaths.StringPaths.GENERAL_LANGUAGE))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun load(latch: CountUpAndDownLatch) {
|
||||||
|
if (isLoaded || isGettingLoaded) {
|
||||||
|
// already loaded or is getting loaded
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isFlattened() && this !== Versions.PRE_FLATTENING_VERSION && !Versions.PRE_FLATTENING_VERSION.isLoaded) {
|
||||||
|
// no matter what, we need the version mapping for all pre flattening versions
|
||||||
|
try {
|
||||||
|
Versions.PRE_FLATTENING_VERSION.load(latch)
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
Versions.PRE_FLATTENING_VERSION.unload()
|
||||||
|
Versions.PRE_FLATTENING_MAPPING = null
|
||||||
|
throw exception
|
||||||
|
}
|
||||||
|
}
|
||||||
|
latch.countUp()
|
||||||
|
isGettingLoaded = true
|
||||||
|
Log.verbose(String.format("Loading mappings for version %s...", this))
|
||||||
|
initializeAssetManger(latch)
|
||||||
|
val startTime = System.currentTimeMillis()
|
||||||
|
|
||||||
|
|
||||||
|
if (versionId == ProtocolDefinition.PRE_FLATTENING_VERSION_ID) {
|
||||||
|
Versions.PRE_FLATTENING_MAPPING = mapping
|
||||||
|
} else {
|
||||||
|
mapping.parentMapping = Versions.PRE_FLATTENING_MAPPING
|
||||||
|
}
|
||||||
|
val files: Map<String, JsonObject> = try {
|
||||||
|
Util.readJsonTarStream(AssetsManager.readAssetAsStreamByHash(Resources.getAssetVersionByVersion(this).minosoftMappings))
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// should not happen, but if this version is not flattened, we can fallback to the flatten mappings. Some things might not work...
|
||||||
|
Log.printException(e, LogLevels.VERBOSE)
|
||||||
|
if (isFlattened()) {
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
if (versionId == ProtocolDefinition.PRE_FLATTENING_VERSION_ID) {
|
||||||
|
Versions.PRE_FLATTENING_MAPPING = null
|
||||||
|
}
|
||||||
|
mapOf()
|
||||||
|
}
|
||||||
|
latch.addCount(Mappings.VALUES.size)
|
||||||
|
for (mapping in Mappings.VALUES) {
|
||||||
|
var data: JsonObject? = null
|
||||||
|
files[mapping.filename + ".json"]?.let {
|
||||||
|
data = it
|
||||||
|
}
|
||||||
|
if (data == null) {
|
||||||
|
loadVersionMappings(mapping, ProtocolDefinition.DEFAULT_MOD, null)
|
||||||
|
latch.countDown()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for ((mod, json) in data!!.entrySet()) {
|
||||||
|
check(json is JsonObject) { "Invalid mod json" }
|
||||||
|
loadVersionMappings(mapping, mod, json)
|
||||||
|
}
|
||||||
|
latch.countDown()
|
||||||
|
}
|
||||||
|
if (files.isNotEmpty()) {
|
||||||
|
Log.verbose(String.format("Loaded mappings for version %s in %dms (%s)", this, (System.currentTimeMillis() - startTime), versionName))
|
||||||
|
} else {
|
||||||
|
Log.verbose(String.format("Could not load mappings for version %s. Some features will be unavailable.", this))
|
||||||
|
}
|
||||||
|
isGettingLoaded = false
|
||||||
|
latch.countDown()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun loadVersionMappings(type: Mappings, mod: String, data: JsonObject?) {
|
||||||
|
mapping.load(type, mod, data, this)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun unload() {
|
||||||
|
mapping.unload()
|
||||||
|
if (mapping.parentMapping == mapping) {
|
||||||
|
mapping.parentMapping = null
|
||||||
|
}
|
||||||
|
isLoaded = false
|
||||||
|
isGettingLoaded = false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return versionId
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (super.equals(other)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (other == null) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return if (hashCode() != other.hashCode()) {
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
versionName == versionName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return versionName
|
||||||
|
}
|
||||||
|
}
|
@ -34,7 +34,7 @@ import javafx.util.Pair
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
class VersionMapping(var version: Version) {
|
class VersionMapping(var version: Version?) {
|
||||||
private val availableFeatures = HashSet<Mappings>()
|
private val availableFeatures = HashSet<Mappings>()
|
||||||
|
|
||||||
private val motiveIdMap = HashBiMap.create<Int, Motive>(30)
|
private val motiveIdMap = HashBiMap.create<Int, Motive>(30)
|
||||||
@ -79,7 +79,7 @@ class VersionMapping(var version: Version) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getItem(itemId: Int): Item? {
|
fun getItem(itemId: Int): Item? {
|
||||||
return if (!version.isFlattened) {
|
return if (version!!.isFlattened()) {
|
||||||
getItem(itemId ushr 16, itemId and 0xFFFF)
|
getItem(itemId ushr 16, itemId and 0xFFFF)
|
||||||
} else {
|
} else {
|
||||||
getItemByIdIgnoreFlattened(itemId)
|
getItemByIdIgnoreFlattened(itemId)
|
||||||
@ -325,15 +325,15 @@ class VersionMapping(var version: Version) {
|
|||||||
|
|
||||||
val block = loadBlockState(ModIdentifier(mod, identifierName!!), statesJson)
|
val block = loadBlockState(ModIdentifier(mod, identifierName!!), statesJson)
|
||||||
var blockId = getBlockId(block.identifier)
|
var blockId = getBlockId(block.identifier)
|
||||||
if (this.version.isFlattened) {
|
if (this.version!!.isFlattened()) {
|
||||||
// map block id
|
// map block id
|
||||||
blockId!!.blocks.add(block)
|
blockId!!.blocks.add(block)
|
||||||
}
|
}
|
||||||
val blockNumericId = getBlockId(statesJson, !version.isFlattened)
|
val blockNumericId = getBlockId(statesJson, version.isFlattened())
|
||||||
if (StaticConfiguration.DEBUG_MODE) {
|
if (StaticConfiguration.DEBUG_MODE) {
|
||||||
checkIfBlockIsIsPresent(blockNumericId, block.identifier, blockIdMap)
|
checkIfBlockIsIsPresent(blockNumericId, block.identifier, blockIdMap)
|
||||||
}
|
}
|
||||||
if (!version.isFlattened) {
|
if (!version.isFlattened()) {
|
||||||
// map block id
|
// map block id
|
||||||
if (blockId == null) {
|
if (blockId == null) {
|
||||||
blockId = BlockId(block.identifier)
|
blockId = BlockId(block.identifier)
|
||||||
|
@ -21,9 +21,10 @@ import de.bixilon.minosoft.protocol.protocol.Packets;
|
|||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class Versions {
|
public class Versions {
|
||||||
public static final Version LOWEST_VERSION_SUPPORTED = new Version("Automatic", -1, -1, null, null);
|
public static final Version LOWEST_VERSION_SUPPORTED = new Version("Automatic", -1, -1, Map.of(), Map.of());
|
||||||
private static final HashBiMap<Integer, Version> VERSION_ID_MAP = HashBiMap.create(500);
|
private static final HashBiMap<Integer, Version> VERSION_ID_MAP = HashBiMap.create(500);
|
||||||
private static final HashBiMap<Integer, Version> VERSION_PROTOCOL_ID_MAP = HashBiMap.create(500);
|
private static final HashBiMap<Integer, Version> VERSION_PROTOCOL_ID_MAP = HashBiMap.create(500);
|
||||||
private static final HashBiMap<String, Version> VERSION_NAME_MAP = HashBiMap.create(500);
|
private static final HashBiMap<String, Version> VERSION_NAME_MAP = HashBiMap.create(500);
|
||||||
@ -57,8 +58,8 @@ public class Versions {
|
|||||||
return VERSION_ID_MAP.get(versionId);
|
return VERSION_ID_MAP.get(versionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
HashMap<ConnectionStates, HashBiMap<Packets.Serverbound, Integer>> serverboundPacketMapping;
|
Map<ConnectionStates, HashBiMap<Packets.Serverbound, Integer>> serverboundPacketMapping;
|
||||||
HashMap<ConnectionStates, HashBiMap<Packets.Clientbound, Integer>> clientboundPacketMapping;
|
Map<ConnectionStates, HashBiMap<Packets.Clientbound, Integer>> clientboundPacketMapping;
|
||||||
if (versionJson.get("mapping").isJsonPrimitive()) {
|
if (versionJson.get("mapping").isJsonPrimitive()) {
|
||||||
// inherits or copies mapping from an other version
|
// inherits or copies mapping from an other version
|
||||||
Version parent = VERSION_ID_MAP.get(versionJson.get("mapping").getAsInt());
|
Version parent = VERSION_ID_MAP.get(versionJson.get("mapping").getAsInt());
|
||||||
|
@ -17,7 +17,7 @@ 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.versions.Version;
|
import de.bixilon.minosoft.data.locale.minecraft.MinecraftLocaleManager;
|
||||||
import de.bixilon.minosoft.gui.rendering.font.Font;
|
import de.bixilon.minosoft.gui.rendering.font.Font;
|
||||||
import de.bixilon.minosoft.gui.rendering.font.FontBindings;
|
import de.bixilon.minosoft.gui.rendering.font.FontBindings;
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.HUDScale;
|
import de.bixilon.minosoft.gui.rendering.hud.HUDScale;
|
||||||
@ -42,11 +42,11 @@ public class BaseComponent extends ChatComponent {
|
|||||||
public BaseComponent() {
|
public BaseComponent() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseComponent(Version version, String text) {
|
public BaseComponent(MinecraftLocaleManager localeManager, String text) {
|
||||||
this(version, null, text);
|
this(localeManager, null, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseComponent(Version version, @Nullable ChatComponent parent, String text) {
|
public BaseComponent(MinecraftLocaleManager localeManager, @Nullable ChatComponent parent, String text) {
|
||||||
// legacy String
|
// legacy String
|
||||||
StringBuilder currentText = new StringBuilder();
|
StringBuilder currentText = new StringBuilder();
|
||||||
RGBColor color = ChatColors.WHITE;
|
RGBColor color = ChatColors.WHITE;
|
||||||
@ -99,23 +99,23 @@ public class BaseComponent extends ChatComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseComponent(Version version, JsonObject json) {
|
public BaseComponent(MinecraftLocaleManager localeManager, JsonObject json) {
|
||||||
this(version, null, json);
|
this(localeManager, null, json);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public BaseComponent(Version version, @Nullable TextComponent parent, JsonElement data) {
|
public BaseComponent(MinecraftLocaleManager localeManager, @Nullable TextComponent parent, JsonElement data) {
|
||||||
MultiChatComponent thisTextComponent = null;
|
MultiChatComponent thisTextComponent = null;
|
||||||
if (data instanceof JsonObject json) {
|
if (data instanceof JsonObject json) {
|
||||||
if (json.has("text")) {
|
if (json.has("text")) {
|
||||||
String text = json.get("text").getAsString();
|
String text = json.get("text").getAsString();
|
||||||
if (text.contains(String.valueOf(ProtocolDefinition.TEXT_COMPONENT_SPECIAL_PREFIX_CHAR))) {
|
if (text.contains(String.valueOf(ProtocolDefinition.TEXT_COMPONENT_SPECIAL_PREFIX_CHAR))) {
|
||||||
// legacy text component
|
// legacy text component
|
||||||
this.parts.add(new BaseComponent(version, text));
|
this.parts.add(new BaseComponent(localeManager, text));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RGBColor color;
|
RGBColor color;
|
||||||
if (parent != null && parent.getColor() != null) {
|
if (parent != null) {
|
||||||
color = parent.getColor();
|
color = parent.getColor();
|
||||||
} else {
|
} else {
|
||||||
color = null;
|
color = null;
|
||||||
@ -167,14 +167,14 @@ public class BaseComponent extends ChatComponent {
|
|||||||
final TextComponent parentParameter = thisTextComponent == null ? parent : thisTextComponent;
|
final TextComponent parentParameter = thisTextComponent == null ? parent : thisTextComponent;
|
||||||
if (json.has("extra")) {
|
if (json.has("extra")) {
|
||||||
JsonArray extras = json.getAsJsonArray("extra");
|
JsonArray extras = json.getAsJsonArray("extra");
|
||||||
extras.forEach((extra -> this.parts.add(new BaseComponent(version, parentParameter, extra))));
|
extras.forEach((extra -> this.parts.add(new BaseComponent(localeManager, parentParameter, extra))));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (json.has("translate")) {
|
if (json.has("translate")) {
|
||||||
this.parts.add(new BaseComponent(version, version.getLocaleManager().translate(json.get("translate").getAsString(), json.getAsJsonArray("with"))));
|
this.parts.add(new BaseComponent(localeManager, localeManager.translate(json.get("translate").getAsString(), json.getAsJsonArray("with"))));
|
||||||
}
|
}
|
||||||
} else if (data instanceof JsonPrimitive primitive) {
|
} else if (data instanceof JsonPrimitive primitive) {
|
||||||
this.parts.add(new BaseComponent(version, parent, primitive.getAsString()));
|
this.parts.add(new BaseComponent(localeManager, parent, primitive.getAsString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,8 +237,8 @@ public class BaseComponent extends ChatComponent {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseComponent append(Version version, String message) {
|
public BaseComponent append(MinecraftLocaleManager localeManager, String message) {
|
||||||
this.parts.add(new BaseComponent(version, message));
|
this.parts.add(new BaseComponent(localeManager, message));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ import com.google.gson.JsonObject;
|
|||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import de.bixilon.minosoft.data.mappings.versions.Version;
|
import de.bixilon.minosoft.data.locale.minecraft.MinecraftLocaleManager;
|
||||||
import de.bixilon.minosoft.gui.rendering.font.Font;
|
import de.bixilon.minosoft.gui.rendering.font.Font;
|
||||||
import de.bixilon.minosoft.gui.rendering.font.FontBindings;
|
import de.bixilon.minosoft.gui.rendering.font.FontBindings;
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.HUDScale;
|
import de.bixilon.minosoft.gui.rendering.hud.HUDScale;
|
||||||
@ -35,11 +35,11 @@ public abstract class ChatComponent {
|
|||||||
return valueOf(null, null, raw);
|
return valueOf(null, null, raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ChatComponent valueOf(Version version, Object raw) {
|
public static ChatComponent valueOf(MinecraftLocaleManager localeManager, Object raw) {
|
||||||
return valueOf(version, null, raw);
|
return valueOf(localeManager, null, raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ChatComponent valueOf(Version version, @Nullable TextComponent parent, Object raw) {
|
public static ChatComponent valueOf(MinecraftLocaleManager localeManager, @Nullable TextComponent parent, Object raw) {
|
||||||
if (raw == null) {
|
if (raw == null) {
|
||||||
return new BaseComponent();
|
return new BaseComponent();
|
||||||
}
|
}
|
||||||
@ -57,13 +57,13 @@ public abstract class ChatComponent {
|
|||||||
try {
|
try {
|
||||||
json = JsonParser.parseString((String) raw).getAsJsonObject();
|
json = JsonParser.parseString((String) raw).getAsJsonObject();
|
||||||
} catch (JsonParseException | IllegalStateException ignored) {
|
} catch (JsonParseException | IllegalStateException ignored) {
|
||||||
return new BaseComponent(version, (String) raw);
|
return new BaseComponent(localeManager, (String) raw);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return new BaseComponent(version, parent, raw.toString());
|
return new BaseComponent(localeManager, parent, raw.toString());
|
||||||
// throw new IllegalArgumentException(String.format("%s is not a valid type here!", raw.getClass().getSimpleName()));
|
// throw new IllegalArgumentException(String.format("%s is not a valid type here!", raw.getClass().getSimpleName()));
|
||||||
}
|
}
|
||||||
return new BaseComponent(version, parent, json);
|
return new BaseComponent(localeManager, parent, json);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.gui.main;
|
package de.bixilon.minosoft.gui.main;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import de.bixilon.minosoft.Minosoft;
|
import de.bixilon.minosoft.Minosoft;
|
||||||
import de.bixilon.minosoft.data.mappings.versions.Version;
|
import de.bixilon.minosoft.data.mappings.versions.Version;
|
||||||
@ -24,13 +25,13 @@ import de.bixilon.minosoft.protocol.protocol.LANServerListener;
|
|||||||
import de.bixilon.minosoft.util.ServerAddress;
|
import de.bixilon.minosoft.util.ServerAddress;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class Server {
|
public class Server {
|
||||||
private static int highestServerId;
|
private static int highestServerId;
|
||||||
private final int id;
|
private final int id;
|
||||||
private final ArrayList<Connection> connections = new ArrayList<>();
|
private final Set<Connection> connections = Sets.newConcurrentHashSet();
|
||||||
private ChatComponent name;
|
private ChatComponent name;
|
||||||
private ChatComponent addressName;
|
private ChatComponent addressName;
|
||||||
private String address;
|
private String address;
|
||||||
@ -158,7 +159,7 @@ public class Server {
|
|||||||
this.desiredVersion = versionId;
|
this.desiredVersion = versionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<Connection> getConnections() {
|
public Set<Connection> getConnections() {
|
||||||
return this.connections;
|
return this.connections;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,8 +304,8 @@ public class ServerListCell extends ListCell<Server> implements Initializable {
|
|||||||
}
|
}
|
||||||
// ToDo: show progress dialog
|
// ToDo: show progress dialog
|
||||||
|
|
||||||
connection.connect(this.server.getLastPing().getAddress(), version, new CountUpAndDownLatch(1));
|
|
||||||
connection.registerEvent(new EventInvokerCallback<>(this::handleConnectionCallback));
|
connection.registerEvent(new EventInvokerCallback<>(this::handleConnectionCallback));
|
||||||
|
connection.connect(this.server.getLastPing().getAddress(), version, new CountUpAndDownLatch(1));
|
||||||
}, "ConnectThread").start();
|
}, "ConnectThread").start();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -346,7 +346,7 @@ public class ServerListCell extends ListCell<Server> implements Initializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.optionsConnect.setDisable(false);
|
this.optionsConnect.setDisable(false);
|
||||||
this.optionsSessions.setDisable(false);
|
this.optionsSessions.setDisable(true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,6 +147,11 @@ public class Connection {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.printException(e, LogLevels.DEBUG);
|
Log.printException(e, LogLevels.DEBUG);
|
||||||
Log.fatal(String.format("Could not load version %s. This version seems to be unsupported!", version));
|
Log.fatal(String.format("Could not load version %s. This version seems to be unsupported!", version));
|
||||||
|
if (this.customMapping.getVersion() != null) {
|
||||||
|
this.customMapping.getVersion().getMapping().setParentMapping(null);
|
||||||
|
}
|
||||||
|
this.customMapping.setVersion(null);
|
||||||
|
version.unload();
|
||||||
this.lastException = new MappingsLoadingException("Mappings could not be loaded", e);
|
this.lastException = new MappingsLoadingException("Mappings could not be loaded", e);
|
||||||
setConnectionState(ConnectionStates.FAILED_NO_RETRY);
|
setConnectionState(ConnectionStates.FAILED_NO_RETRY);
|
||||||
}
|
}
|
||||||
@ -178,7 +183,9 @@ public class Connection {
|
|||||||
|
|
||||||
public void disconnect() {
|
public void disconnect() {
|
||||||
this.network.disconnect();
|
this.network.disconnect();
|
||||||
this.handleThread.interrupt();
|
if (this.handleThread != null) {
|
||||||
|
this.handleThread.interrupt();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Player getPlayer() {
|
public Player getPlayer() {
|
||||||
|
@ -30,7 +30,7 @@ public class PacketStatusResponse extends ClientboundPacket {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean read(InByteBuffer buffer) {
|
public boolean read(InByteBuffer buffer) {
|
||||||
this.response = new ServerListPing(buffer.getConnection().getVersion(), buffer.readJSON());
|
this.response = new ServerListPing(null, buffer.readJSON());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
package de.bixilon.minosoft.protocol.ping;
|
package de.bixilon.minosoft.protocol.ping;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import de.bixilon.minosoft.data.mappings.versions.Version;
|
import de.bixilon.minosoft.data.locale.minecraft.MinecraftLocaleManager;
|
||||||
import de.bixilon.minosoft.data.text.BaseComponent;
|
import de.bixilon.minosoft.data.text.BaseComponent;
|
||||||
import de.bixilon.minosoft.data.text.ChatComponent;
|
import de.bixilon.minosoft.data.text.ChatComponent;
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
|
||||||
@ -31,7 +31,7 @@ public class ServerListPing {
|
|||||||
private final String serverBrand;
|
private final String serverBrand;
|
||||||
byte[] favicon;
|
byte[] favicon;
|
||||||
|
|
||||||
public ServerListPing(Version version, JsonObject json) {
|
public ServerListPing(MinecraftLocaleManager localeManager, JsonObject json) {
|
||||||
int protocolId = json.getAsJsonObject("version").get("protocol").getAsInt();
|
int protocolId = json.getAsJsonObject("version").get("protocol").getAsInt();
|
||||||
if (protocolId == ProtocolDefinition.QUERY_PROTOCOL_VERSION_ID) {
|
if (protocolId == ProtocolDefinition.QUERY_PROTOCOL_VERSION_ID) {
|
||||||
// Server did not send us a version, trying 1.8
|
// Server did not send us a version, trying 1.8
|
||||||
@ -49,7 +49,7 @@ public class ServerListPing {
|
|||||||
if (json.get("description").isJsonPrimitive()) {
|
if (json.get("description").isJsonPrimitive()) {
|
||||||
this.motd = ChatComponent.valueOf(json.get("description").getAsString());
|
this.motd = ChatComponent.valueOf(json.get("description").getAsString());
|
||||||
} else {
|
} else {
|
||||||
this.motd = new BaseComponent(version, json.getAsJsonObject("description"));
|
this.motd = new BaseComponent(localeManager, json.getAsJsonObject("description"));
|
||||||
}
|
}
|
||||||
this.serverBrand = json.getAsJsonObject("version").get("name").getAsString();
|
this.serverBrand = json.getAsJsonObject("version").get("name").getAsString();
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ public class InByteBuffer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ChatComponent readChatComponent() {
|
public ChatComponent readChatComponent() {
|
||||||
return ChatComponent.valueOf(this.connection.getVersion(), readString());
|
return ChatComponent.valueOf(this.connection.getVersion().getLocaleManager(), readString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@IntRange(from = 0)
|
@IntRange(from = 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user