Centyrion, я ж написал, не использовать событие "юнит атакован"
Условие на предмет сделано верно, если там есть способность, можно проверять на "уровень способности сокрушение >= 1"
Очень неудобно голосовать:
перейти на 1 страницу, вспомнить какой участник мне нравился, прокрутит всех в голове, некоторые пикчи увеличить, покрутить ещё раз...
АЖ ЦЕЛЫХ 40 секунд потратил!
yblidok, ну вот ты и показал себя во всех красе, советую для начала просто, посидеть на форуме и ознакомится недельки 3, параллельно ковыряя редактор, на сайте есть ответ почти на любой вопрос, и почти все, о чем ты мог подумать уже поднималось и обсуждалось, поиграй в хорошие карты, и пооткрывай карты карты Близзард, они на гуи
yblidok, а можно некоторые личные данные о тебе узнать:?
возраст
род занятий
владение языками (програмирования, мб хоть бейсик же был в школе?)
От этих параметров будет зависит уровень подхода к тебе, уверен ли ты, что хочешь заняться картостроением на игре которая возможно старше тебя? А если это не так, то где ты раньше был???
Почему тебя вообще это привлекло? увидев ГУИ триггеры и кучу классных карт у тебя появилось желание делать свои? Какова мотивация твоя? стать картостроителем в 2019+ году?
Если даже по 1 дать каждому пользователю XGM (я не говорю про "каждому члену гильдии"), то всё равно останутся свободные.
Это будет назначать ваш Гильдмастер? или пользователь должен сам выбрать кто он?
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 к вызовов, пока что проблем не обнаружено
» WarCraft 3 / Create your Kingdom
Хотя в этой очень симпотичный ландшафт на скринах
» WarCraft 3 / Проверка способности Сокрушение
Условие на предмет сделано верно, если там есть способность, можно проверять на "уровень способности сокрушение >= 1"
» WarCraft 3 / Проверка способности Сокрушение
» Администрация XGM / Добавьте возможность менять оценку
» XGM Конкурсы / Конкурс ландшафтеров - Уютное Средиземье
перейти на 1 страницу, вспомнить какой участник мне нравился, прокрутит всех в голове, некоторые пикчи увеличить, покрутить ещё раз...
АЖ ЦЕЛЫХ 40 секунд потратил!
» Гильдия «Черамор» / Бестиарий XGM
» WarCraft 3 / помогите изучить картостроение
Ред. Берги
» WarCraft 3 / помогите изучить картостроение
- возраст
- род занятий
- владение языками (програмирования, мб хоть бейсик же был в школе?)
От этих параметров будет зависит уровень подхода к тебе, уверен ли ты, что хочешь заняться картостроением на игре которая возможно старше тебя? А если это не так, то где ты раньше был???Почему тебя вообще это привлекло? увидев ГУИ триггеры и кучу классных карт у тебя появилось желание делать свои? Какова мотивация твоя? стать картостроителем в 2019+ году?
» Гильдия «Черамор» / Бестиарий XGM
» Гильдия «Черамор» / Бестиарий XGM
Ред. Берги
» Блог им. Hatsume_Hate / Заклинания на заказ для Warcraft 3 (Платные)
» Гильдия «Черамор» / Бестиарий XGM
Это будет назначать ваш Гильдмастер? или пользователь должен сам выбрать кто он?
» Гильдия «Черамор» / Бестиарий XGM
» WarCraft 3 / Краш из-за Границ Карты
Ред. Берги
» 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 / Проклятье Принца
ещё укажи версию/версии Варкрафт
» Защитники Хелерии / Обзор героя: Нострим - Магистр