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

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

Ответ
 
Ajaccio

offline
Опыт: 1,007
Активность:
Custom Damage System

Custom Damage System

Решил выложить свою систему отлова урона, может кому пригодится в работе.
Сделано известно как, но дополнительно умеет немного разделять типы атаки и урона.
В карте-примере есть несколько способностей из DotA.

Как установить

Просто скопируйте триггер EMDS к себе в карту.
Также необходимо перенести способность "МЕТКА" и её эффект, занести их рав-коды в систему.
Для использования нужен cJass!

Список функций

function GetDSSource takes nothing returns unit // возвращает источник урона.
function GetDSTarget takes nothing returns unit // возвращает получателя урона.
function GetDSCounts takes nothing returns real // возвращает количество урона.
Это просто замена native-функциям GetEventDamageSource(), GetTriggerUnit() и GetEventDamage().
function TriggerRegisterAllUnitDamaged takes trigger t returns nothing
Подключает указанный триггер t к системе.
Это аналог события EVENT_UNIT_DAMAGED, но работает сразу на всех юнитов на карте.
function ResetWidgetLife takes widget targ, float count returns nothing
Восстанавливает указанному юниту\предмету targ здоровье в количестве count.
Если восстановление невозможно, то сработает с задержкой.
Предназначена для создания триггерной неуязвимости\блокирования урона.
function GetEventDamageType takes nothing returns damagetype // возвращает тип урона.
function GetEventAttackType takes nothing returns attacktype // возвращает тип атаки.
Если Вы наносите урон триггерно, то функции вернут тип урона и атаки абсолютно точно.
В противном случае Вы только узнаете магический или физический урон получил юнит.
Также функции способны разделять ATTACK_TYPE_HERO и ATTACK_TYPE_MELEE.

Исходник

» Warning!
((код jass
library EMDSystem initializer InitSystem
#include "cj_types.j"
define
{
UnitDamageTarget = UserUnitDamageTarget
SPELL_MARK = 'A003' РАВ-код способности "Метка (Damage System)"
SPELL_BUFF = 'B000' РАВ-код эффекта для "Метка (Damage System)"
}

private widget gg_save
private trigger array user

private int count = 0
private int index = 0

private damagetype bj_lastDamageType = null
private attacktype bj_lastAttackType = null
private bool exec
private bool array safe

private unit bj_lastSourceDamage
private unit bj_lastTargetDamage
private real bj_lastCountsDamage
private struct u_damage
{
unit c; unit t
bool a_b; bool r_b
attacktype a_t; damagetype d_t; weapontype w_t
float d

void clear() {
c = null; t = null
a_t = null; d_t = null; w_t = null
}
}

undef UnitDamageTarget
private bool FilterEvent() {
bool zbuff = false
if (not (GetEventDamage() > 0.0) || GetTriggerEventId() != EVENT_UNIT_DAMAGED) {return false}
if (GetUnitAbilityLevel(GetTriggerUnit(), SPELL_BUFF) != 0) {
zbuff = true; UnitRemoveAbility(GetTriggerUnit(), SPELL_BUFF)
}; exec = true
bj_lastCountsDamage = GetEventDamage()
bj_lastSourceDamage = GetEventDamageSource()
bj_lastTargetDamage = GetTriggerUnit()
if (bj_lastDamageType == null && bj_lastAttackType == null) {
if (zbuff) {
bj_lastDamageType = DAMAGE_TYPE_NORMAL
if (IsUnitType(bj_lastSourceDamage, UNIT_TYPE_HERO) == true) {
bj_lastAttackType = ATTACK_TYPE_HERO
} else {
bj_lastAttackType = ATTACK_TYPE_MELEE
}
} else {
bj_lastDamageType = DAMAGE_TYPE_MAGIC
bj_lastAttackType = ATTACK_TYPE_MAGIC
}
}
int i = 0
while (i < count) {
if safe[i] && TriggerEvaluate(user[i]) {
safe[i] = false; TriggerExecute(user[i])
}; i++
}
bj_lastDamageType = null
bj_lastAttackType = null
if (index > 0) {
u_damage use = index; index--
bj_lastAttackType = use.a_t; bj_lastDamageType = use.d_t
UnitDamageTarget(use.c, use.t, use.d, use.a_b, use.r_b, use.a_t, use.d_t, use.w_t)
use.clear(); use.destroy()
} else {
i = 0; exec = false
while (i < count) {safe[i] = true; i++}
}
return false
}
private bool CreateNewMember() {
if (GetTriggerEventId() == EVENT_UNIT_DAMAGED) {return false}
unit targ = GetFilterUnit()
if (GetWidgetLife(targ) > 0.0 && GetUnitAbilityLevel(targ, SPELL_MARK) == 0) {
TriggerRegisterUnitEvent(gg_trg_EMDS, targ, EVENT_UNIT_DAMAGED)
UnitAddAbility(targ, SPELL_MARK)
UnitMakeAbilityPermanent(targ, true, SPELL_MARK)
}
targ = null
return false
}
private void RWL_TimerEnd() {
SetWidgetLife(gg_save, GetWidgetLife(gg_save) + bj_lastCountsDamage)
DestroyTimer(GetExpiredTimer())
}
private void InitSystem() {
gg_trg_EMDS = CreateTrigger()
boolexpr filter = Condition(function CreateNewMember); group genum = CreateGroup()
region allmap = CreateRegion(); RegionAddRect(allmap, bj_mapInitialPlayableArea)
GroupEnumUnitsInRect(genum, bj_mapInitialPlayableArea, filter)
TriggerRegisterEnterRegion(gg_trg_EMDS, allmap, null)
TriggerAddCondition(gg_trg_EMDS, Condition(function FilterEvent))
TriggerAddCondition(gg_trg_EMDS, filter)
DestroyGroup(genum); genum = null
}
-------------------------USER FUNCTION-------------------------\\
real GetDSCounts() {
return bj_lastCountsDamage
}
unit GetDSSource() {
return bj_lastSourceDamage
}
unit GetDSTarget() {
return bj_lastTargetDamage
}
damagetype GetEventDamageType() {
return bj_lastDamageType
}
attacktype GetEventAttackType() {
return bj_lastAttackType
}
bool UserUnitDamageTarget (unit c, unit t, float d, bool a_b, boolean r_b, attacktype a_t, damagetype d_t, weapontype w_t) {
if exec {
u_damage new = u_damage.create()
index++; new.d = d
new.c = c; new.t = t
new.a_b = a_b; new.r_b = r_b
new.a_t = a_t; new.d_t = d_t; new.w_t = w_t
} else {
return UnitDamageTarget(c, t, d, a_b, r_b, a_t, d_t, w_t)
}
return false
}
setdef UnitDamageTarget = UserUnitDamageTarget
void ResetWidgetLife (widget targ, float r) {
if (targ != bj_lastTargetDamage) {SetWidgetLife(targ, GetWidgetLife(targ) + r); return}
gg_save = targ; bj_lastCountsDamage = r
timer timed = CreateTimer(); TimerStart(timed, 0.0, false, function RWL_TimerEnd); timed = null
}
void TriggerRegisterAllUnitDamaged (trigger t) {
user[count] = t; safe[count] = true; count++
}
endlibrary
))
Прикрепленные файлы
Тип файла: w3x Custom Damage Event.w3x (83.4 Кбайт, 134 просмотров )

Отредактировано ShadoW DaemoN, 13.04.2011 в 13:50.
Старый 13.04.2011, 11:44
Msey
????
offline
Опыт: 67,346
Активность:
Система не очень.. а так, для начинающих по цжассу сойдет

Отредактировано Msey, 13.04.2011 в 13:47.
Старый 13.04.2011, 12:55
Versus
Miss me?
offline
Опыт: 17,736
Активность:
Ajaccio, полезная вещь... но не думаю что здесь есть что-то особенное... и многие Гуишники не поймут как это устанавливать, а именно таковым система и нужна)..
Надеюсь ты будешь совершенствовать это наработку...
Старый 13.04.2011, 17:13
DotaMaster666
Silenced by GadenbIsh
offline
Опыт: 1,259
Активность:
Не пишите на одной строке несколько инструкций, разделенных с помощью ;
Переменные можно объявлять через запятую, и то не всегда, а когда они объеденные логически
unit c, t
Старый 25.04.2011, 00:23
makkad

offline
Опыт: 22,037
Активность:
Хм... тестовая карта не компилируется.... Есть новая версия? Вернее, перестаёт это делать после её пересохранения.

Отредактировано makkad, 15.06.2014 в 01:04.
Старый 15.06.2014, 00:33
Ancient
Щпаовапа
offline
Опыт: 38,370
Активность:
makkad, значит у тебя нету жнгп, установи и радуйся жизни.
Старый 15.06.2014, 11:48
DioD

offline
Опыт: 45,184
Активность:
bj_lastDamageType
wtf?
кто вас учил называть переменные вообще?
Старый 15.06.2014, 12:45
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
DioD:
кто вас учил называть переменные вообще?
quq_CCCP
Старый 15.06.2014, 14:10
DioD

offline
Опыт: 45,184
Активность:
вас надо хранить в нарнии только за переменные
Старый 15.06.2014, 14:26
Goodie

offline
Опыт: 2,825
Активность:
DioD, quq_CCCP сливается с атмосферой близзов)
Старый 16.06.2014, 10:16
DioD

offline
Опыт: 45,184
Активность:
я надеюсь что инвалид в этой теме только один, а остальные сами догадаются по какой причине нельзя ставить теги плана bj gtg gpt и другие в свои переменные.
Старый 16.06.2014, 11:05
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
DioD:
я надеюсь что инвалид в этой теме только один, а остальные сами догадаются по какой причине нельзя ставить теги плана bj gtg gpt и другие в свои переменные.
Да об этом всем давно известно, я тока ради троллинга в парочке своих наработок называл так переменные, никогда не думал что кто то возьмёт пример с меня...
Старый 16.06.2014, 11:28
ScorpioT1000
Работаем
offline
Опыт: отключен
какая разница, там private стоит, всё нормально
другое дело, что когда локальная область видимости, называть надо как можно проще
Старый 16.06.2014, 16:30
Ответ

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

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

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

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



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