Помогите NMS Entity

DarklingCodex

Активный участник
Пользователь
Баллы
61
Здравствуйте, мне нужно кастомизировать баккитовских энтити с помощью NMS. Я делаю так очень просто, как по мне, но это не работает: создаю класс MyZombie extends EntityZombie implements MyEntityClass, регистрирую под айди 54 в onEnable(), при спавне моба (кастомизированного, то есть с определенным customName и тд) вызываю метод handle(), который возвращает bukkitEntity. Но это не работает, ошибок никаких нет. Что делать?
 
Последнее редактирование:
Класс как в одном из туториалов выше. Заменяет интелект всем коровам (92) на сервере. (у меня были какие-то проблемы со спавном существ тогда) Могу на следующей неделе порыться в сорсах сервера, разобраться почему спавн из туториала у меня не работал.
PHP:
import net.minecraft.server.v1_12_R1.Entity;
import net.minecraft.server.v1_12_R1.EntityCow;
import net.minecraft.server.v1_12_R1.EntityTypes;
import net.minecraft.server.v1_12_R1.MinecraftKey;
import org.bukkit.entity.EntityType;


public enum CustomEntities {

    COW("cow", 92, EntityType.COW, EntityCow.class, CustomCow.class); //сам класс

    private String name;
    private int id;
    private EntityType entityType;
    private Class<? extends Entity> nmsClass;
    private Class<? extends Entity> customClass;
    private MinecraftKey key;
    private MinecraftKey oldKey;

    private CustomEntities(String name, int id, EntityType entityType, Class<? extends Entity> nmsClass, Class<? extends Entity> customClass) {
        this.name = name;
        this.id = id;
        this.entityType = entityType;
        this.nmsClass = nmsClass;
        this.customClass = customClass;
        this.key = new MinecraftKey(name);
        this.oldKey = EntityTypes.b.b(nmsClass);
    }

    public static void registerEntities() { for (CustomEntities ce : CustomEntities.values()) ce.register(); }
    public static void unregisterEntities() { for (CustomEntities ce : CustomEntities.values()) ce.unregister(); }

    private void register() {
        EntityTypes.d.add(key);
        EntityTypes.b.a(id, key, customClass);
    }

    private void unregister() {
        EntityTypes.d.remove(key);
        EntityTypes.b.a(id, oldKey, nmsClass);
    }

    public String getName() {
        return name;
    }

    public int getID() {
        return id;
    }

    public EntityType getEntityType() {
        return entityType;
    }

    public Class<?> getCustomClass() {
        return customClass;
    }
}
PHP:
import java.util.LinkedHashSet;
import net.minecraft.server.v1_12_R1.EntityCow;
import net.minecraft.server.v1_12_R1.EntityCreeper;
import net.minecraft.server.v1_12_R1.EntityInsentient;
import net.minecraft.server.v1_12_R1.EntitySkeleton;
import net.minecraft.server.v1_12_R1.EntityWolf;
import net.minecraft.server.v1_12_R1.EntityZombie;
import net.minecraft.server.v1_12_R1.GenericAttributes;
import net.minecraft.server.v1_12_R1.IAttribute;
import net.minecraft.server.v1_12_R1.NavigationAbstract;
import net.minecraft.server.v1_12_R1.PathEntity;
import net.minecraft.server.v1_12_R1.PathfinderGoalFloat;
import net.minecraft.server.v1_12_R1.PathfinderGoalHurtByTarget;
import net.minecraft.server.v1_12_R1.PathfinderGoalMeleeAttack;
import net.minecraft.server.v1_12_R1.PathfinderGoalNearestAttackableTarget;
import net.minecraft.server.v1_12_R1.PathfinderGoalRandomLookaround;
import net.minecraft.server.v1_12_R1.PathfinderGoalSelector;
import net.minecraft.server.v1_12_R1.World;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
import static ua.Coolboy.ReflectionTest.Util.getPrivateField;

public class CustomCow extends EntityZombie {

    public CustomCow(net.minecraft.server.v1_12_R1.World world) {
        super(world);
        //очистка PathfinderSelector'ов
        LinkedHashSet goalB = (LinkedHashSet) getPrivateField("b", PathfinderGoalSelector.class, goalSelector);
        goalB.clear();
        LinkedHashSet goalC = (LinkedHashSet) getPrivateField("c", PathfinderGoalSelector.class, goalSelector);
        goalC.clear();
        LinkedHashSet targetB = (LinkedHashSet) getPrivateField("b", PathfinderGoalSelector.class, targetSelector);
        targetB.clear();
        LinkedHashSet targetC = (LinkedHashSet) getPrivateField("c", PathfinderGoalSelector.class, targetSelector);
        targetC.clear();
       //Свой интелект
        this.goalSelector.a(0, new PathfinderGoalFloat(this));
        this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityZombie.class, true));
        this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityCreeper.class, true));
        this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntitySkeleton.class, true));
        this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, true));
        this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this));
        this.goalSelector.a(0, new PathfinderGoalMeleeAttack(this, 1.0D, false));
       //кастомный PathfinderGoal, кажется тоже был в туториале
        this.goalSelector.a(2, new PathfinderGoalWalkToLoc(this, new Location(Bukkit.getWorld("world"),0,72,-24), 2));
    }

    @Override
    protected void initAttributes() {
        //Уже не помню зачем это. Кажется коровки не хотели никого бить
        super.initAttributes();
        //getAttributeMap().b(GenericAttributes.ATTACK_DAMAGE);
        getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(5.0);
    }
   //просто метод чтобы управлять Entity
    public void walkToLoc(Location loc, double speed) {
        EntityInsentient entity = this;
        NavigationAbstract navigation = entity.getNavigation();
        PathEntity path = navigation.a(loc.getX(), loc.getY(), loc.getZ());
        navigation.a(path, speed);
    }

}
 
Класс как в одном из туториалов выше. Заменяет интелект всем коровам (92) на сервере. (у меня были какие-то проблемы со спавном существ тогда) Могу на следующей неделе порыться в сорсах сервера, разобраться почему спавн из туториала у меня не работал.
PHP:
import net.minecraft.server.v1_12_R1.Entity;
import net.minecraft.server.v1_12_R1.EntityCow;
import net.minecraft.server.v1_12_R1.EntityTypes;
import net.minecraft.server.v1_12_R1.MinecraftKey;
import org.bukkit.entity.EntityType;


public enum CustomEntities {

    COW("cow", 92, EntityType.COW, EntityCow.class, CustomCow.class); //сам класс

    private String name;
    private int id;
    private EntityType entityType;
    private Class<? extends Entity> nmsClass;
    private Class<? extends Entity> customClass;
    private MinecraftKey key;
    private MinecraftKey oldKey;

    private CustomEntities(String name, int id, EntityType entityType, Class<? extends Entity> nmsClass, Class<? extends Entity> customClass) {
        this.name = name;
        this.id = id;
        this.entityType = entityType;
        this.nmsClass = nmsClass;
        this.customClass = customClass;
        this.key = new MinecraftKey(name);
        this.oldKey = EntityTypes.b.b(nmsClass);
    }

    public static void registerEntities() { for (CustomEntities ce : CustomEntities.values()) ce.register(); }
    public static void unregisterEntities() { for (CustomEntities ce : CustomEntities.values()) ce.unregister(); }

    private void register() {
        EntityTypes.d.add(key);
        EntityTypes.b.a(id, key, customClass);
    }

    private void unregister() {
        EntityTypes.d.remove(key);
        EntityTypes.b.a(id, oldKey, nmsClass);
    }

    public String getName() {
        return name;
    }

    public int getID() {
        return id;
    }

    public EntityType getEntityType() {
        return entityType;
    }

    public Class<?> getCustomClass() {
        return customClass;
    }
}
PHP:
import java.util.LinkedHashSet;
import net.minecraft.server.v1_12_R1.EntityCow;
import net.minecraft.server.v1_12_R1.EntityCreeper;
import net.minecraft.server.v1_12_R1.EntityInsentient;
import net.minecraft.server.v1_12_R1.EntitySkeleton;
import net.minecraft.server.v1_12_R1.EntityWolf;
import net.minecraft.server.v1_12_R1.EntityZombie;
import net.minecraft.server.v1_12_R1.GenericAttributes;
import net.minecraft.server.v1_12_R1.IAttribute;
import net.minecraft.server.v1_12_R1.NavigationAbstract;
import net.minecraft.server.v1_12_R1.PathEntity;
import net.minecraft.server.v1_12_R1.PathfinderGoalFloat;
import net.minecraft.server.v1_12_R1.PathfinderGoalHurtByTarget;
import net.minecraft.server.v1_12_R1.PathfinderGoalMeleeAttack;
import net.minecraft.server.v1_12_R1.PathfinderGoalNearestAttackableTarget;
import net.minecraft.server.v1_12_R1.PathfinderGoalRandomLookaround;
import net.minecraft.server.v1_12_R1.PathfinderGoalSelector;
import net.minecraft.server.v1_12_R1.World;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
import static ua.Coolboy.ReflectionTest.Util.getPrivateField;

public class CustomCow extends EntityZombie {

    public CustomCow(net.minecraft.server.v1_12_R1.World world) {
        super(world);
        //очистка PathfinderSelector'ов
        LinkedHashSet goalB = (LinkedHashSet) getPrivateField("b", PathfinderGoalSelector.class, goalSelector);
        goalB.clear();
        LinkedHashSet goalC = (LinkedHashSet) getPrivateField("c", PathfinderGoalSelector.class, goalSelector);
        goalC.clear();
        LinkedHashSet targetB = (LinkedHashSet) getPrivateField("b", PathfinderGoalSelector.class, targetSelector);
        targetB.clear();
        LinkedHashSet targetC = (LinkedHashSet) getPrivateField("c", PathfinderGoalSelector.class, targetSelector);
        targetC.clear();
       //Свой интелект
        this.goalSelector.a(0, new PathfinderGoalFloat(this));
        this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityZombie.class, true));
        this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityCreeper.class, true));
        this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntitySkeleton.class, true));
        this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, true));
        this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this));
        this.goalSelector.a(0, new PathfinderGoalMeleeAttack(this, 1.0D, false));
       //кастомный PathfinderGoal, кажется тоже был в туториале
        this.goalSelector.a(2, new PathfinderGoalWalkToLoc(this, new Location(Bukkit.getWorld("world"),0,72,-24), 2));
    }

    @Override
    protected void initAttributes() {
        //Уже не помню зачем это. Кажется коровки не хотели никого бить
        super.initAttributes();
        //getAttributeMap().b(GenericAttributes.ATTACK_DAMAGE);
        getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(5.0);
    }
   //просто метод чтобы управлять Entity
    public void walkToLoc(Location loc, double speed) {
        EntityInsentient entity = this;
        NavigationAbstract navigation = entity.getNavigation();
        PathEntity path = navigation.a(loc.getX(), loc.getY(), loc.getZ());
        navigation.a(path, speed);
    }

}
A method spawna?
 
Назад
Верх