Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

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

Ответы на вопросы, связанные с модами для phpBB 2.0.x, кроме относящихся к форуму Для авторов (phpBB 2.0.x).
arhi
phpBB 1.4.4
Сообщения: 111
Стаж: 17 лет 3 месяца
Забанен: Бессрочно

Сообщение arhi »

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

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

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

В чем проблема?
Ну а если подумать, предположения есть?
Zlodey12
phpBB 1.4.4
Сообщения: 171
Стаж: 17 лет 2 месяца

Сообщение Zlodey12 »

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 предложат другую конструкцию, но для меня главное, что это всё работает ;)
[/color]
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16370
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1745 раз

Сообщение rxu »

Zlodey12 писал(а):я не модератор, поэтому стараюсь подсказать, а не послать...
Сомнитеный девиз. Говорит о том, что Вы просто не читали сообщения модераторов. Отвечать на это сообщение не надо.
Изображение
Zlodey12
phpBB 1.4.4
Сообщения: 171
Стаж: 17 лет 2 месяца

Сообщение Zlodey12 »

вот еще одна мысль, как увидеть, что в шахматах твой ход, не заходя в саму тему.
К типу [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 методом проб и ошибок)).
Можно использовать как совместно с уведомлением через ЛС (мое предыдущее сообщение), так и отдельно
Gisher
phpBB 2.0.12
Сообщения: 857
Стаж: 17 лет 6 месяцев
Поблагодарили: 1 раз

Сообщение Gisher »

посел установки мода 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...
как не странно, посты в быстром ответе отправляются...
что именно может вызвать такую ошибку?
Gosudar
phpBB 2.0.0
Сообщения: 227
Стаж: 18 лет 9 месяцев

Сообщение Gosudar »

chess_posting_body и chess_viewtopic_body скопируй сюда :
root/templates/---theme_name---/
Gisher
phpBB 2.0.12
Сообщения: 857
Стаж: 17 лет 6 месяцев
Поблагодарили: 1 раз

Сообщение Gisher »

Gosudar
спасибо, за отзыв))
всё таки правильно говорят, не стоит беты моды ставить)
глюк прошёл, просто переписал все файлы с версии 2)))
Аватара пользователя
TiChoblin
phpBB 2.0.0
Сообщения: 222
Стаж: 18 лет
Откуда: Химки

Сообщение TiChoblin »

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

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

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

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

Помощь по ЛС и ICQ ТОЛЬКО за вознаграждение.
arhi
phpBB 1.4.4
Сообщения: 111
Стаж: 17 лет 3 месяца
Забанен: Бессрочно

Сообщение arhi »

Zlodey12 писал(а):инересная особенность в другом - иногда этот мод "позволяет" убивать короля и продолжать игру дальше, до полного истребления фигур ))))))))))
Такая же фигня пронаблюдалась... - безобразие :lol:
TiChoblin писал(а):кстати, почему нет кнопочки "сдаться"?
Да, а еще неплохо бы "ничья" :)
arhi
phpBB 1.4.4
Сообщения: 111
Стаж: 17 лет 3 месяца
Забанен: Бессрочно

Сообщение arhi »

Такс...а кто подскажет, как бы убрать лишнюю фигуру в базе? Тут у меня партия важная, но вдруг появилась лишняя ладья (как - не знаю, вроде у всех рукава в обтяжечку были :lol: ), вот я полазил по базе, не очень там все понятно. Никто не пробовал?
Gosudar
phpBB 2.0.0
Сообщения: 227
Стаж: 18 лет 9 месяцев

Сообщение Gosudar »

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

пы.сы. себе хочешь лишнюю ладью поставить?
rtrt
phpBB 1.0.0
Сообщения: 5
Стаж: 17 лет 1 месяц

Сообщение rtrt »

А можно ли как-то сделать обновления страницы у обоих игроков при нажатии на кнопку Ход(Send)!?
Кнопки "Предложить ничью" и "Сдаться" никто еще не прилепил???
arhi
phpBB 1.4.4
Сообщения: 111
Стаж: 17 лет 3 месяца
Забанен: Бессрочно

Сообщение arhi »

Gosudar писал(а):пы.сы. себе хочешь лишнюю ладью поставить?
Я как раз хочу у себя убрать эту лишнюю ладью...
Я не очень понял

Код: Выделить всё

BK,,,,,BR,BR,;,,,,,B,,;,,B,,,,,B;,,B,,,,BN,;,,,,,,,;,,,,,,,W;W,W,,,,,W,WK;,,,WR,,WR,,
вот что там...и как это расшифровать?

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

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

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

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

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

Судя по всему знак ";" означает перевод строки? :)
Gosudar
phpBB 2.0.0
Сообщения: 227
Стаж: 18 лет 9 месяцев

Сообщение Gosudar »

угу
Zlodey12
phpBB 1.4.4
Сообщения: 171
Стаж: 17 лет 2 месяца

Сообщение Zlodey12 »

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&" . POST_TOPIC_URL . "=$topic_id"),
добавляем:

Код: Выделить всё

//
// *** added by Zlodey ***
					'S_PIPEZ_ACTION' => append_sid("posting.$phpEx?mode=pipez&" . 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
У вас нет необходимых прав для просмотра вложений в этом сообщении.

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