Помогите IC2 EX 397build. Дюп с помощью ключа.

  • Автор темы Автор темы GufRip
  • Дата начала Дата начала

GufRip

Активный участник
Пользователь
Баллы
68
Ник в Minecraft
GufRip
Дорогие форумчане, столкнулся вчера с таким дюпом. Работает на версии ic2 ex 397 билда(последний для 1.6.4)
Работает в одиночке и на сервере. Другие моды тут точно не при делах, ибо даже на чистом 397 билде оно дюпает.

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

PS. Cкрины с инструкцией.
ScreenShot1.png ScreenShot2.png ScreenShot3.png ScreenShot5.png ScreenShot7.png
 
Тоже интересен фикс)

Уп ДЮП рабочий и уже проверил на нескольких крупных проектах работает как часы)
Ну что? Пошли ломать экономику конкурентов?

На 658 (1.7.10) билде не пашет такое.
 
Ну что? Пошли ломать экономику конкурентов?

На 658 (1.7.10) билде не пашет такое.
No Я не такой просто интересно) И заодно узнал пофикшен ли у них этот дюп. оказалось что нет)
 
Дюп связан походу с позицией блока, всмысле IC предметы в блоке запоминает, ключём свентил, а предмет всё еще сохранён типо в этом блоке. Тут либо глобально фиксить, либо ключ переделать)
 
кстати на экскалибур крафт(не реклама) уже как то пофиксили)
 
В ItemToolWrench.java перед (именно перед, а не после) world.setBlockToAir() добавляете world.removeBlockTileEntity() - вот и вся суть фикса.
 
В ItemToolWrench.java перед (именно перед, а не после) world.setBlockToAir() добавляете world.removeBlockTileEntity() - вот и вся суть фикса.
Сори за нубскую просьбу но вы не могли бы подробнее описать, или выложить готовый фикс
 
В ItemToolWrench.java перед (именно перед, а не после) world.setBlockToAir() добавляете world.removeBlockTileEntity() - вот и вся суть фикса.
Хрень в том что setBlockToAir() должен сам удалять тайлэнтитю, но этого не происходит. И вот в эту сторону надо копать, иначе этот баг ещё где-нибудь вылезет.
 
Хрень в том что setBlockToAir() должен сам удалять тайлэнтитю, но этого не происходит. И вот в эту сторону надо копать, иначе этот баг ещё где-нибудь вылезет.
кстати на экскалибур крафт(не реклама) уже как то пофиксили)
 
http://rghost.ru/60112781

Буду благодарен тому кто скомпилит, к сожалению у самого полетел эклипс.
В ItemToolWrench.java перед (именно перед, а не после) world.setBlockToAir() добавляете world.removeBlockTileEntity() - вот и вся суть фикса.
Дело не в world.removeBlockTileEntity(), дюп все равно работает.
 
http://rghost.ru/60112781

Буду благодарен тому кто скомпилит, к сожалению у самого полетел эклипс.

Дело не в world.removeBlockTileEntity(), дюп все равно работает.
Ясен пень. Нужно еще подчищать слоты у TileEntity.
Хрень в том что setBlockToAir() должен сам удалять тайлэнтитю, но этого не происходит. И вот в эту сторону надо копать, иначе этот баг ещё где-нибудь вылезет.
XD, он много где вылез. В IC2 уже 4 случая нашел, в GraviSuite один, в BuildCraft 2.
 
Ясен пень. Нужно еще подчищать слоты у TileEntity.

XD, он много где вылез. В IC2 уже 4 случая нашел, в GraviSuite один, в BuildCraft 2.
Сука, как я ненавижу быть правым.
Вот в том то и говно понимаешь, тупо удалять тайлэнтити и чистить ей слоты это всё равно что пытаться выкачивать воду из пробитой лодки, поможет, но ненадолго.
Надо выяснить саму причину. Тем более что это этот баг не работает на 1.7.10, а значит проблема где-то в ядре 1.6.4. Впрочем, это уже не моя забота.
 
Сука, как я ненавижу быть правым.
Вот в том то и говно понимаешь, тупо удалять тайлэнтити и чистить ей слоты это всё равно что пытаться выкачивать воду из пробитой лодки, поможет, но ненадолго.
Надо выяснить саму причину. Тем более что это этот баг не работает на 1.7.10, а значит проблема где-то в ядре 1.6.4. Впрочем, это уже не моя забота.
Дело в том, что если блок устанавливается на ID 0, то не происходит создание нового TileEntity.
Метод removeTileEntity только вызывает метод invalidate у TileEntity.
А при установке блока если ядро находит TileEntity с тем же ID и Damage, то оно цепляет его и вызывает метод обновления.

Вывод: при setBlock надо принудительно вызывать setBlockTileEntity
 
Дело в том, что если убок устанавливается на ID 0, то не происходит создание нового TileEntity. Метод removeTIleEntity только вызывает метод invalidate у TileEntity. При установке блока если ядро находит TileEntity с тем же ID и Damage, то оно берет его и вызывает метод обновления.

Вывод: при setBlock надо принудительно вызывать setBlockTileEntity
Понятно, я то теперь с ядром 1.8 работаю, и там тайлэнтити удаляется если айди блока меняется, да и в 1.7.10 собственно тоже.
Интересно только кто в этом виноват, моджанги или форг.
Вот же бля
Java:
        int xz = z << 4 | x;

        if (y >= this.precipitationHeightMap[xz] - 1)
        {
            this.precipitationHeightMap[xz] = -999;
        }

        int highestY = this.heightMap[xz];
        int oldBlockId = this.getBlockID(x, y, z);
        int oldData = this.getBlockMetadata(x, y, z);

        if (oldBlockId == blockID && oldData == data)
        {
            return false;
        }
        else
        {
            ExtendedBlockStorage storage = this.storageArrays[y >> 4];
            boolean var11 = false;

            if (storage == null)
            {
                if (blockID == 0)
                {
                    return false;
                }

                storage = this.storageArrays[y >> 4] = new ExtendedBlockStorage(y >> 4 << 4, !this.worldObj.provider.hasNoSky);
                var11 = y >= highestY;
            }

            int worldPosX = this.xPosition * 16 + x;
            int worldPosZ = this.zPosition * 16 + z;

            if (oldBlockId != 0 && !this.worldObj.isRemote)
            {
                Block.blocksList[oldBlockId].onBlockPreDestroy(this.worldObj, worldPosX, y, worldPosZ, oldData);
            }

            storage.setExtBlockID(x, y & 15, z, blockID);

            if (oldBlockId != 0)
            {
                if (!this.worldObj.isRemote)
                {
                    Block.blocksList[oldBlockId].breakBlock(this.worldObj, worldPosX, y, worldPosZ, oldBlockId, oldData);
                }
                else if (Block.blocksList[oldBlockId] instanceof ITileEntityProvider && oldBlockId != blockID)
                {
                    this.worldObj.removeBlockTileEntity(worldPosX, y, worldPosZ);
                }
            }

           ...

Короче вот в чём говно, при удалении блока на сервере у каждого блока вызывается метод breakBlock который собственно и удаляет тайлэнтитю.
Но разработчики модов как обычно просрали все полимеры и тайлэнтитю не удаляют. А автоматически это сервер не делает.
 
Короче вот в чём говно, при удалении блока на сервере у каждого блока вызывается метод breakBlock который собственно и удаляет тайлэнтитю.
Но разработчики модов как обычно просрали все полимеры и тайлэнтитю не удаляют. А автоматически это сервер не делает.
Возможно это как-то внедрить и одним разом фиксануть?
 
Назад
Верх Низ