forked from Clones/Controlify
➕ Add radial icons to the public-facing API
This commit is contained in:
@ -55,6 +55,15 @@ public interface ControlifyBindingsApi {
|
||||
*/
|
||||
void excludeVanillaBind(KeyMapping... keyMapping);
|
||||
|
||||
/**
|
||||
* Registers a radial icon to be used in the radial menu.
|
||||
* The identifier should be passed to {@link ControllerBindingBuilder#radialCandidate(ResourceLocation)}.
|
||||
*
|
||||
* @param id the identifier for the icon, the namespace should be your modid.
|
||||
* @param icon the renderer for the icon.
|
||||
*/
|
||||
void registerRadialIcon(ResourceLocation id, RadialIcon icon);
|
||||
|
||||
static ControlifyBindingsApi get() {
|
||||
return ControllerBindings.Api.INSTANCE;
|
||||
}
|
||||
|
@ -0,0 +1,8 @@
|
||||
package dev.isxander.controlify.api.bind;
|
||||
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface RadialIcon {
|
||||
void draw(GuiGraphics graphics, int x, int y, float tickDelta);
|
||||
}
|
@ -5,6 +5,7 @@ import dev.isxander.controlify.Controlify;
|
||||
import dev.isxander.controlify.api.bind.ControlifyBindingsApi;
|
||||
import dev.isxander.controlify.api.bind.ControllerBinding;
|
||||
import dev.isxander.controlify.api.bind.ControllerBindingBuilder;
|
||||
import dev.isxander.controlify.api.bind.RadialIcon;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.controller.ControllerState;
|
||||
import dev.isxander.controlify.api.event.ControlifyEvents;
|
||||
@ -616,5 +617,10 @@ public class ControllerBindings<T extends ControllerState> {
|
||||
public void excludeVanillaBind(KeyMapping... keyMappings) {
|
||||
EXCLUDED_VANILLA_BINDS.addAll(Arrays.asList(keyMappings));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerRadialIcon(ResourceLocation id, RadialIcon icon) {
|
||||
RadialIcons.registerIcon(id, icon);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
package dev.isxander.controlify.bindings;
|
||||
|
||||
import dev.isxander.controlify.api.bind.RadialIcon;
|
||||
import net.minecraft.Util;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.client.resources.MobEffectTextureManager;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
@ -21,11 +21,11 @@ public final class RadialIcons {
|
||||
public static final ResourceLocation EMPTY = new ResourceLocation("controlify", "empty");
|
||||
public static final ResourceLocation FABRIC_ICON = new ResourceLocation("fabric-resource-loader-v0", "icon.png");
|
||||
|
||||
private static final Map<ResourceLocation, Icon> icons = Util.make(() -> {
|
||||
Map<ResourceLocation, Icon> map = new HashMap<>();
|
||||
private static final Map<ResourceLocation, RadialIcon> icons = Util.make(() -> {
|
||||
Map<ResourceLocation, RadialIcon> map = new HashMap<>();
|
||||
|
||||
map.put(EMPTY, (graphics, x, y) -> {});
|
||||
map.put(FABRIC_ICON, (graphics, x, y) -> {
|
||||
map.put(EMPTY, (graphics, x, y, tickDelta) -> {});
|
||||
map.put(FABRIC_ICON, (graphics, x, y, tickDelta) -> {
|
||||
graphics.pose().pushPose();
|
||||
graphics.pose().translate(x, y, 0);
|
||||
graphics.pose().scale(0.5f, 0.5f, 1f);
|
||||
@ -38,10 +38,14 @@ public final class RadialIcons {
|
||||
return map;
|
||||
});
|
||||
|
||||
public static Map<ResourceLocation, Icon> getIcons() {
|
||||
public static Map<ResourceLocation, RadialIcon> getIcons() {
|
||||
return icons;
|
||||
}
|
||||
|
||||
public static void registerIcon(ResourceLocation location, RadialIcon icon) {
|
||||
icons.put(location, icon);
|
||||
}
|
||||
|
||||
public static ResourceLocation getItem(Item item) {
|
||||
return prefixLocation("item", BuiltInRegistries.ITEM.getKey(item));
|
||||
}
|
||||
@ -50,18 +54,18 @@ public final class RadialIcons {
|
||||
return prefixLocation("effect", BuiltInRegistries.MOB_EFFECT.getKey(effect));
|
||||
}
|
||||
|
||||
private static void addItems(Map<ResourceLocation, Icon> map) {
|
||||
private static void addItems(Map<ResourceLocation, RadialIcon> map) {
|
||||
BuiltInRegistries.ITEM.entrySet().forEach(entry -> {
|
||||
ResourceKey<Item> key = entry.getKey();
|
||||
ItemStack stack = entry.getValue().getDefaultInstance();
|
||||
|
||||
map.put(prefixLocation("item", key.location()), (graphics, x, y) -> {
|
||||
map.put(prefixLocation("item", key.location()), (graphics, x, y, tickDelta) -> {
|
||||
graphics.renderItem(stack, x, y);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private static void addPotionEffects(Map<ResourceLocation, Icon> map) {
|
||||
private static void addPotionEffects(Map<ResourceLocation, RadialIcon> map) {
|
||||
MobEffectTextureManager mobEffectTextureManager = minecraft.getMobEffectTextures();
|
||||
|
||||
BuiltInRegistries.MOB_EFFECT.entrySet().forEach(entry -> {
|
||||
@ -69,7 +73,7 @@ public final class RadialIcons {
|
||||
MobEffect effect = entry.getValue();
|
||||
|
||||
TextureAtlasSprite sprite = mobEffectTextureManager.get(effect);
|
||||
map.put(prefixLocation("effect", key.location()), (graphics, x, y) -> {
|
||||
map.put(prefixLocation("effect", key.location()), (graphics, x, y, tickDelta) -> {
|
||||
graphics.pose().pushPose();
|
||||
graphics.pose().translate(x, y, 0);
|
||||
graphics.pose().scale(0.88f, 0.88f, 1f);
|
||||
@ -84,9 +88,4 @@ public final class RadialIcons {
|
||||
private static ResourceLocation prefixLocation(String prefix, ResourceLocation location) {
|
||||
return new ResourceLocation(location.getNamespace(), prefix + "/" + location.getPath());
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface Icon {
|
||||
void draw(GuiGraphics graphics, int x, int y);
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package dev.isxander.controlify.gui.screen;
|
||||
import dev.isxander.controlify.Controlify;
|
||||
import dev.isxander.controlify.api.bind.BindRenderer;
|
||||
import dev.isxander.controlify.api.bind.ControllerBinding;
|
||||
import dev.isxander.controlify.api.bind.RadialIcon;
|
||||
import dev.isxander.controlify.bindings.RadialIcons;
|
||||
import dev.isxander.controlify.controller.Controller;
|
||||
import dev.isxander.controlify.gui.guide.GuideAction;
|
||||
@ -213,7 +214,7 @@ public class RadialMenuScreen extends Screen implements ScreenControllerEventLis
|
||||
private boolean focused;
|
||||
private ControllerBinding binding;
|
||||
private MultiLineLabel name;
|
||||
private RadialIcons.Icon icon;
|
||||
private RadialIcon icon;
|
||||
|
||||
private RadialButton(int index, float x, float y) {
|
||||
this.setX(x);
|
||||
@ -236,7 +237,7 @@ public class RadialMenuScreen extends Screen implements ScreenControllerEventLis
|
||||
graphics.pose().pushPose();
|
||||
graphics.pose().translate(4, 4, 0);
|
||||
graphics.pose().scale(1.5f, 1.5f, 1);
|
||||
this.icon.draw(graphics, 0, 0);
|
||||
this.icon.draw(graphics, 0, 0, delta);
|
||||
graphics.pose().popPose();
|
||||
} else {
|
||||
BindRenderer renderer = controller.bindings().GUI_PRESS.renderer();
|
||||
|
Reference in New Issue
Block a user