Ошибки Трекинга на Термосе

Версия Minecraft
1.7.10
355
2
17
И снова здрасьте.
Консоль периодически вываливает такие вот ошибки:

Java:
[Thermos] Entity tracking error corection code activated...re-adding
[Thermos] Entity tracking error corection code activated...re-adding
[Thermos] Entity tracking error corection code activated...re-adding
[Thermos] Entity tracking error corection code activated...re-adding
[Thermos] Entity tracking error corection code activated...re-adding

Исходя из этого гита, ошибка это возникает где-то в EntityTracker
Сталкивался кто-нибудь с таким? Вручную, да и в целом трекинг еще не использовал.

Еще заметил, что после подобных ошибок, после смерти игроки, плагины которые реагируют на смерть, по типу того же Essentials выводят сообщения по 6+ раз.
Это по сути тогда 6 раз вызывается событие смерти? Как такое остледить?

UDP:
Заметил, что ошибки вылазят при взаимодействиями с NPC из CustomNPC
 
Решение
Ну приблизительно понял. В данном случае для решения думаю подойдет переписать выдачу EntityItem по нужде, если он все-таки будет выдан в мир а не игроку в инвентарь? Разраб видимо это делал для того чтобы отправить список в ивент дропа.

P.S. Если у кого-то вдруг завалялась ссылка с мелочными фиксами под 1.7.10, был бы благодарен. Т.к. видел что-то такое ранее, а сейчас гуглятся только Flans фиксы.
355
2
17
По поводу первой ошибки удалось определить примерное место причины:

Java:
    public void dropStuff(Entity entity, DamageSource damagesource)
    {
        ArrayList<EntityItem> list = new ArrayList<>();

        for (Map.Entry<Integer, ItemStack> map : this.items.entrySet())
        {
            ItemStack item = map.getValue();

            if (item != null)
            {
                int dropChance = 100;

                if (this.dropchance.containsKey(map.getKey()))
                {
                    dropChance = this.dropchance.get(map.getKey());
                }

                int chance = this.npc.worldObj.rand.nextInt(100) + dropChance;

                if (chance >= 100)
                {
                    EntityItem entityItem = this.getEntityItem(item.copy());
                    if (entityItem != null)
                    {
                        list.add(entityItem);
                    }
                }

                if (!ForgeHooks.onLivingDrops(this.npc, damagesource, list, 0, true, 0))
                {
                    for(EntityItem entityItem : list)
                    {
                        if (this.lootMode == 1 && entity instanceof EntityPlayer)
                        {
                            EntityPlayer player = (EntityPlayer) entity;
                            entityItem.delayBeforeCanPickup = 2;
                            this.npc.worldObj.spawnEntityInWorld(entityItem);

                            ItemStack itemStack = entityItem.getEntityItem();
                            int stackSize = itemStack.stackSize;

                            if (player.inventory.addItemStackToInventory(itemStack))
                            {
                                this.npc.worldObj.playSoundAtEntity(entityItem, "random.pop", 0.2F, ((this.npc.getRNG().nextFloat() - this.npc.getRNG().nextFloat()) * 0.7F + 1.0F) * 2.0F);
                                player.onItemPickup(entityItem, stackSize);

                                if (itemStack.stackSize <= 0)
                                {
                                    entityItem.setDead();
                                }
                            }
                        } else {
                            this.npc.worldObj.spawnEntityInWorld(entityItem);
                        }
                    }
                }
            }
        }
    }

Что тут не так может быть не так? Создаются EntityItem как дроп, но дальше возникают собственно проблемы с трекингом в термосе.
 
3,005
192
592
Ват, спавнится предмет в мир, потом если он может добавиться в инвентарь игрока, то предмет убивается. Смысл спавнить, если его нужно будет потом убить?
В list итемы не чистятся, тем самым идет спавн предыдущих, тип заспавнился, убил, потом опять его же спавнишь и убиваешь и так пока items не закончится
 

timaxa007

Модератор
5,831
409
672
что конкретно вызывает ошибку трекинга?
убил, потом опять его же спавнишь и убиваешь
Наверное это. Entity спавниться даёться ему getEntityId(), а он для каждого Entity уникальный и наверное он жалуется, то что список слишком сильно заполняется... и переназначает на ID которые были использованы, но нормально не просуществовали.
 
355
2
17
Насчет фикса я что-то такое припоминаю, но сейчас без понятия где искать. В целом такая проблема актуальна для 1.7.10, там когда телепортируешься к игроку, игрок не сразу тебя видит. Нужно отбежать и прибежать к нему обратно. Такой фикс тоже не помешал бы.

Entity спавниться даёться ему getEntityId(), а он для каждого Entity уникальный и наверное он жалуется, то что список слишком сильно заполняется..

Не совсем понял, ладно если бы там было овер миллион этих EntityItem, но там от силы штук 10, код соответственно выше.
 
145
7
31
Ты пытаешься добавить энтити в трекер, которое уже отслеживается.
то что список слишком сильно заполняется
Id и энтити энтитей хранятся в IntHashmap'e, там переполнить почти невозможно
Вообще, в термосе да и в самом форже Трэкер энтитей сделан максимально убого
Вот код из термоса
Java:
public synchronized void addEntityToTracker(Entity p_72785_1_, int p_72785_2_, final int p_72785_3_, boolean p_72785_4_)
    {
        p_72785_2_ = org.spigotmc.TrackingRange.getEntityTrackingRange(p_72785_1_, p_72785_2_); // Spigot
        if (p_72785_2_ > this.entityViewDistance)
        {
            p_72785_2_ = this.entityViewDistance;
        }

        try
        {
            if (this.trackedEntityIDs.containsItem(p_72785_1_.getEntityId()))
            {
                removeEntityFromAllTrackingPlayers(p_72785_1_);
                System.out.println("[Thermos] Entity tracking error corection code activated...re-adding");
                addEntityToTracker(p_72785_1_, p_72785_2_, p_72785_3_, p_72785_4_);
                return;
            }
           
            EntityTrackerEntry entitytrackerentry = new EntityTrackerEntry(p_72785_1_, p_72785_2_, p_72785_3_, p_72785_4_);

            waitForLock(); lock();// TTCP
            this.trackedEntities.add(entitytrackerentry);
            unlock();// TTCP

            this.trackedEntityIDs.addKey(p_72785_1_.getEntityId(), entitytrackerentry);
            entitytrackerentry.sendEventsToPlayers(this.theWorld.playerEntities);


        }
        catch (Throwable throwable)
        {
            unlock(); // TTCP

            CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Adding entity to track");
            CrashReportCategory crashreportcategory = crashreport.makeCategory("Entity To Track");
            crashreportcategory.addCrashSection("Tracking range", p_72785_2_ + " blocks");
            crashreportcategory.addCrashSectionCallable("Update interval", new Callable()
            {
                private static final String __OBFID = "CL_00001432";
                public String call()
                {
                    String s = "Once per " + p_72785_3_ + " ticks";

                    if (p_72785_3_ == Integer.MAX_VALUE)
                    {
                        s = "Maximum (" + s + ")";
                    }

                    return s;
                }
            });
            p_72785_1_.addEntityCrashInfo(crashreportcategory);
            CrashReportCategory crashreportcategory1 = crashreport.makeCategory("Entity That Is Already Tracked");
            try {
                ((EntityTrackerEntry)this.trackedEntityIDs.lookup(p_72785_1_.getEntityId())).myEntity.addEntityCrashInfo(crashreportcategory1);
            } catch(Exception ignored) {}

            try
            {
                throw new ReportedException(crashreport);
            }
            catch (ReportedException reportedexception)
            {
                logger.error("\"Silently\" catching entity tracking error.", reportedexception);
            }
        }
    }
 
Последнее редактирование:
355
2
17
Ты пытаешься добавить энтити в трекер, которое уже отслеживается.

Ну это видать делаем сам термос, либо в конструкторе, либо в спауне. Так собственно, как обойти эту проблему? Может там спаун предметов какой-то специфический, или все-таки в том коде ошибка?
 
145
7
31
По сути, ничего страшного не происходит, просто энтити добавляется заново
Можешь вырезать вывод этой инфы в консоль, если мешает.
Невидимые игроки при телепортации не связаны с этой ошибкой
 
355
2
17
Вырезать будет куда накладнее, особенно когда я в jar файле термоса не вижу этого EntityTracker, да и проще ведь исправить это путём изменения дропа, ибо сейчас оно знатно так флудить при каждом дропе.

Просто не совсем понятно где добавляется этот трекинг.
 

timaxa007

Модератор
5,831
409
672
там переполнить почти невозможно
Я не о переполнении писал, а то что за короткое время добавляются много новыми ID.
Не совсем понял,
Давай по другому постараюсь объяснить.
Создаёшь за короткое много EntityItem, которое за короткое время становиться null. И тут типа приходит как-бы оптимизация, которая решает вычеркнуть из списка где и что им давались ID, с пометкой что эти ID не использовались.
Я не знаю как ещё показать.
Java:
int i = 0;
boolean charge = false;

void joinEntityInWorld() {
   i++;//add Entity & entityID +1
   i++;//add Entity & entityID +1
   i++;//add Entity & entityID +1
   charge = true;
//
   i--;//dead Entity
   i--;//dead Entity
   i--;//dead Entity
   charge = true;
//
   if (i == 0 && charge) {
      //оптимизировать это
   }

}
Т.е. при спавне даётся уникальный ID, который при смерти не будет убираться. А где-то есть оптимизация, где убирает эти уникальные ID, если за короткое время они небыли использованы в мире.
Может на обычном сервере, эта оптимизация не нужна. Но сервер который может быть заточен под всякие мини-игры, где некоторые EntityLiving могут использоваться не назначению, а для эффектов, возможно и сделана всякая подобная оптимизация.
 
355
2
17
Ну приблизительно понял. В данном случае для решения думаю подойдет переписать выдачу EntityItem по нужде, если он все-таки будет выдан в мир а не игроку в инвентарь? Разраб видимо это делал для того чтобы отправить список в ивент дропа.

P.S. Если у кого-то вдруг завалялась ссылка с мелочными фиксами под 1.7.10, был бы благодарен. Т.к. видел что-то такое ранее, а сейчас гуглятся только Flans фиксы.
 
7,099
324
1,510
и переназначает на ID которые были использованы, но нормально не просуществовали.
Как это может быть, если entityId все время только увеличивается? У типа int в положительной части 2147483647 значений. Даже если новые сущности спаунятся каждый тик, то понадобится около 7 лет, чтобы тип переполнился и значения начали повторяться
 
Сверху