3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-10-08 10:50:11 +02:00

ItemMappings: use array for ItemMapping class

Dieser Commit ist enthalten in:
Camotoy 2022-04-04 14:08:35 -04:00
Ursprung fb26e263cc
Commit d6cb5bd52d
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 7EEFB66FE798081F
9 geänderte Dateien mit 48 neuen und 44 gelöschten Zeilen

Datei anzeigen

@ -52,7 +52,6 @@ public class StoredItemMappings {
private final int goldIngot; private final int goldIngot;
private final int ironIngot; private final int ironIngot;
private final int lead; private final int lead;
private final ItemMapping lodestoneCompass;
private final ItemMapping milkBucket; private final ItemMapping milkBucket;
private final int nameTag; private final int nameTag;
private final ItemMapping powderSnowBucket; private final ItemMapping powderSnowBucket;
@ -80,7 +79,6 @@ public class StoredItemMappings {
this.goldIngot = load(itemMappings, "gold_ingot").getJavaId(); this.goldIngot = load(itemMappings, "gold_ingot").getJavaId();
this.ironIngot = load(itemMappings, "iron_ingot").getJavaId(); this.ironIngot = load(itemMappings, "iron_ingot").getJavaId();
this.lead = load(itemMappings, "lead").getJavaId(); this.lead = load(itemMappings, "lead").getJavaId();
this.lodestoneCompass = load(itemMappings, "lodestone_compass");
this.milkBucket = load(itemMappings, "milk_bucket"); this.milkBucket = load(itemMappings, "milk_bucket");
this.nameTag = load(itemMappings, "name_tag").getJavaId(); this.nameTag = load(itemMappings, "name_tag").getJavaId();
this.powderSnowBucket = load(itemMappings, "powder_snow_bucket"); this.powderSnowBucket = load(itemMappings, "powder_snow_bucket");

Datei anzeigen

@ -128,7 +128,7 @@ public class ItemRegistryPopulator {
IntList spawnEggs = new IntArrayList(); IntList spawnEggs = new IntArrayList();
List<ItemData> carpets = new ObjectArrayList<>(); List<ItemData> carpets = new ObjectArrayList<>();
Int2ObjectMap<ItemMapping> mappings = new Int2ObjectOpenHashMap<>(); List<ItemMapping> mappings = new ObjectArrayList<>();
// Temporary mapping to create stored items // Temporary mapping to create stored items
Map<String, ItemMapping> identifierToMapping = new Object2ObjectOpenHashMap<>(); Map<String, ItemMapping> identifierToMapping = new Object2ObjectOpenHashMap<>();
@ -243,6 +243,8 @@ public class ItemRegistryPopulator {
if (usingFurnaceMinecart && javaIdentifier.equals("minecraft:furnace_minecart")) { if (usingFurnaceMinecart && javaIdentifier.equals("minecraft:furnace_minecart")) {
javaFurnaceMinecartId = itemIndex; javaFurnaceMinecartId = itemIndex;
itemIndex++; itemIndex++;
// Will be added later
mappings.add(null);
continue; continue;
} }
@ -419,7 +421,7 @@ public class ItemRegistryPopulator {
spawnEggs.add(mapping.getBedrockId()); spawnEggs.add(mapping.getBedrockId());
} }
mappings.put(itemIndex, mapping); mappings.add(mapping);
identifierToMapping.put(javaIdentifier, mapping); identifierToMapping.put(javaIdentifier, mapping);
itemNames.add(javaIdentifier); itemNames.add(javaIdentifier);
@ -440,16 +442,14 @@ public class ItemRegistryPopulator {
// Add the lodestone compass since it doesn't exist on java but we need it for item conversion // Add the lodestone compass since it doesn't exist on java but we need it for item conversion
ItemMapping lodestoneEntry = ItemMapping.builder() ItemMapping lodestoneEntry = ItemMapping.builder()
.javaIdentifier("minecraft:lodestone_compass") .javaIdentifier("")
.bedrockIdentifier("minecraft:lodestone_compass") .bedrockIdentifier("minecraft:lodestone_compass")
.javaId(itemIndex) .javaId(-1)
.bedrockId(lodestoneCompassId) .bedrockId(lodestoneCompassId)
.bedrockData(0) .bedrockData(0)
.bedrockBlockId(-1) .bedrockBlockId(-1)
.stackSize(1) .stackSize(1)
.build(); .build();
mappings.put(itemIndex, lodestoneEntry);
identifierToMapping.put(lodestoneEntry.getJavaIdentifier(), lodestoneEntry);
ComponentItemData furnaceMinecartData = null; ComponentItemData furnaceMinecartData = null;
if (usingFurnaceMinecart) { if (usingFurnaceMinecart) {
@ -458,7 +458,7 @@ public class ItemRegistryPopulator {
entries.put("geysermc:furnace_minecart", new StartGamePacket.ItemEntry("geysermc:furnace_minecart", (short) furnaceMinecartId, true)); entries.put("geysermc:furnace_minecart", new StartGamePacket.ItemEntry("geysermc:furnace_minecart", (short) furnaceMinecartId, true));
mappings.put(javaFurnaceMinecartId, ItemMapping.builder() mappings.set(javaFurnaceMinecartId, ItemMapping.builder()
.javaIdentifier("minecraft:furnace_minecart") .javaIdentifier("minecraft:furnace_minecart")
.bedrockIdentifier("geysermc:furnace_minecart") .bedrockIdentifier("geysermc:furnace_minecart")
.javaId(javaFurnaceMinecartId) .javaId(javaFurnaceMinecartId)
@ -509,9 +509,9 @@ public class ItemRegistryPopulator {
} }
ItemMappings itemMappings = ItemMappings.builder() ItemMappings itemMappings = ItemMappings.builder()
.items(mappings) .items(mappings.toArray(new ItemMapping[0]))
.creativeItems(creativeItems.toArray(new ItemData[0])) .creativeItems(creativeItems.toArray(new ItemData[0]))
.itemEntries(new ArrayList<>(entries.values())) .itemEntries(List.copyOf(entries.values()))
.itemNames(itemNames.toArray(new String[0])) .itemNames(itemNames.toArray(new String[0]))
.storedItems(new StoredItemMappings(identifierToMapping)) .storedItems(new StoredItemMappings(identifierToMapping))
.javaOnlyItems(javaOnlyItems) .javaOnlyItems(javaOnlyItems)
@ -520,6 +520,7 @@ public class ItemRegistryPopulator {
.spawnEggIds(spawnEggs) .spawnEggIds(spawnEggs)
.carpets(carpets) .carpets(carpets)
.furnaceMinecartData(furnaceMinecartData) .furnaceMinecartData(furnaceMinecartData)
.lodestoneCompass(lodestoneEntry)
.build(); .build();
Registries.ITEMS.register(palette.getValue().protocolVersion(), itemMappings); Registries.ITEMS.register(palette.getValue().protocolVersion(), itemMappings);

Datei anzeigen

@ -29,13 +29,13 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
import com.nukkitx.protocol.bedrock.data.inventory.ComponentItemData; import com.nukkitx.protocol.bedrock.data.inventory.ComponentItemData;
import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import com.nukkitx.protocol.bedrock.data.inventory.ItemData;
import com.nukkitx.protocol.bedrock.packet.StartGamePacket; import com.nukkitx.protocol.bedrock.packet.StartGamePacket;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntList;
import lombok.Builder; import lombok.Builder;
import lombok.Value; import lombok.Value;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.inventory.item.StoredItemMappings; import org.geysermc.geyser.inventory.item.StoredItemMappings;
import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -48,7 +48,12 @@ public class ItemMappings {
Map<String, ItemMapping> cachedJavaMappings = new WeakHashMap<>(); Map<String, ItemMapping> cachedJavaMappings = new WeakHashMap<>();
Int2ObjectMap<ItemMapping> items; ItemMapping[] items;
/**
* A unique exception as this is an item in Bedrock, but not in Java.
*/
ItemMapping lodestoneCompass;
ItemData[] creativeItems; ItemData[] creativeItems;
List<StartGamePacket.ItemEntry> itemEntries; List<StartGamePacket.ItemEntry> itemEntries;
@ -70,6 +75,7 @@ public class ItemMappings {
* @param itemStack the itemstack * @param itemStack the itemstack
* @return an item entry from the given java edition identifier * @return an item entry from the given java edition identifier
*/ */
@Nonnull
public ItemMapping getMapping(ItemStack itemStack) { public ItemMapping getMapping(ItemStack itemStack) {
return this.getMapping(itemStack.getId()); return this.getMapping(itemStack.getId());
} }
@ -81,8 +87,9 @@ public class ItemMappings {
* @param javaId the id * @param javaId the id
* @return an item entry from the given java edition identifier * @return an item entry from the given java edition identifier
*/ */
@Nonnull
public ItemMapping getMapping(int javaId) { public ItemMapping getMapping(int javaId) {
return this.items.get(javaId); return javaId >= 0 && javaId < this.items.length ? this.items[javaId] : ItemMapping.AIR;
} }
/** /**
@ -94,7 +101,7 @@ public class ItemMappings {
*/ */
public ItemMapping getMapping(String javaIdentifier) { public ItemMapping getMapping(String javaIdentifier) {
return this.cachedJavaMappings.computeIfAbsent(javaIdentifier, key -> { return this.cachedJavaMappings.computeIfAbsent(javaIdentifier, key -> {
for (ItemMapping mapping : this.items.values()) { for (ItemMapping mapping : this.items) {
if (mapping.getJavaIdentifier().equals(key)) { if (mapping.getJavaIdentifier().equals(key)) {
return mapping; return mapping;
} }
@ -110,11 +117,18 @@ public class ItemMappings {
* @return an item entry from the given item data * @return an item entry from the given item data
*/ */
public ItemMapping getMapping(ItemData data) { public ItemMapping getMapping(ItemData data) {
int id = data.getId();
if (id == 0) {
return ItemMapping.AIR;
} else if (id == lodestoneCompass.getBedrockId()) {
return lodestoneCompass;
}
boolean isBlock = data.getBlockRuntimeId() != 0; boolean isBlock = data.getBlockRuntimeId() != 0;
boolean hasDamage = data.getDamage() != 0; boolean hasDamage = data.getDamage() != 0;
for (ItemMapping mapping : this.items.values()) { for (ItemMapping mapping : this.items) {
if (mapping.getBedrockId() == data.getId()) { if (mapping.getBedrockId() == id) {
if (isBlock && !hasDamage) { // Pre-1.16.220 will not use block runtime IDs at all, so we shouldn't check either if (isBlock && !hasDamage) { // Pre-1.16.220 will not use block runtime IDs at all, so we shouldn't check either
if (data.getBlockRuntimeId() != mapping.getBedrockBlockId()) { if (data.getBlockRuntimeId() != mapping.getBedrockBlockId()) {
continue; continue;
@ -135,7 +149,7 @@ public class ItemMappings {
} }
// This will hide the message when the player clicks with an empty hand // This will hide the message when the player clicks with an empty hand
if (data.getId() != 0 && data.getDamage() != 0) { if (id != 0 && data.getDamage() != 0) {
GeyserImpl.getInstance().getLogger().debug("Missing mapping for bedrock item " + data.getId() + ":" + data.getDamage()); GeyserImpl.getInstance().getLogger().debug("Missing mapping for bedrock item " + data.getId() + ":" + data.getDamage());
} }
return ItemMapping.AIR; return ItemMapping.AIR;

Datei anzeigen

@ -35,6 +35,7 @@ import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings; import org.geysermc.geyser.registry.type.ItemMappings;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -45,7 +46,7 @@ public class CompassTranslator extends ItemTranslator {
protected ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) { protected ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) {
if (isLodestoneCompass(itemStack.getNbt())) { if (isLodestoneCompass(itemStack.getNbt())) {
// NBT will be translated in nbt/LodestoneCompassTranslator if applicable // NBT will be translated in nbt/LodestoneCompassTranslator if applicable
return super.translateToBedrock(itemStack, mappings.getStoredItems().lodestoneCompass(), mappings); return super.translateToBedrock(itemStack, mappings.getLodestoneCompass(), mappings);
} }
return super.translateToBedrock(itemStack, mapping, mappings); return super.translateToBedrock(itemStack, mapping, mappings);
} }
@ -53,7 +54,7 @@ public class CompassTranslator extends ItemTranslator {
@Override @Override
protected ItemMapping getItemMapping(int javaId, CompoundTag nbt, ItemMappings mappings) { protected ItemMapping getItemMapping(int javaId, CompoundTag nbt, ItemMappings mappings) {
if (isLodestoneCompass(nbt)) { if (isLodestoneCompass(nbt)) {
return mappings.getStoredItems().lodestoneCompass(); return mappings.getLodestoneCompass();
} }
return super.getItemMapping(javaId, nbt, mappings); return super.getItemMapping(javaId, nbt, mappings);
} }
@ -78,10 +79,8 @@ public class CompassTranslator extends ItemTranslator {
@Override @Override
public List<ItemMapping> getAppliedItems() { public List<ItemMapping> getAppliedItems() {
return Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) return Arrays.stream(Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion())
.getItems() .getItems())
.values()
.stream()
.filter(entry -> entry.getJavaIdentifier().endsWith("compass")) .filter(entry -> entry.getJavaIdentifier().endsWith("compass"))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

Datei anzeigen

@ -36,6 +36,7 @@ import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings; import org.geysermc.geyser.registry.type.ItemMappings;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -73,10 +74,8 @@ public class PotionTranslator extends ItemTranslator {
@Override @Override
public List<ItemMapping> getAppliedItems() { public List<ItemMapping> getAppliedItems() {
return Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) return Arrays.stream(Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion())
.getItems() .getItems())
.values()
.stream()
.filter(entry -> entry.getJavaIdentifier().endsWith("potion")) .filter(entry -> entry.getJavaIdentifier().endsWith("potion"))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

Datei anzeigen

@ -36,6 +36,7 @@ import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings; import org.geysermc.geyser.registry.type.ItemMappings;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -80,10 +81,8 @@ public class TippedArrowTranslator extends ItemTranslator {
@Override @Override
public List<ItemMapping> getAppliedItems() { public List<ItemMapping> getAppliedItems() {
return Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) return Arrays.stream(Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion())
.getItems() .getItems())
.values()
.stream()
.filter(entry -> entry.getJavaIdentifier().contains("arrow") .filter(entry -> entry.getJavaIdentifier().contains("arrow")
&& !entry.getJavaIdentifier().contains("spectral")) && !entry.getJavaIdentifier().contains("spectral"))
.collect(Collectors.toList()); .collect(Collectors.toList());

Datei anzeigen

@ -37,10 +37,7 @@ import org.geysermc.geyser.translator.inventory.item.ItemRemapper;
import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ItemRemapper @ItemRemapper
@ -79,10 +76,8 @@ public class BannerTranslator extends NbtItemStackTranslator {
} }
public BannerTranslator() { public BannerTranslator() {
appliedItems = Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) appliedItems = Arrays.stream(Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion())
.getItems() .getItems())
.values()
.stream()
.filter(entry -> entry.getJavaIdentifier().endsWith("banner")) .filter(entry -> entry.getJavaIdentifier().endsWith("banner"))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

Datei anzeigen

@ -284,7 +284,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
} }
} }
} }
ItemMapping handItem = mappings.getMapping(packet.getItemInHand()); ItemMapping handItem = session.getPlayerInventory().getItemInHand().getMapping(session);
if (handItem.isBlock()) { if (handItem.isBlock()) {
session.setLastBlockPlacePosition(blockPos); session.setLastBlockPlacePosition(blockPos);
session.setLastBlockPlacedId(handItem.getJavaIdentifier()); session.setLastBlockPlacedId(handItem.getJavaIdentifier());

Datei anzeigen

@ -172,8 +172,7 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator<ClientboundUpd
// Sort the list by each output item's Java identifier - this is how it's sorted on Java, and therefore // Sort the list by each output item's Java identifier - this is how it's sorted on Java, and therefore
// We can get the correct order for button pressing // We can get the correct order for button pressing
data.getValue().sort(Comparator.comparing((stoneCuttingRecipeData -> data.getValue().sort(Comparator.comparing((stoneCuttingRecipeData ->
session.getItemMappings().getItems() session.getItemMappings().getMapping(stoneCuttingRecipeData.getResult())
.getOrDefault(stoneCuttingRecipeData.getResult().getId(), ItemMapping.AIR)
.getJavaIdentifier()))); .getJavaIdentifier())));
// Now that it's sorted, let's translate these recipes // Now that it's sorted, let's translate these recipes
@ -229,7 +228,7 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator<ClientboundUpd
GroupedItem groupedItem = entry.getKey(); GroupedItem groupedItem = entry.getKey();
int idCount = 0; int idCount = 0;
//not optimal //not optimal
for (ItemMapping mapping : session.getItemMappings().getItems().values()) { for (ItemMapping mapping : session.getItemMappings().getItems()) {
if (mapping.getBedrockId() == groupedItem.id) { if (mapping.getBedrockId() == groupedItem.id) {
idCount++; idCount++;
} }