Добрый день. В карте планируется 160+ способностей. Какой оптимальный метод реализации триггеров заклинаний?
  1. Создать один глобальный триггер с событием каста заклинания и добавлять в качестве действий функции, выполняющие код каждой способности, а в этом коде сверять айди спелла.
  2. Создавать локальный триггер на каждую абилку, как это делают в спеллпаках.
Или, может, существует ещё какой-то метод получше? Язык Lua.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
4 года назад
0
Похожие вопросы:

ответ
Ну, перенеси всё это clawbfs.ucoz.ru/forum/3-2-1 и итемы и две игровые карты с кучей режимов и сотни шапок и т. д. + в 2 раза больше новых идей clawbfs.ucoz.ru/forum/7 clawbfs.ucoz.ru/forum/16-1571-1 clawbfs.ucoz.ru/forum/9 со всеми функциями варкрафта (а их там всё же не так уж и мало) в игру на юнити или ещё куда в один присест, сделай дело доброе.
Бтв, про сбор команды - для продвинутых сущностей нередко исправлять за другими оказывается тяжелее, чем делать самому, важно создать максимально комфортные условия для созидания, вот для чего деньги не лишние, а уж дело и самому можно делать.
И, да, тема-то не про то, надо это или не надо, а про то, как лучше это сделать, я про это и в стартовом сообщении написал.
Я на крайний сам вопрос по варианту 3 проверю и/или будет сделан выбор между третьим вариантом, вторым, каким-то ещё и отказом от Cooldown Reduction, но если кто поможет - спасибо.
ответ
то скорость разная, то вылетают не из героя а из какой то псевдо центральной точки
в общем я полностью добился желаемого результата, никакого прерывания, ни каких лагов и странных поведений (то что снаряды врезаются в трупы так и задумано =))
вот мой код
//! beginusercode

--какие то общие функции
function MoveX (x,  Dist,  Angle)
    return x+Dist*Cos(Angle*0.0175)
end
function MoveY (x,  Dist,  Angle)
    return x+Dist*Sin(Angle*0.0175)
end
function AbilityId(id)
    return id:byte(1) * 0x1000000 + id:byte(2) * 0x10000 + id:byte(3) * 0x100 + id:byte(4)
end

function Out(x,y)
    return ( ( GetRectMinX(bj_mapInitialPlayableArea) <= x ) and ( x <= GetRectMaxX(bj_mapInitialPlayableArea) ) and ( GetRectMinY(bj_mapInitialPlayableArea) <= y ) and ( y <= GetRectMaxY(bj_mapInitialPlayableArea) ) ) or IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY) == false
end

GetTerrainZ_location = Location(0, 0)
function GetTerrainZ(x,y)
    MoveLocation(GetTerrainZ_location, x, y);
    return GetLocationZ(GetTerrainZ_location);
end

function ehandler( err )
    print( "ERROR:", err )
end
--/////// глобалки (хотя какая разница где объявить то)
perebor=CreateGroup()

--/////// триггер

    local trigger = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
        TriggerRegisterPlayerUnitEvent(trigger, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT)
    end
    TriggerAddCondition(trigger, Condition(function() return
        GetOwningPlayer(GetTriggerUnit()) == Player(0)
    end))
local d=0
TriggerAddAction(trigger, function()
    local u=GetTriggerUnit()
    local z=GetTerrainZ(GetUnitX(u),GetUnitY(u))
        print("perodstart")
        TimerStart(CreateTimer(), 0.1, true, function()
        d=d+1

 --print("abiclick "..d)
 -- будущая фукция запуска снаряда
 local x=GetUnitX(u)
 local y=GetUnitY(u)
 local eff=AddSpecialEffect("Abilities\\Weapons\\DemolisherFireMissile\\DemolisherFireMissile.mdl", x, y)
 local d2=1000
 local a=GetUnitFacing(u)

 TimerStart(CreateTimer(), 0.032, true, function()
 d2=d2-10
 x=MoveX(x,25,a)
 y=MoveY(y,25,a)
 BlzSetSpecialEffectPosition(eff, x, y, GetTerrainZ(x,y)+30)
-- урон
local e=nil
GroupEnumUnitsInRange(perebor,x,y,80,null)
while true do
	e = FirstOfGroup(perebor)
	if e == nil then break end
if IsUnitEnemy(e, GetOwningPlayer(u)) then
    UnitDamageTarget( u, e, BlzGetUnitBaseDamage(u, 1), false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS )
   -- print("наносим урон")
    DestroyEffect(eff)
    eff=nill 
end

	GroupRemoveUnit(perebor,e)
end

--print(d2)

 if d2<=0 or  Out(x,y)==false or eff==nil then
  --  print("УМРИ!")
    DestroyEffect(eff)
    DestroyTimer(GetExpiredTimer())
 end

 end)

    end)
end)





//! endusercode
а вот и карта
Выражаю огромную благодарность NazarPunk, и Prog за оказанную помощь и наставления
Выводы:
Более навороченные (в техническом плане) способы не всегда самые оптимальные
Точно также можно двигать эффекты и на мемхаке, так что 126 пат так же может удостоится высокой производительностью для огромного количества снарядов
Мой комп держит на 1 экране около 700 объектов в режиме 60+ FPS (с отключенной вертикальной синхронизацией, это когда макс фпс за 200)

0
32
4 года назад
0
Принятый ответ
Этот комментарий удален
0
16
4 года назад
0
один триггер, вызывающий через ExecuteFunc строку-функцию, сохраненную для конкретного ID в таблице вида SpellData,SPELL_EFFECT,ID
0
24
4 года назад
0
один триггер, вызывающий через ExecuteFunc строку-функцию, сохраненную для конкретного ID в таблице вида SpellData,SPELL_EFFECT,ID
В вопросе четко указано - Lua. На луа можно хранить функции в ассоциативном массиве и даже передавать в них параметры при вызове - не нужен ExecuteFunc.
0
16
4 года назад
0
да на здоровье, чем бы дитя не тешилось, лишь бы было с кем играть в официалах)
0
24
4 года назад
0
DracoL1ch, как люди сидящие по своим причинам на классике протестуют против ответов основанных на функциях рефоржа, так и я протестую когда на вопрос, в котором четко указан язык реализации, дают устаревший ответ.
Этот комментарий удален
0
32
4 года назад
0
newuser, зачем тебе дота под рефордж? у д2 системные требования ниже чем у рефорджа
0
16
4 года назад
0
в смысле устаревший ответ? один триггер лучше, чем несколько, а то, что у тебя реализация теперь чутка по-другому не значит, что ответ неверный
рефоржеду никакая дота не светит)
0
24
4 года назад
0
DracoL1ch, ответ верный, но устаревший в контексте Lua. От такого ответа может быть больше вреда чем пользы, если кто-то прочитав его пойдет на луа использовать жассовую ExecuteFunc и строки. Если бы вопрос был по жассу - я бы и слова не сказал.
0
10
4 года назад
Отредактирован noyl
0
А если они будут не локальными это будет сильно не оптимизировано?
Допустим больше 160 обычных гуи спелов.
1
7
4 года назад
Отредактирован Morningstar
1
noyl:
А если они будут не локальными это будет сильно не оптимизировано?
Допустим больше 160 обычных гуи спелов.
Сделай в разных триггерах, распредели по папкам. Чтобы тебе самому удобнее было искать.
В конечном итоге все во время компиляции и сборки всё в один триггер превратится.
Если ты этим пытаешься как-то оптимизировать, то это плохая идея.
Читабельность и структурированность важнее для тебя как разработчика. Проще и быстрее ориентироваться.
Просто следи чтобы спеллы не были утечными и будет уже хорошо
К тому же, если ты планируешь конвертировать готовый код в jass чтобы сделать локалки, то это тоже даст тебе небольшое, но преимущество.
Этот комментарий удален
0
26
4 года назад
Отредактирован Extremator
0
noyl:
А если они будут не локальными это будет сильно не оптимизировано?
Допустим больше 160 обычных гуи спелов.
Ну раз уж ты говоришь "гуи спелов", то пойми, тебя призывают минимизировать количество объектов (таких как триггер и ивент). Что-то не понятно?
И суть не в методе написания, а в распределении ресурсов.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.