Jump to content

Общий мини "HELP ME" топик по скриптингу


Recommended Posts

И еще один вопрос:

Можно ли сделать проверку на выполненность функции?

Типо:

function ()

if (PlayerRegister (Так называется функция регистрации)) and (PlayerLogin) then

*что-то сделать*

Link to comment
  • Other Languages Moderators
И еще один вопрос:

Можно ли сделать проверку на выполненность функции?

Типо:

function ()

if (PlayerRegister (Так называется функция регистрации)) and (PlayerLogin) then

*что-то сделать*

Функция должна возвращать что либо (например boolean), с чем это можно сверить.

Link to comment
  
if PlayerRegister( player ) then 
 -- вызовет функцию и если она возвращает не nil и не false, 
 -- то продолжится выполнение кода здесь 
end 

В твоем случае можно взять акк у игрока( getPlayerAccount ) и проверить не гостевой ли он ( isGuestAccount )

Минуту опоздал

Link to comment

Блин, что-то вообще туплю..

Как в строковую переменную уместить и текст и числовую переменную, то есть:

если BB = 80, то AA должно быть "текст 80"

Link to comment
Блин, что-то вообще туплю..

Как в строковую переменную уместить и текст и числовую переменную, то есть:

если BB = 80, то AA должно быть "текст 80"

Что за BB и AA ? Переменные ?

AA = 'текст'

BB = 80 ?

Тогда просто AA = AA..' '..BB и будет у тебя AA "текст 80"

Link to comment
Блин, что-то вообще туплю..

Как в строковую переменную уместить и текст и числовую переменную, то есть:

если BB = 80, то AA должно быть "текст 80"

Что за BB и AA ? Переменные ?

AA = 'текст'

BB = 80 ?

Тогда просто AA = AA..' '..BB и будет у тебя AA "текст 80"

Да, переменные. Благодарю, Elengar.

Подскажите еще пожалуйста, "насколько глобальны" переменные (таблицы в том числе)? Просто сейчас на клиентской стороне пытаюсь использовать данные из глобальной таблицы, созданной на серверной стороне, и не получается. А trigger вроде не для этого создан. Не совсем понимаю, что делать в данном случае.

Link to comment

Да, переменные. Благодарю, Elengar.

Подскажите еще пожалуйста, "насколько глобальны" переменные (таблицы в том числе)? Просто сейчас на клиентской стороне пытаюсь использовать данные из глобальной таблицы, созданной на серверной стороне, и не получается. А trigger вроде не для этого создан. Не совсем понимаю, что делать в данном случае.

Глобальные они на той строне и в том ресурсе, где были созданы.

Link to comment

Всё никак не получается в клиенте использовать серверное значение. Финальный мой вариант был такой: в клиенте ставим triggerServerEvent; в сервере из функции, обрабатывающей этот event ставим triggerClientEvent, передавая в аргументе нужное значение, но дальше, как его принять, я не понимаю.

И примера похожего найти не могу. Не могли бы вы помочь?(что и за чем нужно делать)

Заранее большое спасибо.

Link to comment
но дальше, как его принять, я не понимаю.

Создай переменные на клиенте и функцию, которую сервер триггерит.

  
local value1 = nil; 
local value2 = nil; 
local value3 = nil; 
... 
  
function setValue (val1, val2, val3, ...) 
   value1 = val1; 
   value2 = val2; 
   YourFunctionName() ---вызывай следующую функцию, которая испольщует значения value1, ... 
  ---Или добавь сюда код 
end 
addEvent( "sendValues", true ) 
addEventHandler( "sendValues", root, setValue) 
  

Если не понятно или не то имел ввиду, кидай свои функции.

Link to comment
Всё никак не получается в клиенте использовать серверное значение. Финальный мой вариант был такой: в клиенте ставим triggerServerEvent; в сервере из функции, обрабатывающей этот event ставим triggerClientEvent, передавая в аргументе нужное значение, но дальше, как его принять, я не понимаю.

И примера похожего найти не могу. Не могли бы вы помочь?(что и за чем нужно делать)

Заранее большое спасибо.

Сервер:

  
local serverVar = 'переменная, которую ты хочешь использовать на клиенте' 
  
function transferVar() 
 triggerClientEvent('getTransferVar',source,serverVar) 
end 
addEvent('transferVar',true) 
addEventHandler('transferVar',root,transferVar) 
  

Клиент

  
local myVar -- это уже клиентская переменная, которую ты хотел где-то использовать 
  
function getTransferVar(serverVar) 
 if not serverVar then 
  triggerClientEvent('transferVar',localPlayer) 
 else 
  myVar = serverVar 
 end  
end 
addEvent('getTransferVar',true) 
addEventHandler('getTransferVar',root,getTransferVar) 
  

Если тебе нужно получить переменную с сервера в нужном месте на клиенте вызывай функцию getTransferVar()

и потом используй myVar.

Код писал прямо здесь, табуляция никакая, я его не проверял.

Link to comment

Спасибо ребят!!

У меня получилось, и знаете, я сразу сделал все правильно за исключением одной нубской ошибки: я когда принимал на клиенте переменную, еще и в eventhandler в аргумент эту переменную включал. Ну как бы "чтоб цепочка не потерялась" :mrgreen:

Link to comment

Существует ли какая-то функция, которая сделает из строки "abvgd" просто abvgd без кавычек? (мне это нужно для того, чтобы не создавать 100 функций для приема в клиентскую часть каждого значения с серверной части, а создать одну f(...), но чтобы передать через такую функцию название нужной переменной, его нужно передать строкой)

Во, нашел то, что нужно (только в PHP :mrgreen: )

Иногда бывает удобно иметь переменными имена переменных. То есть, имя переменной, которое может быть определено и изменено динамически. Обычная переменная определяется примерно таким выражением:

<?php

$a = 'hello';

?>

Переменная переменной берет значение переменной и рассматривает его как имя переменной. В вышеприведенном примере hello может быть использовано как имя переменной при помощи двух знаков доллара. То есть:

<?php

$$a = 'world';

?>

Теперь в дереве символов PHP определены и содержатся две переменные: $a, содержащая "hello", и $hello, содержащая "world".

Link to comment
Существует ли какая-то функция, которая сделает из строки "abvgd" просто abvgd без кавычек? (мне это нужно для того, чтобы не создавать 100 функций для приема в клиентскую часть каждого значения с серверной части, а создать одну f(...), но чтобы передать через такую функцию название нужной переменной, его нужно передать строкой)

Во, нашел то, что нужно (только в PHP :mrgreen: )

local nameFunc = "abvgd"-- твоя строковая переменная 
local f = loadstring(nameFunc..' = function() end')-- конкатируем строку из перменной nameFunc с строкой создания функции. Получается abvgd = function() end  
f()-- вызываем создание функции abvgd 
abvgd() 
  

Link to comment
Более легкий и менее костыльный вариант - заносить функции в таблицу.
  
t = {} 
  
function t.foo() 
  -- что-то делается 
end 
  
-- вызываем по переменной 
local s = 'foo' 
t[s]() -- сам вызов 
  

Может быть я чего-то н понимаю.. Но зачем дополнительно заносить функцию в таблицу, если все функции и так находятся в глобальной таблице _G?

Аналогиночно можно получить или вызвать функцию через _G (вместо t):

function foo() 
-- ... 
end 
  
local s = "foo"; 
  
_G[ s ](); 

А пример из PHP можно расписать так:

a = 'hello'; 
  
_G[ a ] = 'world'; 

Link to comment

Блин, ребят, что-то я совсем запутался :)

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

Может быть я неправильно задал вопрос.

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

То есть в аргумент этой функции мы передаем нужное название серверной переменной(переменных), она "находит" их в серверной части и передает в клиентскую.

Потому я и спрашивал, как из "abv" сделать просто abv, в примере Elengar строка превращается в функцию, не получается "найти" нужное значение на сервере. Или я чересчур криворук.

Link to comment
Может быть я чего-то н понимаю.. Но зачем дополнительно заносить функцию в таблицу, если все функции и так находятся в глобальной таблице _G?

Аналогиночно можно получить или вызвать функцию через _G (вместо t):

Спасибо, что-то я это сразу не припомнил.

  
addEvent 
addEventHandler 
triggerClientEvent 
triggerServerEvent 

В доке все расписано.

--cient 
addEvent( 'onClientGetSpecialValues', true ) 
local key = false -- пускай будет стандартное значение 
  
addEventHandler( 'onClientResourceStart', resourceRoot, function() 
  triggerServerEvent( 'getSpecialValues', root ) 
end ) 
  
addEventHandler( 'onClientGetSpecialValues', root, function( _key ) 
  key = _key 
end ) 
  
-- хардкор вариант, не рекомендую 
addEventHandler( 'onClientGetSpecialValues', root, function( keys ) 
  for key, value in pairs( keys ) do 
    _G[key] = value 
  end 
end ) 
  

--server 
addEvent( 'getSpecialValues', true ) 
local key = true 
  
addEventHandler( 'getSpecialValues', root, function() 
  triggerClientEvent( client, 'onClientGetSpecialValues', root, key ) 
end ) 
  
-- хардкор вариант 
local keys = { 
  key = true; 
  key2 = true; 
} 
addEventHandler( 'getSpecialValues', root, function() 
  triggerClientEvent( client, 'onClientGetSpecialValues', root, keys ) 
end ) 
  

Link to comment
Блин, ребят, что-то я совсем запутался :)

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

Может быть я неправильно задал вопрос.

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

То есть в аргумент этой функции мы передаем нужное название серверной переменной(переменных), она "находит" их в серверной части и передает в клиентскую.

Потому я и спрашивал, как из "abv" сделать просто abv, в примере Elengar строка превращается в функцию, не получается "найти" нужное значение на сервере. Или я чересчур криворук.

Ну так тем же превращением с помощью loadstring , только вместо обьявления функции делай что-то такое

'varToServer = '..nameVar и потом уже varToServer отправляй на сервере.

Link to comment
Я в клиентской части пытаюсь создать функцию, которая будет принимать с сервера на клиент нужные значения переменных.

То есть в аргумент этой функции мы передаем нужное название серверной переменной(переменных), она "находит" их в серверной части и передает в клиентскую.

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

Link to comment
Ну так тем же превращением с помощью loadstring , только вместо обьявления функции делай что-то такое

'varToServer = '..nameVar и потом уже varToServer отправляй на сервере.

Да, получилось! Спасибо!

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

Спасибо за предупреждение, обязательно учту это в дальнейшем!

Благодарю всех за помощь! :)

Link to comment
Боюсь представить, что будет с вашим сервером когда клиентскую часть взломают.. Особенно с использованием loadstring, можно будет сделать не хитрую инъекцию и выполнить произвольный код, что даст полный доступ к серверу (можно будет выдать себе админку, скачать серверные скрипты и потом удалить их с сервера.. перечислять можно бесконечно)
Можно ли как-нибудь защититься от этого?
Link to comment
Боюсь представить, что будет с вашим сервером когда клиентскую часть взломают.. Особенно с использованием loadstring, можно будет сделать не хитрую инъекцию и выполнить произвольный код, что даст полный доступ к серверу (можно будет выдать себе админку, скачать серверные скрипты и потом удалить их с сервера.. перечислять можно бесконечно)
Можно ли как-нибудь защититься от этого?

От чего? От своих ошибок? Не нужно просто делать такие вещи которые позволяют клиенту как-то манипулировать сервером, в том числе использовать ElementData только для передачи данных клиенту, но не обратно. А если хочется наказать тех кто меняет ElementData, то достаточно повесить на сервере событие onElementDataChange, если клиент меняет ElementData то в это событие передаётся указатель client по которой можно выдать бан.

Как по вашему живут web-сайты? Уже в любом нормальном браузере есть всякие инструменты разработки которые позволяют редактировать HTML код, писать скрипты на JS, и посылать любой HTTP запрос серверу.

Link to comment
От чего? От своих ошибок? Не нужно просто делать такие вещи которые позволяют клиенту как-то манипулировать сервером, в том числе использовать ElementData только для передачи данных клиенту, но не обратно. А если хочется наказать тех кто меняет ElementData, то достаточно повесить на сервере событие onElementDataChange, если клиент меняет ElementData то в это событие передаётся указатель client по которой можно выдать бан.

Можешь пожалуйста объяснить поподробнее, как клиент может изменить себе сам элемент дату?

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...