При получении дамага, слетает регенерация хп.

Версия Minecraft
1.7.10
API
Forge
Нужна помощь! Как сделать что бы при получении дамага, хил слетал?
@SubscribeEvent
public void removePotionEffectRegeneration(LivingHurtEvent event) {
if (event.source instanceof EntityDamageSource) {
EntityDamageSource dmgSource = (EntityDamageSource)event.source;
Entity from = dmgSource.getEntity();
EntityLivingBase to = event.entityLiving;
if (to.getActivePotionEffect(Potion.regeneration) != null) {
to.removePotionEffect(Potion.regeneration.id);
}
}
}
Пробовал так, но не работает
 
Бл*ха, в тема написано - При получении дамага, слетает регенерация хп. Я и подумал что слетает, написал что можно таймером в любой промежуток времени хилить любое количество ХП, а например при получении дамага офать таймер.
А так у тебя код рабочий, проверил только что, ты евент зарегистрировал на шине?
 
Слабо знаком с кодингом под 1.7.10, но вот тебе очевидное решение твоей проблемы:
В каждом ифе вставляешь вывод в консоль текста. Смотришь, на каком этапе вывода нет, и это место проверяешь на наличие ошибок. Полагаю, проблема появляется на моменте с проверкой на наличие эффекта у энтити.
 
создай отдельный класс с евентом
Event.java:
public class Event {

    @SubscribeEvent
    public void removePotionEffectRegeneration(LivingHurtEvent event) {
        if (event.source instanceof EntityDamageSource) {
            EntityDamageSource dmgSource = (EntityDamageSource)event.source;
            Entity from = dmgSource.getEntity();
            EntityLivingBase to = event.entityLiving;
            if (to.getActivePotionEffect(Potion.regeneration) != null) {
                to.removePotionEffect(Potion.regeneration.id);
            }
        }
    }
}

в init на стороне сервера тебе нужно зарегать ивент
CommonProxy.java:
public class CommonProxy {

    public void preInit() {
    }

    public void Init() { 
        MinecraftForge.EVENT_BUS.register(new Event());
    }

    public void postInit() {
    }
}
 
ну практически, вот держи готовую структуру для мода, я там упростил твой метод слегка
1609706628755.png
Core:
package ru.fr0le.newmod;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import ru.fr0le.newmod.common.CommonProxy;

@Mod(modid = Info.modid, name = Info.name, version = Info.version)

public class Core {

    @Mod.Instance(Info.modid)
    public static Core mod;

    @SidedProxy(clientSide = "ru.fr0le.newmod.client.ClientProxy", serverSide = "ru.fr0le.newmod.common.CommonProxy")
    public static CommonProxy proxy;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        proxy.preInit();
    }

    @EventHandler
    public void init(FMLInitializationEvent event) {
        proxy.init();
    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
        proxy.postInit();
    }

}
Info:
package ru.fr0le.newmod;

public class Info {

    public static final String name = "New Mod";
    public static final String modid = "newmod";
    public static final String version = "0.0.1";

}
ClientProxy:
package ru.fr0le.newmod.client;

import org.lwjgl.opengl.Display;

import ru.fr0le.newmod.Info;
import ru.fr0le.newmod.common.CommonProxy;

public class ClientProxy extends CommonProxy {

    @Override
    public void preInit() {
        super.preInit();
        Display.setTitle(Info.name + " demo");
    }

    @Override
    public void init() {
        super.init();
    }

    @Override
    public void postInit() {
        super.postInit();
    }

}
CommonProxy:
package ru.fr0le.newmod.common;

import net.minecraftforge.common.MinecraftForge;
import ru.fr0le.newmod.common.handlers.Event;

public class CommonProxy {

    public void preInit() {
    }

    public void init() {
        MinecraftForge.EVENT_BUS.register(new Event());
    }

    public void postInit() {
    }

}
Event:
package ru.fr0le.newmod.common.handlers;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.potion.Potion;
import net.minecraftforge.event.entity.living.LivingHurtEvent;

public class Event {

    @SubscribeEvent
    public void removePotionEffectRegeneration(LivingHurtEvent event) {
        if(event.entityLiving instanceof EntityPlayer && event.entityLiving.isPotionActive(Potion.regeneration))
            event.entityLiving.removePotionEffect(Potion.regeneration.id);      
    }

}
 
Последнее редактирование:
То что я написал выше работает для твоего вопроса, на тебе висит регенерация, ты получаешь урон, эффект регенерации удаляется.
В setHealth (я его сразу предложил, так как не понял до конца суть вопроса) это разовое пополнение, если юзать в таймере, это нужно ещё дописывать код, например таймер в теги игрока, апдейт добавлять и потом отключение таймера при получении урона, в методе в предыдущем сообщении это намного проще.
 
Назад
Сверху