Решил "тряхнуть стариной" и вернуться к работе над одной своей картой-долгостроем.
Хотел использовать в ней полноэкранный инвентарь, либо древний BX TRS II с этого самого сайта (лежит там же, где и лежал все эти 10 лет xgm.guru/forum/showthread.php?t=8065), либо одну другую систему (оригинал нужной мне версии прикрепляю к вопросу, поскольку выложенная на хайве версия содержала ряд не нужных мне правок, да и проблема с ее кодом идентичная). Для ознакомления со второй системой, нажмите на "скачать" под этой публикацией.
В чем же проблема:
Инра с последним патчем от близзард (1.31+)
BX TRS II - ради тэста, взял исходную карту и сохранил под новым названием. На мое удивление компилируется без ошибок. В пересохраненном варианте инвентарь открывается, но иконки предметов невидимы, при том в слотах предметы есть. Исходник запускается в игре с новейшим патчем без проблем и там все в порядке.
Shadowvzs_Inventory - Карта в игре не запускается и выдает ошибку, якобы файл поврежден. В редакторе карт открывается, но при рекомпиляции (то есть при попытке сохранить) jass helper изволит бунтовать, заявляя следующее (всего одна ошибка, но что с ней делать, ваш покорный слуга не знает):
Line 9578: Identifier redeclared "rnd"
(смотреть повторяющееся выражение local integer rnd ближе к началу кода)
Этот кусок кода я нашел, он живет в триггере ClickToTrackable
//execute the buy/crafting so create item and give to buyer, set item price, if it is bought then decrease the buyer gold
function BuyItemFromShop takes integer pl, integer mc, integer sc, integer ls, boolean craft returns nothing
    local integer ilv
    local integer price
    local integer id = CheckItemIdFromShop(pl)
    local integer pgold
    local integer Sp = 0 //space
    local integer i = 100
    local item itm
    local string s
    local integer lv = 0
    local integer subtype = 0
    local integer quality = 2 //default quality = normal
    local integer rnd
    local integer greq
    local integer ui
    local integer ctype = 0//craft type / profesion skill type (1 = bs, 2 = tailor etc)
    local integer clv = 0 //craft skill level
    local integer cv = udg_Inv_Unit[pl]
    local integer rnd
    local boolean CraftFail = true
    local integer CraftFailChance = 33

    local integer CQCE_Normal = 80 // 80% quality chance equipment: normal
    local integer CQCE_Magic = 10 // 10% quality chance equipment: magic
    local integer CQCE_Rare = 6 // 6% quality chance equipment: rare
    local integer CQCE_VeryRare = 3 // 3% quality chance equipment: very rare
    local integer CQCE_Excelent = 1 // 1% quality chance equipment: excelent
    local integer CQCE_CSE = 1 //how much effectiveness give the craft skill if higher
                               //if 0 then disable, else give chance for like
                               //normal + skill lv * 0 (+0%), magic + skill lv * cse * 2 (+20%)
                               //rare + skill * cse * 1.3 (13%), very rare + skill * cse * 0.9 (9%)
                               //excelent + skill * cse / 5 (+5%)
    local integer CQCE = 0 //quality chance value
 
    local unit u = udg_UDexUnits[cv]
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    set ls = ls - 2200
    if id > 0 then
        set ilv = LoadInteger(udg_FSS, 603, id)
        set pgold = GetPlayerState(Player(pl - 1), PLAYER_STATE_RESOURCE_GOLD)
        set price = LoadInteger(udg_FSS, 602, id)
        set ui = GetShopUniqueId (mc - 2000, sc - 2100, ls)
        if ilv >= 100 and ilv < 200 then
            if ui == 0 then
                set price = price * ls * 5
            endif
        elseif ilv == 200 and ui != 0 then
                set price = LoadInteger(udg_CItem_Table, -2000-ui, 12)
        elseif ilv != 0 and ui > 0 then
            set price = price * ui
        elseif ilv == 1902 or ilv == 1903 then
            set price = price * ls
        endif
        if craft then
            set price = 0
        endif
        set greq = R2I(price * (100.00 - udg_Global_Discount[cv]) / 100.00)
        if greq <= pgold then
            loop
                exitwhen i > 119 or Sp != 0
                if LoadInteger(udg_Stat_Table, cv, - i) == 0 then
                    set Sp = i
                endif
                set i = i + 1
            endloop

            if Sp > 0 and Sp < 120 then
                set ui = GetShopUniqueId (mc - 2000, sc - 2100, ls)
                set i = 0
                if ilv >= 100 and ilv < 112 then
            
                    if ui == 0 then
                        set subtype = 1
                        set sc = sc - 2100
                        if ilv == 105 then
                            set subtype = 1
                            set ctype = 2
                        elseif ilv == 101 or ilv == 102 or ilv == 104 then
                            set subtype = sc - ((sc / 3) * 3)
                            set ctype = 2
                            if subtype == 0 then
                                set subtype = 3
                            endif
                        elseif ilv == 103 then
                            set subtype = sc
                            set ctype = 1
                        elseif ilv > 105 and ilv < 112 then
                            set ctype = 3
                        endif
                        set lv = ls * 5
                        if craft and ilv < 109 then
                            if ctype > 0 then
                                set clv = LoadInteger(udg_Stat_Table, 27000 + cv, ctype)
                            endif
                            set CQCE = Craft_Quality_Chance(CQCE_Normal, CQCE_Magic + clv * CQCE_CSE * 2, CQCE_Rare + R2I(clv * CQCE_CSE * 1.3), CQCE_VeryRare + R2I(clv * CQCE_CSE * 0.9), CQCE_Excelent + R2I(clv * CQCE_CSE * 0.5))
                            set quality = CQCE
                        endif

                        set rnd = GetRandomInt(0, 100)
                        if CraftFail and rnd < CraftFailChance and craft then
                            call DisplayTextToPlayer(Player(pl - 1), 0, 0, "|cffff3333Craft failed!|r")
                            set i = 0
                        else
                            if ilv == 111 then
                                set i = GenerateEQ (11, 1, - 1, lv, lv, x, y, false, - 1)
                            else
                                set i = GenerateEQ (ilv - 100, subtype, quality, lv, lv, x, y, false, 2)
                            endif

                        endif
                    else
                        set i = GenerateUnique (pl, ui, x, y)
                    endif
                    if craft and i != 0 then
                        call DisplayTextToPlayer(Player(pl - 1), 0, 0, "|cffffff00Craft is done|r")
                        call SaveStr(udg_CItem_Table, i, 21, GetPlayerName(Player(pl - 1)))
                    endif
                    if i != 0 then
                        set itm = LoadItemHandle(udg_CItem_Table, i, 100)
                        set price = LoadInteger(udg_FSS, 602, id)
                        if ilv >= 100 and ilv < 200 then
                            if ui == 0 then
                                set price = price * ls * 5
                            endif
                        endif
                        if price > 0 then
                            set price = R2I(price * (100.00 - udg_Global_Discount[cv]) / 100.00)
                        endif
                        call SaveInteger(udg_CItem_Table, i, 12, R2I(price))
                    else
                        set itm = null
                    endif
                elseif ilv == GEM_LEVEL() and ui != 0 then
                     set i = CreateSocketGem(pl, ui, x, y)
                     if i != 0 then
                        set itm = LoadItemHandle(udg_CItem_Table, i, 100)
                        call SetItemCharges(itm, 1)
                     endif
                else
                    if ilv > 1901 and ilv < 1906 then
                        if ilv == 1902 or ilv == 1904 then
                            set i = 26
                        elseif ilv == 1903 or ilv == 1905 then
                            set i = 30
                        endif
                        if ilv < 1904 then
                            set rnd = ls * 25 + 250
                            if craft then
                                set rnd = GetRandomInt(rnd, rnd + 50 * LoadInteger(udg_Stat_Table, 27000 + cv, 4))
                            endif
                            set price = LoadInteger(udg_FSS, 602, id) * ls
                            set i = CreatePotion(ilv - 1901, x, y, ls * 5, i, rnd, 0, i)
                        else
                            set price = LoadInteger(udg_FSS, 602, id)
                            set rnd = 2000 //here a value for pot effect
                            if craft then
                                set rnd = GetRandomInt(rnd, rnd + 200 * LoadInteger(udg_Stat_Table, 27000 + cv, 4))
                            endif
                            set i = CreatePotion(ilv - 1901, x, y, 0, i, rnd, 0, i)
                        endif

                        if price > 0 then
                            set price = R2I(price * (100.00 - udg_Global_Discount[cv]) / 100.00)
                        endif
                        call SaveInteger(udg_CItem_Table, i, 12, R2I(price))
                        set itm = LoadItemHandle(udg_CItem_Table, i, 100)

                    else
                        set itm = CreateItem(id, x, y)
                        if ui == 0 then
                            set ui = 1
                        endif
                        if craft then
                            set clv = LoadInteger(udg_Stat_Table, 27000 + cv, 4)
                            set rnd = GetRandomInt(0, 99)
                            if rnd < clv then
                                set ui = ui + 1
                            endif
                        endif
                        if ilv != BAG_LEVEL() and ilv != BOX_LEVEL() then
                            call SetItemCharges(itm, ui)
                        elseif ilv == BOX_LEVEL() then
                            call SaveInteger(udg_CItem_Table, i, 3, ui)
                        endif
                    endif
                endif
                if itm != null then
                    call SaveInteger(udg_FSS, 2402, 40 + pl, 0)
                    call AddItem2HeroExt (cv, itm, false)
                    call SetItemInvulnerable(itm, true)
                    call SetPlayerState(Player(pl - 1), PLAYER_STATE_RESOURCE_GOLD, pgold - greq)
                endif
            else
                call DisplayTextToPlayer(Player(pl - 1), 0, 0, "|cffff3333Not space in inventory!|r")
            endif
        else
            call DisplayTextToPlayer(Player(pl - 1), 0, 0, "|cffff3333Not enough gold!|r")
        endif
    endif
    set u = null
endfunction
Стирание повтора декларации локальной переменной rnd приводит к 3 новым ошибкам.
Увы, программист из меня некудышный (попытки делал, но это именно та сфера, в которой у меня анти-талант), и починить код ни там, ни там, своими силами я не в состоянии.
Есть ли среди вас знатоки jass'a, готовые помочь и починить одну из, а будут силы и желание, обе системы (цель - работоспособность с версиями игры 1.31+)? Результат мог бы быть очень полезным не только мне, но и всему сообществу (ибо я был бы только рад, пополни они базу ресурсов этого сайта).

Не сов сем по теме, но близко - вот такое можно реализовать на новых функциях 1.31
Увы, полноценного инвентаря на аналогичных функциях пока не выкладывали в общий доступ, каждый пилит себе свою версию.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
BX TRS II
Рекомендую открыть исходник в новом редакторе, сохранить его и запустить. Если проблемы нет, то наработка неверно перенесена.
Shadowvzs_Inventory
Просто нужно последовательно убирать все ошибки, вот и всё.

А вообще, в 1.31.1 можно сделать свой полностью кастомный интерфейс.
1
Благодарю Вас за участие.
В первом случае я именно это и сделал. Дело именно в том, что система компилируется без ошибок, а при запуске работает не так как должна (иконки предметов невидимые, а почему - понятия не имею).
Во втором же случае, я не могу убрать их сам, потому, что не понимаю их смысл, а найти обьяснение в интернете тоже не вышло.
Если вам не трудно, можете попробовать повторить мои действия, увидите все воочию.
24
А какой смысл портировать устаревшие системы под 1.31, если в 1.31 можно написать нормальный инвентарь на кастом фреймах и новых функциях для работы с полями?
1
Я от Вас о такой возможности впервые слышу. Другое дело, что сам я это сделать не смогу, а с этими системами есть какой-никакой опыт работы.
24
Не сов сем по теме, но близко - вот такое можно реализовать на новых функциях 1.31
Увы, полноценного инвентаря на аналогичных функциях пока не выкладывали в общий доступ, каждый пилит себе свою версию.
Принятый ответ
1
Спасибо, Прог, обязательно взгляну.
Помучался немного с версией, на которую сослался 8gabriel8. В тепличных условиях работает неплохо, но дать через нее инвентарь 2-м или более героям под контролем 1 игрока - очень сложно. При пересадке на новую карту возникает ряд проблем, с которыми пока не разобрался: окна инвентаря или уезжают куда-то вниз, или же не появляются вовсе (и это при том, что импорт перенес с теми же путями, а триггеры и объекты через "импорт всех обьектов/триггеров").
30
окна инвентаря или уезжают куда-то вниз, или же не появляются вовсе
Найдите там библиотеку Camera и в настройках задайте точку, в которой у вас на карте рельеф по умолчанию..
1
Хорошо, поищу.
Нашел между тем еще один интересный пост
Надо будет тоже посмотреть.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.