diff --git a/blocks/CCRednet/block_design.json b/blocks/CCRednet/block_design.json
new file mode 100644
index 0000000..a9618dd
--- /dev/null
+++ b/blocks/CCRednet/block_design.json
@@ -0,0 +1,177 @@
+{
+ "rednet_open": {
+ "message0": "Open modem at %1 of computer",
+ "args0": [
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["All", "all"],
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 20,
+ "tooltip": "Opens a modem with the given peripheral name, allowing it to send and receive messages over rednet."
+ },
+ "rednet_close": {
+ "message0": "Close modem at %1 of computer",
+ "args0": [
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["All", "all"],
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 20,
+ "tooltip": "Opens a modem with the given peripheral name, allowing it to send and receive messages over rednet."
+ },
+ "rednet_isopen": {
+ "message0": "Is modem at %1 of computer",
+ "args0": [
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["All", "all"],
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "output": "Boolean",
+ "colour": 20,
+ "tooltip": "Determine if rednet is currently open."
+ },
+ "rednet_send": {
+ "message0": "Send %1 to computer id %2 with protocol %3",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "DATA"
+ },
+ {
+ "type": "input_value",
+ "name": "ID",
+ "check": "Number"
+ },
+ {
+ "type": "input_value",
+ "name": "PROTO",
+ "check": "String"
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 20,
+ "tooltip": "Allows a computer or turtle with an attached modem to send a message intended for a computer with a specific ID."
+ },
+ "rednet_broadcast": {
+ "message0": "Broadcast %1 with protocol %2",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "DATA"
+ },
+ {
+ "type": "input_value",
+ "name": "PROTO",
+ "check": "String"
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 20,
+ "tooltip": "Broadcasts a string message over the predefined CHANNEL_BROADCAST channel."
+ },
+ "rednet_receive": {
+ "message0": "Receive data with protocol %1 and timeout waiting for %2",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "PROTO",
+ "check": "String"
+ },
+ {
+ "type": "input_value",
+ "name": "TIMEOUT",
+ "check": "Number"
+ }
+ ],
+ "output": "Multiple",
+ "colour": 20,
+ "tooltip": "Wait for a rednet message to be received, or until nTimeout seconds have elapsed."
+ },
+ "rednet_host": {
+ "message0": "Start Host protocol %1 with hostname %2",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "PROTO",
+ "check": "String"
+ },
+ {
+ "type": "input_value",
+ "name": "NAME",
+ "check": "String"
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 20,
+ "tooltip": "Register the system as 'hosting' the desired protocol under the specified name."
+ },
+ "rednet_unhost": {
+ "message0": "Stop Host protocol %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "PROTO",
+ "check": "String"
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 20,
+ "tooltip": "Stop hosting a specific protocol, meaning it will no longer respond to rednet.lookup requests."
+ },
+ "rednet_lookup": {
+ "message0": "Find Hostname %1 with protocol %2",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "NAME",
+ "check": "String"
+ },
+ {
+ "type": "input_value",
+ "name": "PROTO",
+ "check": "String"
+ }
+ ],
+ "output": "Number",
+ "colour": 20,
+ "tooltip": "Search the local rednet network for systems hosting the desired protocol and returns any computer IDs that respond as 'registered' against it."
+ }
+}
diff --git a/blocks/CCRednet/generator.js b/blocks/CCRednet/generator.js
new file mode 100644
index 0000000..6f330fd
--- /dev/null
+++ b/blocks/CCRednet/generator.js
@@ -0,0 +1,94 @@
+const { luaGenerator } = require('blockly/lua');
+
+// Check if luaGenerator.forBlock is defined and initialize if necessary
+if (!luaGenerator.forBlock) {
+ luaGenerator.forBlock = {};
+}
+
+luaGenerator.forBlock['rednet_open'] = function(block, generator) {
+ var side = block.getFieldValue('SIDE');
+
+ var code = '';
+ if (side == "all") {
+ code = `peripheral.find("modem", rednet.open)`;
+ } else {
+ code = `rednet.open("${side}")`
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['rednet_close'] = function(block, generator) {
+ var side = block.getFieldValue('SIDE');
+
+ var code = '';
+ if (side == "all") {
+ code = `peripheral.find("modem", rednet.close)`;
+ } else {
+ code = `rednet.close("${side}")`
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['rednet_isopen'] = function(block, generator) {
+ var side = block.getFieldValue('SIDE');
+
+ var code = '';
+ if (side == "all") {
+ code = `rednet.isOpen()`;
+ } else {
+ code = `rednet.isOpen("${side}")`
+ }
+
+ return [code, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['rednet_send'] = function(block, generator) {
+ var data = generator.valueToCode(block, 'DATA', generator.ORDER_NONE);
+ var id = generator.valueToCode(block, 'ID', generator.ORDER_NONE);
+ var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE);
+
+ return `rednet.send(${id}, ${data}, ${protocol})\n`;
+};
+
+luaGenerator.forBlock['rednet_broadcast'] = function(block, generator) {
+ var data = generator.valueToCode(block, 'DATA', generator.ORDER_NONE);
+ var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE);
+
+ return `rednet.broadcast(${data}, ${protocol})\n`;
+};
+
+luaGenerator.forBlock['rednet_receive'] = function(block, generator) {
+ var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE);
+ var timeout = generator.valueToCode(block, 'TIMEOUT', generator.ORDER_NONE);
+
+ var code = '';
+ if (timeout == 0) {
+ code = `rednet.receive(${protocol})`
+ } else {
+ code = `rednet.receive(${protocol}, ${timeout})`
+ }
+
+ return [code, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['rednet_host'] = function(block, generator) {
+ var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE);
+ var hostname = generator.valueToCode(block, 'NAME', generator.ORDER_NONE);
+
+ return `rednet.host(${protocol}, ${hostname})\n`;
+};
+
+luaGenerator.forBlock['rednet_unhost'] = function(block, generator) {
+ var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE);
+
+ return `rednet.unhost(${protocol})\n`;
+};
+
+luaGenerator.forBlock['rednet_lookup'] = function(block, generator) {
+ var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE);
+ var hostname = generator.valueToCode(block, 'NAME', generator.ORDER_NONE);
+
+ return [`rednet.lookup(${protocol}, ${hostname})`, luaGenerator.ORDER_NONE];
+};
diff --git a/blocks/CCRednet/index.json b/blocks/CCRednet/index.json
new file mode 100644
index 0000000..60fe0f4
--- /dev/null
+++ b/blocks/CCRednet/index.json
@@ -0,0 +1,22 @@
+{
+ "name": "Rednet",
+ "author": "DPSoftware Foundation",
+ "description": "Library for rednet",
+ "version": "1.0.0",
+ "category": "Network",
+ "keyword": "Rednet",
+ "license": "GPL-3.0-or-later",
+ "peripherals": true,
+ "library": true,
+ "require_network": false,
+ "dependencies": {},
+ "design_for_computer": {
+ "basic": true,
+ "adv": true,
+ "command": true,
+ "pocket": true,
+ "advpocket": true,
+ "turtle": true,
+ "advturtle": true
+ }
+}
diff --git a/blocks/CCRednet/toolbox.xml b/blocks/CCRednet/toolbox.xml
new file mode 100644
index 0000000..425b946
--- /dev/null
+++ b/blocks/CCRednet/toolbox.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+ default
+
+
+
+
+
+
+ default
+
+
+
+
+
+
+ default
+
+
+
+
+ 0
+
+
+
+
+
+
+ default
+
+
+
+
+ SomeName
+
+
+
+
+
+
+ default
+
+
+
+
+
+
+ SomeName
+
+
+
+
+ default
+
+
+
+
+
diff --git a/blocks/CCRedstone/block_design.json b/blocks/CCRedstone/block_design.json
new file mode 100644
index 0000000..7997665
--- /dev/null
+++ b/blocks/CCRedstone/block_design.json
@@ -0,0 +1,137 @@
+{
+ "redstone_set_output": {
+ "message0": "Set redstone %1 at %2 of computer",
+ "args0": [
+ {
+ "type": "field_dropdown",
+ "name": "STATE",
+ "options": [
+ ["On", "OFF"],
+ ["Off", "ON"]
+ ]
+ },
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 10,
+ "tooltip": "Turn the redstone signal of a specific side on or off."
+ },
+ "redstone_get_output": {
+ "message0": "Get redstone output at %1 of computer",
+ "args0": [
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "output": "Boolean",
+ "colour": 10,
+ "tooltip": "Get the current redstone output of a specific side."
+ },
+ "redstone_read_input": {
+ "message0": "Read redstone input at %1 of computer",
+ "args0": [
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "output": "Boolean",
+ "colour": 10,
+ "tooltip": "Get the current redstone input of a specific side."
+ },
+ "redstone_set_analog_output": {
+ "message0": "Set redstone analog with power %1 at %2 of computer",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "POWER",
+ "check": "Number"
+ },
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "previousStatement": null,
+ "nextStatement": null,
+ "colour": 10,
+ "tooltip": "Set the redstone signal strength for a specific side."
+ },
+ "redstone_get_analog_output": {
+ "message0": "Get redstone analog output at %1 of computer",
+ "args0": [
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "output": "Number",
+ "colour": 10,
+ "tooltip": "Get the redstone output signal strength for a specific side."
+ },
+ "redstone_read_analog_input": {
+ "message0": "Read redstone analog output at %1 of computer",
+ "args0": [
+ {
+ "type": "field_dropdown",
+ "name": "SIDE",
+ "options": [
+ ["Top", "top"],
+ ["Bottom", "bottom"],
+ ["Left", "left"],
+ ["Right", "right"],
+ ["Front", "front"],
+ ["Back", "back"]
+ ]
+ }
+ ],
+ "output": "Number",
+ "colour": 10,
+ "tooltip": "Get the redstone input signal strength for a specific side."
+ }
+}
diff --git a/blocks/CCRedstone/generator.js b/blocks/CCRedstone/generator.js
new file mode 100644
index 0000000..4fced95
--- /dev/null
+++ b/blocks/CCRedstone/generator.js
@@ -0,0 +1,50 @@
+const { luaGenerator } = require('blockly/lua');
+
+// Check if luaGenerator.forBlock is defined and initialize if necessary
+if (!luaGenerator.forBlock) {
+ luaGenerator.forBlock = {};
+}
+
+luaGenerator.forBlock['redstone_set_output'] = function(block, generator) {
+ var state = block.getFieldValue('STATE');
+ var side = block.getFieldValue('SIDE');
+
+ if (state == "OFF") {
+ var code = `rs.setOutput("${side}", true)`;
+ } else {
+ var code = `rs.setOutput("${side}", false)`;
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['redstone_get_output'] = function(block, generator) {
+ var side = block.getFieldValue('SIDE');
+
+ return [`rs.getOutput("${side}")`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['redstone_read_input'] = function(block, generator) {
+ var side = block.getFieldValue('SIDE');
+
+ return [`rs.getInput("${side}")`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['redstone_set_analog_output'] = function(block, generator) {
+ var power = generator.valueToCode(block, 'POWER', generator.ORDER_NONE);
+ var side = block.getFieldValue('SIDE');
+
+ return `rs.setAnalogOutput("${side}", ${power})\n`;
+};
+
+luaGenerator.forBlock['redstone_get_analog_output'] = function(block, generator) {
+ var side = block.getFieldValue('SIDE');
+
+ return `rs.getAnalogOutput("${side}")\n`;
+};
+
+luaGenerator.forBlock['redstone_read_analog_input'] = function(block, generator) {
+ var side = block.getFieldValue('SIDE');
+
+ return `rs.getAnalogInput("${side}")\n`;
+};
diff --git a/blocks/CCRedstone/index.json b/blocks/CCRedstone/index.json
new file mode 100644
index 0000000..a6b0a2c
--- /dev/null
+++ b/blocks/CCRedstone/index.json
@@ -0,0 +1,22 @@
+{
+ "name": "CC: Redstone",
+ "author": "DPSoftware Foundation",
+ "description": "Library for control redstone",
+ "version": "1.0.0",
+ "category": "Power",
+ "keyword": "Redstone",
+ "license": "GPL-3.0-or-later",
+ "peripherals": false,
+ "library": true,
+ "require_network": false,
+ "dependencies": {},
+ "design_for_computer": {
+ "basic": true,
+ "adv": true,
+ "command": true,
+ "pocket": false,
+ "advpocket": false,
+ "turtle": false,
+ "advturtle": false
+ }
+}
diff --git a/blocks/CCRedstone/toolbox.xml b/blocks/CCRedstone/toolbox.xml
new file mode 100644
index 0000000..8f2b734
--- /dev/null
+++ b/blocks/CCRedstone/toolbox.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
diff --git a/blocks/CCTurtle/block_design.json b/blocks/CCTurtle/block_design.json
index 00a3a49..8af3722 100644
--- a/blocks/CCTurtle/block_design.json
+++ b/blocks/CCTurtle/block_design.json
@@ -63,8 +63,8 @@
"type": "field_dropdown",
"name": "SIDE",
"options": [
- ["Left", "LEFT"],
- ["Right", "RIGHT"]
+ ["Left", "left"],
+ ["Right", "right"]
]
}
],
@@ -90,8 +90,8 @@
"type": "field_dropdown",
"name": "SIDE",
"options": [
- ["Left", "LEFT"],
- ["Right", "RIGHT"]
+ ["Left", "left"],
+ ["Right", "right"]
]
}
],
@@ -376,7 +376,8 @@
}
],
"inputsInline": true,
- "output": "Multiple",
+ "previousStatement": null,
+ "nextStatement": null,
"colour": 215,
"tooltip": "Craft a recipe based on the turtle's inventory."
}
diff --git a/blocks/CCTurtle/generator.js b/blocks/CCTurtle/generator.js
index 6cfab87..34eefcc 100644
--- a/blocks/CCTurtle/generator.js
+++ b/blocks/CCTurtle/generator.js
@@ -5,54 +5,350 @@ if (!luaGenerator.forBlock) {
luaGenerator.forBlock = {};
}
-// Math operation block
-luaGenerator.forBlock['math_operation'] = function(block, generator) {
- var operator = block.getFieldValue('OPERATOR');
- var num1 = generator.valueToCode(block, 'NUM1', generator.ORDER_ATOMIC);
- var num2 = generator.valueToCode(block, 'NUM2', generator.ORDER_ATOMIC);
+luaGenerator.forBlock['turtle_move_operation'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+ var FOR = generator.valueToCode(block, 'FOR', generator.ORDER_ATOMIC);
- var operatorSymbol = '';
+ var movecommand = '';
switch (operator) {
- case 'ADD':
- operatorSymbol = '+';
+ case 'FORWARD':
+ movecommand = 'turtle.forward()';
break;
- case 'SUBTRACT':
- operatorSymbol = '-';
+ case 'BACK':
+ movecommand = 'turtle.back()';
break;
- case 'MULTIPLY':
- operatorSymbol = '*';
+ case 'UP':
+ movecommand = 'turtle.up()';
break;
- case 'DIVIDE':
- operatorSymbol = '/';
+ case 'DOWN':
+ movecommand = 'turtle.down()';
break;
default:
- operatorSymbol = '+';
+ movecommand = 'turtle.forward()';
+ break;
+ }
+ if (FOR == 1) {
+ var code = movecommand;
+ } else {
+ var code = `for i=${FOR},1,-1 do ${movecommand} end`;
+ };
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_turn_operation'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+ var FOR = generator.valueToCode(block, 'ROUND', generator.ORDER_ATOMIC);
+
+ var movecommand = '';
+ switch (operator) {
+ case 'LEFT':
+ movecommand = 'turtle.turnLeft()';
+ break;
+ case 'RIGHT':
+ movecommand = 'turtle.turnRight()';
+ break;
+ default:
+ movecommand = 'turtle.turnLeft()';
+ break;
+ }
+ if (FOR == 1) {
+ var code = movecommand;
+ } else {
+ var code = `for i=${FOR},1,-1 do ${movecommand} end`;
+ };
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_turn_operation'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+ var FOR = generator.valueToCode(block, 'ROUND', generator.ORDER_ATOMIC);
+
+ var movecommand = '';
+ switch (operator) {
+ case 'LEFT':
+ movecommand = 'turtle.turnLeft()';
+ break;
+ case 'RIGHT':
+ movecommand = 'turtle.turnRight()';
+ break;
+ default:
+ movecommand = 'turtle.turnLeft()';
+ break;
+ }
+ if (FOR == 1) {
+ var code = movecommand;
+ } else {
+ var code = `for i=${FOR},1,-1 do ${movecommand} end`;
+ };
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_dig_operation'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+ var side = block.getFieldValue('SIDE');
+
+ var code = '';
+ switch (operator) {
+ case 'FRONT':
+ code = `turtle.dig("${side}")`;
+ break;
+ case 'UP':
+ code = `turtle.digUp("${side}")`;
+ break;
+ case 'DOWN':
+ code = `turtle.digDown("${side}")`;
+ break;
+ default:
+ code = `turtle.dig("${side}")`;
+ break;
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_attack_operation'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+ var side = block.getFieldValue('SIDE');
+
+ var code = '';
+ switch (operator) {
+ case 'FRONT':
+ code = `turtle.attack("${side}")`;
+ break;
+ case 'UP':
+ code = `turtle.attackUp("${side}")`;
+ break;
+ case 'DOWN':
+ code = `turtle.attackDown("${side}")`;
+ break;
+ default:
+ code = `turtle.attack("${side}")`;
+ break;
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_place_operation'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+
+ var code = '';
+ switch (operator) {
+ case 'FRONT':
+ code = `turtle.place()`;
+ break;
+ case 'UP':
+ code = `turtle.placeUp()`;
+ break;
+ case 'DOWN':
+ code = `turtle.placeDown()`;
+ break;
+ default:
+ code = `turtle.place()`;
+ break;
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_drop_operation'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+ var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC);
+
+ var code = '';
+ switch (operator) {
+ case 'FRONT':
+ code = `turtle.drop(${count})`;
+ break;
+ case 'UP':
+ code = `turtle.dropUp(${count})`;
+ break;
+ case 'DOWN':
+ code = `turtle.dropDown(${count})`;
+ break;
+ default:
+ code = `turtle.drop(${count})`;
+ break;
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_select_item'] = function(block, generator) {
+ var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC);
+
+ return `turtle.select(${slot})\n`;
+};
+
+luaGenerator.forBlock['turtle_get_item_count'] = function(block, generator) {
+ var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC);
+
+ return [`turtle.getItemCount(${slot})`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['turtle_get_slot_free'] = function(block, generator) {
+ var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC);
+
+ return [`turtle.getItemSpace(${slot})`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['turtle_detect_block'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+
+ var code = '';
+ switch (operator) {
+ case 'FRONT':
+ code = `turtle.detect()`;
+ break;
+ case 'UP':
+ code = `turtle.detectUp()`;
+ break;
+ case 'DOWN':
+ code = `turtle.detectDown()`;
+ break;
+ default:
+ code = `turtle.detect()`;
+ break;
+ }
+
+ return [code, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['turtle_compare_item'] = function(block, generator) {
+ var operator = block.getFieldValue('OPERATION');
+
+ var code = '';
+ switch (operator) {
+ case 'FRONT':
+ code = `turtle.compare()`;
+ break;
+ case 'UP':
+ code = `turtle.compareUp()`;
+ break;
+ case 'DOWN':
+ code = `turtle.compareDown()`;
+ break;
+ default:
+ code = `turtle.compare()`;
+ break;
+ }
+
+ return [code, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['turtle_collect_item'] = function(block, generator) {
+ var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC);
+ var operator = block.getFieldValue('OPERATION');
+
+ var code = '';
+ switch (operator) {
+ case 'FRONT':
+ code = `turtle.suck(${count})`;
+ break;
+ case 'UP':
+ code = `turtle.suckUp(${count})`;
+ break;
+ case 'DOWN':
+ code = `turtle.suckDown(${count})`;
+ break;
+ default:
+ code = `turtle.suck(${count})`;
+ break;
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_get_fuel_level'] = function(block) {
+ return ["turtle.getFuelLevel()", luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['turtle_refuel'] = function(block, generator) {
+ var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC);
+
+ if (count == 0) {
+ var code = "turtle.refuel()"
+ } else {
+ var code = `turtle.refuel(${count})`
+ }
+
+ return code + "\n";
+};
+
+luaGenerator.forBlock['turtle_compare_to'] = function(block, generator) {
+ var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC);
+
+ return [`turtle.compareTo(${slot})`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['turtle_transfer_to'] = function(block, generator) {
+ var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC);
+ var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC);
+
+ return `turtle.transferTo(${slot}, ${count})\n`;
+};
+
+luaGenerator.forBlock['turtle_get_selected_slot'] = function(block) {
+ return [`turtle.getSelectedSlot()`, luaGenerator.ORDER_NONE];
+};
+
+
+luaGenerator.forBlock['turtle_get_fuel_limit'] = function(block) {
+ return [`turtle.getFuelLimit()`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['turtle_equip'] = function(block) {
+ var side = block.getFieldValue('SIDE');
+
+ var code = '';
+ switch (side) {
+ case 'LEFT':
+ code = `turtle.equipLeft()`;
+ break;
+ case 'RIGHT':
+ code = `turtle.equipRight() `;
+ break;
+ default:
+ code = `turtle.equipLeft()`;
break;
}
- var code = `${num1} ${operatorSymbol} ${num2}`;
- return [code, generator.ORDER_ATOMIC];
+ return [code, luaGenerator.ORDER_NONE];
};
-// Print text block
-luaGenerator.forBlock['text_print'] = function(block, generator) {
- var text = generator.valueToCode(block, 'TEXT', generator.ORDER_NONE) || '\'\'';
- var code = `print(${text})\n`;
- return code;
+luaGenerator.forBlock['turtle_inspect'] = function(block) {
+ var operator = block.getFieldValue('OPERATION');
+
+ var code = '';
+ switch (operator) {
+ case 'FRONT':
+ code = `turtle.inspect()`;
+ break;
+ case 'UP':
+ code = `turtle.inspectUp()`;
+ break;
+ case 'DOWN':
+ code = `turtle.inspectDown()`;
+ break;
+ default:
+ code = `turtle.inspect()`;
+ break;
+ }
+
+ return [code, luaGenerator.ORDER_NONE];
};
-// If condition block
-luaGenerator.forBlock['controls_if'] = function(block, generator) {
- var condition = generator.valueToCode(block, 'IF0', generator.ORDER_NONE) || 'false';
- var branch = generator.statementToCode(block, 'DO0');
- var code = `if ${condition} then\n${branch}\nend\n`;
- return code;
+luaGenerator.forBlock['turtle_get_item_detail'] = function(block, generator) {
+ var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC);
+
+ return [`turtle.getItemDetail(${slot})`, luaGenerator.ORDER_NONE];
};
-// Set variable block
-luaGenerator.forBlock['variables_set'] = function(block, generator) {
- var variable = generator.nameDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
- var value = generator.valueToCode(block, 'VALUE', generator.ORDER_NONE) || '0';
- var code = `${variable} = ${value}\n`;
- return code;
-};
+luaGenerator.forBlock['turtle_craft'] = function(block, generator) {
+ var limit = generator.valueToCode(block, 'LIMIT', generator.ORDER_ATOMIC);
+
+ return `turtle.craft(${limit})\n`;
+};
\ No newline at end of file
diff --git a/blocks/CCTurtle/index.json b/blocks/CCTurtle/index.json
index 92d0511..036e927 100644
--- a/blocks/CCTurtle/index.json
+++ b/blocks/CCTurtle/index.json
@@ -2,7 +2,7 @@
"name": "CC: Turtle",
"author": "DPSoftware Foundation",
"description": "Library for control turtle",
- "version": "0.1",
+ "version": "1.0",
"category": "turtle",
"keyword": "turtle",
"license": "GPL-3.0-or-later",
diff --git a/blocks/CCTurtle/toolbox.xml b/blocks/CCTurtle/toolbox.xml
index 10db08b..4af44d5 100644
--- a/blocks/CCTurtle/toolbox.xml
+++ b/blocks/CCTurtle/toolbox.xml
@@ -65,19 +65,19 @@
- 1
+ 1
- 1
+ 1
- 64
+ 64
@@ -85,7 +85,13 @@
-
+
+
+
+ 1
+
+
+
diff --git a/ccIDE Defines.xlsx b/ccIDE Defines.xlsx
index 50bfe4d..01485bc 100644
Binary files a/ccIDE Defines.xlsx and b/ccIDE Defines.xlsx differ
diff --git a/readme.md b/readme.md
index f9cbc06..f763599 100644
--- a/readme.md
+++ b/readme.md
@@ -1,3 +1,5 @@
+[](https://wakatime.com/badge/user/0e729f00-081a-41e0-ab17-b9ac6abfc334/project/e9e0d6a6-dfaf-46d0-bb77-e1f7127e7fb4)
+
# ComputerCraft IDE (ccIDE)
ccIDE is block based programming for ComputerCraft lua.
diff --git a/src/module_block_design.json b/src/module_block_design.json
index b7cf57b..678b457 100644
--- a/src/module_block_design.json
+++ b/src/module_block_design.json
@@ -13,5 +13,45 @@
"colour": 120,
"tooltip": "Sleep command",
"helpUrl": ""
+ },
+ "sys_utils_table_variable_pack": {
+ "message0": "Pack %1 to Table",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "RETURN_ARGS",
+ "check": "Multiple"
+ }
+ ],
+ "output": "Array",
+ "colour": 220
+ },
+ "sys_utils_get_value_from_table_with_index": {
+ "message0": "UnPack %1 to Value with index/key %2",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "TABLE",
+ "check": "Array"
+ },
+ {
+ "type": "input_value",
+ "name": "INDEX",
+ "check": ["Number", "String"]
+ }
+ ],
+ "output": null,
+ "colour": 220
+ },
+ "sys_utils_get_type": {
+ "message0": "Get type of %1",
+ "args0": [
+ {
+ "type": "input_value",
+ "name": "INPUT"
+ }
+ ],
+ "output": "String",
+ "colour": 220
}
-}
\ No newline at end of file
+}
diff --git a/src/module_generator.js b/src/module_generator.js
index b06e8a3..1c4e552 100644
--- a/src/module_generator.js
+++ b/src/module_generator.js
@@ -11,4 +11,23 @@ luaGenerator.forBlock['sys_sleep'] = function(block, generator) {
var code = `sleep(${sleepfor})\n`;
return code;
+};
+
+luaGenerator.forBlock['sys_utils_table_variable_pack'] = function(block, generator) {
+ var args = generator.valueToCode(block, 'RETURN_ARGS', generator.ORDER_NONE);
+
+ return [`{${args}}`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['sys_utils_get_value_from_table_with_index'] = function(block, generator) {
+ var table = generator.valueToCode(block, 'TABLE', generator.ORDER_NONE);
+ var index = generator.valueToCode(block, 'INDEX', generator.ORDER_NONE);
+
+ return [`${table}[${index}]`, luaGenerator.ORDER_NONE];
+};
+
+luaGenerator.forBlock['sys_utils_get_type'] = function(block, generator) {
+ var input = generator.valueToCode(block, 'INPUT', generator.ORDER_NONE);
+
+ return [`type(${input})`, luaGenerator.ORDER_NONE];
};
\ No newline at end of file
diff --git a/src/toolbox.xml b/src/toolbox.xml
index 16c3bff..5d5f17a 100644
--- a/src/toolbox.xml
+++ b/src/toolbox.xml
@@ -1,4 +1,15 @@
+
+
+
+
+
+ 1
+
+
+
+
+
@@ -119,7 +130,7 @@
- 100
+ 100
@@ -160,7 +171,7 @@
- abc
+ abc
@@ -174,7 +185,7 @@
- text
+ text
diff --git a/src/virtualcode.js b/src/virtualcode.js
index 2fcb984..465bfab 100644
--- a/src/virtualcode.js
+++ b/src/virtualcode.js
@@ -99,9 +99,11 @@ ipc.on('load-workspace', (event, json) => {
}
}
}
- Blockly.serialization.workspaces.load(data.content, workspace);
- isprojectsaved = true
- document.getElementById('statusMessage').textContent = `Project Loaded`;
+ setTimeout(() => {
+ Blockly.serialization.workspaces.load(data.content, workspace);
+ isprojectsaved = true
+ document.getElementById('statusMessage').textContent = `Project Loaded`;
+ }, 100);
}
} catch (e) {
document.getElementById('statusMessage').textContent = `Can't Load Project: ${e}`;