Решил "тряхнуть стариной" и вернуться к работе над одной своей картой-долгостроем.
Хотел использовать в ней полноэкранный инвентарь, либо древний BX TRS II с этого самого сайта (лежит там же, где и лежал все эти 10 лет xgm.guru/forum/showthread.php?t=8065), либо одну другую систему (оригинал нужной мне версии прикрепляю к вопросу, поскольку выложенная на хайве версия содержала ряд не нужных мне правок, да и проблема с ее кодом идентичная). Для ознакомления со второй системой, нажмите на "скачать" под этой публикацией.
Хотел использовать в ней полноэкранный инвентарь, либо древний BX TRS II с этого самого сайта (лежит там же, где и лежал все эти 10 лет xgm.guru/forum/showthread.php?t=8065), либо одну другую систему (оригинал нужной мне версии прикрепляю к вопросу, поскольку выложенная на хайве версия содержала ряд не нужных мне правок, да и проблема с ее кодом идентичная). Для ознакомления со второй системой, нажмите на "скачать" под этой публикацией.
В чем же проблема:
Инра с последним патчем от близзард (1.31+)
BX TRS II - ради тэста, взял исходную карту и сохранил под новым названием. На мое удивление компилируется без ошибок. В пересохраненном варианте инвентарь открывается, но иконки предметов невидимы, при том в слотах предметы есть. Исходник запускается в игре с новейшим патчем без проблем и там все в порядке.
Инра с последним патчем от близзард (1.31+)
BX TRS II - ради тэста, взял исходную карту и сохранил под новым названием. На мое удивление компилируется без ошибок. В пересохраненном варианте инвентарь открывается, но иконки предметов невидимы, при том в слотах предметы есть. Исходник запускается в игре с новейшим патчем без проблем и там все в порядке.
Shadowvzs_Inventory - Карта в игре не запускается и выдает ошибку, якобы файл поврежден. В редакторе карт открывается, но при рекомпиляции (то есть при попытке сохранить) jass helper изволит бунтовать, заявляя следующее (всего одна ошибка, но что с ней делать, ваш покорный слуга не знает):
Line 9578: Identifier redeclared "rnd"
(смотреть повторяющееся выражение local integer rnd ближе к началу кода)
Этот кусок кода я нашел, он живет в триггере ClickToTrackable
(смотреть повторяющееся выражение 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
Увы, полноценного инвентаря на аналогичных функциях пока не выкладывали в общий доступ, каждый пилит себе свою версию.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
В первом случае я именно это и сделал. Дело именно в том, что система компилируется без ошибок, а при запуске работает не так как должна (иконки предметов невидимые, а почему - понятия не имею).
Во втором же случае, я не могу убрать их сам, потому, что не понимаю их смысл, а найти обьяснение в интернете тоже не вышло.
Отредактирован nazarpunk
Отредактирован Taihou
Вот тот вопрос xgm.guru/p/wc3/222353