Skip to content

Commit

Permalink
Added support for custom model data.
Browse files Browse the repository at this point in the history
  • Loading branch information
ImCodist committed Nov 3, 2023
1 parent 9de4c17 commit 3911a6a
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 4 deletions.
13 changes: 12 additions & 1 deletion src/main/java/xyz/imcodist/data/ActionButtonData.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package xyz.imcodist.data;

import io.wispforest.owo.nbt.NbtKey;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.util.InputUtil;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.registry.Registries;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
Expand Down Expand Up @@ -42,6 +44,8 @@ public ActionButtonDataJSON toJSON() {
if (icon.getRegistryEntry().getKey().isPresent()) {
jsonData.icon = icon.getRegistryEntry().getKey().get().getValue().toString();
}

jsonData.customModelData = icon.getOr(new NbtKey<>("CustomModelData", NbtKey.Type.INT), null);
}

return jsonData;
Expand All @@ -60,7 +64,14 @@ public static ActionButtonData fromJSON(ActionButtonDataJSON json) {
data.actions.add(actionData);
});

if (json.icon != null) data.icon = new ItemStack(Registries.ITEM.get(new Identifier(json.icon)));
if (json.icon != null) {
data.icon = new ItemStack(Registries.ITEM.get(new Identifier(json.icon)));

try {
NbtCompound nbt = data.icon.getOrCreateNbt();
nbt.putInt("CustomModelData", json.customModelData);
} catch (NumberFormatException ignored) {}
}

return data;
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/xyz/imcodist/data/ActionButtonDataJSON.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ public class ActionButtonDataJSON {
public String name;
public ArrayList<ArrayList<String>> actions;
public String icon;
public int customModelData;
public ArrayList<Integer> keybind = new ArrayList<>();
}
58 changes: 55 additions & 3 deletions src/main/java/xyz/imcodist/ui/ActionEditorUI.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package xyz.imcodist.ui;

import io.wispforest.owo.nbt.NbtKey;
import io.wispforest.owo.ui.base.BaseOwoScreen;
import io.wispforest.owo.ui.component.ButtonComponent;
import io.wispforest.owo.ui.component.Components;
Expand All @@ -12,6 +13,8 @@
import io.wispforest.owo.ui.core.*;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.util.InputUtil;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
Expand Down Expand Up @@ -41,6 +44,7 @@ public class ActionEditorUI extends BaseOwoScreen<FlowLayout> {

private OverlayContainer<FlowLayout> pickerUI;

private TextBoxComponent customModelDataTextBox;
private ButtonComponent keybindButton;
private boolean settingKeybind = false;
private boolean boundKeybind = false;
Expand Down Expand Up @@ -114,11 +118,15 @@ protected void build(FlowLayout rootComponent) {
QuickMenuButton quickMenuButton = (QuickMenuButton) buttonComponent;

ItemPickerUI itemPicker = new ItemPickerUI();

itemPicker.selectedItem = quickMenuButton.itemIcon;
itemPicker.customModelData = getCustomModelData(quickMenuButton.itemIcon);

quickMenuButton.itemIcon = null;

itemPicker.onSelectedItem = (item) -> quickMenuButton.itemIcon = item;
itemPicker.onSelectedItem = (item) -> {
quickMenuButton.itemIcon = item;
updateCustomModelData(quickMenuButton.itemIcon);
};

rootComponent.child(itemPicker);
pickerUI = itemPicker;
Expand All @@ -137,7 +145,6 @@ protected void build(FlowLayout rootComponent) {
.verticalAlignment(VerticalAlignment.CENTER);

FlowLayout keybindProperty = createNewProperty("keybind", false);
keybindProperty.padding(keybindProperty.padding().get().add(0, 6, 0, 0));
advancedLayout.child(keybindProperty);

keybindButton = Components.button(Text.translatable("menu.editor.not_bound"), (buttonComponent) -> {
Expand All @@ -149,8 +156,27 @@ protected void build(FlowLayout rootComponent) {

updateKeybindButton();

FlowLayout customModelDataProperty = createNewProperty("custommodeldata", false);
advancedLayout.child(customModelDataProperty);

Integer customModelData = getCustomModelData(iconButton.itemIcon);
String cmdText = customModelData != null ? customModelData.toString() : "";

customModelDataTextBox = Components.textBox(Sizing.fixed(75), cmdText);
customModelDataTextBox.cursorStyle(CursorStyle.TEXT);

customModelDataTextBox.onChanged().subscribe((text) -> {
customModelDataTextBox.setText(text.replaceAll("^0+|\\D", ""));
updateCustomModelData(iconButton.itemIcon);
});

customModelDataProperty.child(customModelDataTextBox);

propertiesLayout.child(advancedLayout);

// Add padding to the last property in the advanced layout.
customModelDataProperty.padding(customModelDataProperty.padding().get().add(0, 6, 0, 0));

// Set up the editor buttons.
FlowLayout buttonsLayout = Containers.horizontalFlow(Sizing.content(), Sizing.content());
buttonsLayout
Expand Down Expand Up @@ -188,6 +214,32 @@ protected void build(FlowLayout rootComponent) {
buttonsLayout.child(cancelButton);
}

private Integer getCustomModelData(ItemStack item) {
Integer existingCustomModelData = null;
if (item != null) {
existingCustomModelData = item.getOr(new NbtKey<>("CustomModelData", NbtKey.Type.INT), null);
}

return existingCustomModelData;
}

private void updateCustomModelData(ItemStack itemStack) {
// updates the items custom model data to that of the users input.
String text = customModelDataTextBox.getText();

if (itemStack == null) return;

try {
NbtCompound nbt = itemStack.getOrCreateNbt();

if (!text.equals("")) {
nbt.putInt("CustomModelData", Integer.parseInt(text));
} else {
nbt.remove("CustomModelData");
}
} catch (NumberFormatException ignored) {}
}

public FlowLayout createNewProperty(String name) {
return createNewProperty(name, true, true);
}
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/xyz/imcodist/ui/popups/ItemPickerUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import io.wispforest.owo.ui.core.*;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.registry.Registries;
import net.minecraft.util.Identifier;
import xyz.imcodist.ui.components.QuickMenuButton;
Expand All @@ -22,6 +23,8 @@

public class ItemPickerUI extends OverlayContainer<FlowLayout> {
public ItemStack selectedItem;
public Integer customModelData;

public Consumer<ItemStack> onSelectedItem;

public ItemPickerUI() {
Expand Down Expand Up @@ -99,6 +102,13 @@ public void createItemButtons(FlowLayout parent, String search) {

ItemStack item = items.get(curItem).getDefaultStack();

if (customModelData != null) {
try {
NbtCompound nbt = item.getOrCreateNbt();
nbt.putInt("CustomModelData", customModelData);
} catch (NumberFormatException ignored) {}
}

ButtonComponent button = new QuickMenuButton(item, (buttonComponent) -> {
// On Left Click.
selectedItem = item;
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/assets/quickmenu/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"menu.editor.property.name": "Name",
"menu.editor.property.icon": "Icon",
"menu.editor.property.keybind": "Keybind",
"menu.editor.property.custommodeldata": "Custom Model Data",
"menu.editor.property.new_action": "New Action",


Expand Down

0 comments on commit 3911a6a

Please sign in to comment.