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

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



Просмотров: 297

» Лучшие комментарии


Bergi_Bear #1 - 3 месяца назад 0
Глобалки/хештаблицы
PT153 #2 - 3 месяца назад 0
В триггере по получении урона смотришь GetEventDamageSource (тот, кто нанёс урон) и GetEventDamage (количество урона).
Bergi_Bear #3 - 3 месяца назад 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
PT153 #4 - 3 месяца назад (отредактировано ) -1
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)))
Да и зачем проверять, что получатель урона жив? Получатель урона всегда жив, ведь урон нанесётся после окончания триггера, а мёртвые не могут получить урон.
Naadir #5 - 3 месяца назад (отредактировано ) 0
PT153, зато, когда обращаешься к мёртвым юнитам, например их абилкам, могут возникать фаталы. Вдруг ты захочешь добавить 99999хп для какой-нибудь абилки блока, а юнит будет мертв?
PT153 #6 - 3 месяца назад 1
Naadir, причём тут это? Событие на получения урона срабатывает только для живых юнитов.
8gabriel8 #7 - 3 месяца назад 0
Bergi_Bear, так ему надо не фиксированное количество урона по зданию нанести, а выбрать максимальное из всех, кто нанёс урон.
Честно говоря, ночью напечатал алгоритм, не отправил, а лёг спать, а утром не скопировал напечатанный текст, а просто обновил страницу)
Если кратко для одного здания, либо фиксированного количества, то нужно создать массив реальных переменных для подсчёта урона, где индексом будет номер игрока, чей юнит нанёс урон. При получении урона его количество прибавляется к соответствующей переменной, а потом идёт проверка, не больше ли количество урона текущего здоровья+0.04, когда юнит должен умереть. Если да, то восстановить здоровье и найти циклом максимальное значение реальных переменных, для этого понадобится для максимальной целочисленная переменная, куда будет записываться индекс массива реальных. Сравниваешь по очереди переменные с той, что фигурирует, как максимальная, если больше, значит она теперь максимальная, этот номер игрока и становится владельцем.
Если же такие Ратуши игроки могут строить, как в обычном развитии, то нужно сохранять количество урона по каждой в хеш-таблицу.
Bergi_Bear #8 - 3 месяца назад 0
8gabriel8, ничего не сказано о максимальном, я додумал сам и это самый простой вариант отследить кто первый нанесёт 100 урона
quq_CCCP #9 - 3 месяца назад 0
PT153, не ваще то могут, они его исправно получают, т.е он проходит как событие EVENT_UNIT_DAMAGED но с тех пор как у юнита хп меньше 0.405 урон перестает влиять на кол-во хп юнита, а так же отсекаются все модификаторы, не вешаются баффы и так далее.
Об этом писал еще Diod на форуме, баг яйца феникса, когда из за морфа бонус хп становился отрецательным и макс хп < 0.405, что делало юнита мертвым.
PT153 #10 - 3 месяца назад 0
он проходит как событие EVENT_UNIT_DAMAGED
Тут не проходит. Юнит умер - событие не реагирует.
прикреплены файлы
quq_CCCP #11 - 3 месяца назад 0
PT153, наноси пачкой уроны, на а не после.
PT153 #12 - 3 месяца назад 0
quq_CCCP, лучше сам покажи, у меня не выходит.
прикреплены файлы
eriel222 #13 - 3 месяца назад 0
Bergi_Bear:

А вот подробнее , тут как раз такие реализована система подсчета урона по крипу, чтобы в этом % соотношении выдать опыт, в твоём же случае нужно немножко переделать систему:
Первый кто нанесёт 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
Это в JassNewGenPack вставлять?
Bergi_Bear #14 - 3 месяца назад 0

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