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

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

Закрытая тема
 
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
krosaf4eg:
разве бж?
native MoveLightning takes lightning whichBolt, boolean checkVisibility, real x1, real y1, real x2, real y2 returns boolean
первый раз вижу
bee добавил:
AlexKARASb, у тебя еще там не возвращяет boolean функция actions
Старый 10.06.2010, 00:10
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
присмотрись лучше пчел, еще и movelightningEx есть О.о, эт с коордой z
это одна из, завтра помудрю на свежую голову
Единственное не понятно почему все проиходит через конд, а не экшн =\
AlexKARASb добавил:
Стоун почему отлов такой странный опиши хоть
Старый 10.06.2010, 00:16
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
держи стоун
единственное я в одном месте убрал по ошибке проверку на видимость юнита, сам думаю добавишь
» изменения_твоего_кода
вместо твоего события взял изучение способности, срабатывает на любое изучение спела =\, но 1 раз для одного юнита
создается для этого юнита свой таймер, с периодом 0.1
везде где мог утечки убрал =)
и в посте #9 наврал с растоянием, я канешь математик >.< 600*600 и получил 3600 мдо, кароч нужно было 360000
» code
scope Light
globals
hashtable ht=InitHashtable()
private boolexpr b = null
endglobals

private function Conditions takes nothing returns boolean
if GetUnitAbilityLevel(GetTriggerUnit(), 'A000') == 1 then
return true
else
return false
endif
endfunction

private function EnumUnits takes nothing returns boolean
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(ht,GetHandleId(t),0)
    local group g = LoadGroupHandle(ht,GetHandleId(t),1)
    local unit f = GetFilterUnit()
    local lightning l
    if IsUnitVisible(f,GetOwningPlayer(u)) and GetUnitAbilityLevel(u,'A000')>0 and GetWidgetLife(f)>0.405 and f!=u and not IsUnitInGroup(f,g) then
        call GroupAddUnit(g,f)
        set l = AddLightning("CLPB", true, GetUnitX(u), GetUnitY(u), GetUnitX(f), GetUnitY(f))
        call SaveLightningHandle(ht,GetHandleId(f),0,l)
        call SaveReal(ht,GetHandleId(f),1,5.00)
    endif
    set u = null
    set g = null
    set t = null
    set f = null
    set l = null
    return false
endfunction

private function LightningMoving takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(ht,GetHandleId(t),0)
    local group g = LoadGroupHandle(ht,GetHandleId(t),1)
    local unit f = GetEnumUnit()
    local lightning l=LoadLightningHandle(ht,GetHandleId(f),0)
    local real time=LoadReal(ht,GetHandleId(f),1)-0.1
    local real x=GetUnitX(f)
    local real y=GetUnitY(f)
    local real xu=GetUnitX(u)
    local real yu=GetUnitY(u)
    local real d=(x-xu)*(x-xu)+(y-yu)*(y-yu)
    if time > 0.00 and d <= 360000.00 and GetWidgetLife(u)>0.405 and GetWidgetLife(f)>0.405 then
        call MoveLightning(l,true,xu,yu,x,y)
        call UnitDamageTarget(u,f,0.4*I2R(GetUnitAbilityLevel(u, 'A000')),true,false,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_NORMAL,null)
        call SaveReal(ht,GetHandleId(t),1,time)
    else
        call DestroyLightning(l)
        call FlushChildHashtable(ht,GetHandleId(f))
        call GroupRemoveUnit(g,f)
    endif
    set u=null
    set l=null
    set u=null
    set t=null
    set g=null
endfunction

private function Periodic takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(ht,GetHandleId(t),0)
    local group gtemp = CreateGroup()
    local group g = LoadGroupHandle(ht,GetHandleId(t),1)
    call GroupEnumUnitsInRange(gtemp, GetUnitX(u),GetUnitY(u),600.00,b)
    call DestroyGroup(gtemp)
    if GetWidgetLife(u)>0.405 then
        call ForGroup(g, function LightningMoving)
    else
        call PauseTimer(t)
        call DestroyGroup(g)
        call FlushChildHashtable(ht,GetHandleId(t))
        call DestroyTimer(t)
    endif
    set u = null
    set g = null
    set t = null
endfunction

private function Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local timer t = CreateTimer()
    local group g = CreateGroup()
    set b = Condition(function EnumUnits)
    call SaveUnitHandle(ht, GetHandleId(t), 0, u)
    call SaveGroupHandle(ht, GetHandleId(t), 1, g)
    call TimerStart(t, 0.1, true, function Periodic)
    set u = null
endfunction
//===========================================================================
function InitTrig_ChosingCaster takes nothing returns nothing
    set gg_trg_ChosingCaster = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ChosingCaster, EVENT_PLAYER_HERO_SKILL )    
    call TriggerAddCondition( gg_trg_ChosingCaster, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_ChosingCaster, function Actions )
endfunction
endscope
Прикрепленные файлы
Тип файла: w3x 2.w3x (19.2 Кбайт, 15 просмотров )
Старый 10.06.2010, 10:48
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
почему отлов такой странный
Эмм, не понял вопроса =/
bee, Function List ну или common.j в помощь.
Старый 10.06.2010, 12:10
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Эмм, не понял вопроса =/
в твоем старом коде, реакция была на применение любого заклинания
но принцип как у ауры, бьющей всех вокруг, или я не понял..
Старый 10.06.2010, 12:19
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
AlexKARASb, да-да. Как только кто-нибудь кастует в области героя. (да, это аура), то его поражает молнией, которая наносит столько-то дамага в секунду. Не может быть больше одной молнии на юнита.
Да, твой код безутечен, даже на малом периоде. Но у тебя он "включается только тогда, когда изучаешь абилку, а это исключает создания множества таймеров. Попробую накатать сча структуру, выложу код.
А,да, юзер дату я юзал для того, чтобы исключить попадания дважды и более молний, пока текущая молния действует.
Старый 10.06.2010, 12:28
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
тогда значит вместо групэнума надо видоизменить конструкцию -
создать триггер вместо энума, оставляя все до этого таким же
local trigger tr = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(tr, ConverPlayerUnitEvent(273) )
call TriggerAddCondition(tr, Condition(func Cond))
call TriggerAddAction(tr, func Act)
call SaveUnitHandle(ht,GetHandleId(tr),0,u)
далее контейнер фильтра меняем на это:
func Cond..
if GetSpellAbilityUnit() != LoadUnitHandle(ht,GetId(tr),0) then
return true
else
return false
endif
endf
func Act
тут делаем как в фильтре, только вместо гет фильтр юнит ставь гет триггер
Старый 10.06.2010, 12:55
ScorpioT1000
Работаем
offline
Опыт: отключен
func Cond..
if GetSpellAbilityUnit() != LoadUnitHandle(ht,GetId(tr),0) then
return true
else
return false
endif
endf
клоунада?
Старый 10.06.2010, 13:03
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
» redone
scope Light
globals
hashtable ht=InitHashtable()
endglobals

private function Conditions takes nothing returns boolean
    if GetUnitAbilityLevel(GetTriggerUnit(), 'A000') == 1 then
    return true
    else
    return false
    endif
endfunction

private function Act takes nothing returns boolean
    local trigger t = GetTriggeringTrigger()
    local unit u = LoadUnitHandle(ht,GetHandleId(t),0)
    local group g = LoadGroupHandle(ht,GetHandleId(t),1)
    local unit f = GetTriggerUnit()
    local lightning l
    if IsUnitVisible(f,GetOwningPlayer(u)) and GetUnitAbilityLevel(u,'A000')>0 and GetWidgetLife(f)>0.405 and f!=u and not IsUnitInGroup(f,g) then
        call GroupAddUnit(g,f)
        set l = AddLightning("CLPB", true, GetUnitX(u), GetUnitY(u), GetUnitX(f), GetUnitY(f))
        call SaveLightningHandle(ht,GetHandleId(f),0,l)
        call SaveReal(ht,GetHandleId(f),1,5.00)
    endif
    set u = null
    set g = null
    set t = null
    set f = null
    set l = null
    return false
endfunction

private function Cond takes nothing returns boolean
    if GetTriggerUnit() != LoadUnitHandle(ht,GetHandleId(GetTriggeringTrigger()),0) and not IsUnitInGroup(GetTriggerUnit(),LoadGroupHandle(ht,GetHandleId(GetTriggeringTrigger()),1)) then
    return true
    else
    return false
    endif
endfunction

private function LightningMoving takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(ht,GetHandleId(t),0)
    local group g = LoadGroupHandle(ht,GetHandleId(t),1)
    local unit f = GetEnumUnit()
    local lightning l=LoadLightningHandle(ht,GetHandleId(f),0)
    local real time=LoadReal(ht,GetHandleId(f),1)-0.1
    local real x=GetUnitX(f)
    local real y=GetUnitY(f)
    local real xu=GetUnitX(u)
    local real yu=GetUnitY(u)
    local real d=(x-xu)*(x-xu)+(y-yu)*(y-yu)
    if time > 0.00 and d <= 360000.00 and GetWidgetLife(u)>0.405 and GetWidgetLife(f)>0.405 then
        call MoveLightning(l,true,xu,yu,x,y)
        call UnitDamageTarget(u,f,0.4*I2R(GetUnitAbilityLevel(u, 'A000')),true,false,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_NORMAL,null)
        call SaveReal(ht,GetHandleId(t),1,time)
    else
        call DestroyLightning(l)
        call FlushChildHashtable(ht,GetHandleId(f))
        call GroupRemoveUnit(g,f)
    endif
    set u=null
    set l=null
    set u=null
    set t=null
    set g=null
endfunction

private function Periodic takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local unit u = LoadUnitHandle(ht,GetHandleId(t),0)
    local group gtemp = CreateGroup()
    local group g = LoadGroupHandle(ht,GetHandleId(t),1)
    local trigger tr = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(tr, ConvertPlayerUnitEvent(273) )
    call TriggerAddCondition(tr, Condition(function Cond))
    call TriggerAddAction(tr, function Act)
    call SaveUnitHandle(ht,GetHandleId(tr),0,u)
    call SaveGroupHandle(ht,GetHandleId(tr),1,g)
    if GetWidgetLife(u)>0.405 then
        call ForGroup(g, function LightningMoving)
    else
        call PauseTimer(t)
        call DestroyGroup(g)
        call FlushChildHashtable(ht,GetHandleId(t))
        call DestroyTimer(t)
    endif
    set tr= null
    set u = null
    set g = null
    set t = null
endfunction

private function Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local timer t = CreateTimer()
    local group g = CreateGroup()
    call SaveUnitHandle(ht, GetHandleId(t), 0, u)
    call SaveGroupHandle(ht, GetHandleId(t), 1, g)
    call TimerStart(t, 0.1, true, function Periodic)
    set u = null
endfunction
//===========================================================================
function InitTrig_ChosingCaster takes nothing returns nothing
    set gg_trg_ChosingCaster = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ChosingCaster, EVENT_PLAYER_HERO_SKILL )    
    call TriggerAddCondition( gg_trg_ChosingCaster, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_ChosingCaster, function Actions )
endfunction
endscope
клоунада?
скорее безысходность.
Если знаешь лучше, объясни хоть
Ладно Стоун я выжат как лимон, удачи в со спелом =)
AlexKARASb добавил:
ScorpioT1001, кажется понял о чем ты
private function Cond takes nothing returns boolean
    return GetTriggerUnit() != LoadUnitHandle(ht,GetHandleId(GetTriggeringTrigger()),0) and not IsUnitInGroup(GetTriggerUnit(),LoadGroupHandle(ht,GetHandleId(GetTriggeringTrigger()),1))
endfunction
так лучше? или вообще не хешем надо?
Старый 10.06.2010, 13:12
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
ScorpioT1001, вместо насмешек лучше пнул бы указал бы верное направление =/
Старый 10.06.2010, 13:14
DioD

offline
Опыт: 45,134
Активность:
OPP делается примерно вот так:
это не моя карта, но код пришлось переделать, фишка OPP в том, что магия, такой же объект как и юниты и существует она сама по себе.
ps. ненавижу встроенную систему структур, она еще хуже чем ГУИ, но выкладывать свои системы слишком тупо.
pps. обратите внимание что MUI делается совершенно без хеша-кеша-ретурн бага на ура и без ограничений.
Прикрепленные файлы
Тип файла: w3x Holy Light.w3x (49.2 Кбайт, 23 просмотров )
Старый 10.06.2010, 13:26
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
DioD, получается если я делаю к примеру перемещение дамми юнита при MUI касте
то должен создать таймер передвижения заранее на всю игру, а структуру при событии каст
и в этом таймере циклом проходить по каждой структуре и работать с ней если она не равна null?
Если да то кол-во переменных снизиться на несколько порядков О_О
Правильно понял, или что-то снова упустил\не понял?
Старый 10.06.2010, 13:43
ScorpioT1000
Работаем
offline
Опыт: отключен
кроме хеша, кеша и ретурн бага есть кастом велью, таймер эксплоит, просто хендл айди и метод перебора O_O
Старый 10.06.2010, 14:57
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
ScorpioT1001, это же очевидно! Учитывая, что юзер дату я успел заюзать.
таймер эксплойт
what is it?
Проблема найдена. А ведь могли и сказать, что BJDebug забивает стек. Тему клоуз.

Отредактировано StoneHeartis, 10.06.2010 в 17:31.
Старый 10.06.2010, 16:21
DioD

offline
Опыт: 45,134
Активность:
скорп посмотри внимательно демокарту, там сделано вообще без присоединения одних объектов к другим, это работало бы даже на рок 1.00 и без ретурн бага и вообще без всего что есть, в принципе при должном уровне извращения это можно было бы посадить вообще на гуи без кастом кода и это бы работало.
Старый 10.06.2010, 18:50
ScorpioT1000
Работаем
offline
Опыт: отключен
да мне лень открывать карту, тут аффтар не поставил вопрос что ему надо, а сунул просто код, даже не охото вникать
Старый 10.06.2010, 18:59
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
ScorpioT1001, вопрос я чОтко задавал. В сэмпле диода ничего сообенного, прикреплейтед все убраны, оставлена лишь чистая структура и перебор циклом о.о
Тему-то может закроете?)
Старый 10.06.2010, 19:03
Закрытая тема

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

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

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

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



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