| package com.gildedgames.the_aether.player; |
| |
| import com.gildedgames.the_aether.AetherConfig; |
| import com.gildedgames.the_aether.api.player.IPlayerAether; |
| import com.gildedgames.the_aether.api.player.util.IAccessoryInventory; |
| import com.gildedgames.the_aether.api.player.util.IAetherAbility; |
| import com.gildedgames.the_aether.api.player.util.IAetherBoss; |
| import com.gildedgames.the_aether.entities.passive.mountable.EntityParachute; |
| import com.gildedgames.the_aether.inventory.AccessoriesInventory; |
| import com.gildedgames.the_aether.network.packets.*; |
| import com.gildedgames.the_aether.registry.achievements.AetherAchievements; |
| import com.gildedgames.the_aether.items.AetherItems; |
| import com.gildedgames.the_aether.network.AetherNetwork; |
| import com.gildedgames.the_aether.player.perks.AetherRankings; |
| import com.gildedgames.the_aether.player.perks.util.EnumAetherPerkType; |
| import com.gildedgames.the_aether.blocks.BlocksAether; |
| import com.gildedgames.the_aether.items.tools.ValkyrieTool; |
| import com.gildedgames.the_aether.player.abilities.AccessoriesAbility; |
| import com.gildedgames.the_aether.player.abilities.ArmorAbility; |
| import com.gildedgames.the_aether.player.abilities.AbilityFlight; |
| import com.gildedgames.the_aether.player.abilities.RepulsionAbility; |
| import com.gildedgames.the_aether.player.perks.util.DonatorMoaSkin; |
| import com.gildedgames.the_aether.world.TeleporterAether; |
| import net.minecraft.block.Block; |
| import net.minecraft.entity.Entity; |
| import net.minecraft.entity.EntityLivingBase; |
| import net.minecraft.entity.SharedMonsterAttributes; |
| import net.minecraft.entity.ai.attributes.AttributeModifier; |
| import net.minecraft.entity.player.EntityPlayer; |
| import net.minecraft.entity.player.EntityPlayerMP; |
| import net.minecraft.init.Blocks; |
| import net.minecraft.item.ItemStack; |
| import net.minecraft.nbt.NBTTagCompound; |
| import net.minecraft.potion.Potion; |
| import net.minecraft.server.MinecraftServer; |
| import net.minecraft.util.AxisAlignedBB; |
| import net.minecraft.util.ChunkCoordinates; |
| import net.minecraft.util.Direction; |
| import net.minecraft.util.MathHelper; |
| import net.minecraft.world.World; |
| import cpw.mods.fml.common.FMLCommonHandler; |
| import cpw.mods.fml.relauncher.ReflectionHelper; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.UUID; |
| |
| public class PlayerAether implements IPlayerAether { |
| |
| private EntityPlayer player; |
| |
| private IAetherBoss focusedBoss; |
| |
| private IAccessoryInventory accessories = new AccessoriesInventory(this); |
| |
| private final ArrayList<IAetherAbility> abilities = new ArrayList<IAetherAbility>(); |
| |
| public final ArrayList<Entity> clouds = new ArrayList<Entity>(2); |
| |
| private int shardCount; |
| |
| public DonatorMoaSkin donatorMoaSkin = new DonatorMoaSkin(); |
| |
| public boolean shouldRenderHalo, shouldRenderGlow, shouldRenderCape; |
| |
| public boolean seenSpiritDialog = false; |
| |
| private boolean isJumping; |
| |
| private boolean isMountSneaking; |
| |
| private boolean inPortal; |
| |
| private int portalCounter; |
| |
| public int teleportDirection; |
| |
| private String hammerName = "Hammer of Notch"; |
| |
| private int cooldown; |
| |
| private int cooldownMax; |
| |
| public float wingSinage; |
| |
| public float timeInPortal; |
| |
| public float prevTimeInPortal; |
| |
| public Entity riddenEntity; |
| |
| private ChunkCoordinates bedLocation; |
| |
| public boolean isPoisoned = false, isCured = false; |
| |
| public boolean shouldGetPortal; |
| |
| public int poisonTime = 0, cureTime = 0; |
| |
| public PlayerAether() { |
| this.shouldRenderHalo = true; |
| this.shouldRenderGlow = false; |
| this.shouldRenderCape = true; |
| this.shouldGetPortal = true; |
| this.abilities.addAll(Arrays.<IAetherAbility>asList(new AccessoriesAbility(this), new ArmorAbility(this), new AbilityFlight(this), new RepulsionAbility(this))); |
| } |
| |
| public static PlayerAether get(EntityPlayer player) { |
| return (PlayerAether) player.getExtendedProperties("aether_legacy:player_aether"); |
| } |
| |
| @Override |
| public void init(Entity entity, World world) { |
| this.player = (EntityPlayer)entity; |
| } |
| |
| @Override |
| public void onUpdate() { |
| if (!this.player.worldObj.isRemote) { |
| AetherNetwork.sendToAll(new PacketPerkChanged(this.getEntity().getEntityId(), EnumAetherPerkType.Halo, this.shouldRenderHalo)); |
| AetherNetwork.sendToAll(new PacketPerkChanged(this.getEntity().getEntityId(), EnumAetherPerkType.Glow, this.shouldRenderGlow)); |
| AetherNetwork.sendToAll(new PacketCapeChanged(this.getEntity().getEntityId(), this.shouldRenderCape)); |
| AetherNetwork.sendToAll(new PacketSendPoisonTime(this.getEntity(), this.poisonTime)); |
| AetherNetwork.sendToAll(new PacketSendSeenDialogue(this.getEntity(), this.seenSpiritDialog)); |
| AetherNetwork.sendToAll(new PacketPortalItem(this.getEntity(), this.shouldGetPortal)); |
| } |
| |
| if (this.isPoisoned) { |
| if (poisonTime > 0) { |
| this.poisonTime--; |
| } else { |
| this.poisonTime = 0; |
| this.isPoisoned = false; |
| } |
| } |
| |
| if (this.isCured) { |
| if (cureTime > 0) { |
| this.cureTime--; |
| } else { |
| this.cureTime = 0; |
| this.isCured = false; |
| } |
| } |
| |
| for (int i = 0; i < this.getAbilities().size(); ++i) { |
| IAetherAbility ability = this.getAbilities().get(i); |
| |
| if (ability.shouldExecute()) { |
| ability.onUpdate(); |
| } |
| } |
| |
| for (int i = 0; i < this.clouds.size(); ++i) { |
| Entity entity = this.clouds.get(i); |
| |
| if (entity.isDead) { |
| this.clouds.remove(i); |
| } |
| } |
| |
| if (this.cooldown > 0) { |
| this.cooldown -= 2; |
| } |
| |
| if (this.isInsideBlock(BlocksAether.aercloud)) { |
| this.getEntity().fallDistance = 0F; |
| } |
| |
| if (this.getEntity().motionY < -2F) { |
| this.activateParachute(); |
| } |
| |
| if (!this.getEntity().onGround) { |
| this.wingSinage += 0.75F; |
| } else { |
| this.wingSinage += 0.15F; |
| } |
| |
| if (this.wingSinage > 3.141593F * 2F) { |
| this.wingSinage -= 3.141593F * 2F; |
| } else { |
| this.wingSinage += 0.1F; |
| } |
| |
| boolean hasJumped = ReflectionHelper.getPrivateValue(EntityLivingBase.class, this.getEntity(), "isJumping", "field_70703_bu"); |
| |
| this.setJumping(hasJumped); |
| |
| this.getEntity().worldObj.theProfiler.startSection("portal"); |
| |
| /* |
| if (this.getEntity().dimension == AetherConfig.getAetherDimensionID()) { |
| if (this.getEntity().posY < -2) { |
| this.teleportPlayer(false); |
| } |
| } |
| */ |
| if (this.inPortal) { |
| if (this.getEntity().timeUntilPortal <= 0) { |
| int limit = this.getEntity().getMaxInPortalTime(); |
| |
| if (this.getEntity().ridingEntity == null) { |
| if (this.portalCounter >= limit) { |
| this.portalCounter = 0; |
| this.getEntity().timeUntilPortal = this.getEntity().getPortalCooldown(); |
| |
| if (!this.getEntity().worldObj.isRemote) { |
| this.teleportPlayer(true); |
| this.getEntity().triggerAchievement(AetherAchievements.enter_aether); |
| } |
| } else { |
| this.portalCounter++; |
| } |
| } |
| } else { |
| this.getEntity().timeUntilPortal = this.getEntity().getPortalCooldown(); |
| } |
| |
| if (this.getEntity().worldObj.getBlock((int) this.getEntity().posX, (int) this.getEntity().posY - 1, (int) this.getEntity().posZ) != Blocks.air) { |
| AxisAlignedBB playerBounding = this.getEntity().boundingBox; |
| |
| if (this.getEntity().worldObj.getBlock((int) playerBounding.minX, (int) playerBounding.minY, (int) playerBounding.minZ) != BlocksAether.aether_portal && |
| this.getEntity().worldObj.getBlock((int) playerBounding.minX, (int) playerBounding.minY, (int) playerBounding.minZ) != BlocksAether.aether_portal) { |
| this.inPortal = false; |
| } |
| } |
| } else { |
| if (this.portalCounter > 0) { |
| this.portalCounter -= 4; |
| } |
| |
| if (this.portalCounter < 0) { |
| this.portalCounter = 0; |
| } |
| } |
| |
| this.getEntity().worldObj.theProfiler.endSection(); |
| |
| if (!this.getEntity().worldObj.isRemote) { |
| ItemStack stack = this.getEntity().getCurrentEquippedItem(); |
| |
| double distance = this.getEntity().capabilities.isCreativeMode ? 5D : 4.5D; |
| |
| if (stack != null && stack.getItem() instanceof ValkyrieTool) { |
| distance = 8D; |
| } |
| |
| ((EntityPlayerMP)this.getEntity()).theItemInWorldManager.setBlockReachDistance(distance); |
| } else { |
| this.prevTimeInPortal = this.timeInPortal; |
| |
| if (this.isInsideBlock(BlocksAether.aether_portal)) { |
| this.timeInPortal += 0.0125F; |
| |
| if (this.timeInPortal >= 1F) { |
| this.timeInPortal = 1F; |
| } |
| } else if (this.getEntity().isPotionActive(Potion.confusion) && this.getEntity().getActivePotionEffect(Potion.confusion).getDuration() > 60) { |
| this.timeInPortal += 0.006666667F; |
| |
| if (this.timeInPortal > 1F) { |
| this.timeInPortal = 1F; |
| } |
| } else { |
| if (this.timeInPortal > 0F) { |
| this.timeInPortal -= 0.05F; |
| } |
| |
| if (this.timeInPortal < 0F) { |
| this.timeInPortal = 0F; |
| } |
| } |
| } |
| |
| if (!player.worldObj.isRemote && this.bedLocation != null && player.dimension == AetherConfig.getAetherDimensionID() && player.worldObj.getBlock(this.bedLocation.posX, this.bedLocation.posY, this.bedLocation.posZ) != BlocksAether.skyroot_bed) { |
| setBedLocation(null); |
| } |
| } |
| |
| @Override |
| public void setInPortal() { |
| double d0 = this.getEntity().prevPosX - this.getEntity().posX; |
| double d1 = this.getEntity().prevPosZ - this.getEntity().posZ; |
| |
| if (!this.getEntity().worldObj.isRemote && !this.inPortal) { |
| this.teleportDirection = Direction.getMovementDirection(d0, d1); |
| } |
| |
| this.inPortal = true; |
| } |
| |
| private void activateParachute() { |
| if (!this.player.capabilities.isCreativeMode) { |
| EntityParachute parachute = null; |
| |
| ItemStack itemstack = null; |
| |
| for (int i = 0; i < this.getEntity().inventory.getSizeInventory(); i++) { |
| ItemStack stackInSlot = this.getEntity().inventory.getStackInSlot(i); |
| |
| if(stackInSlot != null && stackInSlot.getItem() == AetherItems.cloud_parachute) { |
| itemstack = stackInSlot; |
| break; |
| } else { |
| if (stackInSlot != null && stackInSlot.getItem() == AetherItems.golden_parachute) { |
| itemstack = stackInSlot; |
| break; |
| } |
| } |
| } |
| |
| if (itemstack != null) { |
| if (itemstack.getItem() == AetherItems.cloud_parachute) { |
| parachute = new EntityParachute(this.getEntity().worldObj, this.getEntity(), false); |
| parachute.setPosition(this.getEntity().posX, this.getEntity().posY, this.getEntity().posZ); |
| this.getEntity().worldObj.spawnEntityInWorld(parachute); |
| this.getEntity().inventory.consumeInventoryItem(itemstack.getItem()); |
| } else { |
| if (itemstack.getItem() == AetherItems.golden_parachute) { |
| itemstack.damageItem(1, this.getEntity()); |
| parachute = new EntityParachute(this.getEntity().worldObj, this.getEntity(), true); |
| parachute.setPosition(this.getEntity().posX, this.getEntity().posY, this.getEntity().posZ); |
| this.getEntity().worldObj.spawnEntityInWorld(parachute); |
| } |
| } |
| } |
| } |
| } |
| |
| public boolean isInsideBlock(Block block) { |
| AxisAlignedBB boundingBox = this.getEntity().boundingBox; |
| int i = MathHelper.floor_double(boundingBox.minX); |
| int j = MathHelper.floor_double(boundingBox.maxX + 1D); |
| int k = MathHelper.floor_double(boundingBox.minY); |
| int l = MathHelper.floor_double(boundingBox.maxY + 1D); |
| int i1 = MathHelper.floor_double(boundingBox.minZ); |
| int j1 = MathHelper.floor_double(boundingBox.maxZ + 1D); |
| |
| for (int k1 = i; k1 < j; ++k1) { |
| for (int l1 = k; l1 < l; ++l1) { |
| for (int i2 = i1; i2 < j1; ++i2) { |
| if (this.getEntity().worldObj.getBlock(k1, l1, i2) == block) { |
| return true; |
| } |
| } |
| } |
| } |
| |
| return false; |
| } |
| |
| /* |
| * The teleporter which sends the player to the Aether/Overworld |
| */ |
| private void teleportPlayer(boolean shouldSpawnPortal) { |
| if (this.getEntity() instanceof EntityPlayerMP) { |
| int previousDimension = this.getEntity().dimension; |
| int transferDimension = previousDimension == AetherConfig.getAetherDimensionID() ? AetherConfig.getTravelDimensionID() : AetherConfig.getAetherDimensionID(); |
| MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); |
| TeleporterAether teleporter = new TeleporterAether(shouldSpawnPortal, server.worldServerForDimension(transferDimension)); |
| |
| if (this.getEntity().ridingEntity != null) { |
| this.getEntity().ridingEntity.mountEntity(null); |
| } |
| |
| if (this.getEntity().riddenByEntity != null) { |
| this.getEntity().riddenByEntity.mountEntity(null); |
| } |
| |
| if (server != null && server.getConfigurationManager() != null) { |
| server.getConfigurationManager().transferPlayerToDimension((EntityPlayerMP) this.getEntity(), transferDimension, teleporter); |
| } |
| } |
| } |
| |
| @Override |
| public void saveNBTData(NBTTagCompound compound) { |
| NBTTagCompound aetherTag = new NBTTagCompound(); |
| |
| if (AetherRankings.isRankedPlayer(this.player.getUniqueID())) { |
| aetherTag.setBoolean("halo", this.shouldRenderHalo); |
| } |
| |
| if (AetherRankings.isDeveloper(this.player.getUniqueID())) { |
| aetherTag.setBoolean("glow", this.shouldRenderGlow); |
| } |
| |
| aetherTag.setBoolean("poisoned", this.isPoisoned); |
| aetherTag.setInteger("poison_time", this.poisonTime); |
| aetherTag.setBoolean("cape", this.shouldRenderCape); |
| aetherTag.setInteger("shardCount", this.shardCount); |
| aetherTag.setTag("accessories", this.getAccessoryInventory().writeToNBT(aetherTag)); |
| aetherTag.setBoolean("seen_spirit_dialog", this.seenSpiritDialog); |
| aetherTag.setBoolean("get_portal", this.shouldGetPortal); |
| |
| if (this.bedLocation != null) { |
| aetherTag.setInteger("bedX", this.bedLocation.posX); |
| aetherTag.setInteger("bedY", this.bedLocation.posY); |
| aetherTag.setInteger("bedZ", this.bedLocation.posZ); |
| } |
| |
| compound.setTag("aetherI", aetherTag); |
| } |
| |
| @Override |
| public void loadNBTData(NBTTagCompound compound) { |
| NBTTagCompound aetherTag = compound.getCompoundTag("aetherI"); |
| |
| if (aetherTag.hasKey("halo")) { |
| this.shouldRenderHalo = aetherTag.getBoolean("halo"); |
| } |
| |
| if (aetherTag.hasKey("glow")) { |
| this.shouldRenderGlow = aetherTag.getBoolean("glow"); |
| } |
| |
| if (aetherTag.hasKey("cape")) { |
| this.shouldRenderCape = aetherTag.getBoolean("cape"); |
| } |
| |
| if (aetherTag.hasKey("poisoned")) { |
| this.isPoisoned = aetherTag.getBoolean("poisoned"); |
| } |
| |
| if (aetherTag.hasKey("poison_time")) { |
| this.poisonTime = aetherTag.getInteger("poison_time"); |
| } |
| |
| if (aetherTag.hasKey("seen_spirit_dialog")) { |
| this.seenSpiritDialog = aetherTag.getBoolean("seen_spirit_dialog"); |
| } |
| |
| if (aetherTag.hasKey("get_portal")) { |
| this.shouldGetPortal = aetherTag.getBoolean("get_portal"); |
| } |
| |
| this.updateShardCount(aetherTag.getInteger("shardCount")); |
| this.getAccessoryInventory().readFromNBT(aetherTag.getTagList("accessories", 10)); |
| this.setBedLocation(new ChunkCoordinates(aetherTag.getInteger("bedX"), aetherTag.getInteger("bedY"), aetherTag.getInteger("bedZ"))); |
| } |
| |
| @Override |
| public void setFocusedBoss(IAetherBoss boss) { |
| this.focusedBoss = boss; |
| } |
| |
| @Override |
| public IAetherBoss getFocusedBoss() { |
| return this.focusedBoss; |
| } |
| |
| @Override |
| public void setAccessoryInventory(IAccessoryInventory inventory) { |
| this.accessories = inventory; |
| } |
| |
| @Override |
| public IAccessoryInventory getAccessoryInventory() { |
| return this.accessories; |
| } |
| |
| @Override |
| public ArrayList<IAetherAbility> getAbilities() { |
| return this.abilities; |
| } |
| |
| @Override |
| public EntityPlayer getEntity() { |
| return this.player; |
| } |
| |
| @Override |
| public void updateShardCount(int amount) { |
| UUID uuid = UUID.fromString("df6eabe7-6947-4a56-9099-002f90370706"); |
| AttributeModifier healthModifier = new AttributeModifier(uuid, "Aether Health Modifier", amount * 2D, 0); |
| |
| this.shardCount = amount; |
| |
| if (this.getEntity().getEntityAttribute(SharedMonsterAttributes.maxHealth).getModifier(uuid) != null) { |
| this.getEntity().getEntityAttribute(SharedMonsterAttributes.maxHealth).removeModifier(healthModifier); |
| } |
| |
| this.getEntity().getEntityAttribute(SharedMonsterAttributes.maxHealth).applyModifier(healthModifier); |
| } |
| |
| @Override |
| public int getShardsUsed() { |
| return this.shardCount; |
| } |
| |
| @Override |
| public int getMaxShardCount() { |
| return AetherConfig.getMaxLifeShards(); |
| } |
| |
| @Override |
| public void setJumping(boolean isJumping) { |
| this.isJumping = isJumping; |
| } |
| |
| @Override |
| public boolean isJumping() { |
| return this.isJumping; |
| } |
| |
| @Override |
| public void setMountSneaking(boolean isSneaking) { |
| this.isMountSneaking = isSneaking; |
| } |
| |
| @Override |
| public boolean isMountSneaking() { |
| return this.isMountSneaking; |
| } |
| |
| @Override |
| public boolean isDonator() { |
| return true; |
| } |
| |
| public boolean setHammerCooldown(int cooldown, String hammerName) { |
| if (this.cooldown <= 0) { |
| this.cooldown = cooldown; |
| this.cooldownMax = cooldown; |
| this.hammerName = hammerName; |
| |
| return true; |
| } |
| |
| return false; |
| } |
| |
| @Override |
| public String getHammerName() { |
| return this.hammerName; |
| } |
| |
| @Override |
| public int getHammerCooldown() { |
| return this.cooldown; |
| } |
| |
| @Override |
| public int getHammerMaxCooldown() { |
| return this.cooldownMax; |
| } |
| |
| public void setBedLocation(ChunkCoordinates bedLocation) { |
| this.bedLocation = bedLocation; |
| } |
| |
| public ChunkCoordinates getBedLocation() { |
| return bedLocation; |
| } |
| |
| public boolean isPoisoned() { |
| return this.isPoisoned; |
| } |
| |
| public void setPoisoned() { |
| this.isPoisoned = true; |
| this.poisonTime = 500; |
| } |
| |
| public boolean isCured() { |
| return this.isCured; |
| } |
| |
| public void setCured(int time) { |
| this.isCured = true; |
| this.cureTime = time; |
| |
| this.isPoisoned = false; |
| this.poisonTime = 0; |
| } |
| |
| public void givePortalFrame() { |
| if (this.shouldGetPortal) { |
| this.player.inventory.addItemStackToInventory(new ItemStack(AetherItems.aether_portal_frame)); |
| this.shouldGetPortal = false; |
| } |
| } |
| } |