From a3b12cb7e287ebfdf685c9664846b345b5540b9e Mon Sep 17 00:00:00 2001 From: WayofTime Date: Wed, 2 Dec 2015 21:30:54 -0500 Subject: [PATCH] Created framework for LivingArmour and the handling. Upgrade handling is not done. --- .../api/livingArmour/StatTracker.java | 33 ++++++++ .../api/livingArmour/StatTrackerRegistry.java | 12 +++ .../bloodmagic/livingArmour/LivingArmour.java | 84 +++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java create mode 100644 src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTrackerRegistry.java create mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java new file mode 100644 index 00000000..f1ef9dd7 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTracker.java @@ -0,0 +1,33 @@ +package WayofTime.bloodmagic.api.livingArmour; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import WayofTime.bloodmagic.livingArmour.LivingArmour; + +public abstract class StatTracker { + + private boolean isDirty = false; + + public abstract String getUniqueIdentifier(); + + public abstract void resetTracker(); + + public abstract void readFromNBT(NBTTagCompound tag); + + public abstract void writeToNBT(NBTTagCompound tag); + + public abstract void onTick(World world, EntityPlayer player, LivingArmour livingArmour); + + public final boolean isDirty() { + return isDirty; + } + + public final void markDirty() { + this.isDirty = true; + } + + public final void resetDirty() { + this.isDirty = false; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTrackerRegistry.java b/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTrackerRegistry.java new file mode 100644 index 00000000..7f8ac100 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/livingArmour/StatTrackerRegistry.java @@ -0,0 +1,12 @@ +package WayofTime.bloodmagic.api.livingArmour; + +import java.util.ArrayList; +import java.util.List; + +public class StatTrackerRegistry { + public static List> trackers = new ArrayList(); + + public static void registerStatTracker(Class tracker) { + trackers.add(tracker); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java new file mode 100644 index 00000000..f031cbd7 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java @@ -0,0 +1,84 @@ +package WayofTime.bloodmagic.livingArmour; + +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.Map.Entry; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import WayofTime.bloodmagic.api.livingArmour.StatTracker; +import WayofTime.bloodmagic.api.livingArmour.StatTrackerRegistry; + +public class LivingArmour { + + public HashMap trackerMap = new HashMap(); + + public void onTick(World world, EntityPlayer player) { + for (Entry entry : trackerMap.entrySet()) { + StatTracker tracker = entry.getValue(); + + if (tracker == null) { + continue; + } + + tracker.onTick(world, player, this); + } + } + + public void readFromNBT(NBTTagCompound tag) { + for (Class clazz : StatTrackerRegistry.trackers) { + try { + Constructor ctor = clazz.getConstructor(); + Object obj = ctor.newInstance(); + if (!(obj instanceof StatTracker)) { + // ????? + } + StatTracker tracker = (StatTracker) obj; + String key = tracker.getUniqueIdentifier(); + NBTTagCompound trackerTag = tag.getCompoundTag(key); + if (!trackerTag.hasNoTags()) { + tracker.readFromNBT(trackerTag); + } + trackerMap.put(key, tracker); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void writeToNBT(NBTTagCompound tag, boolean forceWrite) { + for (Entry entry : trackerMap.entrySet()) { + StatTracker tracker = entry.getValue(); + + if (tracker == null) { + continue; + } + + String key = tracker.getUniqueIdentifier(); + + if (forceWrite || tracker.isDirty()) { + NBTTagCompound trackerTag = new NBTTagCompound(); + tracker.writeToNBT(trackerTag); + + tag.setTag(key, trackerTag); + + tracker.resetDirty(); + } + } + } + + /** + * Writes the LivingArmour to the NBTTag. This will only write the trackers + * that are dirty. + * + * @param tag + */ + public void writeDirtyToNBT(NBTTagCompound tag) { + writeToNBT(tag, false); + } + + public void writeToNBT(NBTTagCompound tag) { + writeToNBT(tag, true); + } +}