Search in sources :

Example 1 with GroupedRegionUpdateMessage

use of org.apollo.game.message.impl.GroupedRegionUpdateMessage in project apollo by apollo-rsps.

the class GroupedRegionUpdateMessageEncoder method encode.

@Override
public GamePacket encode(GroupedRegionUpdateMessage message) {
    GamePacketBuilder builder = new GamePacketBuilder(60, PacketType.VARIABLE_SHORT);
    Position base = message.getLastKnownRegion(), region = message.getRegionPosition();
    builder.put(DataType.BYTE, region.getLocalY(base));
    builder.put(DataType.BYTE, DataTransformation.NEGATE, region.getLocalX(base));
    for (RegionUpdateMessage update : message.getMessages()) {
        @SuppressWarnings("unchecked") MessageEncoder<RegionUpdateMessage> encoder = (MessageEncoder<RegionUpdateMessage>) release.getMessageEncoder(update.getClass());
        GamePacket packet = encoder.encode(update);
        builder.put(DataType.BYTE, packet.getOpcode());
        builder.putBytes(packet.getPayload());
    }
    return builder.toGamePacket();
}
Also used : GamePacket(org.apollo.net.codec.game.GamePacket) Position(org.apollo.game.model.Position) RegionUpdateMessage(org.apollo.game.message.impl.RegionUpdateMessage) GroupedRegionUpdateMessage(org.apollo.game.message.impl.GroupedRegionUpdateMessage) GamePacketBuilder(org.apollo.net.codec.game.GamePacketBuilder) MessageEncoder(org.apollo.net.release.MessageEncoder)

Example 2 with GroupedRegionUpdateMessage

use of org.apollo.game.message.impl.GroupedRegionUpdateMessage in project apollo by apollo-rsps.

the class GroupedRegionUpdateMessageEncoder method encode.

@Override
public GamePacket encode(GroupedRegionUpdateMessage message) {
    GamePacketBuilder builder = new GamePacketBuilder(183, PacketType.VARIABLE_SHORT);
    Position base = message.getLastKnownRegion(), region = message.getRegionPosition();
    builder.put(DataType.BYTE, region.getLocalX(base));
    builder.put(DataType.BYTE, DataTransformation.ADD, region.getLocalY(base));
    for (RegionUpdateMessage update : message.getMessages()) {
        @SuppressWarnings("unchecked") MessageEncoder<RegionUpdateMessage> encoder = (MessageEncoder<RegionUpdateMessage>) release.getMessageEncoder(update.getClass());
        GamePacket packet = encoder.encode(update);
        builder.put(DataType.BYTE, packet.getOpcode());
        builder.putBytes(packet.getPayload());
    }
    return builder.toGamePacket();
}
Also used : GamePacket(org.apollo.net.codec.game.GamePacket) Position(org.apollo.game.model.Position) RegionUpdateMessage(org.apollo.game.message.impl.RegionUpdateMessage) GroupedRegionUpdateMessage(org.apollo.game.message.impl.GroupedRegionUpdateMessage) GamePacketBuilder(org.apollo.net.codec.game.GamePacketBuilder) MessageEncoder(org.apollo.net.release.MessageEncoder)

Example 3 with GroupedRegionUpdateMessage

use of org.apollo.game.message.impl.GroupedRegionUpdateMessage in project apollo by apollo-rsps.

the class PrePlayerSynchronizationTask method sendUpdates.

/**
 * Sends the updates for a {@link Region}
 *
 * @param position The {@link Position} of the last known region.
 * @param differences The {@link Set} of {@link RegionCoordinates} of Regions that changed.
 * @param full The {@link Set} of {@link RegionCoordinates} of Regions that require a full update.
 */
private void sendUpdates(Position position, Set<RegionCoordinates> differences, Set<RegionCoordinates> full) {
    RegionRepository repository = player.getWorld().getRegionRepository();
    int height = position.getHeight();
    for (RegionCoordinates coordinates : differences) {
        Set<RegionUpdateMessage> messages = updates.computeIfAbsent(coordinates, coords -> repository.get(coords).getUpdates(height));
        if (!messages.isEmpty()) {
            player.send(new GroupedRegionUpdateMessage(position, coordinates, messages));
        }
    }
    for (RegionCoordinates coordinates : full) {
        Set<RegionUpdateMessage> messages = encodes.computeIfAbsent(coordinates, coords -> repository.get(coords).encode(height));
        if (!messages.isEmpty()) {
            player.send(new ClearRegionMessage(position, coordinates));
            player.send(new GroupedRegionUpdateMessage(position, coordinates, messages));
        }
    }
}
Also used : RegionCoordinates(org.apollo.game.model.area.RegionCoordinates) GroupedRegionUpdateMessage(org.apollo.game.message.impl.GroupedRegionUpdateMessage) RegionRepository(org.apollo.game.model.area.RegionRepository) RegionUpdateMessage(org.apollo.game.message.impl.RegionUpdateMessage) GroupedRegionUpdateMessage(org.apollo.game.message.impl.GroupedRegionUpdateMessage) ClearRegionMessage(org.apollo.game.message.impl.ClearRegionMessage)

Aggregations

GroupedRegionUpdateMessage (org.apollo.game.message.impl.GroupedRegionUpdateMessage)3 RegionUpdateMessage (org.apollo.game.message.impl.RegionUpdateMessage)3 Position (org.apollo.game.model.Position)2 GamePacket (org.apollo.net.codec.game.GamePacket)2 GamePacketBuilder (org.apollo.net.codec.game.GamePacketBuilder)2 MessageEncoder (org.apollo.net.release.MessageEncoder)2 ClearRegionMessage (org.apollo.game.message.impl.ClearRegionMessage)1 RegionCoordinates (org.apollo.game.model.area.RegionCoordinates)1 RegionRepository (org.apollo.game.model.area.RegionRepository)1