def _build_inputs(self):
     commands = []
     for x in range(self.length + 1):
         if x % 2 == 0:
             continue
         elif x == 1:
             commands.append(
                 fill(Position(x, 2, 0), Position(x, 2, self.width),
                      base_block()))
             commands.append(
                 fill(Position(x, 3, 0), Position(x, 3, self.width),
                      redstone_dust()))
             if self.input_side == 'left':
                 for z in range(0, self.width, 16):
                     commands.append(
                         setblock(Position(x, 3, z), repeater(facing='+z')))
             if self.input_side == 'right':
                 for z in range(self.width, 0, -16):
                     commands.append(
                         setblock(Position(x, 3, z), repeater(facing='-z')))
         else:
             commands.append(
                 clone(Position(1, 2, 0), Position(1, 3, self.width),
                       Position(x, 2, 0)))
     return commands
	def build_structure(self, commands, x, z):
		commands.append(fill(Position(x+1,0,z+0), Position(x+1,0,z+1), base_block()))
		commands.append(fill(Position(x+1,1,z+0), Position(x+1,1,z+1), redstone_dust()))
		commands.append(setblock(Position(x+0,1,z+0), base_block()))
		commands.append(fill(Position(x+0,2,z+0), Position(x+1,2,z+0), base_block()))
		commands.append(fill(Position(x+0,3,z+0), Position(x+1,3,z+0), redstone_dust()))
		commands.append(setblock(Position(x+1,2,z+1), redstone_torch('+z')))
	def place_output_repeater(self, commands, x, z, direction, left, left_downline):
		if left == None or left_downline == None:
			commands.append(setblock(Position(x+1,1,z+0), repeater(direction)))
		elif type(left.build_handler) == LeftDoubleOff or type(left_downline.build_handler) == LeftDoubleOff:
			commands.append(setblock(Position(x+1,1,z-1), repeater(direction)))
		else:
			commands.append(setblock(Position(x+1,1,z+0), repeater(direction)))
			
예제 #4
0
    def _build_module_7(self, x, y):
        X = x * 2
        Y = y * 2
        self.commands.append(
            fill(Position(X, -3, Y), Position(X, -1, Y), base_block()))
        self.commands.append(setblock(Position(X, -2, Y), repeater('-z')))
        self.commands.append(setblock(Position(X, 0, Y), redstone_dust()))

        self.commands.append(setblock(Position(X, -2, Y + 1), base_block()))
        self.commands.append(setblock(Position(X, -1, Y + 1), redstone_dust()))
예제 #5
0
 def _build_module_2(self, x, y):
     self.commands.append(
         setblock(Position(x * 2, -2, y * 2 + 1), base_block()))
     self.commands.append(setblock(Position(x * 2, -3, y * 2),
                                   base_block()))
     self.commands.append(
         setblock(Position(x * 2, -2, y * 2), repeater('+z')))
     self.commands.append(
         fill(Position(x * 2, -1, y * 2), Position(x * 2, -1, y * 2 + 1),
              base_block()))
     self.commands.append(
         fill(Position(x * 2, 0, y * 2), Position(x * 2, 0, y * 2 + 1),
              redstone_dust()))
예제 #6
0
 def _build_inputs(self):
     self.commands.append(
         fill(Position(2, -2, 0), Position(2, -2, 1), base_block()))
     self.commands.append(setblock(Position(2, -1, 0), repeater('+z')))
     self.commands.append(setblock(Position(2, -1, 1), redstone_dust()))
     availableLanes = 1
     leftToBuild = len(self.modules[0]) - 1
     x = 1
     while leftToBuild > 0:
         toCopy = min(availableLanes, leftToBuild)
         depth = toCopy * 2 - 1
         self.commands.append(
             clone(Position(2, -2, 0), Position(2 + depth, -1, 1),
                   Position(x * 2 + 2, -2, 0)))
         availableLanes += toCopy
         leftToBuild -= toCopy
         x += toCopy
예제 #7
0
 def _build_module_1(self, x, y):
     self.commands.append(
         fill(Position(x * 2, -2, y * 2), Position(x * 2, -2, y * 2 + 1),
              base_block()))
     self.commands.append(
         fill(Position(x * 2, -1, y * 2), Position(x * 2, -1, y * 2 + 1),
              redstone_dust()))
     self.commands.append(
         setblock(Position(x * 2 + 1, -2, y * 2 + 1), redstone_torch('+x')))
예제 #8
0
 def _build_module_3(self, x, y):
     X = x * 2
     Y = y * 2
     self.commands.append(setblock(Position(X, -2, Y + 1), base_block()))
     self.commands.append(setblock(Position(X, -3, Y), base_block()))
     self.commands.append(setblock(Position(X, -1, Y + 1), redstone_dust()))
     self.commands.append(setblock(Position(X, -2, Y), redstone_dust()))
     self.commands.append(setblock(Position(X + 1, -4, Y), base_block()))
     self.commands.append(setblock(Position(X + 1, -3, Y), repeater('+x')))
     self.commands.append(setblock(Position(X + 2, -3, Y), base_block()))
예제 #9
0
    def _build_modules(self):
        self.moduleLocationX = [0] * 8
        self.moduleLocationY = [0] * 8
        for y in range(len(self.modules)):
            for x in range(len(self.modules[y])):
                besty = 0
                bestcount = 0
                for py in range(y - 1, -1,
                                -1):  # for every module below this one
                    if self.modules[y][x] == self.modules[py][
                            x]:  # if the module below matches
                        px = x
                        while px < len(self.modules[y]) and self.modules[y][
                                px] == self.modules[py][px]:
                            px += 1  # find the first pair of self.modules to the right that doesn't match
                        count = px - x - 1
                        #get the difference between the two
                        if count > bestcount:
                            bestcount = count
                            besty = py  #take the greatest count and lock in that line
                    # in other words, this algorithm finds the longest pair of matching lines
                        # this of course happens every iteration
                if bestcount > 1:  #clone the line to save on some commands
                    self._copy_module_line(x + 1, besty + 1, bestcount, x + 1,
                                           y + 1)
                    x += bestcount
                    if x >= len(
                            self.modules[y]
                    ):  # skip the line if it was successfully able to copy it in it's entirty
                        break

                module = self.modules[y][x]
                builder_function = [
                    self._build_module_0, self._build_module_1,
                    self._build_module_2, self._build_module_3,
                    self._build_module_4, self._build_module_5,
                    self._build_module_6, self._build_module_7
                ]
                if self.moduleLocationX[module] == 0 and self.moduleLocationY[
                        module] == 0:
                    builder_function[module](x + 1, y + 1)
                    self.moduleLocationX[module] = x + 1
                    self.moduleLocationY[module] = y + 1
                else:
                    self._copy_module(
                        self.moduleLocationX[module],
                        self.moduleLocationY[module], x + 1,
                        y + 1)  #these copy the module if it was built before
                    if module == 3:
                        self.commands.append(
                            setblock(Position(x * 2 + 4, -3, y * 2 + 2),
                                     base_block()))
        self._build_inputs()
 def _place_torches(self):
     commands = []
     for x in range(self.length):
         if x % 2 == 1:
             continue
         for z in range(self.width):
             if z % 2 == 1:
                 continue
             if self.table[int(x / 2)][int(z / 2)] == '1':
                 commands.append(
                     setblock(Position(x, 2, z),
                              redstone_torch(facing='-x')))
     if self.input_side == 'left':
         for command in commands:
             command.translate(0, 0, 1)
     return commands
예제 #11
0
    def _build_module_5(self, x, y):
        X = x * 2
        Y = y * 2
        self.commands.append(setblock(Position(X, -1, Y), base_block()))
        self.commands.append(setblock(Position(X, 0, Y), redstone_dust()))

        self.commands.append(setblock(Position(X, -2, Y + 1), base_block()))
        self.commands.append(setblock(Position(X, -1, Y + 1), redstone_dust()))

        self.commands.append(setblock(Position(X, 0, Y + 1), base_block()))
        self.commands.append(setblock(Position(X, 1, Y + 1), redstone_dust()))
예제 #12
0
 def _place_repeaters(self):
     # Input Lanes
     for x in range(len(self.modules[0])):
         X = x * 2 + 2
         for y in range(7, len(self.modules), 7):
             module = self.modules[y][x]
             if module == 4 or module == 5: y -= 1
             module = self.modules[y][x]
             Y = y * 2 + 2
             if module == 0 or module == 1:
                 self.commands.append(
                     setblock(Position(X, -1, Y), repeater('+z')))
             elif module == 2:
                 self.commands.append(
                     fill(Position(X, 0, Y), Position(X, -1, Y + 1), air()))
                 self.commands.append(
                     setblock(Position(X, -1, Y + 1), redstone_dust()))
             elif module == 3:
                 self.commands.append(
                     setblock(Position(X, -1, Y - 1), repeater('+z')))
                 self.commands.append(
                     setblock(Position(X, -1, Y), base_block()))
             elif module == 6 or module == 7:
                 self.commands.append(
                     setblock(Position(X, 0, Y), repeater('+z')))
                 self.commands.append(
                     setblock(Position(X, 0, Y + 1), base_block()))
     # Output Lanes
     repeaterDir = '+x'
     if self.right: repeaterDir = '-x'
     for x in range(7, len(self.modules[0]), 7):
         X = x * 2 + 2
         for y in range(len(self.modules)):
             Y = y * 2 + 2
             module = self.modules[y][x]
             if module == 1 or module == 6:
                 self.commands.append(
                     setblock(Position(X, -3, Y + 1),
                              repeater(repeaterDir)))
             else:
                 self.commands.append(
                     setblock(Position(X + 1, -3, Y + 1),
                              repeater(repeaterDir)))
 def _build_outputs(self):
     commands = []
     for z in range(self.width):
         if z % 2 == 1:
             continue
         elif z == 0:
             commands.append(
                 fill(Position(0, 0, z), Position(self.length, 0, z),
                      base_block()))
             commands.append(
                 fill(Position(0, 1, z), Position(self.length, 1, z),
                      redstone_dust()))
             for x in range(15, self.length, 16):
                 commands.append(
                     setblock(Position(x, 1, 0), repeater(facing='-x')))
         else:
             commands.append(
                 clone(Position(0, 0, 0), Position(self.length, 1, 0),
                       Position(0, 0, z)))
     if self.input_side == 'left':
         for command in commands:
             command.translate(0, 0, 1)
     return commands
예제 #14
0
 def generate_build(self, pos_x, pos_y, pos_z, rotation):
     self._add_command(
         setblock(Position(pos_x, pos_y, pos_z), base_block()))
     self._rotate(rotation)
	def place_input_repeater(self, commands, x, z):
		commands.append(setblock(Position(x+0,3,z+0), repeater('+x')))
예제 #16
0
 def generate_build(self, pos_x, pos_y, pos_z):
     self._add_command(setblock(Position(0, 0, 0), base_block()))
     self._translate(pos_x, pos_y, pos_z)
예제 #17
0
 def generate_build(self, pos_x, pos_y, pos_z, rotation):
     self._add_command(
         setblock(Position(pos_x, pos_y, pos_z), repeater('+x')))
     self._rotate(rotation)
예제 #18
0
 def generate_build(self, pos_x, pos_y, pos_z, rotation):
     self._add_command(
         setblock(Position(pos_x, pos_y, pos_z),
                  redstone_torch('-x')))
     self._rotate(rotation)
예제 #19
0
 def generate_build(self, pos_x, pos_y, pos_z):
     self._add_command(
         setblock(Position(pos_x, pos_y, pos_z), redstone_dust()))
예제 #20
0
 def place_input_repeater(self, commands, x, z):
     commands.append(
         fill(Position(x + 0, 3, z + 0), Position(x + 1, 4, z + 0), air()))
     commands.append(setblock(Position(x + 1, 3, z + 0), redstone_dust()))
 def place_output_repeater(self, commands, x, z, direction, left,
                           left_downline):
     commands.append(
         setblock(Position(x + 1, 1, z + 1), repeater(direction)))