function Out takes real x, real y returns boolean
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
endfunction
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 либо маленький фрейм квадратик с текстом, или сразу текст на абиле написать
текстаговские деления выглядят очень самобытно и отличаются от хп баров, но можно и бары, да что угодно, я просто для примера сказал
(опять таки текстаги не требуют импорта, можно просто кодом обыграть)
Ред. Берги
» WarCraft 3 / Краш из-за Границ Карты
Вот на jass
» 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 либо маленький фрейм квадратик с текстом, или сразу текст на абиле написать
» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь
» Защитники Хелерии / Обзор героя: Трейм - Повелитель Бурь
(опять таки текстаги не требуют импорта, можно просто кодом обыграть)