1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Плагин [FIX] ModFixNG [#67] - фикс разнообразных багов в модах. [1.6.4-1.8]

Тема в разделе "Релизы плагинов", создана пользователем Shevchik, 18 май 2013.

  1. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Почему в контейнере после фрикама остаётся 0 вещей? Я не нашёл ни одного следа где итемы бы реально обнулялись таким странным методом, и вообще ни одного куска кода который бы отвечал за такую связь контейнера и блока кроме 1го....
    В майне есть лишь одно место которое следит за валидностью контейнера (с 1.8 оно будет следить почти как ModFixNG кстати), но при невалидности такого инвентаря оно тупо закрывает его. После этого сервер не должен принимать пакеты для этого контейнера потому что он невалиден. Однако принимает же, и итемы в количестве 0 получаются. Как это происходит блин?
    Только одна причина - контейнер всё ещё валиден, и значит валидатор тут непричём. Тем более что ModFixNG закрывает инвентарь нормально. А значит инвентарь валидный, но почему-то с нулевыми итемами. Но должно же что-то делать их нулевыми?
    НАШЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЛ!!!!!

    Вот какое говно есть например в BlockChest
    Код:
        @Override
        public void remove(final World world, final int n, final int n2, final int n3, final Block block, final int n4) {
            final TileEntityChest tileEntityChest = (TileEntityChest)world.getTileEntity(n, n2, n3);
            if (tileEntityChest != null) {
                for (int i = 0; i < tileEntityChest.getSize(); ++i) {
                    final ItemStack item = tileEntityChest.getItem(i);
                    if (item != null) {
                        final float n5 = this.b.nextFloat() * 0.8f + 0.1f;
                        final float n6 = this.b.nextFloat() * 0.8f + 0.1f;
                        final float n7 = this.b.nextFloat() * 0.8f + 0.1f;
                        while (item.count > 0) {
                            int count = this.b.nextInt(21) + 10;
                            if (count > item.count) {
                                count = item.count;
                            }
                            final ItemStack itemStack = item;
                            itemStack.count -= count;
                            final EntityItem entity = new EntityItem(world, n + n5, n2 + n6, n3 + n7, new ItemStack(item.getItem(), count, item.getData()));
                            final float n8 = 0.05f;
                            entity.motX = (float)this.b.nextGaussian() * n8;
                            entity.motY = (float)this.b.nextGaussian() * n8 + 0.2f;
                            entity.motZ = (float)this.b.nextGaussian() * n8;
                            if (item.hasTag()) {
                                entity.getItemStack().setTag((NBTTagCompound)item.getTag().clone());
                            }
                            world.addEntity(entity);
                        }
                    }
                }
                world.updateAdjacentComparators(n, n2, n3, block);
            }
            super.remove(world, n, n2, n3, block, n4);
        }
    
    Получается что при уничтожении сундука из него выпадают все итемы, но в нём всё ещё лежат итемы с количеством 0. Поэтому то и выходит такое говно. Оттуда же кстати тайминг дюпы с одновременным ломанием сундука или ещё чего-нибудь и забиранием итема. Они и сейчас сработают при особом везении на самом деле. Просто пакет взаимодействия с инвентарём должен прийти после ломания сундука, но в тот же тик и тогда всё сработает.

    Вот отсюда то и появляются нулевые итемы...
     
    Последнее редактирование: 14 ноя 2014
  2. fhntv24

    fhntv24 Активный участник Пользователь

    Баллы:
    88
    знаете что самое обидное? То что весь этот гавно код не работает на 1.3+ . Раньше он служил чтобы предметы в стороны летели... но в майне 1.3 ДОБАВИЛИ "СЖАТИЕ" ШМОТА... И ОДИН МАЛЕНЬКИЙ ВОПРОС - ЗАЧЕМ ЭТО ТОГДА? Оно же всё равно выйдет как 1 предмет в итоге .... без разлетывания в разные стороны... *sideface*
     
  3. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Вово. Ладно, благо в ModFixNG проверяется валидность блока и при клике, так что это не проблема.
    Но всё равно, такое говно стоило столько нервов и времени.
     
  4. fhntv24

    fhntv24 Активный участник Пользователь

    Баллы:
    88
    Ну эт же майн! Ты че хочеш! (п.с. немешалобы им это написать в баг трекер... горошая задача для них будет =) )
     
  5. Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    Это же моджанги, чего вы от них хотели.
    Сделали бы нормальный ModAPI, и выпускали бы минорные апдейты с исправлением ошибок, нет начали пихать кривые реализации древних модовых вещей
     
  6. fhntv24

    fhntv24 Активный участник Пользователь

    Баллы:
    88
    помню как написал нотч , мол он не хочет добовлять майн ничего что уже есть в модах... и да будет ендер сундук! И да будет новая генерация! И да будет овер 100500 вещей которые были в модах! Я же не хочу добовлять то что уже было в модах .... Гениальность нотча .... Реально не понимаю , как так можно относиться к игре
     
  7. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Нотч ушёл после 1.2.5. Он то как раз своё слово держал, а когда не смог - свалил.
     
  8. fhntv24

    fhntv24 Активный участник Пользователь

    Баллы:
    88
    как раз таки , ендер сундуки добавили когда он еще был(в 1.2.5). Новая генерация - она же поойму менялась до 1.2.5. Или я уже не помню когда что в майне делали или что... Хотя да , нотч раковал меньше других. Когда он был , он еще не мало чего делал полезного. Да и айпи который майн делает ... Тоже знаете , обещать но ничего не делать. В итоге так всегда , когда ливает хороший человек с проекта. С тем же форжем так было , и не раз.
     
  9. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Это означает, что если добавить удаление нулевых предметов, то такие дюпы не будут работать?
     
  10. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Ровно до тех пор пока какой-нибудь моддер-долбоёб не решит что можно вообще не отнимать количество итемов, всё равно же инвнетарь сейчас уничтожится. И боюсь таких моддеров слишком много.
    Но в ванильке решатся. Впрочем это всё равно не лучших метод. Лучше пропатчить эти классы чтобы они реально удаляли предметы.
     
  11. fhntv24

    fhntv24 Активный участник Пользователь

    Баллы:
    88
    а еще лутше , сделать setItemStackSize , и там добавить чек на 0. А еще лутше , всем подарить руко выпрямитель. А еще ... А еще лутше ставить на нулл все предметы когда ты ломаеш блок ( сделать в ядре сервера , т.е. в классе world ) ...

    Но у кого руки дойдут чтобы это сделать?!
     
  12. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Средствами доступными баккиту предметы станут null слишком поздно.
    Поэтому то в модфиксе и торчит проверка валидности контейнера при каждом клике. Это 100% фикс при условии что клик собственно вызывается, и настроен список энтитей которые надо отслеживтаь (блоки работают автоматически, почти все), а не как с AE где идиот-моддер решил что неплохо было бы сделать кастомное пермещение итемов используя пробел мать его. Хорошо хоть отключить можно.
    Если поиск нормального плагина превращается в поиск иголки в стоге сена, то поиск нормального мода превращается в хождение по минному полю.
     
  13. fhntv24

    fhntv24 Активный участник Пользователь

    Баллы:
    88
    Я же сказал , что это делать надо в ядре. О АЕ - не знал что он не посылает евент. Есть просто в форже евент перемещения , и его можно вполне посылать. Как говорил сирс то каулдрон отправляет евенты ведру ( я не проверял ... но надеюсь что правда =) )
     
  14. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Если не ошибаюсь, достаточно внедрить очистку в само ядро (как выше уже писали). Куда-нибудь в обновление тайлов. Если это так, то думаю, что я смогу написать нужный мод-патчер.
     
  15. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Ну внедри очистку в ядро когда универсально доступного метода обнулить инвентарь нет, всё сводится к тому что каждый сабкласс делает своё обнуление. Точнее для блоков ещё есть, они почти все наследуются от IInventory, А вот для энтитей нет. Но для блоков можешь пропатчить, искать в Chunk.
    Хотя можно конечно изъебнутся и запилить рекурсивный скан полей который обнуляет все итемстаки и массивы итемстаков, но это где-то выйдет боком.
     
  16. fhntv24

    fhntv24 Активный участник Пользователь

    Баллы:
    88
    вообщето можно ... можно узнать колво слотов , и сетить каждый слот на нулл , не?
     
  17. Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    InventoryClickEvent работает и в модовых инвентарях.
    А АЕ даже не чекает валидность инвентаря, в 13ой ревизии можно было рулить любым инвентарём, даже закрытым. Как в АЕ2 дела не знаю
     
  18. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Нуну, найди мне в Entity хоть какой-то метод отвечающий за это. Лошадь IInventory не имплементирует, однако туда можно сундук и открыть его. А представь сколько модов таких?
     
  19. Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    overдохрена модов:

    Код:
    public int getSizeInventory() {
            return 0
        }
     
  20. Автор темы
    Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Овердохрена модов для энтитей IInventory не имплементируют.
     

Поделиться этой страницей