2015-12-03 02:30:54 +00:00
|
|
|
package WayofTime.bloodmagic.livingArmour;
|
|
|
|
|
|
|
|
import java.lang.reflect.Constructor;
|
|
|
|
import java.util.HashMap;
|
2016-01-03 19:12:55 +00:00
|
|
|
import java.util.List;
|
2015-12-03 02:30:54 +00:00
|
|
|
import java.util.Map.Entry;
|
|
|
|
|
2016-01-02 22:07:11 +00:00
|
|
|
import net.minecraft.entity.ai.attributes.AttributeModifier;
|
2015-12-03 02:30:54 +00:00
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
2015-12-03 15:18:05 +00:00
|
|
|
import net.minecraft.nbt.NBTTagList;
|
2015-12-03 02:30:54 +00:00
|
|
|
import net.minecraft.world.World;
|
2015-12-03 15:18:05 +00:00
|
|
|
import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler;
|
|
|
|
import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade;
|
2015-12-03 02:30:54 +00:00
|
|
|
import WayofTime.bloodmagic.api.livingArmour.StatTracker;
|
|
|
|
|
2016-01-02 22:07:11 +00:00
|
|
|
import com.google.common.collect.HashMultimap;
|
|
|
|
import com.google.common.collect.Multimap;
|
|
|
|
|
2015-12-30 20:34:40 +00:00
|
|
|
public class LivingArmour
|
|
|
|
{
|
2016-01-02 22:07:11 +00:00
|
|
|
public HashMap<String, StatTracker> trackerMap = new HashMap<String, StatTracker>();
|
|
|
|
public HashMap<String, LivingArmourUpgrade> upgradeMap = new HashMap<String, LivingArmourUpgrade>();
|
|
|
|
|
2016-01-03 19:12:55 +00:00
|
|
|
public int maxUpgradePoints = 100;
|
|
|
|
public int totalUpgradePoints = 0;
|
|
|
|
|
2016-01-02 22:07:11 +00:00
|
|
|
public Multimap<String, AttributeModifier> getAttributeModifiers()
|
|
|
|
{
|
|
|
|
HashMultimap<String, AttributeModifier> modifierMap = HashMultimap.<String, AttributeModifier>create();
|
|
|
|
|
|
|
|
for (Entry<String, LivingArmourUpgrade> entry : upgradeMap.entrySet())
|
|
|
|
{
|
|
|
|
LivingArmourUpgrade upgrade = entry.getValue();
|
2016-01-03 19:12:55 +00:00
|
|
|
if (upgrade == null)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
2016-01-02 22:07:11 +00:00
|
|
|
modifierMap.putAll(upgrade.getAttributeModifiers());
|
|
|
|
}
|
|
|
|
|
|
|
|
return modifierMap;
|
|
|
|
}
|
2015-12-30 20:34:40 +00:00
|
|
|
|
2016-01-03 19:12:55 +00:00
|
|
|
public boolean upgradeArmour(EntityPlayer user, LivingArmourUpgrade upgrade)
|
|
|
|
{
|
|
|
|
String key = upgrade.getUniqueIdentifier();
|
|
|
|
if (upgradeMap.containsKey(key))
|
|
|
|
{
|
|
|
|
//Check if this is a higher level than the previous upgrade
|
|
|
|
int nextLevel = upgrade.getUpgradeLevel();
|
|
|
|
int currentLevel = upgradeMap.get(key).getUpgradeLevel();
|
|
|
|
|
|
|
|
if (nextLevel > currentLevel)
|
|
|
|
{
|
|
|
|
int upgradePointDifference = upgrade.getCostOfUpgrade() - upgradeMap.get(key).getCostOfUpgrade();
|
|
|
|
if (upgradePointDifference >= 0 && totalUpgradePoints + upgradePointDifference <= maxUpgradePoints)
|
|
|
|
{
|
|
|
|
upgradeMap.put(key, upgrade);
|
|
|
|
notifyPlayerOfUpgrade(user, upgrade);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
int upgradePoints = upgrade.getCostOfUpgrade();
|
|
|
|
if (totalUpgradePoints + upgradePoints <= maxUpgradePoints)
|
|
|
|
{
|
|
|
|
upgradeMap.put(key, upgrade);
|
|
|
|
notifyPlayerOfUpgrade(user, upgrade);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void notifyPlayerOfUpgrade(EntityPlayer user, LivingArmourUpgrade upgrade)
|
|
|
|
{
|
|
|
|
System.out.println("Upgraded!");
|
|
|
|
}
|
|
|
|
|
2015-12-30 20:34:40 +00:00
|
|
|
/**
|
|
|
|
* Ticks the upgrades and stat trackers, passing in the world and player as
|
|
|
|
* well as the LivingArmour
|
|
|
|
*
|
|
|
|
* @param world
|
|
|
|
* @param player
|
|
|
|
*/
|
|
|
|
public void onTick(World world, EntityPlayer player)
|
|
|
|
{
|
|
|
|
for (Entry<String, LivingArmourUpgrade> entry : upgradeMap.entrySet())
|
|
|
|
{
|
|
|
|
LivingArmourUpgrade upgrade = entry.getValue();
|
|
|
|
|
|
|
|
if (upgrade == null)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
upgrade.onTick(world, player, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (Entry<String, StatTracker> entry : trackerMap.entrySet())
|
|
|
|
{
|
|
|
|
StatTracker tracker = entry.getValue();
|
|
|
|
|
|
|
|
if (tracker == null)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2016-01-03 19:12:55 +00:00
|
|
|
if (tracker.onTick(world, player, this))
|
|
|
|
{
|
|
|
|
List<LivingArmourUpgrade> upgradeList = tracker.getUpgrades();
|
|
|
|
|
|
|
|
for (LivingArmourUpgrade upgrade : upgradeList) //TODO: make a getNextUpgrade?
|
|
|
|
{
|
|
|
|
upgradeArmour(player, upgrade);
|
|
|
|
}
|
|
|
|
}
|
2015-12-30 20:34:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void readFromNBT(NBTTagCompound tag)
|
|
|
|
{
|
|
|
|
NBTTagList upgradeTags = tag.getTagList("upgrades", 10);
|
|
|
|
if (upgradeTags != null)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < upgradeTags.tagCount(); i++)
|
|
|
|
{
|
|
|
|
NBTTagCompound upgradeTag = upgradeTags.getCompoundTagAt(i);
|
|
|
|
String key = upgradeTag.getString("key");
|
|
|
|
int level = upgradeTag.getInteger("level");
|
|
|
|
NBTTagCompound nbtTag = upgradeTag.getCompoundTag("upgrade");
|
2016-01-03 19:12:55 +00:00
|
|
|
LivingArmourUpgrade upgrade = LivingArmourHandler.generateUpgradeFromKey(key, level, nbtTag);
|
|
|
|
if (upgrade != null)
|
|
|
|
{
|
|
|
|
upgradeMap.put(key, upgrade);
|
|
|
|
totalUpgradePoints += upgrade.getCostOfUpgrade();
|
|
|
|
}
|
2015-12-30 20:34:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (Class<? extends StatTracker> clazz : LivingArmourHandler.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)
|
|
|
|
{
|
|
|
|
NBTTagList tags = new NBTTagList();
|
|
|
|
|
|
|
|
for (Entry<String, LivingArmourUpgrade> entry : upgradeMap.entrySet())
|
|
|
|
{
|
|
|
|
NBTTagCompound upgradeTag = new NBTTagCompound();
|
|
|
|
|
|
|
|
LivingArmourUpgrade upgrade = entry.getValue();
|
|
|
|
NBTTagCompound nbtTag = new NBTTagCompound();
|
|
|
|
upgrade.writeToNBT(nbtTag);
|
|
|
|
|
|
|
|
upgradeTag.setString("key", upgrade.getUniqueIdentifier());
|
|
|
|
upgradeTag.setInteger("level", upgrade.getUpgradeLevel());
|
|
|
|
upgradeTag.setTag("upgrade", nbtTag);
|
|
|
|
|
|
|
|
tags.appendTag(upgradeTag);
|
|
|
|
}
|
|
|
|
|
|
|
|
tag.setTag("upgrades", tags);
|
|
|
|
|
|
|
|
for (Entry<String, StatTracker> 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);
|
|
|
|
}
|
2015-12-03 02:30:54 +00:00
|
|
|
}
|