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

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

Закрытая тема
 
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Hatsume_Hate, что именно?
Старый 16.04.2012, 21:10
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Klop:
Hatsume_Hate, что именно?
  1. урон перестал выводиться.Но рассчитывается и наносится.
  2. Надпись "Уклон!" появляется и застывает. Как и "парир!"
  3. крит работает как и должен. Надпись появляется движется и исчезает.
» жмиминя
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 EvadeChance
    local integer ParryChance
    local integer BlockChance
    local integer PDef
    local integer CritChanceRed
    local integer CritDmgRes
    local integer CritChance
    local integer FinalDmg
    local boolean Critical
    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
 if GetRandomInt (1, 100) <= CritChance then
 // Critical Hit
  set Critical = true
   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
  if GetRandomInt (1, 100) <= 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
   if GetRandomInt (1, 100) <= 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
    if GetRandomInt (1, 100) <= 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 == true 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
local unit uCaster = GetSpellAbilityUnit()
    local unit uTarg = GetSpellTargetUnit()
    local integer Id = 0
    set Id = PhysStrikesMechanic (uCaster, uTarg, Id)
    call DisplayTextToForce( GetPlayersAll(), I2S(Id) )
    set uTarg = null
    set uCaster = null
ид не показало мне не вернулось?...
Старый 16.04.2012, 21:12
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Hatsume_Hate, у тебя код нехера нормально не читаем,тяжело разобрать
приведи его в порядок,такие функции как GetSpellAbilityId() что бы постоянное не вызывать заносится в перменную,аналогично и остальные часто вызываемые,типа игрока,далее Создай функцию текстага нормальную
function TextTag takes unit u, string s, integer r, integer g, integer b ,integer a,real h returns nothing
    local texttag t = CreateTextTag()
    call SetTextTagText(t,s,.0253)
    call SetTextTagPos(t,GetUnitX(u),GetUnitY(u),h)
    call SetTextTagVelocity(t,0,.032)
    call SetTextTagColor(t,r,g,b,a)    
    call SetTextTagLifespan(t,3.)
    call SetTextTagFadepoint(t,3.5)
    call SetTextTagPermanent(t,false)
endfunction
Старый 16.04.2012, 21:16
Lipen

offline
Опыт: 1,550
Активность:
Klop,
Нужно именно
local integer Id = 0
set Id = ...
Иначе компилятор ругается что используется объявляемая переменная.
И ещё:
if Critical == true and Text1 == false then
замени на
if Critical and (Text1==false) then
Изза этой строки до конца не доходило, теперь всё вроде бы нормально.
И ещё объявить Critical:
local boolean Critical = false

Отредактировано Lipen, 16.04.2012 в 21:22.
Старый 16.04.2012, 21:16
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Lipen:
if Critical == true and Text1 == false then
замени на
if Critical and (Text1==false) then
Изза этой строки до конца не доходило, теперь всё вроде бы нормально.
и не компилится карта)
вообще ты сделал таки не логично
условия предполагают что крит был но тексттага небыло
Старый 16.04.2012, 21:21
Lipen

offline
Опыт: 1,550
Активность:
if (Critical == true) and (Text1 == false) then
А так?
Вообще вот карта)
Прикрепленные файлы
Тип файла: w3x HatesQQ.w3x (1,015.6 Кбайт, 1 просмотров )
Старый 16.04.2012, 21:27
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Lipen:
if (Critical == true) and (Text1 == false) then
А так?
Вообще вот карта)
тоже самое же)
вообще, все заработало.
ид возвращается.
проблема вопроса в первом посте оказалась в
local integer Id
присвоив значение, все начало тикать
Hatsume_Hate добавил:
спасибки всем кто принял участие в решении данного вопроса) буду опытней
Старый 16.04.2012, 21:35
adic3x

offline
Опыт: 108,439
Активность:
if (Critical == true) and (Text1 == false) then
if (Critical and not Text1) then
Так правильнее. И да, код валился от неинициализированной переменной.
Старый 16.04.2012, 21:48
Закрытая тема

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

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

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

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



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