Фейковые игроки

Версия Minecraft
1.12.2
API
Forge

sk9zist :l

Исправился
981
18
157
Как создавать фейкового игрока того, у кого в руке находится предмет? Мне необязательно копировать инвентарь или что-то еще. (Хотя скопировать предмет в главной руке) Главное сохранить вращение головы в том же положении.
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157
А там исходы есть?

читаешь через нбт данные нужного тебе игрока, загружаешь эти данные нбт в сущность
Это просто сделать. Я уже поискал и нашёл методы например чтобы скопировать rotationYaw и Head к фейк игроку инвентарь и т.д.

А вот как создать сущность я не понимаю, можете объяснить? Все мои попытки чщетны, ато и с крашем.
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157

sk9zist :l

Исправился
981
18
157
UP. И кстати забыл уточнить, мне просто нужно создать недвигающуюся копию игрока. Это будет не сущность, а просто видимая оболочка.
 
7,099
324
1,509
Ну типо с сервера на клиент отправляешь ванильный пакет о том, что такой-то игрок стоит там-то
 

sk9zist :l

Исправился
981
18
157
отправляешь ванильный пакет о том, что такой-то игрок стоит там-то
Я думаю, ты меня не понял
для понятности приложу код своих попыток:

EntityPlayerCop класс:
public class EntityPlayerCop extends EntityPlayerMP
{
    public EntityPlayerCop(EntityPlayer player, World world)
    {
        super(world, player.getGameProfile());
        copyLocationAndAnglesFrom(player);
      
        // fix inventory
        //inventory.copyInventory(player.inventory);
      
        // copy model and data
        getDataManager().set(EntityPlayer.PLAYER_MODEL_FLAG,
                player.getDataManager().get(EntityPlayer.PLAYER_MODEL_FLAG));
      
        // fix rotation
        rotationYawHead = player.rotationYawHead;
        renderYawOffset = player.renderYawOffset;
      
        // fix cape movement
        chasingPosX = posX;
        chasingPosY = posY;
        chasingPosZ = posZ;
      
        // spawn
        //world.spawnEntity(this);
    }
  
    public void resetPlayerPosition(EntityPlayer player)
    {
        player.setPositionAndRotation(posX, posY, posZ,
            rotationYaw, rotationPitch);
    }*/
}
основной код:
private EntityPlayerCop playerCopy = null;

//тут типо onRightClickItem метод
playerCopy = new EntityPlayerCop();

playerCopy.resetPlayerPosition();

//тут пример удаления
// check of fakePlayer != null
if(playerCopy == null) return;
playerCopy.despawn();
playerCopy = null;
вот ещё метод despawn, я его видимо уже убрал.:
public void despawn()
{
    Minecraft.getMinecraft().world.removeEntityFromWorld(cache.id);
}
 
7,099
324
1,509
У тебя мод чисто клиентский? Если нет, то сервер же должен как-то уведомить клиентов, что там-то стоит фейк-игрок.
Сервер может отправить ванильный пакет о том, что такой-то игрок(на самом деле фейковый) залогинился
Сервер может отправить ванильный пакет о том, что этот игрок находится в такой-то точке
Сервер может отправить ванильный пакет о том, что этот игрок держит в руке такой-то предмет

Этого по идее достаточно чтобы получился требуемый визуальный эффект
Плюс, можно в капабилити мира хранить инфу о фейковых игроках, чтобы, например, присылать те пакеты реальным игрокам, которые зашли позже
 

sk9zist :l

Исправился
981
18
157
У тебя мод чисто клиентский?
Нет, извиняюсь. Я имел ввиду, что еще не знаю как создавать копию игрока, не то что пакеты...


Сервер может отправить ванильный пакет о том, что такой-то игрок(на самом деле фейковый) залогинился
Сервер может отправить ванильный пакет о том, что этот игрок находится в такой-то точке
Сервер может отправить ванильный пакет о том, что этот игрок держит в руке такой-то предмет
А как собственно, правильно отправить ванильные пакеты? Или метод? Или же сделать свою пакетную систему?
 
7,099
324
1,509
Что-то вроде
Java:
player.connection.sendPacket(new SPacket<TYPE>(...))
Пакеты, отправляемые с сервера можно посмотреть в пакете net.minecraft.network.play.server
Также рекомендую посмотреть usage-ы интересующих тебя пакетов в ванили
 

sk9zist :l

Исправился
981
18
157
7,099
324
1,509
Зависит от клиента и сервера. Если надпись формируется на сервере(обычно так), то не будет сообщений чата, ведь игрок реально не заходил.
Суть отправки пакетов с сервера в том ,чтобы убедить клиентов в чем-то
 

sk9zist :l

Исправился
981
18
157
@hohserg А какой отправлять пакет, CPacket или SPacket? Я нашел несколько пакетов, которые отправляются при заходе игрока (дебаг).В пакете SPacketJoinGame, который единственный из всех отвечает за вход игрока - много аргументов (мир, сложность игры, режим игры, максимум игроков) и я не до конца понял как это работает. В игре почему-то происходит "Загрузка мира... " при выполнении
 
Последнее редактирование:
7,099
324
1,509
Один из них отправляется с сервера на клиент, а другой в обратную сторону(зависит от префикса C/S), но я не знаю, какой из них какой. Посмотри использования обоих
 

sk9zist :l

Исправился
981
18
157
Посмотри использования обоих
В дебаге вызывается SPacketJoinGame, когда я хуком ловлю пакеты и вывожу.
Как сымитировать присоединение игрока?
Вот код
Java:
if(playerIn instanceof EntityPlayerMP)
{
    ((EntityPlayerMP) playerIn).connection.sendPacket(new SPacketJoinGame(2536, GameType.ADVENTURE, false, 0, EnumDifficulty.PEACEFUL, 1, WorldType.FLAT, false));
}
 
Последнее редактирование:
Сверху