Сейчас 15:27:44 Четверг, 26 декабря, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Движение дамми юнит в jass спеле
KsetradДата: Воскресенье, 20 Марта 2011, 20:24:22 | Сообщение # 1
1 уровень
Группа: Пользователи
Сообщений: 6
Награды: 0
Репутация: 0
Блокировки:
Такая проблема, пару лет не занимался редактором а щас не могу сообразить как сделать:
Первый вариант цель использует спел и от неё ко всем врагам летят даммики которые при подлетании к врагу наносят урон и исчезают (надо именно так ибо в дальнейшем дамаг наносится в зависимости от бафов наложеных на врага до этого момента)
вот собственно сам спел: даммики появляются и смотрят в нужную сторону но более ничего не происходит :

function Shout_banshee_Dmg_Conditions takes nothing returns boolean
return( GetSpellAbilityId() == 'A006' )
endfunction

function Shout_banshee_Dmg_Filter1 takes nothing returns boolean
local unit f=GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()),GetOwningPlayer(f)) and GetWidgetLife(f)>=0.405 and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false then
set f=null
return true
else
set f=null
return false
endif
endfunction

function Shout_banshee_Dmg_Main takes nothing returns nothing
local timer Timer=GetExpiredTimer()
local group Group=LoadGroupHandle(udg_h,GetHandleId(Timer),2)
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local integer Level = GetUnitAbilityLevel(Caster,'A006')
local real Angle = 0
local unit Dummy = null
local unit f = null
loop
set f = FirstOfGroup(Group)
exitwhen f == null
if GetUnitAbilityLevel(f, 'B000') == 0 and GetUnitAbilityLevel(f, 'B002') == 0 and GetUnitAbilityLevel(f, 'B003') == 0 then
set Angle = Atan2(GetUnitY(f)-GetUnitY(Dummy),GetUnitX(f)-GetUnitX(Dummy))
set Dummy = CreateUnit(GetOwningPlayer(Caster),'h000',GetUnitX(Caster),GetUnitY(Caster),AngleBetweenPoints(GetUnitLoc(Caster),GetUnitLoc(f)))
call SetUnitPosition(Dummy,GetUnitX(Dummy)+40*Cos(Angle),GetUnitY(Dummy)+40*Sin(Angle))
if DistanceBetweenPoints(GetUnitLoc(Dummy),GetUnitLoc(f)) <= 90 then
call RemoveUnit(Dummy)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdl",f,"origin"))
call UnitDamageTarget(Caster,f, 30*Level, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
if GetRandomInt(1,100) <= 15+(10*Level) and GetWidgetLife(f) > 0.405 then
set Dummy = CreateUnit(GetOwningPlayer(Caster),'h000',GetUnitX(Caster),GetUnitY(Caster),AngleBetweenPoints(GetUnitLoc(Caster),GetUnitLoc(f)))
call SaveUnitHandle(udg_h,GetHandleId(Timer),4,Dummy)
else
call DestroyTimer(Timer)
call FlushChildHashtable(udg_h,GetHandleId(Timer))
endif
endif
else
endif
call GroupRemoveUnit(Group, f)
endloop
set Timer = null
set Caster = null
set Group = null
endfunction

function Shout_banshee_Dmg_Actions takes nothing returns nothing
local unit Caster=GetSpellAbilityUnit()
local group Group=CreateGroup()
local boolexpr a=Condition(function Shout_banshee_Dmg_Filter1)
local integer Level = GetUnitAbilityLevel(Caster,'A000')
local timer Timer=CreateTimer()
call GroupEnumUnitsInRange(Group,GetUnitX(Caster),GetUnitY(Caster),700.,a)
call SaveUnitHandle(udg_h,GetHandleId(Timer),1,Caster)
call SaveGroupHandle(udg_h,GetHandleId(Timer),2,Group)
call SaveInteger(udg_h,GetHandleId(Timer),3,Level)
call AddSpecialEffectLoc("Abilities\\Spells\\Undead\\RaiseSkeletonWarrior\\RaiseSkeleton.mdl",GetUnitLoc(Caster))
call TimerStart(Timer,0.01,true,function Shout_banshee_Dmg_Main)
set Timer = null
set Caster = null
set Level = 0
set Group = null
set a = null
endfunction

//===========================================================================
function InitTrig_Shout_Banshee_Dmg takes nothing returns nothing
local trigger trg1=CreateTrigger()
set udg_h=InitHashtable()
call TriggerRegisterAnyUnitEventBJ( trg1, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( trg1, Condition( function Shout_banshee_Dmg_Conditions ) )
call TriggerAddAction( trg1, function Shout_banshee_Dmg_Actions )
set trg1=null
endfunction

и второе кастер посылает снаряд в цель снаряд должен как бы лететь и при подлете нанести урон и застанить: раньше это вроде работало а сейчас нет

function Faer_boll_Conditions takes nothing returns boolean
return( GetSpellAbilityId() == 'A007' )
endfunction

function Faer_boll_Filter takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction

function Faer_boll_Move takes nothing returns nothing
local timer Timer = GetExpiredTimer()
local integer Handle = GetHandleId(Timer)
local unit Dummy = LoadUnitHandle(udg_Hashtable,Handle,1)
local unit Target = LoadUnitHandle(udg_Hashtable,Handle,2)
local integer Level = LoadInteger(udg_Hashtable,Handle,3)
local unit Caster = LoadUnitHandle(udg_Hashtable,Handle,4)
local real Angle = Atan2(GetUnitY(Target)-GetUnitY(Dummy),GetUnitX(Target)-GetUnitX(Dummy))
call SetUnitPosition(Dummy,GetUnitX(Dummy)+30*Cos(Angle),GetUnitY(Dummy)+30*Sin(Angle))
if DistanceBetweenPoints(GetUnitLoc(Dummy),GetUnitLoc(Target)) <= 90 then
call RemoveUnit(Dummy)
// call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl",Target,"origin"))
call UnitDamageTarget(Caster,Target, 30*Level, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
endif
set Timer = null
set Handle = 0
set Dummy = null
set Target = null
set Level = 0
set Angle = 0
set Caster = null
endfunction

function Faer_boll_Actions takes nothing returns nothing
local timer Timer = CreateTimer()
local integer Handle = GetHandleId(Timer)
local unit Caster = GetTriggerUnit()
local location Target = GetSpellTargetLoc()
local group Group = CreateGroup()
local integer Level = GetUnitAbilityLevel(Caster,'A007')
local unit Dummy = CreateUnit(GetOwningPlayer(Caster),'h000',GetUnitX(Caster),GetUnitY(Caster),AngleBetweenPoints(GetUnitLoc(Caster),GetSpellTargetLoc()))
cal l SaveUnitHandle(udg_Hashtable,Handle,1,Dummy)
call SaveLocationHandle(udg_Hashtable,Handle,2,Target)
call SaveInteger(udg_Hashtable,Handle,3,Level)
call SaveUnitHandle(udg_Hashtable,Handle,4,Caster)
call GroupEnumUnitsInRangeOfLoc(Group, Target, 300,Condition(function Faer_boll_Filter))
call SaveGroupHandle(udg_Hashtable,Handle,5,Group)
call TimerStart(Timer,0.04,true,function Faer_boll_Move)
set Timer = null
set Handle = 0
set Caster = null
set Target = null
set Level = 0
set Dummy = null
endfunction

//===========================================================================
function InitTrig_Faer_boll takes nothing returns nothing
local trigger trg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( trg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( trg, Condition( function Faer_boll_Conditions ) )
call TriggerAddAction( trg, function Faer_boll_Actions )
call Preload("Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl")
set trg = null
endfunction

Добавлено (20-03-2011, 20:24)
---------------------------------------------
спелы сделаны на основе канала

 

lawsonДата: Воскресенье, 20 Марта 2011, 20:48:45 | Сообщение # 2
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Даммики летят одновременно на равные дистанции?

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

KsetradДата: Понедельник, 21 Марта 2011, 02:48:35 | Сообщение # 3
1 уровень
Группа: Пользователи
Сообщений: 6
Награды: 0
Репутация: 0
Блокировки:
нет даммики просто летят к своим целям
 

BinGOДата: Понедельник, 21 Марта 2011, 05:51:26 | Сообщение # 4
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Код не читал, ибо скучно без подсветки синтаксиса и комментов...а вобщем первый спелл делается легко.
1. Пикаешь всех юнитов-целей.
2. Создаешь по даммику на каждого юнита-цель.
3. Создаешь по таймеру на каждого даммика, который его и будет двигать + наносить урон ну или что там еще надо.
4. К таймеру в хеш-таблице прикрепляешь самого даммика, цель и все остальное, что там нужно.
5. Запускаешь все таймеры.

Офк создавать таймеры циклами.

~~~
Таки проглядел первый спелл; что-то там странное творится, уж явно не самый рациональный способ ты выбрал.

P.S. на заметку: интежеры обнулять не надо, они практически не создают утечек D:

 

lawsonДата: Понедельник, 21 Марта 2011, 08:34:11 | Сообщение # 5
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (B1nGO)
они практически не создают утечек

Они вообще не создают утечек.

Добавлено (21-03-2011, 08:34)
---------------------------------------------

Quote (Ksetrad)
call GroupEnumUnitsInRangeOfLoc(Group, Target, 300,Condition(function Faer_boll_Filter))

Зачем это вообще?


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Понедельник, 21 Марта 2011, 08:35:29
 

KsetradДата: Понедельник, 21 Марта 2011, 10:46:21 | Сообщение # 6
1 уровень
Группа: Пользователи
Сообщений: 6
Награды: 0
Репутация: 0
Блокировки:
Quote
Quote
Quote (Ksetrad)
call GroupEnumUnitsInRangeOfLoc(Group, Target, 300,Condition(function Faer_boll_Filter))

Зачем это вообще?


ну как бы мало ли какие условия я в фильтр запихаю к так что пусть будет.

Quote
2. Создаешь по даммику на каждого юнита-цель.
3. Создаешь по таймеру на каждого даммика, который его и будет двигать + наносить урон ну или что там еще надо.
4. К таймеру в хеш-таблице прикрепляешь самого даммика, цель и все остальное, что там нужно.
5. Запускаешь все таймеры.

вот про создаешь по таймеру на каждого юника-это как? ну и запуск всех таймеров одновременно??
 

SirNikolasДата: Понедельник, 21 Марта 2011, 12:12:21 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
По таймеру на каждого юнита лучше не надо, пусть будет один таймер и к нему прикреплено, сколько даммиков он двигает и вся информация о них.

 

KsetradДата: Понедельник, 21 Марта 2011, 19:55:07 | Сообщение # 8
1 уровень
Группа: Пользователи
Сообщений: 6
Награды: 0
Репутация: 0
Блокировки:
Quote
По таймеру на каждого юнита лучше не надо, пусть будет один таймер и к нему прикреплено, сколько даммиков он двигает и вся информация о них.

так ведь кол во даммиков зависит от колва врагов воруг цели, т.е. как в этом случае заносить этих даммиков в хеш и тем более потом оттуда вызвать, да и все равно к цели их запускать циклом а в цикле обычно идет только один даммик((((

Добавлено (21-03-2011, 19:55)
---------------------------------------------
занес даммиков в одну группу целей в другую даммики появляются и стоят на месте отом пропадают и наносят урон а движения как небыло так и нет((

function Shout_banshee_Dmg_Conditions takes nothing returns boolean
return( GetSpellAbilityId() == 'A006' )
endfunction

function Shout_banshee_Dmg_Filter1 takes nothing returns boolean
local unit f=GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()),GetOwningPlayer(f)) and GetWidgetLife(f)>=0.405 and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false then
set f=null
return true
else
set f=null
return false
endif
endfunction

function Shout_banshee_Dmg_Main takes nothing returns nothing
local timer Timer=GetExpiredTimer()
local group Groupu=LoadGroupHandle(udg_h,GetHandleId(Timer),2)
local group Groupd=LoadGroupHandle(udg_h,GetHandleId(Timer),4)
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local integer Level = GetUnitAbilityLevel(Caster,'A006')
local real Angle = 0
local unit Dummy = null
local unit f = null
local real dx = 0
local real dy = 0
local real distance = 0
loop
set Dummy = FirstOfGroup(Groupd)
exitwhen Dummy == null
set f = FirstOfGroup(Groupu)
set dx = GetUnitX(f)-GetUnitX(Dummy)
set dy = GetUnitY(f)-GetUnitY(Dummy)
set Angle = Atan2(dy,dx)
set distance = SquareRoot(dx*dx+dy*dy)
if ( distance < 100 ) then
call GroupRemoveUnit(Groupd, Dummy)
call RemoveUnit(Dummy)
call GroupRemoveUnit(Groupu, f)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissi?le.mdl",f,"origin"))
call UnitDamageTarget(Caster,f, 30*Level, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
else
call SetUnitX(Dummy,GetUnitX(Dummy)+50*Cos(Angle))
call SetUnitY(Dummy,GetUnitY(Dummy)+50*Sin(Angle))
endif
endloop
set Timer= null
set Groupu= null
set Groupd= null
set Caster = null
set Level = 0
set Angle = 0
set Dummy = null
set f = null
endfunction

function Shout_banshee_Dmg_Actions takes nothing returns nothing
local unit Caster=GetSpellAbilityUnit()
local group Group=CreateGroup()
local group Groupu=CreateGroup()
local group Groupd=CreateGroup()
local boolexpr a=Condition(function Shout_banshee_Dmg_Filter1)
local timer Timer=CreateTimer()
local unit f = null
local real Angle = 0
local unit Dummy = null
call GroupEnumUnitsInRange(Group,GetUnitX(Caster),GetUnitY(Caster),700.,a)
call SaveUnitHandle(udg_h,GetHandleId(Timer),1,Caster)
call AddSpecialEffectLoc("Abilities\\Spells\\Undead\\RaiseSkeletonWarrior\\RaiseSkeleton.mdl",GetUnitLoc(Caster))
loop
set f = FirstOfGroup(Group)
exitwhen f == null
call GroupAddUnit(Groupd,CreateUnit(GetOwningPlayer(Caster),'h000',GetUnitX(Caster),GetUnitY(Caster),AngleBetweenPoints(GetUnitLoc(Caster),GetUni tLoc(f))))
call GroupAddUnit(Groupu,f)
call GroupRemoveUnit(Group, f)
endloop
call SaveGroupHandle(udg_h,GetHandleId(Timer),2,Groupu)
call SaveGroupHandle(udg_h,GetHandleId(Timer),4,Groupd)
call TimerStart(Timer,1.06,true,function Shout_banshee_Dmg_Main)
set Timer = null
set Caster = null
set Group = null
set a = null
endfunction

//===========================================================================
function InitTrig_Shout_Banshee_Dmg takes nothing returns nothing
local trigger trg1=CreateTrigger()
set udg_h=InitHashtable()
call TriggerRegisterAnyUnitEventBJ( trg1, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( trg1, Condition( function Shout_banshee_Dmg_Conditions ) )
call TriggerAddAction( trg1, function Shout_banshee_Dmg_Actions )
set trg1=null
endfunction

 

lawsonДата: Понедельник, 21 Марта 2011, 20:00:50 | Сообщение # 9
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
А че ты им просто не прикажешь бежать. move

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

KsetradДата: Понедельник, 21 Марта 2011, 20:51:03 | Сообщение # 10
1 уровень
Группа: Пользователи
Сообщений: 6
Награды: 0
Репутация: 0
Блокировки:
Quote
А че ты им просто не прикажешь бежать. move

потому что так нельзя)
 

lawsonДата: Понедельник, 21 Марта 2011, 21:36:59 | Сообщение # 11
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Ладно скажи что должен делать твой спелл?

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

KsetradДата: Вторник, 22 Марта 2011, 00:35:26 | Сообщение # 12
1 уровень
Группа: Пользователи
Сообщений: 6
Награды: 0
Репутация: 0
Блокировки:
все всем спс -сделал
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz