|  
		
		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. | 
|  13.04.2011, 11:44 | 
|  
		
		Msey
		
	 ????  offline
Опыт: 
66,991 Активность: | Система не очень.. а так, для начинающих по цжассу сойдет Отредактировано 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 Активность: | Не пишите на одной строке несколько инструкций, разделенных с помощью ; Переменные можно объявлять через запятую, и то не всегда, а когда они объеденные логически  | 
|  25.04.2011, 00:23 | 
|  
		
		makkad
		
	   offline
Опыт: 
25,997 Активность: | Хм... тестовая карта не компилируется.... Есть новая версия? Вернее, перестаёт это делать после её пересохранения. Отредактировано 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
Опыт: 
96,500 Активность: | DioD:
 quq_CCCP | 
|  15.06.2014, 14:10 | 
|  
		
		DioD
		
	   offline
Опыт: 
45,184 Активность: | вас надо хранить в нарнии только за переменные | 
|  15.06.2014, 14:26 | 
|  
		
		Goodie
		
	   offline
Опыт: 
2,825 Активность: |  | 
|  16.06.2014, 10:16 | 
|  
		
		DioD
		
	   offline
Опыт: 
45,184 Активность: | я надеюсь что инвалид в этой теме только один, а остальные сами догадаются по какой причине нельзя ставить теги плана bj gtg gpt и другие в свои переменные. | 
|  16.06.2014, 11:05 | 
|  
		
		quq_CCCP
		
	 Я белый и пушистый!   offline
Опыт: 
96,500 Активность: | DioD:
 Да об этом всем давно известно, я тока ради троллинга в парочке своих наработок называл так переменные, никогда не думал что кто то возьмёт пример с меня... | 
|  16.06.2014, 11:28 | 
|  
		
		ScorpioT1000
		
	 Работаем   offline
Опыт: отключен | какая разница, там private стоит, всё нормально другое дело, что когда локальная область видимости, называть надо как можно проще | 
|  16.06.2014, 16:30 |