Воскресенье, 26 Июня 2022, 19:55

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » Структура данных чата.
Структура данных чата.
1nfernoДата: Понедельник, 06 Декабря 2010, 03:53 | Сообщение # 1
был не раз
Сейчас нет на сайте
Доброго времени суток.
Частенько просматриваю этот форум, но к сожалению мало вижу толковых тем =((. Ну да ладно... давайте попробуем

Собственно хотелось бы послушать мнения людей по данному вопросу.
Нужно придумать структуру сообщения в котором будут передаваться сообщения чата(а скорее чатов).
Имеем: обычная браузерная ММОРПГ. У игрока в игре общение происходит посредством нескольких чатов, а именно:
чат локации
(соответственно общение с игроками, которые находятся в текущей локации, можно адресовать сообщения кому либо, приватных сообщений нет)
Чат группы
(отправляются сообщения группе , в которой состоит игрок, можно адресовать сообщения, приватных нет)
Чат клана
(аналогично)
Приватные чаты

Считаю так будет лучше - отделить приватные сообщения от простых. Незнаю как реализовать приватные чаты - их же количество не определенное , и они должны появляться, когда я например захотел с кем то поговорить и их можно закрывать. Также было бы неплохо сделать динамические групповые чаты.
С первыми тремя чатами(локация, группа, клан) вроде все просто, проблема с приватными.
Чаты сделаны с помошью AJAX. Передается JSON в нем все сообщения для всех чатов. Клиентская сторона - только javascript, флэша нет.
Структура таблицы чата думаю должна быть примерно такая:
Chat table

id (id сообщения)
timestamp (Временная метка , когда было послано сообщение)
type1 (тип сообщения, к какому чату оно относится, принимает четыре значения: location, group, clan, private)
type2 (в зависимости от поля type1 принимает значения: location - id локации, group - id или имя группы, clan - название или id клана, private - id или имя игрока с кем идет приватная переписка)
who (кто отсылает сообщения)
to (кому адресовано сообщение)
message (текст сообщения)

Так у не получится отсылать сообщение нескольким игрокам(например в какойнить локации сказать одним сообщением васе и пети).
Думаю JSON должен выглядеть примерно так:
{
type1_location:[{who:"user1", to:"user5", message:"bla bla bla"},
{who:"user7", to:"user5", message:"bla bla bla"},
{who:"user3", to:"", message:"bla bla bla"}
]
type1_group:[
аналогично
]
type1_clan:[
аналогично
]
type1_private[
А вот тут хз как
]
type1_privategroup[
было бы неплохо и такую штуку сделать
]
}

Вот как то так. Может это конечно и полная бредятина, может есть какое то решение попроще, или правильнее.
Буду благодарен за любые подсказки.

FlamebergeДата: Понедельник, 06 Декабря 2010, 12:36 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
думаю проще будет поставить идентификатор: "private" для личных (спасибо кэп) где сообщение передаётся только получателю и "public" где передаются всем на локации/группе/клану... (в зависимости от вкладки). во многих играх где нет стопицот вкладок, т.е. их число строго зафиксировано, 4 например, есть отдельная вкладка где принимаются только личные сообщения. если игрок получил сообщение то вкладка начинает светится.
вышеописанное мной тоже может быть полным бредом ибо я это не изучал достаточно глубоко и считаю вышеуказанный алгоритм правильным
lvovandДата: Понедельник, 06 Декабря 2010, 12:59 | Сообщение # 3
старожил
Сейчас нет на сайте
я может чего не допонял, но в чем сложность, в таблице чата у тебя есть поле "to", ты когда отправляешь сообщение, если переменная "to" - чей-то id, то сообщение приватное, если "to - пустое", то сообщение видно всем

Разработка и продвижение сайтов. Дизайн
cougraAccДата: Понедельник, 06 Декабря 2010, 16:47 | Сообщение # 4
Яркая личность GD
Сейчас нет на сайте
Приватный проще всего реализовать:
например есть форма:
Code

<form>
<input type=hidden name=priv value=0><input type=text name=msg><input type=submit>
</form>

<input type=hidden name=priv>
Этот инпут передает значения 0 если публичное, или ид юзера кому отправляем сообщение, это если приватное, далее через js реализуем передачу текста в текстовое поле, потом скрипт обрабатывает, ну а вывод идет также, выводим только юзеру с этим ид


कृष्ण यजुर् वेद के उपनिषद संस्कार, ज्ञान और वैदिक धर्म के ध्यान के पहलुओं के बारे में बताते हैं। सन्ध्या अनेक देवताओं के गायत्री मंत्र और कई सूत्र हमें इससे प्राप्त हैं। इसमें ब्रह्म ज्ञान प्राप्त करने की योग्यता पाने की प्रक्रिया (आत्म-शुद्धिकरण) के बारे में भी बताया गया है। इस उपनिषद में आद्यात्मिक साधकों के लिए वांछित तपस्या, इन्द्रिय-निग्रह, सत्य और धार्मिक जीवन बिताने पर ज़ोर दिया गया है।

Сообщение отредактировал cougraAcc - Понедельник, 06 Декабря 2010, 16:48
1nfernoДата: Среда, 08 Декабря 2010, 17:06 | Сообщение # 5
был не раз
Сейчас нет на сайте
Спасибо за ответы. Вроде немного разобрался. Просто тупил чутка.
Значит приватные сообщения будут определяться значением поля type1 = private (в базе данных).
Столбец to нам впринципе не нужен, так как значение кому мы отправляем будет частью самого сообщения - message.

Теперь остался еще один вопрос. Как сделать групповые приватные чаты:
Например я нажимаю на какого нибудь пользователя и создается чат, потом могу добавить ещё сколько угодно игроков, и могу удалять их из чата.
И такие чаты может создавать каждый игрок. И каждому игроку можно создавать несколько таких (групповых приватных) чатов.

тоесть нужно гдето хранить информацию о этих чатах и кто в них входит.

Есть идеи ?

cougraAccДата: Среда, 08 Декабря 2010, 17:36 | Сообщение # 6
Яркая личность GD
Сейчас нет на сайте
1nferno, если значение КОМУ ты будешь отправлять и у тебя будет частью месэджа то тебе придется обработчик писать который будет выдирать из присланного сообщения кому и что, не прощу хайд инпутом отправлять?

Групповой приватный чат.
Создаем таблицу group_chat
и создаем строки, например:
ид - ид сообщения
ид_автор- ид создавшего
ид_юзерс - список ид, юзеров которые в в чате
ну там дальше сами соообщения, имена, время
И пишем скрипт ставим условие.... если включен груповой то выводить сообщения только из базы приватного чата, и добавлять только туда, а пи выводе делать выборку на наличие ид в бд


कृष्ण यजुर् वेद के उपनिषद संस्कार, ज्ञान और वैदिक धर्म के ध्यान के पहलुओं के बारे में बताते हैं। सन्ध्या अनेक देवताओं के गायत्री मंत्र और कई सूत्र हमें इससे प्राप्त हैं। इसमें ब्रह्म ज्ञान प्राप्त करने की योग्यता पाने की प्रक्रिया (आत्म-शुद्धिकरण) के बारे में भी बताया गया है। इस उपनिषद में आद्यात्मिक साधकों के लिए वांछित तपस्या, इन्द्रिय-निग्रह, सत्य और धार्मिक जीवन बिताने पर ज़ोर दिया गया है।
1nfernoДата: Среда, 08 Декабря 2010, 17:44 | Сообщение # 7
был не раз
Сейчас нет на сайте
cougraAcc,
По поводу первого вопроса: нам не нужно обрабатывать сообщение и выдирать из него имя игрока(кому послано это сообщение), это не приватное сообщение и оно видно всем.

по поводу всторого вопроса:
так вроде не прокатит:
нам нужно как то идентифицоровать чаты, ведь у каждого пользователя может быть больше одного приватного группового чата.

вот например мы убираем одного пользователя из нашего чата , какая тогда должна быть запись об этом в БД?

lvovandДата: Среда, 08 Декабря 2010, 17:50 | Сообщение # 8
старожил
Сейчас нет на сайте
количество групповых чатов ты все-таки ограничь, а то каша может начаться, а поле users будешь обновлять, если кто-то добавляется или удаляется

Разработка и продвижение сайтов. Дизайн
1nfernoДата: Среда, 08 Декабря 2010, 18:00 | Сообщение # 9
был не раз
Сейчас нет на сайте
Ну по количеству это понятно. Например каждый пользователь может создать до 10 групповых чатов. Идентифицировать их можно будет по пользователю и номеру.
Ну а насчет поля users поконкретней можно... как все это будет происходить тогда?
lvovandДата: Среда, 08 Декабря 2010, 18:17 | Сообщение # 10
старожил
Сейчас нет на сайте
а что непонятно? в поле предполагается список id юзеров группового чата,и когда идет отправка/чтение сообщений, проверяешь, чтобы id отправляющего/принимающего был в этом списке. Если кто-то добавляется или удаляется из чата, то берешь этот список, добавляешь нового или удаляешь лишнего и все

Разработка и продвижение сайтов. Дизайн
DizelistДата: Понедельник, 13 Декабря 2010, 01:09 | Сообщение # 11
частый гость
Сейчас нет на сайте
на словах то все понятно,как бы это в коде реализовать...
неплохо ды в примерах пояснить))
1nfernoДата: Понедельник, 13 Декабря 2010, 10:52 | Сообщение # 12
был не раз
Сейчас нет на сайте
Dizelist,

Видимо придется делать так:

Таблица chat(тут храняться все сообщения):

idchat - id сообщения
timestamp - время сообщения
type1 - к какому виду чата относится сообщение, значения могут быть location, group, clan, private
type2 - в зависимости от type1: id локации, имя группы, имя клана, имя игрока (владельца приватного чата)
type3 - id приватного чата, это поле нужно только для private чата.
who - автор сообщения
message - текст сообщения

Таблица privatechats(тут храняца данные о приватных чатах, кто в каких чатах находится):

idchar - владелец приватного чата
idprivatechat - id приватного чата , число от 0 до 10 например
idchar2 - имя кто состоит в чате
entered - равно 0 или 1, поле нужно для приглашения кого то в чат.
(тут получается примари кей состоит из первых трех столбцов)

Ну и примерно вот так будет выглядеть JSON для AJAX:

Code
{  
last_id:"id",
type1_location:[{who:"user1", message:"bla bla bla"},  
                        {who:"user7", message:"bla bla bla"},  
                        {who:"user3", message:"bla bla bla"}  
],  
type1_group:[аналогично],  
type1_clan:[аналогично],
type1_private[
     {
      who:"владелец чата",
      idchat:"1",
      who:"автор сообщения"
      message:"bla bla bla"
      },
      ....
      ....
      ....
]  
}

Вот вроде все.

DizelistДата: Четверг, 16 Декабря 2010, 22:10 | Сообщение # 13
частый гость
Сейчас нет на сайте
sad я не сильно понимаю эти коды, может вы бы могли написать какойто несложный рабочий пример,мнеб было проще разабратся что кчему,если вам не трудно помогите) smile
webstrict666Дата: Пятница, 17 Декабря 2010, 12:45 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
На сколько я понял вы хотите написать чат для браузерки с "комнатами" ?
Все очень просто , я могу рассказать как на PHP реализовать (метод не является единственно правильным)

Давайте начнем с того что создадим дополнительные 2 таблицы к вашей игре (chat_room и room_messages)
Теория:

Содержание таблицы chat_room:
По скольку мы рассматриваем пример, я не стал добавлять сюда дополнительный функционал.
room_id - это айди нашей комнаты (INTEGER , auto_increment )
room_title - Это название нашей комнаты (varchar)

Содержание таблицы room_messages:
msg_id - Айди нашего сообщения (integer, auto_increment)
room_id - Айди комноты куда отправлено сообщение (integer)
msg_autor - Айди автора ( integer)
msg_content - Сообщение (text)
msg_data -Время или дата отправки( datetime)
msg_to - Если приватное сообщение записываем ID получателя(integer)

Практика:

Code
--
-- Структура таблицы `room_messages`
--

CREATE TABLE IF NOT EXISTS `room_messages` (
   `msg_id` int(11) NOT NULL auto_increment,
   `room_id` int(11) NOT NULL,
   `msg_autor` int(11) NOT NULL,
   `msg_content` text NOT NULL,
   `msg_data` datetime NOT NULL,
   `msg_to` int(11) NOT NULL,
   PRIMARY KEY  (`msg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Дамп данных таблицы `room_messages`
--

--
-- Структура таблицы `chat_room`
--

CREATE TABLE IF NOT EXISTS `chat_room` (
   `room_id` int(11) NOT NULL auto_increment,
   `room_title` varchar(30) NOT NULL,
   PRIMARY KEY  (`room_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Дамп данных таблицы `chat_room`
--

Перед созданием PHP кода у тебя должна быть таблица пользователей с столбцами (ID, name) или что то подобное.
Переходим к созданию PHP кода , за все у нас будет отвечать только 1 файл это файл chat.php (будьте бдительны! если вы сами писали игру то трудностей не каких возникнуть не должно... а если взяли китайские скрипты то не мучайте извилины.)

и так если вы используете модульную систему(game.php?mod=chat) то сессию не подключаем, если у вас корейская(chat.php) система то сессию вам придется подключить( session_start(); ) . Вы будите в закоментированных строках видеть МС(модульная система) и КС (корейская система) если вы используете МС то удаляем строки для КС и на оборот.

Начнем.... LOADING biggrin Дополнение будет позже


http://GAMESKROL.RU
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
AssasinДата: Пятница, 17 Декабря 2010, 13:15 | Сообщение # 15
web-coder
Сейчас нет на сайте
chat.php
Code

<?php

Подключаем сессию и другие нужные модули/классы
Подключаемся к БД

?>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
var mode = 1;
$(document).ready(function{
    setInterval(chat_update, 1000);
            function chat_update(){
                 $.get('room.php',
                    {'mode': mode},  
                    function(data){
                         $('#post').html(data);
                    });
     }
     $('#post_mess').click(function(){
      var txt = $('#text_field').val();
      $.get('post.php',
                    {'txt': txt, 'name': 'bugoga', 'mode': mode, 'private': ''},  
                    function(data){
                         $('#post').html(data);
       $('#text_field').val('')
       $('#text_field').focus();
                    });
      return false;
     });
     $('#room1').click(function(){
      mode = 1;
      return false;
     });
     $('#room2').click(function(){
      mode = 2;
      return false;
     });  
});
</script>
<a href='#' id='room1'>Name Room 1</a>
<a href='#' id='room2'>Name Room 2</a>
<div id='post'></div>
<div id='button'><form method='post'><input type='text' id='text_field'><input type='submit' id='post_mess'></form></div>

room.php

Code

<?php

function mess($mode) {
$result = mysql_query("SELECT * FROM `room_messages` WHERE `room_id`='".$mode."'") or die(mysql_error());
   $count = mysql_num_rows($result);
   $count -= 20;
   if($count < 0) { $count = 0; }
   $zap_mess = mysql_query("SELECT * FROM `room_messages` WHERE `room_id`='".$mode."' ORDER BY `msg_id` ASC LIMIT ".$count.",20") or die(mysql_error());   
   while ($row_mess = mysql_fetch_array($zap_mess)) {
    $mess .= "<div>[".date('H:i', $row_mess['msg_data'])."] ".$row_mess['msg_autor'].": ".$row_mess['msg_content']."</div>";
   }
return $mess;
}

if ($_GET) {
  Подключаемся к БД
  $mode = preg_replace('/[^0-9]/','',$_GET['mode']);
  switch($mode) {
   case 1: echo mess(1); break;
   case 2: echo mess(2); break;
  }
}

?>

post.php

Code

if ($_GET) {
  Подключаемся к БД
  $mode = preg_replace('/[^0-9]/','',$_GET['mode']);
  $txt = htmlspecialchars($_GET['txt']);
  $name = htmlspecialchars($_GET['name']);
  $name_private = htmlspecialchars($_GET['private']);
  $time = time();
  $txt = iconv('UTF-8', 'CP1251', $txt);
  $name = iconv('UTF-8', 'CP1251', $name);
  mysql_query("INSERT INTO `room_messages` (`room_id`,`msg_data`,`msg_autor`,`name_private`,`msg_content`) VALUES ('".$mode."','".$time."','".$name."','".$txt."')") or die(mysql_error());
function mess($mode) {
$result = mysql_query("SELECT * FROM `room_messages` WHERE `room_id`='".$mode."'") or die(mysql_error());
   $count = mysql_num_rows($result);
   $count -= 20;
   if($count < 0) { $count = 0; }
   $zap_mess = mysql_query("SELECT * FROM `room_messages` WHERE `room_id`='".$mode."' ORDER BY `msg_id` ASC LIMIT ".$count.",20") or die(mysql_error());   
   while ($row_mess = mysql_fetch_array($zap_mess)) {
    $mess .= "<div>[".date('H:i', $row_mess['msg_data'])."] ".$row_mess['msg_autor'].": ".$row_mess['msg_content']."</div>";
   }
return $mess;
}
  switch($mode) {
   case 1: echo mess(1); break;
   case 2: echo mess(2); break;
  }
}

Это без привата, но приват можно самому сделать основываясь на данном коде. Возможно где то ошибся, так что сильно не пинать smile

webstrict666Дата: Пятница, 17 Декабря 2010, 13:46 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
+ красава))) но я хотел предложить на case мутить) чтоб переключать было проще) блин ну ладно

Добавлено (17.12.2010, 13:46)
---------------------------------------------
а все красава) заметил что как я хотел мутить) (думаем на одной волне видно) smile ток не понятно к чему тут Ява?


http://GAMESKROL.RU
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
AssasinДата: Пятница, 17 Декабря 2010, 13:58 | Сообщение # 17
web-coder
Сейчас нет на сайте
java-script для обновления сообщений чата + для отправки их не перезагружая страницу.
webstrict666Дата: Пятница, 17 Декабря 2010, 14:13 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
все понятно smile бальшое спасибо се на заметку возьму)

http://GAMESKROL.RU
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
DizelistДата: Воскресенье, 06 Февраля 2011, 17:35 | Сообщение # 19
частый гость
Сейчас нет на сайте
smile огромное спасибо webstrict666 и Assasin,очень хорошие примерчики

Добавлено (06.02.2011, 06:02)
---------------------------------------------
как бы сделать чтоб приватные сообщения видел только я??
$row_mess['to']= имя кому пишем.

Code

<?php   
include "config.php";    

$data = mysql_connect($base_name, $base_user, $base_pass);    
mysql_select_db($db_name);    

function mess($privat) {   
$chat = mysql_query("select * from chat");   

while ($row_mess = mysql_fetch_array($chat)) {   
$mess .= "<div>[".date('H:i', $row_mess['data'])."] ".$row_mess['users']."] to [".$row_mess['to']."] ".$row_mess['msg']."</div>";
}

return $mess;   
}   

echo mess(test);
?>   

Добавлено (06.02.2011, 17:35)
---------------------------------------------
подскажите как реализовать вывод всех сообщений но чтоб приватные адресованные мне видел только я...
вот по этому примеру

Code

while ($row_mess = mysql_fetch_array($chat)) {    
$mess .= "<div>[".date('H:i', $row_mess['data'])."] ".$row_mess['users']."] to [".$row_mess['to']."] ".$row_mess['msg']."</div>";  
}


Сообщение отредактировал Dizelist - Воскресенье, 06 Февраля 2011, 06:02
lvovandДата: Воскресенье, 06 Февраля 2011, 17:43 | Сообщение # 20
старожил
Сейчас нет на сайте
запрос немного подправить надо:

$chat = mysql_query("select * from chat where `to` = '' OR `to` = '".$privat."' ");


Разработка и продвижение сайтов. Дизайн
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » Структура данных чата.
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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