From cf0cf5c6941d0be2e182b56220d03c8c60cd460d Mon Sep 17 00:00:00 2001 From: Blake Rain Date: Sun, 28 Jan 2024 16:49:48 +0000 Subject: [PATCH 1/2] feat: add digitizer block and peripheral --- assets/digitizer.bbmodel | 1 + assets/digitizer_peripheral.afdesign | Bin 0 -> 60551 bytes assets/gui/digitizer_gui.afdesign | Bin 0 -> 64937 bytes assets/textures/digitizer.png | Bin 0 -> 711 bytes .../banutama/utamacraft/CCRegistration.java | 4 +- .../net/banutama/utamacraft/Utamacraft.java | 2 + .../block/custom/DigitizerBlock.java | 140 +++++++++ .../utamacraft/block/custom/ModBlocks.java | 1 + .../block/entity/DigitizerBlockEntity.java | 144 +++++++++ .../block/entity/ModBlockEntities.java | 4 + .../peripheral/DigitizerPeripheral.java | 272 +++++++++++++++++ .../peripheral/digitizer/DigitizedCache.java | 117 ++++++++ .../peripheral/digitizer/DigitizedItem.java | 77 +++++ .../banutama/utamacraft/item/BaseItem.java | 16 + .../utamacraft/item/PlayerPeripheralItem.java | 9 +- .../screen/BaseAbstractContainerMenu.java | 78 +++++ .../utamacraft/screen/DigitizerMenu.java | 58 ++++ .../utamacraft/screen/DigitizerScreen.java | 78 +++++ .../utamacraft/screen/InsolatorMenu.java | 64 +--- .../utamacraft/screen/ModMenuTypes.java | 13 +- .../utamacraft/util/ModEnergyStorage.java | 10 + .../utamacraft/blockstates/digitizer.json | 19 ++ .../assets/utamacraft/lang/en_us.json | 3 + .../utamacraft/models/block/digitizer.json | 283 ++++++++++++++++++ .../utamacraft/models/item/digitizer.json | 3 + .../utamacraft/textures/block/digitizer.png | Bin 0 -> 711 bytes .../utamacraft/textures/gui/digitizer_gui.png | Bin 0 -> 20057 bytes .../data/utamacraft/recipes/digitizer.json | 22 ++ 28 files changed, 1345 insertions(+), 73 deletions(-) create mode 100644 assets/digitizer.bbmodel create mode 100644 assets/digitizer_peripheral.afdesign create mode 100644 assets/gui/digitizer_gui.afdesign create mode 100644 assets/textures/digitizer.png create mode 100644 src/main/java/net/banutama/utamacraft/block/custom/DigitizerBlock.java create mode 100644 src/main/java/net/banutama/utamacraft/block/entity/DigitizerBlockEntity.java create mode 100644 src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/DigitizerPeripheral.java create mode 100644 src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/digitizer/DigitizedCache.java create mode 100644 src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/digitizer/DigitizedItem.java create mode 100644 src/main/java/net/banutama/utamacraft/screen/BaseAbstractContainerMenu.java create mode 100644 src/main/java/net/banutama/utamacraft/screen/DigitizerMenu.java create mode 100644 src/main/java/net/banutama/utamacraft/screen/DigitizerScreen.java create mode 100644 src/main/resources/assets/utamacraft/blockstates/digitizer.json create mode 100644 src/main/resources/assets/utamacraft/models/block/digitizer.json create mode 100644 src/main/resources/assets/utamacraft/models/item/digitizer.json create mode 100644 src/main/resources/assets/utamacraft/textures/block/digitizer.png create mode 100644 src/main/resources/assets/utamacraft/textures/gui/digitizer_gui.png create mode 100644 src/main/resources/data/utamacraft/recipes/digitizer.json diff --git a/assets/digitizer.bbmodel b/assets/digitizer.bbmodel new file mode 100644 index 0000000..e5048f9 --- /dev/null +++ b/assets/digitizer.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.9","model_format":"java_block","box_uv":false},"name":"digitizer_block","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"upper","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1,2,1],"to":[15,5,15],"autouv":0,"color":9,"origin":[14,1,1],"faces":{"north":{"uv":[8,28,22,31],"texture":0},"east":{"uv":[28,10,42,13],"texture":0},"south":{"uv":[28,13,42,16],"texture":0},"west":{"uv":[28,16,42,19],"texture":0},"up":{"uv":[14,14,0,0],"texture":0},"down":{"uv":[14,14,0,28],"texture":0}},"type":"cube","uuid":"a12aba1b-b81b-b1f1-5c0c-62f7e4c08f02"},{"name":"left","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[14,1,1],"to":[15,2,15],"autouv":0,"color":9,"origin":[14,1,1],"faces":{"north":{"uv":[7,38,8,39],"texture":0},"east":{"uv":[25,31,39,32],"texture":0},"south":{"uv":[19,38,20,39],"texture":0},"west":{"uv":[31,27,45,28],"texture":0},"up":{"uv":[21,45,20,31],"texture":0},"down":{"uv":[22,31,21,45],"texture":0}},"type":"cube","uuid":"abb75303-04df-7b2c-1761-4631bb49c874"},{"name":"right","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1,1,1],"to":[2,2,15],"autouv":0,"color":9,"origin":[14,1,1],"faces":{"north":{"uv":[19,39,20,40],"texture":0},"east":{"uv":[31,28,45,29],"texture":0},"south":{"uv":[39,35,40,36],"texture":0},"west":{"uv":[31,29,45,30],"texture":0},"up":{"uv":[26,46,25,32],"texture":0},"down":{"uv":[27,32,26,46],"texture":0}},"type":"cube","uuid":"4cafb52c-b44d-cff7-e845-c9e5981f5f2b"},{"name":"back","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,1,14],"to":[14,2,15],"autouv":0,"color":9,"origin":[14,1,1],"faces":{"north":{"uv":[8,33,20,34],"texture":0},"east":{"uv":[37,39,38,40],"texture":0},"south":{"uv":[8,34,20,35],"texture":0},"west":{"uv":[39,37,40,38],"texture":0},"up":{"uv":[20,36,8,35],"texture":0},"down":{"uv":[39,35,27,36],"texture":0}},"type":"cube","uuid":"5bf5b54d-0c79-7dec-fae9-1642bf509458"},{"name":"lower","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[1,0,1],"to":[15,1,15],"autouv":0,"color":9,"origin":[14,1,1],"faces":{"north":{"uv":[31,30,45,31],"texture":0},"east":{"uv":[27,32,41,33],"texture":0},"south":{"uv":[27,33,41,34],"texture":0},"west":{"uv":[27,34,41,35],"texture":0},"up":{"uv":[28,14,14,0],"texture":0},"down":{"uv":[28,14,14,28],"texture":0}},"type":"cube","uuid":"59f362e7-f1cf-cb8d-c8c2-ca7a8107668a"},{"name":"button_6","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,5,2],"to":[4,6,4],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[17,38,19,39],"texture":0},"east":{"uv":[39,2,41,3],"texture":0},"south":{"uv":[39,3,41,4],"texture":0},"west":{"uv":[4,39,6,40],"texture":0},"up":{"uv":[39,4,37,2],"texture":0},"down":{"uv":[39,4,37,6],"texture":0}},"type":"cube","uuid":"a460ffd3-337f-a74c-34b3-6f5c3a7cfcf5"},{"name":"button_5","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[5,5,2],"to":[7,6,4],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[39,4,41,5],"texture":0},"east":{"uv":[39,5,41,6],"texture":0},"south":{"uv":[6,39,8,40],"texture":0},"west":{"uv":[39,6,41,7],"texture":0},"up":{"uv":[39,8,37,6],"texture":0},"down":{"uv":[39,8,37,10],"texture":0}},"type":"cube","uuid":"4f051020-8d89-e756-e079-a54f38276b2c"},{"name":"button_4","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[8,5,2],"to":[10,6,4],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[39,7,41,8],"texture":0},"east":{"uv":[39,8,41,9],"texture":0},"south":{"uv":[39,9,41,10],"texture":0},"west":{"uv":[17,39,19,40],"texture":0},"up":{"uv":[29,39,27,37],"texture":0},"down":{"uv":[31,37,29,39],"texture":0}},"type":"cube","uuid":"250dee2d-1235-794b-d9a6-700119d6a297"},{"name":"receiver","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[11,5,2],"to":[14,7,14],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[25,28,28,30],"texture":0},"east":{"uv":[8,31,20,33],"texture":0},"south":{"uv":[17,36,20,38],"texture":0},"west":{"uv":[31,19,43,21],"texture":0},"up":{"uv":[31,31,28,19],"texture":0},"down":{"uv":[25,28,22,40],"texture":0}},"type":"cube","uuid":"85199572-1ed6-8346-bfef-486883cc2a03"},{"name":"button_3","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,5,5],"to":[4,6,7],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[39,21,41,22],"texture":0},"east":{"uv":[39,22,41,23],"texture":0},"south":{"uv":[39,23,41,24],"texture":0},"west":{"uv":[39,24,41,25],"texture":0},"up":{"uv":[33,39,31,37],"texture":0},"down":{"uv":[35,37,33,39],"texture":0}},"type":"cube","uuid":"9e829284-c571-19b6-2c82-535cb16d9128"},{"name":"button_2","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[5,5,5],"to":[7,6,7],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[39,25,41,26],"texture":0},"east":{"uv":[39,26,41,27],"texture":0},"south":{"uv":[27,39,29,40],"texture":0},"west":{"uv":[29,39,31,40],"texture":0},"up":{"uv":[37,39,35,37],"texture":0},"down":{"uv":[39,37,37,39],"texture":0}},"type":"cube","uuid":"fa2dea41-4c24-9ae2-5d91-0fd71e56a4aa"},{"name":"button_1","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[8,5,5],"to":[10,6,7],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[31,39,33,40],"texture":0},"east":{"uv":[39,31,41,32],"texture":0},"south":{"uv":[33,39,35,40],"texture":0},"west":{"uv":[35,39,37,40],"texture":0},"up":{"uv":[2,40,0,38],"texture":0},"down":{"uv":[4,38,2,40],"texture":0}},"type":"cube","uuid":"b3e200ba-b7dc-46e0-974f-dd3d2938bd06"},{"name":"tray_bottom","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,3,13],"to":[10,13,14],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[6,8,10],"faces":{"north":{"uv":[0,28,8,38],"texture":0},"east":{"uv":[36,0,37,10],"texture":0},"south":{"uv":[28,0,36,10],"texture":0},"west":{"uv":[8,36,9,46],"texture":0},"up":{"uv":[35,37,27,36],"texture":0},"down":{"uv":[43,36,35,37],"texture":0}},"type":"cube","uuid":"e992aab8-f3ac-c2d6-05f7-be9587a76578"},{"name":"tray_left","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[9,3,12],"to":[10,13,13],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[6,8,10],"faces":{"north":{"uv":[9,36,10,46],"texture":0},"east":{"uv":[10,36,11,46],"texture":0},"south":{"uv":[11,36,12,46],"texture":0},"west":{"uv":[12,36,13,46],"texture":0},"up":{"uv":[39,40,38,39],"texture":0},"down":{"uv":[40,38,39,39],"texture":0}},"type":"cube","uuid":"9759b8df-ad17-536d-8155-602c6aaaafb4"},{"name":"tray_right","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,3,12],"to":[3,13,13],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[6,8,10],"faces":{"north":{"uv":[13,36,14,46],"texture":0},"east":{"uv":[14,36,15,46],"texture":0},"south":{"uv":[15,36,16,46],"texture":0},"west":{"uv":[16,36,17,46],"texture":0},"up":{"uv":[40,40,39,39],"texture":0},"down":{"uv":[1,40,0,41],"texture":0}},"type":"cube","uuid":"033b81c8-f4cd-4373-905a-8fcc701d2e49"},{"name":"button_2","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,5,8],"to":[10,6,11],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[37,0,45,1],"texture":0},"east":{"uv":[25,30,28,31],"texture":0},"south":{"uv":[37,1,45,2],"texture":0},"west":{"uv":[4,38,7,39],"texture":0},"up":{"uv":[39,24,31,21],"texture":0},"down":{"uv":[39,24,31,27],"texture":0}},"type":"cube","uuid":"a9bb3568-1ad9-8b14-a9a8-35be7c515f72"}],"outliner":[{"name":"paper_tray","origin":[14,1,1],"color":0,"uuid":"0788a580-f11e-83fe-2996-3b0ec9616e03","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["033b81c8-f4cd-4373-905a-8fcc701d2e49","e992aab8-f3ac-c2d6-05f7-be9587a76578","9759b8df-ad17-536d-8155-602c6aaaafb4"]},{"name":"base","origin":[14,1,1],"color":0,"uuid":"a7d981a4-5504-4000-5d7d-4bac8ce1f9ad","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["59f362e7-f1cf-cb8d-c8c2-ca7a8107668a","abb75303-04df-7b2c-1761-4631bb49c874","a12aba1b-b81b-b1f1-5c0c-62f7e4c08f02","4cafb52c-b44d-cff7-e845-c9e5981f5f2b","5bf5b54d-0c79-7dec-fae9-1642bf509458"]},{"name":"buttons","origin":[0,0,0],"color":0,"uuid":"0b92496b-e561-939a-6111-c1f4ac86ccce","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["a460ffd3-337f-a74c-34b3-6f5c3a7cfcf5","4f051020-8d89-e756-e079-a54f38276b2c","250dee2d-1235-794b-d9a6-700119d6a297","b3e200ba-b7dc-46e0-974f-dd3d2938bd06","a9bb3568-1ad9-8b14-a9a8-35be7c515f72","fa2dea41-4c24-9ae2-5d91-0fd71e56a4aa","9e829284-c571-19b6-2c82-535cb16d9128"]},"85199572-1ed6-8346-bfef-486883cc2a03"],"textures":[{"path":"/Users/blakerain/dev/bans-minecraft/utamacraft/assets/textures/digitizer.png","name":"digitizer.png","folder":"","namespace":"assets","id":"0","width":64,"height":64,"uv_width":64,"uv_height":64,"particle":true,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"52308155-7b28-5a49-ae78-07030227a498","relative_path":"../textures/digitizer.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAArxJREFUeF5j3LhpzX8GMkBf72QydDEwdHR0ENRXXV2NV82+ffsYCRpCpALG0QAYhClgx44dKPHX2NhItRhHTxiDMgWM+ADombUWHFE6ctxgesSlgBEfACM+C4z4ABjxWWBYB0BRcS6RbTRUZf5+ITRpC9C9HTAaAKMpYJBlAXt7e7J6g+QmZbIKAAYGBpqVAaMBMJoCRrPAaBlATsFEbiF47uxlcqyjWbeYkd6F4GgAIKWAL0Z38KYGnnMqNIt5mMUDmgJGA2Ckp4Arj77izQJ0GRMcyEIQFADS4hJYA+Hpyxf0GRQd6ADAlwSGfQo4cOAAWW2CgwcPUm1whPH48eN4W4KvXj8ly5GL1p+A64PFJLpBwz4AQPkbOS+jB4CRsS5ZgUvNrjFNUwAsAN4/PAf3qK2tLZw9JAIAfYyeUJSZhiYxzIdOncMCIC7QgpA2rPKwZjNNp8YIlQHUCIDE4lxwoJAbENRM8hizw4QCoKKigqTYK526CCMFDOkAILUWYFYyHV4B8JZXiqQUAFKMXgbAUgCpBoGyDC2TP8g9BGsBZEcbiq1mOP8qFC4E4yOXE9gKQVgAlKQFkxoGKOotLS2p1gCCd4cJlQHUDABYgwjWCSLEX6gqxMBTVUV1TyP7ibG+vh7cEoQ5CrnOzi/IYhATlcaIcZgAegoA1ev4ygBCHkaXB9mzdn4PfQMAvdnq4eFBdgDANMKyAK4mMXq+OJLJx9By3wosTItkj5ICghNL/uMLZeQsgqsMQHbklisP/4MKQWQzsYlRVBhQUTPB5DUaAEi9xdEUgKMaHM0CSPXziC8DsJVPQ7oQpGKBOyiNIlgLDEpXU9FRowFAxcAckkaNpoAhGW1UdPRoCqBiYA5Jo0ZTwJCMNio6ejQFUDEwh6RRoylgSEYbFR09mgKoGJhD0qjRFDAko42KjgYA45piX6qgDwoAAAAASUVORK5CYII="}],"display":{"thirdperson_righthand":{"rotation":[0,-180,0],"translation":[0,2.75,-2],"scale":[0.65,0.65,0.65]},"thirdperson_lefthand":{"translation":[0,2.75,-2],"scale":[0.65,0.65,0.65]},"firstperson_righthand":{"rotation":[5,-180,0],"translation":[0,3.75,0],"scale":[0.65,0.65,0.65]},"firstperson_lefthand":{"rotation":[5,0,0],"translation":[0,3.75,0],"scale":[0.65,0.65,0.65]},"ground":{"scale":[0.61,0.61,0.61]},"gui":{"rotation":[39,-145,9],"translation":[0.5,1.25,0],"scale":[0.72,0.69,0.71]},"head":{"translation":[0,11,0]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-4.25]}}} \ No newline at end of file diff --git a/assets/digitizer_peripheral.afdesign b/assets/digitizer_peripheral.afdesign new file mode 100644 index 0000000000000000000000000000000000000000..baf93b75dc24f468d268dcb6f67a34f86748b2c3 GIT binary patch literal 60551 zcmce+XH*nR)BxBs3>hRRL2?cfB}f=@mYhX$6p*YKV1_6tNDz<=f~W|RlZXr;86-;( z$w)?Wo|)d^z4z^&{m$8cyIbdUS9Mq2s#~{i-BbmDdMcy<40sS2V8o^Kz)hbW_$S44 z{G0z~`#1lew~|<$>s6Tm_Xt7&z$m~sh!R)k()9G^uM@=p+CDqLlRs28hLnDq9V&nW z??c_h>mdu`jRR40IYOxpq&qHCync?Y-D>8`Z$7NJrHbkH8reOdGK1HJ8w>HeI2+@e zPZq%HRe6$2KmQ+ub zxf1+(3!M;~2uKm(xN{DDgwCkTSz*i$Z@u2-Qf1vg(B17?yUY{)vWLo2XtjqSOA8q* z{Z{9_jj9ALMa;?-2BOEAUe?8RZc4h?vx~*$5 zw8KXH%ipmf`1i&y1Tg#Y@VyZ?^A5Z-v|x>v;Yp$C@3m0_|6-%3U#Mm8zZu95BsFn1 zg&QKy86xn6)?t`Cp>%8ZK=xAmxMu$Q#pFSl1}dPP#2>%RLysUAANir&CuUX)iJ@ubVeJ;ivC!at2m z3t|0%dIO9V`I+&4hxy)zSJ%=@dBq3FH15OcU5QkJa|Z}tb7m?D_q7(1G13VTbVccg zTBYs_Er$Oj_%o7{T@{8!af#$mhLT8L+Jc(G1KWW!XYeR>=Gi6#+!ee=5LxVH*Esl6*cK}23X@PR(&1JQv# zF7TyQ#f8cBXT)L=6$0;cyGQZ4pasQ8O~{8}t}d+m>l+-Wi=rVE)0_ zlF_qYHP{3P((&^OMb;X)Ei9;gizJ*F>qBW_t*d zyYZ%@Pj`t`QAzR1k%MDfTYEbv^$tRfoBFW<79-erZ@<2}q#1ji#mbn)N`?O7?)7`> zSjCr5en{V7pCRFV@Y$4~diC7UtWclM<|d2Ib;_ZNBHGvZ`{+k*Wijib&rM%oW~NfC zoSC=E+!8!J+}7&Bz6^tRqFBsnG06=u%b?;lp^3ss5zR4s^1CD_{1>U^wbU9fXoYPP zX$?A{xYGM_2)VOkcIB=v2tFwr?qx|3uX?Ny+yDWKjyBL;1+%# zr#^FXZrI4V_F`@9&b{RG__HJcUfW0uN$SbkIpnT((})SGRx08F4R5=a4b8>}-GA-k z!hOfQr9H{xvU!~{vFsVvoRc`5BJ?7;dJOCh<2$VTJfM|VYwDDcfWy7xev|0!T#Tir zx!Q%3xf?k#p`Kt{(k~%v#fFRny1%=8lJ+3)Wks*svki6!cXvWz&J`|xbBXZAnEpI#NcrLy9}vca zcTe`Arh>)}y_NH?#=W4oAw0a;fzkN5yKXW?vl8;YabUU*ry7DvWK8|ZI-6-rJ7{K2 zb0})rS_D1KQtyG%?O3uD`hCf1P-{EK3iq{*5QE~KN1b;UEE+@y%W^NKzAY+JBd zv6$eXK@~obR7N$FgtusxOzS8%>Ko;rE}Dum1}vY=RiiU}3Rte@npNgObseXdxXa7;pf{0tP~GjpV~_e4x^bsovGq%+gUsSV~ZDK4zx)Kar=(>1Jb!f_Yk{HRI~(wW)nE1N z)i)+C?u65nei%f^;1A+t!I$#87`Vfi@@4OWdZA(i12kg8r3EQ$shgW5>%+I1F2n(; znWg?6kmvc;qT8qVkIjvSozqYWAJndVVW^<_IZ0a3LtL`qd2xtNw&CBISI@HdNH0sT z9icX2fh()-9Zy$esY`Kw-aRy>OHLQ8-Q*tq^)Pje+V%bToozg!r0l&?CpZIt6c)$2 z&s^~OOmsg1Fe&>Ri8nl(S)v&5vPH|pevLq>Ycr5Z^3BbgBb<@s*TkSON|yqBZjZ%p zIR)xQYJ@`k!$>uHLdwV&GVz1561O8^Sv_hrjj^rkr1@+TqAhz&j%~#1XXvEI`}iE1 z(y}Qrri@w+4&&imp0d&YFak|~qeAsKY93up4|bIZ7%??BmvpOx7$cdq2_ETH>L((1 zoPu7J^b(V4ldc-+FcgXZS0E;8SGP!7d!4X?eOLU>P=VScrC;NPTeOXn@Uh%#5rltm zZ$I4E&WO`~W-V1a>(@*Mq&x6sepV03!SKAHbP6bX*{d0lZJhjm82(%mZ;A1b!gIC3 zg|n32MQ@pOP4&y^0-IlK0z~l-lPFhbu2EYs?j)L-q-mNn1uy|AHFZ^9q;SOIeZ!K_Bnd9tU87053rTV z^6q*wh!7MG*d$9<@#i&LEh9F^%1>E2ANZ!I_$$7*6I$iztnRCR08hB8KbrKa+Clt%qV+BgN38RHp!knC;sOHL5s zoSXhYn@V)IHncLGmd{q3l8^>n6m>#C#d}k~z}QJ0DOt}^9TrowsXk}IYk=KiFK*Q#EHMPeU{aFij2AAV-?dg>k@@*9k|9O4#z5tZo) ziaQ9apUcF&msAApHNNSu<78P20=A9%&CnDif&*OgJ=#$>NY)34NY1AL9GKC_)Qn+GuTJC9}aZd>bs3lF<&^#X*8&6u8lIU_{ z_xBF}rq344onT%jQa&kE=HQXlP7)v@sAPdlMtKgN8zV(LFVg5~3sZgc9H~CX+TyAm z@zuu0IbZ&GhE!%xOXz+dU?CA7?fh}+Ny&HyPvS^(@)x_}AJ!A2n(wRIolTR&CDW`n zmZ(NkMU%R9`kW*wiD1y3sr{n4R4E4>nh`xFWfCJnxg3PhaHX5_w0k3+d3O-H&Q+7k&~gFw0{1IOXl5*YvN1$vRWhYEg72Pm_Z$5wQj=_N*papUl~3 zgMOn@F!LK7`+pYoU&oW^eWL5gl=zDvx%74TK-2xkor&qiIQD^uHuIf0K2L;z_h#9< z9lhj6kY9PBLrASFvYpCMtesdRNkyF|NX#*oXT=B#q_D%NrDM6ayNND6h+lD*$#h{& z4mzgnv-V;a$lGWl7+@4cb}6B?9b;c&+4Q3*f}-{*6?@w70HjLv-b3Zcy_PBPI-4Qk zCH$Hw;nVNm!@IwRlMfMmU5mEFOC*>hQ(y`apSoSjuVyqiZu#Sm{|CL=a&f6T%a~_X z*sqjjI*op1zu{y`ETRsxe&Go>@3YH!w)I8fv)*gNR;<@AomjSEKj3n#X(gCl;DDkj zc=j7b{2;y(JS@tj3gS}ku zn%p@5ptY`B{Q`&OW$k6-9-BLYp5fJpYnU&7Wnh->O?1A`OXe+J=+C4jQnGNgtc`uA z%Hudyg|9=T_*n2I@xjG5A9Lx+QWQ>6r1F*Pjk>yg|XuU$|xo*m@7$S@;jEwC?KGc*!z35$TtC8oVx5+KZV&@nCQPE33a8vN=3Y zf5#FOsuan(S--=u{I-_iPv%=`n}aW{`-k?>q2WXDOIP|DtS|k{o{sp=(8D~Y`$CM{ zwuLYBR`j&#@(?;)0v(58;@lHq;;eeLcJ7U!}&9)17{xG_{oE(3=kY$t0*W`LTIVNcKq=CPmi+q~@ zCG_YyfGI6NQCfV4itqS?e0HQqPbwf07u0)w=F^vn^gyRIR!cC-Jo!F-hx(@W zG3o_I215Pfr{ooz9lepfQ;p!bB*0l_R*RVjI7eyEJDQa+F~83Y$8KYw)KU-jPO-r< zA_;RUwUl%FGOuOm(voM;PRHqiQ@#hwtse1Zc=8oH&W&0A5Sfk7UpE#>T9tfaBU>$| zjxb%)xyYZMuSl;3aS!)V1ODhUP(s?E<^BtY_ya$ZA72^$IHWXVW2?=6>U0 zdX(H{C3(C4_dI7JA1|Nmw%Oczix~1+jKVg+5}i8V8DKT46inB_Qiq?JfuYK^){EA4 ziieRSSPli6lgIkE<#CDs;MSpclQ?Pz%}Y=wpmF>8;%PQ|ZxKl^P>6Jz*OrTsLL?AuKiAOB zx^CF>E=lo(55=zbE-swTO#NDVC{5Y&51sV)Y|lOJ8ZRanM$udr)3KAEO)5_lda94X z)Y$aDZJ&%M9&F}tFm`7p~#1^ zj6x3I>78=+XOxxW1v*!IASa2TDg<}P%Gf1y&Levqk)e`O);#rq9`Z&jiNk9nXdEVh zH$rN`mkSUd!Dn48Hp`^Cd@g;H8W#Fuiot$y0HGT7iX#9}j%7dTw}D?42nY?Kx|TfN zntW=Mc__$<0-ahl>gzE6)6fyWB_OX+_wjcj75|PAeOQ6` zJBVok{*fcRj6-FD>e&g$dm2+MW%%u;rwc*z+QpoqB0c`7O#ly&7Sf-*<`nj?HJ}Uw-?2 z(?oyD-Wk?=J@s(@+U0y~c(v(s?0Y5iABY>$e=f}K;;*ABtwe&$K%SXRr?Q=L7A@M_ z18;@8jj#CwRwp zk~vGnzj~a+zyyhf=Ds()yx(6r`rEnckzFG6WlQ<*$-Uy|*IkF>UucD6U5D97ju22x zt};SmeI9lp8IIK}KvA#f!!EeOv04Qvs&#wVMWPBqeBBUsK@pBsEkIDNQ@}3x-lDEy z5XuO)VK~{vDH5wt0B1a!hhR_zsB7!_co)k^tV{ule0>)m-Nx#Kotb_FambO0Kup!gCgq`&}}!(WORjN(le z!yBf((U%BEoaUa%zvHQX=}D?ZAJa~QQ>%QRE0)kt9YJRMPNv}Xu?b5Qc+-2URCea+ z#iw(y*XWkc$y&su(@#u8WuAbf52$Qc`l&{8Zu{MA=uMLurm+ppyJKg)wYldmMKQ<; zZ?_k(gKOO+OJAde5v~lKxhGw1VBi$c!VRsb<{GT~lnH-rc$}x0iaNvn&ihX|A zW=t{7tm7X}^5IO@S)4h8*5g+j@lI!ajvW!1UdV5AuXce5G}X@FyBqN&pR?1wYAM^a zYxBNbw}lWI&_QG941(%iW3FX9X#A8l`zd&ce~-#Uek-$dmW0LslM!RNQK8-&DlVNp z+Ues*8qpinC0YAK{D+z9UENyM60@A;dnsGHJZAgG@iAZQ(kz4iC~sSu=I9?hud&jE zAuIhBYBg1?zK@j~I1gbyXS@%St5%xudNrfT%j)kh4M%bEPdQik^=|lbKY2TR{qyQJ znu)@cfz^}9z~V3dlh+_+qjd}aecpEwADaarXBym~-xG-xB0Qa2l|2&bL9o+=;<%W% zOTkuD3_$uZ0u(J#V@aZ+ijomnu4TLB7RX^@8|w4xnzXFra6Fgaiwn>8nIa4I+F=8a zKdX715t%N35wGb#zwQ85_u_SxNsL~1wY54FWRNMn5I(w?*ui_q=qux|zyvUoB&3FM zt5HYDwB~KkPvl!z6?7-hlkQK_QN~H*A_XJ0GMZ0x>A#L#q>gY&l|tLUo&MT2jKRPF2HfkLN0%h_Xny5EqU47QIpbhmAxiUJ#r$hiG**AGnqz`4(sp!o z*Y0&c=x_VJ*mq>QX%kFQmi57aX+~hL@r>`Mq3mNJi=P-FQY)v0KhLxGND7eTPuLet zzaZ1@)765tc{au0*i2p|7jRBJ$#AJucN7o~x+9vFW>;!{pE5gW8HO$Rm_;8hQbf;$ zpy0es@~}6_OPjDjQ;^YRoDyyBMJ4|J;qzXL-#W3dMKfY2FQO*ez8H9KcmckC4fitzO`snop8?| z6WC*=tWvI(UrfpLPD)++Q)q$*9&-wY($x$v;|NvG**w|@3w2M9!zd^xtU`iWR!l6S zM*R0jpRpz_QH(^|C>z!0*We!#4r|jpnzhy@e?`!1P1arF$>wr|CO&HQ*{O;$7V#Ii zh>#8x_aIlJ_Y4;FliiKwJ-kKXM=m8_n6^n2@jyeI?xgmukQ0yED4iMM?RlmZLn*x&M$=4%o)jarTHF2TtJT`YYt=Vj zjsGcPcl*TybMo7kBx$VKN6+m_nd{zf=s@+i%C$3YHfPV&(J>AtWCD4S(q-kVBc|eQ z-CYXyUB@!N*mq;adF;Zw_M+~Y?6N2^-n#xK+id*?eq!rBjn!@?+bKFwUeC4_lXl#) zbFx3M*gHtc8pWS=hm`uyo|oZhGbelU!qT*hJY`G#FURVxGK1g0?8?lg_{oqKdV?I< z>(6#7d0Dc(Wc7+IIGo;lde6P(oZ=TUyD_a&I(5K{eX_t-{4M4JlF+{ZP&g%rX-_SQ zsN5J++rSPvnJhb=X?%KK?BjJ$=#VSGqy}F%_<^Tdm|bb>&Fcr>|5zB_ij@EG6Y1n? z;7&t+m-%#~Ho#y~^p~Bhb|vK|?D)nltE7qFANYgC99jvGa%QWeA`a^`V-Bx~F9^0^ zKb_)oA}4Mv+LCuOK6W4HLhcb*rSek!lF(KCE_jPKSbPj3HKmV;wzR9KiM59VLC0&FaDkrL@@|?3&;O>nsbx$)@ zAyN^YzD)R!3aLhym~0MS)9FUP2^#7c%Gll5jvMGkU2((VF08Sfbz3^mXC9;Bb9z3C z{OZ92-qk@fIX#vK=IvYD?WD!#jV;4@B>sG6{oUe5(UYkWW9vuOCKGD8@n?UTf;z(w zquWzrJ}JI>(AB5opRNCS)aNl8AC4J|s1^ucb~}Eze6-2*Z^7M{x9nTe@^sj#045HUGGkcz3xc zA(pI%qbmiCmE~qoxy6jAq_~0q&%V``8=2wattI6vlrY#cG(+CS^M9LiHh^ zDMVRiF2(Lx#ckHzN2KR~xb%OW-rj)$)t!_~tc78MqYanpk;Kummh^%mj(>$th%aEqq8j-%SJ;9~u+zAiV9 zV#n`3fH*Eh&+v9}7H^dYFXiRpeg3ym)VEWAvQlo_zZDN2cczV2{@vDMoceQ|;-HG1 z^8Xv;=O&P)IeR3!nyQvXw|2mV%kWD%0FUCNa;{~R~93sW> z@ff5TONRcNnZaJ>Tmp;BUY^Kp$xb(Dz2J{5ODEz zzUkr^^bZUH>whq~POehQf1hh5`xB~HAp7kvIPd`%QE@SGysIV!{|g}Xe*i?em;V9q zEaGIm0+0|Bhg|_E{GS&f{v9FhKY+PB9@c*Vpp50;uK*;)#IGg;O#d%{|0V<2-nEGQ z2Y~#nLGlVfN=zJzYtR30zqlV)G&J+@ak~1k)dv9oO&^%Ul_7CP23q7K*GX`7EUV#neCe`OGgrVHF~ zmP_;C`R<4$=I0h(cx&)Ng)N8xFX393AiugZ{n@_XJGda?_(GZ8@5WgHnr90U$rxfA z3Jq_4xzL;Su#e3e)nLd@*?28JuT0TDzeN5k>w~Xs36wziJnXuD&4uLF&|hXESa~?# z#z<`gb~<#&7aO9!Om{ZI{}=owaH9-f^JCOzg|Q z#|FLXovV;F4c;^d66j+RwTN)FZ3Fik4vU%+%P1g}M7GbV;?{Bxyh9~|UHVRByr*_8 zW06-VAQdOSP}Uwe;U)=<9c>^p1QR_(KZZ?n9x zt9hmlSPl@w^MAW(7^1n#?ER@MIbg~QG7Is94sGeb6Z_mJo?mr_S48!d=ge4cr)*MM ztsg5B=6c}!4{Fv2`DsHF2^}gp%n9;_CsiK%AJQGnZ9bG-vh<){sNh7fUWuP4 z+Fs~hycD?115i*70E)t|5eH6sz;Kbb`6V@f{z0OLG63PAhwV+9_rIArWP{C;{dj24 z1HD26Z}14%tGaxijU(uPUO~pL4SFL}7%F+Cf_jocgL~@~4sKA)>7#M-QE{ z|Lr$pZJYmmXz7$bEC+-;4OjfLJjs_}CMA;ZvZ(qq>D4+CZb8lnXH=RsciO4Wy#~Nc zXS8+{K!m2xxk2baJAc}NeOPGFj~gI-s{p#d7O%Bm+d-bg2jV+Z?RoXE5kV-=?#aqu zYaPH7<9rN15B{fR(nt@27eF&&Uof4|P{7VlRwk3+lu-7)Lw`3GE08WlpHpI^1?Fs$M ze69S0GF*sV$euMeeO+-saTB+W(8)zEXln|p4qNAw5r?$C*_Nnr#aivL=+hQLKi(6N z0f`c)hg{9itBRr2a=;0zi`6}Qc+k$70^o&bFL5mc+tCo=HZaua+CMwQ-RY<%1oa3+ zxCn={#a&T9%9^#+n0jG=RE!#m_!{sJw@eM4ztWz*d&vb6<3!|wx=WV-kbj^Fd`y7^ ztLL?P<_-QKssny2kvj~T0)9_DeL{!6PIX1lvHfI!;8hpM)_I||0{%nM@{XpO2NOex z*~}AFK>QkRdpWa^<8LcMxG0djYjA1+l=u_!9Jii(cB@a-(5t;JarP+Q5UIk2M843M z9?du=9qIyy;_()qLgLkxo7Hd|Wq1e;?Z!i&WuThS^Lo=^CTEE~c(GkVd(3;8{(##z zz>O7&_!96>TO$e}yGgO%UL-7ZtxkapWF%Z*LSMo`#U^q4Z&*V@#GecBavqfX1?uMf zAe5E-(IT!yO@YxF=L-Ujix+ukLJe4NQZ^DcW+zx?buJTV)GwUJT(H_upN`e+f)xpu zcbnA#*-^GM)DukpwTiINbJr~plMha$$uQu}liV+xCkFHm#z}lEqj1Lqu69L!kNeKqm$z zbEDIA(EG5v!$k?Hcrci6TQNhnzYC&e+5x&4wEXDbE%8s?59JL{W|a(JIPPwvZV)(B zr>&fCu_sI_DdHt+n&*llKe+xZjnF|l?BFAM`WW$qRF?D5_`GNf;|uJcnA0xLB?lS) z@-&&B@ZB!%>vaj2X+6sE`_27Lx$)=u!&DDBp~Y0mG$w^2y?nRp5W0wqBDO}n zfK`$GH9OdfiFX_k8~|Pg4md~;E*(6Dsc9)oKEYWXx_ck4-FCN9XnE` z^LMq}%3T|8X9P6A{9~cL9p=^fAyv>{Xqr!NRlwY2zT7aEk+B>c%g44BI}k{?bNKR{ z{eF#|yHNi^5|P7XwklVmoW!eLbdRjDqtzoqDYAmGW5t_oYpCqBND9+yBr!=L)e^@>|Eg?_ELW;p|S33(^}`H)cr=n|JdkV>7t65Bjj+#Ix2F#mwbyJ9g~c|ov}4`X8YwaE+y zNeed9hQEojAaF&xzyN@3#a6;AJV$%tb<=bN+CI8s8-HQ>q-K%nH0FUq%}rQq#*tS3 z7qcbHgNBX@S5h8qlpPF4rc2Pu4s#%GPCl*9sOC5zWGr9N}&3DZgY&7gLnR~RAB%?ksG}8pf;=EKH77ouo zu^^2bzJ1%Rg5Pz=>A(8K{Z&skxj9&Oe_7E%nC~Qec4J& z5Ny7$=t&7Fh4O-~HW9n?J&R1fec)Yc@&uiLF&9SoFj&OtF}}q|4c|oT_uSnLyRQS8 zU`lbgwZmzjyC?Z(xuHcEk9$M_$HPkjeV%7`mDI3Y{q|tYxx+l1ddJNpr}{C(23kOj z&!2o(LIws7SAQ0b0vX5oF2>lv*0dhmGVqq;9ifTT{T8=(+$;GL@#>|`gr(P#$;(Q; zl=_lTJ}xR%=uDz7B)|_+Z#fw%qBE8jCl75}JWiFZ9UbeVRAIFgf4 z%`{#=mOcc_N8O67(tdl5I44sj$3>Z)hM;oSmLEB^D5L=NrVT{_3e#+9KKF=_tN&O* zshWs4Tn92Y0u0%f6Jw-3qonI`WfHVFQ&{{?OHcJG9ufd2aBBFywA7vg&&{onxvZGp5v58s&3=s_x3&uM3^huxE8CvIbIqn$#_+`D zPdMGoilpkj?5!Y$3}4w~!sotoaPQvvF!ml$ae0=xpc70u_SM|KE4|{I0w|utZ67xp zD8K|T8;J~i+8c2R$ys&eXK$E~sSqf@DgfQS=D^yRsjk<+_@gKMro@H}>{7H*xD z`vaQJ5S&ru{vJgMRdx&nPMXfG4_K*CeBg21GNx^qK5jS$?;#iTy%LqtGI)REX#`>m z)>@Q;&1Qfk^5AT!H=KbtS5Wm7cHgqs*hFkmDxSgHe9@+T+GTQ5pVyS-?K~gWYAJI= zo{`Moy4LF9f}+}gO11Zod5Gf~kN;&Hs$9@`a82?+uaENGzXy3EQJuewKl~ajVt^*% z`wGI+>wnB}sRH3%$&&pwK6y_MCT{y=lP8=`RuJ%}`{KWgN@Y^lAd}@N_|0aB@!FeR z2I3C@w+YaGiUesqd(iH67B|JbNWn-7-Jf52ZyfrR^Hw7D8n` z*irg7o^zY9t;6nkbQTfaVPiA7d`pc5QQ5Ya8!6*D@SyjOGU5;{U zc4G!NC4tf_%Ts9OAExuC6v&~22KC)Igc%!j;W5OacislPXvqA>MrEV$DHx7J?mS0q z@3q{k2aBR%w+|3cgP;pPaGaW=g){K+nU1=jVNAX|{ydQ3pS{c|9?O4$wADuF5X+VP z$#*g6eI``!?QZzwLg{PZGyrHOntFK(Cg9i+QpxtetX%hx8$V{wP#}L2+u-EMAwu>P zm4X^b0K|@yVT_H`a%->9Tgr;r7KKUh_$|25Ip2!LYC8HdDIx~=^_Biip`3-#L6ppa z7`q#ZvwaW$o?AE1e+A(Z>8)&WPb9tDO=Sp_w+I@8R!~R1$eV4upJ^b`NAvV(^L`VQ zFiw0v*(WWbhya`CZNAqVKQG6g%9-TsSXl*^{vkCa{!0sp{Jc#)n~!f1%rtx zfV&+sneuEVO%2$7UEOe^1$9uz-lkZB6U)Q=>aZn`Ff(?5MDy+_52T(EEQ*3eZG%s| zIzUSf5H-iDeI>CunIQ$%2x$X*!n2Y;n%G2Jb>%ATxn;$~fll<8HMk zYDG-%a;^A&pad>Eo@oO7=WzYU6_zT^(IjI+I-kKXS%*pdVKP$mM^@wnjj|*-KZhPy zN9H~!WcTBlxYc0y*n>Rs)wb{20NJ1}mPw9Jq1px$b7l(uJ-X+0=R<@?v{FK87ew|t zh@jnKO9pYf%wg7AW@`=gSN|yoa^$ExauZc#2b|mmFtR{!#=I8O;!r&FV;-`hyD0Dy zEFQD>4SD)ho!Vi+q)hL@Ul7`Rw3f1ycz-|8ZH164P;<371dvG2sa%N)PJ85H?wfi1 zF_U{{opkT^vu;@+EU4)lZi{2kTF?di_h>pcsSBMD(L?KcRKuCp1S(8o3e0W4fJbYh z?^(9G1Onq2!(~|O9rQdmV6!B;QgL{tYpYfj9#9@_h5Z&r>>Ruayjc#$^N3mnbXE6# ztt#*RCaLsgm?XT_egDQXFt7x=cR}{P0h*lbFywJ_-FZCPXTbg*cDL9YF2M2_Fl>Jg zXet6WqR3(fh+D|~FB*q2(gHpNF$BGFt+F-EYH|*;;fzT*B0q=Im&x_l{idI>^_}35UeI9yvB}T zpr>70lIw{lchlotf9yD0>KSexpYwVxdObu0_+zU&D;`VJzVFt1Oa9?oanZrt1)=c; za}Bxs@@;<#m8kz4l7VvE{0b< zS|2}rZhwGI(4LvhonDo^#4rCI`z~}g)5k5CZJO5)VFg*}#p>UH907~Ig-0?FMC7_J z63h81Vec*#-mMnHR%VZ}GbJGFRy$RsQWuRJW7$p6Z9{Udafqr1CL3%7MDAeG(D$wSInUfCB#}frK%LlnE z*CUld&R8N~WZp#qP)|p1h$c}%j!%1~TZn^rNfnzS_!}`>8p^v6hk4S-TWkvn;rhx1 zk2>=i!!>+%SpCl#XLdDxk;K7ORRL2$)hmXV*EV+fGp1yJ029%H?zdDfwob zVm;WJOw__6nKH+~4!a0pfPyV_n6m!R= zC;y`r_UOGGfMiwwwPzCeJw>WD8r?uH9{ynbWDZvLZuc{S4njKh>ZF?#NhoPy@-ja; zGXvrxewNwRaXZD*9~+)I4pD1N1Q^L_6c3>B3P6#uAmX=nELQ~fRa0v)WAeHC7V`5; z`#Agl@OcO`v@*dqYdm2BZsd&Z+_CSmhXEK3U97qabg6thItjg~=WuXRqg#4e94ki~5OlO&?y4Wnwf@G-vlJIRL{Wt}S;n5b5cic1C)B zstOzt6v}++Fr=tDc}Y~TNo*DS5%l3KEa#Z`aCZ0aSm?;JgP#}f$PRrOJAea&zkqMs zV{eP4AaHjY)bHWM+?u9{KA?+AA#zY8e?$e;EEZ|0I-~+2yf8m`jy*E#wH%boOlz>L z-kCu0hk9}}(;n0z9k`Vh#7qbHO0Omg!cweoR8Til13H8qh4}%&`Z>ok9E@>fnEXs6%J+NC4Wg;jyu?UuYt) z(D2ocF9WTK7Ce3IvQyHy|NO zR_5A5$$U_u6PD9?@Z4+U7Qc4KyT=5%k5;ci9i*PDlnqjY`mpU|DDXfKc4B*;Ua9pb zv1~}r{#hpkNb3=K`yo~OU4?(>y`h2GCjj$O15}h6K(Ki)yGwQ|_U?YJUoKI+ngdwd~(s1z{t)&`K8w=`%yu-Ljq1QJau*bjv1rjpTbFEyPK!D=$P9ILjDvL&4b7t(nd=j zCbQ#$p1wb}PI*(&pNWhP>Q{Uti1lp3KS=XXPRW2i5EAgxv8e9Is3 zu0K^}$8GHPIc<+3&)Pd)MmiVgG*UANE@OQ{@y0vz;^#LS8`$Q75=aj4oD314$I_gn@sw!PF*EA_OfEf)U8uHz+X>4$J{W`>Z7v zLbU%r_rG@HXY(TY@J z)D1N^D;q)=UTK45({TA{ppl+ysbOqAlhO5jh$u8Do*kUW^C6Ro3Nu>kr>H{T#k>3a zf}#$6S59ERl&>HK{wv^<9Z*OO{rDFl(a9{+JrBbuB<{(ndNNY7u}fCHqmmZkQ^ zct`zhsesGUudNhny=~Nypfab!qO{qe{9i7df0#&((fpJAaaIr7Tt@^929w)P9w+@C z@}`MHPC6x`gKg6P>^+vPxwCNUIKlR0g>{x$wa$PW4=+tZ@zZhQ;H>>;gsuhbU35j~znjZs{rxOJo+)LUu&`tELTl?q z?+?|mZVar|`?e%(FOh{%d69XuCJ)IpJ@e;VunO5^`x7ADHIo{}cQ)dWKA4lFJG*h_ z{oPZ0UYLfJooVGm(0=K=#Ot7;9tYwFp%uS5q@cr|kCuadpn?N=x329?c;+owK^`&+ zr+-q-a6D=g9xvT)-$zLWIQ89Xh_HT8*9f}C6R2TF?;YB4Al;)&?H@@I;DXRQezf3x z;CW&!HnWL6(o01>?d<0_-(Cbal(yb`#zb(LAcRV6MrJQioa?gaz=hvjknN;xQ~^>; zt5O*>i~ZC&-+XmwcRvrAdLNCF0|X147AOcv-_SfV<#p5TxDF1zw87>)?j0oscY{v-w|8Ay@`$!RY6F2Ibp?@5{bm53KFYZkhMwCo>+| z{l%Cz3QzE1>3z(@sA<2Q9X#&GBqUawz2)Cb43+IIhIc!Offse<&G?->0 z#+|Kx7tL#C2ZT$e!zeo3>4d(e;8$-EHBbFIL%534!I;zKZBa*{4o!OAA5fTTatwX9 zq5!xaeWGOrVxkU;yX~nU+?W&BDl4!jhlwh1MXac=RhUV{-h5uohB$+g?96 ze#1WI{FWWkY0+x{WrH0gP5MY2ZniEM9(2|Rw*`i1;Z2ISoWAjKhO!)wbzZ^gwQ`3chE+07a3a`@rIR6JW|IY62 z?(?lkmh#TL;;@)zcTVLG(^gOpvM|DvGO#G|)4Hu9klSAyzy9Xq(G9I$UfGznOe*>&mT1uc z7BJgc!H>}`lcB!qM?+<(Zp~cS;4Fz!>{3KF`4>mf_BJpg5!RRv1OBWi$abZ%=1#Rof? zn7{7cgP2Hh?+E&zy8!rptN4{TDZq;K66e~adiEa06E<_as||yNQMl+=a)>aLr}&lMFjmv03wFuN5|nw9!Zx7q*D_Z+XzemGWMFCto zCNw2*SLJl#>y$?2zBQ z5r!8nEYJm;GtpxK@5hN}b>49}QF)XxLbvy5@grfYHW7NKk76n ?hi7)cn;-tix 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%0A|Vb_jY*A`M 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

A%S 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%0AB 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%0A<=1VO%uRKT%|iWA$3-I0spgb< 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 Y<-!8H>ea>5f8V*SW1wAj-Ql1A1%?WnPXGV_ literal 0 HcmV?d00001 diff --git a/assets/textures/digitizer.png b/assets/textures/digitizer.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bbff02f0459ec034ce2873aa016e002d78ecb3 GIT binary patch literal 711 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVCwU9aSW-LlYD1K=Gl5SBZv6+ zDMechOG-)vLV{ysd&BGQ@2l-eiR@!F2t2)DAy)+3Eyf!SYuD;>?cca@VwPbapIZ%= z#1zJYrx(N9wEOp6I=aqLlHm(W^Cq4P6CW>|9jk1|%5#cALYMgk$BQ_&Jyn0FESR;! zfm`I?G2iTezkj!0SfXq2DEL4I1J4#_HmMC0Zm-tXI=6IFFdJLX4-o??2IjX7jcm$x z3@`2pSe1V>iv0EJ_3QtalM+%)Sb3H_jqiE)VCr+r<%bR&FtAc_3pRMfoZzteKr`>8 zil?PdGTyf_$_q^vn|?s+-*LZ!|nWs zZ@&0k$IJ^1&6T<3moKQa{mf|A`N$v?^V!7QFK^G6&k`9G6=ZAh;+9Ygt4Pix;cE_uj>fOhI&vU5 z)b+MV!@CvV`OhCz{mi{d;)u)APP3j{s%3xPmWP<~OCRuHJi$A)I9=bkqC!BP;RQpu zw!q%Zo^$^%=$*V!bib<+2om4^k=yiEooz!*<(H`-PK8l)_p$?r4>v!sa(dEsYMM6x ze`5oK1v6$w%=s-JD_h4bDe+Bc>4c&KEpIMN3SgdTn==79811`6N l8WOCF6GVEN&^R|38HzWpb7xR8x(ZC744$rjF6*2Ung9lhENlP( literal 0 HcmV?d00001 diff --git a/src/main/java/net/banutama/utamacraft/CCRegistration.java b/src/main/java/net/banutama/utamacraft/CCRegistration.java index ec5c50e..768d7e0 100644 --- a/src/main/java/net/banutama/utamacraft/CCRegistration.java +++ b/src/main/java/net/banutama/utamacraft/CCRegistration.java @@ -3,9 +3,11 @@ package net.banutama.utamacraft; import dan200.computercraft.api.ForgeComputerCraftAPI; import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; import net.banutama.utamacraft.block.entity.AwarenessBlockEntity; +import net.banutama.utamacraft.block.entity.DigitizerBlockEntity; import net.banutama.utamacraft.block.entity.InsolatorBlockEntity; import net.banutama.utamacraft.integrations.computercraft.PeripheralProvider; import net.banutama.utamacraft.integrations.computercraft.peripheral.AwarenessBlockPeripheral; +import net.banutama.utamacraft.integrations.computercraft.peripheral.DigitizerPeripheral; import net.banutama.utamacraft.integrations.computercraft.peripheral.InsolatorPeripheral; import net.banutama.utamacraft.integrations.computercraft.turtles.TurtlePlayerUpgrade; import net.minecraft.resources.ResourceLocation; @@ -17,7 +19,6 @@ import net.minecraftforge.registries.RegistryObject; * CC:Tweaked registration */ public class CCRegistration { - public static final DeferredRegister> TURTLE_SERIALIZERS = DeferredRegister .create(TurtleUpgradeSerialiser.REGISTRY_ID, Utamacraft.MOD_ID); @@ -33,6 +34,7 @@ public class CCRegistration { peripheralProvider.registerBlockPeripheral(InsolatorPeripheral::new, InsolatorBlockEntity.class::isInstance); peripheralProvider.registerBlockPeripheral(AwarenessBlockPeripheral::new, AwarenessBlockEntity.class::isInstance); + peripheralProvider.registerBlockPeripheral(DigitizerPeripheral::new, DigitizerBlockEntity.class::isInstance); ForgeComputerCraftAPI.registerPeripheralProvider(peripheralProvider); } diff --git a/src/main/java/net/banutama/utamacraft/Utamacraft.java b/src/main/java/net/banutama/utamacraft/Utamacraft.java index ea2a820..4f4e97c 100644 --- a/src/main/java/net/banutama/utamacraft/Utamacraft.java +++ b/src/main/java/net/banutama/utamacraft/Utamacraft.java @@ -10,6 +10,7 @@ import net.banutama.utamacraft.item.ModItems; import net.banutama.utamacraft.networking.ModMessages; import net.banutama.utamacraft.recipe.ModRecipes; +import net.banutama.utamacraft.screen.DigitizerScreen; import net.banutama.utamacraft.screen.InsolatorScreen; import net.banutama.utamacraft.screen.ModMenuTypes; import net.banutama.utamacraft.sound.ModSounds; @@ -69,6 +70,7 @@ public class Utamacraft { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { MenuScreens.register(ModMenuTypes.INSOLATOR_MENU.get(), InsolatorScreen::new); + MenuScreens.register(ModMenuTypes.DIGITIZER_MENU.get(), DigitizerScreen::new); CuriosRenderers.register(); } diff --git a/src/main/java/net/banutama/utamacraft/block/custom/DigitizerBlock.java b/src/main/java/net/banutama/utamacraft/block/custom/DigitizerBlock.java new file mode 100644 index 0000000..ea71a97 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/block/custom/DigitizerBlock.java @@ -0,0 +1,140 @@ +package net.banutama.utamacraft.block.custom; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import net.banutama.utamacraft.block.entity.DigitizerBlockEntity; +import net.banutama.utamacraft.block.entity.ModBlockEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.network.NetworkHooks; + +public class DigitizerBlock extends BaseEntityBlock { + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + public static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 16, 16); + + public DigitizerBlock() { + super(getProperties()); + registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.NORTH)); + } + + private static Block.Properties getProperties() { + return Block.Properties.of(Material.STONE).strength(3.0f).requiresCorrectToolForDrops().noOcclusion(); + } + + @Override + public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter getter, @NotNull BlockPos pos, + @NotNull CollisionContext context) { + return SHAPE; + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @Override + public @NotNull BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @SuppressWarnings("deprecation") + @Override + public @NotNull BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public @NotNull RenderShape getRenderShape(@NotNull BlockState state) { + return RenderShape.MODEL; + } + + @Override + public boolean hasAnalogOutputSignal(BlockState pState) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { + if (!(level.getBlockEntity(pos) instanceof DigitizerBlockEntity entity)) { + return 0; + } + + var stack = entity.getInventory().getStackInSlot(0); + return (int) (1 + (float) stack.getCount() / stack.getMaxStackSize() * 14); + } + + @SuppressWarnings("deprecation") + @Override + public void onRemove(BlockState state, @NotNull Level level, @NotNull BlockPos pos, BlockState newState, + boolean isMoving) { + if (!state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof DigitizerBlockEntity digitizer) { + if (level instanceof ServerLevel) { + digitizer.getInventoryOptional().ifPresent(handler -> { + for (int slot = 0; slot < handler.getSlots(); ++slot) { + Block.popResource(level, pos, handler.getStackInSlot(slot)); + } + }); + } + + level.updateNeighbourForOutputSignal(pos, this); + } + } + + super.onRemove(state, level, pos, newState, isMoving); + } + + @Override + public @NotNull InteractionResult use(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, + @NotNull Player player, @NotNull InteractionHand hand, @NotNull BlockHitResult hit) { + BlockEntity blockEntity = level.getBlockEntity(pos); + if (!(blockEntity instanceof DigitizerBlockEntity digitizerEntity)) { + return InteractionResult.PASS; + } + + if (level.isClientSide()) { + return InteractionResult.SUCCESS; + } + + if (player instanceof ServerPlayer serverPlayer) { + NetworkHooks.openScreen(serverPlayer, digitizerEntity, pos); + } + + return InteractionResult.CONSUME; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { + return ModBlockEntities.DIGITIZER.get().create(pos, state); + } +} diff --git a/src/main/java/net/banutama/utamacraft/block/custom/ModBlocks.java b/src/main/java/net/banutama/utamacraft/block/custom/ModBlocks.java index 08bd37f..22e1a2f 100644 --- a/src/main/java/net/banutama/utamacraft/block/custom/ModBlocks.java +++ b/src/main/java/net/banutama/utamacraft/block/custom/ModBlocks.java @@ -40,6 +40,7 @@ public class ModBlocks { .requiresCorrectToolForDrops())); public static final RegistryObject INSOLATOR = registerBlock("insolator", InsolatorBlock::new); public static final RegistryObject AWARENESS_BLOCK = registerBlock("awareness_block", AwarenessBlock::new); + public static final RegistryObject DIGITIZER = registerBlock("digitizer", DigitizerBlock::new); private static RegistryObject registerBlock(String name, Supplier block) { RegistryObject registered_block = BLOCKS.register(name, block); diff --git a/src/main/java/net/banutama/utamacraft/block/entity/DigitizerBlockEntity.java b/src/main/java/net/banutama/utamacraft/block/entity/DigitizerBlockEntity.java new file mode 100644 index 0000000..380f86c --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/block/entity/DigitizerBlockEntity.java @@ -0,0 +1,144 @@ +package net.banutama.utamacraft.block.entity; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import net.banutama.utamacraft.screen.DigitizerMenu; +import net.banutama.utamacraft.util.ModEnergyStorage; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.ItemStackHandler; + +public class DigitizerBlockEntity extends BlockEntity implements MenuProvider { + public static final int MATERIALZE_ENERGY_REQUIRED = 4096; + public static final int REFRESH_ENERGY_REQUIRED = 64; + public static final int ENERGY_MAX = MATERIALZE_ENERGY_REQUIRED * 20; + public static final int ENERGY_DRAW = ENERGY_MAX / (20 * 2 * 60); + + private final ItemStackHandler inventory = new ItemStackHandler(1) { + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + DigitizerBlockEntity.this.sendUpdate(); + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + return switch (slot) { + case 0 -> true; + default -> super.isItemValid(slot, stack); + }; + } + }; + + private final ModEnergyStorage energy = new ModEnergyStorage(ENERGY_MAX, ENERGY_DRAW) { + @Override + public void onEnergyChanged() { + setChanged(); + DigitizerBlockEntity.this.sendUpdate(); + } + }; + + private final LazyOptional inventoryOptional = LazyOptional.of(() -> inventory); + private final LazyOptional energyOptional = LazyOptional.of(() -> energy); + + public DigitizerBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.DIGITIZER.get(), pos, state); + } + + @Override + public @NotNull Component getDisplayName() { + return Component.translatable("block_entity.utamacraft.digitizer"); + } + + @Override + @Nullable + public AbstractContainerMenu createMenu(int containerId, @NotNull Inventory playerInventory, + @NotNull Player player) { + return new DigitizerMenu(containerId, playerInventory, this); + } + + @Nullable + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return inventoryOptional.cast(); + } + + if (cap == ForgeCapabilities.ENERGY) { + return energyOptional.cast(); + } + + return super.getCapability(cap, side); + } + + @Override + public void invalidateCaps() { + super.invalidateCaps(); + inventoryOptional.invalidate(); + energyOptional.invalidate(); + } + + @Override + protected void saveAdditional(@NotNull CompoundTag nbt) { + super.saveAdditional(nbt); + nbt.put("inventory", inventory.serializeNBT()); + nbt.put("energy", energy.serializeNBT()); + } + + @Override + public void load(@NotNull CompoundTag nbt) { + super.load(nbt); + inventory.deserializeNBT(nbt.getCompound("inventory")); + energy.deserializeNBT(nbt.get("energy")); + } + + @Override + public @NotNull CompoundTag getUpdateTag() { + CompoundTag nbt = super.getUpdateTag(); + saveAdditional(nbt); + return nbt; + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + protected void sendUpdate() { + setChanged(); + + if (this.level != null) { + this.level.sendBlockUpdated(this.worldPosition, getBlockState(), getBlockState(), Block.UPDATE_ALL); + } + } + + public ItemStackHandler getInventory() { + return inventory; + } + + public ModEnergyStorage getEnergy() { + return energy; + } + + public LazyOptional getInventoryOptional() { + return inventoryOptional; + } +} diff --git a/src/main/java/net/banutama/utamacraft/block/entity/ModBlockEntities.java b/src/main/java/net/banutama/utamacraft/block/entity/ModBlockEntities.java index 50e5dda..40ecc52 100644 --- a/src/main/java/net/banutama/utamacraft/block/entity/ModBlockEntities.java +++ b/src/main/java/net/banutama/utamacraft/block/entity/ModBlockEntities.java @@ -20,6 +20,10 @@ public class ModBlockEntities { "awareness_block", () -> BlockEntityType.Builder.of(AwarenessBlockEntity::new, ModBlocks.AWARENESS_BLOCK.get()).build(null)); + public static final RegistryObject> DIGITIZER = BLOCK_ENTITIES.register( + "digitizer_block", + () -> BlockEntityType.Builder.of(DigitizerBlockEntity::new, ModBlocks.DIGITIZER.get()).build(null)); + public static void register(IEventBus bus) { BLOCK_ENTITIES.register(bus); } diff --git a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/DigitizerPeripheral.java b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/DigitizerPeripheral.java new file mode 100644 index 0000000..d6ecc45 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/DigitizerPeripheral.java @@ -0,0 +1,272 @@ +package net.banutama.utamacraft.integrations.computercraft.peripheral; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.jetbrains.annotations.NotNull; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.MethodResult; +import net.banutama.utamacraft.block.entity.DigitizerBlockEntity; +import net.banutama.utamacraft.integrations.computercraft.peripheral.digitizer.DigitizedCache; +import net.banutama.utamacraft.integrations.computercraft.peripheral.digitizer.DigitizedItem; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.registries.ForgeRegistries; + +public class DigitizerPeripheral extends BasePeripheral { + public static final String PERIPHERAL_TYPE = "digitizier"; + + protected DigitizerPeripheral(BasePeripheralOwner owner) { + super(PERIPHERAL_TYPE, owner); + } + + public DigitizerPeripheral(BlockEntity blockEntity) { + this(new BlockEntityPeripheralOwner(blockEntity)); + } + + private DigitizerBlockEntity getDigitizer() throws LuaException { + if (!(owner instanceof BlockEntityPeripheralOwner blockOwner)) { + throw new LuaException("Owner of this DigitizerPeripheral is not a BlockEntityPeripheralOwner"); + } + + if (!(blockOwner.getBlockEntity() instanceof DigitizerBlockEntity digitizer)) { + throw new LuaException("Owner of this DigitizerPeripheral is not a DigitizerBlockEntity"); + } + + return digitizer; + } + + @LuaFunction(mainThread = true) + public final int getEnergy() throws LuaException { + return getDigitizer().getEnergy().getEnergyStored(); + } + + @LuaFunction(mainThread = true) + public final int getEnergyCapacity() throws LuaException { + return getDigitizer().getEnergy().getMaxEnergyStored(); + } + + @LuaFunction(mainThread = true) + public final int size() throws LuaException { + return getDigitizer().getInventory().getSlots(); + } + + @LuaFunction(mainThread = true) + public final int getEnergyRequiredPerItem() { + return DigitizerBlockEntity.MATERIALZE_ENERGY_REQUIRED; + } + + @LuaFunction(mainThread = true) + public final int getItemLimit(int slot) throws LuaException { + var inventory = getDigitizer().getInventory(); + if (slot < 1 || slot > inventory.getSlots()) { + throw new LuaException( + String.format("Slot %d is out of range (%d slots available)", slot, inventory.getSlots())); + } + + return inventory.getSlotLimit(slot - 1); + } + + @LuaFunction(mainThread = true) + public final @NotNull MethodResult getItemDetail(int slot) throws LuaException { + var inventory = getDigitizer().getInventory(); + if (slot < 1 || slot > inventory.getSlots()) { + throw new LuaException( + String.format("Slot %d is out of range (%d slots available)", slot, inventory.getSlots())); + } + + var stack = inventory.getStackInSlot(slot - 1); + ResourceLocation itemName = ForgeRegistries.ITEMS.getKey(stack.getItem()); + var dict = new HashMap(); + dict.put("displayName", stack.getDisplayName().getString()); + dict.put("name", itemName == null ? "unknown" : itemName.toString()); + dict.put("count", stack.getCount()); + dict.put("maxCount", stack.getMaxStackSize()); + + List> items = new ArrayList<>(); + items.add(dict); + + return MethodResult.of(items); + } + + @LuaFunction(mainThread = true) + public final int getItemLimit() throws LuaException { + return getDigitizer().getInventory().getSlotLimit(0); + } + + @LuaFunction(mainThread = true) + public final @NotNull MethodResult digitize(@NotNull IArguments arguments) throws LuaException { + var digitizer = getDigitizer(); + var gameTime = digitizer.getLevel().getGameTime(); + var inventory = digitizer.getInventory(); + var requested = arguments.optInt(0, inventory.getStackInSlot(0).getCount()); + var simulate = arguments.optBoolean(1, false); + + // Figure out how many items we're going to digitize (based on the requested + // number of items and the number of items available in the inventory slot of + // the digitizer block). We can use this to compute the cost of the + // digitization. + var available = inventory.getStackInSlot(0).getCount(); + var amount = Math.min(requested, available); + var cost = DigitizerBlockEntity.MATERIALZE_ENERGY_REQUIRED * amount; + + DigitizedItem digitized = null; + if (!simulate && amount > 0) { + // As we're not simulating, and there are actually some items that we can + // digitize, we can deduct the required energy from the digitizer blocks' energy + // store. + var energy = digitizer.getEnergy(); + if (!energy.subtractEnergy(cost)) { + throw new LuaException( + String.format("Not enough energy to digitize %d items (require %d, available %d)", + amount, cost, energy.getEnergyStored())); + } + + // Get the extracted item stack from the digitizer and store it as a new + // digitized item in the cache. We then keep the item for the result structure. + var extracted = digitizer.getInventory().extractItem(0, amount, false); + digitized = new DigitizedItem(extracted, gameTime); + DigitizedCache.getInstance(digitizer.getLevel()).put(digitized); + } + + Map result = new HashMap<>(); + result.put("simulation", simulate); + result.put("requested", requested); + result.put("available", available); + result.put("count", amount); + result.put("cost", cost); + + if (digitized != null) { + result.put("item", digitized.describeItem(gameTime)); + } + + return MethodResult.of(result); + } + + @LuaFunction(mainThread = true) + public final @NotNull MethodResult materialize(@NotNull IArguments arguments) throws LuaException { + var id = UUID.fromString(arguments.getString(0)); + var simulate = arguments.optBoolean(1, false); + var digitizer = getDigitizer(); + var level = digitizer.getLevel(); + var cache = DigitizedCache.getInstance(level); + var gameTime = level.getGameTime(); + + // See if we can find the digitised item, and make sure that it has not expired. + var digitizedItem = cache.take(id); + if (digitizedItem == null || digitizedItem.isExpired(gameTime)) { + throw new LuaException(String.format("No digitized item with ID %s", id.toString())); + } + + // Get the digitizer's inventory and simulate the insertion of the digitized + // item. This will tell us the actual number of items we will materialize, from + // which we can calculate the cost of the materialization. + var inventory = digitizer.getInventory(); + var remainder = inventory.insertItem(0, digitizedItem.itemStack, true); + var materialized = digitizedItem.itemStack.getCount() - remainder.getCount(); + var cost = DigitizerBlockEntity.MATERIALZE_ENERGY_REQUIRED * materialized; + + if (!simulate) { + // The user doesn't want to simulate the materialization, so actually deduct the + // energy needed from the digitizer blocks' energy store and then insert the + // items into the digitizer's inventory. Any remaining items remain digitized. + var energy = digitizer.getEnergy(); + if (!energy.subtractEnergy(cost)) { + throw new LuaException( + String.format("Not enough energy to materialize %d items (require %d, available %d)", + materialized, cost, energy.getEnergyStored())); + } + + remainder = inventory.insertItem(0, digitizedItem.itemStack, false); + if (remainder.getCount() > 0) { + // There's still some remainder, so put it back in the cache. Before we do that, + // we need to update the count to reflect the remainder and refresh the expiry + // time. + digitizedItem.itemStack = remainder; + digitizedItem.refresh(gameTime); + cache.put(digitizedItem); + } + } else { + // We're simulating, so put the digitized item back in the cache. + cache.put(digitizedItem); + } + + // Build up information for the result. + var result = new HashMap(); + result.put("simulation", simulate); + result.put("materialized", materialized); + result.put("cost", cost); + result.put("remainder", remainder.getCount()); + result.put("item", digitizedItem.describeItem(gameTime)); + + return MethodResult.of(result); + } + + @LuaFunction(mainThread = true) + public final @NotNull MethodResult query(@NotNull IArguments arguments) throws LuaException { + var id = UUID.fromString(arguments.getString(0)); + var level = getDigitizer().getLevel(); + var cache = DigitizedCache.getInstance(level); + var gameTime = level.getGameTime(); + + var digitizedItem = cache.get(id); + if (digitizedItem != null && !digitizedItem.isExpired(gameTime)) { + return MethodResult.of(digitizedItem.describeItem(gameTime)); + } else { + return MethodResult.of(null, "No digitized item with ID " + id.toString()); + } + } + + @LuaFunction(mainThread = true) + public final @NotNull MethodResult refresh(@NotNull IArguments arguments) throws LuaException { + var id = UUID.fromString(arguments.getString(0)); + var simulate = arguments.optBoolean(1, false); + var level = getDigitizer().getLevel(); + var cache = DigitizedCache.getInstance(level); + var gameTime = level.getGameTime(); + + var digitizedItem = cache.get(id); + if (digitizedItem != null && !digitizedItem.isExpired(gameTime)) { + var cost = DigitizerBlockEntity.REFRESH_ENERGY_REQUIRED * digitizedItem.itemStack.getCount(); + if (!simulate) { + var energy = getDigitizer().getEnergy(); + if (!energy.subtractEnergy(cost)) { + throw new LuaException( + String.format("Not enough energy to refresh %d items (require %d, available %d)", + digitizedItem.itemStack.getCount(), cost, energy.getEnergyStored())); + } + + digitizedItem.refresh(gameTime); + } + + var result = new HashMap(); + result.put("simulation", simulate); + result.put("cost", cost); + result.put("item", digitizedItem.describeItem(gameTime)); + + return MethodResult.of(result); + } else { + return MethodResult.of(null, "No digitized item with ID " + id.toString()); + } + } + + @LuaFunction(mainThread = true) + public final @NotNull MethodResult list() throws LuaException { + var level = getDigitizer().getLevel(); + var cache = DigitizedCache.getInstance(level); + var gameTime = level.getGameTime(); + + var result = new ArrayList>(); + cache.forEach(item -> { + result.add(item.describeItem(gameTime)); + }); + + return MethodResult.of(result); + } +} diff --git a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/digitizer/DigitizedCache.java b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/digitizer/DigitizedCache.java new file mode 100644 index 0000000..eb73936 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/digitizer/DigitizedCache.java @@ -0,0 +1,117 @@ +package net.banutama.utamacraft.integrations.computercraft.peripheral.digitizer; + +import java.util.HashMap; +import java.util.UUID; +import java.util.function.Consumer; + +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; + +import com.mojang.logging.LogUtils; + +import net.banutama.utamacraft.Utamacraft; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.saveddata.SavedData; + +public class DigitizedCache extends SavedData { + private final HashMap cache = new HashMap<>(); + + private static DigitizedCache instance; + private static final Logger LOGGER = LogUtils.getLogger(); + + @NotNull + public static DigitizedCache getInstance(Level level) { + if (!(level instanceof ServerLevel serverLevel)) { + throw new RuntimeException("Cannot get DigitizedCache for non-server level"); + } + + if (instance != null) { + return instance; + } + + var storage = serverLevel.getServer().overworld().getDataStorage(); + instance = storage.computeIfAbsent(DigitizedCache::load, DigitizedCache::create, + String.format("%s_DigitizedCache", Utamacraft.MOD_ID)); + instance.collect(serverLevel); + + return instance; + } + + @NotNull + public static DigitizedCache create() { + return new DigitizedCache(); + } + + public void put(@NotNull DigitizedItem item) { + cache.put(item.id, item); + setDirty(); + } + + public DigitizedItem get(UUID id) { + return cache.get(id); + } + + public DigitizedItem take(UUID id) { + var item = cache.remove(id); + + if (item != null) { + setDirty(); + } + + return item; + } + + public void forEach(Consumer consumer) { + cache.values().forEach(consumer::accept); + } + + @NotNull + public static DigitizedCache load(CompoundTag tag) { + DigitizedCache cache = new DigitizedCache(); + if (tag.contains("items") && tag.get("items") instanceof ListTag) { + ((ListTag) tag.get("items")).forEach(item -> { + var digitizedItem = new DigitizedItem((CompoundTag) item); + cache.cache.put(digitizedItem.id, digitizedItem); + }); + } + + return cache; + } + + @Override + @NotNull + public CompoundTag save(CompoundTag tag) { + ListTag items = new ListTag(); + cache.values().forEach(digitizedItem -> { + CompoundTag item = new CompoundTag(); + digitizedItem.serialize(item); + items.add(item); + }); + + tag.put("items", items); + return tag; + } + + public void collect(Level level) { + var gameTime = level.getGameTime(); + var count = cache.size(); + var iterator = cache.entrySet().iterator(); + + iterator.forEachRemaining(item -> { + if (item.getValue().isExpired(gameTime)) { + iterator.remove(); + } + }); + + var remaining = cache.size(); + if (count != remaining) { + LOGGER.info( + String.format("Collected %d expired digitized items, %d remaining", count - remaining, remaining)); + } + + setDirty(); + } +} diff --git a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/digitizer/DigitizedItem.java b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/digitizer/DigitizedItem.java new file mode 100644 index 0000000..2684407 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/digitizer/DigitizedItem.java @@ -0,0 +1,77 @@ +package net.banutama.utamacraft.integrations.computercraft.peripheral.digitizer; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.registries.ForgeRegistries; + +public class DigitizedItem { + // Lifetime of a digitized item (in ticks): 20 TPS, 60 minutes, 20 + // minutes-per-day, 5 days + public final static long LIFETIME = 20 * 60 * 20 * 5; + + public UUID id; + public ItemStack itemStack; + public long createdAt; + public long expiresAt; + + public DigitizedItem(ItemStack itemStack, long gameTime) { + this.id = UUID.randomUUID(); + this.itemStack = itemStack; + this.createdAt = gameTime; + this.expiresAt = gameTime + LIFETIME; + } + + public DigitizedItem(CompoundTag tag) { + id = tag.getUUID("id"); + itemStack = ItemStack.of((CompoundTag) tag.get("itemStack")); + createdAt = tag.getLong("createdAt"); + expiresAt = tag.getLong("expiresAt"); + } + + public void serialize(CompoundTag tag) { + tag.putUUID("id", id); + tag.put("itemStack", itemStack.serializeNBT()); + tag.putLong("createdAt", createdAt); + tag.putLong("expiresAt", expiresAt); + } + + public long age(long gameTime) { + return gameTime - createdAt; + } + + public long remaining(long gameTime) { + return Math.max(0, expiresAt - gameTime); + } + + public boolean isExpired(long gameTime) { + return expiresAt <= gameTime; + } + + public void refresh(long gameTime) { + expiresAt = gameTime + LIFETIME; + } + + public void describeItem(Map map, long gameTime) { + var itemName = ForgeRegistries.ITEMS.getKey(itemStack.getItem()); + + map.put("id", id.toString()); + map.put("name", itemName == null ? "unknown" : itemName.toString()); + map.put("count", itemStack.getCount()); + map.put("maxCount", itemStack.getMaxStackSize()); + map.put("createdAt", createdAt); + map.put("expiresAt", expiresAt); + map.put("age", age(gameTime)); + map.put("isExpired", isExpired(gameTime)); + map.put("remainingTime", remaining(gameTime)); + } + + public Map describeItem(long gameTime) { + var map = new HashMap(); + describeItem(map, gameTime); + return map; + } +} diff --git a/src/main/java/net/banutama/utamacraft/item/BaseItem.java b/src/main/java/net/banutama/utamacraft/item/BaseItem.java index 118a4a1..d634bfb 100644 --- a/src/main/java/net/banutama/utamacraft/item/BaseItem.java +++ b/src/main/java/net/banutama/utamacraft/item/BaseItem.java @@ -1,10 +1,26 @@ package net.banutama.utamacraft.item; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + import org.jetbrains.annotations.NotNull; +import dan200.computercraft.shared.Registry; + public abstract class BaseItem extends Item { public BaseItem(@NotNull Properties properties) { super(properties.tab(ModCreativeModeTab.TAB)); } + + public static void createTurtleStacks(@NotNull NonNullList stack, @NotNull ResourceLocation peripheral) { + ItemStack turtleStack = new ItemStack(Registry.ModItems.TURTLE_NORMAL.get()); + turtleStack.getOrCreateTag().putString("RightUpgrade", peripheral.toString()); + stack.add(turtleStack); + + ItemStack advancedTurtleStack = new ItemStack(Registry.ModItems.TURTLE_ADVANCED.get()); + advancedTurtleStack.getOrCreateTag().putString("RightUpgrade", peripheral.toString()); + stack.add(advancedTurtleStack); + } } diff --git a/src/main/java/net/banutama/utamacraft/item/PlayerPeripheralItem.java b/src/main/java/net/banutama/utamacraft/item/PlayerPeripheralItem.java index 5ba14cb..79c8ded 100644 --- a/src/main/java/net/banutama/utamacraft/item/PlayerPeripheralItem.java +++ b/src/main/java/net/banutama/utamacraft/item/PlayerPeripheralItem.java @@ -1,6 +1,5 @@ package net.banutama.utamacraft.item; -import dan200.computercraft.shared.Registry; import net.banutama.utamacraft.CCRegistration; import net.minecraft.core.NonNullList; import net.minecraft.world.item.CreativeModeTab; @@ -18,13 +17,7 @@ public class PlayerPeripheralItem extends BaseItem { super.fillItemCategory(group, items); if (allowedIn(group)) { - ItemStack turtle_stack = new ItemStack(Registry.ModItems.TURTLE_NORMAL.get()); - turtle_stack.getOrCreateTag().putString("RightUpgrade", CCRegistration.ID.PLAYER_TURTLE.toString()); - items.add(turtle_stack); - - ItemStack advanced_turtle_stack = new ItemStack(Registry.ModItems.TURTLE_ADVANCED.get()); - advanced_turtle_stack.getOrCreateTag().putString("RightUpgrade", CCRegistration.ID.PLAYER_TURTLE.toString()); - items.add(advanced_turtle_stack); + createTurtleStacks(items, CCRegistration.ID.PLAYER_TURTLE); } } } diff --git a/src/main/java/net/banutama/utamacraft/screen/BaseAbstractContainerMenu.java b/src/main/java/net/banutama/utamacraft/screen/BaseAbstractContainerMenu.java new file mode 100644 index 0000000..9c91c04 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/screen/BaseAbstractContainerMenu.java @@ -0,0 +1,78 @@ +package net.banutama.utamacraft.screen; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; + +public abstract class BaseAbstractContainerMenu extends AbstractContainerMenu { + private static final int HOTBAR_SLOT_COUNT = 9; + + private static final int PLAYER_INVENTORY_ROW_COUNT = 3; + private static final int PLAYER_INVENTORY_COLUMN_COUNT = 9; + private static final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_ROW_COUNT * PLAYER_INVENTORY_COLUMN_COUNT; + + private static final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT; + private static final int TILE_ENTITY_START_SLOT = VANILLA_SLOT_COUNT; + + protected BaseAbstractContainerMenu(MenuType type, int id) { + super(type, id); + } + + protected abstract int getTileEntitySlotCount(); + + @Override + public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { + Slot source = slots.get(index); + if (!source.hasItem()) { + return ItemStack.EMPTY; + } + + ItemStack sourceStack = source.getItem(); + ItemStack sourceCopy = sourceStack.copy(); + + if (index < VANILLA_SLOT_COUNT) { + // This is a vanilla container slot, so merge the stack into the tile inventory. + if (!moveItemStackTo(sourceStack, TILE_ENTITY_START_SLOT, TILE_ENTITY_START_SLOT + getTileEntitySlotCount(), + false)) { + return ItemStack.EMPTY; + } + } else if (index < TILE_ENTITY_START_SLOT + getTileEntitySlotCount()) { + // This is a tile-entity slot, so merge the stack into the players inventory. + if (!moveItemStackTo(sourceStack, 0, VANILLA_SLOT_COUNT, false)) { + return ItemStack.EMPTY; + } + } else { + return ItemStack.EMPTY; + } + + // If the stack size is zero, the entire stack was moved, so set the slot + // contents to null. + if (sourceStack.getCount() == 0) { + source.set(ItemStack.EMPTY); + } else { + source.setChanged(); + } + + source.onTake(player, sourceStack); + return sourceCopy; + } + + protected void addPlayerInventory(Inventory inventory) { + for (int row = 0; row < PLAYER_INVENTORY_ROW_COUNT; ++row) { + for (int col = 0; col < PLAYER_INVENTORY_COLUMN_COUNT; ++col) { + this.addSlot(new Slot(inventory, col + row * 9 + 9, 8 + col * 18, 82 + row * 18)); + } + } + } + + protected void addPlayerHotbar(Inventory inventory) { + for (int slot = 0; slot < HOTBAR_SLOT_COUNT; ++slot) { + this.addSlot(new Slot(inventory, slot, 8 + slot * 18, 140)); + } + } +} diff --git a/src/main/java/net/banutama/utamacraft/screen/DigitizerMenu.java b/src/main/java/net/banutama/utamacraft/screen/DigitizerMenu.java new file mode 100644 index 0000000..858ab8b --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/screen/DigitizerMenu.java @@ -0,0 +1,58 @@ +package net.banutama.utamacraft.screen; + +import java.util.Objects; + +import net.banutama.utamacraft.block.custom.ModBlocks; +import net.banutama.utamacraft.block.entity.DigitizerBlockEntity; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.items.SlotItemHandler; + +public class DigitizerMenu extends BaseAbstractContainerMenu { + public final DigitizerBlockEntity blockEntity; + private final ContainerLevelAccess levelAccess; + + // Client constructor + public DigitizerMenu(int id, Inventory inventory, FriendlyByteBuf extraData) { + this(id, inventory, inventory.player.level.getBlockEntity(extraData.readBlockPos())); + } + + // Server constructor + public DigitizerMenu(int id, Inventory inventory, BlockEntity entity) { + super(ModMenuTypes.DIGITIZER_MENU.get(), id); + + if (entity instanceof DigitizerBlockEntity digitizer) { + checkContainerSize(inventory, 1); + this.levelAccess = ContainerLevelAccess.create(Objects.requireNonNull(entity.getLevel()), + entity.getBlockPos()); + this.blockEntity = digitizer; + + addPlayerHotbar(inventory); + addPlayerInventory(inventory); + + this.blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).ifPresent(handler -> { + this.addSlot(new SlotItemHandler(handler, 0, 26, 8)); + }); + } else { + throw new IllegalArgumentException("Block entity must be a DigitizerBlockEntity"); + } + } + + public DigitizerBlockEntity getBlockEntity() { + return blockEntity; + } + + @Override + public boolean stillValid(Player player) { + return stillValid(levelAccess, player, ModBlocks.DIGITIZER.get()); + } + + @Override + protected int getTileEntitySlotCount() { + return 1; + } +} diff --git a/src/main/java/net/banutama/utamacraft/screen/DigitizerScreen.java b/src/main/java/net/banutama/utamacraft/screen/DigitizerScreen.java new file mode 100644 index 0000000..4e5dd6d --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/screen/DigitizerScreen.java @@ -0,0 +1,78 @@ +package net.banutama.utamacraft.screen; + +import java.util.List; +import java.util.Optional; + +import org.jetbrains.annotations.NotNull; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; + +import net.banutama.utamacraft.Utamacraft; +import net.banutama.utamacraft.screen.utils.MouseUtils; +import net.banutama.utamacraft.screen.utils.TooltipUtils; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraftforge.energy.EnergyStorage; + +public class DigitizerScreen extends AbstractContainerScreen { + private static final ResourceLocation TEXTURE = new ResourceLocation(Utamacraft.MOD_ID, + "textures/gui/digitizer_gui.png"); + + public DigitizerScreen(DigitizerMenu menu, Inventory inventory, Component component) { + super(menu, inventory, component); + inventoryLabelY += 5; + } + + @Override + protected void init() { + super.init(); + + leftPos = (width - imageWidth) / 2; + topPos = (height - imageHeight) / 2; + } + + @Override + protected void renderBg(@NotNull PoseStack stack, float partialTick, int mouseX, int mouseY) { + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + RenderSystem.setShaderTexture(0, TEXTURE); + + blit(stack, leftPos, topPos, 0, 0, imageWidth, imageHeight); + renderEnergy(stack, leftPos + 8, topPos + 8); + } + + @Override + protected void renderLabels(@NotNull PoseStack pPoseStack, int pMouseX, int pMouseY) { + int x = (width - imageWidth) / 2; + int y = (height - imageHeight) / 2; + + if (MouseUtils.isMouseOver(pMouseX, pMouseY, x + 7, y + 7, 11, 62)) { + EnergyStorage energy = menu.getBlockEntity().getEnergy(); + List components = TooltipUtils.getEnergyTooltip(energy.getEnergyStored(), + energy.getMaxEnergyStored()); + renderTooltip(pPoseStack, components, Optional.empty(), pMouseX - x, pMouseY - y); + } + } + + private void renderEnergy(@NotNull PoseStack stack, int x, int y) { + EnergyStorage energy = menu.getBlockEntity().getEnergy(); + if (energy.getEnergyStored() <= 0 || energy.getMaxEnergyStored() <= 0) { + return; + } + + final int ENERGY_HEIGHT = 60; + int stored = (int) (ENERGY_HEIGHT * ((float) energy.getEnergyStored() / (float) energy.getMaxEnergyStored())); + fillGradient(stack, x, y + (ENERGY_HEIGHT - stored), x + 9, y + 60, 0xffb51500, 0xff600b00); + } + + @Override + public void render(@NotNull PoseStack stack, int mouseX, int mouseY, float delta) { + renderBackground(stack); + super.render(stack, mouseX, mouseY, delta); + renderTooltip(stack, mouseX, mouseY); + } +} diff --git a/src/main/java/net/banutama/utamacraft/screen/InsolatorMenu.java b/src/main/java/net/banutama/utamacraft/screen/InsolatorMenu.java index d02c3c6..f4ad2dc 100644 --- a/src/main/java/net/banutama/utamacraft/screen/InsolatorMenu.java +++ b/src/main/java/net/banutama/utamacraft/screen/InsolatorMenu.java @@ -6,7 +6,6 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.*; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.items.SlotItemHandler; @@ -14,7 +13,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Objects; -public class InsolatorMenu extends AbstractContainerMenu { +public class InsolatorMenu extends BaseAbstractContainerMenu { public final InsolatorBlockEntity blockEntity; private final ContainerLevelAccess levelAccess; @@ -29,7 +28,8 @@ public class InsolatorMenu extends AbstractContainerMenu { if (entity instanceof InsolatorBlockEntity insolator) { checkContainerSize(inventory, 3); - this.levelAccess = ContainerLevelAccess.create(Objects.requireNonNull(entity.getLevel()), entity.getBlockPos()); + this.levelAccess = ContainerLevelAccess.create(Objects.requireNonNull(entity.getLevel()), + entity.getBlockPos()); this.blockEntity = insolator; addPlayerHotbar(inventory); @@ -54,62 +54,8 @@ public class InsolatorMenu extends AbstractContainerMenu { return stillValid(levelAccess, player, ModBlocks.INSOLATOR.get()); } - private static final int HOTBAR_SLOT_COUNT = 9; - - private static final int PLAYER_INVENTORY_ROW_COUNT = 3; - private static final int PLAYER_INVENTORY_COLUMN_COUNT = 9; - private static final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_ROW_COUNT * PLAYER_INVENTORY_COLUMN_COUNT; - - private static final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT; - private static final int TILE_ENTITY_START_SLOT = VANILLA_SLOT_COUNT; - private static final int TILE_ENTITY_SLOT_COUNT = 3; - @Override - public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { - Slot source = slots.get(index); - if (!source.hasItem()) { - return ItemStack.EMPTY; - } - - ItemStack sourceStack = source.getItem(); - ItemStack sourceCopy = sourceStack.copy(); - - if (index < VANILLA_SLOT_COUNT) { - // This is a vanilla container slot, so merge the stack into the tile inventory. - if (!moveItemStackTo(sourceStack, TILE_ENTITY_START_SLOT, TILE_ENTITY_START_SLOT + TILE_ENTITY_SLOT_COUNT, false)) { - return ItemStack.EMPTY; - } - } else if (index < TILE_ENTITY_START_SLOT + TILE_ENTITY_SLOT_COUNT) { - // This is a tile-entity slot, so merge the stack into the players inventory. - if (!moveItemStackTo(sourceStack, 0, VANILLA_SLOT_COUNT, false)) { - return ItemStack.EMPTY; - } - } else { - return ItemStack.EMPTY; - } - - // If the stack size is zero, the entire stack was moved, so set the slot contents to null. - if (sourceStack.getCount() == 0) { - source.set(ItemStack.EMPTY); - } else { - source.setChanged(); - } - - source.onTake(player, sourceStack); - return sourceCopy; - } - - private void addPlayerInventory(Inventory inventory) { - for (int row = 0; row < PLAYER_INVENTORY_ROW_COUNT; ++row) { - for (int col = 0; col < PLAYER_INVENTORY_COLUMN_COUNT; ++col) { - this.addSlot(new Slot(inventory, col + row * 9 + 9, 8 + col * 18, 82 + row * 18)); - } - } - } - - private void addPlayerHotbar(Inventory inventory) { - for (int slot = 0; slot < HOTBAR_SLOT_COUNT; ++slot) { - this.addSlot(new Slot(inventory, slot, 8 + slot * 18, 140)); - } + protected int getTileEntitySlotCount() { + return 3; } } diff --git a/src/main/java/net/banutama/utamacraft/screen/ModMenuTypes.java b/src/main/java/net/banutama/utamacraft/screen/ModMenuTypes.java index 477eaa6..6f165b9 100644 --- a/src/main/java/net/banutama/utamacraft/screen/ModMenuTypes.java +++ b/src/main/java/net/banutama/utamacraft/screen/ModMenuTypes.java @@ -11,13 +11,16 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class ModMenuTypes { - public static final DeferredRegister> MENUS = - DeferredRegister.create(ForgeRegistries.MENU_TYPES, Utamacraft.MOD_ID); + public static final DeferredRegister> MENUS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, + Utamacraft.MOD_ID); - public static final RegistryObject> INSOLATOR_MENU = - registerMenuType("insolator_menu", InsolatorMenu::new); + public static final RegistryObject> INSOLATOR_MENU = registerMenuType("insolator_menu", + InsolatorMenu::new); + public static final RegistryObject> DIGITIZER_MENU = registerMenuType("digitizer_menu", + DigitizerMenu::new); - private static RegistryObject> registerMenuType(String name, IContainerFactory factory) { + private static RegistryObject> registerMenuType(String name, + IContainerFactory factory) { return MENUS.register(name, () -> IForgeMenuType.create(factory)); } diff --git a/src/main/java/net/banutama/utamacraft/util/ModEnergyStorage.java b/src/main/java/net/banutama/utamacraft/util/ModEnergyStorage.java index eebb670..963e3c8 100644 --- a/src/main/java/net/banutama/utamacraft/util/ModEnergyStorage.java +++ b/src/main/java/net/banutama/utamacraft/util/ModEnergyStorage.java @@ -36,5 +36,15 @@ public abstract class ModEnergyStorage extends EnergyStorage { return energy; } + public boolean subtractEnergy(int energy) { + if (this.energy >= energy) { + this.energy -= energy; + this.onEnergyChanged(); + return true; + } + + return false; + } + public abstract void onEnergyChanged(); } diff --git a/src/main/resources/assets/utamacraft/blockstates/digitizer.json b/src/main/resources/assets/utamacraft/blockstates/digitizer.json new file mode 100644 index 0000000..8274078 --- /dev/null +++ b/src/main/resources/assets/utamacraft/blockstates/digitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "utamacraft:block/digitizer" + }, + "facing=east": { + "model": "utamacraft:block/digitizer", + "y": 90 + }, + "facing=south": { + "model": "utamacraft:block/digitizer", + "y": 180 + }, + "facing=west": { + "model": "utamacraft:block/digitizer", + "y": 270 + } + } +} diff --git a/src/main/resources/assets/utamacraft/lang/en_us.json b/src/main/resources/assets/utamacraft/lang/en_us.json index 3e0008a..5ef3a14 100644 --- a/src/main/resources/assets/utamacraft/lang/en_us.json +++ b/src/main/resources/assets/utamacraft/lang/en_us.json @@ -1,18 +1,21 @@ { "block.utamacraft.awareness_block": "Awareness Block", "block.utamacraft.deepslate_tungsten_ore": "Deepslate Tungsten Ore", + "block.utamacraft.digitizer": "Digitizer", "block.utamacraft.ethereal_glass": "Ethereal Glass", "block.utamacraft.ethereal_glass_tinted": "Tinted Ethereal Glass", "block.utamacraft.insolator": "Insolator", "block.utamacraft.tungsten_block": "Tungsten Block", "block.utamacraft.tungsten_ore": "Tungsten Ore", "block_entity.utamacraft.awareness_block": "Awareness Block", + "block_entity.utamacraft.digitizer": "Digitizer", "block_entity.utamacraft.insolator": "Insolator", "gui.utamacraft.insolator.dump": "Dump", "gui.utamacraft.insolator.dump.tooltip": "Dump the fluid contents of the Insolator", "gui.utamacraft.insolator.dump.tooltip.empty": "No fluid contents to dump from Insolator", "item.utamacraft.awareness_block": "Awareness Block", "item.utamacraft.bulb": "Bulb", + "item.utamacraft.digitizer": "Digitizer", "item.utamacraft.fiber_glass": "Fiberglass", "item.utamacraft.fire_ward": "Fire Ward Necklace", "item.utamacraft.insolator": "Insolator", diff --git a/src/main/resources/assets/utamacraft/models/block/digitizer.json b/src/main/resources/assets/utamacraft/models/block/digitizer.json new file mode 100644 index 0000000..d24836e --- /dev/null +++ b/src/main/resources/assets/utamacraft/models/block/digitizer.json @@ -0,0 +1,283 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utamacraft:block/digitizer", + "particle": "utamacraft:block/digitizer" + }, + "elements": [ + { + "name": "tray_right", + "from": [2, 3, 12], + "to": [3, 13, 13], + "rotation": { "angle": 22.5, "axis": "x", "origin": [6, 8, 10] }, + "faces": { + "north": { "uv": [3.25, 9, 3.5, 11.5], "texture": "#0" }, + "east": { "uv": [3.5, 9, 3.75, 11.5], "texture": "#0" }, + "south": { "uv": [3.75, 9, 4, 11.5], "texture": "#0" }, + "west": { "uv": [4, 9, 4.25, 11.5], "texture": "#0" }, + "up": { "uv": [10, 10, 9.75, 9.75], "texture": "#0" }, + "down": { "uv": [0.25, 10, 0, 10.25], "texture": "#0" } + } + }, + { + "name": "tray_bottom", + "from": [2, 3, 13], + "to": [10, 13, 14], + "rotation": { "angle": 22.5, "axis": "x", "origin": [6, 8, 10] }, + "faces": { + "north": { "uv": [0, 7, 2, 9.5], "texture": "#0" }, + "east": { "uv": [9, 0, 9.25, 2.5], "texture": "#0" }, + "south": { "uv": [7, 0, 9, 2.5], "texture": "#0" }, + "west": { "uv": [2, 9, 2.25, 11.5], "texture": "#0" }, + "up": { "uv": [8.75, 9.25, 6.75, 9], "texture": "#0" }, + "down": { "uv": [10.75, 9, 8.75, 9.25], "texture": "#0" } + } + }, + { + "name": "tray_left", + "from": [9, 3, 12], + "to": [10, 13, 13], + "rotation": { "angle": 22.5, "axis": "x", "origin": [6, 8, 10] }, + "faces": { + "north": { "uv": [2.25, 9, 2.5, 11.5], "texture": "#0" }, + "east": { "uv": [2.5, 9, 2.75, 11.5], "texture": "#0" }, + "south": { "uv": [2.75, 9, 3, 11.5], "texture": "#0" }, + "west": { "uv": [3, 9, 3.25, 11.5], "texture": "#0" }, + "up": { "uv": [9.75, 10, 9.5, 9.75], "texture": "#0" }, + "down": { "uv": [10, 9.5, 9.75, 9.75], "texture": "#0" } + } + }, + { + "name": "lower", + "from": [1, 0, 1], + "to": [15, 1, 15], + "rotation": { "angle": 0, "axis": "z", "origin": [14, 1, 1] }, + "faces": { + "north": { "uv": [7.75, 7.5, 11.25, 7.75], "texture": "#0" }, + "east": { "uv": [6.75, 8, 10.25, 8.25], "texture": "#0" }, + "south": { "uv": [6.75, 8.25, 10.25, 8.5], "texture": "#0" }, + "west": { "uv": [6.75, 8.5, 10.25, 8.75], "texture": "#0" }, + "up": { "uv": [7, 3.5, 3.5, 0], "texture": "#0" }, + "down": { "uv": [7, 3.5, 3.5, 7], "texture": "#0" } + } + }, + { + "name": "left", + "from": [14, 1, 1], + "to": [15, 2, 15], + "rotation": { "angle": 0, "axis": "z", "origin": [14, 1, 1] }, + "faces": { + "north": { "uv": [1.75, 9.5, 2, 9.75], "texture": "#0" }, + "east": { "uv": [6.25, 7.75, 9.75, 8], "texture": "#0" }, + "south": { "uv": [4.75, 9.5, 5, 9.75], "texture": "#0" }, + "west": { "uv": [7.75, 6.75, 11.25, 7], "texture": "#0" }, + "up": { "uv": [5.25, 11.25, 5, 7.75], "texture": "#0" }, + "down": { "uv": [5.5, 7.75, 5.25, 11.25], "texture": "#0" } + } + }, + { + "name": "upper", + "from": [1, 2, 1], + "to": [15, 5, 15], + "rotation": { "angle": 0, "axis": "z", "origin": [14, 1, 1] }, + "faces": { + "north": { "uv": [2, 7, 5.5, 7.75], "texture": "#0" }, + "east": { "uv": [7, 2.5, 10.5, 3.25], "texture": "#0" }, + "south": { "uv": [7, 3.25, 10.5, 4], "texture": "#0" }, + "west": { "uv": [7, 4, 10.5, 4.75], "texture": "#0" }, + "up": { "uv": [3.5, 3.5, 0, 0], "texture": "#0" }, + "down": { "uv": [3.5, 3.5, 0, 7], "texture": "#0" } + } + }, + { + "name": "right", + "from": [1, 1, 1], + "to": [2, 2, 15], + "rotation": { "angle": 0, "axis": "z", "origin": [14, 1, 1] }, + "faces": { + "north": { "uv": [4.75, 9.75, 5, 10], "texture": "#0" }, + "east": { "uv": [7.75, 7, 11.25, 7.25], "texture": "#0" }, + "south": { "uv": [9.75, 8.75, 10, 9], "texture": "#0" }, + "west": { "uv": [7.75, 7.25, 11.25, 7.5], "texture": "#0" }, + "up": { "uv": [6.5, 11.5, 6.25, 8], "texture": "#0" }, + "down": { "uv": [6.75, 8, 6.5, 11.5], "texture": "#0" } + } + }, + { + "name": "back", + "from": [2, 1, 14], + "to": [14, 2, 15], + "rotation": { "angle": 0, "axis": "z", "origin": [14, 1, 1] }, + "faces": { + "north": { "uv": [2, 8.25, 5, 8.5], "texture": "#0" }, + "east": { "uv": [9.25, 9.75, 9.5, 10], "texture": "#0" }, + "south": { "uv": [2, 8.5, 5, 8.75], "texture": "#0" }, + "west": { "uv": [9.75, 9.25, 10, 9.5], "texture": "#0" }, + "up": { "uv": [5, 9, 2, 8.75], "texture": "#0" }, + "down": { "uv": [9.75, 8.75, 6.75, 9], "texture": "#0" } + } + }, + { + "name": "button_6", + "from": [2, 5, 2], + "to": [4, 6, 4], + "faces": { + "north": { "uv": [4.25, 9.5, 4.75, 9.75], "texture": "#0" }, + "east": { "uv": [9.75, 0.5, 10.25, 0.75], "texture": "#0" }, + "south": { "uv": [9.75, 0.75, 10.25, 1], "texture": "#0" }, + "west": { "uv": [1, 9.75, 1.5, 10], "texture": "#0" }, + "up": { "uv": [9.75, 1, 9.25, 0.5], "texture": "#0" }, + "down": { "uv": [9.75, 1, 9.25, 1.5], "texture": "#0" } + } + }, + { + "name": "button_5", + "from": [5, 5, 2], + "to": [7, 6, 4], + "faces": { + "north": { "uv": [9.75, 1, 10.25, 1.25], "texture": "#0" }, + "east": { "uv": [9.75, 1.25, 10.25, 1.5], "texture": "#0" }, + "south": { "uv": [1.5, 9.75, 2, 10], "texture": "#0" }, + "west": { "uv": [9.75, 1.5, 10.25, 1.75], "texture": "#0" }, + "up": { "uv": [9.75, 2, 9.25, 1.5], "texture": "#0" }, + "down": { "uv": [9.75, 2, 9.25, 2.5], "texture": "#0" } + } + }, + { + "name": "button_4", + "from": [8, 5, 2], + "to": [10, 6, 4], + "faces": { + "north": { "uv": [9.75, 1.75, 10.25, 2], "texture": "#0" }, + "east": { "uv": [9.75, 2, 10.25, 2.25], "texture": "#0" }, + "south": { "uv": [9.75, 2.25, 10.25, 2.5], "texture": "#0" }, + "west": { "uv": [4.25, 9.75, 4.75, 10], "texture": "#0" }, + "up": { "uv": [7.25, 9.75, 6.75, 9.25], "texture": "#0" }, + "down": { "uv": [7.75, 9.25, 7.25, 9.75], "texture": "#0" } + } + }, + { + "name": "button_1", + "from": [8, 5, 5], + "to": [10, 6, 7], + "faces": { + "north": { "uv": [7.75, 9.75, 8.25, 10], "texture": "#0" }, + "east": { "uv": [9.75, 7.75, 10.25, 8], "texture": "#0" }, + "south": { "uv": [8.25, 9.75, 8.75, 10], "texture": "#0" }, + "west": { "uv": [8.75, 9.75, 9.25, 10], "texture": "#0" }, + "up": { "uv": [0.5, 10, 0, 9.5], "texture": "#0" }, + "down": { "uv": [1, 9.5, 0.5, 10], "texture": "#0" } + } + }, + { + "name": "button_2", + "from": [2, 5, 8], + "to": [10, 6, 11], + "faces": { + "north": { "uv": [9.25, 0, 11.25, 0.25], "texture": "#0" }, + "east": { "uv": [6.25, 7.5, 7, 7.75], "texture": "#0" }, + "south": { "uv": [9.25, 0.25, 11.25, 0.5], "texture": "#0" }, + "west": { "uv": [1, 9.5, 1.75, 9.75], "texture": "#0" }, + "up": { "uv": [9.75, 6, 7.75, 5.25], "texture": "#0" }, + "down": { "uv": [9.75, 6, 7.75, 6.75], "texture": "#0" } + } + }, + { + "name": "button_2", + "from": [5, 5, 5], + "to": [7, 6, 7], + "faces": { + "north": { "uv": [9.75, 6.25, 10.25, 6.5], "texture": "#0" }, + "east": { "uv": [9.75, 6.5, 10.25, 6.75], "texture": "#0" }, + "south": { "uv": [6.75, 9.75, 7.25, 10], "texture": "#0" }, + "west": { "uv": [7.25, 9.75, 7.75, 10], "texture": "#0" }, + "up": { "uv": [9.25, 9.75, 8.75, 9.25], "texture": "#0" }, + "down": { "uv": [9.75, 9.25, 9.25, 9.75], "texture": "#0" } + } + }, + { + "name": "button_3", + "from": [2, 5, 5], + "to": [4, 6, 7], + "faces": { + "north": { "uv": [9.75, 5.25, 10.25, 5.5], "texture": "#0" }, + "east": { "uv": [9.75, 5.5, 10.25, 5.75], "texture": "#0" }, + "south": { "uv": [9.75, 5.75, 10.25, 6], "texture": "#0" }, + "west": { "uv": [9.75, 6, 10.25, 6.25], "texture": "#0" }, + "up": { "uv": [8.25, 9.75, 7.75, 9.25], "texture": "#0" }, + "down": { "uv": [8.75, 9.25, 8.25, 9.75], "texture": "#0" } + } + }, + { + "name": "receiver", + "from": [11, 5, 2], + "to": [14, 7, 14], + "faces": { + "north": { "uv": [6.25, 7, 7, 7.5], "texture": "#0" }, + "east": { "uv": [2, 7.75, 5, 8.25], "texture": "#0" }, + "south": { "uv": [4.25, 9, 5, 9.5], "texture": "#0" }, + "west": { "uv": [7.75, 4.75, 10.75, 5.25], "texture": "#0" }, + "up": { "uv": [7.75, 7.75, 7, 4.75], "texture": "#0" }, + "down": { "uv": [6.25, 7, 5.5, 10], "texture": "#0" } + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [0, -180, 0], + "translation": [0, 2.75, -2], + "scale": [0.65, 0.65, 0.65] + }, + "thirdperson_lefthand": { + "translation": [0, 2.75, -2], + "scale": [0.65, 0.65, 0.65] + }, + "firstperson_righthand": { + "rotation": [5, -180, 0], + "translation": [0, 3.75, 0], + "scale": [0.65, 0.65, 0.65] + }, + "firstperson_lefthand": { + "rotation": [5, 0, 0], + "translation": [0, 3.75, 0], + "scale": [0.65, 0.65, 0.65] + }, + "ground": { + "scale": [0.61, 0.61, 0.61] + }, + "gui": { + "rotation": [39, -145, 9], + "translation": [0.5, 1.25, 0], + "scale": [0.72, 0.69, 0.71] + }, + "head": { + "translation": [0, 11, 0] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -4.25] + } + }, + "groups": [ + { + "name": "paper_tray", + "origin": [14, 1, 1], + "color": 0, + "children": [0, 1, 2] + }, + { + "name": "base", + "origin": [14, 1, 1], + "color": 0, + "children": [3, 4, 5, 6, 7] + }, + { + "name": "buttons", + "origin": [0, 0, 0], + "color": 0, + "children": [8, 9, 10, 11, 12, 13, 14] + }, + 15 + ] +} diff --git a/src/main/resources/assets/utamacraft/models/item/digitizer.json b/src/main/resources/assets/utamacraft/models/item/digitizer.json new file mode 100644 index 0000000..96b9e2f --- /dev/null +++ b/src/main/resources/assets/utamacraft/models/item/digitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "utamacraft:block/digitizer" +} diff --git a/src/main/resources/assets/utamacraft/textures/block/digitizer.png b/src/main/resources/assets/utamacraft/textures/block/digitizer.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bbff02f0459ec034ce2873aa016e002d78ecb3 GIT binary patch literal 711 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVCwU9aSW-LlYD1K=Gl5SBZv6+ zDMechOG-)vLV{ysd&BGQ@2l-eiR@!F2t2)DAy)+3Eyf!SYuD;>?cca@VwPbapIZ%= z#1zJYrx(N9wEOp6I=aqLlHm(W^Cq4P6CW>|9jk1|%5#cALYMgk$BQ_&Jyn0FESR;! zfm`I?G2iTezkj!0SfXq2DEL4I1J4#_HmMC0Zm-tXI=6IFFdJLX4-o??2IjX7jcm$x z3@`2pSe1V>iv0EJ_3QtalM+%)Sb3H_jqiE)VCr+r<%bR&FtAc_3pRMfoZzteKr`>8 zil?PdGTyf_$_q^vn|?s+-*LZ!|nWs zZ@&0k$IJ^1&6T<3moKQa{mf|A`N$v?^V!7QFK^G6&k`9G6=ZAh;+9Ygt4Pix;cE_uj>fOhI&vU5 z)b+MV!@CvV`OhCz{mi{d;)u)APP3j{s%3xPmWP<~OCRuHJi$A)I9=bkqC!BP;RQpu zw!q%Zo^$^%=$*V!bib<+2om4^k=yiEooz!*<(H`-PK8l)_p$?r4>v!sa(dEsYMM6x ze`5oK1v6$w%=s-JD_h4bDe+Bc>4c&KEpIMN3SgdTn==79811`6N l8WOCF6GVEN&^R|38HzWpb7xR8x(ZC744$rjF6*2Ung9lhENlP( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utamacraft/textures/gui/digitizer_gui.png b/src/main/resources/assets/utamacraft/textures/gui/digitizer_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa08f20248cf2389d934bd132e4ec6a4683c513 GIT binary patch literal 20057 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 Date: Mon, 29 Jan 2024 14:51:37 +0000 Subject: [PATCH 2/2] fix: various improvements to digitizer --- .../block/entity/DigitizerBlockEntity.java | 6 +- .../peripheral/DigitizerPeripheral.java | 99 ++++++++++++++----- 2 files changed, 78 insertions(+), 27 deletions(-) diff --git a/src/main/java/net/banutama/utamacraft/block/entity/DigitizerBlockEntity.java b/src/main/java/net/banutama/utamacraft/block/entity/DigitizerBlockEntity.java index 380f86c..cfa2d82 100644 --- a/src/main/java/net/banutama/utamacraft/block/entity/DigitizerBlockEntity.java +++ b/src/main/java/net/banutama/utamacraft/block/entity/DigitizerBlockEntity.java @@ -26,10 +26,10 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.ItemStackHandler; public class DigitizerBlockEntity extends BlockEntity implements MenuProvider { - public static final int MATERIALZE_ENERGY_REQUIRED = 4096; + public static final int MATERIALZE_ENERGY_REQUIRED = 1024; public static final int REFRESH_ENERGY_REQUIRED = 64; - public static final int ENERGY_MAX = MATERIALZE_ENERGY_REQUIRED * 20; - public static final int ENERGY_DRAW = ENERGY_MAX / (20 * 2 * 60); + public static final int ENERGY_MAX = MATERIALZE_ENERGY_REQUIRED * 64; + public static final int ENERGY_DRAW = ENERGY_MAX / (20 * 10); private final ItemStackHandler inventory = new ItemStackHandler(1) { @Override diff --git a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/DigitizerPeripheral.java b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/DigitizerPeripheral.java index d6ecc45..2aabafa 100644 --- a/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/DigitizerPeripheral.java +++ b/src/main/java/net/banutama/utamacraft/integrations/computercraft/peripheral/DigitizerPeripheral.java @@ -17,6 +17,7 @@ import net.banutama.utamacraft.integrations.computercraft.peripheral.digitizer.D import net.banutama.utamacraft.integrations.computercraft.peripheral.digitizer.DigitizedItem; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.registries.ForgeRegistries; public class DigitizerPeripheral extends BasePeripheral { @@ -58,10 +59,15 @@ public class DigitizerPeripheral extends BasePeripheral { } @LuaFunction(mainThread = true) - public final int getEnergyRequiredPerItem() { + public final int getDigitizationCost() { return DigitizerBlockEntity.MATERIALZE_ENERGY_REQUIRED; } + @LuaFunction(mainThread = true) + public final int getRefreshCost() { + return DigitizerBlockEntity.REFRESH_ENERGY_REQUIRED; + } + @LuaFunction(mainThread = true) public final int getItemLimit(int slot) throws LuaException { var inventory = getDigitizer().getInventory(); @@ -82,6 +88,10 @@ public class DigitizerPeripheral extends BasePeripheral { } var stack = inventory.getStackInSlot(slot - 1); + if (stack.getCount() == 0) { + return MethodResult.of(); + } + ResourceLocation itemName = ForgeRegistries.ITEMS.getKey(stack.getItem()); var dict = new HashMap(); dict.put("displayName", stack.getDisplayName().getString()); @@ -95,11 +105,6 @@ public class DigitizerPeripheral extends BasePeripheral { return MethodResult.of(items); } - @LuaFunction(mainThread = true) - public final int getItemLimit() throws LuaException { - return getDigitizer().getInventory().getSlotLimit(0); - } - @LuaFunction(mainThread = true) public final @NotNull MethodResult digitize(@NotNull IArguments arguments) throws LuaException { var digitizer = getDigitizer(); @@ -123,7 +128,7 @@ public class DigitizerPeripheral extends BasePeripheral { // store. var energy = digitizer.getEnergy(); if (!energy.subtractEnergy(cost)) { - throw new LuaException( + return MethodResult.of(null, String.format("Not enough energy to digitize %d items (require %d, available %d)", amount, cost, energy.getEnergyStored())); } @@ -152,8 +157,9 @@ public class DigitizerPeripheral extends BasePeripheral { @LuaFunction(mainThread = true) public final @NotNull MethodResult materialize(@NotNull IArguments arguments) throws LuaException { var id = UUID.fromString(arguments.getString(0)); - var simulate = arguments.optBoolean(1, false); + var simulate = arguments.optBoolean(2, false); var digitizer = getDigitizer(); + var inventory = digitizer.getInventory(); var level = digitizer.getLevel(); var cache = DigitizedCache.getInstance(level); var gameTime = level.getGameTime(); @@ -161,16 +167,47 @@ public class DigitizerPeripheral extends BasePeripheral { // See if we can find the digitised item, and make sure that it has not expired. var digitizedItem = cache.take(id); if (digitizedItem == null || digitizedItem.isExpired(gameTime)) { - throw new LuaException(String.format("No digitized item with ID %s", id.toString())); + return MethodResult.of(null, "No digitized item with ID " + id.toString()); } - // Get the digitizer's inventory and simulate the insertion of the digitized - // item. This will tell us the actual number of items we will materialize, from - // which we can calculate the cost of the materialization. - var inventory = digitizer.getInventory(); - var remainder = inventory.insertItem(0, digitizedItem.itemStack, true); - var materialized = digitizedItem.itemStack.getCount() - remainder.getCount(); - var cost = DigitizerBlockEntity.MATERIALZE_ENERGY_REQUIRED * materialized; + // This is the number of items available in the digitized item stack. + var available = digitizedItem.itemStack.getCount(); + + // The requested number of items to materialize defaults to the number + // available. + var requested = arguments.optInt(1, available); + requested = Math.min(requested, available); + + // Build an ItemStack that contains the number of items that we request to + // materialize. We're just going to use a copy for now. When we actually do the + // materialization we'll adjust the digitized item stack. + var remaining = available - requested; + var materializing = digitizedItem.itemStack.copy(); + materializing.setCount(requested); + + // Simulate the insertion of the `materializing` stack into the inventory slot. + // This gives us back an ItemStack that describes the items that were not + // materialized. + var unmaterialized = inventory.insertItem(0, materializing, true); + + // Expand the number of items in the unmaterialized stack by those remaining in + // the digitized item stack. + unmaterialized.grow(remaining); + + // The actual number of items that would be materialized is the requested amount + // minus the number of items that were unmaterialized. + var actual = requested - unmaterialized.getCount(); + + // The materialized cost is the number of items that were actually materialized + // times the cost per item. + var materializeCost = DigitizerBlockEntity.MATERIALZE_ENERGY_REQUIRED * actual; + + // The refresh cost is the number of items that were not materialized times the + // refresh cost per item. + var refreshCost = DigitizerBlockEntity.REFRESH_ENERGY_REQUIRED * unmaterialized.getCount(); + + // The final cost is the sum of the materialized cost and the refresh cost. + var cost = materializeCost + refreshCost; if (!simulate) { // The user doesn't want to simulate the materialization, so actually deduct the @@ -178,19 +215,29 @@ public class DigitizerPeripheral extends BasePeripheral { // items into the digitizer's inventory. Any remaining items remain digitized. var energy = digitizer.getEnergy(); if (!energy.subtractEnergy(cost)) { - throw new LuaException( + return MethodResult.of(null, String.format("Not enough energy to materialize %d items (require %d, available %d)", - materialized, cost, energy.getEnergyStored())); + requested, cost, energy.getEnergyStored())); } - remainder = inventory.insertItem(0, digitizedItem.itemStack, false); - if (remainder.getCount() > 0) { + // Now we do the actual materialization: insert the items in the `materializing` + // stack into the inventory slot. The result is the unmaterialized items. + unmaterialized = inventory.insertItem(0, materializing, false); + + // Expand the number of items in the unmaterialized stack by those remaining in + // the digitized item stack. + unmaterialized.grow(remaining); + + if (unmaterialized.getCount() > 0) { // There's still some remainder, so put it back in the cache. Before we do that, // we need to update the count to reflect the remainder and refresh the expiry // time. - digitizedItem.itemStack = remainder; + digitizedItem.itemStack = unmaterialized; digitizedItem.refresh(gameTime); cache.put(digitizedItem); + } else { + // The digitized item stack was depleted: no items remain unmaterialized. + digitizedItem.itemStack.setCount(0); } } else { // We're simulating, so put the digitized item back in the cache. @@ -200,9 +247,13 @@ public class DigitizerPeripheral extends BasePeripheral { // Build up information for the result. var result = new HashMap(); result.put("simulation", simulate); - result.put("materialized", materialized); + result.put("requested", requested); + result.put("available", available); + result.put("materialized", actual); + result.put("remainder", unmaterialized.getCount()); result.put("cost", cost); - result.put("remainder", remainder.getCount()); + result.put("materializeCost", materializeCost); + result.put("refreshCost", refreshCost); result.put("item", digitizedItem.describeItem(gameTime)); return MethodResult.of(result); @@ -237,7 +288,7 @@ public class DigitizerPeripheral extends BasePeripheral { if (!simulate) { var energy = getDigitizer().getEnergy(); if (!energy.subtractEnergy(cost)) { - throw new LuaException( + return MethodResult.of(null, String.format("Not enough energy to refresh %d items (require %d, available %d)", digitizedItem.itemStack.getCount(), cost, energy.getEnergyStored())); } -- 2.45.2