В данной теме я прошу оставить свои коментарии о моей маленькой наработке. Сама наработка прикреплена к статье(если не прикрепилась то вот ссыль)) http://ssdepositfiles.com/files/lb79mgtmu). P.S. Просьба не флудить и не пинать мну за наличие бомжей)) я исправлю потом) P.P.S. Если отзывы будут "выше среднего" я создам пакетик таких наработок.) (Добавлено) Инфа про юзание спела лежит в коменте с названием ЧИТАТЬ Код выкладываю:
Code
function Damage takes nothing returns nothing if GetOwningPlayer(udg_back) != GetOwningPlayer(GetEnumUnit()) then call UnitDamageTargetBJ( udg_back, GetEnumUnit(), I2R(udg_damage), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) endif endfunction
function explode takes unit u, location loc, string efect, integer damage,integer r returns nothing local unit b local integer damage1 call AddSpecialEffectLocBJ( loc, efect ) set b = udg_back set damage1 = udg_damage set udg_back = u set udg_damage = damage call ForGroupBJ( GetUnitsInRangeOfLocAll(I2R(r), loc), function Damage ) set udg_back = b set udg_damage = damage1 set u = null set loc = null set efect = "" set damage = 0 set r = 0 set b = null set damage1 = 0 endfunction
Данный код позволяет создать "Взрыв" определенного радиуса и силы в определенном участке карты и с заданной графикой. Чтобы его использовать скопируйте код к себе в карту, создайте 2 глобальные переменные damage(integer) и back(unit)/ Пример вызыва функции: call explode(unit,location,effect,integer1,integer2) Где: unit - юнит наносящий урон location - точка где будет создан "Взрыв" effect - имя эффекта который будет использован (пример:"Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl" - Удар грома) integer1 - наносимый урон integer2 - радиус наносимого урона Пример: call explode(GetSpellAbilityUnit(),PolarProjectionBJ(GetUnitLoc(GetSpellAbilityUnit()), 300.00, 0.00),"Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl",50,300) т.е. GetSpellAbilityUnit() - юнит юзающий мажку PolarProjectionBJ(GetUnitLoc(GetSpellAbilityUnit()), 300.00, 0.00) - точка на расстоянии 300 от юнита по отношению к 0 градусов "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl" - спецеффект "Удар грома" 50 - наносимый урон 300 - радиус "Взрыва"
Для демонстрации включите 1 из триггеров и стартаните мапу P.S. У Горного короля отобрана способность двигаться.
function Damage takes nothing returns nothing if GetOwningPlayer(udg_back) != GetOwningPlayer(GetEnumUnit()) then call UnitDamageTargetBJ( udg_back, GetEnumUnit(), I2R(udg_damage), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) endif endfunction
function explode takes unit u, location loc, string efect, integer damage,integer r returns nothing local unit b local integer damage1 call AddSpecialEffectLocBJ( loc, efect ) set b = udg_back set damage1 = udg_damage set udg_back = u set udg_damage = damage call ForGroupBJ( GetUnitsInRangeOfLocAll(I2R®, loc), function Damage ) set udg_back = b set udg_damage = damage1 set u = null set loc = null set efect = "" set damage = 0 set r = 0 set b = null set damage1 = 0 endfunction
Аааа бж бж бж, омг
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
Просил же не пинать) почти все исправил)) дамаг исправлю потом))
Code
function Damage takes nothing returns nothing if GetOwningPlayer(udg_back) != GetOwningPlayer(GetEnumUnit()) then call UnitDamageTargetBJ( udg_back, GetEnumUnit(), I2R(udg_damage), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) endif endfunction
function explode takes unit u, location loc, string efect, integer damage,integer r returns nothing local unit b local integer damage1 call AddSpecialEffectLoc( efect,loc ) set b = udg_back set damage1 = udg_damage set udg_back = u set udg_damage = damage call ForGroup( GetUnitsInRangeOfLocAll(I2R(r), loc), function Damage ) set udg_back = b set udg_damage = damage1 set u = null set loc = null set efect = "" set damage = 0 set r = 0 set b = null set damage1 = 0 endfunction
function PoledWait takes real duration returns nothing local timer t local real timeRemaining
if (duration > 0) then set t = CreateTimer() call TimerStart(t, duration, false, null) loop set timeRemaining = TimerGetRemaining(t) exitwhen timeRemaining <= 0
// If we have a bit of time left, skip past 10% of the remaining // duration instead of checking every interval, to minimize the // polling on long waits. if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then call TriggerSleepAction(0.1 * timeRemaining) else call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL) endif endloop call DestroyTimer(t) endif set t=null set timeRemaining = 0.00 endfunction
function delef takes effect f returns nothing call PoledWait(I2R(10)) call DestroyEffect(f) endfunction
function Damage takes nothing returns nothing if GetOwningPlayer(udg_back) != GetOwningPlayer(GetEnumUnit()) then call UnitDamageTargetBJ( udg_back, GetEnumUnit(), I2R(udg_damage), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) endif endfunction
function explode takes unit u, location loc, string efect, integer damage,integer r returns nothing local unit b local integer damage1 call AddSpecialEffectLoc( efect,loc ) call delef(GetLastCreatedEffectBJ()) set b = udg_back set damage1 = udg_damage set udg_back = u set udg_damage = damage call ForGroup( GetUnitsInRangeOfLocAll(I2R(r), loc), function Damage ) set udg_back = b set udg_damage = damage1 set u = null set loc = null set efect = "" set damage = 0 set r = 0 set b = null set damage1 = 0 endfunction
эффект не ищезнит пока не проиграет анимацию. Это для того чтоб он память не грузил )
т.к. с ефом можно после создания много чиго делать(а также потому, что я не знал про эту фишку ) я использовал PoledWait , а сверху приписан измененный таймер))
Code
function PoledWait takes real duration returns nothing local timer t local real timeRemaining
if (duration > 0) then set t = CreateTimer() call TimerStart(t, duration, false, null) loop set timeRemaining = TimerGetRemaining(t) exitwhen timeRemaining <= 0
// If we have a bit of time left, skip past 10% of the remaining // duration instead of checking every interval, to minimize the // polling on long waits. if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then call TriggerSleepAction(0.1 * timeRemaining) else call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL) endif endloop call DestroyTimer(t) endif set t=null set timeRemaining = 0.00 endfunction
Добавлено (20-08-2010, 01:16) --------------------------------------------- H_A_PK, все бомжи были убиты =) Вот final edition:
Code
function Damage takes nothing returns nothing if GetOwningPlayer(udg_back) != GetOwningPlayer(GetEnumUnit()) then call UnitDamageTarget( udg_back, GetEnumUnit(), I2R(udg_damage), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS ) endif endfunction
function explode takes unit u, location loc, string efect, integer damage,integer r returns nothing local unit b local integer damage1 call DestroyEffect(AddSpecialEffectLoc( efect,loc )) set b = udg_back set damage1 = udg_damage set udg_back = u set udg_damage = damage call ForGroup( GetUnitsInRangeOfLocAll(I2R(r), loc), function Damage ) set udg_back = b set udg_damage = damage1 set u = null set loc = null set efect = "" set damage = 0 set r = 0 set b = null set damage1 = 0 endfunction
Я понимаю, ты учишся жассу. Но нароботка уж слишком проста =)
Нуу... несвсем) Просто задолбался делать громадные махины на похожие спелы... проще создать 10 спелов с помощью 1 строки, а не городить для каждого велик)) Вот пример: Спелл 1 - создается дорожка из ледяных взрывов + антибаф на скорость. Спелл 2 - 3 круга из огня каждый наносит на Н урона меньше предыдущего. Спелл 4 - Из под земли бьет зеленый луч поражая попавшихся в него врагов. Как ты видиш все спелы содержат огромный кусок кода. Я просто запихал его в свою наработку. В итоге размер трига для всех этих спелов уменьшился в 3 раза, а скорость написания увеличилась)
function explode takes unit u, location loc, string efect, integer damage,integer r returns nothing local unit b =null local integer damage1=null local group g = GetUnitsInRangeOfLocAll(I2R(r), loc) call DestroyEffect(AddSpecialEffectLoc( efect,loc )) set b = udg_back set damage1 = udg_damage set udg_back = u set udg_damage = damage call ForGroup( g, function Damage ) call GroupClear(g) call DestoyGroup(g) set udg_back = b set udg_damage = damage1 set g = null set b = null endfunction
я бы так сделал =)
Quote (Dragon93)
и где удаление точки?
зачем ?
Quote (jul9lsnik)
function explode takes unit u, location loc, string efect, integer damage,integer r returns nothing
она ведь может ещё пригодится
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
function explode takes unit u, location loc, string efect, integer damage,integer r returns nothing local unit b =null local integer damage1=0 local real x = GetLocationX(loc) local real y = GetLocationY(loc) local group g = GetUnitsInRangeOfLocAll(I2R(r), loc) call DestroyEffect(AddSpecialEffect( efect,x,y )) set b = udg_back set damage1 = udg_damage set udg_back = u set udg_damage = damage call ForGroup( g, function Damage ) call GroupClear(g) call DestoyGroup(g) set udg_back = b set udg_damage = damage1 set g = null set b = null endfunction
так ?
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
Сообщение отредактировал H_A_PK - Пятница, 20 Августа 2010, 14:26:45
call ForGroup( GetUnitsInRangeOfLocAll(I2R®, loc), function Damage )
заменяеться на:
Code
local group gr=CreateGroup() local unit c=твой юнит local unit g call GroupEnumUnitsInRange(gr,GetUnitX(c),GetUnitY(c),300.00,null) // call GroupEnumUnitsInRange(gr,GetLocationX(l),GetLocationY(l),300.00,null) loop set g=FirstOfGroup(gr) exitwhen g==null if IsUnitType(g, UNIT_TYPE_STRUCTURE) == false and GetWidgetLife(g) > 0.405 and IsUnitEnemy(g, GetOwningPlayer(c)) == true then // // endif call GroupRemoveUnit(gr,g) endloop
Quote
они тоже утечные((
Числа не утечны!!!
Добавлено (20-08-2010, 15:26) --------------------------------------------- ЗЫ: если "это" считать наработкой, то моя арена полна наработок!
бесполезное действие обьявлять и сразу обнулять локалку. При каждом вызове функции создаеться новый набор локальных переменных, так что это глупое действие
Сообщение отредактировал Banzay89 - Пятница, 20 Августа 2010, 15:27:35
сполезное действие обьявлять и сразу обнулять локалку. При каждом вызове функции создаеться новый набор локальных переменных, так что это глупое действие
не не не, это нормально. Доказываю:
Code
local unit u= null set u = LoadUnitHandle(Hash,GetHandleId(blabla),1) if u == null then \\ нифига и не произошло , тоесть либо хеш не иницилизирован , либо в ечейке пусто. endif
function explode takes unit u, real x, real y, string efect, integer damage,real r returns nothing
local unit b =null local integer damage1=0 local group gr=CreateGroup() local unit g =null
call GroupEnumUnitsInRange(gr,x,y,r,null) call DestroyEffect(AddSpecialEffect( efect,x,y )) set b = udg_back set damage1 = udg_damage set udg_back = u set udg_damage = damage
loop set g=FirstOfGroup(gr) exitwhen g==null if IsUnitType(g, UNIT_TYPE_STRUCTURE) == false and GetWidgetLife(g) > 0.405 and IsUnitEnemy(g, GetOwningPlayer(udg_back)) == true then call UnitDamageTarget( udg_back, g, I2R(udg_damage), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS ) endif call GroupRemoveUnit(gr,g) endloop
call GroupClear(gr) call DestoyGroup(gr) set udg_back = b set udg_damage = damage1 set g = null set b = null
endfunction
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
Сообщение отредактировал H_A_PK - Пятница, 20 Августа 2010, 16:21:50
local unit u= null set u = LoadUnitHandle(Hash,GetHandleId(blabla),1) if u == null then \\ нифига и не произошло , тоесть либо хеш не иницилизирован , либо в ечейке пусто. endif
а если сделать так
Code
local unit u set u = LoadUnitHandle(Hash,GetHandleId(blabla),1) if u == null then \\ нифига и не произошло , тоесть либо хеш не иницилизирован , либо в ечейке пусто. endif