Реализация дисконекта

Ne1s

Прославленный
Местный
За заслуги перед форумом
За веру и верность форуму
Сообщения
314
Розыгрыши
0
Репутация
354
Реакции
142
Баллы
1 435
Кто подскажет где есть такое или как реализовать, чтобы окно выбора персонажа было доступно 5 минут, затем дисконект если персонаж не выбран.
 
Кто подскажет где есть такое или как реализовать, чтобы окно выбора персонажа было доступно 5 минут, затем дисконект если персонаж не выбран.
В чем смысл? Как по мне не нужная вещь
 
через поток, запускаем на 5 минут, при этом инсертим переменную в пакет выбора персонажа, к примеру int select = 0; при выборе персонажа задаем переменной значение 1, а в потоке проверяем if(select = 0) то десконектим с сервера
 
через поток, запускаем на 5 минут, при этом инсертим переменную в пакет выбора персонажа, к примеру int select = 0; при выборе персонажа задаем переменной значение 1, а в потоке проверяем if(select = 0) то десконектим с сервера
а на практике это как сделать?
package l2p.gameserver.serverpackets;

import l2p.gameserver.GameTimeController;
import l2p.gameserver.model.Player;
import l2p.gameserver.utils.Location;

public class CharSelected extends L2GameServerPacket
{
// SdSddddddddddffddddddddddddddddddddddddddddddddddddddddd d
private int _sessionId, char_id, clan_id, sex, race, class_id;
private String _name, _title;
private Location _loc;
private double curHp, curMp;
private int _sp, level, karma, _int, _str, _con, _men, _dex, _wit, _pk;
private long _exp;

public CharSelected(final Player cha, final int sessionId)
{
_sessionId = sessionId;

_name = cha.getName();
char_id = cha.getObjectId(); //FIXME 0x00030b7a ??
_title = cha.getTitle();
clan_id = cha.getClanId();
sex = cha.getSex();
race = cha.getRace().ordinal();
class_id = cha.getClassId().getId();
_loc = cha.getLoc();
curHp = cha.getCurrentHp();
curMp = cha.getCurrentMp();
_sp = cha.getIntSp();
_exp = cha.getExp();
level = cha.getLevel();
karma = cha.getKarma();
_pk = cha.getPkKills();
_int = cha.getINT();
_str = cha.getSTR();
_con = cha.getCON();
_men = cha.getMEN();
_dex = cha.getDEX();
_wit = cha.getWIT();
}

@Override
protected final void writeImpl()
{
writeC(0x0b);

writeS(_name);
writeD(char_id);
writeS(_title);
writeD(_sessionId);
writeD(clan_id);
writeD(0x00); //??
writeD(sex);
writeD(race);
writeD(class_id);
writeD(0x01); // active ??
writeD(_loc.x);
writeD(_loc.y);
writeD(_loc.z);

writeF(curHp);
writeF(curMp);
writeD(_sp);
writeQ(_exp);
writeD(level);
writeD(karma); //?
writeD(_pk);
writeD(_int);
writeD(_str);
writeD(_con);
writeD(_men);
writeD(_dex);
writeD(_wit);
for(int i = 0; i < 30; i++)
writeD(0x00);

writeF(0x00); //c3 work
writeF(0x00); //c3 work
// extra info
writeD(GameTimeController.getInstance().getGameTime()); // in-game time
writeD(0x00); //
writeD(0x00); //c3
writeC(0x00); //c3 InspectorBin
writeH(0x00); //c3
writeH(0x00); //c3
writeD(0x00); //c3
//writeD(0x00); //c3 InspectorBin for 528 client
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3

//writeD(0x00); //c5
//writeD(0x00); //c5
//writeD(0x00); //c5
}
}
 
а на практике это как сделать?
package l2p.gameserver.serverpackets;

import l2p.gameserver.GameTimeController;
import l2p.gameserver.model.Player;
import l2p.gameserver.utils.Location;

public class CharSelected extends L2GameServerPacket
{
// SdSddddddddddffddddddddddddddddddddddddddddddddddddddddd d
private int _sessionId, char_id, clan_id, sex, race, class_id;
private String _name, _title;
private Location _loc;
private double curHp, curMp;
private int _sp, level, karma, _int, _str, _con, _men, _dex, _wit, _pk;
private long _exp;

public CharSelected(final Player cha, final int sessionId)
{
_sessionId = sessionId;

_name = cha.getName();
char_id = cha.getObjectId(); //FIXME 0x00030b7a ??
_title = cha.getTitle();
clan_id = cha.getClanId();
sex = cha.getSex();
race = cha.getRace().ordinal();
class_id = cha.getClassId().getId();
_loc = cha.getLoc();
curHp = cha.getCurrentHp();
curMp = cha.getCurrentMp();
_sp = cha.getIntSp();
_exp = cha.getExp();
level = cha.getLevel();
karma = cha.getKarma();
_pk = cha.getPkKills();
_int = cha.getINT();
_str = cha.getSTR();
_con = cha.getCON();
_men = cha.getMEN();
_dex = cha.getDEX();
_wit = cha.getWIT();
}

@Override
protected final void writeImpl()
{
writeC(0x0b);

writeS(_name);
writeD(char_id);
writeS(_title);
writeD(_sessionId);
writeD(clan_id);
writeD(0x00); //??
writeD(sex);
writeD(race);
writeD(class_id);
writeD(0x01); // active ??
writeD(_loc.x);
writeD(_loc.y);
writeD(_loc.z);

writeF(curHp);
writeF(curMp);
writeD(_sp);
writeQ(_exp);
writeD(level);
writeD(karma); //?
writeD(_pk);
writeD(_int);
writeD(_str);
writeD(_con);
writeD(_men);
writeD(_dex);
writeD(_wit);
for(int i = 0; i < 30; i+:)
writeD(0x00);

writeF(0x00); //c3 work
writeF(0x00); //c3 work
// extra info
writeD(GameTimeController.getInstance().getGameTime()); // in-game time
writeD(0x00); //
writeD(0x00); //c3
writeC(0x00); //c3 InspectorBin
writeH(0x00); //c3
writeH(0x00); //c3
writeD(0x00); //c3
//writeD(0x00); //c3 InspectorBin for 528 client
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3
//writeD(0x00); //c3

//writeD(0x00); //c5
//writeD(0x00); //c5
//writeD(0x00); //c5
}
}
я вам должен разжевывать? Учитесь, смотрите примеры реализаций кода ThreadPoolManager, doDisconnect функции. Это все есть в вашем ядре, нужно только поискать и подумать.
 
  • Мне нравится
Реакции: Ne1s
Создаем в L2GameClient переменную типа ScheduledFuture(необходимо для остановки потока), при входе в Лобби(пакет RequestGotoLobby) запускаем поток который будет выполнен через * промежуток времени, и записываем в переменную что вернул L2ThreadPoolManager. Далее если персонаж вошел в мир(EnterWorld) отменяем поток через переменную которая в L2GameClient(ScheduledFuture), в ином случае поток успешно завершит работу(нужный вам код).
 
  • Мне нравится
Реакции: Ne1s

    Mizuwokiru

    Баллов: 15
    Без комментариев
На ПТС серверах кикает через 10 минут. Всё предложенное выше костыли костылей.
 
  • Мне нравится
Реакции: kick

    kick

    Баллов: 17
    Без комментариев
На ПТС серверах кикает через 10 минут. Всё предложенное выше костыли костылей.
Да действительно, костыли. Так предложите же нам "О, Великий" рациональное решение "ПАОФУ".
 
Раздавать советы самое безответственное занятие. Я сказал достаточно, чтобы автор знал где это глянуть и реализовать механизм без костылей. Умерьте своё ЧСВ, оно слишком завышено.
 

    Mizuwokiru

    Баллов: -15
    Без комментариев
Раздавать советы самое безответственное занятие. Я сказал достаточно, чтобы автор знал где это глянуть и реализовать механизм без костылей. Умерьте своё ЧСВ, оно слишком завышено.
Хотел воздержаться... Ок, предоставьте нам сорсы PTS(не куриво смелого и тд, именно кор офа), тогда мы будем там смотреть. А смотреть на то что выдает дизасемблер, рядовому пользователю, это как "Стать королем аськи".

П.С. А по теме, может стоит еще покопать в сторону сетевой реализации в сервере, может там есть время закрытия соединения ели не было активность в течении определенного интервала времени.
 
Раздавать советы самое безответственное занятие. Я сказал достаточно, чтобы автор знал где это глянуть и реализовать механизм без костылей. Умерьте своё ЧСВ, оно слишком завышено.
Ты сказал только то, что на ПТСе (при чем он здесь вообще, если имеется в виду Java-эмулятор?!) кикает через 10 минут и какие все калеки.
 
Раздавать советы самое безответственное занятие. Я сказал достаточно, чтобы автор знал где это глянуть и реализовать механизм без костылей. Умерьте своё ЧСВ, оно слишком завышено.
Пришел, пернул, ушел.
 
  • Мне нравится
Реакции: gvb
Все нормальные люди работу клиента с сервером смотрят через снифер пакетов. У вас, видимо, принято всё изучать тактильно подключая собственные пукановые ощущения. Поэтому все остальные, кроме вас, пердят проходя мимо.
 
Все нормальные люди работу клиента с сервером смотрят через снифер пакетов. У вас, видимо, принято всё изучать тактильно подключая собственные пукановые ощущения. Поэтому все остальные, кроме вас, пердят проходя мимо.
ты дибил? каким боком пакетка относиться к данной теме? ты там интервал дисконекта через нее засекал или что?
 
Все нормальные люди работу клиента с сервером смотрят через снифер пакетов. У вас, видимо, принято всё изучать тактильно подключая собственные пукановые ощущения. Поэтому все остальные, кроме вас, пердят проходя мимо.
Диванные проффесор детектед. Каким макаром ты через снифер будешь смотреть механику? Снифер тебе покажет только кусок данных в которых будет приказ клиенту на дисконект, мой вариант тоже такое покажет через снифер.

[
див.воин..jpg
П.С. Прежде чем что то советовать изучи назначение пакетной части.
 
Последнее редактирование модератором:
через поток, запускаем на 5 минут, при этом инсертим переменную в пакет выбора персонажа, к примеру int select = 0; при выборе персонажа задаем переменной значение 1, а в потоке проверяем if(select = 0) то десконектим с сервера

немного поправлю,
в пакете клиента (****clientpackets.AuthLogin именно после выбора сервера клиент шлёт его и появляется выбор персов) через поток, запускаем таймер на 5 минут,
в нём по истечении 5-ти минут делаем проверку всех персов аккаунта на isOnlain()(isOnlain() это реализовано практически в всех сборках)
и соответственно если истина, то просто просто отменяем поток, иначе поток успешно завершит работу с указанными Вашими параметрами(отсылает пакет дисконнекта).

Все нормальные люди работу клиента с сервером смотрят через снифер пакетов. У вас, видимо, принято всё изучать тактильно подключая собственные пукановые ощущения. Поэтому все остальные, кроме вас, пердят проходя мимо.
просто улыбнуло -:D
 
немного поправлю,
в пакете клиента (****clientpackets.AuthLogin именно после выбора сервера клиент шлёт его и появляется выбор персов) через поток, запускаем таймер на 5 минут,
в нём по истечении 5-ти минут делаем проверку всех персов аккаунта на isOnlain()(isOnlain() это реализовано практически в всех сборках)
и соответственно если истина, то просто просто отменяем поток, иначе поток успешно завершит работу с указанными Вашими параметрами(отсылает пакет дисконнекта).
как я писал выше, просто отменяем дальнейшее выполнение потока при EnterWorld=)
 
да, но добавлять новые переменные, зачем?
 
да, но добавлять новые переменные, зачем?
Правильно, давайте будет запускать цыкл по персонажам, это будет более продуктивнее. Так же персонаж может 10 раз перезайти пока эти 5 минут пройдут, а это еще +потоки которые будут сидеть в сервере.

П.С. ТСу: Так же не забудьте что есть метод RequestRestart(вход в лобби из игры а не после выбора сервера), там тоже по идее нужно пускать поток.
 

    Mizuwokiru

    Баллов: 15
    Без комментариев
Назад
Сверху Снизу