Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
5 лет назад
0
UrsaBoss, но подробностей устройства этой длл у нас нет, как уж они там извернулись я не знаю, но интересно.
1
18
5 лет назад
1
quq_CCCP:
UrsaBoss, но подробностей устройства этой длл у нас нет, как уж они там извернулись я не знаю, но интересно.
я жалею что забил болт на обучение сразу же на 1 курсе и ушёл на слесаря)
я так то знаю ассемблер и частично устройство машинного кода, но очень сильно не хватает опыта работы с ним чтобы реально в этом понимать
upd
точнее понимать что написано на ассемблере
2
32
5 лет назад
2
quq_CCCP, скилетон кинг варс тоже будет весьма интересно, если взять за основу часть механики сларков, а конкретно: 6 аганимов = смена класса + ещё 5 аганимов, только поместить их в другую среду, например они начинают на кладбище и должны куда-то подняться, параллельно прокачиваюсь в 1 из классов: упор на стан, упор на вампиризм, упор на создание скелетов, упор на воскрешение и т.д., а будут они например разорять деревни, против магов альянса, даже не обязательно режим друг против друга
А если Рики Wars ну, тоже не обязательно вообще FFA, лучше вообще его исключить, тоже сделать на подобие захвата садов альянса, и пройти через 5 уровней обнаружения, задача прокачать некий навык скрытности на 6, чтобы избежать обнаружения на 5, ну и так же в много классов: класс тучи, блинка, удара в спину, класс ультимейта (как в доте2 щас ульта по области)
В любом случае НЕ FFA как показали себя сларки, люди моментально ливают, когда надо драться друг против друга, даже когда команда людей, против команды ботов, а если все в союзе месят боссов, то никаких проблем не вызывает такая игра
Обязательно начну любую из этих игр, как только устаканется 131 патч =)
0
18
5 лет назад
0
Bergi_Bear, вот бы ursa wars сделать, такой замес будет...
1
32
5 лет назад
1
UrsaBoss, думаю абсолютно любого героя можно интересно обыграть и изменить до неузнаваемости
0
18
5 лет назад
0
Bergi_Bear, для бара-варс можно такую идею сделать:
скорость разгона будет разной, если оба бары столкнутся - то победит тот, у кого скорость разгона выше ну или итемы такие то
ещё может быть вот так, один бара стоит - другой разогнался, второй прилетел и убил первого бару, т.к тот стоял (т.е скорость разгона 0)
игра будет что то типа вышибал
1
32
5 лет назад
1
Ну у меня была еще идея насчет героев доты, сделать карту типа Are you Lucker?, только назвать Extrime Ganger wars или как то так.
На карте в некотором месте эмитируется ситуация встречи двух гереов доты, герои максимально неприятные друг для друга, с некоторыми уровнями и вещями, ваша задача завалить опонента или сбежать от него. Встреча фуриона и клоквер гоблина, траксы и ликантропа, течиса и террорблейда.
0
18
5 лет назад
Отредактирован Hodor
0

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

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

нашел перекрестные ссылки в сегменте .text
аж даже интересно стало
.text сегмент это вроде уже сам исполняемый код, блин, у меня такое ощущение что они этим .exe собирают что то
т.к эти константы почему то ровно в столбик передаются куда то
1
32
5 лет назад
1
Мб они патчат оригинальный скрипт так, чтобы исправить баги.
0
18
5 лет назад
0
quq_CCCP:
Мб они патчат оригинальный скрипт так, чтобы исправить баги.
не, там не именно строки из скрипта
в .rdata прячутся именно все строки которые под "" бывают в.j

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

это резонней, "нативный мемхак", меньше лагов и т.д
1
29
5 лет назад
1
я жалею что забил болт на обучение сразу же на 1 курсе и ушёл на слесаря)
Дык я вообще электрослесарь подземный 4го разряда и это ничего не значит.~UrsaBoss:
и код доты исполняется прямо "над варкрафтом"
Если вы получили доступ к WinAPI то можете исполнять код даже над юзером.// И увести все мои куки.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.