Динамический свет

Версия Minecraft
1.7.10
124
1
0
Добрый день мододелы, подскажите как сделать динамический источник света, который привязан к entity. Необходимо освещать территорию в радиусе 3-4 блока вокруг определённых игроков.
 
если я правильно понял, а я скорее всего не чё не понял, надо привязывать к энтити блок (не взаимодействующий с ним) и юзать его как источник света
 
image.png
 
В Amnesia mod есть фанарик, он там в чанке меняет инфу о свете и влючает пересчёт.
Но у меня не получилось сделать аналог, с идентичным кодом. Могу предположить, что без лагов работает только в паре с optifine
 
В каком то моде видел светлячков понравились так. Лаги есть ощутимые в моде спец для этого отключался источник света.
Если выпустить несколько вот таких светлячков получаешь приличный лагодром, собственно из за этого и зарубил эту идею нафиг

Еще есть мод там фонарик аналогичная вещь с лагами если не спеша двигаться худо бедно но если попытаться с разбега прыгнуть через овраг в 80% на дне будешь а если еще и в гравике бежать все завешивается и крашится не успевает перерасчитывать
 
Не помню мода может и сумеречный

svk2140 Вот код от фонарика работает нормально


Java:
@SubscribeEvent
    public void onPlayerMove(LivingUpdateEvent e)
    {
        if (e.entityLiving instanceof EntityPlayer)
        {
            EntityPlayer p = (EntityPlayer) e.entityLiving;
            if (!p.worldObj.isRemote)
            {
                if (ModLights.hasLitLanternOnHotbar(p.inventory))
                {
                    Pos3 pos = new Pos3(MathHelper.floor_double(p.posX), MathHelper.floor_double(p.posY) + 1, MathHelper.floor_double(p.posZ));
                    if (p.ridingEntity != null)
                    {
                        pos = new Pos3(MathHelper.floor_double(p.ridingEntity.posX), MathHelper.floor_double(p.ridingEntity.posY) + 1, MathHelper.floor_double(p.ridingEntity.posZ));
                    }
                    if (p.worldObj.getBlock(pos.x, pos.y, pos.z).equals(Blocks.air))
                    {
                        p.worldObj.setBlock(pos.x, pos.y, pos.z, ModLights.Lantern);
                    }
                    if (ModLights.usernameLastPosMap.containsKey(p.getDisplayName()))
                    {
                        Pos3 pos2 = ModLights.usernameLastPosMap.get(p.getDisplayName());
                        if ((pos2.x != pos.x || pos2.y != pos.y || pos2.z != pos.z) && p.worldObj.getBlock(pos2.x, pos2.y, pos2.z).equals(ModLights.Lantern))
                        {
                            p.worldObj.setBlock(pos2.x, pos2.y, pos2.z, Blocks.air);
                        }
                    }
                    ModLights.usernameLastPosMap.put(p.getDisplayName(), pos);
                }
                else
                {
                    if (ModLights.usernameLastPosMap.containsKey(p.getDisplayName()))
                    {
                        Pos3 pos = ModLights.usernameLastPosMap.get(p.getDisplayName());
                        if (p.worldObj.getBlock(pos.x, pos.y, pos.z).equals(ModLights.Lantern))
                        {
                            p.worldObj.setBlock(pos.x, pos.y, pos.z, Blocks.air);
                        }
                        ModLights.usernameLastPosMap.remove(p.getDisplayName());
                    }
                }
            }
        }
    }

Java:
Вот это у меня в ModLights проверка на наличия в инвентаре

    public static HashMap<String, Pos3> usernameLastPosMap = new HashMap<String, Pos3>();
   
    public static boolean hasLitLanternOnHotbar(InventoryPlayer inv)
    {
        for (int i = 0; i < 9; i++)
        {
            ItemStack item = inv.mainInventory[i];

            if (item != null && item.getItem() == ItemLanterns)
            {
                return true;
            }
        }

        return false;
    }
 
Последнее редактирование модератором:
Не помню мода может и сумеречный

svk2140 Вот код от фонарика работает нормально


Код:
@SubscribeEvent
    public void onPlayerMove(LivingUpdateEvent e)
    {
        if (e.entityLiving instanceof EntityPlayer)
        {
            EntityPlayer p = (EntityPlayer) e.entityLiving;
            if (!p.worldObj.isRemote)
            {
                if (ModLights.hasLitLanternOnHotbar(p.inventory))
                {
                    Pos3 pos = new Pos3(MathHelper.floor_double(p.posX), MathHelper.floor_double(p.posY) + 1, MathHelper.floor_double(p.posZ));
                    if (p.ridingEntity != null)
                    {
                        pos = new Pos3(MathHelper.floor_double(p.ridingEntity.posX), MathHelper.floor_double(p.ridingEntity.posY) + 1, MathHelper.floor_double(p.ridingEntity.posZ));
                    }
                    if (p.worldObj.getBlock(pos.x, pos.y, pos.z).equals(Blocks.air))
                    {
                        p.worldObj.setBlock(pos.x, pos.y, pos.z, ModLights.Lantern);
                    }
                    if (ModLights.usernameLastPosMap.containsKey(p.getDisplayName()))
                    {
                        Pos3 pos2 = ModLights.usernameLastPosMap.get(p.getDisplayName());
                        if ((pos2.x != pos.x || pos2.y != pos.y || pos2.z != pos.z) && p.worldObj.getBlock(pos2.x, pos2.y, pos2.z).equals(ModLights.Lantern))
                        {
                            p.worldObj.setBlock(pos2.x, pos2.y, pos2.z, Blocks.air);
                        }
                    }
                    ModLights.usernameLastPosMap.put(p.getDisplayName(), pos);
                }
                else
                {
                    if (ModLights.usernameLastPosMap.containsKey(p.getDisplayName()))
                    {
                        Pos3 pos = ModLights.usernameLastPosMap.get(p.getDisplayName());
                        if (p.worldObj.getBlock(pos.x, pos.y, pos.z).equals(ModLights.Lantern))
                        {
                            p.worldObj.setBlock(pos.x, pos.y, pos.z, Blocks.air);
                        }
                        ModLights.usernameLastPosMap.remove(p.getDisplayName());
                    }
                }
            }
        }
    }

Код:
Вот это у меня в ModLights проверка на наличия в инвентаре

    public static HashMap<String, Pos3> usernameLastPosMap = new HashMap<String, Pos3>();
   
    public static boolean hasLitLanternOnHotbar(InventoryPlayer inv)
    {
        for (int i = 0; i < 9; i++)
        {
            ItemStack item = inv.mainInventory[i];

            if (item != null && item.getItem() == ItemLanterns)
            {
                return true;
            }
        }

        return false;
    }
Это дикие костыли. А как же, когда игрок через дверь проходит, к примеру?)
 
Ну тебя же никто не заставляет это использовать
Когда носишь фонарик у меня скорость замедлена немного чтобы не возникало лагодрома ну как в реале идешь с фонариком
Ну как бы фонарик подразумевает что ты в пещере находишься ну или в каком то темном месте
Не знаю как тебе мне например удобно когда копаешь и фонарик светит сразу не надо факела натыкивать тоннами ну и фонарик не смоет водой

Хах через дверь светит а на блоке двери тяяяямно )))
 

Вложения

  • fon1.jpg
    fon1.jpg
    184.2 KB · Просмотры: 29
  • fon2.jpg
    fon2.jpg
    295.2 KB · Просмотры: 28
Последнее редактирование:
Так я об этом писал что перерасчеты замучают собственно фонарик для копания в пещере, для удобства больше чем для создания пати в одном месте

Если уж нужны какие то привелегии конкретным игрокам проще наверно повесить частицы типа сердечек звездочек ну кто во что горазд ну или на худой конец сверху над головой иконку (вот такую :))
 
Ну, собственно, так оно и решается.
Тема довольно сложная и для реализации динамического освещения с множеством источников света без лагодрома нужно иметь некоторый опыт и базу в сфере программирования графики.
 
Назад
Сверху