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

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

Закрытая тема
 
The Requiem

offline
Опыт: 2,766
Активность:
Награда за убийство юнита

//TESH.scrollpos=-1
//TESH.alwaysfold=0
//==================================================================================================​===============
//
// Тест Спелл
//
//==================================================================================================​===============
function Test_Spell_Con takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction

//==================================================================================================​===============
function Test_Spell_Move takes nothing returns nothing
local timer Y = GetExpiredTimer()
local integer U = GetHandleId(Y)
local unit E = LoadUnitHandle(udg_Hash, U, 1)
local unit R = LoadUnitHandle(udg_Hash, U, 2)
local unit W = LoadUnitHandle(udg_Hash, U, 3)
local unit Q = LoadUnitHandle(udg_Hash, U, 4)
local effect array T
local unit P

call IssueTargetOrder(E, "attack", W)
call IssueTargetOrder(R, "attack", W)

if DistanceBetweenPoints(GetUnitLoc(E), GetUnitLoc(W)) <= 50.00 then

call DestroyTimer(Y)
call RemoveUnit(E)
call RemoveUnit(R)

set T[0] = AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExp​lode.mdl", W, "origin")
set T[1] = AddSpecialEffectTarget("TheHolyBomb.mdx", W, "origin")
set T[2] = AddSpecialEffectTarget("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", W, "origin")

call UnitDamageTargetBJ(Q, W, (50.00 + (I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, Q, false)) * I2R(GetUnitAbilityLevelSwapped('A000', Q)))), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL)
call UnitDamagePointLoc(Q, 0, 250.00, GetUnitLoc(W), (25.00 * I2R(GetUnitAbilityLevelSwapped('A000', Q))), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL)
set P = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), 'h004', GetUnitX(W), GetUnitY(W), 0)

call UnitApplyTimedLife(P, 'BTLF', 2.50)
call UnitAddAbility(P, 'A002')
call SetUnitAbilityLevelSwapped('A002', P, GetUnitAbilityLevelSwapped('A000', Q))
call IssueTargetOrder(P, "slow", W)
call TriggerSleepAction(1.00)
call DestroyEffectBJ(T[0])
call DestroyEffectBJ(T[1])
call DestroyEffectBJ(T[2])
call FlushChildHashtable(udg_Hash, U)

set Q = null
set W = null
set E = null
set R = null
set Y = null
set P = null
set T[0] = null
set T[1] = null
set T[2] = null

endif
endfunction

//==================================================================================================​===============
function Test_Spell_Act takes nothing returns nothing
local unit Q = GetSpellAbilityUnit()
local unit W = GetSpellTargetUnit()
local unit E = CreateUnit(GetOwningPlayer(Q), 'h000', GetUnitX(Q), GetUnitY(Q), 0.00)
local unit R = CreateUnit(GetOwningPlayer(Q), 'h001', GetUnitX(Q), GetUnitY(Q), 0.00)
local effect T
local timer Y = CreateTimer()
local integer U = GetHandleId(Y)

call SaveUnitHandle(udg_Hash, U, 1, E)
call SaveUnitHandle(udg_Hash, U, 2, R)
call SaveUnitHandle(udg_Hash, U, 3, W)
call SaveUnitHandle(udg_Hash, U, 4, Q)
call TimerStart(Y, 0.10, true, function Test_Spell_Move)
endfunction

//==================================================================================================​===============
function InitTrig_Test_Spell takes nothing returns nothing
local trigger Q = CreateTrigger()
local integer W = 0

loop
exitwhen W > 8
call TriggerRegisterPlayerUnitEvent(Q, Player(W), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
set W = W + 1
Как мне сделать, чтобы за убитых юнитов давался опыт и голд кастеру?
Пожалуйста, кому не трудно, укажите на утечки в коде и исправьте их, заранее спасибо.
[+] 1 пункт от ShadoW DaemoN: название темы не отражает суть вопроса

Отредактировано ScorpioT1000, 25.01.2012 в 18:16.
Старый 25.01.2012, 15:14
youtube
сктыщь
offline
Опыт: 8,025
Активность:
Как мне сделать, чтобы за убитых юнитов давался опыт и голд кастеру?
после нанесения урона проверяй хп, и давай опыт и голду
Старый 25.01.2012, 18:05
ScorpioT1000
Работаем
offline
Опыт: отключен
Заключаем код в двойные кавычки. Разве это так сложно?
Старый 25.01.2012, 18:17
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
The Requiem, в именах переменных используйте только маленькие буквы - правила хорошего тона. И вообще использует стандартизированные имена. В общем код нечитабельный.

Так же отмечу что у вас в коде множество утечек и ненужных БЖ функций.

Цитата:
Сообщение от The Requiem
укажите на утечки в коде и исправьте их


Честно говоря, код одна сплошная большая ошибка, почитайте обучающие статьи.
Старый 25.01.2012, 19:53
The Requiem

offline
Опыт: 2,766
Активность:
Faion, можешь написать Native- функции вместо BJ- шек, а то я не понял, какие правильно писать аргументы в common.j
Старый 25.01.2012, 23:16
Kirya92

offline
Опыт: 107
Активность:
Код:
scope spell initializer spellEvent

private boolean Conditions()
{ return GetSpellAbilityId() == 'A000' }

private nothing onTimer()
{
    timer tm = GetExpiredTimer()
    integer id = GetHandleId(tm)
    unit u = LoadUnitHandle(udg_Hash, id, 1)
    unit t = LoadUnitHandle(udg_Hash, id, 2)
    unit d1 = LoadUnitHandle(udg_Hash, id, 3)
    unit d2 = LoadUnitHandle(udg_Hash, id, 4)
    
    if( DistanceBetweenPoints(GetUnitLoc(u), GetUnitLoc(t))<=50 )
    {
        RemoveUnit(d1);
        RemoveUnit(d2);
        
        DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExp?lode.mdl  ", GetUnitX(t), GetUnitY(t)))
        DestroyEffect(AddSpecialEffect("TheHolyBomb.mdx", GetUnitX(t), GetUnitY(t)))
        DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", GetUnitX(t), GetUnitY(t)))
        
        UnitDamageTarget(u, t, 1000, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        
        PauseTimer(tm)
        DestroyTimer(tm)
        FlushChildHashtable(udg_Hash, id)
    }
    
    tm = null
    id = 0
    u = null
    t = null
    d1 = null
    d2 = null
}

private nothing Actions()
{
    unit u = GetSpellAbilityUnit()
    unit t = GetSpellTargetUnit()
    unit d1 = CreateUnit(GetOwningPlayer(u), 'h000', GetUnitX(u), GetUnitY(u), 0.00)
    unit d2 = CreateUnit(GetOwningPlayer(u), 'h001', GetUnitX(u), GetUnitY(u), 0.00)
    timer tm = CreateTimer()
    integer id = GetHandleId(tm)
    
    call IssueTargetOrder(d1, "attack", t)
    call IssueTargetOrder(d1, "attack", t)


    SaveUnitHandle(udg_Hash, id, 1, u)
    SaveUnitHandle(udg_Hash, id, 2, t)
    SaveUnitHandle(udg_Hash, id, 3, d1)
    SaveUnitHandle(udg_Hash, id, 4, d2)
    TimerStart(tm, 0.10, true, function onTimer)
    
    u = null
    t = null
    d1 = null
    d2 = null
    tm = null
    id = 0
}

//===========================================================================
private nothing spellEvent()
{
    set gg_trg_spell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_spell,   EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_spell, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_spell, function Actions )
}
endscope


Цитата:
Как мне сделать, чтобы за убитых юнитов давался опыт и голд кастеру?


Опыт и золото можно выставить в "Редакторе объектов". И вообще конкретнее за каких юнитов и кем убитых должно даваться золото?? Если ты в коде пишешь Remove, они просто удаляться из памяти.
Старый 26.01.2012, 01:55
DualShock

offline
Опыт: 5,023
Активность:
» 1.
((код jass
call UnitDamagePointLoc(Q, 0, 250.00, GetUnitLoc(W), (25.00 * I2R(GetUnitAbilityLevelSwapped('A000', Q))), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL)
))
X_X не используй это, если тебе нужно наносить урон по области делай так:
((код jass
caster
x
y
radius=250.
damage=25. * I2R(GetUnitAbilityLevelSwapped('A000', caster))
local group g=CreateGroup()
local unit f
call GroupEnumUnitsInRange(g,x,y,radius,null)
loop
set f=FirstOfGroup(g)
exitwhen f==null
if not(GetUnitState(f,UNIT_STATE_LIFE)<=.4) and not IsUnitType(f,UNIT_TYPE_MECHANICAL) then и т. д.,сдесь твой фильтр
call UnitDamageTarget(caster,f,damage,true,true,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS​)
endif
call GroupRemoveUnit(g,f)
endloop
call DestroyGroup(g)
set f=null
set g=null
))
» 2.
((код jass
...
local integer U = GetHandleId(Y)
call SaveUnitHandle(udg_Hash, U, 1, E)
call SaveUnitHandle(udg_Hash, U, 2, R)
call SaveUnitHandle(udg_Hash, U, 3, W)
call SaveUnitHandle(udg_Hash, U, 4, Q)
...
))
Установи JNGP, изучи vjass, используй структуры,глобалки и т. д. =O
Если не, то сохраняй и загружай c использованием StringHash (так хотя бы понятно что загружаешь :O)
((код jass
...
local integer h = GetHandleId(tim)
call SaveUnitHandle(udg_Hash, h, StringHash("caster"), caster)
call SaveUnitHandle(udg_Hash, h, StringHash("target"), taget)
...
local unit caster=LoadUnitHandle(udg_Hash, h, StringHash("caster"))
local unit target=LoadUnitHandle(udg_Hash, h, StringHash("target"))
...
))
Старый 26.01.2012, 02:06
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
DualShock:
сохраняй и загружай c использованием StringHash
руки бы оторвать за стрингхэш, как любил говаривать адик...
если в хеш пишется не много значений, то пусть делает как хочет, ни на что это не влияет
DualShock:
не используй это, если тебе нужно наносить урон по области делай так:
а разница? ну да, у него там точка течёт, но если её вынести, то разницы почти никакой, а преимущество в коде налицо.
Обе придирки никакие
\
Старый 26.01.2012, 06:45
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
» Код
function Test_Spell_Con takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Test_Spell_Effect takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id=GetHandleId(t)
    call DestroyEffect(LoadEffectHandle(udg_Hash,id,0))
    call DestroyEffect(LoadEffectHandle(udg_Hash,id,1))
    call DestroyEffect(LoadEffectHandle(udg_Hash,id,2))
    call DestroyTimer(t)
    call FlushChildHashtable(udg_Hash,id)
set t=null
endfunction

function Test_Spell_Move takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_Hash, id, 1)
local unit target = LoadUnitHandle(udg_Hash, id, 2)
local unit dammi1 = LoadUnitHandle(udg_Hash, id, 3)
local unit dammi2 = LoadUnitHandle(udg_Hash, id, 4)
local real x=GetUnitX(dammi1)
local real y=GetUnitY(dammi1)
local real tx=GetUnitX(target)
local real ty=GetUnitY(target)
local real distance=SquareRoot((tx - x) * (tx - x) + (ty - y) * (ty - y))
local group g
local unit f

if distance<= 50. then
    call PauseTimer(t)
    call DestroyTimer(t)
    call FlushChildHashtable(udg_Hash, id)
    call RemoveUnit(dammi1)
    call RemoveUnit(dammi2)
    call UnitDamageTarget(caster,target,50.+GetHeroAgi(caster,false)*GetUnitAbilityLevel(caster,'A000'), true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    set g=CreateGroup()
    call GroupEnumUnitsInRange(g,tx,ty,250.,null)
loop
    set f=FirstOfGroup(g)
    exitwhen f==null
    if not(GetUnitState(f,UNIT_STATE_LIFE)<=.4) and not IsUnitType(f,UNIT_TYPE_MECHANICAL) then 
    call UnitDamageTarget(caster,f,25.*GetUnitAbilityLevel(caster,'A000'),true,true,ATTACK_TYPE_CHAOS,DAMAGE_​TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
    endif
    call GroupRemoveUnit(g,f)
endloop
    call DestroyGroup(g)
    set f=CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), 'h004',tx, ty, 0.)
    call UnitApplyTimedLife(f, 'BTLF', 2.50)
    call UnitAddAbility(f, 'A002')
    call SetUnitAbilityLevel(f,'A002', GetUnitAbilityLevel(caster,'A000'))
    call IssueTargetOrder(f, "slow",target)
    set t=CreateTimer()
    set id=GetHandleId(t)
    call SaveEffectHandle(udg_Hash,id,0,AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanLargeD​eathExplode\\HumanLargeDeathExplode.mdl", target, "origin"))
    call SaveEffectHandle(udg_Hash,id,1,AddSpecialEffectTarget("TheHolyBomb.mdx", target, "origin"))
    call SaveEffectHandle(udg_Hash,id,2,AddSpecialEffectTarget("Abilities\\Spells\\Other\\Volcano\\Volca​noDeath.mdl", target, "origin"))
    call TimerStart(t,1.,false,function Test_Spell_Effect)
else
    call IssueTargetOrder(dammi1, "attack", target)
    call IssueTargetOrder(dammi2, "attack", target)
endif
set caster=null
set target=null
set dammi1=null
set dammi2=null
set t=null
set f=null
set g=null
endfunction

function Test_Spell_Act takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
local unit dammi1 = CreateUnit(GetOwningPlayer(caster), 'h000', GetUnitX(caster), GetUnitY(caster), 0.00)
local unit dammi2 = CreateUnit(GetOwningPlayer(caster), 'h001', GetUnitX(caster), GetUnitY(caster), 0.00)
local timer t = CreateTimer()
local integer id = GetHandleId(t)

    call IssueTargetOrder(dammi1, "attack", target)
    call IssueTargetOrder(dammi2, "attack", target)
    call SaveUnitHandle(udg_Hash, id, 1, caster)
    call SaveUnitHandle(udg_Hash, id, 2, target)
    call SaveUnitHandle(udg_Hash, id, 3, dammi1)
    call SaveUnitHandle(udg_Hash, id, 4, dammi2)
    call TimerStart(t, 0.10, true, function Test_Spell_Move)

set caster=null
set target=null
set dammi1=null
set dammi2=null
set t=null
endfunction

function InitTrig_Test_Spell takes nothing returns nothing
set gg_trg_Test_Spell = CreateTrigger()
local integer W = 0
loop
exitwhen W > 8
    call TriggerRegisterPlayerUnitEvent(gg_trg_Test_Spell, Player(W), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    set W = W + 1
endloop
endfunction
Должен работать
Старый 26.01.2012, 11:29
DualShock

offline
Опыт: 5,023
Активность:
Clamp, прочитай эту тему
руки бы оторвать за стрингхэш, как любил говаривать адик... если в хеш пишется не много значений, то пусть делает как хочет, ни на что это не влияет
Ну я как бэ первоначально советовал юзать структуры...
А насчёт StringHash хз, объясни или дай ссылку.

Отредактировано DualShock, 26.01.2012 в 16:20.
Старый 26.01.2012, 13:21
The Requiem

offline
Опыт: 2,766
Активность:
Спасибо за советы, с наградой я разобрался ( просто включил при инициализации карты награду за убийство этого игрока). Тему Close
Старый 26.01.2012, 18:56
Закрытая тема

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

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

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

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



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