diff --git a/src/api/java/appeng/api/implementations/items/IGrowableCrystal.java b/src/api/java/appeng/api/implementations/items/IGrowableCrystal.java index a76c2b0e7..276da1d75 100644 --- a/src/api/java/appeng/api/implementations/items/IGrowableCrystal.java +++ b/src/api/java/appeng/api/implementations/items/IGrowableCrystal.java @@ -23,13 +23,23 @@ package appeng.api.implementations.items; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; +import javax.annotation.Nullable; + +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; public interface IGrowableCrystal { ItemStack triggerGrowth(ItemStack is); - float getMultiplier(Block blk, Material mat); + /** + * Gets the crystal growth multiplier based on the material it is submerged in. + * + * @param state The blockstate of the block the crystal is currently in. + * @return The multiplier for the growth tick progress. Zero if the crystal + * cannot grow in the current material. + */ + float getMultiplier(BlockState state, @Nullable World world, @Nullable BlockPos pos); } diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index b3aa4e93c..db65ae3f9 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -31,6 +31,8 @@ import java.util.Set; import java.util.function.DoubleSupplier; import java.util.stream.Collectors; +import javax.annotation.Nullable; + import com.google.common.base.Strings; import org.apache.commons.lang3.tuple.Pair; @@ -393,6 +395,15 @@ public final class AEConfig { return this.meteoriteDimensionWhitelist; } + @Nullable + public String getImprovedFluidTag() { + return Strings.emptyToNull(COMMON.improvedFluidTag.get()); + } + + public float getImprovedFluidMultiplier() { + return COMMON.improvedFluidMultiplier.get().floatValue(); + } + // Setters keep visibility as low as possible. private static class ClientConfig { @@ -507,6 +518,11 @@ public final class AEConfig { public final ConfigValue condenserMatterBallsPower; public final ConfigValue condenserSingularityPower; + // In-World Purification + // Settings for improved speed depending on fluid the crystal is in + public final ConfigValue improvedFluidTag; + public final ConfigValue improvedFluidMultiplier; + public final Map> tickRateMin = new HashMap<>(); public final Map> tickRateMax = new HashMap<>(); @@ -617,6 +633,17 @@ public final class AEConfig { tickRateMax.put(tickRate, builder.define(tickRate.name() + "Max", tickRate.getDefaultMax())); } builder.pop(); + + builder.comment("Settings for in-world purification of crystals.").push("inWorldPurification"); + + improvedFluidTag = builder.comment( + "A fluid tag that identifies fluids that improve crystal purification speed. Does not affect purification with water/lava.") + .define("improvedFluidTag", ""); + improvedFluidMultiplier = builder + .comment("The speed multiplier to use when the crystals are submerged in the improved fluid.") + .defineInRange("improvedFluidMultiplier", 2.0, 1.0, 10.0); + + builder.pop(); } } diff --git a/src/main/java/appeng/core/api/definitions/ApiBlocks.java b/src/main/java/appeng/core/api/definitions/ApiBlocks.java index ae44e4961..95b90b645 100644 --- a/src/main/java/appeng/core/api/definitions/ApiBlocks.java +++ b/src/main/java/appeng/core/api/definitions/ApiBlocks.java @@ -20,7 +20,9 @@ package appeng.core.api.definitions; import static appeng.block.AEBaseBlock.defaultProps; +import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; +import net.minecraft.block.Blocks; import net.minecraft.block.DispenserBlock; import net.minecraft.block.SlabBlock; import net.minecraft.block.SoundType; @@ -28,6 +30,7 @@ import net.minecraft.block.StairsBlock; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.RenderType; import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.EntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ToolType; @@ -262,18 +265,20 @@ public final class ApiBlocks implements IBlocks { this.chiseledQuartzBlock = deco.block("chiseled_quartz_block", () -> new AEDecorativeBlock(QUARTZ_PROPERTIES)) .build(); - this.quartzGlass = registry.features(AEFeature.QUARTZ_GLASS) - .block("quartz_glass", () -> new QuartzGlassBlock(defaultProps(Material.GLASS).notSolid())) - .rendering(new BlockRenderingCustomizer() { - @Override - @OnlyIn(Dist.CLIENT) - public void customize(IBlockRendering rendering, IItemRendering itemRendering) { - rendering.renderType(RenderType.getCutout()); - } - }).build(); + AbstractBlock.IExtendedPositionPredicate> neverAllowSpawn = (p1, p2, p3, p4) -> false; + this.quartzGlass = registry.features(AEFeature.QUARTZ_GLASS).block("quartz_glass", () -> { + return new QuartzGlassBlock(defaultProps(Material.GLASS).notSolid().setAllowsSpawn(neverAllowSpawn)); + }).rendering(new BlockRenderingCustomizer() { + @Override + @OnlyIn(Dist.CLIENT) + public void customize(IBlockRendering rendering, IItemRendering itemRendering) { + rendering.renderType(RenderType.getCutout()); + } + }).build(); this.quartzVibrantGlass = deco .block("quartz_vibrant_glass", - () -> new QuartzLampBlock(defaultProps(Material.GLASS).setLightLevel(b -> 15).notSolid())) + () -> new QuartzLampBlock(defaultProps(Material.GLASS).setLightLevel(b -> 15).notSolid() + .setAllowsSpawn(neverAllowSpawn))) .addFeatures(AEFeature.DECORATIVE_LIGHTS, AEFeature.QUARTZ_GLASS) .rendering(new BlockRenderingCustomizer() { @Override diff --git a/src/main/java/appeng/core/features/registries/LocatableRegistry.java b/src/main/java/appeng/core/features/registries/LocatableRegistry.java index 4fe02f849..9d6e3cc4e 100644 --- a/src/main/java/appeng/core/features/registries/LocatableRegistry.java +++ b/src/main/java/appeng/core/features/registries/LocatableRegistry.java @@ -22,12 +22,12 @@ import java.util.HashMap; import java.util.Map; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.SubscribeEvent; import appeng.api.events.LocatableEventAnnounce; import appeng.api.events.LocatableEventAnnounce.LocatableEvent; import appeng.api.features.ILocatable; import appeng.api.features.ILocatableRegistry; +import appeng.core.AELog; import appeng.util.Platform; public final class LocatableRegistry implements ILocatableRegistry { @@ -35,18 +35,19 @@ public final class LocatableRegistry implements ILocatableRegistry { public LocatableRegistry() { this.set = new HashMap<>(); - MinecraftForge.EVENT_BUS.register(this); + MinecraftForge.EVENT_BUS.addListener(this::updateLocatable); } - @SubscribeEvent - public void updateLocatable(final LocatableEventAnnounce e) { + private void updateLocatable(final LocatableEventAnnounce e) { if (Platform.isClient()) { return; // IGNORE! } if (e.change == LocatableEvent.REGISTER) { + AELog.debug("Registering locatable %s: %s", e.target.getLocatableSerial(), e.target); this.set.put(e.target.getLocatableSerial(), e.target); } else if (e.change == LocatableEvent.UNREGISTER) { + AELog.debug("Unregistering locatable %s: %s", e.target.getLocatableSerial(), e.target); this.set.remove(e.target.getLocatableSerial()); } } diff --git a/src/main/java/appeng/decorative/solid/QuartzGlassBlock.java b/src/main/java/appeng/decorative/solid/QuartzGlassBlock.java index 559d2dd21..cba4ecc50 100644 --- a/src/main/java/appeng/decorative/solid/QuartzGlassBlock.java +++ b/src/main/java/appeng/decorative/solid/QuartzGlassBlock.java @@ -20,11 +20,8 @@ package appeng.decorative.solid; import net.minecraft.block.AbstractGlassBlock; import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; import net.minecraft.util.Direction; -import appeng.helpers.AEMaterials; - public class QuartzGlassBlock extends AbstractGlassBlock { public QuartzGlassBlock(Properties props) { @@ -33,8 +30,7 @@ public class QuartzGlassBlock extends AbstractGlassBlock { @Override public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { - final Material mat = adjacentBlockState.getMaterial(); - if (mat == Material.GLASS || mat == AEMaterials.GLASS) { + if (adjacentBlockState.getBlock() instanceof QuartzGlassBlock) { if (adjacentBlockState.getRenderType() == state.getRenderType()) { return true; } diff --git a/src/main/java/appeng/decorative/solid/SkyStoneBlock.java b/src/main/java/appeng/decorative/solid/SkyStoneBlock.java index 3e1b2af38..1e08fac7b 100644 --- a/src/main/java/appeng/decorative/solid/SkyStoneBlock.java +++ b/src/main/java/appeng/decorative/solid/SkyStoneBlock.java @@ -29,7 +29,6 @@ import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.ToolType; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import appeng.block.AEBaseBlock; import appeng.core.worlddata.WorldData; @@ -43,11 +42,10 @@ public class SkyStoneBlock extends AEBaseBlock { super(props); this.type = type; - MinecraftForge.EVENT_BUS.register(this); + MinecraftForge.EVENT_BUS.addListener(this::breakFaster); } - @SubscribeEvent - public void breakFaster(final PlayerEvent.BreakSpeed event) { + private void breakFaster(final PlayerEvent.BreakSpeed event) { if (event.getState().getBlock() == this && event.getPlayer() != null) { final ItemStack is = event.getPlayer().getItemStackFromSlot(EquipmentSlotType.MAINHAND); int level = -1; diff --git a/src/main/java/appeng/entity/GrowingCrystalEntity.java b/src/main/java/appeng/entity/GrowingCrystalEntity.java index f2ba87ef5..9bbf04617 100644 --- a/src/main/java/appeng/entity/GrowingCrystalEntity.java +++ b/src/main/java/appeng/entity/GrowingCrystalEntity.java @@ -19,13 +19,14 @@ package appeng.entity; import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; import net.minecraft.entity.EntityType; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.World; import appeng.api.features.AEFeature; @@ -35,12 +36,27 @@ import appeng.client.EffectType; import appeng.core.AEConfig; import appeng.core.AppEng; import appeng.items.misc.CrystalSeedItem; -import appeng.util.Platform; public final class GrowingCrystalEntity extends AEBaseItemEntity { public static EntityType TYPE; + // Growth tick progress per tick by number of adjacent accelerators + // Expressed as 1/1000th of a growth tick, applied to progress_1000 + // each time this entity ticks. + private static final int[] GROWTH_TICK_PROGRESS = { 1, // no accelerators + 40, // 1 accelerator + 92, // 2 accelerators + 159, // 3 accelerators + 247, // 4 accelerators + 361, // 5 accelerators + 509 // 6 accelerators + }; + + /** + * The accumulated progress towards a single growth tick of the crystal in + * 1/1000th of a growth tick. + */ private int progress_1000 = 0; public GrowingCrystalEntity(EntityType type, World world) { @@ -56,126 +72,140 @@ public final class GrowingCrystalEntity extends AEBaseItemEntity { public void tick() { super.tick(); + final ItemStack is = this.getItem(); + final Item gc = is.getItem(); + + if (!(gc instanceof IGrowableCrystal)) { + return; + } + + applyGrowthTick((IGrowableCrystal) gc, is); + } + + private void applyGrowthTick(IGrowableCrystal cry, ItemStack is) { if (!AEConfig.instance().isFeatureEnabled(AEFeature.IN_WORLD_PURIFICATION)) { return; } - final ItemStack is = this.getItem(); - final Item gc = is.getItem(); + final int x = MathHelper.floor(this.getPosX()); + final int y = MathHelper.floor((this.getBoundingBox().minY + this.getBoundingBox().maxY) / 2.0D); + final int z = MathHelper.floor(this.getPosZ()); - if (gc instanceof IGrowableCrystal) // if it changes this just stops being an issue... - { - final int j = MathHelper.floor(this.getPosX()); - final int i = MathHelper.floor((this.getBoundingBox().minY + this.getBoundingBox().maxY) / 2.0D); - final int k = MathHelper.floor(this.getPosZ()); + BlockPos pos = new BlockPos(x, y, z); + final BlockState state = this.world.getBlockState(pos); - final BlockState state = this.world.getBlockState(new BlockPos(j, i, k)); - final Material mat = state.getMaterial(); - final IGrowableCrystal cry = (IGrowableCrystal) is.getItem(); + final float multiplier = cry.getMultiplier(state, world, pos); - final float multiplier = cry.getMultiplier(state.getBlock(), mat); - final int speed = (int) Math.max(1, this.getSpeed(j, i, k) * multiplier); + if (multiplier <= 0) { + // Crystal is in unsuitable material, reset progress and quit + this.progress_1000 = 0; + return; + } - final boolean isClient = Platform.isClient(); + final int progressPerTick = (int) Math.max(1, this.getSpeed(pos) * multiplier); - if (mat.isLiquid()) { - if (isClient) { - this.progress_1000++; - } else { - this.progress_1000 += speed; - } - } else { + if (world.isRemote()) { + // On the client, we reuse the growth-tick-progress + // as a tick-counter for particle effects + int len = getTicksBetweenParticleEffects(progressPerTick); + if (++this.progress_1000 >= len) { this.progress_1000 = 0; + AppEng.proxy.spawnEffect(EffectType.Vibrant, this.world, this.getPosX(), this.getPosY() + 0.2, + this.getPosZ(), null); } + } else { + this.progress_1000 += progressPerTick; - if (isClient) { - int len = 40; + if (this.progress_1000 >= 1000) { + // We need to copy the stack or the change detection will not work and not sync + // this new stack to the client + ItemStack newItem = is.copy(); - if (speed > 2) { - len = 20; - } - - if (speed > 90) { - len = 15; - } - - if (speed > 150) { - len = 10; - } - - if (speed > 240) { - len = 7; - } - - if (speed > 360) { - len = 3; - } - - if (speed > 500) { - len = 1; - } - - if (this.progress_1000 >= len) { - this.progress_1000 = 0; - AppEng.proxy.spawnEffect(EffectType.Vibrant, this.world, this.getPosX(), this.getPosY() + 0.2, - this.getPosZ(), null); - } - } else { - if (this.progress_1000 > 1000) { + // If we did not use a while loop here, the fastest growth for a crystal + // would be limited to a minimum of 30 seconds (based on 600 required growth + // ticks). + // Should a crystal decide to use a high multiplier for a certain material, + // it should be possible to go faster. + do { + newItem = cry.triggerGrowth(newItem); this.progress_1000 -= 1000; - // We need to copy the stack or the change detection will not work and not sync - // this new stack to the client - ItemStack newItem = cry.triggerGrowth(is.copy()); - this.setItem(newItem); - } + // We assume that if the item changes, the process is complete and we can break + } while (this.progress_1000 >= 1000 && newItem.getItem() == is.getItem()); + + this.setItem(newItem); } } } - private int getSpeed(final int x, final int y, final int z) { - final int per = 80; - final float mul = 0.3f; - - int qty = 0; - - if (this.isAccelerated(x + 1, y, z)) { - qty += per + qty * mul; + private static int getTicksBetweenParticleEffects(int progressPerTick) { + if (progressPerTick > 500) { + return 1; // 20 times per second + } else if (progressPerTick > 360) { + return 3; + } else if (progressPerTick > 240) { + return 7; + } else if (progressPerTick > 150) { + return 10; + } else if (progressPerTick > 90) { + return 15; + } else if (progressPerTick > 2) { + return 20; + } else { + return 40; // Every 2 seconds } - - if (this.isAccelerated(x, y + 1, z)) { - qty += per + qty * mul; - } - - if (this.isAccelerated(x, y, z + 1)) { - qty += per + qty * mul; - } - - if (this.isAccelerated(x - 1, y, z)) { - qty += per + qty * mul; - } - - if (this.isAccelerated(x, y - 1, z)) { - qty += per + qty * mul; - } - - if (this.isAccelerated(x, y, z - 1)) { - qty += per + qty * mul; - } - - return qty; } - private boolean isAccelerated(final int x, final int y, final int z) { - final TileEntity te = this.world.getTileEntity(new BlockPos(x, y, z)); + /** + * Gets the extra progress per tick in 1/1000th of a growth tick based on the + * surrounding accelerators. + */ + private int getSpeed(BlockPos pos) { + int acceleratorCount = getAcceleratorCount(pos); + + if (acceleratorCount < 0) { + return GROWTH_TICK_PROGRESS[0]; + } else if (acceleratorCount >= GROWTH_TICK_PROGRESS.length) { + return GROWTH_TICK_PROGRESS[GROWTH_TICK_PROGRESS.length - 1]; + } else { + return GROWTH_TICK_PROGRESS[acceleratorCount]; + } + } + + private int getAcceleratorCount(BlockPos pos) { + int count = 0; + + BlockPos.Mutable testPos = new BlockPos.Mutable(); + for (Direction direction : Direction.values()) { + if (this.isPoweredAccelerator(testPos.func_239622_a_(pos, direction))) { + count++; + } + } + + return count; + } + + private boolean isPoweredAccelerator(BlockPos pos) { + final TileEntity te = this.world.getTileEntity(pos); return te instanceof ICrystalGrowthAccelerator && ((ICrystalGrowthAccelerator) te).isPowered(); } - // Don't let seeds "float" on water surface @Override protected void applyFloatMotion() { ItemStack item = getItem(); + + // Make ungrown seeds sink, and fully grown seeds bouyant allowing for + // automation based around dropping seeds between 5 CGAs, then catchiung + // them on their way up. if (item.getItem() instanceof CrystalSeedItem) { + Vector3d v = this.getMotion(); + + // Apply a much smaller acceleration to make them slowly sink + double yAccel = this.hasNoGravity() ? 0 : -0.002; + + // Apply the x/z slow-down, and the y acceleration + this.setMotion(v.x * 0.99, v.y + yAccel, v.z * 0.99); + return; } super.applyFloatMotion(); diff --git a/src/main/java/appeng/fluids/parts/FluidImportBusPart.java b/src/main/java/appeng/fluids/parts/FluidImportBusPart.java index d3271db41..d906a69c7 100644 --- a/src/main/java/appeng/fluids/parts/FluidImportBusPart.java +++ b/src/main/java/appeng/fluids/parts/FluidImportBusPart.java @@ -96,16 +96,15 @@ public class FluidImportBusPart extends SharedFluidBusPart { } final TileEntity te = this.getConnectedTE(); - LazyOptional fhOpt = LazyOptional.empty(); if (te != null) { - te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, this.getSide().getFacing().getOpposite()); - } - if (fhOpt.isPresent()) { - try { - final IFluidHandler fh = fhOpt.orElse(null); - final IMEMonitor inv = this.getProxy().getStorage().getInventory(this.getChannel()); + LazyOptional fhOpt = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, + this.getSide().getFacing().getOpposite()); + + if (fhOpt.isPresent()) { + try { + final IFluidHandler fh = fhOpt.orElseThrow(() -> new IllegalStateException()); + final IMEMonitor inv = this.getProxy().getStorage().getInventory(this.getChannel()); - if (fh != null) { final FluidStack fluidStack = fh.drain(this.calculateAmountToSend(), FluidAction.SIMULATE); if (this.filterEnabled() && !this.isInFilter(fluidStack)) { @@ -128,12 +127,11 @@ public class FluidImportBusPart extends SharedFluidBusPart { } return TickRateModulation.IDLE; + } catch (GridAccessException e) { + // skip } - } catch (GridAccessException e) { - e.printStackTrace(); } } - return TickRateModulation.SLEEP; } diff --git a/src/main/java/appeng/items/misc/CrystalSeedItem.java b/src/main/java/appeng/items/misc/CrystalSeedItem.java index 1d8b6a3c5..8acf74e08 100644 --- a/src/main/java/appeng/items/misc/CrystalSeedItem.java +++ b/src/main/java/appeng/items/misc/CrystalSeedItem.java @@ -24,15 +24,19 @@ import javax.annotation.Nullable; import com.google.common.base.Preconditions; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; +import net.minecraft.fluid.Fluid; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tags.FluidTags; +import net.minecraft.tags.ITag; import net.minecraft.util.IItemProvider; import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; @@ -41,6 +45,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import appeng.api.implementations.items.IGrowableCrystal; +import appeng.core.AEConfig; import appeng.core.localization.ButtonToolTips; import appeng.entity.GrowingCrystalEntity; import appeng.items.AEBaseItem; @@ -94,8 +99,24 @@ public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal { } @Override - public float getMultiplier(final Block blk, final Material mat) { - return 0.5f; + public float getMultiplier(BlockState state, @Nullable World world, @Nullable BlockPos pos) { + + // Check for the improved fluid tag and return the improved multiplier + String improvedFluidTagName = AEConfig.instance().getImprovedFluidTag(); + if (improvedFluidTagName != null) { + ITag tag = FluidTags.getCollection().get(new ResourceLocation(improvedFluidTagName)); + if (tag != null && state.getFluidState().isTagged(tag)) { + return AEConfig.instance().getImprovedFluidMultiplier(); + } + } + + // Check for the normal supported fluid + if (world != null && world.func_234923_W_() == World.field_234919_h_) { + // In the nether, use Lava as the "normal" fluid + return state.getFluidState().isTagged(FluidTags.LAVA) ? 1 : 0; + } else { + return state.getFluidState().isTagged(FluidTags.WATER) ? 1 : 0; + } } @Override diff --git a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java index d0e0c28ac..4ad14e5be 100644 --- a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java +++ b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java @@ -324,21 +324,21 @@ public class ColorApplicatorItem extends AEBasePoweredItem return w.setBlockState(pos, newState); } + if (blk instanceof CableBusBlock && p != null) { + return ((CableBusBlock) blk).recolorBlock(w, pos, side, newColor.dye, p); + } + TileEntity be = w.getTileEntity(pos); if (be instanceof IColorableTile) { IColorableTile ct = (IColorableTile) be; AEColor c = ct.getColor(); if (c != newColor) { - ct.recolourBlock(side, newColor, null); + ct.recolourBlock(side, newColor, p); return true; } return false; } - if (blk instanceof CableBusBlock && p != null) { - return ((CableBusBlock) blk).recolorBlock(w, pos, side, newColor.dye, p); - } - return false; } diff --git a/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java b/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java index 802307aad..372364529 100644 --- a/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java +++ b/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java @@ -22,7 +22,6 @@ import java.util.Iterator; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.WorldEvent; @@ -159,12 +158,16 @@ public class QuantumCluster implements ILocatable, IAECluster { if (qc != null) { final World theWorld = qc.center.getWorld(); if (!qc.isDestroyed) { - ChunkPos cPos = new ChunkPos(qc.center.getPos()); - if (theWorld.getChunkProvider().isChunkLoaded(cPos)) { + // In future versions, we might actually want to delay the entire registration + // until the center + // tile begins ticking normally. + if (theWorld.isBlockLoaded(qc.center.getPos())) { final World cur = theWorld.getServer().getWorld(theWorld.func_234923_W_()); final TileEntity te = theWorld.getTileEntity(qc.center.getPos()); return te != qc.center || theWorld != cur; + } else { + AELog.warn("Found a registered QNB with serial %s whose chunk seems to be unloaded: %s", qe, qc); } } } @@ -275,4 +278,17 @@ public class QuantumCluster implements ILocatable, IAECluster { private void setRing(final QuantumBridgeTileEntity[] ring) { this.Ring = ring; } + + @Override + public String toString() { + if (center == null) { + return "QuantumCluster{no-center}"; + } + + World world = center.getWorld(); + BlockPos pos = center.getPos(); + + return "QuantumCluster{" + world + "," + pos + "}"; + } + } diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java index b2ddc03fb..a48f602c9 100644 --- a/src/main/java/appeng/parts/CableBusContainer.java +++ b/src/main/java/appeng/parts/CableBusContainer.java @@ -41,7 +41,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.VoxelShape; -import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; @@ -82,7 +81,6 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I private final EnumSet myLayerFlags = EnumSet.noneOf(LayerFlags.class); private YesNo hasRedstone = YesNo.UNDECIDED; private IPartHost tcb; - // TODO 1.10.2-R - does somebody seriously want to make parts TESR??? Hope not. private boolean requiresDynamicRender = false; private boolean inWorld = false; // Cached collision shape for living entities @@ -1096,11 +1094,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I } } - VoxelShape shape = VoxelShapes.empty(); - for (final AxisAlignedBB bx : boxes) { - shape = VoxelShapes.or(shape, VoxelShapes.create(bx)); - } - return shape; + return VoxelShapeCache.get(boxes); } private void invalidateShapes() { diff --git a/src/main/java/appeng/parts/VoxelShapeCache.java b/src/main/java/appeng/parts/VoxelShapeCache.java new file mode 100644 index 000000000..52b28f3ac --- /dev/null +++ b/src/main/java/appeng/parts/VoxelShapeCache.java @@ -0,0 +1,81 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.parts; + +import java.util.List; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.shapes.IBooleanFunction; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; + +/** + * While creation of a {@link VoxelShape} with + * {@link VoxelShapes#create(AxisAlignedBB)} is fast enough, combining voxel + * shapes with {@link VoxelShapes#or(VoxelShape, VoxelShape)} or any other + * combination method, as well as {@link VoxelShape#simplify()} are extremely + * slow. For example: Creating a VoxelShape for a list of 5 bounding boxes + * 10,000 times takes about 1.7 seconds. + * + *

+ * To reduce the impact of this on cables, we introduce a global voxel shape + * cache so that cables can share their combined voxel shapes better. + */ +final class VoxelShapeCache { + + // Why using a List here should not make much of a difference vs. using a Set: + // The part's bounding box depends on the side it is attached to, and the sides + // are iterated over in a fixed order, meaning the order of bounding boxes + // should + // be the same for a same set of parts. + private static final LoadingCache, VoxelShape> CACHE = CacheBuilder.newBuilder()// + .maximumSize(10000L)// + .build(new CacheLoader, VoxelShape>() { + @Override + public VoxelShape load(List key) { + return create(key); + } + }); + + private VoxelShapeCache() { + } + + public static VoxelShape get(List boxes) { + return CACHE.getUnchecked(boxes); + } + + private static VoxelShape create(List boxes) { + if (boxes.isEmpty()) { + return VoxelShapes.empty(); + } + + int i = 0; + VoxelShape shape = VoxelShapes.create(boxes.get(i)); + for (; i < boxes.size(); i++) { + AxisAlignedBB box = boxes.get(i); + shape = VoxelShapes.combine(shape, VoxelShapes.create(box), IBooleanFunction.OR); + } + return shape.simplify(); + } + +} diff --git a/src/main/java/appeng/tile/AEBaseTileEntity.java b/src/main/java/appeng/tile/AEBaseTileEntity.java index 2000b3ba6..02fc63c1d 100644 --- a/src/main/java/appeng/tile/AEBaseTileEntity.java +++ b/src/main/java/appeng/tile/AEBaseTileEntity.java @@ -253,9 +253,11 @@ public class AEBaseTileEntity extends TileEntity implements IOrientable, ICommon if (this.renderFragment > 0) { this.renderFragment |= 1; } else { + // Clearing the cached model-data is always harmless regardless of status + this.requestModelDataUpdate(); + // TODO: Optimize Network Load - if (this.world != null) { - this.requestModelDataUpdate(); + if (this.world != null && !this.isRemoved() && !notLoaded()) { boolean alreadyUpdated = false; // Let the block update it's own state with our internal state changes @@ -368,7 +370,6 @@ public class AEBaseTileEntity extends TileEntity implements IOrientable, ICommon * null means nothing to store... * * @param from source of settings - * * @return compound of source */ public CompoundNBT downloadSettings(final SettingsFrom from) { diff --git a/src/main/resources/assets/appliedenergistics2/models/item/cable_bus.json b/src/main/resources/assets/appliedenergistics2/models/item/cable_bus.json index 9bdc59011..0967ef424 100644 --- a/src/main/resources/assets/appliedenergistics2/models/item/cable_bus.json +++ b/src/main/resources/assets/appliedenergistics2/models/item/cable_bus.json @@ -1,3 +1 @@ -{ - "parent": "appliedenergistics2:block/cable_bus" -} +{} diff --git a/src/main/resources/data/appliedenergistics2/advancements/main/facade.json b/src/main/resources/data/appliedenergistics2/advancements/main/facade.json index d47b45694..530163012 100644 --- a/src/main/resources/data/appliedenergistics2/advancements/main/facade.json +++ b/src/main/resources/data/appliedenergistics2/advancements/main/facade.json @@ -1,7 +1,8 @@ { "display": { "icon": { - "item": "appliedenergistics2:facade" + "item": "appliedenergistics2:facade", + "nbt": "{item:\"minecraft:stone\"}" }, "title": { "translate": "achievement.ae2.Facade" diff --git a/src/test/resources/appeng/services/version/releases.json b/src/test/resources/appeng/services/version/releases.json deleted file mode 100644 index 8f8e00ef7..000000000 --- a/src/test/resources/appeng/services/version/releases.json +++ /dev/null @@ -1,1028 +0,0 @@ -[ - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1053651", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1053651/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1053651/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.12", - "id": 1053651, - "tag_name": "rv2.beta.12", - "target_commitish": "4744dfab789b778c5c255a268ef4f1d4a01cca9c", - "name": "Build rv2.beta.12", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2015-03-15T17:38:03Z", - "published_at": "2015-03-16T06:32:39Z", - "assets": [], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.12", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.12", - "body": "Fixes #1024 Added zinc to the grindstone - thatsIch\r\n\r\nUpdate zh_CN.lang - bakaxyf" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1051116", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1051116/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1051116/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.11", - "id": 1051116, - "tag_name": "rv2.beta.11", - "target_commitish": "ece09a956bdd0fdf3cc0074ffeed5efbdf3a37a4", - "name": "Build rv2.beta.11", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2015-03-13T22:49:12Z", - "published_at": "2015-03-14T23:53:49Z", - "assets": [], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.11", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.11", - "body": "Fixes #1015 Pattern terminal destroying a single item when not able to satisfy a NEI recipe - yueh\r\n\r\nFixes #1011 skip null values returned by the oredictionary - yueh\r\n\r\nUpdate zh_CN.lang - bakaxyf" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1038746", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1038746/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1038746/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.10", - "id": 1038746, - "tag_name": "rv2.beta.10", - "target_commitish": "8ec9bb8b3b18a9fb4f350e326b267ff35c434217", - "name": "Build rv2.beta.10", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2015-03-11T15:40:32Z", - "published_at": "2015-03-11T15:53:37Z", - "assets": [], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.10", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.10", - "body": "Fixes #861 Wireless Terminal notifies player, if it is unlinked - thatsIch\r\n\r\nFixes #920 Increased GUI close distance to match Vanilla MC distance - thatsIch\r\n\r\nFixes #743 Crash with BC plugs\r\n\r\nFixes #942 BC builder can build AE networks again\r\n\r\nUpdate #319 Now compiled against BC 6.4.2, with that MJ is gone" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1033060", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1033060/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/1033060/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.9", - "id": 1033060, - "tag_name": "rv2.beta.9", - "target_commitish": "3675f154d1f3af7cf34c52816f7014c74e7031b7", - "name": "Build rv2.beta.9", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2015-03-09T14:05:21Z", - "published_at": "2015-03-10T09:42:09Z", - "assets": [], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.9", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.9", - "body": "Enhancement #817 Crafting CPU GUI now shows a green background on items being crafted, and a yellow background on scheduled items - Eearslya\r\n\r\nEnhancement Added an option to disable the colored crafting status - yueh\r\n\r\nEnhancement Added more information to the security audit - yueh\r\n\r\nEnhancement Improved performance - yueh\r\n\r\nFixes #972 Level Emitter tool-tip now corresponds to the actual behavior - thatsIch\r\n\r\nFixes #982 Auto-crafting lag reduced - yueh\r\n\r\nFixes #910 Dense cables render correctly with FMP now - yueh\r\n\r\nFixes #943 Reduced lag when breaking multiple blocks at once using Annihilation Plane - yueh\r\n\r\nFixes cable render crash and covered cables render as smart - yueh\r\n\r\nUpdate fr_FR.lang - Mazdallier\r\n\r\nUpdate zh_CN.lang - bakaxyf\r\n\r\nUpdated Texture / Model License to be more specific - AlgorithmX2\r\n\r\nUpdated Forge to recommended 10.13.2.1291 and other dependencies - yueh" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/881276", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/881276/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/881276/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.8", - "id": 881276, - "tag_name": "rv2.beta.8", - "target_commitish": "ef3cb0a4559ababe53cd7f45123e7b28719d06b7", - "name": "Build rv2.beta.8", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2015-01-22T16:05:23Z", - "published_at": "2015-01-24T16:46:55Z", - "assets": [], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.8", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.8", - "body": "Update pt_BR.lang - al-myr\r\n\r\nImproved the logged warning for FailledConnection Now displays to coordinates of the affected tunnels. - yueh\r\n\r\nFix #701 - Changed harvest tool to axe - TheJulianJES\r\n\r\nFormation plane can now drop blocks as items - yueh\r\n\r\nDisable level emitter on offline networks Turns off level emitters if the goes offline because it runs out of power, channels or similar. - yueh\r\n\r\nFixes #304 WAILA Integration updated and fixed WAILA offers a new interface to sync the server data to the client. - thatsIch\r\n\r\nRemoved buffer from annihilation plane - yueh\r\n\r\nEffects should not collide with anything - yueh\r\n\r\nImprove code quality - thatsIch" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/818857", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/818857/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/818857/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.7", - "id": 818857, - "tag_name": "rv2.beta.7", - "target_commitish": "15ba1970837804dc34de3cdae037fca511103f15", - "name": "Build rv2.beta.7", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2015-01-01T14:35:57Z", - "published_at": "2015-01-01T17:56:50Z", - "assets": [], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.7", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.7", - "body": "Fixes #666 vanishing microblocks with Immibis-Microblocks - yueh" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/816514", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/816514/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/816514/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.6", - "id": 816514, - "tag_name": "rv2.beta.6", - "target_commitish": "305fc6c7f2c85afa05e37e127098fc3e0330a9c2", - "name": "Build rv2.beta.6", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2014-12-30T22:34:57Z", - "published_at": "2014-12-30T22:40:56Z", - "assets": [ - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/361179", - "id": 361179, - "name": "appliedenergistics2-rv2-beta-6-api.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 264460, - "download_count": 2, - "created_at": "2014-12-30T22:42:44Z", - "updated_at": "2014-12-30T22:42:44Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.6/appliedenergistics2-rv2-beta-6-api.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/361180", - "id": 361180, - "name": "appliedenergistics2-rv2-beta-6-dev.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2388010, - "download_count": 1, - "created_at": "2014-12-30T22:42:47Z", - "updated_at": "2014-12-30T22:42:48Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.6/appliedenergistics2-rv2-beta-6-dev.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/361178", - "id": 361178, - "name": "appliedenergistics2-rv2-beta-6.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2424995, - "download_count": 10, - "created_at": "2014-12-30T22:42:37Z", - "updated_at": "2014-12-30T22:42:39Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.6/appliedenergistics2-rv2-beta-6.jar" - } - ], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.6", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.6", - "body": "Fixes #663 NPE on disabled Facades - thatsIch" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/815358", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/815358/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/815358/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.5", - "id": 815358, - "tag_name": "rv2.beta.5", - "target_commitish": "97dabc4a5cb2117f872946aea359dc49efa3b79b", - "name": "Build rv2.beta.5", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2014-12-30T13:06:08Z", - "published_at": "2014-12-30T13:31:11Z", - "assets": [ - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360438", - "id": 360438, - "name": "appliedenergistics2-rv2-beta-5-api.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 264460, - "download_count": 0, - "created_at": "2014-12-30T15:03:30Z", - "updated_at": "2014-12-30T15:03:30Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.5/appliedenergistics2-rv2-beta-5-api.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360439", - "id": 360439, - "name": "appliedenergistics2-rv2-beta-5-dev.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2387747, - "download_count": 0, - "created_at": "2014-12-30T15:03:32Z", - "updated_at": "2014-12-30T15:03:33Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.5/appliedenergistics2-rv2-beta-5-dev.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360437", - "id": 360437, - "name": "appliedenergistics2-rv2-beta-5.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2424731, - "download_count": 3, - "created_at": "2014-12-30T15:03:25Z", - "updated_at": "2014-12-30T15:03:27Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.5/appliedenergistics2-rv2-beta-5.jar" - } - ], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.5", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.5", - "body": "Fixes #659 NPE on usage of the FZ sculpting tool - thatsIch" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/814288", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/814288/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/814288/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.4", - "id": 814288, - "tag_name": "rv2.beta.4", - "target_commitish": "02e59faa59ed1715366d0a659197dda9808560df", - "name": "Build rv2.beta.4", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2014-12-29T22:02:48Z", - "published_at": "2014-12-29T22:44:26Z", - "assets": [ - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360441", - "id": 360441, - "name": "appliedenergistics2-rv2-beta-4-api.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 264460, - "download_count": 0, - "created_at": "2014-12-30T15:03:48Z", - "updated_at": "2014-12-30T15:03:48Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.4/appliedenergistics2-rv2-beta-4-api.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360442", - "id": 360442, - "name": "appliedenergistics2-rv2-beta-4-dev.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2387673, - "download_count": 0, - "created_at": "2014-12-30T15:03:50Z", - "updated_at": "2014-12-30T15:03:52Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.4/appliedenergistics2-rv2-beta-4-dev.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360440", - "id": 360440, - "name": "appliedenergistics2-rv2-beta-4.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2424666, - "download_count": 0, - "created_at": "2014-12-30T15:03:45Z", - "updated_at": "2014-12-30T15:03:46Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.4/appliedenergistics2-rv2-beta-4.jar" - } - ], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.4", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.4", - "body": "Fixes #644 Several missing null checks when disabling huge chunks of the mod via config - thatsIch\r\n\r\nUpdate ru_RU.lang - Adaptivity" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/812048", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/812048/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/812048/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.3", - "id": 812048, - "tag_name": "rv2.beta.3", - "target_commitish": "e712a9d8ceca11fd9571625a1902eab2173909b4", - "name": "Build rv2.beta.3", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2014-12-28T17:38:56Z", - "published_at": "2014-12-28T17:46:49Z", - "assets": [ - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360444", - "id": 360444, - "name": "appliedenergistics2-rv2-beta-3-api.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 264396, - "download_count": 1, - "created_at": "2014-12-30T15:04:28Z", - "updated_at": "2014-12-30T15:04:29Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.3/appliedenergistics2-rv2-beta-3-api.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360445", - "id": 360445, - "name": "appliedenergistics2-rv2-beta-3-dev.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2386391, - "download_count": 0, - "created_at": "2014-12-30T15:04:30Z", - "updated_at": "2014-12-30T15:04:32Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.3/appliedenergistics2-rv2-beta-3-dev.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360443", - "id": 360443, - "name": "appliedenergistics2-rv2-beta-3.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2423384, - "download_count": 0, - "created_at": "2014-12-30T15:04:25Z", - "updated_at": "2014-12-30T15:04:27Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.3/appliedenergistics2-rv2-beta-3.jar" - } - ], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.3", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.3", - "body": "Fixes #639 Missing null check for people with disabled channels - thatsIch" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/811619", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/811619/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/811619/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.2", - "id": 811619, - "tag_name": "rv2.beta.2", - "target_commitish": "f7323289a50f75b6b68f2fe06bf2a6bd593d70e3", - "name": "Build rv2.beta.2", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2014-12-27T18:05:37Z", - "published_at": "2014-12-28T08:49:55Z", - "assets": [ - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360447", - "id": 360447, - "name": "appliedenergistics2-rv2-beta-2-api.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 264396, - "download_count": 0, - "created_at": "2014-12-30T15:04:52Z", - "updated_at": "2014-12-30T15:04:53Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.2/appliedenergistics2-rv2-beta-2-api.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360448", - "id": 360448, - "name": "appliedenergistics2-rv2-beta-2-dev.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2386310, - "download_count": 0, - "created_at": "2014-12-30T15:04:55Z", - "updated_at": "2014-12-30T15:04:57Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.2/appliedenergistics2-rv2-beta-2-dev.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360446", - "id": 360446, - "name": "appliedenergistics2-rv2-beta-2.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2423307, - "download_count": 2, - "created_at": "2014-12-30T15:04:47Z", - "updated_at": "2014-12-30T15:04:49Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.2/appliedenergistics2-rv2-beta-2.jar" - } - ], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.2", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.2", - "body": "* #624 Fixes disabled features getting not disabled - thatsIch\r\n* #572 Fixes inventory validation for any kind of Player (enables automation via robots e.g.) - thatsIch\r\n* Sound improvements - TheJulianJES\r\n* Use player inventory to let NEI fill a recipe when it is not provided by the network - riking\r\n* #604 Fixes crash on Achievement - thatsIch\r\n* #593 Updating RF Integration to use version 1.7.10R1.0.2 - thatsIch" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/783731", - "assets_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/783731/assets", - "upload_url": "https://uploads.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/783731/assets{?name}", - "html_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/tag/rv2.beta.1", - "id": 783731, - "tag_name": "rv2.beta.1", - "target_commitish": "8d1a0cdb7df49646d4e7a713eed30c546fff2f4a", - "name": "Build rv2.beta.1", - "draft": false, - "author": { - "login": "AlgorithmX2", - "id": 2846930, - "avatar_url": "https://avatars.githubusercontent.com/u/2846930?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/AlgorithmX2", - "html_url": "https://github.com/AlgorithmX2", - "followers_url": "https://api.github.com/users/AlgorithmX2/followers", - "following_url": "https://api.github.com/users/AlgorithmX2/following{/other_user}", - "gists_url": "https://api.github.com/users/AlgorithmX2/gists{/gist_id}", - "starred_url": "https://api.github.com/users/AlgorithmX2/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/AlgorithmX2/subscriptions", - "organizations_url": "https://api.github.com/users/AlgorithmX2/orgs", - "repos_url": "https://api.github.com/users/AlgorithmX2/repos", - "events_url": "https://api.github.com/users/AlgorithmX2/events{/privacy}", - "received_events_url": "https://api.github.com/users/AlgorithmX2/received_events", - "type": "User", - "site_admin": false - }, - "prerelease": true, - "created_at": "2014-12-15T13:59:55Z", - "published_at": "2014-12-15T14:07:25Z", - "assets": [ - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360452", - "id": 360452, - "name": "appliedenergistics2-rv2-beta-1-api.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 264402, - "download_count": 0, - "created_at": "2014-12-30T15:05:28Z", - "updated_at": "2014-12-30T15:05:28Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.1/appliedenergistics2-rv2-beta-1-api.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360453", - "id": 360453, - "name": "appliedenergistics2-rv2-beta-1-dev.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2383463, - "download_count": 0, - "created_at": "2014-12-30T15:05:30Z", - "updated_at": "2014-12-30T15:05:32Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.1/appliedenergistics2-rv2-beta-1-dev.jar" - }, - { - "url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/releases/assets/360451", - "id": 360451, - "name": "appliedenergistics2-rv2-beta-1.jar", - "label": null, - "uploader": { - "login": "yueh", - "id": 151949, - "avatar_url": "https://avatars.githubusercontent.com/u/151949?v=3", - "gravatar_id": "", - "url": "https://api.github.com/users/yueh", - "html_url": "https://github.com/yueh", - "followers_url": "https://api.github.com/users/yueh/followers", - "following_url": "https://api.github.com/users/yueh/following{/other_user}", - "gists_url": "https://api.github.com/users/yueh/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yueh/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yueh/subscriptions", - "organizations_url": "https://api.github.com/users/yueh/orgs", - "repos_url": "https://api.github.com/users/yueh/repos", - "events_url": "https://api.github.com/users/yueh/events{/privacy}", - "received_events_url": "https://api.github.com/users/yueh/received_events", - "type": "User", - "site_admin": false - }, - "content_type": "application/octet-stream", - "state": "uploaded", - "size": 2420383, - "download_count": 2, - "created_at": "2014-12-30T15:05:25Z", - "updated_at": "2014-12-30T15:05:27Z", - "browser_download_url": "https://github.com/AppliedEnergistics/Applied-Energistics-2/releases/download/rv2.beta.1/appliedenergistics2-rv2-beta-1.jar" - } - ], - "tarball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/tarball/rv2.beta.1", - "zipball_url": "https://api.github.com/repos/AppliedEnergistics/Applied-Energistics-2/zipball/rv2.beta.1", - "body": "Bump channel to beta" - } -]