
VCXZ
-
Posts
42 -
Joined
-
Last visited
Posts posted by VCXZ
-
-
Всем привет
Читал, что грамотнее всего подключаться к базе данных при старте ресурса, а отключаться при стопе, а не многократно подключаться/отключаться во время игры.
Допустим, при старте ресурса мы подключаемся к БД. При заходе игрока на сервер, мы берем из БД его данные и ставим ему через setElementData. А при его выходе с сервера, обновляем данные в БД.
Подскажите пожалуйста, будет ли безошибочно работать такой вариант:
1. При "внезапном" отключении игрока в связи с, например, проблемами с его подключением к интернету?
2. При не менее внезапном отключении сервера.
Заранее большое спасибо за помощь.
-
Снова всем привет.
Пробую сделать инвентарь с помощью SQLite. Понял, что для точной синхронизации между таблицей аккаунтов и таблицей инвентаря нужно использовать внешний ключ (foreign key).
Скажите пожалуйста, возможно ли использовать его в MTA ? И вообще как определить (кроме пробы вручную
), какие возможности есть, а какие ограничены?
Спасибо.
-
Не правильно. Нужно запретить изменение даты на клиенте, тогда уже делать такие триггеры. Но, если верить тому, что мне расказывали, есть особые нечестные игроки, которые могут на клиенте любой код выполнять. А если у тебя еще и скрипты буудут для всех глаз - триггернут твой ивент и ничем ты не защитишся.
P.S. В "небезопасном" клиенте у тебя функция ?
Спасибо.
Ну да, функция
Вот тут подробно описано, как защитить себяСпасибо.
Мне кажется, ссылку на эту страницу нужно добавить на главную https://wiki.multitheftauto.com/wiki/Main_Page
или сюда https://wiki.multitheftauto.com/wiki/Sc ... troduction
-
Всем привет.
Не раз на форуме видел сообщения, что нельзя разрешать изменение elementData на клиенте, т.к. в противном случае нечестные игроки будут изменять себе все данные.
Скажите пожалуйста, я правильно понимаю, что это небезопасно:
--client function ff (data, value) setElementData (localPlayer, data, value) end
а это безопасно:
--server addEvent ('changeDataFromClient', true) function funcchangeDataFromClient (data, value) setElementData (client, data, value) end addEventHandler ('changeDataFromClient', root, funcchangeDataFromClient) --client function ff (data, value) triggerServerEvent ('changeDataFromClient', localPlayer, data, value) end
Заранее спасибо за помощь.
-
Блаблабла, изучите SQL.
Блин, серьезно, опять? На этом форуме так любят SQL, что обязательно его изучить и использовать везде, где только можно?
Стоп, не надо. Как я уже писал где-то здесь, в мта есть встроенная база данных SQLite, и для хранения инвентарей, привязанных к аккаунту, вполне хватит ее возможностей. При этом язык SQL не нужно знать вообще, так как есть встроенные функции setAccountData и getAccountData, которые делают всю сложную работу за вас.
Чтобы сохранить инвентарь (а это, вероятнее всего, отдельная таблица), рекомендую просто сериализовать его и записывать полученную строку в аккаунт. Для загрузки, прочитать из аккаунта и десериализовать. Не надо городить отдельных баз данных для этого, всё уже придумано для вас.
Это тот вариант, что я предполагал в самом начале.
(осталось разобраться с (де)сериализацией)
Интересно только, почему в elementData можно хранить различные типы данных, а в accountData только строки.
-
То есть для хранения данных на сервере в любом случае придется использовать базы данных?
А возможен ли такой вариант: есть текстовый документ, в котором хранится inventar = { } (со всеми "внутренностями"), который через loadfile подгружается при старте сервера. А потом по новой записывается. Только как таблицу превратить в текст я не знаю.
Просто мне очень нравится структура таблиц в lua и поэтому хотел бы использовать их.
-
Всем привет.
Пытаюсь создать систему инвентаря, который будет сохраняться после выхода игрока.
Сначала думал использовать accountData. Но меня смущает, что в значениях можно хранить только строки (конечно, строки можно преобразовывать после получения, но это наверное лишняя морока, учитывая, что нужно хранить абсолютно различные данные)
Далее отложил этот вопрос и как раз легко и просто сделал некую "систему id", используя таблицы, которая работает следующим образом(может кому пригодится, хотя за правильность ее работы не отвечаю):
есть таблица idtableonline = { }
при старте ресурса она заполняется следующим образом:
function idtableonlineresourceStart () for i = 1, 4002, 1 do idtableonline[i] = false end end addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), idtableonlineresourceStart)
Когда игрок логинится, проверяем по этой таблице "свободный id".
for i = 1, 4002, 1 do if idtableonline[i] == false then setElementData (client, 'idonline', i) idtableonline[i] = client break end end
Когда игрок выходит, удаляем его из таблицы idtableonline.
function idtableonlineOnPlayerQuit () local id = getElementData (source, 'idonline') if idtableonline[id] ~= false then idtableonline[id] = false end end addEventHandler ('onPlayerQuit', root, idtableonlineOnPlayerQuit)
Это все вроде бы работает, и я подумал, почему бы не сделать на сервере одну огромную таблицу, в которой будет храниться инвентарь всех игроков. Принцип ее работы я предполагаю сделать примерно таким же, как и в примере выше, но без удаления данных при выходе игрока с сервера.
Но я не знаю, как сделать, чтобы данные этой таблицы сохранялись при перезапуске сервера.
Подскажите пожалуйста, как хранить таблицы на сервере и вообще разумный ли это вариант (в том числе в плане нагрузки на сервер), или нужно использовать accountData или вообще MySQL, в котором я совсем не ориентируюсь.
Спасибо.
-
Спасибо, заменил строчку 5 на "for i, massa in pairs(t) do", теперь работает.
-
Почему это не работает? Пишет, что massa это таблица. (выполняется на сервере)
function giveGruz (player) setElementData (player, "gruz", {[1] = 100, [2] = 50}) local t = getElementData (player, "gruz") for i, massa in pairs{ t } do outputChatBox( i..' '..massa, player ) end end addCommandHandler ('gg', giveGruz)
-
Спасибо. Еще вроде можно сделать attach и выставить анимацию. Но тут придется для каждой машины координаты вычислять.
-
Возможно ли изменить максимальное количество пассажиров для транспорта? Узнать можно (getVehicleMaxPassengers) изменить не знаю как. В интернете есть пара упоминаний про setVehicleMaxPassengers, но сейчас этой функции нет.
-
Всем привет.
Пытаюсь сделать на сервере неровности на дороге, нашел, на мой взгляд, подходящие объекты, добавил, но машина/игрок проходят сквозь них. Вроде бы как, проблема в отсутствии коллизии (не совсем пока понимаю, что к чему). Как можно сделать эти объекты осязаемыми? Пример интересующего объекта: id 854 (CJ_urb_rub_3b)
-
Извиняюсь за нубский вопрос.
Сейчас если с нуля погружаться в изучение баз данных, с чего лучше начать? С этого топика viewtopic.php?f=153&t=37482 или https://wiki.multitheftauto.com/wiki/RU/ ... /MTA-MySQL ?
-
Ребят, не совсем по теме. Наткнулся на видео
(гта сан андреас с графикой и физикой как в гта 4, или наоборот, гта 4 с картой и объектами как в gta SA).Представьте какой крутой был бы мультиплеер. Вот только какие нужны компы
-
Ну так тем же превращением с помощью loadstring , только вместо обьявления функции делай что-то такое
'varToServer = '..nameVar и потом уже varToServer отправляй на сервере.
Да, получилось! Спасибо!
Боюсь представить, что будет с вашим сервером когда клиентскую часть взломают.. Особенно с использованием loadstring, можно будет сделать не хитрую инъекцию и выполнить произвольный код, что даст полный доступ к серверу (можно будет выдать себе админку, скачать серверные скрипты и потом удалить их с сервера.. перечислять можно бесконечно)
Спасибо за предупреждение, обязательно учту это в дальнейшем!
Благодарю всех за помощь!
-
Блин, ребят, что-то я совсем запутался
Я и так, и сяк пытался применить ваши варианты - у меня ничего не выходит.
Может быть я неправильно задал вопрос.
Я в клиентской части пытаюсь создать функцию, которая будет принимать с сервера на клиент нужные значения переменных.
То есть в аргумент этой функции мы передаем нужное название серверной переменной(переменных), она "находит" их в серверной части и передает в клиентскую.
Потому я и спрашивал, как из "abv" сделать просто abv, в примере Elengar строка превращается в функцию, не получается "найти" нужное значение на сервере. Или я чересчур криворук.
-
Существует ли какая-то функция, которая сделает из строки "abvgd" просто abvgd без кавычек? (мне это нужно для того, чтобы не создавать 100 функций для приема в клиентскую часть каждого значения с серверной части, а создать одну f(...), но чтобы передать через такую функцию название нужной переменной, его нужно передать строкой)
Во, нашел то, что нужно (только в PHP
)
Иногда бывает удобно иметь переменными имена переменных. То есть, имя переменной, которое может быть определено и изменено динамически. Обычная переменная определяется примерно таким выражением:<?php
$a = 'hello';
?>
Переменная переменной берет значение переменной и рассматривает его как имя переменной. В вышеприведенном примере hello может быть использовано как имя переменной при помощи двух знаков доллара. То есть:
<?php
$$a = 'world';
?>
Теперь в дереве символов PHP определены и содержатся две переменные: $a, содержащая "hello", и $hello, содержащая "world".
-
Я находил готовый скрипт поворотников, он работает вполне хорошо, правда на некоторых машинах кривовато стоит, но это мелочи. Проблема в том, что он работает на клиентской стороне, то есть наверное другим игрокам не будет видно. Хотя я точно не знаю.
-
Спасибо ребят!!
У меня получилось, и знаете, я сразу сделал все правильно за исключением одной нубской ошибки: я когда принимал на клиенте переменную, еще и в eventhandler в аргумент эту переменную включал. Ну как бы "чтоб цепочка не потерялась"
-
Всё никак не получается в клиенте использовать серверное значение. Финальный мой вариант был такой: в клиенте ставим triggerServerEvent; в сервере из функции, обрабатывающей этот event ставим triggerClientEvent, передавая в аргументе нужное значение, но дальше, как его принять, я не понимаю.
И примера похожего найти не могу. Не могли бы вы помочь?(что и за чем нужно делать)
Заранее большое спасибо.
-
Блин, что-то вообще туплю..
Как в строковую переменную уместить и текст и числовую переменную, то есть:
если BB = 80, то AA должно быть "текст 80"
Что за BB и AA ? Переменные ?
AA = 'текст'
BB = 80 ?
Тогда просто AA = AA..' '..BB и будет у тебя AA "текст 80"
Да, переменные. Благодарю, Elengar.
Подскажите еще пожалуйста, "насколько глобальны" переменные (таблицы в том числе)? Просто сейчас на клиентской стороне пытаюсь использовать данные из глобальной таблицы, созданной на серверной стороне, и не получается. А trigger вроде не для этого создан. Не совсем понимаю, что делать в данном случае.
-
Блин, что-то вообще туплю..
Как в строковую переменную уместить и текст и числовую переменную, то есть:
если BB = 80, то AA должно быть "текст 80"
-
Memory, блин, это просто супер круто!! Спасибо огромное! Действительно работает: пробовал взорваться гранатой, прыгать с крыш, тонуть в воде!
Kernell, а что, было бы довольно неплохо
его код сработает.
Попробовал на всякий случай, потонул
Кстати, на счет кода Memory, я въехал в заправку на машине, всё-таки умер. Но думаю можно сделать так, чтобы в таком случае игрок появлялся рядом с машиной с 1 хп, используя onClientVehicleDamage, немного позже обязательно займусь этим.
-
Memory, Kenix, благодарю, ребят, выручаете.
А кто-нибудь заметил, что в ссылке, которую предоставил Kenix, объясняется пример с точно таким же числом, про которое спросил я
Общий мини "HELP ME" топик по скриптингу
in Скриптинг
Posted
Еще побродив по интернету, пришел к выводу, что правильнее всего важные действия сразу отображать в БД, а мелкие раз в какое-то время. (думаю, к мелким можно отнести допустим количество патронов у игрока или количество бензина в машине)