diff --git a/src/main/resources/plugin.yml b/plugin.yml old mode 100755 new mode 100644 similarity index 93% rename from src/main/resources/plugin.yml rename to plugin.yml index 62b09e7..ad05b75 --- a/src/main/resources/plugin.yml +++ b/plugin.yml @@ -1,6 +1,7 @@ name: BasicCircuits main: org.redstonechips.basiccircuits.BasicCircuits version: 0.97 +api-version: 1.15 author: eisental description: Basic circuit library for RedstoneChips integrated circuits plugin. website: eisental.github.com/RedstoneChips diff --git a/pom.xml b/pom.xml index 2d3a027..8a61cec 100755 --- a/pom.xml +++ b/pom.xml @@ -30,10 +30,17 @@ + + org.bukkit + bukkit + 1.15.2-R0.1-SNAPSHOT + jar + provided + org.redstonechips RedstoneChips - 1.0-SNAPSHOT + 1.1-SNAPSHOT diff --git a/src/main/java/org/redstonechips/basiccircuits/BasicCircuits.java b/src/main/java/org/redstonechips/basiccircuits/BasicCircuits.java index a6c210c..460e783 100755 --- a/src/main/java/org/redstonechips/basiccircuits/BasicCircuits.java +++ b/src/main/java/org/redstonechips/basiccircuits/BasicCircuits.java @@ -15,7 +15,7 @@ public Class[] getCircuitClasses() { multiplexer.class, multiplier.class, or.class, pisoregister.class, print.class, random.class, receiver.class, shiftregister.class, transmitter.class, xor.class, decoder.class, encoder.class, pixel.class, pulse.class, not.class, synth.class, srnor.class, terminal.class, router.class, ringcounter.class, iptransmitter.class, ipreceiver.class, - comparator.class, delay.class, repeater.class, nand.class, nor.class, xnor.class, segdriver.class, dregister.class, + comparator.class, delay.class, repeater.class, nand.class, nor.class, xnor.class, segdriver.class, dregister.class, sram.class, bintobcd.class, display.class, burst.class, ramwatch.class }; } diff --git a/src/main/java/org/redstonechips/basiccircuits/SignWriter.java b/src/main/java/org/redstonechips/basiccircuits/SignWriter.java index 60a4659..e4afa8d 100755 --- a/src/main/java/org/redstonechips/basiccircuits/SignWriter.java +++ b/src/main/java/org/redstonechips/basiccircuits/SignWriter.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; + import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -24,48 +25,48 @@ public enum DisplayMode { } public static final int LineWidth = 15; - + private final Type type; private final DisplayMode display; - + private final StringBuffer textBuffer = new StringBuffer(); private String[] lines = new String[] { "", "", "", "" }; private int scrollPos = 0; private final List signList; - + public SignWriter(DisplayMode displayMode, Type type, List signList) { this.type = type; this.display = displayMode; this.signList = signList; } - + public DisplayMode getDisplayMode() { return display; } - + public String[] getLines() { return lines; } - - public void setLines(String[] lines) { + + public void setLines(String[] lines) { this.lines = lines; } - + public String getText() { return textBuffer.toString(); } - + public void setText(String text) { textBuffer.setLength(0); textBuffer.append(text.toString()); - + if (display==DisplayMode.scroll) prepScrollLines(); else prepWrapLines(); updateSigns(); } - + List getSigns() { return signList; } - + public void write(String text) { if (display==DisplayMode.add) { add(text); @@ -79,14 +80,14 @@ public void write(String text) { add(text); prepScrollLines(); } - + updateSigns(); } - + public void write(boolean[] bits, int start, int length) { write(convertBits(bits, start, length)); } - + public void clear() { textBuffer.setLength(0); scrollPos = 0; @@ -94,7 +95,7 @@ public void clear() { lines[1] = ""; lines[2] = ""; lines[3] = ""; - updateSigns(); + updateSigns(); } public void scroll(int amount) { @@ -105,9 +106,9 @@ public void scroll(int amount) { prepScrollLines(); - updateSigns(); + updateSigns(); } - + private void add(String text) { if (type==Type.ascii || textBuffer.length()==0) { textBuffer.append(text); @@ -123,9 +124,9 @@ private void updateSigns() { s.setLine(2, lines[2]); s.setLine(3, lines[3]); s.update(); - } + } } - + private void prepScrollLines() { String window; @@ -142,7 +143,7 @@ private void prepScrollLines() { lines[2] = ""; lines[3] = ""; } - + private void prepWrapLines() { if (textBuffer.length()>LineWidth*3) { String line4 = textBuffer.substring(LineWidth*3); @@ -160,7 +161,7 @@ private void prepWrapLines() { } else if (textBuffer.length()>LineWidth) { lines[0] = textBuffer.substring(0,LineWidth); lines[1] = textBuffer.substring(LineWidth); - lines[2] = ""; + lines[2] = ""; lines[3] = ""; } else { lines[0] = textBuffer.toString(); @@ -169,7 +170,7 @@ private void prepWrapLines() { lines[3] = ""; } } - + private String convertBits(boolean[] bits, int start, int length) { String text = null; @@ -191,7 +192,7 @@ private String convertBits(boolean[] bits, int start, int length) { return text; } - + public static SignWriter getSignWriter(DisplayMode mode, Type type, Location... aroundBlocks) { List signs = new ArrayList<>(); @@ -209,10 +210,10 @@ public static SignWriter getSignWriter(DisplayMode mode, Type type, Location... if (checkBlock(i, east)) { signs.add(east); } if (checkBlock(i, up)) { signs.add(up); } } - - return new SignWriter(mode, type, signs); + + return new SignWriter(mode, type, signs); } - + private static boolean checkBlock(Block i, Location s) { // TODO: Check whether this method loads the chunk or not. Block sign = s.getBlock(); @@ -223,5 +224,5 @@ private static boolean checkBlock(Block i, Location s) { } else return false; } - + } diff --git a/src/main/java/org/redstonechips/basiccircuits/adder.java b/src/main/java/org/redstonechips/basiccircuits/adder.java index 3ca02bd..f882dd9 100755 --- a/src/main/java/org/redstonechips/basiccircuits/adder.java +++ b/src/main/java/org/redstonechips/basiccircuits/adder.java @@ -35,7 +35,7 @@ protected void bitSetChanged(int bitSetIdx, boolean[] set) { if (constant != 0) { output = BooleanArrays.add(output, constant, outputlen); } - + // write result this.writeBits(output); } @@ -53,13 +53,13 @@ public Circuit init(String[] args) { } if ((inputlen % wordlength)==0) { - int inBitSetCount = inputlen / wordlength; - inputBitSets = new boolean[inBitSetCount][wordlength]; + int inBitSetCount = inputlen / wordlength; + inputBitSets = new boolean[inBitSetCount][wordlength]; } else return error("Invalid number of inputs (" + inputlen + "). Number of inputs must be a multiple of the word length."); if (args[args.length-1].equalsIgnoreCase("subtract")) subtract = true; - + if ((args.length>1 && !subtract) || (args.length>2)) { try { constant = Integer.decode(args[1]); @@ -68,14 +68,14 @@ public Circuit init(String[] args) { return error("Bad constant argument: " + args[1] + " expecting a number."); } } - + int maxResult = ((int)Math.pow(2, wordlength)-1) * inputBitSets.length + constant; int expectedOutputs = (int)Math.ceil(Math.log(maxResult)/Math.log(2)); - if (outputlen0) || (offDuration<50 && offDuration>0)) - return error("Clock frequency is currently limited to 50ms per state. Use a lower freq argument or try setting pulse-width to 0."); + return error("Clock frequency is currently limited to 50ms per state. Use a lower freq argument or try setting pulse-width to 0."); if (channelArg!=null) { try { @@ -123,7 +124,7 @@ private void startClock() { ticking = true; currentState = true; - + taskId = rc.getServer().getScheduler().scheduleSyncDelayedTask(rc, tickTask); if (taskId==-1) { if (chip.hasListeners()) debug("Tick task schedule failed!"); @@ -144,7 +145,7 @@ private void stopClock() { public void disable() { super.disable(); stopClock(); - } + } @Override public void enable() { @@ -154,16 +155,16 @@ public void enable() { } else if (!onBits.isEmpty()) startClock(); } - + @Override public void shutdown() { stopClock(); } boolean currentState = true; - + private class TickTask implements Runnable { - + @Override public void run() { diff --git a/src/main/java/org/redstonechips/basiccircuits/comparator.java b/src/main/java/org/redstonechips/basiccircuits/comparator.java index 1daf02e..fd1fb49 100755 --- a/src/main/java/org/redstonechips/basiccircuits/comparator.java +++ b/src/main/java/org/redstonechips/basiccircuits/comparator.java @@ -18,7 +18,7 @@ public class comparator extends Circuit { private int dataPin; private boolean clocked; - + private static final boolean[] lessThan = BooleanArrays.fromInt(1, 3); private static final boolean[] equals = BooleanArrays.fromInt(2, 3); private static final boolean[] greaterThan = BooleanArrays.fromInt(4, 3); @@ -36,9 +36,9 @@ private void calc() { } else { compare(BooleanArrays.toUnsignedInt(inputs, dataPin, wordLength), BooleanArrays.toUnsignedInt(inputs, dataPin+wordLength, wordLength)); - } + } } - + private void compare(long a, long b) { if (identityMode) { if (chip.hasListeners()) debug(a + " is " + (a==b?"":"not ") + "equal to " + b); @@ -65,7 +65,7 @@ public Circuit init(String[] args) { clocked = hasConstant = false; dataPin = 0; - + if (args.length>0) { clocked = args[args.length-1].equalsIgnoreCase("clockpin"); dataPin = (clocked?1:0); @@ -79,12 +79,12 @@ public Circuit init(String[] args) { return error("Bad constant argument: " + args[0]); } } - } + } if (!hasConstant) { - if ((inputlen-dataPin)%2!=0) + if ((inputlen-dataPin)%2!=0) return error("Expecting an even number of inputs when a constant is not used."); - + wordLength = (inputlen-dataPin)/2; } else wordLength = inputlen - dataPin; diff --git a/src/main/java/org/redstonechips/basiccircuits/counter.java b/src/main/java/org/redstonechips/basiccircuits/counter.java index 3a200ad..0ff4181 100755 --- a/src/main/java/org/redstonechips/basiccircuits/counter.java +++ b/src/main/java/org/redstonechips/basiccircuits/counter.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.Map; + import org.redstonechips.circuit.Circuit; /** @@ -138,7 +139,7 @@ public void setInternalState(Map state) { @Override public Map getInternalState() { - Map state = new HashMap(); + Map state = new HashMap<>(); state.put("count", Integer.toString(count)); state.put("direction", Integer.toString(direction)); return state; diff --git a/src/main/java/org/redstonechips/basiccircuits/decoder.java b/src/main/java/org/redstonechips/basiccircuits/decoder.java index 64de201..f1e97e5 100755 --- a/src/main/java/org/redstonechips/basiccircuits/decoder.java +++ b/src/main/java/org/redstonechips/basiccircuits/decoder.java @@ -1,6 +1,7 @@ package org.redstonechips.basiccircuits; import java.util.Arrays; + import org.redstonechips.circuit.Circuit; import org.redstonechips.util.BooleanArrays; @@ -15,7 +16,7 @@ public class decoder extends Circuit { public void input(boolean state, int inIdx) { if (inIdx==0 && state) { int i = (int)BooleanArrays.toUnsignedInt(inputs, 1, inputlen-1); - Arrays.fill(register, false); + Arrays.fill(register, false); register[i] = true; this.writeBits(register); } @@ -28,7 +29,7 @@ public Circuit init(String[] args) { return error("Bad number of outputs. Expecting up to " + (int)Math.pow(2, inputlen-1) + " outputs for " + inputlen + " inputs."); register = new boolean[outputlen]; - + return this; } } diff --git a/src/main/java/org/redstonechips/basiccircuits/demultiplexer.java b/src/main/java/org/redstonechips/basiccircuits/demultiplexer.java index f467578..e169f8c 100755 --- a/src/main/java/org/redstonechips/basiccircuits/demultiplexer.java +++ b/src/main/java/org/redstonechips/basiccircuits/demultiplexer.java @@ -2,6 +2,7 @@ import java.util.Arrays; + import org.redstonechips.circuit.Circuit; import org.redstonechips.util.BooleanArrays; @@ -26,13 +27,13 @@ public Circuit init(String[] args) { bitCount = outputlen/outcount; int expectedInputs = bitCount + selectSize; - if (inputlen!=expectedInputs) + if (inputlen!=expectedInputs) return error("Wrong number of inputs. expecting " + expectedInputs + " inputs (including "+ selectSize + " select pins)"); output = new boolean[outputlen]; select = new boolean[selectSize]; inputBitSet = new boolean[bitCount]; - + return this; } catch (NumberFormatException ne) { return error("Bad argument: " + args[0] + " expecting a number."); diff --git a/src/main/java/org/redstonechips/basiccircuits/display.java b/src/main/java/org/redstonechips/basiccircuits/display.java index 488dec3..955b9fa 100755 --- a/src/main/java/org/redstonechips/basiccircuits/display.java +++ b/src/main/java/org/redstonechips/basiccircuits/display.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.redstonechips.parsing.Parsing; + import org.bukkit.DyeColor; import org.bukkit.Location; import org.redstonechips.basiccircuits.screen.Screen; @@ -12,6 +12,7 @@ import org.redstonechips.memory.Memory; import org.redstonechips.memory.Ram; import org.redstonechips.memory.RamListener; +import org.redstonechips.parsing.Parsing; import org.redstonechips.util.BooleanArrays; import org.redstonechips.util.BooleanSubset; import org.redstonechips.wireless.Receiver; @@ -23,19 +24,19 @@ public class display extends Circuit { private Screen screen; private int xWordlength, yWordlength, colorWordlength; - + private Receiver receiver; - + private Ram ram; private RamListener ramListener; - + private long ramPage = 0; private int ramPageLength; - + @Override public void input(boolean state, int inIdx) { if (!inputs[0]) return; - + if (ram==null) { // set pixel processPixelInput(inputs, 1); @@ -55,7 +56,7 @@ public void receive(BooleanSubset bits) { int y = (int)bits.toUnsignedInt(xWordlength, yWordlength); int color = (int)bits.toUnsignedInt(xWordlength+yWordlength, colorWordlength); processPixelInput(x, y, color); // set pixel - } + } } private void processPixelInput(int x, int y, int color) { @@ -65,9 +66,9 @@ private void processPixelInput(int x, int y, int color) { if (chip.hasListeners()) debug(ie.getMessage()); } - if (chip.hasListeners()) debug("Setting (" + x + ", " + y + ") to " + color); + if (chip.hasListeners()) debug("Setting (" + x + ", " + y + ") to " + color); } - + private void processPixelInput(boolean[] bits, int startIdx) { int x = (int)BooleanArrays.toUnsignedInt(bits, startIdx, xWordlength); int y = (int)BooleanArrays.toUnsignedInt(bits, startIdx+xWordlength, yWordlength); @@ -75,13 +76,13 @@ private void processPixelInput(boolean[] bits, int startIdx) { processPixelInput(x, y, color); } - + class DisplayRamListener implements RamListener { @Override public void dataChanged(Ram ram, long address, boolean[] data) { int color = (int)BooleanArrays.toUnsignedInt(data); long offset = ramPage * ramPageLength; - + if (address >= offset && address < offset + ramPageLength) { long idx = address - offset; int x = (int)(idx % screen.getDescription().addrWidth); @@ -97,14 +98,14 @@ public void dataChanged(Ram ram, long address, boolean[] data) { } } } - + private void refreshDisplayFromRam() { long offset = ramPage * ramPageLength; for (long i=offset; i0) { String[] split = args[0].split("x"); if (split.length==2 && Parsing.isInt(split[0]) && Parsing.isInt(split[1])) { size = new int[] { Integer.parseInt(split[0]), Integer.parseInt(split[1]) }; - } + } } - - + + int start = (size==null?0:1); if (args.length>start) { // color index - + List colorList = new ArrayList<>(); - + for (int i=start; i structure = new ArrayList<>(Arrays.asList(chip.structure)); - + Location[][][] pixels = screen.getPixelBlocks(); int width = screen.getDescription().addrWidth; int height = screen.getDescription().addrHeight; - + for (int x=0; x Math.pow(2, outputlen)) + if (inputlen > Math.pow(2, outputlen)) return error("Number of inputs must be no more than 2 to the power of the number of outputs."); - else + else return this; } } diff --git a/src/main/java/org/redstonechips/basiccircuits/flipflop.java b/src/main/java/org/redstonechips/basiccircuits/flipflop.java index b4ab369..9fb6805 100755 --- a/src/main/java/org/redstonechips/basiccircuits/flipflop.java +++ b/src/main/java/org/redstonechips/basiccircuits/flipflop.java @@ -25,9 +25,9 @@ public void input(boolean state, int inIdx) { @Override public Circuit init(String[] args) { - if (outputlen!=inputlen && inputlen!=outputlen+1) + if (outputlen!=inputlen && inputlen!=outputlen+1) return error("Expecting the same number of inputs and outputs or one extra input reset pin."); - + resetPinMode = (inputlen==outputlen+1); if (activator!=null) clearOutputs(); diff --git a/src/main/java/org/redstonechips/basiccircuits/ipreceiver.java b/src/main/java/org/redstonechips/basiccircuits/ipreceiver.java index 79c5c68..7a3dfb5 100755 --- a/src/main/java/org/redstonechips/basiccircuits/ipreceiver.java +++ b/src/main/java/org/redstonechips/basiccircuits/ipreceiver.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; + import org.redstonechips.circuit.Circuit; import org.redstonechips.util.BitSetUtils; @@ -39,9 +40,9 @@ public void input(boolean state, int inIdx) { byte[] bytes = packet.getData(); BitSet bits = BitSet.valueOf(bytes); writeBitSet(bits, 1, outputlen-1); - + if (chip.hasListeners()) debug("Received " + BitSetUtils.bitSetToBinaryString(bits, 0, outputlen-1) + " from " + packet.getAddress() + ":" + packet.getPort()); - + // pulse the output clock pin. write(true, 0); write(false, 0); @@ -60,8 +61,8 @@ public void input(boolean state, int inIdx) { public Circuit init(String[] args) { if (outputlen<2) return error("Expecting at least 2 outputs. 1 output clock pin and 1 or more data pins."); if (inputlen!=1) return error("Expecting 1 clock input."); - if (args.length<2) return error("Expecting a port sign argument and at least one authorized incoming address."); - + if (args.length<2) return error("Expecting a port sign argument and at least one authorized incoming address."); + try { int port = Integer.decode(args[0]); try { diff --git a/src/main/java/org/redstonechips/basiccircuits/iptransmitter.java b/src/main/java/org/redstonechips/basiccircuits/iptransmitter.java index e217822..c4fbfc3 100755 --- a/src/main/java/org/redstonechips/basiccircuits/iptransmitter.java +++ b/src/main/java/org/redstonechips/basiccircuits/iptransmitter.java @@ -9,6 +9,7 @@ import java.util.BitSet; import java.util.logging.Level; import java.util.logging.Logger; + import org.redstonechips.RCPrefs; import org.redstonechips.circuit.Circuit; import org.redstonechips.parsing.Range; @@ -42,13 +43,13 @@ public Circuit init(String[] args) { address = InetAddress.getByName(args[0]); port = Integer.decode(args[1]); Object oRange = RCPrefs.getPref("iptransmitter.ports"); - if (oRange==null) + if (oRange==null) return error("No ports are allowed. Please set a port range by changing the iptransmitter.ports preferences key."); String sRange = oRange.toString(); Range portRange = new Range(sRange, Range.Type.OPEN_ALLOWED); if (!portRange.isInRange(port)) { - return error("Port " + port + " is not allowed. Use ports in the range of " + portRange.toString() + return error("Port " + port + " is not allowed. Use ports in the range of " + portRange.toString() + ". You can change the port range by changing the iptransmitter.ports preferences key."); } @@ -68,8 +69,8 @@ public Circuit init(String[] args) { private void udpBits(boolean[] bits, int start, int length) { BitSet out = new BitSet(length); - for (int i=0; i5) return error("Too many inputs. Expecting 1 clock pin and no more than 4 data pins."); else if (chip.interfaceBlocks.length==0) return error("Expecting at least 1 interface block."); - + if (args.length>0) { String channelString = null; List colorList = new ArrayList<>(); for (int i=0; i=0 && distance>maxDistance) return error("A distance value of " + distance + " is not allowed. The maximum value is " + maxDistance + "."); - + } catch (NumberFormatException ne2) { return error("Bad distance argument: " + args[i] + ". Expecting d{} or dist{}."); } @@ -74,8 +196,10 @@ public Circuit init(String[] args) { // color index if (!colorList.isEmpty()) { colorIndex = new byte[colorList.size()]; - for (int i=0; i=colorIndex.length) { @@ -131,29 +253,46 @@ private void updatePixel(boolean[] bits) { return; } color = colorIndex[index]; - } else - color = (byte)val; + } else color = (byte)val; - if (chip.hasListeners()) debug("Setting pixel color to " + DyeColor.getByData(color)); + if (chip.hasListeners()) debug("Setting pixel color to " + ColortoString(color)); - for (Location l : colorBlocks) l.getBlock().setData(color); + for (Location l : colorBlocks) { + Block b = l.getBlock(); + BlockState bState = b.getState(); + bState.setType(ColorSel(color)); + bState.update(true, false); + } } - private static void findColorBlocksAround(Location origin, Location curLocation, List coloredBlocks, int range, int curDist) { + @SuppressWarnings("incomplete-switch") + private static void findColorBlocksAround(Location origin, Location curLocation, List coloredBlocks, int range, int curDist) { if (curDist>=range) return; curDist++; for (BlockFace face : faces) { Location attached = Locations.getFace(curLocation, face); switch (attached.getBlock().getType()) { - case WOOL: - case STAINED_GLASS: - case STAINED_GLASS_PANE: - case STAINED_CLAY: + case WHITE_WOOL: + case ORANGE_WOOL: + case MAGENTA_WOOL: + case LIGHT_BLUE_WOOL: + case YELLOW_WOOL: + case LIME_WOOL: + case PINK_WOOL: + case GRAY_WOOL: + case LIGHT_GRAY_WOOL: + case CYAN_WOOL: + case PURPLE_WOOL: + case BLUE_WOOL: + case BROWN_WOOL: + case GREEN_WOOL: + case RED_WOOL: + case BLACK_WOOL: if (!coloredBlocks.contains(attached) && !attached.equals(origin) && inCube(origin, attached, range)) coloredBlocks.add(attached); - findColorBlocksAround(origin, attached, coloredBlocks, range, curDist); + findColorBlocksAround(origin, attached, coloredBlocks, range, curDist); } } } @@ -174,14 +313,14 @@ private int getMaxDistance() { if (oMaxDist != null && oMaxDist instanceof Integer) return (Integer)oMaxDist; else return -1; } - + class PixelReceiver extends Receiver { @Override public void receive(BooleanSubset bits) { - // if we have 0 or 1 inputs there's no clock to adjust. just use the incoming bits. + // if we have 0 or 1 inputs there's no clock to adjust. just use the incoming bits. boolean[] valbits; if (inputlen<=1) { - valbits = bits.copy(0, (inputlen==0?5:inputlen)); + valbits = bits.copy(0, bits.length()); } else { valbits = new boolean[bits.length()+1]; for (int i=0; i0) { + + if (args.length>0) { if (args[args.length-1].startsWith("#")) { // channel arg channel = args[args.length-1].substring(1); } - + if (args.length>=(channel!=null?2:1)) { try { type = Type.valueOf(args[0]); @@ -128,7 +133,7 @@ public Circuit init(String[] args) { return error("Expecting at least 3 inputs. 1 clock pin, 1 clear pin and 1 data pin."); } else if (display==DisplayMode.scroll && inputlen<4) { return error("Expecting at least 4 inputs. 1 clock pin, 1 clear pin, 1 scroll pin and 1 data pin."); - } + } } if (chip.interfaceBlocks.length==0) return error("Expecting at least 1 interface block."); @@ -136,8 +141,8 @@ public Circuit init(String[] args) { if (display==DisplayMode.replace) dataPin = 1; else if (display==DisplayMode.add) dataPin = 2; else if (display==DisplayMode.scroll) dataPin = 3; - - writer = SignWriter.getSignWriter(display, type, IOBlock.locationsOf(chip.interfaceBlocks)); + + writer = SignWriter.getSignWriter(display, type, IOBlock.locationsOf(chip.interfaceBlocks)); if (writer.getSigns().isEmpty()) { return error("Couldn't find any signs attached to the chip interface blocks."); } else { @@ -147,48 +152,48 @@ public Circuit init(String[] args) { chip.structure = str.toArray(new Location[str.size()]); info("Found " + writer.getSigns().size() + " sign(s) to print on."); } - + rc.addRCTypeReceiver(chip.activationBlock, this); - + if (channel!=null && !initReceiver(activator, channel, type)) return null; else return this; } - + private boolean initReceiver(CommandSender sender, String channel, Type type) { try { Receiver writeReceiver = new WriteReceiver(); writeReceiver.init(sender, channel, type==Type.ascii?8:32, this); - + if (writer.getDisplayMode()==DisplayMode.add) { Receiver clearReceiver = new ClearReceiver(); clearReceiver.init(sender, channel, 1, this); - + writeReceiver.setStartBit(writeReceiver.getStartBit()+1); } else if (writer.getDisplayMode()==DisplayMode.scroll) { Receiver clearReceiver = new ClearReceiver(); clearReceiver.init(sender, channel, 1, this); - + Receiver scrollReceiver = new ScrollReceiver(); scrollReceiver.init(sender, channel, 1, this); scrollReceiver.setStartBit(scrollReceiver.getStartBit()+1); - writeReceiver.setStartBit(writeReceiver.getStartBit()+2); - + writeReceiver.setStartBit(writeReceiver.getStartBit()+2); + } - + return true; } catch (IllegalArgumentException e) { error(e.getMessage()); return false; - } + } } - + @Override public void setInternalState(Map state) { Object text = state.get("text"); - if (text!=null) + if (text!=null) writer.setText(text.toString()); } @@ -202,5 +207,5 @@ public Map getInternalState() { @Override public boolean isStateless() { return false; - } + } } diff --git a/src/main/java/org/redstonechips/basiccircuits/pulse.java b/src/main/java/org/redstonechips/basiccircuits/pulse.java index 14faf86..fbdc65b 100755 --- a/src/main/java/org/redstonechips/basiccircuits/pulse.java +++ b/src/main/java/org/redstonechips/basiccircuits/pulse.java @@ -9,7 +9,7 @@ */ public class pulse extends Circuit { - public enum EdgeTriggering { positive, negative, doubleEdge }; + public enum EdgeTriggering { positive, negative, doubleEdge } private EdgeTriggering trigger = EdgeTriggering.positive; @@ -36,12 +36,12 @@ public Circuit init(String[] args) { if (inputlen!=outputlen && inputlen!=1) return error("Expecting the same number of inputs and outputs or 1 input."); - if (inputlen==0) + if (inputlen==0) return error("Expecting at least one input and one output."); - + if (args.length==0) interval = 1000; // 1 sec default - + if (args.length>=1) { try { interval = Math.round(UnitParser.parse(args[0])); diff --git a/src/main/java/org/redstonechips/basiccircuits/ramwatch.java b/src/main/java/org/redstonechips/basiccircuits/ramwatch.java index 2731b0f..0a00d73 100755 --- a/src/main/java/org/redstonechips/basiccircuits/ramwatch.java +++ b/src/main/java/org/redstonechips/basiccircuits/ramwatch.java @@ -2,6 +2,7 @@ package org.redstonechips.basiccircuits; import java.io.IOException; + import org.redstonechips.circuit.Circuit; import org.redstonechips.memory.Memory; import org.redstonechips.memory.Ram; @@ -14,14 +15,14 @@ public class ramwatch extends Circuit { private Ram ram; private RamListener ramListener; private long ramaddr; - + @Override public void input(boolean state, int inIdx) { if (inIdx==0) { debug("Chip " + (state?"enabled":"disabled") + "."); } } - + class RamWatchListener implements RamListener { @Override public void dataChanged(Ram ram, long address, boolean[] data) { @@ -31,7 +32,7 @@ public void dataChanged(Ram ram, long address, boolean[] data) { } } } - + @Override public Circuit init(String[] args) { if (args.length >= 1) { @@ -41,32 +42,32 @@ public Circuit init(String[] args) { ramaddr = Long.decode(args[1]); else ramaddr = -1; - + ram = (Ram)Memory.getMemory(args[0].substring(1), Ram.class); } catch (NumberFormatException | IOException e) { return error(e.getMessage()); } } else return error("Invalid argument: " + args[0]); } else return error("Expected at least one argument, the memory id to watch."); - - if (inputlen < 1 || outputlen < 1) + + if (inputlen < 1 || outputlen < 1) return error("Expected at least one input and output. Found " + inputlen + " input(s) and " + outputlen + " output(s)."); - + if (activator!=null) clearOutputs(); - + if (ram != null) { ramListener = new RamWatchListener(); ram.addListener(ramListener); - + if (ramaddr==-1) info("Created ram watcher targeting any address of memory $"+ram.getId() + "."); else info("Created ram watcher targeting $"+ram.getId()+"@"+Long.toHexString(ramaddr) + "."); return this; - } else + } else return error("Couldn't find ram to watch."); } - + @Override public void shutdown() { if (ram != null) { @@ -74,7 +75,7 @@ public void shutdown() { ram.release(); } } - + @Override public boolean isStateless() { return false; diff --git a/src/main/java/org/redstonechips/basiccircuits/random.java b/src/main/java/org/redstonechips/basiccircuits/random.java index 2ea2282..d755a24 100755 --- a/src/main/java/org/redstonechips/basiccircuits/random.java +++ b/src/main/java/org/redstonechips/basiccircuits/random.java @@ -2,6 +2,7 @@ import java.util.Random; + import org.redstonechips.circuit.Circuit; @@ -38,7 +39,7 @@ public Circuit init(String[] args) { setAll = false; } else return error("Expecting either the same amount of inputs and outputs, or exactly 1 input."); - + return this; } } diff --git a/src/main/java/org/redstonechips/basiccircuits/receiver.java b/src/main/java/org/redstonechips/basiccircuits/receiver.java index ee56348..17059c8 100755 --- a/src/main/java/org/redstonechips/basiccircuits/receiver.java +++ b/src/main/java/org/redstonechips/basiccircuits/receiver.java @@ -12,14 +12,14 @@ public class receiver extends Circuit { private int dataPin; private Receiver rec; - + @Override public void input(boolean state, int inIdx) {} @Override public Circuit init(String[] args) { if (outputlen==0) return error("Expecting at least 1 output pin."); - + if (args.length>0) { try { dataPin = (outputlen==1?0:1); @@ -35,14 +35,14 @@ public Circuit init(String[] args) { class ReceiverImpl extends Receiver { @Override - public void receive(BooleanSubset bits) { + public void receive(BooleanSubset bits) { if (chip.hasListeners()) debug("Received " + bits.toString()); writeBooleanSubset(bits, dataPin, outputlen-dataPin); if (outputlen>1) { write(true, 0); write(false, 0); } - } + } } @Override diff --git a/src/main/java/org/redstonechips/basiccircuits/repeater.java b/src/main/java/org/redstonechips/basiccircuits/repeater.java index ed3083c..6eefecf 100755 --- a/src/main/java/org/redstonechips/basiccircuits/repeater.java +++ b/src/main/java/org/redstonechips/basiccircuits/repeater.java @@ -10,7 +10,7 @@ public class repeater extends Circuit { int outputSets; int outputSetSize; - + @Override public void input(boolean state, int inIdx) { if (outputSets==0) @@ -21,15 +21,15 @@ public void input(boolean state, int inIdx) { } @Override - public Circuit init(String[] args) { + public Circuit init(String[] args) { if (inputlen<1) return error("Expecting at least 1 input pin."); if (outputlen<1) return error("Expecting at least 1 output pin."); - + if (inputlen == 1) outputSets = 0; //optimize for original function else outputSets = outputlen/inputlen; - + if (outputSets != 0) { if (outputlen != inputlen*outputSets) return error("Tried to split "+outputlen+" into "+outputSets+", expected "+(inputlen*outputSets)+" outputs."); @@ -46,7 +46,7 @@ public Circuit init(String[] args) { else info("Splitting 1 bit into "+outputlen+"."); } - + return this; } } diff --git a/src/main/java/org/redstonechips/basiccircuits/ringcounter.java b/src/main/java/org/redstonechips/basiccircuits/ringcounter.java index b2d0d23..1df4653 100755 --- a/src/main/java/org/redstonechips/basiccircuits/ringcounter.java +++ b/src/main/java/org/redstonechips/basiccircuits/ringcounter.java @@ -2,6 +2,7 @@ package org.redstonechips.basiccircuits; import java.util.BitSet; + import org.redstonechips.circuit.Circuit; /** diff --git a/src/main/java/org/redstonechips/basiccircuits/router.java b/src/main/java/org/redstonechips/basiccircuits/router.java index ed3c3fc..6294ead 100755 --- a/src/main/java/org/redstonechips/basiccircuits/router.java +++ b/src/main/java/org/redstonechips/basiccircuits/router.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + import org.redstonechips.circuit.Circuit; /** @@ -41,7 +42,7 @@ public void input(boolean state, int inIdx) { writeBits(register, 0, outputlen); } - + } @Override @@ -56,7 +57,7 @@ public Circuit init(String[] args) { if (split.length!=2) return error("Bad routing entry: " + arg); try { - Integer input = Integer.decode(split[0]); + Integer input = Integer.decode(split[0]); Integer output; if (split[1].equalsIgnoreCase("all")) { output = -1; diff --git a/src/main/java/org/redstonechips/basiccircuits/screen/Screen.java b/src/main/java/org/redstonechips/basiccircuits/screen/Screen.java index 1de342c..5ebf312 100755 --- a/src/main/java/org/redstonechips/basiccircuits/screen/Screen.java +++ b/src/main/java/org/redstonechips/basiccircuits/screen/Screen.java @@ -4,35 +4,87 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.block.BlockState; /** * * @author Tal Eisenberg */ public class Screen { - + public static final Material[] materials = new Material[] { - Material.WOOL, - Material.CARPET, - Material.STAINED_CLAY, - Material.STAINED_GLASS_PANE, - Material.STAINED_GLASS, + Material.WHITE_WOOL, + Material.ORANGE_WOOL, + Material.MAGENTA_WOOL, + Material.LIGHT_BLUE_WOOL, + Material.YELLOW_WOOL, + Material.LIME_WOOL, + Material.PINK_WOOL, + Material.GRAY_WOOL, + Material.LIGHT_GRAY_WOOL, + Material.CYAN_WOOL, + Material.PURPLE_WOOL, + Material.BLUE_WOOL, + Material.BROWN_WOOL, + Material.GREEN_WOOL, + Material.RED_WOOL, + Material.BLACK_WOOL, }; - public enum Axis {X,Y,Z}; + public enum Axis {X,Y,Z} + + public Material ColorSel(int colornum) { + switch(colornum) + { + case 0 : + return(Material.WHITE_WOOL); + case 1 : + return(Material.ORANGE_WOOL); + case 2 : + return(Material.MAGENTA_WOOL); + case 3 : + return(Material.LIGHT_BLUE_WOOL); + case 4 : + return(Material.YELLOW_WOOL); + case 5 : + return(Material.LIME_WOOL); + case 6 : + return(Material.PINK_WOOL); + case 7 : + return(Material.GRAY_WOOL); + case 8 : + return(Material.LIGHT_GRAY_WOOL); + case 9 : + return(Material.CYAN_WOOL); + case 10 : + return(Material.PURPLE_WOOL); + case 11 : + return(Material.BLUE_WOOL); + case 12 : + return(Material.BROWN_WOOL); + case 13 : + return(Material.GREEN_WOOL); + case 14 : + return(Material.RED_WOOL); + case 15 : + return(Material.BLACK_WOOL); + } + + return(Material.WHITE_WOOL); + } private final ScreenDescription ds; - + private byte[] colorIndex = null; - + private int colorLength = 4; - + private final Location[][][] pixels; private final byte[][] memory; private Screen(ScreenDescription ds) { this.ds = ds; - + int pixelWidth = (int)Math.ceil(ds.physicalWidth/ds.addrWidth); int pixelHeight = (int)Math.ceil(ds.physicalHeight/ds.addrHeight); pixels = new Location[ds.addrWidth][ds.addrHeight][Math.abs(pixelWidth*pixelHeight)]; @@ -42,40 +94,41 @@ private Screen(ScreenDescription ds) { pixels[x][y] = findPixelBlocks(ds.origin, x, y, ds.widthAxis, ds.heightAxis, pixelWidth, pixelHeight); } } - + ds.pixelWidth = pixelWidth; ds.pixelHeight = pixelHeight; - memory = new byte[ds.addrWidth][ds.addrHeight]; + memory = new byte[ds.addrWidth][ds.addrHeight]; } - - public void setColorIndex(byte[] index) { + + public void setColorIndex(byte[] index) { this.colorIndex = index; if (colorIndex==null) colorLength = 4; - else colorLength = calculateBitLength(colorIndex.length); + else colorLength = calculateBitLength(colorIndex.length); } - + public ScreenDescription getDescription() { return ds; } - + public int getColorLength() { return colorLength; } - + public int getXLength() { return calculateBitLength(ds.addrWidth); } - + public int getYLength() { return calculateBitLength(ds.addrHeight); } - + public Location[][][] getPixelBlocks() { return pixels; } - + public void setPixel(int x, int y, int data, boolean checkMemory) { byte color; + if (colorIndex!=null) { if (data>=colorIndex.length) { throw new IllegalArgumentException("Color index " + data + " is out of bounds."); @@ -87,51 +140,53 @@ public void setPixel(int x, int y, int data, boolean checkMemory) { if (x>=ds.addrWidth || y>=ds.addrHeight) { throw new IllegalArgumentException("Pixel (" + x + ", " + y + ") is out of bounds."); } - + Location[] pixel = pixels[x][y]; if (!checkMemory || memory[x][y]!=color) { for (Location l : pixel) { Block b = l.getBlock(); + BlockState bState = b.getState(); for (Material m : Screen.materials) { if (b.getType()==m) { - b.setData(color); - break; + bState.setType(ColorSel(color)); + bState.update(true, true); + break; } } } memory[x][y] = color; - } + } } - + public void clear() { for (int y=0; y0) { - if (args[0].equalsIgnoreCase("right")) shiftRight = true; - else if (args[0].equalsIgnoreCase("left")) shiftRight = false; - else return error("Invalid argument: " + args[0] + " expecting right|aright|left."); + if (args[0].equalsIgnoreCase("right")) shiftRight = true; + else if (args[0].equalsIgnoreCase("left")) shiftRight = false; + else return error("Invalid argument: " + args[0] + " expecting right|aright|left."); } - + if (activator!=null) clearOutputs(); register = new boolean[outputlen]; - + return this; } diff --git a/src/main/java/org/redstonechips/basiccircuits/sram.java b/src/main/java/org/redstonechips/basiccircuits/sram.java index 44ce54e..ab5210f 100755 --- a/src/main/java/org/redstonechips/basiccircuits/sram.java +++ b/src/main/java/org/redstonechips/basiccircuits/sram.java @@ -3,8 +3,7 @@ import java.io.IOException; import java.util.logging.Level; -import org.redstonechips.paging.LineSource; -import org.redstonechips.parsing.Range; + import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -14,7 +13,9 @@ import org.redstonechips.memory.Memory; import org.redstonechips.memory.Ram; import org.redstonechips.memory.RamListener; +import org.redstonechips.paging.LineSource; import org.redstonechips.paging.Pager; +import org.redstonechips.parsing.Range; import org.redstonechips.util.BooleanArrays; /** @@ -30,14 +31,14 @@ public class sram extends Circuit implements RCTypeReceiver, RamListener { int disablePin; int addressPin; int dataPin; - + boolean readOnlyMode; boolean sramDisable = false; boolean readWrite = false; boolean anonymous = true; - + @Override public void input(boolean state, int inIdx) { if (inIdx==readWritePin) { @@ -98,10 +99,10 @@ public Circuit init(String[] args) { if (outputlen==0) return error("Expecting at least 1 output pin."); if (addressLength<1) { - if (readOnlyMode) return error("Expecting at least 1 control pin, and 1 address input pin."); + if (readOnlyMode) return error("Expecting at least 1 control pin, and 1 address input pin."); else return error("Expecting at least 2 control pins, 1 address input pin, and " + wordLength + " data pins."); } - + try { if (args.length>0) { anonymous = false; @@ -116,22 +117,22 @@ public Circuit init(String[] args) { } catch (IllegalArgumentException e) { return error(e.getMessage()); } - + if (!readOnlyMode) { readWrite = inputs[readWritePin]; } - + sramDisable = inputs[disablePin]; - + rc.addRCTypeReceiver(chip.activationBlock, this); if (activator!=null) clearOutputs(); if (readWrite && !sramDisable) { readMemory(); } - + memory.addListener(this); info("This sram chip can hold up to " + Math.pow(2, addressLength) + "x" + wordLength + " bits. Memory data will be stored at " + ChatColor.YELLOW + memory.getFile().getPath()); - + return this; } @@ -159,7 +160,7 @@ private void readMemory() { if (chip.hasListeners()) debug("Reading " + BooleanArrays.toPrettyString(data, wordLength) + " from address " + address); writeBits(data, 0, wordLength); } - + @Override public void type(String[] words, Player player) { if (words.length==0) return; @@ -173,9 +174,9 @@ public void type(String[] words, Player player) { String ascii = b.toString(); for (int i=0; i0) { + boolean instrumentarg = false; + + inst = instrument[11]; + + if (args.length>0) { if (args[args.length-1].startsWith("#")) { // channel arg channel = args[args.length-1].substring(1); } - - if (args.length>=(channel!=null?2:1)) { - indexedPitch = true; - pitchIndex = new byte[(channel==null?args.length:args.length-1)]; - for (int i=0; i=(channel!=null?2:1)) { + indexedPitch = true; + pitchIndex = new byte[(channel==null?args.length:args.length-1)]; + for (int i=0; i=(channel!=null?3:2)) { + indexedPitch = true; + pitchIndex = new byte[(channel==null?args.length-1:args.length-2)]; + for (int i=0; i6 && !indexedPitch) + + if (chip.interfaceBlocks.length==0) return error("Expecting at least 1 interface block."); + if (inputlen!=0) { + + if (indexedPitch && instrumentPins) { + if (inputlen<(5+Math.ceil(Math.log(pitchIndex.length)/Math.log(2)))) { + if (channel!=null) return error("Not enough inputs. Indexed mode with instrument selection requires 1 clock pin, 4 instrument pins and " + (int)Math.ceil(Math.log(pitchIndex.length)/Math.log(2)) + " pitch index pins. You have a channel listed, this mode will run with 0 inputs"); + else return error("Not enough inputs. Indexed mode with instrument selection requires 1 clock pin, 4 instrument pins and " + (int)Math.ceil(Math.log(pitchIndex.length)/Math.log(2)) + " pitch index pins"); + } + if (inputlen>(5+Math.ceil(Math.log(pitchIndex.length)/Math.log(2)))) { + return error("Too many inputs. Indexed mode with instrument selection requires 1 clock pin, 4 instrument pins and " + (int)Math.ceil(Math.log(pitchIndex.length)/Math.log(2)) + " pitch index pins"); + } + } + + else if (inputlen>6 && !indexedPitch && !instrumentPins) return error("Too many inputs. Direct mode requires 1 clock pin and no more than 5 data pins."); - else if (channel==null && inputlen==0) - return error("Expecting at least 1 input pin."); + else if (inputlen>10 && !indexedPitch && instrumentPins) + return error("Too many inputs. Direct mode with instrument selection requires 1 clock pin and no more than 9 data pins."); + else if (inputlen<6 && !indexedPitch && instrumentPins) { + if (channel!=null) return error("Not enough inputs. Expecting 1 clock pin and at 4 instrument pins. You have a channel listed, this mode will run with 0 inputs"); + else return error("Not enough inputs. Expecting 1 clock pin and at 4 instrument pins."); + } + } + if (channel==null && inputlen==0) { // if no channel and no clock pin + return error("Expecting at least 1 input pin."); + } if (channel!=null) { int len; - if (indexedPitch) len = (int)Math.ceil(Math.log(pitchIndex.length)/Math.log(2)); + if (indexedPitch && !instrumentPins) len = (int)Math.ceil(Math.log(pitchIndex.length)/Math.log(2)); + else if (indexedPitch && instrumentPins) len = (int)Math.ceil(Math.log(pitchIndex.length)/Math.log(2) + 4); + else if (instrumentPins) len = 9; else len = 5; - + try { receiver = new SynthReceiver(); receiver.init(activator, channel, len, this); } catch (IllegalArgumentException e) { return error(e.getMessage()); - } + } + } - + return this; } - private void playNote(int val) { + private void playNote2(int val) { byte pitch; if (indexedPitch) { @@ -124,12 +265,10 @@ private void playNote(int val) { } private void tryToPlay(Block block, byte pitch) { - if (block.getType()==Material.NOTE_BLOCK) { - NoteBlock n = (NoteBlock)block.getState(); - try { - n.setNote(new Note(pitch)); - n.play(); - } catch (NullPointerException npe) {} + if (block.getType()==Material.NOTE_BLOCK) { + for (Player player : Bukkit.getServer().getOnlinePlayers()) { + player.playNote(block.getLocation(), inst, new Note(pitch)); + } } } diff --git a/src/main/java/org/redstonechips/basiccircuits/terminal.java b/src/main/java/org/redstonechips/basiccircuits/terminal.java index ffdd186..8bca8b6 100755 --- a/src/main/java/org/redstonechips/basiccircuits/terminal.java +++ b/src/main/java/org/redstonechips/basiccircuits/terminal.java @@ -3,8 +3,8 @@ import org.bukkit.entity.Player; import org.redstonechips.RCTypeReceiver; -import org.redstonechips.circuit.Circuit; import org.redstonechips.chip.io.InterfaceBlock; +import org.redstonechips.circuit.Circuit; import org.redstonechips.util.BooleanArrays; import org.redstonechips.wireless.Transmitter; @@ -18,9 +18,9 @@ private enum DataType { ascii, num } private boolean[] register; private DataType type = DataType.ascii; private boolean eot; - + private Transmitter transmitter; - + @Override public void input(boolean state, int inIdx) { if (inIdx==0 && state) { @@ -33,7 +33,7 @@ public void input(boolean state, int inIdx) { public Circuit init(String[] args) { eot = false; String channelArg = null; - + if (args.length>0 && args[args.length-1].startsWith("#")) { // last argument is a channel name channelArg = args[args.length-1].substring(1); @@ -41,10 +41,10 @@ public Circuit init(String[] args) { if (newArgs.length>0) System.arraycopy(args, 0, newArgs, 0, newArgs.length); - args = newArgs; - } + args = newArgs; + } + - if (args.length>0) { try { type = DataType.valueOf(args[0]); @@ -55,7 +55,7 @@ public Circuit init(String[] args) { if (args.length>1) { if (args[1].equalsIgnoreCase("eot")) { eot = true; - } else + } else return error("Unknown argument: " + args[1]); } } @@ -64,11 +64,11 @@ public Circuit init(String[] args) { if (type==DataType.ascii && outputlen!=9 && outputlen!=10) return error("Expecting 9-10 outputs. 1 clock output, an optional end-of-text output and 8 data outputs."); else if (type==DataType.num && outputlen<2) - return error("Expecting at least 2 outputs. 1 clock output and 1 or more data outputs."); + return error("Expecting at least 2 outputs. 1 clock output and 1 or more data outputs."); } if (chip.interfaceBlocks.length==0) return error("Expecting at least one interface block."); - + for (InterfaceBlock i : chip.interfaceBlocks) rc.addRCTypeReceiver(i.getLocation(), this); @@ -82,11 +82,11 @@ else if (type==DataType.num && outputlen<2) if (eot) len = 33; else len = 32; } - + transmitter = new Transmitter(); transmitter.init(activator, channelArg, len, this); } - + return this; } @@ -105,14 +105,14 @@ public void type(String[] words, Player player) { String typeString = ""; for (String a : words) typeString += a + " "; - + if (type==DataType.ascii) { int datapin = (outputlen==9?1:2); for (int i=0; i0) { List smodules = new ArrayList<>(); - + try { for (String arg : args) { if (arg.toLowerCase().startsWith("select(") && arg.toLowerCase().endsWith(")")) { @@ -63,18 +64,18 @@ public Circuit init(String[] args) { return error("Expecting at least " + (2+selectLength) + " inputs for select mode."); } catch (NumberFormatException ne) { return error("Bad select length argument: " + args[1]); - } + } selectMode = true; - } else { + } else { smodules.add(arg); - } + } } - + if (smodules.isEmpty()) return error("Can't find any channel names."); modules = new Transmitter[smodules.size()]; baseStartBit = new int[modules.length]; - + for (int i=0; i