package net.scapeemulator.game.msg.encoder; import io.netty.buffer.ByteBufAllocator; import net.scapeemulator.game.model.Position; import net.scapeemulator.game.msg.MessageEncoder; import net.scapeemulator.game.msg.impl.RegionChangeMessage; import net.scapeemulator.game.net.game.DataOrder; import net.scapeemulator.game.net.game.DataTransformation; import net.scapeemulator.game.net.game.DataType; import net.scapeemulator.game.net.game.GameFrame; import net.scapeemulator.game.net.game.GameFrame.Type; import net.scapeemulator.game.net.game.GameFrameBuilder; import net.scapeemulator.game.util.LandscapeKeyTable; public final class RegionChangeMessageEncoder extends MessageEncoder<RegionChangeMessage> { private final LandscapeKeyTable table; public RegionChangeMessageEncoder(LandscapeKeyTable table) { super(RegionChangeMessage.class); this.table = table; } @Override public GameFrame encode(ByteBufAllocator alloc, RegionChangeMessage message) { GameFrameBuilder builder = new GameFrameBuilder(alloc, 162, Type.VARIABLE_SHORT); Position position = message.getPosition(); builder.put(DataType.SHORT, DataTransformation.ADD, position.getLocalX()); boolean force = true; int centralMapX = position.getRegionX() / 8; int centralMapY = position.getRegionY() / 8; if ((centralMapX == 48 || centralMapX == 49) && centralMapY == 48) force = false; if (centralMapX == 48 && centralMapY == 148) force = false; for (int mapX = ((position.getRegionX() - 6) / 8); mapX <= ((position.getRegionX() + 6) / 8); mapX++) { for (int mapY = ((position.getRegionY() - 6) / 8); mapY <= ((position.getRegionY() + 6) / 8); mapY++) { if (force || (mapY != 49 && mapY != 149 && mapY != 147 && mapX != 50 && (mapX != 49 || mapY != 47))) { int[] keys = table.getKeys(mapX, mapY); for (int i = 0; i < 4; i++) { builder.put(DataType.INT, DataOrder.INVERSED_MIDDLE, keys[i]); } } } } builder.put(DataType.BYTE, DataTransformation.SUBTRACT, position.getHeight() % 4); builder.put(DataType.SHORT, position.getRegionX()); builder.put(DataType.SHORT, DataTransformation.ADD, position.getRegionY()); builder.put(DataType.SHORT, DataTransformation.ADD, position.getLocalY()); return builder.toGameFrame(); } }