Jump to content

Помогите понять оборот данных


Recommended Posts

Форумчане, я начинающий программист в сфере модов на МТА, и потихоньку разбираюсь в этом, но есть один вопрос, который я не могу понять. Как происходит обмен данными между сервером и клиентом. К примеру как передать время которое сейчас на серверной машине, клиенту у которого к примеру переданное значение мы вписываем в dxDrawText.

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

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

Link to comment

Ну вот смотри, сейчас я пытаюсь реализовать синхронизацию реального времени по средствам запроса времени на сервере, т.е. через функцию getRealTime(), в итоге мы получим данные вида, к примеру:

realtime = getRealTime()

и получаем по частям: realtime.hour , realtime.minute, realtime.second

далее нужно их передать клиенту, т.е. все выше-перечисленные переменные и присвоить уже на стороне клиента объекту dxDrawText. а уже потом на стороне клиента с помощью таймера будет просчитываться время по таймеру. Как передать данные с сервера клиенту?

Link to comment

"оборот данных" звучит прикольно ((: а я-то думал это просто обмен

-- на стороне клиента должна быть создано свое событие 
-- 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

MX_Master, во, спасибо тебе огромное, теперь я в полне понял как это работает =) Благодарю всех кто хоть как-то помог, даже самую малость =) Побольше бы таких людей =]

Link to comment

Есть еще вопрос, вот по поводу таймера. В какой момент времени, а точнее после какого события он включается? Я так понял он включается при старте сервера, тогда как реализовать включение таймера после определенного события, допустим после спавна игрока?

Я так понимаю, нужно написать функцию, которую присвоить событию onPlayerSpawn

addEventHandler("onPlayerSpawn",getRootElement(),TImerStart) 
[i][color=#BFBFBF]-- где TImerStart функция которая состоит всеголишь из setTimer()[/color][/i] 

и уже потом при этом событии оно запускается, но идёт ли нужный мне повтор? То, что вы написали получается что сервер производит постоянное обновление тем самым допустим расчитывая на крупный онлайн к примеру 500 - сервер вынужден отправлять 500 пакетов за раз только в этой функции. Будет ли удобней сделать к примеру только отправку часа, минут и секунд, а уже потом на стороне клиента каждую секунду выполнять функцию просчёта времени?

Link to comment

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

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

в моем примере таймер включается после старта серверной стороны ресурса. Но вот при спавне таймеров делать не надо, надо просто выполнить функцию 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
Я не совсем понял про что ты хочешь сделать, но если хочешь просто поставить реальное веремя на своем сервере то вот скрипт:
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

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...