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

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

Ответ
 
Пикси

offline
Опыт: 2,422
Активность:
Критический код
После 2-ого обращения к данному коду игра вылетает с критической ошибкой, что не так?
Код:
//================================================================================  ===================
//                 Í À Ñ Ò Ð À Å Â Û Å Ì Û Å    Ç Í À × Å Í È ß
//================================================================================  ===================
 
function wood_dummy takes nothing returns integer 
   return 'h000'
endfunction

function wood_ability takes nothing returns integer
   return 'Agra'
endfunction

function wood_speed takes nothing returns real
   return 500.00
endfunction

function Wood_damage takes nothing returns real
   return 500.00
endfunction

function wood_range takes nothing returns real
   return 500.00
endfunction
//================================================================================  ===================
//                 Á À Ç À    Ñ Ï Å Ë Ë À
//================================================================================  =================== 

function Trig_usesphere_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == wood_ability() ) ) then
        return false
    endif
    return true
endfunction

function a takes unit u returns boolean
    return ( IsUnitAlly(GetFilterUnit(), GetOwningPlayer(u)) == false )
endfunction

function a1 takes group g returns boolean
    if ( not ( CountUnitsInGroup(g) > 0 ) ) then
        return false
    endif
    return true
endfunction

function Trig_usesphere_Actions takes nothing returns nothing
    local unit u
    local group g
    local destructable d
    set d = GetSpellTargetDestructable()
    call CreateNUnitsAtLoc( 1, wood_dummy(), GetOwningPlayer(GetTriggerUnit()), GetUnitLoc(GetTriggerUnit()), 0.00 )
    set u = GetLastCreatedUnit()
    call IssuePointOrderLocBJ( u, "move", GetDestructableLoc(d) )
    call PolledWait( ( DistanceBetweenPoints(GetUnitLoc(u), GetDestructableLoc(GetSpellTargetDestructable())) / wood_speed() ) )
    call KillDestructable( d )
    set g = GetUnitsInRangeOfLocMatching(wood_range(), GetUnitLoc(u), Condition(function a) )
    if ( a1(g) ) then
        call IssueTargetOrderBJ( u, "attack", FirstOfGroup(g) )
        call PolledWait( ( DistanceBetweenPoints(GetUnitLoc(u), GetUnitLoc(FirstOfGroup(g))) / wood_speed() ) )
        call UnitDamageTargetBJ( u, FirstOfGroup(g), Wood_damage(), ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL )
        call RemoveUnit( u )
    else
        call RemoveUnit( u )
    endif
    set u = null
    call DestroyGroup(g)
    set d = null
endfunction

//===========================================================================
function InitTrig_usesphere takes nothing returns nothing
    set gg_trg_usesphere = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_usesphere, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_usesphere, Condition( function Trig_usesphere_Conditions ) )
    call TriggerAddAction( gg_trg_usesphere, function Trig_usesphere_Actions )
endfunction
Старый 30.10.2008, 21:13
Toadcop

offline
Опыт: 54,313
Активность:
что у тебя чистая карта и тока этот код там ? =)))) ты не подумал что это может быть тока иницыатором проблемы ? =) а вообщем юзай гримоир... =) там можно включить лог действий и тем самым можно потом юзать какое последние действие было перед тем как крашнулась игра.
Старый 31.10.2008, 00:03
Пикси

offline
Опыт: 2,422
Активность:
Вобщем-то в карте и есть один этот код.
Старый 31.10.2008, 10:00
adic3x

offline
Опыт: 108,439
Активность:
куча утечек, код ужастный
GetTrigger насколько помню после вейтов неработает
Старый 31.10.2008, 13:45
Toadcop

offline
Опыт: 54,313
Активность:
буду дома через гримоир пущю скажу в чём трабл... (наверно)
Старый 31.10.2008, 13:56
akkolt

offline
Опыт: 13,826
Активность:
Похоже на GUI2JASS, такой ретурн параметров используется только там...
[+] замечание от DFlyer: Флуд. Вопрос поставлен об ошибке или последовательности д-вий, которая приводит к вылету, а не о криворукости автора.
Старый 31.10.2008, 15:11
Пикси

offline
Опыт: 2,422
Активность:
Вопрос поставлен об ошибке или последовательности д-вий, которая приводит к вылету, а не об моём криворучестве и слабодумии, не забываем об этом.
Старый 31.10.2008, 15:36
ScorpioT1000
Работаем
offline
Опыт: отключен
Код:
globals
    integer wood_dummy = 'h000'
    integer wood_ability = 'Agra'
    real wood_speed = 500.00
    real wood_damage = 500.00
    real wood_range = 500.00
endglobals


function a takes unit u returns boolean
    local unit u = GetFilterUnit()
    if not IsUnitAlly(u, GetOwningPlayer(u)) then
        set u = null
        return true
    endif
    set u = null
    return false
endfunction

function Trig_usesphere_Actions takes nothing returns nothing
    local unit u
    local group g
    local unit c = GetSpellAbilityUnit()
    local destructable d = GetSpellTargetDestructable()
    local location dloc = GetDestructableLoc(d)
    local location uloc = GetUnitLoc(c)
    local real dist = DistanceBetweenPoints(dloc, uloc)
    set u = CreateUnitAtLoc(GetOwningPlayer(c), wood_dummy, uloc, 270.)
    call IssuePointOrderLocBJ( u, "move", dloc )
    call TriggerSleepAction(dist/wood_speed)
    call KillDestructable(d)
    set g = GetUnitsInRangeOfLocMatching(wood_range, GetUnitLoc(u), Condition(function a) )
    if CountUnitsInGroup(g) > 0 then
        call IssueTargetOrderBJ( u, "attack", FirstOfGroup(g) )
        set dist = DistanceBetweenPoints(uloc,FirstOfGroup(g))
        call TriggerSleepAction(dist/wood_speed)
        call UnitDamageTarget(c, FirstOfGroup(g), wood_damage, true, false, ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) //c if you need caster as attacker
    endif
    call RemoveUnit(u)
    call DestroyGroup(g)
    call RemoveLocation(dloc)
    call RemoveLocation(duloc)
    set u = null
    set d = null
    set c = null
endfunction

//===========================================================================
function Trig_usesphere_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == wood_ability()
endfunction

function InitTrig_usesphere takes nothing returns nothing
    set gg_trg_usesphere = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_usesphere, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_usesphere, Condition( function Trig_usesphere_Conditions ) )
    call TriggerAddAction( gg_trg_usesphere, function Trig_usesphere_Actions )
endfunction

это мб ничо не меняет, но более читабельно =)
Старый 31.10.2008, 17:01
adic3x

offline
Опыт: 108,439
Активность:
скорп отжег, одназначно) ну имхо так прикалываться нестоит, ведь человек и в код такое может засунуть))) (и брать она ничего не должна)

Код:
function a takes unit u returns boolean
    local unit u = GetFilterUnit()
    if not IsUnitAlly(u, GetOwningPlayer(u)) then
        set u = null
        return true
    endif
    set u = null
    return false
endfunction


правильно

Код:
globals
 player p_temp=null // не unit, а player. by swdn.
endglobals

// в p_temp овнера перед пиком

function a takes nothing returns boolean
 return IsUnitEnemy(GetFilterUnit(), p_temp) 
endfunction

Отредактировано ShadoW DaemoN, 31.10.2008 в 19:53.
Старый 31.10.2008, 18:45
Toadcop

offline
Опыт: 54,313
Активность:
кстати а я удивилса как он это закомпилировал... pjass ругаетьса ^_^

Пикси и чё фаталит или нет ?
Старый 02.11.2008, 14:14
ScorpioT1000
Работаем
offline
Опыт: отключен
не, просто начал делать и забил =)
т.е. сваливать надо было.
вобщем ясно тут что надо нормальные глобалки юзать вместо ф-ций, как можно до такого додуматься..

ScorpioT1000 добавил:
ADOLF, насчет Алли и Энеми мы тут с жонегом обсуждали.. кароче есть нейтралы, они и не алли и не энеми )
Старый 02.11.2008, 14:19
J
expert
offline
Опыт: 48,447
Активность:
так наверно было бы палуше...
Код:
globals 
    group GG = CreateGroup()
    player p_temp=null
    //    
    constant integer wood_dummy = 'h000'
    constant integer wood_ability = 'Agra'
    constant real wood_speed = 500.00
    constant real wood_damage = 500.00
    constant real wood_range = 500.00
    filterfunc wood_Filter = null
endglobals

constant function Trig_usesphere_Filter takes nothing returns boolean
    return not IsUnitAlly(GetFilterUnit(), p_temp)
endfunction

function DistanceBetweenCoord takes real XA, real YA, real XB, real YB returns real
    local real dx = XB - XA
    local real dy = YB - YA
    return SquareRoot(dx * dx + dy * dy)
endfunction

function Trig_usesphere_Actions takes nothing returns nothing
    local unit c = GetSpellAbilityUnit()
    local destructable d = GetSpellTargetDestructable()
    local real Dx = GetDestructableX(d)    
    local real Dy = GetDestructableY(d)
    local real Ux = GetUnitX(c)
    local real Uy = GetUnitY(c)
    local real dist = DistanceBetweenCoord(Dx, Dy, Ux, Uy) 
    local unit u = CreateUnit(GetOwningPlayer(c), wood_dummy, Ux, Uy, 270.)
    local unit t
    call IssuePointOrder(u, "move", Dx, Dy)
    call TriggerSleepAction(dist/wood_speed)
    call KillDestructable(d)
    set p_temp = GetOwningPlayer(c)
    call GroupEnumUnitsInRange(GG, Ux, Uy, wood_range, wood_Filter)
    set t = FirstOfGroup(GG)
    if t != null then
        call IssueTargetOrder(u, "attack", t)
        set dist = DistanceBetweenCoord(Ux, Uy, GetUnitX(t), GetUnitY(t))
        call TriggerSleepAction(dist/wood_speed)
        call UnitDamageTarget(c, t, wood_damage, true, false, ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        set t = null
    endif
    call RemoveUnit(u)
    set u = null
    set d = null
    set c = null
endfunction

constant function Trig_usesphere_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == wood_ability
endfunction

function InitTrig_usesphere takes nothing returns nothing
    set gg_trg_usesphere = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_usesphere, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_usesphere, Condition(function Trig_usesphere_Conditions))
    call TriggerAddAction(gg_trg_usesphere, function Trig_usesphere_Actions)
    set wood_Filter = Filter(function Trig_usesphere_Filter)
endfunction
Старый 02.11.2008, 16:40
ScorpioT1000
Работаем
offline
Опыт: отключен
Jon, вот реалки константные не советовал бы, мб пригодятся для неких "факторов"
Старый 02.11.2008, 16:43
J
expert
offline
Опыт: 48,447
Активность:
всегда можно убрать, добавил чтобы было видно что с логической точки зрения было бы правельно делать это константным...
Старый 02.11.2008, 16:50
Ответ

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

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

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

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



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