МОД Шахмат (chessmod 0.0.1)

Поддержка старых модов или модов, созданных авторами не из нашего сообщества, а также любые вопросы, связанные с модами для phpBB 2.0.x, кроме относящихся к форуму Для авторов (phpBB 2.0.x).

Сообщение arhi 18.02.2007 12:28

arhi писал(а):Обнаружил следующее (возможно мой недочет, но не понял в чем)

При создании новой темы, если сразу создавать партию шахмат она не появляется, только в такой последовательности:

Создал тему - нажал редактировать - поставил галочку "создать новую партию". Тогда появляется

В чем проблема?

Ну а если подумать, предположения есть?
arhi
phpBB 2.0.0
 
Сообщения: 113
Зарегистрирован: 25.01.2007 21:08


Сообщение Zlodey12 24.02.2007 12:20

go писал(а):интересно теперь придется каждый раз обновлять страницу чтобы увидеть очередной ход соперника7


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

Добавлено спустя 2 часа 30 минут 15 секунд:

И пускай мои знания в php стремятся к нулю, но методом copy-paste владею не хуже VVVas'a
Вот что получилось:

Правим файл chess_posting.php (Прим. - у меня стоит первая версия "Шахмат")
1. Для тех, у кого стоит мод ADR
в конце функции function chess_posting_play (), перед строкой
redirect(append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id", true));
вставляем
Код: Выделить всё
include($phpbb_root_path . 'adr/includes/adr_functions_communicate.'.$phpEx);
$subject = $lang['Topic_Chess'];
$dest = ($chess_info['chess_p1_id'] == $userdata['user_id'] ? $chess_info['chess_p2_id'] : $chess_info['chess_p1_id']);
$message = sprintf("Ваш ход");
adr_send_pm ($dest , $subject  , $message );

то есть эта часть кода должна выглядеть примерно так:
Код: Выделить всё
...
         //$message =  $lang['Chess_played'].'<br /><br />' . sprintf($lang['Click_return_topic'], '<a href="' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id") . '">', '</a>');
         //message_die(GENERAL_MESSAGE, $message);
      }
   }

// *** added by Zlodey ***
include($phpbb_root_path . 'adr/includes/adr_functions_communicate.'.$phpEx);
$subject = $lang['Topic_Chess'];
$dest = ($chess_info['chess_p1_id'] == $userdata['user_id'] ? $chess_info['chess_p2_id'] : $chess_info['chess_p1_id']);
$message = sprintf("Ваш ход");
adr_send_pm ($dest , $subject  , $message );
// *** added by Zlodey ***

   redirect(append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id", true));
}

function chess_posting_action ()
{
   global $mode, $chess_delete, $confirm;
...

Эти пять строчек будут после каждого вашего хода отправлять сопернику по игре личное сообщение с темой "Шахматы" и сообщением "Ваш ход". Ну, тут вы сами можете подправить что вам нужно. Я, например, собираюсь еще в тело письма вставить ссылку на тему игры (ведь я могу играть сразу несколько партий) чтобы не путаться.

2. Для тех, у кого НЕ стоит мод ADR
делаем то же самое, только без строки
include($phpbb_root_path . 'adr/includes/adr_functions_communicate.'.$phpEx);
Код: Выделить всё
...
         //$message =  $lang['Chess_played'].'<br /><br />' . sprintf($lang['Click_return_topic'], '<a href="' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id") . '">', '</a>');
         //message_die(GENERAL_MESSAGE, $message);
      }
   }

// *** added by Zlodey ***
$subject = $lang['Topic_Chess'];
$dest = ($chess_info['chess_p1_id'] == $userdata['user_id'] ? $chess_info['chess_p2_id'] : $chess_info['chess_p1_id']);
$message = sprintf("Ваш ход");
adr_send_pm ($dest , $subject  , $message );
// *** added by Zlodey ***

   redirect(append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id", true));
}

function chess_posting_action ()
{
   global $mode, $chess_delete, $confirm;
...

дополнительно в самом конце файла chess_posting.php, перед ?>
вставляем функцию отправки сообщений:
Код: Выделить всё
//
// функция отправки сообщений, выдранная из ADR
//

function adr_send_pm ( $dest_user , $subject , $message )
{
   global $db , $phpbb_root_path , $phpEx , $lang, $user_ip, $board_config , $userdata;

   $dest_user = intval($dest_user);
   $msg_time = time();
   $from_id = $userdata['user_id'];

   $html_on = 1;
    $bbcode_on = 1;
    $smilies_on = 1;

   include_once($phpbb_root_path . 'includes/functions_post.'.$phpEx);
   include_once($phpbb_root_path . 'includes/bbcode.'.$phpEx);
   
   $privmsg_subject = trim(strip_tags($subject));
   $bbcode_uid = make_bbcode_uid();
   $privmsg_message = trim(strip_tags($message));

   // APM compliance
   if ( defined('PRIVMSGA_TABLE'))
   {
      include_once($phpbb_root_path . 'includes/functions_messages.'.$phpEx);
      send_pm( 0 , '' , $dest_user , $privmsg_subject, $privmsg_message, '' );
   }
   else
   {
      $sql = "SELECT user_id, user_notify_pm, user_email, user_lang, user_active
          FROM " . USERS_TABLE . "
          WHERE user_id = $dest_user ";
      if ( !($result = $db->sql_query($sql)) )
      {
         $error = TRUE;
         $error_msg = $lang['No_such_user'];
      }
      $to_userdata = $db->sql_fetchrow($result);

      $sql = "SELECT COUNT(privmsgs_id) AS inbox_items, MIN(privmsgs_date) AS oldest_post_time
         FROM " . PRIVMSGS_TABLE . "
         WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
           OR privmsgs_type = " . PRIVMSGS_READ_MAIL . "
            OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )
         AND privmsgs_to_userid = $dest_user ";
      if ( !($result = $db->sql_query($sql)) )
      {
          message_die(GENERAL_MESSAGE, $lang['No_such_user']);
      }

      $sql_priority = ( SQL_LAYER == 'mysql' ) ? 'LOW_PRIORITY' : '';

      if ( $inbox_info = $db->sql_fetchrow($result) )
      {
         if ( $inbox_info['inbox_items'] >= $board_config['max_inbox_privmsgs'] )
         {
            $sql = "SELECT privmsgs_id FROM " . PRIVMSGS_TABLE . "
               WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
               OR privmsgs_type = " . PRIVMSGS_READ_MAIL . "
               OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . "  )
               AND privmsgs_date = " . $inbox_info['oldest_post_time'] . "
               AND privmsgs_to_userid = $dest_user ";
            if ( !$result = $db->sql_query($sql) )
            {   
               message_die(GENERAL_ERROR, 'Could not find oldest privmsgs (inbox)', '', __LINE__, __FILE__, $sql);
            }
            $old_privmsgs_id = $db->sql_fetchrow($result);
            $old_privmsgs_id = $old_privmsgs_id['privmsgs_id'];
           
            $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TABLE . "
               WHERE privmsgs_id = $old_privmsgs_id";
            if ( !$db->sql_query($sql) )
            {
               message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs (inbox)'.$sql, '', __LINE__, __FILE__, $sql);
            }

            $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TEXT_TABLE . "
               WHERE privmsgs_text_id = $old_privmsgs_id";
            if ( !$db->sql_query($sql) )
            {
               message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs text (inbox)', '', __LINE__, __FILE__, $sql);
            }
         }
      }

      $sql_info = "INSERT INTO " . PRIVMSGS_TABLE . "
         (privmsgs_type, privmsgs_subject, privmsgs_from_userid, privmsgs_to_userid, privmsgs_date, privmsgs_ip, privmsgs_enable_html, privmsgs_enable_bbcode, privmsgs_enable_smilies)
         VALUES ( 1 , '" . str_replace("\'", "''", addslashes($privmsg_subject)) . "' , " . $from_id . ", " . $to_userdata['user_id'] . ", $msg_time, '$user_ip' , $html_on, $bbcode_on, $smilies_on)";
      if ( !$db->sql_query($sql_info) )
      {
         message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs text (inbox)', '', __LINE__, __FILE__, $sql_info);
      }

      $privmsg_sent_id = $db->sql_nextid();

      $sql = "INSERT INTO " . PRIVMSGS_TEXT_TABLE . " (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text)
         VALUES ($privmsg_sent_id, '" . $bbcode_uid . "', '" . str_replace("\'", "''", addslashes($privmsg_message)) . "')";
      if ( !$db->sql_query($sql, END_TRANSACTION) )
      {
         message_die(GENERAL_ERROR, "Could not insert/update private message sent text.", "", __LINE__, __FILE__, $sql);
      }

      $sql = "UPDATE " . USERS_TABLE . "
         SET user_new_privmsg = user_new_privmsg + 1, user_last_privmsg = " . time() . "
         WHERE user_id = " . $to_userdata['user_id'];
      if ( !$status = $db->sql_query($sql) )
      {
          message_die(GENERAL_ERROR, 'Could not update private message new/read status for user', '', __LINE__, __FILE__, $sql);
      }

      if ( $to_userdata['user_notify_pm'] && !empty($to_userdata['user_email']) && $to_userdata['user_active'] )
      {
         // have the mail sender infos
         $script_name = preg_replace('/^\/?(.*?)\/?$/', "\\1", trim($board_config['script_path']));
         $script_name = ( $script_name != '' ) ? $script_name . '/privmsg.'.$phpEx : 'privmsg.'.$phpEx;
         $server_name = trim($board_config['server_name']);
         $server_protocol = ( $board_config['cookie_secure'] ) ? 'https://' : 'http://';
         $server_port = ( $board_config['server_port'] <> 80 ) ? ':' . trim($board_config['server_port']) . '/' : '/';

         include_once($phpbb_root_path . './includes/emailer.'.$phpEx);
         $emailer = new emailer($board_config['smtp_delivery']);
       
         if  ( $board_config['version'] == '.0.5' || $board_config['version'] == '.0.6' || $board_config['version'] == '.0.7' || $board_config['version'] == '.0.8' || $board_config['version'] == '.0.9' )
         {   
            $emailer->from($board_config['board_email']);
            $emailer->replyto($board_config['board_email']);
            $emailer->use_template('privmsg_notify', $to_userdata['user_lang']);
         }
         else
         {
            $email_headers = 'From: ' . $board_config['board_email'] . "\nReturn-Path: " . $board_config['board_email'] . "\n";
            $emailer->use_template('privmsg_notify', $to_userdata['user_lang']);
            $emailer->extra_headers($email_headers);
         }
         $emailer->email_address($to_userdata['user_email']);
         $emailer->set_subject($lang['Notification_subject']);

         $emailer->assign_vars(array(
            'USERNAME' => $to_username,
            'SITENAME' => $board_config['sitename'],
            'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
            'U_INBOX' => $server_protocol . $server_name . $server_port . $script_name . '?folder=inbox')
          );

         $emailer->send();
         $emailer->reset();
      }
   }
   return;
}


Я знаю, что эта функция избыточна, и специалисты по php предложат другую конструкцию, но для меня главное, что это всё работает ;)
Zlodey12
phpBB 2.0.2
 
Сообщения: 166
Зарегистрирован: 10.02.2007 10:09

Сообщение rxu 24.02.2007 12:24

Zlodey12 писал(а):я не модератор, поэтому стараюсь подсказать, а не послать...

Сомнитеный девиз. Говорит о том, что Вы просто не читали сообщения модераторов. Отвечать на это сообщение не надо.
Изображение
Аватара пользователя
rxu
phpBB Guru
 
Сообщения: 4524
Зарегистрирован: 12.05.2006 17:16
Откуда: Красноярск

Сообщение Zlodey12 24.02.2007 19:39

вот еще одна мысль, как увидеть, что в шахматах твой ход, не заходя в саму тему.
К типу [Chess] (в русском варианте - [Шахматы]) рядом с названием темы будет добавляться [Мой ход], если соперник походил и теперь ваша очередь.
Для этого редактируем файл chess_viewforum.php
строку
Код: Выделить всё
   $topic_type .= $lang['Topic_Chess'] . ' ';

заменяем на
Код: Выделить всё
// *** replaced by Zlodey ***
//   $topic_type .= $lang['Topic_Chess'] . ' ';
$user_id = $userdata['user_id'];
   $sql = "SELECT chess_turn FROM " . CHESS_TABLE . " WHERE topic_id = $topic_id AND chess_p2_id != 0 LIMIT 1";
   if (!$result = $db->sql_query($sql))
      {
         message_die(GENERAL_ERROR, "Что-то не так", '', __LINE__, __FILE__, $sql);
      }
   $blablabla = $db->sql_fetchrow($result);
   $chess_turn = $blablabla['chess_turn'];
   if ( $chess_turn == $user_id )
      {   
$topic_type .= $lang['Topic_Chess'] . ' [ Мой ход ] ';
      }
   else    {
$topic_type .= $lang['Topic_Chess'] . ' ';
      }
// *** replaced by Zlodey ***

естественно, строку
$topic_type .= $lang['Topic_Chess'] . ' [ Мой ход ] ';
можно отредактировать по своему вкусу.

Поскольку это мои первые строчки на php, то пришлось потыкаться над ними часа 2 методом проб и ошибок)).
Можно использовать как совместно с уведомлением через ЛС (мое предыдущее сообщение), так и отдельно
Zlodey12
phpBB 2.0.2
 
Сообщения: 166
Зарегистрирован: 10.02.2007 10:09

Сообщение Gisher 04.03.2007 11:36

посел установки мода AbTrack BT-Tracker MOD
при нажатии на новую тему, или ответить, появляется такое
Код: Выделить всё
Template->make_filename(): Error - template file not found: chess/templates/smartDark/chess_posting_body.tpl

файл на месте, меняю стиль на silver, выдаёт
Код: Выделить всё
Template->make_filename(): Error - template file not found: chess/templates/subSilver/chess_posting_body.tpl

обе файла по путям лежат на своих местах...
в моде AbTrack BT-Tracker MOD требовалось только замена includes/template.php файла от eXtreme Styles...
как не странно, посты в быстром ответе отправляются...
что именно может вызвать такую ошибку?
Gisher
phpBB 2.0.11
 
Сообщения: 468
Зарегистрирован: 04.10.2006 6:50

Сообщение Gosudar 04.03.2007 12:58

chess_posting_body и chess_viewtopic_body скопируй сюда :
root/templates/---theme_name---/
Gosudar
phpBB 2.0.6
 
Сообщения: 252
Зарегистрирован: 16.07.2005 22:10

Сообщение Gisher 04.03.2007 13:05

Gosudar
спасибо, за отзыв))
всё таки правильно говорят, не стоит беты моды ставить)
глюк прошёл, просто переписал все файлы с версии 2)))
Gisher
phpBB 2.0.11
 
Сообщения: 468
Зарегистрирован: 04.10.2006 6:50

Сообщение TiChoblin 04.03.2007 16:24

мод хороший, только его бы ещё продумать бы надо хорошенько... чтобы была функция играть не в теме, а через ПМ... :)

Добавлено спустя 1 час 56 минут 24 секунды:

кстати, почему нет кнопочки "сдаться"?
Нужно вовремя стирать воспоминания, иначе воспоминания сотрут нас.

Моды я ищу тут и тут. Иногда тут, и совсем редко тут.
И ещё иногда полезно смотреть сюда
А если Вы что-то ищете, то вам надо сюда

Помощь по ЛС и ICQ ТОЛЬКО за вознаграждение.
Аватара пользователя
TiChoblin
phpBB 2.0.5
 
Сообщения: 238
Зарегистрирован: 30.04.2006 8:30
Откуда: Химки

Сообщение arhi 19.03.2007 21:05

Zlodey12 писал(а):инересная особенность в другом - иногда этот мод "позволяет" убивать короля и продолжать игру дальше, до полного истребления фигур ))))))))))

Такая же фигня пронаблюдалась... - безобразие :lol:
TiChoblin писал(а):кстати, почему нет кнопочки "сдаться"?

Да, а еще неплохо бы "ничья" :)
arhi
phpBB 2.0.0
 
Сообщения: 113
Зарегистрирован: 25.01.2007 21:08

Сообщение arhi 22.03.2007 20:20

Такс...а кто подскажет, как бы убрать лишнюю фигуру в базе? Тут у меня партия важная, но вдруг появилась лишняя ладья (как - не знаю, вроде у всех рукава в обтяжечку были :lol: ), вот я полазил по базе, не очень там все понятно. Никто не пробовал?
arhi
phpBB 2.0.0
 
Сообщения: 113
Зарегистрирован: 25.01.2007 21:08

Сообщение Gosudar 22.03.2007 23:12

смотри таблицу phpbb_chess там есть chess_list_position
там и расположение фигур.
К примеру: ,BN,,,BK,,,BR;BR,B,B,BB,WQ,B,BB,B;,......
Начиная с А8: а8-пусто,b8-BN-чёрный конь, c8 - пусто, d8-пусто, e8-BK-чёрный король и т.д. и т.п.

пы.сы. себе хочешь лишнюю ладью поставить?
Gosudar
phpBB 2.0.6
 
Сообщения: 252
Зарегистрирован: 16.07.2005 22:10

Сообщение rtrt 26.03.2007 0:41

А можно ли как-то сделать обновления страницы у обоих игроков при нажатии на кнопку Ход(Send)!?
Кнопки "Предложить ничью" и "Сдаться" никто еще не прилепил???
rtrt
phpBB 1.0.0
 
Сообщения: 5
Зарегистрирован: 26.03.2007 0:25

Сообщение arhi 27.03.2007 12:33

Gosudar писал(а):пы.сы. себе хочешь лишнюю ладью поставить?

Я как раз хочу у себя убрать эту лишнюю ладью...
Я не очень понял
Код: Выделить всё
BK,,,,,BR,BR,;,,,,,B,,;,,B,,,,,B;,,B,,,,BN,;,,,,,,,;,,,,,,,W;W,W,,,,,W,WK;,,,WR,,WR,,

вот что там...и как это расшифровать?

Добавлено спустя 3 минуты 11 секунд:

меня интересует черная ладья на F8

Добавлено спустя 1 минуту 43 секунды:

Ааа...понял...то есть запятая - это "пусто", а точка запятой - это чего?

Добавлено спустя 7 минут 20 секунд:

Судя по всему знак ";" означает перевод строки? :)
arhi
phpBB 2.0.0
 
Сообщения: 113
Зарегистрирован: 25.01.2007 21:08

Сообщение Gosudar 27.03.2007 21:20

угу
Gosudar
phpBB 2.0.6
 
Сообщения: 252
Зарегистрирован: 16.07.2005 22:10

Сообщение Zlodey12 24.04.2007 19:30

TiChoblin писал(а):кстати, почему нет кнопочки "сдаться"?

rtrt писал(а):Кнопки "Предложить ничью" и "Сдаться" никто еще не прилепил???


сделал то, что вы просили.
алгоритм таков: под доской появляются две кнопочки (поскольку они в файле .tpl, то можете переместить их куда угодно). нажав на "Сдаюсь!" происходит вызов функции "пипец", которая записывает в базу данных сообщение о сдаче, и отключает возможность дальнейших ходов. плюс проверка условия, если кнопку нажал играющий белыми, то сообщение о сдаче пишется в его столбик ходов, в противном случае - в столбик черных.
в принципе всё предельно просто. не знаю, почему до сих пор никто это не сделал

а вот и сами изменения:

файл posting.php

после
Код: Выделить всё
   case 'chess_delete':
   case 'chess_join':
   case 'chess_play':


добавляем:
Код: Выделить всё
//
// *** added by Zlodey ***
   case 'pipez':
// *** added by Zlodey ***
//

делаем это в двух местах

после
Код: Выделить всё
chess_posting_action();


добавляем:
Код: Выделить всё
//
// *** added by Zlodey ***
if ($mode == "pipez")
{
chess_pipez();
   redirect(append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id", true));
}
// *** added by Zlodey ***
//



файл chess_posting.php

перед
Код: Выделить всё
function chess_posting_entry ()


добавляем:
Код: Выделить всё
//
// *** added by Zlodey ***
// *** функция Пипец ***
function chess_pipez()
{
global $db, $userdata, $topic_id;
$username = $userdata['username'];
$user_id = $userdata['user_id'];
   $sql = "SELECT chess_list_move , chess_p1_id FROM " . CHESS_TABLE . "   WHERE topic_id = $topic_id LIMIT 1";
   if (!$result = $db->sql_query($sql))
      {
         message_die(GENERAL_ERROR, "Непонятный облом", '', __LINE__, __FILE__, $sql);
      }
   $temp1 = $db->sql_fetchrow($result);
   $chess_list_move = $temp1['chess_list_move'];
   $chess_p1_id = $temp1['chess_p1_id'];
   if ( $chess_p1_id == $user_id )
   {
      $chess_list_move = explode( '|', $chess_list_move );
      $chess_list_move[0] = $chess_list_move[0] . " <font color=red>" . $username . " сдался</font>";
      $chess_list_move = implode( '|', $chess_list_move );
   }
   else
   {
      $chess_list_move = $chess_list_move . " <font color=red>" . $username . " сдался</font>";
   }
      $sql = "UPDATE " . CHESS_TABLE . " SET chess_closed = 1 , chess_turn = 0, chess_list_move = '$chess_list_move' WHERE topic_id = $topic_id LIMIT 1";
      if( !($result = $db->sql_query($sql)) )
      {
         message_die(GENERAL_ERROR, "Непонятный облом", '', __LINE__, __FILE__, $sql);
      }
}
// *** функция Пипец ***
// *** added by Zlodey ***
//



файл chess_viewtopic.php

после
Код: Выделить всё
'S_CHESS_ACTION' => append_sid("posting.$phpEx?mode=chess_play&amp;" . POST_TOPIC_URL . "=$topic_id"),


добавляем:
Код: Выделить всё
//
// *** added by Zlodey ***
               'S_PIPEZ_ACTION' => append_sid("posting.$phpEx?mode=pipez&amp;" . POST_TOPIC_URL . "=$topic_id"),
// *** added by Zlodey ***
//


файл chess_viewtopic_body.tpl

после
Код: Выделить всё
<input type='submit' name='chess_play' value='{L_CHESS_SUBMIT}' class='mainoption'><br /></span>


добавляем:
Код: Выделить всё
<!-- *** added by Zlodey *** -->
<table align=left><tr><td>
<input type=button name='pipez' onclick="window.open ('{S_PIPEZ_ACTION}')" value='Сдаюсь!'>
<input type=button name='nich' value='Ничья?'>
</table>
<!-- *** added by Zlodey *** -->


пробуйте, у меня вроде всё работает так, как задумывалось

P.S. Кнопка "Ничья" пока не работает, поскольку функция ничьи еще не писалась. если будет время, постараюсь сделать до выходных

Добавлено спустя 4 минуты 43 секунды:

ах да, забыл сказать, что это для версии 0.0.1
Вложения
0.rar
уже исправленные файлы (кроме posting.php)
(7.81 Кб) Скачиваний: 169
Zlodey12
phpBB 2.0.2
 
Сообщения: 166
Зарегистрирован: 10.02.2007 10:09

Пред.След.

Вернуться в Поддержка модов для phpBB 2.0.x

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0