Всем привет, с вами снова я. Сегодня мы попытаемся "оживить" сервер. Начнём-с=)
objServer create (добавляем)
Code
users = 0//переменная отвечает за кол-во юзеров на сервере
objServer step
Code
newuser = dll39_tcp_accept(server,true)
if newuser
{
users += 1
}
Тут догадаться легко.
dll39_tcp_accept проверяет наличие новых коннектов к сокету server. И если кто ломится в гости, увеличиваем переменную users.
objServer draw
Code
draw_text(5,5,"users: "+string(users)+"#fps: "+string(fps))
Ну можно запустить=) Одна проблемка, при отключение юзера, серверу на это глубоко пофиг. Помните функцию из первого урока -
dll39_tcp_connected? Она нам и нужно. Попутно объясняю,
dll39_tcp_accept возвращает сокет нового игрока, их нужно лишь пролистать и проверить на коннект... Но для начала нужно создать некое хранилище сокетов и прочей инфы о юзере. Лично я использую массивы, но можно и списки.
objServer create
Code
for (i=0;i<32;i+=1)
{
ulist[i]=-1
}
Создаём массив, из 32 ячеек.
Теперь нам нужно отсортировать наших юзеров, каждому новому дать определённый идентификатор, ID. Создаём скрипт.
_newID
Code
var i
for (i=0;i<32;i+=1)
{
if ulist[i] = -1
return i
}
Скрипт перебирает наш массив, и если там есть свободная ячейка, возвращает её номер. Это очень важно, обязательно раздуплите, как это работает!!
objServer step
Code
...
if newuser
{
users += 1
newuser_id = _newID()
ulist[newuser_id] = newuser
}
Хех=) Мы занесли сокет нашего нового юзера в массив... Осталось перебрать его. Снова скрипт.
_users
Code
u=0
var i
for (i=0;i<32;i+=1)
{
if ulist[i] != -1 {u+=1}
}
return u
Смотрим сколько у нас
не свободных ячеек, возвращаем их кол-во.
Удаляем строку
objServer step
Я вас по всей видиости очень утомил... Ничего, чуток осталось=)
Скрипт:
_testing
Code
var i
for (i=0;i<32;i+=1)
{
if ulist[i] != -1
{
user_state = dll39_tcp_connected(ulist[i])
if !user_state {ulist[i] = -1}
}
}
Скрипт просматривает список (массив) юзеров, проверяе соединение с помощью
dll39_tcp_connected и если проверка неудачна, очищает ячейку массива.
Добавляем скрипт в стэп сервера запускаем и та-та-та-да!
Работает, разрази меня гром=)
Хех, много за сегодня сделано. Аш целых 3 новых скрипта создано и изучена одна функция. Естественно, этот метод не самый простой, но он один из лучших. Многие создают для каждого нового юзера отдельных объект, и работают через него. Это проще, но производительность, увы, страдает... На последок, скажу - скрипт _testing и _users можно, и нужно объединить.
_users
Code
var i
for (i=0;i<32;i+=1)
{
if ulist[i] != -1
{
user_state = dll39_tcp_connected(ulist[i])
if !user_state {ulist[i] = -1}
}
}
u=0
var i
for (i=0;i<32;i+=1)
{
if ulist[i] != -1 {u+=1}
}
return u
Как это работает понять не сложно, перечитайте урок, удалите скрипт _testing и строчку (objServer step) _testing().