Skip to content

Commit

Permalink
Added a way to change the icon of a function
Browse files Browse the repository at this point in the history
  • Loading branch information
XTerPL committed Nov 29, 2022
1 parent e33cda2 commit 5fedd63
Show file tree
Hide file tree
Showing 10 changed files with 256 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package io.github.techstreet.dfscript.screen.misc;

import io.github.techstreet.dfscript.DFScript;
import io.github.techstreet.dfscript.screen.CScreen;
import io.github.techstreet.dfscript.screen.script.ScriptListScreen;
import io.github.techstreet.dfscript.screen.widget.CItem;
import io.github.techstreet.dfscript.screen.widget.CScrollPanel;
import io.github.techstreet.dfscript.screen.widget.CTextField;
import io.github.techstreet.dfscript.screen.widget.CTexturedButton;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.registry.Registry;

import java.awt.*;
import java.util.Objects;
import java.util.function.Consumer;

public class ItemMaterialSelectionScreen extends CScreen {

static int WIDTH = 104;
static int HEIGHT = 100;
final CScrollPanel panel;
CItem selectedItem;
CTextField field;
final Consumer<String> save;
String current;

public ItemMaterialSelectionScreen(Consumer<String> save) {
this(save, "");
}

public ItemMaterialSelectionScreen(Consumer<String> save, String current) {
super(WIDTH, HEIGHT);

this.save = save;
this.current = current;

panel = new CScrollPanel(2,12, WIDTH-4,HEIGHT-12);
widgets.add(panel);

CTexturedButton button = new CTexturedButton(WIDTH - 10, 4, 8, 8, DFScript.MOD_ID + ":on_button.png", this::close, 0,0,1,0.5f,0,0.5f);

field = new CTextField("", 16, 4, WIDTH - 16 - 10, 8, true);
field.setChangedListener(
() -> DFScript.MC.send(this::refreshItems)
);

widgets.add(button);
widgets.add(field);

refreshItems();
}

public void refreshItems()
{
widgets.remove(selectedItem);

panel.clear();

int x = 2;
int y = 2;

for (Item item : Registry.ITEM) {
if(Objects.equals(item, Items.AIR)) {
continue;
}

String name = String.valueOf(item.getName());

if(current.equals(item.toString())) {
selectedItem = new CItem(4, 4, new ItemStack(item));
widgets.add(selectedItem);
}

if(!name.contains(field.getText())) {
continue;
}

ItemStack itemStack = new ItemStack(item);

CItem citem;

if(current.equals(item.toString())) {
citem = new CItem(x, y, itemStack) {
@Override
public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
super.render(stack, mouseX, mouseY, tickDelta);
Rectangle b = getBounds();
DrawableHelper.fill(stack, b.x, b.y, b.x + b.width, b.y + b.height, 0x3300ff00);
}
};
} else {
citem = new CItem(x, y, itemStack);
}

citem.setClickListener((mouse) -> {
current = item.toString();
refreshItems();
});

panel.add(citem);

x += 10;
if(x >= WIDTH-4) {
y += 10;
x = 2;
}
}
}

@Override
public void close() {
save.accept(current);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,28 @@

import io.github.techstreet.dfscript.DFScript;
import io.github.techstreet.dfscript.screen.CScreen;
import io.github.techstreet.dfscript.screen.widget.CText;
import io.github.techstreet.dfscript.screen.misc.ItemMaterialSelectionScreen;
import io.github.techstreet.dfscript.screen.widget.CItem;
import io.github.techstreet.dfscript.screen.widget.CTextField;
import io.github.techstreet.dfscript.script.Script;
import io.github.techstreet.dfscript.script.ScriptPart;
import io.github.techstreet.dfscript.script.function.ScriptFunction;

import java.util.List;
import java.util.Objects;

public class ScriptEditFunctionScreen extends CScreen {
private final Script script;
private final ScriptFunction function;

CItem functionIcon;

public ScriptEditFunctionScreen(Script script, ScriptFunction function) {
super(90, 100);
this.script = script;
this.function = function;

CTextField nameField = new CTextField(function.getFunctionName(), 5, 5, 80, 20, true);
CTextField nameField = new CTextField(function.getFunctionName(), 15, 5, 70, 20, true);
nameField.setChangedListener(() -> {
for (ScriptPart part : script.getParts()) {
if(part instanceof ScriptFunction f) {
Expand All @@ -44,6 +48,25 @@ public ScriptEditFunctionScreen(Script script, ScriptFunction function) {
});

widgets.add(nameField);

refresh();
}

public void refresh() {
widgets.remove(functionIcon);

functionIcon = new CItem(5,5, function.getFullIcon());
functionIcon.setClickListener((mouse) -> {
DFScript.MC.setScreen(new ItemMaterialSelectionScreen(
(mat) -> {
function.setIcon(mat);
DFScript.MC.setScreen(new ScriptEditFunctionScreen(script, function));
},
function.getIcon()
));
});

widgets.add(functionIcon);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
(int) (end.getY() - begin.getY())*guiScale
);

if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE;
if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE;

if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE;
if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE;

for (CWidget child : children) {
child.render(stack, mouseX, mouseY, tickDelta);
}
Expand All @@ -48,6 +54,10 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {

@Override
public boolean mouseClicked(double x, double y, int button) {
if(!getBounds().contains(x, y)) {
return false;
}

for (int i = children.size() - 1; i >= 0; i--) {
if (children.get(i).mouseClicked(x, y, button)) {
return true;
Expand All @@ -72,6 +82,10 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) {

@Override
public void mouseScrolled(double mouseX, double mouseY, double amount) {
if(!getBounds().contains(mouseX, mouseY)) {
return;
}

for (CWidget child : children) {
child.mouseScrolled(mouseX, mouseY, amount);
}
Expand All @@ -93,6 +107,12 @@ public void add(CWidget child) {

@Override
public void renderOverlay(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE;
if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE;

if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE;
if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE;

stack.push();
stack.translate(x, y, 0);
for (CWidget child : children) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
stack.push();
stack.translate(x, y, 0);

if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE;
if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE;

if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE;
if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE;

mouseX -= x;
mouseY -= y;

Expand Down Expand Up @@ -55,6 +61,10 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {

@Override
public boolean mouseClicked(double x, double y, int button) {
if(!getBounds().contains(x, y)) {
return false;
}

y -= scroll;
x -= this.x;
y -= this.y;
Expand Down Expand Up @@ -82,6 +92,10 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) {

@Override
public void mouseScrolled(double mouseX, double mouseY, double amount) {
if(!getBounds().contains(mouseX, mouseY)) {
return;
}

mouseX -= x;
mouseY -= y;
for (CWidget child : children) {
Expand Down Expand Up @@ -115,6 +129,12 @@ public void add(CWidget child) {

@Override
public void renderOverlay(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE;
if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE;

if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE;
if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE;

mouseY -= scroll;

mouseX -= x;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import net.minecraft.client.util.math.MatrixStack;

public interface CWidget {

int MOUSE_DISABLE = -100000000;
void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta);

default boolean mouseClicked(double x, double y, int button) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,8 @@ private void updateScriptReferences() {
for(ScriptPart part : getParts()) {
if(part instanceof ScriptAction a) {
a.updateScriptReferences(this);
} else if (part instanceof ScriptCallFunction f) {
f.setScript(this);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,16 @@ public ScriptPart deserialize(JsonElement json, Type typeOfT, JsonDeserializatio
}
case "function" -> {
String name = obj.get("function").getAsString();
return new ScriptFunction(name);
String icon = obj.has("icon") ? obj.get("icon").getAsString() : "lapis_lazuli";
return new ScriptFunction(name, icon);
}
case "callFunction" -> {
String name = obj.get("function").getAsString();
List<ScriptArgument> args = new ArrayList<>();
for (JsonElement arg : obj.get("arguments").getAsJsonArray()) {
args.add(context.deserialize(arg, ScriptArgument.class));
}
return new ScriptCallFunction(name, args);
return new ScriptCallFunction(name, args, null);
}
default -> throw new JsonParseException("Unknown script part type: " + type);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public enum ScriptActionCategory {

ItemStack icon = new ItemStack(Items.LAPIS_LAZULI);
icon.setCustomName(Text.literal(func.getFunctionName()).setStyle(Style.EMPTY.withItalic(false)));
extras.add(new ScriptActionCategoryExtra(icon, (Void) -> new ScriptCallFunction(funcName, new ArrayList<>())));
extras.add(new ScriptActionCategoryExtra(icon, (Void) -> new ScriptCallFunction(funcName, new ArrayList<>(), script)));
}

return extras;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,13 @@
import io.github.techstreet.dfscript.script.execution.ScriptTask;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.NbtList;
import net.minecraft.nbt.NbtString;
import net.minecraft.text.Style;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;

import java.lang.reflect.Type;
import java.util.HashMap;
Expand All @@ -26,10 +31,12 @@

public class ScriptCallFunction extends ScriptRunnablePart {
String function;
transient Script script;

public ScriptCallFunction(String function, List<ScriptArgument> arguments) {
public ScriptCallFunction(String function, List<ScriptArgument> arguments, Script script) {
super(arguments);
this.function = function;
this.script = script;
}

public String getFunctionName() {
Expand All @@ -54,9 +61,39 @@ public void invoke(Event event, ScriptContext context, Consumer<ScriptScopeVaria

@Override
public ItemStack getIcon() {
ItemStack icon = new ItemStack(Items.LAPIS_LAZULI);
icon.setCustomName(Text.literal(getFunctionName()).setStyle(Style.EMPTY.withItalic(false)));
return icon;
ScriptFunction func = getFunction();

if(func == null) {
ItemStack icon = new ItemStack(Items.RED_DYE);
icon.setCustomName(Text.literal(getFunctionName()).setStyle(Style.EMPTY.withItalic(false)));
NbtList lore = new NbtList();

lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("Missing Function Definition")
.fillStyle(Style.EMPTY
.withColor(Formatting.RED)
.withItalic(false)))));

icon.getSubNbt("display")
.put("Lore", lore);

return icon;
}

return func.getFullIcon();
}

public ScriptFunction getFunction() {
if(getScript().getFunctions().containsKey(function))
return getScript().getFunctions().get(function);
return null;
}

public Script getScript() {
return script;
}

public void setScript(Script script) {
this.script = script;
}

@Override
Expand Down
Loading

0 comments on commit 5fedd63

Please sign in to comment.