Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
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 то можете исполнять код даже над юзером.// И увести все мои куки.
0
18
5 лет назад
0
quq_CCCP, а не, походу не только строки из ""
в .rdata так же лежит

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

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