XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
WeendVidente

offline
Опыт: 2,092
Активность:
Даже не знаю как назвать... Функция вызывает функцию что ли...
Есть код, который символизирует взлом замка: на экране появляются цифры, а игрок должен успеть за ограниченное количество времени вводить их. Если он введет все, то должно произойти одно действие, например дверь откроется, а если хоть одну цифру пропустит, то другое действие, например появится несколько враждебных юнитов. И все бы ничего, но таких замков должно быть очень много, но в голову не приходит как это сделать. И да, в этом коде я вперые в жизни применяю хэш-таблицы, потому может быть много лишнего - это я с перепугу. Ах да, и еще должно работать для нескольких игроков.

» раскрыть
Код:
function HackAct takes nothing returns nothing
    local player pl = GetTriggerPlayer()
    local timer t2 = LoadTimerHandle(udg_hash, GetHandleId(pl),2)
    local triggeraction ta = LoadTriggerActionHandle(udg_hash,GetHandleId(GetTriggeringTrigger()),1)
    call BJDebugMsg("...CONFIRM...")
    call DestroyTimer(t2)
    set t2 = null
    set pl = null
    call TriggerRemoveAction(GetTriggeringTrigger(),ta)
    call FlushChildHashtable(udg_hash,GetHandleId(GetTriggeringTrigger()))
    call DestroyTrigger(GetTriggeringTrigger())
    
endfunction

function HackError takes nothing returns nothing
    local timer t2 = GetExpiredTimer()
    local player pl = LoadPlayerHandle(udg_hash,GetHandleId(t2),0)
    local triggeraction ta = LoadTriggerActionHandle(udg_hash,GetHandleId(t2),1)
    call TriggerRemoveAction(LoadTriggerHandle(udg_hash,GetHandleId(t2),2),ta )
    call DestroyTrigger(LoadTriggerHandle(udg_hash,GetHandleId(t2),2))
    call BJDebugMsg("ERROR! HackingAttempt!")
    call SaveInteger(udg_hash, GetHandleId(pl),3,-1)
    call DestroyTimer(t2)
    call DestroyTimer(LoadTimerHandle(udg_hash,GetHandleId(t2),3))
    set t2 = null
    set pl = null
endfunction

function Hack takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local timer t2
    local string str = I2S(GetRandomInt(0,9))
    local trigger trg = CreateTrigger()
    local player pl = LoadPlayerHandle(udg_hash, GetHandleId(t), 0)
    local integer steps = LoadInteger(udg_hash, GetHandleId(pl), 3)

    if steps == 0 then
        call BJDebugMsg("!!!Succesful Hack!!!")
        call FlushChildHashtable(udg_hash,GetHandleId(t))
        call DestroyTimer(t)
        set t = null
        set t2 = null
        return 
    elseif steps == -1 then
        call BJDebugMsg("!!!ALARM!!!INTRUDER!!!")
    else   
        set steps = steps-1
        call SaveInteger(udg_hash, GetHandleId(pl),3,steps)
        call BJDebugMsg(str)
//Создаем таймер для провала
        set t2 = CreateTimer()
        call SaveTimerHandle(udg_hash, GetHandleId(pl),2,t2)
        call SavePlayerHandle(udg_hash, GetHandleId(t2),0,pl)
        call SaveTimerHandle(udg_hash, GetHandleId(t2),3,t)
        call TimerStart(t2,2,false,function HackError)
//Создаем триггер для успеха
        call TriggerRegisterPlayerChatEvent(trg, pl,str,true)
        local triggeraction ta = TriggerAddAction(trg, function HackAct)
        call SaveTriggerActionHandle(udg_hash, GetHandleId(t2),1,ta)
        call SaveTriggerActionHandle(udg_hash, GetHandleId(trg),1,ta)
        call SaveTriggerHandle(udg_hash,GetHandleId(t2),2,trg)
    endif
endfunction    
    
function HackingAttempt takes real lockClass, integer steps, player whichPlayer returns nothing
    local player pl=whichPlayer
    local timer t=CreateTimer()
    local real r = lockClass*0.3+(I2R(udg_SKLDecking[GetPlayerId(pl)])*0.1)
    call SaveInteger(udg_hash,GetHandleId(pl),3,steps)
    call SavePlayerHandle(udg_hash,GetHandleId(pl),0,pl)
    call SaveTimerHandle(udg_hash,GetHandleId(pl),1,t)
    call SavePlayerHandle(udg_hash,GetHandleId(t),0,pl)
    call TimerStart(t,r,true,function Hack)
endfunction
Старый 14.06.2013, 15:03
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
делаете базу данных этих замков, пишете систему которая будет плясать от нее, в базе данных делаете как свойство замка имя функции которая запустится, и эта система при успеха/фейле будет через excute запускать нужное вам действие - профит в том, что вам нужно будешь лишь добавлять замки в бд и подписывать результативные функции, без переписывания самого процесса
Ах да, и еще должно работать для нескольких игроков
хотя выглядит это как заказ на наработку
Старый 14.06.2013, 15:12
WeendVidente

offline
Опыт: 2,092
Активность:
Цитата:
Сообщение от Hate
хотя выглядит это как заказ на наработку


Ни в коем случае, написал это только потому, что то что подойдет для одного игрока может быть неприменимо к нескольким
Старый 14.06.2013, 15:20
darkowlom
Анархо-коммунизм
offline
Опыт: 31,669
Активность:
WeendVidente, могу написать тебе наработку как описал Hate, только напиши подробности что надо.
И еще: тебе обязательно на джаззе, а то по-моему проще будет на гуи с вставками кастом скрипта
Старый 14.06.2013, 16:37
WeendVidente

offline
Опыт: 2,092
Активность:
darkowlom, спасибо, но я джазз выучить хочу.

Попробую так как Hate описал сделать, будут вопросы еще - напишу, поэтому не закрывайте пожалуйста.
Старый 14.06.2013, 17:43
DioD

offline
Опыт: 45,134
Активность:
игрок написал чтото в чат или иное событие - запускаем таймер ставим флаг состояния
пока флаг состояния есть, всё что игрок пишет регистрируем и тупо вбиваем в строку добавляя сообщения к концу строки которую храним в глобальной переменной
когда таймер истёк или иное событие, смотрим что получилось, сравниваем с желаемым результатом и делаем действие.
я на это делал систему заклинаний как в меджике, проверял что получается тупо через кеш.
Старый 14.06.2013, 17:55
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
А не проще ли пробежаться по памяти при ините, отловить все левые объекты триггеров и тупо удалить?
Старый 14.06.2013, 18:08
WeendVidente

offline
Опыт: 2,092
Активность:
Вот такая ошибка выскакивает когда я пытаюсь сохранить деструктаблы. Причем пытаюсь сохранить три, а ошибка только по поводу двух (хотя когда я сохранял перед этим разом, то была только по поводу одного XD) Что такое?
Миниатюры
Кликните на картинку для увеличения
Название:  scrn.JPG
Просмотров: 26
Размер:  95.4 Кбайт  
Старый 14.06.2013, 21:58
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
прочитать что пишет компилятор не судьба?
Старый 14.06.2013, 22:00
WeendVidente

offline
Опыт: 2,092
Активность:
Hate, читаю "Необъявленная переменная" но как это она не объявленная, если взята прямо с объекта, который более чем объявлен. Плюс третий деструктабл, идентичный этим двум, ошибок не вызывает.

WeendVidente добавил:
Переоткрыл карту, сохраняю - ошибки больше нет. Компилятор хрень писал видимо.

WeendVidente добавил:
Вроде как сделал, и вроде как довольно неплохо, хотя от действия при провале решил отказаться.
Старый 14.06.2013, 22:36
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 16:55.