#746: Add Fluid types / tags

This commit is contained in:
Martoph 2020-09-14 19:39:43 +10:00 committed by md_5
parent d5a7296002
commit 890130b460
No known key found for this signature in database
GPG key ID: E8E901AC7C617C11
3 changed files with 58 additions and 0 deletions

View file

@ -68,6 +68,7 @@ import net.minecraft.server.Enchantments;
import net.minecraft.server.EntityPlayer; import net.minecraft.server.EntityPlayer;
import net.minecraft.server.EnumDifficulty; import net.minecraft.server.EnumDifficulty;
import net.minecraft.server.EnumGamemode; import net.minecraft.server.EnumGamemode;
import net.minecraft.server.FluidType;
import net.minecraft.server.GameRules; import net.minecraft.server.GameRules;
import net.minecraft.server.GeneratorSettings; import net.minecraft.server.GeneratorSettings;
import net.minecraft.server.IRecipe; import net.minecraft.server.IRecipe;
@ -166,6 +167,7 @@ import org.bukkit.craftbukkit.potion.CraftPotionBrewer;
import org.bukkit.craftbukkit.scheduler.CraftScheduler; import org.bukkit.craftbukkit.scheduler.CraftScheduler;
import org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager; import org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager;
import org.bukkit.craftbukkit.tag.CraftBlockTag; import org.bukkit.craftbukkit.tag.CraftBlockTag;
import org.bukkit.craftbukkit.tag.CraftFluidTag;
import org.bukkit.craftbukkit.tag.CraftItemTag; import org.bukkit.craftbukkit.tag.CraftItemTag;
import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.craftbukkit.util.CraftIconCache; import org.bukkit.craftbukkit.util.CraftIconCache;
@ -1953,6 +1955,10 @@ public final class CraftServer implements Server {
Preconditions.checkArgument(clazz == org.bukkit.Material.class, "Item namespace must have material type"); Preconditions.checkArgument(clazz == org.bukkit.Material.class, "Item namespace must have material type");
return (org.bukkit.Tag<T>) new CraftItemTag(console.getTagRegistry().getItemTags(), key); return (org.bukkit.Tag<T>) new CraftItemTag(console.getTagRegistry().getItemTags(), key);
case org.bukkit.Tag.REGISTRY_FLUIDS:
Preconditions.checkArgument(clazz == org.bukkit.Fluid.class, "Fluid namespace must have fluid type");
return (org.bukkit.Tag<T>) new CraftFluidTag(console.getTagRegistry().getFluidTags(), key);
default: default:
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
@ -1972,6 +1978,11 @@ public final class CraftServer implements Server {
Tags<Item> itemTags = console.getTagRegistry().getItemTags(); Tags<Item> itemTags = console.getTagRegistry().getItemTags();
return itemTags.a().keySet().stream().map(key -> (org.bukkit.Tag<T>) new CraftItemTag(itemTags, key)).collect(ImmutableList.toImmutableList()); return itemTags.a().keySet().stream().map(key -> (org.bukkit.Tag<T>) new CraftItemTag(itemTags, key)).collect(ImmutableList.toImmutableList());
case org.bukkit.Tag.REGISTRY_FLUIDS:
Preconditions.checkArgument(clazz == org.bukkit.Material.class, "Fluid namespace must have fluid type");
Tags<FluidType> fluidTags = console.getTagRegistry().getFluidTags();
return fluidTags.a().keySet().stream().map(key -> (org.bukkit.Tag<T>) new CraftFluidTag(fluidTags, key)).collect(ImmutableList.toImmutableList());
default: default:
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }

View file

@ -0,0 +1,27 @@
package org.bukkit.craftbukkit.tag;
import java.util.Collections;
import java.util.Set;
import java.util.stream.Collectors;
import net.minecraft.server.FluidType;
import net.minecraft.server.MinecraftKey;
import net.minecraft.server.Tags;
import org.bukkit.Fluid;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
public class CraftFluidTag extends CraftTag<FluidType, Fluid> {
public CraftFluidTag(Tags<FluidType> registry, MinecraftKey tag) {
super(registry, tag);
}
@Override
public boolean isTagged(Fluid fluid) {
return getHandle().isTagged(CraftMagicNumbers.getFluid(fluid));
}
@Override
public Set<Fluid> getValues() {
return Collections.unmodifiableSet(getHandle().getTagged().stream().map(CraftMagicNumbers::getFluid).collect(Collectors.toSet()));
}
}

View file

@ -24,6 +24,7 @@ import net.minecraft.server.ChatDeserializer;
import net.minecraft.server.DataConverterRegistry; import net.minecraft.server.DataConverterRegistry;
import net.minecraft.server.DataConverterTypes; import net.minecraft.server.DataConverterTypes;
import net.minecraft.server.DynamicOpsNBT; import net.minecraft.server.DynamicOpsNBT;
import net.minecraft.server.FluidType;
import net.minecraft.server.IBlockData; import net.minecraft.server.IBlockData;
import net.minecraft.server.IRegistry; import net.minecraft.server.IRegistry;
import net.minecraft.server.Item; import net.minecraft.server.Item;
@ -37,8 +38,10 @@ import net.minecraft.server.NBTTagString;
import net.minecraft.server.SavedFile; import net.minecraft.server.SavedFile;
import net.minecraft.server.SharedConstants; import net.minecraft.server.SharedConstants;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Fluid;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
import org.bukkit.UnsafeValues; import org.bukkit.UnsafeValues;
import org.bukkit.advancement.Advancement; import org.bukkit.advancement.Advancement;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -83,8 +86,10 @@ public final class CraftMagicNumbers implements UnsafeValues {
// ======================================================================== // ========================================================================
private static final Map<Block, Material> BLOCK_MATERIAL = new HashMap<>(); private static final Map<Block, Material> BLOCK_MATERIAL = new HashMap<>();
private static final Map<Item, Material> ITEM_MATERIAL = new HashMap<>(); private static final Map<Item, Material> ITEM_MATERIAL = new HashMap<>();
private static final Map<FluidType, Fluid> FLUID_MATERIAL = new HashMap<>();
private static final Map<Material, Item> MATERIAL_ITEM = new HashMap<>(); private static final Map<Material, Item> MATERIAL_ITEM = new HashMap<>();
private static final Map<Material, Block> MATERIAL_BLOCK = new HashMap<>(); private static final Map<Material, Block> MATERIAL_BLOCK = new HashMap<>();
private static final Map<Material, FluidType> MATERIAL_FLUID = new HashMap<>();
static { static {
for (Block block : IRegistry.BLOCK) { for (Block block : IRegistry.BLOCK) {
@ -95,6 +100,10 @@ public final class CraftMagicNumbers implements UnsafeValues {
ITEM_MATERIAL.put(item, Material.getMaterial(IRegistry.ITEM.getKey(item).getKey().toUpperCase(Locale.ROOT))); ITEM_MATERIAL.put(item, Material.getMaterial(IRegistry.ITEM.getKey(item).getKey().toUpperCase(Locale.ROOT)));
} }
for (FluidType fluid : IRegistry.FLUID) {
FLUID_MATERIAL.put(fluid, Registry.FLUID.get(CraftNamespacedKey.fromMinecraft(IRegistry.FLUID.getKey(fluid))));
}
for (Material material : Material.values()) { for (Material material : Material.values()) {
if (material.isLegacy()) { if (material.isLegacy()) {
continue; continue;
@ -107,6 +116,9 @@ public final class CraftMagicNumbers implements UnsafeValues {
IRegistry.BLOCK.getOptional(key).ifPresent((block) -> { IRegistry.BLOCK.getOptional(key).ifPresent((block) -> {
MATERIAL_BLOCK.put(material, block); MATERIAL_BLOCK.put(material, block);
}); });
IRegistry.FLUID.getOptional(key).ifPresent((fluid) -> {
MATERIAL_FLUID.put(material, fluid);
});
} }
} }
@ -118,6 +130,10 @@ public final class CraftMagicNumbers implements UnsafeValues {
return ITEM_MATERIAL.getOrDefault(item, Material.AIR); return ITEM_MATERIAL.getOrDefault(item, Material.AIR);
} }
public static Fluid getFluid(FluidType fluid) {
return FLUID_MATERIAL.get(fluid);
}
public static Item getItem(Material material) { public static Item getItem(Material material) {
if (material != null && material.isLegacy()) { if (material != null && material.isLegacy()) {
material = CraftLegacy.fromLegacy(material); material = CraftLegacy.fromLegacy(material);
@ -134,6 +150,10 @@ public final class CraftMagicNumbers implements UnsafeValues {
return MATERIAL_BLOCK.get(material); return MATERIAL_BLOCK.get(material);
} }
public static FluidType getFluid(Fluid fluid) {
return MATERIAL_FLUID.get(fluid);
}
public static MinecraftKey key(Material mat) { public static MinecraftKey key(Material mat) {
return CraftNamespacedKey.toMinecraft(mat.getKey()); return CraftNamespacedKey.toMinecraft(mat.getKey());
} }