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 )) )) |
16.06.2013, 10:47 | #1
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Buulichkaa
Делаю спеллы за еду
offline
Опыт:
20,171Активность: |
Лучше использовать параллельные массивы© Мне интересно у тебя компиль другой или что?) каким образом ты объявил локалки в ифе? Также интересно не из опендоты ли сей код? названия переменных настораживают. |
16.06.2013, 10:59 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,117Активность: |
в сижассе можно обьявлять локалки где угодно. только при компиляции они всеравно стоят в начале |
16.06.2013, 10:59 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Buulichkaa
Делаю спеллы за еду
offline
Опыт:
20,171Активность: |
Hate, ясно, я просто не использую весь этот JNGP(он от лукавого), и не увидел ничего неродного кроме локалок, подумал что ошибся парень) |
16.06.2013, 11:03 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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),GetUnitY(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 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Buulichkaa
Делаю спеллы за еду
offline
Опыт:
20,171Активность: |
MegaBlax, да нет, нет) код нормальный, просто можно обойти использование хеш-таблицы, глобальными параллельными массивами, перезапись глобалки не использует функций, это быстрее, и не использует кучу таймеров, а всего-лишь один) |
16.06.2013, 11:11 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Sargaraser, У меня же вроде один таймер только! Или я что-то не понимаю?! |
16.06.2013, 11:12 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Buulichkaa
Делаю спеллы за еду
offline
Опыт:
20,171Активность: |
чем не угодила сама функция? можешь использовать для читабельности, но лучше писать напрямую, так как BJ функции из-за того и плохи, что 100500 раз вызывают одну и ту же
Sargaraser добавил: local timer t = CreateTimer() - один таймер говоришь? |
16.06.2013, 11:13 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Sargaraser, просто у одного человека увидел, удивился. Вот и решил спросить.
MegaBlax добавил:
И что же делать?! А-а, надо наверно его после If поставить! MegaBlax добавил: тоесть сначало local timer t а после set t = CreateTimer() |
16.06.2013, 11:15 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Buulichkaa
Делаю спеллы за еду
offline
Опыт:
20,171Активность: |
что умнее?
((кат быдлокод
))
((кат код
)) |
16.06.2013, 11:17 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Sargaraser, убедил ! |
16.06.2013, 11:19 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Buulichkaa
Делаю спеллы за еду
offline
Опыт:
20,171Активность: |
нет, ты не понял) я видел этот способ в статье уважаемого Nerevar'a про стомп спелл, но лучше использовать один глобальный таймер, и глобальные параллельные массивы, это позволяет отказаться от таблиц и действовать напрямую |
16.06.2013, 11:19 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Sargaraser, тогда придеться использовать массивы
MegaBlax добавил: А я еще толком не врубился как правильно использовать массивы |
16.06.2013, 11:21 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,117Активность: |
вообще лучше юзать структуры (хотя это те же массивы) |
16.06.2013, 11:21 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
MegaBlax, в чем суть проблемы? что дебаг сообщения твои показывают? |
16.06.2013, 11:31 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Nerevar, ты про Time Lapse ? или про то что выше? |
16.06.2013, 11:32 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Buulichkaa
Делаю спеллы за еду
offline
Опыт:
20,171Активность: |
Пример
((кат код
)) Не знал что ещё придумать, сей код будет аттачить к юниту число и в периодике выводить три раза числа с 0 по 2, хендл юнита, и приаттачиное число Отредактировано Sargaraser, 16.06.2013 в 11:49. |
16.06.2013, 11:36 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
MegaBlax, про 1 пост |
16.06.2013, 11:37 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Nerevar, там вроде все нормально, я просто хотел чтоб посмотрели и сказали что можно сделать по другому.
MegaBlax добавил: Sargaraser, можешь расставить все по местам, ато у меня сразу 100500 ошибок выдает |
16.06.2013, 11:42 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|