Версия Minecraft
1.12.2
API
Forge
170
5
14
1. как создать таймер для отдельного игрока, первое что пришло мне на ум это записывать время таймера в NBT.
Я написал код и он вроде работает но я слышал что NBT довольно не оптимизированный.
2. Можно ли создать пакетную систему как в майне для своего потока на основе forge api, если нет то как "как вариант записывать все в файл и читать в другом потоке".
3. Адекватная ли идея использовать нейросеть в качестве дополнительного ии для мобов

и так по мелочи рас уж создал эту тему
4. как записать файл в папку мира
5. как проверить загружен ли тот или иной мод

RemoveUnresolvedItems:
package com.artur.returnoftheancients.ancientworldutilities;

import com.artur.returnoftheancients.handlers.Handler;
import com.artur.returnoftheancients.init.InitDimensions;
import com.artur.returnoftheancients.referense.Referense;
import com.artur.returnoftheancients.sounds.ModSounds;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.MobEffects;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;

public class RemoveUnresolvedItems {
    public static final String isUUI = Referense.MODID + "isUseUnresolvedItems";
    public static final String dead = Referense.MODID + "setDead";
    public static final String time = Referense.MODID + "RemoveItemsTime";
    public static final String PRI = Referense.MODID + "phaseRemoveItems";
    public static final String isRespawn = Referense.MODID + "isRespawn";


    private static void resetNBT(EntityPlayer player) {
        player.getEntityData().setBoolean(isUUI, false);
        player.getEntityData().setInteger(time, 0);
        player.getEntityData().setByte(PRI, (byte) 0);
        System.out.println("NBT is reset");
    }

    @SubscribeEvent
    public void isClone(PlayerEvent.Clone e) {
        e.getEntityPlayer().isDead = false;
    }

    @SubscribeEvent
    public void Tick(TickEvent.PlayerTickEvent e) {
        if (e.player.dimension == InitDimensions.ancient_world_dim_id) {
            if (!Handler.isPlayerUseUnresolvedItems(e.player).isEmpty() && (!e.player.getEntityData().getBoolean(isUUI) || !e.player.getEntityData().hasKey(isUUI)) && !e.player.isCreative() && !e.player.isDead) {
                System.out.println("La ti krisa " + e.player.getName());
                e.player.getEntityData().setBoolean(isUUI, true);
            }
        }
        if (e.player.getEntityData().getBoolean(isUUI)) {
            int timeRemoveItems = e.player.getEntityData().getInteger(time);
            byte phaseRemoveItems = e.player.getEntityData().getByte(PRI);
            if (Handler.isPlayerUseUnresolvedItems(e.player).isEmpty()) {
                e.player.removePotionEffect(MobEffects.SLOWNESS);
                e.player.removePotionEffect(MobEffects.BLINDNESS);
                resetNBT(e.player);
                return;
            }
            if (phaseRemoveItems == 0) {
                if (e.player instanceof EntityPlayerSP) {
                    e.player.playSound(ModSounds.WHISPER, 1, 1);
                }
                e.player.addPotionEffect(new PotionEffect(MobEffects.BLINDNESS, 1200));
                e.player.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 1200, 10));
                phaseRemoveItems = 1;
            }
            if (phaseRemoveItems == 1 && timeRemoveItems >= 20) {
                if (timeRemoveItems == 100 && e.player instanceof EntityPlayerMP) {
                    e.player.sendMessage(new TextComponentTranslation(Referense.MODID + ".rui.t"));
                }
                if (timeRemoveItems == 160) {
                    if (e.player instanceof EntityPlayerMP) {
                        e.player.sendMessage(new TextComponentTranslation(Referense.MODID + ".rui.f"));
                        e.player.sendMessage(new TextComponentString(Handler.isPlayerUseUnresolvedItems(e.player).toString()));
                    }
                    phaseRemoveItems = 2;
                }
            }
            if (phaseRemoveItems == 2 && timeRemoveItems >= 760) {
                e.player.getEntityData().setBoolean(dead, true);
                e.player.setHealth(-1);
                resetNBT(e.player);
                e.player.isDead = true;
                System.out.println("dead");
                return;
            }
            e.player.getEntityData().setInteger(time, timeRemoveItems + 1);
            e.player.getEntityData().setByte(PRI, phaseRemoveItems);

            if (e.player instanceof EntityPlayerSP) {
                e.player.motionY = -0.1;
            }
            if (timeRemoveItems < 460) {
                if ((timeRemoveItems % 40) == 0 && e.player instanceof EntityPlayerSP) {
                    e.player.playSound(ModSounds.HEARTBEAT, 1, 1);
                }
            } else if (timeRemoveItems < 660) {
                if ((timeRemoveItems % 20) == 0 && e.player instanceof EntityPlayerSP) {
                    e.player.playSound(ModSounds.HEARTBEAT, 1, 1);
                }
            } else {
                if ((timeRemoveItems % 10) == 0 && e.player instanceof EntityPlayerSP) {
                    e.player.playSound(ModSounds.HEARTBEAT, 1, 1);
                }
            }
        }
    }
}
 
Последнее редактирование:
Решение
как создать таймер для отдельного игрока, первое что пришло мне на ум это записывать время таймера в NBT
Capabalities
Можно ли создать пакетную систему как в майне для своего потока на основе forge api
чем не нравится нетти пакетка?
как записать файл в папку мира
достаешь директорию ворлда и пишешь через OutputStream
как проверить загружен ли тот или иной мод
точно где то на форуме был пример чота типа isModLoaded, мб ошибаюсь
1,198
31
184
как создать таймер для отдельного игрока, первое что пришло мне на ум это записывать время таймера в NBT
Capabalities
Можно ли создать пакетную систему как в майне для своего потока на основе forge api
чем не нравится нетти пакетка?
как записать файл в папку мира
достаешь директорию ворлда и пишешь через OutputStream
как проверить загружен ли тот или иной мод
точно где то на форуме был пример чота типа isModLoaded, мб ошибаюсь
 
433
41
110
Адекватная ли идея использовать нейросеть в качестве дополнительного ии для мобов
Идея интересная, но ИИ мобов итак очень и очень хорош.

Алгоритм поиска пути выбирает оптимальный маршрут, опционально избегая лавы, кактусов, сильных падений и прочего, на основе текущих параметров монстра (устойчивость к падению, параметры поведения)

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

И еще прямо встает вопрос о производительности.

В Н-ном проекте я с форками н-ных модов на оптимизацию, и собственной таблицей навигации, я смог достичь рекордных (на моем железе) 3к активных мобов (70% зомби, 30% големов, которые одновременно сражаются) на арене в 2 чанка без просадок ТПС.

Если вставить туда тяжелый ИИ, то не думаю, что он хотя-бы 30 активных мобов выдержит
 
433
41
110
Я полагаю ты часть кода в отдельный поток выносил? По типу поиска пути и таргета
Нет. Все в 1-м потоке.
Полу-автоматическое управление памятью, таблица навигации и улучшенная асимптотика сложности сделали свое дело. Гугля по моему нику можешь даже откопать видосики

Нашел способ как очень сильно снизить асимптотику сложности для таких крайних случаев (но и не для крайних оно значительно лучше)
 
1,371
112
241
Адекватная ли идея использовать нейросеть в качестве дополнительного ии для мобов
Ни капли.
Непонятно куда ты хочешь запихнуть нейронку, и нужна ли она там вообще (потенциально). Если это просто ради самой нейронки - забудь, больше минусов чем плюсов (@HomaPlus спасибо, мне не пришлось их писать).
То же касается машинного обучения.
как создать таймер для отдельного игрока, первое что пришло мне на ум это записывать время таймера в NBT.
Capability/Кастомные эффекты (который Potion/MobEffects и т.д.)

Можно ли создать пакетную систему как в майне для своего потока на основе forge api, если нет то как "как вариант записывать все в файл и читать в другом потоке".
Не уверен, что оно нужно и стоит того. Зависит от задач. Вообще, теоретически можно, но Netty майна и так позволяет передавать что угодно.
 
Сверху