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

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

Ответ
 
MegaBlax

offline
Опыт: 2,352
Активность:
Способность таракана из доты (Time Lapse)
Попробовал сделать способность таракана из доты (Time Lapse). Мог бы кто-то посмотреть и сказать где я сделал не правильно или где слишком перемудрил. Код + карта.
((кат Код
((код Jass
function Trig_TL_Conditions takes nothing returns boolean
return GetLearnedSkill()=='A000'
endfunction
function USE takes nothing returns nothing
if(GetSpellAbilityId()=='A000')then
local unit m = GetTriggerUnit()
local integer z = GetHandleId(m)
local real hp = LoadReal(h,z,1)
local real mp = LoadReal(h,z,2)
local real x = LoadReal(h,z,3)
local real y = LoadReal(h,z,4)
local real xx = GetUnitX(m)
local real yy = GetUnitY(m)
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl",xx,yy​))
call TriggerSleepAction(.1)
call SetUnitState(m,UNIT_STATE_LIFE,hp)
call SetUnitState(m,UNIT_STATE_MANA,mp)
call SetUnitX(m,x)
call SetUnitY(m,y)
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl",x,y))​
endif
set m = null
endfunction
function TL_T takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local unit m = LoadUnitHandle(h,i,1)
local real hp = 0.
local real mp = 0.
local real x = 0.
local real y = 0.
local integer z = GetHandleId(m)
if(GetUnitState(m,UNIT_STATE_LIFE)>0)then
set hp = GetUnitState(m,UNIT_STATE_LIFE)
set mp = GetUnitState(m,UNIT_STATE_MANA)
set x = GetUnitX(m)
set y = GetUnitY(m)
call SaveReal(h,z,1,hp)
call SaveReal(h,z,2,mp)
call SaveReal(h,z,3,x)
call SaveReal(h,z,4,y)
call BJDebugMsg("Save")
endif
set m = null
set t = null
endfunction
function Trig_TL_Actions takes nothing returns nothing
local unit m = GetLearningUnit()
if(GetUnitAbilityLevel(m,'A000')==1)then
local timer t = CreateTimer()
local trigger ltt = CreateTrigger()
local integer i = GetHandleId(t)
local real hp = GetUnitState(m,UNIT_STATE_LIFE)
local real mp = GetUnitState(m,UNIT_STATE_MANA)
local real x = GetUnitX(m)
local real y = GetUnitY(m)
local integer z = GetHandleId(m)
call SaveUnitHandle(h,i,1,m)
call SaveReal(h,z,1,hp)
call SaveReal(h,z,2,mp)
call SaveReal(h,z,3,x)
call SaveReal(h,z,4,y)
call TimerStart(t,5.,true,function TL_T)
call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddAction(ltt,function USE)
endif
set m = null
set t = null
set ltt = null
endfunction
function InitTrig_TL takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(t,Condition(function Trig_TL_Conditions))
call TriggerAddAction(t,function Trig_TL_Actions)
set t = null
endfunction
))
))
Прикрепленные файлы
Тип файла: w3x Time Lapse.w3x (18.0 Кбайт, 19 просмотров )
Старый 16.06.2013, 10:47
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
Лучше использовать параллельные массивы©
Мне интересно у тебя компиль другой или что?) каким образом ты объявил локалки в ифе?
Также интересно не из опендоты ли сей код? названия переменных настораживают.
Старый 16.06.2013, 10:59
Hate
конь вакуумный
online
Опыт: 43,033
Активность:
в сижассе можно обьявлять локалки где угодно. только при компиляции они всеравно стоят в начале
Старый 16.06.2013, 10:59
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
Hate, ясно, я просто не использую весь этот JNGP(он от лукавого), и не увидел ничего неродного кроме локалок, подумал что ошибся парень)
Старый 16.06.2013, 11:03
MegaBlax

offline
Опыт: 2,352
Активность:
Sargaraser, я на столько суров, что могу объявлять переменые даже после их обнуления :) (шутка)
((кат Код из опен доты
((код Jass
function TimeLapseCastCheck takes nothing returns boolean
return GetSpellAbilityId()=='A0CT'
endfunction
function TimeLapseCast takes nothing returns nothing
local string lf5=H2Tx(GetTriggerUnit())
local real lvt=ReturnMaxReal(GetReal(lf5,"TLLife1"),1)
local real lvT=ReturnMaxReal(GetReal(lf5,"TLMana1"),1)
local location lp5=GetLocation(lf5,"TLPoint1")
local unit lfo=GetTriggerUnit()
if GetReal(lf5,"TLLife1")>1 then
call AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl",GetUnitX(lfo),GetUn​itY(lfo))
call SetUnitX(lfo,GetLocationX(lp5))
call SetUnitY(lfo,GetLocationY(lp5))
call SetUnitState(lfo,UNIT_STATE_LIFE,lvt)
call SetUnitState(lfo,UNIT_STATE_MANA,lvT)
call UnitRemoveBuffs(lfo,false,true)
call RemoveLocation(lp5)
call TriggerSleepAction(0)
call SetUnitState(lfo,UNIT_STATE_MANA,lvT)
endif
endfunction
function h2 takes nothing returns nothing
local trigger ltt=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ltt,Condition(function TimeLapseCastCheck))
call TriggerAddAction(ltt,function TimeLapseCast)
endfunction
function InitTrig_Time_Lapse_Cast takes nothing returns nothing
endfunction
))
))
((кат Код из опен доты
((код Jass
function TimeLapsSaving takes nothing returns nothing
local trigger ltt=GetTriggeringTrigger()
local unit lfo=GetUnit(H2Tx(ltt),"UnitVar")
local string lf5=H2Tx(lfo)
local integer lEq=1
local integer lEQ=10
call RemoveLocation(GetLocation(lf5,"TLPoint0"))
loop
exitwhen lEq>lEQ
call SetHandle(lf5,"TLPoint"+I2S(lEq-1),GetLocation(lf5,"TLPoint"+I2S(lEq)))
call SetReal(lf5,"TLLife"+I2S(lEq-1),GetReal(lf5,"TLLife"+I2S(lEq)))
call SetReal(lf5,"TLMana"+I2S(lEq-1),GetReal(lf5,"TLMana"+I2S(lEq)))
set lEq=lEq+1
endloop
call SetHandle(lf5,"TLPoint10",GetUnitLoc(lfo))
call SetReal(lf5,"TLLife10",GetUnitState(lfo,UNIT_STATE_LIFE))
call SetReal(lf5,"TLMana10",GetUnitState(lfo,UNIT_STATE_MANA))
endfunction
function TimeLapsInitSave takes nothing returns nothing
local unit lfo=GetTriggerUnit()
local integer lmZ=GetUnitAbilityLevel(lfo,'A0CT')
local trigger ltt
if lmZ==1 then
set ltt=CreateTrigger()
call TriggerRegisterTimerEventPeriodic(ltt,.5)
call TriggerAddAction(ltt,function TimeLapsSaving)
call SetHandle(H2Tx(ltt),"UnitVar",lfo)
endif
endfunction
function TimeLapsLearnCheck takes nothing returns boolean
return GetLearnedSkill()=='A0CT'and IsUnitIllusion(GetTriggerUnit())==false
endfunction
function h3 takes nothing returns nothing
local trigger ltt=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(ltt,Condition(function TimeLapsLearnCheck))
call TriggerAddAction(ltt,function TimeLapsInitSave)
endfunction
function InitTrig_Time_Lapse_Learn takes nothing returns nothing
endfunction
))
))
Сомнения что код не я писал еще остались?
MegaBlax добавил:
А, вот еще хотел спросить как думаете удобно ли пользоваться такими функциями.
((кат SaveUnit
((код Jass
function SaveUnit takes integer i, string s, unit u returns nothing
call SaveUnitHandle(h,i,StringHash(s),u)
endfunction
))
))
((кат LoadUnit
((код Jass
function LoadUnit takes integer i, string s returns unit
return LoadUnitHandle(h,i,StringHash(s))
endfunction
))
))
((кат Пример использования сохранение
((код jass
local unit u = GetTriggerUnit()
call SaveUnit(100,"u",u)
))
))
((кат Пример использования загрузка
((код jass
local unit z = LoadUnit(100,"u")
))
))
Старый 16.06.2013, 11:09
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
MegaBlax, да нет, нет) код нормальный, просто можно обойти использование хеш-таблицы, глобальными параллельными массивами, перезапись глобалки не использует функций, это быстрее, и не использует кучу таймеров, а всего-лишь один)
Старый 16.06.2013, 11:11
MegaBlax

offline
Опыт: 2,352
Активность:
Sargaraser, У меня же вроде один таймер только! Или я что-то не понимаю?!
Старый 16.06.2013, 11:12
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
чем не угодила сама функция? можешь использовать для читабельности, но лучше писать напрямую, так как BJ функции из-за того и плохи, что 100500 раз вызывают одну и ту же
Sargaraser добавил:
local timer t = CreateTimer() - один таймер говоришь?
Старый 16.06.2013, 11:13
MegaBlax

offline
Опыт: 2,352
Активность:
Sargaraser, просто у одного человека увидел, удивился. Вот и решил спросить.
MegaBlax добавил:
И что же делать?! А-а, надо наверно его после If поставить!
MegaBlax добавил:
тоесть сначало local timer t
а после set t = CreateTimer()
Старый 16.06.2013, 11:15
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
что умнее?
((кат быдлокод
function a takes nothing retunrs nothing
call b()
endfunction

function b takes nothing retunrs nothing
call c()
endfunction

function c takes nothing retunrs nothing
call d()
endfunction

function d takes nothing retunrs nothing
call BjDebugMsg("LAL")
endfunction

function call takes nothing retunrs nothing
call a()
endfunction
))
((кат код
function call takes nothing retunrs nothing
call BjDebugMsg("LAL")
endfunction
))
Старый 16.06.2013, 11:17
MegaBlax

offline
Опыт: 2,352
Активность:
Sargaraser, убедил !
Старый 16.06.2013, 11:19
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
нет, ты не понял) я видел этот способ в статье уважаемого Nerevar'a про стомп спелл, но лучше использовать один глобальный таймер, и глобальные параллельные массивы, это позволяет отказаться от таблиц и действовать напрямую
Старый 16.06.2013, 11:19
MegaBlax

offline
Опыт: 2,352
Активность:
Sargaraser, тогда придеться использовать массивы
MegaBlax добавил:
А я еще толком не врубился как правильно использовать массивы
Старый 16.06.2013, 11:21
Hate
конь вакуумный
online
Опыт: 43,033
Активность:
вообще лучше юзать структуры (хотя это те же массивы)
Старый 16.06.2013, 11:21
MegaBlax

offline
Опыт: 2,352
Активность:
Hate, я пробовал, только у меня что-то не очень получалось
MegaBlax добавил:
А вот еще хотел спросить,
((код jass
function thd takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = GetHandleId(t)
local unit u = GetTriggerUnit()
call SaveUnitHandle(gc,i,1,u)
endfunction
function thx takes nothing returns nothing
local trigger t = GetTriggeringTrigger()
local integer i = GetHandleId(t)
local unit u = LoadUnitHandle(gc,i,1)
endfunction
))
Почему у меня i принимает разные значения?
Старый 16.06.2013, 11:25
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
MegaBlax, в чем суть проблемы? что дебаг сообщения твои показывают?
Старый 16.06.2013, 11:31
MegaBlax

offline
Опыт: 2,352
Активность:
Nerevar, ты про Time Lapse ? или про то что выше?
Старый 16.06.2013, 11:32
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
Пример
((кат код
globals
timer t = CreateTimer()
integer max = -1
unit array u
integer array int
integer array c
endglobals

function proc takes nothing returns nothing
local integer i = 0
loop
  exitwhen i > max
  call BjDebugMsg(I2S(GetHangleId(u[i]) +  I2S(int[i]) + I2S(c[i])))
  set c[i]=c[i]+1
  if c[i]==3
    set u[i]=u[max]
    set u[max]=null
    set int[i]=int[max]
    set int[max]=0
    set c[i]=c[max]
    set c[max]=0
    set max = max - 1
    set i = i - 1
  then
 set i = i + 1
endloop
if max == -1 then
  call PauseTimer(t)
endif
endfunction

function act takes nothing returns nothing
set max = max + 1
set u[max]=какой-то юнит
set int[max]=какое-то число
set c[max]=0
if max == 0 then
  call TimerStart(t, 1, true, function proc)
endif
endfunction
))
Не знал что ещё придумать, сей код будет аттачить к юниту число и в периодике выводить три раза числа с 0 по 2, хендл юнита, и приаттачиное число

Отредактировано Sargaraser, 16.06.2013 в 11:49.
Старый 16.06.2013, 11:36
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
MegaBlax, про 1 пост
Старый 16.06.2013, 11:37
MegaBlax

offline
Опыт: 2,352
Активность:
Nerevar, там вроде все нормально, я просто хотел чтоб посмотрели и сказали что можно сделать по другому.
MegaBlax добавил:
Sargaraser, можешь расставить все по местам, ато у меня сразу 100500 ошибок выдает
Старый 16.06.2013, 11:42
Ответ

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

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

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

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



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