|
|
|
|
И снова просьба о фиксе.
|
|
[DUОS] | Дата: Понедельник, 13 Декабря 2010, 19:18:44 | Сообщение # 1 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Code function SimError takes player ForPlayer, string msg returns nothing local sound s = CreateSoundFromLabel("InterfaceError",false,false,false,10,10) if GetLocalPlayer() == ForPlayer then call ClearTextMessages() call DisplayTimedTextToPlayer(ForPlayer,.52,-1.,2.,"|cffffcc00"+msg+"|r") call StartSound(s) call KillSoundWhenDone(s) endif set s = null endfunction
function GetUnitItemSlot takes unit u, integer itemID returns integer local integer i = 0 local item it loop exitwhen i > 5 set it = UnitItemInSlot(u,i) if GetItemTypeId(it) == itemID then return i endif set it = null set i = i + 1 endloop return -1 endfunction
function CombineItemCharges takes item i1, item i2 returns nothing call SetItemCharges(i1,GetItemCharges(i1) + GetItemCharges(i2)) endfunction
function NormToRune takes integer niid returns integer local integer i = 0 loop exitwhen i > udg_TotalItems if niid == udg_NormalItem[i] then return udg_RuneItem[i] endif set i = i + 1 endloop return -1 endfunction
function RuneToNorm takes integer riid returns integer local integer i = 0 loop exitwhen i > udg_TotalItems if riid == udg_RuneItem[i] then return udg_NormalItem[i] endif set i = i + 1 endloop return -1 endfunction
function GetItemIndex takes integer iid returns integer local integer i = 0 loop exitwhen i > udg_TotalItems if iid == udg_RuneItem[i] or iid == udg_NormalItem[i] then return i endif set i = i + 1 endloop return -1 endfunction
function IsItemRune takes integer iType returns boolean local integer i = 0 loop exitwhen i > udg_TotalItems if iType == udg_RuneItem[i] then return true endif set i = i + 1 endloop return false endfunction
function GetItemRecipeIndex takes integer itemType returns integer local integer i = 0 local integer i2 local integer hashType loop exitwhen i > udg_TotalRecipes set i2 = 1 loop exitwhen i2 > 7 set hashType = LoadInteger(udg_RecipeHash,i,i2) if hashType == itemType then return i endif set i2 = i2 + 1 endloop set i = i + 1 endloop return -1 endfunction
function UnitHasAllRecipeComponents takes unit u, integer pickedType returns boolean local integer recipeIndex = GetItemRecipeIndex(pickedType) local integer i = 1 local integer currentComponent local integer itemSlot local boolean sameTypeWithPicked = false loop exitwhen i > 7 set currentComponent = LoadInteger(udg_RecipeHash,recipeIndex,i) // Picked item must be captured so it'll just not be added. if currentComponent == pickedType and sameTypeWithPicked == false then set sameTypeWithPicked = true else set itemSlot = GetUnitItemSlot(u,currentComponent) if itemSlot == -1 then return false endif endif set i = i + 1 endloop return true endfunction
function IsItemRecipe takes integer itemType returns boolean local integer recipeIndex = GetItemRecipeIndex(itemType) if recipeIndex > -1 then return true endif return false endfunction
function MakeRecipe takes unit u, integer pickedType returns nothing local integer recipeIndex = GetItemRecipeIndex(pickedType) local integer i = 1 local boolean sameTypeWithPicked = false local integer itemSlot local integer currentComponent local item recipeComponent loop exitwhen i > 7 set currentComponent = LoadInteger(udg_RecipeHash,recipeIndex,i) if currentComponent != null then set itemSlot = GetUnitItemSlot(u,currentComponent) set recipeComponent = UnitItemInSlot(u,itemSlot) // Picked item must be captured so it'll just not be added. if currentComponent == pickedType and sameTypeWithPicked == false then set sameTypeWithPicked = true else call RemoveItem(recipeComponent) endif else set i = 7 endif set i = i + 1 endloop set currentComponent = LoadInteger(udg_RecipeHash,recipeIndex,0) if IsUnitAlly(u,Player(0)) then call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIam\\AIamTarget.mdl",u,"origin")) else call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIim\\AIimTarget.mdl",u,"origin")) endif call UnitAddItemById(u,NormToRune(currentComponent)) set recipeComponent = null endfunction
function UnitHasEmptySlot takes unit u returns boolean if UnitInventoryCount(u) == 6 then return false else return true endif endfunction
function GetUnitItemOfType takes unit u, integer iid returns item local integer index = GetUnitItemSlot(u,iid) if index == -1 then return null else return UnitItemInSlot(u,index) endif endfunction
function GiveItemToUnit takes item ri, unit u returns boolean local integer riid = GetItemTypeId(ri) local integer niid = RuneToNorm(riid) local item uiis = GetUnitItemOfType(u,niid) if UnitHasEmptySlot(u) then if IsItemRecipe(niid) and UnitHasAllRecipeComponents(u,niid) then call MakeRecipe(u,niid) elseif uiis != null and GetItemCharges(uiis) > 0 then call CombineItemCharges(uiis,ri) elseif GetItemCharges(ri) > 0 then set uiis = UnitAddItemById(u,niid) call SetItemCharges(uiis,GetItemCharges(ri)) else call UnitAddItemById(u,niid) endif set uiis = null return true else if IsItemRecipe(niid) and UnitHasAllRecipeComponents(u,niid) then call MakeRecipe(u,niid) elseif uiis != null and GetItemCharges(uiis) > 0 then call CombineItemCharges(uiis,ri) set uiis = null return true endif set uiis = null endif return false endfunction У меня есть такая система. И с ней две проблемы:- Не работает с полным инвентарём (если покупается последний компонент, то рецепт не скрещивается)
- Одинаковые компоненты некорректно индексируются.
|
|
|
|
Banzay89 | Дата: Понедельник, 13 Декабря 2010, 19:36:20 | Сообщение # 2 |
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
| [DUОS], ты наивный как дубовый плот.. даже шарящим людям будет впадло разбираться в чужом коде тем более полукилометровом...
|
|
|
|
[DUОS] | Дата: Понедельник, 13 Декабря 2010, 19:43:53 | Сообщение # 3 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Banzay89) даже шарящим людям будет впадло разбираться в чужом коде тем более полукилометровом... Типа я исключение, да?
|
|
|
|
Banzay89 | Дата: Понедельник, 13 Декабря 2010, 19:57:56 | Сообщение # 4 |
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
| Quote Типа я исключение, да? омг.. ты не понял. Я имел в виду что тем людям, которые могут помочь тебе с даной проблемой просто впадло будем вникать в этот длинный код =О
|
|
|
|
SirNikolas | Дата: Понедельник, 13 Декабря 2010, 20:08:54 | Сообщение # 5 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (|DUОS|) Code function GiveItemToUnit takes item ri, unit u returns boolean //... if IsItemRecipe(niid) and UnitHasAllRecipeComponents(u,niid) then А если предмет рецептом не является, то ничего не произойдет. P. S. Я еще в старой теме ответил, только мой пост удалился.
|
|
|
|
[DUОS] | Дата: Среда, 15 Декабря 2010, 16:45:46 | Сообщение # 6 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (SirNikolas) А если предмет рецептом не является, то ничего не произойдет. IsItemRecipe проверяет на то, является ли итем компонентом какого-нибудь рецепта.Добавлено (13-12-2010, 21:24) --------------------------------------------- Давайте распишу всё-таки, что делает функция, в которой обнаружена проблема. Code function UnitHasAllRecipeComponents takes unit u, integer pickedType returns boolean local integer recipeIndex = GetItemRecipeIndex(pickedType) local integer i = 1 local integer currentComponent local integer itemSlot local boolean sameTypeWithPicked = false loop exitwhen i > 7 set currentComponent = LoadInteger(udg_RecipeHash,recipeIndex,i) // Picked item must be captured so it'll just not be added. if currentComponent == pickedType and sameTypeWithPicked == false then set sameTypeWithPicked = true else set itemSlot = GetUnitItemSlot(u,currentComponent) if itemSlot == -1 then return false endif endif set i = i + 1 endloop return true endfunction Итак... Code local integer recipeIndex = GetItemRecipeIndex(pickedType) local integer i = 1 local integer currentComponent local integer itemSlot local boolean sameTypeWithPicked = false Объявление локальных переменных. recipeIndex определяет номер рецепта, под которым он сохранён в хеше. i - целочисленная для цикла по ингредиентам (начинается с 1, так как под номером 0 сохранён предмет, тип которого получается после объединения компонентов, а нас интересуют именно сами компоненты). currentComponent - текущий компонент, с которым оперирует шаг цикла. itemSlot - слот, в котором находится предмет типа currentComponent. Если он равен -1, то предмета такого типа у юнита нет. sameTypeWithPicked - логическая, проверяющая, было ли уже совпадение с типом подобранного предмета. Теперь вы поймёте, что функция прогоняет цикл по всем ингредиентам и ищет совпадения в инвентаре юнита u. Добавлено (15-12-2010, 16:45) ---------------------------------------------
Code function UnitCountItemsOfType takes unit u, integer itemType returns integer local integer i = 0 local item slotItem local integer count = 0 loop exitwhen i > 5 set slotItem = UnitItemInSlot(u,i) if GetItemTypeId(slotItem) == itemType then set count = count + 1 endif set i = i + 1 endloop set slotItem = null return count endfunction
function GetRecipeComponentCount takes integer compType returns integer local integer index = GetItemRecipeIndex(compType) return LoadInteger(udg_RecipeHash,index,compType) endfunction
function GetFullRecipeId takes unit u, integer pickedType returns integer local integer i = 1 local integer i2 = 0 local boolean array have local boolean b local integer index = 0 local integer currentType local integer recCount local integer uCount
loop exitwhen index > udg_TotalRecipes loop exitwhen i > 7 set currentType = LoadInteger(udg_RecipeHash,index,i) set recCount = GetRecipeComponentCount(currentType) set uCount = UnitCountItemsOfType(u,currentType) if currentType == pickedType and b == false then set uCount = uCount + 1 set b = true endif if uCount >= recCount then set have[i] = true else set have[i] = false endif if currentType == null then set b = true set i2 = 1 loop exitwhen i2 > i - 1 set b = b and have[i] set i2 = i2 + 1 endloop if b then return index else set i = 7 set i2 = 1 loop exitwhen i2 > i - 1 set b = b and have[i] set i2 = i2 + 1 endloop endif endif set i = i + 1 endloop set b = false set index = index + 1 endloop return -1 endfunction Вот новый вариант функции. Все custom-функции работают правильно, но я не могу сообразить, НЕ МОГУ СООБРАЗИТЬ ПРОСТО, в чём здесь проблема... Простите за капс, но это просто никакой критики не выдерживает. Она всегда возвращает что-то кроме -1... даже если нет всех рецепт-компонентов... :\
|
|
|
|
[stebashka] | Дата: Среда, 15 Декабря 2010, 16:58:51 | Сообщение # 7 |
пути и нити разными бывают
Группа: Библиотекари
Сообщений: 4719
Награды: 5
Блокировки:
| [DUОS], лучше тебя в коде мало кто разбирается => помощь ждать не приходится
|
|
|
|
[DUОS] | Дата: Среда, 15 Декабря 2010, 17:35:15 | Сообщение # 8 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| [stebashka], Другие варианты?
|
|
|
|
[stebashka] | Дата: Среда, 15 Декабря 2010, 18:15:35 | Сообщение # 9 |
пути и нити разными бывают
Группа: Библиотекари
Сообщений: 4719
Награды: 5
Блокировки:
| [DUОS], стереть все это и подумать как сделать по другому что бы не было этого Quote (|DUОS|) всегда возвращает что-то кроме -1 или обратись в личку к людям на чью помощь расчитывал создавая эту тему
|
|
|
|
[DUОS] | Дата: Среда, 15 Декабря 2010, 18:17:45 | Сообщение # 10 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (|stebashka|) [DUОS], стереть все это и подумать как сделать по другому что бы не было этого Я-то и спрашиваю, как Оо
|
|
|
|
|
|
|
|
|
|
|