XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Перестал работать код
Ничего не пойму)
Вчера все работало, добавил ретурн сегодня, и все перестало работать
» кодэ
function PhysStrikesMechanic takes unit uCaster, unit uTarg, integer Id returns integer
    local integer Dispersion
    local integer FinalDispersion
    local integer PAtk
    local integer Accuracy
    local integer Random
    local integer EvadeChance
    local integer ParryChance
    local integer BlockChance
    local integer PDef
    local integer Critical
    local integer CritChanceRed
    local integer CritDmgRes
    local integer CritChance
    local integer FinalDmg
    local boolean Def = false
    local boolean Text1 = false
    local boolean A = IsUnitType(uCaster, UNIT_TYPE_HERO)
    local boolean B = IsUnitType(uTarg, UNIT_TYPE_HERO)
    local texttag text
    // Two-handed weapon dispersion (20%)
 if GetSpellAbilityId() == 'A000' then
        if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *20)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 20)
        endif
     set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
     call DisplayTextToForce( GetPlayersAll(), "2h" )
 endif
    // One-handed weapon dispersion (12%)
 if GetSpellAbilityId() == 'A002' then
    if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *12)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 12)
    endif
        set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
        call DisplayTextToForce( GetPlayersAll(), "1h" )
 endif
    // Ranged weapon dispersion (17%)
    if GetSpellAbilityId() == 'A003' then
        if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *17)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 17)
        endif
     set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
     call DisplayTextToForce( GetPlayersAll(), "Rh" )
    endif
    if A then
    // Pure dmg + dispersion
        set PAtk = (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] + FinalDispersion)
        set CritChance = udg_CritChance[GetPlayerId(GetOwningPlayer(uCaster))+1]
        else
        set PAtk = ((GetUnitAbilityLevel(uCaster,'A00E') * 80) + FinalDispersion)
        set CritChance = GetUnitAbilityLevel(uCaster,'A00H') * 8
    endif
 if B then
 // Critical Chance Reduction and Critical Damage Resist
    set CritChanceRed = udg_CritChanceRed[GetPlayerId(GetOwningPlayer(uTarg))+1]
    set CritDmgRes = udg_CritDmgRes[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set CritChanceRed = GetUnitAbilityLevel(uTarg,'A00D') * 8
    set CritDmgRes = GetUnitAbilityLevel(uTarg,'A00C') * 8
 endif
 // Final Critical Chance
set CritChance = CritChance - CritChanceRed
 if CritChance <= 0 then
    set CritChance = 1
 endif
if CritChance >= 50 then
    set CritChance = 50
 endif
    set Critical = GetRandomInt (1, 100)
 if Critical <= CritChance then
 // Critical Hit
   if GetSpellAbilityId() == 'A002' then
   // One-handed Weapon Critical Modifier and Critical Damage Resist
    set PAtk = R2I (( PAtk * 2.2) - CritDmgRes)
    endif
    if GetSpellAbilityId() == 'A000' or GetSpellAbilityId() == 'A003' then
    // Two-handed and Range Weapon Critical Modifier and Critical Damage Resist
    set PAtk = R2I (( PAtk * 1.8) - CritDmgRes)
   endif
  endif
    if B then
    // Physical Defence Define
    set PDef = udg_PhysDef[GetPlayerId(GetOwningPlayer(uTarg))+1]
    // Evade Define
    set EvadeChance = udg_Evade[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set PDef = GetUnitAbilityLevel(uTarg,'A006') * 80
    set EvadeChance = GetUnitAbilityLevel(uTarg,'A008') * 80
    endif
    set FinalDmg = PAtk - PDef
    // Physical Defence Dmg Cutting
    if FinalDmg <= 0 then
    set FinalDmg = 1
    endif
    if Def ==  false then
  if A then
    // Accuracy Define
    set Accuracy = udg_Accuracy[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set Accuracy = GetUnitAbilityLevel(uCaster,'A00I') * 80
  endif
    set EvadeChance = R2I ((EvadeChance - Accuracy) * 0.1)
  if EvadeChance <= 5 then
  // Min Evade limit
    set EvadeChance = 5
  endif
  if EvadeChance >= 40 then
  // Max Evade limit
    set EvadeChance = 40
  endif
    set Random = GetRandomInt (1, 100)
  if Random <= EvadeChance then
  // Evade
    set FinalDmg = 0
    set text = CreateTextTagUnitBJ( "Уклон!", uTarg, 0, 10, 100.00, 100.00, 100.00, 0 )
    set Text1 = true
    set Def = true
    set Id = 1
 endif
endif
if Def ==  false then
   if B then
    // Parry Define
    set ParryChance = udg_Parry[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set ParryChance = GetUnitAbilityLevel(uCaster,'A009') * 80
   endif
    set ParryChance = R2I ((ParryChance - Accuracy) * 0.1)
   if ParryChance <= 5 then
    set ParryChance = 5
   endif
   if ParryChance >= 45 then
    set ParryChance = 45
   endif
    set Random = GetRandomInt (1, 100)
   if Random <= ParryChance then
    // Parry
    set FinalDmg = (FinalDmg - ((FinalDmg / 100) * 45))
    set text = CreateTextTagUnitBJ( ("|c005FFFFFПарир.!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
    set Text1 = true
    set Def = true
    set Id = 2
   endif
endif
    if GetUnitAbilityLevel(uTarg, 'A00G') == 2 and Def == false then
    // "If unit have shield equipped?"
    if B then
    // Block Define
    set BlockChance = udg_Block[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set BlockChance = GetUnitAbilityLevel(uTarg,'A00A') * 80
    endif
    set BlockChance = R2I ((BlockChance - Accuracy) * 0.1)
    if BlockChance <= 5 then
    set BlockChance = 5
    endif
    if BlockChance >= 50 then
    set BlockChance = 50
    endif
    set Random = GetRandomInt (1, 100)
    if Random <= BlockChance then
    // Block
    set FinalDmg = (FinalDmg - ((FinalDmg / 100) * 70))
    set text = CreateTextTagUnitBJ( ("|c0089ABFFБлок!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
    set Text1 = true
    set Def = true
    set Id = 3
    endif
    endif
    call UnitDamageTarget(uCaster, uTarg, I2R(FinalDmg), true, false, ATTACK_TYPE_CHAOS ,  DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    // Final Damage To Unit
    if Critical <= CritChance and Text1 == false then
    // Hitnumber of Critical Strike
    set text = CreateTextTagUnitBJ( ("|c00FFFF00Крит!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
    set Text1 = true
    endif
    if Text1 ==  false then
    set text = CreateTextTagUnitBJ( I2S(FinalDmg), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
    set Text1 = true
    endif
    call SetTextTagVelocityBJ( text, 64, ( GetUnitFacing(uCaster)) )
    call SetTextTagPermanentBJ( text, false )
    call SetTextTagLifespanBJ(text,2)
    call SetTextTagFadepointBJ(text,0.0)
    set text = null
    return Id
    endfunction
что за магия? оО

Отредактировано Hatsume_Hate, 15.04.2012 в 09:22.
Старый 15.04.2012, 09:17
DaeDR

offline
Опыт: 8,074
Активность:
А что за Id такое? Переменная не обозначена не создана
DaeDR добавил:
Ам. просмотрел. входящая. странно
DaeDR добавил:
сделай через другую
Старый 15.04.2012, 09:21
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
DaeDR:
А что за Id такое? Переменная не обозначена не создана
DaeDR добавил:
Ам. просмотрел. входящая. странно
DaeDR добавил:
сделай через другую
всмысле через другую?
Старый 15.04.2012, 09:22
DaeDR

offline
Опыт: 8,074
Активность:
local integer id2
...
set id2 = Id
return id2
Я конечно не знаю, но мб в варике нельзя возвращать входящую переменную
Старый 15.04.2012, 09:24
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
DaeDR:
local integer id2
...
set id2 = Id
return id2
Я конечно не знаю, но мб в варике нельзя возвращать входящую переменную
щас попробую
всеравно не работает
Старый 15.04.2012, 09:25
DaeDR

offline
Опыт: 8,074
Активность:
Проблема в другом. Что пишет компилятор и на какую строчку жалуется?
Старый 15.04.2012, 09:38
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
DaeDR:
Проблема в другом. Что пишет компилятор и на какую строчку жалуется?
да в том и дело что все.... ок. Ни на что не жалуется.
Старый 15.04.2012, 09:40
DaeDR

offline
Опыт: 8,074
Активность:
А без returns все работает?
Старый 15.04.2012, 09:42
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
есть канеш мысль что это изза
if GetSpellAbilityId() == 'A000' then
но ведь до этого дня все работало о_О
Hatsume_Hate добавил:
без ретурна все работает
Старый 15.04.2012, 09:47
Lipen

offline
Опыт: 1,550
Активность:
Напиши везде где можно отладочные сообщения. Узнаешь где проблема.
Старый 15.04.2012, 09:54
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
написал. дальше условия первого с ретурном ничего не работает
без все работает как и должно
Старый 15.04.2012, 09:56
Lipen

offline
Опыт: 1,550
Активность:
Попробуй передать GetSpellAbilityId аргументом.
Старый 15.04.2012, 10:01
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Lipen:
Попробуй передать GetSpellAbilityId аргументом.
пробовал но я столкнулся с трудностями. Через строку он передает название скила, через целочисленное он передает кучу цифр, и вот как передать допустим 'A002'?
Старый 15.04.2012, 10:03
DaeDR

offline
Опыт: 8,074
Активность:
Hatsume_Hate, Почему ты в вызываемой функции используешь GetSpellAbilityId??
Любые подобные вызовы сюда не проходят!
Старый 15.04.2012, 10:03
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
DaeDR:
Hatsume_Hate, Почему ты в вызываемой функции используешь GetSpellAbilityId??
Любые подобные вызовы сюда не проходят!
но работает же :D
Старый 15.04.2012, 10:04
DaeDR

offline
Опыт: 8,074
Активность:
Hatsume_Hate, Быть такого не может! GetSpellAbilityId и иже с ним живут только в функции реакции на событие!
Старый 15.04.2012, 10:05
Lipen

offline
Опыт: 1,550
Активность:
Hatsume_Hate, 'A002' это в 256-ричной системе. GetSpellAbilityId возвращает в 10-ричной. Без разницы в какой системе сравнивать.
Старый 15.04.2012, 10:08
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
DaeDR:
Hatsume_Hate, Быть такого не может! GetSpellAbilityId и иже с ним живут только в функции реакции на событие!
пруф, все работает без ретурна) с ретурном не работает)
Hatsume_Hate добавил:
Lipen:
Hatsume_Hate, 'A002' это в 256-ричной системе. GetSpellAbilityId возвращает в 10-ричной. Без разницы в какой системе сравнивать.
мм... я имею проблемы с математикой =) обьяснишь на пальцах как это поудобнее сделать?)
Миниатюры
Кликните на картинку для увеличения
Название:  2412.JPG
Просмотров: 30
Размер:  108.5 Кбайт  
Старый 15.04.2012, 10:16
Lipen

offline
Опыт: 1,550
Активность:
function PhysStrikesMechanic takes unit uCaster, unit uTarg, integer Id, integer aid returns integer
...
	if aid == 'A000' then ...
	if aid == 'A001' then ...
...
endfunction

function YourFunc...
	local integer aid = GetSpellAbilityId()

	call PhysStrikesMechanic(uCaster, uTarg, Id, aid)
endfunction
Можешь ещё добавить BJDebugMsg(I2S(GetSpellAbilityId())) и посмотреть в обоих случаях - с ретурном и без.
Старый 15.04.2012, 10:35
Hanabishi
COOL STATUS
offline
Опыт: отключен
Lipen, чепуха, GetSpellAbilityId() == 'A000' прескрасно работает, делал так лично очень много раз.
Hatsume_Hate, если ты говоришь, что без ретурна точно работает, то это определённо заскок вара и дело не в коде. Сделай без ретурна через глобалки (для мгновенных действий без разницы будет).
Старый 15.04.2012, 10:47
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 00:15.