30

» WarCraft 3 / Авто-поворот юнитов

Что это, зачем это, что по поводу уточек?

Так вот зачем этот вопрос был создан?

-f XXX (-f 45 -f 200 -f 300) - поворот на градус
Что по поводу отрицательных значений?

Что мешает отформатировать код по человечески?
globals
    integer PLAYERS = 12
    integer array GO
    integer array N
    trigger array tgo4
    integer array tgo4_init
    hashtable ht = InitHashtable()
    string array Direction
    real array DirectionStart
    unit array u
endglobals
    
function GOO4_Actions takes nothing returns nothing
    local integer i = LoadInteger(ht, GetHandleId(GetTriggeringTrigger()), 0)
    local real A = 0
    set N[i] = N[i] + 1
    if Direction[i] == "R" then
        set A = DirectionStart[i] - (N[i] * 120)
    elseif Direction[i] == "L" then
        set A = DirectionStart[i] + (N[i] * 120)
    endif
    call BJDebugMsg(I2S(R2I(GetUnitFacing(u[i]))) + " " + I2S(N[i]) + " " + GetPlayerName(Player(i - 1)))
    call SetUnitFacing(u[i], A)
    if N[i] == 3 then
        set N[i] = 0
    endif
endfunction
    
function GOO4 takes string s returns nothing
    local integer i = GetPlayerId(GetTriggerPlayer()) + 1
    if tgo4_init[i] == 0 then
        set tgo4_init[i] = 1
        set tgo4[i] = CreateTrigger()
        call SaveInteger(ht, GetHandleId(tgo4[i]), 0, i)
        call TriggerRegisterTimerEvent(tgo4[i], 0.5, true)
        call TriggerAddAction(tgo4[i], function GOO4_Actions)
        call DisableTrigger(tgo4[i])
    endif
    if s == "R" then
        call BJDebugMsg("R")
        set Direction[i] = "R"
    elseif s == "L" then
        set Direction[i] = "L"
        call BJDebugMsg("L")
    endif
    if GO[i] == 0 then
        set GO[i] = 1
        set DirectionStart[i] = GetUnitFacing(u[i])
        call EnableTrigger(tgo4[i])
    else
        set GO[i] = 0
        set N[i] = 0
        call DisableTrigger(tgo4[i])
        call BJDebugMsg("STOP: " + GetPlayerName(Player(i - 1)))
    endif
endfunction
    
function Facing takes integer s returns nothing
    local integer i = GetPlayerId(GetTriggerPlayer()) + 1
    call SetUnitFacing(u[i], s)
endfunction
    
function Start takes nothing returns nothing
    local string s = StringCase(GetEventPlayerChatString(), false)
    if s == "-r" then
        call GOO4("R")
    elseif s == "-l" then
        call GOO4("L")
    elseif SubString(s, 0, 3) == "-f " then
        call Facing(S2I(SubString(s, 3, StringLength(s))))
    endif
endfunction
    
function Start_init takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 1
    loop
        exitwhen i > PLAYERS
        call TriggerRegisterPlayerChatEvent(t, Player(i - 1), "-", false)
        set i = i + 1
    endloop
    call TriggerAddAction(t, function Start)
endfunction
    
function Facing_Start takes nothing returns nothing
    call SetUnitFacing(u[1], 270)
    call SetUnitFacing(u[2], 270)
    call SetUnitFacing(u[3], 270)
    call SetUnitFacing(u[4], 270)
    call SetUnitFacing(u[5], 270)
    call SetUnitFacing(u[6], 270)
    call SetUnitFacing(u[7], 270)
    call BJDebugMsg("Use -L , -R , -f XXX")
endfunction
    
function CreateAllUnits takes nothing returns nothing
    set u[1] = CreateUnit(Player(0), 'Hblm', - 800, - 50, 3.977)
    set u[2] = CreateUnit(Player(1), 'Hblm', - 400, - 50, 3.977)
    set u[3] = CreateUnit(Player(2), 'Hblm', 0, - 50, 3.977)
    set u[4] = CreateUnit(Player(3), 'Hblm', - 200, - 450, 3.977)
    set u[5] = CreateUnit(Player(4), 'Hblm', - 600, - 450, 3.977)
    set u[6] = CreateUnit(Player(5), 'Hblm', - 200, 350, 3.977)
    set u[7] = CreateUnit(Player(6), 'Hblm', - 600, 350, 3.977)
    call Facing_Start()
endfunction
30

» WarCraft 3 / Jass MythBusters

host_pi, TriggerSleepAction отстой, остальное норм, миллионы гуишников врать не будут.
30

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

а если в карту вшита защита от паузы путём троекратного запаузивания на старте?
Ожидание игрока при лагах тоже пауза.
на это пока не нашёл подтверждений
В QA этих подверждений было полно.
30

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

есть ссылки на статьи? пошёл погуглить
Да всё просто, TriggerSleepAction игнорирует паузу и может десинкнуть из-за неточности внутреннего таймера.
30

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

имелись ввиду глобалки простые типа integer и string
Я только одну локалку использовал, всё остальное глобалки.
trigger t = CreateTrigger();
в общем хештейбл я так понял это как словарь
Это и есть хэш-таблица. Для простоты можешь относиться к ней как к к двумерному массиву с числовыми ключами.
ht[0][1] = somevalue;

данном случае тянется номер игрока по привязанному к нему id таймера. классное решение
Сохранение данных на хэндл это основа практически каждого MUI заклинания.
30

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

т.е. на глобалках и таймерах подобный код не сделать с отдельным таймером для каждого плеера?
У меня код с отдельным таймером для каждого игрока какраз на глобалках. Можешь проверить через Multiwindow.
Вот здесь идёт получение номера игрока из ХТ. Игрока можно просто получить через Player(i).
Загруженные файлы
30

» WarCraft 3 / Депротект (знаю заеженная тема)

или ты думаешь движок сайта xgm тоже с нуля писан и не задействует никаких сторонних библиотек?
Людочка, ты не поверишь.
30

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

из них у 1го игрока идёт общий подсчёт действий, у остальных без подсчёта
Держи. Каждому игроку по таймеру с подсчётом.
Хэштаблица хранит по хэндлу, так что можешь свою HandleHT переиспользовать.
//! zinc
library MyTimerLib {
    string msg = "-run";
    integer i, action[];
    timer ticker[];
    boolean running[];
    hashtable ht = InitHashtable();

    function onInit() {
        trigger t = CreateTrigger();

        for (0 <= i < bj_MAX_PLAYER_SLOTS) {
            if ( GetPlayerController(Player(i)) == MAP_CONTROL_USER && GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING) {
                TriggerRegisterPlayerChatEvent(t, Player(i), msg, false);
                action[i] = - 1;
                running[i] = false;
                ticker[i] = CreateTimer();
                SaveInteger(ht, GetHandleId(ticker[i]), 0, i);
            }
        }

        TriggerAddAction(t, function() {
            i = GetPlayerId(GetTriggerPlayer());

            if (running[i]) {
                PauseTimer(ticker[i]);
                action[i] = - 1;
                running[i] = false;
                BJDebugMsg("Player: " + I2S(i) + ", stop");
                return;
            }
            running[i] = true;

            TimerStart(ticker[i], .3, true, function() {
                i = LoadInteger(ht, GetHandleId(GetExpiredTimer()), 0);

                action[i] += 1;

                BJDebugMsg("Player: " + I2S(i) + ", action: "  + I2S(action[i]));

                if (action[i] == 2) action[i] = - 1;
            });
        });

        t = null;
    }
}
//! endzinc
30

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

как передать GetPlayerId(GetTriggerPlayer()) в таймерную функцию MyTimerLib___anon__0 ?
Через глобалку или через ХТ. Вот пример через глобалку сделал.
//! zinc
library MyTimerLib {
    integer n = - 1;
    timer ticker = CreateTimer();
    string msg = "-run";
    boolean running = false;
    player p;
    
    function onInit() {
        trigger t = CreateTrigger();

        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            if ( GetPlayerController(Player(i)) == MAP_CONTROL_USER && GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING)
                TriggerRegisterPlayerChatEvent(t, Player(i), msg, false);
        }

        TriggerAddAction(t, function(){
            p = GetTriggerPlayer();
            if (running) {
                PauseTimer(ticker);
                n = -1;
                running = false;
                BJDebugMsg("stop");
                return;
            }
            running = true;

            TimerStart(ticker, .3, true, function() {
                n += 1;

                if (n == 0) {
                    BJDebugMsg("action 1: " + I2S(i));
                }

                if (n == 1) {
                    BJDebugMsg("action 2: " + I2S(i));
                }

                if (n == 2) {
                    BJDebugMsg("action 3: " + I2S(i));
                    n = - 1;
                }
            });
        });

        t = null;
    }
}
//! endzinc
30

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

как сделать 3 разных действия с одной периодичностью по таймеру?
//! zinc
    library MyTimerLib {
        integer n = - 1;
        timer ticker = CreateTimer();

        function onInit() {
            TimerStart(ticker, .3, true, function() {
                n += 1;

                if (n == 0) {
                    BJDebugMsg("111 " + I2S(i));
                }

                if (n == 1) {
                    BJDebugMsg("222 " + I2S(i));
                }

                if (n == 2) {
                    BJDebugMsg("333 " + I2S(i));
                    n = - 1;
                }
            });
        }
    }
//! endzinc
30

» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?

host_pi, создать параллельные массивы точек и синхронизировать по индексу игрока религия запрещает?
30

» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?

что под этим понятием имеется ввиду?
Подрузамевается синхронизация значений между игроками.
какие несколько методов имеются ввиду?
Какая версия игры имеется ввиду?
30

» WarCraft 3 / Спавн врага на определенном радиусе через триггеры

Хорошо, а как?
  • Спавнишь юнита
  • Находишь расстояние до игрока
  • Отодвигаешь от игрока на 100 единиц
30

» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?

если одна глобальная переменная у разных игроков имеет разное значение - это десинх или нет?
До того момента пока эта переменная не будет использоваться где-то в синх данных, то норм.
30

» WarCraft 3 / Равкоды

Вышла новая версия!
Прокрутить к ресурсу
Добавилась база из .slk, позволяющая узнать, использует ли игра равкод.
Загруженные файлы
30

» WarCraft 3 / Равкоды

clojurmagictime, я б с удовольствием посмотрел, но на MacOS не запускается. Да и 0x нотации нет.
Загруженные файлы