Решил "тряхнуть стариной" и вернуться к работе над одной своей картой-долгостроем.
Хотел использовать в ней полноэкранный инвентарь, либо древний 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
Увы, полноценного инвентаря на аналогичных функциях пока не выкладывали в общий доступ, каждый пилит себе свою версию.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
5 лет назад
0
BX TRS II
Рекомендую открыть исходник в новом редакторе, сохранить его и запустить. Если проблемы нет, то наработка неверно перенесена.
Shadowvzs_Inventory
Просто нужно последовательно убирать все ошибки, вот и всё.

А вообще, в 1.31.1 можно сделать свой полностью кастомный интерфейс.
0
1
5 лет назад
0
Благодарю Вас за участие.
В первом случае я именно это и сделал. Дело именно в том, что система компилируется без ошибок, а при запуске работает не так как должна (иконки предметов невидимые, а почему - понятия не имею).
Во втором же случае, я не могу убрать их сам, потому, что не понимаю их смысл, а найти обьяснение в интернете тоже не вышло.
Если вам не трудно, можете попробовать повторить мои действия, увидите все воочию.
0
24
5 лет назад
0
А какой смысл портировать устаревшие системы под 1.31, если в 1.31 можно написать нормальный инвентарь на кастом фреймах и новых функциях для работы с полями?
0
1
5 лет назад
0
Я от Вас о такой возможности впервые слышу. Другое дело, что сам я это сделать не смогу, а с этими системами есть какой-никакой опыт работы.
2
26
5 лет назад
2
0
1
5 лет назад
0
Спасибо за ссылку. Сейчас испытаю.
4
24
5 лет назад
4
Не сов сем по теме, но близко - вот такое можно реализовать на новых функциях 1.31
Увы, полноценного инвентаря на аналогичных функциях пока не выкладывали в общий доступ, каждый пилит себе свою версию.
Принятый ответ
2
1
5 лет назад
2
Спасибо, Прог, обязательно взгляну.
Помучался немного с версией, на которую сослался 8gabriel8. В тепличных условиях работает неплохо, но дать через нее инвентарь 2-м или более героям под контролем 1 игрока - очень сложно. При пересадке на новую карту возникает ряд проблем, с которыми пока не разобрался: окна инвентаря или уезжают куда-то вниз, или же не появляются вовсе (и это при том, что импорт перенес с теми же путями, а триггеры и объекты через "импорт всех обьектов/триггеров").
1
29
5 лет назад
Отредактирован nazarpunk
1
окна инвентаря или уезжают куда-то вниз, или же не появляются вовсе
Найдите там библиотеку Camera и в настройках задайте точку, в которой у вас на карте рельеф по умолчанию..
1
1
5 лет назад
1
Хорошо, поищу.
Нашел между тем еще один интересный пост
Надо будет тоже посмотреть.
0
26
5 лет назад
0
NazarPunk, сначала пытался твою адаптированную версию этого инвентаря найти, но не смог. Вроде бы ты даже две версии выкладывал, одна для 1.26, другая для новых патчей, но это не точно. Так вот адаптация твоя случайно не включала возможность нормального использования у нескольких героев одного игрока, не помнишь?
0
29
5 лет назад
0
сначала пытался твою адаптированную версию этого инвентаря найти, но не смог.
Наверно потому, что до инвентаря руки у меня ещё не дошли, хотя с фрэймами уже разобрался.
0
1
5 лет назад
Отредактирован Taihou
0
NazarPunk, не будете ли столь любезны подсказать, как в той системе обойти создание героя с инвентарем через триггер?
Там код выглядит вот так:
scope StartGame initializer Init

    globals
        Camera array PlayerCamera
        unit array PlayerHero
    endglobals

    private function StartGame takes nothing returns nothing
        local trigger trig
        local integer i = 0
        local User user
        local Equipment equipment
        local Inventory inv
        local integer array urace
        
        set urace[1] = 'Hpal'
        set urace[2] = 'Obla'
        set urace[3] = 'Ulic'
        set urace[4] = 'Edem'

        loop
            exitwhen i == User.AmountPlaying
            
            set user = User.fromPlaying(i)
            set PlayerCamera[user.id] = Camera.create()
            
            // create hero
            set equipment = equipment.create.evaluate(CreateUnitAtLoc(user.handle, urace[GetHandleId(GetPlayerRace(user.handle))], GetStartLocationLoc(GetPlayerStartLocation(user.handle)), 180))
            
            call UnitAddAbility(equipment.unit, 'A001')
            call UnitAddAbility(equipment.unit, 'A002')
            
            if (User.Local == user.handle) then
                call SelectUnit(equipment.unit, true)
                call PanCameraToTimed(GetUnitX(equipment.unit), GetUnitY(equipment.unit), 0)
            endif
            
            set inv = Inventory.create(equipment.unit)
            
            set PlayerHero[user.id] = equipment.unit
            
            call SetPlayerAllianceStateBJ(Player(bj_PLAYER_NEUTRAL_EXTRA), user.handle, bj_ALLIANCE_ALLIED_VISION)
            call SetPlayerAllianceStateBJ(user.handle, Player(bj_PLAYER_NEUTRAL_EXTRA), bj_ALLIANCE_ALLIED_VISION)
            
            set i = i + 1
        endloop
    endfunction
    
    private function Init takes nothing returns nothing
        call SetSkyModel("Environment\\Sky\\Sky\\SkyLight.mdl")
        call SetFloatGameState(GAME_STATE_TIME_OF_DAY, 22.00)
        call StartGame()
    endfunction

endscope
Я только примерно понимаю смысл этих функций (и то не всех), но никак не могу придумать, чем их заменить, чтобы дать инвентарь уже стоящему на карте герою.
0
26
5 лет назад
0
Прямо помню этот код)
Вот тот вопрос xgm.guru/p/wc3/222353
0
1
5 лет назад
0
Да, почти та же проблема, только вид впрофиль. Что до системы, которую посоветовал тогда NazarPunk, я ее и так держу "в качестве запасного варианта". Просто согласитесь, полноэкранный и посолиднее выглядит и слотов там обычно больше.
Впринципе, если бы удалось реанимировать один из 2-х, про которые я упомянул вначале, я всеравно был бы рад.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.