[Эффект] Как сделать. Старые темы не помогли.

Версия Minecraft
1.7.10
5,018
47
783
Друзья, грибы у меня что то слишком безобидные. надо им эффекты свои делать. Вот только как? Я не имею ввиду ванильные эффекты вызывать, а полностью свои. Например, как бухач в Pcyhodely Craft(зачетный модик кстати :) ). Чтобы было свое время действия, свое действие и т д. Как то через абстрактные ванильные делать? Или можно с чистого листа писать?
 
1,057
50
234
Код:
public class Radiation extends Potion
{
	public Radiation(int id, boolean isBad, int color)
	{
		super(id, isBad, color);
		this.setIconIndex(1, 0);
	}

	@Override
	public int getStatusIconIndex()
	{
		Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation(GalaxySpace.ASSET_PREFIX + ":" + "textures/gui/potions/GSPotionFX.png"));
		return 0;
	}

	@Override
	public boolean isReady(int duration, int amplifier)
	{
		if (this.id == GSPotions.radiation.id)
		{
			int k = 20 >> amplifier;
			return k > 0 ? duration % k == 0 : true;
		}
		return false;
	}

	@Override
	public void performEffect(EntityLivingBase living, int food)
	{
		if (this.id == GSPotions.radiation.id)
		{
			living.attackEntityFrom(DamageSourceGC.thermal, 1.0F);
		}
	}
}
 
5,018
47
783
Спасибо за пример. Есть еще добрфе люди с примерами? буду благодарен!
 

Eifel

Модератор
1,623
78
608
Как я делаю у себя:
1. Увеличиваем место для своих зелий/эффектов:
Код:
public static void potionReflection()
 {
 try
 {
 Potion[] potionTypes;
 Field f = ReflectionHelper.findField(Potion.class, "potionTypes", "field_76425_a");

 Field modfield = Field.class.getDeclaredField("modifiers");
 modfield.setAccessible(true);
 modfield.setInt(f, f.getModifiers() & ~Modifier.FINAL);
 potionTypes = (Potion[])f.get(null);

 if (potionTypes.length <= 128)
 {
 final Potion[] newPotionTypes = new Potion[256];
 System.arraycopy(potionTypes, 0, newPotionTypes, 0, potionTypes.length);
 f.set(null, newPotionTypes);
 }
 else
 {
 logWarning("potionTypes's array length was previously reflected.");
 }
 }
 catch (Exception e)
 {
 logError("Error during Potion array reflection.", e);
 }
 }

2. Создаем зелье:
Код:
public static Potion EnderBattleEffect;
Код:
EnderBattleEffect = new EnderBattleEffect(BionisationConfig.EnderBattleEffectId, true, 0xe0781d).setPotionName("Ender Battle");
Где первый аргумент это Id эффекта, второй - плохой ли это эффект, третий - цвет пузырьков (чтоб их не было вообще можно просто написать 0).

3. Класс нашего эффекта:
Код:
public class EnderBattleEffect extends Potion {
 
 private static final ResourceLocation location = new ResourceLocation(BionisationInfo.MODID,"/textures/effecticons/IconImage4.png".substring(1));
  
 public EnderBattleEffect(int id1, boolean badEffect, int liquidColor)
  {
    super(id1, badEffect, liquidColor);
 this.setEffectiveness(0.25D);
 this.setIconIndex(5, 0);

  }   
 
    public boolean shouldRenderInvText(PotionEffect effect)
    {
        return true;
    }
    
    public Potion setIconIndex(int x, int y){
     super.setIconIndex(x, y);
     return (Potion) this;
     }

    public int getStatusIconIndex(){
     ITextureObject texture = Minecraft.getMinecraft().renderEngine.getTexture(location);
     Minecraft.getMinecraft().renderEngine.bindTexture(location);

     return super.getStatusIconIndex();
    }
    

      
    
}
Тут IconImage4.png это вот такая вот картинка , где ты рисуешь свою иконку для эффекта. Индексы считаются так. Например первая строчка - 0,0; 1,0; 2,0 и т.д.; вторая строчка - 0,1; 1,1; 2,1 и т.д. И в конструкторе где есть:
Код:
this.setIconIndex(5, 0);
ты вписываешь свои индексы.

4. Регаю EventHandler для эффекта и пишу там:
Код:
@SubscribeEvent
 public void PlayerBattlePotionTicking(LivingUpdateEvent event){
 if (!FMLCommonHandler.instance().getEffectiveSide().isClient() && event.entityLiving instanceof EntityPlayer) {
 EntityPlayer player = (EntityPlayer) event.entityLiving;
 if (player.getActivePotionEffects().isEmpty()) return;
 
 if(player.isPotionActive(BionisationPotionList.EnderBattleEffect)){
//делаю тут все что мне надо. Чтоб получить действующий эффект можно написать так:
PotionEffect effectEnderBattleEffect = player.getActivePotionEffect(BionisationPotionList.EnderBattleEffect);
И дальше получаю с него все что хочу.
}
}
}
 
5,018
47
783
>> 1. Увеличиваем место для своих зелий/эффектов:

Это куда вставлять?
 
5,018
47
783
И еще. Он просит какой то Finally (вставляю в init(FMLPreInitializations) )
Код:
public static void potionReflection()
{
try
{
Potion[] potionTypes;
Field f = ReflectionHelper.findField(Potion.class, "potionTypes", "field_76425_a");

Field modfield = Field.class.getDeclaredField("modifiers");
modfield.setAccessible(true);
modfield.setInt(f, f.getModifiers() & ~Modifier.FINAL);
potionTypes = (Potion[])f.get(null);

if (potionTypes.length <= 128)
{
final Potion[] newPotionTypes = new Potion[256];
System.arraycopy(potionTypes, 0, newPotionTypes, 0, potionTypes.length);
f.set(null, newPotionTypes);
}
else
{
logWarning("potionTypes's array length was previously reflected.");
}
}
catch (Exception e)
{
logError("Error during Potion array reflection.", e);
}
}
А также ругается на logWarning и logError.

Конечно понятно, что это методы, и их надо создать... А что то писать там надО?
 
5,018
47
783
Все сделал. Только вот, как сделать что то типо ванильного отравления, когда экран крутит как неродной?
И вообще, как сделать эффекты в игре эффекту:)
 
5,018
47
783
Thunder написал(а):
просто накладывать на игрока ванильное отравление пока действует твой эффект не вариант?

Я ж писал - свой хочу) Ну ладно, это не очень важно. Вот например, где писать... А вообще, если тебя не затруднит, можешь в учебнике тему сделать с рабочим готовым примером, думаю полезно будет. Я прост думаю, мож тоже сделать тему как Wildheart только для 1.7.2 - 1.7.10
 
Сверху