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

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

Ответ
 
Ежик

offline
Опыт: 2,536
Активность:
Удаление бафа после 15 атак.
Помогите доделать вот код. При приминении способности создаётся тригер trg. Он записывается в хеш.
Вобщем если срабатывает функция Add_Damage нужно кудато сохронять интергер. И так после каждого сробатывания
set i = i + 1
И если i == 15 then то удалять триггер trg и проиграть моё действие.
function Damage_Source_Conditions takes nothing returns boolean
return GetEventDamageSource()==LoadUnitHandle(udg_Hash,GetHandleId(GetTriggeringTrigger()),1) and GetEventDamage()>0.
endfunction

//===========================================================================

function Attack_Source_Conditions takes nothing returns boolean
return GetAttacker()==LoadUnitHandle(udg_Hash,GetHandleId(GetTriggeringTrigger()),1) and IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE)==false
endfunction

//===========================================================================
function fix_enable takes nothing returns nothing
local timer t=GetExpiredTimer()
local trigger trig
//
if(LoadBoolean(udg_Hash,GetHandleId(t),0)==false)then
    set trig=LoadTriggerHandle(udg_Hash,GetHandleId(t),2)
    call EnableTrigger(LoadTriggerHandle(udg_Hash,GetHandleId(t),1))
    call FlushChildHashtable(udg_Hash,GetHandleId(trig))
    call DestroyTrigger(trig)
endif
//
set t=null
endfunction

//===========================================================================
function Add_Damage takes nothing returns nothing
local trigger trig=GetTriggeringTrigger()
local trigger trg=LoadTriggerHandle(udg_Hash,GetHandleId(trig),2)
local unit u=GetEventDamageSource()
local real D=GetEventDamage()
local timer t=LoadTimerHandle(udg_Hash,GetHandleId(trig),0)
//
call DisplayTextToForce( GetPlayersAll(), R2S(GetEventDamage()) )
call DisableTrigger(trig)
call EnableTrigger(trg)
call SaveBoolean(udg_Hash,GetHandleId(t),0,true)
//
set u=null
set trg=null
call FlushChildHashtable(udg_Hash,GetHandleId(trig))
call DestroyTrigger(trig)
endfunction

//===========================================================================
function Damage_Source takes nothing returns nothing
local trigger trg=GetTriggeringTrigger()
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(trg),1)
local trigger trig=CreateTrigger()
local timer t=CreateTimer()
//
      call SaveBoolean(udg_Hash,GetHandleId(t),0,false)
      call SaveTriggerHandle(udg_Hash,GetHandleId(t),1,trg)
      call SaveTriggerHandle(udg_Hash,GetHandleId(t),2,trig)
      call SaveTimerHandle(udg_Hash,GetHandleId(trig),0,t)
      call TimerStart(t,1.,false,function fix_enable)
      call DisableTrigger(trg)
      call SaveUnitHandle(udg_Hash,GetHandleId(trig),1,u)
      call SaveTriggerHandle(udg_Hash,GetHandleId(trig),2,trg)
      call TriggerRegisterUnitEvent(trig,GetTriggerUnit(),EVENT_UNIT_DAMAGED)
      call TriggerAddCondition(trig,Condition(function Damage_Source_Conditions))
      call TriggerAddAction(trig,function Add_Damage)
//
set trg=null
set u=null
set trig=null
endfunction

//===========================================================================
function Trig_Spell_Actions takes nothing returns nothing
local trigger trg=CreateTrigger()
    call SaveUnitHandle(udg_Hash,GetHandleId(trg),1,GetSpellAbilityUnit())
    call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_ATTACKED)
    call TriggerAddCondition(trg,Condition(function Attack_Source_Conditions))
    call TriggerAddAction(trg,function Damage_Source)
    set trg=null
endfunction
потому что двойная кавычка.

Отредактировано DioD, 21.01.2011 в 13:31.
Старый 21.01.2011, 11:26
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
гляди это и делай как здесь
Ежик:
function Trig_Spell_Actions takes nothing returns nothing
local trigger trg=CreateTrigger()
call SaveUnitHandle(udg_Hash,GetHandleId(trg),1,GetSpellAbilityUnit()) ыыы так быть не может эта функция в начале игры инициализируется как бы
call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(trg,Condition(function Attack_Source_Conditions))
call TriggerAddAction(trg,function Damage_Source)
set trg=null
endfunction
Старый 21.01.2011, 11:59
Ежик

offline
Опыт: 2,536
Активность:
16GB,
Ты что? Это же обычное сохронение юнита =\ Причём тут начало игры?)
Старый 21.01.2011, 12:31
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
ты бы весь код выкладывал я не вижу функции инициализации
где функция InitTrig не видно её
как я пойму какое у тя событие в тригере основном
Старый 21.01.2011, 12:41
Ежик

offline
Опыт: 2,536
Активность:
function InitTrig_spell takes nothing returns nothing
set gg_trg_spell = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_spell, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddAction( gg_trg_spell, function Trig_spell_Actions )
endfunction
Старый 21.01.2011, 12:45
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ежик, ты сам в вопросе и описал как это сделать, собственно что тебе не понятно?
При приминении способности создаётся тригер trg. Он записывается в хеш. Вобщем если срабатывает функция Add_Damage нужно кудато сохронять интергер. И так после каждого сробатывания set i = i + 1
а что насчёт интегер твой в тот же хэш сохранять что и триггер?
Старый 21.01.2011, 12:50
Ежик

offline
Опыт: 2,536
Активность:
Hanabishi,
Да. Я не пойму как мне его сохронять интегер.Точнее куда чтоб было MUI.
Старый 21.01.2011, 13:27
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ежик, значит триггер ты в хэш сохранить можешь, а интегер нет? смешно
Hanabishi добавил:
+тут стоко кода непонятно в каком месте тебе нужно сохранять и доставать интегер твой
обозначь места как-нибудь
Старый 21.01.2011, 13:33
DioD

offline
Опыт: 45,134
Активность:
совершенно бессмысленный и беспощадный код.
комментируй сам каждую строку, с информацией ЗАЧЕМ ты это вызываешь.
""call SaveUnitHandle(udg_Hash,GetHandleId(trg),1,GetSpellAbilityUnit())
я сохраняю юнита который произнёс заклинание в хеш таблицу пишу на триггер в первый слот""
после того как распишешь каждую строку, если вдруг внезапно всё же останутся вопросы, я их обязательно помогу решить.
Старый 21.01.2011, 13:34
Ежик

offline
Опыт: 2,536
Активность:
Hanabishi,
Ну помоги. Я запутался. И не пойму...
Старый 21.01.2011, 13:34
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ежик, в какой функции интегер сохранять и в какой доставать?
Старый 21.01.2011, 13:43
Ежик

offline
Опыт: 2,536
Активность:
Hanabishi,
add damage при получении урона. Загружать интегер i и плюсовать.
А потом сравнивать i. Если i == х то удалить триггер trg и проиграть мои действия.
А создовать где угодно.
Старый 21.01.2011, 13:45
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ежик, вот:
function Add_Damage takes nothing returns nothing
local trigger trig=GetTriggeringTrigger()
local trigger trg=LoadTriggerHandle(udg_Hash,GetHandleId(trig),2)
local unit u=GetEventDamageSource()
local real D=GetEventDamage()
local timer t=LoadTimerHandle(udg_Hash,GetHandleId(trig),0)

local integer i = LoadInteger(udg_Hash,GetHandleId(trig),3)

//
call DisplayTextToForce( GetPlayersAll(), R2S(GetEventDamage()) )
call DisableTrigger(trig)
call EnableTrigger(trg)
call SaveBoolean(udg_Hash,GetHandleId(t),0,true)
//

if i>0 then
    call SaveInteger(udg_Hash,GetHandleId(trig),3,i-1)
else
    call FlushChildHashtable(udg_Hash,GetHandleId(trig))
    call DestroyTrigger(trig)
endif

set u=null
set trg=null
set trig = null
endfunction

//===========================================================================
function Damage_Source takes nothing returns nothing
local trigger trg=GetTriggeringTrigger()
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(trg),1)
local trigger trig=CreateTrigger()
local timer t=CreateTimer()

local integer i = 15

//
      call SaveBoolean(udg_Hash,GetHandleId(t),0,false)
      call SaveTriggerHandle(udg_Hash,GetHandleId(t),1,trg)
      call SaveTriggerHandle(udg_Hash,GetHandleId(t),2,trig)
      call SaveTimerHandle(udg_Hash,GetHandleId(trig),0,t)
      call TimerStart(t,1.,false,function fix_enable)
      call DisableTrigger(trg)
      call SaveUnitHandle(udg_Hash,GetHandleId(trig),1,u)
      call SaveTriggerHandle(udg_Hash,GetHandleId(trig),2,trg)
      
      call SaveInteger(udg_Hash,GetHandleId(trig),3,i)
      
      call TriggerRegisterUnitEvent(trig,GetTriggerUnit(),EVENT_UNIT_DAMAGED)
      call TriggerAddCondition(trig,Condition(function Damage_Source_Conditions))
      call TriggerAddAction(trig,function Add_Damage)
//
set trg=null
set u=null
set trig=null
endfunction
и вообще это очень сомнительная и утечная система отлова урона
юзай лучше это xgm.ru/forum/showthread.php?t=25639
Старый 21.01.2011, 14:07
Ежик

offline
Опыт: 2,536
Активность:
Hanabishi,
Ну не как не получается :( Можеш пожалуйста наработку сделать?
Старый 21.01.2011, 19:04
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ежик:
юзай лучше это xgm.ru/forum/showthread.php?t=25639
Старый 21.01.2011, 19:29
Ежик

offline
Опыт: 2,536
Активность:
Hanabishi,
Да могу я урон отлавить! Мне я не могу загружать\сохронять интегер! То что ты дал не помогло...
Старый 21.01.2011, 19:35
Hanabishi
COOL STATUS
offline
Опыт: отключен
call SaveInteger(udg_Hash,GetHandleId(trig),3,i)
//сохранение integer

call LoadInteger(udg_Hash,GetHandleId(trig),3)
//загрузка integer
Старый 21.01.2011, 19:47
Ежик

offline
Опыт: 2,536
Активность:
Hanabishi,
Ммм... С тобой всё ястно... Я по твоиму не умею сохронять\загружать?
Я говорю прото что я не знаю куда сохронить и где прибовлять чтоб это всё сохранилось! Ты мне дал код он не работает.
Старый 21.01.2011, 19:51
Icy
Это Я!
offline
Опыт: 1,785
Активность:
В "идеале" лучше юзать такой метод:
Понадобится:
  • счётчик атак(целое)
  • триггер отвечающий за каст
  • триггер отлавливающий атаки кастера
  • и триггер для отлавливания урона кастера
при касте споски:
  • обнуляем счётчик
  • даём кастеру невидимую пассивку-пустышку с новым бафом и длительностью в 0(хотя, можешь хоть пять тыщь поставить, нам всеравно!, нужно это для железного определения полной атаки) на основе какого нибудь яда
  • а при срабатывании трига, событие которого, есть атака кастера, берём и добавляем триггеру отвечающему за урон, событие получения урона атакованным
(думаю тебе не нужно объяснять, как сделать невидимой пассивку для юнита)
в триге дамага:
  • проверяем поклацанного юнита на наличие на нём нашего бафа
  • если баф есть, удаляем этот баф с него, и повышаем наш счётчик атак
  • теперь сравниваем счётчик атак, если он равен нужному количеству(в твоём случае 15), то удаляем у кастера спеллбук с нашим ядом и шаманим над действиями завершения способности
Рабочий код у меня есть, но я нидам тебе его, думаю догадываешься почему
Старый 21.01.2011, 20:17
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ежик, мне кажется что он не робит из-за кривого отлова
Старый 21.01.2011, 21:00
Ответ

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

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

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

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



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