FalKRiSt Posted March 16, 2012 Share Posted March 16, 2012 Форумчане, я начинающий программист в сфере модов на МТА, и потихоньку разбираюсь в этом, но есть один вопрос, который я не могу понять. Как происходит обмен данными между сервером и клиентом. К примеру как передать время которое сейчас на серверной машине, клиенту у которого к примеру переданное значение мы вписываем в dxDrawText. Очень буду благодарен если вы объясните доступно весь этот процесс (не создавал бы тему, не найдя понятного объяснения или урока). Как я понял должны быть функция на обеих сторонах (клиент и сервер), и в итоге функция клиента вызывает функцию сервера, тем самым получает какой-то отклик в виде данных, которые нам и нужны. В теории всё понял, но на практике как реализовать еще не понял. Заранее буду благодарен. Link to comment
Other Languages Moderators Disinterpreter Posted March 16, 2012 Other Languages Moderators Share Posted March 16, 2012 Ты про триггеры? Link to comment
FalKRiSt Posted March 16, 2012 Author Share Posted March 16, 2012 Ну вот смотри, сейчас я пытаюсь реализовать синхронизацию реального времени по средствам запроса времени на сервере, т.е. через функцию getRealTime(), в итоге мы получим данные вида, к примеру: realtime = getRealTime() и получаем по частям: realtime.hour , realtime.minute, realtime.second далее нужно их передать клиенту, т.е. все выше-перечисленные переменные и присвоить уже на стороне клиента объекту dxDrawText. а уже потом на стороне клиента с помощью таймера будет просчитываться время по таймеру. Как передать данные с сервера клиенту? Link to comment
TwiX! Posted March 16, 2012 Share Posted March 16, 2012 https://wiki.multitheftauto.com/wiki/TriggerClientEvent Link to comment
MX_Master Posted March 16, 2012 Share Posted March 16, 2012 "оборот данных" звучит прикольно ((: а я-то думал это просто обмен -- на стороне клиента должна быть создано свое событие -- true означает, что событие может быть вызвано сервером addEvent( "myTimeEvent", true ) -- потом следом добавим функцию-обрабтчик для этого события function changeTime ( hours, minutes ) -- код по изменению времени в клиенте end -- событие может быть вызвано только текущим ресурсом addEventHandler( "myTimeEvent", resourceRoot, changeTime ) с сервера, допустим, каждую минуту, вызываем это клиентское событие у каждого игрока function syncTime () local hours, minutes = getTime() triggerClientEvent( "myTimeEvent", root, hours, minutes ) end setTimer( syncTime, 60*1000, 0 ) Link to comment
FalKRiSt Posted March 16, 2012 Author Share Posted March 16, 2012 MX_Master, во, спасибо тебе огромное, теперь я в полне понял как это работает =) Благодарю всех кто хоть как-то помог, даже самую малость =) Побольше бы таких людей =] Link to comment
FalKRiSt Posted March 16, 2012 Author Share Posted March 16, 2012 Есть еще вопрос, вот по поводу таймера. В какой момент времени, а точнее после какого события он включается? Я так понял он включается при старте сервера, тогда как реализовать включение таймера после определенного события, допустим после спавна игрока? Я так понимаю, нужно написать функцию, которую присвоить событию onPlayerSpawn addEventHandler("onPlayerSpawn",getRootElement(),TImerStart) [i][color=#BFBFBF]-- где TImerStart функция которая состоит всеголишь из setTimer()[/color][/i] и уже потом при этом событии оно запускается, но идёт ли нужный мне повтор? То, что вы написали получается что сервер производит постоянное обновление тем самым допустим расчитывая на крупный онлайн к примеру 500 - сервер вынужден отправлять 500 пакетов за раз только в этой функции. Будет ли удобней сделать к примеру только отправку часа, минут и секунд, а уже потом на стороне клиента каждую секунду выполнять функцию просчёта времени? Link to comment
Flaker Posted March 16, 2012 Share Posted March 16, 2012 Я не совсем понял про что ты хочешь сделать, но если хочешь просто поставить реальное веремя на своем сервере то вот скрипт: local function TimeUpdate() local tReal = getRealTime(); -- Получаем время local tGameHour, tGameMins = getTime(); if tGameHour ~= tReal.hour or tGameMins ~= tReal.minute then setTime( tReal.hour, tReal.minute ); -- при частом использовании setTime, мир будет "дёргаться", поэтому лучше сделать такую проверочку. end end setMinuteDuration( 60000 ); --Перепроверка времени раз в минуту setTimer( TimeUpdate, 5000, 0 ); В этом случае не надо использовать клиент файл, только серверная часть. Link to comment
MX_Master Posted March 16, 2012 Share Posted March 16, 2012 в моем примере таймер включается после старта серверной стороны ресурса. Но вот при спавне таймеров делать не надо, надо просто выполнить функцию syncTime() function syncTime () local hours, minutes = getTime() triggerClientEvent( source or root, "myTimeEvent", root, hours, minutes ) end setTimer( syncTime, 60*1000, 0 ) addEventHandler( "onPlayerSpawn", root, syncTime ) Link to comment
FalKRiSt Posted March 16, 2012 Author Share Posted March 16, 2012 Я не совсем понял про что ты хочешь сделать, но если хочешь просто поставить реальное веремя на своем сервере то вот скрипт: local function TimeUpdate() local tReal = getRealTime(); -- Получаем время local tGameHour, tGameMins = getTime(); if tGameHour ~= tReal.hour or tGameMins ~= tReal.minute then setTime( tReal.hour, tReal.minute ); -- при частом использовании setTime, мир будет "дёргаться", поэтому лучше сделать такую проверочку. end end setMinuteDuration( 60000 ); --Перепроверка времени раз в минуту setTimer( TimeUpdate, 5000, 0 ); В этом случае не надо использовать клиент файл, только серверная часть. Я ценю то, что вы пытаетесь помочь, но в данном коде изъян. Дело в том, что при заходе на сервер, таким способом устанавливаются минуты, но не секунды. Исходя из этого получается что к примеру зашёл человек на сервер, а спустя какое-то время (к примеру секунд 20) заходит еще. В итоге получается, что у них время асинхронно на 20 секунд. Для РП мода это не очень хороший вариант. О том, что я пытаюсь реализовать. Изначально по средствам showPlayerHudComponent (source,"clock",false), мы убираем часы, после спавна игрока мы рисуем с помощью dxDrawText новые часы. Далее запрашиваем время от сервер (Час, минуту, секунду). когда клиент их получает начинаем работу таймера, с интервалом в секунду. В итоге проходя через условия расчёта, что при значении секунд равных 60 он сбрасывает на 0 а к секции минуты +1. В итоге и синхронизация времени высокая, погрешность тут я думаю может быть в раёне 2 секунд. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now