Rikimaru из DotA 6.83d

» опубликован
» Способ реализации: Jass
» Тип: Способность
» Версия Warcraft: 1.26+
Rikimaru со всеми способностями
» Custom Script
function Error takes player p, string s returns nothing
    local sound snd = CreateSoundFromLabel("InterfaceError", false, false, false, 10, 10)
    if( GetLocalPlayer() == p )then
        if(s != "") and (s != null)then
            call ClearTextMessages()
            call DisplayTimedTextToPlayer(p, 0.50, -1.00, 2.00, "|cffffcc00"+s+"|r")
        endif
        call StartSound(snd)
    endif
    call KillSoundWhenDone(snd)
endfunction
function AddAbility takes unit u, integer i returns nothing
    call UnitAddAbility(u, i)
    call UnitMakeAbilityPermanent(u, true, i)
endfunction
» Smoke Screen
function Trig_Smoke_Screen_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local real x = GetSpellTargetX()
    local real y = GetSpellTargetY()
    local unit dummy = CreateUnit(GetOwningPlayer(u), 'e003', x, y, 0)
    local integer level = GetUnitAbilityLevel(u, 'A0RG')
    local real size = (83+17*level)*0.01
    call SetUnitVertexColor(dummy, 255, 255, 255, 150)
    call UnitApplyTimedLife(dummy, 'BTLF', 6)
    call SetUnitScale(dummy, size, size, size)
    call AddAbility(dummy, 'A0E7')
    call SetUnitAbilityLevel(dummy, 'A0E7', level)
    call IssuePointOrder(dummy, "cloudoffog", x, y)
    set u = null
    set dummy = null
endfunction
function Trig_Smoke_Screen_Conditions takes nothing returns boolean
    if GetSpellAbilityId() == 'A0RG' then
        call Trig_Smoke_Screen_Actions()
    endif
    return false
endfunction

//===========================================================================
function InitTrig_Smoke_Screen takes nothing returns nothing
    set gg_trg_Smoke_Screen = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Smoke_Screen, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_Smoke_Screen, Condition(function Trig_Smoke_Screen_Conditions))
endfunction
» Permanent Invisibility
function Trig_Permanent_Invisibility_Regeneration takes nothing returns boolean
    local trigger trg = GetTriggeringTrigger()
    local integer trgH = GetHandleId(trg)
    local unit u = LoadUnitHandle(udg_hashtable, trgH, 2)
    local integer level = GetUnitAbilityLevel(u, 'A00J')
    local real r = (level+3)/4
    if TimerGetElapsed(udg_dotaTimer) > (10-2*level)+udg_InvisibilityTime then
        call SetUnitState(u, UNIT_STATE_LIFE, GetUnitState(u, UNIT_STATE_LIFE)+r)
    endif
    set trg = null
    set u = null
    return false
endfunction
function Trig_Permanent_Invisibility_Actions takes nothing returns boolean
    local unit attacker = GetAttacker()
    local integer level = GetUnitAbilityLevel(attacker, 'A00J')
    if level > 0 then
        set udg_InvisibilityTime = TimerGetElapsed(udg_dotaTimer)
        call UnitRemoveAbility(attacker, udg_InvisibilityLevel[level])
        call UnitRemoveAbility(attacker, 'A00J')
        call AddAbility(attacker, udg_InvisibilityLevel[level])
        call AddAbility(attacker, 'A00J')
        call SetUnitAbilityLevel(attacker, 'A00J', level)
    endif
    set attacker = null
    return false
endfunction
function Trig_Permanent_Invisibility_Learn_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local integer level = GetUnitAbilityLevel(u,'A00J')
    local trigger trg
    local integer trgH
    if level == 1 then
        set trg = CreateTrigger()
        set trgH = GetHandleId(trg)
        call TriggerRegisterTimerEvent(trg, 0.25, true)
        call TriggerAddCondition(trg, Condition(function Trig_Permanent_Invisibility_Regeneration))
        call SaveUnitHandle(udg_hashtable, trgH, 2, u)
        set trg = null
    endif
    if GetUnitAbilityLevel(u, 'A0MB') == 0 then
        call AddAbility(u, 'A0MB')
    endif
    if level == 2 then
        call UnitRemoveAbility(u, udg_InvisibilityLevel[1])
    elseif level == 3 then
        call UnitRemoveAbility(u, udg_InvisibilityLevel[1])
        call UnitRemoveAbility(u, udg_InvisibilityLevel[2])
    elseif level == 4 then
        call UnitRemoveAbility(u, udg_InvisibilityLevel[1])
        call UnitRemoveAbility(u, udg_InvisibilityLevel[2])
        call UnitRemoveAbility(u, udg_InvisibilityLevel[3])
    endif
    call SetUnitAbilityLevel(u, 'A0MB', level)
    call AddAbility(u, udg_InvisibilityLevel[level])
    set u = null
endfunction
function Trig_Permanent_Invisibility_Learn_Conditions takes nothing returns boolean
    if GetLearnedSkill() == 'A00J' and IsUnitIllusion(GetTriggerUnit()) == false then
        call Trig_Permanent_Invisibility_Learn_Actions()
    endif
    return false
endfunction

//===========================================================================
function InitTrig_Permanent_Invisibility takes nothing returns nothing
    local trigger trg = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_HERO_SKILL)
    call TriggerAddCondition(trg, Condition(function Trig_Permanent_Invisibility_Learn_Conditions))
    set trg = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_ATTACKED)
    call TriggerAddCondition(trg, Condition(function Trig_Permanent_Invisibility_Actions))
    set trg = null
endfunction
» Backstab
function Trig_Backstab_Actions takes nothing returns nothing
    local unit attacker = GetAttacker()
    local unit u = GetTriggerUnit()
    local integer level = GetUnitAbilityLevel(attacker,'A0DZ')
    local boolean b = LoadBoolean(udg_hashtable, GetHandleId(attacker), 332)
    local real r = RAbsBJ(GetUnitFacing(u)-GetUnitFacing(attacker))
    if r > 180 then
        set r = 360-r
    endif
    if r <= 105 or b then
        call BJDebugMsg(R2S(r))
        call SaveBoolean(udg_hashtable, GetHandleId(attacker), 332, false)
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.​mdl", u, "chest"))
        call UnitDamageTarget(attacker, u, GetHeroAgi(attacker, true)*(0.25*level+0.25), true, true, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    endif
    set attacker = null
    set u = null
endfunction
function Trig_Backstab_Conditions takes nothing returns boolean
    if GetUnitAbilityLevel(GetAttacker(), 'A0DZ') > 0 and IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == false then
        if IsUnitAlly(GetTriggerUnit(), GetOwningPlayer(GetAttacker())) == false or (IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == false and GetUnitState(GetTriggerUnit(), UNIT_STATE_LIFE)/GetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_LIFE) < 0.5) then
            call Trig_Backstab_Actions()
        endif
    endif
return false
endfunction

//===========================================================================
function InitTrig_Backstab takes nothing returns nothing
    set gg_trg_Backstab = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Backstab, EVENT_PLAYER_UNIT_ATTACKED)
    call TriggerAddCondition(gg_trg_Backstab, Condition(function Trig_Backstab_Conditions))
endfunction
» Blink Strike
function Trig_Blink_Strike_IsAbilityBlink takes integer i returns boolean
    return i == 'A2YZ' or i == 'A2YW' or i == 'A2YV' or i == 'A2YY' or i == 'A2YX' or i == 'A2Z0' or i == 'A2ZL'
endfunction
function Trig_Blink_Strike_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit target = GetSpellTargetUnit()
    local real damage = 10+30*GetUnitAbilityLevel(u, 'A0K9')
    local real x = GetUnitX(target)-75*Cos(GetUnitFacing(target)*bj_DEGTORAD)
    local real y = GetUnitY(target)-75*Sin(GetUnitFacing(target)*bj_DEGTORAD)
    local integer charges = LoadInteger(udg_hashtable, GetHandleId(u), 828)
    if charges > 0 then
        call SetUnitX(u, x)
        call SetUnitY(u, y)
        call SetUnitFacing(u, GetUnitFacing(target))
        call DestroyEffect(AddSpecialEffect("war3mapImported\\BlinkStrike.mdx", x, y))
        if IsUnitEnemy(target, GetOwningPlayer(u)) then
            call UnitDamageTarget(u, target, damage, true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS )
            call SaveBoolean(udg_hashtable, GetHandleId(u), 332, true)
            call IssueTargetOrder(u, "attack", target)
        endif
        call UnitRemoveAbility(u, udg_Charges[charges])
        set charges = charges-1
        call SaveInteger(udg_hashtable, GetHandleId(u), 828, charges)
        call AddAbility(u, udg_Charges[charges])
    else
        call Error(GetOwningPlayer(GetTriggerUnit()), "No more charges")
    endif
    set u = null
    set target = null
endfunction
function Trig_Blink_Strike_Conditions takes nothing returns boolean
    if Trig_Blink_Strike_IsAbilityBlink(GetSpellAbilityId()) then
        call Trig_Blink_Strike_Actions()
    endif
    return false
endfunction
function Trig_Blink_Strike_Blink takes nothing returns boolean
    if Trig_Blink_Strike_IsAbilityBlink(GetSpellAbilityId()) then
        call DestroyEffect(AddSpecialEffect("war3mapImported\\BlinkStrike.mdx", GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit())))
    endif
    return false
endfunction

function Trig_Blink_Strike_Restore_Charges takes nothing returns boolean
    local trigger trg = GetTriggeringTrigger()
    local integer trgH = GetHandleId(trg)
    local unit u = LoadUnitHandle(udg_hashtable, trgH, 2)
    local integer charges = LoadInteger(udg_hashtable, GetHandleId(u), 828)
    local integer time = LoadInteger(udg_hashtable, trgH, 34)
    local integer maxCharges = 3+GetUnitAbilityLevel(u, 'A0K9')
    if charges < maxCharges then
        set time = time-1
        call SaveInteger(udg_hashtable, trgH, 34, time)
        if time == 0 then
            call UnitRemoveAbility(u, udg_Charges[charges])
            set time = 35
            call SaveInteger(udg_hashtable, trgH, 34, time)
            set charges = charges+1
            call SaveInteger(udg_hashtable, GetHandleId(u), 828, charges)
            call AddAbility(u, udg_Charges[charges])
        endif
    endif
    set trg = null
    set u = null
    return false
endfunction
function Trig_Blink_Strike_Learn_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local trigger trg = CreateTrigger()
    local integer i = GetHandleId(trg)
    call SaveInteger(udg_hashtable, GetHandleId(u), 828, 4)
    call AddAbility(u, udg_Charges[4])
    call TriggerRegisterTimerEvent(trg, 1, true)
    call TriggerAddCondition(trg, Condition(function Trig_Blink_Strike_Restore_Charges))
    call SaveUnitHandle(udg_hashtable, i, 2, u)
    call SaveInteger(udg_hashtable, i, 34, 35)
    set u = null
    set trg = null
endfunction
function Trig_Blink_Strike_Learn_Conditions takes nothing returns boolean
    if GetLearnedSkill() == 'A0K9' and IsUnitIllusion(GetTriggerUnit()) == false then
        if GetUnitAbilityLevel(GetTriggerUnit(), 'A0K9') == 1 then
            call Trig_Blink_Strike_Learn_Actions()
        endif
    endif
    return false
endfunction

//===========================================================================
function InitTrig_Blink_Strike takes nothing returns nothing
    local trigger trg = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(trg, Condition(function Trig_Blink_Strike_Conditions))
    set trg = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_SPELL_CAST)
    call TriggerAddCondition(trg, Condition(function Trig_Blink_Strike_Blink))
    set trg = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_HERO_SKILL)
    call TriggerAddCondition(trg, Condition(function Trig_Blink_Strike_Learn_Conditions))
    set trg = null
endfunction
» InitRikimaru
function InitTrig_InitRikimaru takes nothing returns nothing
    set udg_InvisibilityLevel[1] = 'A2UR'
    set udg_InvisibilityLevel[2] = 'A2US'
    set udg_InvisibilityLevel[3] = 'A2UT'
    set udg_InvisibilityLevel[4] = 'A2YU'
    set udg_Charges[0] = 'A2YZ'
    set udg_Charges[1] = 'A2YW'
    set udg_Charges[2] = 'A2YV'
    set udg_Charges[3] = 'A2YY'
    set udg_Charges[4] = 'A2YX'
    set udg_Charges[5] = 'A2Z0'
    set udg_Charges[6] = 'A2ZL'
    set udg_hashtable = InitHashtable()
    call TimerStart(udg_dotaTimer, 999999.00, false, null)
endfunction


Просмотров: 810

NazarPunk #1 - 6 месяцев назад 0
Blink Strike не выводит из инвиза, и это можно абузить.
прикреплены файлы
Hodor #2 - 6 месяцев назад 0
NazarPunk, вроде и не должен, я исходный код не менял
мб попозже посмотрю как айкап делал рики в 6.83s/6.85
NazarPunk #3 - 6 месяцев назад 0
вроде и не должен
По идее должен атаковать call IssueTargetOrder(u, "attack", target), а атака выводит из инвиза. Но если кликать, то атака не произойдёт и урон нанесётся из инвиза.
я исходный код не менял
Исходный код не верх совершенства))
Bergi_Bear #4 - 6 месяцев назад 0
Может Рики варс, где гужно будет воровать фрукты из сада в крысу, и разумеется извратится над каждой способностью, дав по 6 аганимов на абилку
Hodor #5 - 6 месяцев назад 0
Bergi_Bear, я хотел сделать баратрум варс и ещё как бонус буги-вуги в его же исполнении

но рики как разминка был, надо собраться и начать восстанавливать код для инвокера

а вообще, хочу каких нибудь новых героев сделать для д1, особенно monkey king
quq_CCCP #6 - 6 месяцев назад 0
UrsaBoss, я вот раньше думал ради фана - сделать Skeleton King wars (эпическая битва однокнопочных), посмотреть на аудиторию, но увы, судя по поим закомым эту фан породию начали воспринимать слишком серьезно и я забил.
Hodor #7 - 6 месяцев назад 0
quq_CCCP, если сделаю monkey king, то можно будет даже толкнуть код айкапу, может быть засунут его в 6.85
quq_CCCP #8 - 6 месяцев назад (отредактировано ) 0
UrsaBoss, не мечтай, там доту уже конвертировали в байткод или машинный код, нету скрипта как такового, Unryze вовсе считает что айкап сделал дамп скрипта из памяти игры карты и подгружает его лаунчером + вносит свои изменения на с++. Так что им это не поможет это раз, не захотят это два.
Ельнур #9 - 6 месяцев назад -3
как сделать ульту сларка?
NazarPunk #10 - 6 месяцев назад -2
как сделать ульту сларка?
Руками.
Hodor #11 - 6 месяцев назад (отредактировано ) 0
quq_CCCP, но ведь они же как то добавляли новые предметы, абилки и т.д
ещё как захотят) Обезьяну они не сделали потому что у них походу нету моделлеров
+ я общаюсь с человеком, который общается с кодерами айкапа
меня как минимум услышат)

и ещё я в dll'ке айкапа в асм куче разглядел дофига имен нативок и т.д в одном из сегментов
мне кажется что они тупо берут и пихают в процесс уже скомпилированный в ++ "скрипт" карты, им это выгодно как минимум чтобы калькуляторы не лагали
quq_CCCP #12 - 6 месяцев назад 0
UrsaBoss, рили? Ты знаком с кодерами айкапа и знаешь как и что они делают? Очень интересно послушать.
Hodor #13 - 6 месяцев назад 0
quq_CCCP:
UrsaBoss, рили? Ты знаком с кодерами айкапа и знаешь как и что они делают? Очень интересно послушать.
ну
я общаюсь с человеком, который общается с кодерами айкапа
если захочу буду знаком)
и знаешь как и что они делают?
не знаю) Просто предполагаю
upd
не знаю и не интересовался*
и ещё я в dll'ке айкапа в асм куче разглядел дофига имен нативок и т.д в одном из сегментов
ну точнее в dll'ке которая в .exe шнике, который внутри карты
quq_CCCP #14 - 6 месяцев назад 0
UrsaBoss, ну скажем так там прямо есть кусок jass кода.
Hodor #15 - 6 месяцев назад 0
quq_CCCP:
UrsaBoss, ну скажем так там прямо есть кусок jass кода.
может быть, я ещё утром быстро пробежал в иде по сегментам, мб не заметил что то
SomnusUltima #16 - 6 месяцев назад 0
Я хотел как-то рики варс, где особенность что если тебя видит какой либо игрок - ты получаешь урон. От этого как-то плясать и развивать идею.
quq_CCCP #17 - 6 месяцев назад 0
UrsaBoss, но подробностей устройства этой длл у нас нет, как уж они там извернулись я не знаю, но интересно.
Hodor #18 - 6 месяцев назад 1
quq_CCCP:
UrsaBoss, но подробностей устройства этой длл у нас нет, как уж они там извернулись я не знаю, но интересно.
я жалею что забил болт на обучение сразу же на 1 курсе и ушёл на слесаря)
я так то знаю ассемблер и частично устройство машинного кода, но очень сильно не хватает опыта работы с ним чтобы реально в этом понимать
upd
точнее понимать что написано на ассемблере
Bergi_Bear #19 - 6 месяцев назад 2
quq_CCCP, скилетон кинг варс тоже будет весьма интересно, если взять за основу часть механики сларков, а конкретно: 6 аганимов = смена класса + ещё 5 аганимов, только поместить их в другую среду, например они начинают на кладбище и должны куда-то подняться, параллельно прокачиваюсь в 1 из классов: упор на стан, упор на вампиризм, упор на создание скелетов, упор на воскрешение и т.д., а будут они например разорять деревни, против магов альянса, даже не обязательно режим друг против друга
А если Рики Wars ну, тоже не обязательно вообще FFA, лучше вообще его исключить, тоже сделать на подобие захвата садов альянса, и пройти через 5 уровней обнаружения, задача прокачать некий навык скрытности на 6, чтобы избежать обнаружения на 5, ну и так же в много классов: класс тучи, блинка, удара в спину, класс ультимейта (как в доте2 щас ульта по области)
В любом случае НЕ FFA как показали себя сларки, люди моментально ливают, когда надо драться друг против друга, даже когда команда людей, против команды ботов, а если все в союзе месят боссов, то никаких проблем не вызывает такая игра
Обязательно начну любую из этих игр, как только устаканется 131 патч =)
Hodor #20 - 6 месяцев назад 0
Bergi_Bear, вот бы ursa wars сделать, такой замес будет...
Bergi_Bear #21 - 6 месяцев назад 1
UrsaBoss, думаю абсолютно любого героя можно интересно обыграть и изменить до неузнаваемости
Hodor #22 - 6 месяцев назад 0
Bergi_Bear, для бара-варс можно такую идею сделать:
скорость разгона будет разной, если оба бары столкнутся - то победит тот, у кого скорость разгона выше ну или итемы такие то
ещё может быть вот так, один бара стоит - другой разогнался, второй прилетел и убил первого бару, т.к тот стоял (т.е скорость разгона 0)
игра будет что то типа вышибал
quq_CCCP #23 - 6 месяцев назад 1
Ну у меня была еще идея насчет героев доты, сделать карту типа Are you Lucker?, только назвать Extrime Ganger wars или как то так.
На карте в некотором месте эмитируется ситуация встречи двух гереов доты, герои максимально неприятные друг для друга, с некоторыми уровнями и вещями, ваша задача завалить опонента или сбежать от него. Встреча фуриона и клоквер гоблина, траксы и ликантропа, течиса и террорблейда.
Hodor #24 - 6 месяцев назад (отредактировано ) 0

quq_CCCP, вот нашел один сегмент и там подозрительные константы (.rdata это сегмент констант как я помню)
вот байтовый массив 'Ogre Magi has a lot of survivability but he does need the ability'
и таких ещё дофига
'ReplaceableTextures\CommandButtons\BTNHeroTinker.blp'

попробую по их адресу порыть че нибудь

нашел перекрестные ссылки в сегменте .text
аж даже интересно стало
.text сегмент это вроде уже сам исполняемый код, блин, у меня такое ощущение что они этим .exe собирают что то
т.к эти константы почему то ровно в столбик передаются куда то
quq_CCCP #25 - 6 месяцев назад 1
Мб они патчат оригинальный скрипт так, чтобы исправить баги.
Hodor #26 - 6 месяцев назад -1
quq_CCCP:
Мб они патчат оригинальный скрипт так, чтобы исправить баги.
не, там не именно строки из скрипта
в .rdata прячутся именно все строки которые под "" бывают в.j

блин, реально ощущение такое что они вышли за рамки вм jass'a и код доты исполняется прямо "над варкрафтом"

это резонней, "нативный мемхак", меньше лагов и т.д
NazarPunk #27 - 6 месяцев назад 1
я жалею что забил болт на обучение сразу же на 1 курсе и ушёл на слесаря)
Дык я вообще электрослесарь подземный 4го разряда и это ничего не значит.~UrsaBoss:
и код доты исполняется прямо "над варкрафтом"
Если вы получили доступ к WinAPI то можете исполнять код даже над юзером.// И увести все мои куки.
Hodor #28 - 6 месяцев назад -1
quq_CCCP, а не, походу не только строки из ""
в .rdata так же лежит

NazarPunk:
Дык я вообще электрослесарь подземный 4го разряда и это ничего не значит.
знал бы ты как тяжело искать нужные мануалы, а ведь ещё самому их понимать приходится
а на лекции всё по полочкам и по буквам рассказывают
прикреплены файлы
NazarPunk #29 - 6 месяцев назад 1
знал бы ты как тяжело искать нужные мануалы
Давайте не превращать трэд в меряние чем попало!

Я по работе вбиваю кучу костылей и сталкиваюсь со многими проблемами, но это не значит, что я лучше кого-то в плане программирования и разработки. У каждого свои цели и задачи и не нужно всех чесать под одну гребёнку.
Hodor #30 - 6 месяцев назад -1
NazarPunk, а где я говорил что я лучше кого то?
я сказал что понимаю в ассемблере, но опыта очень не хватает и тяжело искать нужный/годный мануал
надоели, честное слово
что ни скажи - то понт
Это сообщение удалено
Bergi_Bear #32 - 6 месяцев назад 0
Давайте лучше обсудим отдельную игру с рикимару в главной роли, а может даже кампанию про несколько глав о становлении падшего сатира, где можно геймплейно обыграть появление каждой способности
» минилор
Рики изначально был простым сатиром, служащим в ордене, сатиров, и изначально обладал только дефолтными способности сатира, манабёрн и понижение брони, надо с этим способностями кого то убить (будет оч тяжело) и обучиться способности "Тучка", при помощи наложения безмолвия пойти в деревню сатиров магов и завалить их всех, паралельно изучив блинк, потом пойти ещё в какую то гильдию асасинов, телепортироваться за спину к ним и изучить удар в спину (тот самый доп урон), ну и под конец вернуться в свою родную деревню в крысу убить всё племя сатиров, осознать что натворил, и получить способность "постоянная невидимость", чтобы скрыть свой стыд за садеянное, ну а далее рики, отправиться на великую защиту древних, чтобы искупить все свои грехи
КОНЕЦ
Можно в виде кампании с главами, можно сетевую на отдельной карте на 1-4 игрока
quq_CCCP #33 - 6 месяцев назад 1
UrsaBoss, ну про лаги это излишне, что дота лича пока он не переделал рендер работала без лагов, что дота фрога. Просадки фпс при пике вокера и сфа никуда не делись, да и это следствие использование абилок на 100500 уровней, в слк таблице может быть абилки не выше 4 уровней, все что выше хранится уже не в слк и грузится значительно дольше.