package com.asteria.net.message.impl;
import com.asteria.game.World;
import com.asteria.game.character.player.Player;
import com.asteria.game.character.player.minigame.MinigameHandler;
import com.asteria.net.ByteOrder;
import com.asteria.net.message.InputMessageListener;
import com.asteria.net.message.MessageBuilder;
/**
* The message sent from the client when a player sends some sort of request to
* another player.
*
* @author lare96 <http://github.com/lare96>
*/
public final class RequestMessage implements InputMessageListener {
@Override
public void handleMessage(Player player, int opcode, int size, MessageBuilder payload) {
if (player.isDisabled())
return;
switch (opcode) {
case 139:
tradeRequest(player, payload);
break;
}
}
/**
* Handles a trade request for {@code player}.
*
* @param player
* the player to handle this for.
* @param payload
* the payloadfer for reading the sent data.
*/
private void tradeRequest(Player player, MessageBuilder payload) {
int index = payload.getShort(true, ByteOrder.LITTLE);
Player other = World.getPlayers().get(index);
if (other == null || !validate(player, other))
return;
player.setSkillAction(false);
if (!MinigameHandler.execute(player, true, m -> m.canTrade(player, other)))
return;
player.getTradeSession().request(other);
}
/**
* Determines if {@code player} can be a valid request to {@code other}.
*
* @param player
* the player making the request.
* @param other
* the player being requested.
* @return {@code true} if the player can make a request, {@code false}
* otherwise.
*/
private boolean validate(Player player, Player other) {
if (!other.getPosition().isViewableFrom(player.getPosition()) || other.equals(player))
return false;
return true;
}
}