Помогите 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) билде не пашет такое.
 
Дюп связан походу с позицией блока, всмысле 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 который собственно и удаляет тайлэнтитю.
Но разработчики модов как обычно просрали все полимеры и тайлэнтитю не удаляют. А автоматически это сервер не делает.
Возможно это как-то внедрить и одним разом фиксануть?
 
Назад
Верх Низ