Дополнительные свойства для Item 1.6.2

Статус
В этой теме нельзя размещать новые ответы.
Всем доброго времени суток, подскажите пожалуйста, столкнулся с проблемой, решил добавить в игру минералку, но реализма то нет, в том смысле что огромную минералку (примерно 1.5 литра) игрок выпивает сразу залпом. Придумал я вот что, сделал несколько иконок, внизу каждой показанно сколько ещё можно выпить из этой бутылки. Как мне сделать так чтобы после того как игрок выпьет один раз, итему далась другая текстура, потом ещё и т.д. (способ который я знаю, это сделать так чтобы после того как игрок выпил одну бутылку, ему далась ещё одна, только с другой текстурой, но это надо создавать идемы, что очень муторно) подскажите пожалуйста.
 
Метадата. Используй itemDamage как метадату и на основе "дамага" бутылки выдавай нужную иконку, плюс действие.
Есть даже специальный метод, который выдает иконку в зависимости от дамага:

Код:
public Icon getIconFromDamage(int par1)
 
Делаешь предмет с метадатой по туториалу анти, а в onFoodEaten просто уменьшаешь метадату.
 
Majestic написал(а):
Делаешь предмет с метадатой по туториалу анти, а в onFoodEaten просто уменьшаешь метадату.
Метадата это ведь полоска внизу итема, меча, инструмента и т.д после конца которой предмет ломается. Если это так, то я нашёл урок где он делал эту метадату мечу и топору, правда он создавал новый материал который подключался к новуму мечу,а в материале и прописывалась значение после которой предмет сломается. Делать так или всё что я сказал очень мудрёней? Просто я не могу найти его урок, можешь скинуть этот урок, если не трудно, пожалуйста
 
HanteR12372, полоска внизу итема, это графический рендер который определяет значение метадаты повреждения предмета, его можно и убрать, но это зависит от тебя нужен он или нет, его можно использовать и за и против.
Можно сделать, что-то наподобие ломающийся предмета, который уровень повреждения будет показывать количество воды. Или не использовать графический рендер повреждения с использованием "setHasSubtypes(true);" в предмете. Через несколько десятков минут покажу примеры.
 
Не знаю кто-такой "Timoxa007", но пожалуйста.
Ломающийся предмет.
Код:
public class ItemDrinks extends Item {

public ItemDrinks(int id) {
super(id);
setCreativeTab(PackPlantMedicalFood.proxy.tabFoodPack);
setMaxStackSize(1);
setMaxDamage(1500);
setTextureName("timaxa007:drinks/test");
setUnlocalizedName("drinks");
}

public ItemStack onEaten(ItemStack is, World world, EntityPlayer player) {
if (!world.isRemote) {
player.getFoodStats().addStats(2, 0.2F);
is.setItemDamage(is.getItemDamage() + 500);
}
return is;
}

public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
if (is.getItemDamage() < is.getMaxDamage()) {
player.setItemInUse(is, getMaxItemUseDuration(is));
}
return is;
}

public int getMaxItemUseDuration(ItemStack is) {
return 32;
}

public EnumAction getItemUseAction(ItemStack is) {
return EnumAction.drink;
}

}

Или без графического рендера повреждения, но с разными иконками.
Код:
public class ItemDrinks extends Item {

@SideOnly(Side.CLIENT) private Icon[] icon_tex;

private static String[] type_ml = new String[] {
"1500",
"1000",
"500",
"0"
};

public ItemDrinks(int id) {
super(id);
setCreativeTab(PackPlantMedicalFood.proxy.tabFoodPack);
setMaxStackSize(1);
setMaxDamage(0);
setHasSubtypes(true);
setTextureName("timaxa007:drinks/test");
setUnlocalizedName("drinks");
}

public ItemStack onEaten(ItemStack is, World world, EntityPlayer player) {
if (!world.isRemote) {
player.getFoodStats().addStats(2, 0.2F);
is.setItemDamage(is.getItemDamage() + 1);
}
return is;
}

public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
if (is.getItemDamage() < type_ml.length - 1) {
player.setItemInUse(is, getMaxItemUseDuration(is));
}
return is;
}

public int getMaxItemUseDuration(ItemStack is) {
return 32;
}

public EnumAction getItemUseAction(ItemStack is) {
return EnumAction.drink;
}

@SideOnly(Side.CLIENT)
public boolean requiresMultipleRenderPasses() {return true;}

public Icon getIcon(ItemStack is, int pass) {
return icon_tex[is.getItemDamage()];
}

@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister ir) {
super.registerIcons(ir);
itemIcon = ir.registerIcon(getIconString());
icon_tex = new Icon[type_ml.length];
for (int i = 0; i < type_ml.length; ++i) {
icon_tex[i] = ir.registerIcon(getIconString() + "_" + type_ml[i]);
}
}

}
[merge_posts_bbcode]Добавлено: 15.08.2014 15:09:18[/merge_posts_bbcode]

Да, забыл... Код проверялся на 1.6.4, а на 1.6.2 я не знаю как он поведёт.
 
Или же можно делать и то,  и то, как говорит анти - "через задницу"
 
Спасибо большое за код, всё работает, прости, timaxa007, я твой ник случайно не так написал
 
HanteR12372, пожалуйста. Ни чего страшного.
 
timaxa007 написал(а):
HanteR12372, пожалуйста. Ни чего страшного.
Код пришлось немного изменить для 1.6.2, но немного, так что всё заработало, ещё раз спасибо.
Ну так вот, ещё вопрос, наверное глупый, как сделать так чтобы предмет пропал после конца использования его использования, пожалуйста? Пытался изменить в коде, но приходят ошибки.
 
Типа так:
Код:
public ItemStack onEaten(ItemStack is, World world, EntityPlayer player) {
if (!world.isRemote) {
player.getFoodStats().addStats(2, 0.2F);
is.setItemDamage(is.getItemDamage() + 500);
//
if (is.getItemDamage() == is.getMaxDamage()) {
return new ItemStack(Item.glassBottle, 1, 0);
}
//
}
return is;
}
 
timaxa007 написал(а):
Типа так:
Код:
public ItemStack onEaten(ItemStack is, World world, EntityPlayer player) {
if (!world.isRemote) {
player.getFoodStats().addStats(2, 0.2F);
is.setItemDamage(is.getItemDamage() + 500);
//
if (is.getItemDamage() == is.getMaxDamage()) {
return new ItemStack(Item.glassBottle, 1, 0);
}
//
}
return is;
}
Спасибо большое, работает, тему можно закрыть
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху