33

» WarCraft 3 / Присваивание способности по введённой строке в чат

ты как раз таки хороший программист, исходя из моего уровня знаний о программистах, но если ты здесь, то ты больше фанат варкрафта
33

» WarCraft 3 / Присваивание способности по введённой строке в чат

NazarPunk, Собственно говоря поэтому он и занимается вар3модмейкингом, потому что тут есть ГУИ, человек умеющий писать код, пойдёт делать свою игру на полноценном движке (Юнити/Анриал), скорее всего туда все и ушли, а тут или гуишники или отбитые фанатики, которые может никогда и не были программистами... и как же это всё печально =(
33

» WarCraft 3 / Самый производительный Bullet Hell

Принятый ответ
то скорость разная, то вылетают не из героя а из какой то псевдо центральной точки
в общем я полностью добился желаемого результата, никакого прерывания, ни каких лагов и странных поведений (то что снаряды врезаются в трупы так и задумано =))
вот мой код
//! 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)
Загруженные файлы
33

» WarCraft 3 / Самый производительный Bullet Hell

NazarPunk, угар, я понял тебя =) не в ту функцию угол поворота передал
NazarPunk:
local e
while true do
e = FirstOfGroup(perebor)
if e == nil then breal end
--наносим урон
GroupRemoveUnit(perebor,e)
end
спасибо, щас попробую
33

» WarCraft 3 / Самый производительный Bullet Hell

NazarPunk, ничего не происходит, проверь работоспособность
кстати я не хочу наносить урон через фильтр, как мне наносить урон через
call GroupEnumUnitsInRange(perebor,x,y,80,null)
loop  
set e=FirstOfGroup(perebor)
exitwhen e==null 

//наносим урон

call GroupRemoveUnit(perebor,e)
endloop
а каонкретно перевести это на цикл for ЛУА
33

» WarCraft 3 / Краш карты

Ну поэтому и протектит, чтобы наш труд и наше время, не достались кому либо, ещё раз чтоле скинуть наработку с выбором героя ? которая не фаталит и делает всё что нужно
33

» WarCraft 3 / Самый производительный Bullet Hell

Пока что двигаюсь в правильном направлении
раскрыть
//! 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

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

    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)
--print(d2)

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

 end)

    end)
end)





//! endusercode
новый таймер на движение каждого снаряда, тестировал до 50 к вызовов, пока что проблем не обнаружено
33

» Защитники Хелерии / Обзор героя: Нострим - Магистр

также снижая сопротивляемость задетых врагов на 10 / 14 / 18 / 22 / 26% , а что такое сопротивляемость? магическое сопротивление?
33

» WarCraft 3 / Самый производительный Bullet Hell

Вот, потыкай раз 300 на Q и увидишь, что падает не таймер, а событие EVENT_PLAYER_UNIT_SPELL_EFFECT
Загруженные файлы
33

» WarCraft 3 / Самый производительный Bullet Hell

NazarPunk, Проверил, переделал на ручной каст (но движение на 1 таймере), и получается что блок создания эффекта даже перестаёт работать, полный игнор события и вот этого блока кода
    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))
    TriggerAddAction(trigger, function()
        local caster = GetTriggerUnit()
        local x
        local y
        local angle
        --UnitRemoveAbility(caster, GetSpellAbilityId())

        x = GetUnitX(caster)
        y = GetUnitY(caster)
        angle = Deg2Rad(GetUnitFacing(caster))

        table.insert(BULLETS, {
            effect = AddSpecialEffect('units\\nightelf\\Wisp\\Wisp.mdl', x, y),
            caster = caster,
            x = x,
            y = y,
            angle = angle,
            cos = Cos(angle),
            sin = Sin(angle)
        })

    end)
когда падает таймер, то эффекты продолжают создаваться под ногами героя
100% не только таймер, вот вручную кастовал до 400 накликал, и всё исчезло, перестало работать событие (проверял принтом)... всё событие уничтожается и более не существует =(
33

» WarCraft 3 / Самый производительный Bullet Hell

NazarPunk, а если учесть, что время почти всегда случайное, когда умирает не может ли сборщик мусора косячить и сгребать таймер на помойку?
33

» WarCraft 3 / Самый производительный Bullet Hell

Ох, ну вот и руки дошли до проверки системы, да печально всё, но буду ковырять код и попробую перенести на отдельный таймер по снаряду.
А может кто напомнить, какой лимит поток, и какой лимит операций на потоке для 126? и на сколько всё улучшили в 131?
33

» WarCraft 3 / Заклинание: Волна Воды

тогда нужно описание что летит рандомно, но это как-то ужасно..
В точку => в случайное место => в точку ещё раз
33

» WarCraft 3 / Максимальная скорость атаки 400%

Принятый ответ
На мемхаке можно через понижение BAT, делалось одной строкой, в 131 ждём SetUserField, должно давать тот же самый эффект
33

» WarCraft 3 / JASS фаербол

Roflan, переходи сразу на луа, пока ещё Jass не затуманил тебе мозг своей кривостью (как мне),
а как перейти?
Качаешь 131 PTR
Качаешь VS code (инфа у меня в профиле)
Смотришь наработки NazarPunk, учишься по ним
33

» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь

Ещё можно отображать сферами, на подобии жезла молний, где каждая сфера, например, поглощает 25/50/75/100/125 урона и количетво сфер равно 1*уровень способности. Когда сферы закончатся, щит спадает.
не понял про сфера, знаю ещё способ с продажей предмета которая показывает заряды, или же чё мы тупим то..
на 131 либо маленький фрейм квадратик с текстом, или сразу текст на абиле написать
33

» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь

в идеале заряды на активной абилке = хп щита, хорошая тема, но я про такое знаю только на мемхаке =(
33

» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь

текстаговские деления выглядят очень самобытно и отличаются от хп баров, но можно и бары, да что угодно, я просто для примера сказал
(опять таки текстаги не требуют импорта, можно просто кодом обыграть)
33

» WarCraft 3 / Опыт за юнитов

есть ещё вариант проще, делать врагов игроком 12, (Player(11), он же коричневый), за него будет полный опыт, но не забыть включить награду за убийство триггерно разумеется