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

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

Ответ
 
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Generic Unit Event совместим с EVENT_UNIT_DAMAGED?
Есть два события с юнитом:

1. Specific unit Event

2. Generic Unit Event

в первом есть такое событие как EVENT_UNIT_DAMAGED а во втором нет, возможно ли совместить эти 2 события "юнит получает урон" для любого юнита ?

Вот например триггер:

Код:
function Trig_S_Actions takes nothing returns nothing
    call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_008" )
endfunction

//===========================================================================
function InitTrig_S takes nothing returns nothing
    set gg_trg_S = CreateTrigger(  )
    call TriggerRegisterUnitEvent( gg_trg_S, GetAttackedUnitBJ(), EVENT_UNIT_DAMAGED )
    call TriggerAddAction( gg_trg_S, function Trig_S_Actions )
endfunction


вроде ошибок не выдаётся, но тем не менее триггер не работает из-за GetAttackedUnitBJ() - это я сам вставил...

Отредактировано happy_horror, 22.03.2008 в 20:06.
Старый 22.03.2008, 19:57
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Код:
function GetAttackedUnitBJ takes nothing returns unit
    return GetTriggerUnit()
endfunction
Регистрация идет на конкретного юнита,а не на триггер юнит. Это ты в действиях тригера можешь зарегистрировать кому то такое событие, при условии что значение GetTriggerUnit() в триггере определено
Старый 22.03.2008, 21:00
J
expert
offline
Опыт: 48,447
Активность:
По Сабжу: Ответ - "Нет"
Старый 22.03.2008, 21:03
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Порой, при всех возможностях WE и Jass нельзя сделать элементарных вещей...как жаль
Кстати можно ли сделать такой триггер:
Событие - юнит атакован
Условие - здоровье атакованного юнита изменилось
Если можно, то желательно названия функций и условий...сам я такого что-то не нашёл
Старый 22.03.2008, 21:12
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
только значение конкретной пременной. Т.е. можешь всех пикать и запихивать в массив значение здоровья)

FellGuard добавил:
причем пикать постоянно... Это действительно ресурсоёмкое событие, вот почему и пишутся всякие системы по отлову демеджа. Обычно это реакция на "юнит атакован" - создается динамический тригер с отловом урона на атакованного, по истечении таймаута он удаляется.
Старый 22.03.2008, 21:16
J
expert
offline
Опыт: 48,447
Активность:
Старый 22.03.2008, 21:17
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Хехе, прими мою благодарность Jon - твой триггер работает на ура :D
Я от радости ( что у меня вообще что-то вышло) готов даже кричать, но не стану...всё вышло как я и хотел, системы аботает так:
Изначально в игровых константах я поставил так, что любой тип атаки наносит любому типу брони 100% урона и начисление % сдерживания урона за единицу брони 0.00
При старте карты в кэш в ячейки string mission key "DB Armor" key "уникальный идентификатор-тип юнита" заносится значение базовой брони всех юнитов, когда юнита атакую, внутри триггера динамически создаётся ещё один триггер (та самая система Jon'a) с событием юниту ноносится урон (если юнит жив, то сработает действие)
Действие: из кэша для данного типа юнита достаётся число - равное базовой броне и здоровье атакованного юнита устанавливается в значение (текушее здоровье + I2R(броня из БД))
Но есть во всём этом одна некрасивая мелочь, видно как жизнь юнита колеблется ( при уроне отнимается, а потом восполняется на кол-во брони), можно сделать восттановление хп незаметно?
Ну и теперь самый главный вопрос, как проверять у юнита наличие предметов (дающих бонус брони), бафов (дающих бонус брони)

Отредактировано happy_horror, 23.03.2008 в 01:43.
Старый 23.03.2008, 00:49
sleepw

offline
Опыт: 8,449
Активность:
happy_horror
в статьях есть спелл мана щилд.. там глянь про "незаметное восстановление"
Старый 23.03.2008, 02:02
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Смотрел. только в статьях не пишется как это исправить, а ссылка на карту пример - битая
Вот кстати нырал в этой системы 1 баг, сразу же:
Если заставить одновременно нескольких юнитов бить другова, то здоровье может восстанавливаться куда больше, чем: урон (сумма уронов N юнитов) - базовая броня бнита * N атаковавших
Как решить, пока не знаю :(:
Старый 23.03.2008, 02:24
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
не заметно не получиться, т.к. кэш достаточно медленен, НО можно при получение урона первым делать call SetUnitState(GetTriggerUnit(),UNIT_STATE_LIFE,GetUnitState(GetTriggerUnit(),UNIT_STATE_LIFE)+GetEven​tDamage(забыл точное имя функции)), затем сторить полученную дамагу и уже ПОСЛЕ кэша начислять юниту урон, правда может получиться баг если урон больше чем здоровье юнита
Старый 23.03.2008, 02:25
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Такое не получится, потому-что изначально тригер системы реагирует на: Любой юнит атакован - а в нём нет урона, урон можно получить только в динамически созданном тригере из этого...а это время
И всё-таки самым главным остаётся баг...ну на всякий выкладываю карту, суть бага в том, что если юнит одновременно атакован несколькими юнитами, то его здоровье может восстановиться куда больше чем должно (восстановление здоровья на колючество брони в идеале)
Прикрепленные файлы
Тип файла: w3x NewDefenseSystem.w3x (19.2 Кбайт, 38 просмотров )
Старый 23.03.2008, 02:44
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
омг -_- чтож..
1) оптимизация и ещё раз оптимизация..
2)
Код:
local triggercondition TrC
local triggeraction TrA
blablabla
call TriggerRemoveCondition(trig, TrC)
call TriggerRemoveAction(trig, TrA)

ты НИГДЕ не присваеваешь TrC и TrA значения, т.е. ты удаляешь "ничто"
3) умнег, мой способ фикса некрасивого присваения жизни идеально впишется в твою систему..
4)
Код:
PolledWait
убило
5)
Код:
SetUnitLifeBJ
убило снова.
6)
Код:
GetUnitStateSwap
добило -_-
7)
Код:
call PolledWait(0.01)
это-то с какой планеты и для чего прилетело?
собственно изза 7 эта фигня и происходит
бтв некрасивого добавления жизни не заметил(хз может быть потому что я автоматов снёс все бж и заменил на нативки)
Старый 23.03.2008, 04:15
sleepw

offline
Опыт: 8,449
Активность:
мдо афтор жжот
Старый 23.03.2008, 06:24
J
expert
offline
Опыт: 48,447
Активность:
вотЪ
Прикрепленные файлы
Тип файла: w3x NewDefenseSystem.w3x (19.6 Кбайт, 63 просмотров )
Старый 23.03.2008, 07:44
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Респект Jon'y
На счёт PolledWait - на одном форуме кто-то написал (на XGM) что это аналог TriggerSleepAction, только он не остановиться в случае паузы игры, а TriggerSleepAction да, вот я его и юзал...
А на счёт "добило" - я ещё нубчеГ в джазе, поэтому делаю пока, лиш, как умею
Тогда всё-таки последняя проблема по этой системе - у юнита ведь могут быть: предметы, ауры, бафы - дающие бонус брони (с ловкостью я сам справлюсь) как отлавливать это? я вроде нашёл проверку на наличие конкретных итемов, а надо вообще наличие любых
Предполагаю сделать проверку до восстановления здоровья юниту - на наличие всех выше указаных объектов, если таковые будут - по сосчитать их бонусы ( возможно так же использовать кэш для хранения данных по таковым объектам) и прибавить общий бонус всех объектов к формуле восстановления здоровья от брони...
Кстати - нашёл условие, у героя есть предмет - за место предмета можно указать PickedItem, это будет какой предмет? я так полагаю выбранный для проверки? Хотя если конвертировать в текст, то в триггере ни строчки о том что это вообще герой

Отредактировано happy_horror, 23.03.2008 в 12:58.
Старый 23.03.2008, 12:11
Nethrez1m
Dat av doe
offline
Опыт: 2,123
Активность:
Цитата:
Кстати - нашёл условие, у героя есть предмет - за место предмета можно указать PickedItem, это будет какой предмет? я так полагаю выбранный для проверки? Хотя если конвертировать в текст, то в триггере ни строчки о том что это вообще герой
Picked Item возвращает предмет, выбранный посредством Pick Every Item... , то есть возможно проверять, как ты и сказал. Предметы могут быть и не обязательно у героев, есть инвентари различных свойств.

Про ауры, абилы и прочая - придется базы данных создавать, которые будут точно описывать, какой бонус к броне идет.

Отредактировано Nethrez1m, 23.03.2008 в 13:28.
Старый 23.03.2008, 13:21
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Хм...а с предметами пример сделать првоерки наличия любого итема можеш? при условии что не будет таких юнитов которые бы просто носили предметы и не могли ими пользоваться

Базу данных сделать не сложно, через тот же кэш как и с бронёй могу намутить, а вот только как заставить функию собирать бонусы брони из БД?? В принципе ADOLF предложил это:

Код:
globals
 real array r_a_u // nohero default armor
 real array r_a_h // hero default armor
 real array r_a_i // item bonus
 real array r_a_b // buffs
endglobals

function GetUnitArmor takes unit u returns nothing
 local real r
 local real i
 local real c=0x00
 if IsUnitType(u, UNIT_TYPE_HERO)then
  set r=r_a_h[GetUnitTypeId(u)-0x48303030]+GetHeroAgi(u, true)*.07
 else
  set r=r_a_u[GetUnitTypeId(u)-0x68303030] 
 endif
 loop
  set i=GetItemTypeId(UnitItemInSlot(u, c))
  if i!=0x00then
   set r=r+r_a_i[i-0x49303030]
  endif
  set c=c+0x01
  exitwhen c==0x06
 endloop
 set c==0x00
 loop
  if GetUnitAbilityLevel(u, 0x42303030+c)!=0x00 then
   set r=r+r_a_b[c]
  endif
  set c=c+0x01
  exitwhen c==0x20
 endloop  
endfunction

function Init takes nothing returns nothing
 set r_a_u[0x00]=1. // 0x00==0x68303030-0x68303030
 set r_a_u[0x01]=0. // 0x01==0x68303031-0x68303030
 set r_a_u[0x02]=5. // 0x02==0x68303032-0x68303030

 set r_a_h[0x00]=-1.// 0x00==0x48303030-0x48303030

 set r_a_i[0x00]=8. // 0x00==0x49303030-0x49303030
 set r_a_i[0x01]=1. // 0x00==0x49303031-0x49303030

 set r_a_b[0x00]=4. // 0x00==0x42303030-0x42303030
 // .........
endfunction


но я что-то эту систему не догоняю...например как можно 0x42303030 сложить с реальной с - ведь тут 2 типа (integer и real)... или например как в реальную с зенесло значение 0х00 (integer) ...жаль ADOLF не онлайн, я б спросил...
Старый 23.03.2008, 13:39
Uk_gruby

offline
Опыт: 6,948
Активность:
happy_horrorСистема кривая так как если дмг будет больше зашиты то юниту будет дабавляться лишнии жизки тебе нада сделать когда юнит получил урон вернуть ему жизни и уронить его полученый урон - зашита

Uk_gruby добавил:
и праверять если дмг меньше или равен зашите то не уронить
Старый 23.03.2008, 13:43
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Ты прав, только написал не правильно - если урон меньше брони бнита, то при атаке этого юнита он лечится ^_^ но я исправил, добавил проверку, всё равботает

happy_horror добавил:
Допустим есть функции:
Код:
function blabla takes unit u returns real r
    local real r
    ...
    set r = 3.33
    return r
endfunction
...
function Main takes nothing returns nothing
    local real r
    local unit u = GetTriggerUnit()
    call blabla(u)
    ....
endfunction


куда вернётся значение r из функции blabla? или как его поместить в переменную?
Старый 23.03.2008, 14:47
Лось

offline
Опыт: 7,223
Активность:
Код:
function blabla takes unit u returns real
    local real r
    ...
    set r = 3.33
    return r
endfunction
...
function Main takes nothing returns nothing
    local real r=blabla(u)
    local unit u = GetTriggerUnit()
endfunction
Старый 23.03.2008, 14:55
Ответ

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

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

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

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



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