32

» WarCraft 3 / Система общего здоровья.

Ну триггер с событием - юнит получает урон, на обоих юнитов, как только урон получит один юнит, снять хп у второго, так же если хп меньше чем урона то убить юнита.
32

» WarCraft 3 / Мультипак в одном здании...

Steal nerves, Была на форуме эта наработка, подобие Random Draft из доты, герои стоят на карте, можно выбрать, покликать спеллы, и подтвердить выбор за бабки, там была эта система на поставке ресурсов и триггерах.
32

» WarCraft 3 / Отключение меню паузы и журнала

Ну либо мемхак, либо баг с событием - игрок сохранил игру, игрок вышел из игры, хз как щяс, раньше эти баги работали.
Суть бага - делаем триггер с нужным событием, и действие показать, любой диалог игроку GetTriggerPlayer(), как разультат ничего не происходит, игрок тыкает кнопку в меню но ничего не происходит, он тупо не может сохранить игру или выйти из игры (события - игрок открыл меню нет).
32

» WarCraft 3 / Хак на память Warcraft3

pro100master, по вашему желанию, просто нужно смотреть что к чему, там вроде юзаются бж переменные, нужно чтобы инит прошел после них, а не в самом майне, да и это защита от оптимизаторов, ибо если инитить как библиотеку, они вынесут все из инит функций в майн, могут быть проблемы с обрывом потока.
32

» WarCraft 3 / Не совсем вопрос, но просто мб найдутся желающие придумать =)

Эх у меня в основном идеи для магов что-т в голову лезут...
Щяс думаю сделать пример "псевдоконтроля" юнита на общеизвестном примере, к примеру агр акса - как сделать чтобы работало без багов (т.е не постопишь, не уйдешь в инвиз как сларк) по мотивам д2, и как бы это сделал я, без блокировки спеллов и сбивания приказов...
32

» WarCraft 3 / Мне нужно Сохранить точку Кругом

MATRITSA, что значит точку кругом? Сделать круг из точек? Ну цикл+ полярные координаты, геометрию в школе не отменяли.
Если вам нужен не квадратный рект - ну пожалуйста, делайте из квадратных регионов подобие окружности.
32

» RenderEdge / [RenderEdge] Memory Hack

Кет, в теории можно сделать хак, после запуска карты в первый раз - загружать лаунчер в папку с варом + подменять все ярлыки, при повторном запуске вар будет запущен уже через лаунчер и вот вам улучшение граффония для вашей карты.
32

» WarCraft 3 / Не совсем вопрос, но просто мб найдутся желающие придумать =)

Daniil18, это ульт апарата из доты.
ClotPh, посмотри предмет "Жезл лунного света", у него довольно интересная, красочная активка.
32

» WarCraft 3 / Как сделать такую систему экипировки?

Принятый ответ
Чет никаких прорывов, смена уровня инвентаря да спеллбуки, изи.
Вы бы тему Render Engine почитали, вот там так как нигде больше, можно замутить интерфейс хоть по мотивам доты 2, хоть по мотивам диаблы, да вовсе как угодно.
32

» WarCraft 3 / Чтение строк при помощи GetLocalizedString( )

Принятый ответ
Эта функция может читать строки из текстовиков и wts файла строки своего региона, она слупочна. Вспомни сколько грузятся карты без оптимизации, как долго может открываться вкладка - задания.
32

» WarCraft 3 / Мультипак в одном здании...

Принятый ответ
Блин - видел очень давно похожую реализацию, но походу 100500 людей так и не научились это делать, написать чтоли самому...
Суть - для продажи предметов, войск, всяких древ талантов - используйте спеллбук + способности на основе - поставка ресурсов.
Помещаем в спеллбук до 11 способностей на основе "Поставка ресусов" - это аналог канала, настраивается приказ и прочее, но самое главное есть поля - стоймость золотом, стоймость деревом, т.е эта абилка может требовать не только ману но и золото с деревом. Так же там стоит вкладка, заряд игрока владельца - очень важная настройка:
  1. Заряд игрока владельца включен - тогда за каст ресурсы будут списыватся только у игрока владельца юнита, при этом неважно что вашим юнитом управляет другой игрок.
  2. Заряд игрока владельца выключен - тогда при касте этой абилки ресурсы будут списыватся со счета игрока, который и отдал приказ, это даже можно отследить, но немного геморойно:
Суть: делаем триггер который срабатывает на приказ каста поставки ресурсов, или события юнит начинает каст способности, условия по вкусу и действия - создать еще 1 триггер, в события которого добавить - ресурсы игрока N изменились (для каждого игрока способного купить), условием - ресурсов стало меньше на стоймость каста абилки, и действие - выключить триггер, записать GetTriggerPlayer() в глобальную переменную или в еще куда, это и будет наш игрок который кликнул на поставку ресурсов, ну и далее утилизируем триггер, удаляя действия. Можно написать все действия в условии, тогда не придется удалять действия.
Так можно отследить кто кастанул абилку поставки ресурсов если юнитом управляют несколько игроков.
32

» WarCraft 3 / Синхронизация строк

Lucker, слушай, если ты пишешь программу - а кой черт тебе прелоадер и прочее говно, мемхак в руки и но делать.
Суть - длл, которую ты подгружаешь в память вара, там пилить быстрый синхроеизация и чтение строк из твича, или откуда там тебе нужно. На си это будет работать в разы быстрее, спроси лича про быстрый синх - для ботов же писали всякие системы связи на мемхаке.
32

» WarCraft 3 / Синхронизация строк

Lucker, а что собственно за строки ты хочешь синхронизировать? Пасскод загрузки персонажа? Сначала конвертнии его в цифры локально, а потом уже синхронизируй.
IceFog, Надо будет потестить синх строк... В мемхаке кстати были допиленные функции синха для ботов, но лич вроде не выкладывал подробностей.
32

» WarCraft 3 / Тыкни где менять описание способность через мемхак!!!

Принятый ответ
pro100master, в теме про мемхак есть, SetAbilyTip, SetAbilityUbertip или как то так называется...
Ссылка на список функций функции
Только для второй версии мемхака из темы про детект урона
32

» WarCraft 3 / Хеш таблица, childKey?

Daniil18, массивы быстрее, да и обращение к ним проще, только 1 целое число о 0 до 8191.
Структуры как раз и удобнее и быстрее в таких местах.
32

» WarCraft 3 / Синхронизация строк

Lucker, синхронизация строки может быть очень долгой, на сколько секунд стоит вейт?
32

» WarCraft 3 / Убрать контроль юнита!

function SetUnitWardFlag takes unit u, boolean flag  returns boolean
    local integer pUnit = ConvertHandle( u ) / 4
    local integer flags = Memory[pUnit + 146]
        
    if flag then
        if not IsFlagBitSet( flags, 512 ) then
            set Memory[pUnit + 146] = flags + 512
        endif
        return IsFlagBitSet( flags, 512 )
    endif
    
    if IsFlagBitSet( flags, 512 ) then
        set Memory[pUnit + 146] = flags - 512
    endif
    return not IsFlagBitSet( flags, 512 ) 
endfunction

function Trig_Blink_Strike_Order_Conditions takes nothing returns boolean
    local TriggerData st = GetDataBX( GetTriggeringTrigger())
    return st.IsCheck
endfunction

function Trig_Blink_Strike_Order_Actions takes nothing returns nothing
    local TriggerData st = GetDataBX( GetTriggeringTrigger())
    local eventid id = GetTriggerEventId()
    
    if id ==  EVENT_WIDGET_DEATH or ( id == EVENT_GAME_TIMER_EXPIRED and GetUnitAbilityLevel( st.attacker, 'BEwk' ) < 1 ) or IsUnitType( st.attacker, UNIT_TYPE_POLYMORPHED ) then
        call DisableTrigger(st.trg)
        call SetUnitPathing( st.attacker, true )
        call SetUnitWardFlag( st.attacker, false )
        call MuteUnitAbility( st.attacker, 'Amov', false )
        call DisableUnitAbilityById( st.attacker, 'AInv', false )
        
        if not IsUnitDead( st.attacker ) then
            call UnitRemoveAbility( st.attacker, 'BEwk' )
        endif
        
        call RemoveDataBX( st.trg )
        call st.RemoveTrigger( )
        call st.destroy( )
        
    elseif id == EVENT_UNIT_ISSUED_TARGET_ORDER or id == EVENT_UNIT_ISSUED_POINT_ORDER then
        set st.IsCheck = false
        call UnitShareVision( st.attacked, st.pl, true )
        call IssueTargetOrderById( st.attacker, 851983,st.attacked )
        call UnitShareVision( st.attacked, st.pl, false )
        set st.IsCheck = true
    endif
    
    set id = null
endfunction

function Timer_Blink_Strike_Expires takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local DamageData dd = GetDataBX( t )
    local real BX = 0
    local real BY = 0
    local real ang = 0.00
    local TriggerData st
    
    if IsUnitDead( dd.attacked ) then // проверка не сдох ли юнит, чтобы не улететь в центр карты.
        set BX = GetUnitX( dd.attacker )
        set BY = GetUnitY( dd.attacker )
    else
        set BX = GetUnitX( dd.attacked )
        set BY = GetUnitY( dd.attacked )
        set dd.IsCheck = true
    endif
    
    set bj_forLoopAIndex = 0
    
    loop
        exitwhen bj_forLoopAIndex > 20
        
        set ang = GetRandomReal( 0.00, 360.00 )
        set BX = BX + 64.00 * Cos( ang * bj_DEGTORAD )
        set BY = BY + 64.00 * Sin( ang * bj_DEGTORAD )
        
        exitwhen IsTerrainWalkable( BX, BY )
        
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    
    if not IsUnitDead( dd.attacker ) then
    
        if bj_forLoopAIndex < 20 then // допустимые координаты так и не найдены вокруг цели?
            call SetUnitX( dd.attacker, CheckX( BX ) )
            call SetUnitY( dd.attacker, CheckY( BY ) )
        else
            call SetUnitPosition( dd.attacker, dd.rx, dd.ry )
            call UnitRemoveAbility( dd.attacker, 'BEwk' )
        // дебаг
            call DisplayTimedTextToPlayer( dd.pl, 0.00, 0.00, 10.00, DEBUG + " " + GetAbilityEffectById( dd.time, EFFECT_TYPE_EFFECT, 0 ) )
            call DisplayTimedTextToPlayer( dd.pl, 0.00, 0.00, 10.00, INFO )
        endif
    
        call ShowUnit( dd.attacker, true )
        call SetUnitInvulnerable( dd.attacker, false )
    
        call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl", BX, BY ) ) // анимация блинка
    
        if GetLocalPlayer( ) == dd.pl then
            call ClearSelection( )
            call SelectUnit( dd.attacker, true )
        endif
    
        if IsUnitEnemy( dd.attacked, dd.pl ) and dd.IsCheck then
            call UnitRemoveAbility( dd.attacker, 'Bweb' )
            call UnitRemoveAbility( dd.attacker, 'Beng' )
            call UnitRemoveAbility( dd.attacker, 'Bens' )
            call UnitRemoveAbility( dd.attacker, 'BEer' )
        
            set st = TriggerData.create()
            set st.trg = CreateTrigger()
            set st.trc = TriggerAddCondition( st.trg, Condition(function Trig_Blink_Strike_Order_Conditions ) )
            set st.tra = TriggerAddAction( st.trg, function Trig_Blink_Strike_Order_Actions )
            set st.attacker = dd.attacker 
            set st.attacked = dd.attacked
            set st.pl = dd.pl
            set st.IsCheck = true
        
            call SetDataBX( st.trg, st )
            
            call TriggerRegisterUnitEvent( st.trg, st.attacker, EVENT_UNIT_ISSUED_TARGET_ORDER )
            call TriggerRegisterUnitEvent( st.trg, st.attacker, EVENT_UNIT_ISSUED_POINT_ORDER )
            call TriggerRegisterDeathEvent( st.trg, st.attacker )
            call TriggerRegisterDeathEvent( st.trg, st.attacked )
            call TriggerRegisterTimerEvent( st.trg, 0.15, true )
        
            set bj_lastCreatedUnit = CreateUnit( dd.pl, 'hvis', GetUnitX( dd.attacked ), GetUnitY( dd.attacked ), GetUnitFacing( dd.attacked ) )
            call SetUnitPathing( bj_lastCreatedUnit, false )
            call SetUnitX( bj_lastCreatedUnit, GetUnitX( dd.attacked ) )
            call SetUnitY( bj_lastCreatedUnit, GetUnitY( dd.attacked ) )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1.50 )
            call UnitAddAbility( bj_lastCreatedUnit, 'A06S' )
            
            call UnitShareVision( dd.attacked, dd.pl, true )
            if IssueTargetOrderById( bj_lastCreatedUnit, 852252, dd.attacked ) then
                call SetUnitPathing( st.attacker, false )
                call PauseUnit( dd.attacker, true )
                call IssueTargetOrderById( dd.attacker, 851983, dd.attacked ) // attack
                call PauseUnit( dd.attacker, false )
            endif
            call UnitShareVision( dd.attacked, dd.pl, false )
            
            call SetUnitWardFlag( st.attacker, true )
            call MuteUnitAbility( st.attacker, 'Amov', true )
            call DisableUnitAbilityById( st.attacker, 'AInv', true )
        else
            call UnitRemoveAbility( dd.attacker, 'BEwk' )
        endif
    endif
    
    call RemoveDataBX( t )
    call DestroyTimer( t )
    call dd.clear( )
    call dd.destroy( )
    
    set t = null
endfunction

//===========================================================================
function startTrig_Blink_Strike takes nothing returns nothing
    local timer t = CreateTimer( )
    local DamageData dd = DamageData.create( )

    set dd.attacker = GetSpellAbilityUnit( )
    set dd.time = GetSpellAbilityId( )
    set dd.id = GetUnitAbilityLevel( dd.attacker, dd.time )
    set dd.attacked = GetSpellTargetUnit( )
    set dd.pl = GetOwningPlayer( dd.attacker )
    set dd.rx = GetUnitX( dd.attacker )
    set dd.ry = GetUnitY( dd.attacker )
    set dd.IsCheck = false

    set bj_lastCreatedItem = CreateItem( 'Iwk0' + dd.id, dd.rx, dd.ry )
    call UnitAddItem( dd.attacker, bj_lastCreatedItem )
    call RemoveItem( bj_lastCreatedItem )
    set bj_lastCreatedItem = null
    
    
    if IsPlayerEnemy( GetLocalPlayer( ), dd.pl ) then
        call SelectUnit( dd.attacker , false )
    endif
    
    call ShowUnit( dd.attacker, false )
    call SetUnitInvulnerable( dd.attacker, true )
    
    call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Human\\Invisibility\\InvisibilityTarget.mdl", dd.rx, dd.ry ) )

    call SetDataBX( t, dd )
    
    call TimerStart( t, 0.12, false, function Timer_Blink_Strike_Expires )
    
    set t = null
endfunction
Вот код из моей карты...