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

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

Ответ
 
Harakternyk

offline
Опыт: 2,703
Активность:
Как определить тип атаки и тип ущерба юнита по событию атаки/нанесения ущерба?
При создании спеллов для своей карты столкнулся с проблемой определения типа атаки и типа ущерба юнита по событию атаки/нанесения ущерба соответственно.

Обращаюсь ко всем, кто может и изъявит желание помочь в решении (или разъяснении сути) этого вопроса.

Заранее благодарен!
Старый 15.12.2007, 20:58
Toadcop

offline
Опыт: 54,313
Активность:
абсолутного способа нету.
а так можно на уровне "задачь" это делать и формул т.е. матиматика. у нас есть 1 известная найти другую неизвестную. вот =)
Старый 15.12.2007, 21:53
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
базы данных по типам юнитов + по самим юнитам рулят имхо =)
Старый 15.12.2007, 22:03
Toadcop

offline
Опыт: 54,313
Активность:
df Hunter а ну точно -_- я чё то вопрос не так понял =) хотя вычислят более гибко и универсально но базы надёжней.
Старый 15.12.2007, 22:26
Harakternyk

offline
Опыт: 2,703
Активность:
df Hunter, Toadcop, спасибо! Намёк понял - поработаю над этим вариантом (базы...). Хотя за какой-нибудь пример был бы ещё более признателен... Ещё раз спасибо за разъяснения и советы по моему вопросу =)
Старый 16.12.2007, 00:46
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Код:
struct unittypedata
    integer attacktype
    integer damagetype
и другие параметры
endstruct
Старый 16.12.2007, 00:57
Toadcop

offline
Опыт: 54,313
Активность:
df Hunter билн -_- надо еще упоминуть что JassNewGen нужен.

короче потом эту структуру лепиш к типу юниту через чёнить. (т.к. юниты статичны этого полностью хватит) и потом при аттаке получаеш его тип и через его доступ к структуре в который написана нужная информация ;) (ну через кеш например.)
вообщем не сложна.

а блин я понял ! ему нужно DDS =) типо что бы определялось какой тип аттаки т.е. типо урон был нанёсён вручную или спелом и милии или ранджет. хммм ну это чуть сложней.
// потом дам ссыли на иностраные сайты где что то вроде есть.
Старый 16.12.2007, 01:39
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
маляем орб-системку с фрост атакой у юнитов + системка на получение урона = вуаля определяем по баффу ручки/магия
Старый 16.12.2007, 09:59
Harakternyk

offline
Опыт: 2,703
Активность:
df Hunter, Toadcop - ещё раз спасибо: сейчас поштудирую JassNewGen (не занимался им ещё...) и попробую применить то, что вы посоветовали.

Garret, не совесем понял твой вариант. Если можно, напиши подробнее чуть.

P.S. Есть ещё одна заковыка в этом деле: тип атаки и ущерба у одного и того же юнита могут быть разными: например, геройская атака и магический ущерб от спелла этого же героя.
При таких обстоятельствах (т.е. возможном отличии типа атаки и наносимого ущерба у одного и того же юнита) нужно исходить из того, что тип атаки, определяется через "юнит атакован", а тип ущерба ещё и через собития задействоания способностей, однако, это потребует связывания с "integer"-ами "struct"-а не только юнитов, но и способностей, которые могут ими быть использованы на карте.
Если я прав, то это выглядит досточно громоздко и неудобно , хоть и реализумо...
Старый 16.12.2007, 11:23
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
вообще-то у обычной атаки тип урона всегда NORMAL(резистится физикой)
Старый 16.12.2007, 11:36
Лось

offline
Опыт: 7,223
Активность:
Garret сказал что всем юнитам надо дать способность сферу льда, и при юнит дамагед проверять баф сферы льда если он есть значит дамаг атакой, если нету значит магией или триггерно.
Старый 16.12.2007, 11:37
Harakternyk

offline
Опыт: 2,703
Активность:
Garret, Лось, выглядит убедительно! Сейчас попробую. Только мне нужно иметь возможность определять не только магический тип атаки, поэтому я сделаю несколько спосбностей "сферы льда" - под каждый существующий тип атаки. Большое спасибо!

df Hunter, Toadcop, а со "struct"-ами я всё же попробую: в любом случае расширит мои возможности, или даже позволит решить мою задачу более изящно... Благодарю!
Старый 16.12.2007, 12:22
NETRAT

offline
Опыт: 83,712
Активность:
хм, базы данных и прочие извращения - это лишнее
Насколько я помню, в триггере, привязываемом к каждому юниту можно определять и тип атаки и тип ущерба, остается только создавать триггеры динамически и вешать на каждого юнита, которого следует учесть
почитай common.j
И это я здесь в жассе не пишу уже год, да?!
Старый 16.12.2007, 15:14
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
NETRAT

offline
Опыт: 83,712
Активность:
че то я про определение рейнджа ничего не прочитал в задаче
то есть создавать бд это не геморр?
Старый 16.12.2007, 19:31
Harakternyk

offline
Опыт: 2,703
Активность:
Toadcop, ты прав - сформулировал задчу правильно и этот код мне вроде (по первому взгляду...) подходит.
Если можно, то скинь мне ссылку на описание (или карту пример и т.п.) этой системы (если на английском, то не страшно) - легче будет разобраться...
В который раз спасибо, Toadcop!

NETRAT, есть функция UnitAddTypeBJ( whichType , whichUnit ) - она возвращает тип юнита, в том числе и из динамического тригера, но только она меняет тип самого этого юнита, а мне надо определить тип наносимого ущерба и атаки без изменения его характеристик. В числе же стандартных логических функций также проверяется только тип юнита. Поэтому я тему и создал... Просто так я бы не стал за помощью обращаться - у всех своих дел хватает...
Но за участие - спасибо!

Отредактировано Harakternyk, 17.12.2007 в 03:06.
Старый 16.12.2007, 20:21
Ответ

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

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

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

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



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