Skip to content

Commit

Permalink
Merge branch '1.19.4' into 1.19.3
Browse files Browse the repository at this point in the history
  • Loading branch information
emilyploszaj committed Jul 2, 2024
2 parents 4835de8 + e52aaad commit 192c224
Show file tree
Hide file tree
Showing 13 changed files with 242 additions and 38 deletions.
17 changes: 8 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
### Additions
* Dev mode now displays warnings and errors on recipes with resolution instructions

### Tweaks
* The recipe tree in newer versions without the vanilla dirt background will now use a nearly opaque black
* EMI will now always return to the screen where recipes are being filled #581
* Item tooltips in EMI are now provided world context #575
* Adjusted input capturing behavior for non-primary mouse buttons #598
* Updated JEI integration for 1.21 and 1.20.6 #607 #577

### Fixes
* Fixed enchantment related errors when rejoining a world
* Fixed various creative search issues #573 #580
* Fixed fluids losing components in 1.21 #582
* Fluids with null still textures will no longer crash EMI #579
* Fixed 1.21 NeoForge access widener issue #590
* Fixed NeoForge packets in 1.20.6
* Fixed Fabric networking not working correctly #586 #584
* Fixed dynamic registry availability for stack serialization #532
* Fixed certain recipe ingredients having incorrect amounts starting in 1.1.8 #597
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ minecraft_version=1.19.3
enabled_platforms=fabric,forge

archives_base_name=emi
mod_version=1.1.8
mod_version=1.1.9
maven_group=dev.emi

architectury_version=4.9.83
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public static EmiIngredient of(List<? extends EmiIngredient> list, long amount)
if (list.size() == 0) {
return EmiStack.EMPTY;
} else if (list.size() == 1) {
return list.get(0).copy().setAmount(1);
return list.get(0).copy().setAmount(amount);
} else {
long internalAmount = list.get(0).getAmount();
for (EmiIngredient i : list) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import dev.emi.emi.jemi.JemiStack;
import dev.emi.emi.jemi.JemiUtil;
import dev.emi.emi.jemi.impl.JemiRecipeSlot.IngredientRenderer;
import dev.emi.emi.runtime.EmiLog;
import mezz.jei.api.gui.builder.IIngredientAcceptor;
import mezz.jei.api.gui.ingredient.IRecipeSlotTooltipCallback;
import mezz.jei.api.ingredients.IIngredientType;
Expand Down
5 changes: 5 additions & 0 deletions xplat/src/main/java/dev/emi/emi/registry/EmiRecipes.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import dev.emi.emi.runtime.EmiHidden;
import dev.emi.emi.runtime.EmiLog;
import dev.emi.emi.runtime.EmiReloadLog;
import dev.emi.emi.runtime.dev.EmiDev;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
Expand Down Expand Up @@ -213,6 +214,10 @@ public Manager(List<EmiRecipeCategory> categories, Map<EmiRecipeCategory, List<E
}
}
}

if (EmiConfig.devMode) {
EmiDev.duplicateRecipeIds = duplicateIds.keySet();
}
}

@Override
Expand Down
9 changes: 9 additions & 0 deletions xplat/src/main/java/dev/emi/emi/runtime/dev/EmiDev.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.emi.emi.runtime.dev;

import java.util.Set;

import net.minecraft.util.Identifier;

public class EmiDev {
public static Set<Identifier> duplicateRecipeIds = Set.of();
}
13 changes: 13 additions & 0 deletions xplat/src/main/java/dev/emi/emi/runtime/dev/RecipeError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dev.emi.emi.runtime.dev;

import java.util.List;

import net.minecraft.client.gui.tooltip.TooltipComponent;

public record RecipeError(Severity severity, List<TooltipComponent> tooltip) {

public static enum Severity {
ERROR,
WARNING
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -935,7 +935,7 @@ public static boolean mouseClicked(double mouseX, double mouseY, int button) {
return false;
}
recalculate();
EmiIngredient ingredient = getHoveredStack((int) mouseX, (int) mouseY, !isClickClicky(button)).getStack();
EmiIngredient ingredient = getHoveredStack((int) mouseX, (int) mouseY, false).getStack();
pressedStack = ingredient;
if (!ingredient.isEmpty()) {
return true;
Expand Down
3 changes: 3 additions & 0 deletions xplat/src/main/java/dev/emi/emi/screen/RecipeDisplay.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ public WidgetGroup getWidgets(int x, int y, int availableWidth, int availableHei
decorator.decorateRecipe(recipe, widgets);
}
}
if (EmiConfig.devMode) {
widgets.decorateDevMode();
}
addButtons(widgets, leftButtons, 0 - 4 - 13, -14);
addButtons(widgets, rightButtons, width + 5, 14);
} catch (Throwable t) {
Expand Down
104 changes: 104 additions & 0 deletions xplat/src/main/java/dev/emi/emi/screen/WidgetGroup.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,32 @@
package dev.emi.emi.screen;

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

import com.google.common.collect.Lists;

import dev.emi.emi.EmiPort;
import dev.emi.emi.EmiUtil;
import dev.emi.emi.api.EmiApi;
import dev.emi.emi.api.recipe.EmiRecipe;
import dev.emi.emi.api.recipe.EmiRecipeCategory;
import dev.emi.emi.api.render.EmiTooltipComponents;
import dev.emi.emi.api.stack.EmiIngredient;
import dev.emi.emi.api.stack.EmiStack;
import dev.emi.emi.api.widget.DrawableWidget;
import dev.emi.emi.api.widget.SlotWidget;
import dev.emi.emi.api.widget.TextWidget;
import dev.emi.emi.api.widget.TextWidget.Alignment;
import dev.emi.emi.runtime.EmiDrawContext;
import dev.emi.emi.runtime.dev.EmiDev;
import dev.emi.emi.runtime.dev.RecipeError;
import dev.emi.emi.screen.tooltip.EmiTooltip;
import dev.emi.emi.api.widget.Widget;
import dev.emi.emi.api.widget.WidgetHolder;
import dev.emi.emi.widget.RecipeBackground;
import net.minecraft.client.gui.tooltip.TooltipComponent;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;

public class WidgetGroup implements WidgetHolder {
public final EmiRecipe recipe;
Expand Down Expand Up @@ -42,6 +54,98 @@ public void error(Throwable e) {
.map(EmiPort::literal).map(EmiPort::ordered).map(TooltipComponent::of).toList()));
}

public void decorateDevMode() {
EmiRecipeCategory category = recipe.getCategory();
Identifier cid = category == null ? null : category.getId();
Identifier id = recipe.getId();
List<RecipeError> errors = Lists.newArrayList();
if (id == null) {
errors.add(new RecipeError(RecipeError.Severity.WARNING, EmiTooltip.splitTranslate("emi.dev.null_recipe_id")));
} else if (EmiDev.duplicateRecipeIds.contains(id)) {
List<TooltipComponent> tooltip = Lists.newArrayList();
if (Objects.equals(id.getNamespace(), "minecraft") || Objects.equals(id.getNamespace(), "emi")) {
tooltip.addAll(EmiTooltip.splitTranslate("emi.dev.duplicate_vanilla_recipe_id", id));
} else {
tooltip.addAll(EmiTooltip.splitTranslate("emi.dev.duplicate_recipe_id", id));
}
if (cid != null) {
String suggestedPath = cid.getPath() + "/" + id.getNamespace() + "/" + id.getPath();
if (EmiApi.getRecipeManager().getRecipe(EmiPort.id(cid.getNamespace(), suggestedPath)) == null) {
tooltip.addAll(EmiTooltip.splitTranslate("emi.dev.suggest_id", cid.getNamespace(), suggestedPath));
} else {
tooltip.addAll(EmiTooltip.splitTranslate("emi.dev.synthetic_id"));
}
} else {
tooltip.addAll(EmiTooltip.splitTranslate("emi.dev.synthetic_id"));
}
errors.add(new RecipeError(RecipeError.Severity.ERROR, tooltip));
}

if (recipe.getInputs() == null || recipe.getOutputs() == null || recipe.getCatalysts() == null) {
errors.add(new RecipeError(RecipeError.Severity.ERROR, EmiTooltip.splitTranslate("emi.dev.null_input_or_output")));
} else {
int nullStacks = 0;
for (EmiIngredient stack : recipe.getInputs()) {
if (stack == null) {
nullStacks++;
}
}
for (EmiIngredient stack : recipe.getCatalysts()) {
if (stack == null) {
nullStacks++;
}
}
for (EmiStack stack : recipe.getOutputs()) {
if (stack == null) {
nullStacks++;
}
}
if (nullStacks > 0) {
errors.add(new RecipeError(RecipeError.Severity.ERROR, EmiTooltip.splitTranslate("emi.dev.null_input_or_output")));
}

if (!recipe.getOutputs().isEmpty() && recipe.supportsRecipeTree()) {
int recipeContexts = 0;
for (Widget widget : widgets) {
if (widget instanceof SlotWidget sw) {
if (sw.getRecipe() != null) {
recipeContexts++;
}
}
}
if (recipeContexts == 0) {
errors.add(new RecipeError(RecipeError.Severity.WARNING, EmiTooltip.splitTranslate("emi.dev.no_output_slots")));
}
}
}

if (!errors.isEmpty()) {
List<TooltipComponent> tooltip = Lists.newArrayList();
RecipeError.Severity severity = RecipeError.Severity.WARNING;
for (RecipeError error : errors) {
if (error.severity() == RecipeError.Severity.ERROR) {
severity = RecipeError.Severity.ERROR;
}
tooltip.add(switch (error.severity()) {
case ERROR -> EmiTooltipComponents.of(EmiPort.translatable("emi.dev.severity.error", Formatting.RED));
case WARNING -> EmiTooltipComponents.of(EmiPort.translatable("emi.dev.severity.warning", Formatting.YELLOW));
});
tooltip.addAll(error.tooltip());
}
int errorColor = switch (severity) {
case ERROR -> 0xCCCC0000;
case WARNING -> 0xCCCCCC00;
};
addDrawable(0, 0, width, height, (raw, mouseX, mouseY, delta) -> {
EmiDrawContext draw = EmiDrawContext.wrap(raw);
draw.fill(-2, -3, width, 2, errorColor);
draw.fill(-2, height + 1, width + 4, 2, errorColor);
});
addText(EmiPort.literal("!", Formatting.BOLD), width, -2, 0xFF000000 | errorColor, true);
addTooltip(tooltip, width - 2, -4, 8, 16);
}
}

public int x() {
return x;
}
Expand Down
10 changes: 10 additions & 0 deletions xplat/src/main/resources/assets/emi/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,16 @@
"emi.error.recipe.initialize": "Error Initializing",
"emi.error.recipe.render": "Error Rendering",

"emi.dev.severity.error": "Error",
"emi.dev.severity.warning": "Warning",
"emi.dev.null_recipe_id": "Recipe ID is §7null§r\nRecipes need to have unique IDs to be serialized\nThis will only affect this recipe",
"emi.dev.duplicate_recipe_id": "Recipe ID is a duplicate of another recipe\n§7%s§r\nRecipes need to have unique IDs to be serialized\nThis will break other recipes with this ID",
"emi.dev.duplicate_vanilla_recipe_id": "Recipe ID is a duplicate of a vanilla recipe\n§7%s§r\nRecipes need to have unique IDs to be serialized\nThis will break the vanilla recipe with the same ID",
"emi.dev.synthetic_id": "Use a synthetic ID §7[namespace]§b:/§7[path]§r",
"emi.dev.suggest_id": "Use a synthetic ID §7[namespace]§b:/§7[path]§r like\n§7%s§b:/§7%s§r",
"emi.dev.null_input_or_output": "Recipe's inputs or outputs are §7null§r\nUse an empty list for no inputs or outputs\nUse §7EmiStack.EMPTY§r to represent an empty stack",
"emi.dev.no_output_slots": "Recipe's slots do not include any outputs\nCall §7SlotWidget.recipeContext(this)§r on outputs§r",

"emi.chess.piece.white_pawn": "White Pawn",
"emi.chess.piece.white_rook": "White Rook",
"emi.chess.piece.white_knight": "White Knight",
Expand Down
79 changes: 66 additions & 13 deletions xplat/src/main/resources/assets/emi/lang/ru_ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,9 @@
"config.emi.ui.bottom_sidebar_header": "Шапка",
"config.emi.ui.bottom_sidebar_theme": "Тема",

"config.emi.ui.vertical_margin": "Вертикальный отступ",
"config.emi.ui.maximum_recipe_screen_height": "Максимальная высота окна",
"config.emi.ui.minimum_recipe_screen_width": "Минимальная ширина окна",
"config.emi.ui.vertical_margin": "Вертикальный отступ",
"config.emi.ui.workstation_location": "Расположение рабочих станций",
"config.emi.ui.miscraft_prevention": "Предотвращение случайных крафтов",
"config.emi.ui.fluid_unit": "Единицы измерения жидкостей",
Expand Down Expand Up @@ -180,8 +181,8 @@
"emi.unit.liters": "Литры",
"emi.unit.millibuckets": "Милливёдра",
"emi.unit.droplets": "Капли",
"emi.fluid.amount.liters": "%s Л",
"emi.fluid.amount.millibuckets": "%s мВ",
"emi.fluid.amount.liters": "%s л",
"emi.fluid.amount.millibuckets": "%s мв",
"emi.fluid.amount.droplets": "%s к",

"emi.disabled": "§cEMI отключён! §aВключить:§r",
Expand Down Expand Up @@ -314,14 +315,14 @@
"tag.item.minecraft.logs_that_burn": "Горящие брёвна",
"tag.item.minecraft.planks": "Доски",
"tag.item.minecraft.non_flammable_wood": "Негорящая древесина",
"tag.item.minecraft.coal_ores": "Руды угля",
"tag.item.minecraft.copper_ores": "Руды меди",
"tag.item.minecraft.diamond_ores": "Руды алмаза",
"tag.item.minecraft.emerald_ores": "Руды изумруда",
"tag.item.minecraft.gold_ores": "Руды золота",
"tag.item.minecraft.iron_ores": "Руды железа",
"tag.item.minecraft.lapis_ores": "Руды лазурита",
"tag.item.minecraft.redstone_ores": "Руды редстоуна",
"tag.item.minecraft.coal_ores": "Угольные руды",
"tag.item.minecraft.copper_ores": "Медные руды",
"tag.item.minecraft.diamond_ores": "Алмазные руды",
"tag.item.minecraft.emerald_ores": "Изумрудные руды",
"tag.item.minecraft.gold_ores": "Золотые руды",
"tag.item.minecraft.iron_ores": "Железные руды",
"tag.item.minecraft.lapis_ores": "Лазуритовые руды",
"tag.item.minecraft.redstone_ores": "Редстоуновые руды",
"tag.item.minecraft.anvil": "Наковальни",
"tag.item.minecraft.arrows": "Стрелы",
"tag.item.minecraft.axolotl_tempt_items": "Нравящиеся аксолотлям",
Expand Down Expand Up @@ -400,7 +401,59 @@
"tag.item.minecraft.trim_materials": "Материалы для кузнечных шаблонов",
"tag.item.minecraft.trim_templates": "Кузнечные шаблоны",
"tag.item.minecraft.trimmable_armor": "Можно применить кузнечный шаблон",
"tag.item.minecraft.villager_plantable_seeds": "Сажаемые жителями семена",
"tag.item.minecraft.villager_plantable_seeds": "Сажаемые крестьянами семена",

"tag.minecraft.armadillo_food": "Еда броненосцев",
"tag.minecraft.axolotl_food": "Еда аксолотлей",
"tag.minecraft.bee_food": "Еда пчёл",
"tag.minecraft.camel_food": "Еда верблюдов",
"tag.minecraft.cat_food": "Еда котов",
"tag.minecraft.chest_armor": "Броня груди",
"tag.minecraft.chicken_food": "Еда куриц",
"tag.minecraft.cow_food": "Еда коров",
"tag.minecraft.dyeable": "Окрашиваемое",
"tag.minecraft.enchantable.armor": "Зачаровываемая броня",
"tag.minecraft.enchantable.bow": "Зачаровываемые луки",
"tag.minecraft.enchantable.chest_armor": "Зачаровываемая броня груди",
"tag.minecraft.enchantable.crossbow": "Зачаровываемые арбалеты",
"tag.minecraft.enchantable.durability": "Зачаровываемое на прочность",
"tag.minecraft.enchantable.equippable": "Зачаровываемое снаряжение",
"tag.minecraft.enchantable.fire_aspect": "Зачаровываемое на заговор огня",
"tag.minecraft.enchantable.fishing": "Зачаровываемое на рыбалку",
"tag.minecraft.enchantable.foot_armor": "Зачаровываемая броня ступней",
"tag.minecraft.enchantable.head_armor": "Зачаровываемая броня головы",
"tag.minecraft.enchantable.leg_armor": "Зачаровываемая броня ног",
"tag.minecraft.enchantable.mace": "Зачаровываемая булава",
"tag.minecraft.enchantable.mining": "Зачаровываемые на копание",
"tag.minecraft.enchantable.mining_loot": "Зачаровываемые на удачу копания",
"tag.minecraft.enchantable.sharp_weapon": "Зачаровываемое острое оружие",
"tag.minecraft.enchantable.sword": "Зачаровываемые мечи",
"tag.minecraft.enchantable.trident": "Зачаровываемые трезубцы",
"tag.minecraft.enchantable.vanishing": "Зачаровываемое на утрату",
"tag.minecraft.enchantable.weapon": "Зачаровываемое оружие",
"tag.minecraft.foot_armor": "Броня ступней",
"tag.minecraft.frog_food": "Еда лягушек",
"tag.minecraft.goat_food": "Яда для коз",
"tag.minecraft.head_armor": "Броня головы",
"tag.minecraft.hoglin_food": "Еда хоглинов",
"tag.minecraft.horse_food": "Еда лошадей",
"tag.minecraft.horse_tempt_items": "Нравящиеся лошадям",
"tag.minecraft.leg_armor": "Броня ног",
"tag.minecraft.llama_food": "Еда лам",
"tag.minecraft.llama_tempt_items": "Нравящиеся ламам",
"tag.minecraft.meat": "Мясо",
"tag.minecraft.ocelot_food": "Еда оцелотов",
"tag.minecraft.panda_food": "Еда панд",
"tag.minecraft.parrot_food": "Еда попугаев",
"tag.minecraft.parrot_poisonous_food": "Ядовитая еда попугаев",
"tag.minecraft.pig_food": "Еда свиней",
"tag.minecraft.rabbit_food": "Еда кроликов",
"tag.minecraft.sheep_food": "Еда овец",
"tag.minecraft.skulls": "Черепа",
"tag.minecraft.strider_food": "Еда лавомерок",
"tag.minecraft.strider_tempt_items": "Нравящиеся лавомеркам",
"tag.minecraft.turtle_food": "Еда черепах",
"tag.minecraft.wolf_food": "Еда волков",

"tag.fluid.minecraft.water": "Вода",
"tag.fluid.minecraft.lava": "Лава",
Expand Down Expand Up @@ -682,7 +735,7 @@
"tag.item.c.uncolored_sandstone_blocks": "Бесцветные блоки песчаника",
"tag.item.c.uncolored_sandstone_slabs": "Бесцветные песчаниковые плиты",
"tag.item.c.uncolored_sandstone_stairs": "Бесцветные песчаниковые ступеньки",
"tag.item.c.villager_job_sites": "Блоки для профессий жителей",
"tag.item.c.villager_job_sites": "Блоки для профессий крестьян",
"tag.item.c.wooden_barrels": "Деревянные бочки",

"tag.item.c.armors": "Броня",
Expand Down
Loading

0 comments on commit 192c224

Please sign in to comment.