Тикхэндлер и радиус тайлэнтити

Допустим, есть тикхэндлер, в котором я буду добавлять игроку по 1 единице чего либо. Но нужно условие, что если игрок находится в радиусе какого либо тайлэнтити или блока, то ему добавляется по единице значения. Каким условием сделать такую проверку и где правильно будет добавлять значения счетчика?
 

timaxa007

Модератор
5,831
409
672
1,990
18
105
Если не хочешь перебирать тонну блоков, выцепи чанк, где находится игрок. Как раз тебе нужен тайл, а они хранятся отдельно.
Простая проверка:
for (TileEntity tileEntity : chunk.tileEntityMap.values())
  if (tileEntity instanceof YOURTILEENTITY) {
    ...
  }
Единственное, у мапы в чанке типы строго не указаны, так что придется либо конвертить в самом ветвлении из Object в TileEntity, либо делать свою мапу с типизацией, перекинув туда все значения из существующей.
Как вариант, тебе придется проверять несколько чанков, если игрок стоит на пересечении четырех, к примеру.

У тимахи вариант лучше с точки зрения оптимизации, но он не прокатит для ванильных тайлов. Мой вариант чуть универсальнее, но за это приходится платить скоростью.
 
Конь, там дело в том, что мне не нужно работать с ванильным тайлом. У меня свой, у которого есть радиус 3х блоков в сферическом варианте. И вот нужно как игрок войдет в эту зону тайла, надо добавлять ему по какому то значению в экстендед энтити игрока, аля счетчик, который при заполнении убивает игрока. Это то уже реализовано, а вот добавление единиц к счетчику при нахождении в радиусе тайла сделать не могу.
 
Я понимаю, что добавлять значения надо в тайле, но каким боком? Просто не могу понять только этого. Условие, цикл или что? Тут просто ни в какую не могу допереть.
Прошу не пинаться за "радиацию", просто так удобнее назвать некоторую хрень.
Код из тикхэндлера:
Код:
private void radiation(EntityPlayer player) {
          ModPlayerHandler player_props = ModPlayerHandler.getServerPlayer(player);
          if(!player.isDead) {
             if(player_props.getRadiation() == 5000) {
                ModChatHandler.sendMsgChatToPlayer(player, EnumChatFormatting.DARK_GREEN + "1");
             }

             if(player_props.getRadiation() == 15000) {
                ModChatHandler.sendMsgChatToPlayer(player, EnumChatFormatting.YELLOW + "2");
             }

             if(player_props.getRadiation() == 25000) {
                ModChatHandler.sendMsgChatToPlayer(player, EnumChatFormatting.DARK_RED + "3");
             }

             if(player_props.getRadiation() == 32500) {
                ModChatHandler.sendMsgChatToPlayer(player, EnumChatFormatting.DARK_RED + "4");
             }

             if(player_props.getRadiation() >= '\u88b8') {
                player.attackEntityFrom(ModDamageSource.radiationDeath, 20.0F);
                return;
             }

             if(player.isSprinting()) {
                player_props.addRadiation(100);
             } else {
                player_props.addRadiation(50);
             }
          }

       }
 
1,990
18
105
Господи, что ж ты делаешь. Нафига тебе тикхэндлер?
В тайле есть метод onUpdate.
Дальше создаешь AABB, задаешь ему размер 5х5х5 (либо 7х7х7) (в твоём случае), собираешь всех энтитей через готовый метод, потом снова пробегаешься по собранным энтитям и обрезаешь всех у кого дистанция до тайла (есть готовый метод) больше нужного радиуса, получается отличное отсечение по сфере и никакого гемора.
 
Ай елки. Суть вот в чем, вот есть тайл, в нем данный код. Но когда вхожу в радиус - выкидывает с крашем типо java.lang.NullPointerException: Ticking block entity, ругаясь на ldp.addRadiation(1000);
Код:
package ru.mod.common.tileentities;

import java.util.List;

import ru.mod.common.handlers.ModPlayerHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.particle.EntityCritFX;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;

public class TileEntityBlockParticles1 extends TileEntity {

    
    ModPlayerHandler ModPlayerHandler;
   
   public void updateEntity()
   {
       super.updateEntity();
       World w = this.worldObj;

       double maxRadius = 5;
    if (w.isRemote)
       {
           AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord - 1.5, zCoord - 1, xCoord + 2, yCoord + 1.5, zCoord + 2);
           List<Entity> entities = w.getEntitiesWithinAABB(EntityPlayer.class, aabb);
           entities.addAll(w.getEntitiesWithinAABB(EntityCritFX.class, aabb));

           for (Entity entity : entities)
           {
               if (entity.getDistance(xCoord + 0.5, yCoord + (entity.posY - entity.boundingBox.minY), zCoord + 0.5) < maxRadius)
               {
                   int activeTimer = 50;
                   break;
               }
           }
       }
       else
       {
           for (int i = 0; i < w.playerEntities.size(); i++)
           {
               EntityPlayer p = (EntityPlayer) w.playerEntities.get(i);
               ModPlayerHandler ldp = ModPlayerHandler;

               if (p.getDistance(this.xCoord + 0.5, this.yCoord, this.zCoord + 0.5) < maxRadius)
               {
                   //p.addVelocity(0, 1, 0); //вот эта хрень кстати не работает, хз как заставить работать.
                   ldp.addRadiation(1000);
               }
           }
       }
   }
}
 
Agravaine написал(а):
Я же без понятия, что это за класс и нафига он.
Код таков:
Код:
public class ModPlayerHandler implements IExtendedEntityProperties {

   public static final String LD_PROPS = "ExtendedPlayer";
   private final int radiation = 24;
   private final int thirst = 25;
   private final int temperature = 26;
   private final int karma = 27;
   private final int status = 28;
   private final int entityID = 29;
   public static Map customSlotsData = new HashMap();
   public ItemStack[] inventory = new ItemStack[36];
   public int currentItem;
   public EntityPlayer player;
   public static float maxX;
   public static float maxY;
   public static boolean scopingX;
   public static boolean scopingY;
   public boolean aiming;

 ...

   public final void saveNBTData(NBTTagCompound par1NBTTagCompound) {
      NBTTagCompound par1NBTCompound = new NBTTagCompound();
      DataWatcher var10002 = this.player.getDataWatcher();
      this.getClass();
      par1NBTCompound.setInteger("radiation", var10002.getWatchableObjectInt(24));
      var10002 = this.player.getDataWatcher();
      this.getClass();
      par1NBTCompound.setInteger("thirst", var10002.getWatchableObjectInt(25));
      var10002 = this.player.getDataWatcher();
      this.getClass();
      par1NBTCompound.setInteger("temperature", var10002.getWatchableObjectInt(26));
      var10002 = this.player.getDataWatcher();
      this.getClass();
      par1NBTCompound.setInteger("karma", var10002.getWatchableObjectInt(27));
      var10002 = this.player.getDataWatcher();
      this.getClass();
      par1NBTCompound.setString("status", var10002.getWatchableObjectString(28));
      par1NBTTagCompound.setTag("ExtendedPlayer", par1NBTCompound);
   }

   public final void loadNBTData(NBTTagCompound par1NBTTagCompound) {
      NBTTagCompound par1NBTCompound = (NBTTagCompound)par1NBTTagCompound.getTag("ExtendedPlayer");
      DataWatcher var10000 = this.player.getDataWatcher();
      this.getClass();
      var10000.updateObject(24, Integer.valueOf(par1NBTCompound.getInteger("radiation")));
      var10000 = this.player.getDataWatcher();
      this.getClass();
      var10000.updateObject(25, Integer.valueOf(par1NBTCompound.getInteger("thirst")));
      var10000 = this.player.getDataWatcher();
      this.getClass();
      var10000.updateObject(26, Integer.valueOf(par1NBTCompound.getInteger("temperature")));
      var10000 = this.player.getDataWatcher();
      this.getClass();
      var10000.updateObject(27, Integer.valueOf(par1NBTCompound.getInteger("karma")));
      var10000 = this.player.getDataWatcher();
      this.getClass();
      var10000.updateObject(28, par1NBTCompound.getString("status"));
   }

  ...
   
   public final void resetRadiation() {
          DataWatcher var10000 = this.player.getDataWatcher();
          this.getClass();
          var10000.updateObject(24, Integer.valueOf(0));
       }

       public void addRadiation(int amout) {
          DataWatcher var10000 = this.player.getDataWatcher();
          this.getClass();
          var10000.updateObject(24, Integer.valueOf(this.getRadiation() + amout));
       }

       public void subtractRadiation(int amout) {
          if(this.getRadiation() > 0) {
             System.out.println(this.getRadiation());
             DataWatcher var10000 = this.player.getDataWatcher();
             this.getClass();
             var10000.updateObject(24, Integer.valueOf(this.getRadiation() - amout));
          }
       }

       public int getRadiation() {
          DataWatcher var10000 = this.player.getDataWatcher();
          this.getClass();
          return var10000.getWatchableObjectInt(24);
       }
  ...etc etc
}
 
1,990
18
105
http://www.minecraftforum.net/forums/mapping-and-modding/mapping-and-modding-tutorials/1571567-forge-1-6-4-1-8-eventhandler-and
Ты хоть зарегистрировал класс с расширенными параметрами? Второй пост в топике смотри.

ЗЫ. Что это за дерьмо, откуда код воровал?
      this.getClass();
      par1NBTCompound.setInteger("radiation", var10002.getWatchableObjectInt(24));
      var10002 = this.player.getDataWatcher();
      this.getClass();
      par1NBTCompound.setInteger("thirst", var10002.getWatchableObjectInt(25));
      var10002 = this.player.getDataWatcher();
      this.getClass();
      par1NBTCompound.setInteger("temperature", var10002.getWatchableObjectInt(26));
      var10002 = this.player.getDataWatcher();
      this.getClass();
      par1NBTCompound.setInteger("karma", var10002.getWatchableObjectInt(27));
      var10002 = this.player.getDataWatcher();
      this.getClass();
 
Он зарегистрирован. Жажда работает по аналогии. Каждый тик в тикхэндлере прибавляю по значению, все окей. Но тут значения надо прибавлять если игрок в радиусе тайла есть. Так вот, пробую добавлять из тайла - краш. Если добавляю просто так из тикхэндлера, то все окей.
 
1,990
18
105
Код:
 EntityPlayer p = (EntityPlayer) w.playerEntities.get(i);
 ModPlayerHandler ldp = ModPlayerHandler;
Проблемы именования переменных. Почитай кодестайлы, а. Чуть мозг не сломал.

Твоя проблема в том, что ты творишь хрень не видишь очевидного.
Код:
EntityPlayer p = (EntityPlayer) w.playerEntities.get(i);

Вот есть игрок. Угадай, как достать его расширенные аттрибуты?
А вот так (название метода может отличаться, но смысл именно такой, ты найдешь его по аргументу):
Код:
ModPlayerHandler.getForPlayer(p);

Вместо твоего
Код:
ModPlayerHandler ldp = ModPlayerHandler;

Не из воздуха эти параметры берутся, они же к игроку привязаны. Значит надо достать их из игрока обратно.
 
Ты втираешь мне какую то дичь. Я действительно не могу понять, что я делаю не так. От комментария содержания "какой ты баран" ничего против не скажу. Я действительно не понимаю.
Код:
else
       {
           for (int i = 0; i < w.playerEntities.size(); i++)
           {
               EntityPlayer p = (EntityPlayer) w.playerEntities.get(i);
               LDPlayerHandler player_props = LDPlayerHandler.getServerPlayer(player);
               LDPlayerHandler.getRadiation();

               if (p.getDistance(this.xCoord + 0.5, this.yCoord, this.zCoord + 0.5) < maxRadius)
               {
                   player_props.addRadiation(100);
               }
           }
       }
 
1,990
18
105
kiss_18kb.1431012632.jpg

И что ты делаешь? Какую-то левую переменную суешь, объявление которой в коде даже не видно, и удивляешься чему-то.
Ты так, наобум код сюда пишешь, или компилируешь ради фана хоть?
Может, стоит передать туда p, а не player?
Следующая строка тоже веет абсурдом. Нафига ты просто так вызываешь геттер? Да ещё и статично, когда геттер, судя по коду выше, нифига не статичен.
Как там компиляция идёт вообще, ау?

Иди проспись, короче.
 
Проспаться не помешает. Компиляция?.. да вполне себе так, шустренько..
 
А никто не задумывался о том, что к нбт счетчику надо добавлять значение по другому? Тут просто натолкнули на мысль. А вот как добавлять, хз.
 
Сверху