CCxia
本帖最后由 CCxia 于 2019-6-15 22:17 编辑

// 根据输入的物品栈列表遍历Map表,找到对应的Key并返回Value,如果没找到返回空
        public ItemStack getSmeltItems(List<ItemStack> items) {
                for (Entry<List<ItemStack>, ItemStack> entry : this.smeltingList.entrySet()) {
                        System.out.println(entry.getKey().get(0).getUnlocalizedName());
                        List<ItemStack> items1 = entry.getKey();
                        if (items.size() != items1.size()) {
                                break;
                        } else if (items.size() == 1 && items1.size() == 1) {
                                if (items.get(0).isItemEqual(items1.get(0))) {
                                        return entry.getValue();
                                } else {
                                        break;
                                }
                        } else if (items.size() == 2 && items1.size() == 2) {
                                if (items.get(0).isItemEqual(items1.get(0)) && items.get(1).isItemEqual(items1.get(1))) {
                                        return entry.getValue();
                                } else {
                                        break;
                                }
                        }
                }
                return ItemStack.EMPTY;
        }


//forge1.12.2,仿照熔炉的烧炼配方,这里用了一个Map表示(原料->成品)的对应关系
private final Map<List<ItemStack>, ItemStack> smeltingList = Maps.<List<ItemStack>, ItemStack>newHashMap();

mod里要写一个类似熔炉的方块,就仿照了熔炉的写法,不过我的原料有两个格子(主料和辅料),所以这边用了List来存(有些只需要主料就添加1个ItemStack,有些要主料和辅料就添加2个ItemStack)。上述方法就是根据输入的List判断是否符合配方要求,如果符合就返回对应的成品,如归不符合就返回空物品栈。

现在遇到了问题,就是如果增强for循环里删去控制台打印语句后面的全部语句,可以正常把每一个key中的物品的名字打印出来,但用上述完整的方法后,发现只打印了两个相同的物品名字循环就结束了,所以Map是正常的,感觉应该是因为什么原因导致entry发生了变化。希望大佬能解答疑惑,感激不尽!
(break是跳出整个for循环,这里我脑抽了居然没发现这个低级错误,应该是用continue!!!引以为戒!!!)



2021.12 数据,可能有更多内容// 根据输入的物品栈列表遍历Map表,找到对应的Key并返回Value,如果没找到返回空
     public ItemStack getSmeltItems(List&lt;ItemStack&gt; items) {
    for (Entry&lt;List&lt;ItemStack&gt;, ItemStack&gt; entry : this.smeltingList.entrySet()) {
   System.out.println(entry.getKey().get(0).getUnlocalizedName());
   List&lt;ItemStack&gt; items1 = entry.getKey();
   if (items.size() != items1.size()) {
  break;
   } else if (items.size() == 1 &amp;&amp; items1.size() == 1) {
  if (items.get(0).isItemEqual(items1.get(0))) {
    return entry.getValue();
  } else {
    break;
  }
   } else if (items.size() == 2 &amp;&amp; items1.size() == 2) {
  if (items.get(0).isItemEqual(items1.get(0)) &amp;&amp; items.get(1).isItemEqual(items1.get(1))) {
    return entry.getValue();
  } else {
    break;
  }
   }
    }
    return ItemStack.EMPTY;
  }



//forge1.12.2,仿照熔炉的烧炼配方,这里用了一个Map表示(原料-&gt;成品)的对应关系
private final Map&lt;List&lt;ItemStack&gt;, ItemStack&gt; smeltingList = Maps.&lt;List&lt;ItemStack&gt;, ItemStack&gt;newHashMap();


mod里要写一个类似熔炉的方块,就仿照了熔炉的写法,不过我的原料有两个格子(主料和辅料),所以这边用了List来存(有些只需要主料就添加1个ItemStack,有些要主料和辅料就添加2个ItemStack)。上述方法就是根据输入的List判断是否符合配方要求,如果符合就返回对应的成品,如归不符合就返回空物品栈。


现在遇到了问题,就是如果增强for循环里删去控制台打印语句后面的全部语句,可以正常把每一个key中的物品的名字打印出来,但用上述完整的方法后,发现只打印了两个相同的物品名字循环就结束了,所以Map是正常的,感觉应该是因为什么原因导致entry发生了变化。希望大佬能解答疑惑,感激不尽!
(break是跳出整个for循环,这里我脑抽了居然没发现这个低级错误,应该是用continue!!!引以为戒!!!)



redpc
1.
二处
else {
                                        break;
                                }
删除
2.
items.size() == 2最好调到==1前面,先判断主料和辅料情况,再判断只有主料情况,
如果有配方有这种情况, 主料可合成, 并此主料+辅料也可合成 的情况会出错

幻刺呀
感谢大佬 已经解决

第一页 上一页 下一页 最后一页