Понедельник, 18 Ноября 2024, 23:18

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Что происходит с Гм?
Abel399Дата: Пятница, 24 Августа 2012, 08:27 | Сообщение # 1
Surpass your limits. Right now.
Сейчас нет на сайте
Приветствую всех) Вот столкнулся с напастью... GM 8 Pro почему-то стал глючить.. Я делаю онлайн игру на 39dll. И все было нормально, но как только в игре добавил новый супер удар на сервере в одном месте почему-то стала происходить белеберда. Он действовал не по скрипту и подставлял для переменных свои личные результаты, при этом не слушаясь операторов if и else.. Проблема в логине и регистрации. Допустим регаемся, сервер создает аккаунт первее чем узнает есть ли такой, а потом выдает, что имя занято wacko я уже ставил и break; и exit; чтобы этот наглый скрипт завершался, но он все равно сходит с ума(( В логине он сначала коннектит, а потом проверяет есть ли такой игрок в сети и тем самым отправляет не то значение переменной( - Аккаунт уже используется!!! Из логина я пока что просто убрал это обнаружение и все пока что норм, но вот рега... Она вообще с ума сходит... Он сначало регает, потом не регает.. Вообще будто это рандомно совершается((( Вот что делат клиент:
Create:
Code
dllinit(0,true,false);
global.clienttcp = tcpconnect("5.60.176.221",12564,1);
if (!tcpconnected(global.clienttcp))
{
closesocket(global.clienttcp);
show_message("Ошибка при подключении.");
game_end();
exit;
}
else
{
setnagle(global.clienttcp,1);
clearbuffer();
writebyte(2)
writestring(global.name,true);
writestring(global.pass,true);
sendmessage(global.clienttcp);
}

Step:
Code

var messagesize, messageid;

while(1)
{
messagesize = receivemessage(global.clienttcp);
if (messagesize <= 0) break;
messageid = readbyte();
switch(messageid)
{
     case 1:
     access=readbyte()
     if access=0{
     show_message("Имя занято!")
     }
     if access=1{
     show_message("Регистрация завершена.")
     room_goto(rm_login)
     }
     break;
}
}


На сервере:
Code
receivemessage(clientsocket);
connect=readbyte();
if connect=2{
     name=readstring();
     password=readstring();
     if (file_exists(name + ".ini"))=true{
         access=0;
     }
     else
     {
         ini_open(name + ".ini");
         ini_write_string('Data','pass',''+ string(password));
         ini_write_string('Data','ban','0');
         ini_close();
         access=1;
     }
     clearbuffer();
     writebyte(1)
     writebyte(access);
     sendmessage(clientsocket);
     connect=3
     exit;
}

По моему код правильный.. Но я уверен что старожилы форума обязательно его обкритикуют и найдут ошибку)) А если все правильно, то тогда почему такая ерунда? Уверен, что вы поможете) Заранее благодарю) biggrin


Ninja Slayer - 2D Physics Puzzle [cancelled]
GameMixДата: Пятница, 24 Августа 2012, 12:10 | Сообщение # 2
старожил
Сейчас нет на сайте
Abel399, сервер при старте сразу выбивает ошибку о неизвестной переменной clientsocket.

+ Постоянно объявлять переменные в Step - глупо. Это обычно делается в Create.


Steel Standoff - 2D аркада.
Мои статьи
SaladinДата: Пятница, 24 Августа 2012, 13:34 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Муть мутная.
Что за юродивый код while(1)?
Откуда берется значение переменной access? То есть я понимаю что сервер в ответ игроку отправляет пакет с этой переменной, но почему этого кода нет в посте?
Зачем используется свич с одним единственным кейс?


Анбаннэд. Хэлоу эгин =)
Abel399Дата: Пятница, 24 Августа 2012, 15:22 | Сообщение # 4
Surpass your limits. Right now.
Сейчас нет на сайте
GameMix, я не стал сюда выкладывать create сервера, но этот клиентсокет задается именно там.. while(1) - это запуск бесконечного цикла, access берется в:
Code

name=readstring();   
       password=readstring();   
       if (file_exists(name + ".ini"))=true{   
           access=0;   
       }   
       else   
       {   
           ini_open(name + ".ini");   
           ini_write_string('Data','pass',''+ string(password));   
           ini_write_string('Data','ban','0');   
           ini_close();   
           access=1;   
       }   
       clearbuffer();   
       writebyte(1)   
       writebyte(access);   
       sendmessage(clientsocket);   
       connect=3   
       exit;

если файл существует, то access=0,а иначе равно 1. 0 - Имя занято, 1 - Регистрация завершена
В конце это все отправляется клиенту
Свич потому что там не один кейс! Я просто сюда выложил 1 кейс))


Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Пятница, 24 Августа 2012, 15:24
SaladinДата: Пятница, 24 Августа 2012, 15:46 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Quote (Abel399)
while(1) - это запуск бесконечного цикла

Я понимаю что это бесконечный цикл, но у тебя выход из цикла стоит на всех концах. Какой смысл в этом цикле можешь обьяснить?
Quote (Abel399)
access берется в:

Я имел ввиду не функцию на сервере а пакет с переменной которую сервер отправляет клиенту.


Анбаннэд. Хэлоу эгин =)

Сообщение отредактировал Saladin - Пятница, 24 Августа 2012, 17:19
Abel399Дата: Суббота, 25 Августа 2012, 04:24 | Сообщение # 6
Surpass your limits. Right now.
Сейчас нет на сайте
Пишу по памяти, т.к. сижу с телефона... Итак если я не ошибаюсь, то сервер после вычисления переменной, отправляет пакет с ней здесь:
Code
clearbuffer();
writebyte(1);
wtitebyte(access);
send_message(clientsocket);

Ну а потом клиент обрабатывает)))- это написано в 1 посте.
Saladin, То есть ты имеешь ввиду, что цикл там бессмыслен? Где именно он все время выходит на всех концах? Я своим еще не про гемдевовским мозгом думаю что он нормально работает(((


Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Суббота, 25 Августа 2012, 04:26
SaladinДата: Суббота, 25 Августа 2012, 08:40 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Quote (Abel399)
Пишу по памяти

По памяти может быть правильно, а по факту нет.

Quote (Abel399)
Saladin, То есть ты имеешь ввиду, что цикл там бессмыслен? Где именно он все время выходит на всех концах? Я своим еще не про гемдевовским мозгом думаю что он нормально работает(((

Может какой то смысл в нем и есть, но мне он как бы непонятен. Оператор break выходит из цикла. Получается что ты получаешь пакет, а потом при любом стечении обстоятельств выходишь из цикла. Собственно какой смысл тогда заводить цикл, который ничего не зацикливает?


Анбаннэд. Хэлоу эгин =)
Abel399Дата: Суббота, 25 Августа 2012, 16:55 | Сообщение # 8
Surpass your limits. Right now.
Сейчас нет на сайте
Saladin, ладно я мож и чего-то не туда поставил... Ну выходит у меня из цикла если сообщения принимаются, а иначе цикл продолжает действовать:
Code
if (messagesize <=0) break;

Ничто кроме этого циклу не припятствует...
Ладно мы говорим об одном.. А вопрос в том - почему переменные то одни а потом другие.. И делают через раз(

Добавлено (25.08.2012, 16:54)
---------------------------------------------
я тут проверил и.... он тупо эту переменную увеличивает на 1... он не отправляет результат.. потом переменная равна 0, потом 1, потом 2 и так может быть до бесконечности

Добавлено (25.08.2012, 16:55)
---------------------------------------------
А может ли это быть связано с тем, что game maker крякнутый? просто помню как-то слышал, что время от времени его надо переустанавливать, т.к. возникают некоготорые баги..


Ninja Slayer - 2D Physics Puzzle [cancelled]
SaladinДата: Воскресенье, 26 Августа 2012, 12:21 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
while(1)
{
messagesize = receivemessage(global.clienttcp);
if (messagesize <= 0) break;
messageid = readbyte();
switch(messageid)
{
case 1:
access=readbyte()
if access=0{
show_message("Имя занято!")
}
if access=1{
show_message("Регистрация завершена.")
room_goto(rm_login)
}
break;
}
При каких условиях такой цикл повторится два раза например?

Quote (Abel399)
я тут проверил и.... он тупо эту переменную увеличивает на 1... он не отправляет результат.. потом переменная равна 0, потом 1, потом 2 и так может быть до бесконечности

Какую переменную увеличивает? Ты уверен что у тебя больше нет кода относящегося к теме? smile

Quote (Abel399)
А может ли это быть связано с тем, что game maker крякнутый?

Не может.

Добавлено (26.08.2012, 12:21)
---------------------------------------------
Ах smile
Я понял в чем задумка, сложно такой код читать. Просто я не совсем понял зачем там вообще цикл, если все делается за один проход с помощью if.

Code
if messagesize > 0
{
       messageid = readbyte();
       switch(messageid)
       {
            case 1:
            access=readbyte()
            if access=0
            {
                 show_message("Имя занято!")
            }
            if access=1
            {
                 show_message("Регистрация завершена.")
                 room_goto(rm_login)
            }
            break;
      }
}


Анбаннэд. Хэлоу эгин =)

Сообщение отредактировал Saladin - Воскресенье, 26 Августа 2012, 12:23
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг