Сейчас 08:26:03 Воскресенье, 2 июня, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
И снова просьба о фиксе.
[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], стереть все это и подумать как сделать по другому что бы не было этого

Я-то и спрашиваю, как Оо


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz