mirror of
https://github.com/damp11113-software/ccIDE.git
synced 2025-04-27 22:48:13 +00:00
Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
2e855b9907 | |||
5200e86f7d | |||
a5ac8c99c8 | |||
4cad5389d3 | |||
cdfaf53a5c | |||
7cbaeadc7b | |||
3b405b958b | |||
b51f562de4 | |||
|
8ea8465322 | ||
5dbeeddca4 | |||
449432288a | |||
|
4e332aec22 | ||
f1e2fab141 | |||
2047e23213 | |||
|
4463b8110a | ||
a11e210c3d | |||
88ddcb15dd | |||
a3cbd59f8a | |||
fa69cff4da | |||
cda86c8a53 | |||
|
748706cf17 | ||
|
c05f27d21a | ||
|
749a754c43 | ||
|
2ccf7e8271 | ||
|
02f9faa22c | ||
9990bc3c03 | |||
7ab5faf453 | |||
5a4cbb455a | |||
218bb18b29 | |||
b77dc34ec6 | |||
|
749963219d | ||
18200b2b51 | |||
aee88bcdae | |||
acab98dfa6 | |||
|
2da8458e5d | ||
|
56a538ee36 | ||
ee1efb360e | |||
962ada36f0 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,4 +1,6 @@
|
||||
node_modules/
|
||||
.mcattributes
|
||||
package-lock.json
|
||||
dist/
|
||||
dist/
|
||||
dist_debug/
|
||||
ccIDE.wheel
|
||||
|
@ -0,0 +1 @@
|
||||
{"usedlibrary":["Advanced_Peripherals","CCPeripheral"],"content":{"blocks":{"languageVersion":0,"blocks":[{"type":"ide_start","id":"ricNE5%Z`fhO08w3_ys?","x":101,"y":245,"inputs":{"DO":{"block":{"type":"variables_set","id":"eI39:+.u@(!5%kvtO;:%","fields":{"VAR":{"id":"*{7i9]pPQ]SdxwKC$?3g"}},"inputs":{"VALUE":{"block":{"type":"peripheral_wrap","id":"I@})D:bWyuA*FB8JA._Q","inputs":{"NAME":{"block":{"type":"text","id":"$.|TXypr(p,O?j+AyxG}","fields":{"TEXT":"back"}}}}}}},"next":{"block":{"type":"text_print","id":"`pV-P7(5sAFfu.Rw#?*0","inputs":{"TEXT":{"shadow":{"type":"text","id":"LWM*Dzq9*nJOE2aHlE!:","fields":{"TEXT":"Hello World!"}},"block":{"type":"advanced_peripherals_energy_detector_get_transfer_rate","id":",t1ePaKNhwgjj8*NxTv4","inputs":{"DETECTOR":{"block":{"type":"variables_get","id":"*CXv^ZN2(,0/M{AAYCqd","fields":{"VAR":{"id":"*{7i9]pPQ]SdxwKC$?3g"}}}}}}}},"next":{"block":{"type":"controls_for","id":"4!(mnA6g%G=~D3O|::Vm","fields":{"VAR":{"id":"RxOxb]Cq?^Fl%TPEReQg"}},"inputs":{"FROM":{"shadow":{"type":"math_number","id":"Dd_i)gS(=_5Z^A+WFwlC","fields":{"NUM":1}}},"TO":{"shadow":{"type":"math_number","id":"-C7.z0)cwU2m=Nkai:?t","fields":{"NUM":5500000}}},"BY":{"shadow":{"type":"math_number","id":"0XKg00ZWP)J21Ml;r3zY","fields":{"NUM":10000}}},"DO":{"block":{"type":"advanced_peripherals_energy_detector_set_transfer_rate_limit","id":"LUW1R-c8QnslP9ZkHe^i","inputs":{"TFRLIMIT":{"shadow":{"type":"math_number","id":"ihxhw[%G_?YGmGNHhNn~","fields":{"NUM":512}},"block":{"type":"variables_get","id":"zdca/5P:G=R-/1Jn7~6i","fields":{"VAR":{"id":"RxOxb]Cq?^Fl%TPEReQg"}}}},"DETECTOR":{"block":{"type":"variables_get","id":"R+t`O{nwP2m`h;00zn$S","fields":{"VAR":{"id":"*{7i9]pPQ]SdxwKC$?3g"}}}}},"next":{"block":{"type":"text_print","id":"y:t@#1T=P?#7On+oP!vk","inputs":{"TEXT":{"shadow":{"type":"text","id":"LWM*Dzq9*nJOE2aHlE!:","fields":{"TEXT":"Hello World!"}},"block":{"type":"advanced_peripherals_energy_detector_get_transfer_rate","id":"%#cm|_bk@Z?K2dcZ%yG8","inputs":{"DETECTOR":{"block":{"type":"variables_get","id":"Q3,TJ``WBVTZC|iAm:WI","fields":{"VAR":{"id":"*{7i9]pPQ]SdxwKC$?3g"}}}}}}}}}}}}}}}}}}}}}]},"variables":[{"name":"i","id":"RxOxb]Cq?^Fl%TPEReQg"},{"name":"detector","id":"*{7i9]pPQ]SdxwKC$?3g"}]}}
|
1
TestProject/geoscanner (example 4).ccp
Normal file
1
TestProject/geoscanner (example 4).ccp
Normal file
@ -0,0 +1 @@
|
||||
{"usedlibrary":["Advanced_Peripherals","CCPeripheral","CCTextutils","NativeIO"],"content":{"blocks":{"languageVersion":0,"blocks":[{"type":"ide_start","id":"_s{i,SzdnGk`iz}V{Ef,","x":30,"y":150,"inputs":{"DO":{"block":{"type":"variables_set","id":"4`t0A~mi9udqazuPFltl","fields":{"VAR":{"id":"b!G3HI*3Su-;s=l@m`{C"}},"inputs":{"VALUE":{"block":{"type":"io_open","id":"{s9Q{?YzVj[IT}u~g52k","fields":{"MODE":"w"},"inputs":{"FILENAME":{"block":{"type":"text","id":"}r@r{xS9G6@i@C{jDAOG","fields":{"TEXT":"test.json"}}}}}}},"next":{"block":{"type":"variables_set","id":"la(`]]2fjOy@W3|#H+j5","fields":{"VAR":{"id":"!60`+fJsl+LMzF5L;((_"}},"inputs":{"VALUE":{"block":{"type":"peripheral_wrap","id":"#gIy8pYRI5r;|Gpt((6D","inputs":{"NAME":{"shadow":{"type":"text","id":"s1SZ;+Ll-[Dn*[yCTh4^","fields":{"TEXT":"geoScanner_1"}}}}}}},"next":{"block":{"type":"io_write","id":"cXQ`rD/MHKTs*S:asoq`","inputs":{"DATA":{"shadow":{"type":"text","id":"j_Am~Q@Lu.p2e[cVK%_+","fields":{"TEXT":"Hello, world!"}},"block":{"type":"textutils_serialize_json","id":"7D;X/4FI7*aP+^+JG]w~","fields":{"NBT":false,"UNICODE":false,"ALLOWREPETI":false},"inputs":{"OBJECT":{"block":{"type":"advanced_peripherals_geo_scanner_scan","id":"=uxVRL!ZaUB=t@-]@;`4","inputs":{"RADIUS":{"shadow":{"type":"math_number","id":"e5oF_eP.dd+gJ@3YxYYJ","fields":{"NUM":2}}},"SCANNER":{"block":{"type":"variables_get","id":"Y`peao|kXro)ax|@x8v*","fields":{"VAR":{"id":"!60`+fJsl+LMzF5L;((_"}}}}}}}}}},"FILE":{"block":{"type":"variables_get","id":"-iS.RqK;e21F_P4Psbm+","fields":{"VAR":{"id":"b!G3HI*3Su-;s=l@m`{C"}}}}}}}}}}}}}]},"variables":[{"name":"scanner","id":"!60`+fJsl+LMzF5L;((_"},{"name":"file","id":"b!G3HI*3Su-;s=l@m`{C"}]}}
|
1
TestProject/serialize example 2.ccp
Normal file
1
TestProject/serialize example 2.ccp
Normal file
@ -0,0 +1 @@
|
||||
{"usedlibrary":["CCTextutils"],"content":{"blocks":{"languageVersion":0,"blocks":[{"type":"ide_start","id":"%k|1C%^t;XMrXr0{%gB|","x":330,"y":270,"inputs":{"DO":{"block":{"type":"variables_set","id":"NSMcwqhVU(1::#UWOflD","fields":{"VAR":{"id":"6z)4i^N`L0rGnHo}k6w~"}},"inputs":{"VALUE":{"block":{"type":"lists_create_with","id":"Rt}My_DC8m7QIYsmta-T","extraState":{"itemCount":3},"inputs":{"ADD0":{"block":{"type":"math_number","id":"7SKw2+Md2.{tznxyfe{T","fields":{"NUM":1}}},"ADD1":{"block":{"type":"math_number","id":"7UV1y^XFKM!,-6RK);`{","fields":{"NUM":2}}},"ADD2":{"block":{"type":"math_number","id":"MrfY2v6g)h3lj7e0jgqE","fields":{"NUM":3}}}}}}},"next":{"block":{"type":"text_print","id":"3+Z|78w,QkD{/[:jPv:e","inputs":{"TEXT":{"shadow":{"type":"text","id":"+OF[F($(eq]G$:h;Kt*w","fields":{"TEXT":"abc"}},"block":{"type":"textutils_serialize","id":"d{!#Az)#[M2rmGXXW,J,","fields":{"COMPACT":false,"ALLOWREPETI":true},"inputs":{"OBJECT":{"block":{"type":"lists_create_with","id":"W~HzfCNp_n@LA6c6fwp~","extraState":{"itemCount":2},"inputs":{"ADD0":{"block":{"type":"variables_get","id":"bVs`6KM30qehpXe901*:","fields":{"VAR":{"id":"6z)4i^N`L0rGnHo}k6w~"}}}},"ADD1":{"block":{"type":"variables_get","id":"@l4-(?lC]/$VetN_E!|^","fields":{"VAR":{"id":"6z)4i^N`L0rGnHo}k6w~"}}}}}}}}}}},"next":{"block":{"type":"text_print","id":"I^mHjxNqwwaU!Or,/m5@","inputs":{"TEXT":{"shadow":{"type":"text","id":"/!sl#s%!LHS,s5h05pQ;","fields":{"TEXT":"abc"}},"block":{"type":"textutils_serialize","id":"t7R?`7;1c%3!.jd.dW9F","fields":{"COMPACT":true,"ALLOWREPETI":false},"inputs":{"OBJECT":{"block":{"type":"variables_get","id":"!yZhT^MMVuSQ:[q|puo`","fields":{"VAR":{"id":"6z)4i^N`L0rGnHo}k6w~"}}}}}}}}}}}}}}}}]},"variables":[{"name":"test","id":"6z)4i^N`L0rGnHo}k6w~"}]}}
|
1
TestProject/serialize example 3.ccp
Normal file
1
TestProject/serialize example 3.ccp
Normal file
@ -0,0 +1 @@
|
||||
{"usedlibrary":["CCSystem","CCTextutils"],"content":{"blocks":{"languageVersion":0,"blocks":[{"type":"ide_start","id":"?udZVah+}|wlY2LCZ-bl","x":110,"y":150,"inputs":{"DO":{"block":{"type":"variables_set","id":"Q1no.e|r^Ds4Z(cOo6ks","fields":{"VAR":{"id":"|]HEFfXY)7GgpQb83nOc"}},"inputs":{"VALUE":{"block":{"type":"lists_create_with","id":"Qzp}4**d+m``G!B7ydBd","extraState":{"itemCount":0}}}},"next":{"block":{"type":"controls_repeat_ext","id":"h[fG-)EnPfn?;Dw,4JS;","inputs":{"TIMES":{"shadow":{"type":"math_number","id":"0,DMR{6Yro.qGGmsNI!m","fields":{"NUM":10}}},"DO":{"block":{"type":"sys_table_append_data","id":"_{Wr/]apCKw;wuLM!~tb","inputs":{"DATA":{"block":{"type":"math_random_int","id":"/dj{qRb:`dKxV-I6fB:c","inputs":{"FROM":{"shadow":{"type":"math_number","id":"6_%M8#LXu7~[op|p6@i+","fields":{"NUM":1}}},"TO":{"shadow":{"type":"math_number","id":"%dJUjQmbir}H?ZXa!Ghv","fields":{"NUM":10}}}}}},"TABLE":{"block":{"type":"variables_get","id":",7[Gq|+k;K=kAnpK0.dR","fields":{"VAR":{"id":"|]HEFfXY)7GgpQb83nOc"}}}}}}}},"next":{"block":{"type":"text_print","id":"bHx3OISYn{5x.-F2(|Y`","inputs":{"TEXT":{"shadow":{"type":"text","id":"jVr603(C3eOIz#G*N}UC","fields":{"TEXT":"abc"}},"block":{"type":"textutils_serialize","id":"}`]U9*1|Ev{J=[`ru9Q;","fields":{"COMPACT":false,"ALLOWREPETI":false},"inputs":{"OBJECT":{"block":{"type":"lists_sort","id":"EZpHsG`jZ.gBI;D?$b~L","fields":{"TYPE":"NUMERIC","DIRECTION":"1"},"inputs":{"LIST":{"block":{"type":"variables_get","id":"$Uf4s5MK,FWh^4jvKmFo","fields":{"VAR":{"id":"|]HEFfXY)7GgpQb83nOc"}}}}}}}}}}}}}}}}}}}]},"variables":[{"name":"mylist","id":"|]HEFfXY)7GgpQb83nOc"}]}}
|
1
TestProject/turtle build home (example 1).ccp
Normal file
1
TestProject/turtle build home (example 1).ccp
Normal file
File diff suppressed because one or more lines are too long
1
TestProject/turtle example 1.ccp
Normal file
1
TestProject/turtle example 1.ccp
Normal file
@ -0,0 +1 @@
|
||||
{"usedlibrary":["IDE"],"content":{"blocks":{"languageVersion":0,"blocks":[{"type":"ide_start","id":"o[Cw/cGpoIP_gX=[qr#;","x":330,"y":210,"inputs":{"DO":{"block":{"type":"ide_addcode","id":"4rulxmAG~hzUkD5l(5yF","inputs":{"CODE":{"block":{"type":"text","id":"(o[.P`~(.T7p_[l_^Hl#","fields":{"TEXT":"turtle.refuel()"}}}},"next":{"block":{"type":"ide_addcode","id":"/5%!yEWtyS/E=wR/m*Xm","inputs":{"CODE":{"block":{"type":"text","id":"%wbX8A-7RhI2ZgV=lFhV","fields":{"TEXT":"turtle.digDown(\"left\")"}}}},"next":{"block":{"type":"ide_addcode","id":"*(^6fQ{j/V.kg,ho=|:N","inputs":{"CODE":{"block":{"type":"text","id":"7hY96DknnQ/t#Xq?Q`dz","fields":{"TEXT":"turtle.down()"}}}},"next":{"block":{"type":"controls_repeat_ext","id":"$%Y?,,|7H1k$t+Jn)I}r","inputs":{"TIMES":{"shadow":{"type":"math_number","id":"s.U14p%aW!FTHv{Re%tn","fields":{"NUM":10}}},"DO":{"block":{"type":"ide_addcode","id":"]{qn$;Fr@4:nCTC%VK@d","inputs":{"CODE":{"block":{"type":"text","id":"*h}KRP|Z|Z8~bz+}Lb|S","fields":{"TEXT":"turtle.forward()"}}}},"next":{"block":{"type":"ide_addcode","id":"4*u|eIRv$3l8gVAe-#G6","inputs":{"CODE":{"block":{"type":"text","id":"vJr{;31CY5XLpno1G1l`","fields":{"TEXT":"turtle.dig(\"left\")"}}}}}}}}},"next":{"block":{"type":"ide_addcode","id":"MYaWPpTW,*Sbr$qHdP;X","inputs":{"CODE":{"block":{"type":"text","id":"4yq!yCVpT7zAkbgx|e}?","fields":{"TEXT":"turtle.up()"}}}},"next":{"block":{"type":"ide_addcode","id":"}oNps@eRjo{j6Mt*y[M(","inputs":{"CODE":{"block":{"type":"text","id":"Pp6jDe[JkcY^`5J3FtzJ","fields":{"TEXT":"turtle.forward()"}}}},"next":{"block":{"type":"ide_addcode","id":"GBsH+H_G).Or7Jg#Z/HM","inputs":{"CODE":{"block":{"type":"text","id":"I39UB3G^1g|#PXmIK~/8","fields":{"TEXT":"turtle.forward()"}}}}}}}}}}}}}}}}}}}}]},"variables":[{"name":"fuellevel","id":"v3Vu$~B8ol()F*#n?^)B"}]}}
|
BIN
assets/DOPFoundationLogo.png
Normal file
BIN
assets/DOPFoundationLogo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
BIN
assets/DPSoftware2.png
Normal file
BIN
assets/DPSoftware2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
assets/dpsoftware.png
Normal file
BIN
assets/dpsoftware.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.4 KiB |
1808
blocks/Advanced_Peripherals/block_design.json
Normal file
1808
blocks/Advanced_Peripherals/block_design.json
Normal file
File diff suppressed because it is too large
Load Diff
690
blocks/Advanced_Peripherals/generator.js
Normal file
690
blocks/Advanced_Peripherals/generator.js
Normal file
@ -0,0 +1,690 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
// Generator for chatbox
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_chatbox_send_message'] = function(block, generator) {
|
||||
var chatbox = generator.valueToCode(block, 'CHATBOX', generator.ORDER_ATOMIC);
|
||||
var text = generator.valueToCode(block, 'TEXT', generator.ORDER_ATOMIC);
|
||||
var prefix = generator.valueToCode(block, 'PREFIX', generator.ORDER_ATOMIC);
|
||||
var bracket = generator.valueToCode(block, 'BRACKET', generator.ORDER_ATOMIC);
|
||||
var bracketcolor = generator.valueToCode(block, 'BRACKETCOLOR', generator.ORDER_ATOMIC);
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${chatbox}.sendMessage(${text}, ${prefix}, ${bracket}, ${bracketcolor}, ${range})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_chatbox_send_message_to_player'] = function(block, generator) {
|
||||
var chatbox = generator.valueToCode(block, 'CHATBOX', generator.ORDER_ATOMIC);
|
||||
var text = generator.valueToCode(block, 'TEXT', generator.ORDER_ATOMIC);
|
||||
var player = generator.valueToCode(block, 'PLAYER', generator.ORDER_ATOMIC);
|
||||
var prefix = generator.valueToCode(block, 'PREFIX', generator.ORDER_ATOMIC);
|
||||
var bracket = generator.valueToCode(block, 'BRACKET', generator.ORDER_ATOMIC);
|
||||
var bracketcolor = generator.valueToCode(block, 'BRACKETCOLOR', generator.ORDER_ATOMIC);
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${chatbox}.sendMessageToPlayer(${text}, ${player}, ${prefix}, ${bracket}, ${bracketcolor}, ${range})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_chatbox_send_toast_to_player'] = function(block, generator) {
|
||||
var chatbox = generator.valueToCode(block, 'CHATBOX', generator.ORDER_ATOMIC);
|
||||
var text = generator.valueToCode(block, 'TEXT', generator.ORDER_ATOMIC);
|
||||
var title = generator.valueToCode(block, 'TITLE', generator.ORDER_ATOMIC);
|
||||
var player = generator.valueToCode(block, 'PLAYER', generator.ORDER_ATOMIC);
|
||||
var prefix = generator.valueToCode(block, 'PREFIX', generator.ORDER_ATOMIC);
|
||||
var bracket = generator.valueToCode(block, 'BRACKET', generator.ORDER_ATOMIC);
|
||||
var bracketcolor = generator.valueToCode(block, 'BRACKETCOLOR', generator.ORDER_ATOMIC);
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${chatbox}.sendToastToPlayer(${text}, ${title}, ${player}, ${prefix}, ${bracket}, ${bracketcolor}, ${range})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_chatbox_send_message_formatted'] = function(block, generator) {
|
||||
var chatbox = generator.valueToCode(block, 'CHATBOX', generator.ORDER_ATOMIC);
|
||||
var json = generator.valueToCode(block, 'JSON', generator.ORDER_ATOMIC);
|
||||
var prefix = generator.valueToCode(block, 'PREFIX', generator.ORDER_ATOMIC);
|
||||
var bracket = generator.valueToCode(block, 'BRACKET', generator.ORDER_ATOMIC);
|
||||
var bracketcolor = generator.valueToCode(block, 'BRACKETCOLOR', generator.ORDER_ATOMIC);
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${chatbox}.sendFormattedMessage(${json}, ${prefix}, ${bracket}, ${bracketcolor}, ${range})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_chatbox_send_message_formatted_to_player'] = function(block, generator) {
|
||||
var chatbox = generator.valueToCode(block, 'CHATBOX', generator.ORDER_ATOMIC);
|
||||
var json = generator.valueToCode(block, 'JSON', generator.ORDER_ATOMIC);
|
||||
var player = generator.valueToCode(block, 'PLAYER', generator.ORDER_ATOMIC);
|
||||
var prefix = generator.valueToCode(block, 'PREFIX', generator.ORDER_ATOMIC);
|
||||
var bracket = generator.valueToCode(block, 'BRACKET', generator.ORDER_ATOMIC);
|
||||
var bracketcolor = generator.valueToCode(block, 'BRACKETCOLOR', generator.ORDER_ATOMIC);
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${chatbox}.sendFormattedMessageToPlayer(${json}, ${player}, ${prefix}, ${bracket}, ${bracketcolor}, ${range})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_chatbox_send_toast_formatted_to_player'] = function(block, generator) {
|
||||
var chatbox = generator.valueToCode(block, 'CHATBOX', generator.ORDER_ATOMIC);
|
||||
var json = generator.valueToCode(block, 'JSON', generator.ORDER_ATOMIC);
|
||||
var title = generator.valueToCode(block, 'TITLE', generator.ORDER_ATOMIC);
|
||||
var player = generator.valueToCode(block, 'PLAYER', generator.ORDER_ATOMIC);
|
||||
var prefix = generator.valueToCode(block, 'PREFIX', generator.ORDER_ATOMIC);
|
||||
var bracket = generator.valueToCode(block, 'BRACKET', generator.ORDER_ATOMIC);
|
||||
var bracketcolor = generator.valueToCode(block, 'BRACKETCOLOR', generator.ORDER_ATOMIC);
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${chatbox}.sendFormattedToastToPlayer(${json}, ${title}, ${player}, ${prefix}, ${bracket}, ${bracketcolor}, ${range})\n`;
|
||||
};
|
||||
|
||||
// Generator for Energy Detector
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_energy_detector_get_transfer_rate'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getTransferRate()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_energy_detector_get_transfer_rate_limit'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getTransferRateLimit()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_energy_detector_set_transfer_rate_limit'] = function(block, generator) {
|
||||
var limit = generator.valueToCode(block, 'TFRLIMIT', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${detector}.setTransferRateLimit(${limit})\n`;
|
||||
};
|
||||
|
||||
// Generator for Environment Detector
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_biome'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getBiome()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_block_light_level'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getBlockLightLevel()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_day_light_level'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getDayLightLevel()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_sky_light_level'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getSkyLightLevel()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_dimension_name'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getDimensionName()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_dimension_PaN'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getDimensionPaN()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_dimension_provider'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getDimensionProvider()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_moon_id'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getMoonId()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_moon_name'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getMoonName()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_time'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getTime()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_radiation'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getRadiation()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_get_radiation_raw'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getRadiationRaw()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_is_dimension'] = function(block, generator) {
|
||||
var dimension = generator.valueToCode(block, 'DIMENSION', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isDimension(${dimension})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_is_moon'] = function(block, generator) {
|
||||
var id = generator.valueToCode(block, 'MOONID', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isMoon(${id})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_is_raining'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isRaining()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_is_sunny'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isSunny()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_is_thunder'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isThunder()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_is_slime_chunk'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isSlimeChunk()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_list_dimensions'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.listDimensions()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_env_detector_scan_entities'] = function(block, generator) {
|
||||
var blockrange = generator.valueToCode(block, "BLOCKSRANGE", generator.ORDER_ATOMIC)
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.scanEntities(${blockrange})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Generator for Player Detector
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_get_player_pos'] = function(block, generator) {
|
||||
var player = generator.valueToCode(block, "PLAYER", generator.ORDER_ATOMIC)
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getPlayer(${player})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_get_online_player'] = function(block, generator) {
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getOnlinePlayers()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_get_player_in_range'] = function(block, generator) {
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getPlayersInRange(${range})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_get_players_in_coords'] = function(block, generator) {
|
||||
var FX = generator.valueToCode(block, 'FX', generator.ORDER_ATOMIC);
|
||||
var FY = generator.valueToCode(block, 'FY', generator.ORDER_ATOMIC);
|
||||
var FZ = generator.valueToCode(block, 'FZ', generator.ORDER_ATOMIC);
|
||||
var TX = generator.valueToCode(block, 'TX', generator.ORDER_ATOMIC);
|
||||
var TY = generator.valueToCode(block, 'TY', generator.ORDER_ATOMIC);
|
||||
var TZ = generator.valueToCode(block, 'TZ', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getPlayersInCoords({x=${FX}, y=${FY}, z=${FZ}}, {x=${TX}, y=${TY}, z=${TZ}})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_get_players_in_cubic'] = function(block, generator) {
|
||||
var width = generator.valueToCode(block, 'WIDTH', generator.ORDER_ATOMIC);
|
||||
var height = generator.valueToCode(block, 'HEIGHT', generator.ORDER_ATOMIC);
|
||||
var depth = generator.valueToCode(block, 'DEPTH', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.getPlayersInCubic(${width}, ${height}, ${depth})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_is_player_in_range'] = function(block, generator) {
|
||||
var player = generator.valueToCode(block, 'PLAYER', generator.ORDER_ATOMIC);
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isPlayerInRange(${range}, ${player})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_is_player_in_coords'] = function(block, generator) {
|
||||
var player = generator.valueToCode(block, 'PLAYER', generator.ORDER_ATOMIC);
|
||||
var FX = generator.valueToCode(block, 'FX', generator.ORDER_ATOMIC);
|
||||
var FY = generator.valueToCode(block, 'FY', generator.ORDER_ATOMIC);
|
||||
var FZ = generator.valueToCode(block, 'FZ', generator.ORDER_ATOMIC);
|
||||
var TX = generator.valueToCode(block, 'TX', generator.ORDER_ATOMIC);
|
||||
var TY = generator.valueToCode(block, 'TY', generator.ORDER_ATOMIC);
|
||||
var TZ = generator.valueToCode(block, 'TZ', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isPlayerInCoords({x=${FX}, y=${FY}, z=${FZ}}, {x=${TX}, y=${TY}, z=${TZ}}, ${player})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_is_player_in_cubic'] = function(block, generator) {
|
||||
var player = generator.valueToCode(block, 'PLAYER', generator.ORDER_ATOMIC);
|
||||
var width = generator.valueToCode(block, 'WIDTH', generator.ORDER_ATOMIC);
|
||||
var height = generator.valueToCode(block, 'HEIGHT', generator.ORDER_ATOMIC);
|
||||
var depth = generator.valueToCode(block, 'DEPTH', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isPlayerInCubic(${width}, ${height}, ${depth}, ${player})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_is_players_in_range'] = function(block, generator) {
|
||||
var range = generator.valueToCode(block, 'RANGE', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isPlayersInRange(${range})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_is_players_in_coords'] = function(block, generator) {
|
||||
var FX = generator.valueToCode(block, 'FX', generator.ORDER_ATOMIC);
|
||||
var FY = generator.valueToCode(block, 'FY', generator.ORDER_ATOMIC);
|
||||
var FZ = generator.valueToCode(block, 'FZ', generator.ORDER_ATOMIC);
|
||||
var TX = generator.valueToCode(block, 'TX', generator.ORDER_ATOMIC);
|
||||
var TY = generator.valueToCode(block, 'TY', generator.ORDER_ATOMIC);
|
||||
var TZ = generator.valueToCode(block, 'TZ', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isPlayersInCoords({x=${FX}, y=${FY}, z=${FZ}}, {x=${TX}, y=${TY}, z=${TZ}})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_player_detector_is_players_in_cubic'] = function(block, generator) {
|
||||
var width = generator.valueToCode(block, 'WIDTH', generator.ORDER_ATOMIC);
|
||||
var height = generator.valueToCode(block, 'HEIGHT', generator.ORDER_ATOMIC);
|
||||
var depth = generator.valueToCode(block, 'DEPTH', generator.ORDER_ATOMIC);
|
||||
var detector = generator.valueToCode(block, 'DETECTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${detector}.isPlayersInCubic(${width}, ${height}, ${depth})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Generator for Inventory Manager
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_add_item_to_player'] = function(block, generator) {
|
||||
var item = generator.valueToCode(block, 'ITEM', generator.ORDER_ATOMIC);
|
||||
var toslot = generator.valueToCode(block, 'TOSLOT', generator.ORDER_ATOMIC);
|
||||
var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${manager}.addItemToPlayer("${side}", {name=${item}, toSlot=${toslot}, count=${count}})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_remove_item_from_player'] = function(block, generator) {
|
||||
var item = generator.valueToCode(block, 'ITEM', generator.ORDER_ATOMIC);
|
||||
var fromslot = generator.valueToCode(block, 'FROMSLOT', generator.ORDER_ATOMIC);
|
||||
var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC);
|
||||
var toslot = generator.valueToCode(block, 'TOSLOT', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${manager}.removeItemFromPlayer("${side}", {name=${item}, toSlot=${toslot}, fromSlot=${fromslot}, count=${count}})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_get_armor'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.getArmor()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_get_items'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.getItems()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_get_owner'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.getOwner()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_is_player_equipped'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.isPlayerEquipped()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_is_wearing'] = function(block, generator) {
|
||||
var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC);
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.isWearing(${slot})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_get_item_in_hand'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.getItemInHand()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_get_item_in_offhand'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.getItemInOffHand()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_get_free_slot'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.getFreeSlot()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_is_space_available'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.isSpaceAvailable()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_inv_manager_get_empty_space'] = function(block, generator) {
|
||||
var manager = generator.valueToCode(block, 'MANAGER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${manager}.getEmptySpace()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Generator for NBT Storage
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_nbt_storage_read'] = function(block, generator) {
|
||||
var nbtstorage = generator.valueToCode(block, 'NBTDEV', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${nbtstorage}.read()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_nbt_storage_write_json'] = function(block, generator) {
|
||||
var nbtjson = generator.valueToCode(block, 'NBTJSON', generator.ORDER_ATOMIC);
|
||||
var nbtstorage = generator.valueToCode(block, 'NBTDEV', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${nbtstorage}.writeJson(${nbtjson})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_nbt_storage_write_table'] = function(block, generator) {
|
||||
var nbt = generator.valueToCode(block, 'NBT', generator.ORDER_ATOMIC);
|
||||
var nbtstorage = generator.valueToCode(block, 'NBTDEV', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${nbtstorage}.writeTable(${nbt})\n`;
|
||||
};
|
||||
|
||||
// Generator for Block Reader
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_block_reader_get_block_name'] = function(block, generator) {
|
||||
var reader = generator.valueToCode(block, 'READER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${reader}.getBlockName()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_block_reader_get_block_data'] = function(block, generator) {
|
||||
var reader = generator.valueToCode(block, 'READER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${reader}.getBlockData()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_block_reader_get_block_states'] = function(block, generator) {
|
||||
var reader = generator.valueToCode(block, 'READER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${reader}.getBlockStates()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_block_reader_is_tile_entity'] = function(block, generator) {
|
||||
var reader = generator.valueToCode(block, 'READER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${reader}.isTileEntity()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Generator for Geo Scanner
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_geo_scanner_get_fuel_level'] = function(block, generator) {
|
||||
var scanner = generator.valueToCode(block, 'SCANNER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${scanner}.getFuelLevel()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_geo_scanner_get_max_fuel_level'] = function(block, generator) {
|
||||
var scanner = generator.valueToCode(block, 'SCANNER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${scanner}.getMaxFuelLevel()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_geo_scanner_cost'] = function(block, generator) {
|
||||
var radius = generator.valueToCode(block, 'RADIUS', generator.ORDER_ATOMIC);
|
||||
var scanner = generator.valueToCode(block, 'SCANNER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${scanner}.cost(${radius})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_geo_scanner_scan'] = function(block, generator) {
|
||||
var radius = generator.valueToCode(block, 'RADIUS', generator.ORDER_ATOMIC);
|
||||
var scanner = generator.valueToCode(block, 'SCANNER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${scanner}.scan(${radius})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_geo_get_scan_cooldown'] = function(block, generator) {
|
||||
var scanner = generator.valueToCode(block, 'SCANNER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${scanner}.getScanCooldown()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_geo_chunk_analyze'] = function(block, generator) {
|
||||
var scanner = generator.valueToCode(block, 'SCANNER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${scanner}.chunkAnalyze()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Generator for Redstone Integrator
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_redstone_integrator_get_input'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var integrator = generator.valueToCode(block, 'INTEGRATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${integrator}.getInput("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_redstone_integrator_get_output'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var integrator = generator.valueToCode(block, 'INTEGRATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${integrator}.getOutput("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_redstone_integrator_get_analog_input'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var integrator = generator.valueToCode(block, 'INTEGRATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${integrator}.getAnalogInput("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_redstone_integrator_get_analog_output'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var integrator = generator.valueToCode(block, 'INTEGRATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${integrator}.getAnalogOutput("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_redstone_integrator_set_output'] = function(block, generator) {
|
||||
var powered = block.getFieldValue('POWERED');
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var integrator = generator.valueToCode(block, 'INTEGRATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
var ispowerd;
|
||||
if (powered == "ON") {
|
||||
ispowerd = "true";
|
||||
} else {
|
||||
ispowerd = "false";
|
||||
}
|
||||
|
||||
return `${integrator}.setOutput("${side}", ${ispowerd})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_redstone_integrator_set_analog_output'] = function(block, generator) {
|
||||
var power = generator.valueToCode(block, 'POWER', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var integrator = generator.valueToCode(block, 'INTEGRATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${integrator}.setOutput("${side}", ${power})\n`;
|
||||
};
|
||||
|
||||
// Generator for Minecraft: Beacon
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_mc_beacon_get_level'] = function(block, generator) {
|
||||
var beacon = generator.valueToCode(block, 'BEACON', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${beacon}.getLevel()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_mc_beacon_get_primary_effect'] = function(block, generator) {
|
||||
var beacon = generator.valueToCode(block, 'BEACON', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${beacon}.getPrimaryEffect()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_mc_beacon_get_secondary_effect'] = function(block, generator) {
|
||||
var beacon = generator.valueToCode(block, 'BEACON', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${beacon}.getSecondaryEffect()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Generator for Minecraft: Note Block
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_mc_note_block_play_note'] = function(block, generator) {
|
||||
var noteblock = generator.valueToCode(block, 'NOTEBLOCK', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${noteblock}.playNote()\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_mc_note_block_get_note'] = function(block, generator) {
|
||||
var noteblock = generator.valueToCode(block, 'NOTEBLOCK', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${beacon}.getNote()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_mc_note_block_change_note_by'] = function(block, generator) {
|
||||
var to = generator.valueToCode(block, 'TO', generator.ORDER_ATOMIC);
|
||||
var noteblock = generator.valueToCode(block, 'NOTEBLOCK', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${noteblock}.changeNoteBy(${to})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_mc_note_block_change_note'] = function(block, generator) {
|
||||
var noteblock = generator.valueToCode(block, 'NOTEBLOCK', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${noteblock}.changeNote()\n`;
|
||||
};
|
||||
|
||||
// Generator for Botania: Flowers
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_flowers_get_mana'] = function(block, generator) {
|
||||
var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${flower}.getMana()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_flowers_get_max_mana'] = function(block, generator) {
|
||||
var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${flower}.getMaxMana()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_flowers_is_floating'] = function(block, generator) {
|
||||
var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${flower}.isFloating()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_flowers_is_on_enchanted_soil'] = function(block, generator) {
|
||||
var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${flower}.isOnEnchantedSoil()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_flowers_is_empty'] = function(block, generator) {
|
||||
var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${flower}.isEmpty()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_flowers_is_full'] = function(block, generator) {
|
||||
var flower = generator.valueToCode(block, 'FLOWER', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${flower}.isFull()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Generator for Botania: Mana Pool
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_get_mana'] = function(block, generator) {
|
||||
var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pool}.getMana()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_get_max_mana'] = function(block, generator) {
|
||||
var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pool}.getMaxMana()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_get_mana_needed'] = function(block, generator) {
|
||||
var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pool}.getManaNeeded()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_is_empty'] = function(block, generator) {
|
||||
var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pool}.isEmpty()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_is_full'] = function(block, generator) {
|
||||
var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pool}.isFull()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_can_charge_item'] = function(block, generator) {
|
||||
var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pool}.canChargeItem()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_has_items'] = function(block, generator) {
|
||||
var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pool}.hasItems()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['advanced_peripherals_botania_mana_pool_get_items'] = function(block, generator) {
|
||||
var pool = generator.valueToCode(block, 'POOL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pool}.getItems()`, luaGenerator.ORDER_NONE];
|
||||
};
|
BIN
blocks/Advanced_Peripherals/icon.png
Normal file
BIN
blocks/Advanced_Peripherals/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
24
blocks/Advanced_Peripherals/index.json
Normal file
24
blocks/Advanced_Peripherals/index.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "Advanced Peripherals",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Advanced Peripherals is a mod that adds many useful extensions for CC:Tweaked.",
|
||||
"version": "1.2",
|
||||
"category": "Mod",
|
||||
"keyword": "mod",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": true,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [
|
||||
"CCPeripheral"
|
||||
],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": true,
|
||||
"advpocket": true,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
526
blocks/Advanced_Peripherals/toolbox.xml
Normal file
526
blocks/Advanced_Peripherals/toolbox.xml
Normal file
@ -0,0 +1,526 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Advanced Peripherals" colour="200">
|
||||
<label text="ChatBox"></label>
|
||||
<label text="Event: chat"></label>
|
||||
<block type="advanced_peripherals_chatbox_send_message">
|
||||
<value name="TEXT">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Hello, world!</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PREFIX">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKET">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKETCOLOR">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="RANGE">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_chatbox_send_message_to_player">
|
||||
<value name="TEXT">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Hello, world!</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PLAYER">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Player</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PREFIX">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKET">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKETCOLOR">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="RANGE">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_chatbox_send_toast_to_player">
|
||||
<value name="TEXT">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Hello, world!</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TITLE">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Hi</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PLAYER">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Player</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PREFIX">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKET">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKETCOLOR">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="RANGE">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_chatbox_send_message_formatted">
|
||||
<value name="PREFIX">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKET">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKETCOLOR">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="RANGE">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_chatbox_send_message_formatted_to_player">
|
||||
<value name="PLAYER">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Player</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PREFIX">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKET">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKETCOLOR">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="RANGE">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_chatbox_send_toast_formatted_to_player">
|
||||
<value name="TITLE">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Hi</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PLAYER">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Player</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PREFIX">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKET">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="BRACKETCOLOR">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
<value name="RANGE">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
|
||||
<label text="Energy Detector"></label>
|
||||
<block type="advanced_peripherals_energy_detector_get_transfer_rate"></block>
|
||||
<block type="advanced_peripherals_energy_detector_get_transfer_rate_limit"></block>
|
||||
<block type="advanced_peripherals_energy_detector_set_transfer_rate_limit">
|
||||
<value name="TFRLIMIT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">512</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
|
||||
<label text="Environment Detector"></label>
|
||||
<block type="advanced_peripherals_env_detector_get_biome"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_block_light_level"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_day_light_level"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_sky_light_level"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_dimension_name"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_dimension_PaN"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_dimension_provider"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_moon_id"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_moon_name"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_time"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_radiation"></block>
|
||||
<block type="advanced_peripherals_env_detector_get_radiation_raw"></block>
|
||||
<block type="advanced_peripherals_env_detector_is_dimension">
|
||||
<value name="DIMENSION">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">minecraft:overworld</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_env_detector_is_moon">
|
||||
<value name="MOONID">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_env_detector_is_raining"></block>
|
||||
<block type="advanced_peripherals_env_detector_is_sunny"></block>
|
||||
<block type="advanced_peripherals_env_detector_is_thunder"></block>
|
||||
<block type="advanced_peripherals_env_detector_is_slime_chunk"></block>
|
||||
<block type="advanced_peripherals_env_detector_list_dimensions"></block>
|
||||
<block type="advanced_peripherals_env_detector_scan_entities">
|
||||
<value name="BLOCKSRANGE">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">32</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
|
||||
<label text="Player Detector"></label>
|
||||
<label text="Event: playerClick, playerJoin, playerLeave, playerChangedDimension"></label>
|
||||
<block type="advanced_peripherals_player_detector_get_player_pos">
|
||||
<value name="PLAYER">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Player</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_get_online_player"></block>
|
||||
<block type="advanced_peripherals_player_detector_get_player_in_range">
|
||||
<value name="RANGE">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">10</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_get_players_in_coords">
|
||||
<value name="FX">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="FY">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="FZ">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TX">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TY">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TZ">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_get_players_in_cubic">
|
||||
<value name="WIDTH">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="HEIGHT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="DEPTH">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_is_player_in_range">
|
||||
<value name="PLAYER">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Player</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="RANGE">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">10</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_is_player_in_coords">
|
||||
<value name="PLAYER">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Player</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="FX">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="FY">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="FZ">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TX">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TY">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TZ">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_is_player_in_cubic">
|
||||
<value name="PLAYER">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Player</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="WIDTH">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="HEIGHT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="DEPTH">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_is_players_in_range">
|
||||
<value name="RANGE">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">10</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_is_players_in_coords">
|
||||
<value name="FX">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="FY">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="FZ">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TX">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TY">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TZ">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_player_detector_is_players_in_cubic">
|
||||
<value name="WIDTH">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="HEIGHT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="DEPTH">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
|
||||
<label text="Inventory Manager"></label>
|
||||
<block type="advanced_peripherals_inv_manager_add_item_to_player">
|
||||
<value name="ITEM">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">minecraft:grass_block</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TOSLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="COUNT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">64</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_inv_manager_remove_item_from_player">
|
||||
<value name="ITEM">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">minecraft:grass_block</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="FROMSLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="COUNT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">64</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TOSLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_inv_manager_get_armor"></block>
|
||||
<block type="advanced_peripherals_inv_manager_get_items"></block>
|
||||
<block type="advanced_peripherals_inv_manager_get_owner"></block>
|
||||
<block type="advanced_peripherals_inv_manager_is_player_equipped"></block>
|
||||
<block type="advanced_peripherals_inv_manager_is_wearing">
|
||||
<value name="SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_inv_manager_get_item_in_hand"></block>
|
||||
<block type="advanced_peripherals_inv_manager_get_item_in_offhand"></block>
|
||||
<block type="advanced_peripherals_inv_manager_get_free_slot"></block>
|
||||
<block type="advanced_peripherals_inv_manager_is_space_available"></block>
|
||||
<block type="advanced_peripherals_inv_manager_get_empty_space"></block>
|
||||
|
||||
<label text="NBT Storage"></label>
|
||||
<block type="advanced_peripherals_nbt_storage_read"></block>
|
||||
<block type="advanced_peripherals_nbt_storage_write_json"></block>
|
||||
<block type="advanced_peripherals_nbt_storage_write_table"></block>
|
||||
|
||||
<label text="Block Reader"></label>
|
||||
<block type="advanced_peripherals_block_reader_get_block_name"></block>
|
||||
<block type="advanced_peripherals_block_reader_get_block_data"></block>
|
||||
<block type="advanced_peripherals_block_reader_get_block_states"></block>
|
||||
<block type="advanced_peripherals_block_reader_is_tile_entity"></block>
|
||||
|
||||
<label text="Geo Scanner"></label>
|
||||
<block type="advanced_peripherals_geo_scanner_get_fuel_level"></block>
|
||||
<block type="advanced_peripherals_geo_scanner_get_max_fuel_level"></block>
|
||||
<block type="advanced_peripherals_geo_scanner_cost">
|
||||
<value name="RADIUS">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_geo_scanner_scan">
|
||||
<value name="RADIUS">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_geo_get_scan_cooldown"></block>
|
||||
<block type="advanced_peripherals_geo_chunk_analyze"></block>
|
||||
|
||||
<label text="Redstone Integrator"></label>
|
||||
<block type="advanced_peripherals_redstone_integrator_get_input"></block>
|
||||
<block type="advanced_peripherals_redstone_integrator_get_output"></block>
|
||||
<block type="advanced_peripherals_redstone_integrator_get_analog_input"></block>
|
||||
<block type="advanced_peripherals_redstone_integrator_get_analog_output"></block>
|
||||
<block type="advanced_peripherals_redstone_integrator_set_output"></block>
|
||||
<block type="advanced_peripherals_redstone_integrator_set_analog_output">
|
||||
<value name="POWER">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">15</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
|
||||
<label text="AR Controller"></label>
|
||||
|
||||
<label text="ME Bridge"></label>
|
||||
|
||||
<label text="RS Bridge"></label>
|
||||
|
||||
<label text="Colony Integrator"></label>
|
||||
|
||||
<label text="Minecraft: Beacon"></label>
|
||||
<block type="advanced_peripherals_mc_beacon_get_level"></block>
|
||||
<block type="advanced_peripherals_mc_beacon_get_primary_effect"></block>
|
||||
<block type="advanced_peripherals_mc_beacon_get_secondary_effect"></block>
|
||||
|
||||
<label text="Minecraft: Note Block"></label>
|
||||
<block type="advanced_peripherals_mc_note_block_play_note"></block>
|
||||
<block type="advanced_peripherals_mc_note_block_get_note"></block>
|
||||
<block type="advanced_peripherals_mc_note_block_change_note_by">
|
||||
<value name="TO">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="advanced_peripherals_mc_note_block_change_note"></block>
|
||||
|
||||
<label text="Botania: Flowers"></label>
|
||||
<block type="advanced_peripherals_botania_flowers_get_mana"></block>
|
||||
<block type="advanced_peripherals_botania_flowers_get_max_mana"></block>
|
||||
<block type="advanced_peripherals_botania_flowers_is_floating"></block>
|
||||
<block type="advanced_peripherals_botania_flowers_is_on_enchanted_soil"></block>
|
||||
<block type="advanced_peripherals_botania_flowers_is_empty"></block>
|
||||
<block type="advanced_peripherals_botania_flowers_is_full"></block>
|
||||
|
||||
<label text="Botania: Mana Pool"></label>
|
||||
<block type="advanced_peripherals_botania_mana_pool_get_mana"></block>
|
||||
<block type="advanced_peripherals_botania_mana_pool_get_max_mana"></block>
|
||||
<block type="advanced_peripherals_botania_mana_pool_get_mana_needed"></block>
|
||||
<block type="advanced_peripherals_botania_mana_pool_is_empty"></block>
|
||||
<block type="advanced_peripherals_botania_mana_pool_is_full"></block>
|
||||
<block type="advanced_peripherals_botania_mana_pool_can_charge_item"></block>
|
||||
<block type="advanced_peripherals_botania_mana_pool_has_items"></block>
|
||||
<block type="advanced_peripherals_botania_mana_pool_get_items"></block>
|
||||
|
||||
</category>
|
||||
</xml>
|
63
blocks/CCColors/block_design.json
Normal file
63
blocks/CCColors/block_design.json
Normal file
@ -0,0 +1,63 @@
|
||||
{
|
||||
"colors_color_picker": {
|
||||
"message0": "Color %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "COLOR",
|
||||
"options": [
|
||||
["White", "colors.white"],
|
||||
["Orange", "colors.orange"],
|
||||
["Magenta", "colors.magenta"],
|
||||
["Light blue", "colors.lightBlue"],
|
||||
["Yellow", "colors.yellow"],
|
||||
["Lime", "colors.lime"],
|
||||
["Pink", "colors.pink"],
|
||||
["Gray", "colors.gray"],
|
||||
["Light gray", "colors.lightGray"],
|
||||
["Cyan", "colors.cyan"],
|
||||
["Purple", "colors.purple"],
|
||||
["Blue", "colors.blue"],
|
||||
["Brown", "colors.brown"],
|
||||
["Green", "colors.green"],
|
||||
["Red", "colors.red"],
|
||||
["Black", "colors.black"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "CCColors",
|
||||
"colour": 192,
|
||||
"tooltip": "Pick color value"
|
||||
},
|
||||
"colors_combine": {
|
||||
"message0": "Combine color from %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "COLORARRAY",
|
||||
"check": "Array"
|
||||
}
|
||||
],
|
||||
"output": "CCColors",
|
||||
"colour": 192,
|
||||
"tooltip": "Combines a set of colors (or sets of colors) into a larger set."
|
||||
},
|
||||
"colors_subtract": {
|
||||
"message0": "Subtract color %1 from %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "COLORARRAY",
|
||||
"check": "Array"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "COLOR",
|
||||
"check": "CCColors"
|
||||
}
|
||||
],
|
||||
"output": "CCColors",
|
||||
"colour": 192,
|
||||
"tooltip": "Removes one or more colors (or sets of colors) from an initial set."
|
||||
}
|
||||
}
|
26
blocks/CCColors/generator.js
Normal file
26
blocks/CCColors/generator.js
Normal file
@ -0,0 +1,26 @@
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['colors_color_picker'] = function(block, generator) {
|
||||
var color = block.getFieldValue('COLOR');
|
||||
|
||||
return [color, generator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['colors_combine'] = function(block, generator) {
|
||||
var colorArray = generator.valueToCode(block, 'COLORARRAY', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`colors.combine(table.unpack(${colorArray}))`, generator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['colors_subtract'] = function(block, generator) {
|
||||
var colorArray = generator.valueToCode(block, 'COLORARRAY', generator.ORDER_ATOMIC);
|
||||
var color = generator.valueToCode(block, 'COLOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`colors.subtract(${color}, table.unpack(${colorArray}))`, generator.ORDER_NONE];
|
||||
};
|
||||
|
22
blocks/CCColors/index.json
Normal file
22
blocks/CCColors/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: Colors",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Constants and functions for colour values",
|
||||
"version": "0.5",
|
||||
"category": "Display",
|
||||
"keyword": "Colors",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": false,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": false,
|
||||
"adv": true,
|
||||
"command": false,
|
||||
"pocket": false,
|
||||
"advpocket": true,
|
||||
"turtle": false,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
7
blocks/CCColors/toolbox.xml
Normal file
7
blocks/CCColors/toolbox.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Colors" colour="192">
|
||||
<block type="colors_color_picker"></block>
|
||||
<block type="colors_combine"></block>
|
||||
<block type="colors_subtract"></block>
|
||||
</category>
|
||||
</xml>
|
232
blocks/CCDisk/block_design.json
Normal file
232
blocks/CCDisk/block_design.json
Normal file
@ -0,0 +1,232 @@
|
||||
{
|
||||
"disk_is_present": {
|
||||
"message0": "Is disk %1 present?",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Boolean",
|
||||
"colour": 160,
|
||||
"tooltip": "Check if any item is present in the disk drive"
|
||||
},
|
||||
"disk_get_label": {
|
||||
"message0": "get label disk %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 160,
|
||||
"tooltip": "Get the label of the disk in the drive"
|
||||
},
|
||||
"disk_set_label": {
|
||||
"message0": "set label disk %1 to %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "LABEL",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 160,
|
||||
"tooltip": "Set the label of the disk in the drive"
|
||||
},
|
||||
"disk_has_data": {
|
||||
"message0": "Is disk %1 have data?",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Boolean",
|
||||
"colour": 160,
|
||||
"tooltip": "Check if the disk has data"
|
||||
},
|
||||
"disk_get_mount_path": {
|
||||
"message0": "get mount path of disk %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 160,
|
||||
"tooltip": "Get the mount path of the disk"
|
||||
},
|
||||
"disk_has_audio": {
|
||||
"message0": "Is disk %1 have audio?",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Boolean",
|
||||
"colour": 160,
|
||||
"tooltip": "Check if the disk has audio"
|
||||
},
|
||||
"disk_get_audio_title": {
|
||||
"message0": "get audio title of disk %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": ["String", "Boolean"],
|
||||
"colour": 160,
|
||||
"tooltip": "Get the title of the audio track"
|
||||
},
|
||||
"disk_play_audio": {
|
||||
"message0": "play audio disk %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 160,
|
||||
"tooltip": "Play the audio track on the disk"
|
||||
},
|
||||
"disk_stop_audio": {
|
||||
"message0": "stop audio on %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 160,
|
||||
"tooltip": "Stop the audio track on the disk"
|
||||
},
|
||||
"disk_eject": {
|
||||
"message0": "eject disk %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 160,
|
||||
"tooltip": "Eject the disk from the drive",
|
||||
"helpUrl": ""
|
||||
},
|
||||
"disk_get_id": {
|
||||
"message0": "get ID of disk %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["Left", "left"],
|
||||
["Right", "right"],
|
||||
["Front", "front"],
|
||||
["Back", "back"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 160,
|
||||
"tooltip": "Get the unique ID of the disk"
|
||||
}
|
||||
}
|
75
blocks/CCDisk/generator.js
Normal file
75
blocks/CCDisk/generator.js
Normal file
@ -0,0 +1,75 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['disk_is_present'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`disk.isPresent("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_get_label'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`disk.getLabel("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_set_label'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
var label = generator.valueToCode(block, 'LABEL', generator.ORDER_ATOMIC);
|
||||
|
||||
return `disk.setLabel("${side}", ${label})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_has_data'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`disk.hasData("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_get_mount_path'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`disk.getMountPath("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_has_audio'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`disk.hasAudio("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_get_audio_title'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`disk.getAudioTitle("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_play_audio'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return `disk.playAudio("${side}")\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_stop_audio'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return `disk.stopAudio("${side}")\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_eject'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return `disk.eject("${side}")\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['disk_get_id'] = function(block, generator) {
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`disk.getID("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
22
blocks/CCDisk/index.json
Normal file
22
blocks/CCDisk/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: Disk",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Blocks for performing operations on disk drives in ccIDE",
|
||||
"version": "1.0.0",
|
||||
"category": "",
|
||||
"keyword": "disk, operations, ccIDE",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": true,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": false,
|
||||
"advpocket": false,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
15
blocks/CCDisk/toolbox.xml
Normal file
15
blocks/CCDisk/toolbox.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Disk" colour="160">
|
||||
<block type="disk_is_present"></block>
|
||||
<block type="disk_get_label"></block>
|
||||
<block type="disk_set_label"></block>
|
||||
<block type="disk_has_data"></block>
|
||||
<block type="disk_get_mount_path"></block>
|
||||
<block type="disk_has_audio"></block>
|
||||
<block type="disk_get_audio_title"></block>
|
||||
<block type="disk_play_audio"></block>
|
||||
<block type="disk_stop_audio"></block>
|
||||
<block type="disk_eject"></block>
|
||||
<block type="disk_get_id"></block>
|
||||
</category>
|
||||
</xml>
|
136
blocks/CCKeys/block_design.json
Normal file
136
blocks/CCKeys/block_design.json
Normal file
@ -0,0 +1,136 @@
|
||||
{
|
||||
"keys_get_key_number": {
|
||||
"message0": "Keys %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "KEY",
|
||||
"options": [
|
||||
["A", "30"],
|
||||
["Apostrophe", "40"],
|
||||
["At", "145"],
|
||||
["Ax", "150"],
|
||||
["B", "48"],
|
||||
["Backspace", "14"],
|
||||
["Backslash", "43"],
|
||||
["CapsLock", "58"],
|
||||
["C", "46"],
|
||||
["Cimcumflex", "144"],
|
||||
["Colon", "146"],
|
||||
["Convert", "121"],
|
||||
["Delete", "211"],
|
||||
["D", "32"],
|
||||
["Down", "208"],
|
||||
["E", "18"],
|
||||
["Eight", "9"],
|
||||
["End", "207"],
|
||||
["Equals", "13"],
|
||||
["F", "33"],
|
||||
["F1", "59"],
|
||||
["F2", "60"],
|
||||
["F3", "61"],
|
||||
["F4", "62"],
|
||||
["F5", "63"],
|
||||
["F6", "64"],
|
||||
["F7", "65"],
|
||||
["F8", "66"],
|
||||
["F9", "67"],
|
||||
["F10", "68"],
|
||||
["F11", "87"],
|
||||
["F12", "88"],
|
||||
["F13", "100"],
|
||||
["F14", "101"],
|
||||
["F15", "102"],
|
||||
["Five", "6"],
|
||||
["Four", "5"],
|
||||
["G", "34"],
|
||||
["H", "35"],
|
||||
["Home", "199"],
|
||||
["I", "23"],
|
||||
["Insert", "210"],
|
||||
["J", "36"],
|
||||
["Kana", "112"],
|
||||
["Kanji", "148"],
|
||||
["K", "37"],
|
||||
["L", "38"],
|
||||
["Left", "203"],
|
||||
["LeftAlt", "56"],
|
||||
["LeftCtrl", "29"],
|
||||
["LeftShift", "42"],
|
||||
["M", "50"],
|
||||
["Minus", "12"],
|
||||
["NumPad0", "82"],
|
||||
["NumPad1", "79"],
|
||||
["NumPad2", "80"],
|
||||
["NumPad3", "81"],
|
||||
["NumPad4", "75"],
|
||||
["NumPad5", "76"],
|
||||
["NumPad6", "77"],
|
||||
["NumPad7", "71"],
|
||||
["NumPad8", "72"],
|
||||
["NumPad9", "73"],
|
||||
["NumPadAdd", "78"],
|
||||
["NumPadComma", "179"],
|
||||
["NumPadDecimal", "83"],
|
||||
["NumPadDivide", "181"],
|
||||
["NumPadEnter", "156"],
|
||||
["NumPadEquals", "141"],
|
||||
["NumPadSubtract", "74"],
|
||||
["NumLock", "69"],
|
||||
["O", "24"],
|
||||
["P", "25"],
|
||||
["PageDown", "209"],
|
||||
["PageUp", "201"],
|
||||
["Period", "52"],
|
||||
["Q", "16"],
|
||||
["R", "19"],
|
||||
["Right", "205"],
|
||||
["RightAlt", "184"],
|
||||
["RightCtrl", "157"],
|
||||
["RightShift", "54"],
|
||||
["Return", "28"],
|
||||
["S", "31"],
|
||||
["ScrollLock", "70"],
|
||||
["SemiColon", "39"],
|
||||
["Seven", "8"],
|
||||
["Slash", "53"],
|
||||
["Space", "57"],
|
||||
["Stop", "149"],
|
||||
["Tab", "15"],
|
||||
["T", "20"],
|
||||
["Three", "4"],
|
||||
["Two", "3"],
|
||||
["U", "22"],
|
||||
["Up", "200"],
|
||||
["V", "47"],
|
||||
["W", "17"],
|
||||
["X", "45"],
|
||||
["Y", "21"],
|
||||
["Yen", "125"],
|
||||
["Z", "44"],
|
||||
["Zero", "11"],
|
||||
["N", "49"],
|
||||
["Noconvert", "123"],
|
||||
["ScollLock", "70"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Number",
|
||||
"colour": 190,
|
||||
"tooltip": "Get key number"
|
||||
},
|
||||
"keys_get_key_name": {
|
||||
"message0": "Get key %1 name",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "KEY",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 190,
|
||||
"tooltip": "Translates a numerical key code to a human-readable name."
|
||||
}
|
||||
}
|
18
blocks/CCKeys/generator.js
Normal file
18
blocks/CCKeys/generator.js
Normal file
@ -0,0 +1,18 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['keys_get_key_number'] = function(block, generator) {
|
||||
return [block.getFieldValue('KEY'), generator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['text_print'] = function(block, generator) {
|
||||
var key = generator.valueToCode(block, 'KEY', generator.ORDER_NONE);
|
||||
return [`keys.getName(${key})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
22
blocks/CCKeys/index.json
Normal file
22
blocks/CCKeys/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: Keys",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Constants for all keyboard 'key codes', as queued by the key event.",
|
||||
"version": "1.0.0",
|
||||
"category": "Input",
|
||||
"keyword": "Keyboard",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": false,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": true,
|
||||
"advpocket": true,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
10
blocks/CCKeys/toolbox.xml
Normal file
10
blocks/CCKeys/toolbox.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Keys" colour="190">
|
||||
<block type="keys_get_key_number"></block>
|
||||
<block type="keys_get_key_name">
|
||||
<value name="KEY">
|
||||
<shadow type="keys_get_key_number"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
</xml>
|
130
blocks/CCPeripheral/block_design.json
Normal file
130
blocks/CCPeripheral/block_design.json
Normal file
@ -0,0 +1,130 @@
|
||||
{
|
||||
"peripheral_get_names": {
|
||||
"message0": "Get all peripheral",
|
||||
"output": "Array",
|
||||
"colour": 240,
|
||||
"tooltip": "Provides a list of all peripherals available."
|
||||
},
|
||||
"peripheral_is_present": {
|
||||
"message0": "Peripheral %1 is present",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Boolean",
|
||||
"colour": 240,
|
||||
"tooltip": "Determines if a peripheral is present with the given name."
|
||||
},
|
||||
"peripheral_get_type": {
|
||||
"message0": "Get type of peripheral %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DEVICE",
|
||||
"check": ["Peripheral", "String"]
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 240,
|
||||
"tooltip": "Get the types of a named or wrapped peripheral."
|
||||
},
|
||||
"peripheral_has_type": {
|
||||
"message0": "Peripheral %1 has type %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DEVICE",
|
||||
"check": ["Peripheral", "String"]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TYPE",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Boolean",
|
||||
"colour": 240,
|
||||
"tooltip": "Check if a peripheral is of a particular type."
|
||||
},
|
||||
"peripheral_get_methods": {
|
||||
"message0": "Get methods of peripheral %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 240,
|
||||
"tooltip": "Get all available methods for the peripheral with the given name."
|
||||
},
|
||||
"peripheral_get_name": {
|
||||
"message0": "Get name of peripheral %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DEVICE",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 240,
|
||||
"tooltip": "Get the name of a peripheral wrapped with peripheral.wrap."
|
||||
},
|
||||
"peripheral_call": {
|
||||
"message0": "Call peripheral %1 with method %2\nand args %3",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "METHOD",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ARGS",
|
||||
"check": "Multiple"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"output": null,
|
||||
"colour": 240,
|
||||
"tooltip": "Call a method on the peripheral with the given name."
|
||||
},
|
||||
"peripheral_wrap": {
|
||||
"message0": "Open peripheral %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Peripheral",
|
||||
"colour": 240,
|
||||
"tooltip": "Get a table containing all functions available on a peripheral. These can then be called instead of using peripheral.call every time."
|
||||
},
|
||||
"peripheral_find": {
|
||||
"message0": "Find peripheral %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Peripheral",
|
||||
"colour": 240,
|
||||
"tooltip": "Find all peripherals of a specific type, and return the wrapped peripherals."
|
||||
}
|
||||
}
|
||||
|
67
blocks/CCPeripheral/generator.js
Normal file
67
blocks/CCPeripheral/generator.js
Normal file
@ -0,0 +1,67 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['peripheral_get_names'] = function(block, generator) {
|
||||
return ["peripheral.getNames()", luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['peripheral_is_present'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`peripheral.isPresent(${name})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['peripheral_get_type'] = function(block, generator) {
|
||||
var device = generator.valueToCode(block, 'DEVICE', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`peripheral.getType(${device})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['peripheral_has_type'] = function(block, generator) {
|
||||
var device = generator.valueToCode(block, 'DEVICE', generator.ORDER_ATOMIC);
|
||||
var type = generator.valueToCode(block, 'TYPE', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`peripheral.hasType(${device}, ${type})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['peripheral_get_methods'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`peripheral.getMethods(${name})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['peripheral_get_name'] = function(block, generator) {
|
||||
var device = generator.valueToCode(block, 'DEVICE', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`peripheral.getName(${device})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['peripheral_call'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_ATOMIC);
|
||||
var method = generator.valueToCode(block, 'METHOD', generator.ORDER_ATOMIC);
|
||||
var args = generator.valueToCode(block, 'ARGS', generator.ORDER_ATOMIC);
|
||||
|
||||
if (block.outputConnection && block.outputConnection.targetConnection) {
|
||||
return [`peripheral.call(${name}, ${method}, ${args})`, luaGenerator.ORDER_NONE];
|
||||
} else {
|
||||
return `peripheral.call(${name}, ${method}, ${args})\n`
|
||||
}
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['peripheral_wrap'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`peripheral.wrap(${name})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['peripheral_find'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`peripheral.find(${name})`, luaGenerator.ORDER_NONE];
|
||||
};
|
22
blocks/CCPeripheral/index.json
Normal file
22
blocks/CCPeripheral/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: Peripheral",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Peripherals are blocks (or turtle and pocket computer upgrades) which can be controlled by a computer.",
|
||||
"version": "1.0.0",
|
||||
"category": "Peripheral",
|
||||
"keyword": "peripheral",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": true,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": false,
|
||||
"advpocket": false,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
47
blocks/CCPeripheral/toolbox.xml
Normal file
47
blocks/CCPeripheral/toolbox.xml
Normal file
@ -0,0 +1,47 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Peripheral" colour="240">
|
||||
<block type="peripheral_get_names"></block>
|
||||
<block type="peripheral_is_present">
|
||||
<value name="NAME">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="peripheral_get_type">
|
||||
<value name="DEVICE">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="peripheral_has_type">
|
||||
<value name="DEVICE">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
<value name="TYPE">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="peripheral_get_methods">
|
||||
<value name="NAME">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="peripheral_get_name"></block>
|
||||
<block type="peripheral_call">
|
||||
<value name="NAME">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
<value name="METHOD">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="peripheral_wrap">
|
||||
<value name="NAME">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="peripheral_find">
|
||||
<value name="NAME">
|
||||
<shadow type="text"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
</xml>
|
28
blocks/CCPeripheral_generic_energy_storage/block_design.json
Normal file
28
blocks/CCPeripheral_generic_energy_storage/block_design.json
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"periph_gen_energy_get": {
|
||||
"message0": "Get current energy from %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ENERGY",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 25,
|
||||
"tooltip": "Get the energy of this block."
|
||||
},
|
||||
"periph_gen_energy_get_capacity": {
|
||||
"message0": "Get max energy capacity from %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ENERGY",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 25,
|
||||
"tooltip": "Get the maximum amount of energy this block can store."
|
||||
}
|
||||
}
|
20
blocks/CCPeripheral_generic_energy_storage/generator.js
Normal file
20
blocks/CCPeripheral_generic_energy_storage/generator.js
Normal file
@ -0,0 +1,20 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['periph_gen_energy_get'] = function(block, generator) {
|
||||
var energy = generator.valueToCode(block, 'ENERGY', generator.ORDER_NONE);
|
||||
|
||||
return [`${energy}.getEnergy()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['periph_gen_energy_get_capacity'] = function(block, generator) {
|
||||
var energy = generator.valueToCode(block, 'ENERGY', generator.ORDER_NONE);
|
||||
|
||||
return [`${energy}.getEnergyCapacity()`, luaGenerator.ORDER_NONE];
|
||||
};
|
24
blocks/CCPeripheral_generic_energy_storage/index.json
Normal file
24
blocks/CCPeripheral_generic_energy_storage/index.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "CC: Generic Energy Storage",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Methods for interacting with blocks which store energy.",
|
||||
"version": "1.0.0",
|
||||
"category": "Peripheral",
|
||||
"keyword": "generic peripheral storage power",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": true,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [
|
||||
"CCPeripheral"
|
||||
],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": false,
|
||||
"advpocket": false,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
6
blocks/CCPeripheral_generic_energy_storage/toolbox.xml
Normal file
6
blocks/CCPeripheral_generic_energy_storage/toolbox.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Energy" colour="25">
|
||||
<block type="periph_gen_energy_get"></block>
|
||||
<block type="periph_gen_energy_get_capacity"></block>
|
||||
</category>
|
||||
</xml>
|
52
blocks/CCPeripheral_generic_fluid_storage/block_design.json
Normal file
52
blocks/CCPeripheral_generic_fluid_storage/block_design.json
Normal file
@ -0,0 +1,52 @@
|
||||
{
|
||||
"periph_gen_fluid_tanks": {
|
||||
"message0": "Get fluid in tanks %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TANKS",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 240,
|
||||
"tooltip": "Get all \"tanks\" in this fluid storage."
|
||||
},
|
||||
"periph_gen_fluid_transfer": {
|
||||
"message0": "Fluid name %1 in tanks %2 %3 tanks %4\nWith limit %5 mb",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FLUIDNAME",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TANKS1",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "MODE",
|
||||
"options": [
|
||||
["Push to", "PUSH"],
|
||||
["Pull from", "PULL"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TANKS2",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "LIMIT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 240,
|
||||
"tooltip": "Transfer a fluid from one fluid container to another connected one."
|
||||
}
|
||||
}
|
28
blocks/CCPeripheral_generic_fluid_storage/generator.js
Normal file
28
blocks/CCPeripheral_generic_fluid_storage/generator.js
Normal file
@ -0,0 +1,28 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['periph_gen_fluid_tanks'] = function(block, generator) {
|
||||
var tanks = generator.valueToCode(block, 'TANKS', generator.ORDER_NONE);
|
||||
|
||||
return [`${tanks}.tanks()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['periph_gen_fluid_transfer'] = function(block, generator) {
|
||||
var fluidname = generator.valueToCode(block, 'FLUIDNAME', generator.ORDER_ATOMIC);
|
||||
var tanks1 = generator.valueToCode(block, 'TANKS1', generator.ORDER_ATOMIC);
|
||||
var mode = block.getFieldValue('MODE');
|
||||
var tanks2 = generator.valueToCode(block, 'TANKS2', generator.ORDER_ATOMIC);
|
||||
var limit = generator.valueToCode(block, 'LIMIT', generator.ORDER_ATOMIC);
|
||||
|
||||
if (mode == "PUSH") {
|
||||
return `${tanks1}.pushFluid(peripheral.getName(${tanks2}), ${limit}, ${fluidname})\n`
|
||||
} else {
|
||||
return `${tanks1}.pullFluid(peripheral.getName(${tanks2}), ${limit}, ${fluidname})\n`
|
||||
}
|
||||
};
|
24
blocks/CCPeripheral_generic_fluid_storage/index.json
Normal file
24
blocks/CCPeripheral_generic_fluid_storage/index.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "CC: Generic Fluid Storage",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Methods for interacting with tanks and other fluid storage blocks.",
|
||||
"version": "1.0.0",
|
||||
"category": "Peripheral",
|
||||
"keyword": "generic peripheral storage",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": true,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [
|
||||
"CCPeripheral"
|
||||
],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": false,
|
||||
"advpocket": false,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
12
blocks/CCPeripheral_generic_fluid_storage/toolbox.xml
Normal file
12
blocks/CCPeripheral_generic_fluid_storage/toolbox.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="FluidTanks" colour="240">
|
||||
<block type="periph_gen_fluid_tanks"></block>
|
||||
<block type="periph_gen_fluid_transfer">
|
||||
<value name="LIMIT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1000</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
</xml>
|
107
blocks/CCPeripheral_generic_inventory/block_design.json
Normal file
107
blocks/CCPeripheral_generic_inventory/block_design.json
Normal file
@ -0,0 +1,107 @@
|
||||
{
|
||||
"periph_gen_inv_size": {
|
||||
"message0": "Size of Inventory %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INV",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 130,
|
||||
"tooltip": "Get the size of this inventory."
|
||||
},
|
||||
"periph_gen_inv_list": {
|
||||
"message0": "List all item in Inventory %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INV",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 130,
|
||||
"tooltip": "List all items in this inventory. This returns a table, with an entry for each slot."
|
||||
},
|
||||
"periph_gen_inv_get_item_detail": {
|
||||
"message0": "Get item detail from inventory %1 in slot %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INV",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SLOT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 130,
|
||||
"tooltip": "Get detailed information about an item.",
|
||||
"helpUrl": "https://tweaked.cc/generic_peripheral/inventory.html#v:getItemDetail"
|
||||
},
|
||||
"periph_gen_inv_get_item_limit": {
|
||||
"message0": "Get item limit from inventory %1 in slot %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INV",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SLOT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 130,
|
||||
"tooltip": "Get the maximum number of items which can be stored in this slot."
|
||||
},
|
||||
"periph_gen_inv_transfer_items": {
|
||||
"message0": "Inventory %1 in slot %2 %3 inventory %4 in slot %5\nWith limit %6 items",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INV1",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INV1SLOT",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "MODE",
|
||||
"options": [
|
||||
["Push to", "PUSH"],
|
||||
["Pull from", "PULL"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INV2",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INV2SLOT",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "LIMIT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 130,
|
||||
"tooltip": "Transfer items from one inventory to another connected one."
|
||||
}
|
||||
}
|
49
blocks/CCPeripheral_generic_inventory/generator.js
Normal file
49
blocks/CCPeripheral_generic_inventory/generator.js
Normal file
@ -0,0 +1,49 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['periph_gen_inv_size'] = function(block, generator) {
|
||||
var inv = generator.valueToCode(block, 'INV', generator.ORDER_NONE);
|
||||
|
||||
return [`${inv}.size()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['periph_gen_inv_list'] = function(block, generator) {
|
||||
var inv = generator.valueToCode(block, 'INV', generator.ORDER_NONE);
|
||||
|
||||
return [`${inv}.list()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['periph_gen_inv_get_item_detail'] = function(block, generator) {
|
||||
var inv = generator.valueToCode(block, 'INV', generator.ORDER_NONE);
|
||||
var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_NONE);
|
||||
|
||||
return [`${inv}.getItemDetail(${slot})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['periph_gen_inv_get_item_limit'] = function(block, generator) {
|
||||
var inv = generator.valueToCode(block, 'INV', generator.ORDER_NONE);
|
||||
var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_NONE);
|
||||
|
||||
return [`${inv}.getItemLimit(${slot})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['periph_gen_inv_transfer_items'] = function(block, generator) {
|
||||
var inv1 = generator.valueToCode(block, 'INV1', generator.ORDER_ATOMIC);
|
||||
var inv1slot = generator.valueToCode(block, 'INV1SLOT', generator.ORDER_ATOMIC);
|
||||
var mode = block.getFieldValue('MODE');
|
||||
var inv2 = generator.valueToCode(block, 'INV2', generator.ORDER_ATOMIC);
|
||||
var inv2slot = generator.valueToCode(block, 'INV2SLOT', generator.ORDER_ATOMIC);
|
||||
var limit = generator.valueToCode(block, 'LIMIT', generator.ORDER_ATOMIC);
|
||||
|
||||
if (mode == "PUSH") {
|
||||
return `${inv1}.pushItems(peripheral.getName(${inv2}), ${inv1slot}, ${limit}, ${inv2slot})\n`
|
||||
} else {
|
||||
return `${inv1}.pullItems(peripheral.getName(${inv2}), ${inv2slot}, ${limit}, ${inv1slot})\n`
|
||||
}
|
||||
};
|
24
blocks/CCPeripheral_generic_inventory/index.json
Normal file
24
blocks/CCPeripheral_generic_inventory/index.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "CC: Generic Inventory",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Methods for interacting with inventories.",
|
||||
"version": "1.0.0",
|
||||
"category": "Peripheral",
|
||||
"keyword": "generic peripheral",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": true,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [
|
||||
"CCPeripheral"
|
||||
],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": false,
|
||||
"advpocket": false,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
37
blocks/CCPeripheral_generic_inventory/toolbox.xml
Normal file
37
blocks/CCPeripheral_generic_inventory/toolbox.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Inventory" colour="130">
|
||||
<block type="periph_gen_inv_size"></block>
|
||||
<block type="periph_gen_inv_list"></block>
|
||||
<block type="periph_gen_inv_get_item_detail">
|
||||
<value name="NUM1">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="periph_gen_inv_get_item_limit">
|
||||
<value name="SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="periph_gen_inv_transfer_items">
|
||||
<value name="INV1SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="INV2SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="LIMIT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">64</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
</xml>
|
177
blocks/CCRednet/block_design.json
Normal file
177
blocks/CCRednet/block_design.json
Normal file
@ -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."
|
||||
}
|
||||
}
|
94
blocks/CCRednet/generator.js
Normal file
94
blocks/CCRednet/generator.js
Normal file
@ -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];
|
||||
};
|
22
blocks/CCRednet/index.json
Normal file
22
blocks/CCRednet/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: 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": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": true,
|
||||
"advpocket": true,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
64
blocks/CCRednet/toolbox.xml
Normal file
64
blocks/CCRednet/toolbox.xml
Normal file
@ -0,0 +1,64 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Rednet" colour="20">
|
||||
<block type="rednet_open"></block>
|
||||
<block type="rednet_close"></block>
|
||||
<block type="rednet_isopen"></block>
|
||||
<block type="rednet_send">
|
||||
<value name="PROTO">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">default</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="rednet_broadcast">
|
||||
<value name="PROTO">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">default</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="rednet_receive">
|
||||
<value name="PROTO">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">default</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TIMEOUT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="rednet_host">
|
||||
<value name="PROTO">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">default</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="NAME">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">SomeName</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="rednet_unhost">
|
||||
<value name="PROTO">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">default</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="rednet_lookup">
|
||||
<value name="NAME">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">SomeName</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="PROTO">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">default</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
</xml>
|
137
blocks/CCRedstone/block_design.json
Normal file
137
blocks/CCRedstone/block_design.json
Normal file
@ -0,0 +1,137 @@
|
||||
{
|
||||
"redstone_set_output": {
|
||||
"message0": "Set redstone %1 at %2 of computer",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "STATE",
|
||||
"options": [
|
||||
["On", "ON"],
|
||||
["Off", "OFF"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"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."
|
||||
}
|
||||
}
|
50
blocks/CCRedstone/generator.js
Normal file
50
blocks/CCRedstone/generator.js
Normal file
@ -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`;
|
||||
};
|
22
blocks/CCRedstone/index.json
Normal file
22
blocks/CCRedstone/index.json
Normal file
@ -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": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": false,
|
||||
"advpocket": false,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
16
blocks/CCRedstone/toolbox.xml
Normal file
16
blocks/CCRedstone/toolbox.xml
Normal file
@ -0,0 +1,16 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Redstone" colour="10">
|
||||
<block type="redstone_set_output"></block>
|
||||
<block type="redstone_get_output"></block>
|
||||
<block type="redstone_read_input"></block>
|
||||
<block type="redstone_set_analog_output">
|
||||
<value name="POWER">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">15</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="redstone_get_analog_output"></block>
|
||||
<block type="redstone_read_analog_input"></block>
|
||||
</category>
|
||||
</xml>
|
147
blocks/CCSettings/block_design.json
Normal file
147
blocks/CCSettings/block_design.json
Normal file
@ -0,0 +1,147 @@
|
||||
{
|
||||
"settings_define": {
|
||||
"message0": "Define new %1 Description %2 Default %3 Type %4",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DESC",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DEF"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TYPE",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 120,
|
||||
"tooltip": "Define a new setting, optional specifying various properties about it."
|
||||
},
|
||||
"settings_undefine": {
|
||||
"message0": "UnDefine %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 120,
|
||||
"tooltip": "Remove a definition of a setting."
|
||||
},
|
||||
"settings_set": {
|
||||
"message0": "Set %1 with value %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "VALUE"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 120,
|
||||
"tooltip": "Set the value of a setting."
|
||||
},
|
||||
"settings_get": {
|
||||
"message0": "Get %1 If no value then use %2 as default",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DEF"
|
||||
}
|
||||
],
|
||||
"output": null,
|
||||
"colour": 120,
|
||||
"tooltip": "Get the value of a setting."
|
||||
},
|
||||
"settings_getdetails": {
|
||||
"message0": "Get %1 Details",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 120,
|
||||
"tooltip": "Get details about a specific setting."
|
||||
},
|
||||
"settings_unset": {
|
||||
"message0": "UnSet %1 value",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "NAME",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 120,
|
||||
"tooltip": "Remove the value of a setting, setting it to the default."
|
||||
},
|
||||
"settings_clear": {
|
||||
"message0": "Clear all settings",
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 120,
|
||||
"tooltip": "Resets the value of all settings."
|
||||
},
|
||||
"settings_getnames": {
|
||||
"message0": "Get all settings",
|
||||
"output": "Array",
|
||||
"colour": 120,
|
||||
"tooltip": "Get the names of all currently defined settings."
|
||||
},
|
||||
"settings_load": {
|
||||
"message0": "Load settings from %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILE",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 120,
|
||||
"tooltip": "Load settings from the given file."
|
||||
},
|
||||
"settings_save": {
|
||||
"message0": "Save settings to %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILE",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 120,
|
||||
"tooltip": "Save settings to the given file."
|
||||
}
|
||||
}
|
95
blocks/CCSettings/generator.js
Normal file
95
blocks/CCSettings/generator.js
Normal file
@ -0,0 +1,95 @@
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
function exportWithEquals(obj) {
|
||||
let result = [];
|
||||
for (let key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
result.push(`${key}=${obj[key]}`);
|
||||
}
|
||||
}
|
||||
return `{${result.join(',')}}`;
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['settings_define'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_NONE);
|
||||
var desc = generator.valueToCode(block, 'DESC', generator.ORDER_NONE);
|
||||
var def = generator.valueToCode(block, 'DEF', generator.ORDER_NONE);
|
||||
var type = generator.valueToCode(block, 'TYPE', generator.ORDER_NONE);
|
||||
|
||||
var option = {}
|
||||
|
||||
if (desc != "") {
|
||||
option.description = desc
|
||||
}
|
||||
if (def != "") {
|
||||
option.default = def
|
||||
}
|
||||
if (type != "") {
|
||||
option.type = type
|
||||
}
|
||||
var exportedoption = exportWithEquals(option);
|
||||
|
||||
if (exportedoption == "{}") {
|
||||
var code = `settings.define(${name})`
|
||||
} else {
|
||||
var code = `settings.define(${name}, ${exportedoption})`
|
||||
}
|
||||
|
||||
return code + "\n";
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_undefine'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_NONE);
|
||||
|
||||
return `settings.undefine(${name})`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_set'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_NONE);
|
||||
var value = generator.valueToCode(block, 'VALUE', generator.ORDER_NONE);
|
||||
|
||||
return `settings.set(${name}, ${value})`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_get'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_NONE);
|
||||
|
||||
return [`settings.get(${name})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_getdetails'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_NONE);
|
||||
|
||||
return [`settings.getDetails(${name})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_unset'] = function(block, generator) {
|
||||
var name = generator.valueToCode(block, 'NAME', generator.ORDER_NONE);
|
||||
|
||||
return `settings.unset(${name})`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_clear'] = function(block, generator) {
|
||||
return `settings.clear()`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_getnames'] = function(block, generator) {
|
||||
return [`settings.getNames()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_load'] = function(block, generator) {
|
||||
var file = generator.valueToCode(block, 'FILE', generator.ORDER_NONE);
|
||||
|
||||
return `settings.load(${file})`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['settings_save'] = function(block, generator) {
|
||||
var file = generator.valueToCode(block, 'FILE', generator.ORDER_NONE);
|
||||
|
||||
return `settings.save(${file})`;
|
||||
};
|
22
blocks/CCSettings/index.json
Normal file
22
blocks/CCSettings/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: Settings",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Read and write configuration options for CraftOS and your programs.",
|
||||
"version": "1.0.0",
|
||||
"category": "Config",
|
||||
"keyword": "Env",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": false,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": true,
|
||||
"advpocket": true,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
62
blocks/CCSettings/toolbox.xml
Normal file
62
blocks/CCSettings/toolbox.xml
Normal file
@ -0,0 +1,62 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Settings" colour="120">
|
||||
<block type="settings_define">
|
||||
<value name="NAME">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">SomeSettingsName</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="settings_undefine">
|
||||
<value name="NAME">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">SomeSettingsName</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="settings_set">
|
||||
<value name="NAME">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">SomeSettingsName</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="settings_get">
|
||||
<value name="NAME">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">SomeSettingsName</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="settings_getdetails">
|
||||
<value name="NAME">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">SomeSettingsName</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="settings_unset">
|
||||
<value name="NAME">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">SomeSettingsName</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="settings_clear"></block>
|
||||
<block type="settings_getnames"></block>
|
||||
<block type="settings_load">
|
||||
<value name="FILE">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">.settings</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="settings_save">
|
||||
<value name="FILE">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">.settings</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
</xml>
|
249
blocks/CCSystem/block_design.json
Normal file
249
blocks/CCSystem/block_design.json
Normal file
@ -0,0 +1,249 @@
|
||||
{
|
||||
"sysos_pullevent": {
|
||||
"message0": "Pull %1 event",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "EVENT",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Multiple",
|
||||
"colour": 0,
|
||||
"tooltip": "Pause execution of the current thread and waits for any events matching filter.",
|
||||
"helpUrl": "https://tweaked.cc/module/os.html#v:pullEvent"
|
||||
},
|
||||
"sysos_pullrawevent": {
|
||||
"message0": "Pull raw %1 event",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "EVENT",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Multiple",
|
||||
"colour": 0,
|
||||
"tooltip": "Pause execution of the current thread and waits for events, including the terminate event.",
|
||||
"helpUrl": "https://tweaked.cc/module/os.html#v:pullEventRaw"
|
||||
},
|
||||
"sysos_version": {
|
||||
"message0": "Get system version",
|
||||
"output": "String",
|
||||
"colour": 0,
|
||||
"tooltip": "Get the current CraftOS version (for example, CraftOS 1.9)."
|
||||
},
|
||||
"sysos_run": {
|
||||
"message0": "Run %1\nEnvironment %2\nArgs %3",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RUN",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ENV",
|
||||
"check": "Array"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ARGS",
|
||||
"check": "Multiple"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Run the program at the given path with the specified environment and arguments.",
|
||||
"helpUrl": "https://tweaked.cc/module/os.html#v:run"
|
||||
},
|
||||
"sysos_queue_event": {
|
||||
"message0": "Add event %1 to queue with args %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "EVENT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ARGS",
|
||||
"check": "Multiple"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Adds an event to the event queue. This event can later be pulled with os.pullEvent."
|
||||
},
|
||||
"sysos_start_timer": {
|
||||
"message0": "Start timer at %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TIME",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 0,
|
||||
"tooltip": "Starts a timer that will run for the specified number of seconds. Once the timer fires, a timer event will be added to the queue with the ID returned from this function as the first parameter.",
|
||||
"helpUrl": "https://tweaked.cc/module/os.html#v:startTimer"
|
||||
},
|
||||
"sysos_cancel_timer": {
|
||||
"message0": "Stop timer id %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ID",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Cancels a timer previously started with startTimer. This will stop the timer from firing."
|
||||
},
|
||||
"sysos_set_alarm": {
|
||||
"message0": "Set alarm to %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TIME",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 0,
|
||||
"tooltip": "Sets an alarm that will fire at the specified in-game time."
|
||||
},
|
||||
"sysos_cancel_alarm": {
|
||||
"message0": "Stop alarm id %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ID",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Cancels an alarm previously started with setAlarm."
|
||||
},
|
||||
"sysos_shutdown": {
|
||||
"message0": "Shutdown computer",
|
||||
"previousStatement": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Shuts down the computer immediately."
|
||||
},
|
||||
"sysos_reboot": {
|
||||
"message0": "Restart computer",
|
||||
"previousStatement": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Reboots the computer immediately."
|
||||
},
|
||||
"sysos_get_computer_id": {
|
||||
"message0": "Get computer id",
|
||||
"output": "Number",
|
||||
"colour": 0,
|
||||
"tooltip": "Returns the ID of the computer."
|
||||
},
|
||||
"sysos_get_computer_label": {
|
||||
"message0": "Get computer label",
|
||||
"output": "String",
|
||||
"colour": 0,
|
||||
"tooltip": "Returns the label of the computer, or nil if none is set."
|
||||
},
|
||||
"sysos_set_computer_label": {
|
||||
"message0": "Set computer label to %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "LABEL",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Set the label of this computer."
|
||||
},
|
||||
"sysos_clock": {
|
||||
"message0": "Get Uptime",
|
||||
"output": "Number",
|
||||
"colour": 0,
|
||||
"tooltip": "Returns the number of seconds that the computer has been running."
|
||||
},
|
||||
"sysos_time": {
|
||||
"message0": "Get time of %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "LOCATE",
|
||||
"options": [
|
||||
["In Game World", "ingame"],
|
||||
["UTC", "utc"],
|
||||
["Local", "local"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Returns the current time depending on the string passed in. This will always be in the range [0.0, 24.0)."
|
||||
},
|
||||
"sysos_day": {
|
||||
"message0": "Get day of %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "LOCATE",
|
||||
"options": [
|
||||
["In Game World", "ingame"],
|
||||
["UTC", "utc"],
|
||||
["Local", "local"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Returns the day depending on the locale specified."
|
||||
},
|
||||
"sysos_epoch": {
|
||||
"message0": "Get epoch of %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "LOCATE",
|
||||
"options": [
|
||||
["In Game World", "ingame"],
|
||||
["UTC", "utc"],
|
||||
["Local", "local"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Returns the number of milliseconds since an epoch depending on the locale."
|
||||
},
|
||||
"sysos_date": {
|
||||
"message0": "Format date with patten %1 from time %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FORMAT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TIME",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": null,
|
||||
"colour": 0,
|
||||
"tooltip": "Returns a date string (or table) using a specified format string and optional time to format.",
|
||||
"helpUrl": "https://cplusplus.com/reference/ctime/strftime/"
|
||||
}
|
||||
}
|
130
blocks/CCSystem/generator.js
Normal file
130
blocks/CCSystem/generator.js
Normal file
@ -0,0 +1,130 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['sysos_pullevent'] = function(block, generator) {
|
||||
var event = generator.valueToCode(block, 'EVENT', generator.ORDER_ATOMIC);
|
||||
|
||||
if (event == "'All'") {
|
||||
return [`os.pullEvent()`, luaGenerator.ORDER_NONE];
|
||||
} else {
|
||||
return [`os.pullEvent(${event})`, luaGenerator.ORDER_NONE];
|
||||
}
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_pullrawevent'] = function(block, generator) {
|
||||
var event = generator.valueToCode(block, 'EVENT', generator.ORDER_ATOMIC);
|
||||
|
||||
if (event == "'All'") {
|
||||
return [`os.pullEventRaw()`, luaGenerator.ORDER_NONE];
|
||||
} else {
|
||||
return [`os.pullEventRaw(${event})`, luaGenerator.ORDER_NONE];
|
||||
}
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_version'] = function(block, generator) {
|
||||
return [`os.version()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_run'] = function(block, generator) {
|
||||
var env = generator.valueToCode(block, 'ENV', generator.ORDER_ATOMIC) || "{}";
|
||||
var run = generator.valueToCode(block, 'RUN', generator.ORDER_ATOMIC);
|
||||
var args = generator.valueToCode(block, 'ARGS', generator.ORDER_ATOMIC);
|
||||
|
||||
if (args == "") {
|
||||
return `os.run(${env}, ${run})\n`;
|
||||
} else {
|
||||
return `os.run(${env}, ${run}, ${args})\n`;
|
||||
}
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_queue_event'] = function(block, generator) {
|
||||
var event = generator.valueToCode(block, 'EVENT', generator.ORDER_ATOMIC);
|
||||
var args = generator.valueToCode(block, 'ARGS', generator.ORDER_ATOMIC);
|
||||
|
||||
if (args == "") {
|
||||
return `os.queueEvent(${event})\n`;
|
||||
} else {
|
||||
return `os.queueEvent(${event}, ${args})\n`;
|
||||
}
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_start_timer'] = function(block, generator) {
|
||||
var time = generator.valueToCode(block, 'TIME', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`os.queueEvent(${time})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_cancel_timer'] = function(block, generator) {
|
||||
var id = generator.valueToCode(block, 'ID', generator.ORDER_ATOMIC);
|
||||
|
||||
return `os.cancelTimer(${id}\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_set_alarm'] = function(block, generator) {
|
||||
var time = generator.valueToCode(block, 'TIME', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`os.setAlarm(${time})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_cancel_alarm'] = function(block, generator) {
|
||||
var id = generator.valueToCode(block, 'ID', generator.ORDER_ATOMIC);
|
||||
|
||||
return `os.cancelAlarm(${id})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_shutdown'] = function(block, generator) {
|
||||
return `os.shutdown()`
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_reboot'] = function(block, generator) {
|
||||
return `os.reboot()`
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_get_computer_id'] = function(block, generator) {
|
||||
return [`os.getComputerID()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_get_computer_label'] = function(block, generator) {
|
||||
return [`os.getComputerLabel()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_set_computer_label'] = function(block, generator) {
|
||||
var label = generator.valueToCode(block, 'LABEL', generator.ORDER_ATOMIC);
|
||||
|
||||
return `os.setComputerLabel(${label})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_clock'] = function(block, generator) {
|
||||
return [`os.clock()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_time'] = function(block, generator) {
|
||||
var locate = block.getFieldValue('LOCATE');
|
||||
|
||||
return [`os.time("${locate}")`, generator.ORDER_ATOMIC];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_day'] = function(block, generator) {
|
||||
var locate = block.getFieldValue('LOCATE');
|
||||
|
||||
return [`os.day("${locate}")`, generator.ORDER_ATOMIC];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_epoch'] = function(block, generator) {
|
||||
var locate = block.getFieldValue('LOCATE');
|
||||
|
||||
return [`os.epoch("${locate}")`, generator.ORDER_ATOMIC];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sysos_date'] = function(block, generator) {
|
||||
var format = generator.valueToCode(block, 'FORMAT', generator.ORDER_ATOMIC);
|
||||
var time = generator.valueToCode(block, 'TIME', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`os.date(${format}, ${time})`, luaGenerator.ORDER_NONE];
|
||||
};
|
22
blocks/CCSystem/index.json
Normal file
22
blocks/CCSystem/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: System (OS)",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "The os API allows interacting with the current computer.",
|
||||
"version": "1.0.0",
|
||||
"category": "System",
|
||||
"keyword": "System, OS",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": false,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": true,
|
||||
"advpocket": true,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
56
blocks/CCSystem/toolbox.xml
Normal file
56
blocks/CCSystem/toolbox.xml
Normal file
@ -0,0 +1,56 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="System" colour="0">
|
||||
<block type="sysos_pullevent">
|
||||
<value name="EVENT">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">All</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="sysos_pullrawevent">
|
||||
<value name="EVENT">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">All</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="sysos_version"></block>
|
||||
<block type="sysos_run"></block>
|
||||
<block type="sysos_queue_event"></block>
|
||||
<block type="sysos_start_timer">
|
||||
<value name="TIME">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="sysos_cancel_timer"></block>
|
||||
<block type="sysos_set_alarm">
|
||||
<value name="TIME">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="sysos_cancel_alarm"></block>
|
||||
<block type="sysos_shutdown"></block>
|
||||
<block type="sysos_reboot"></block>
|
||||
<block type="sysos_get_computer_id"></block>
|
||||
<block type="sysos_get_computer_label"></block>
|
||||
<block type="sysos_set_computer_label"></block>
|
||||
<block type="sysos_clock"></block>
|
||||
<block type="sysos_time"></block>
|
||||
<block type="sysos_day"></block>
|
||||
<block type="sysos_epoch"></block>
|
||||
<block type="sysos_date">
|
||||
<value name="FORMAT">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">%A %d %B %Y</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TIME">
|
||||
<shadow type="sysos_time"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
</xml>
|
237
blocks/CCTextutils/block_design.json
Normal file
237
blocks/CCTextutils/block_design.json
Normal file
@ -0,0 +1,237 @@
|
||||
{
|
||||
"textutils_slow_write": {
|
||||
"message0": "Write %1 with rate %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TEXT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RATE",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 32,
|
||||
"tooltip": "Slowly writes string text at current cursor position, character-by-character."
|
||||
},
|
||||
"textutils_slow_print": {
|
||||
"message0": "Print %1 with rate %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TEXT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RATE",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 32,
|
||||
"tooltip": "Slowly prints string text at current cursor position, character-by-character."
|
||||
},
|
||||
"textutils_format_time": {
|
||||
"message0": "Format time from %1\n24-Hour %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TIME",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "24H"
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 32,
|
||||
"tooltip": "Takes input time and formats it in a more readable format such as 6:30 PM."
|
||||
},
|
||||
"textutils_paged_print": {
|
||||
"message0": "Print %1\nlimit %2 lines",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TEXT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FREELINES",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 32,
|
||||
"tooltip": "Prints a given string to the display.",
|
||||
"helpUrl": "https://tweaked.cc/module/textutils.html#v:pagedPrint"
|
||||
},
|
||||
"textutils_tabulate": {
|
||||
"message0": "Print table %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ARGS",
|
||||
"check": "Multiple"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 32,
|
||||
"tooltip": "Prints tables in a structured form.",
|
||||
"helpUrl": "https://tweaked.cc/module/textutils.html#v:tabulate"
|
||||
},
|
||||
"textutils_paged_tabulate": {
|
||||
"message0": "Print table %1 with paged",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ARGS",
|
||||
"check": "Multiple"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 32,
|
||||
"tooltip": "Prints tables in a structured form, stopping and prompting for input should the result not fit on the terminal."
|
||||
},
|
||||
"textutils_empty_json_array": {
|
||||
"message0": "Empty json array",
|
||||
"output": "Array",
|
||||
"colour": 32,
|
||||
"tooltip": "Prints tables in a structured form, stopping and prompting for input should the result not fit on the terminal."
|
||||
},
|
||||
"textutils_json_null": {
|
||||
"message0": "Json null",
|
||||
"output": "Array",
|
||||
"colour": 32,
|
||||
"tooltip": "A table representing the JSON null value."
|
||||
},
|
||||
"textutils_serialize": {
|
||||
"message0": "Serialize %1\nCompact %2\nAllow repetitions %3",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "OBJECT",
|
||||
"check": "Array"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "COMPACT"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "ALLOWREPETI"
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 32,
|
||||
"tooltip": "Prints tables in a structured form, stopping and prompting for input should the result not fit on the terminal.",
|
||||
"helpUrl": "https://tweaked.cc/module/textutils.html#v:serialize"
|
||||
},
|
||||
"textutils_unserialize": {
|
||||
"message0": "UnSerialize %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "OBJECT",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 32,
|
||||
"tooltip": "Converts a serialised string back into a reassembled Lua object."
|
||||
},
|
||||
"textutils_serialize_json": {
|
||||
"message0": "Serialize %1 to json\nNBT style %2\nUnicode %3\nAllow repetitions %4",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "OBJECT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "NBT"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "UNICODE"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "ALLOWREPETI"
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 32,
|
||||
"tooltip": "Returns a JSON representation of the given data.",
|
||||
"helpUrl": "https://tweaked.cc/module/textutils.html#v:serializeJSON"
|
||||
},
|
||||
"textutils_unserialize_json": {
|
||||
"message0": "UnSerialize %1 to json\nNBT style %2\nParse null %3\nParse empty array %4",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "OBJECT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "NBT"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "PARSENULL"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "PARSEEA"
|
||||
}
|
||||
],
|
||||
"output": ["Array", "Multiple"],
|
||||
"colour": 32,
|
||||
"tooltip": "Converts a serialised JSON string back into a reassembled Lua object.",
|
||||
"helpUrl": "https://tweaked.cc/module/textutils.html#v:unserializeJSON"
|
||||
},
|
||||
"textutils_url_encode": {
|
||||
"message0": "Encode URL %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "URL",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 32,
|
||||
"tooltip": "Replaces certain characters in a string to make it safe for use in URLs or POST data."
|
||||
},
|
||||
"textutils_complete": {
|
||||
"message0": "Complete %1 in table %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SEARCH_TEXT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SEARCH_TABLE",
|
||||
"check": "Table"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 32,
|
||||
"tooltip": "Provides a list of possible completions for a partial Lua expression.",
|
||||
"helpUrl": "https://tweaked.cc/module/textutils.html#v:complete"
|
||||
}
|
||||
}
|
107
blocks/CCTextutils/generator.js
Normal file
107
blocks/CCTextutils/generator.js
Normal file
@ -0,0 +1,107 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['textutils_slow_write'] = function(block, generator) {
|
||||
var text = generator.valueToCode(block, 'TEXT', generator.ORDER_ATOMIC);
|
||||
var rate = generator.valueToCode(block, 'RATE', generator.ORDER_ATOMIC);
|
||||
|
||||
return `textutils.slowWrite(${text}, ${rate})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_slow_print'] = function(block, generator) {
|
||||
var text = generator.valueToCode(block, 'TEXT', generator.ORDER_ATOMIC);
|
||||
var rate = generator.valueToCode(block, 'RATE', generator.ORDER_ATOMIC);
|
||||
|
||||
return `textutils.slowPrint(${text}, ${rate})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_format_time'] = function(block, generator) {
|
||||
var time = generator.valueToCode(block, 'TIME', generator.ORDER_ATOMIC);
|
||||
var is24hour = generator.valueToCode(block, '24H', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`textutils.formatTime(${time}, ${is24hour})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_paged_print'] = function(block, generator) {
|
||||
var text = generator.valueToCode(block, 'TEXT', generator.ORDER_ATOMIC);
|
||||
var freeline = generator.valueToCode(block, 'FREELINES', generator.ORDER_ATOMIC);
|
||||
|
||||
return `textutils.pagedPrint(${text}, ${freeline})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_tabulate'] = function(block, generator) {
|
||||
var args = generator.valueToCode(block, 'ARGS', generator.ORDER_ATOMIC);
|
||||
|
||||
return `textutils.tabulate(${args})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_paged_tabulate'] = function(block, generator) {
|
||||
var args = generator.valueToCode(block, 'ARGS', generator.ORDER_ATOMIC);
|
||||
|
||||
return `textutils.pagedTabulate(${args})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_empty_json_array'] = function(block, generator) {
|
||||
return [`textutils.textutils_empty_json_array`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_json_null'] = function(block, generator) {
|
||||
return [`textutils.json_null`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_serialize'] = function(block, generator) {
|
||||
var object = generator.valueToCode(block, 'OBJECT', generator.ORDER_ATOMIC);
|
||||
var compact = block.getFieldValue('COMPACT') == 'TRUE';
|
||||
var repetitions = block.getFieldValue('ALLOWREPETI') == 'TRUE';
|
||||
|
||||
|
||||
return [`textutils.serialize(${object}, {compact=${compact}, allow_repetitions=${repetitions}})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_unserialize'] = function(block, generator) {
|
||||
var object = generator.valueToCode(block, 'OBJECT', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`textutils.unserialize(${object})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_serialize_json'] = function(block, generator) {
|
||||
var object = generator.valueToCode(block, 'OBJECT', generator.ORDER_ATOMIC);
|
||||
var nbt = block.getFieldValue('NBT') == 'TRUE';
|
||||
var unicode = block.getFieldValue('UNICODE') == 'TRUE';
|
||||
var repetitions = block.getFieldValue('ALLOWREPETI') == 'TRUE';
|
||||
|
||||
return [`textutils.serializeJSON(${object}, {nbt_style=${nbt}, unicode_strings=${unicode}, allow_repetitions=${repetitions}})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_unserialize_json'] = function(block, generator) {
|
||||
var object = generator.valueToCode(block, 'OBJECT', generator.ORDER_ATOMIC);
|
||||
var nbt = block.getFieldValue('NBT') == 'TRUE';
|
||||
var parse_null = block.getFieldValue('PARSENULL') == 'TRUE';
|
||||
var parse_empty_array = block.getFieldValue('PARSEEA') == 'TRUE';
|
||||
|
||||
return [`textutils.unserializeJSON(${object}, {nbt_style=${nbt}, parse_null=${parse_null}, parse_empty_array=${parse_empty_array}})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_url_encode'] = function(block, generator) {
|
||||
var url = generator.valueToCode(block, 'URL', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`textutils.urlEncode(${url})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['textutils_complete'] = function(block, generator) {
|
||||
var value_search_text = generator.valueToCode(block, 'SEARCH_TEXT', Blockly.Lua.ORDER_ATOMIC) || '""';
|
||||
var value_search_table = generator.valueToCode(block, 'SEARCH_TABLE', Blockly.Lua.ORDER_ATOMIC) || '_G';
|
||||
|
||||
if (value_search_table == "") {
|
||||
return [`textutils.complete(${value_search_text})`];
|
||||
} else {
|
||||
return [`textutils.complete(${value_search_text}, ${value_search_table})`];
|
||||
}
|
||||
};
|
||||
|
22
blocks/CCTextutils/index.json
Normal file
22
blocks/CCTextutils/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: Textutils",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Helpful utilities for formatting and manipulating strings.",
|
||||
"version": "1.0.0",
|
||||
"category": "utils",
|
||||
"keyword": "utils",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": false,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": true,
|
||||
"advpocket": true,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
37
blocks/CCTextutils/toolbox.xml
Normal file
37
blocks/CCTextutils/toolbox.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Textutils" colour="32">
|
||||
<block type="textutils_slow_write">
|
||||
<value name="RATE">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">20</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="textutils_slow_print">
|
||||
<value name="RATE">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">20</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="textutils_paged_print">
|
||||
<value name="FREELINES">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">20</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="textutils_tabulate"></block>
|
||||
<block type="textutils_paged_tabulate"></block>
|
||||
<block type="textutils_empty_json_array"></block>
|
||||
<block type="textutils_json_null"></block>
|
||||
<block type="textutils_serialize"></block>
|
||||
<block type="textutils_unserialize"></block>
|
||||
<block type="textutils_serialize_json"></block>
|
||||
<block type="textutils_unserialize_json"></block>
|
||||
<block type="textutils_url_encode"></block>
|
||||
<block type="textutils_complete"></block>
|
||||
<block type="textutils_format_time"></block>
|
||||
|
||||
</category>
|
||||
</xml>
|
384
blocks/CCTurtle/block_design.json
Normal file
384
blocks/CCTurtle/block_design.json
Normal file
@ -0,0 +1,384 @@
|
||||
{
|
||||
"turtle_move_operation": {
|
||||
"message0": "Move %1 for %2 blocks",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Forward", "FORWARD"],
|
||||
["Back", "BACK"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FOR",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Move the turtle."
|
||||
},
|
||||
"turtle_turn_operation": {
|
||||
"message0": "Turn %1 for %2 round",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Left", "LEFT"],
|
||||
["Right", "RIGHT"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ROUND",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Turn the turtle."
|
||||
},
|
||||
"turtle_dig_operation": {
|
||||
"message0": "Dig in %1 of turtle with %2 side",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Front", "FRONT"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Left", "left"],
|
||||
["Right", "right"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Attempt to break the block in direction of the turtle."
|
||||
},
|
||||
"turtle_attack_operation": {
|
||||
"message0": "Attack in %1 of turtle with %2 side",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Front", "FRONT"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Left", "left"],
|
||||
["Right", "right"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Attack the entity in direction of the turtle."
|
||||
},
|
||||
"turtle_place_operation": {
|
||||
"message0": "Use/Place in %1 of turtle",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Front", "FRONT"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Place a block or item into the world in direction of the turtle."
|
||||
},
|
||||
"turtle_drop_operation": {
|
||||
"message0": "Drop item in %1 of turtle for %2 items",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Front", "FRONT"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "COUNT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Drop the currently selected stack into the inventory in the turtle, or as an item into the world if there is no inventory."
|
||||
},
|
||||
"turtle_select_item": {
|
||||
"message0": "Select item in slot %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SLOT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Change the currently selected slot."
|
||||
},
|
||||
"turtle_get_item_count": {
|
||||
"message0": "Get item count in slot %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SLOT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Number",
|
||||
"colour": 215,
|
||||
"tooltip": "Get the number of items in the given slot."
|
||||
},
|
||||
"turtle_get_slot_free": {
|
||||
"message0": "Get free space in slot %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SLOT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Number",
|
||||
"colour": 215,
|
||||
"tooltip": "Get the remaining number of items which may be stored in this stack."
|
||||
},
|
||||
"turtle_detect_block": {
|
||||
"message0": "Detect solid block in %1 of turtle",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Front", "FRONT"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Boolean",
|
||||
"colour": 215,
|
||||
"tooltip": "Check if there is a solid block in direction of the turtle."
|
||||
},
|
||||
"turtle_compare_item": {
|
||||
"message0": "Compare block in %1 of turtle is equal current item slot",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Front", "FRONT"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Boolean",
|
||||
"colour": 215,
|
||||
"tooltip": "Check if the block in direction of the turtle is equal to the item in the currently selected slot."
|
||||
},
|
||||
"turtle_collect_item": {
|
||||
"message0": "Collect %1 items in %2 of turtle",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "COUNT",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Front", "FRONT"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Collect an item from the inventory in direction of the turtle, or from an item floating in the world. If count is 0 it collect all item."
|
||||
},
|
||||
"turtle_get_fuel_level": {
|
||||
"message0": "Get current fuel level",
|
||||
"inputsInline": true,
|
||||
"output": "Number",
|
||||
"colour": 215,
|
||||
"tooltip": "Get the maximum amount of fuel this turtle currently holds."
|
||||
},
|
||||
"turtle_refuel": {
|
||||
"message0": "Refuel turtle for %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "COUNT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Refuel this turtle. If 0 it refuel unlimit from current item."
|
||||
},
|
||||
"turtle_compare_to": {
|
||||
"message0": "Compare item to slot %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SLOT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Boolean",
|
||||
"colour": 215,
|
||||
"tooltip": "Compare the item in the currently selected slot to the item in another slot."
|
||||
},
|
||||
"turtle_transfer_to": {
|
||||
"message0": "Transfer item to slot %1 for %2 items",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SLOT",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "COUNT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Move an item from the selected slot to another one."
|
||||
},
|
||||
"turtle_get_selected_slot": {
|
||||
"message0": "Get current selected slot",
|
||||
"inputsInline": true,
|
||||
"output": "Number",
|
||||
"colour": 215,
|
||||
"tooltip": "Get the currently selected slot."
|
||||
},
|
||||
"turtle_get_fuel_limit": {
|
||||
"message0": "Get fuel limit",
|
||||
"inputsInline": true,
|
||||
"output": "Number",
|
||||
"colour": 215,
|
||||
"tooltip": "Get the maximum amount of fuel this turtle can hold."
|
||||
},
|
||||
"turtle_equip": {
|
||||
"message0": "Equip item on %1 side",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Left", "LEFT"],
|
||||
["Right", "RIGHT"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Multiple",
|
||||
"colour": 215,
|
||||
"tooltip": "Equip (or unequip) an item on the side of this turtle."
|
||||
},
|
||||
"turtle_inspect": {
|
||||
"message0": "Inspect block on %1 side",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "OPERATION",
|
||||
"options": [
|
||||
["Front", "FRONT"],
|
||||
["Up", "UP"],
|
||||
["Down", "DOWN"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Multiple",
|
||||
"colour": 215,
|
||||
"tooltip": "Get information about the block in direction of the turtle."
|
||||
},
|
||||
"turtle_get_item_detail": {
|
||||
"message0": "Get Item detail in slot %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "SLOT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"output": "Array",
|
||||
"colour": 215,
|
||||
"tooltip": "Get detailed information about the items in the given slot."
|
||||
},
|
||||
"turtle_craft": {
|
||||
"message0": "Craft Item with limit %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "LIMIT",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 215,
|
||||
"tooltip": "Craft a recipe based on the turtle's inventory."
|
||||
}
|
||||
}
|
354
blocks/CCTurtle/generator.js
Normal file
354
blocks/CCTurtle/generator.js
Normal file
@ -0,0 +1,354 @@
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['turtle_move_operation'] = function(block, generator) {
|
||||
var operator = block.getFieldValue('OPERATION');
|
||||
var FOR = generator.valueToCode(block, 'FOR', generator.ORDER_ATOMIC);
|
||||
|
||||
var movecommand = '';
|
||||
switch (operator) {
|
||||
case 'FORWARD':
|
||||
movecommand = 'turtle.forward()';
|
||||
break;
|
||||
case 'BACK':
|
||||
movecommand = 'turtle.back()';
|
||||
break;
|
||||
case 'UP':
|
||||
movecommand = 'turtle.up()';
|
||||
break;
|
||||
case 'DOWN':
|
||||
movecommand = 'turtle.down()';
|
||||
break;
|
||||
default:
|
||||
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;
|
||||
}
|
||||
|
||||
return [code, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
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];
|
||||
};
|
||||
|
||||
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];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['turtle_craft'] = function(block, generator) {
|
||||
var limit = generator.valueToCode(block, 'LIMIT', generator.ORDER_ATOMIC);
|
||||
|
||||
return `turtle.craft(${limit})\n`;
|
||||
};
|
22
blocks/CCTurtle/index.json
Normal file
22
blocks/CCTurtle/index.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "CC: Turtle",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Library for control turtle",
|
||||
"version": "1.0",
|
||||
"category": "turtle",
|
||||
"keyword": "turtle",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": false,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": false,
|
||||
"adv": false,
|
||||
"command": false,
|
||||
"pocket": false,
|
||||
"advpocket": false,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
103
blocks/CCTurtle/toolbox.xml
Normal file
103
blocks/CCTurtle/toolbox.xml
Normal file
@ -0,0 +1,103 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Turtle" colour="215">
|
||||
<block type="turtle_move_operation">
|
||||
<value name="FOR">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_turn_operation">
|
||||
<value name="ROUND">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_dig_operation"></block>
|
||||
<block type="turtle_attack_operation"></block>
|
||||
<block type="turtle_place_operation"></block>
|
||||
<block type="turtle_drop_operation">
|
||||
<value name="COUNT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_select_item">
|
||||
<value name="SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_get_item_count">
|
||||
<value name="SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_get_slot_free">
|
||||
<value name="SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_detect_block"></block>
|
||||
<block type="turtle_compare_item"></block>
|
||||
<block type="turtle_collect_item">
|
||||
<value name="COUNT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field> <!-- If 0 it collect all item-->
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_get_fuel_level"></block>
|
||||
<block type="turtle_refuel">
|
||||
<value name="COUNT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field> <!-- If 0 it refuel unlimit from current item-->
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_compare_to">
|
||||
<value name="SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_transfer_to">
|
||||
<value name="SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="COUNT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">64</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_get_selected_slot"></block>
|
||||
<block type="turtle_get_fuel_limit"></block>
|
||||
<block type="turtle_equip"></block>
|
||||
<block type="turtle_inspect"></block>
|
||||
<block type="turtle_get_item_detail">
|
||||
<value name="SLOT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="turtle_craft">
|
||||
<value name="LIMIT">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">64</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
</xml>
|
787
blocks/Create_Additions/block_design.json
Normal file
787
blocks/Create_Additions/block_design.json
Normal file
@ -0,0 +1,787 @@
|
||||
{
|
||||
"create_addition_electric_motor_set_speed": {
|
||||
"message0": "Set motor %1 speed to %2 RPM",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RPM",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 70,
|
||||
"tooltip": "To set the speed of the Electric Motor, call setSpeed(rpm) where the argument rpm is a number between -256 and 256. The function will throw an exception if it is called too many times per second."
|
||||
},
|
||||
"create_addition_electric_motor_stop": {
|
||||
"message0": "Stop motor %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 70,
|
||||
"tooltip": "This is a shorthand for setSpeed(0)."
|
||||
},
|
||||
"create_addition_electric_motor_rotate": {
|
||||
"message0": "Calculate rotation for motor %1 to rotate %2 degrees with speed %3 RPM",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DEGREES",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RPM",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the time it will take to rotate the shaft by the argument degrees at the current speed. If the optional argument rpm is given it will set the speed of the motor and return the rotation time at the new speed."
|
||||
},
|
||||
"create_addition_electric_motor_translate": {
|
||||
"message0": "Translate motor %1 by %2 blocks with speed %3 RPM",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "BLOCKS",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RPM",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the time it will take to rotate the shaft to push a piston or gantry shaft by distance given by the argument blocks at the current speed. "
|
||||
},
|
||||
"create_addition_electric_motor_get_speed": {
|
||||
"message0": "Get current speed from motor %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the current motor speed."
|
||||
},
|
||||
"create_addition_electric_motor_get_stress_capacity": {
|
||||
"message0": "Get stress capacity from motor %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the produced stress capacity (output su)."
|
||||
},
|
||||
"create_addition_electric_motor_get_energy_consumption": {
|
||||
"message0": "Get energy consumption from motor %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the motor energy consumption in FE/t."
|
||||
},
|
||||
"create_addition_electric_motor_get_max_input": {
|
||||
"message0": "Get max input from motor %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the Motor max input in fe."
|
||||
},
|
||||
"create_addition_electric_motor_get_max_output": {
|
||||
"message0": "Get max output from motor %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "MOTOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the Motor max output in fe (Always 0)."
|
||||
},
|
||||
|
||||
"create_addition_accumulator_get_energy": {
|
||||
"message0": "Get current energy is store in accumulator %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ACCUMULATOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the accumulator total stored charge in fe."
|
||||
},
|
||||
"create_addition_accumulator_get_capacity": {
|
||||
"message0": "Get total capacity in accumulator %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ACCUMULATOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the accumulator total capacity in fe."
|
||||
},
|
||||
"create_addition_accumulator_get_percent": {
|
||||
"message0": "Get percent energy is store in accumulator %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ACCUMULATOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the accumulator total charge in relation to the total capacity in percent."
|
||||
},
|
||||
"create_addition_accumulator_get_max_input": {
|
||||
"message0": "Get max input from accumulator %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ACCUMULATOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the accumulator max input per block face in fe."
|
||||
},
|
||||
"create_addition_accumulator_get_max_output": {
|
||||
"message0": "Get max output from accumulator %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ACCUMULATOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the accumulator max output per block face in fe."
|
||||
},
|
||||
"create_addition_accumulator_get_height": {
|
||||
"message0": "Get current height from accumulator %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ACCUMULATOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the accumulator height in block."
|
||||
},
|
||||
"create_addition_accumulator_get_width": {
|
||||
"message0": "Get current width from accumulator %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ACCUMULATOR",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the accumulator width in block."
|
||||
},
|
||||
|
||||
"create_addition_pei_get_energy": {
|
||||
"message0": "Get current energy is store in source from PEI %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "PEI",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the connected contraption total stored charge in fe, (-1 if not connected)."
|
||||
},
|
||||
"create_addition_pei_get_capacity": {
|
||||
"message0": "Get total capacity in source from PEI %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "PEI",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the connected contraption total capacity in fe, (-1 if not connected)."
|
||||
},
|
||||
"create_addition_pei_is_connected": {
|
||||
"message0": "Is PEI %1 connected",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "PEI",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Boolean",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return true if a contraption is connected."
|
||||
},
|
||||
"create_addition_pei_get_max_input": {
|
||||
"message0": "Get max input from PEI %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "PEI",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the PEI max input in fe."
|
||||
},
|
||||
"create_addition_pei_get_max_output": {
|
||||
"message0": "Get max output from PEI %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "PEI",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the PEI max output in fe."
|
||||
},
|
||||
|
||||
"create_addition_relay_get_max_input": {
|
||||
"message0": "Get max input from relay %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RELAY",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the Relay max input in fe."
|
||||
},
|
||||
"create_addition_relay_get_max_output": {
|
||||
"message0": "Get max output from relay %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RELAY",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the Relay max output in fe."
|
||||
},
|
||||
"create_addition_relay_get_throughput": {
|
||||
"message0": "Get current throughput relay %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RELAY",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the current throughput in fe."
|
||||
},
|
||||
"create_addition_relay_is_powered": {
|
||||
"message0": "Is relay %1 powered",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RELAY",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Boolean",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the redstone state of the Relay."
|
||||
},
|
||||
|
||||
"create_addition_da_rotational_speed_control_set_target_speed": {
|
||||
"message0": "Set target speed to %1 rpm to controller %2 at %3 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RPM"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 70,
|
||||
"tooltip": "This will set the target speed of a Rotation Speed Controller attached to the side of a Digital Adapter."
|
||||
},
|
||||
"create_addition_da_rotational_speed_control_get_target_speed": {
|
||||
"message0": "Get target speed from controller %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the target speed of a Rotation Speed Controller attached to the side of a Digital Adapter."
|
||||
},
|
||||
|
||||
"create_addition_da_stressometer_get_kinetic_stress": {
|
||||
"message0": "Get current stress from stressometer %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the stress of a Stressometer attached to the side of a Digital Adapter."
|
||||
},
|
||||
"create_addition_da_stressometer_get_kinetic_capacity": {
|
||||
"message0": "Get capacity stress from stressometer %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the stress capacity of a Stressometer attached to the side of a Digital Adapter."
|
||||
},
|
||||
|
||||
"create_addition_da_speedometer_get_kinetic_speed": {
|
||||
"message0": "Get current speed from speedometer %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the speed of a Speedometer attached to the side of a Digital Adapter."
|
||||
},
|
||||
"create_addition_da_speedometer_get_kinetic_max_speed": {
|
||||
"message0": "Get max speed from speedometer %1 of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the top speed as set by Create."
|
||||
},
|
||||
|
||||
"create_addition_da_pulleys_get_pulleys_distance": {
|
||||
"message0": "Get current distance from pulleys %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the extended distance of a Rope, Hose, or Elevator -Pulley attached to the side of a Digital Adapter."
|
||||
},
|
||||
|
||||
"create_addition_da_elevator_pulley_get_elevator_floor": {
|
||||
"message0": "Get current floor from elevator %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the current floor index of an Elevator Pulley attached to the side of a Digital Adapter."
|
||||
},
|
||||
"create_addition_da_elevator_pulley_get_elevator_floors": {
|
||||
"message0": "Get total floors from elevator %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the number of floors of an Elevator Pulley attached to the side of a Digital Adapter."
|
||||
},
|
||||
"create_addition_da_elevator_pulley_get_elevator_floor_name": {
|
||||
"message0": "Get floor %1 name from elevator %2 at %3 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INDEX",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get floor name at floor index of a Elevator Pulley attached to the side of a Digital Adapter."
|
||||
},
|
||||
"create_addition_da_elevator_pulley_goto_elevator_floor_name": {
|
||||
"message0": "Goto floor %1 with elevator %2 at %3 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INDEX",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will trigger a Elevator Pulley attached to the side of a Digital Adapter to move to the given floor index and returns the delta-y to move."
|
||||
},
|
||||
|
||||
"create_addition_da_mechanical_piston_get_piston_distance": {
|
||||
"message0": "Get current extended distance from piston %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the extended distance of a Mechanical Piston attached to the side of a Digital Adapter."
|
||||
},
|
||||
|
||||
"create_addition_da_mechanical_bearing_get_bearing_angle": {
|
||||
"message0": "Get current angle from Bearing %1 at %2 side of adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "SIDE",
|
||||
"options": [
|
||||
["Top", "top"],
|
||||
["Bottom", "bottom"],
|
||||
["North", "north"],
|
||||
["East", "east"],
|
||||
["West", "west"],
|
||||
["South", "south"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will get the angle of a Mechanical Bearing attached to the side of a Digital Adapter."
|
||||
},
|
||||
|
||||
"create_addition_da_dp_link_print": {
|
||||
"message0": "Print %1 to display %2 with adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TEXT",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 70,
|
||||
"tooltip": "This will print a string on the currently selected line to an internal buffer which can be read by a Display Link and put on a Display Board, print will increment the currently selected line."
|
||||
},
|
||||
"create_addition_da_dp_link_clear_line": {
|
||||
"message0": "Clear current line in display %1 with adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 70,
|
||||
"tooltip": "This will clear the text on the currently selected line."
|
||||
},
|
||||
"create_addition_da_dp_link_clear": {
|
||||
"message0": "Clear display %1 with adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 70,
|
||||
"tooltip": "This will clear all the text on all lines."
|
||||
},
|
||||
"create_addition_da_dp_link_get_line": {
|
||||
"message0": "Get current line from display %1 with adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the currently selected line (starts at 1)."
|
||||
},
|
||||
"create_addition_da_dp_link_set_line": {
|
||||
"message0": "Goto line %1 in display %2 with adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "LINE",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 70,
|
||||
"tooltip": "This will set the currently selected line to line (starts at 1)."
|
||||
},
|
||||
"create_addition_da_dp_link_get_max_line": {
|
||||
"message0": "Get max line in display %1 with adapter",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DA",
|
||||
"check": "Peripheral"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 70,
|
||||
"tooltip": "This will return the max number of lines that can be displayable using the Digital Adapter (will always return 16)."
|
||||
}
|
||||
}
|
330
blocks/Create_Additions/generator.js
Normal file
330
blocks/Create_Additions/generator.js
Normal file
@ -0,0 +1,330 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
// generator for Electric Motor
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_set_speed'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
var speed = generator.valueToCode(block, 'RPM', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${motor}.setSpeed(${speed})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_stop'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${motor}.stop()\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_rotate'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
var degrees = generator.valueToCode(block, 'DEGREES', generator.ORDER_ATOMIC);
|
||||
var speed = generator.valueToCode(block, 'RPM', generator.ORDER_ATOMIC);
|
||||
|
||||
if (speed == "nil") {
|
||||
return [`${motor}.rotate(${degrees})`, luaGenerator.ORDER_NONE];
|
||||
} else {
|
||||
return [`${motor}.rotate(${degrees}, ${speed})`, luaGenerator.ORDER_NONE];
|
||||
}
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_translate'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
var tblock = generator.valueToCode(block, 'BLOCKS', generator.ORDER_ATOMIC);
|
||||
var speed = generator.valueToCode(block, 'RPM', generator.ORDER_ATOMIC);
|
||||
|
||||
if (speed == "nil") {
|
||||
return [`${motor}.translate(${tblock})`, luaGenerator.ORDER_NONE];
|
||||
} else {
|
||||
return [`${motor}.translate(${tblock}, ${speed})`, luaGenerator.ORDER_NONE];
|
||||
}
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_get_speed'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${motor}.getSpeed()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_get_stress_capacity'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${motor}.getStressCapacity()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_get_energy_consumption'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${motor}.getEnergyConsumption()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_get_max_input'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${motor}.getMaxInsert()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_electric_motor_get_max_output'] = function(block, generator) {
|
||||
var motor = generator.valueToCode(block, 'MOTOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${motor}.getMaxExtract()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// generator for Accumulator
|
||||
|
||||
luaGenerator.forBlock['create_addition_accumulator_get_energy'] = function(block, generator) {
|
||||
var accumulator = generator.valueToCode(block, 'ACCUMULATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${accumulator}.getEnergy()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_accumulator_get_capacity'] = function(block, generator) {
|
||||
var accumulator = generator.valueToCode(block, 'ACCUMULATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${accumulator}.getCapacity()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_accumulator_get_percent'] = function(block, generator) {
|
||||
var accumulator = generator.valueToCode(block, 'ACCUMULATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${accumulator}.getPercent()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_accumulator_get_max_input'] = function(block, generator) {
|
||||
var accumulator = generator.valueToCode(block, 'ACCUMULATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${accumulator}.getMaxInsert()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_accumulator_get_max_output'] = function(block, generator) {
|
||||
var accumulator = generator.valueToCode(block, 'ACCUMULATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${accumulator}.getMaxExtract()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_accumulator_get_height'] = function(block, generator) {
|
||||
var accumulator = generator.valueToCode(block, 'ACCUMULATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${accumulator}.getHeight()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_accumulator_get_width'] = function(block, generator) {
|
||||
var accumulator = generator.valueToCode(block, 'ACCUMULATOR', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${accumulator}.getWidth()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// generator for Portable Energy Interface (PEI)
|
||||
|
||||
luaGenerator.forBlock['create_addition_pei_get_energy'] = function(block, generator) {
|
||||
var pei = generator.valueToCode(block, 'PEI', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pei}.getEnergy()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_pei_get_capacity'] = function(block, generator) {
|
||||
var pei = generator.valueToCode(block, 'PEI', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pei}.getCapacity()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_pei_is_connected'] = function(block, generator) {
|
||||
var pei = generator.valueToCode(block, 'PEI', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pei}.isConnected()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_pei_get_max_input'] = function(block, generator) {
|
||||
var pei = generator.valueToCode(block, 'PEI', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pei}.getMaxInsert()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_pei_get_max_output'] = function(block, generator) {
|
||||
var pei = generator.valueToCode(block, 'PEI', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${pei}.getMaxExtract()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// generator for Redstone Relay
|
||||
|
||||
luaGenerator.forBlock['create_addition_relay_get_max_input'] = function(block, generator) {
|
||||
var relay = generator.valueToCode(block, 'RELAY', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${relay}.getMaxInsert()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_relay_get_max_output'] = function(block, generator) {
|
||||
var relay = generator.valueToCode(block, 'RELAY', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${relay}.getMaxExtract()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_relay_get_throughput'] = function(block, generator) {
|
||||
var relay = generator.valueToCode(block, 'RELAY', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${relay}.getThroughput()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_relay_is_powered'] = function(block, generator) {
|
||||
var relay = generator.valueToCode(block, 'RELAY', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${relay}.isPowered()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Digital Adapter | Rotational Speed Controller
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_rotational_speed_control_set_target_speed'] = function(block, generator) {
|
||||
var speed = generator.valueToCode(block, 'RPM', generator.ORDER_ATOMIC);
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return `${adapter}.setTargetSpeed("${side}", ${speed})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_rotational_speed_control_get_target_speed'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getTargetSpeed("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Digital Adapter | Stressometer
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_stressometer_get_kinetic_stress'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getKineticStress("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_stressometer_get_kinetic_capacity'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getKineticSpeed("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Digital Adapter | Speedometer
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_speedometer_get_kinetic_speed'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getKineticSpeed("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_speedometer_get_kinetic_max_speed'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${adapter}.getKineticTopSpeed()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Digital Adapter | Pulleys
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_pulleys_get_pulleys_distance'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getPulleyDistance("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Digital Adapter | Elevator Pulley
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_elevator_pulley_get_elevator_floor'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getElevatorFloor("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_elevator_pulley_get_elevator_floors'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getElevatorFloors("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_elevator_pulley_get_elevator_floor_name'] = function(block, generator) {
|
||||
var floorindex = generator.valueToCode(block, 'INDEX', generator.ORDER_ATOMIC);
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getElevatorFloorName("${side}", ${floorindex})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_elevator_pulley_goto_elevator_floor_name'] = function(block, generator) {
|
||||
var floorindex = generator.valueToCode(block, 'INDEX', generator.ORDER_ATOMIC);
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
if (block.outputConnection && block.outputConnection.targetConnection) {
|
||||
return [`${adapter}.gotoElevatorFloor("${side}", ${floorindex})`, luaGenerator.ORDER_NONE];
|
||||
} else {
|
||||
return `${adapter}.gotoElevatorFloor("${side}", ${floorindex})\n`;
|
||||
}
|
||||
};
|
||||
|
||||
// Digital Adapter | Mechanical Piston
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_mechanical_piston_get_piston_distance'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getPistonDistance("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Digital Adapter | Mechanical Bearing
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_mechanical_bearing_get_bearing_angle'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
var side = block.getFieldValue('SIDE');
|
||||
|
||||
return [`${adapter}.getBearingAngle("${side}")`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
// Digital Adapter | Display Link
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_dp_link_print'] = function(block, generator) {
|
||||
var text = generator.valueToCode(block, 'TEXT', generator.ORDER_ATOMIC);
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${adapter}.print("${text}")\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_dp_link_clear_line'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${adapter}.clearLine()\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_dp_link_clear'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${adapter}.clear()\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_dp_link_get_line'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${adapter}.getLine()`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_dp_link_set_line'] = function(block, generator) {
|
||||
var line = generator.valueToCode(block, 'LINE', generator.ORDER_ATOMIC);
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
|
||||
return `${adapter}.setLine()\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['create_addition_da_dp_link_get_max_line'] = function(block, generator) {
|
||||
var adapter = generator.valueToCode(block, 'DA', generator.ORDER_ATOMIC);
|
||||
|
||||
return [`${adapter}.getMaxLines()`, luaGenerator.ORDER_NONE];
|
||||
};
|
BIN
blocks/Create_Additions/icon.png
Normal file
BIN
blocks/Create_Additions/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 58 KiB |
24
blocks/Create_Additions/index.json
Normal file
24
blocks/Create_Additions/index.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "Create Crafts & Additions",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "https://www.curseforge.com/minecraft/mc-mods/createaddition",
|
||||
"version": "1.0",
|
||||
"category": "Create",
|
||||
"keyword": "create mod",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": true,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": [
|
||||
"CCPeripheral"
|
||||
],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
"command": true,
|
||||
"pocket": false,
|
||||
"advpocket": false,
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
125
blocks/Create_Additions/toolbox.xml
Normal file
125
blocks/Create_Additions/toolbox.xml
Normal file
@ -0,0 +1,125 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="Create Additions" colour="70">
|
||||
<label text="Electric Motor"></label>
|
||||
<block type="create_addition_electric_motor_set_speed">
|
||||
<value name="RPM">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">32</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="create_addition_electric_motor_stop"></block>
|
||||
<block type="create_addition_electric_motor_rotate">
|
||||
<value name="DEGREES">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">90</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="RPM">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="create_addition_electric_motor_translate">
|
||||
<value name="BLOCKS">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="RPM">
|
||||
<shadow type="logic_null"></shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="create_addition_electric_motor_get_speed"></block>
|
||||
<block type="create_addition_electric_motor_get_stress_capacity"></block>
|
||||
<block type="create_addition_electric_motor_get_energy_consumption"></block>
|
||||
<block type="create_addition_electric_motor_get_max_input"></block>
|
||||
<block type="create_addition_electric_motor_get_max_output"></block>
|
||||
|
||||
<label text="Accumulator"></label>
|
||||
<block type="create_addition_accumulator_get_energy"></block>
|
||||
<block type="create_addition_accumulator_get_capacity"></block>
|
||||
<block type="create_addition_accumulator_get_percent"></block>
|
||||
<block type="create_addition_accumulator_get_max_input"></block>
|
||||
<block type="create_addition_accumulator_get_max_output"></block>
|
||||
<block type="create_addition_accumulator_get_height"></block>
|
||||
<block type="create_addition_accumulator_get_width"></block>
|
||||
|
||||
<label text="Portable Energy Interface (PEI)"></label>
|
||||
<block type="create_addition_pei_get_energy"></block>
|
||||
<block type="create_addition_pei_get_capacity"></block>
|
||||
<block type="create_addition_pei_is_connected"></block>
|
||||
<block type="create_addition_pei_get_max_input"></block>
|
||||
<block type="create_addition_pei_get_max_output"></block>
|
||||
|
||||
<label text="Redstone Relay"></label>
|
||||
<block type="create_addition_relay_get_max_input"></block>
|
||||
<block type="create_addition_relay_get_max_output"></block>
|
||||
<block type="create_addition_relay_get_throughput"></block>
|
||||
<block type="create_addition_relay_is_powered"></block>
|
||||
|
||||
<label text="Digital Adapter | Rotational Speed Controller"></label>
|
||||
<block type="create_addition_da_rotational_speed_control_set_target_speed">
|
||||
<value name="RPM">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">32</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="create_addition_da_rotational_speed_control_get_target_speed"></block>
|
||||
|
||||
<label text="Digital Adapter | Stressometer"></label>
|
||||
<block type="create_addition_da_stressometer_get_kinetic_stress"></block>
|
||||
<block type="create_addition_da_stressometer_get_kinetic_capacity"></block>
|
||||
|
||||
<label text="Digital Adapter | Speedometer"></label>
|
||||
<block type="create_addition_da_speedometer_get_kinetic_speed"></block>
|
||||
<block type="create_addition_da_speedometer_get_kinetic_max_speed"></block>
|
||||
|
||||
<label text="Digital Adapter | Pulleys"></label>
|
||||
<block type="create_addition_da_pulleys_get_pulleys_distance"></block>
|
||||
|
||||
<label text="Digital Adapter | Elevator Pulley"></label>
|
||||
<block type="create_addition_da_elevator_pulley_get_elevator_floor"></block>
|
||||
<block type="create_addition_da_elevator_pulley_get_elevator_floors"></block>
|
||||
<block type="create_addition_da_elevator_pulley_get_elevator_floor_name">
|
||||
<value name="INDEX">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="create_addition_da_elevator_pulley_goto_elevator_floor_name">
|
||||
<value name="INDEX">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
|
||||
<label text="Digital Adapter | Mechanical Piston"></label>
|
||||
<block type="create_addition_da_mechanical_piston_get_piston_distance"></block>
|
||||
|
||||
<label text="Digital Adapter | Mechanical Bearing"></label>
|
||||
<block type="create_addition_da_mechanical_bearing_get_bearing_angle"></block>
|
||||
|
||||
<label text="Digital Adapter | Display Link"></label>
|
||||
<block type="create_addition_da_dp_link_print">
|
||||
<value name="TEXT">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Hello, world!</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="create_addition_da_dp_link_clear_line"></block>
|
||||
<block type="create_addition_da_dp_link_clear"></block>
|
||||
<block type="create_addition_da_dp_link_get_line"></block>
|
||||
<block type="create_addition_da_dp_link_set_line">
|
||||
<value name="LINE">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="create_addition_da_dp_link_get_max_line"></block>
|
||||
</category>
|
||||
</xml>
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"ide_addcode": {
|
||||
"message0": "Add Code %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "CODE",
|
||||
"text": "print('hello world!')"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 150,
|
||||
"tooltip": "Add Code for some code is not in IDE",
|
||||
"helpUrl": ""
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary-
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
// Define your custom block handler
|
||||
luaGenerator.forBlock['ide_addcode'] = function(block, generator) {
|
||||
var codefromuser = generator.valueToCode(block, 'CODE', generator.ORDER_ATOMIC);
|
||||
|
||||
// Remove all occurrences of the matched characters
|
||||
const cleanedStr = codefromuser.replace(/[']/g, '');
|
||||
return cleanedStr+"\n";
|
||||
};
|
@ -1,6 +0,0 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="IDE" colour="150">
|
||||
<!-- Define your custom blocks here -->
|
||||
<block type="ide_addcode"></block>
|
||||
</category>
|
||||
</xml>
|
134
blocks/NativeIO/block_design.json
Normal file
134
blocks/NativeIO/block_design.json
Normal file
@ -0,0 +1,134 @@
|
||||
{
|
||||
"io_open": {
|
||||
"message0": "Open file %1 with mode %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILENAME",
|
||||
"check": "String"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "MODE",
|
||||
"options": [
|
||||
["read", "r"],
|
||||
["write", "w"],
|
||||
["append", "a"],
|
||||
["read/write", "r+"],
|
||||
["write/read", "w+"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "File",
|
||||
"colour": 260,
|
||||
"tooltip": "Open a file with the given mode"
|
||||
},
|
||||
"io_close": {
|
||||
"message0": "Close file %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILE",
|
||||
"check": "File"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 260,
|
||||
"tooltip": "Close the specified file"
|
||||
},
|
||||
"io_flush": {
|
||||
"message0": "Flush file %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILE",
|
||||
"check": "File"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 260,
|
||||
"tooltip": "Flush any buffered output, forcing it to be written to the file"
|
||||
},
|
||||
"io_read": {
|
||||
"message0": "Read from file %1 with format %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILE",
|
||||
"check": "File"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "FORMAT",
|
||||
"options": [
|
||||
["line", "l"],
|
||||
["line ln", "L"],
|
||||
["All", "a"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 260,
|
||||
"tooltip": "Read data from the file"
|
||||
},
|
||||
"io_write": {
|
||||
"message0": "Write %1 to file %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DATA"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILE",
|
||||
"check": "File"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 260,
|
||||
"tooltip": "Write data to the file"
|
||||
},
|
||||
"io_lines": {
|
||||
"message0": "Read line %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILE",
|
||||
"check": "File"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 260,
|
||||
"tooltip": "Returns an iterator that, each time it is called, returns a new line from the file."
|
||||
},
|
||||
"io_seek": {
|
||||
"message0": "Seek in file %1 to position %2 with offset %3",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "FILE",
|
||||
"check": "File"
|
||||
},
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "POSITION",
|
||||
"options": [
|
||||
["Set", "set"],
|
||||
["Current", "cur"],
|
||||
["End", "end"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "OFFSET",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"output": "Number",
|
||||
"colour": 260,
|
||||
"tooltip": "Seek to a specific position in the file"
|
||||
}
|
||||
}
|
52
blocks/NativeIO/generator.js
Normal file
52
blocks/NativeIO/generator.js
Normal file
@ -0,0 +1,52 @@
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
if (!luaGenerator.forBlock) {
|
||||
luaGenerator.forBlock = {};
|
||||
}
|
||||
|
||||
luaGenerator.forBlock['io_open'] = function(block, generator) {
|
||||
const filename = generator.valueToCode(block, 'FILENAME', generator.ORDER_ATOMIC);
|
||||
const mode = block.getFieldValue('MODE');
|
||||
const code = `io.open(${filename}, "${mode}")`;
|
||||
return [code, generator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['io_close'] = function(block, generator) {
|
||||
const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC);
|
||||
const code = `${file}:close()\n`;
|
||||
return code;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['io_read'] = function(block, generator) {
|
||||
const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC);
|
||||
const format = block.getFieldValue('FORMAT');
|
||||
const code = `${file}:read("${format}")`;
|
||||
return [code, generator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['io_write'] = function(block, generator) {
|
||||
const data = generator.valueToCode(block, 'DATA', generator.ORDER_NONE) || '""';
|
||||
const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC);
|
||||
const code = `${file}:write(${data})\n`;
|
||||
return code;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['io_seek'] = function(block, generator) {
|
||||
const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC);
|
||||
const position = generator.valueToCode(block, 'POSITION', generator.ORDER_ATOMIC);
|
||||
const offset = generator.valueToCode(block, 'OFFSET', generator.ORDER_ATOMIC);
|
||||
const code = `${file}:seek("${position}", ${offset})`;
|
||||
return [code, generator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['io_lines'] = function(block, generator) {
|
||||
const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC);
|
||||
const code = `${file}:lines()`;
|
||||
return [code, generator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['io_flush'] = function(block, generator) {
|
||||
const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC);
|
||||
const code = `${file}:flush()\n`;
|
||||
return code;
|
||||
};
|
@ -1,15 +1,15 @@
|
||||
{
|
||||
"name": "IDE",
|
||||
"name": "IO",
|
||||
"author": "DPSoftware Foundation",
|
||||
"description": "Block for IDE",
|
||||
"description": "Lua Native: Input/Output file",
|
||||
"version": "1.0.0",
|
||||
"category": "Blockly Extensions",
|
||||
"keyword": "test",
|
||||
"category": "Native",
|
||||
"keyword": "Native, Lua, IO",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"peripherals": false,
|
||||
"library": true,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": {},
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": true,
|
||||
"adv": true,
|
||||
@ -19,4 +19,4 @@
|
||||
"turtle": true,
|
||||
"advturtle": true
|
||||
}
|
||||
}
|
||||
}
|
36
blocks/NativeIO/toolbox.xml
Normal file
36
blocks/NativeIO/toolbox.xml
Normal file
@ -0,0 +1,36 @@
|
||||
<xml id="toolbox" style="display: none;">
|
||||
<category name="IO" colour="260">
|
||||
<!-- Open file block -->
|
||||
<block type="io_open">
|
||||
<value name="MODE">
|
||||
<shadow type="field_dropdown">
|
||||
<field name="MODE">r</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="io_read">
|
||||
<value name="FORMAT">
|
||||
<shadow type="field_dropdown">
|
||||
<field name="FORMAT">a</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="io_write">
|
||||
<value name="DATA">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">Hello, world!</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="io_seek">
|
||||
<value name="OFFSET">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="io_lines"></block>
|
||||
<block type="io_flush"></block>
|
||||
<block type="io_close"></block>
|
||||
</category>
|
||||
</xml>
|
@ -1,3 +1,5 @@
|
||||
// this file not for generator only
|
||||
|
||||
const { luaGenerator } = require('blockly/lua');
|
||||
|
||||
// Check if luaGenerator.forBlock is defined and initialize if necessary
|
@ -9,7 +9,7 @@
|
||||
"peripherals": false,
|
||||
"library": false,
|
||||
"require_network": false,
|
||||
"dependencies": {},
|
||||
"dependencies": [],
|
||||
"design_for_computer": {
|
||||
"basic": false,
|
||||
"adv": false,
|
Binary file not shown.
1
ccIDE.wheel
Normal file
1
ccIDE.wheel
Normal file
@ -0,0 +1 @@
|
||||
{"title":"ccIDE","description":"","entries":[{"text":"fs","id":"bpjk25nz5u"},{"text":"gps","id":"4ycx32t6zv"},{"text":"http","id":"sy5e4jg9te"},{"text":"multishell","id":"zmpdq862sr"},{"text":"paintutils","id":"2kcgbw3r5k"},{"text":"peripheral","id":"jzj9g9s4q9"},{"text":"shell","id":"aekamm3pn6"},{"text":"term","id":"phtvswrv6v"},{"text":"vector","id":"6c6uz56m77"},{"text":"window","id":"5dk6dkpz9b"},{"text":"cc.audio.dfpwm","id":"dkbm2ftkcr"},{"text":"cc.completion","id":"95vdrwx3rf"},{"text":"cc.expect","id":"g6agen6yej"},{"text":"cc.image.nft","id":"rwb9d7eru7"},{"text":"cc.pretty","id":"twkxbcsgh8"},{"text":"cc.require","id":"b3n7k2xnny"},{"text":"cc.shell.completion","id":"9x98gv9hba"},{"text":"cc.strings","id":"jcru68rr39"},{"text":"computer (turtle)","id":"cdrvm4equh"},{"text":"monitor (peripheral)","id":"hmtaqyh5rf"},{"text":"printer (peripheral)","id":"kcwfe8suy5"},{"text":"speaker (peripheral)","id":"92p9tv9wbz"},{"text":"energy_storage (peripheral)","id":"3td8u4cua3"},{"text":"fluid_storage (peripheral)","id":"gt2ndb9pj4"},{"text":"inventory (peripheral)","id":"zx9c8aqakq"}],"colorSettings":[{"color":"#3369E8","enabled":true},{"color":"#D50F25","enabled":true},{"color":"#EEB211","enabled":true},{"color":"#009925","enabled":true},{"color":"#000000","enabled":false},{"color":"#000000","enabled":false}],"pageBackgroundColor":"#FFFFFF","type":"color","pictureType":"none","coverImageType":"gallery","coverImageName":"/images/chocolate-chip-cookie.jpg","galleryPicture":"/images/none.png","customPictureName":"","customPictureDataUri":"","customCoverImageDataUri":"","centerText":"","allowDuplicates":true,"duringSpinSound":"ticking-sound","duringSpinSoundVolume":50,"afterSpinSound":"no-sound","afterSpinSoundVolume":50,"maxNames":1000,"spinTime":10,"launchConfetti":true,"animateWinner":false,"autoRemoveWinner":true,"displayWinnerDialog":true,"displayRemoveButton":true,"displayHideButton":true,"winnerMessage":"เรามีผู้ชนะ!","playClickWhenWinnerRemoved":false,"hubSize":"S","drawOutlines":false,"slowSpin":false,"showTitle":true,"isAdvanced":false}
|
373
index.js
373
index.js
@ -1,21 +1,169 @@
|
||||
console.log("Initializing...")
|
||||
const { app, BrowserWindow, ipcMain, Menu, dialog } = require('electron')
|
||||
const fs = require('fs');
|
||||
const prompt = require('electron-prompt');
|
||||
const path = require('path');
|
||||
const pino = require('pino')
|
||||
const pretty = require('pino-pretty');
|
||||
const https = require('node:https');
|
||||
|
||||
const ipc = ipcMain
|
||||
|
||||
const logger = pino(pretty())
|
||||
|
||||
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';
|
||||
|
||||
let currentprojectpath = null;
|
||||
let currentprojectname = null;
|
||||
let currentprojectopen = false;
|
||||
let appexiting = false;
|
||||
let appreloading = false;
|
||||
let currentworkspacechange = false;
|
||||
let isopennewproject = false;
|
||||
var ena_splash = process.env['CCIDE_ENABLE_MAIN_SPLASH'] == 'true';
|
||||
|
||||
app.whenReady().then(() => {
|
||||
var currentprojectpath = null;
|
||||
var currentprojectname = null;
|
||||
var currentprojectopen = false;
|
||||
var appexiting = false;
|
||||
var appreloading = false;
|
||||
var currentworkspacechange = false;
|
||||
var isopennewproject = false;
|
||||
|
||||
var appstarted = false;
|
||||
var version;
|
||||
var gitver;
|
||||
|
||||
try {
|
||||
// Read package.json synchronously
|
||||
const data = fs.readFileSync('package.json', 'utf8');
|
||||
|
||||
// Parse JSON
|
||||
const packageJson = JSON.parse(data);
|
||||
|
||||
// Get project version
|
||||
version = packageJson.version;
|
||||
} catch (err) {
|
||||
console.error("Error reading package.json:", err);
|
||||
}
|
||||
|
||||
function checkupdate() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const req = https.request({
|
||||
hostname: 'api.github.com',
|
||||
port: 443,
|
||||
path: '/repos/DPSoftware-Foundation/ccIDE/releases/latest',
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'User-Agent': 'ccIDE-Check-Update-Service', // GitHub API requires a User-Agent header
|
||||
}
|
||||
}, (res) => {
|
||||
let data = '';
|
||||
res.setEncoding('utf8');
|
||||
res.on('data', (chunk) => {
|
||||
data += chunk;
|
||||
});
|
||||
res.on('end', () => {
|
||||
try {
|
||||
const json = JSON.parse(data);
|
||||
resolve(json.tag_name); // Return the tag_name or other relevant data
|
||||
} catch (e) {
|
||||
reject('Error parsing JSON: ' + e.message);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
req.on('error', (e) => {
|
||||
reject('Error fetching release: ' + e.message);
|
||||
});
|
||||
|
||||
req.end();
|
||||
});
|
||||
}
|
||||
|
||||
function normalizeVersion(version, length = 4) {
|
||||
// Split the version string into parts and pad with zeros if necessary
|
||||
return version.split('.').map(part => part.padStart(2, '0')).concat(Array(length).fill('00')).slice(0, length).join('.');
|
||||
}
|
||||
|
||||
app.whenReady().then(async () => {
|
||||
logger.info("Initializing splash window...")
|
||||
reloadall(false);
|
||||
var splash = new BrowserWindow({
|
||||
width: 720,
|
||||
height: 400,
|
||||
icon: path.join(__dirname, 'assets', 'ccIDEIcon.ico'),
|
||||
transparent: true,
|
||||
frame: false,
|
||||
center: true,
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
contextIsolation: false,
|
||||
},
|
||||
resizable: false
|
||||
});
|
||||
|
||||
splash.loadFile('src/splash.html');
|
||||
|
||||
while (!splash.isVisible()) {}
|
||||
|
||||
// checkupdate
|
||||
logger.info("Checking for new update...")
|
||||
splash.webContents.send("change-status", "Checking for new update...")
|
||||
|
||||
try {
|
||||
const latestRelease = await checkupdate();
|
||||
// Store the version or use it as needed
|
||||
gitver = latestRelease;
|
||||
} catch (error) {
|
||||
logger.error('Error in update check:', error);
|
||||
}
|
||||
|
||||
logger.info("Current version: " + version)
|
||||
logger.info("Version in github: " + gitver)
|
||||
|
||||
|
||||
const normalizedAppVersion = normalizeVersion(version);
|
||||
|
||||
if (!gitver) {
|
||||
logger.error("Can't check update")
|
||||
} else {
|
||||
const normalizedReleaseVersion = normalizeVersion(gitver);
|
||||
if (normalizedAppVersion >= normalizedReleaseVersion) {
|
||||
logger.info("Software is up-to-date.");
|
||||
} else {
|
||||
logger.info("A new update is available: " + gitver)
|
||||
var is_not_skip_update = localStorage.getItem('skip_update_version') != normalizedAppVersion;
|
||||
var is_ignore = localStorage.getItem('ignore_update');
|
||||
if (is_ignore || is_not_skip_update) {
|
||||
const result = dialog.showMessageBoxSync({
|
||||
type: 'question',
|
||||
buttons: ['Update', 'Ignore', 'Skip'],
|
||||
defaultId: 0,
|
||||
title: 'Update Available',
|
||||
message: `A new version (${gitver}) is available. Do you want to update now?`,
|
||||
detail: 'Click "Update" to go to the release page, "Ignore" to ignore this update, or "Skip" to skip this version.'
|
||||
});
|
||||
switch (result.response) {
|
||||
case 0: // 'Update'
|
||||
(async () => {
|
||||
try {
|
||||
const { default: open } = await import('open');
|
||||
|
||||
await open('https://github.com/DPSoftware-Foundation/ccIDE/releases/latest');
|
||||
console.log('URL opened in default browser');
|
||||
} catch (err) {
|
||||
console.error('Error opening URL:', err);
|
||||
}
|
||||
})();
|
||||
break;
|
||||
case 1: // 'Ignore'
|
||||
localStorage.setItem('ignore_update', true);
|
||||
break;
|
||||
case 2: // 'Skip'
|
||||
localStorage.setItem('skip_update_version', normalizedReleaseVersion);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Initializing main windows...")
|
||||
splash.webContents.send("change-status", "Initializing main windows...")
|
||||
|
||||
const win = new BrowserWindow({
|
||||
width: 1280,
|
||||
height: 720,
|
||||
@ -26,40 +174,65 @@ app.whenReady().then(() => {
|
||||
enableRemoteModule: true,
|
||||
contextIsolation: false,
|
||||
},
|
||||
show: false,
|
||||
show: ena_splash,
|
||||
center: true,
|
||||
})
|
||||
|
||||
var splash = new BrowserWindow({
|
||||
width: 600,
|
||||
height: 300,
|
||||
icon: path.join(__dirname, 'assets', 'ccIDEIcon.ico'),
|
||||
transparent: true,
|
||||
frame: false,
|
||||
center: true
|
||||
});
|
||||
|
||||
win.loadFile('src/index.html');
|
||||
splash.loadFile('src/splash.html');
|
||||
win.setTitle(`ccIDE`)
|
||||
|
||||
|
||||
try {
|
||||
win.loadFile('src/index.html');
|
||||
} catch {
|
||||
try {
|
||||
win.loadFile('dist_src/index.html');
|
||||
} catch {
|
||||
dialog.showErrorBox("Error on startup", "Can't find index.html");
|
||||
}
|
||||
}
|
||||
win.setTitle(`ccIDE v${version}`)
|
||||
|
||||
ipc.once('ready', () => {
|
||||
console.log("ready")
|
||||
splash.webContents.send("isloaded")
|
||||
splash.webContents.send("change-status", "Thanks for using software from DPSoftware.")
|
||||
splash.webContents.send("change-title", `ccIDE v${version}`)
|
||||
logger.info("Ready!")
|
||||
if (splash) {
|
||||
splash.close();
|
||||
splash.hide();
|
||||
}
|
||||
win.show();
|
||||
win.maximize();
|
||||
//win.maximize();
|
||||
appstarted = true;
|
||||
});
|
||||
|
||||
ipc.on("splash-close", (event) => {
|
||||
if (appstarted) {
|
||||
splash.hide();
|
||||
} else {
|
||||
splash.close();
|
||||
win.close();
|
||||
}
|
||||
})
|
||||
|
||||
ipc.on('erroronstart', (event, errormessage) => {
|
||||
logger.error(errormessage)
|
||||
dialog.showErrorBox("Error on startup", errormessage);
|
||||
//win.openDevTools();
|
||||
});
|
||||
|
||||
ipc.on('error', (event, errormessage) => {
|
||||
logger.error(errormessage)
|
||||
dialog.showErrorBox("Error", errormessage);
|
||||
//win.openDevTools();
|
||||
});
|
||||
|
||||
ipc.on('update-log-status', (event, status) => {
|
||||
logger.info(status);
|
||||
if (!appstarted) {
|
||||
splash.webContents.send("change-status", status);
|
||||
}
|
||||
if (status == "Downloading blocks...") {
|
||||
win.show();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
//app.on('activate', () => {
|
||||
// if (BrowserWindow.getAllWindows().length === 0) {
|
||||
// createWindow()
|
||||
@ -75,12 +248,12 @@ app.whenReady().then(() => {
|
||||
appreloading = false;
|
||||
isopennewproject = false;
|
||||
if (isloaded) {
|
||||
win.setTitle(`ccIDE`)
|
||||
win.setTitle(`ccIDE v${version}`)
|
||||
win.reload();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
logger.info("Settings up menu bar...")
|
||||
// Define a custom menu template
|
||||
const menuTemplate = [
|
||||
{
|
||||
@ -147,7 +320,7 @@ app.whenReady().then(() => {
|
||||
currentprojectname = path.basename(result.filePaths[0]);
|
||||
currentprojectopen = true;
|
||||
|
||||
win.setTitle(`${currentprojectname} | ccIDE`)
|
||||
win.setTitle(`${currentprojectname} | ccIDE v${version}`)
|
||||
});
|
||||
|
||||
}
|
||||
@ -182,7 +355,7 @@ app.whenReady().then(() => {
|
||||
currentprojectname = path.basename(result.filePaths[0]);
|
||||
currentprojectopen = true;
|
||||
|
||||
win.setTitle(`${currentprojectname} | ccIDE`)
|
||||
win.setTitle(`${currentprojectname} | ccIDE v${version}`)
|
||||
});
|
||||
|
||||
}
|
||||
@ -208,6 +381,19 @@ app.whenReady().then(() => {
|
||||
}
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
label: 'Export',
|
||||
submenu: [
|
||||
{
|
||||
label: "Export Lua",
|
||||
accelerator: 'CmdOrCtrl+Shift+L',
|
||||
click: () => {
|
||||
win.webContents.send('export-lua-request');
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
label: 'Exit',
|
||||
accelerator: 'CmdOrCtrl+Q',
|
||||
@ -220,28 +406,35 @@ app.whenReady().then(() => {
|
||||
{
|
||||
label: 'Edit',
|
||||
submenu: [
|
||||
{ role: 'undo', accelerator: 'CmdOrCtrl+Z', click: () => {win.webContents.send('request-undo-redo', false)} },
|
||||
{ role: 'redo', accelerator: 'CmdOrCtrl+Y', click: () => {win.webContents.send('request-undo-redo', true)} },
|
||||
{ type: 'separator' },
|
||||
{ role: 'cut', accelerator: 'CmdOrCtrl+X' },
|
||||
{ role: 'copy', accelerator: 'CmdOrCtrl+C' },
|
||||
{ role: 'paste', accelerator: 'CmdOrCtrl+V' }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'View',
|
||||
submenu: [
|
||||
{ label: 'DevTools', accelerator: 'F12', click: () => {win.openDevTools()}},
|
||||
{ label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:" },
|
||||
{ label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:" },
|
||||
{ type: "separator" },
|
||||
{ label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
|
||||
{ label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
|
||||
{ label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
|
||||
{ label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Help',
|
||||
submenu: [
|
||||
{ label: 'DevTools', accelerator: 'F12', click: () => {win.openDevTools()}},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
label: 'About',
|
||||
click: () => {
|
||||
win.webContents.send("open-about")
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Splash Screen',
|
||||
click: () => {
|
||||
if (!splash.isVisible()) {
|
||||
splash.show();
|
||||
} else {
|
||||
splash.hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -250,6 +443,8 @@ app.whenReady().then(() => {
|
||||
// Set the custom menu
|
||||
const menu = Menu.buildFromTemplate(menuTemplate);
|
||||
Menu.setApplicationMenu(menu);
|
||||
|
||||
logger.info("Settings up event...")
|
||||
|
||||
ipc.on('prompt', (event, promptText, defaultValue) => {
|
||||
try {
|
||||
@ -300,7 +495,7 @@ app.whenReady().then(() => {
|
||||
|
||||
win.webContents.send('workspace-saved', true);
|
||||
|
||||
win.setTitle(`${currentprojectname} | ccIDE`)
|
||||
win.setTitle(`${currentprojectname} | ccIDE v${version}`)
|
||||
if (currentworkspacechange) {
|
||||
currentworkspacechange = false;
|
||||
}
|
||||
@ -325,7 +520,7 @@ app.whenReady().then(() => {
|
||||
|
||||
win.webContents.send('workspace-saved', true);
|
||||
|
||||
win.setTitle(`${currentprojectname} | ccIDE`)
|
||||
win.setTitle(`${currentprojectname} | ccIDE v${version}`)
|
||||
|
||||
if (currentworkspacechange) {
|
||||
currentworkspacechange = false;
|
||||
@ -360,7 +555,7 @@ app.whenReady().then(() => {
|
||||
currentprojectname = path.basename(result.filePaths[0]);
|
||||
currentprojectopen = true;
|
||||
|
||||
win.setTitle(`${currentprojectname} | ccIDE`)
|
||||
win.setTitle(`${currentprojectname} | ccIDE v${version}`)
|
||||
});
|
||||
|
||||
}
|
||||
@ -373,46 +568,74 @@ app.whenReady().then(() => {
|
||||
}
|
||||
});
|
||||
|
||||
ipc.on('export-lua', (event, data) => {
|
||||
dialog.showSaveDialog(win, {
|
||||
title: 'Save Project',
|
||||
defaultPath: path.join(app.getPath('documents'), 'main.lua'),
|
||||
filters: [
|
||||
{ extensions: ['lua'] }
|
||||
]
|
||||
}).then(result => {
|
||||
if (!result.canceled) {
|
||||
fs.writeFile(result.filePath, data, (err) => {
|
||||
if (err) {
|
||||
console.error('Error exporting lua from project:', err);
|
||||
dialog.showErrorBox("Export Lua Error", err.message)
|
||||
}
|
||||
});
|
||||
}
|
||||
}).catch(err => {
|
||||
console.error('Error exporting lua from project:', err);
|
||||
dialog.showErrorBox("Export Lua Error", err.message)
|
||||
});
|
||||
});
|
||||
|
||||
ipc.on('workspace-notsave', (event) => {
|
||||
win.setTitle(`${currentprojectname}* | ccIDE`)
|
||||
win.setTitle(`${currentprojectname}* | ccIDE v${version}`)
|
||||
currentworkspacechange = true;
|
||||
})
|
||||
ipc.on('workspace-unsave', (event) => {
|
||||
currentworkspacechange = true;
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
|
||||
app.on("close", function(e) {
|
||||
console.log("Close event triggered");
|
||||
if (currentprojectopen) {
|
||||
const result = dialog.showMessageBoxSync({
|
||||
type: 'question',
|
||||
buttons: ['Save', 'Don\'t Save', 'Cancel'],
|
||||
defaultId: 2,
|
||||
title: 'Save Changes',
|
||||
message: "Your project is not saved",
|
||||
});
|
||||
if (result === 1) {
|
||||
// Don't save, continue closing
|
||||
win = null;
|
||||
} else if (result === 0) {
|
||||
// Save and then quit
|
||||
appexiting = true;
|
||||
win.webContents.send('save-workspace-request');
|
||||
// Listen for the close event of the main window
|
||||
/*
|
||||
win.on('close', (event) => {
|
||||
event.preventDefault()
|
||||
if (currentprojectopen && !currentworkspacechange) {
|
||||
const result = dialog.showMessageBoxSync({
|
||||
type: 'question',
|
||||
buttons: ['Save', 'Don\'t Save', 'Cancel'],
|
||||
defaultId: 2,
|
||||
title: 'Save Changes',
|
||||
message: "Your project is not saved",
|
||||
});
|
||||
if (result === 1) {
|
||||
// Don't save, continue closing
|
||||
win.close();
|
||||
} else if (result === 0) {
|
||||
// Save and then quit
|
||||
appexiting = true;
|
||||
win.webContents.send('save-workspace-request');
|
||||
}
|
||||
} else {
|
||||
// Cancel the close operation
|
||||
e.preventDefault();
|
||||
win.destroy();
|
||||
}
|
||||
} else {
|
||||
// No unsaved changes, continue closing
|
||||
win = null;
|
||||
}
|
||||
});
|
||||
});
|
||||
*/
|
||||
|
||||
win.on("closed", () => {
|
||||
logger.info("Exiting...")
|
||||
if (!splash.isDestroyed()) {
|
||||
splash.close()
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
if (process.platform !== 'darwin') {
|
||||
app.quit();
|
||||
}
|
||||
logger.info("Exited")
|
||||
});
|
11481
package-lock.json
generated
11481
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
40
package.json
40
package.json
@ -1,22 +1,52 @@
|
||||
{
|
||||
"name": "ccide",
|
||||
"version": "1.1",
|
||||
"version": "1.6.0",
|
||||
"description": "ComputerCraft mod virtual lua IDE",
|
||||
"main": "index.js",
|
||||
"main": "dist/main.js",
|
||||
"scripts": {
|
||||
"dev": "electron .",
|
||||
"build": "electron-packager . ccIDE --platform=win32 --arch=x64 --icon=assets/ccIDEIcon.ico --out=dist --overwrite"
|
||||
"dev": "title ccIDE && electron .",
|
||||
"build": "title building ccIDE && electron-packager . ccIDE --platform=win32 --arch=x64 --icon=assets/ccIDEIcon.ico --out=dist --overwrite && for /d %i in (dist\\ccIDE-*) do copy package.json %i\\",
|
||||
"build_debug": "title building ccIDE (Debug) && electron-packager . ccIDE --platform=win32 --arch=x64 --icon=assets/ccIDEIcon.ico --out=dist_debug --overwrite --debug && for /d %i in (dist_debug\\ccIDE-*) do copy package.json %i\\",
|
||||
"new_build": "webpack --config webpack.main.config.js && webpack --config webpack.renderer.config.js",
|
||||
"dist": "electron-builder"
|
||||
},
|
||||
"author": "DPSoftware Foundation",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"devDependencies": {
|
||||
"electron": "^31.1.0"
|
||||
"copy-webpack-plugin": "^12.0.2",
|
||||
"electron": "^31.7.7",
|
||||
"electron-builder": "^25.1.8",
|
||||
"html-webpack-plugin": "^5.6.3",
|
||||
"terser-webpack-plugin": "^5.3.11",
|
||||
"webpack": "^5.97.1",
|
||||
"webpack-cli": "^6.0.1",
|
||||
"webpack-merge": "^6.0.1",
|
||||
"webpack-node-externals": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@blockly/plugin-workspace-search": "^9.0.5",
|
||||
"@blockly/theme-dark": "^7.0.7",
|
||||
"@electron/remote": "^2.1.2",
|
||||
"blockly": "^11.1.1",
|
||||
"bootstrap": "^5.3.3",
|
||||
"electron-prompt": "^1.7.0",
|
||||
"node-localstorage": "^3.0.5",
|
||||
"open": "^10.1.0",
|
||||
"pino": "^9.3.2",
|
||||
"pino-pretty": "^11.2.2",
|
||||
"toastify-js": "^1.12.0",
|
||||
"unzipper": "^0.12.3",
|
||||
"xmldom": "^0.6.0"
|
||||
},
|
||||
"build": {
|
||||
"appId": "dev.dpsoftware.ccide",
|
||||
"productName": "ccIDE",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"node_modules/**/*"
|
||||
],
|
||||
"directories": {
|
||||
"output": "release"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
136
readme.md
136
readme.md
@ -1,44 +1,84 @@
|
||||
# ComputerCraft IDE (ccIDE)
|
||||
ccIDE is block based programming for ComputerCraft lua.
|
||||
|
||||
special thank for [this repo](https://github.com/Mirka1405/ccblockly)
|
||||
special thank for [ccblockly](https://github.com/Mirka1405/ccblockly) for idea
|
||||
|
||||

|
||||

|
||||
|
||||
# Quick Start
|
||||
1. install nodejs and git
|
||||
2. git clone cd to this project
|
||||
3. Install dependency use `npm install .`
|
||||
4. To run this IDE use `npm run dev`
|
||||
5. Done!
|
||||
1. install nodejs and git.
|
||||
2. git clone and cd to this project .
|
||||
3. Install dependency use `npm install .`.
|
||||
4. To run this IDE use `npm run dev` or if you using windows you can use `run.bat` to run it.
|
||||
|
||||
## Install Remote code into computercraft
|
||||
it very simple! to install Remote code.
|
||||
### Run from URL
|
||||
```
|
||||
wget run https://raw.githubusercontent.com/DPSoftware-Foundation/ccIDE/main/remote.lua
|
||||
```
|
||||
for turtle
|
||||
```
|
||||
wget run https://raw.githubusercontent.com/DPSoftware-Foundation/ccIDE/main/turtleremote.lua
|
||||
```
|
||||
### Download and Run
|
||||
```
|
||||
wget https://raw.githubusercontent.com/DPSoftware-Foundation/ccIDE/main/remote.lua remote.lua
|
||||
remote
|
||||
```
|
||||
for turtle
|
||||
```
|
||||
wget https://raw.githubusercontent.com/DPSoftware-Foundation/ccIDE/main/remote.lua turtleremote.lua
|
||||
turtleremote
|
||||
wget https://raw.githubusercontent.com/DPSoftware-Foundation/ccIDE/main/startup.lua
|
||||
```
|
||||
And restart the computer.
|
||||
|
||||
If error "Domain not permitted" try [this solution](https://github.com/cc-tweaked/CC-Tweaked/discussions/626#discussioncomment-241924).
|
||||
|
||||
## official support peripherals
|
||||
| Peripheral | Status
|
||||
## official support library, peripheral and module function
|
||||
|
||||
### Module (CC) (15/42)
|
||||
| Module | Status
|
||||
|------------|--------
|
||||
|[Advanced Peripherals](https://www.curseforge.com/minecraft/mc-mods/advanced-peripherals) | 🟨 First support
|
||||
| [_G](https://tweaked.cc/module/_G.html) | 🟩 Supported all
|
||||
| [Disk](https://tweaked.cc/module/disk.html) | 🟩 Supported all
|
||||
| [IO](https://tweaked.cc/module/io.html) (NativeIO) | 🟩 Supported all
|
||||
| [Keys](https://tweaked.cc/module/keys.html) | 🟩 Supported all
|
||||
| [OS](https://tweaked.cc/module/os.html) (System) | 🟩 Supported all
|
||||
| [RedNet](https://tweaked.cc/module/rednet.html) | 🟩 Supported all
|
||||
| [Settings](https://tweaked.cc/module/settings.html) | 🟩 Supported all
|
||||
| [TextUtils](https://tweaked.cc/module/textutils.html) | 🟩 Supported all
|
||||
| [Peripheral](https://tweaked.cc/module/peripheral.html) | 🟩 Supported all
|
||||
| [Turtle](https://tweaked.cc/module/turtle.html) | 🟩 Supported all
|
||||
| [Energy Storage Peripheral](https://tweaked.cc/generic_peripheral/energy_storage.html) | 🟩 Supported all
|
||||
| [Fluid Storage Peripheral](https://tweaked.cc/generic_peripheral/fluid_storage.html) | 🟩 Supported all
|
||||
| [Inventory](https://tweaked.cc/generic_peripheral/inventory.html) | 🟩 Supported all
|
||||
| [Redstone](https://tweaked.cc/module/redstone.html) | 🟨 Partially Supported
|
||||
| [Colors](https://tweaked.cc/module/colors.html) | 🟨 Partially Supported
|
||||
| [Commands](https://tweaked.cc/module/commands.html) | 🟥 Unsupport
|
||||
| [FS](https://tweaked.cc/module/fs.html) | 🟥 Unsupport
|
||||
| [GPS](https://tweaked.cc/module/gps.html) | 🟥 Unsupport
|
||||
| [Help](https://tweaked.cc/module/help.html) | 🟥 Unsupport
|
||||
| [HTTP](https://tweaked.cc/module/http.html) (Network) | 🟥 Unsupport
|
||||
| [Multishell](https://tweaked.cc/module/multishell.html) | 🟥 Unsupport
|
||||
| [PaintUtils](https://tweaked.cc/module/paintutils.html) | 🟥 Unsupport
|
||||
| [Parallel](https://tweaked.cc/module/parallel.html) | 🟥 Unsupport
|
||||
| [Pocket](https://tweaked.cc/module/pocket.html) | 🟥 Unsupport
|
||||
| [Shell](https://tweaked.cc/module/shell.html) | 🟥 Unsupport
|
||||
| [Term](https://tweaked.cc/module/term.html) | 🟥 Unsupport
|
||||
| [Vector](https://tweaked.cc/module/vector.html) | 🟥 Unsupport
|
||||
| [Window](https://tweaked.cc/module/window.html) | 🟥 Unsupport
|
||||
| [DFPWM Audio](https://tweaked.cc/library/cc.audio.dfpwm.html) | 🟥 Unsupport
|
||||
| [Completion](https://tweaked.cc/library/cc.completion.html) | 🟥 Unsupport
|
||||
| [Expect](https://tweaked.cc/library/cc.expect.html) | 🟥 Unsupport
|
||||
| [NFT Image](https://tweaked.cc/library/cc.image.nft.html) | 🟥 Unsupport
|
||||
| [Pretty](https://tweaked.cc/library/cc.pretty.html) | 🟥 Unsupport
|
||||
| [Require](https://tweaked.cc/library/cc.require.html) | 🟥 Unsupport
|
||||
| [Shell Completion](https://tweaked.cc/library/cc.shell.completion.html) | 🟥 Unsupport
|
||||
| [Strings](https://tweaked.cc/library/cc.strings.html) | 🟥 Unsupport
|
||||
| [Command Peripheral](https://tweaked.cc/peripheral/command.html) | 🟥 Unsupport
|
||||
| [Computer Peripheral](https://tweaked.cc/peripheral/computer.html) | 🟥 Unsupport
|
||||
| [Drive Peripheral](https://tweaked.cc/peripheral/drive.html) | 🟥 Unsupport
|
||||
| [Modem Peripheral](https://tweaked.cc/peripheral/modem.html) | 🟥 Unsupport
|
||||
| [Monitor Peripheral](https://tweaked.cc/peripheral/monitor.html) | 🟥 Unsupport
|
||||
| [Printer Peripheral](https://tweaked.cc/peripheral/printer.html) | 🟥 Unsupport
|
||||
| [Speaker Peripheral](https://tweaked.cc/peripheral/speaker.html) | 🟥 Unsupport
|
||||
|
||||
Event: https://tweaked.cc/event/alarm.html
|
||||
|
||||
### Peripheral mods (2/20)
|
||||
| Mod | Status
|
||||
|------------|--------
|
||||
|[Create Additions](https://www.curseforge.com/minecraft/mc-mods/createaddition) | 🟩 Supported all
|
||||
|[Advanced Peripherals](https://www.curseforge.com/minecraft/mc-mods/advanced-peripherals) | 🟨 Partially Supported (9/13 Peripheral)
|
||||
|[Create](https://www.curseforge.com/minecraft/mc-mods/create) | 🟨 Third support
|
||||
|[CC:C Bridge](https://www.curseforge.com/minecraft/mc-mods/cccbridge) | 🟥 Unsupport
|
||||
|[Extreme Reactors](https://www.curseforge.com/minecraft/mc-mods/extreme-reactors) ([Command](https://ftbwiki.org/Reactor_Computer_Port)) | 🟥 Unsupport
|
||||
|[CC:Destroy Bridge](https://www.curseforge.com/minecraft/mc-mods/ccdbridge) | 🟥 Unsupport
|
||||
|[More Red x CC:Tweaked Compat](https://www.curseforge.com/minecraft/mc-mods/more-red-x-cc-tweaked-compat) | 🟥 Unsupport
|
||||
|[More Peripherals](https://www.curseforge.com/minecraft/mc-mods/more-peripherals) | 🟥 Unsupport
|
||||
@ -51,14 +91,50 @@ If error "Domain not permitted" try [this solution](https://github.com/cc-tweake
|
||||
|[SirEdvin's Cloud Solutions](https://modrinth.com/mod/cloud-solutions) | 🟥 Unsupport
|
||||
|[CC: VS](https://modrinth.com/mod/cc-vs) | 🟥 Unsupport
|
||||
|[CC Shops](https://modrinth.com/mod/cc-shops) | 🟥 Unsupport
|
||||
|[SwitchCraft Peripherals](https://www.curseforge.com/minecraft/mc-mods/sc-peripherals) | 🟥 Unsupport
|
||||
|[Plethora Peripherals](https://www.curseforge.com/minecraft/mc-mods/plethora-peripherals) | 🟥 Unsupport
|
||||
|[Some Peripherals](https://modrinth.com/mod/some-peripherals) | 🟥 Unsupport
|
||||
|[SwitchCraft Peripherals](https://www.curseforge.com/minecraft/mc-mods/sc-peripherals) | 🟥 Unsupport (Old version)
|
||||
|[Plethora Peripherals](https://www.curseforge.com/minecraft/mc-mods/plethora-peripherals) | 🟥 Unsupport (Fabric only)
|
||||
|[Some Peripherals](https://modrinth.com/mod/some-peripherals) | 🟥 Unsupport (Fabric only)
|
||||
|
||||
# Some small development video
|
||||
### Library (0/24)
|
||||
| Library | Status |
|
||||
|------------|--------|
|
||||
| [Acidity](https://github.com/9551-Dev/acidity) | 🟥 Unsupport |
|
||||
| [Anavrins' ChaCha20](https://web.archive.org/web/20200924232302/http://www.computercraft.info/forums2/index.php?/topic/25474-chacha20-encryption-in-computercraft/) ([pastebin](https://pastebin.com/GPzf9JSa)) | 🟥 Unsupport |
|
||||
| [Anavrins' MD5](https://pastebin.com/6PVSRckQ) | 🟥 Unsupport |
|
||||
| [Anavrins' SHA-1](https://pastebin.com/SfL7vxP3) | 🟥 Unsupport |
|
||||
| [Anavrins' SHA-256](https://web.archive.org/web/20230211193054/http://www.computercraft.info/forums2/index.php?/topic/8169-sha-256-in-pure-lua/) ([pastebin](https://pastebin.com/gsFrNjbt)) | 🟥 Unsupport |
|
||||
| [AUKit](https://mcjack123.github.io/AUKit/) | 🟥 Unsupport |
|
||||
| [Basalt](https://basalt.madefor.cc/) | 🟥 Unsupport |
|
||||
| [Bigfont](https://pastebin.com/3LfWxRWh) | 🟥 Unsupport |
|
||||
| [C3D](https://c3d.madefor.cc/) | 🟥 Unsupport |
|
||||
| [CC-Archive](https://github.com/MCJack123/CC-Archive) | 🟥 Unsupport |
|
||||
| [dbprotect](https://gist.github.com/MCJack123/4cf6fc941a2d412b4195caafb9636363) | 🟥 Unsupport |
|
||||
| [ecc.lua](https://web.archive.org/web/20190808224502/http://www.computercraft.info/forums2/index.php?/topic/29803-elliptic-curve-cryptography/) ([pastebin](https://pastebin.com/ZGJGBJdg)) | 🟥 Unsupport |
|
||||
| [ecnet](https://github.com/migeyel/ecnet) | 🟥 Unsupport |
|
||||
| [GuiH](https://guih.madefor.cc) | 🟥 Unsupport |
|
||||
| [IsometriH](https://github.com/9551-Dev/IsometriH) | 🟥 Unsupport |
|
||||
| [Luz](https://github.com/MCJack123/Luz) | 🟥 Unsupport |
|
||||
| [Milo](https://github.com/kepler155c/opus-apps/wiki/Milo-(crafting---storage-system)) | 🟥 Unsupport |
|
||||
| [Pine3D](https://github.com/Xella37/Pine3D) | 🟥 Unsupport |
|
||||
| [PngLua](https://github.com/9551-Dev/pngLua) | 🟥 Unsupport |
|
||||
| [Pixelbox Lite](https://github.com/9551-Dev/pixelbox_lite) | 🟥 Unsupport |
|
||||
| [RedRun](https://gist.github.com/MCJack123/473475f07b980d57dd2bd818026c97e8) | 🟥 Unsupport |
|
||||
| [Tamperer](https://github.com/Fatboychummy-CC/Tamperer) | 🟥 Unsupport |
|
||||
| [Tampl](https://github.com/9551-Dev/tampl) | 🟥 Unsupport |
|
||||
| [Telem](https://telem.cc) | 🟥 Unsupport |
|
||||
| [VeriCode](https://gist.github.com/MCJack123/7752c85918bcf23ada028abd615e8750) | 🟥 Unsupport |
|
||||
|
||||
# Some small developer media
|
||||
[](https://wakatime.com/badge/user/0e729f00-081a-41e0-ab17-b9ac6abfc334/project/e9e0d6a6-dfaf-46d0-bb77-e1f7127e7fb4)
|
||||
|
||||
https://github.com/user-attachments/assets/8e9564fc-fc85-4ff6-b23a-357d3ac5f33c
|
||||
|
||||
https://github.com/user-attachments/assets/195231d4-8fd8-4101-8068-70bc038a5c4f
|
||||
|
||||
https://github.com/user-attachments/assets/8f114cfa-d87c-47d0-a670-a13dc975ab06
|
||||
|
||||
# For adapting in other project
|
||||
This project is for every block based IDE from DPSoftware Foundation.
|
||||
|
||||
# License
|
||||
This project is licensed under the [GPL v3 License](https://github.com/DPSoftware-Foundation/ccIDE/blob/main/LICENSE).
|
||||
|
34
remote.lua
34
remote.lua
@ -1,34 +0,0 @@
|
||||
local ws = assert(http.websocket("ws://127.0.0.1:5133"))
|
||||
print("connected to server")
|
||||
|
||||
local id
|
||||
|
||||
while true do
|
||||
print("ready")
|
||||
local message, error = ws.receive()
|
||||
if message then
|
||||
print("Received message:", message)
|
||||
if message == "ping" then
|
||||
ws.send("pong")
|
||||
elseif message == "sendcode" then
|
||||
local file = io.open("main.lua", "w")
|
||||
print("waiting for code")
|
||||
local filedata, error = ws.receive()
|
||||
file:write(filedata)
|
||||
file:close()
|
||||
elseif message == "runcode" then
|
||||
id = multishell.launch({}, "main.lua")
|
||||
multishell.setTitle(id, "Code")
|
||||
multishell.setFocus(id)
|
||||
elseif message == "exit" then
|
||||
print("Exiting...")
|
||||
break
|
||||
end
|
||||
|
||||
else
|
||||
print("WebSocket error:", error)
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
ws.close()
|
2
run.bat
2
run.bat
@ -1,3 +1,5 @@
|
||||
@echo off
|
||||
title Starting ccIDE
|
||||
start "" cmd /c "npm cache clean --force"
|
||||
timeout 2
|
||||
npm run dev
|
@ -1,12 +1,110 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const https = require('https');
|
||||
const unzipper = require('unzipper');
|
||||
const { DOMParser, XMLSerializer } = require('xmldom');
|
||||
|
||||
|
||||
const peripheralsfolder = path.join(__dirname, "../blocks");
|
||||
|
||||
const fallbackImagePath = path.join(__dirname, '..', 'assets', 'noimagefallback.png'); // Path to fallback image
|
||||
|
||||
let registedblock = {}
|
||||
if (!fs.existsSync(peripheralsfolder)) {
|
||||
// If it doesn't exist, create it
|
||||
fs.mkdirSync(peripheralsfolder, { recursive: true });
|
||||
console.log('Block Folder created');
|
||||
}
|
||||
|
||||
let progressBar = document.getElementById('progressBarloading');
|
||||
let blocks_url = "https://cdn.damp11113.xyz/file/zip/ccide/blockslastest.zip?dl=1"
|
||||
|
||||
function isBlocksFolderEmpty() {
|
||||
try {
|
||||
const files = fs.readdirSync(peripheralsfolder);
|
||||
return files.length === 0; // Returns true if the folder is empty
|
||||
} catch (err) {
|
||||
console.error('Error reading folder:', err);
|
||||
return false; // Return false or handle error as needed
|
||||
}
|
||||
}
|
||||
|
||||
async function downloadBlocks() {
|
||||
try {
|
||||
progressBar.style.display = 'inline-block';
|
||||
// Create the output directory if it doesn't exist
|
||||
if (!fs.existsSync(peripheralsfolder)) {
|
||||
fs.mkdirSync(peripheralsfolder, { recursive: true });
|
||||
}
|
||||
|
||||
console.log('Downloading blocks...');
|
||||
|
||||
const zipFilePath = path.join(peripheralsfolder, 'blocks.zip');
|
||||
|
||||
// Download the file as a Promise
|
||||
await new Promise((resolve, reject) => {
|
||||
https.get(blocks_url, (response) => {
|
||||
if (response.statusCode !== 200) {
|
||||
reject(new Error(`Download failed with status code ${response.statusCode}`));
|
||||
return;
|
||||
}
|
||||
|
||||
const totalBytes = parseInt(response.headers['content-length'], 10);
|
||||
let downloadedBytes = 0;
|
||||
|
||||
const file = fs.createWriteStream(zipFilePath);
|
||||
|
||||
response.on('data', (chunk) => {
|
||||
downloadedBytes += chunk.length;
|
||||
const percentCompleted = Math.round((downloadedBytes / totalBytes) * 100);
|
||||
progressBar.value = percentCompleted;
|
||||
progressBar.innerText = percentCompleted + '%'; // Fallback text
|
||||
process.stdout.write(`Download progress: ${percentCompleted}%\r`);
|
||||
});
|
||||
|
||||
response.pipe(file);
|
||||
|
||||
file.on('finish', () => {
|
||||
file.close();
|
||||
console.log('\nFile downloaded successfully.');
|
||||
resolve();
|
||||
});
|
||||
|
||||
file.on('error', (error) => {
|
||||
fs.unlinkSync(zipFilePath);
|
||||
reject(error);
|
||||
});
|
||||
}).on('error', (error) => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
|
||||
console.log('Unzipping file...');
|
||||
|
||||
// Unzip the file as a Promise
|
||||
await new Promise((resolve, reject) => {
|
||||
fs.createReadStream(zipFilePath)
|
||||
.pipe(unzipper.Extract({ path: peripheralsfolder }))
|
||||
.on('close', () => {
|
||||
console.log('File unzipped successfully.');
|
||||
fs.unlinkSync(zipFilePath); // Delete the zip file after extraction
|
||||
console.log('Zip file deleted.');
|
||||
|
||||
console.log('Downloaded blocks');
|
||||
progressBar.style.display = 'none';
|
||||
resolve();
|
||||
})
|
||||
.on('error', (error) => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error downloading or unzipping file:', error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const defineicon = {
|
||||
computer: {
|
||||
@ -42,21 +140,26 @@ function mergeXml(xml1, xml2) {
|
||||
return mergedXml;
|
||||
}
|
||||
|
||||
function loadperipheral(workspace, currenttoolbar, peripherals) {
|
||||
const filePath = path.join(peripheralsfolder, peripherals);
|
||||
const jsonfilePath = path.join(filePath, "block_design.json");
|
||||
const xmlfilePath = path.join(filePath, "toolbox.xml");
|
||||
const generatorfilePath = path.join(filePath, "generator.js"); // Path to generator.js
|
||||
|
||||
// Load generator.js
|
||||
// Load blocks from block_design.json
|
||||
fs.readFile(jsonfilePath, 'utf-8', (err, data) => {
|
||||
if (err) {
|
||||
console.error('Error loading JSON file:', err);
|
||||
return;
|
||||
}
|
||||
function loadperipheral(workspace, currenttoolbar, peripherals, usedlibinproject) {
|
||||
if (!usedlibinproject.includes(peripherals)) {
|
||||
try {
|
||||
const blocksJson = JSON.parse(data);
|
||||
console.log(`Importing ${peripherals} blocks`);
|
||||
|
||||
const filePath = path.join(peripheralsfolder, peripherals);
|
||||
const jsonfilePath = path.join(filePath, "block_design.json");
|
||||
const xmlfilePath = path.join(filePath, "toolbox.xml");
|
||||
const generatorfilePath = path.join(filePath, "generator.js");
|
||||
const indexfilePath = path.join(filePath, "index.json");
|
||||
|
||||
// Synchronously read and parse the index.json file
|
||||
const indexcontent = JSON.parse(fs.readFileSync(indexfilePath, 'utf8'));
|
||||
const dependencies = indexcontent.dependencies;
|
||||
dependencies.forEach((dependency) => {
|
||||
currenttoolbar = loadperipheral(workspace, currenttoolbar, dependency, usedlibinproject);
|
||||
});
|
||||
|
||||
// Synchronously load and parse block_design.json
|
||||
const blocksJson = JSON.parse(fs.readFileSync(jsonfilePath, 'utf8'));
|
||||
for (const blockId in blocksJson) {
|
||||
if (blocksJson.hasOwnProperty(blockId)) {
|
||||
Blockly.Blocks[blockId] = {
|
||||
@ -66,27 +169,28 @@ function loadperipheral(workspace, currenttoolbar, peripherals) {
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Synchronously load and merge new toolbox XML
|
||||
const toolbar = fs.readFileSync(xmlfilePath, 'utf8');
|
||||
const newxml = mergeXml(currenttoolbar, toolbar);
|
||||
workspace.updateToolbox(newxml);
|
||||
|
||||
fireNotify(`Loaded ${peripherals}`, "success")
|
||||
|
||||
// Synchronously require generator.js
|
||||
require(generatorfilePath); // This will execute generator.js if it's a Node.js module
|
||||
|
||||
console.log(`Loaded ${peripherals} blocks`);
|
||||
usedlibinproject.push(peripherals);
|
||||
|
||||
return newxml;
|
||||
} catch (e) {
|
||||
document.getElementById('statusMessage').textContent = 'Error parsing JSON file: ' + e;
|
||||
return;
|
||||
fireNotify(`Can't Import ${peripherals}: ${e}`, "error")
|
||||
ipc.send("error", `Can't Import ${peripherals}: ${e}`);
|
||||
}
|
||||
});
|
||||
|
||||
// Load and merge new toolbox XML
|
||||
const toolbar = fs.readFileSync(xmlfilePath, 'utf8');
|
||||
const newxml = mergeXml(currenttoolbar, toolbar);
|
||||
|
||||
workspace.updateToolbox(newxml);
|
||||
|
||||
document.getElementById('statusMessage').textContent = `Loaded ${peripherals}`;
|
||||
|
||||
try {
|
||||
require(generatorfilePath); // This will execute generator.js if it's a Node.js module
|
||||
} catch (error) {
|
||||
console.error('Error loading generator.js:', error);
|
||||
} else {
|
||||
return currenttoolbar;
|
||||
}
|
||||
|
||||
return newxml;
|
||||
}
|
||||
|
||||
function extractFolderName(path) {
|
||||
@ -115,12 +219,11 @@ function addimageiconinfo(div, src, tiptool) {
|
||||
img.setAttribute('data-bs-placement', "bottom");
|
||||
img.setAttribute('data-bs-title', tiptool);
|
||||
div.appendChild(img);
|
||||
console.log(`added image ${img}`);
|
||||
console.log(`added image ${src}`);
|
||||
}
|
||||
|
||||
function scanindex() {
|
||||
let foundedpackages = 0;
|
||||
document.getElementById('statusMessage').textContent = "Scanning Packages...";
|
||||
// clear all item in libcontainer
|
||||
document.getElementById('libcontainer').innerHTML = "";
|
||||
|
||||
@ -142,77 +245,83 @@ function scanindex() {
|
||||
const jsonData = JSON.parse(content);
|
||||
|
||||
blockfoldername = extractFolderName(filePath);
|
||||
registedblock[blockfoldername] = jsonData;
|
||||
foundedpackages++;
|
||||
if (!blockfoldername.startsWith("_")) {
|
||||
foundedpackages++;
|
||||
|
||||
// create item in list
|
||||
const imagePath = path.join(filePath, "icon.png");
|
||||
// create item in list
|
||||
const imagePath = path.join(filePath, "icon.png");
|
||||
|
||||
const libraryItem = document.createElement('div');
|
||||
libraryItem.classList.add('library-item', 'overflow-auto', 'library-container');
|
||||
libraryItem.setAttribute('data-libraryfolder', blockfoldername);
|
||||
const libraryItem = document.createElement('div');
|
||||
libraryItem.classList.add('library-item', 'overflow-auto', 'library-container');
|
||||
libraryItem.setAttribute('data-libraryfolder', blockfoldername);
|
||||
|
||||
// add image
|
||||
const img = document.createElement('img');
|
||||
img.classList.add('libimage');
|
||||
if (fileExists(imagePath)) {
|
||||
img.src = imagePath;
|
||||
} else {
|
||||
img.src = fallbackImagePath;
|
||||
}
|
||||
libraryItem.appendChild(img);
|
||||
// add image
|
||||
const img = document.createElement('img');
|
||||
img.classList.add('libimage');
|
||||
if (fileExists(imagePath)) {
|
||||
img.src = imagePath;
|
||||
} else {
|
||||
img.src = fallbackImagePath;
|
||||
}
|
||||
libraryItem.appendChild(img);
|
||||
|
||||
// Create the library details container
|
||||
const libraryDetails = document.createElement('div');
|
||||
libraryDetails.classList.add('library-details');
|
||||
|
||||
// Create the title element
|
||||
const title = document.createElement('h3');
|
||||
title.textContent = jsonData.name + ` [v${jsonData.version} by ${jsonData.author}]`;
|
||||
libraryDetails.appendChild(title);
|
||||
// Create the library details container
|
||||
const libraryDetails = document.createElement('div');
|
||||
libraryDetails.classList.add('library-details');
|
||||
|
||||
// Create the title element
|
||||
const title = document.createElement('h3');
|
||||
title.textContent = jsonData.name;
|
||||
libraryDetails.appendChild(title);
|
||||
|
||||
// Create the description element
|
||||
const description = document.createElement('p');
|
||||
description.innerHTML = jsonData.description;
|
||||
libraryDetails.appendChild(description);
|
||||
// Create the credit and version element
|
||||
const cv = document.createElement('p');
|
||||
cv.classList.add('library-details-cv');
|
||||
cv.textContent = `v${jsonData.version} by ${jsonData.author}`;
|
||||
libraryDetails.appendChild(cv);
|
||||
|
||||
console.log(jsonData)
|
||||
if (jsonData.design_for_computer.basic) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.basic, "Basic Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.adv) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.adv, "Advanced Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.command) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.command, "Command Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.pocket) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.pocket, "Pocket Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.advpocket) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.advpocket, "Advanced Pocket Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.turtle) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.turtle, "Turtle Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.advturtle) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.advturtle, "Advanced Turtle Supported");
|
||||
}
|
||||
// Create the description element
|
||||
const description = document.createElement('p');
|
||||
description.innerHTML = jsonData.description;
|
||||
libraryDetails.appendChild(description);
|
||||
|
||||
// check computer type support
|
||||
if (jsonData.peripherals) {
|
||||
addimageiconinfo(libraryDetails, defineicon.peripheral, "Peripheral");
|
||||
}
|
||||
if (jsonData.library) {
|
||||
addimageiconinfo(libraryDetails, defineicon.library, "Library");
|
||||
}
|
||||
if (jsonData.require_network) {
|
||||
addimageiconinfo(libraryDetails, defineicon.networkreq, "Require Network");
|
||||
}
|
||||
if (jsonData.design_for_computer.basic) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.basic, "Basic Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.adv) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.adv, "Advanced Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.command) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.command, "Command Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.pocket) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.pocket, "Pocket Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.advpocket) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.advpocket, "Advanced Pocket Computer Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.turtle) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.turtle, "Turtle Supported");
|
||||
}
|
||||
if (jsonData.design_for_computer.advturtle) {
|
||||
addimageiconinfo(libraryDetails, defineicon.computer.advturtle, "Advanced Turtle Supported");
|
||||
}
|
||||
|
||||
libraryItem.appendChild(libraryDetails);
|
||||
document.getElementById('libcontainer').appendChild(libraryItem);
|
||||
console.log(`registered ${blockfoldername} blocks and added to packages managers`)
|
||||
// check computer type support
|
||||
if (jsonData.peripherals) {
|
||||
addimageiconinfo(libraryDetails, defineicon.peripheral, "Peripheral");
|
||||
}
|
||||
if (jsonData.library) {
|
||||
addimageiconinfo(libraryDetails, defineicon.library, "Library");
|
||||
}
|
||||
if (jsonData.require_network) {
|
||||
addimageiconinfo(libraryDetails, defineicon.networkreq, "Require Network");
|
||||
}
|
||||
|
||||
libraryItem.appendChild(libraryDetails);
|
||||
document.getElementById('libcontainer').appendChild(libraryItem);
|
||||
console.log(`Registered ${blockfoldername} blocks and added to packages managers`)
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
@ -225,14 +334,12 @@ function scanindex() {
|
||||
});
|
||||
});
|
||||
|
||||
document.getElementById('statusMessage').textContent = `Founded ${foundedpackages} Packages`;
|
||||
setTimeout(() => {
|
||||
document.getElementById('statusMessage').textContent = `Ready`;
|
||||
}, 1000);
|
||||
fireNotify(`Founded ${foundedpackages} Packages`, "success")
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
loadperipheral,
|
||||
scanindex
|
||||
scanindex,
|
||||
isBlocksFolderEmpty,
|
||||
downloadBlocks
|
||||
}
|
262
src/ccRemote.js
262
src/ccRemote.js
@ -7,61 +7,259 @@ class CCRemote {
|
||||
host: ip
|
||||
});
|
||||
|
||||
console.log("Server is started");
|
||||
this.clients = new Map(); // Map to track client data (numeric IDs)
|
||||
this.clientIdCounter = 0; // Counter for numeric client IDs
|
||||
|
||||
console.log("Remote server is started");
|
||||
fireNotify(
|
||||
"Remote server started, waiting for clients to connect...",
|
||||
"info"
|
||||
);
|
||||
|
||||
this.socket.on('connection', (ws) => {
|
||||
console.log('WebSocket connection established.');
|
||||
const clientId = this.clientIdCounter++;
|
||||
this.clients.set(clientId, { ws, isAlive: true, name: `Client-${clientId}`, clientInfo: null });
|
||||
|
||||
if (this.clients.size >= 0) {
|
||||
document.getElementById("navbar-button-computer-disconnect").disabled = false;
|
||||
document.getElementById("navbar-button-computer-run").disabled = false;
|
||||
}
|
||||
|
||||
console.log(`Client ${clientId} connected.`);
|
||||
fireNotify(`Client ${clientId} connected`, "success");
|
||||
|
||||
// Send "info" command to the client immediately upon connection
|
||||
this.sendCommandToClient(clientId, 'info', true);
|
||||
|
||||
ws.on('pong', () => {
|
||||
this.clients.get(clientId).isAlive = true;
|
||||
});
|
||||
|
||||
ws.on('message', (message) => {
|
||||
console.log(`Received message => ${message}`);
|
||||
console.log(`Message from Client ${clientId}: ${message}`);
|
||||
// Handle info response
|
||||
try {
|
||||
const data = JSON.parse(message);
|
||||
|
||||
if (data.OSVersion && typeof data.OSVersion === 'string' &&
|
||||
data.Name && typeof data.Name === 'string' &&
|
||||
typeof data.ID === 'number' &&
|
||||
typeof data.uptime === 'number' &&
|
||||
typeof data.Type === 'number') {
|
||||
|
||||
// Update clientInfo with the received data
|
||||
this.clients.get(clientId).clientInfo = data;
|
||||
console.log(`Client ${clientId} info updated:`, data);
|
||||
} else {
|
||||
console.log(`Invalid data format from Client ${clientId}:`, data);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error parsing message from Client ${clientId}:`, error);
|
||||
}
|
||||
});
|
||||
|
||||
ws.on('close', () => {
|
||||
console.log(`Client ${clientId} disconnected.`);
|
||||
this.clients.delete(clientId);
|
||||
fireNotify(`Client ${clientId} disconnected`, "warning");
|
||||
|
||||
if (this.clients.size === 0) {
|
||||
document.getElementById("navbar-button-computer-disconnect").disabled = true;
|
||||
document.getElementById("navbar-button-computer-run").disabled = true;
|
||||
}
|
||||
});
|
||||
|
||||
ws.on('error', (error) => {
|
||||
console.error(`Client ${clientId} error:`, error);
|
||||
fireNotify(`Error with Client ${clientId}: ${error.message}`, "error");
|
||||
});
|
||||
});
|
||||
|
||||
// Ping clients every 30 seconds to check if they are alive
|
||||
const interval = setInterval(() => {
|
||||
for (const [clientId, clientData] of this.clients.entries()) {
|
||||
if (clientData.isAlive === false) {
|
||||
console.log(`Client ${clientId} did not respond to ping, terminating connection.`);
|
||||
fireNotify(`Client ${clientId} did not respond to ping, disconnected`, "warning");
|
||||
clientData.ws.terminate();
|
||||
this.clients.delete(clientId);
|
||||
continue;
|
||||
}
|
||||
|
||||
clientData.isAlive = false;
|
||||
clientData.ws.ping();
|
||||
}
|
||||
}, 30000);
|
||||
|
||||
this.socket.on('close', () => {
|
||||
console.log('WebSocket connection closed.');
|
||||
clearInterval(interval);
|
||||
console.log('WebSocket server closed.');
|
||||
fireNotify("WebSocket server closed.", "info");
|
||||
});
|
||||
|
||||
this.socket.on('error', (error) => {
|
||||
console.error('WebSocket error:', error);
|
||||
console.error('WebSocket server error:', error);
|
||||
fireNotify(`WebSocket server error: ${error.message}`, "error");
|
||||
});
|
||||
}
|
||||
|
||||
sendCommand(command) {
|
||||
// Iterate over each connected client and send the command
|
||||
this.socket.clients.forEach((client) => {
|
||||
if (client.readyState === WebSocket.OPEN) {
|
||||
client.send(command);
|
||||
// List all connected clients with their IDs, names, and clientInfo
|
||||
// List all connected clients with their IDs, names, and clientInfo
|
||||
async listClients() {
|
||||
const clientList = [];
|
||||
|
||||
// Create an array of promises for fetching client info
|
||||
const infoPromises = [];
|
||||
|
||||
// Loop over each client and trigger 'info' command to get the latest information
|
||||
for (const [clientId, clientData] of this.clients.entries()) {
|
||||
if (clientData.ws.readyState === WebSocket.OPEN) {
|
||||
const infoPromise = new Promise((resolve) => {
|
||||
// Set a timeout to handle cases where no response is received
|
||||
const timeout = setTimeout(() => {
|
||||
resolve({ id: clientId, name: clientData.name, info: null });
|
||||
}, 5000); // Wait 5 seconds for a response
|
||||
|
||||
// Listen for the response from the client
|
||||
const messageHandler = (message) => {
|
||||
try {
|
||||
const data = JSON.parse(message);
|
||||
if (data.OSVersion && typeof data.OSVersion === 'string' &&
|
||||
data.Name && typeof data.Name === 'string' &&
|
||||
typeof data.ID === 'number' &&
|
||||
typeof data.uptime === 'number' &&
|
||||
typeof data.Type === 'number') {
|
||||
|
||||
// Resolve with the valid data
|
||||
resolve({ id: clientId, name: clientData.name, info: data });
|
||||
} else {
|
||||
resolve({ id: clientId, name: clientData.name, info: null });
|
||||
}
|
||||
} catch (error) {
|
||||
resolve({ id: clientId, name: clientData.name, info: null });
|
||||
}
|
||||
};
|
||||
|
||||
// Send the "info" command to the client
|
||||
this.sendCommandToClient(clientId, 'info', true);
|
||||
|
||||
// Attach the handler for this specific client
|
||||
clientData.ws.on('message', messageHandler);
|
||||
});
|
||||
|
||||
// Add the promise to the array
|
||||
infoPromises.push(infoPromise);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Wait for all promises to resolve (all client info to be updated)
|
||||
const resolvedClientInfo = await Promise.all(infoPromises);
|
||||
|
||||
// Construct the final list of clients with updated information
|
||||
for (const clientInfo of resolvedClientInfo) {
|
||||
clientList.push(clientInfo);
|
||||
}
|
||||
|
||||
return clientList;
|
||||
}
|
||||
|
||||
sendCode(Code) {
|
||||
// Iterate over each connected client and send the command
|
||||
this.socket.clients.forEach((client) => {
|
||||
if (client.readyState === WebSocket.OPEN) {
|
||||
client.send("sendcode");
|
||||
// Check if any client is connected
|
||||
isClientConnect() {
|
||||
return this.clients.size > 0;
|
||||
}
|
||||
|
||||
// Send code to all clients
|
||||
sendCode(code) {
|
||||
this.clients.forEach((clientData, clientId) => {
|
||||
if (clientData.ws.readyState === WebSocket.OPEN) {
|
||||
clientData.ws.send("sendcode");
|
||||
setTimeout(() => {
|
||||
console.log(Code)
|
||||
client.send(Code);
|
||||
return true
|
||||
clientData.ws.send(code);
|
||||
}, 500);
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
});
|
||||
}
|
||||
runCode() {
|
||||
// Iterate over each connected client and send the command
|
||||
this.socket.clients.forEach((client) => {
|
||||
if (client.readyState === WebSocket.OPEN) {
|
||||
client.send("runcode");
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Send code to a specific client
|
||||
sendCodeToClient(clientId, code) {
|
||||
const client = this.clients.get(clientId);
|
||||
if (!client || client.ws.readyState !== WebSocket.OPEN) {
|
||||
console.error(`Client ${clientId} is not available or not connected.`);
|
||||
fireNotify(`Client ${clientId} is not connected.`, "error");
|
||||
return;
|
||||
}
|
||||
|
||||
client.ws.send("sendcode");
|
||||
setTimeout(() => {
|
||||
client.ws.send(code);
|
||||
}, 500);
|
||||
}
|
||||
|
||||
// Run code on all clients
|
||||
runCode() {
|
||||
this.clients.forEach((clientData, clientId) => {
|
||||
if (clientData.ws.readyState === WebSocket.OPEN) {
|
||||
clientData.ws.send("runcode");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Run code on a specific client
|
||||
runCodeOnClient(clientId) {
|
||||
const client = this.clients.get(clientId);
|
||||
if (!client || client.ws.readyState !== WebSocket.OPEN) {
|
||||
console.error(`Client ${clientId} is not available or not connected.`);
|
||||
fireNotify(`Client ${clientId} is not connected.`, "error");
|
||||
return;
|
||||
}
|
||||
|
||||
client.ws.send("runcode");
|
||||
}
|
||||
|
||||
// Disconnect all clients
|
||||
disconnectAllClients() {
|
||||
this.clients.forEach((clientData, clientId) => {
|
||||
if (clientData.ws.readyState === WebSocket.OPEN) {
|
||||
clientData.ws.send("exit");
|
||||
clientData.ws.close();
|
||||
fireNotify(`Client ${clientId} disconnected`, "warning");
|
||||
}
|
||||
});
|
||||
this.clients.clear();
|
||||
}
|
||||
|
||||
// Send a command to a specific client
|
||||
sendCommandToClient(clientId, command, expectResponse = false) {
|
||||
const client = this.clients.get(clientId);
|
||||
if (!client || client.ws.readyState !== WebSocket.OPEN) {
|
||||
console.error(`Client ${clientId} is not available or not connected.`);
|
||||
fireNotify(`Client ${clientId} is not connected.`, "error");
|
||||
return;
|
||||
}
|
||||
|
||||
client.ws.send(command);
|
||||
|
||||
if (expectResponse) {
|
||||
client.ws.on('message', (response) => {
|
||||
console.log(`Response from Client ${clientId}: ${response}`);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Send a command to all clients
|
||||
sendCommandToAll(command, expectResponse = false) {
|
||||
for (const [clientId, clientData] of this.clients.entries()) {
|
||||
if (clientData.ws.readyState === WebSocket.OPEN) {
|
||||
clientData.ws.send(command);
|
||||
|
||||
if (expectResponse) {
|
||||
clientData.ws.on('message', (response) => {
|
||||
console.log(`Response from Client ${clientId}: ${response}`);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { CCRemote };
|
||||
|
137
src/codegen.js
137
src/codegen.js
@ -1,10 +1,7 @@
|
||||
function delay(time) {
|
||||
return new Promise(resolve => setTimeout(resolve, time));
|
||||
}
|
||||
|
||||
const { luaGenerator } = require('blockly/lua'); // Use require syntax for Blockly module
|
||||
const { CCRemote } = require("./ccRemote")
|
||||
|
||||
console.log("Starting remote server...")
|
||||
const ccInstance = new CCRemote('127.0.0.1', 5133);
|
||||
|
||||
const progress = document.getElementById("progress");
|
||||
@ -12,6 +9,16 @@ const circles = document.querySelectorAll(".circle");
|
||||
let upcurrentActive = 1;
|
||||
let uploadError = false; // Flag to track if there's an error
|
||||
|
||||
const defineicon = {
|
||||
5: path.join(__dirname, '..', 'assets', 'basic_computer.png'),
|
||||
6: path.join(__dirname, '..', 'assets', 'adv_computer.png'),
|
||||
7: path.join(__dirname, '..', 'assets', 'command_computer.png'),
|
||||
2: path.join(__dirname, '..', 'assets', 'pocket_computer.png'),
|
||||
4: path.join(__dirname, '..', 'assets', 'adv_pocket_computer.png'),
|
||||
1: path.join(__dirname, '..', 'assets', 'turtle.png'),
|
||||
3: path.join(__dirname, '..', 'assets', 'adv_turtle.png')
|
||||
}
|
||||
|
||||
const uploadUpdateProgress = () => {
|
||||
circles.forEach((circle, index) => {
|
||||
if (index < upcurrentActive) {
|
||||
@ -37,46 +44,136 @@ const uploadUpdateProgress = () => {
|
||||
};
|
||||
|
||||
function clientexit() {
|
||||
ccInstance.sendCommand("exit")
|
||||
ccInstance.disconnectAllClients();
|
||||
}
|
||||
|
||||
function gencodeonly() {
|
||||
return luaGenerator.workspaceToCode(workspace);
|
||||
}
|
||||
|
||||
let selectedClientId = null;
|
||||
|
||||
async function gencode() {
|
||||
console.log("Starting generate code")
|
||||
document.getElementById('upload-popup').style.display = 'block';
|
||||
upcurrentActive = 1;
|
||||
uploadError = false;
|
||||
uploadUpdateProgress();
|
||||
// compile/convert code
|
||||
|
||||
|
||||
// Compile/convert code
|
||||
console.log("Generating code...");
|
||||
upcurrentActive++;
|
||||
uploadUpdateProgress();
|
||||
document.getElementById('upload-status').textContent = "Generating code";
|
||||
let code = null;
|
||||
try {
|
||||
code = luaGenerator.workspaceToCode(workspace);
|
||||
console.log(code);
|
||||
} catch (e) {
|
||||
uploadError = true;
|
||||
uploadUpdateProgress();
|
||||
document.getElementById('upload-status').textContent = e;
|
||||
return
|
||||
return;
|
||||
}
|
||||
|
||||
// upload to computercraft with remote
|
||||
document.getElementById('upload-status').textContent = "Uploading code to machine";
|
||||
upcurrentActive++;
|
||||
uploadUpdateProgress();
|
||||
ccInstance.sendCode(code);
|
||||
await delay(500)
|
||||
|
||||
if (ccInstance.isClientConnect()) {
|
||||
const clients = await ccInstance.listClients();
|
||||
document.getElementById('upload-status').innerHTML = "";
|
||||
|
||||
// execute with remote
|
||||
document.getElementById('upload-status').textContent = "Executing code";
|
||||
upcurrentActive++;
|
||||
uploadUpdateProgress();
|
||||
ccInstance.runCode();
|
||||
const ClientLists = document.createElement('div');
|
||||
ClientLists.classList.add("library-content");
|
||||
|
||||
// done!
|
||||
clients.forEach(client => {
|
||||
console.log(`Info:`, client.info);
|
||||
|
||||
const ClientItem = document.createElement('div');
|
||||
ClientItem.classList.add('library-item', 'overflow-auto', 'library-container');
|
||||
ClientItem.setAttribute('data-clientid', client.id);
|
||||
|
||||
const img = document.createElement('img');
|
||||
img.classList.add('libimage');
|
||||
img.src = defineicon[client.info.Type];
|
||||
ClientItem.appendChild(img);
|
||||
|
||||
const ClientDetails = document.createElement('div');
|
||||
ClientDetails.classList.add('library-details');
|
||||
|
||||
const title = document.createElement('h3');
|
||||
title.textContent = client.info.Name;
|
||||
ClientDetails.appendChild(title);
|
||||
|
||||
const description = document.createElement('p');
|
||||
description.innerHTML = `OS: ${client.info.OSVersion} | ID: ${client.info.ID} | Uptime: ${client.info.uptime}s`;
|
||||
ClientDetails.appendChild(description);
|
||||
|
||||
ClientItem.appendChild(ClientDetails);
|
||||
|
||||
// Add event listener for user selection
|
||||
ClientItem.addEventListener('click', () => {
|
||||
selectedClientId = client.id; // Correctly store the client ID
|
||||
ClientItem.classList.add('selected'); // Optional: Style selected item
|
||||
});
|
||||
|
||||
ClientLists.appendChild(ClientItem);
|
||||
});
|
||||
|
||||
const title = document.createElement("h3");
|
||||
title.textContent = "Upload to machine";
|
||||
document.getElementById('upload-status').appendChild(title);
|
||||
|
||||
document.getElementById('upload-status').appendChild(ClientLists);
|
||||
|
||||
// Wait for user selection
|
||||
const waitForSelection = () => new Promise((resolve, reject) => {
|
||||
const checkSelection = setInterval(() => {
|
||||
if (selectedClientId !== null) {
|
||||
clearInterval(checkSelection);
|
||||
resolve(selectedClientId);
|
||||
}
|
||||
}, 100); // Check every 100ms if a client is selected
|
||||
});
|
||||
|
||||
// Wait until the user selects a client
|
||||
try {
|
||||
const selectedClientId = await waitForSelection();
|
||||
console.log(`Selected client: ${selectedClientId}`);
|
||||
|
||||
document.getElementById('upload-status').innerHTML = "";
|
||||
|
||||
// Now proceed with uploading code to the selected client
|
||||
console.log("Uploading code to machine...");
|
||||
document.getElementById('upload-status').textContent = "Uploading code to machine";
|
||||
ccInstance.sendCodeToClient(selectedClientId, code);
|
||||
await delay(500);
|
||||
|
||||
// Execute with remote
|
||||
console.log("Executing code in machine...");
|
||||
document.getElementById('upload-status').textContent = "Executing code";
|
||||
upcurrentActive++;
|
||||
uploadUpdateProgress();
|
||||
ccInstance.runCodeOnClient(selectedClientId);
|
||||
} catch (error) {
|
||||
console.error("Error waiting for selection:", error);
|
||||
uploadError = true;
|
||||
uploadUpdateProgress();
|
||||
document.getElementById('upload-status').innerHTML = `Error selecting client.`;
|
||||
}
|
||||
} else {
|
||||
console.log("Machine is not connected");
|
||||
uploadError = true;
|
||||
uploadUpdateProgress();
|
||||
document.getElementById('upload-status').innerHTML = `Please Connect Computer to IDE.\nInstruction: <a href="https://github.com/DPSoftware-Foundation/ccIDE#install-remote-code-into-computercraft">Install Remote code into computercraft</a> in github.`;
|
||||
return;
|
||||
}
|
||||
|
||||
// Done!
|
||||
console.log("Run code done!");
|
||||
document.getElementById('upload-status').textContent = "Done!";
|
||||
await delay(1000)
|
||||
await delay(1000);
|
||||
document.getElementById('upload-popup').style.animation = 'fadeOut 0.3s ease'; // Apply fade-out animation
|
||||
selectedClientId = null;
|
||||
setTimeout(function() {
|
||||
document.getElementById('upload-popup').style.display = 'none'; // Hide popup after animation completes
|
||||
document.getElementById('upload-popup').style.animation = ''; // Reset animation property
|
||||
|
254
src/index.html
254
src/index.html
@ -3,140 +3,154 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>ccIDE</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;700&display=swap" rel="stylesheet">
|
||||
<script>
|
||||
const bootstrap = require('bootstrap')
|
||||
const {shell} = require('electron');
|
||||
</script>
|
||||
<!-- <meta charset="utf-8" http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-m0mwdxEgv9nMDDw3gHrhX/xCs/OAiZg5/bQ/6X5SIcA='"/> -->
|
||||
<div class="loading-area">
|
||||
<div id="loadingContent">
|
||||
<div class="loader"></div>
|
||||
<br>
|
||||
<h3>Please wait...</h3>
|
||||
<h5 id="loadingstatus"></h5>
|
||||
<progress id="progressBarloading" value="0" max="100"></progress>
|
||||
|
||||
|
||||
<div class="dpclogoload">
|
||||
<img src="../assets/DPSoftware2.png" style="width: 25%;"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<link rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="../node_modules/toastify-js/src/toastify.css">
|
||||
<link rel="stylesheet" type="text/css" href="styles.css" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation bar -->
|
||||
<nav id="navbar">
|
||||
<button class="navbar-button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Computer Types" style="background-color: #0087bd;">
|
||||
<svg viewBox="0 0 24 24"><path d="M6 4h12v1h3v2h-3v2h3v2h-3v2h3v2h-3v2h3v2h-3v1H6v-1H3v-2h3v-2H3v-2h3v-2H3V9h3V7H3V5h3V4m5 11v3h1v-3h-1m2 0v3h1v-3h-1m2 0v3h1v-3h-1z" /></svg>
|
||||
</button>
|
||||
<button class="navbar-button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Packages Managers" style="background-color: #0087bd;" onclick="openlibraryselect()">
|
||||
<svg viewBox="0 0 24 24"><path d="M21 16.5c0 .38-.21.71-.53.88l-7.9 4.44c-.16.12-.36.18-.57.18-.21 0-.41-.06-.57-.18l-7.9-4.44A.991.991 0 0 1 3 16.5v-9c0-.38.21-.71.53-.88l7.9-4.44c.16-.12.36-.18.57-.18.21 0 .41.06.57.18l7.9 4.44c.32.17.53.5.53.88v9M12 4.15l-1.89 1.07L16 8.61l1.96-1.11L12 4.15M6.04 7.5 12 10.85l1.96-1.1-5.88-3.4L6.04 7.5M5 15.91l6 3.38v-6.71L5 9.21v6.7m14 0v-6.7l-6 3.37v6.71l6-3.38z" /></svg>
|
||||
</button>
|
||||
<button class="navbar-button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Preview code" style="background-color: #0087bd; margin-left: auto; position: absolute; right: 115px;" onclick="clientexit()">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0 8a5 5 0 0 1-5-5 5 5 0 0 1 5-5 5 5 0 0 1 5 5 5 5 0 0 1-5 5m0-12.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5z" /></svg>
|
||||
</button>
|
||||
<button class="navbar-button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Disconnect Client" style="background-color: #bd0000; margin-left: auto; position: absolute; right: 65px;" onclick="clientexit()">
|
||||
<svg viewBox="0 0 24 24"><path d="M19 3H5c-1.11 0-2 .89-2 2v4h2V5h14v14H5v-4H3v4a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m-8.92 12.58L11.5 17l5-5-5-5-1.42 1.41L12.67 11H3v2h9.67l-2.59 2.58z" /></svg>
|
||||
</button>
|
||||
<button class="navbar-button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Run" style="background-color: #10bd00; margin-left: auto;" onclick="gencode()">
|
||||
<svg viewBox="0 0 24 24"><path d="M8 5.14v14l11-7-11-7z" /></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
<div class="content-area">
|
||||
<!-- Navigation bar -->
|
||||
<nav id="navbar">
|
||||
<!--
|
||||
<button class="navbar-button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Computer Types" style="background-color: #0087bd;">
|
||||
<svg viewBox="0 0 24 24"><path d="M6 4h12v1h3v2h-3v2h3v2h-3v2h3v2h-3v2h3v2h-3v1H6v-1H3v-2h3v-2H3v-2h3v-2H3V9h3V7H3V5h3V4m5 11v3h1v-3h-1m2 0v3h1v-3h-1m2 0v3h1v-3h-1z" /></svg>
|
||||
</button>
|
||||
-->
|
||||
<button class="navbar-button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Packages Managers" style="background-color: #0087bd;" onclick="openlibraryselect()">
|
||||
<svg viewBox="0 0 24 24"><path d="M21 16.5c0 .38-.21.71-.53.88l-7.9 4.44c-.16.12-.36.18-.57.18-.21 0-.41-.06-.57-.18l-7.9-4.44A.991.991 0 0 1 3 16.5v-9c0-.38.21-.71.53-.88l7.9-4.44c.16-.12.36-.18.57-.18.21 0 .41.06.57.18l7.9 4.44c.32.17.53.5.53.88v9M12 4.15l-1.89 1.07L16 8.61l1.96-1.11L12 4.15M6.04 7.5 12 10.85l1.96-1.1-5.88-3.4L6.04 7.5M5 15.91l6 3.38v-6.71L5 9.21v6.7m14 0v-6.7l-6 3.37v6.71l6-3.38z" /></svg>
|
||||
</button>
|
||||
<!--
|
||||
<button class="navbar-button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Preview code" style="background-color: #0087bd; margin-left: auto; position: absolute; right: 115px;">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0 8a5 5 0 0 1-5-5 5 5 0 0 1 5-5 5 5 0 0 1 5 5 5 5 0 0 1-5 5m0-12.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5z" /></svg>
|
||||
</button>
|
||||
-->
|
||||
<button class="navbar-button" id="navbar-button-computer-disconnect" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Disconnect Client" style="background-color: #bd0000; margin-left: auto; position: absolute; right: 65px;" onclick="clientexit()" disabled>
|
||||
<svg viewBox="0 0 24 24"><path d="M19 3H5c-1.11 0-2 .89-2 2v4h2V5h14v14H5v-4H3v4a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m-8.92 12.58L11.5 17l5-5-5-5-1.42 1.41L12.67 11H3v2h9.67l-2.59 2.58z" /></svg>
|
||||
</button>
|
||||
<button class="navbar-button" id="navbar-button-computer-run" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Run" style="background-color: #10bd00; margin-left: auto;" onclick="gencode()" disabled>
|
||||
<svg viewBox="0 0 24 24"><path d="M8 5.14v14l11-7-11-7z" /></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
<!-- Blockly workspace container -->
|
||||
<section id="blocklyContainer">
|
||||
<div id="blocklyDiv"></div>
|
||||
</section>
|
||||
<!-- Blockly workspace container -->
|
||||
<section id="blocklyContainer">
|
||||
<div id="blocklyDiv"></div>
|
||||
</section>
|
||||
|
||||
<!-- Status bar -->
|
||||
<div id="statusBar">
|
||||
<p id="statusMessage">Initializing...</p>
|
||||
</div>
|
||||
|
||||
<div class="popup" id="upload-popup">
|
||||
<div class="popup-content">
|
||||
<button type="button" class="btn-close float-end" aria-label="Close" id="uploadCloseBtn"></button>
|
||||
<div class="upload-progress-container" style="text-align: center;">
|
||||
<div class="progress-container">
|
||||
<div class="progress" id="progress"></div>
|
||||
<div class="circle active">
|
||||
<svg viewBox="0 0 24 24"><path d="M8 3a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2H3v2h1a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h2v-2H8v-5a2 2 0 0 0-2-2 2 2 0 0 0 2-2V5h2V3m6 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2z" /></svg>
|
||||
</div>
|
||||
<div class="circle">
|
||||
<svg viewBox="0 0 24 24"><path d="m5.5 4.14-1 1.72L15 12 4.5 18.14l1 1.72L19 12 5.5 4.14z" /></svg>
|
||||
</div>
|
||||
<div class="circle">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16v-6H5l7-7 7 7h-4v6H9m-4 4v-2h14v2H5z" /></svg>
|
||||
</div>
|
||||
<div class="circle">
|
||||
<svg viewBox="0 0 24 24"><path d="m20 22-3.86-1.55c.7-1.53 1.2-3.11 1.51-4.72L20 22M7.86 20.45 4 22l2.35-6.27c.31 1.61.81 3.19 1.51 4.72M12 2s5 2 5 10c0 3.1-.75 5.75-1.67 7.83A2 2 0 0 1 13.5 21h-3a2 2 0 0 1-1.83-1.17C7.76 17.75 7 15.1 7 12c0-8 5-10 5-10m0 10c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z" /></svg>
|
||||
</div>
|
||||
</div>
|
||||
<p id="upload-status"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="popup" id="about-popup">
|
||||
<div class="popup-content">
|
||||
<button type="button" class="btn-close float-end" aria-label="Close" id="aboutCloseBtn"></button>
|
||||
<h2>ccIDE</h2>
|
||||
<p>
|
||||
ccIDE is an integrated development environment designed for coding Lua scripts
|
||||
for ComputerCraft. It provides a user-friendly interface for creating and managing
|
||||
projects, designing custom blocks, and debugging scripts efficiently.
|
||||
</p>
|
||||
<p>
|
||||
Developed by DPSoftware Foundation, ccIDE aims to streamline the development
|
||||
process for ComputerCraft programmers, offering features like block-based coding,
|
||||
real-time collaboration, and seamless integration with ComputerCraft environments.
|
||||
</p>
|
||||
<p>
|
||||
Visit <a href="https://damp11113.xyz/dpsoftware/ccide">ccIDE Website</a> for more information and updates.
|
||||
</p>
|
||||
<div class="license">
|
||||
© 2024 DPSoftware Foundation. Licensed under GPL v3.
|
||||
</div>
|
||||
<style>
|
||||
.license {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
text-align: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="popup" id="library-popup" style="overflow-y:hidden;">
|
||||
<div class="popup-content p-3" style="max-width: 1280px; position: relative; margin-top: 150px;">
|
||||
<button type="button" class="btn-close" aria-label="Close" id="libraryCloseBtn" style="position: absolute; top: 10px; right: 10px;"></button>
|
||||
<h3>Packages Managers</h3>
|
||||
<div class="library-content">
|
||||
<div id="libcontainer">
|
||||
<div class="library-item overflow-auto library-container" data-libraryfolder="name">
|
||||
<img src="image.jpg" class="libimage" onerror="this.onerror=null;this.src='../assets/noimagefallback.png'; this.alt='No Image Available';">
|
||||
<div class="library-details">
|
||||
<h3>Title [v1.0 by Author]</h3>
|
||||
<p>Library description goes here.</p>
|
||||
<img src="../assets/basic_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Basic Computer">
|
||||
<img src="../assets/adv_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Advanced Computer">
|
||||
<img src="../assets/command_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Command Computer">
|
||||
<img src="../assets/pocket_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Pocket Computer">
|
||||
<img src="../assets/adv_pocket_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Advanced Pocket Computer">
|
||||
<img src="../assets/turtle.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Basic Turtle">
|
||||
<img src="../assets/adv_turtle.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Advanced Turtle">
|
||||
<img src="../assets/peripheral.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Peripheral">
|
||||
<img src="../assets/library.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Library">
|
||||
<img src="../assets/network-require.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Network Require">
|
||||
<div class="popup" id="upload-popup" style="overflow-y:hidden;">
|
||||
<div class="popup-content p-3" style="max-width: 720px; position: relative; margin-top: 100px;">
|
||||
<button type="button" class="btn-close float-end" aria-label="Close" id="uploadCloseBtn"></button>
|
||||
<div class="upload-progress-container" style="text-align: center;">
|
||||
<div class="progress-container">
|
||||
<div class="progress" id="progress"></div>
|
||||
<div class="circle active">
|
||||
<svg viewBox="0 0 24 24"><path d="M8 3a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2H3v2h1a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h2v-2H8v-5a2 2 0 0 0-2-2 2 2 0 0 0 2-2V5h2V3m6 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2z" /></svg>
|
||||
</div>
|
||||
<div class="circle">
|
||||
<svg viewBox="0 0 24 24"><path d="m5.5 4.14-1 1.72L15 12 4.5 18.14l1 1.72L19 12 5.5 4.14z" /></svg>
|
||||
</div>
|
||||
<div class="circle">
|
||||
<svg viewBox="0 0 24 24"><path d="M9 16v-6H5l7-7 7 7h-4v6H9m-4 4v-2h14v2H5z" /></svg>
|
||||
</div>
|
||||
<div class="circle">
|
||||
<svg viewBox="0 0 24 24"><path d="m20 22-3.86-1.55c.7-1.53 1.2-3.11 1.51-4.72L20 22M7.86 20.45 4 22l2.35-6.27c.31 1.61.81 3.19 1.51 4.72M12 2s5 2 5 10c0 3.1-.75 5.75-1.67 7.83A2 2 0 0 1 13.5 21h-3a2 2 0 0 1-1.83-1.17C7.76 17.75 7 15.1 7 12c0-8 5-10 5-10m0 10c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z" /></svg>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="upload-status"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-container">
|
||||
<button type="button" class="btn btn-success btn-sm" id="packageman-import-btn">Import Packages</button>
|
||||
<button type="button" class="btn btn-warning btn-sm" onclick='scanindex()'>Refetch Packages</button>
|
||||
<button type="button" class="btn btn-primary btn-sm" onclick='shell.openExternal("https://damp11113.xyz/dpsoftware/ccide/library")'>Download Packages</button>
|
||||
</div>
|
||||
|
||||
<div class="popup" id="about-popup">
|
||||
<div class="popup-content">
|
||||
<button type="button" class="btn-close float-end" aria-label="Close" id="aboutCloseBtn"></button>
|
||||
<h2>ccIDE</h2>
|
||||
<p>
|
||||
ccIDE is an integrated development environment designed for coding Lua scripts
|
||||
for ComputerCraft. It provides a user-friendly interface for creating and managing
|
||||
projects, designing custom blocks, and debugging scripts efficiently.
|
||||
</p>
|
||||
<p>
|
||||
Developed by DPSoftware Foundation, ccIDE aims to streamline the development
|
||||
process for ComputerCraft programmers, offering features like block-based coding,
|
||||
real-time collaboration, and seamless integration with ComputerCraft environments.
|
||||
</p>
|
||||
<p>
|
||||
Visit <a href="https://damp11113.xyz/dpsoftware/ccide">ccIDE Website</a> for more information and updates.
|
||||
</p>
|
||||
<div class="license">
|
||||
© 2024 DPSoftware Foundation. Licensed under GPL v3.
|
||||
</div>
|
||||
<style>
|
||||
.license {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
text-align: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="popup" id="library-popup" style="overflow-y:hidden;">
|
||||
<div class="popup-content p-3" style="max-width: 1280px; position: relative; margin-top: 100px;">
|
||||
<button type="button" class="btn-close" aria-label="Close" id="libraryCloseBtn" style="position: absolute; top: 10px; right: 10px;"></button>
|
||||
<h3>Packages Managers</h3>
|
||||
<div class="library-content">
|
||||
<div id="libcontainer">
|
||||
<div class="library-item overflow-auto library-container" data-libraryfolder="name">
|
||||
<img src="image.jpg" class="libimage" onerror="this.onerror=null;this.src='../assets/noimagefallback.png'; this.alt='No Image Available';">
|
||||
<div class="library-details">
|
||||
<h3>Title</h3>
|
||||
<!--Add Author credit-->
|
||||
<h6>v1.0 by Author</h6>
|
||||
<p>Library description goes here.</p>
|
||||
<img src="../assets/basic_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Basic Computer">
|
||||
<img src="../assets/adv_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Advanced Computer">
|
||||
<img src="../assets/command_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Command Computer">
|
||||
<img src="../assets/pocket_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Pocket Computer">
|
||||
<img src="../assets/adv_pocket_computer.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Advanced Pocket Computer">
|
||||
<img src="../assets/turtle.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Basic Turtle">
|
||||
<img src="../assets/adv_turtle.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Advanced Turtle">
|
||||
<img src="../assets/peripheral.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Peripheral">
|
||||
<img src="../assets/library.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Library">
|
||||
<img src="../assets/network-require.png" class="libimageicon" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Network Require">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-container">
|
||||
<button type="button" class="btn btn-success btn-sm" id="packageman-import-btn">Import Packages</button>
|
||||
<button type="button" class="btn btn-warning btn-sm" onclick='scanindex()'>Refetch Packages</button>
|
||||
<button type="button" class="btn btn-primary btn-sm" onclick='downloadBlocks()'>Download Packages</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
const {shell} = require('electron');
|
||||
</script>
|
||||
<script src="../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="frontend.js"></script>
|
||||
<script src="virtualcode.js"></script>
|
||||
<script src="index.js"></script>
|
||||
<script src="codegen.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
255
src/index.js
Normal file
255
src/index.js
Normal file
@ -0,0 +1,255 @@
|
||||
const { ipcRenderer } = require("electron");
|
||||
const ipc = ipcRenderer;
|
||||
|
||||
// override prompt command
|
||||
window.prompt = function(promptText, defaultValue) {
|
||||
return ipc.sendSync("prompt", promptText, defaultValue);
|
||||
};
|
||||
|
||||
window.onerror = function (message, source, lineno, colno, error) {
|
||||
ipc.send("error", message)
|
||||
return true; // Prevents the default browser error handling
|
||||
};
|
||||
|
||||
function delay(time) {
|
||||
return new Promise(resolve => setTimeout(resolve, time));
|
||||
}
|
||||
|
||||
console.originalLog = console.log;
|
||||
|
||||
console.log = function (...args) {
|
||||
ipc.send("update-log-status", ...args)
|
||||
console.originalLog(...args)
|
||||
document.getElementById("loadingstatus").textContent = args.join(' ');
|
||||
};
|
||||
|
||||
console.log("Importing module...")
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { loadperipheral, scanindex, isBlocksFolderEmpty, downloadBlocks } = require("./blocksmanager");
|
||||
const Blockly = require('blockly');
|
||||
const { WorkspaceSearch } = require("@blockly/plugin-workspace-search")
|
||||
const Toastify = require('toastify-js');
|
||||
|
||||
function fireNotify(text, status, destination, duration=3000) {
|
||||
let color;
|
||||
if (status == "success") {
|
||||
color = "#a5dc86"
|
||||
} else if (status == "warning") {
|
||||
color = "#f8bb86"
|
||||
} else if (status == "error") {
|
||||
color = "#f27474"
|
||||
} else if (status == "info") {
|
||||
color = "#3fc3ee"
|
||||
}
|
||||
|
||||
Toastify({
|
||||
text: text,
|
||||
duration: duration,
|
||||
destination: destination,
|
||||
newWindow: true,
|
||||
close: true,
|
||||
gravity: "top", // `top` or `bottom`
|
||||
position: "right", // `left`, `center` or `right`
|
||||
stopOnFocus: true, // Prevents dismissing of toast on hover
|
||||
style: {
|
||||
background: color,
|
||||
}
|
||||
}).showToast();
|
||||
}
|
||||
|
||||
let isprojectsaved = false;
|
||||
let isprojectopened = false;
|
||||
let usedlibinproject = []
|
||||
|
||||
console.log("Initializing blockly workspace...")
|
||||
Blockly.utils.colour.setHsvSaturation(0.9)
|
||||
|
||||
let originaltoolbar = fs.readFileSync(path.join(__dirname, "toolbox.xml"), 'utf8');
|
||||
|
||||
try {
|
||||
const theme = Blockly.Theme.defineTheme('themeName', {
|
||||
base: Blockly.Themes.Classic,
|
||||
componentStyles: {
|
||||
workspaceBackgroundColour: "#1e1e1e",
|
||||
toolboxBackgroundColour: "blackBackground",
|
||||
toolboxForegroundColour: "#fff",
|
||||
flyoutBackgroundColour: "#252526",
|
||||
flyoutForegroundColour: "#ccc",
|
||||
flyoutOpacity: 1,
|
||||
scrollbarColour: "#797979",
|
||||
insertionMarkerColour: "#fff",
|
||||
insertionMarkerOpacity: .3,
|
||||
scrollbarOpacity: .4,
|
||||
cursorColour: "#d0d0d0",
|
||||
blackBackground: "#333"
|
||||
}
|
||||
});
|
||||
|
||||
var workspace = Blockly.inject('blocklyDiv', {
|
||||
toolbox: originaltoolbar,
|
||||
trashcan: true,
|
||||
grid: {
|
||||
spacing: 20,
|
||||
length: 3,
|
||||
colour: '#ccc',
|
||||
snap: true
|
||||
},
|
||||
zoom:{
|
||||
controls: true,
|
||||
wheel: true,
|
||||
startScale: 1.0,
|
||||
maxScale: 5,
|
||||
minScale: 0.1,
|
||||
scaleSpeed: 1.1,
|
||||
pinch: true
|
||||
},
|
||||
theme: theme
|
||||
});
|
||||
|
||||
const workspaceSearch = new WorkspaceSearch(workspace);
|
||||
workspaceSearch.init();
|
||||
|
||||
workspace.getToolbox().getFlyout().autoClose = false;
|
||||
} catch (e) {
|
||||
ipc.send("erroronstart", `Error on initializing workspace: ${e}`)
|
||||
}
|
||||
|
||||
console.log("Initializing event...")
|
||||
|
||||
ipc.on('export-lua-request', (event) => {
|
||||
console.log("exporting lua")
|
||||
ipc.send('export-lua', gencodeonly());
|
||||
})
|
||||
|
||||
// Save workspace
|
||||
ipc.on('save-workspace-request', (event) => {
|
||||
console.log("Saving project...")
|
||||
fireNotify(`Saving...`, "warning")
|
||||
const state = Blockly.serialization.workspaces.save(workspace);
|
||||
const data = {
|
||||
"usedlibrary": usedlibinproject,
|
||||
"content": state
|
||||
}
|
||||
|
||||
ipc.send('save-workspace', data);
|
||||
});
|
||||
|
||||
// Load workspace
|
||||
ipc.on('load-workspace', (event, json) => {
|
||||
console.log("Loading project...")
|
||||
try {
|
||||
if (json) {
|
||||
data = JSON.parse(json)
|
||||
const libinproject = data.usedlibrary
|
||||
workspace.clear()
|
||||
for (let i = 0; i < libinproject.length; i++) {
|
||||
const packagefolder = libinproject[i]
|
||||
if (!usedlibinproject.includes(packagefolder)) {
|
||||
try {
|
||||
originaltoolbar = loadperipheral(workspace, originaltoolbar, packagefolder, usedlibinproject);
|
||||
usedlibinproject.push(packagefolder);
|
||||
} catch (e) {
|
||||
fireNotify(`Can't Import ${usedlibinproject[i]}: ${e}`, "error")
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Blockly.serialization.workspaces.load(data.content, workspace);
|
||||
isprojectsaved = true
|
||||
fireNotify(`Project Loaded`, "success")
|
||||
}
|
||||
} catch (e) {
|
||||
fireNotify(`Can't Load Project: ${e}`, "error")
|
||||
}
|
||||
})
|
||||
|
||||
ipc.on('workspace-saved', (event, success) => {
|
||||
isprojectsaved = success
|
||||
if (!isprojectopened) {
|
||||
isprojectopened = true;
|
||||
}
|
||||
fireNotify(`Project Saved`, "success")
|
||||
});
|
||||
|
||||
ipc.on("open-about", () => {
|
||||
document.getElementById('about-popup').style.display = 'block';
|
||||
})
|
||||
|
||||
workspace.addChangeListener(function(event) {
|
||||
if ([Blockly.Events.UI,
|
||||
Blockly.Events.VIEWPORT_CHANGE,
|
||||
Blockly.Events.TOOLBOX_ITEM_SELECT]
|
||||
.includes(event.type)) {
|
||||
return; // Don't care about UI events.
|
||||
}
|
||||
if (isprojectsaved) {
|
||||
isprojectsaved = false
|
||||
ipc.send("workspace-notsave")
|
||||
} else if (!isprojectopened) {
|
||||
ipc.send("workspace-unsave")
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("packageman-import-btn").addEventListener('click', () => {
|
||||
var librarypopup = document.getElementById('library-popup');
|
||||
librarypopup.style.animation = 'fadeOut 0.3s ease'; // Apply fade-out animation
|
||||
setTimeout(function() {
|
||||
librarypopup.style.display = 'none'; // Hide popup after animation completes
|
||||
librarypopup.style.animation = ''; // Reset animation property
|
||||
}, 300); // Adjust to match animation duration in milliseconds
|
||||
|
||||
const selectedItems = document.querySelectorAll('.library-item.selected');
|
||||
selectedItems.forEach(item => {
|
||||
const packagefolder = item.getAttribute('data-libraryfolder');
|
||||
originaltoolbar = loadperipheral(workspace, originaltoolbar, packagefolder, usedlibinproject);
|
||||
fireNotify(`Loaded ${packagefolder}`, "success")
|
||||
});
|
||||
});
|
||||
|
||||
async function InitializingBlock() {
|
||||
try {
|
||||
console.log("Importing system library...");
|
||||
const sysmodulejson = fs.readFileSync(path.join(__dirname, "module_block_design.json"), 'utf8');
|
||||
const blocksJson = JSON.parse(sysmodulejson);
|
||||
|
||||
for (const blockId in blocksJson) {
|
||||
if (blocksJson.hasOwnProperty(blockId)) {
|
||||
Blockly.Blocks[blockId] = {
|
||||
init: function() {
|
||||
this.jsonInit(blocksJson[blockId]);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
require("./module_generator");
|
||||
|
||||
console.log("Check library folder...");
|
||||
if (isBlocksFolderEmpty()) {
|
||||
await downloadBlocks();
|
||||
}
|
||||
scanindex();
|
||||
|
||||
|
||||
} catch (e) {
|
||||
ipc.send("erroronstart", `Error on loading block: ${e}`);
|
||||
}
|
||||
|
||||
// Ensure Blockly container is shown after the workspace is injected
|
||||
console.log("Finished")
|
||||
setTimeout(() => {
|
||||
ipc.send("ready")
|
||||
// Hide loading area
|
||||
const loadingArea = document.querySelector('.loading-area');
|
||||
loadingArea.style.opacity = '0';
|
||||
loadingArea.style.visibility = 'hidden';
|
||||
loadingArea.style.display = 'none';
|
||||
|
||||
// Show content area
|
||||
const contentArea = document.querySelector('.content-area');
|
||||
contentArea.style.opacity = '1';
|
||||
contentArea.style.visibility = 'visible';
|
||||
}, 500);
|
||||
}
|
||||
|
||||
InitializingBlock();
|
@ -1,13 +1,4 @@
|
||||
{
|
||||
"sys_start": {
|
||||
"message0": "When Code Start",
|
||||
"message1": "do %1",
|
||||
"args1": [
|
||||
{"type": "input_statement", "name": "DO"}
|
||||
],
|
||||
"colour": 45,
|
||||
"tooltip": "Not require but make your code easy to read."
|
||||
},
|
||||
"sys_sleep": {
|
||||
"message0": "Sleep For %1 Second",
|
||||
"args0": [
|
||||
@ -22,5 +13,179 @@
|
||||
"colour": 120,
|
||||
"tooltip": "Sleep command",
|
||||
"helpUrl": ""
|
||||
},
|
||||
"sys_utils_table_variable_pack": {
|
||||
"message0": "Pack args %1 to Table",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "RETURN_ARGS",
|
||||
"check": "Multiple"
|
||||
}
|
||||
],
|
||||
"output": "Array",
|
||||
"colour": 260
|
||||
},
|
||||
"sys_utils_get_value_from_table_with_index": {
|
||||
"message0": "UnPack args %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": 260
|
||||
},
|
||||
"sys_utils_get_type": {
|
||||
"message0": "Get type of %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "INPUT"
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 220
|
||||
},
|
||||
"sys_table_unpack_to_args": {
|
||||
"message0": "UnPack table %1 to Args",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TABLE",
|
||||
"check": "Array"
|
||||
}
|
||||
],
|
||||
"output": "Multiple",
|
||||
"colour": 260
|
||||
},
|
||||
"sys_table_add_key_value": {
|
||||
"message0": "Add key %1 with data %2\nShorthand %3",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "KEY",
|
||||
"check": ["String", "Number"]
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "VALUE"
|
||||
},
|
||||
{
|
||||
"type": "field_checkbox",
|
||||
"name": "SHORT"
|
||||
}
|
||||
],
|
||||
"output": "Array_Pair",
|
||||
"colour": 260
|
||||
},
|
||||
"sys_table_append_data": {
|
||||
"message0": "Append %1 to table %2",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "DATA"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TABLE",
|
||||
"check": "Array"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 260
|
||||
},
|
||||
"ide_addcode": {
|
||||
"message0": "Add Code %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "CODE",
|
||||
"text": "print('hello world!')"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 220,
|
||||
"tooltip": "Add Code for some code is not in IDE",
|
||||
"helpUrl": ""
|
||||
},
|
||||
"ide_start": {
|
||||
"message0": "When Code Start",
|
||||
"message1": "do %1",
|
||||
"args1": [
|
||||
{"type": "input_statement", "name": "DO"}
|
||||
],
|
||||
"colour": 220,
|
||||
"tooltip": "Not require but make your code easy to read."
|
||||
},
|
||||
"sys_exit": {
|
||||
"message0": "Exit the code",
|
||||
"previousStatement": null,
|
||||
"colour": 38
|
||||
},
|
||||
"sys_write": {
|
||||
"message0": "Write %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "TEXT",
|
||||
"check": "String"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 110,
|
||||
"tooltip": "Writes a line of text to the screen without a newline at the end, wrapping text if necessary."
|
||||
},
|
||||
"sys_print_error": {
|
||||
"message0": "Print error %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "ERROR"
|
||||
}
|
||||
],
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"colour": 110,
|
||||
"tooltip": "Prints the specified values to the screen in red, separated by spaces, wrapping if necessary. After printing, the cursor is moved to the next line."
|
||||
},
|
||||
"sys_mc_std_color": {
|
||||
"message0": "Standard chat color %1",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "COLOR",
|
||||
"options": [
|
||||
["White", "&f"],
|
||||
["Gray", "&7"],
|
||||
["Dark Gray", "&8"],
|
||||
["Black", "&0"],
|
||||
["Dark Red", "&4"],
|
||||
["Red", "&c"],
|
||||
["Gold", "&6"],
|
||||
["Yellow", "&e"],
|
||||
["Dark Green", "&2"],
|
||||
["Green", "&a"],
|
||||
["Dark Aqua", "&b"],
|
||||
["Dark Blue", "&1"],
|
||||
["Blue", "&9"],
|
||||
["Light Purple", "&d"],
|
||||
["Dark Purple", "&5"]
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "String",
|
||||
"colour": 220,
|
||||
"tooltip": "Standard chat color picker"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,66 @@ luaGenerator.forBlock['sys_sleep'] = function(block, generator) {
|
||||
return code;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sys_start'] = function(block, generator) {
|
||||
luaGenerator.forBlock['sys_utils_table_variable_pack'] = function(block, generator) {
|
||||
var args = generator.valueToCode(block, 'RETURN_ARGS', generator.ORDER_NONE);
|
||||
|
||||
return [`table.pack(${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];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sys_table_unpack_to_args'] = function(block, generator) {
|
||||
var table = generator.valueToCode(block, 'TABLE', generator.ORDER_NONE);
|
||||
|
||||
return [`table.unpack(${table})`, luaGenerator.ORDER_NONE];
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sys_table_add_key_value'] = function(block, generator) {
|
||||
var key = generator.valueToCode(block, 'KEY', generator.ORDER_NONE);
|
||||
var value = generator.valueToCode(block, 'VALUE', generator.ORDER_NONE);
|
||||
var shorted = block.getFieldValue('SHORT') == 'TRUE';
|
||||
if (!shorted) {
|
||||
return [`[${key}] = ${value}`, luaGenerator.ORDER_NONE];
|
||||
} else {
|
||||
return [`${key} = ${value}`, luaGenerator.ORDER_NONE];
|
||||
}
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sys_table_append_data'] = function(block, generator) {
|
||||
var data = generator.valueToCode(block, 'DATA', generator.ORDER_NONE);
|
||||
var table = generator.valueToCode(block, 'TABLE', generator.ORDER_NONE);
|
||||
|
||||
return `table.insert(${table}, ${data})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sys_table_append_data'] = function(block, generator) {
|
||||
var data = generator.valueToCode(block, 'DATA', generator.ORDER_NONE);
|
||||
var table = generator.valueToCode(block, 'TABLE', generator.ORDER_NONE);
|
||||
|
||||
return `table.insert(${table}, ${data})\n`;
|
||||
};
|
||||
|
||||
// Define your custom block handler
|
||||
luaGenerator.forBlock['ide_addcode'] = function(block, generator) {
|
||||
var codefromuser = generator.valueToCode(block, 'CODE', generator.ORDER_ATOMIC);
|
||||
|
||||
// Remove all occurrences of the matched characters
|
||||
const cleanedStr = codefromuser.replace(/[']/g, '');
|
||||
return cleanedStr+"\n";
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['ide_start'] = function(block, generator) {
|
||||
var docode = generator.statementToCode(block, 'DO');
|
||||
|
||||
var code =
|
||||
@ -25,4 +84,27 @@ end
|
||||
main()
|
||||
`
|
||||
return code;
|
||||
};
|
||||
|
||||
|
||||
luaGenerator.forBlock['sys_exit'] = function(block, generator) {
|
||||
return `exit()\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sys_write'] = function(block, generator) {
|
||||
var text = generator.valueToCode(block, 'TEXT', generator.ORDER_NONE);
|
||||
|
||||
return `write(${text})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sys_print_error'] = function(block, generator) {
|
||||
var error = generator.valueToCode(block, 'ERROR', generator.ORDER_NONE);
|
||||
|
||||
return `printError(${error})\n`;
|
||||
};
|
||||
|
||||
luaGenerator.forBlock['sys_mc_std_color'] = function(block, generator) {
|
||||
var color = block.getFieldValue('COLOR');
|
||||
|
||||
return [`"${color}"`, luaGenerator.ORDER_NONE];
|
||||
};
|
240
src/splash.html
240
src/splash.html
@ -2,71 +2,197 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Splash Screen</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Product Page</title>
|
||||
<style>
|
||||
body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
background-color: #2c3e50;
|
||||
color: white;
|
||||
font-family: Arial, sans-serif;
|
||||
position: relative;
|
||||
}
|
||||
#splash-content {
|
||||
text-align: center;
|
||||
}
|
||||
#splash-content img {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); /* Added drop shadow */
|
||||
}
|
||||
.progress-bar {
|
||||
height: 4px;
|
||||
background-color: rgba(5, 114, 206, 0.2);
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
margin-top: 20px;
|
||||
}
|
||||
.progress-bar-value {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgb(5, 114, 206);
|
||||
animation: indeterminateAnimation 1s infinite linear;
|
||||
transform-origin: 0% 50%;
|
||||
}
|
||||
@keyframes indeterminateAnimation {
|
||||
0% {
|
||||
transform: translateX(0) scaleX(0);
|
||||
body, html {
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
40% {
|
||||
transform: translateX(0) scaleX(0.4);
|
||||
|
||||
#box {
|
||||
position: absolute;
|
||||
user-select: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
margin: auto;
|
||||
}
|
||||
100% {
|
||||
transform: translateX(100%) scaleX(0.5);
|
||||
|
||||
#logo {
|
||||
height: 16px;
|
||||
position: absolute;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
top: 25px;
|
||||
left: 25px;
|
||||
}
|
||||
|
||||
#logo img {
|
||||
width: 18px;
|
||||
}
|
||||
|
||||
#logo h6 {
|
||||
color: white;
|
||||
font-size: 16px;
|
||||
font-weight: 200;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
letter-spacing: 0px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
#box h1 {
|
||||
color: white;
|
||||
display: inline-block;
|
||||
font-size: 65px;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 60%;
|
||||
transform: translateX(-50%) translateY(-120%);
|
||||
}
|
||||
|
||||
#box .text {
|
||||
color: white;
|
||||
font-weight: 400;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
}
|
||||
|
||||
#box h4 {
|
||||
font-size: 12px;
|
||||
font-weight: 400;
|
||||
opacity: 50%;
|
||||
}
|
||||
|
||||
#starting-txt {
|
||||
position: absolute;
|
||||
left: 25px;
|
||||
bottom: 13px;
|
||||
}
|
||||
|
||||
#author-txt {
|
||||
position: absolute;
|
||||
right: 25px;
|
||||
bottom: 13px;
|
||||
}
|
||||
|
||||
#author-txt a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.text img {
|
||||
width: 15px;
|
||||
}
|
||||
|
||||
.dot {
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
top: 60%;
|
||||
left: -20%;
|
||||
transform: translateY(40px);
|
||||
position: absolute;
|
||||
margin: auto;
|
||||
border-radius: 5px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
#dot1 {
|
||||
animation: dotslide 2.8s infinite cubic-bezier(0.2, .8, .8, 0.2);
|
||||
}
|
||||
|
||||
#dot2 {
|
||||
animation: dotslide 2.8s .2s infinite cubic-bezier(0.2, .8, .8, 0.2);
|
||||
}
|
||||
|
||||
#dot3 {
|
||||
animation: dotslide 2.8s .4s infinite cubic-bezier(0.2, .8, .8, 0.2);
|
||||
}
|
||||
|
||||
#dot4 {
|
||||
animation: dotslide 2.8s .6s infinite cubic-bezier(0.2, .8, .8, 0.2);
|
||||
}
|
||||
|
||||
#dot5 {
|
||||
animation: dotslide 2.8s .8s infinite cubic-bezier(0.2, .8, .8, 0.2);
|
||||
}
|
||||
|
||||
@keyframes dotslide {
|
||||
0% {
|
||||
left: -20%;
|
||||
}
|
||||
|
||||
100% {
|
||||
left: 120%;
|
||||
}
|
||||
}
|
||||
|
||||
#product-icon {
|
||||
position: absolute;
|
||||
top: 20%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 100px; /* Adjust size as needed */
|
||||
height: 100px; /* Adjust size as needed */
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); /* Added drop shadow */
|
||||
}
|
||||
|
||||
#close-btn {
|
||||
position: absolute;
|
||||
top: 15px;
|
||||
right: 25px;
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: white;
|
||||
font-size: 24px;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
opacity: 50%;
|
||||
}
|
||||
}
|
||||
#copyright {
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
left: 10px;
|
||||
font-size: 12px;
|
||||
color: #bdc3c7;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="splash-content">
|
||||
<img src="../assets/ccIDEIcon.ico" alt="ccIDE Icon">
|
||||
<h1>Loading ccIDE...</h1>
|
||||
<div class="progress-bar">
|
||||
<div class="progress-bar-value"></div>
|
||||
<div id="box" style="background-color:#2c3e50">
|
||||
<button id="close-btn">✖</button>
|
||||
<span id="logo">
|
||||
<img id="logo-img" src="../assets/dpsoftware.png"/>
|
||||
<h6 id="logo-text">DPSoftware Foundation</h6>
|
||||
</span>
|
||||
|
||||
<div id="product-review">
|
||||
<img id="product-icon" src="../assets/ccIDEIcon.ico" alt="ccIDE Icon"/>
|
||||
<h1 id="product" class="text">ccIDE</h1>
|
||||
</div>
|
||||
<div id="loading-dots">
|
||||
<div class="dot" id="dot1"></div>
|
||||
<div class="dot" id="dot2"></div>
|
||||
<div class="dot" id="dot3"></div>
|
||||
<div class="dot" id="dot4"></div>
|
||||
<div class="dot" id="dot5"></div>
|
||||
</div>
|
||||
<h4 class="text" id="starting-txt">Loading ...</h4>
|
||||
<h4 class="text" id="author-txt">damp11113.xyz</h4>
|
||||
</div>
|
||||
<div id="copyright">
|
||||
© 2024 DPSoftware Foundation. Licensed under GPL v3.
|
||||
</div>
|
||||
<script>
|
||||
const { ipcRenderer } = require("electron");
|
||||
const ipc = ipcRenderer;
|
||||
|
||||
ipc.on('change-status', (event, status) => {
|
||||
document.getElementById('starting-txt').textContent = status;
|
||||
});
|
||||
|
||||
ipc.on('change-title', (event, title) => {
|
||||
document.getElementById('product').textContent = title;
|
||||
});
|
||||
|
||||
ipc.on('isloaded', (event) => {
|
||||
document.getElementById('loading-dots').remove();
|
||||
});
|
||||
|
||||
document.getElementById('close-btn').addEventListener('click', () => {
|
||||
ipc.send('splash-close');
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
90
src/splash_old.html
Normal file
90
src/splash_old.html
Normal file
@ -0,0 +1,90 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Splash Screen</title>
|
||||
<style>
|
||||
body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
background-color: #2c3e50;
|
||||
color: white;
|
||||
font-family: Arial, sans-serif;
|
||||
position: relative;
|
||||
}
|
||||
#splash-content {
|
||||
text-align: center;
|
||||
}
|
||||
#splash-content img {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); /* Added drop shadow */
|
||||
}
|
||||
.progress-bar {
|
||||
height: 4px;
|
||||
background-color: rgba(5, 114, 206, 0.2);
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
margin-top: 20px;
|
||||
}
|
||||
.progress-bar-value {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgb(5, 114, 206);
|
||||
animation: indeterminateAnimation 1s infinite linear;
|
||||
transform-origin: 0% 50%;
|
||||
}
|
||||
@keyframes indeterminateAnimation {
|
||||
0% {
|
||||
transform: translateX(0) scaleX(0);
|
||||
}
|
||||
40% {
|
||||
transform: translateX(0) scaleX(0.4);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(100%) scaleX(0.5);
|
||||
}
|
||||
}
|
||||
#copyright {
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
left: 10px;
|
||||
font-size: 12px;
|
||||
color: #bdc3c7;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="splash-content">
|
||||
<img src="../assets/ccIDEIcon.ico" alt="ccIDE Icon">
|
||||
<h1 id="title">Loading ccIDE...</h1>
|
||||
<div class="progress-bar" id="progressbar">
|
||||
<div class="progress-bar-value"></div>
|
||||
</div>
|
||||
<h6 id="status">Initializing...</h6>
|
||||
</div>
|
||||
<div id="copyright">
|
||||
© 2024 DPSoftware Foundation. Licensed under GPL v3.
|
||||
</div>
|
||||
<script>
|
||||
const { ipcRenderer } = require("electron");
|
||||
const ipc = ipcRenderer;
|
||||
|
||||
ipc.on('change-status', (event, status) => {
|
||||
document.getElementById('status').textContent = status;
|
||||
});
|
||||
|
||||
ipc.on('change-title', (event, title) => {
|
||||
document.getElementById('title').textContent = title;
|
||||
});
|
||||
|
||||
ipc.on('isloaded', (event) => {
|
||||
document.getElementById('progressbar').remove();
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user