Harakternyk
offline
Опыт:
2,703Активность: |
Как определить тип атаки и тип ущерба юнита по событию атаки/нанесения ущерба?
При создании спеллов для своей карты столкнулся с проблемой определения типа атаки и типа ущерба юнита по событию атаки/нанесения ущерба соответственно.
Обращаюсь ко всем, кто может и изъявит желание помочь в решении (или разъяснении сути) этого вопроса. Заранее благодарен! |
15.12.2007, 20:58 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
абсолутного способа нету. а так можно на уровне "задачь" это делать и формул т.е. матиматика. у нас есть 1 известная найти другую неизвестную. вот =) |
15.12.2007, 21:53 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
df Hunter
Нападатель
offline
Опыт:
5,749Активность: |
базы данных по типам юнитов + по самим юнитам рулят имхо =) |
15.12.2007, 22:03 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
df Hunter а ну точно -_- я чё то вопрос не так понял =) хотя вычислят более гибко и универсально но базы надёжней.
|
15.12.2007, 22:26 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Harakternyk
offline
Опыт:
2,703Активность: |
df Hunter, Toadcop, спасибо! Намёк понял - поработаю над этим вариантом (базы...). Хотя за какой-нибудь пример был бы ещё более признателен... Ещё раз спасибо за разъяснения и советы по моему вопросу =)
|
16.12.2007, 00:46 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
df Hunter
Нападатель
offline
Опыт:
5,749Активность: |
Код:
|
16.12.2007, 00:57 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
df Hunter билн -_- надо еще упоминуть что JassNewGen нужен.
короче потом эту структуру лепиш к типу юниту через чёнить. (т.к. юниты статичны этого полностью хватит) и потом при аттаке получаеш его тип и через его доступ к структуре в который написана нужная информация ;) (ну через кеш например.) вообщем не сложна. а блин я понял ! ему нужно DDS =) типо что бы определялось какой тип аттаки т.е. типо урон был нанёсён вручную или спелом и милии или ранджет. хммм ну это чуть сложней. // потом дам ссыли на иностраные сайты где что то вроде есть. |
16.12.2007, 01:39 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Garret
Недоброе творится
offline
Опыт:
3,893Активность: |
маляем орб-системку с фрост атакой у юнитов + системка на получение урона = вуаля определяем по баффу ручки/магия |
16.12.2007, 09:59 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Harakternyk
offline
Опыт:
2,703Активность: |
df Hunter, Toadcop - ещё раз спасибо: сейчас поштудирую JassNewGen (не занимался им ещё...) и попробую применить то, что вы посоветовали.
Garret, не совесем понял твой вариант. Если можно, напиши подробнее чуть. P.S. Есть ещё одна заковыка в этом деле: тип атаки и ущерба у одного и того же юнита могут быть разными: например, геройская атака и магический ущерб от спелла этого же героя. При таких обстоятельствах (т.е. возможном отличии типа атаки и наносимого ущерба у одного и того же юнита) нужно исходить из того, что тип атаки, определяется через "юнит атакован", а тип ущерба ещё и через собития задействоания способностей, однако, это потребует связывания с "integer"-ами "struct"-а не только юнитов, но и способностей, которые могут ими быть использованы на карте. Если я прав, то это выглядит досточно громоздко и неудобно , хоть и реализумо... |
16.12.2007, 11:23 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
df Hunter
Нападатель
offline
Опыт:
5,749Активность: |
вообще-то у обычной атаки тип урона всегда NORMAL(резистится физикой) |
16.12.2007, 11:36 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Лось
offline
Опыт:
7,223Активность: |
Garret сказал что всем юнитам надо дать способность сферу льда, и при юнит дамагед проверять баф сферы льда если он есть значит дамаг атакой, если нету значит магией или триггерно.
|
16.12.2007, 11:37 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Harakternyk
offline
Опыт:
2,703Активность: |
Garret, Лось, выглядит убедительно! Сейчас попробую. Только мне нужно иметь возможность определять не только магический тип атаки, поэтому я сделаю несколько спосбностей "сферы льда" - под каждый существующий тип атаки. Большое спасибо!
df Hunter, Toadcop, а со "struct"-ами я всё же попробую: в любом случае расширит мои возможности, или даже позволит решить мою задачу более изящно... Благодарю! |
16.12.2007, 12:22 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
хм, базы данных и прочие извращения - это лишнее
Насколько я помню, в триггере, привязываемом к каждому юниту можно определять и тип атаки и тип ущерба, остается только создавать триггеры динамически и вешать на каждого юнита, которого следует учесть
почитай common.j
И это я здесь в жассе не пишу уже год, да?! |
16.12.2007, 15:14 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
NETRAT мы не знаем =)
НЕД ! бызы как раз то что надо т.к. он там может без проблем забить аттак рандж юнитов ! и не геморица просто читать и иметь правильный ответ =) ему нужна дамадж детек системка + базы для нужной иноформации (про характеристики простой аттаки) Toadcop добавил: хмммм код не мой но вот впринципе сойдёт =) если сможеш разобратьса. » CODE xD library DamageDetection initializer DamDetect_Init, needs Tables, CasterSystem //******************************************************************************** ********** //* //* emjlr3's Damage Detection Engine //* //* //* A fairly simple system that allows you to detect when units //* in your map take damage, and do with them what you want. Use //* the function DamDetect_Attacks and DamDetect_Spells to que your //* functions to be ran at attack or other damage. //* //* Requires: //* - "emjlr3s CS" setup correctly in your map //* - The dummy orb ability in this map and its current buff updated in your map //* - This trigger, ofcourse //* //******************************************************************************** ********** //================================================================================ ============================================= // Configuration : // globals // Your dummy orb abilities rawcode private constant integer DamDetect_Abil = 'A004' // Your dummy orb abilities buffs rawcode private constant integer DamDetect_Buff = 'B000' endglobals //================================================================================ ============================================= // Damage Detection Engine functions. Don't mess down here unless you know what you are doing!!! globals //needed globals: private integer AttackCount = 0 private integer SpellCount = 0 private string array Attacks private string array Spells private string DamageType private unit U endglobals //**********Main function to run the functions that need to be ran for each damage type function DamDetect_Damaged takes nothing returns boolean local integer i = 1 local string funcName set U = GetTriggerUnit() if GetEventDamage()>.1 then if GetUnitAbilityLevel(U, DamDetect_Buff) > 0 then call UnitRemoveAbility(U, DamDetect_Buff) set DamageType = "attack" loop exitwhen i > AttackCount call ExecuteFunc(Attacks[i]) set i = i + 1 endloop else set DamageType = "spell" loop exitwhen i > SpellCount call ExecuteFunc(Spells[i]) set i = i + 1 endloop endif endif return false endfunction //Returns the damage cause, incase you need to know function DamDetect_GetDamageEventCause takes nothing returns string return DamageType endfunction //Use this to ignore the damage done by the unit, avoids infinite loops in some cases function DamDetect_Dummy takes unit u, string whichState returns nothing if whichState=="ignore" then call SetTableInt("DamDetect_"+I2S(CS_H2I(u)),"DamDetect_Dummy",1) elseif whichState=="allow" then call SetTableInt("DamDetect_"+I2S(CS_H2I(u)),"DamDetect_Dummy",0) endif endfunction //**********Sets up the triggers to run when a unit takes damage, call either of these in the triggers init trigger //for it to run when a unit takes damage function DamDetect_Attacks takes string funcName returns nothing //used for attack damage set AttackCount = AttackCount + 1 set Attacks[AttackCount] = funcName endfunction function DamDetect_Spells takes string funcName returns nothing //used for spell damage set SpellCount = SpellCount + 1 set Spells[SpellCount] = funcName endfunction //**********Base functions for the system //Filter for units you do not want to be checked to add or remove the ability when they enter the map, or when they die function DamDetect_Filter takes nothing returns boolean set U = GetTriggerUnit() if GetUnitTypeId(U)==CasterUnitId then return false endif if GetUnitTypeId(U)=='n02G' or GetUnitTypeId(U)=='e006' or GetUnitTypeId(U)=='e005' or GetUnitTypeId(U)=='h03J' then return false endif return true endfunction //Add damage triggers for units who enter map function DamDetect_AddTriggers takes nothing returns nothing local trigger dam_trig = CreateTrigger() set U = GetTriggerUnit() if IsUnitType(U,UNIT_TYPE_STRUCTURE)==true then call UnitAddAbility(U, DamDetect_Abil) call UnitMakeAbilityPermanent(U,true,DamDetect_Abil) else call TriggerRegisterUnitEvent(dam_trig, U,EVENT_UNIT_DAMAGED) call TriggerAddCondition(dam_trig,Condition(function DamDetect_Damaged)) call SetTableObject("DamDetect_"+I2S(CS_H2I(U)),"dam_trig",dam_trig) endif set dam_trig = null endfunction //Remove triggers from units who die function DamDetect_RemoveTriggers takes nothing returns nothing local unit u = GetTriggerUnit() local string s if GetWidgetLife(u)<.405 and GetUnitAbilityLevel(u,'A00U')==0 and IsUnitType(u,UNIT_TYPE_STRUCTURE)==false then set s = "DamDetect_"+I2S(CS_H2I(u)) call DestroyTrigger(GetTableTrigger(s,"dam_trig")) call FlushStoredMission(cscache,s) set u = null return endif endfunction function DamDetect_Upgrades takes nothing returns nothing local integer id set U = GetTriggerUnit() set id = GetUnitTypeId(U) if id=='h00X' or id=='h01A' or id=='h01B' or id=='h01C' then //etc., for a tower that does not currently have the ability, add it call UnitAddAbility(U, DamDetect_Abil) call UnitMakeAbilityPermanent(U,true,DamDetect_Abil) endif if id=='h002' or id=='h00Y' or id=='h02X' or id=='h012' or id=='h014' or id=='h02F' or id=='h02P' or id=='n02G' then //etc., for a tower that has it, but we do not want it to anymore call UnitMakeAbilityPermanent(U,false,DamDetect_Abil) call UnitRemoveAbility(U,DamDetect_Abil) endif endfunction //Basically just sets up the system for all units preplaced that may be used, //for units that ever enter the map, and removes triggers when units die function DamDetect_Init takes nothing returns nothing local trigger entmap_trig = CreateTrigger() local trigger death_trig = CreateTrigger() local trigger upg_trig = CreateTrigger() local group g = CreateGroup() call GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,Condition(function DamDetect_Filter)) call ForGroup(g,function DamDetect_AddTriggers) call TriggerRegisterEnterRectSimple(entmap_trig, bj_mapInitialPlayableArea) call TriggerAddCondition(entmap_trig,Condition(function DamDetect_Filter)) call TriggerAddAction(entmap_trig,function DamDetect_AddTriggers) call TriggerRegisterAnyUnitEventBJ(death_trig,EVENT_PLAYER_UNIT_DEATH) call TriggerAddCondition(death_trig,Condition(function DamDetect_Filter)) call TriggerAddAction(death_trig,function DamDetect_RemoveTriggers) call TriggerRegisterAnyUnitEventBJ(upg_trig,EVENT_PLAYER_UNIT_UPGRADE_FINISH) call TriggerAddAction(upg_trig,function DamDetect_Upgrades) set entmap_trig = null set death_trig = null set upg_trig = null call DestroyGroup(g) set g = null endfunction endlibrary |
16.12.2007, 16:18 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
че то я про определение рейнджа ничего не прочитал в задаче то есть создавать бд это не геморр? |
16.12.2007, 19:31 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Harakternyk
offline
Опыт:
2,703Активность: |
Toadcop, ты прав - сформулировал задчу правильно и этот код мне вроде (по первому взгляду...) подходит.
Если можно, то скинь мне ссылку на описание (или карту пример и т.п.) этой системы (если на английском, то не страшно) - легче будет разобраться... В который раз спасибо, Toadcop! NETRAT, есть функция UnitAddTypeBJ( whichType , whichUnit ) - она возвращает тип юнита, в том числе и из динамического тригера, но только она меняет тип самого этого юнита, а мне надо определить тип наносимого ущерба и атаки без изменения его характеристик. В числе же стандартных логических функций также проверяется только тип юнита. Поэтому я тему и создал... Просто так я бы не стал за помощью обращаться - у всех своих дел хватает... Но за участие - спасибо! Отредактировано Harakternyk, 17.12.2007 в 03:06. |
16.12.2007, 20:21 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|