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);
}
}