diff --git a/src/main/java/de/ellpeck/actuallyadditions/api/laser/ILaserRelayConnectionHandler.java b/src/main/java/de/ellpeck/actuallyadditions/api/laser/ILaserRelayConnectionHandler.java index 756b3f4c3..334751875 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/api/laser/ILaserRelayConnectionHandler.java +++ b/src/main/java/de/ellpeck/actuallyadditions/api/laser/ILaserRelayConnectionHandler.java @@ -35,6 +35,8 @@ public interface ILaserRelayConnectionHandler{ boolean addConnection(BlockPos firstRelay, BlockPos secondRelay, LaserType type, World world, boolean suppressConnectionRender); + void removeConnection(World world, BlockPos firstRelay, BlockPos secondRelay); + LaserType getTypeFromLaser(TileEntity tile); LaserType getTypeFromLaser(BlockPos pos, World world); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/creative/CreativeTab.java b/src/main/java/de/ellpeck/actuallyadditions/mod/creative/CreativeTab.java index 3e2f2b473..c14140bee 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/creative/CreativeTab.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/creative/CreativeTab.java @@ -161,6 +161,7 @@ public class CreativeTab extends CreativeTabs{ this.add(InitItems.itemMiningLens); this.add(InitItems.itemLaserWrench); this.add(InitItems.itemLaserUpgradeInvisibility); + this.add(InitItems.itemLaserUpgradeRange); this.add(InitItems.itemInfraredGoggles); this.add(InitItems.itemCrateKeeper); this.add(InitItems.itemChestToCrateUpgrade); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/items/InitItems.java b/src/main/java/de/ellpeck/actuallyadditions/mod/items/InitItems.java index 35720e7d5..9a19695b3 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/items/InitItems.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/items/InitItems.java @@ -194,12 +194,14 @@ public final class InitItems{ public static Item itemVoidBag; public static Item itemFillingWand; public static Item itemLaserUpgradeInvisibility; + public static Item itemLaserUpgradeRange; public static Item itemInfraredGoggles; public static void init(){ ModUtil.LOGGER.info("Initializing Items..."); itemInfraredGoggles = new ItemInfraredGoggles("item_infrared_goggles"); + itemLaserUpgradeRange = new ItemLaserRelayUpgrade("item_laser_upgrade_range"); itemLaserUpgradeInvisibility = new ItemLaserRelayUpgrade("item_laser_upgrade_invisibility"); itemFillingWand = new ItemFillingWand("item_filling_wand"); itemBag = new ItemBag("item_bag", false); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemLaserWrench.java b/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemLaserWrench.java index dde705c07..5853792fa 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemLaserWrench.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemLaserWrench.java @@ -43,6 +43,7 @@ public class ItemLaserWrench extends ItemBase{ ItemStack stack = player.getHeldItem(hand); TileEntity tile = world.getTileEntity(pos); if(tile instanceof TileEntityLaserRelay){ + TileEntityLaserRelay relay = (TileEntityLaserRelay)tile; if(!world.isRemote){ if(ItemPhantomConnector.getStoredPosition(stack) == null){ ItemPhantomConnector.storeConnection(stack, pos.getX(), pos.getY(), pos.getZ(), world); @@ -52,20 +53,26 @@ public class ItemLaserWrench extends ItemBase{ BlockPos savedPos = ItemPhantomConnector.getStoredPosition(stack); if(savedPos != null){ TileEntity savedTile = world.getTileEntity(savedPos); - int distanceSq = (int)savedPos.distanceSq(pos); - TileEntityLaserRelay relay = (TileEntityLaserRelay)tile; - if(ItemPhantomConnector.getStoredWorld(stack) == world && savedTile instanceof TileEntityLaserRelay && ((TileEntityLaserRelay)savedTile).type == relay.type && distanceSq <= TileEntityLaserRelay.MAX_DISTANCE*TileEntityLaserRelay.MAX_DISTANCE && ActuallyAdditionsAPI.connectionHandler.addConnection(savedPos, pos, relay.type, world)){ - ItemPhantomConnector.clearStorage(stack, "XCoordOfTileStored", "YCoordOfTileStored", "ZCoordOfTileStored", "WorldOfTileStored"); + if(savedTile instanceof TileEntityLaserRelay){ + int distanceSq = (int)savedPos.distanceSq(pos); + TileEntityLaserRelay savedRelay = (TileEntityLaserRelay)savedTile; - ((TileEntityLaserRelay)savedTile).sendUpdate(); - relay.sendUpdate(); + int lowestRange = Math.min(relay.getMaxRange(), savedRelay.getMaxRange()); + int range = lowestRange*lowestRange; + if(ItemPhantomConnector.getStoredWorld(stack) == world && savedRelay.type == relay.type && distanceSq <= range && ActuallyAdditionsAPI.connectionHandler.addConnection(savedPos, pos, relay.type, world)){ + ItemPhantomConnector.clearStorage(stack, "XCoordOfTileStored", "YCoordOfTileStored", "ZCoordOfTileStored", "WorldOfTileStored"); - player.sendMessage(new TextComponentTranslation("tooltip."+ModUtil.MOD_ID+".laser.connected.desc")); - } - else{ - player.sendMessage(new TextComponentTranslation("tooltip."+ModUtil.MOD_ID+".laser.cantConnect.desc")); - ItemPhantomConnector.clearStorage(stack, "XCoordOfTileStored", "YCoordOfTileStored", "ZCoordOfTileStored", "WorldOfTileStored"); + ((TileEntityLaserRelay)savedTile).sendUpdate(); + relay.sendUpdate(); + + player.sendMessage(new TextComponentTranslation("tooltip."+ModUtil.MOD_ID+".laser.connected.desc")); + + return EnumActionResult.SUCCESS; + } } + + player.sendMessage(new TextComponentTranslation("tooltip."+ModUtil.MOD_ID+".laser.cantConnect.desc")); + ItemPhantomConnector.clearStorage(stack, "XCoordOfTileStored", "YCoordOfTileStored", "ZCoordOfTileStored", "WorldOfTileStored"); } } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/LaserRelayConnectionHandler.java b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/LaserRelayConnectionHandler.java index 98b632554..2ecccbe1d 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/LaserRelayConnectionHandler.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/LaserRelayConnectionHandler.java @@ -170,6 +170,27 @@ public final class LaserRelayConnectionHandler implements ILaserRelayConnectionH return true; } + @Override + public void removeConnection(World world, BlockPos firstRelay, BlockPos secondRelay){ + if(world != null && firstRelay != null && secondRelay != null){ + Network network = this.getNetworkFor(firstRelay, world); + + if(network != null){ + network.changeAmount++; + + WorldData data = WorldData.get(world); + data.laserRelayNetworks.remove(network); + data.markDirty(); + + for(IConnectionPair pair : network.connections){ + if(!pair.contains(firstRelay) || !pair.contains(secondRelay)){ + this.addConnection(pair.getPositions()[0], pair.getPositions()[1], pair.getType(), world, pair.doesSuppressRender()); + } + } + } + } + } + @Override public LaserType getTypeFromLaser(TileEntity tile){ if(tile instanceof TileEntityLaserRelay){ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java index 4c4529f68..5cb0ada84 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java @@ -14,9 +14,12 @@ import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI; import de.ellpeck.actuallyadditions.api.laser.IConnectionPair; import de.ellpeck.actuallyadditions.api.laser.LaserType; import de.ellpeck.actuallyadditions.api.laser.Network; +import de.ellpeck.actuallyadditions.mod.items.InitItems; import de.ellpeck.actuallyadditions.mod.misc.apiimpl.ConnectionPair; +import de.ellpeck.actuallyadditions.mod.util.StackUtil; import io.netty.util.internal.ConcurrentSet; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumFacing; @@ -35,6 +38,7 @@ public abstract class TileEntityLaserRelay extends TileEntityInventoryBase{ private Network cachedNetwork; private int changeAmountAtCaching = -1; + private int lastRange; private Set tempConnectionStorage; @@ -81,6 +85,26 @@ public abstract class TileEntityLaserRelay extends TileEntityInventoryBase{ } } + @Override + public void updateEntity(){ + super.updateEntity(); + + int range = this.getMaxRange(); + if(this.lastRange != range){ + ConcurrentSet connections = ActuallyAdditionsAPI.connectionHandler.getConnectionsFor(this.pos, this.world); + if(connections != null && !connections.isEmpty()){ + for(IConnectionPair pair : connections){ + int distanceSq = (int)pair.getPositions()[0].distanceSq(pair.getPositions()[1]); + if(distanceSq > range*range){ + ActuallyAdditionsAPI.connectionHandler.removeConnection(this.world, pair.getPositions()[0], pair.getPositions()[1]); + } + } + } + + this.lastRange = range; + } + } + /*@Override public void updateEntity(){ super.updateEntity(); @@ -166,6 +190,16 @@ public abstract class TileEntityLaserRelay extends TileEntityInventoryBase{ return null; } + public int getMaxRange(){ + ItemStack upgrade = this.slots.getStackInSlot(0); + if(StackUtil.isValid(upgrade) && upgrade.getItem() == InitItems.itemLaserUpgradeRange){ + return 35; + } + else{ + return MAX_DISTANCE; + } + } + @SideOnly(Side.CLIENT) public abstract String getExtraDisplayString(); diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 08609bef9..55ee4907d 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -522,6 +522,7 @@ item.actuallyadditions.item_more_damage_lens.name=Lens of the Killer item.actuallyadditions.item_filling_wand.name=Handheld Filler item.actuallyadditions.item_laser_upgrade_invisibility.name=Laser Relay Modifier: Invisibility item.actuallyadditions.item_infrared_goggles.name=Infrared Goggles +item.actuallyadditions.item_laser_upgrade_range.name=Laser Relay Modifier: Range #Tooltips tooltip.actuallyadditions.onSuffix.desc=On diff --git a/src/main/resources/assets/actuallyadditions/models/item/item_laser_upgrade_range.json b/src/main/resources/assets/actuallyadditions/models/item/item_laser_upgrade_range.json new file mode 100644 index 000000000..375a5a813 --- /dev/null +++ b/src/main/resources/assets/actuallyadditions/models/item/item_laser_upgrade_range.json @@ -0,0 +1,6 @@ +{ + "parent": "actuallyadditions:item/handheld_item", + "textures": { + "layer0": "actuallyadditions:items/item_laser_upgrade_range" + } +} diff --git a/src/main/resources/assets/actuallyadditions/textures/items/item_laser_upgrade_range.png b/src/main/resources/assets/actuallyadditions/textures/items/item_laser_upgrade_range.png new file mode 100644 index 000000000..9f49d992f Binary files /dev/null and b/src/main/resources/assets/actuallyadditions/textures/items/item_laser_upgrade_range.png differ