package com.asteria.net.message.impl; import plugin.skills.prayer.Bone; import plugin.skills.prayer.PrayerBoneAltar; import com.asteria.game.World; import com.asteria.game.character.player.Player; import com.asteria.game.item.Item; import com.asteria.game.location.Position; import com.asteria.game.plugin.context.ItemOnObjectPlugin; 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 uses an item on an object. * * @author lare96 <http://github.com/lare96> */ public final class ItemOnObjectMessage 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; int container = payload.getShort(false); int objectId = payload.getShort(true, ByteOrder.LITTLE); int objectY = payload.getShort(true, ValueType.A, ByteOrder.LITTLE); int slot = payload.getShort(true, ByteOrder.LITTLE); int objectX = payload.getShort(true, ValueType.A, ByteOrder.LITTLE); int itemId = payload.getShort(false); int objectSize = 1; Item item = player.getInventory().get(slot); Position position = new Position(objectX, objectY, player.getPosition().getZ()); if (item == null || container != 3214 || objectId < 0 || objectY < 0 || slot < 0 || objectX < 0 || itemId < 0) return; if (item.getId() != itemId) return; player.facePosition(position); player.getMovementListener().append( () -> { if (player.getPosition().withinDistance(position, objectSize)) { Bone bone = Bone.getBone(itemId); if (bone != null) { PrayerBoneAltar altarAction = new PrayerBoneAltar(player, bone, new Position(objectX, objectY)); altarAction.start(); return; } World.getPlugins().execute(player, ItemOnObjectPlugin.class, new ItemOnObjectPlugin(objectId, position, objectSize, item, slot)); } }); } }