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

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

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

offline
Опыт: 1,076
Активность:
Помощь с заклинанием телепортации
Всем здрасте
Юнит телпортируется всё как надо но почемуто не дамажит в указаной области(от юнита) , помогите.
function Trig_shit_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction

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

function Group_Action takes nothing returns nothing
local unit p=GetEnumUnit()
local unit u=GetSpellAbilityUnit()
call UnitDamageTarget(u,p,GetUnitAbilityLevel(u,'A000')*50.,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORM​AL,null)
set p=null
set u=null
endfunction

function move takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=LoadUnitHandle(udg_H,GetHandleId(t),1)
local integer i=LoadInteger(udg_H,GetHandleId(t),2)
local real q=GetRandomReal(0.9,1.1)
local real w=GetRandomReal(0.9,1.1)
local real e=q*GetUnitX(u)
local real r=w*GetUnitY(u)
local group g
local boolexpr b
if(r<3000 and r>-3500 and e<3200 and e>-3200 )then
    set g=CreateGroup()
    set b=Condition(function Spell_A000_Filter)
    call GroupEnumUnitsInRange(g,e,r,100.,b)
    call ForGroup(g,function Group_Action)
    call AddSpecialEffect("Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl",GetUnitX(u),GetUnitY(u))​
    call SetUnitX(u,e)
    call SetUnitY(u,r)
    call AddSpecialEffect("Abilities\\Spells\\Human\\Slow\\SlowCaster.mdl",GetUnitX(u),GetUnitY(u))​
    set i=i+1
endif
if(i==10)then
    call PauseTimer(t)
    call FlushChildHashtable(udg_H,GetHandleId(t))
    call DestroyTimer(t)
    call DestroyBoolExpr(b)
    call DestroyGroup(g)
else
    call SaveInteger(udg_H,GetHandleId(t),2,i)
endif
set g=null
set b=null
set t=null
set u=null
endfunction

function Trig_shit_Actions takes nothing returns nothing
local timer t=CreateTimer()
call SaveUnitHandle(udg_H,GetHandleId(t),1,GetSpellAbilityUnit())
call SaveInteger(udg_H,GetHandleId(t),2,0)
call TimerStart(t,0.3,true,function move)
set t=null
endfunction

function InitTrig_shit takes nothing returns nothing
local trigger trg=CreateTrigger()
set udg_H=InitHashtable()
call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trg,Condition(function Trig_shit_Conditions))
call TriggerAddAction(trg,function Trig_shit_Actions)
set trg=null
endfunction
[+] замечание от Doc: Неинформативное название темы.

Отредактировано alexkill, 15.08.2011 в 09:32.
Старый 14.08.2011, 18:12
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
    • что он должен вообще делать?Объясните принцип хотя бы,т.к. лично я не телепат и из сообщения
Юнит телпортируется всё как надо но почемуто не дамажит в указаной области(от юнита)
  • не понял что должно происходить
Также,просмотрев код
if IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()),GetOwningPlayer(f)) and GetWidgetLife(f)>=0.405 and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false and IsUnitType(f,UNIT_TYPE_MAGIC_IMMUNE)==false then
Условие в фильтре никогда не будет верным,т.к. GetSpellAbilityUnit() уже не будет(функция вызвана таймером и данного юнита просто не существует),да и вообще такую конструкцию заменить на это
function Spell_A000_Filter takes nothing returns boolean
   return IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()),GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit())>=0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)
 endfunction
Переписал,чтобы группу сортировало
function Trig_shit_Conditions takes nothing returns boolean
 return GetSpellAbilityId() == 'A000'
 endfunction

 function move takes nothing returns nothing
 local timer t=GetExpiredTimer()
 local unit u=LoadUnitHandle(udg_H,GetHandleId(t),1)
 local integer i=LoadInteger(udg_H,GetHandleId(t),2)
 local real q=GetRandomReal(0.9,1.1)
 local real w=GetRandomReal(0.9,1.1)
 local real e=q*GetUnitX(u)
 local real r=w*GetUnitY(u)
 local group g
 local unit f
 if(r<3000 and r>-3500 and e<3200 and e>-3200 )then
 set g=CreateGroup()
 call GroupEnumUnitsInRange(g,e,r,100.,null)
loop
set f=FirstOfGroup(g)
exitwhen f=null
if  IsPlayerEnemy(GetOwningPlayer(u),GetOwningPlayer(f)) and GetWidgetLife(f)>=0.405 and not IsUnitType(f,UNIT_TYPE_STRUCTURE) and not IsUnitType(f,UNIT_TYPE_MAGIC_IMMUNE) then
 call UnitDamageTarget(u,f,GetUnitAbilityLevel(u,'A000')*50.,true,false,ATTACK_TYPE_CH AOS,DAMAGE_TYPE_NORMAL,null)
call GroupRemoveUnit(g,f)
else 
call GroupRemoveUnit(g,f)
endif
 call AddSpecialEffect("Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl",GetUnitX(u),GetUnitY(u))​
 call SetUnitX(u,e)
 call SetUnitY(u,r)
 call AddSpecialEffect("Abilities\\Spells\\Human\\Slow\\SlowCaster.mdl",GetUnitX(u),GetUnitY(u))​
 set i=i+1
 endif
 if(i==10)then
 call PauseTimer(t)
 call FlushChildHashtable(udg_H,GetHandleId(t))
 call DestroyTimer(t)
 call DestroyGroup(g)
 else
 call SaveInteger(udg_H,GetHandleId(t),2,i)
 endif
 call DestroyGroup(g)
 set g=null
 set t=null
 set f=null
 set u=null
 endfunction

 function Trig_shit_Actions takes nothing returns nothing
 local timer t=CreateTimer()
 call SaveUnitHandle(udg_H,GetHandleId(t),1,GetSpellAbilityUnit())
 call SaveInteger(udg_H,GetHandleId(t),2,0)
 call TimerStart(t,0.3,true,function move)
 set t=null
 endfunction

 function InitTrig_shit takes nothing returns nothing
 local trigger trg=CreateTrigger()
 set udg_H=InitHashtable()
 call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_SPELL_EFFECT)
 call TriggerAddCondition(trg,Condition(function Trig_shit_Conditions))
 call TriggerAddAction(trg,function Trig_shit_Actions)
 call Preload("Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl")
 call Preload("Abilities\\Spells\\Human\\Slow\\SlowCaster.mdl")
 set trg=null
 endfunction

Отредактировано Nerevar, 14.08.2011 в 18:59.
Старый 14.08.2011, 18:44
DqUaliTy

offline
Опыт: 1,076
Активность:
вопрос а что такое

call Preload("Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl")
call Preload("Abilities\\Spells\\Human\\Slow\\SlowCaster.mdl")

что это за Preload???
Старый 14.08.2011, 19:22
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
это подзагрузка эффектов,чтобы при первом касте не было подлагивания при их появлении
ну как работает мой код?
Старый 14.08.2011, 19:39
DqUaliTy

offline
Опыт: 1,076
Активность:
Извините что так долго отвечал , семейные обстоятельства .
Выдаёт ерор Редактор
я пересмотрел твой код , ты в функции move открываешь loop а где ты его закрываешь ?
Вкратце скилл :
По скольку я новичок делаю пока что слабые скиллы и улучшаю их!
Сначало я его зделал так , Герой просто рандомо тп по всей мапе , но не вылетая за мапу !
А теперь я зделал так чтобы если кто будет рядом с героем их ещё и дамажило .
ну вот проблемка не дамажит вот и обратился за помощью.
Старый 15.08.2011, 11:41
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
И что за заковыристый способ невылета за карту?Ведь можно проверять координаты на проходимость(для телерортации думаю проходимость на летающий тип подойдет).Конструкция будет выглядеть так -
if not IsTerrainPathable(x,y,PATHING_TYPE_FLYABILITY) then
//двигаешь и делаешь действия с группой
else
// делаешь действия для прекращения портования
endif
Да с лупом забыл закрыть=/
вот как оно должно выглядеть -
loop
set f=FirstOfGroup(g)
exitwhen f=null
if  IsPlayerEnemy(GetOwningPlayer(u),GetOwningPlayer(f)) and GetWidgetLife(f)>=0.405 and not IsUnitType(f,UNIT_TYPE_STRUCTURE) and not IsUnitType(f,UNIT_TYPE_MAGIC_IMMUNE) then
 call UnitDamageTarget(u,f,GetUnitAbilityLevel(u,'A000')*50.,true,false,ATTACK_TYPE_CH AOS,DAMAGE_TYPE_NORMAL,null)
call GroupRemoveUnit(g,f)
else 
call GroupRemoveUnit(g,f)
endif
endloop 
Старый 15.08.2011, 12:50
DqUaliTy

offline
Опыт: 1,076
Активность:
Всё хорошо , вот только одна загвоздка , это моя вина я сразу не предупредил .
он бьёт FirstOfGroup а надо чтобы те кто были в области 200.
что надо зделать??
надо создовать группу и в эту группу добавлять юнитов f ,и там их дамажить?
тогда придётся убрать
 set f=FirstOfGroup(g)
 exitwhen f=null
Старый 15.08.2011, 13:07
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Оно не дамажит первого из группы - оно выбирает первого,потом если он подходит по условиям то дамажит,удаляет из группы,если не подходит то просто удаляет,потом снова назначает первого - снова те же действия и так пока группа не очистится(эдакий перебор).
Старый 15.08.2011, 13:10
DqUaliTy

offline
Опыт: 1,076
Активность:
ты хоть сам скилл видел как он работает??? :D
За 1 телепорт он дамажит 1 каго выбирет , а нужно чтобы сразу всех в области 200, это за 1 телепорт.
для этого надо их занести в группу и там их всех дамажнуть , и только потом оффнуть всех.
потом 2-ой тп пошёл , также кто есть в области 200 , берёт в группу их и дамажит и так пока i==10
тоесть 10 раз тп должно быть.
А не так чтобы брал только одного в группу дамажил и оффал.
Старый 15.08.2011, 13:20
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Перечитай мой пост ещё раз
Старый 15.08.2011, 13:40
DqUaliTy

offline
Опыт: 1,076
Активность:
ну так ненадо чтобы он выберал одного нужно чтобы он сразу всех выбрал , пересчитал условие и всех дамажнул. Те кто неподходит под условие просто не будут выбиратся
Старый 15.08.2011, 13:49
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Объясняю на пальцах - в группу взяло 5 юнитов
По ним проходится цикл
устанавливаем переменную = первому юниту из группы
Если юнит подходит условиям то получает урон и удаляется из группы
Если не подходит - не наносим урон и удаляем из группы
затем снова устанавливаем переменную = первому юниту из группы(но удаленного юнита в ней уже нет)
Если юнит подходит условиям то получает урон и удаляется из группы
Если не подходит - не наносим урон и удаляем из группы
И так проходимся циклом пока группа не станет пустой=что есть тоже самое что и ForGroup(в плане работы с группой,если не делать в цикле вэйтов)
Ферштейн?
Старый 15.08.2011, 13:55
DqUaliTy

offline
Опыт: 1,076
Активность:
:D
сам ты Ферштейн :D
ландно так и быть , всёравно пока учусь может чего не понимаю , ладно спасибо тебе , благадрный Ферштейн :D
Благодарен тебе .
спасибо.
Старый 15.08.2011, 16:36
Закрытая тема

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

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

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

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



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