diff --git a/gameserver/src/main/java/brainwine/gameserver/serialization/BlocksIgnoreRequestDeserializer.java b/gameserver/src/main/java/brainwine/gameserver/serialization/BlocksIgnoreRequestDeserializer.java new file mode 100644 index 0000000..ff4953b --- /dev/null +++ b/gameserver/src/main/java/brainwine/gameserver/serialization/BlocksIgnoreRequestDeserializer.java @@ -0,0 +1,57 @@ +package brainwine.gameserver.serialization; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import brainwine.gameserver.server.requests.BlocksIgnoreRequest; + +public class BlocksIgnoreRequestDeserializer extends StdDeserializer { + + public static final BlocksIgnoreRequestDeserializer INSTANCE = new BlocksIgnoreRequestDeserializer(); + private static final long serialVersionUID = -3423549008026709552L; + + protected BlocksIgnoreRequestDeserializer() { + super(BlocksIgnoreRequest.class); + } + + @Override + public BlocksIgnoreRequest deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException { + BlocksIgnoreRequest request = new BlocksIgnoreRequest(); + + if(parser.currentToken() != JsonToken.START_ARRAY) { + throw new IOException("Got invalid token, expected START_ARRAY"); + } + + if(parser.nextToken() == JsonToken.VALUE_NUMBER_INT) { + List chunkIndices = new ArrayList<>(); + + while(parser.currentToken() != JsonToken.END_ARRAY) { + chunkIndices.add(parser.getIntValue()); + parser.nextToken(); + } + + request.chunkIndices = toArray(chunkIndices); + } else { + request.chunkIndices = parser.readValueAs(int[].class); + } + + return request; + } + + private int[] toArray(List list) { + int[] array = new int[list.size()]; + + for(int i = 0; i < array.length; i++) { + array[i] = list.get(i); + } + + return array; + } +} diff --git a/gameserver/src/main/java/brainwine/gameserver/serialization/RequestDeserializerModifier.java b/gameserver/src/main/java/brainwine/gameserver/serialization/RequestDeserializerModifier.java index 85eea2f..4f7b65b 100644 --- a/gameserver/src/main/java/brainwine/gameserver/serialization/RequestDeserializerModifier.java +++ b/gameserver/src/main/java/brainwine/gameserver/serialization/RequestDeserializerModifier.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; import brainwine.gameserver.server.Request; +import brainwine.gameserver.server.requests.BlocksIgnoreRequest; public class RequestDeserializerModifier extends BeanDeserializerModifier { @@ -18,6 +19,10 @@ public class RequestDeserializerModifier extends BeanDeserializerModifier { public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { Class clazz = beanDesc.getBeanClass(); + if(BlocksIgnoreRequest.class.isAssignableFrom(clazz)) { + return BlocksIgnoreRequestDeserializer.INSTANCE; + } + if(Request.class.isAssignableFrom(clazz)) { return new RequestDeserializer((Class)clazz); }