diff --git a/build.gradle b/build.gradle index 6a8922e2..b1b4ec06 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ sourceCompatibility = 1.7 targetCompatibility = 1.7 minecraft { - version = "1.7.10-10.13.0.1199" + version = "1.7.10-10.13.0.1208" assetDir = "eclipse/assets" } diff --git a/src/main/java/chylex/hee/mechanics/compendium/content/type/KnowledgeFragment.java b/src/main/java/chylex/hee/mechanics/compendium/content/type/KnowledgeFragment.java index 645757ba..6d1e37f4 100644 --- a/src/main/java/chylex/hee/mechanics/compendium/content/type/KnowledgeFragment.java +++ b/src/main/java/chylex/hee/mechanics/compendium/content/type/KnowledgeFragment.java @@ -23,6 +23,7 @@ public abstract class KnowledgeFragment{ private int price = 10; private boolean unlockOnDiscovery = false; private int[] unlockRequirements = ArrayUtils.EMPTY_INT_ARRAY; + private int[] unlockCascade = ArrayUtils.EMPTY_INT_ARRAY; public KnowledgeFragment(int globalID){ this.globalID = globalID; @@ -60,6 +61,19 @@ public abstract class KnowledgeFragment{ this.unlockRequirements = requirements; return this; } + + public int[] getUnlockRequirements(){ + return unlockRequirements; + } + + public KnowledgeFragment setUnlockCascade(int...cascade){ + this.unlockCascade = cascade; + return this; + } + + public int[] getUnlockCascade(){ + return unlockCascade; + } @SideOnly(Side.CLIENT) public abstract int getHeight(Minecraft mc, boolean isUnlocked); diff --git a/src/main/java/chylex/hee/mechanics/compendium/content/type/KnowledgeObject.java b/src/main/java/chylex/hee/mechanics/compendium/content/type/KnowledgeObject.java index 201f88c7..8c8c59d3 100644 --- a/src/main/java/chylex/hee/mechanics/compendium/content/type/KnowledgeObject.java +++ b/src/main/java/chylex/hee/mechanics/compendium/content/type/KnowledgeObject.java @@ -11,7 +11,7 @@ import com.google.common.collect.ImmutableSet; public class KnowledgeObject implements IGuiItemStackRenderer{ private static int lastUsedID = 0; private static final int iconSize = 30; - private static final TIntObjectHashMap> allObjects = new TIntObjectHashMap<>(); + private static final TIntObjectHashMap> allObjects = new TIntObjectHashMap<>(); // TODO add IKnowledgeObjectInstance -> Set public static > KnowledgeObject getObject(Object o){ for(KnowledgeObject knowledgeObject:allObjects.valueCollection()){ diff --git a/src/main/java/chylex/hee/mechanics/compendium/events/CompendiumEvents.java b/src/main/java/chylex/hee/mechanics/compendium/events/CompendiumEvents.java index edf4f3a8..62863603 100644 --- a/src/main/java/chylex/hee/mechanics/compendium/events/CompendiumEvents.java +++ b/src/main/java/chylex/hee/mechanics/compendium/events/CompendiumEvents.java @@ -1,10 +1,16 @@ package chylex.hee.mechanics.compendium.events; import gnu.trove.map.hash.TObjectByteHashMap; +import java.util.List; import java.util.UUID; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.util.Vec3; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.EntityEvent; import chylex.hee.mechanics.compendium.content.objects.ObjectBlock; @@ -15,6 +21,7 @@ import chylex.hee.mechanics.compendium.content.type.KnowledgeObject; import chylex.hee.mechanics.compendium.player.PlayerCompendiumData; import chylex.hee.packets.PacketPipeline; import chylex.hee.packets.client.C19CompendiumData; +import chylex.hee.system.util.MathUtil; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; @@ -86,9 +93,19 @@ public final class CompendiumEvents{ public void onPlayerTick(PlayerTickEvent e){ if (e.phase != Phase.START || e.player.worldObj.isRemote)return; - if (playerTickLimiter.adjustOrPutValue(e.player.getGameProfile().getId(),byteOne,byteOne) >= 10){ - playerTickLimiter.put(e.player.getGameProfile().getId(),byteZero); + EntityPlayer player = e.player; + if (playerTickLimiter.adjustOrPutValue(player.getGameProfile().getId(),byteOne,byteOne) >= 7){ + playerTickLimiter.put(player.getGameProfile().getId(),byteZero); + + Vec3 posVec = Vec3.createVectorHelper(player.posX,player.boundingBox.minY+player.getEyeHeight()-(player.isSneaking() ? 0.08D : 0D),player.posZ); + Vec3 lookVec = player.getLook(8F); + + MovingObjectPosition mopBlock = player.worldObj.rayTraceBlocks(posVec,lookVec,true); + double distBlock = mopBlock.typeOfHit == MovingObjectType.BLOCK ? MathUtil.distance(mopBlock.blockX+0.5D-posVec.xCoord,mopBlock.blockY+0.5D-posVec.yCoord,mopBlock.blockZ+0.5D-posVec.zCoord) : 8D; + + double bbX = posVec.xCoord+lookVec.xCoord*0.5D, bbY = posVec.yCoord+lookVec.yCoord*0.5D, bbZ = posVec.zCoord+posVec.zCoord*0.5D; + List list = player.worldObj.getEntitiesWithinAABB(Entity.class,AxisAlignedBB.getBoundingBox(bbX-5D,bbY-5D,bbZ-5D,bbX+5D,bbY+5D,bbZ+5D)); // TODO random events } } diff --git a/src/main/java/chylex/hee/mechanics/compendium/player/PlayerCompendiumData.java b/src/main/java/chylex/hee/mechanics/compendium/player/PlayerCompendiumData.java index 3a745b0f..5057a3cb 100644 --- a/src/main/java/chylex/hee/mechanics/compendium/player/PlayerCompendiumData.java +++ b/src/main/java/chylex/hee/mechanics/compendium/player/PlayerCompendiumData.java @@ -19,6 +19,7 @@ import chylex.hee.mechanics.compendium.content.type.KnowledgeFragment; import chylex.hee.mechanics.compendium.content.type.KnowledgeObject; import chylex.hee.mechanics.compendium.player.PlayerDiscoveryList.IObjectSerializer; import chylex.hee.system.logging.Stopwatch; +import cpw.mods.fml.common.registry.GameData; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier; import cpw.mods.fml.relauncher.Side; @@ -52,54 +53,6 @@ public class PlayerCompendiumData implements IExtendedEntityProperties{ pointAmount = Math.max(0,pointAmount-amount); } - public boolean tryDiscoverBlock(KnowledgeObject block, boolean addReward){ - if (discoveredBlocks.addObject(block.getObject())){ - if (addReward){ - unlockDiscoveryFragments(block); - pointAmount += block.getDiscoveryReward(); - } - - return true; - } - else return false; - } - - public boolean hasDiscoveredBlock(KnowledgeObject block){ - return discoveredBlocks.hasDiscoveredObject(block.getObject()); - } - - public boolean tryDiscoverItem(KnowledgeObject item, boolean addReward){ - if (discoveredItems.addObject(item.getObject())){ - if (addReward){ - unlockDiscoveryFragments(item); - pointAmount += item.getDiscoveryReward(); - } - - return true; - } - else return false; - } - - public boolean hasDiscoveredItem(KnowledgeObject item){ - return discoveredItems.hasDiscoveredObject(item.getObject()); - } - - public boolean tryDiscoverMob(KnowledgeObject mob, boolean addReward){ - if (discoveryMobs.addObject(mob.getObject())){ - if (addReward){ - unlockDiscoveryFragments(mob); - pointAmount += mob.getDiscoveryReward(); - } - - return true; - } - else return false; - } - - public boolean hasDiscoveredMob(KnowledgeObject mob){ - return discoveryMobs.hasDiscoveredObject(mob.getObject()); - } - public boolean tryDiscoverObject(KnowledgeObject object, boolean addReward){ IKnowledgeObjectInstance obj = object.getObject(); @@ -118,6 +71,49 @@ public class PlayerCompendiumData implements IExtendedEntityProperties{ else return false; } + public boolean tryDiscoverBlock(KnowledgeObject block, boolean addReward){ + if (discoveredBlocks.addObject(block.getObject())){ + onDiscover(block,addReward); + return true; + } + else return false; + } + + public boolean hasDiscoveredBlock(KnowledgeObject block){ + return discoveredBlocks.hasDiscoveredObject(block.getObject()); + } + + public boolean tryDiscoverItem(KnowledgeObject item, boolean addReward){ + if (discoveredItems.addObject(item.getObject())){ + onDiscover(item,addReward); + return true; + } + else return false; + } + + public boolean hasDiscoveredItem(KnowledgeObject item){ + return discoveredItems.hasDiscoveredObject(item.getObject()); + } + + public boolean tryDiscoverMob(KnowledgeObject mob, boolean addReward){ + if (discoveryMobs.addObject(mob.getObject())){ + onDiscover(mob,addReward); + return true; + } + else return false; + } + + public boolean hasDiscoveredMob(KnowledgeObject mob){ + return discoveryMobs.hasDiscoveredObject(mob.getObject()); + } + + private void onDiscover(KnowledgeObject object, boolean addReward){ + if (addReward){ + unlockDiscoveryFragments(object); + pointAmount += object.getDiscoveryReward(); + } + } + private void unlockDiscoveryFragments(KnowledgeObject object){ for(KnowledgeFragment fragment:object.getFragments()){ if (fragment.isUnlockedOnDiscovery())unlockFragment(fragment); @@ -125,13 +121,28 @@ public class PlayerCompendiumData implements IExtendedEntityProperties{ } public boolean unlockFragment(KnowledgeFragment fragment){ - return unlockedFragments.add(fragment.globalID); + if (unlockedFragments.add(fragment.globalID)){ + for(int cascade:fragment.getUnlockCascade())unlockFragment(KnowledgeFragment.getById(cascade)); + return true; + } + else return false; } public boolean hasUnlockedFragment(KnowledgeFragment fragment){ return unlockedFragments.contains(fragment.globalID); } + public FragmentPurchaseStatus canPurchaseFragment(KnowledgeFragment fragment){ + if (!fragment.isBuyable())return FragmentPurchaseStatus.NOT_BUYABLE; + if (pointAmount < fragment.getPrice())return FragmentPurchaseStatus.NOT_ENOUGH_POINTS; + + for(int requirement:fragment.getUnlockRequirements()){ + if (!unlockedFragments.contains(requirement))return FragmentPurchaseStatus.REQUIREMENTS_UNFULFILLED; + } + + return FragmentPurchaseStatus.CAN_PURCHASE; + } + @Override public void init(Entity entity, World world){} @@ -171,11 +182,11 @@ public class PlayerCompendiumData implements IExtendedEntityProperties{ @Override public BlockMetaWrapper deserialize(String data){ - int colonIndex = data.indexOf(":"), nextColonIndex = data.indexOf(":",colonIndex+1); - String meta = data.substring(nextColonIndex+1); + int secondColonIndex = data.indexOf(":",data.indexOf(":")+1); + String meta = data.substring(secondColonIndex+1); if (!meta.equals("-1") && !StringUtils.isNumeric(meta))return null; - else return new BlockMetaWrapper(GameRegistry.findBlock(data.substring(0,colonIndex),data.substring(colonIndex+1,nextColonIndex)),Integer.parseInt(meta)); + else return new BlockMetaWrapper(GameData.getBlockRegistry().getObject(data.substring(0,secondColonIndex)),Integer.parseInt(meta)); } } @@ -188,8 +199,7 @@ public class PlayerCompendiumData implements IExtendedEntityProperties{ @Override public Item deserialize(String data){ - int colonIndex = data.indexOf(":"); - return GameRegistry.findItem(data.substring(0,colonIndex),data.substring(colonIndex+1)); + return GameData.getItemRegistry().getObject(data); } } @@ -204,4 +214,10 @@ public class PlayerCompendiumData implements IExtendedEntityProperties{ return (Class)EntityList.stringToClassMapping.get(data); } } + + // ENUMS + + public enum FragmentPurchaseStatus{ + CAN_PURCHASE, NOT_BUYABLE, NOT_ENOUGH_POINTS, REQUIREMENTS_UNFULFILLED + } } diff --git a/src/main/java/chylex/hee/mechanics/orb/OrbAcquirableItems.java b/src/main/java/chylex/hee/mechanics/orb/OrbAcquirableItems.java index c6d8eec1..91289f46 100644 --- a/src/main/java/chylex/hee/mechanics/orb/OrbAcquirableItems.java +++ b/src/main/java/chylex/hee/mechanics/orb/OrbAcquirableItems.java @@ -1,5 +1,6 @@ package chylex.hee.mechanics.orb; import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; @@ -22,6 +23,7 @@ import chylex.hee.item.ItemList; import chylex.hee.system.logging.Log; import chylex.hee.system.logging.Stopwatch; import chylex.hee.system.util.DragonUtil; +import cpw.mods.fml.common.registry.GameRegistry; public final class OrbAcquirableItems{ public static final WeightedItemList idList = new WeightedItemList(); @@ -123,24 +125,35 @@ public final class OrbAcquirableItems{ } private static String toString(ItemStack is){ - if (is.getItem() == null)return "ERROR"; - else return is.toString(); + if (is == null)return ""; + else if (is.getItem() == null)return ""; + else return "["+GameRegistry.findUniqueIdentifierFor(is.getItem()).modId+"]"+(is.stackSize > 9 ? is.toString().substring(3).replace('@','/') : is.toString().substring(2)).replace('@','/'); } private static String toString(List list){ - try{ - return list.toString(); - }catch(Throwable t){ - return "ERROR"; - } + return toString(list.toArray()); } private static String toString(Object[] array){ - try{ - return ArrayUtils.toString(array); - }catch(Throwable t){ - return "ERROR"; + Object[] newArray = new Object[array.length]; + + for(int a = 0; a < array.length; a++){ + if (array[a] == null)newArray[a] = ""; + else if (array[a] instanceof ItemStack)newArray[a] = toString((ItemStack)array[a]); + else if (array[a] instanceof Collection){ + Collection collection = (Collection)array[a]; + + if (collection.isEmpty())newArray[a] = ""; + else{ + Object obj = collection.iterator().next(); + if (obj instanceof ItemStack)newArray[a] = toString((ItemStack)obj)+"(ore)"; + else newArray[a] = ""; + } + } + else newArray[a] = ""; } + + return ArrayUtils.toString(newArray).replace(",",", "); } private OrbAcquirableItems(){}