|
|
|
|
[Вопрос] PolarProjectionBJ
|
|
[SeKtOR] | Дата: Пятница, 13 Июля 2012, 12:04:19 | Сообщение # 1 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
| Почитав статьи про jass, что это такое и с чем едят я понял, что локальные переменные крутая вещь, решил попробывать написать спелл на локальных переменных(вышло ^_^). Начал убирать утечки, вот и произошол облом... Code function Trig_Goblin_Rocket_Spell_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A00N' ) ) then return false endif return true endfunction
function Trig_Goblin_Rocket_Spell_Actions takes nothing returns nothing local location p1 local location p2 local location p3 local unit caster local unit dummy set p1 = GetUnitLoc(GetSpellAbilityUnit()) set p2 = GetUnitLoc(GetSpellTargetUnit()) set caster = GetSpellAbilityUnit() call CreateNUnitsAtLoc( 1, 'e002', GetOwningPlayer(GetSpellAbilityUnit()), p1, bj_UNIT_FACING ) set dummy = GetLastCreatedUnit() call MoveDummyToTarget(caster, dummy, 40., true) call PolledWait( ( DistanceBetweenPoints(p1, p2) / 900.00 ) ) set bj_forLoopAIndex = 1 set bj_forLoopAIndexEnd = 36 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd set p3 = PolarProjectionBJ(p2, 400.00, ( 10.00 * I2R(GetForLoopIndexA())) call AddSpecialEffectLocBJ( p3 , "Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl" ) call DestroyEffectBJ( GetLastCreatedEffectBJ() ) call RemoveLocation(p3) set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop set bj_forLoopAIndex = 1 set bj_forLoopAIndexEnd = 36 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd set p3 = PolarProjectionBJ(p2, 300.00, ( 10.00 * I2R(GetForLoopIndexA())) call AddSpecialEffectLocBJ( p3 , "Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl" ) call DestroyEffectBJ( GetLastCreatedEffectBJ() ) call RemoveLocation(p3) set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop set bj_forLoopAIndex = 1 set bj_forLoopAIndexEnd = 36 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd set p3 = PolarProjectionBJ(p2, 200.00, ( 10.00 * I2R(GetForLoopIndexA())) call AddSpecialEffectLocBJ(p3, "Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl" ) call DestroyEffectBJ( GetLastCreatedEffectBJ() ) call RemoveLocation(p3) set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop set bj_forLoopAIndex = 1 set bj_forLoopAIndexEnd = 36 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd set p3 = PolarProjectionBJ(p2, 100.00, ( 10.00 * I2R(GetForLoopIndexA())) call AddSpecialEffectLocBJ( p3 , "Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl" ) call DestroyEffectBJ( GetLastCreatedEffectBJ() ) call RemoveLocation(p3) set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop call UnitDamagePointLoc( GetSpellAbilityUnit(), 0, 400.00, p2, ( ( 0.25 * I2R(GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetSpellAbilityUnit())) ) * I2R(GetHeroStatBJ(bj_HEROSTAT_INT, udg_Hero[GetConvertedPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))], false)) ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) call RemoveLocation(p1) call RemoveLocation(p2) set caster = null set dummy = null endfunction
//=========================================================================== function InitTrig_Goblin_Rocket_Spell takes nothing returns nothing set gg_trg_Goblin_Rocket_Spell = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Goblin_Rocket_Spell, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( gg_trg_Goblin_Rocket_Spell, Condition( function Trig_Goblin_Rocket_Spell_Conditions ) ) call TriggerAddAction( gg_trg_Goblin_Rocket_Spell, function Trig_Goblin_Rocket_Spell_Actions ) endfunction Ошибки в строчках: Code set p3 = PolarProjectionBJ(p2, 400.00, ( 10.00 * I2R(GetForLoopIndexA())) set p3 = PolarProjectionBJ(p2, 300.00, ( 10.00 * I2R(GetForLoopIndexA())) set p3 = PolarProjectionBJ(p2, 200.00, ( 10.00 * I2R(GetForLoopIndexA())) set p3 = PolarProjectionBJ(p2, 100.00, ( 10.00 * I2R(GetForLoopIndexA())) Добавлено (13 Июль 2012, 12:04:19) --------------------------------------------- Функция call MoveDummyToTarget(caster, dummy, 40., true) из наработки Ty3uk(хорошо помогает :trollface:)
|
|
|
|
sumert | Дата: Пятница, 13 Июля 2012, 12:22:49 | Сообщение # 2 |
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
| А что тебе надобно, старче? Кстати, ошибки, которые ты сам же нашел, это лишь малая часть из всех ошибок, допущенных в коде.
|
|
|
|
[SeKtOR] | Дата: Пятница, 13 Июля 2012, 12:30:03 | Сообщение # 3 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
| Я знаю, что его ещё надо оптмизировать. Но я прощу обьяснить мне как исправить эту ошибку...
|
|
|
|
SirNikolas | Дата: Пятница, 13 Июля 2012, 12:51:00 | Сообщение # 4 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Отсутствует закрывающаяся скобка. Между прочим, JNGP подсвечивает парные черным цветом, а непарные - красным.
|
|
|
|
[DUОS] | Дата: Пятница, 13 Июля 2012, 13:02:48 | Сообщение # 5 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| SirNikolas, Проблема кроется глубже - не надо вообще точки использовать, если ты Z не определяешь. Оптимизация выглядит так: Code function Trig_Goblin_Rocket_Spell_Conditions takes nothing returns boolean return GetSpellAbilityId() == 'A00N' endfunction
function Trig_Goblin_Rocket_Spell_Timer takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local unit u = LoadUnitHandle(udg_H,id,0) local unit st = LoadUnitHandle(udg_H,id,1) local unit dummy = LoadUnitHandle(udg_H,id,2) local real ux = LoadReal(udg_H,id,3) local real uy = LoadReal(udg_H,id,4) local real stx = LoadReal(udg_H,id,5) local real sty = LoadReal(udg_H,id,6) local real a = LoadReal(udg_H,id,7) local real dx = GetWidgetX(dummy) local real dy = GetWidgetY(dummy) local real dbp = SquareRoot((dx-stx)*(dx-stx)+(dy-sty)*(dy-sty)) local real x = dx + 40. * Cos(a) local real y = dy + 40. * Sin(a) local integer i = 1 local unit gu local real dmg = .25 * GetUnitAbilityLevel(u,'A00N') * GetHeroInt(udg_Hero[GetPlayerId(GetOwningPlayer(u))-1],false)
if dbp <= 40. then loop exitwhen i > 36 set a = 10. * i set x = stx + 400. * Cos(a*.0174532) set y = sty + 400. * Sin(a*.0174532) call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl",x,y)) set x = stx + 300. * Cos(a*.0174532) set y = sty + 300. * Sin(a*.0174532) call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl",x,y)) set x = stx + 200. * Cos(a*.0174532) set y = sty + 200. * Sin(a*.0174532) call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl",x,y)) set x = stx + 100. * Cos(a*.0174532) set y = sty + 100. * Sin(a*.0174532) call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SteamTank\\SteamTankImpact.mdl",x,y)) set i = i + 1 endloop call GroupEnumUnitsInRange(udg_TempGroup,stx,sty,400.,null) loop set gu = FirstOfGroup(udg_TempGroup) exitwhen gu == null // if (фильтр для дамага) then call UnitDamageTarget(u,gu,dmg,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS) // endif call GroupRemoveUnit(udg_TempGroup,gu) endloop call FlushChildHashtable(udg_H,id) call PauseTimer(t) call DestroyTimer(t) else call SetUnitX(dummy,x) call SetUnitY(dummy,y) endif set u = null set st = null set t = null set dummy = null endfunction
function Trig_Goblin_Rocket_Spell_Actions takes nothing returns nothing local unit u = GetTriggerUnit() local unit st = GetSpellTargetUnit() local real ux = GetWidgetX(u) local real uy = GetWidgetY(u) local real stx = GetSpellTargetX() local real sty = GetSpellTargetY() local unit dummy = CreateUnit(GetOwningPlayer(u),'e002',ux,uy,0.) local real a = Atan2(sty-uy,stx-ux) local timer t = CreateTimer() local integer id = GetHandleId(t) call SaveAgentHandle(udg_H,id,0,u) call SaveAgentHandle(udg_H,id,1,st) call SaveAgentHandle(udg_H,id,2,dummy) call SaveReal(udg_H,id,3,ux) call SaveReal(udg_H,id,4,uy) call SaveReal(udg_H,id,5,stx) call SaveReal(udg_H,id,6,sty) call SaveReal(udg_H,id,7,a) call TimerStart(t,.04,true,function Trig_Goblin_Rocket_Spell_Timer) set u = null set st = null set t = null set dummy = null endfunction
//=========================================================================== function InitTrig_Goblin_Rocket_Spell takes nothing returns nothing set gg_trg_Goblin_Rocket_Spell = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_Goblin_Rocket_Spell,EVENT_PLAYER_UNIT_SPELL_EFFECT) call TriggerAddCondition(gg_trg_Goblin_Rocket_Spell,Condition(function Trig_Goblin_Rocket_Spell_Conditions)) call TriggerAddAction(gg_trg_Goblin_Rocket_Spell,function Trig_Goblin_Rocket_Spell_Actions) endfunction
Понадобятся проинициализированная переменная H типа Хэш-таблица и переменная TempGroup типа Отряд.
Сообщение отредактировал [DUОS] - Пятница, 13 Июля 2012, 13:21:04 |
|
|
|
[SeKtOR] | Дата: Пятница, 13 Июля 2012, 13:31:28 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
| Ох ******, какой я нуб Добавлено (13 Июль 2012, 13:31:28) --------------------------------------------- Но спасибо, что разьяснил с + у меня беда
|
|
|
|
|
|
|
|
|
|
|