From 3eb8c7a8fca3f22475d53e30f0b90a6737f313fa Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Thu, 24 May 2018 15:53:20 -0400 Subject: Initial commit --- .../java/fyresmodjam/misc/EntityStatHelper.java | 751 +++++++++++++++++++++ 1 file changed, 751 insertions(+) create mode 100755 YWD/src/main/java/fyresmodjam/misc/EntityStatHelper.java (limited to 'YWD/src/main/java/fyresmodjam/misc/EntityStatHelper.java') diff --git a/YWD/src/main/java/fyresmodjam/misc/EntityStatHelper.java b/YWD/src/main/java/fyresmodjam/misc/EntityStatHelper.java new file mode 100755 index 0000000..92635b9 --- /dev/null +++ b/YWD/src/main/java/fyresmodjam/misc/EntityStatHelper.java @@ -0,0 +1,751 @@ +package fyresmodjam.misc; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Random; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import fyresmodjam.ModjamMod; +import fyresmodjam.blessings.BlessingUtils; +import fyresmodjam.handlers.CommonTickHandler; +import fyresmodjam.handlers.NewPacketHandler; +import fyresmodjam.worldgen.FyresWorldData; +import net.minecraft.entity.Entity; +import net.minecraft.entity.Entity.EnumEntitySize; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.EntityJoinWorldEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; + +@SuppressWarnings("rawtypes") +public class EntityStatHelper { + + public static String[] knowledge = { + "Clueless", "Novice", "Competent", "Talented", + "Expert", "Professional", "Master", "Legendary" + }; + + public static int[] killCount = { + 0, 10, 25, 50, 100, 250, 500, 1000 + }; + + public static float[] damageBonus = { + 0, 0.01F, 0.025F, 0.05F, 0.075F, 0.1F, 0.15F, 0.2F + }; + public static String[] damageBonusString = { + "0", "1", "2.5", "5", "7.5", "10", "15", "20" + }; + + public static HashMap statTrackersByClass = new HashMap(); + + public static ArrayList genericTrackers = new ArrayList(); + + public static ArrayList temp = new ArrayList(); + public static boolean b = false; + + public static void addStatTracker(EntityStatTracker statTracker) { + if (statTracker.classes != null) { + for (Class c : statTracker.classes) { + statTrackersByClass.put(c, statTracker); + } + + if (statTracker.instanceAllowed) { + genericTrackers.add(statTracker); + } + } + } + + public static String getStat(Entity entity, String name) { + String s = null; + + if (entity.getEntityData() != null + && entity.getEntityData().hasKey(name)) { + s = entity.getEntityData().getString(name); + } + + return s; + } + + public static String getUnalteredItemName(Item item) { + return StatCollector.translateToLocal( + item.getUnlocalizedName() + ".name"); + } + + public static String getUnalteredName(Entity entity) { + String s = EntityList.getEntityString(entity); + + if (s == null) { + s = "generic"; + } + + return StatCollector + .translateToLocal("entity." + s + ".name"); + } + + public static Entity giveStat(Entity entity, String name, + Object value) { + if (entity != null && name != null && value != null) { + entity.getEntityData().setString(name, + value.toString()); + } + + return entity; + } + + public static boolean hasStat(Entity entity, String name) { + if (entity.getEntityData() != null + && entity.getEntityData().hasKey(name)) { + return true; + } + + return false; + } + + @SuppressWarnings("unchecked") + public static void processEntity(Entity entity, Random r) { + if (entity == null) { + return; + } + + temp.clear(); + + if (statTrackersByClass.containsKey(entity.getClass())) { + temp.add(statTrackersByClass + .get(entity.getClass())); + } + + for (EntityStatTracker e : genericTrackers) { + if (!temp.contains(e)) { + for (Class c : e.classes) { + if (c.isAssignableFrom(entity + .getClass())) { + temp.add(e); + break; + } + } + } + } + + if (!temp.isEmpty()) { + String processed = EntityStatHelper.getStat(entity, + "processed"); + + if (processed == null + || processed.equals("false")) { + EntityStatHelper.giveStat(entity, + "processed", "true"); + + for (EntityStatTracker statTracker : temp) { + for (EntityStat s : statTracker.stats) { + giveStat(entity, s.name, s + .getNewValue(r) + .toString()); + + if (entity instanceof EntityLiving) { + setName((EntityLiving) entity, + s.getAlteredEntityName( + (EntityLiving) entity)); + } + + s.modifyEntity(entity); + } + } + } + } + } + + public static void setEntitySize(Entity entity, float par1, + float par2) { + float f2; + + if (par1 != entity.width || par2 != entity.height) { + f2 = entity.width; + entity.width = par1; + entity.height = par2; + entity.boundingBox.maxX = entity.boundingBox.minX + + entity.width; + entity.boundingBox.maxZ = entity.boundingBox.minZ + + entity.width; + entity.boundingBox.maxY = entity.boundingBox.minY + + entity.height; + } + + f2 = par1 % 2.0F; + + if (f2 < 0.375D) { + entity.myEntitySize = EnumEntitySize.SIZE_1; + } else if (f2 < 0.75D) { + entity.myEntitySize = EnumEntitySize.SIZE_2; + } else if (f2 < 1.0D) { + entity.myEntitySize = EnumEntitySize.SIZE_3; + } else if (f2 < 1.375D) { + entity.myEntitySize = EnumEntitySize.SIZE_4; + } else if (f2 < 1.75D) { + entity.myEntitySize = EnumEntitySize.SIZE_5; + } else { + entity.myEntitySize = EnumEntitySize.SIZE_6; + } + } + + public static Entity setName(EntityLiving entity, String name) { + entity.setCustomNameTag(name); + + return entity; + } + + private void addOnKillStats(EntityPlayer player, String mob) { + if (!player.getEntityData().hasKey("KillStats")) { + player.getEntityData().setTag("KillStats", + new NBTTagCompound()); + } + + NBTTagCompound killStats = player.getEntityData() + .getCompoundTag("KillStats"); + + if (!killStats.hasKey(mob)) { + killStats.setInteger(mob, 0); + + if (!killStats.hasKey("TrackedMobList")) { + killStats.setString("TrackedMobList", mob); + } else { + killStats.setString("TrackedMobList", + killStats.getString( + "TrackedMobList") + + ";" + + mob); + } + } + + killStats.setInteger(mob, killStats.getInteger(mob) + 1); + + if (ConfigData.enableMobKillStats) { + for (int i = 0; i < knowledge.length; i++) { + if (killCount[i] == killStats + .getInteger(mob)) { + NewPacketHandler.SEND_MESSAGE + .sendToPlayer(player, + "\u00A7o\u00A73You've become a " + + knowledge[i].toLowerCase() + + " " + + mob.toLowerCase() + + " slayer! (+" + + damageBonusString[i] + + "% damage against " + + mob.toLowerCase() + + "s.)" + + (i < knowledge.length + - 1 ? " " + (killCount[i + 1] - killCount[i]) + " " + mob.toLowerCase() + " kills to next rank." : "")); + break; + } + } + + int count = 0; + + if (killStats.hasKey("TrackedMobList") && killStats + .getString("TrackedMobList") != null + && killStats.getString( + "TrackedMobList") + .length() > 0) { + for (String object : killStats.getString( + "TrackedMobList") + .split(";")) { + if (killStats.hasKey(object) + && killStats.getInteger( + object) >= killCount[2]) { + count++; + } + } + } + + if (count >= 5) { + player.triggerAchievement( + ModjamMod.theHunt); + } + } + + String weapon = "misc"; + + if (player.getHeldItem() == null) { + weapon = "fist"; + } else if (player.getHeldItem().getItem() != null) { + weapon = getUnalteredItemName( + player.getHeldItem().getItem()); + } + + if (!player.getEntityData().hasKey("WeaponStats")) { + player.getEntityData().setTag("WeaponStats", + new NBTTagCompound()); + } + NBTTagCompound weaponStats = player.getEntityData() + .getCompoundTag("WeaponStats"); + + if (!weaponStats.hasKey(weapon)) { + weaponStats.setInteger(weapon, 0); + + if (!weaponStats.hasKey("TrackedItemList")) { + weaponStats.setString("TrackedItemList", + weapon); + } else { + weaponStats.setString("TrackedItemList", + weaponStats.getString( + "TrackedItemList") + + ";" + + weapon); + } + } + + weaponStats.setInteger(weapon, + weaponStats.getInteger(weapon) + 1); + + if (ConfigData.enableWeaponKillStats) { + for (int i = 0; i < knowledge.length; i++) { + if (killCount[i] * 2 == weaponStats + .getInteger(weapon)) { + NewPacketHandler.SEND_MESSAGE + .sendToPlayer(player, + "\u00A7o\u00A73You've become a " + + knowledge[i].toLowerCase() + + " " + + weapon.toLowerCase() + + " user! (+" + + damageBonusString[i] + + "% damage with " + + weapon.toLowerCase() + + "s.)" + + (i < knowledge.length + - 1 ? " " + (killCount[i + 1] * 2 - killCount[i] * 2) + " " + weapon.toLowerCase() + " kills to next rank." : "")); + break; + } + } + + int count = 0; + + if (weaponStats.hasKey("TrackedItemList") + && weaponStats.getString( + "TrackedItemList") != null + && weaponStats.getString( + "TrackedItemList") + .length() > 0) { + for (String object : weaponStats.getString( + "TrackedItemList") + .split(";")) { + if (weaponStats.hasKey(object) + && weaponStats.getInteger( + object) >= killCount[1] + * 2) { + count++; + } + } + } + + if (count >= 10) { + player.triggerAchievement( + ModjamMod.jackOfAllTrades); + } + } + } + + private void addPlayerStats(EntityJoinWorldEvent event) { + if (!event.entity.getEntityData().hasKey("Blessing") + && CommonTickHandler.worldData.blessingByPlayer + .containsKey(event.entity + .getCommandSenderName())) { + event.entity.getEntityData().setString("Blessing", + CommonTickHandler.worldData.blessingByPlayer + .get(event.entity + .getCommandSenderName())); + + NewPacketHandler.UPDATE_BLESSING.sendToPlayer( + (EntityPlayer) event.entity, + event.entity.getEntityData() + .getString("Blessing")); + + CommonTickHandler.worldData.blessingByPlayer + .remove(event.entity + .getCommandSenderName()); + CommonTickHandler.worldData.markDirty(); + } + + if (!event.entity.getEntityData().hasKey("PotionKnowledge") + && CommonTickHandler.worldData.potionKnowledgeByPlayer + .containsKey(event.entity + .getCommandSenderName())) { + event.entity.getEntityData().setIntArray( + "PotionKnowledge", + CommonTickHandler.worldData.potionKnowledgeByPlayer + .get(event.entity + .getCommandSenderName())); + + NewPacketHandler.UPDATE_POTION_KNOWLEDGE + .sendToPlayer((EntityPlayer) event.entity, + event.entity.getEntityData() + .getIntArray("PotionKnowledge")); + + CommonTickHandler.worldData.potionKnowledgeByPlayer + .remove(event.entity + .getCommandSenderName()); + CommonTickHandler.worldData.markDirty(); + } + + if (!event.entity.getEntityData().hasKey("KillStats") + && CommonTickHandler.worldData.killStatsByPlayer + .containsKey(event.entity + .getCommandSenderName())) { + event.entity.getEntityData().setTag("KillStats", + CommonTickHandler.worldData.killStatsByPlayer + .get(event.entity + .getCommandSenderName())); + + CommonTickHandler.worldData.killStatsByPlayer + .remove(event.entity + .getCommandSenderName()); + CommonTickHandler.worldData.markDirty(); + } + + if (!event.entity.getEntityData().hasKey("WeaponStats") + && CommonTickHandler.worldData.weaponStatsByPlayer + .containsKey(event.entity + .getCommandSenderName())) { + event.entity.getEntityData().setTag("WeaponStats", + CommonTickHandler.worldData.weaponStatsByPlayer + .get(event.entity + .getCommandSenderName())); + + CommonTickHandler.worldData.killStatsByPlayer + .remove(event.entity + .getCommandSenderName()); + CommonTickHandler.worldData.markDirty(); + } + + if (!event.entity.getEntityData().hasKey("CraftingStats") + && CommonTickHandler.worldData.craftingStatsByPlayer + .containsKey(event.entity + .getCommandSenderName())) { + event.entity.getEntityData().setTag( + "CraftingStats", + CommonTickHandler.worldData.craftingStatsByPlayer + .get(event.entity + .getCommandSenderName())); + + CommonTickHandler.worldData.craftingStatsByPlayer + .remove(event.entity + .getCommandSenderName()); + CommonTickHandler.worldData.markDirty(); + } + } + + private void advanceKillTaskProgress(LivingDeathEvent event) { + CommonTickHandler.worldData.progress++; + + String name1 = CommonTickHandler.worldData.currentTask + .equals("Kill") ? FyresWorldData.validMobNames[CommonTickHandler.worldData.currentTaskID] + : FyresWorldData.validItems[CommonTickHandler.worldData.currentTaskID] + .getDisplayName(); + + if (name1.contains("Block")) { + if (name1.contains("Block")) { + name1 = name1.replace("Block", "Blocks") + .replace("block", + "blocks"); + } + } else { + name1 += "s"; + } + + NewPacketHandler.SEND_MESSAGE.sendToAllPlayers( + "\u00A7fCurrent Goal Progress: " + + CommonTickHandler.worldData.progress + + "/" + + CommonTickHandler.worldData.currentTaskAmount + + " " + name1 + " " + + CommonTickHandler.worldData.currentTask + + "ed."); + + if (CommonTickHandler.worldData.progress >= CommonTickHandler.worldData.currentTaskAmount) { + CommonTickHandler.worldData.progress = 0; + CommonTickHandler.worldData.tasksCompleted++; + + NewPacketHandler.LEVEL_UP.sendToAllPlayers( + CommonTickHandler.worldData.rewardLevels); + + if (!CommonTickHandler.worldData.enderDragonKilled + && event.entity instanceof EntityDragon) { + CommonTickHandler.worldData.enderDragonKilled = true; + } + + CommonTickHandler.worldData.giveNewTask(); + + NewPacketHandler.SEND_MESSAGE.sendToAllPlayers( + "\u00A7eA world goal has been completed!" + + (!CommonTickHandler.worldData + .getDisadvantage() + .equals("None") ? " World disadvantage has been lifted!" + : "")); + + NewPacketHandler.SEND_MESSAGE.sendToAllPlayers( + "\u00A7eA new world goal has been set: " + + (CommonTickHandler.worldData.currentTask + + " " + + CommonTickHandler.worldData.currentTaskAmount + + " " + + (CommonTickHandler.worldData.currentTask + .equals("Kill") ? FyresWorldData.validMobNames[CommonTickHandler.worldData.currentTaskID] + : FyresWorldData.validItems[CommonTickHandler.worldData.currentTaskID] + .getDisplayName()) + + "s. (" + + CommonTickHandler.worldData.progress + + " " + + CommonTickHandler.worldData.currentTask + + "ed)")); + + CommonTickHandler.worldData.currentDisadvantage = "None"; + } + + NewPacketHandler.UPDATE_WORLD_DATA.sendToAllPlayers( + CommonTickHandler.worldData.potionValues, + CommonTickHandler.worldData.potionDurations, + CommonTickHandler.worldData + .getDisadvantage(), + CommonTickHandler.worldData.currentTask, + CommonTickHandler.worldData.currentTaskID, + CommonTickHandler.worldData.currentTaskAmount, + CommonTickHandler.worldData.progress, + CommonTickHandler.worldData.tasksCompleted, + CommonTickHandler.worldData.enderDragonKilled, + ConfigData.spawnTraps, + CommonTickHandler.worldData.rewardLevels, + CommonTickHandler.worldData.mushroomColors); + + CommonTickHandler.worldData.markDirty(); + } + + private void cloneMob(EntityJoinWorldEvent event) { + event.entity.getEntityData().setBoolean("isClone", true); + + Entity entityNew = null; + + try { + Constructor[] constructors = event.entity + .getClass().getConstructors(); + + for (int i = 0; i < constructors.length; i++) { + Class[] parameters = constructors[i] + .getParameterTypes(); + + if (parameters.length == 1 && parameters[0] + .equals(World.class)) { + entityNew = (Entity) event.entity + .getClass() + .getConstructors()[i] + .newInstance(event.world); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + + if (entityNew != null) { + entityNew.setLocationAndAngles(event.entity.posX, + event.entity.posY, + event.entity.posZ, + event.entity.rotationYaw, + event.entity.rotationPitch); + + entityNew.getEntityData().setBoolean("isClone", + true); + + entityNew.dimension = event.entity.dimension; + + CommonTickHandler.addLater.add(entityNew); + } + } + + @SubscribeEvent + public void entityJoinWorld(EntityJoinWorldEvent event) { + if (!event.world.isRemote) { + processEntity(event.entity, ModjamMod.r); + + boolean isClone = isEntityClone(event); + + if (shouldCloneMob(event, isClone)) { + cloneMob(event); + } + + if (event.entity instanceof EntityPlayer) { + addPlayerStats(event); + } + } + } + + private void handleBlessings(LivingDeathEvent event) { + String blessing = event.source.getEntity().getEntityData() + .getString("Blessing"); + + BlessingUtils.getBlessingInstance(blessing).onMobKill(event); + } + + private boolean isEntityClone(EntityJoinWorldEvent event) { + if (event.entity.getEntityData().hasKey("isClone")) { + return event.entity.getEntityData() + .getBoolean("isClone"); + } else { + return false; + } + } + + @SuppressWarnings("unchecked") + @SubscribeEvent + public void livingDeath(LivingDeathEvent event) { + if (!event.entity.worldObj.isRemote) { + if (event.entity.worldObj.getGameRules() + .getGameRuleBooleanValue( + "doMobLoot")) { + + if (event.entity instanceof EntityLivingBase + && event.source != null + && event.source.getEntity() != null) { + if (BlessingUtils.hasBlessing(event.source.getEntity())) { + handleBlessings(event); + } + } + + int level = 0; + + if (event.entity.getEntityData() + .hasKey("Level")) { + level = Integer.parseInt( + event.entity.getEntityData() + .getString("Level")); + } + + if (ModjamMod.r.nextInt(30) == 0 + || level == 5) { + event.entity.entityDropItem( + new ItemStack(ModjamMod.mysteryPotion, + 1, + ModjamMod.r.nextInt( + 13)), + event.entity.height + / 2); + } + } + + if (CommonTickHandler.worldData.currentTask + .equals("Kill") + && FyresWorldData.validMobs[CommonTickHandler.worldData.currentTaskID] + .isAssignableFrom( + event.entity.getClass())) { + advanceKillTaskProgress(event); + } + + if (!CommonTickHandler.worldData.enderDragonKilled + && event.entity instanceof EntityDragon) { + CommonTickHandler.worldData.enderDragonKilled = true; + NewPacketHandler.UPDATE_WORLD_DATA + .sendToAllPlayers( + CommonTickHandler.worldData.potionValues, + CommonTickHandler.worldData.potionDurations, + CommonTickHandler.worldData + .getDisadvantage(), + CommonTickHandler.worldData.currentTask, + CommonTickHandler.worldData.currentTaskID, + CommonTickHandler.worldData.currentTaskAmount, + CommonTickHandler.worldData.progress, + CommonTickHandler.worldData.tasksCompleted, + CommonTickHandler.worldData.enderDragonKilled, + ConfigData.spawnTraps, + CommonTickHandler.worldData.rewardLevels, + CommonTickHandler.worldData.mushroomColors); + CommonTickHandler.worldData.markDirty(); + } + } + + if (event.entity instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) event.entity; + + player.triggerAchievement(ModjamMod.losingIsFun); + + CommonTickHandler.worldData.blessingByPlayer.put( + player.getCommandSenderName(), + player.getEntityData().getString( + "Blessing")); + + CommonTickHandler.worldData.potionKnowledgeByPlayer + .put(player.getCommandSenderName(), + player.getEntityData() + .getIntArray("PotionKnowledge")); + + if (player.getEntityData() != null + && player.getEntityData().hasKey( + "KillStats")) { + CommonTickHandler.worldData.killStatsByPlayer + .put(player.getCommandSenderName(), + player.getEntityData() + .getCompoundTag("KillStats")); + } + + if (player.getEntityData() != null + && player.getEntityData().hasKey( + "WeaponStats")) { + CommonTickHandler.worldData.weaponStatsByPlayer + .put(player.getCommandSenderName(), + player.getEntityData() + .getCompoundTag("WeaponStats")); + } + + if (player.getEntityData() != null + && player.getEntityData().hasKey( + "CraftingStats")) { + CommonTickHandler.worldData.craftingStatsByPlayer + .put(player.getCommandSenderName(), + player.getEntityData() + .getCompoundTag("CraftingStats")); + } + } else if (event.source != null + && event.source.getEntity() != null + && event.source.getEntity() instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) event.source + .getEntity(); + String mob = getUnalteredName(event.entity); + + if (CommonTickHandler.worldData.getDisadvantage() + .equals("Trigger-happy") + && ModjamMod.r.nextInt(10) == 0) { + player.worldObj.createExplosion(player, + event.entity.posX, + event.entity.posY, + event.entity.posZ, 1, + true); + } + + addOnKillStats(player, mob); + } + } + + public void register() { + MinecraftForge.EVENT_BUS.register(this); + } + + private boolean shouldCloneMob(EntityJoinWorldEvent event, + boolean isClone) { + return CommonTickHandler.worldData != null + && CommonTickHandler.worldData + .getDisadvantage() + .equals("Increased Mob Spawn") + && (event.entity instanceof EntityMob) + && !(event.entity instanceof EntityDragon) + && !isClone && ModjamMod.r.nextInt(3) == 0; + } +} -- cgit v1.2.3