АВТОРИЗАЦИЯ ИГРОКОВ НА СТОРОННИХ САЙТАХ

Для клансайтов, на которых игрокам разрешено добавлять новости или оставлять комментарии, полезно проверять чтобы игроки подписывались своим настоящим ником и не выдавали себя за другого. Для этих целей и написан специальный Flash-модуль (600 байт), который позволяет узнать логин игрока, если он сейчас в игре.
В HTML страницы авторизации вставьте следующий код:


<SCRIPT LANGUAGE="JavaScript">
<!--
function tz_DoFSCommand(command, args) {
	var tmp = args.split("\t");
	if (command == "OK") alert('Login: '+tmp[0]+', SID: '+tmp[1]+', City: '+tmp[2]+
		', Level: '+tmp[3]+', Prof: '+tmp[4]+', Clan: '+tmp[5]);
	else alert('Authorization error '+tmp[0]);
}
if (navigator.appName.indexOf("Microsoft") != -1) {// Hook for Internet Explorer.
	document.write('<script language=\"VBScript\"\>\n');
	document.write('On Error Resume Next\n');
	document.write('Sub tz_FSCommand(ByVal command, ByVal args)\n');
	document.write('	Call tz_DoFSCommand(command, args)\n');
	document.write('End Sub\n');
	document.write('</script\>\n');
}
//-->
</SCRIPT>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
codebase="//fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" 
width="1" height="1" id="tz">
<param name="movie" value="/authorization3.swf" />
<param name="wmode" value="transparent" />
<embed src="/authorization3.swf" wmode="transparent" width="1" height="1" 
swLiveConnect="true" id="tz" name="tz" type="application/x-shockwave-flash" 
pluginspage="//www.macromedia.com/go/getflashplayer" />
</object>


Флешка определяет параметры залогиненого персонажа в игре и вызывается JavaScript функция tz_DoFSCommand Эта функция может быть вызвана с задержкой в 5 секунд (такой таймаут попыток достучаться до клиента игры).
Функции передается:
command=="ERROR" - персонаж не в игре
command=="OK" - персонаж в игре. В параметре args через табуляцию перечислены параметры персонажа:
логин, уникальный идентификатор сессии, название игрового сервера на котором находится игрок, уровень игрока, номер професии, название клана
Далее ваш скрипт должен проверить эти данные, т.к. читер может сам вызвать эту функцию передав ей все что угодно.
Для проверки вызовите серверный скрипт:
"/cgi-bin/authorization.pl?login="+login+"&ses="+ses+"&city="+city;
Сервер проверит эти данные и в ответе будет или <OK /> если все верно, или <ERROR />.

Пример использования Flash-модуля авторизации можно посмотреть здесь: /authorization3.html

При желании можете создать и свой Flash-модуль, а не использовать готовый. Там все просто, вот исходный текст /authorization3.swf


// Передает браузеру данные о залогиненом клиенте
// Создаем свой уникальный LC куда придет ответ
var rnd = int(Math.random()*1000000000);
var lc = new LocalConnection();
lc.allowDomain = function(name)	{ return true }
var timeout; // для таймаута
lc.info = function(answer) { // пришел ответ от клиента
// парсим ответ
	var my_xml = new XML(answer);
	var e = my_xml.firstChild;
	if (e.nodeName == 'USER') { // все нормально с ответом
		SendAuthorization('OK', e.attributes.login, e.attributes.ses, e.attributes.server,
			e.attributes.level || "", e.attributes.pro || "", e.attributes.clan || "");
	} else { // в ответе пришла какая-то фигня
		SendAuthorization('ERROR', 'Client wrong answer');
	}
}
// Поставим таймаут, в течении какого времени ждем ответа от клиента
// секунды более чем достаточно, вообще клиент должен ответить мгновенно,
// задержка только на случай, если комп. в этот момент сильно тормозит
timeout = setInterval(this, "SendAuthorization", 5000, "ERROR", "Timeout"); 
if (lc.connect("authorization_"+rnd)) { // удалось создать коннект
// запросим инфу про юзера
	lc.send("localhost:tz", "authorization3", lc.domain(), "authorization_"+rnd);	// если это локальный клиент
	lc.send("timezero.ru:tz", "authorization3", lc.domain(), "authorization_"+rnd);	// если перс играет через сайт
} else { // что-то странное
	SendAuthorization('ERROR', 'Error create connect authorization_'+rnd);
}
// Отсылаем результат авторизации браузеру
function SendAuthorization(cmd, login, ses, city, level, pro, clan) {
	clearInterval(timeout); // сбрасываем таймаут
	_root.lc.close(); // закрываем коннект
	fscommand(cmd, login+"\t"+ses+"\t"+city+"\t"+level+"\t"+pro+"\t"+clan);
}



Данная функция работает только в клиенте 3.21 и выше
Уровень игрока, номер професии, название клана передаются только в клиенте 3.23 и выше
Решили отказаться от вызова функции через javascript, т.к. при этом в браузере IE останавливается анимация смайликов