05:07
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 1
  • 1
Модератор форума: AXE, PrettySweetie  
Переход с Pawn на Lua. Часть 4
PrettySweetieДата: Воскресенье, 17.04.2011, 12:13 | Сообщение # 1
Местный
Группа: Продвинутые
Сообщений: 704
Награды: 19
Город: Нериак
Репутация: 1221
Замечания: 0%
Статус:
Переход с Pawno на Lua. Часть 4 — server и client side.

Чтобы пойти дальше, нам необходимо узнать о серверных и клиентских скриптах и об их различиях.
С этим понятием вы уже встречались в предыдущих уроках.
Грубо говоря — клиентские скрипты, это то, что может выполнятся только на стороне клиента. А серверные — только на стороне сервера.
В клиентских скриптах всегда определен игрок, и скрипт будет выполнятся только для этого игрока. В этом плюс клиентских скриптов — там в функциях не надо писать для какого игрока эта функция будет выполнятся.
Звучит сложновато, поэтому давайте разберем все это дело на примере создания иконок.

Если вы будете использовать эту функцию в серверной части, то вот, что вам придется делать:

Code

createBlip ( float x, float y, float z, [int icon=0, int size=2, int r=255, int g=0, int b=0, int a=255,  
int ordering=0 *, float visibleDistance=99999.0, visibleTo = getRootElement()] )

А вот что в клиентской части:

Code

createBlip ( float x, float y, float z, [int icon=0, int size=2, int r=255, int g=0, int b=0, int a=255,  
int ordering=0, float visibleDistance ] )

Что изменилось? Во втором примере нету visibleTo = getRootElement(), этот параметр отвечает за то, кому будет показываться иконка. А, как вы только что узнали, в клиентской части игрок уже определен, соответственно и иконка, создаваемая в клиенте, будет показываться только этому игроку.
Что бы вы поняли что к чему, вот еще один пример:

Забрать деньги у игрока:
Сервер

Code

takePlayerMoney ( player thePlayer, int amount )

Клиент

Code

takePlayerMoney ( int amount )

Нету thePlayer, параметра, который отвечает за то, у какого игрока забрать деньги.

Но есть такие функции, в которых игрока надо определять и для клиента и для сервера, например функция получить имя игрока:
Сервер

Code

getPlayerName(source)

Клиент
Code

getPlayerName(getLocalPlayer())

Функция getLocalPlayer () получает игрока этого клиентского ресурса. Это так же может пригодится в функциях, связанных с элементами или педами (пед — это, насколько я понял, модель игрока, то есть, педом может быть как игрок, так и NPC), например:

Code

setElementData ( getLocalPlayer(), “level”, 1 )

getLocalPlayer вам будет часто пригождаться, поэтому, чтобы вам меньше писать, предлагаю в начало каждого своего клиентского скрипта добавлять:
Code

localPlayer = getLocalPlayer()

И потом уже заместо getLocalPlayer использовать везде просто localPlayer.

Есть функции, которые работают только в клиенте (например getLocalPlayer() работает только в клиенте) или только на сервере, вот примеры:
Пример сервера:

Code

giveWeapon ( source, 31, 200 )

То есть, если вы вставите эту функцию в клиентский скрипт, то она там работать не будет.
Пример клиента:
Code

guiCreateButton( 0.7, 0.1, 0.2, 0.1, "Output!", true )

То же самое, в сервере работать не будет.

Но ведь довольно часто бывает, что надо из клиента вызвать сервервную функцию (или наоборот), для этого используют triggerServerEvent или triggerClientEvent.
Первая используется для вызова серверной функции из клиента, а вторая используется для вызова клиентской функции из сервера.
Полный код triggerServerEvent:

Code

triggerServerEvent ( ивент, элемент, который будет source сервеной функции, аргумент )

Пример:
В клиенте вводите это:
Code

function greetingCommand ( commandName )
     triggerServerEvent ( "onGreeting", getLocalPlayer(), "Hello World!" )  
end
addCommandHandler ( "greet", greetingCommand )

А в сервере это:
Code

function greetingHandler ( message )
     outputChatBox ( "Сообщение от клиентской части: " .. message, source )
end
addEvent( "onGreeting", true )
addEventHandler( "onGreeting", getRootElement(), greetingHandler )

Здесь, когда вы вводите команду /greet, вам напишет:
Сообщение от клиентской части: Hello World!

Полный код triggerClientEvent:

Code

triggerClientEvent ( для какого лемента вызваем, название ивента, какой элемент будет рутом, аргументы )


Пример:
В сервере вводите это:
Code

function greetingCommandOne ( source, commandName )
             triggerClientEvent ( source, "onGreeting", getRootElement(), "Hello World!")
end
addCommandHandler ( "greet", greetingCommandOne )


А в клиенте это:
Code
function greetingHandler ( message )
     outputChatBox ( "Сообщение от серверной части: " .. message )
end
addEvent( "onGreeting", true )
addEventHandler( "onGreeting", getRootElement(), greetingHandler )

Здесь, когда вы вводите команду /greet, вам напишет:
Сообщение от серверной части: Hello World!

Что еще:
Все клиентские скрипты скачиваются игроку, следовательно он может их открыть.
Чтобы сервер знал, что этот скрипт у вас клиентский, надо добавлять в meta.xml

Code

type="client"

подробнее смотрите во втором уроке.
У меня бывает, что вызываемая через triggerClientEvent функция совершенно непонятно почему не работает.
Таки плюшки, как: GUI, замена моделей, проигрывание звука, работает только в клиентской части.

P.S. Этот, и все остальные мои уроки написанны так, как я понимаю Lua и как мне удобно в нем работать

Ссылки:
Клиентские функции
Серверные функции
triggerClientEvent
triggerServerEvent


toneysixДата: Воскресенье, 17.04.2011, 12:37 | Сообщение # 2
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
Wolf_War вообще по сути начало уроков нужно начинать с создания изучения самого языка, потому что без структуры, операторов и самих вспомогательных функций lua написать что-либо не получится, нужно привести примеры различий, самое главное создание переменных, массивов, таблиц, множеств и их присвоений значений, типы переменных, операторы, функции и прочее.


Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
PrettySweetieДата: Воскресенье, 17.04.2011, 12:47 | Сообщение # 3
Местный
Группа: Продвинутые
Сообщений: 704
Награды: 19
Город: Нериак
Репутация: 1221
Замечания: 0%
Статус:
toneysix, а это шо? Почти все, что здесь в коде написанно, уже изучалось в предыдущих уроках.




Сообщение отредактировал Wolf_War - Воскресенье, 17.04.2011, 12:48
toneysixДата: Воскресенье, 17.04.2011, 13:07 | Сообщение # 4
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
Wolf_War все равно это не начало, нужно всегда начинать с изучение самого языка и что самое первое, создание переменных, множеств, таблиц и их типы. Вот например сам пройдись по своим урокам и попробуй сделать легкую систему домов исходя из этого, как думаешь, ты сможешь сделать? Нет, потому что в твоих уроках ни слова о самом главном, о переменных, таблиц и множеств.


Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
PrettySweetieДата: Воскресенье, 17.04.2011, 13:29 | Сообщение # 5
Местный
Группа: Продвинутые
Сообщений: 704
Награды: 19
Город: Нериак
Репутация: 1221
Замечания: 0%
Статус:
toneysix, ну кэп то намекает что на данном этапе еще нельзя сделать систему домов, но и Москва не сразу строилась. Так что все будет.




Сообщение отредактировал Wolf_War - Воскресенье, 17.04.2011, 13:30
toneysixДата: Воскресенье, 17.04.2011, 14:06 | Сообщение # 6
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
Wolf_War опять ты меня не понял, я намекаю тебе, что все нужно делать последовательно, соблюдать иерархию, как и везде.


Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
PrettySweetieДата: Воскресенье, 17.04.2011, 16:20 | Сообщение # 7
Местный
Группа: Продвинутые
Сообщений: 704
Награды: 19
Город: Нериак
Репутация: 1221
Замечания: 0%
Статус:
toneysix, ну я других уроков не читал, так что уж как могу


AirKiteДата: Пятница, 08.07.2011, 00:54 | Сообщение # 8
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
МТА уже ожидает новую армию быдлокодеров.
Согласен с toneysix, нужно прочитать http://www.lua.ru/doc/ хотя бы 2 пункт. Займёт минут 30, зато потом будете больше понимать.
Code

2 - Описание языка
2.1 - Лексические соглашения
2.2 - Значения и типы
2.2.1 - Приведение типов
2.3 - Переменные
2.4 - Операторы
2.4.1 - Порции
2.4.2 - Блоки
2.4.3 - Присваивание
2.4.4 - Управляющие конструкции
2.4.5 - Оператор For
2.4.6 - Вызов функции
2.4.7 - Локальные объявления
2.5 - Выражения
2.5.1 - Арифметические операции
2.5.2 - Операции сравнения
2.5.3 - Логические операции
2.5.4 - Конкатенация
2.5.5 - Получение длины
2.5.6 - Приоритет операций
2.5.7 - Конструкторы таблиц
2.5.8 - Вызовы функций
2.5.9 - Объявление функций
2.6 - Области видимости
2.7 - Обработка ошибок
2.8 - Метатаблицы
2.9 - Окружение
2.10 - Сборщик мусора
2.10.1 - Метаметоды сборщика мусора
2.10.2 - Таблицы «слабых» ссылок
2.11 - Подпрограммы



[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)


Jabber: airkite@qip.ru
[Addon] QuickBinder
[FS] Online Players Record
  • Страница 1 из 1
  • 1
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua