Эх сурвалжийг харах

Improve display for "tame cats" and "have effects"

Guntram Blohm 4 жил өмнө
parent
commit
63e1c4e2d1

+ 43 - 17
src/main/java/de/guntram/mcmod/advancementinfo/AdvancementInfo.java

@@ -1,14 +1,19 @@
 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.AdvancementWidgetAccessor;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import net.fabricmc.api.ClientModInitializer;
+import net.minecraft.advancement.AdvancementProgress;
+import net.minecraft.advancement.criterion.CriterionConditions;
 import net.minecraft.client.gui.screen.advancement.AdvancementWidget;
 import net.minecraft.client.resource.language.I18n;
-import net.minecraft.text.LiteralText;
-import net.minecraft.text.Text;
-import net.minecraft.text.TranslatableText;
+import net.minecraft.predicate.entity.AdvancementEntityPredicateSerializer;
 
 public class AdvancementInfo implements ClientModInitializer
 {
@@ -21,44 +26,65 @@ public class AdvancementInfo implements ClientModInitializer
     
     static public AdvancementWidget mouseOver, mouseClicked;
     static public List<AdvancementStep> cachedClickList;
+    public static boolean showAll;
 
-    public static List<AdvancementStep> getSteps(AdvancementProgressSupplier widget) {
+    public static List<AdvancementStep> getSteps(AdvancementWidgetAccessor widget) {
         List<AdvancementStep> result = new ArrayList<>();
-        addStep(result, widget.getProgress().getUnobtainedCriteria(), false);
-        addStep(result, widget.getProgress().getObtainedCriteria(), true);
+        addStep(result, widget.getProgress(), widget.getProgress().getUnobtainedCriteria(), false);
+        addStep(result, widget.getProgress(), widget.getProgress().getObtainedCriteria(), true);
         return result;        
     }
     
-    private static void addStep(List<AdvancementStep> result, Iterable<String> criteria, boolean obtained) {
+    private static void addStep(List<AdvancementStep> result, AdvancementProgress progress, Iterable<String> criteria, boolean obtained) {
         final String[] prefixes = new String[] { "item.minecraft", "block.minecraft", "entity.minecraft", "container", "effect.minecraft", "biome.minecraft" };
         // criteria is actually a List<> .. but play nice
         ArrayList<String> sorted=new ArrayList<>();
         for (String s:criteria) {
             sorted.add(s);
-        } 
+        }
+        ArrayList<String> details = null;
         Collections.sort(sorted);
         for (String s: sorted) {
-            Text translation = null;
+            String translation = null;
             String key = s;
             if (key.startsWith("minecraft:")) {
                 key=key.substring(10);
             }
-            for (String prefix: prefixes) {
-                if (I18n.hasTranslation(prefix+"."+key)) {
-                    translation = new TranslatableText(prefix+"."+key);
-                    break;
+            if (key.startsWith("textures/entity/")) {
+                String entityAppearance = key.substring(16);
+                int dotPos;
+                if ((dotPos = entityAppearance.indexOf("."))>0) {
+                    entityAppearance = entityAppearance.substring(0, dotPos);
+                }
+                translation =  entityAppearance;
+            }
+            if (translation == null) {
+                for (String prefix: prefixes) {
+                    if (I18n.hasTranslation(prefix+"."+key)) {
+                        translation = I18n.translate(prefix+"."+key);
+                        break;
+                    }
                 }
             }
             if (translation == null) {
-                translation = new LiteralText(key);
+                CriterionConditions conditions = ((AdvancementProgressAccessor)(progress)).getCriterion(s).getConditions();
+                JsonObject o = conditions.toJson(AdvancementEntityPredicateSerializer.INSTANCE);
+                JsonObject effects = o.getAsJsonObject("effects");
+                if (effects != null) {
+                    details = new ArrayList<>(effects.entrySet().size());
+                    for (Map.Entry<String, JsonElement> entry: effects.entrySet()) {
+                        details.add(I18n.translate("effect."+entry.getKey().replace(':', '.')));
+                    }
+                }
+                translation = key;
             }
-            result.add(new AdvancementStep(translation, obtained));
+            result.add(new AdvancementStep(translation, obtained, details));
         }
     }
-    
-    
+
     @Override
     public void onInitializeClient()
     {
+        showAll = true;
     }
 }

+ 16 - 9
src/main/java/de/guntram/mcmod/advancementinfo/AdvancementStep.java

@@ -5,26 +5,33 @@
  */
 package de.guntram.mcmod.advancementinfo;
 
-import net.minecraft.text.Text;
+import java.util.List;
 
-/**
- *
- * @author gbl
- */
 public class AdvancementStep {
-    private Text name;
+    
+    // As we need to run trimToWidth over all entries anyway, which wants 
+    // Strings, not Texts, we can save a few µs by using all Strings here
+    // and not converting to and fro.
+    
+    private String name;
     private boolean obtained;
+    private List<String> details;
     
-    AdvancementStep(Text name, boolean obtained) {
+    AdvancementStep(String name, boolean obtained, List<String> details) {
         this.name = name;
         this.obtained = obtained;
+        this.details = details;
     }
     
     public boolean getObtained() {
         return obtained;
     }
     
-    public Text getName() {
+    public String getName() {
         return name;
-    } 
+    }
+    
+    public List<String> getDetails() {
+        return details;
+    }
 }

+ 16 - 0
src/main/java/de/guntram/mcmod/advancementinfo/accessors/AdvancementProgressAccessor.java

@@ -0,0 +1,16 @@
+/*
+ * 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.AdvancementCriterion;
+
+/**
+ *
+ * @author gbl
+ */
+public interface AdvancementProgressAccessor {
+    public AdvancementCriterion getCriterion(String name);
+}

+ 2 - 2
src/main/java/de/guntram/mcmod/advancementinfo/AdvancementProgressSupplier.java → src/main/java/de/guntram/mcmod/advancementinfo/accessors/AdvancementWidgetAccessor.java

@@ -3,7 +3,7 @@
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
-package de.guntram.mcmod.advancementinfo;
+package de.guntram.mcmod.advancementinfo.accessors;
 
 import net.minecraft.advancement.AdvancementProgress;
 
@@ -11,6 +11,6 @@ import net.minecraft.advancement.AdvancementProgress;
  *
  * @author gbl
  */
-public interface AdvancementProgressSupplier {
+public interface AdvancementWidgetAccessor {
     public AdvancementProgress getProgress();
 }

+ 26 - 0
src/main/java/de/guntram/mcmod/advancementinfo/mixin/AdvancementDisplayMixin.java

@@ -0,0 +1,26 @@
+package de.guntram.mcmod.advancementinfo.mixin;
+
+import de.guntram.mcmod.advancementinfo.AdvancementInfo;
+import net.minecraft.advancement.AdvancementDisplay;
+import net.minecraft.text.Text;
+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.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+
+@Mixin(AdvancementDisplay.class)
+public class AdvancementDisplayMixin {
+    
+    @Shadow @Final private boolean hidden;
+    @Shadow @Final private Text title;
+
+    @Inject(method="isHidden", at=@At("HEAD"), cancellable = true)
+    
+    public void isHiddenOverride(CallbackInfoReturnable<Boolean> cir) {
+        cir.cancel();
+        cir.setReturnValue(hidden && !AdvancementInfo.showAll);
+    }
+}

+ 31 - 0
src/main/java/de/guntram/mcmod/advancementinfo/mixin/AdvancementProgressMixin.java

@@ -0,0 +1,31 @@
+/*
+ * 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.mixin;
+
+import de.guntram.mcmod.advancementinfo.accessors.AdvancementProgressAccessor;
+import java.util.Map;
+import net.minecraft.advancement.AdvancementCriterion;
+import net.minecraft.advancement.AdvancementProgress;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(AdvancementProgress.class)
+public class AdvancementProgressMixin implements AdvancementProgressAccessor {
+    
+    private Map<String, AdvancementCriterion> savedCriteria;
+    
+    @Inject(method="init", at=@At("HEAD"))
+    public void saveCriteria(Map<String, AdvancementCriterion> criteria, String[][] requirements, CallbackInfo ci) {
+        savedCriteria = criteria;
+    }
+    
+    @Override
+    public AdvancementCriterion getCriterion(String name) {
+        return savedCriteria.get(name);
+    }
+}

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

@@ -5,13 +5,14 @@
  */
 package de.guntram.mcmod.advancementinfo.mixin;
 
-import de.guntram.mcmod.advancementinfo.AdvancementStep;
 import de.guntram.mcmod.advancementinfo.AdvancementInfo;
 import static de.guntram.mcmod.advancementinfo.AdvancementInfo.AI_spaceX;
 import static de.guntram.mcmod.advancementinfo.AdvancementInfo.AI_spaceY;
-import de.guntram.mcmod.advancementinfo.AdvancementProgressSupplier;
+import de.guntram.mcmod.advancementinfo.AdvancementStep;
 import de.guntram.mcmod.advancementinfo.IteratorReceiver;
+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.AdvancementWidget;
 import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
@@ -124,12 +125,17 @@ public class AdvancementScreenMixin extends Screen {
         AdvancementInfo.mouseClicked = AdvancementInfo.mouseOver;
         scrollPos = 0;
         if (AdvancementInfo.mouseClicked != null) {
-            AdvancementInfo.cachedClickList = AdvancementInfo.getSteps((AdvancementProgressSupplier) AdvancementInfo.mouseClicked);
+            AdvancementInfo.cachedClickList = AdvancementInfo.getSteps((AdvancementWidgetAccessor) AdvancementInfo.mouseClicked);
         } else {
             AdvancementInfo.cachedClickList = null;
         }
     }
     
+    @Inject(method="onRootAdded", at=@At("HEAD"))
+    public void debugRootAdded(Advancement root, CallbackInfo ci) {
+        // System.out.println("root added to screen; display="+root.getDisplay()+", id="+root.getId().toString());
+    }
+    
     // @Inject(method="mouseScrolled", at=@At("HEAD"), cancellable = true)
     @Override
     public boolean mouseScrolled(double X, double Y, double amount /*, CallbackInfoReturnable cir */) {
@@ -150,7 +156,7 @@ public class AdvancementScreenMixin extends Screen {
             list = AdvancementInfo.cachedClickList;
             skip = scrollPos;
         } else {
-            list = AdvancementInfo.getSteps((AdvancementProgressSupplier) widget);
+            list = AdvancementInfo.getSteps((AdvancementWidgetAccessor) widget);
             skip = 0;
         }
         for (AdvancementStep entry: list) {
@@ -158,13 +164,23 @@ public class AdvancementScreenMixin extends Screen {
                 continue;
             }
             textRenderer.draw(stack, 
-                    textRenderer.trimToWidth(entry.getName().getString(), AdvancementInfo.AI_infoWidth-24),
+                    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 (list.size() == 1 && 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;
+                }
+            }
         }
     }
 }

+ 2 - 2
src/main/java/de/guntram/mcmod/advancementinfo/mixin/AdvancementWidgetMixin.java

@@ -6,7 +6,7 @@
 package de.guntram.mcmod.advancementinfo.mixin;
 
 import de.guntram.mcmod.advancementinfo.AdvancementInfo;
-import de.guntram.mcmod.advancementinfo.AdvancementProgressSupplier;
+import de.guntram.mcmod.advancementinfo.accessors.AdvancementWidgetAccessor;
 import net.minecraft.advancement.AdvancementProgress;
 import net.minecraft.client.gui.screen.advancement.AdvancementWidget;
 import net.minecraft.client.util.math.MatrixStack;
@@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
  */
 
 @Mixin(AdvancementWidget.class)
-public class AdvancementWidgetMixin implements AdvancementProgressSupplier {
+public class AdvancementWidgetMixin implements AdvancementWidgetAccessor {
     
     @Shadow private AdvancementProgress progress;
     

+ 2 - 1
src/main/resources/mixins.advancementinfo.json

@@ -4,7 +4,8 @@
     "refmap": "advancementinfo-refmap.json",
     "minVersion": "0.6",
     "client": [
-        "AdvancementScreenMixin", "AdvancementTabMixin", "AdvancementWidgetMixin"
+        "AdvancementScreenMixin", "AdvancementTabMixin", "AdvancementWidgetMixin",
+        "AdvancementProgressMixin", "AdvancementDisplayMixin"
     ],
     "injectors": {
         "defaultRequire": 1