Движение игрока при проверке на блок

Версия Minecraft
1.7.10
769
1
42
Доброе утро, товарищи. Возник такой вопрос, как притягивать или отталкивать объект, когда он наступает на определенный блок через motionY?
Код:
public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
            int i = MathHelper.floor_double(player.posX);
            int j = MathHelper.floor_double(player.posY - 0.1);
            int k = MathHelper.floor_double(player.posZ);
            Block block = player.worldObj.getBlock(i, j, k);
            if (block == Blocks.iron_block) {
                for (int g = 0; g < player.worldObj.loadedEntityList.size(); ++g) {
                    Entity entity = (Entity)player.worldObj.loadedEntityList.get(g);
                        if (entity instanceof EntityPlayer) {
                            if (entity.motionY < 2.0D) entity.motionY -= 0.055D;//в данном случае притяжение
                            System.out.println(block.getLocalizedName());
                    }
                }

            } 
    }
С использование этой строки вместо начальной
Код:
int j = MathHelper.floor_double(player.posY - (player.worldObj.isRemote ? 2 : 1));

и при постановке + в motion, игрок постоянно подпрыгивает, находясь на блоке.
Можно ли как-то получше это реализовать?
 
Решение
Какой ужас
Во первых, этим кодом ты влияешь на ВСЕХ игроков, когда ОДИН на блоке железа
Во вторых, вот тебе код [анти-]магнита (меняешь += на -= и получаешь анти):

Код:
int s = 0;
for (int i = (world.isRemote ? -6 : -5); i < (world.isRemote ? -1 : 0); i++) if (world.getBlock(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY + i), MathHelper.floor_double(player.posZ)).getMaterial() == Material.iron) s = (world.isRemote ? -7 : -6) - i;
player.motionY += 0.1D * s;
1,976
68
220
Какой ужас
Во первых, этим кодом ты влияешь на ВСЕХ игроков, когда ОДИН на блоке железа
Во вторых, вот тебе код [анти-]магнита (меняешь += на -= и получаешь анти):

Код:
int s = 0;
for (int i = (world.isRemote ? -6 : -5); i < (world.isRemote ? -1 : 0); i++) if (world.getBlock(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY + i), MathHelper.floor_double(player.posZ)).getMaterial() == Material.iron) s = (world.isRemote ? -7 : -6) - i;
player.motionY += 0.1D * s;
 
1,976
68
220
svk2140 написал(а):
Зачем округлять то? Криво будет...

Ну как бы если ты на минусах, то при простом касте в int оно округляет со сдвигом на 1. Посему я и использую floor_double, чтобы учитывать и отрицательные координаты
 
Сверху