package com.asteria.net.message.impl;
import com.asteria.Server;
import com.asteria.game.World;
import com.asteria.game.character.player.Player;
import com.asteria.game.character.player.minigame.MinigameHandler;
import com.asteria.game.location.Position;
import com.asteria.game.plugin.context.ObjectFirstClickPlugin;
import com.asteria.game.plugin.context.ObjectSecondClickPlugin;
import com.asteria.net.ByteOrder;
import com.asteria.net.ValueType;
import com.asteria.net.message.InputMessageListener;
import com.asteria.net.message.MessageBuilder;
/**
* The message sent from the client when a player clicks an object.
*
* @author lare96 <http://github.com/lare96>
*/
public final class ObjectActionMessage implements InputMessageListener {
// TODO: When cache reading is done, check position of objects.
@Override
public void handleMessage(Player player, int opcode, int size, MessageBuilder payload) {
if (player.isDisabled())
return;
switch (opcode) {
case 132:
firstClick(player, payload);
break;
case 252:
secondClick(player, payload);
break;
case 70:
thirdClick(player, payload);
break;
}
}
/**
* Handles the first slot object click for {@code player}.
*
* @param player
* the player to handle this for.
* @param payload
* the payloadfer for reading the sent data.
*/
private void firstClick(Player player, MessageBuilder payload) {
int objectX = payload.getShort(true, ValueType.A, ByteOrder.LITTLE);
int objectId = payload.getShort(false);
int objectY = payload.getShort(false, ValueType.A);
Position position = new Position(objectX, objectY, player.getPosition().getZ());
int size = 1;
if (objectId < 0 || objectX < 0 || objectY < 0)
return;
if (Server.DEBUG)
player.getMessages().sendMessage("[DEBUG]: ID - " + objectId + ", " + "X - " + objectX + ", Y - " + objectY);
player.facePosition(position);
player.getMovementListener().append(() -> {
if (player.getPosition().withinDistance(position, size)) {
MinigameHandler.execute(player, m -> m.onFirstClickObject(player, objectId, position.copy()));
World.getPlugins().execute(player, ObjectFirstClickPlugin.class, new ObjectFirstClickPlugin(objectId, position, size));
}
});
}
/**
* Handles the second slot object click for {@code player}.
*
* @param player
* the player to handle this for.
* @param payload
* the payloadfer for reading the sent data.
*/
private void secondClick(Player player, MessageBuilder payload) {
int objectId = payload.getShort(false, ValueType.A, ByteOrder.LITTLE);
int objectY = payload.getShort(true, ByteOrder.LITTLE);
int objectX = payload.getShort(false, ValueType.A);
int size = 1;
Position position = new Position(objectX, objectY, player.getPosition().getZ());
if (objectId < 0 || objectX < 0 || objectY < 0)
return;
if (Server.DEBUG)
player.getMessages().sendMessage("[DEBUG]: ID - " + objectId + ", " + "X - " + objectX + ", Y - " + objectY);
player.facePosition(position);
player.getMovementListener().append(() -> {
if (player.getPosition().withinDistance(position, size)) {
MinigameHandler.execute(player, m -> m.onSecondClickObject(player, objectId, position.copy()));
World.getPlugins().execute(player, ObjectSecondClickPlugin.class, new ObjectSecondClickPlugin(objectId, position, size));
}
});
}
/**
* Handles the third slot object click for {@code player}.
*
* @param player
* the player to handle this for.
* @param payload
* the payloadfer for reading the sent data.
*/
private void thirdClick(Player player, MessageBuilder payload) {
int objectX = payload.getShort(true, ByteOrder.LITTLE);
int objectY = payload.getShort(false);
int objectId = payload.getShort(false, ValueType.A, ByteOrder.LITTLE);
int size = 1;
Position position = new Position(objectX, objectY, player.getPosition().getZ());
if (objectId < 0 || objectX < 0 || objectY < 0)
return;
player.facePosition(position);
player.getMovementListener().append(new Runnable() {
@Override
public void run() {
if (player.getPosition().withinDistance(position, size)) {
MinigameHandler.execute(player, m -> m.onThirdClickObject(player, objectId, position.copy()));
switch (objectId) {
}
}
}
});
}
}