Простите за некропост, выражаю автору благодарочку за скилл. Переписал через хэш без триггерслипа, прилепил урон и вывел в одну функцию, заменил юнита на эффект (для UjPI)
Пример использования: call RocketStrike(caster, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", ammout, dmg, 50., 200., DAMAGE_TYPE_FIRE)
код
// проверка способности
function Trig_MilionGhost_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A026'
endfunction
//движение
function MilionGhostMove takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit GT = LoadUnitHandle(hash, h, 1)
local effect eff = LoadEffectHandle(hash, h, 2)
local real startx = LoadReal(hash, h, 3)
local real starty = LoadReal(hash, h, 4)
local real startz = LoadReal(hash, h, 5)
local real midx = LoadReal(hash, h, 6)
local real midy = LoadReal(hash, h, 7)
local real midz = LoadReal(hash, h, 8)
local real endx = LoadReal(hash, h, 9)
local real endy = LoadReal(hash, h, 10)
local real endz = LoadReal(hash, h, 11)
local real time = LoadReal(hash, h, 12)
local real maxTime = LoadReal(hash, h, 13)
local real x
local real y
local real z
local real dmg = LoadReal(hash, h, 14)
local real rng = LoadReal(hash, h, 15)
local group g
local unit un
local damagetype dmgtype = LoadDamageTypeHandle(hash, h, 16)
//-------------
set x = startx + ( ( 2.00 * ( midx - startx ) ) + ( startx - 2.00 * midx + endx ) * time ) * time
set y = starty + ( ( 2.00 * ( midy - starty ) ) + ( starty - 2.00 * midy + endy ) * time ) * time
set z = startz + ( ( 2.00 * ( midz - startz ) ) + ( startz - 2.00 * midz + endz ) * time ) * time
//-------------
call SetSpecialEffectX(eff, x)
call SetSpecialEffectY(eff, y)
call SetSpecialEffectZ(eff, z - GetAxisZ(x, y))
set time = time + 0.025 / maxTime
//-------------
if time >= 1.00 then
call DestroyEffect(eff)
call FlushChildHashtable(hash, h)
call DestroyTimer(t)
// наносим урон
//---------------------------
set g = CreateGroup()
call GroupEnumUnitsInRange(g, x, y, rng, null)
loop
set un = FirstOfGroup(g)
exitwhen un == null
if IsUnitEnemy(un, GetOwningPlayer(GT)) and not IsUnitType(un, UNIT_TYPE_DEAD) and not IsUnitType(un, UNIT_TYPE_STRUCTURE) then
call UnitDamageTarget(GT, un, dmg, true, false, ATTACK_TYPE_NORMAL, dmgtype, WEAPON_TYPE_WHOKNOWS)
//call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\ManaFlare\\ManaFlareBoltImpact.mdl", un , "orign"))
endif
call GroupRemoveUnit(g, un)
endloop
call DestroyGroup(g)
//----------------------------
else
call SaveReal(hash, h, 12, time)
endif
//-------------
set g = null
set un = null
set eff = null
set GT = null
set t = null
set dmgtype = null
endfunction
// создание эффектов
function MilionGhostCreate takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit GT = LoadUnitHandle(hash, h, 1)
local integer AmountRocket = LoadInteger(hash, h, 2)
local real x = LoadReal(hash, h, 3) // центр конечной области
local real y = LoadReal(hash, h, 4)// центр конечной области
local timer t1
local integer h1
local effect eff
local real xstart = GetUnitX(GT)
local real ystart = GetUnitY(GT)
local real zstart = GetAxisZ(xstart, ystart) + 50
local real xend //конечная точка способности
local real yend //конечная точка способности
local real zend //конечная точка способности
local real angle
local real distance
local real midx // средняя точка способности
local real midy // средняя точка способности
local real midz // средняя точка способности
local real time
local real maxtime
local real Scatter = LoadReal(hash, h, 8)
local damagetype dmgtype = LoadDamageTypeHandle(hash, h, 9)
//-------------
if AmountRocket > 0 then
call SaveInteger(hash, h, 2, AmountRocket-1)
set t1 = CreateTimer()
set h1 = GetHandleId(t1)
//---------
set eff = AddSpecialEffect(LoadStr(hash, h, 5), xstart, ystart)
call SetSpecialEffectZ(eff, zstart)
//высчитываем начало и конец
set xend = x + GetRandomReal( -Scatter, Scatter ) * Cos( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
set yend = y + GetRandomReal( -Scatter, Scatter ) * Sin( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
set zend = GetAxisZ(xend, yend)
set angle = Atan2( yend - ystart, xend - xstart )
set distance = SquareRoot( ( xend - xstart ) * ( xend - xstart ) + ( yend - ystart ) * ( yend - ystart ) )
//высчитываем середину
set midx = xstart + ( distance / 2 ) * Cos( angle + GetRandomReal( -90.00, 90.00 ) * bj_DEGTORAD )
set midy = ystart + ( distance / 2 ) * Sin( angle + GetRandomReal( -90.00, 90.00 ) * bj_DEGTORAD )
set midz = GetAxisZ( midx, midy )
// проверка на высоты
if zstart < zend then
set midz = midz + zend
else
set midz = midz + zstart
endif
set midz = midz + distance
// время
set time = 0
set maxtime = distance * ( 0.025 / 10.00 )
// всё сохраняем
call SaveUnitHandle(hash, h1, 1, GT)
call SaveEffectHandle(hash, h1, 2, eff)
call SaveReal(hash, h1, 3, xstart)
call SaveReal(hash, h1, 4, ystart)
call SaveReal(hash, h1, 5, zstart)
call SaveReal(hash, h1, 6, midx)
call SaveReal(hash, h1, 7, midy)
call SaveReal(hash, h1, 8, midz)
call SaveReal(hash, h1, 9, xend)
call SaveReal(hash, h1, 10, yend)
call SaveReal(hash, h1, 11, zend)
call SaveReal(hash, h1, 12, time)
call SaveReal(hash, h1, 13, maxtime)
call SaveReal(hash, h1, 14, LoadReal(hash, h, 6))
call SaveReal(hash, h1, 15, LoadReal(hash, h, 7))
call SaveDamageTypeHandle(hash, h1, 16, dmgtype)
//стартуем
call TimerStart( t1, 0.025, true, function MilionGhostMove )
//---------
else
call FlushChildHashtable(hash, h)
call DestroyTimer(t)
endif
//-------------
set eff = null
set t1 = null
set GT = null
set t = null
set dmgtype = null
endfunction
// функция ракетной атаки
function RocketStrike takes unit GT, real x, real y, string RocketEff, integer AmountRocket, real RocketDmg, real RocketScatter1, real RocketScatterMax, damagetype dmgtype returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(t)
//-------------------
call SaveUnitHandle(hash, h, 1,GT)
call SaveInteger(hash, h, 2, AmountRocket)
call SaveReal(hash, h, 3, x)
call SaveReal(hash, h, 4, y)
call SaveStr(hash, h, 5, RocketEff)
call SaveReal(hash, h, 6, RocketDmg)
call SaveReal(hash, h, 7, RocketScatter1)
call SaveReal(hash, h, 8, RocketScatterMax)
call SaveDamageTypeHandle(hash, h, 9, dmgtype)
call TimerStart(t, 0.1, true, function MilionGhostCreate)
//-------------------
set t = null
endfunction
// основная функция
function Trig_MilionGhost_Actions takes nothing returns nothing
local unit GT = GetTriggerUnit()
local real x = GetSpellTargetX( )
local real y = GetSpellTargetY( )
local real dmg = 50.
local integer kol = 10
//-------------
call RocketStrike(GT, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", kol, dmg, 50., 200., DAMAGE_TYPE_FIRE)
//-------------
set GT = null
endfunction
//===========================================================================
function InitTrig_MilionGhost takes nothing returns nothing
set gg_trg_MilionGhost = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_MilionGhost, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_MilionGhost, Condition( function Trig_MilionGhost_Conditions ) )
call TriggerAddAction( gg_trg_MilionGhost, function Trig_MilionGhost_Actions )
endfunction
Как раз эта карта в Китае популярна. Есть, кстати, ещё хуже по заполнению экрана в том числе рекламой.
Про китайские карты не надо. У них есть возможно полностью менять интерфейс. Но во всех популярных картах они его всегда оставляют или делают околодефолтный. Не просто так же да?
Не знаю ни про какие модификаторы. У меня обычая версия 1.27. Один единственный раз запустилась данная карта, пока разглядывал её и она просто испарилась, отрубилась и т.д. При попытке запуска, строка загрузки грузится и как доходит до конца - игра вылетает. Такое повторяется бесконечное количество раз.
Установи чистую версию варкрафта без модификаторов. Версия 1.27 с iCCup тоже не поддерживает эту карту. Когда у одного не работает, а у остальных работает, обычно проблема именно в том, у кого не работает.
Делать TimerStart для локального игрока нельзя.
Делать TriggerSleepAction для локального игрока тоже нельзя.
Получается запустить таймер нужно для всех, чего я сделать не могу, потому что функция BlaBlaFunction выполняется для локалплеера. Следовательно мне нужно запустить таймер из предыдущей функции, которая и вызывает BlaBlaFunction, чего я сделать не могу по тех причинам. goodlyhero:
Альтернативно 2 - сделать слип у всех игроков, но вывести только у нужного через проверку условия.
Практически нереально, потому что основная функция вызывается путем клика мышки игрока по кнопке, сделанной с помощью МХ и никак не синхронизируется с другими игроками, и я не смогу вызывать таймер для всех
Но у меня кажется появилась идея: засинхронить нажатие кнопки для всех игроков, соответственно можно выполнять функцию для всех игроков с итогами только для одного.
Кстати, спавн одновременный делать на всех бараках лучше не надо. В сурве не зря разный спавн по времени, это сильно разгружает проц в эту секунду и убирает пролаг во время спавна.
Пока у тебя 4 расы, пролаг создания не чувствуется, а вот когда будет 8, это уже сильно будет заметно.
Вообще хотелось бы уточнить, чем именно карта отличается от сурва? я пока вижу тоже самое, с другими моделями. Хотя нет, даже модели повторяются.
Не согласен. Ужапи должен стать стандартным инструментом для любого жанра карт. Он невероятно удобен и многократно ускоряет процесс разработки "технодемки". Мало того, дак вы, как я понимаю, предлагаете мне не пользоваться благами лаунчера и делать свою собственную систему снарядов, их отлов и ещё 1000000-е уровневые способности для поднятия уровня здоровья и защиты? >.<
Нет, я предлагаю делать более "взрослые" механики, а не "увеличение радиуса полёта снаряда" в стандартной ТД. Можете посмотреть на какую нибудь китайскую ТД и взять пару механик на вооружение.
что она какая-то насыщенная тонной комплексного контента. Юзеру нужно простое рубилово, а не карта, которую надо заучивать в несколько траев)
Игра максимальна дружелюбна к новичкам. Тут есть автосборка рекомендуемых предметов и автопрокачка рекомендуемых способностей.
А сборка артефактов сделана в одном магазине и даже стрелочками показано, что нужно покупать.
Да, действительно, я сделал в карте много фишек, срытых возможностей, квестов. Но для 1-ой игры на самом просто уровне сложности, это все не требуется.
Konstantin19, тогда не совсем понятно, почему мне при загрузке карты упорно пишут "Игрок Блабланейм — 0 exp". Вряд ли это из-за игры с ботами, в предыдущих версиях опыт за это вполне себе шёл.
Опыт идет и в соло игре тоже, сохраняется через "-save" а так же сам, после выигрыша/проигрыша. А по поводу EXP - 0 - два вараинта, либо ник слишком длинный и содержит большое количество разнообразных и запрещенных символов типа ][, либо он на кириллице. Привязка опыта идет по нику в том числе, и код не может его зашифровать адекватно, а по этому адекватно сохранить тоже не может.
Прецеденты уже были, у игрока был ник типа !!000000JI00\|/er000!!!, после смены ника на более адекватный, всё стало сохраняться.
Если после смены ника ситуация неизмениться, то я бы попросил более подробное описание проблемы и какие выполняются действия, потому что жалоб на новую систему опыта не поступало, да и много тестил на Ирине не с одним человеком.
Вспомнил ещё 1 баг, есть, он появляется только на Ирине. Опыт не загружается онлайн игре, если играть через бота одному. Это чтото связанное исключительно с Ириной.
А можно поподробнее насчёт того, что там нового в системе опыта игрока?
Нового ничего, система опыта была с версии 2.15, просто обновил синхронизацию опыта, она теперь точнее и быстрее работает и не вызывает десинк в редких случаях, как это делала предыдущая
» WarCraft 3 / Elemental Mark Ver:2.00
» XGM Team / Обновление способностей 2024
» Блог им. rsfghd / движение по безье
Пример использования: call RocketStrike(caster, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", ammout, dmg, 50., 200., DAMAGE_TYPE_FIRE)
» WarCraft 3 / [JASS] AOE Благодать
Отредактирован Konstantin19
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление AOW 2.18b: Heroes Survival
Фониус Персон:
БДО и ВОВ:
Про китайские карты не надо. У них есть возможно полностью менять интерфейс. Но во всех популярных картах они его всегда оставляют или делают околодефолтный. Не просто так же да?
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление AOW 2.18b: Heroes Survival
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление AOW 2.18b: Heroes Survival
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление AOW 2.18b: Heroes Survival
Отредактирован Konstantin19
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление AOW 2.18b: Heroes Survival
Отредактирован Konstantin19
» WarCraft 3 / Задержка в функции, которая выполняется для локального игрока
goodlyhero:
Отредактирован Konstantin19
» WarCraft 3 / Battle for Azeroth
Пока у тебя 4 расы, пролаг создания не чувствуется, а вот когда будет 8, это уже сильно будет заметно.
» XGM Конкурсы / Весеннее обострение [Событие на весь март]
» WarCraft 3 / Duodecimal TD
Отредактирован Konstantin19
» WarCraft 3 / Duodecimal TD
Вот как я развлекаюсь в UjAPI
» WarCraft 3 / Knife Battle TD Abyss Challenge
» WarCraft 3 / No Brain Autocast Svinodefence
» XGM Team / XGM - Премия 2022 года - Объявление победителей!
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление Arena of War 2.17
А сборка артефактов сделана в одном магазине и даже стрелочками показано, что нужно покупать.
Да, действительно, я сделал в карте много фишек, срытых возможностей, квестов. Но для 1-ой игры на самом просто уровне сложности, это все не требуется.
Отредактирован Konstantin19
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление Arena of War 2.17
Прецеденты уже были, у игрока был ник типа !!000000JI00\|/er000!!!, после смены ника на более адекватный, всё стало сохраняться.
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление Arena of War 2.17
» WarCraft 3 / Эмочка любви
Отредактирован Konstantin19
» WarCraft 3 / JNGP: Rebuild от PT153
» Legend of Worlds / UFS ARENA DARO
Отредактирован Konstantin19
» WarCraft 3 / Yoruichi Shihoin Light Form
» Arena of War 2: Hero Survival (собери героя мечты) / Обновление Arena of War 2.16