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

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

Закрытая тема
 
silumin

offline
Опыт: 11,153
Активность:
Группы, функция-фильтр
Код действия динамического триггера:

Код:
function Filter_Lezvion takes nothing returns boolean
return (IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(???)) == true)
endfunction

function Action_Lezvion takes nothing returns nothing
local timer T = GetExpiredTimer()
local location pT
local location pD
local group UnitGroup
local boolexpr BoolEx
local integer i = 0
  loop
  if (T == udg_DYN_Timers[i]) then
  exitwhen(true)
  else
  set i = i + 1
  endif
  endloop

set pD = GetUnitLoc(udg_DYN_Dummys[i])
set pT = GetUnitLoc(udg_DYN_Targets[i])
if (DistanceBetweenPoints(pD, pT) > 30) then
   call SetUnitX(udg_DYN_Dummys[i], GetLocationX(pD)+20*Cos(ungle*bj_DEGTORAD))
   call SetUnitY(udg_DYN_Dummys[i], GetLocationY(pD)+20*Sin(ungle*bj_DEGTORAD))
   call TimerStart(udg_DYN_Timers[i], 0.05, false, null)
else
   set UnitGroup = CreateGroup()
   set BoolEx = Condition(function Filter_Lezvion)
   call GroupEnumUnitsInRange(UnitGroup, GetUnitX(udg_DYN_Targets[i]), GetUnitY(udg_DYN_Targets[i]), 500, BoolEx)
// мои действия.....
// мои действия.....
endif
// обнуления.....
endfunction


Вобщем делаю спелл похожий на ульт Лича из доты. Все спеллы в моей мапе сделаны на сопряжённых массивах и на динамических триггерах при необходимости.
Работа спелла (для незнакомых с ультом Лича из доты): Герой кастует спелл на Цель, от героя к Цели летит дамми, если расстояние до цели < 30 - Цель получает урон...
Дальше хочу пикнуть группу враждебных юнитов, взять рандомного и перенаправить даммика на него... и так несколько раз.
Так вот собственно вопрос, что мне написать в функции-фильтре вместо "???".....? Как мне получить ссылку на "подлетевшего" даммика?

silumin добавил:
Как вариант рассматриваю такое решение: триггерно убивать даммика, а в фильтре обращаться к даммику через GetDyingUnit().
[+] замечание от Hellfim: 4.5 (тема не в том разделе)

Отредактировано Hellfim, 20.09.2009 в 00:51.
Старый 20.09.2009, 00:14
agentex

offline
Опыт: 34,834
Активность:
Как мне получить ссылку на "подлетевшего" даммика?
очевидно что через глобалку?
Как вариант рассматриваю такое решение: триггерно убивать даммика, а в фильтре обращаться > к даммику через GetDyingUnit().
не сработает, тригер юнит можно брать только в пределах одного потока
Старый 20.09.2009, 00:31
silumin

offline
Опыт: 11,153
Активность:
agentex, в том и дело что даммик есть в глобалке (в массиве боевых единиц), но индекс массива остаётся "за кулисами"...

silumin добавил:
От чего можно оттолкнуться в этом случае?
Старый 20.09.2009, 01:13
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
» код
library ChainFrost

globals
	private integer count=0
	private unit target=null
	private unit dummy=null
	private group unnamed=CreateGroup()
endglobals

private function getTarget takes nothing returns boolean
	if IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(dummy)) and not(IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)) then
        set target=GetFilterUnit()
	endif
	return false
endfunction

private function moveNova takes nothing returns nothing
	local real dummyX=GetUnitX(dummy)
	local real dummyY=GetUnitY(dummy)
	local real targetX=GetUnitX(dummy)
	local real targetY=GetUnitY(dummy)
	local real angle=0
	local integer radius=0
	if SquareRoot((dummyX-targetX)*(dummyX-targetX)+(dummyY-targetY)*(dummyY-targetY))>30 then
		set angle=Atan2(targetY-dummyY,targetX-dummyX)
		call SetUnitX(dummy,dummyX+10*Cos(angle))
		call SetUnitY(dummy,dummyY+10*Sin(angle))
	else
		call UnitDamageTarget(dummy,target,250,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHO​KNOWS)
        set count=count+1
		if count<=10 then
			set target=null
			loop
				exitwhen target!=null
				call GroupEnumUnitsInRange(unnamed,dummyX,dummyY,radius,Filter(function getTarget))
				set radius=radius+10
			endloop
		endif
	endif
endfunction

//Ну эта типо через TriggerAddAction вешается на триггер, что при касте срабатывает.
private function cast takes nothing returns nothing
	set target=GetSpellTargetUnit()
	set dummy=CreateUnit(GetTriggerPlayer(),<dummy rawcode>,GetUnitX(GetSpellAbilityUnit()),GetUnitY(GetSpellAbilityUnit()),0)
	call TimerStart(CreateTimer(),0.01,true,function moveNova)
endfunction

endlibrary
Думаю должно работать =)
Hellfim добавил:
О результатах работает или нет желательно сказать =)
Старый 20.09.2009, 01:21
silumin

offline
Опыт: 11,153
Активность:
О, осенило! Такой вариант: в фильтре перебрать всех даммиков по ИД через луп, и проверять расстояние от даммика до GetFilterUnit(), если меньше 500, то возвращать фильтруемого юнита.

Как бы пойти от обратного, если юнит оказался пикнутым, то расстояние от даммика до него <= 500 и наоборот, расстояние от юнита до даммика тоже буде <= 500.
Старый 20.09.2009, 01:26
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
запиши в глобалку индекс массива перед вызовом функции либо прикрепи к какому-нибудь хэндлу
Старый 20.09.2009, 03:50
silumin

offline
Опыт: 11,153
Активность:
df Hunter, а если из 10 игроков все 10 взяли одного героя? Создавать 10 переменных для индексов, а потом опять гадать где какая?

Пока остановился на таком варианте, не без утечек, но всёже:
Код:
function Filter_Lezvion takes nothing returns boolean
local unit FUnit = GetFilterUnit()
local integer i = 0
loop
  if (GetUnitTypeId(udg_DYN_Dummys[i])=='u00A') and (DistanceBetweenPoints(GetUnitLoc(FUnit),GetUnitLoc(udg_DYN_Dummys[i]))<=2000) then
  exitwhen true
  else
  set i = i + 1
  endif
  exitwhen i>29
endloop
return (IsUnitType(FUnit, UNIT_TYPE_STRUCTURE) == false and IsUnitEnemy(FUnit, GetOwningPlayer(udg_DYN_Dummys[i])) == true)
endfunction
Старый 20.09.2009, 09:51
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
silumin, а я типо в игноре? -.-
Старый 20.09.2009, 14:34
silumin

offline
Опыт: 11,153
Активность:
Hellfim, совсем нет, нисколько, я просто не люблю использовать чей-то код. А если чего-то не получается и нужна помощь, то только в рамках моего кода. Вот такой принцип чтоли... ))
Не в обиду.
Старый 20.09.2009, 16:53
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
silumin, ну его не обязательно тупо копировать =) Можно посмотреть как там все устроено и в следующий раз сделать так же.
Старый 20.09.2009, 17:08
silumin

offline
Опыт: 11,153
Активность:
Hellfim, это само собой.
Я думаю, тему можно закрыть.
Старый 20.09.2009, 19:07
Закрытая тема

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

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

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

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



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