Mirror von
https://github.com/ViaVersion/ViaBackwards.git
synchronisiert 2024-12-25 07:40:08 +01:00
Properly deal with custom chat type registries
Dieser Commit ist enthalten in:
Ursprung
f08223d1e9
Commit
6a700d228d
@ -311,14 +311,32 @@ public final class Protocol1_18_2To1_19 extends BackwardsProtocol<ClientboundPac
|
|||||||
private void handleChatType(final PacketWrapper wrapper, final JsonElement senderName, final JsonElement teamName, final JsonElement text) throws Exception {
|
private void handleChatType(final PacketWrapper wrapper, final JsonElement senderName, final JsonElement teamName, final JsonElement text) throws Exception {
|
||||||
translatableRewriter.processText(text);
|
translatableRewriter.processText(text);
|
||||||
|
|
||||||
final byte type = wrapper.get(Type.BYTE, 0);
|
byte chatTypeId = wrapper.get(Type.BYTE, 0);
|
||||||
if (type > 2) {
|
final DimensionRegistryStorage dimensionRegistryStorage = wrapper.user().get(DimensionRegistryStorage.class);
|
||||||
wrapper.set(Type.BYTE, 0, (byte) 0); // Chat type
|
final String chatTypeKey = dimensionRegistryStorage.chatTypeKey(chatTypeId);
|
||||||
|
switch (chatTypeKey) {
|
||||||
|
default:
|
||||||
|
case "minecraft:chat":
|
||||||
|
chatTypeId = 0;
|
||||||
|
break;
|
||||||
|
case "minecraft:system":
|
||||||
|
chatTypeId = 1;
|
||||||
|
break;
|
||||||
|
case "minecraft:game_info":
|
||||||
|
chatTypeId = 2;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String key = CHAT_KEYS[type];
|
final String key = CHAT_KEYS[chatTypeId];
|
||||||
if (key != null) {
|
if (key != null) {
|
||||||
Component component = Component.text(ViaBackwards.getConfig().chatTypeFormat(key));
|
final String chatFormat = ViaBackwards.getConfig().chatTypeFormat(key);
|
||||||
|
if (chatFormat == null) {
|
||||||
|
wrapper.cancel();
|
||||||
|
ViaBackwards.getPlatform().getLogger().severe("Chat type format " + key + " is not defined under chat-types in the ViaBackwards config.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Component component = Component.text(chatFormat);
|
||||||
if (key.equals("chat.type.team.text")) {
|
if (key.equals("chat.type.team.text")) {
|
||||||
Preconditions.checkNotNull(teamName, "Team name is null");
|
Preconditions.checkNotNull(teamName, "Team name is null");
|
||||||
component = component.replaceText(replace(teamName));
|
component = component.replaceText(replace(teamName));
|
||||||
|
@ -35,14 +35,12 @@ import com.viaversion.viaversion.api.type.types.version.Types1_18;
|
|||||||
import com.viaversion.viaversion.api.type.types.version.Types1_19;
|
import com.viaversion.viaversion.api.type.types.version.Types1_19;
|
||||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
|
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
|
||||||
|
import com.viaversion.viaversion.libs.opennbt.tag.builtin.NumberTag;
|
||||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag;
|
import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag;
|
||||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
|
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
|
||||||
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18;
|
import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18;
|
||||||
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
|
import com.viaversion.viaversion.protocols.protocol1_19to1_18_2.ClientboundPackets1_19;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public final class EntityPackets1_19 extends EntityRewriter<Protocol1_18_2To1_19> {
|
public final class EntityPackets1_19 extends EntityRewriter<Protocol1_18_2To1_19> {
|
||||||
|
|
||||||
public EntityPackets1_19(final Protocol1_18_2To1_19 protocol) {
|
public EntityPackets1_19(final Protocol1_18_2To1_19 protocol) {
|
||||||
@ -127,27 +125,45 @@ public final class EntityPackets1_19 extends EntityRewriter<Protocol1_18_2To1_19
|
|||||||
map(Type.STRING_ARRAY); // Worlds
|
map(Type.STRING_ARRAY); // Worlds
|
||||||
map(Type.NBT); // Dimension registry
|
map(Type.NBT); // Dimension registry
|
||||||
handler(wrapper -> {
|
handler(wrapper -> {
|
||||||
|
final DimensionRegistryStorage dimensionRegistryStorage = wrapper.user().get(DimensionRegistryStorage.class);
|
||||||
|
|
||||||
|
// Cache dimensions and find current dimension
|
||||||
final String dimensionKey = wrapper.read(Type.STRING);
|
final String dimensionKey = wrapper.read(Type.STRING);
|
||||||
final ListTag dimensions = ((CompoundTag) wrapper.get(Type.NBT, 0).get("minecraft:dimension_type")).get("value");
|
final CompoundTag registry = wrapper.get(Type.NBT, 0);
|
||||||
final Map<String, CompoundTag> dimensionsMap = new HashMap<>(dimensions.size());
|
final ListTag dimensions = ((CompoundTag) registry.get("minecraft:dimension_type")).get("value");
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (final Tag dimension : dimensions) {
|
for (final Tag dimension : dimensions) {
|
||||||
final CompoundTag dimensionCompound = (CompoundTag) dimension;
|
final CompoundTag dimensionCompound = (CompoundTag) dimension;
|
||||||
final StringTag nameTag = dimensionCompound.get("name");
|
final StringTag nameTag = dimensionCompound.get("name");
|
||||||
final CompoundTag dimensionData = dimensionCompound.get("element");
|
final CompoundTag dimensionData = dimensionCompound.get("element");
|
||||||
dimensionsMap.put(nameTag.getValue(), dimensionData.clone());
|
dimensionRegistryStorage.addDimension(nameTag.getValue(), dimensionData.clone());
|
||||||
|
|
||||||
if (!found && nameTag.getValue().equals(dimensionKey)) {
|
if (!found && nameTag.getValue().equals(dimensionKey)) {
|
||||||
wrapper.write(Type.NBT, dimensionData);
|
wrapper.write(Type.NBT, dimensionData);
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
throw new IllegalStateException("Could not find dimension " + dimensionKey + " in dimension registry");
|
throw new IllegalStateException("Could not find dimension " + dimensionKey + " in dimension registry");
|
||||||
}
|
}
|
||||||
|
|
||||||
wrapper.user().get(DimensionRegistryStorage.class).setDimensions(dimensionsMap);
|
// Add biome category and track biomes
|
||||||
|
final CompoundTag biomeRegistry = registry.get("minecraft:worldgen/biome");
|
||||||
|
final ListTag biomes = biomeRegistry.get("value");
|
||||||
|
for (final Tag biome : biomes.getValue()) {
|
||||||
|
final CompoundTag biomeCompound = ((CompoundTag) biome).get("element");
|
||||||
|
biomeCompound.put("category", new StringTag("none"));
|
||||||
|
}
|
||||||
|
tracker(wrapper.user()).setBiomesSent(biomes.size());
|
||||||
|
|
||||||
|
// Cache and remove chat types
|
||||||
|
final ListTag chatTypes = ((CompoundTag) registry.remove("minecraft:chat_type")).get("value");
|
||||||
|
for (final Tag chatType : chatTypes) {
|
||||||
|
final CompoundTag chatTypeCompound = (CompoundTag) chatType;
|
||||||
|
final NumberTag idTag = chatTypeCompound.get("id");
|
||||||
|
final StringTag nameTag = chatTypeCompound.get("name");
|
||||||
|
dimensionRegistryStorage.addChatType(idTag.asInt(), nameTag.getValue());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
map(Type.STRING); // World
|
map(Type.STRING); // World
|
||||||
map(Type.LONG); // Seed
|
map(Type.LONG); // Seed
|
||||||
@ -161,20 +177,6 @@ public final class EntityPackets1_19 extends EntityRewriter<Protocol1_18_2To1_19
|
|||||||
read(Type.OPTIONAL_GLOBAL_POSITION); // Read last death location
|
read(Type.OPTIONAL_GLOBAL_POSITION); // Read last death location
|
||||||
handler(worldDataTrackerHandler(1));
|
handler(worldDataTrackerHandler(1));
|
||||||
handler(playerTrackerHandler());
|
handler(playerTrackerHandler());
|
||||||
handler(wrapper -> {
|
|
||||||
final CompoundTag registry = wrapper.get(Type.NBT, 0);
|
|
||||||
final CompoundTag biomeRegistry = registry.get("minecraft:worldgen/biome");
|
|
||||||
final ListTag biomes = biomeRegistry.get("value");
|
|
||||||
for (final Tag biome : biomes.getValue()) {
|
|
||||||
final CompoundTag biomeCompound = ((CompoundTag) biome).get("element");
|
|
||||||
biomeCompound.put("category", new StringTag("none"));
|
|
||||||
}
|
|
||||||
|
|
||||||
registry.remove("minecraft:chat_type");
|
|
||||||
|
|
||||||
// Track amount of biomes sent
|
|
||||||
tracker(wrapper.user()).setBiomesSent(biomes.size());
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage;
|
package com.viaversion.viabackwards.protocol.protocol1_18_2to1_19.storage;
|
||||||
|
|
||||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||||
|
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
|
||||||
|
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
@ -26,15 +28,29 @@ import java.util.Map;
|
|||||||
|
|
||||||
public final class DimensionRegistryStorage implements StorableObject {
|
public final class DimensionRegistryStorage implements StorableObject {
|
||||||
|
|
||||||
private Map<String, CompoundTag> dimensions = new HashMap<>();
|
private final Map<String, CompoundTag> dimensions = new HashMap<>();
|
||||||
|
private final Int2ObjectMap<String> chatTypes = new Int2ObjectOpenHashMap<>();
|
||||||
|
|
||||||
public @Nullable CompoundTag dimension(final String dimensionKey) {
|
public @Nullable CompoundTag dimension(final String dimensionKey) {
|
||||||
final CompoundTag compoundTag = dimensions.get(dimensionKey);
|
final CompoundTag compoundTag = dimensions.get(dimensionKey);
|
||||||
return compoundTag != null ? compoundTag.clone() : null;
|
return compoundTag != null ? compoundTag.clone() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDimensions(final Map<String, CompoundTag> dimensions) {
|
public void addDimension(final String dimensionKey, final CompoundTag dimension) {
|
||||||
this.dimensions = dimensions;
|
dimensions.put(dimensionKey, dimension);
|
||||||
|
}
|
||||||
|
|
||||||
|
public @Nullable String chatTypeKey(final int id) {
|
||||||
|
return chatTypes.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addChatType(final int id, final String chatTypeKey) {
|
||||||
|
chatTypes.put(id, chatTypeKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
dimensions.clear();
|
||||||
|
chatTypes.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren