Search in sources :

Example 1 with IO

use of com.lowdragmc.multiblocked.api.capability.IO in project Multiblocked by Low-Drag-MC.

the class BlockPattern method checkPatternAt.

private boolean checkPatternAt(MultiblockState worldState, BlockPos centerPos, Direction facing, boolean savePredicate, Set<MultiblockCapability<?>> inputCapabilities, Set<MultiblockCapability<?>> outputCapabilities) {
    boolean findFirstAisle = false;
    int minZ = -centerOffset[4];
    worldState.clean();
    PatternMatchContext matchContext = worldState.matchContext;
    Map<SimplePredicate, Integer> globalCount = worldState.globalCount;
    // Checking aisles
    for (int c = 0, z = minZ++, r; c < this.fingerLength; c++) {
        // Checking repeatable slices
        loop: for (r = 0; (findFirstAisle ? r < aisleRepetitions[c][1] : z <= -centerOffset[3]); r++) {
            // Checking single slice
            for (int b = 0, y = -centerOffset[1]; b < this.thumbLength; b++, y++) {
                for (int a = 0, x = -centerOffset[0]; a < this.palmLength; a++, x++) {
                    worldState.setError(null);
                    TraceabilityPredicate predicate = this.blockMatches[c][b][a];
                    BlockPos pos = setActualRelativeOffset(x, y, z, facing).offset(centerPos.getX(), centerPos.getY(), centerPos.getZ());
                    if (!worldState.update(pos, predicate)) {
                        return false;
                    }
                    if (!predicate.isAny()) {
                        worldState.addPosCache(pos);
                        if (savePredicate) {
                            worldState.getMatchContext().getOrCreate("predicates", (Supplier<HashMap<BlockPos, TraceabilityPredicate>>) HashMap::new).put(pos, predicate);
                        }
                    }
                    boolean canPartShared = true;
                    TileEntity tileEntity = worldState.getTileEntity();
                    if (tileEntity instanceof IPartComponent) {
                        // add detected parts
                        if (!predicate.isAny()) {
                            IPartComponent part = (IPartComponent) tileEntity;
                            if (part.isFormed() && !part.canShared() && !part.hasController(worldState.controllerPos)) {
                                // check part can be shared
                                canPartShared = false;
                                worldState.setError(new PatternStringError("multiblocked.pattern.error.share"));
                            } else {
                                worldState.getMatchContext().getOrCreate("parts", LongOpenHashSet::new).add(worldState.getPos().asLong());
                            }
                        }
                    }
                    if (!predicate.test(worldState) || !canPartShared) {
                        // matching failed
                        if (findFirstAisle) {
                            if (r < aisleRepetitions[c][0]) {
                                // retreat to see if the first aisle can start later
                                r = c = 0;
                                z = minZ++;
                                matchContext.reset();
                                findFirstAisle = false;
                            }
                        } else {
                            // continue searching for the first aisle
                            z++;
                        }
                        continue loop;
                    }
                    if (tileEntity != null && !predicate.isAny()) {
                        Map<Long, EnumMap<IO, Set<MultiblockCapability<?>>>> capabilities = worldState.getMatchContext().getOrCreate("capabilities", Long2ObjectOpenHashMap::new);
                        if (!capabilities.containsKey(worldState.getPos().asLong()) && worldState.io != null) {
                            // if predicate has no specific capability requirements. we will check abilities of every blocks
                            Set<MultiblockCapability<?>> bothFound = new HashSet<>();
                            for (MultiblockCapability<?> capability : inputCapabilities) {
                                // IN
                                if (worldState.io == IO.BOTH && outputCapabilities.contains(capability) && capability.isBlockHasCapability(IO.BOTH, tileEntity)) {
                                    bothFound.add(capability);
                                    capabilities.computeIfAbsent(worldState.getPos().asLong(), l -> new EnumMap<>(IO.class)).computeIfAbsent(IO.BOTH, xx -> new HashSet<>()).add(capability);
                                } else if (worldState.io != IO.OUT && capability.isBlockHasCapability(IO.IN, tileEntity)) {
                                    capabilities.computeIfAbsent(worldState.getPos().asLong(), l -> new EnumMap<>(IO.class)).computeIfAbsent(IO.IN, xx -> new HashSet<>()).add(capability);
                                }
                            }
                            if (worldState.io != IO.IN) {
                                for (MultiblockCapability<?> capability : outputCapabilities) {
                                    // OUT
                                    if (!bothFound.contains(capability) && capability.isBlockHasCapability(IO.OUT, tileEntity)) {
                                        capabilities.computeIfAbsent(worldState.getPos().asLong(), l -> new EnumMap<>(IO.class)).computeIfAbsent(IO.OUT, xx -> new HashSet<>()).add(capability);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            findFirstAisle = true;
            z++;
        }
        // Repetitions out of range
        if (r < aisleRepetitions[c][0] || !worldState.isFormed() || !findFirstAisle) {
            if (worldState.isFormed()) {
                worldState.setError(new PatternError());
            }
            return false;
        }
    }
    // Check count matches amount
    for (Map.Entry<SimplePredicate, Integer> entry : globalCount.entrySet()) {
        if (entry.getValue() < entry.getKey().minCount) {
            worldState.setError(new SinglePredicateError(entry.getKey(), 1));
            return false;
        }
    }
    worldState.setError(null);
    return true;
}
Also used : PatternError(com.lowdragmc.multiblocked.api.pattern.error.PatternError) ComponentTileEntity(com.lowdragmc.multiblocked.api.tile.ComponentTileEntity) Array(java.lang.reflect.Array) BlockComponent(com.lowdragmc.multiblocked.api.block.BlockComponent) BiFunction(java.util.function.BiFunction) ArrayUtils(org.apache.commons.lang3.ArrayUtils) HashMap(java.util.HashMap) SinglePredicateError(com.lowdragmc.multiblocked.api.pattern.error.SinglePredicateError) Direction(net.minecraft.util.Direction) MultiblockCapability(com.lowdragmc.multiblocked.api.capability.MultiblockCapability) Supplier(java.util.function.Supplier) ControllerTileEntity(com.lowdragmc.multiblocked.api.tile.ControllerTileEntity) ArrayList(java.util.ArrayList) RelativeDirection(com.lowdragmc.multiblocked.api.pattern.util.RelativeDirection) HashSet(java.util.HashSet) ItemStack(net.minecraft.item.ItemStack) BlockInfo(com.lowdragmc.lowdraglib.utils.BlockInfo) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) Map(java.util.Map) IO(com.lowdragmc.multiblocked.api.capability.IO) Hand(net.minecraft.util.Hand) BlockState(net.minecraft.block.BlockState) PatternStringError(com.lowdragmc.multiblocked.api.pattern.error.PatternStringError) PatternMatchContext(com.lowdragmc.multiblocked.api.pattern.util.PatternMatchContext) PlayerEntity(net.minecraft.entity.player.PlayerEntity) CycleBlockStateRenderer(com.lowdragmc.multiblocked.client.renderer.impl.CycleBlockStateRenderer) EnumMap(java.util.EnumMap) World(net.minecraft.world.World) IPartComponent(com.lowdragmc.multiblocked.api.tile.part.IPartComponent) Set(java.util.Set) BlockPos(net.minecraft.util.math.BlockPos) BlockItemUseContext(net.minecraft.item.BlockItemUseContext) Blocks(net.minecraft.block.Blocks) BlockRayTraceResult(net.minecraft.util.math.BlockRayTraceResult) Consumer(java.util.function.Consumer) List(java.util.List) LongOpenHashSet(it.unimi.dsi.fastutil.longs.LongOpenHashSet) BlockItem(net.minecraft.item.BlockItem) SimplePredicate(com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate) TileEntity(net.minecraft.tileentity.TileEntity) DirectionProperty(net.minecraft.state.DirectionProperty) BlockStateProperties(net.minecraft.state.properties.BlockStateProperties) HashSet(java.util.HashSet) Set(java.util.Set) LongOpenHashSet(it.unimi.dsi.fastutil.longs.LongOpenHashSet) HashMap(java.util.HashMap) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) PatternMatchContext(com.lowdragmc.multiblocked.api.pattern.util.PatternMatchContext) ComponentTileEntity(com.lowdragmc.multiblocked.api.tile.ComponentTileEntity) ControllerTileEntity(com.lowdragmc.multiblocked.api.tile.ControllerTileEntity) TileEntity(net.minecraft.tileentity.TileEntity) BlockPos(net.minecraft.util.math.BlockPos) LongOpenHashSet(it.unimi.dsi.fastutil.longs.LongOpenHashSet) EnumMap(java.util.EnumMap) HashSet(java.util.HashSet) LongOpenHashSet(it.unimi.dsi.fastutil.longs.LongOpenHashSet) IPartComponent(com.lowdragmc.multiblocked.api.tile.part.IPartComponent) MultiblockCapability(com.lowdragmc.multiblocked.api.capability.MultiblockCapability) IO(com.lowdragmc.multiblocked.api.capability.IO) SimplePredicate(com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate) PatternError(com.lowdragmc.multiblocked.api.pattern.error.PatternError) PatternStringError(com.lowdragmc.multiblocked.api.pattern.error.PatternStringError) HashMap(java.util.HashMap) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) Map(java.util.Map) EnumMap(java.util.EnumMap) SinglePredicateError(com.lowdragmc.multiblocked.api.pattern.error.SinglePredicateError)

Example 2 with IO

use of com.lowdragmc.multiblocked.api.capability.IO in project Multiblocked by Low-Drag-MC.

the class MultiCapabilityTrait method serialize.

@Override
public void serialize(@Nullable JsonElement jsonElement) {
    if (jsonElement == null) {
        jsonElement = new JsonArray();
    }
    JsonArray jsonArray = jsonElement.getAsJsonArray();
    int size = jsonArray.size();
    capabilityIO = new IO[size];
    guiIO = new IO[size];
    x = new int[size];
    y = new int[size];
    autoIO = new boolean[size];
    int i = 0;
    for (JsonElement element : jsonArray) {
        JsonObject jsonObject = element.getAsJsonObject();
        capabilityIO[i] = JsonUtil.getEnumOr(jsonObject, "cIO", IO.class, IO.BOTH);
        guiIO[i] = JsonUtil.getEnumOr(jsonObject, "gIO", IO.class, IO.BOTH);
        x[i] = JSONUtils.getAsInt(jsonObject, "x", 5);
        y[i] = JSONUtils.getAsInt(jsonObject, "y", 5);
        autoIO[i] = JSONUtils.getAsBoolean(jsonObject, "autoIO", false);
        i++;
    }
}
Also used : JsonArray(com.google.gson.JsonArray) JsonElement(com.google.gson.JsonElement) IO(com.lowdragmc.multiblocked.api.capability.IO) JsonObject(com.google.gson.JsonObject)

Example 3 with IO

use of com.lowdragmc.multiblocked.api.capability.IO in project Multiblocked by Low-Drag-MC.

the class ControllerTileEntity method load.

@Override
public void load(@Nonnull BlockState blockState, @Nonnull CompoundNBT compound) {
    try {
        super.load(blockState, compound);
    } catch (Exception e) {
        if (definition == null) {
            MultiblockWorldSavedData mwsd = MultiblockWorldSavedData.getOrCreate(level);
            if (worldPosition != null && mwsd.mapping.containsKey(worldPosition)) {
                mwsd.removeMapping(mwsd.mapping.get(worldPosition));
            }
            return;
        }
    }
    if (compound.contains("ars")) {
        asyncRecipeSearching = compound.getBoolean("ars");
    }
    if (compound.contains("recipeLogic")) {
        recipeLogic = new RecipeLogic(this);
        recipeLogic.readFromNBT(compound.getCompound("recipeLogic"));
        status = recipeLogic.getStatus().name;
    }
    if (compound.contains("capabilities")) {
        ListNBT tagList = compound.getList("capabilities", Constants.NBT.TAG_COMPOUND);
        settings = new HashMap<>();
        for (INBT base : tagList) {
            CompoundNBT tag = (CompoundNBT) base;
            settings.computeIfAbsent(tag.getLong("pos"), l -> new HashMap<>()).put(MbdCapabilities.get(tag.getString("cap")), new Tuple<>(IO.VALUES[tag.getInt("io")], Direction.values()[tag.getInt("facing")]));
        }
    }
}
Also used : com.lowdragmc.multiblocked.api.kubejs.events(com.lowdragmc.multiblocked.api.kubejs.events) Constants(net.minecraftforge.common.util.Constants) CompoundNBT(net.minecraft.nbt.CompoundNBT) Direction(net.minecraft.util.Direction) TabContainer(com.lowdragmc.lowdraglib.gui.widget.TabContainer) TranslationTextComponent(net.minecraft.util.text.TranslationTextComponent) Tables(com.google.common.collect.Tables) IAsyncThreadUpdate(com.lowdragmc.multiblocked.persistence.IAsyncThreadUpdate) ServerLifecycleHooks(net.minecraftforge.fml.server.ServerLifecycleHooks) Object2ObjectOpenHashMap(it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) Map(java.util.Map) MultiblockWorldSavedData(com.lowdragmc.multiblocked.persistence.MultiblockWorldSavedData) IO(com.lowdragmc.multiblocked.api.capability.IO) ModularUI(com.lowdragmc.lowdraglib.gui.modular.ModularUI) BlockState(net.minecraft.block.BlockState) MultiblockPreviewRenderer(com.lowdragmc.multiblocked.client.renderer.MultiblockPreviewRenderer) LongSet(it.unimi.dsi.fastutil.longs.LongSet) ListNBT(net.minecraft.nbt.ListNBT) PlayerEntity(net.minecraft.entity.player.PlayerEntity) EnumMap(java.util.EnumMap) IPartComponent(com.lowdragmc.multiblocked.api.tile.part.IPartComponent) MultiblockState(com.lowdragmc.multiblocked.api.pattern.MultiblockState) LongSets(it.unimi.dsi.fastutil.longs.LongSets) Set(java.util.Set) BlockRayTraceResult(net.minecraft.util.math.BlockRayTraceResult) IOPageWidget(com.lowdragmc.multiblocked.api.gui.controller.IOPageWidget) CapabilityProxy(com.lowdragmc.multiblocked.api.capability.proxy.CapabilityProxy) BlockPattern(com.lowdragmc.multiblocked.api.pattern.BlockPattern) ActionResultType(net.minecraft.util.ActionResultType) ServerPlayerEntity(net.minecraft.entity.player.ServerPlayerEntity) ScriptType(dev.latvian.kubejs.script.ScriptType) HashMap(java.util.HashMap) MultiblockCapability(com.lowdragmc.multiblocked.api.capability.MultiblockCapability) ITextComponent(net.minecraft.util.text.ITextComponent) RecipeLogic(com.lowdragmc.multiblocked.api.recipe.RecipeLogic) ItemStack(net.minecraft.item.ItemStack) NIL_UUID(net.minecraft.util.Util.NIL_UUID) ImmutableList(com.google.common.collect.ImmutableList) RecipePage(com.lowdragmc.multiblocked.api.gui.controller.RecipePage) Hand(net.minecraft.util.Hand) Nonnull(javax.annotation.Nonnull) IMultiblockedRenderer(com.lowdragmc.multiblocked.client.renderer.IMultiblockedRenderer) INBT(net.minecraft.nbt.INBT) Nullable(javax.annotation.Nullable) World(net.minecraft.world.World) Tuple(net.minecraft.util.Tuple) ICapabilityProxyHolder(com.lowdragmc.multiblocked.api.capability.ICapabilityProxyHolder) BlockPos(net.minecraft.util.math.BlockPos) MbdCapabilities(com.lowdragmc.multiblocked.api.registry.MbdCapabilities) LongOpenHashSet(it.unimi.dsi.fastutil.longs.LongOpenHashSet) ControllerDefinition(com.lowdragmc.multiblocked.api.definition.ControllerDefinition) TileEntity(net.minecraft.tileentity.TileEntity) Multiblocked(com.lowdragmc.multiblocked.Multiblocked) StructurePageWidget(com.lowdragmc.multiblocked.api.gui.controller.structure.StructurePageWidget) TileEntityUIFactory(com.lowdragmc.lowdraglib.gui.factory.TileEntityUIFactory) Table(com.google.common.collect.Table) PacketBuffer(net.minecraft.network.PacketBuffer) ListNBT(net.minecraft.nbt.ListNBT) RecipeLogic(com.lowdragmc.multiblocked.api.recipe.RecipeLogic) CompoundNBT(net.minecraft.nbt.CompoundNBT) INBT(net.minecraft.nbt.INBT) Object2ObjectOpenHashMap(it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) HashMap(java.util.HashMap) MultiblockWorldSavedData(com.lowdragmc.multiblocked.persistence.MultiblockWorldSavedData)

Example 4 with IO

use of com.lowdragmc.multiblocked.api.capability.IO in project Multiblocked by Low-Drag-MC.

the class ControllerTileEntity method save.

@Nonnull
@Override
public CompoundNBT save(@Nonnull CompoundNBT compound) {
    super.save(compound);
    if (!asyncRecipeSearching) {
        compound.putBoolean("ars", false);
    }
    if (recipeLogic != null)
        compound.put("recipeLogic", recipeLogic.writeToNBT(new CompoundNBT()));
    if (capabilities != null) {
        ListNBT tagList = new ListNBT();
        for (Table.Cell<IO, MultiblockCapability<?>, Long2ObjectOpenHashMap<CapabilityProxy<?>>> cell : capabilities.cellSet()) {
            IO io = cell.getRowKey();
            MultiblockCapability<?> cap = cell.getColumnKey();
            Long2ObjectOpenHashMap<CapabilityProxy<?>> value = cell.getValue();
            if (io != null && cap != null && value != null) {
                for (Map.Entry<Long, CapabilityProxy<?>> entry : value.entrySet()) {
                    CompoundNBT tag = new CompoundNBT();
                    tag.putInt("io", io.ordinal());
                    tag.putInt("facing", entry.getValue().facing.ordinal());
                    tag.putString("cap", cap.name);
                    tag.putLong("pos", entry.getKey());
                    tagList.add(tag);
                }
            }
        }
        compound.put("capabilities", tagList);
    }
    return compound;
}
Also used : Table(com.google.common.collect.Table) CompoundNBT(net.minecraft.nbt.CompoundNBT) MultiblockCapability(com.lowdragmc.multiblocked.api.capability.MultiblockCapability) IO(com.lowdragmc.multiblocked.api.capability.IO) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) ListNBT(net.minecraft.nbt.ListNBT) Object2ObjectOpenHashMap(it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) Map(java.util.Map) EnumMap(java.util.EnumMap) HashMap(java.util.HashMap) CapabilityProxy(com.lowdragmc.multiblocked.api.capability.proxy.CapabilityProxy) Nonnull(javax.annotation.Nonnull)

Example 5 with IO

use of com.lowdragmc.multiblocked.api.capability.IO in project Multiblocked by Low-Drag-MC.

the class ControllerTileEntity method onStructureFormed.

/**
 * Called when its formed, server side only.
 */
public void onStructureFormed() {
    if (recipeLogic == null) {
        recipeLogic = new RecipeLogic(this);
    }
    if (status.equals("unformed")) {
        setStatus("idle");
    }
    // init capabilities
    Map<Long, EnumMap<IO, Set<MultiblockCapability<?>>>> capabilityMap = state.getMatchContext().get("capabilities");
    if (capabilityMap != null) {
        capabilities = Tables.newCustomTable(new EnumMap<>(IO.class), Object2ObjectOpenHashMap::new);
        for (Map.Entry<Long, EnumMap<IO, Set<MultiblockCapability<?>>>> entry : capabilityMap.entrySet()) {
            TileEntity tileEntity = level.getBlockEntity(BlockPos.of(entry.getKey()));
            if (tileEntity != null) {
                if (settings != null) {
                    Map<MultiblockCapability<?>, Tuple<IO, Direction>> caps = settings.get(entry.getKey());
                    if (caps != null) {
                        for (Map.Entry<MultiblockCapability<?>, Tuple<IO, Direction>> ioEntry : caps.entrySet()) {
                            MultiblockCapability<?> capability = ioEntry.getKey();
                            Tuple<IO, Direction> tuple = ioEntry.getValue();
                            if (tuple == null || capability == null)
                                continue;
                            IO io = tuple.getA();
                            Direction facing = tuple.getB();
                            if (capability.isBlockHasCapability(io, tileEntity)) {
                                if (!capabilities.contains(io, capability)) {
                                    capabilities.put(io, capability, new Long2ObjectOpenHashMap<>());
                                }
                                CapabilityProxy<?> proxy = capability.createProxy(io, tileEntity);
                                proxy.facing = facing;
                                capabilities.get(io, capability).put(entry.getKey().longValue(), proxy);
                            }
                        }
                    }
                } else {
                    entry.getValue().forEach((io, set) -> {
                        for (MultiblockCapability<?> capability : set) {
                            if (capability.isBlockHasCapability(io, tileEntity)) {
                                if (!capabilities.contains(io, capability)) {
                                    capabilities.put(io, capability, new Long2ObjectOpenHashMap<>());
                                }
                                CapabilityProxy<?> proxy = capability.createProxy(io, tileEntity);
                                capabilities.get(io, capability).put(entry.getKey().longValue(), proxy);
                            }
                        }
                    });
                }
            }
        }
    }
    settings = null;
    // init parts
    parts = state.getMatchContext().get("parts");
    if (parts != null) {
        for (Long pos : parts) {
            TileEntity tileEntity = level.getBlockEntity(BlockPos.of(pos));
            if (tileEntity instanceof IPartComponent) {
                ((IPartComponent) tileEntity).addedToController(this);
            }
        }
    }
    writeCustomData(-1, this::writeState);
    if (Multiblocked.isKubeJSLoaded()) {
        new StructureFormedEvent(this).post(ScriptType.SERVER, StructureFormedEvent.ID, getSubID());
    }
}
Also used : IPartComponent(com.lowdragmc.multiblocked.api.tile.part.IPartComponent) MultiblockCapability(com.lowdragmc.multiblocked.api.capability.MultiblockCapability) IO(com.lowdragmc.multiblocked.api.capability.IO) Direction(net.minecraft.util.Direction) TileEntity(net.minecraft.tileentity.TileEntity) RecipeLogic(com.lowdragmc.multiblocked.api.recipe.RecipeLogic) EnumMap(java.util.EnumMap) Object2ObjectOpenHashMap(it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) Map(java.util.Map) EnumMap(java.util.EnumMap) HashMap(java.util.HashMap) Tuple(net.minecraft.util.Tuple)

Aggregations

IO (com.lowdragmc.multiblocked.api.capability.IO)14 MultiblockCapability (com.lowdragmc.multiblocked.api.capability.MultiblockCapability)10 Long2ObjectOpenHashMap (it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap)7 Map (java.util.Map)6 TileEntity (net.minecraft.tileentity.TileEntity)6 Direction (net.minecraft.util.Direction)6 ArrayList (java.util.ArrayList)5 EnumMap (java.util.EnumMap)5 JsonObject (com.google.gson.JsonObject)4 WidgetGroup (com.lowdragmc.lowdraglib.gui.widget.WidgetGroup)4 CapabilityProxy (com.lowdragmc.multiblocked.api.capability.proxy.CapabilityProxy)4 HashMap (java.util.HashMap)4 List (java.util.List)4 Set (java.util.Set)4 Table (com.google.common.collect.Table)3 ColorRectTexture (com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture)3 ResourceBorderTexture (com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture)3 ResourceTexture (com.lowdragmc.lowdraglib.gui.texture.ResourceTexture)3 SelectorWidget (com.lowdragmc.lowdraglib.gui.widget.SelectorWidget)3 TextFieldWidget (com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget)3