Что происходит с Гм?
| |
Abel399 | Дата: Пятница, 24 Августа 2012, 08:27 | Сообщение # 1 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Приветствую всех) Вот столкнулся с напастью... GM 8 Pro почему-то стал глючить.. Я делаю онлайн игру на 39dll. И все было нормально, но как только в игре добавил новый супер удар на сервере в одном месте почему-то стала происходить белеберда. Он действовал не по скрипту и подставлял для переменных свои личные результаты, при этом не слушаясь операторов if и else.. Проблема в логине и регистрации. Допустим регаемся, сервер создает аккаунт первее чем узнает есть ли такой, а потом выдает, что имя занято я уже ставил и 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; } По моему код правильный.. Но я уверен что старожилы форума обязательно его обкритикуют и найдут ошибку)) А если все правильно, то тогда почему такая ерунда? Уверен, что вы поможете) Заранее благодарю)
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 и так может быть до бесконечности Какую переменную увеличивает? Ты уверен что у тебя больше нет кода относящегося к теме?
Quote (Abel399) А может ли это быть связано с тем, что game maker крякнутый? Не может.
Добавлено (26.08.2012, 12:21) --------------------------------------------- Ах Я понял в чем задумка, сложно такой код читать. Просто я не совсем понял зачем там вообще цикл, если все делается за один проход с помощью 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 |
|
| |
|