Запрет на трейд в бою

VladaSs013

Путник
Участник
Сообщения
43
Розыгрыши
0
Репутация
0
Реакции
6
Баллы
95
Запрещено публиковать исходный код без BB-кода — CODE
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
l2-scripts
Java:
public class TradeStart extends L2GameServerPacket
{
 private List<ItemInfo> _tradelist = new ArrayList<ItemInfo>();
 private int targetId;

 public TradeStart(Player player, Player target)
 {
  targetId = target.getObjectId();

  ItemInstance[] items = player.getInventory().getItems();
  for(ItemInstance item : items)
   if(item.canBeTraded(player))
    _tradelist.add(new ItemInfo(item));
 }

 @Override
 protected final void writeImpl()
 {
  writeC(0x14);
  writeD(targetId);
  writeH(_tradelist.size());
  for(ItemInfo item : _tradelist)
   writeItemInfo(item);
 }
}


Как сделать чтоб нельзя было дать трейд в бою?
 
Последнее редактирование модератором:
Смотреть метод player и искать там какой-то булеан типа "inCombat", проверять его вначале типа
if(player.inCombat)
слать return;


Кстати, скорее всего это есть где-то в конфигах.
Так же хочу заметить что в данном случае будет лучше присекать отсылку пакета еще при приходе со стороны клиента (то-есть искать где происходит упоминание данного класса или дебагать диалог о трейде по пакетно) и там уже выставлять провеоку описанную выше.
 

Кстати, скорее всего это есть где-то в конфигах.
Так же хочу заметить что в данном случае будет лучше присекать отсылку пакета еще при приходе со стороны клиента (то-есть искать где происходит упоминание данного класса или дебагать диалог о трейде по пакетно) и там уже выставлять провеоку описанную выше.
Конфиги смотрел, нету такого

Я бы запрещал ещё на этапе попытки кинуть запрос на трейд. Если делать так, то идете в класс l2s.gameserver.network.l2.c2s.TradeRequest и после
Java:
Player reciever = (Player) target;
if(!reciever.getPlayerAccess().UseTrade)
{
    activeChar.sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET);
    return;
}
Вставьте что-то типа
Java:
if(activeChar.isInCombat() || reciever.isInCombat())
{
    //Можно отправить какой-то пакет или своё сообщение примерно так:
    activeChar.sendMessage("Торговать могут лишь персонажи, не находящиеся в состоянии боя.");
    return;
}
Разумеется, такое лучше выводить в конфиг, но с этим, я думаю, вы и сами разберетесь :)
 
Ха, модер по ошибке объединил мое сообщение с последним постом автора темы. Видимо, из-за похожих аватарок подумал, что это один и тот же чел :) Забавно вышло)
 
Хотел посмотреть, можно ли пресечь на стороне клиента в момент вызова. И видимо нужно править вызов экшена, а это уже где-то в недрах и мне не доступно. Но в клиенте можно сделать галочку отбивать, если в бою. Т.е да, оно пройдет через сервер, но клиент может сам принять решение отмены)
 

Вложения

  • 1652688074628.png
    1652688074628.png
    7,6 КБ · Просмотры: 23
Хотел посмотреть, можно ли пресечь на стороне клиента в момент вызова. И видимо нужно править вызов экшена, а это уже где-то в недрах и мне не доступно. Но в клиенте можно сделать галочку отбивать, если в бою. Т.е да, оно пройдет через сервер, но клиент может сам принять решение отмены)
зачем лезть в интерфейс ?
Игрок кидает запрос на трейд другом игроку -> Запрос Клиент - Сервер -> Проверяем в Бою ли игрок -> Если нет, присылаем в ответ пакет Сервер - Клиент;
 
зачем лезть в интерфейс ?
Игрок кидает запрос на трейд другом игроку -> Запрос Клиент - Сервер -> Проверяем в Бою ли игрок -> Если нет, присылаем в ответ пакет Сервер - Клиент;
Я искал возможность не отправлять на сервер вообще) Зачем обрабатывать на сервере то, что можно в клиенте пресечь в зародыше
 
Я искал возможность не отправлять на сервер вообще) Зачем обрабатывать на сервере то, что можно в клиенте пресечь в зародыше
Без серверной части тут не обойтись. Если менять в интерфейсе, то нет гарантии, что все игроки будут юзать именно твой интерфейс. Другое дело, добавить правило в "TradeRequest.java" и не плясать там танец с бубном.
 
Я искал возможность не отправлять на сервер вообще) Зачем обрабатывать на сервере то, что можно в клиенте пресечь в зародыше
А в клиенте есть информация о всех персонажах, и в бою они или нет?
 
через интерфейс наверное такое только если смотреть название анимаций моделек и то если они в покое
 
незнаю как у вас в ява сервере, в птс я бы сделал это все в 3 строчки
Добавить в функцию трейда.
C++:
    if(pUser->InCombat())
    {
        pUser->TradeCancel();
        return false;
    }

естественно 2 функции void TradeCancel и bool InCombat уже реализованы.
 
незнаю как у вас в ява сервере, в птс я бы сделал это все в 3 строчки
Добавить в функцию трейда.
C++:
    if(pUser->InCombat())
    {
        pUser->TradeCancel();
        return false;
    }

естественно 2 функции void TradeCancel и bool InCombat уже реализованы.
в джаве это делается точно так же, только тут решили изобрести велосипед
 
Конфиги смотрел, нету такого

Я бы запрещал ещё на этапе попытки кинуть запрос на трейд. Если делать так, то идете в класс l2s.gameserver.network.l2.c2s.TradeRequest и после
Java:
Player reciever = (Player) target;
if(!reciever.getPlayerAccess().UseTrade)
{
    activeChar.sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET);
    return;
}
Вставьте что-то типа
Java:
if(activeChar.isInCombat() || reciever.isInCombat())
{
    //Можно отправить какой-то пакет или своё сообщение примерно так:
    activeChar.sendMessage("Торговать могут лишь персонажи, не находящиеся в состоянии боя.");
    return;
}
Разумеется, такое лучше выводить в конфиг, но с этим, я думаю, вы и сами разберетесь :)
Вот оно, готовое решение - на уровне сервера. Зачем себя мучить, пытаясь реализовать это по другому?
 
Назад
Сверху Снизу