This commit is contained in:
parent
cd84847c14
commit
6af48441a4
4 changed files with 220 additions and 0 deletions
|
@ -0,0 +1,65 @@
|
||||||
|
package me.unurled.sacredrealms.sr.components.treasure;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public class Treasure {
|
||||||
|
|
||||||
|
/** Chest location */
|
||||||
|
private Location location;
|
||||||
|
|
||||||
|
/** key = place in chest value = itemstack placed in chest at key place */
|
||||||
|
private Map<Integer, ItemStack> items;
|
||||||
|
|
||||||
|
/** Permission to access this chest */
|
||||||
|
private String permission;
|
||||||
|
|
||||||
|
public Treasure() {}
|
||||||
|
|
||||||
|
public Treasure(Location location, Map<Integer, ItemStack> items, String permission) {
|
||||||
|
this.location = location;
|
||||||
|
this.items = items;
|
||||||
|
this.permission = permission;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the location of the treasure
|
||||||
|
*
|
||||||
|
* @return the location of the treasure
|
||||||
|
*/
|
||||||
|
public Location getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocation(Location location) {
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the items in the chest
|
||||||
|
*
|
||||||
|
* @return the items
|
||||||
|
*/
|
||||||
|
public Map<Integer, ItemStack> getItems() {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setItems(HashMap<Integer, ItemStack> items) {
|
||||||
|
this.items = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the permission to open the chest
|
||||||
|
*
|
||||||
|
* @return the permission
|
||||||
|
*/
|
||||||
|
public String getPermission() {
|
||||||
|
return permission;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPermission(String permission) {
|
||||||
|
this.permission = permission;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
package me.unurled.sacredrealms.sr.components.treasure;
|
||||||
|
|
||||||
|
import static me.unurled.sacredrealms.sr.utils.Logger.error;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonDeserializationContext;
|
||||||
|
import com.google.gson.JsonDeserializer;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
import io.leangen.geantyref.TypeToken;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.Map;
|
||||||
|
import me.unurled.sacredrealms.sr.components.item.ItemStackDeserializer;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public class TreasureDeserializer implements JsonDeserializer<Treasure> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 Treasure deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
||||||
|
throws JsonParseException {
|
||||||
|
Gson gson =
|
||||||
|
new GsonBuilder()
|
||||||
|
.registerTypeAdapter(ItemStack.class, new ItemStackDeserializer())
|
||||||
|
.create();
|
||||||
|
try {
|
||||||
|
|
||||||
|
String loc = gson.fromJson("location", String.class);
|
||||||
|
String[] parts = loc.split(",");
|
||||||
|
if (parts.length != 6) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
World world = Bukkit.getServer().getWorld(parts[0]);
|
||||||
|
double x = Double.parseDouble(parts[1]);
|
||||||
|
double y = Double.parseDouble(parts[2]);
|
||||||
|
double z = Double.parseDouble(parts[3]);
|
||||||
|
float pitch = Float.parseFloat(parts[4]);
|
||||||
|
float yaw = Float.parseFloat(parts[5]);
|
||||||
|
Location location = new Location(world, x, y, z, pitch, yaw);
|
||||||
|
String permission = gson.fromJson("permission", String.class);
|
||||||
|
String items = gson.fromJson("items", String.class);
|
||||||
|
Type hash = new TypeToken<Map<Integer, ItemStack>>() {}.getType();
|
||||||
|
Map<Integer, ItemStack> item = gson.fromJson(items, hash);
|
||||||
|
|
||||||
|
if (permission == null || item == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Treasure(location, item, permission);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
error("Error deserializing treasure: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package me.unurled.sacredrealms.sr.components.treasure;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import me.unurled.sacredrealms.sr.data.DataHandler;
|
||||||
|
import me.unurled.sacredrealms.sr.data.DataManager;
|
||||||
|
import me.unurled.sacredrealms.sr.managers.Manager;
|
||||||
|
|
||||||
|
public class TreasureManager extends Manager {
|
||||||
|
private final List<Treasure> treasures = new ArrayList<>();
|
||||||
|
|
||||||
|
/** Save the data */
|
||||||
|
@Override
|
||||||
|
public void saveData() {
|
||||||
|
// save all treasures
|
||||||
|
for (Treasure treasure : treasures) {
|
||||||
|
// serialize treasure
|
||||||
|
DataHandler dh = DataManager.getInstance(DataManager.class).getDataHandler();
|
||||||
|
Gson gson =
|
||||||
|
new GsonBuilder().registerTypeAdapter(Treasure.class, new TreasureSerializer()).create();
|
||||||
|
dh.set("treasures." + treasures.indexOf(treasure), gson.toJson(treasure));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the data */
|
||||||
|
@Override
|
||||||
|
public void loadData() {
|
||||||
|
// load all treasures
|
||||||
|
DataHandler dh = DataManager.getInstance(DataManager.class).getDataHandler();
|
||||||
|
Gson gson =
|
||||||
|
new GsonBuilder().registerTypeAdapter(Treasure.class, new TreasureDeserializer()).create();
|
||||||
|
for (String key : dh.getKeysAll("treasures")) {
|
||||||
|
// deserialize treasure
|
||||||
|
treasures.add(gson.fromJson(dh.get("treasures." + key), Treasure.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
package me.unurled.sacredrealms.sr.components.treasure;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
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.ItemStackSerializer;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public class TreasureSerializer implements JsonSerializer<Treasure> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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(Treasure src, Type typeOfSrc, JsonSerializationContext context) {
|
||||||
|
JsonObject obj = new JsonObject();
|
||||||
|
obj.add("location", new JsonPrimitive(src.getLocation().toString()));
|
||||||
|
obj.add("permission", new JsonPrimitive(src.getPermission()));
|
||||||
|
Gson gson =
|
||||||
|
new GsonBuilder().registerTypeAdapter(ItemStack.class, new ItemStackSerializer()).create();
|
||||||
|
obj.add("items", new JsonPrimitive(gson.toJson(src.getItems())));
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue