diff --git a/src/main/java/mrjake/aunis/stargate/merging/StargateAbstractMergeHelper.java b/src/main/java/mrjake/aunis/stargate/merging/StargateAbstractMergeHelper.java index c2ad0732..f94122db 100644 --- a/src/main/java/mrjake/aunis/stargate/merging/StargateAbstractMergeHelper.java +++ b/src/main/java/mrjake/aunis/stargate/merging/StargateAbstractMergeHelper.java @@ -194,4 +194,7 @@ public void updateMembersMergeStatus(World world, BlockPos basePos, EnumFacing b for (BlockPos pos : getChevronBlocks()) updateMemberMergeStatus(world, pos, basePos, baseFacing, shouldBeMerged); } + + public void updateMembersBasePos(IBlockAccess blockAccess, BlockPos basePos, EnumFacing baseFacing) { + } } \ No newline at end of file diff --git a/src/main/java/mrjake/aunis/stargate/merging/StargateClassicMergeHelper.java b/src/main/java/mrjake/aunis/stargate/merging/StargateClassicMergeHelper.java index 0fd7ac81..c24f906e 100644 --- a/src/main/java/mrjake/aunis/stargate/merging/StargateClassicMergeHelper.java +++ b/src/main/java/mrjake/aunis/stargate/merging/StargateClassicMergeHelper.java @@ -85,4 +85,4 @@ public void updateMembersBasePos(IBlockAccess blockAccess, BlockPos basePos, Enu for (BlockPos pos : getChevronBlocks()) updateMemberBasePos(blockAccess, pos.rotate(FacingToRotation.get(baseFacing)).add(basePos), basePos, baseFacing); } -} +} \ No newline at end of file diff --git a/src/main/java/mrjake/aunis/tileentity/stargate/StargateAbstractBaseTile.java b/src/main/java/mrjake/aunis/tileentity/stargate/StargateAbstractBaseTile.java index b574ff26..2f3c379f 100644 --- a/src/main/java/mrjake/aunis/tileentity/stargate/StargateAbstractBaseTile.java +++ b/src/main/java/mrjake/aunis/tileentity/stargate/StargateAbstractBaseTile.java @@ -428,7 +428,7 @@ public void setGateAddress(SymbolTypeEnum symbolType, StargateAddress stargateAd markDirty(); } - + public StargateAddressDynamic getDialedAddress() { return dialedAddress; } @@ -661,28 +661,8 @@ public void onLoad() { network = StargateNetwork.get(world); targetPoint = new TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 512); - Random random = new Random(pos.hashCode() * 31 + world.provider.getDimension()); - for (SymbolTypeEnum symbolType : SymbolTypeEnum.values()) { - - StargatePos stargatePos; - - if (gateAddressMap.get(symbolType) == null) { - StargateAddress address = new StargateAddress(symbolType); - address.generate(random); - - stargatePos = new StargatePos(world.provider.getDimension(), pos, address); - network.addStargate(address, stargatePos); - gateAddressMap.put(symbolType, address); -// Aunis.info(address.toString()); - } - - else { - stargatePos = new StargatePos(world.provider.getDimension(), pos, gateAddressMap.get(symbolType)); - } - - gatePosMap.put(symbolType, stargatePos); - } + generateAddresses(false); if (stargateState.engaged()) { verifyConnection(); @@ -693,6 +673,21 @@ public void onLoad() { AunisPacketHandler.INSTANCE.sendToServer(new StateUpdateRequestToServer(pos, StateTypeEnum.RENDERER_STATE)); } } + + public void generateAddresses(boolean reset) { + Random random = new Random(pos.hashCode() * 31 + world.provider.getDimension()); + + for (SymbolTypeEnum symbolType : SymbolTypeEnum.values()) { + StargateAddress address = getStargateAddress(symbolType); + + if (gateAddressMap.get(symbolType) == null || reset) { + address = new StargateAddress(symbolType); + address.generate(random); + } + + if (address != null) this.setGateAddress(symbolType, address); + } + } private boolean addedToNetwork; @@ -1031,6 +1026,16 @@ public final boolean isMerged() { * @param facing Facing of the base block. */ public final void updateMergeState(boolean shouldBeMerged, EnumFacing facing) { + // If the gate has already been merged, there is no need to merge it again. + // However, the gate position might have changed in that case, so we should + // update the members base position. + if (this.isMerged == shouldBeMerged) { + if (shouldBeMerged) { + getMergeHelper().updateMembersBasePos(world, pos, facing); + } + return; + } + if (!shouldBeMerged) { if (isMerged) onGateBroken(); diff --git a/src/main/java/mrjake/aunis/tileentity/stargate/StargateClassicBaseTile.java b/src/main/java/mrjake/aunis/tileentity/stargate/StargateClassicBaseTile.java index 8b3920a4..13e29260 100644 --- a/src/main/java/mrjake/aunis/tileentity/stargate/StargateClassicBaseTile.java +++ b/src/main/java/mrjake/aunis/tileentity/stargate/StargateClassicBaseTile.java @@ -167,6 +167,7 @@ protected void onGateMerged() { updateBeamers(); } + protected abstract boolean onGateMergeRequested(); // ------------------------------------------------------------------------ // Loading and ticking @@ -176,16 +177,28 @@ public void onLoad() { super.onLoad(); if (!world.isRemote) { + lastPos = pos; updateBeamers(); updatePowerTier(); } } + + private BlockPos lastPos = BlockPos.ORIGIN; @Override public void update() { super.update(); if (!world.isRemote) { + if (!lastPos.equals(pos)) { + lastPos = pos; + generateAddresses(!hasUpgrade(StargateClassicBaseTile.StargateUpgradeEnum.CHEVRON_UPGRADE)); + + if (isMerged()) { + updateMergeState(onGateMergeRequested(), facing); + } + } + if (givePageTask != null) { if (givePageTask.update(world.getTotalWorldTime())) { givePageTask = null; diff --git a/src/main/java/mrjake/aunis/tileentity/stargate/StargateMilkyWayBaseTile.java b/src/main/java/mrjake/aunis/tileentity/stargate/StargateMilkyWayBaseTile.java index 832eeccd..f3bfa98a 100644 --- a/src/main/java/mrjake/aunis/tileentity/stargate/StargateMilkyWayBaseTile.java +++ b/src/main/java/mrjake/aunis/tileentity/stargate/StargateMilkyWayBaseTile.java @@ -183,6 +183,16 @@ protected void onGateMerged() { markDirty(); } } + + @Override + protected boolean onGateMergeRequested() { + if (stargateSize != AunisConfig.stargateSize) { + StargateMilkyWayMergeHelper.INSTANCE.convertToPattern(world, pos, facing, stargateSize, AunisConfig.stargateSize); + stargateSize = AunisConfig.stargateSize; + } + + return StargateMilkyWayMergeHelper.INSTANCE.checkBlocks(world, pos, facing); + } @Override public StargateAbstractMergeHelper getMergeHelper() { @@ -302,28 +312,6 @@ public BlockPos getGateCenterPos() { return pos.offset(EnumFacing.UP, 4); } - private boolean firstTick = true; - - @Override - public void update() { - super.update(); - - if (!world.isRemote) { - if (firstTick) { - firstTick = false; - - // Doing this in onLoad causes ConcurrentModificationException - if (stargateSize != AunisConfig.stargateSize && isMerged()) { - StargateMilkyWayMergeHelper.INSTANCE.convertToPattern(world, pos, facing, stargateSize, AunisConfig.stargateSize); - updateMergeState(StargateMilkyWayMergeHelper.INSTANCE.checkBlocks(world, pos, facing), facing); - - stargateSize = AunisConfig.stargateSize; - markDirty(); - } - } - } - } - public static final EnumSet SUPPORTED_OVERLAYS = EnumSet.of( BiomeOverlayEnum.NORMAL, BiomeOverlayEnum.FROST, diff --git a/src/main/java/mrjake/aunis/tileentity/stargate/StargateUniverseBaseTile.java b/src/main/java/mrjake/aunis/tileentity/stargate/StargateUniverseBaseTile.java index b66175cc..9c163afe 100644 --- a/src/main/java/mrjake/aunis/tileentity/stargate/StargateUniverseBaseTile.java +++ b/src/main/java/mrjake/aunis/tileentity/stargate/StargateUniverseBaseTile.java @@ -361,6 +361,10 @@ public StargateAbstractMergeHelper getMergeHelper() { return StargateUniverseMergeHelper.INSTANCE; } + @Override + protected boolean onGateMergeRequested() { + return StargateUniverseMergeHelper.INSTANCE.checkBlocks(world, pos, facing); + } // -------------------------------------------------------------------------------- // Renderer states @@ -386,4 +390,4 @@ public StargateUniverseRendererState getRendererStateClient() { public int getSupportedCapacitors() { return AunisConfig.powerConfig.universeCapacitors; } -} +} \ No newline at end of file