Save and load items

This commit is contained in:
unurled 2024-03-15 11:52:08 +01:00
parent 627e533e9c
commit d12bf53972
Signed by: unurled
GPG key ID: FDBC9CBE1F82423F
8 changed files with 245 additions and 53 deletions

View file

@ -0,0 +1,46 @@
package me.unurled.sacredrealms.sr.data.gson;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import me.unurled.sacredrealms.sr.components.item.abilities.Ability;
public class AbilityDeserializer implements JsonDeserializer<Ability> {
/**
* Gson invokes this call-back method during deserialization when it encounters a field of the
* specified type.
*
* <p>In the implementation of this call-back method, you should consider invoking {@link
* JsonDeserializationContext#deserialize(JsonElement, Type)} method to create objects for any
* non-trivial field of the returned object. However, you should never invoke it on the same type
* passing {@code json} since that will cause an infinite loop (Gson will call your call-back
* method again).
*
* @param json The Json data being deserialized
* @param typeOfT The type of the Object to deserialize to
* @param context
* @return a deserialized object of the specified type typeOfT which is a subclass of {@code T}
* @throws JsonParseException if json is not in the expected format of {@code typeofT}
*/
@Override
public Ability deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
try {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.get("name").getAsString();
String description = jsonObject.get("description").getAsString();
Integer cooldown = jsonObject.get("cooldown").getAsInt();
Integer manaCost = jsonObject.get("manaCost").getAsInt();
Integer damage = jsonObject.get("damage").getAsInt();
return new Ability(name, description, cooldown, manaCost, damage);
} catch (Exception e) {
throw new JsonParseException("Error deserializing Ability: " + e.getMessage());
}
}
}

View file

@ -0,0 +1,35 @@
package me.unurled.sacredrealms.sr.data.gson;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import me.unurled.sacredrealms.sr.components.item.Item;
public class ItemDeserializer implements JsonDeserializer<Item> {
/**
* Gson invokes this call-back method during deserialization when it encounters a field of the
* specified type.
*
* <p>In the implementation of this call-back method, you should consider invoking {@link
* JsonDeserializationContext#deserialize(JsonElement, Type)} method to create objects for any
* non-trivial field of the returned object. However, you should never invoke it on the same type
* passing {@code json} since that will cause an infinite loop (Gson will call your call-back
* method again).
*
* @param json The Json data being deserialized
* @param typeOfT The type of the Object to deserialize to
* @param context
* @return a deserialized object of the specified type typeOfT which is a subclass of {@code T}
* @throws JsonParseException if json is not in the expected format of {@code typeofT}
*/
@Override
public Item deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
Item item = new Item();
item.fromString(json.getAsString());
return item;
}
}

View file

@ -0,0 +1,31 @@
package me.unurled.sacredrealms.sr.data.gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
import me.unurled.sacredrealms.sr.components.item.Item;
public class ItemSerializer implements JsonSerializer<Item> {
/**
* Gson invokes this call-back method during serialization when it encounters a field of the
* specified type.
*
* <p>In the implementation of this call-back method, you should consider invoking {@link
* JsonSerializationContext#serialize(Object, Type)} method to create JsonElements for any
* non-trivial field of the {@code src} object. However, you should never invoke it on the {@code
* src} object itself since that will cause an infinite loop (Gson will call your call-back method
* again).
*
* @param src the object that needs to be converted to Json.
* @param typeOfSrc the actual type (fully genericized version) of the source object.
* @param context
* @return a JsonElement corresponding to the specified object.
*/
@Override
public JsonElement serialize(Item src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
}
}