Sfoglia il codice sorgente

Add search box to right part. V 1.2 but not releasable yet.

Guntram Blohm 4 anni fa
parent
commit
cdbd41db0c

+ 1 - 1
build.gradle

@@ -18,7 +18,7 @@ ext.Versions = new Properties()
 Versions.load(file("Versionfiles/mcversion-1.16.2.properties").newReader())
 
 archivesBaseName = "advancementinfo"
-ext.projectVersion = "1.1.1"
+ext.projectVersion = "1.2"
 
 version = "${Versions['minecraft_version']}-fabric${Versions['fabric_versiononly']}-${project.projectVersion}"
 

+ 47 - 0
src/main/java/de/guntram/mcmod/advancementinfo/AdvancementInfo.java

@@ -3,15 +3,21 @@ package de.guntram.mcmod.advancementinfo;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import de.guntram.mcmod.advancementinfo.accessors.AdvancementProgressAccessor;
+import de.guntram.mcmod.advancementinfo.accessors.AdvancementScreenAccessor;
 import de.guntram.mcmod.advancementinfo.accessors.AdvancementWidgetAccessor;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import net.fabricmc.api.ClientModInitializer;
+import net.minecraft.advancement.Advancement;
 import net.minecraft.advancement.AdvancementProgress;
 import net.minecraft.advancement.criterion.CriterionConditions;
+import net.minecraft.client.gui.screen.advancement.AdvancementTab;
 import net.minecraft.client.gui.screen.advancement.AdvancementWidget;
+import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
+import net.minecraft.client.network.ClientAdvancementManager;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.predicate.entity.AdvancementEntityPredicateSerializer;
 
@@ -26,6 +32,7 @@ public class AdvancementInfo implements ClientModInitializer
     
     static public AdvancementWidget mouseOver, mouseClicked;
     static public List<AdvancementStep> cachedClickList;
+    static public int cachedClickListLineCount;
     public static boolean showAll;
 
     public static List<AdvancementStep> getSteps(AdvancementWidgetAccessor widget) {
@@ -84,6 +91,46 @@ public class AdvancementInfo implements ClientModInitializer
         }
     }
 
+    public static void setMatchingFrom(AdvancementsScreen screen, String text) {
+        List<AdvancementStep> result = new ArrayList<>();
+        ClientAdvancementManager advancementHandler = ((AdvancementScreenAccessor)screen).getAdvancementHandler();
+        Collection<Advancement> all = advancementHandler.getManager().getAdvancements();
+        int lineCount = 0;
+        
+        text = text.toLowerCase();
+        for (Advancement adv: all) {
+            System.out.println("handling "+adv.getId().toString());
+            if (adv.getDisplay() == null) {
+                System.out.println("has no display");
+                continue;
+            }
+            if (adv.getDisplay().getTitle() == null) {
+                System.out.println("has no title");
+                continue;
+            }
+            if (adv.getDisplay().getDescription() == null) {
+                System.out.println("has no description");
+                continue;
+            }
+            String title = adv.getDisplay().getTitle().getString();
+            String desc  = adv.getDisplay().getDescription().getString();
+            System.out.println(title+": "+desc);
+            if (title.toLowerCase().contains(text)
+            ||  desc.toLowerCase().contains(text)) {
+                ArrayList<String> details = new ArrayList<>();
+                details.add(desc);
+                AdvancementTab tab = ((AdvancementScreenAccessor)screen).myGetTab(adv);
+                details.add(tab.getTitle().getString());
+                boolean done = ((AdvancementWidgetAccessor)(screen.getAdvancementWidget(adv))).getProgress().isDone();
+                result.add(new AdvancementStep(title, done, details));
+                lineCount+=3;
+            }
+        }
+        cachedClickList = result;
+        cachedClickListLineCount = lineCount;
+        mouseOver = null;
+    }
+
     @Override
     public void onInitializeClient()
     {

+ 19 - 0
src/main/java/de/guntram/mcmod/advancementinfo/accessors/AdvancementScreenAccessor.java

@@ -0,0 +1,19 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package de.guntram.mcmod.advancementinfo.accessors;
+
+import net.minecraft.advancement.Advancement;
+import net.minecraft.client.gui.screen.advancement.AdvancementTab;
+import net.minecraft.client.network.ClientAdvancementManager;
+
+/**
+ *
+ * @author gbl
+ */
+public interface AdvancementScreenAccessor {
+        public ClientAdvancementManager getAdvancementHandler();
+        public AdvancementTab myGetTab(Advancement advancement);
+}

+ 90 - 21
src/main/java/de/guntram/mcmod/advancementinfo/mixin/AdvancementScreenMixin.java

@@ -10,15 +10,23 @@ import static de.guntram.mcmod.advancementinfo.AdvancementInfo.AI_spaceX;
 import static de.guntram.mcmod.advancementinfo.AdvancementInfo.AI_spaceY;
 import de.guntram.mcmod.advancementinfo.AdvancementStep;
 import de.guntram.mcmod.advancementinfo.IteratorReceiver;
+import de.guntram.mcmod.advancementinfo.accessors.AdvancementScreenAccessor;
 import de.guntram.mcmod.advancementinfo.accessors.AdvancementWidgetAccessor;
 import java.util.List;
 import net.minecraft.advancement.Advancement;
 import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.screen.advancement.AdvancementTab;
 import net.minecraft.client.gui.screen.advancement.AdvancementWidget;
 import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
+import net.minecraft.client.gui.widget.TextFieldWidget;
+import net.minecraft.client.network.ClientAdvancementManager;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.text.LiteralText;
+import org.lwjgl.glfw.GLFW;
+import org.spongepowered.asm.mixin.Final;
 import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Constant;
 import org.spongepowered.asm.mixin.injection.Inject;
@@ -31,11 +39,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
  * @author gbl
  */
 @Mixin(AdvancementsScreen.class)
-public class AdvancementScreenMixin extends Screen {
+public abstract class AdvancementScreenMixin extends Screen implements AdvancementScreenAccessor {
     
     public AdvancementScreenMixin() { super(null); }
     
     private int scrollPos;
+    private TextFieldWidget search;
+    @Shadow @Final private ClientAdvancementManager advancementHandler;
+    @Shadow abstract AdvancementTab getTab(Advancement advancement);
     
     @ModifyConstant(method="render", constant=@Constant(intValue = 252), require=1)
     private int getRenderLeft(int orig) { return width - AI_spaceX*2; }
@@ -64,6 +75,12 @@ public class AdvancementScreenMixin extends Screen {
     private int getWidgetsTop(int orig) // { return height - AI_spaceY*2; }
     { return 70; }
     
+    @Inject(method="init", at=@At("RETURN"))
+    private void initSeachField(CallbackInfo ci) {
+        this.search = new TextFieldWidget(textRenderer, width-AI_spaceX-AdvancementInfo.AI_infoWidth+10, AI_spaceY+20, AdvancementInfo.AI_infoWidth-20, 18, new LiteralText(""));
+    }
+
+    
     @Inject(method="render",
             at=@At(value="INVOKE",
                     target="net/minecraft/client/gui/screen/advancement/AdvancementsScreen.drawWidgets(Lnet/minecraft/client/util/math/MatrixStack;II)V"))
@@ -112,22 +129,33 @@ public class AdvancementScreenMixin extends Screen {
     @Inject(method="drawWidgets", at=@At("RETURN"))
     public void renderRightFrameTitle(MatrixStack stack, int x, int y, CallbackInfo ci) {
         textRenderer.draw(stack, I18n.translate("advancementinfo.infopane"), width-AI_spaceX-AdvancementInfo.AI_infoWidth+8, y+6, 4210752);
+        search.renderButton(stack, x, y, 0);
 
         if (AdvancementInfo.mouseClicked != null) {
             renderCriteria(stack, AdvancementInfo.mouseClicked);
-        } else if (AdvancementInfo.mouseOver != null) {
+        } else if (AdvancementInfo.mouseOver != null || AdvancementInfo.cachedClickList != null) {
             renderCriteria(stack, AdvancementInfo.mouseOver);                    
         }
     }
     
-    @Inject(method="mouseClicked", at=@At("HEAD"))
+    @Inject(method="mouseClicked", at=@At("HEAD"), cancellable = true)
     public void rememberClickedWidget(double x, double y, int button, CallbackInfoReturnable cir) {
+        if (search.mouseClicked(x, y, button)) {
+            cir.setReturnValue(true);
+            cir.cancel();
+        }
+        if (x >= width - AI_spaceX - AdvancementInfo.AI_infoWidth) {
+            // later: handle click on search results here
+            return;
+        }
         AdvancementInfo.mouseClicked = AdvancementInfo.mouseOver;
         scrollPos = 0;
         if (AdvancementInfo.mouseClicked != null) {
             AdvancementInfo.cachedClickList = AdvancementInfo.getSteps((AdvancementWidgetAccessor) AdvancementInfo.mouseClicked);
+            AdvancementInfo.cachedClickListLineCount = AdvancementInfo.cachedClickList.size();
         } else {
             AdvancementInfo.cachedClickList = null;
+            AdvancementInfo.cachedClickListLineCount = 0;
         }
     }
     
@@ -142,14 +170,39 @@ public class AdvancementScreenMixin extends Screen {
         if (amount > 0 && scrollPos > 0) {
             scrollPos--;
         } else if (amount < 0 && AdvancementInfo.cachedClickList != null 
-                && scrollPos < AdvancementInfo.cachedClickList.size() - (height-2*AI_spaceY)/textRenderer.fontHeight + 5) {
+                && scrollPos < AdvancementInfo.cachedClickListLineCount - ((height-2*AI_spaceY-45)/textRenderer.fontHeight - 1)) {
             scrollPos++;
         }
+        System.out.println("scrollpos is now "+scrollPos+", needed lines "+AdvancementInfo.cachedClickListLineCount+", shown "+((height-2*AI_spaceY-45)/textRenderer.fontHeight - 1));
         return false;
     }
+
+    @Inject(method="keyPressed", at=@At("HEAD"), cancellable = true)
+    public void redirectKeysToSearch(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) {
+        if (search.isActive()) {
+            if (keyCode == GLFW.GLFW_KEY_ENTER) {
+                System.out.println("now");
+                AdvancementInfo.setMatchingFrom((AdvancementsScreen)(Object)this, search.getText());
+                cir.setReturnValue(true);
+                cir.cancel();
+            }
+            if (search.keyPressed(keyCode, scanCode, modifiers)) {
+                cir.setReturnValue(true);
+                cir.cancel();
+            }
+        }
+    }
     
+    @Override
+    public boolean charTyped(char chr, int keyCode) {
+        if (search.isActive()) {
+            return search.charTyped(chr, keyCode);
+        }
+        return false;
+    }
+
     private void renderCriteria(MatrixStack stack, AdvancementWidget widget) {
-        int y = AI_spaceY + 20;
+        int y = AI_spaceY + 20 + 25;
         int skip;
         List<AdvancementStep> list;
         if (widget == AdvancementInfo.mouseClicked) {
@@ -159,28 +212,44 @@ public class AdvancementScreenMixin extends Screen {
             list = AdvancementInfo.getSteps((AdvancementWidgetAccessor) widget);
             skip = 0;
         }
+        if (list == null) {
+            return;
+        }
         for (AdvancementStep entry: list) {
-            if (skip-- > 0) {
-                continue;
-            }
-            textRenderer.draw(stack, 
-                    textRenderer.trimToWidth(entry.getName(), AdvancementInfo.AI_infoWidth-24),
-                    width-AI_spaceX-AdvancementInfo.AI_infoWidth+12, y, 
-                    entry.getObtained() ? 0x00ff00 : 0xff0000);
-            y+=textRenderer.fontHeight;
-            if (y > height - AI_spaceY - textRenderer.fontHeight) {
-                break;
+            if (skip-- <= 0) {
+                textRenderer.draw(stack, 
+                        textRenderer.trimToWidth(entry.getName(), AdvancementInfo.AI_infoWidth-24),
+                        width-AI_spaceX-AdvancementInfo.AI_infoWidth+12, y, 
+                        entry.getObtained() ? 0x00ff00 : 0xff0000);
+                y+=textRenderer.fontHeight;
+                if (y > height - AI_spaceY - textRenderer.fontHeight*2) {
+                    return;
+                }
             }
             
-            if (list.size() == 1 && entry.getDetails() != null) {
+            if (entry.getDetails() != null) {
                 for (String detail: entry.getDetails()) {
-                    textRenderer.draw(stack, 
-                            textRenderer.trimToWidth(detail, AdvancementInfo.AI_infoWidth-34),
-                            width-AI_spaceX-AdvancementInfo.AI_infoWidth+22, y, 
-                            0x000000);
-                    y+=textRenderer.fontHeight;
+                    if (skip-- <= 0) {
+                        textRenderer.draw(stack, 
+                                textRenderer.trimToWidth(detail, AdvancementInfo.AI_infoWidth-34),
+                                width-AI_spaceX-AdvancementInfo.AI_infoWidth+22, y, 
+                                0x000000);
+                        y+=textRenderer.fontHeight;
+                        if (y > height - AI_spaceY - textRenderer.fontHeight*2) {
+                            return;
+                        }
+                    }
                 }
             }
         }
     }
+    
+    @Override
+    public ClientAdvancementManager getAdvancementHandler() {
+        return advancementHandler;
+    }
+    
+    public AdvancementTab myGetTab(Advancement advancement) {
+        return getTab(advancement);
+    }
 }