Obj модель

Версия Minecraft
1.7.10
И снова я, и снова по телепорту.
У меня есть блок с моделью и посредством AxisAlignedBB я отслеживаю игрока находящегося в каком-то радиусе от блока.
И когда игрок в этом самом радиусе я хочу менять текстуру модели.
Применив знания костылей я сделал проверку на boolean и смену текстуры в рендере. 
Этот костыль мне не подходит потому что я криворукий  такая проверка требует static переменной(ну или я так думаю по крайней мере) и меняет всем телепортам текстуру.

Расскажите мне пожалуйста другой способ изменить текстуру по проверке AxisAlignedBB. 


Еще как сделать чтобы действие отменялось по выходу игрока из зоны действия телепорта.(ну типо сразу был а = 0, в зоне a = 1, а как вышел стало опять a = 0)
 

timaxa007

Модератор
5,831
409
672
lordraider написал(а):
И снова я, и снова по телепорту.
У меня есть блок с моделью и посредством AxisAlignedBB я отслеживаю игрока находящегося в каком-то радиусе от блока.
И когда игрок в этом самом радиусе я хочу менять текстуру модели.
Применив знания костылей я сделал проверку на boolean и смену текстуры в рендере. 
Этот костыль мне не подходит потому что я криворукий  такая проверка требует static переменной(ну или я так думаю по крайней мере) и меняет всем телепортам текстуру.

Расскажите мне пожалуйста другой способ изменить текстуру по проверке AxisAlignedBB. 


Еще как сделать чтобы действие отменялось по выходу игрока из зоны действия телепорта.(ну типо сразу был а = 0, в зоне a = 1, а как вышел стало опять a = 0)



Создать переменную boolean (не static) в тайле или блоке.
update проверять, находиться-ли кто-то в AxisAlignedBB. Если, да - то переменная boolean в тайле или блоке true, если нет, то false.
По-этой переменной изменяется текстурка.
По-этой переменной отменялось или что-то делаеться.


Эту перемену брать через объект, а не через класс.
 

timaxa007

Модератор
5,831
409
672
lordraider написал(а):
timaxa007 написал(а):
Эту перемену брать через объект, а не через класс.

Скажи пожалуйста как. Я не очень понимаю.

Если тайл, то не TileEntityMy.stat, а:
Код:
TileEntity tile_entity = world.getTileEntity(x, y, z);
if (tile_entity instanceof TileEntityMy) {
	TileEntityMy tem = (TileEntityMy)tile_entity;
	boolean stat = tem.stat;
}

Если блок, то не BlockMy.stat, а:
Код:
Block block = world.getBlock(x, y, z);
if (block instanceof BlockMy) {
	BlockMy bm = (BlockMy)block;
	boolean stat = bm.stat;
}
 
Спасибо. Вот только я никогда не работал с этим. И не понимаю что и куда. Куда прописать этот код? В рендер? Если в рендер то именно куда. И еще вопрос не менее глупый. world.getTileEntity(x, y, z); x y z нужно как то определять если да то как?
 
7,099
324
1,510
Так блок же синглтон, там для всех блоков в мире будет один экземпляр BlockMy. Т.е. Такую переменную нужно держать только в тайле
 
Сделал вот так
Код:
	@Override
	public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float f) {
		render((TileEntityTeleport)tile, x, y, z, f);
		
		TileEntity tile_entity = tile;
		
		if (tile_entity instanceof TileEntityTeleport) {
		    TileEntityTeleport tem = (TileEntityTeleport)tile_entity;
		    boolean stat = tem.check1;
		    if(stat)
		    {
		    	texture = texture2;
		    }else
		    {
		    	texture = texture1;
		    }

		}
		
	}
Казалось бы все нормально. Но нет.
Записал видео так-как описать все много текста.
[video=youtube]https://www.youtube.com/watch?v=g9738hPK2l4[/video]
 

timaxa007

Модератор
5,831
409
672
В твоём методе func_146000_x, твоя переменная check1 становиться true, но он какбы не становиться false, когда там ни кого нет. Так-же желательно чтобы у этой переменной был модификатор public. Пока-что что-то другого не увил.


Но всё-же на счёт текстуры, не очень понятно где оно у тебя плохо работает.
 
timaxa007 написал(а):
В твоём методе func_146000_x, твоя переменная check1 становиться true, но он какбы не становиться false, когда там ни кого нет. Так-же желательно чтобы у этой переменной был модификатор public. Пока-что что-то другого не увил.


Но всё-же на счёт текстуры, не очень понятно где оно у тебя плохо работает.


check1 уже делал public разницы не заметил.
И не изменяется даже в 1 сторону, т.е был false, true становится но не обновляется блок к которому относиться это переменная.


Agravaine написал(а):
Простите, но у вас же константа, которая не зависит не от чего...

Какая?


timaxa007 написал(а):
В твоём методе func_146000_x, твоя переменная check1 становиться true, но он какбы не становиться false, когда там ни кого нет.
Сделал проверку на if\else
Код:
            if (iterator.hasNext())
            {
            	
                player = (EntityPlayer)iterator.next();

                check1 = false;
                
                if(!check1)
                {
                	System.out.println("[TELEPORT] teleport collide");
                }
            }else
            {
            	check1 = true;
            	if(check1)
            	{
            		System.out.println("[TELEPORT] teleport !collide");
            	}
            }
 
Пару раз проверив я понял в чем ошибка(но как так получилось я не понял)
Когда я в тайле проверяю check1

Код:
Код:
public void updateEntity()
   {
    System.out.println(check1);
    }

Значение не устанавливается постоянно меняется произвольно.
Не знаю что делать
 

timaxa007

Модератор
5,831
409
672
lordraider, в методе func_146000_x у тебя проверка на "!worldObj.isRemote", по-этому тебя могут быть разные значения с разных сторон. Как порекомендовал wilah, отсылаешь пакет о состоянии check1, либо убрать проверку.
[video=youtube]https://www.youtube.com/watch?v=tGcwGmXAzDk[/video]
 
Попробовал отослать пакет
вот так
Код:
MainClass.packetPipeline.sendToServer(new SyncTeleport(tp ,true));
Использовал этот тутор.
Мои классы

SyncTeleport
Код:
public class SyncTeleport extends AbstractPacket {
    public TileEntityTeleport te;
    public boolean i;

    public SyncTeleport(){}

    // The basic, no-argument constructor MUST be included to use the new automated handling
    public SyncTeleport(TileEntityTeleport teleport, boolean i ){
        this.te=teleport;
        this.i=i;
        
    }

    // if there are any class fields, be sure to provide a constructor that allows
    // for them to be initialized, and use that constructor when sending the packet


    @Override
    public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
    // basic Input/Output operations, very much like DataOutputStream
        buffer.writeBoolean(i);
    }

    @Override
    public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
    // basic Input/Output operations, very much like DataInputStream
        i = buffer.readBoolean();
    }

    @Override
    public void handleClientSide(EntityPlayer player) {
    	 te.check1=i;
    }

    @Override
    public void handleServerSide(EntityPlayer player) {
		    
		    te.check1=i;
		}

    
    }

Отправка

Код:
if (iterator.hasNext())
            {
            	TileEntity teleport = world.getTileEntity(x, y, z);
            	TileEntityTeleport tp = (TileEntityTeleport)teleport;
            	
                player = (EntityPlayer)iterator.next();
               
              
                check1 = true;
                MainClass.packetPipeline.sendToServer(new SyncTeleport(tp ,false));
                
            }else
            {
            	
            	TileEntity teleport = world.getTileEntity(x, y, z);
            	TileEntityTeleport tp = (TileEntityTeleport)teleport;
            	
            	check1 = false;
                MainClass.packetPipeline.sendToServer(new SyncTeleport(tp ,true));
            }


Просто пробовал не знаю нужно ли это
но разницы нет
Код:
TileEntity teleport = world.getTileEntity(x, y, z);
            	TileEntityTeleport tp = (TileEntityTeleport)teleport;

Не работает отправка
 
Сверху