Как сделать проверку кем нанесён урон и в каких кол-вах, например, Ратуше? Если допустим синий нанёс 100 урона, то здание переходит ему.

Принятый ответ

(всю папку триггеров себе вставляй)
инструкция по переносу в самой наработке
//////////// ВОТ ЧТО ТЕБЕ НАДО ДОПИСАТЬ/////////
if LoadInteger(udg_hash,GetHandleId(c),100+p)>=100 then где 100 - твоё число
call SetUnitOwner(c,GetOwningPlayer(u))
endif
и я показал куда, настраивать всё всё не надо ибо тебе не нужен опыт
и это не 100% решение и не гуи, требуется переработка, я дал максимальную подсказку с образцом
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
5 лет назад
0
Глобалки/хештаблицы
0
28
5 лет назад
0
В триггере по получении урона смотришь GetEventDamageSource (тот, кто нанёс урон) и GetEventDamage (количество урона).
5
32
5 лет назад
5

А вот подробнее , тут как раз такие реализована система подсчета урона по крипу, чтобы в этом % соотношении выдать опыт, в твоём же случае нужно немножко переделать систему:
Первый кто нанесёт 100 урона станет владельцем здания
function Trig_Damage_Test_Actions takes nothing returns nothing
local unit c=GetTriggerUnit() //  тот кто получил урон
local unit u=GetEventDamageSource() //  тот кто нанёс
local real d=GetEventDamage() // количество урона
local integer p=0
//IsUnitType(u,UNIT_TYPE_HERO) and 
if c!=u and IsUnitDead(c)==false and IsUnitIllusion(u)==false and IsUnitEnemy(u,GetOwningPlayer(c)) then //система опыта и голды

set p=GetPlayerId(GetOwningPlayer(u))
call SaveInteger(udg_hash,GetHandleId(c),100+p,R2I(d)+LoadInteger(udg_hash,GetHandleId(c),100+p)) // записываем в индекс + номер игрока хештаблицы
//////////////// ВОТ ЧТО ТЕБЕ НАДО ДОПИСАТЬ/////////
if LoadInteger(udg_hash,GetHandleId(c),100+p)>=100 then // где 100 - твоё число
call SetUnitOwner(c,GetOwningPlayer(u))
endif
//////////////////////////////////////// И ВСЁ/////////////
endif



set c=null
set u=null

endfunction
0
28
5 лет назад
Отредактирован PT153
0
IsUnitDead(c)==false and IsUnitIllusion(u)==false
Ну это бан.
UnitAlive(c) and (not IsUnitIllusion(u))
или
(not IsUnitDead(c)) and (not IsUnitIllusion(u))
или
(not (IsUnitDead(c) or IsUnitIllusion(u)))
Да и зачем проверять, что получатель урона жив? Получатель урона всегда жив, ведь урон нанесётся после окончания триггера, а мёртвые не могут получить урон.
0
16
5 лет назад
Отредактирован Naadir
0
PT153, зато, когда обращаешься к мёртвым юнитам, например их абилкам, могут возникать фаталы. Вдруг ты захочешь добавить 99999хп для какой-нибудь абилки блока, а юнит будет мертв?
1
28
5 лет назад
1
Naadir, причём тут это? Событие на получения урона срабатывает только для живых юнитов.
0
26
5 лет назад
0
Bergi_Bear, так ему надо не фиксированное количество урона по зданию нанести, а выбрать максимальное из всех, кто нанёс урон.
Честно говоря, ночью напечатал алгоритм, не отправил, а лёг спать, а утром не скопировал напечатанный текст, а просто обновил страницу)
Если кратко для одного здания, либо фиксированного количества, то нужно создать массив реальных переменных для подсчёта урона, где индексом будет номер игрока, чей юнит нанёс урон. При получении урона его количество прибавляется к соответствующей переменной, а потом идёт проверка, не больше ли количество урона текущего здоровья+0.04, когда юнит должен умереть. Если да, то восстановить здоровье и найти циклом максимальное значение реальных переменных, для этого понадобится для максимальной целочисленная переменная, куда будет записываться индекс массива реальных. Сравниваешь по очереди переменные с той, что фигурирует, как максимальная, если больше, значит она теперь максимальная, этот номер игрока и становится владельцем.
Если же такие Ратуши игроки могут строить, как в обычном развитии, то нужно сохранять количество урона по каждой в хеш-таблицу.
0
32
5 лет назад
0
8gabriel8, ничего не сказано о максимальном, я додумал сам и это самый простой вариант отследить кто первый нанесёт 100 урона
0
32
5 лет назад
0
PT153, не ваще то могут, они его исправно получают, т.е он проходит как событие EVENT_UNIT_DAMAGED но с тех пор как у юнита хп меньше 0.405 урон перестает влиять на кол-во хп юнита, а так же отсекаются все модификаторы, не вешаются баффы и так далее.
Об этом писал еще Diod на форуме, баг яйца феникса, когда из за морфа бонус хп становился отрецательным и макс хп < 0.405, что делало юнита мертвым.
0
28
5 лет назад
0
он проходит как событие EVENT_UNIT_DAMAGED
Тут не проходит. Юнит умер - событие не реагирует.
Загруженные файлы
0
32
5 лет назад
0
PT153, наноси пачкой уроны, на а не после.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.