Перейти к содержанию
Авторизация  
isysyura

"Персонаж застрял" сое в ближайший город php/mysql

Рекомендуемые сообщения

Нужно реализовать телепорт с ЛК (по типу "персонаж застрял") в ближайший город ( по типу "/unstuck") средствами php.

Но возникают вопросы:

1. Когда координаты x-y-z записываются в таблицу characters? Поскольку не логично было бы писать их в онлайн режиме я предполагаю что после offline персонажа, так ли это?
2. Если координаты записываются после выхода с игры, тогда перед их изменениями нам нужно кикнуть персонажа, можно ли это сделать не затрагивая ГС?
предполагаю что нет.

Видимо я сам ответил на вопрос и нашел решение:)  Но все же создам тему, а вдруг ошибаюсь ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подымаем вебсервер (самый простой вариант обычный http server), пишем АПИ на сервере с проверкой онлайн\оффлайн, если онлайн - ТПшим методом, оффлайн - записываем в БД координаты.
на вебе вызываем эту АПИшку любым способом и наслаждаемся.

PS: не забудьте сделать делей на данную функцию и проверку на состояние чара, а то будут умники в ПвП юзать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как прописать скрипт не проблема, сделаю проверку на online/offline и буду изменять координаты при соблюдении условия. 

Вопрос был в том, как кикнуть персонажа с игры.

27 минут назад, Rovskoi сказал:

если онлайн - ТПшим методом

каким методом?
п.с. на счет delay даже не думал, ибо не вижу вариантов решения с киком перса. Но спасибо)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем кикать? можно же просто ТПшнуть без кика...
смотрите какие методы у вас есть для Player, чаще всего это player.teleToLocation() или подобное

Изменено пользователем Rovskoi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так я же сразу сказал что мне нужна реализация средствами РНР, то есть РНР - MySQL и все)
но, как я понимаю, так сделать не получится...  или мы можем на лету внести изменение в БД таким образом что бы перса выкинуло с игры? 

Изменено пользователем isysyura

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 минут назад, isysyura сказал:

Вопрос был в том, как кикнуть персонажа с игры.

конечно от сборки зависит, но почти в любой из них есть команда kick для телнета

на худой конец не проблема ее реализовать

 

так что банально коннектимся к серверу через телнет и шлем команду kick <имя>, после чего делаем что хочется с данными

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

Изменено пользователем Gaikotsu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Gaikotsu сказал:

конечно от сборки зависит, но почти в любой из них есть команда kick для телнета

на худой конец не проблема ее реализовать

во, это уже другое дело, спасибо)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну и простенький класс на пхп для работы с телнетом

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

в админке у себя чисто кик юзаю и все.

telnet  
<?
define('KickCharacter', 1);

class L2Telnet
{
	var $socket;
	var $connected;

	function __construct($host='127.0.0.1', $port=2012, $pass, $timeout=2)
	{
		$this->connected = false;
		$this->socket = @fsockopen($host, $port, $errno, $errstr, $timeout);
		if ($this->socket)
		{
			if ($pass != "")
			{
				fputs($this->socket, $pass);
				fputs($this->socket, "\r\n");
				$this->connected = ($this->socket) ? true : false;
			}
			$this->connected = true;
		}
		else
			$this->error("<br />Ошибка соединения с telnet-сервером (host: $host, port: $port).");
		return $this->connected;
	}

	function __destruct()
	{
		if ($this->connected)
			fputs($this->socket, "\r\nexit\r\n");
	}

	function error($str)
	{
		die($str);
	}

	function sendPacket($packet)
	{
		$result = false;
		if ($this->connected)
		{
			$param = func_get_args();
			switch ($param[0]):
				case KickCharacter:
					fputs($this->socket, "kick ".iconv("Windows-1251", "UTF-8", $param[1])."\r\n");
					$result = ($this->socket) ? true : false;
					if (empty($param[2]))
						sleep(1);
					break;
				default:
					$result = false;
					$this->error("<br />Неизвестная команда '{$param[0]}'.");
					break;
			endswitch;
		}
		return $result;
	}
}
?>

 

Hide  
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вобще, при желании, через телнет можно сделать почти полный аналог кэшеда в птс

Изменено пользователем Gaikotsu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такс... решил включить telnet на lovely (сборка для тестов) , и вижу что что-то не допонимаю...

./login/config/main/network.properties

EnableTelnet = true
StatusPort = 2012

StatusPW - ******

ListOfHosts = 127.0.0.1,localhost

./game/config/network/network.properties

ListOfHosts = 127.0.0.1,localhost



ребутаю ЛС/ГС (ошибок в логах нет) , делаю netstat - нет ничего , порт открыт.
Вопрос - должно ли быть что-то поднято на этом порту? Или с ним работают по другому?

соответственно:

telnet 127.0.0.1 2012
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused


 

Изменено пользователем isysyura

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да вроде никаких особых условий работы нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не морочте себе голову.

if (online) {Ошибка: персонаж должен быть офлайн}

else {меняем координаты в бд.}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, lvlkoo сказал:

Не морочте себе голову.

if (online) {Ошибка: персонаж должен быть офлайн}

else {меняем координаты в бд.}

спасибо кэп, но думаю автор темы о таком варианте и так знает :)

но ему то как раз хочется чтобы возможность телепорта была вне зависимости от статуса онлайна перса

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Gaikotsu сказал:

спасибо кэп, но думаю автор темы о таком варианте и так знает :)

но ему то как раз хочется чтобы возможность телепорта была вне зависимости от статуса онлайна перса

Не имею понятия к чему было ваше сообщение.

Я дал практичный практичный совет, сделать универсальное решение. Следовать этому совету или нет - дело автора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
42 минуты назад, isysyura сказал:

должно ли быть что-то поднято на этом порту

Должно, должен биндиться tcp сокет на порт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, lvlkoo сказал:

Не морочте себе голову.

if (online) {Ошибка: персонаж должен быть офлайн}

else {меняем координаты в бд.}

Изначально так и планировал делать, это было бы проще всего, хотя скорей всего так и поступлю.
Но тут мне напомнили про telnet,  желательно бы и с ним разобраться. Ведь в планах не только телепорт, а и другой функционал ЛК. 

 

50 минут назад, lvlkoo сказал:

Должно, должен биндиться tcp сокет на порт

Будем разбираться...

п.с не сорьтесь :) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...