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

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

Ответ
 
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
Воровство золота=урон юнита
Я сделал простенький триггер:
Событие - юнит атакован
Условия - уровень скилла пустышки у атакуещего юнита больше или равно 1
Владелец атакующего юнита-враг владельца атакованного юнита
Действия - Игрок добавить Целое число((полученные повреждения)) к владелец атакующий юнит золото текущее.
Итого - не пашет
Вопрос - почему???
Для тех кто не понял - при ударе герой обладающий такой способностью добавляет себе золото в размере своего урона.
Старый 09.03.2012, 22:58
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Это не будет работать, потому что во время атаки урон ещё не наносится (он наносится позже).
Т.е. "полученные повреждения" здесь всегда = 0.
Старый 09.03.2012, 23:02
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
BizzaroFukuro, А как тогда быть я перерыл все преобразования и реакции на событии - не то(в хэш и jass я 0)
Старый 09.03.2012, 23:10
BizzaroFukuro
MWS Hardcore
offline
Опыт: 2,178
Активность:
Sladkoegka,
Можешь попробовать покрутить способность "Грабёж".
Но в этом случае золото будет добавляться только если у атакуемого оно есть.
Старый 09.03.2012, 23:21
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
BizzaroFukuro, Способность грабеж добавляет атакующему юниту кол-во ресурсов(и древесины и золота)затраченное на постройку атакованного юнита(соотношение настраивается в РО) поэтому не подходит потому что надо урон=золото
Старый 09.03.2012, 23:24
Msey
????
offline
Опыт: 66,991
Активность:
Sladkoegka, когда сяду за рабочий комп, то скину тебе свою систему
Старый 09.03.2012, 23:56
prog

offline
Опыт: 32,465
Активность:
Sladkoegka, если стоимость войск и зданий можно выставить пропорционально их базовому здоровью, то грабеж вполне можно настроить так чтобы было урон=золото, но такое решение не всегда годится.
А так - система отлова урона в помощь (поищи в базе систему отображения урона в виде тексттагов, например).
Старый 10.03.2012, 06:13
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
prog, Хочешь прикол???
У меня есть такая сиситема:
там событие юнит получает урон,
далее плавающий текст преобразовать строку в вещественное(нанесеннные повреждения)-все работает
А вот с моим действием - нет
Поэтому и думаю
Старый 10.03.2012, 07:56
Klop
Папа римский
offline
Опыт: 13,006
Активность:
понадобиться JNGP
делаем связь - событий http://xgm.guru/forum/showthread.php?t=34216
в дейсвиях юнит атакован if GetUnitAbilityLeve(GetAttacker(),'SpellID') > 0
делаем событие на юнита TriggerRegisterUnitEvent(t,GetTriggerUnit(),EVENT_UNIT_DAMAGE)
real damage = GetEventDamage()
затем проверка на нанесения урона if damage > 0
unit u = GetEventDamageSourse()
player p = GetOwningPlayer(u)
SetPlayerState(p,PLAYER_STATE_RESOURSE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOUR SE_GOLD)+R2I(damage))

нужно делать так)
Старый 10.03.2012, 08:16
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
Klop, Можешь на гуи быстренко сделать??Можно с утечками,просто у меня не получилось,я вставлял между строками действия(JNGP есть)
Старый 10.03.2012, 08:24
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
Klop, можно пожалуйста наработку, это ведь Event Damage?
Старый 10.03.2012, 08:25
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Sladkoegka, гуи не получится,я гуи вообще не помню)
а джазз вот тебе пример прокачивай паладину доспех веры и бей рабочих)
для переноса на свою карту просто скопируй триггер и в коде поменяй Raw код абилки),если хочешь что то добавить то в функции AddGold меняй там всё)
((кат Jass
function AddGold takes nothing returns boolean
    local real damage = GetEventDamage()
    local unit u = GetEventDamageSource()
    local player p = GetOwningPlayer(u)
    if damage > 0 then
       call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)+R2I(damage)​)
       call BJDebugMsg("Получено " + I2S(R2I(damage)) + " ед. золото")
    endif
    call DestroyTrigger(GetTriggeringTrigger())
    set u = null
    return true
endfunction

function Conditions takes nothing returns boolean
    local trigger t = null
    if GetUnitAbilityLevel(GetAttacker(),'AHad') > 0 then
       set t = CreateTrigger()
       call TriggerRegisterUnitEvent(t, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
       call TriggerAddCondition(t,function AddGold)
    endif
    set t = null
    return true
endfunction

//===========================================================================
function InitTrig_Thief takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent( t,Player(0),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(1),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(2),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(3),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(4),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(5),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(6),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(7),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(8),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(9),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(10),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(11),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(12),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(13),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(14),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(15),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerAddCondition(t, function Conditions)
    set t = null
endfunction
))
Прикрепленные файлы
Тип файла: w3m thief.w3m (8.2 Кбайт, 7 просмотров )
Старый 10.03.2012, 08:50
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
Klop, спасибо смогу заменить на нужную абилити,но что такое R2I(damage)???
И Klop, в барахолке был заказ на такой скилл,выложи от своего имени.
Старый 10.03.2012, 09:07
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Sladkoegka:
R2I(damage)
Real To Integer переводит вещественный тип данных в целочисленый
Sladkoegka:
в барахолке был заказ на такой скилл,выложи от своего имени.
мне лень,я дарю тебе карту хочешь выкладывай))
если бы я делал такой спелл я бы наверника подогнал получение золото в процентах от хп или от урона для баланса ,а то с рабочего 250 голды получать жирно слишком)) и оформил там текстагом и прочим штуками
Старый 10.03.2012, 09:11
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
Klop, Окай,я такому спеллу рад,приятно чувствовать как развиваешься,и то что месяц назад ты делать не мог,сегодня понимаешь и можешь повторить.
По сабжу ладно выложу сам,тему клоз спасибо клопу
Старый 10.03.2012, 09:20
Klop
Папа римский
offline
Опыт: 13,006
Активность:
уже закрывать только тестить начал,утечек нету,но при первой атаке сразу регистрирует событие на каждого юнита на карте
другими словами на примере стартовых обьектов 190 при атаке становится 194 после этого хендл не увеличивается)
и там какой баг иногда если при замахе отменять атаку а потом ударить то проскакивают действия несколько раз надо это устранить)
Старый 10.03.2012, 09:43
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
Klop, Как ты наверно понимаешь спелл этот делался для того чтобы понять,впринципе конечно баги можно поустранять(я не проверял),тем более они не такие фатальные
Старый 10.03.2012, 09:47
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Sladkoegka, всё норм заменил BJDebug на текст таг и баг перестал вылазить утечек вроде нет
Klop добавил:
Пока тему не закрыли допишу исправленый код что бы не создавались утечки при замахе и отменяя атаку
» Jass
function AddGold takes nothing returns boolean
    local real damage = GetEventDamage()
    local unit u = GetEventDamageSource()
    local player p = GetOwningPlayer(u)
    if damage > 0 then
       call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)+R2I(damage)​​)
       call BJDebugMsg("Получено " + I2S(R2I(damage)) + " ед. золото")
    endif
    set u = null
    return true
endfunction

function Conditions takes nothing returns nothing
    local trigger t = null
    if GetUnitAbilityLevel(GetAttacker(),'AHad') > 0 then
       set t = CreateTrigger()
       call TriggerRegisterUnitEvent(t, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
       call TriggerAddCondition(t,function AddGold)
       call DestroyTrigger(t)
    endif
    set t = null
    return true
endfunction

//===========================================================================
function InitTrig_Thief takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent( t,Player(0),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(1),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(2),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(3),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(4),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(5),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(6),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(7),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(8),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(9),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(10),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(11),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(12),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(13),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(14),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent( t,Player(15),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerAddAction(t, function Conditions)
    set t = null
endfunction
в событии атаки лучше использовать TriggerAddAction - это приведёт к одному обьекту меньше),не знаю почему
в событии создаваемом использовать TriggerAddCondition утечки есть но дестрой триггер их устраняет),который должен находится сразу после создания дейсвий
вот так вот
Старый 10.03.2012, 10:47
Ответ

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

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

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

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



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