Не работает полная невидимость.

Версия Minecraft
1.12.2
API
Forge
128
4
6
Создал эффект который должен полностью делать игрока невидимым даже если на нем броня или держит в руке предмет. Изначально использовал вот это:
Java:
@SubscribeEvent
public void handleEvent(RenderPlayerEvent.Pre e) {
    if (e.getEntityPlayer().getActivePotionEffect(PotionsInit.SHADOW_STEP) != null ) {
        e.setCanceled(true);
    }
}
но она работает только на клиентской части, а по окончанию эффекта не возвращает видимость для других игроков, вообщем не знаю как решить данную проблему. Если кто-то похожее делал или сталкивался с этим где то пожалуйста дайте совет или подскажите как это сделать.
 
Если делать адекватно, то нужно запрещать отправку пакета об игроке, что его нельзя было увидеть через всякие читы, а если говорить об твое способе, то нужно с сервера отправлять всем клиентам информацию о том что твой игрок невидимый и на какое время, примером отправить всем имя игрока и время, получится что то вроде такого

test:
    public static HashMap<String, Long> inviciblePlayer = new HashMap();


    @SubscribeEvent
    public void handleEvent(RenderPlayerEvent.Pre e) {
        ArrayList<String> removePlayer = new ArrayList<>();
        for(String name : inviciblePlayer.keySet()) {
            if(e.entityPlayer.getCommandSenderName().equals(name)) {
                if(inviciblePlayer.get(name) != 0) {
                    e.setCanceled(true);
                    inviciblePlayer.replace(name, inviciblePlayer.get(name)-1);
                } else {
                    removePlayer.add(name);
                }
            }
        }
        for(String name : removePlayer) {
            inviciblePlayer.remove(name);
        }
    }
 
Немного переписал код, ибо не там считал таймер
Проверил все работает, код писал на 1.7.10, под себя поменяй там.

test:
@SubscribeEvent
    public void tickEvent(ClientTickEvent e) {
        if (e.phase == Phase.START) {

            ArrayList<String> removePlayer = new ArrayList<>();
            for (String name : inviciblePlayer.keySet()) {

                if (inviciblePlayer.get(name) != 0) {
                    inviciblePlayer.replace(name, inviciblePlayer.get(name) - 1);
                } else {
                    removePlayer.add(name);
                }

            }
            for (String name : removePlayer) {
                inviciblePlayer.remove(name);
            }
        }
    }

    @SubscribeEvent
    public void handleEvent(RenderPlayerEvent.Pre e) {
        ArrayList<String> removePlayer = new ArrayList<>();
        for (String name : inviciblePlayer.keySet()) {
            if (e.entityPlayer.getCommandSenderName().equals(name)) {
                    e.setCanceled(true);
            }
        }
    }
 
я нашел еще вот такой метод((EntityPlayerMP) player).getServerWorld().getEntityTracker().untrack(player); но при выполнении все мобы и энтити становятся невидимыми, а должен только игрок на котором активен эффект @Override public void performEffect(EntityLivingBase target, int amplifier) { if (target instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) target; if (player.getActivePotionEffect(PotionsInit.SHADOW_STEP) != null) { World world = player.world; if (world instanceof WorldServer) ((WorldServer) world).spawnParticle(EnumParticleTypes.TOWN_AURA, player.posX, player.posY + 0.1 , player.posZ, 5, 0.1, 0.1, 0.1, 0.0001, new int[0]); if (player.getActivePotionEffect(PotionsInit.SHADOW_STEP) != null) player.setInvisible(true); if (world instanceof WorldServer || player instanceof EntityPlayer) { ((EntityPlayerMP) player).getServerWorld().getEntityTracker().untrack(player); } } else { ((EntityPlayerMP) player).getServerWorld().getEntityTracker().track(player); } } } @Override public boolean isReady(int duration, int amplifier) { return true; }
 
Вроде получилось решить однако есть проблема когда игрок в так называемой невидимости и он смотрит на себя от 3 лица или другой чел смотрит на него возникает такая ошибка
1651021170781.png
вот 38 строка return (ModelBiped) armour_models.get(material);
 
Назад
Сверху