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 reciever = (Player) target;
if(!reciever.getPlayerAccess().UseTrade)
{
activeChar.sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET);
return;
}
if(activeChar.isInCombat() || reciever.isInCombat())
{
//Можно отправить какой-то пакет или своё сообщение примерно так:
activeChar.sendMessage("Торговать могут лишь персонажи, не находящиеся в состоянии боя.");
return;
}
зачем лезть в интерфейс ?Хотел посмотреть, можно ли пресечь на стороне клиента в момент вызова. И видимо нужно править вызов экшена, а это уже где-то в недрах и мне не доступно. Но в клиенте можно сделать галочку отбивать, если в бою. Т.е да, оно пройдет через сервер, но клиент может сам принять решение отмены)
Я искал возможность не отправлять на сервер вообще) Зачем обрабатывать на сервере то, что можно в клиенте пресечь в зародышезачем лезть в интерфейс ?
Игрок кидает запрос на трейд другом игроку -> Запрос Клиент - Сервер -> Проверяем в Бою ли игрок -> Если нет, присылаем в ответ пакет Сервер - Клиент;
Без серверной части тут не обойтись. Если менять в интерфейсе, то нет гарантии, что все игроки будут юзать именно твой интерфейс. Другое дело, добавить правило в "TradeRequest.java" и не плясать там танец с бубном.Я искал возможность не отправлять на сервер вообще) Зачем обрабатывать на сервере то, что можно в клиенте пресечь в зародыше
А в клиенте есть информация о всех персонажах, и в бою они или нет?Я искал возможность не отправлять на сервер вообще) Зачем обрабатывать на сервере то, что можно в клиенте пресечь в зародыше
if(pUser->InCombat())
{
pUser->TradeCancel();
return false;
}
в джаве это делается точно так же, только тут решили изобрести велосипеднезнаю как у вас в ява сервере, в птс я бы сделал это все в 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; }
чтобы создать трудность и героически с её победить!Вот оно, готовое решение - на уровне сервера. Зачем себя мучить, пытаясь реализовать это по другому?
Тебе же уже сказали и даже показали как реализовать, что у тебя не получается?Кто может помочь? в лс
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?