Как сделать эффект игроку при взгляде на моба?

Версия Minecraft
1.12.2
4
0
Пишу код для своего моба. Хочу сделать так, чтобы на игрока, посмотревшего в глаза моба, наложился эффект, а моб стал бы подходить к игроку, и при этом на мобе появлялись частицы.
(Что-то наподобие того, как когда игрок смотрит на эндермена, но с эффектом и частицами)
Как такое можно сделать? Буду рад, если поможете.
 
5,397
179
984
В моде DivineRPG есть моб, при взгляде на которого дается эффект слепоты
Можно посмотреть, как он сделан
 
4
0
Можно посмотреть, как он сделан
В коде того моба я, кажется, нашёл фрагмент, который за это отвечает(Выделил его слэшами). Но что значат все эти field, func и цифры после них? Насколько я понял, это какие-то идентификаторы атрибутов, эффектов и всего подобного. Если это так, то можно ли как-то определить, к чему конкретно они относятся?
Я только начинающий в создании модов, так что в некоторых вещах пока не разбираюсь.

Java:
public class EntityTheEye extends EntityDivineRPGMob {
   private boolean hasPotion = false;

   public EntityTheEye(World worldIn) {
      super(worldIn);
      this.func_70105_a(1.3F, 2.0F);
   }

   public float func_70047_e() {
      return 1.75F;
   }

   protected void func_110147_ax() {
      super.func_110147_ax();
      this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(40.0D);
      this.func_110148_a(SharedMonsterAttributes.field_111264_e).func_111128_a(10.0D);
   }

   protected void func_184651_r() {
      super.func_184651_r();
      this.addAttackingAI();
   }
///////////Тот самый фрагмент//////////////////////////////////////////////////////////////////////////
   public void func_70636_d() {
      super.func_70636_d();
      EntityPlayer player = this.field_70170_p.func_184142_a(this, 64.0D, 64.0D);
      if (player != null) {
         Vec3d lookVec = player.func_70676_i(1.0F).func_72432_b();
         Vec3d lookAtMeVec = new Vec3d(this.field_70165_t - player.field_70165_t, this.func_174813_aQ().field_72338_b + (double)this.field_70131_O - (player.field_70163_u + (double)player.func_70047_e()), this.field_70161_v - player.field_70161_v);
         double distMagnitude = lookAtMeVec.func_72433_c();
         lookAtMeVec = lookAtMeVec.func_72432_b();
         double var7 = lookVec.func_72430_b(lookAtMeVec);
         if (var7 > 1.0D - 0.025D / distMagnitude && player.func_70685_l(this)) {
            player.func_70690_d(new PotionEffect(MobEffects.field_76440_q, 100, 0, false, true));
            if (player instanceof EntityPlayerMP) {
               ModTriggers.DIVINERPG_EYE.trigger((EntityPlayerMP)player);
            }
         }
      }

   }
//////////////////////////////////////////////////////////////////////////////////////////////////////

   protected boolean func_70814_o() {
      return true;
   }

   protected SoundEvent func_184639_G() {
      return ModSounds.THE_EYE;
   }

   protected SoundEvent func_184601_bQ(DamageSource source) {
      return ModSounds.THE_EYE_HURT;
   }

   protected SoundEvent func_184615_bR() {
      return ModSounds.THE_EYE_HURT;
   }

   protected ResourceLocation func_184647_J() {
      return DRPGLootTables.ENTITIES_THE_EYE;
   }

   public boolean func_70601_bi() {
      return this.field_70170_p.field_73011_w.getDimension() == 0 && this.field_70163_u <= 16.0D && super.func_70601_bi();
   }
}
 
Последнее редактирование:
144
7
31
У тебя походу скомпиленный дивайн в SRG. Посмотри исходники на гитхате, если надо будет ещё.
Это на 1.7.10, отличий от 1.12 практически не будет.
Java:
public void onLivingUpdate() {
        super.onLivingUpdate();
        EntityPlayer p = this.worldObj.getClosestVulnerablePlayerToEntity(this, 64.0);
        if (p != null) {
            Vec3 lookVec = p.getLook(1.0f).normalize();
            Vec3 lookAtMeVec = Vec3.createVectorHelper(this.posX - p.posX, this.boundingBox.minY + (double)this.height - (p.posY + (double)p.getEyeHeight()), this.posZ - p.posZ);
            double distMagnitude = lookAtMeVec.lengthVector();
            double var7 = lookVec.dotProduct(lookAtMeVec.normalize());
            if (var7 > 1.0 - 0.025 / distMagnitude && p.canEntityBeSeen(this)) {
                p.addPotionEffect(new PotionEffect(Potion.blindness.id, 100, 0, true));
                p.triggerAchievement(DivineRPGAchievements.eyeOfEvil);
            }
        }
    }
 
5,397
179
984
Дело в том, что в собранном виде мод обфусцирован также как и майнкрафт. Вообще, по этой причине пример из дивайна не очень хороший.
Чтобы получить деобфусцированные имена полей и методов можно юзать MCPMappingViewer
 
4
0
Ладно, у меня вроде как почти получилось переделать этот код под свою версию. Только вот на .worldObj мне всё еще выдаёт ошибку. Не знаете, чем его можно заменить? И вообще, правильный ли получился код в целом?
Java:
    public void onLivingUpdate() {
        super.onLivingUpdate();
        EntityPlayer p = this.worldObj.getClosestVulnerablePlayerToEntity(this, 64.0);
        if (p != null) {
            Vec3d vec3d = p.getLook(1.0F).normalize();
            Vec3d vec3d1 = new Vec3d(this.posX - p.posX, this.getEntityBoundingBox().minY + (double)this.getEyeHeight() - (p.posY + (double)p.getEyeHeight()), this.posZ - p.posZ);
            double d0 = vec3d1.lengthVector();
            vec3d1 = vec3d1.normalize();
            double d1 = vec3d.dotProduct(vec3d1);
            if (d1 > 1.0D - 0.025D / d0 ? p.canEntityBeSeen(this):false) {
                p.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 10));
            }
        }
    }
 

tox1cozZ

aka Agravaine
Модератор
7,124
455
2,148
Открой у себя в среде эндермена и скопируй у него. Там и переменные все правильные будут, и на твою актуальную версию.
 
Сверху