sk9zist :l
Исправился
- 981
- 18
- 157
А можно как-нибудь задавать NBT предмета, участвовавшего в крафте тому предмету, который мы скрафтили?
extrends IForgeRegistryEntry.Impl[IRecipe] implements IRecipe
, экземпляры регать через событияА можно подробнее?IRecipe
И зачем через события?экземпляры регать через события
Тем, что ты сможешь переопределить matches и написать какую угодно проверку, подходит ли сетка крафта для этого крафтаЧем мне поможет IRecipe?
public class Recipe extends net.minecraftforge.registries.IForgeRegistryEntry.Impl<IRecipe> implements IRecipe
{
private ItemStack item;
private ItemStack result;
@Override
public boolean matches(InventoryCrafting inv, World worldIn)
{
item = null;
for(int i = 0; i < inv.getSizeInventory(); i++)
{
ItemStack stack = inv.getStackInSlot(i);
if(stack != null)
{
if(stack.getItem() == RunesCollector.redirection_rune){item = stack;}
}
}
return false;
}
@Override
public ItemStack getCraftingResult(InventoryCrafting inv)
{
if(item == null) return null;
ItemStack in = item.copy();
ItemStack out = item.copy();
String a_player = in.getTagCompound().getString("lastRemembered");
out.getTagCompound().setString("lastRemembered", a_player);
return out;
}
@Override
public ItemStack getRecipeOutput()
{
if(item == null) return null;
ItemStack in = item.copy();
ItemStack out = item.copy();
String a_player = in.getTagCompound().getString("lastRemembered");
out.getTagCompound().setString("lastRemembered", a_player);
return out;
}
@Override
public boolean canFit(int width, int height)
{
return false;
}
}
@Mod.EventBusSubscriber(modid = "abc")
public class Registration
{
@SubscribeEvent
public static void registerRecipes(RegistryEvent.Register<IRecipe> event)
{
event.getRegistry().register(new Recipe());
Log.info("recipes are registered");
}
}
extends IRecipe implements IRecipe
implements IRecipe
Извините, но я исследовал несколько тем, посвящённых вопросам о IRecipe, одной из них была:надо было просто
implements IRecipe
public class Recipe implements IRecipe
{
private ItemStack item;
private ItemStack result;
@Override
public boolean matches(InventoryCrafting inv, World worldIn)
{
item = null;
for(int i = 0; i < inv.getSizeInventory(); i++)
{
ItemStack stack = inv.getStackInSlot(i);
if(stack != null)
{
if(stack.getItem() == RunesCollector.redirection_rune){item = stack;}
}
}
return false;
}
@Override
public ItemStack getCraftingResult(InventoryCrafting inv)
{
if(item == null) return null;
ItemStack in = item.copy();
ItemStack out = item.copy();
String a_player = in.getTagCompound().getString("lastRemembered");
out.getTagCompound().setString("lastRemembered", a_player);
return out;
}
@Override
public ItemStack getRecipeOutput()
{
if(item == null) return null;
ItemStack in = item.copy();
ItemStack out = item.copy();
String a_player = in.getTagCompound().getString("lastRemembered");
out.getTagCompound().setString("lastRemembered", a_player);
return out;
}
@Override
public boolean canFit(int width, int height)
{
return false;
}
@Override
public IRecipe setRegistryName(ResourceLocation name)
{
return null;
}
@Override
public ResourceLocation getRegistryName()
{
return null;
}
@Override
public Class<IRecipe> getRegistryType()
{
return null;
}
}
Пробовал. А вообще я много разных способов перепробовал. Теперь краш всегда один и тот-же.наследовать IForgeRegistryEntry<IRecipe>
public class Recipe implements IForgeRegistryEntry<IRecipe>, IRecipe
{
private ItemStack item;
private ItemStack result;
public boolean matches(InventoryCrafting inv, World worldIn)
{
item = null;
for(int i = 0; i < inv.getSizeInventory(); i++)
{
ItemStack stack = inv.getStackInSlot(i);
if(stack != null)
{
if(stack.getItem() == RunesCollector.redirection_rune){item = stack;}
}
}
if(item != null)return true;
return false;
}
public ItemStack getCraftingResult(InventoryCrafting inv)
{
if(item == null) return null;
ItemStack in = item.copy();
ItemStack out = item.copy();
String a_player = in.getTagCompound().getString("lastRemembered");
out.getTagCompound().setString("lastRemembered", a_player);
return out;
}
public ItemStack getRecipeOutput()
{
if(item == null) return null;
ItemStack in = item.copy();
ItemStack out = item.copy();
String a_player = in.getTagCompound().getString("lastRemembered");
out.getTagCompound().setString("lastRemembered", a_player);
return out;
}
public boolean canFit(int width, int height) { return width > 1 && height > 1; }
public IRecipe setRegistryName(ResourceLocation name) { return null; }
public ResourceLocation getRegistryName() { return new ResourceLocation("abc:recipe"); }
public Class<IRecipe> getRegistryType() { return this.getRegistryType(); }
}
А это чо за хрень?Там говорилось обратное. Но ладно.
И разве если я имплементирую чисто IRecipe (в первый раз я так и делал)
java.lang.NullPointerException: Initializing game
изначально он равен null, так как item = null;Изначально он равен null, соответственно срабатывает это условие
а... Вот в этой строке..И когда мы туда попадаем?
if(stack.getItem() == RunesCollector.redirection_rune){item = stack;}
if(stack.getItem() == result.getItem()){item = stack;}