NazarPunk, Собственно говоря поэтому он и занимается вар3модмейкингом, потому что тут есть ГУИ, человек умеющий писать код, пойдёт делать свою игру на полноценном движке (Юнити/Анриал), скорее всего туда все и ушли, а тут или гуишники или отбитые фанатики, которые может никогда и не были программистами... и как же это всё печально =(
то скорость разная, то вылетают не из героя а из какой то псевдо центральной точки
в общем я полностью добился желаемого результата, никакого прерывания, ни каких лагов и странных поведений (то что снаряды врезаются в трупы так и задумано =))
вот мой код
//! 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)
Ну поэтому и протектит, чтобы наш труд и наше время, не достались кому либо, ещё раз чтоле скинуть наработку с выбором героя ? которая не фаталит и делает всё что нужно
//! 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 к вызовов, пока что проблем не обнаружено
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 накликал, и всё исчезло, перестало работать событие (проверял принтом)... всё событие уничтожается и более не существует =(
Ох, ну вот и руки дошли до проверки системы, да печально всё, но буду ковырять код и попробую перенести на отдельный таймер по снаряду.
А может кто напомнить, какой лимит поток, и какой лимит операций на потоке для 126? и на сколько всё улучшили в 131?
Ещё можно отображать сферами, на подобии жезла молний, где каждая сфера, например, поглощает 25/50/75/100/125 урона и количетво сфер равно 1*уровень способности. Когда сферы закончатся, щит спадает.
не понял про сфера, знаю ещё способ с продажей предмета которая показывает заряды, или же чё мы тупим то..
на 131 либо маленький фрейм квадратик с текстом, или сразу текст на абиле написать
текстаговские деления выглядят очень самобытно и отличаются от хп баров, но можно и бары, да что угодно, я просто для примера сказал
(опять таки текстаги не требуют импорта, можно просто кодом обыграть)
есть ещё вариант проще, делать врагов игроком 12, (Player(11), он же коричневый), за него будет полный опыт, но не забыть включить награду за убийство триггерно разумеется
» WarCraft 3 / Съехали описания способностей и заклинаний при переходе на 1.31
» WarCraft 3 / Присваивание способности по введённой строке в чат
Ред. Берги
» WarCraft 3 / Присваивание способности по введённой строке в чат
» WarCraft 3 / Самый производительный Bullet Hell
в общем я полностью добился желаемого результата, никакого прерывания, ни каких лагов и странных поведений (то что снаряды врезаются в трупы так и задумано =))
Выражаю огромную благодарность NazarPunk, и Prog за оказанную помощь и наставления
Выводы:
Более навороченные (в техническом плане) способы не всегда самые оптимальные
Точно также можно двигать эффекты и на мемхаке, так что 126 пат так же может удостоится высокой производительностью для огромного количества снарядов
Мой комп держит на 1 экране около 700 объектов в режиме 60+ FPS (с отключенной вертикальной синхронизацией, это когда макс фпс за 200)
» WarCraft 3 / Самый производительный Bullet Hell
NazarPunk:
Ред. Берги
» WarCraft 3 / Самый производительный Bullet Hell
кстати я не хочу наносить урон через фильтр, как мне наносить урон через
» WarCraft 3 / Краш карты
» WarCraft 3 / Самый производительный Bullet Hell
» WarCraft 3 / Проклятье Принца
ещё укажи версию/версии Варкрафт
» Защитники Хелерии / Обзор героя: Нострим - Магистр
» Защитники Хелерии / Обзор героя: Нострим - Магистр
Ред. Берги
» WarCraft 3 / Самый производительный Bullet Hell
» WarCraft 3 / Самый производительный Bullet Hell
100% не только таймер, вот вручную кастовал до 400 накликал, и всё исчезло, перестало работать событие (проверял принтом)... всё событие уничтожается и более не существует =(
» WarCraft 3 / Самый производительный Bullet Hell
» WarCraft 3 / Самый производительный Bullet Hell
А может кто напомнить, какой лимит поток, и какой лимит операций на потоке для 126? и на сколько всё улучшили в 131?
» WarCraft 3 / Заклинание: Волна Воды
» WarCraft 3 / Как удалить героя из выбора таверны
Удалить
Скрыть
» WarCraft 3 / Заклинание: Волна Воды
В точку => в случайное место => в точку ещё раз
» WarCraft 3 / Максимальная скорость атаки 400%
» WarCraft 3 / JASS фаербол
Качаешь VS code (инфа у меня в профиле)
Смотришь наработки NazarPunk, учишься по ним
» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь
» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь
на 131 либо маленький фрейм квадратик с текстом, или сразу текст на абиле написать
» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь
» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь
(опять таки текстаги не требуют импорта, можно просто кодом обыграть)
» WarCraft 3 / Опыт за юнитов