![]()
Ajaccio
![]() ![]() offline
Опыт:
1,007Активность: |
Custom Damage System
Custom Damage SystemРешил выложить свою систему отлова урона, может кому пригодится в работе.
Сделано известно как, но дополнительно умеет немного разделять типы атаки и урона. В карте-примере есть несколько способностей из DotA. Как установитьПросто скопируйте триггер EMDS к себе в карту.
Также необходимо перенести способность "МЕТКА" и её эффект, занести их рав-коды в систему. Для использования нужен cJass! Список функций
Это просто замена native-функциям GetEventDamageSource(), GetTriggerUnit() и GetEventDamage().
Подключает указанный триггер t к системе.
Это аналог события EVENT_UNIT_DAMAGED, но работает сразу на всех юнитов на карте.
Восстанавливает указанному юниту\предмету targ здоровье в количестве count.
Если восстановление невозможно, то сработает с задержкой. Предназначена для создания триггерной неуязвимости\блокирования урона.
Если Вы наносите урон триггерно, то функции вернут тип урона и атаки абсолютно точно.
В противном случае Вы только узнаете магический или физический урон получил юнит. Также функции способны разделять 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 )) Отредактировано ShadoW DaemoN, 13.04.2011 в 13:50. |
![]() |
#1
+2/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Msey
????
![]() offline
Опыт:
67,346Активность: |
Система не очень.. а так, для начинающих по цжассу сойдет
Отредактировано Msey, 13.04.2011 в 13:47. |
![]() |
#2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Versus
Miss me?
![]() ![]() offline
Опыт:
17,736Активность: |
Ajaccio, полезная вещь... но не думаю что здесь есть что-то особенное... и многие Гуишники не поймут как это устанавливать, а именно таковым система и нужна).. Надеюсь ты будешь совершенствовать это наработку... |
![]() |
#3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DotaMaster666
Silenced by GadenbIsh
![]() offline
Опыт:
1,259Активность: |
Не пишите на одной строке несколько инструкций, разделенных с помощью ;
Переменные можно объявлять через запятую, и то не всегда, а когда они объеденные логически
|
![]() |
#4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
makkad
![]() ![]() offline
Опыт:
21,926Активность: |
Хм... тестовая карта не компилируется.... Есть новая версия? Вернее, перестаёт это делать после её пересохранения. Отредактировано makkad, 15.06.2014 в 01:04. |
![]() |
#5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Ancient
Щпаовапа
![]() ![]() offline
Опыт:
38,370Активность: |
makkad, значит у тебя нету жнгп, установи и радуйся жизни. |
![]() |
#6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
bj_lastDamageType
wtf?
кто вас учил называть переменные вообще? |
![]() |
#7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
quq_CCCP
Я белый и пушистый!
![]() ![]() offline
Опыт:
93,755Активность: |
DioD:
quq_CCCP |
![]() |
#8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
вас надо хранить в нарнии только за переменные |
![]() |
#9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
Goodie
![]() ![]() offline
Опыт:
2,825Активность: |
|
![]() |
#10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
DioD
![]() ![]() offline
Опыт:
45,134Активность: |
я надеюсь что инвалид в этой теме только один, а остальные сами догадаются по какой причине нельзя ставить теги плана bj gtg gpt и другие в свои переменные. |
![]() |
#11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
quq_CCCP
Я белый и пушистый!
![]() ![]() offline
Опыт:
93,755Активность: |
DioD:
Да об этом всем давно известно, я тока ради троллинга в парочке своих наработок называл так переменные, никогда не думал что кто то возьмёт пример с меня... |
![]() |
#12
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
![]()
ScorpioT1000
Работаем
![]() ![]()
online
Опыт: отключен
|
какая разница, там private стоит, всё нормально
другое дело, что когда локальная область видимости, называть надо как можно проще |
![]() |
#13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|