Получить игрока, который сломал блок, на сервере

Версия Minecraft
1.12.2
5,018
47
783
Суть вопроса в заголовке. Необходимо каким то образом получить игрока или его UUID из листа всех игроков, который сломал блок на какой-то позиции. Как можно это сделать?
Мне нужен игрок в breakBlock, но там игрока нету в принципе, так как этот метод вызывается соло в чанк
В качестве старта имеем стейт, мир и позицию(

Java:
    public void breakBlock(World w, BlockPos pos, IBlockState state)
 
Последнее редактирование:
5,018
47
783
В общем, проблема была решена, хоть и несколько экзотическим способом. Может это и костыль, но наилучший из костылей. В общем для проверки на игрока была введена глобальная переменная, которая по умолчанию всегда фолс. Если игрок ломает блок - она становится тру. Все это происходит на клиенте. Было бы неплохо, если бы breakBlock выполнялся еще и на клиенте, но такой фичи нету. Поэтому я создал пакет, который отправляет эту переменную на сервер и уже потом, в зависимости от ее значения, происходит то или иное действие на сервере.
Поставьте мне лайк типа я молодец

Java:
public boolean isPlayerBreak = false;
    public void onBlockDestroyedByPlayer(World w, BlockPos pos, IBlockState state)
    {
        if(w.isRemote) {
            isPlayerBreak = true;
            NetworkHandler.network.sendToServer(new CheckPlayerDestrMessageToServer(isPlayerBreak, pos.getX(), pos.getY(), pos.getZ()));
        } else {
            isPlayerBreak = false;
        }
    }
    public void breakBlock(World w, BlockPos pos, IBlockState state)
    {
        if(isPlayerBreak) {
            System.out.println("cs " + isPlayerBreak);
        }
        if(!isPlayerBreak) {
            System.out.println("s " + isPlayerBreak);
            for(EnumFacing f : EnumFacing.VALUES) {

                if(w.getBlockState(pos.offset(f)).getBlock() instanceof BlockRealLeaves) {

                    w.destroyBlock(pos.offset(f), false);
                }
            }
        }
    }
Java:
public class CheckPlayerDestrMessageToServer implements IMessage {
    public boolean value;
    public int x,y,z;
    public CheckPlayerDestrMessageToServer(){}
  
    public CheckPlayerDestrMessageToServer(boolean value, int x, int y, int z){
        this.value = value; 
        this.x = x;
        this.y = y;
        this.z = z;
    }
    @Override
    public void fromBytes(ByteBuf buf) {
        value = buf.readBoolean(); 
        x = buf.readInt();
        y = buf.readInt();
        z = buf.readInt();
      
        }
    @Override
    public void toBytes(ByteBuf buf) { 
        buf.writeBoolean(value);
        buf.writeInt(x);
        buf.writeInt(y);
        buf.writeInt(z);
    } 

    public static class Handler implements IMessageHandler<CheckPlayerDestrMessageToServer, IMessage> {

        @Override
        public IMessage onMessage(CheckPlayerDestrMessageToServer message, MessageContext ctx) {   
            BlockPos pos = new BlockPos(message.x,message.y,message.z);
            Block block = ctx.getServerHandler().player.getEntityWorld().getBlockState(pos).getBlock();
            if(block instanceof BlockRealLeaves) {
              
          
                    ((BlockRealLeaves)block).isPlayerBreak = message.value; 
                    System.out.println("value" + message.value);
              
              
            }
          
            return null; 
        }

    }
}
 

Icosider

Kotliner
Администратор
3,603
99
664
хоть и несколько экзотическим способом.
Это называется костыль, хотя яб по другому сказал... Это ж надо додуматься слать пакет, чтоб получить игрока...
 

tox1cozZ

aka Agravaine
8,456
598
2,892
Поэтому я создал пакет, который отправляет эту переменную на сервер и уже потом, в зависимости от ее значения, происходит то или иное действие на сервере
Привет, меня зовут Максик и я создал пакетную уязвимость, с помощью которой вам уничтожат сервер! (y)
 
5,018
47
783
Привет, меня зовут Максик и я создал пакетную уязвимость, с помощью которой вам уничтожат сервер! (y)
я об этом вообще не думаю. этим пусть занимаются те, кто будет ставить себе мод на сервер.
 
5,018
47
783
Тебе варианты подкинули, а ты как всегда свой велосипед с костылём вместо сидушки сделал...
ага, еще большие костыли через проверку через эвент, ага-ага
 

Icosider

Kotliner
Администратор
3,603
99
664
я об этом вообще не думаю. этим пусть занимаются те, кто будет ставить себе мод на сервер.
Ну и нах нам ставить тогда твой мод? Лично я не буду это говно фиксить, мне проще забить на такой мод. Нам тут ксенобайта и говнопаблик модов хватает, а ещё и ты со своим крякря отношением...

ага, еще большие костыли через проверку через эвент, ага-ага
То что сделал ты куда хуже, чем через события. Вон, посмотри как сделано в аваритии...
 
Последнее редактирование модератором:
5,018
47
783
Этот вопрос решается просто баном читера и все. Все эти ваши защиты и прочая фигня не имеют значения в сеттинге моего мода, в который будут играть еще меньше людей, чем в террафирму.
 

Icosider

Kotliner
Администратор
3,603
99
664
5,018
47
783
7,099
324
1,510
Дак с таким отношением никто не поставит

это можно сделать только стейтом, а у меня там под завязку
Ой, проблема то какая. Просто фигачь вместо меты блоки.
Я по первое время ваще не парился с этой метой - надо было 16 блоков, я регал 16 блоков. На новых версиях это вообще рекомендовано
 
Сверху