PlayGround.ru
Ropnet
GTA.ru

Главная

GTA V

Аккаунт

GTA: Vice City Stories

GTA IV

GTA: Liberty City Stories

GTA: San Andreas

GTA: Vice City

GTA: Chinatown Wars

GTA 3

GTA 2

GTA

Форумы

Сервер
  Статистика
  Cкриптинг в MTA: DeathMath
    Первое руководство
    Второе руководство
    Третье руководство
    Четвёртое руководство
    Пятое руководство
    Шестое руководство
  SA-MP FAQ
  Руководство MTA:SA Race Mod
  Создание карт в MTA:SA Race Mod

О проекте

Реклама

Новости




GTA.ru Race #2
[0/]

статистика
GTA LEAGUE t/cw | 1 | gta.ru vk.com/gtaleague
[0/30]

GTA LEAGUE t/cw | 2 | gta.ru vk.com/gtaleague
[0/30]

GTA.ru Sniper Madness
[0/30]

GTA.Ru | Map Editor gta.ru:22002
[0/64]

GTA.Ru | Coming Soon | 22000
[0/200]

GTA.Ru | Coming Soon | 33013
[0/32]

GTA.Ru | Stealth Public Server (w/ Stats System)
[0/32]

GTA.Ru | Race Server
[0/32]

GTA.Ru | One Click Kill Tactics Server | 33004
[0/1]

GTA.ru Freeroam LU Server
[0/64]

GTA.ru TDM Server
[0/30]


Голосовой чат: 0


GTA.ru > Сервер > Cкриптинг в MTA: DeathMath > Первое руководство
Первое руководство по скриптингу в Multi Theft Auto: DeathMatch


Добро пожаловать на первое обучающее руководство по MTA скриптингу. С нашим коротким руководством мы попробуем вам показать, как скриптить в LUA используя наши функции, шаг за шагом, использования небольших кодовых фрагментов, объяснения функций и логики использующаяся в коде. Мы будем так же включать обучающее видео с каждым руководством, таким образом, Вы сможете фактически видеть то, что делает весь код.

Давайте начнём наше первое обучение: Выбираемые пользователем пункты перемещения.

На этой неделе мы будет писать скрипт, позволяющий пользователям создавать их собственные пункты перемещения.

Более определённо мы собираемся позволить игрокам создавать целевой маркер, маркер назначения и переместить себя чтобы они могли проверить пункты перемещения на правильность.

Обучающее видео: scriptvideo1.wmv - (640x480, 30fps, 5mb)
Готовый скрипт: script1.lua




Запуск нашего скрипта


MTA скриптинг – полностью базируемый на событиях (events). События (Events) действительно динамические и фактически, Вы можете сделать собственные с помощью ваших скриптов, но в этом примере мы будем использовать уже созданные, из которых MTA использует приблизительно 40. События “вызываются”, когда в игре случаются определённые вещи. Мы можем связать наши собственные функции с любым событием (вызывая функцию, называемую addEventHandler). Каждое событие может иметь любое число “подсобытий” или ни одного!

Мы создадим нашу первую функцию и назовём её Script_onResourceLoad, которую мы установим вызываемой, когда сервер загрузит ресурс (resource) содержащий карту с помощью события onResourceLoad. Мы рассмотрим как MTA "ресурсы" правильно работают в следующем посте.

Затем мы создадим новый глобальную кнопку, которая будет включать, и выключать скрипт. Мы вызываем bindKey, чтобы назначить кнопку I к функции "modeIO" мы должны все же создать.

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

addEventHandler ( "onResourceLoad", getRootElement(), "Script_onResourceLoad" )
function Script_onResourceLoad ( resource )
    if ( resource == getThisResource() ) then
        -- для каждого игрока, который уже находится на сервере
        for index, player in getElementsByType ( "player" ) do
            -- связать кнопку "i" к функции "modeIO"
            bindKey ( player, "i", "down", "modeIO" )
        end
    end
end


Заметьте, что теперь мы закончили функцию ключевым словом end.

Мы забываем кое-что: вышеупомянутая функция вызывается только один раз (при загрузке карты), таким образом, любые игроки, которые присоединяются, впоследствии будут нуждаться так же в доступной кнопке I. Для этого мы можем использовать событие onPlayerJoin, которое вызывается каждый раз, когда присоединяется игрок:

addEventHandler ( "onPlayerJoin", getRootElement(), "Script_onPlayerJoin" )
function Script_onPlayerJoin ()
    -- связать кнопку "i" к функции "modeIO"
    bindKey ( source, "i", "down", "modeIO" )
end


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


Запуск нашего курсора


Определение точки перемещения с кнопками, возможно, будет трудно (и для скриптов). И идеально, мы хотели бы использовать курсор мыши. К счастью, MTA имеет в наличие хорошие функции курсора, включая showCursor который мы и будем использовать сейчас.

Давайте создадим функцию "modeIO", которую мы упоминали выше:

function modeIO ( source, key, keyState )	-- функция включает курсор
    if isCursorShowing ( source ) then-- если курсор уже показывается:
        showCursor ( source, false )		--   скрыть его
    else					-- если он не показывался: 
        showCursor ( source, true )		--   показать его
    end
end


Теперь мы имеем три функции и доступный курсор мыши, самое простое это назначить каждую функцию на разные кнопки мыши. Это мы и собираемся сделать.

MTA имеет событие называемое onPlayerClick, которое позволяет скриптёрам получать XYZ-координаты в точной позиции курсора при клике пользователя. Разумеется, это событие возможно, только если видим курсор.

Давайте начнём нашу главную функцию Script_onPlayerClick которую мы привяжем с событием onPlayerClick:

addEventHandler ( "onPlayerClick", getRootElement(), "Script_onPlayerClick" )
function Script_onPlayerClick ( key, keyState, element, x, y, z )
    if keyState == "up" then 
        return			-- игнорировать если кнопка отпущенаend



Создание наших маркеров


Прежде чем мы это сделаем, вам нужно немного понимать, как работают MTA элементы (идентично "объектам" в других играх).

MTA для всего использует элементы. Маркеры, объекты, транспорт, игроки и т.п. - это всё элементы. Это легко, потому что означает, что вы не должны проверять тип элементов каждый раз перед запросом функции. Например: если вы хотите уничтожить или установить позицию маркера, транспорт или какой то объект, просто вызовите destroyElement или setElementPosition.

Мы хотим только 2 маркера (для игрока), маркер "teleport" (телепорта) и маркер "destination" (назначения). Благодаря этому скрипт будет оставаться лёгким, обеспечивая достаточно многие функциональные возможности. Чтобы разрешить 2 маркера для игрока, мы будет хранить ID маркера, который мы создаём для каждого игрока, используя setElementData.

Если пользователь нажимает левую кнопку мыши, мы создаём маркер названный "teleport" который будет нашим порталом для телепортирования нас. Если пользователь нажимает правую кнопку мыши, мы создаём маркер "destination" который будет предназначаться для портала.

Давайте сделаем левую и правую кнопку мыши функциональными:

if key == "left" then		-- на левой кнопке мыши
    -- уничтожить его точку телепортации, если любой
    destroyElement ( getElementData ( source, "teleport" ) )
    -- создание нормального цилиндрического маркера (cylinder)
    local marker = createMarker ( x, y, z, "cylinder", 2, 0, 255, 0, 50 )
    -- отметить цилиндр как тип (type) нашего "teleport"
    setElementData ( marker, "type", "teleport" )
    -- связываем создателя (игрока) с маркером и наоборот
    setElementData ( source, "teleport", marker )
    setElementData ( marker, "owner", source )
 
elseif key == "right" then		-- на правой кнопке мыши
    -- уничтожить его точку назначения, если любой
    destroyElement ( getElementData ( source, "destination" ) )
    -- создание горящей короны (corone)
    local marker = createMarker ( x, y, z+1, "corona", 1, 0, 255, 255, 50 )
    -- отметьте корону (corone) как тип (type) нашего "destination" 
    setElementData ( marker, "type", "destination" )
    -- связываем создателя (игрока) с маркером и наоборот
    setElementData ( source, "destination", marker )
    setElementData ( marker, "owner", source )


Мы используем setElementData, чтобы хранить некоторые данные для маркера. Позже вы увидите, что это тривиально, чтобы восстановить владельца и тип маркера.

setElementData и его "партнёрская" функция getElementData оба взаимодействуют с элементами сохранения данных которые имеет функция. Эти сохранения действуют как хранилища данных, которые остаются приложенными к элементу. Вы можете поместить значения в это хранилище с кнопками, используя setElementData и позже получить к ним доступ, используя getElementData.

Помимо создания маркеров, также полезно иметь функцию перемещения, таким образом, игрок сможет телепортироватся (и сделать маркеры) где он захочет.

elseif key == "middle" then	-- на средней кнопке мыши
    -- телепортировать игрока туда, куда он щёлкнет
    setElementPosition ( source, x, y, z+1 )
end


Если вы задаетесь вопросом, какое исходное (source) слово: это относится к элементу, активировавшее событие, в данном случае игрок. Исходное (source) слово доступно или все события, в некоторых случаях являются несоответствующими.


Телепортирование нашего игрока


Маркеры, которые мы только что создали, имеют свои собственные события. Чтобы позволить скрипту знать, что маркер был "поражён" (затронут) игроком, мы может использовать событие onMarkerHit. Исходное (source) слово будет присвоено маркеру, который запустил событие:

addEventHandler ( "onMarkerHit", getRootElement(), "Script_onMarkerHit" )
function Script_onMarkerHit ( player )


Теперь мы используем данные, которые мы установили в функции Script_onPlayerClick выше, чтобы видеть какой это маркер. Это может быть или или "телепорт" ("teleport") или "назначения" ("destination").

Конечно, мы что-то делаем, только если игрок поражает маркер "телепортирования" ("teleport").

    -- если маркер - точка телепортации, продолжать
    if getElementData ( source, "type" ) == "teleport" then
        -- получение владельца переходящий в маркер типа телепортации ("teleport")
        local owner = getElementData ( source, "owner" )
        -- получение точки назначения ("destination") переходящая к владельцу
        local destination = getElementData ( owner, "destination" )
        -- если точка назначения (destination) существует, продолжить
        if destination then
            -- получение положения маркера назначения ("destination")
            local x, y, z = getElementPosition ( destination )
            -- наконец, перемещение игрока туда
            setElementPosition ( player, x, y, z )
        end
    end
end



Чистка


Наконец, мы сделаем некоторую чистку для каждого игрока. В конце концов, мы не хотим, чтобы какие то маркеры оставались поблизости после того, как игрок покинул сервер.
Как и событие onPlayerJoin, имеется так же событие onPlayerQuit которое вызывается каждый раз когда игрок покидает сервер:

addEventHandler ( "onPlayerQuit", getRootElement(), "Script_onPlayerQuit" )
function Script_onPlayerQuit ( reason )
    --уничтожить его пункт телепортации (teleport), если любой
    destroyElement ( getElementData ( source, "teleport" ) )
    -- уничтожить его пункт назначения (destination), если любой
    destroyElement ( getElementData ( source, "destination" ) )
end


На этом первое мини-руководство подходит к концу, следите за дальнейшими поступлениями на нашем сайте.





GTA V
GTA: Vice City Stories
GTA IV
GTA: San Andreas
GTA: Vice City
GTA 3
GTA 2
GTA
GTA: Chinatown Wars
GTA: Liberty City Stories
Звуковые архивы: самое интересное и необычное (14)
Mule и steed (0)
Секреты и приколы GTA 5 (466)
Пропал трафик в игре что делать? (1)
GTA5 Мутное заднее стекло и боковое в машине от 1-го лица (15)
Что за музыка? (1)
Чит-код активировался сам во время гонки (6)
Тайны альфа/бета-версии GTA: VC (228)
Болталка GTA.ru (544)
Grand Theft Auto 2 намертво зависает - Решение! (0)
Нет некоторых машин на Xbox 360 (1)
Впечатления от GTA 5 (PC) (271)
GTA III Re3 + xbox edition re3 (1)
Тайны альфа-/бета-версии GTA: SA (454)
Помогите найти репак (2)
Тайны альфа/бета-версии GTA III (449)
Как вы тратите деньги в GTA IV? (217)
popcycle.dat в the ballad of gay tony (1)
Имущество и бизнес в GTA: VCS (38)
NOOSE Patriot в трафике (1)

Последние добавленные
Grand Theft Auto: San Andreas "Убийства людей приносят деньги, восстанавливают здоровье и броню, макс. уровень розыска на выбор (SA) 1.0" 101Mb
Grand Theft Auto: San Andreas "Все машины пуленепробиваемые и ударостойкие, но уязвимы к огню и взрывам (SA) 1.0" 335Mb
Grand Theft Auto: San Andreas "Погоня Чужих на вайсидском гермесе за Сиджеем (SA)1.0" 4,981Mb
Grand Theft Auto: San Andreas "Оптимизация для старых ноутбуков (SA) v.1.3" 792Mb
GTA5 "Drift v3.9" 1,078Mb
Grand Theft Auto 4 "PS4/3 DualShock Buttons" 322Mb
Grand Theft Auto: San Andreas "Укрепление макушек всех жителей Сан Андреса на выбор (SA) 1.0" 172Mb
Grand Theft Auto: San Andreas "Всеобщее вооружение всех жителей Сан Андреса на выбор (SA) 1.0" 665Mb
Grand Theft Auto: San Andreas "Травля Сиджея магучими химерами на выбор (SA) 1.0" 7,499Mb
Grand Theft Auto 5 "Language Tool v3.3" 1,955Mb

Самые популярные
Патч GTA 4 v1.0.7.0 (скачано: 198407)
Патч GTA 4 v 1.0.3.1/1.0.4.0 (RU/ENG) (скачано: 171660)
GTA "SA-MP 0.3.7 R4 (клиент R4 и сервера R2)" (скачано: 155530)
GTA 4 "Social Club v1.1.3.0" (скачано: 139990)
Патч GTA 4 v1.0.6.1 Русская версия (скачано: 130041)
Русификатор Grand Theft Auto IV и Grand Theft Auto: Episodes from Liberty City [Steam] (скачано: 120760)
Grand Theft Auto 4 (GTA IV): Русификатор (текст) [1.0.7.0] (скачано: 113695)
GTA MTA:SA v1.3.1 (скачано: 104077)
Патч GTA 4 v1.0.1.0 EN (скачано: 98324)
Патч GTA 4 v 1.0.2.1/1.0.3.0 (RU/ENG) (скачано: 91115)






Rambler's Top100






, Injustice: Gods Among Us на Xbox 360, Hard to Be a God системные требования, дополнение к Demigod
   Copyright ©  наверх | главная | e-mail