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

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

Ответ
 
Ajaccio

offline
Опыт: 1,007
Активность: 0
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!
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 Кбайт, 127 просмотров )

Отредактировано ShadoW DaemoN, 13.04.2011 в 13:50.
Старый 13.04.2011, 11:44
Msey

offline
Опыт: 30,542
Активность: 8465
Система не очень.. а так, для начинающих по цжассу сойдет
________________
Давать я буду только если в рот © Toadcop

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

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

Отредактировано makkad, 15.06.2014 в 01:04.
Старый 15.06.2014, 00:33
Ancient
Щпаовапа
offline
Опыт: 38,270
Активность: 17404
makkad, значит у тебя нету жнгп, установи и радуйся жизни.
________________
Если Вам что-то не нравится во мне — не нужно ставить меня в известность. Попробуйте пережить потрясение самостоятельно.
Старый 15.06.2014, 11:48
DioD

offline
Опыт: 45,151
Активность: 924
Участник проектов:
-WarCraft 3
-Minecraft
bj_lastDamageType
wtf?
кто вас учил называть переменные вообще?
Старый 15.06.2014, 12:45
quq_CCCP
Я белый и пушистый!
offline
Опыт: 71,175
Активность: 29469
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DioD:
кто вас учил называть переменные вообще?
quq_CCCP
Старый 15.06.2014, 14:10
DioD

offline
Опыт: 45,151
Активность: 924
Участник проектов:
-WarCraft 3
-Minecraft
вас надо хранить в нарнии только за переменные
Старый 15.06.2014, 14:26
Goodie

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

offline
Опыт: 45,151
Активность: 924
Участник проектов:
-WarCraft 3
-Minecraft
я надеюсь что инвалид в этой теме только один, а остальные сами догадаются по какой причине нельзя ставить теги плана bj gtg gpt и другие в свои переменные.
Старый 16.06.2014, 11:05
quq_CCCP
Я белый и пушистый!
offline
Опыт: 71,175
Активность: 29469
Участник проектов:
-God's word: The True Way
-Мастерская girvel-а
DioD:
я надеюсь что инвалид в этой теме только один, а остальные сами догадаются по какой причине нельзя ставить теги плана bj gtg gpt и другие в свои переменные.
Да об этом всем давно известно, я тока ради троллинга в парочке своих наработок называл так переменные, никогда не думал что кто то возьмёт пример с меня...
Старый 16.06.2014, 11:28
ScorpioT1000
Только вперёд!
online
Опыт: отключен
Нарушения : 2

какая разница, там private стоит, всё нормально
другое дело, что когда локальная область видимости, называть надо как можно проще
Старый 16.06.2014, 16:30
Ответ

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

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

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

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



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