@Override public boolean itemInteractionForEntity( ItemStack item, EntityPlayer player, EntityLivingBase entity) { if (entity.worldObj.isRemote) { return false; } boolean isCreative = player != null && player.capabilities.isCreativeMode; if (containsSoul(item) && !isCreative) { return false; } if (entity instanceof EntityPlayer) { return false; } String entityId = EntityList.getEntityString(entity); if (isBlackListed(entityId)) { return false; } if (!Config.soulVesselCapturesBosses && entity instanceof IBossDisplayData) { return false; } NBTTagCompound root = new NBTTagCompound(); root.setString("id", entityId); entity.writeToNBT(root); ItemStack capturedMobVessel = new ItemStack(EnderIO.itemSoulVessel); capturedMobVessel.setTagCompound(root); setDisplayNameFromEntityNameTag(capturedMobVessel, entity); player.swingItem(); if (!isCreative) { entity.setDead(); if (entity.isDead) { item.stackSize--; if (!player.inventory.addItemStackToInventory(capturedMobVessel)) { entity.worldObj.spawnEntityInWorld( new EntityItem( entity.worldObj, entity.posX, entity.posY, entity.posZ, capturedMobVessel)); } player.setCurrentItemOrArmor(0, item); ((EntityPlayerMP) player).sendContainerToPlayer(player.inventoryContainer); return true; } } else { if (!player.inventory.addItemStackToInventory( capturedMobVessel)) // Inventory full, drop it in the world! { entity.worldObj.spawnEntityInWorld( new EntityItem( entity.worldObj, entity.posX, entity.posY, entity.posZ, capturedMobVessel)); } ((EntityPlayerMP) player).sendContainerToPlayer(player.inventoryContainer); return true; } return false; }
@SubscribeEvent public void onPlayerLogout(PlayerLoggedOutEvent event) { // kill any summoned creatures if (!event.player.worldObj.isRemote) { List list = event.player.worldObj.loadedEntityList; for (Object o : list) { if (o instanceof EntityLivingBase && EntityUtilities.isSummon((EntityLivingBase) o) && EntityUtilities.getOwner((EntityLivingBase) o) == event.player.getEntityId()) { ((EntityLivingBase) o).setDead(); } } } }
@SubscribeEvent public void onPlayerChangedDimension(PlayerChangedDimensionEvent event) { // kill any summoned creatures, eventually respawn them in the new dimension if (!event.player.worldObj.isRemote) { storeExtendedPropertiesForDimensionChange(event.player); List list = event.player.worldObj.loadedEntityList; for (Object o : list) { if (o instanceof EntityLivingBase && EntityUtilities.isSummon((EntityLivingBase) o) && EntityUtilities.getOwner((EntityLivingBase) o) == event.player.getEntityId()) { ((EntityLivingBase) o).setDead(); } } ExtendedProperties.For(event.player).setDelayedSync(40); AffinityData.For(event.player).setDelayedSync(40); SkillData.For(event.player).setDelayedSync(40); } }
@Override public void updateEntity() { if (worldObj.isRemote) { this.rotation += this.rotationIncrement; } else { surroundingCheckTicks++; } if (worldObj.isRemote || ticksSinceLastEntityScan++ > 25) { updateNearbyEntities(); ticksSinceLastEntityScan = 0; } Iterator<EntityLivingBase> it = cachedEntities.iterator(); while (it.hasNext()) { EntityLivingBase ent = it.next(); if (ent.isDead) { it.remove(); continue; } MovingObjectPosition mop = this.worldObj.rayTraceBlocks( Vec3.createVectorHelper(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5), Vec3.createVectorHelper(ent.posX, ent.posY + ent.getEyeHeight(), ent.posZ), false); if (EntityUtilities.isSummon(ent) || mop != null) { continue; } ent.motionY = 0; ent.motionX = 0; ent.motionZ = 0; double deltaX = this.xCoord + 0.5f - ent.posX; double deltaZ = this.zCoord + 0.5f - ent.posZ; double deltaY = this.yCoord - ent.posY; double angle = Math.atan2(deltaZ, deltaX); double offsetX = Math.cos(angle) * 0.1; double offsetZ = Math.sin(angle) * 0.1; double offsetY = 0.05f; double distanceHorizontal = deltaX * deltaX + deltaZ * deltaZ; double distanceVertical = this.yCoord - ent.posY; boolean spawnedParticles = false; if (distanceHorizontal < 1.3) { if (distanceVertical < -1.5) { if (worldObj.isRemote && worldObj.rand.nextInt(10) < 3) { AMCore.proxy.particleManager.BoltFromPointToPoint( worldObj, xCoord + 0.5, yCoord + 1.3, zCoord + 0.5, ent.posX, ent.posY, ent.posZ, 4, 0x000000); } } if (distanceVertical < -2) { offsetY = 0; if (!worldObj.isRemote) { if (ent.attackEntityFrom(DamageSources.darkNexus, 4)) { if (ent.getHealth() <= 0) { ent.setDead(); float power = ((int) Math.ceil((ent.getMaxHealth() * (ent.ticksExisted / 20)) % 5000)) * this.powerMultiplier; PowerNodeRegistry.For(this.worldObj).insertPower(this, PowerTypes.DARK, power); } } } } } if (worldObj.isRemote) { if (!arcs.containsKey(ent)) { AMLineArc arc = (AMLineArc) AMCore.proxy.particleManager.spawn( worldObj, "textures/blocks/oreblocksunstone.png", xCoord + 0.5, yCoord + 1.3, zCoord + 0.5, ent); if (arc != null) { arc.setExtendToTarget(); arc.setRBGColorF(1, 1, 1); } arcs.put(ent, arc); } Iterator arcIterator = arcs.keySet().iterator(); ArrayList<Entity> toRemove = new ArrayList<Entity>(); while (arcIterator.hasNext()) { Entity arcEnt = (Entity) arcIterator.next(); AMLineArc arc = (AMLineArc) arcs.get(arcEnt); if (arcEnt == null || arcEnt.isDead || arc == null || arc.isDead || new AMVector3(ent).distanceSqTo(new AMVector3(xCoord, yCoord, zCoord)) > 100) toRemove.add(arcEnt); } for (Entity e : toRemove) { arcs.remove(e); } } if (!worldObj.isRemote) ent.moveEntity(offsetX, offsetY, offsetZ); } if (surroundingCheckTicks % 100 == 0) { checkNearbyBlockState(); surroundingCheckTicks = 1; if (!worldObj.isRemote && PowerNodeRegistry.For(this.worldObj).checkPower(this, this.capacity * 0.1f)) { List<EntityPlayer> nearbyPlayers = worldObj.getEntitiesWithinAABB( EntityPlayer.class, AxisAlignedBB.getBoundingBox( this.xCoord - 2, this.yCoord, this.zCoord - 2, this.xCoord + 2, this.yCoord + 3, this.zCoord + 2)); for (EntityPlayer p : nearbyPlayers) { if (p.isPotionActive(BuffList.manaRegen.id)) continue; p.addPotionEffect(new BuffEffectManaRegen(600, 3)); } } // TODO: /*if (rand.nextDouble() < (this.getCharge() / this.getCapacity()) * 0.01){ int maxSev = (int)Math.ceil((this.getCharge() / this.getCapacity()) * 2) + rand.nextInt(2); IllEffectsManager.instance.ApplyRandomBadThing(this, IllEffectSeverity.values()[maxSev], BadThingTypes.DARKNEXUS); }*/ } super.callSuperUpdate(); }