public override void OnMouseDown(MouseEvent args) { GridRecipeAndUnnamedIngredients recipeunin = GridRecipesAndUnIn[curItemIndex]; GridRecipe recipe = recipeunin.Recipe; foreach (var val in BoundsPerLine) { if (val.PointInside(args.X, args.Y)) { int x = (int)((args.X - val.X) / (size + 3)); int y = (int)((args.Y - val.Y) / (size + 3)); CraftingRecipeIngredient ingred = recipe.GetElementInGrid(y, x, recipe.resolvedIngredients, recipe.Width); if (ingred == null) { return; } int index = recipe.GetGridIndex(y, x, recipe.resolvedIngredients, recipe.Width); ItemStack[] unnamedWildcardStacklist = null; if (recipeunin.unnamedIngredients?.TryGetValue(index, out unnamedWildcardStacklist) == true) { onStackClicked?.Invoke(unnamedWildcardStacklist[secondCounter % unnamedWildcardStacklist.Length]); } else { onStackClicked?.Invoke(ingred.ResolvedItemstack); } } } }
public override void RenderInteractiveElements(float deltaTime, double renderX, double renderY) { LineRectangled bounds = BoundsPerLine[0]; GridRecipeAndUnnamedIngredients recipeunin = GridRecipesAndUnIn[curItemIndex]; if ((secondsVisible -= deltaTime) <= 0) { secondsVisible = 1; curItemIndex = (curItemIndex + 1) % GridRecipesAndUnIn.Length; secondCounter++; } LoadedTexture extraTextTexture; if (extraTexts.TryGetValue(curItemIndex, out extraTextTexture)) { capi.Render.Render2DTexturePremultipliedAlpha(extraTextTexture.TextureId, (float)(renderX + bounds.X), (float)(renderY + bounds.Y + 3 * (size + 3)), extraTextTexture.Width, extraTextTexture.Height); } int mx = api.Input.MouseX; int my = api.Input.MouseY; double rx = 0, ry = 0; for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { int index = recipeunin.Recipe.GetGridIndex(y, x, recipeunin.Recipe.resolvedIngredients, recipeunin.Recipe.Width); CraftingRecipeIngredient ingred = recipeunin.Recipe.GetElementInGrid(y, x, recipeunin.Recipe.resolvedIngredients, recipeunin.Recipe.Width); if (ingred == null) { continue; } rx = renderX + bounds.X + x * (size + GuiElement.scaled(3)); ry = renderY + bounds.Y + y * (size + GuiElement.scaled(3)); ItemStack[] unnamedWildcardStacklist = null; if (recipeunin.unnamedIngredients?.TryGetValue(index, out unnamedWildcardStacklist) == true) { dummyslot.Itemstack = unnamedWildcardStacklist[secondCounter % unnamedWildcardStacklist.Length]; dummyslot.Itemstack.StackSize = ingred.Quantity; } else { dummyslot.Itemstack = ingred.ResolvedItemstack.Clone(); } var scale = RuntimeEnv.GUIScale; ElementBounds scissorBounds = ElementBounds.Fixed(rx / scale, ry / scale, size / scale, size / scale).WithEmptyParent(); scissorBounds.CalcWorldBounds(); api.Render.PushScissor(scissorBounds, true); // 1.16.0: Fugly (but backwards compatible) hack: We temporarily store the ingredient code in an unused field of ItemSlot so that OnHandbookRecipeRender() has access to that number. Proper solution would be to alter the method signature to pass on this value. dummyslot.BackgroundIcon = index + ""; dummyslot.Itemstack.Collectible.OnHandbookRecipeRender(capi, recipeunin.Recipe, dummyslot, rx + size * 0.5f, ry + size * 0.5f, size); dummyslot.BackgroundIcon = null; api.Render.PopScissor(); // Super weird coordinates, no idea why double dx = mx - rx + 1; double dy = my - ry + 2; if (dx >= 0 && dx < size && dy >= 0 && dy < size) { RenderItemstackTooltip(dummyslot, rx + dx, ry + dy, deltaTime); } } } }