Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/main/java/io/github/essentialsx/itemdbgenerator/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import io.github.essentialsx.itemdbgenerator.providers.item.ItemProvider;
import io.github.essentialsx.itemdbgenerator.providers.item.MaterialEnumProvider;
import io.github.essentialsx.itemdbgenerator.providers.item.PotionProvider;
import io.github.essentialsx.itemdbgenerator.providers.item.RegistryItemProvider;
import io.github.essentialsx.itemdbgenerator.providers.item.SpawnerProvider;
import org.bukkit.Bukkit;
import org.bukkit.Material;
Expand All @@ -48,6 +49,7 @@ public class Main extends JavaPlugin {

protected static final List<ItemProvider> itemProviders = Arrays.asList(
new MaterialEnumProvider(),
new RegistryItemProvider(),
new SpawnerProvider(),
new PotionProvider()
);
Expand Down Expand Up @@ -147,6 +149,12 @@ static SortedSet<ItemProvider.Item> getItems() {
}

static SortedSet<String> getAliases(ItemProvider.Item item) {
if (item.getMaterial() == null) {
TreeSet<String> aliases = new TreeSet<>();
aliases.add("minecraft:" + item.getName());
aliases.add(item.getName().replaceAll("_", ""));
return aliases;
}
return aliasProviders.stream()
.flatMap(provider -> provider.get(item))
.collect(Collectors.toCollection(TreeSet::new));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,13 @@ public static void main(String[] args) {
.start()
.waitFor();

File reportFile = new File(cacheDir, "generated/reports/items.json");
File reportFile = new File(cacheDir, "generated/reports/registries.json");
if (!reportFile.exists()) {
throw new RuntimeException("Data generator failed to produce " + reportFile);
}

System.out.println("Parsing generated report...");
Set<String> items = parseItemsReport(reportFile);
System.out.println("Parsing item registry from registries.json...");
Set<String> items = parseItemRegistry(reportFile);
System.out.println("Found " + items.size() + " valid items.");
Main.VALID_ITEMS = items;

Expand Down Expand Up @@ -172,11 +172,19 @@ private static String buildClasspath(File workingDir, File extractedServerJar) t
return cp.toString();
}

private static Set<String> parseItemsReport(File reportFile) throws IOException {
try (Reader reader = new java.io.FileReader(reportFile)) {
private static Set<String> parseItemRegistry(File registriesFile) throws IOException {
try (Reader reader = new java.io.FileReader(registriesFile)) {
JsonObject json = GSON.fromJson(reader, JsonObject.class);
JsonObject itemRegistry = json.getAsJsonObject("minecraft:item");
if (itemRegistry == null) {
throw new RuntimeException("No minecraft:item registry found in " + registriesFile);
}
JsonObject entries = itemRegistry.getAsJsonObject("entries");
if (entries == null) {
throw new RuntimeException("No entries found in minecraft:item registry");
}
Set<String> items = new HashSet<>();
for (String key : json.keySet()) {
for (String key : entries.keySet()) {
if (key.startsWith("minecraft:")) {
items.add(key.substring(10));
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.github.essentialsx.itemdbgenerator.providers.item;

import com.google.gson.annotations.SerializedName;
import org.bukkit.Material;

import java.util.Objects;
Expand All @@ -10,27 +11,40 @@ public interface ItemProvider {
Stream<Item> get();

abstract class Item implements Comparable {
private final Material material;
private transient final Material material;
@SerializedName("material")
private final String materialName;
private final String[] fallbacks;

public Item(Material material) {
this.material = material;
this.materialName = material.name();
this.fallbacks = MaterialFallbacks.get(material);
}

public Item(String registryName) {
this.material = null;
this.materialName = registryName.toUpperCase();
this.fallbacks = null;
}

public abstract String getName();

public Material getMaterial() {
return material;
}

public String getMaterialName() {
return materialName;
}

public String[] getFallbacks() {
return fallbacks;
}

@Override
public int hashCode() {
return Objects.hash(material);
return Objects.hash(materialName);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.github.essentialsx.itemdbgenerator.providers.item;

import io.github.essentialsx.itemdbgenerator.Main;
import org.bukkit.Material;

import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
* Provides items from the Minecraft registry that don't have a matching
* Paper Material enum entry. This ensures new items are included even
* when the Paper API hasn't been updated yet.
*/
public class RegistryItemProvider implements ItemProvider {

@Override
public Stream<Item> get() {
if (Main.VALID_ITEMS == null) {
return Stream.empty();
}

Set<String> knownMaterials = Arrays.stream(Material.values())
.filter(mat -> !mat.name().contains("LEGACY"))
.map(mat -> mat.name().toLowerCase())
.collect(Collectors.toSet());

return Main.VALID_ITEMS.stream()
.filter(name -> !knownMaterials.contains(name))
.map(RegistryItem::new);
}

public static class RegistryItem extends Item {
private final String name;

private RegistryItem(String registryName) {
super(registryName);
this.name = registryName;
}

@Override
public String getName() {
return name;
}
}
}