From 06e5f220bd120fdedf8070425ebf9d497d46a479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Ryb=C3=A1rsky?= Date: Sun, 23 Jun 2024 22:51:41 +0200 Subject: [PATCH] Edit assets --- assets/Casing.aseprite | Bin 0 -> 384 bytes assets/Controller.aseprite | Bin 0 -> 1860 bytes assets/Drive.aseprite | Bin 0 -> 1791 bytes assets/DriveContainer.aseprite | Bin 0 -> 568 bytes assets/Head.aseprite | Bin 0 -> 962 bytes assets/Platter.aseprite | Bin 0 -> 1142 bytes assets/Tiers.aseprite | Bin 0 -> 1054 bytes build.gradle | 13 +++ gradle.properties | 2 +- .../brn/server_storage/ServerStorage.java | 31 ++++- .../HardDriveContainerBlockEntity.java | 13 +++ .../blocks/HardDriveContainerBlock.java | 109 ++++++++++++++++++ .../server_storage/blocks/StorageBlock.java | 16 +-- .../items/HardDriveContainerBlockItem.java | 41 +++++++ .../server_storage/items/HardDriveItem.java | 43 +++++++ .../items/StorageBlockItem.java | 9 +- .../brn/server_storage/lib/CraftingEntry.java | 33 +++++- .../server_storage/lib/MyCraftingRecipe.java | 2 +- .../systems/brn/server_storage/lib/Util.java | 59 ++++++---- .../screens/CraftingScreen.java | 3 +- .../server_storage/screens/StorageScreen.java | 2 +- .../blockstates/drive_container.json | 7 ++ .../assets/serverstorage/lang/en_us.json | 3 +- .../serverstorage/models/drive_container.json | 6 + .../serverstorage/models/item/drive.json | 6 + .../models/item/drive_container.json | 3 + 26 files changed, 353 insertions(+), 48 deletions(-) create mode 100644 assets/Casing.aseprite create mode 100644 assets/Controller.aseprite create mode 100644 assets/Drive.aseprite create mode 100644 assets/DriveContainer.aseprite create mode 100644 assets/Head.aseprite create mode 100644 assets/Platter.aseprite create mode 100644 assets/Tiers.aseprite create mode 100644 src/main/java/systems/brn/server_storage/blockentities/HardDriveContainerBlockEntity.java create mode 100644 src/main/java/systems/brn/server_storage/blocks/HardDriveContainerBlock.java create mode 100644 src/main/java/systems/brn/server_storage/items/HardDriveContainerBlockItem.java create mode 100644 src/main/java/systems/brn/server_storage/items/HardDriveItem.java create mode 100644 src/main/resources/assets/serverstorage/blockstates/drive_container.json create mode 100644 src/main/resources/assets/serverstorage/models/drive_container.json create mode 100644 src/main/resources/assets/serverstorage/models/item/drive.json create mode 100644 src/main/resources/assets/serverstorage/models/item/drive_container.json diff --git a/assets/Casing.aseprite b/assets/Casing.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..31bb7067ba0f19a4e4b043592d34156bb9f9cfd3 GIT binary patch literal 384 zcmZo*WMFu(l#xMzL4ZMlfsuiMA%y`MC^0aC1i|vi;#6ZZGBEu5$O5*Ng@J)VjDdlH zT>)$*k`)CE3=AwF*C{bDFeoXQxN6v>SsM0-S>G>IySX6k-QiikKbg&Z8j!Wmz-oxbC|Kra-Ieq)j|NsAIuif5K*PfY`6&V&(=G3*u$mnKx z^7ZOn{nNd=@(qq3Ki<*NArG=off>mK|3U6z@JXypEmAP_W?*1oRbXHMDfrI>Q^my~ zz)&&g^@|rj>i_&G+_QsuRhvM=%H`9nChS%4$*<0Q$e(m}@v?e$t$PzL^DHc3Wr#c- GUIhU6{Z-ol literal 0 HcmV?d00001 diff --git a/assets/Controller.aseprite b/assets/Controller.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..fcece121a1ee97f9da641b4b6c6833253c668954 GIT binary patch literal 1860 zcmZ=^XJB}+l#M}vL4ZMlfsuiMA%y`MC@?UB1i|vi;?!avVq{?W^^py1D;om?gBSw? z1G@s)N+c_?7#J8>K(13@U|>*EFmcteNwYNU53{~ssCIKf+PlNEet$BX`7|JFpMm+5 zJnu~XAa4~T8%ulp5`%=M=)8x?v;W7ReRBHtpa1{=&tAK|rLH|QD=RWAsLZKrjgisK z@Z{^&yZWblb>$n#gKSb@MzZ@q$VCi3iIu5E3WoTljY=697+67WWME+U&jd3B6t)#} ze*ZoBrvB5L|Nj?%mYd}BzwOmu-!@4FTLmdKw=PM8y$W`lWIXQN+sC5scC9gaD>4`F>&7D{6v;IHWGXKVx=CgG{m-RROo$^G!=!?>9Muu|-*h=cbmNGK1Ft8w5 z%E7?FP%)=CJpIReKZgCesXy!2w>|xTRx8cm?~cBw|1a94?XdCSS@P`SV)y^=@9pId zD_=TC^6(sW|9OA*m%bKjvp8Wh;otM~^PA5ye4O~T`N=tPj-OfYYbcXC+`nB_vgO@-{=2# zB?WjU+0Q!8GoAe<^UC&>j3=AF9C+d{>TtyIl|z<8m1B}Yb@$>)GqG$i}qa**lKbP>YUZGu5@BgCCr~mg# zP5a;fI^w{icB<{^U_~(C`=#d%$wwdKiWfuO=kUQcxVWvXq^X{1kvl2cT6i%?35&iD!27y#_ z2I;7>uHS>f+hv5k4Jr!%@8E0Ve`3)5Q-KFk24u*wG#~L7HTZ8Ie+J}xww3$C4>Osu syX?GSb0HQyhm;e9( literal 0 HcmV?d00001 diff --git a/assets/Drive.aseprite b/assets/Drive.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..c1572712d852d6c2ba29fc5b1f69f64bcfce85c6 GIT binary patch literal 1791 zcmey*#=!7kDGP%F7&0<2Fr+Xb18xRJkRXEqg8;HH)!3Vu85n+jWC7dC!oa}b#l*nC zuE2z5z5!T($-vRY$(2cffgv}qq$tSUNg*OKN`d`60~-S~L_=b7ae-q%fDee5m!Fpk zqEYd;YYbrjT-F7dg(^po$CX@ARKmc(@P~nc!6+rQIGKTg(SU)0A-lY!poD>eaSj6m zgGf>~n7skSE(!^9W?*1E!oa}5mkwcH0kM-H>?a_0QAA`E0|Vn1kot5mn~4L&PJ*yy zKRDfvmM3c;1dC8@c^3Z8k%`9%f!MTsS;pg4rM z59}vFh(b_^X&72sT4;hrsYrn00b<(;IR z3=BWN|Nbw_z`($w08MmYBSD&38GI5eQ;Y61FfgzxFfgz(FfjZFCtQ#UF$M*OiaBqm z1#%r$5OCpt^sq{z-e%^#gVj?6y0+x3NWD?!TNXOY$-d3w$nzAF)laK-PG2766{~eX zYx2%7b}biFQy$k`*{)|kx#*m}S$f#IDU+Aj>U}-?B+SgNy2#<(iJG1F{o{UqkKVbs zc*2fLF|%r-E$5`(UGqlyj>O^}{Yy)aNI8DGm+!Q#*zfIjqlxB9?C-W8z53?i=0C?@ zOs_uvZTsJI5B^=MOgy=$@Al)Uug~`tuPpnx+w;7wm-5?+HIr}TZR|Jj@PsDzxlq z?0EMjNHf)gMJMXa)9;!~6&0nQKi>EH>9e4s_w+0}pQ^vlcmq{3&Po|LcOzIe^->3iE}7l(b{xUDZjIl}PR@(Hp|2ETKCo}4}5 z`0H(*dpw!c*9w(U1L zwbzUs--Q|8qxqIl_q9*V%DeQ)!B#~%E<^z)&~uF~6&etmVm_Ic6UN#&C#R!?!g_Ax?ze$kCu{W zSM83Id$)8>@pPFDcT)8B_8XRg{QLFpwB4RdrG`&n3gs#L z?z~rD|L6DGI~OfIVlwr7_pOyVw<#~|n_!-o=bhu1tde>aS_Q%sZ&$DX7CrNX^hD(QlM} LE(vd1E_E6J6VNC> literal 0 HcmV?d00001 diff --git a/assets/DriveContainer.aseprite b/assets/DriveContainer.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..c8486bc4ce2f1ca5ff57c3ef359574d26296ae6d GIT binary patch literal 568 zcmcCuVqkc%l!-xrL4ZMlfsuiMA%y`MC@?UB1i|vi;?!cNGcqvz`p5>hm5qUcL5zWc zfn5P?C6X0c3=9k`AlE4{Ffb@7n7C@#q*)sFhgsh*RJ*w#?cL#7zdxDHd>W9o&%k_2 zo_D5xkhhAFjitSPi9teBbl$_{+5h9uJ~@5+&;S4bXRqDfQrDiDl@%ElROZyR#>nVq zc=Gk?UH#L&y7CR=K{hEcBia2Q&46GnGGB7awXM!053fqb~ z-S)qq)Z4ULRDS#a|6(P-=d#3KCogg@a(^qowf;)oDFX(sI}grAfDK?|U}9iGGJuDH zm!V>gb?xu-|1W3EVB}{wnVyz<(9rNz;mm&Tyl=PO{!g57tL$+xzu9i~+4Y{L^C$e? g_;dP{FAeAa-e6#0Pt-69WB>&-BRH5rflIMN0ryRgX#fBK literal 0 HcmV?d00001 diff --git a/assets/Head.aseprite b/assets/Head.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..9ffaae7f974a60856a9d3922163e6a3a66eb2b70 GIT binary patch literal 962 zcmX@a%)szqDGP%Dg8+j910w?iLka^jP+(vL34-O3#i_+kU}RwU^^pZ^D+>bygBSw? z1G@s)N+c_?7#J8>K(13@U|>*EFmcteNwYNU53{~ssCIKf+PlNEet$BX`7|JFpMm+5 zJnu~XAa4~T8%ulp5`%=M=)8x?v;W7ReRBHtpa1{=&tAK|rLH|QD=RWAsLZKrjgisK z@Z{^&yZWblb>$n#gKSb@MzZ@q$VCi3iIu5E3WggQ7#LVVj$mM5_|F7W1q!^1IiIVl zKif06KCl;v`TM^&r+8089>c@d{qYlW**x@lf|J-z$QlW!PfTsQvg+x7$B2h7!VJ`o z^Bi2HwL?;=@LGB9o^Y1Lt42vyp0qMrd2 zzKr1T1%+xo9uKUYbdZ-pfrEMOOu-p#6K}XZ4Rr32?^03u@PgCTc=lq+ZIXhqdv{;% zx$rMRVRzNEMp=P3GOMgypKMswb3til?I+(z|2+K}zaQQGz-;@9OZoeUrB=@CR@XiG zdvpKCPx*`j7B_nrp*d#~9_Rf2|NUS+8`r`51(Nmqk4?_y^UzbygBSw? z1G@s)N+c_?7#J8>K(13@U|>*EFmcteNwYNU53{~ssCIKf+PlNEet$BX`7|JFpMm+5 zJnu~XAa4~T8%ulp5`%=M=)8x?v;W7ReRBHtpa1{=&tAK|rLH|QD=RWAsLZKrjgisK z@Z{^&yZWblb>$n#gKSb@MzZ@q$VCi3iIu5E3WiS@7#LVVj$mM5_|F7W1q!^1IjzAP zc@H@VoaUOiB7p1J!lmgPr*a&<-CL*36O?Fd;?2mo93W#fN%i#3-*cWk`ugqf-uw4U zE8og}zahhaasDv}(JijF$$fvHe{FxYG46Ho-+jzC{I(zXxi0noG%<;D(_7~iPYljH z*eGWl(C=jbJdl4KQ%u9}IkzjXJd$DkzU7K=yV$$PpR)_EhTmDe^!$!jn%Ca-X3srs zdv4Lsk2_~F7u}6N-@k8R`iiNH&yIhsx_?Igy#LgNr{ZhV8EO}tw~5sL7r*GyUxx6h zpJ%LL07VHSI7&bfF$a&Irv^9j9#G);oaX;Q%Ky{s+}J~hvI29Q9E}A`?^(^u73ybduV~*dM zZmK!i?)#0MQFj_wRc?Gf-}(*Tmnr5BdLrpxR@Ke9z3kn__+!^@$p2jNc;^+FRm;~) zN>59QeSErZp6zF4`#ST_>FXbfm;T^0ZLj}a71rzP8~>y3qmul;^H=O1|30SqDL<~K zNAx)B!U#FdPiUTagvS%Dlf1bO8}PUk&n=t&#%mYn(g{wR`JRZWen0+Hl8r6#Xq)4< zrx(-LBxbCC|4Hk0_1YVD(Vp{6E1$pDIbIhcm#*{RU03&iOJ7mB!#^W=_Rg0tZao*_ zxRvqwr+Ice#pBc0yt-Jo=k9B}PaB`8@K1=}>h1lqsXyXKOLu7RM*H{oi+{v@jeV(I zA-m4B^vl0%TYGlGpU+2F( W{pp`l)txYzue105W^lH{E5JDb literal 0 HcmV?d00001 diff --git a/assets/Tiers.aseprite b/assets/Tiers.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..f9a306bfa1154f37062abe8a01fd74f5b7f0af44 GIT binary patch literal 1054 zcmb1RVPJT$l!ZZnL4ZMlfsuiMA%y`MC@?UB1i|vi;?!bKXJlab^^pZ^D+>bygBSw? z1G@s)N+c_?7#J8>K(13@U|>*EFmcteNwYNU53{~ssCIKf+PlNEet$BX`7|JFpMm+5 zJnu~XAa4~T8%ulp5`%=M=)8x?v;W7ReRBHtpa1{=&tAK|rLH|QD=RWAsLZKrjgisK z@Z{^&yZWblb>$n#gKSb@MzZ@q$VCi3iIu5E3WhHj7#LVVj$mM5_|F7W1q!^1IlV!K ze1{AKs+om^lU^`acwT!~%aUAw@YJ!EBj<#FwRmkX+_YhnfsDl@)z`CPEKYX4x>4@? z=*zC#FF&7|@pkU@FOPS<%zC|W`_(#=kX0`jL@d@l*}H$q<9Xli$DFI&_kCK)8)v>7 za(&$OOM>~NKD_X?U$yKo*IK5ibJu@sytHsXXnRNALBF~xBT>%ckMiH$$8!tiYPt7@ z7tA?Z{G&W1S6BSY!`)LCYS^#kas7GG__~qE(?h?#Z)w>7PtiEV|7(lUlBz?`kEeTl zWYy^UKXnQNC|Vf7(E^H$7Cinw8+4GDL6PJ3Ou-p#6K_28k(YSywDtSsC7otdFC@9x ztT;2Lqb<4N+v@igUu{=CUUlvFuYDEAcK&{ylQzkoA&SjZo$cu2Tg{a=U-fhkpZy(f zoOE+V@ur+BmgWEczuEBn|0%x6`;0Z4<0BWLxoHv}H~s$q{ow!o@sAJwxNfR%@K?TD z!i;AUb7IO@gTfNSnzRR-CW{z5Fhuh2lHgJP>{)pDbnhaKH`bS19_Gx5nqi^&u-#X8 z<->N}Kb^exFM#ee*cVkp0q| z;Uby~58`p*)JX@q4mt3+d@ui!mLH_AHUyt{m>m-};apG~^s*UJwj3M=&k)!)yNd&*#}cUWM-am&5;{PS%38Q)olv;5J$ zzC%AZI%eYkf@yhkMUU=WAMsUx|H6o`=bwlE{ahLPe^u4p{j1_^9F|M%oCnJ;PgqJH0+zjof5%Rku HARD_DRIVE_CONTAINER_BLOCK_ENTITY; + public static HardDriveContainerBlock HARD_DRIVE_CONTAINER_BLOCK; + public static StorageBlock STORAGE_BLOCK; public static BlockEntityType STORAGE_BLOCK_ENTITY; public static final GameRules.Key ServerStorage_Crafting_Enable = GameRuleRegistry.register("enableserverstoragecrafting", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(false)); + + public static Identifier id(String path) { + return Identifier.of(MOD_ID, path); + } + @Override public void onInitialize() { StorageBlock.register(); StorageBlockItem.register(); - PolymerResourcePackUtils.addModAssets(MODID); + + HardDriveContainerBlock.register(); + HardDriveContainerBlockItem.register(); + + HardDriveItem.register(); + + PolymerResourcePackUtils.addModAssets(MOD_ID); PolymerResourcePackUtils.markAsRequired(); } -} +} \ No newline at end of file diff --git a/src/main/java/systems/brn/server_storage/blockentities/HardDriveContainerBlockEntity.java b/src/main/java/systems/brn/server_storage/blockentities/HardDriveContainerBlockEntity.java new file mode 100644 index 0000000..19d1ae3 --- /dev/null +++ b/src/main/java/systems/brn/server_storage/blockentities/HardDriveContainerBlockEntity.java @@ -0,0 +1,13 @@ +package systems.brn.server_storage.blockentities; + +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.util.math.BlockPos; + +import static systems.brn.server_storage.ServerStorage.HARD_DRIVE_CONTAINER_BLOCK_ENTITY; + +public class HardDriveContainerBlockEntity extends BlockEntity { + public HardDriveContainerBlockEntity(BlockPos pos, BlockState state) { + super(HARD_DRIVE_CONTAINER_BLOCK_ENTITY, pos, state); + } +} diff --git a/src/main/java/systems/brn/server_storage/blocks/HardDriveContainerBlock.java b/src/main/java/systems/brn/server_storage/blocks/HardDriveContainerBlock.java new file mode 100644 index 0000000..342b3b1 --- /dev/null +++ b/src/main/java/systems/brn/server_storage/blocks/HardDriveContainerBlock.java @@ -0,0 +1,109 @@ +package systems.brn.server_storage.blocks; + +import eu.pb4.polymer.blocks.api.BlockModelType; +import eu.pb4.polymer.blocks.api.PolymerBlockModel; +import eu.pb4.polymer.blocks.api.PolymerBlockResourceUtils; +import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; +import eu.pb4.polymer.core.api.block.PolymerBlockUtils; +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.minecraft.block.Block; +import net.minecraft.block.BlockEntityProvider; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.WrittenBookContentComponent; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.RawFilteredPair; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; +import systems.brn.server_storage.ServerStorage; +import systems.brn.server_storage.blockentities.HardDriveContainerBlockEntity; +import systems.brn.server_storage.blockentities.StorageBlockEntity; +import systems.brn.server_storage.screens.StorageScreen; + +import java.util.List; + +import static systems.brn.server_storage.ServerStorage.*; +import static systems.brn.server_storage.lib.Util.generateBookContent; + +public class HardDriveContainerBlock extends Block implements PolymerTexturedBlock, BlockEntityProvider { + + String modelID; + + BlockModelType blockModelType; + + public HardDriveContainerBlock(Settings settings, BlockModelType type, String modelId) { + super(settings); + this.modelID = modelId; + this.blockModelType = type; + } + + @Override + public BlockState getPolymerBlockState(BlockState state) { + return PolymerBlockResourceUtils.requestBlock(BlockModelType.FULL_BLOCK, PolymerBlockModel.of(id(this.modelID))); + } + + public static void register() { + var modId = id(STORAGE_MODEL_ID); + HARD_DRIVE_CONTAINER_BLOCK = Registry.register(Registries.BLOCK, modId, + new HardDriveContainerBlock(Settings.copy(Blocks.WHITE_WOOL), BlockModelType.FULL_BLOCK, ServerStorage.HARD_DRIVE_CONTAINER_BLOCK_MODEL_ID)); + UseBlockCallback.EVENT.register(HardDriveContainerBlock::onUse); + + HARD_DRIVE_CONTAINER_BLOCK_ENTITY = Registry.register( + Registries.BLOCK_ENTITY_TYPE, + modId, + BlockEntityType.Builder.create(HardDriveContainerBlockEntity::new, HARD_DRIVE_CONTAINER_BLOCK).build(null) + ); + PolymerBlockUtils.registerBlockEntity(STORAGE_BLOCK_ENTITY); + } + + private static ActionResult onUse(PlayerEntity player, World world, Hand hand, BlockHitResult hitResult) { + BlockPos pos = hitResult.getBlockPos(); + BlockState state = world.getBlockState(pos); + Block block = state.getBlock(); + + if (block instanceof HardDriveContainerBlock) { + if (!world.isClient && !player.isSpectator()) { + if (!player.isSneaking()) { + StorageScreen storageScreen = new StorageScreen((ServerPlayerEntity) player, pos, null); + storageScreen.open(); + + } else if (player.getStackInHand(hand).getItem() == Items.WRITTEN_BOOK) { + ItemStack book = player.getStackInHand(hand); + StorageBlockEntity storageBlockEntity = (StorageBlockEntity) world.getBlockEntity(pos); + assert storageBlockEntity != null; + List> generatedContent = generateBookContent(storageBlockEntity.chests.inventory); + book.set(DataComponentTypes.WRITTEN_BOOK_CONTENT, new WrittenBookContentComponent( + RawFilteredPair.of("Item Listing"), + player.getGameProfile().getName(), + 0, + generatedContent, + false + )); + } else { + return ActionResult.PASS; + } + } + return ActionResult.SUCCESS; + } + return ActionResult.PASS; + } + + @Nullable + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new StorageBlockEntity(pos, state); + } +} diff --git a/src/main/java/systems/brn/server_storage/blocks/StorageBlock.java b/src/main/java/systems/brn/server_storage/blocks/StorageBlock.java index 024e7a6..533bc07 100644 --- a/src/main/java/systems/brn/server_storage/blocks/StorageBlock.java +++ b/src/main/java/systems/brn/server_storage/blocks/StorageBlock.java @@ -37,27 +37,24 @@ import static systems.brn.server_storage.lib.Util.generateBookContent; public class StorageBlock extends Block implements PolymerTexturedBlock, BlockEntityProvider { - private final BlockState polymerBlockState; - public StorageBlock(Settings settings, BlockModelType type, String modelId) { super(settings); - this.polymerBlockState = PolymerBlockResourceUtils.requestBlock(type, PolymerBlockModel.of(Identifier.of(ServerStorage.MODID, modelId))); } @Override public BlockState getPolymerBlockState(BlockState state) { - return this.polymerBlockState; + return PolymerBlockResourceUtils.requestBlock(BlockModelType.FULL_BLOCK, PolymerBlockModel.of(Identifier.of(MOD_ID, STORAGE_MODEL_ID))); } public static void register() { - var modId = Identifier.of(ServerStorage.MODID, ServerStorage.MODELID); + var modId = id(STORAGE_MODEL_ID); STORAGE_BLOCK = Registry.register(Registries.BLOCK, modId, - new StorageBlock(AbstractBlock.Settings.copy(Blocks.WHITE_WOOL), BlockModelType.FULL_BLOCK, ServerStorage.MODELID)); + new StorageBlock(AbstractBlock.Settings.copy(Blocks.WHITE_WOOL), BlockModelType.FULL_BLOCK, ServerStorage.STORAGE_MODEL_ID)); UseBlockCallback.EVENT.register(StorageBlock::onUse); STORAGE_BLOCK_ENTITY = Registry.register( Registries.BLOCK_ENTITY_TYPE, - Identifier.of(MODID, MODELID), + modId, BlockEntityType.Builder.create(StorageBlockEntity::new, STORAGE_BLOCK).build(null) ); PolymerBlockUtils.registerBlockEntity(STORAGE_BLOCK_ENTITY); @@ -70,12 +67,11 @@ public class StorageBlock extends Block implements PolymerTexturedBlock, BlockEn if (block instanceof StorageBlock) { if (!world.isClient && !player.isSpectator()) { - if(!player.isSneaking()){ + if (!player.isSneaking()) { StorageScreen storageScreen = new StorageScreen((ServerPlayerEntity) player, pos, null); storageScreen.open(); - } - else if(player.getStackInHand(hand).getItem() == Items.WRITTEN_BOOK) { + } else if (player.getStackInHand(hand).getItem() == Items.WRITTEN_BOOK) { ItemStack book = player.getStackInHand(hand); StorageBlockEntity storageBlockEntity = (StorageBlockEntity) world.getBlockEntity(pos); assert storageBlockEntity != null; diff --git a/src/main/java/systems/brn/server_storage/items/HardDriveContainerBlockItem.java b/src/main/java/systems/brn/server_storage/items/HardDriveContainerBlockItem.java new file mode 100644 index 0000000..2199686 --- /dev/null +++ b/src/main/java/systems/brn/server_storage/items/HardDriveContainerBlockItem.java @@ -0,0 +1,41 @@ +package systems.brn.server_storage.items; + +import eu.pb4.polymer.core.api.item.PolymerItem; +import eu.pb4.polymer.resourcepack.api.PolymerModelData; +import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils; +import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; +import net.minecraft.block.Block; +import net.minecraft.item.*; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; +import systems.brn.server_storage.ServerStorage; + +import static systems.brn.server_storage.ServerStorage.*; + +public class HardDriveContainerBlockItem extends BlockItem implements PolymerItem { + private final PolymerModelData polymerModel; + + public HardDriveContainerBlockItem(Item.Settings settings, Block block, Identifier identifier) { + super(block, settings); + this.polymerModel = PolymerResourcePackUtils.requestModel(Items.BARRIER, identifier); + } + + @Override + public Item getPolymerItem(ItemStack itemStack, @Nullable ServerPlayerEntity player) { + return this.polymerModel.item(); + } + + @Override + public int getPolymerCustomModelData(ItemStack itemStack, @Nullable ServerPlayerEntity player) { + return this.polymerModel.value(); + } + + public static void register() { + Identifier identifier= id(ServerStorage.HARD_DRIVE_CONTAINER_BLOCK_MODEL_ID); + Item item = Registry.register(Registries.ITEM, identifier, new HardDriveContainerBlockItem(new Item.Settings(), HARD_DRIVE_CONTAINER_BLOCK, identifier)); + ItemGroupEvents.modifyEntriesEvent(ItemGroups.FUNCTIONAL).register(content -> content.add(item)); + } +} diff --git a/src/main/java/systems/brn/server_storage/items/HardDriveItem.java b/src/main/java/systems/brn/server_storage/items/HardDriveItem.java new file mode 100644 index 0000000..a50e5dc --- /dev/null +++ b/src/main/java/systems/brn/server_storage/items/HardDriveItem.java @@ -0,0 +1,43 @@ +package systems.brn.server_storage.items; + +import eu.pb4.polymer.core.api.item.PolymerItem; +import eu.pb4.polymer.resourcepack.api.PolymerModelData; +import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils; +import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroups; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; +import systems.brn.server_storage.ServerStorage; + +import static systems.brn.server_storage.ServerStorage.id; + +public class HardDriveItem extends Item implements PolymerItem { + private final PolymerModelData polymerModel; + + public HardDriveItem(Settings settings, Identifier identifier) { + super(settings); + this.polymerModel = PolymerResourcePackUtils.requestModel(Items.BARRIER, identifier); + } + + @Override + public Item getPolymerItem(ItemStack itemStack, @Nullable ServerPlayerEntity player) { + return this.polymerModel.item(); + } + + @Override + public int getPolymerCustomModelData(ItemStack itemStack, @Nullable ServerPlayerEntity player) { + return this.polymerModel.value(); + } + + public static void register() { + Identifier identifier = id(ServerStorage.HARD_DRIVE_MODEL_ID); + Item item = Registry.register(Registries.ITEM, identifier, new HardDriveItem(new Settings(), identifier)); + ItemGroupEvents.modifyEntriesEvent(ItemGroups.FUNCTIONAL).register(content -> content.add(item)); + } +} diff --git a/src/main/java/systems/brn/server_storage/items/StorageBlockItem.java b/src/main/java/systems/brn/server_storage/items/StorageBlockItem.java index b421da2..baf795b 100644 --- a/src/main/java/systems/brn/server_storage/items/StorageBlockItem.java +++ b/src/main/java/systems/brn/server_storage/items/StorageBlockItem.java @@ -14,13 +14,14 @@ import org.jetbrains.annotations.Nullable; import systems.brn.server_storage.ServerStorage; import static systems.brn.server_storage.ServerStorage.STORAGE_BLOCK; +import static systems.brn.server_storage.ServerStorage.id; public class StorageBlockItem extends BlockItem implements PolymerItem { private final PolymerModelData polymerModel; - public StorageBlockItem(Settings settings, Block block, String modelId) { + public StorageBlockItem(Settings settings, Block block, Identifier identifier) { super(block, settings); - this.polymerModel = PolymerResourcePackUtils.requestModel(Items.BARRIER, Identifier.of(ServerStorage.MODID, modelId)); + this.polymerModel = PolymerResourcePackUtils.requestModel(Items.BARRIER, identifier); } @Override @@ -34,8 +35,8 @@ public class StorageBlockItem extends BlockItem implements PolymerItem { } public static void register() { - var modId = Identifier.of(ServerStorage.MODID, ServerStorage.MODELID); - Item item = Registry.register(Registries.ITEM, modId, new StorageBlockItem(new Item.Settings(), STORAGE_BLOCK, ServerStorage.MODELID)); + Identifier identifier = id(ServerStorage.STORAGE_MODEL_ID); + Item item = Registry.register(Registries.ITEM, identifier, new StorageBlockItem(new Item.Settings(), STORAGE_BLOCK, identifier)); ItemGroupEvents.modifyEntriesEvent(ItemGroups.FUNCTIONAL).register(content -> content.add(item)); } } \ No newline at end of file diff --git a/src/main/java/systems/brn/server_storage/lib/CraftingEntry.java b/src/main/java/systems/brn/server_storage/lib/CraftingEntry.java index 4332141..11baf2f 100644 --- a/src/main/java/systems/brn/server_storage/lib/CraftingEntry.java +++ b/src/main/java/systems/brn/server_storage/lib/CraftingEntry.java @@ -1,17 +1,44 @@ package systems.brn.server_storage.lib; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.recipe.CraftingRecipe; import net.minecraft.recipe.RecipeEntry; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import static systems.brn.server_storage.lib.Util.addCountToLore; public class CraftingEntry { - public final ItemStack itemStack; + public final ArrayList outputStacks; public final RecipeEntry recipeEntry; public final ArrayList myCraftingRecipeEntries; - public CraftingEntry(ItemStack itemStack, RecipeEntry recipeEntry) { - this.itemStack = itemStack; + + public CraftingEntry(ItemStack itemStack, RecipeEntry recipeEntry, HashMap inputs, Integer maxCount) { + ArrayList tempOutputStacks = new ArrayList<>(); + ItemStack outputStack = itemStack.copy(); + outputStack.setCount(maxCount); + outputStack = addCountToLore(itemStack.getCount() * maxCount, outputStack, "Total max: "); + outputStack = addCountToLore(itemStack.getCount(), outputStack, "Each craft: "); + outputStack = addCountToLore(maxCount, outputStack, "Max crafts: "); + tempOutputStacks.add(outputStack); + for (Map.Entry entry : inputs.entrySet()) { + ItemStack stackIn = entry.getKey(); + Integer count = entry.getValue(); + if (count > 0 && stackIn.isEmpty() && stackIn.getItem().hasRecipeRemainder()) { + Item remainderItem = stackIn.getItem().getRecipeRemainder(); + if (remainderItem != null) { + ItemStack remainderStack = new ItemStack(stackIn.getItem().getRecipeRemainder(), count); + tempOutputStacks.add(remainderStack); + } + } + } + this.outputStacks = tempOutputStacks; this.recipeEntry = recipeEntry; + this.myCraftingRecipeEntries = new ArrayList<>(); + } } + diff --git a/src/main/java/systems/brn/server_storage/lib/MyCraftingRecipe.java b/src/main/java/systems/brn/server_storage/lib/MyCraftingRecipe.java index 3db8e74..03e843b 100644 --- a/src/main/java/systems/brn/server_storage/lib/MyCraftingRecipe.java +++ b/src/main/java/systems/brn/server_storage/lib/MyCraftingRecipe.java @@ -10,6 +10,6 @@ public class MyCraftingRecipe { HashMap inputs = new HashMap<>(); HashMap outputs = new HashMap<>(); MyCraftingRecipe(RecipeEntry recipeEntry) { - recipeEntry.value().getIngredients() + recipeEntry.value().getIngredients(); } } diff --git a/src/main/java/systems/brn/server_storage/lib/Util.java b/src/main/java/systems/brn/server_storage/lib/Util.java index 781c85b..a89085e 100644 --- a/src/main/java/systems/brn/server_storage/lib/Util.java +++ b/src/main/java/systems/brn/server_storage/lib/Util.java @@ -5,6 +5,7 @@ import net.minecraft.component.type.LoreComponent; import net.minecraft.inventory.Inventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.recipe.*; import net.minecraft.server.MinecraftServer; import net.minecraft.text.RawFilteredPair; @@ -63,11 +64,12 @@ public class Util { return pages; } - public static ItemStack addCountToLore(final int count, ItemStack stack) { + public static ItemStack addCountToLore(final int count, ItemStack stack, String name) { if (count > 0) { ItemStack newStack = stack.copy(); LoreComponent lore = stack.get(DataComponentTypes.LORE); - Text countLine = Text.literal("Amount: " + count).setStyle(Style.EMPTY.withColor(Formatting.GOLD).withItalic(true)); + name = name != null ? name : "Amount: "; + Text countLine = Text.literal(name + count).setStyle(Style.EMPTY.withColor(Formatting.GOLD).withItalic(true)); LoreComponent newLore; if (lore == null) { @@ -113,6 +115,9 @@ public class Util { for (RecipeEntry recipe : allRecipes) { int maxAmount = -1; boolean canMake = true; + boolean needToAdd = true; + CraftingEntry finalEntry; + HashMap finalInputs = new HashMap<>(); for (Ingredient ingredient : recipe.value().getIngredients()) { HashMap inputsTemp = new HashMap<>(); for (ItemStack stack : ingredient.getMatchingStacks()) { @@ -143,18 +148,23 @@ public class Util { stackIn.setCount(count); inputs.put(stackIn, stackIn.getCount()); } - for (int i = 0; i < inventory.size(); i++) { - ItemStack slotStack = inventory.getStack(i); - Item slotItem = slotStack.getItem(); - int slotCount = slotStack.getCount(); - for (Map.Entry entry : inputs.entrySet()) { - ItemStack stackIn = entry.getKey(); - Integer count = entry.getValue(); + for (Map.Entry entry : inputs.entrySet()) { + ItemStack stackIn = entry.getKey(); + Integer count = entry.getValue(); + boolean itemFound = false; + for (int i = 0; i < inventory.size(); i++) { + ItemStack slotStack = inventory.getStack(i); + Item slotItem = slotStack.getItem(); + int slotCount = slotStack.getCount(); if (stackIn.getItem() == slotItem) { count -= slotCount; entry.setValue(count); + itemFound = true; } } + if (!itemFound) { + maxAmount = 0; + } } for (Map.Entry entry : inputs.entrySet()) { ItemStack stackIn = entry.getKey(); @@ -162,6 +172,9 @@ public class Util { if (count > 0) { canMake = false; } else { + if(recipe.value().getResult(server.getRegistryManager()).getItem() == Items.REDSTONE_BLOCK){ + int asdasd = 0; + } int thisMaxAmount = Math.floorDivExact(Math.abs(count), stackIn.getCount()); if (maxAmount == -1) { maxAmount = thisMaxAmount; @@ -170,27 +183,31 @@ public class Util { } } } - if (maxAmount > 1 && canMake) { - Item outputItem = recipe.value().getResult(server.getRegistryManager()).getItem(); - CraftingEntry entry = new CraftingEntry(new ItemStack(outputItem, maxAmount), recipe); - boolean needToAdd = true; + if (maxAmount > 0 && canMake && needToAdd) { + ItemStack outputItem = recipe.value().getResult(server.getRegistryManager()).copy(); + finalEntry = new CraftingEntry(outputItem, recipe, inputs, maxAmount); + finalInputs.putAll(inputs); for (int i = 0; i < craftingEntries.size(); i++) { CraftingEntry entryLoop = craftingEntries.get(i); - if (entryLoop.itemStack.getItem().equals(outputItem)) { - needToAdd = false; - if (maxAmount > entryLoop.itemStack.getCount()) { - craftingEntries.set(i, entry); - break; + for (ItemStack outputStack : entryLoop.outputStacks) { + if (ItemStack.areItemsAndComponentsEqual(outputStack, outputItem)) { + needToAdd = false; + if (maxAmount > outputStack.getCount()) { + craftingEntries.set(i, finalEntry); + break; + } } } } - if (needToAdd) { - craftingEntries.add(entry); - } } else { break; } } + if (needToAdd && maxAmount > 0) { + ItemStack outputItem = recipe.value().getResult(server.getRegistryManager()).copy(); + finalEntry = new CraftingEntry(outputItem, recipe, finalInputs, maxAmount); + craftingEntries.add(finalEntry); + } } return craftingEntries; } diff --git a/src/main/java/systems/brn/server_storage/screens/CraftingScreen.java b/src/main/java/systems/brn/server_storage/screens/CraftingScreen.java index 6c8c867..bc77377 100644 --- a/src/main/java/systems/brn/server_storage/screens/CraftingScreen.java +++ b/src/main/java/systems/brn/server_storage/screens/CraftingScreen.java @@ -17,7 +17,6 @@ import java.util.Map; import java.util.Objects; import static systems.brn.server_storage.lib.StorageOperations.*; -import static systems.brn.server_storage.lib.Util.addCountToLore; import static systems.brn.server_storage.lib.Util.getCraftableRecipes; public class CraftingScreen extends PagedGui { @@ -50,7 +49,7 @@ public class CraftingScreen extends PagedGui { ArrayList recipes = new ArrayList<>(); for (CraftingEntry craftingEntry : craftingEntries) { - ItemStack stackWithCount = addCountToLore(craftingEntry.itemStack.getCount(), craftingEntry.itemStack); + ItemStack stackWithCount = craftingEntry.outputStacks.getFirst().copy(); if (stackWithCount.getCount() > stackWithCount.getMaxCount()) { stackWithCount.setCount(stackWithCount.getMaxCount()); } diff --git a/src/main/java/systems/brn/server_storage/screens/StorageScreen.java b/src/main/java/systems/brn/server_storage/screens/StorageScreen.java index 0bb8f26..21101b7 100644 --- a/src/main/java/systems/brn/server_storage/screens/StorageScreen.java +++ b/src/main/java/systems/brn/server_storage/screens/StorageScreen.java @@ -64,7 +64,7 @@ public class StorageScreen extends PagedGui { protected DisplayElement getElement(int id) { if (blockEntity.chests.inventory.size() > id) { ItemStack itemStack = blockEntity.chests.inventory.getStack(id); - ItemStack newStack = addCountToLore(itemStack.getCount(), itemStack); + ItemStack newStack = addCountToLore(itemStack.getCount(), itemStack, null); GuiElementBuilder guiElement = new GuiElementBuilder(newStack); return DisplayElement.of(guiElement); } diff --git a/src/main/resources/assets/serverstorage/blockstates/drive_container.json b/src/main/resources/assets/serverstorage/blockstates/drive_container.json new file mode 100644 index 0000000..d3beb3b --- /dev/null +++ b/src/main/resources/assets/serverstorage/blockstates/drive_container.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "serverstorage:block/drive_container" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/serverstorage/lang/en_us.json b/src/main/resources/assets/serverstorage/lang/en_us.json index cfdf057..9739388 100644 --- a/src/main/resources/assets/serverstorage/lang/en_us.json +++ b/src/main/resources/assets/serverstorage/lang/en_us.json @@ -1,4 +1,5 @@ { "block.serverstorage.storage": "Chest storage controller", - "block.serverstorage.fast_hopper": "Fast hopper" + "block.serverstorage.drive": "Hard drive", + "block.serverstorage.drive_container": "Hard drive container" } \ No newline at end of file diff --git a/src/main/resources/assets/serverstorage/models/drive_container.json b/src/main/resources/assets/serverstorage/models/drive_container.json new file mode 100644 index 0000000..5bf0c3a --- /dev/null +++ b/src/main/resources/assets/serverstorage/models/drive_container.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "serverstorage:block/drive_container" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/serverstorage/models/item/drive.json b/src/main/resources/assets/serverstorage/models/item/drive.json new file mode 100644 index 0000000..ddcec5f --- /dev/null +++ b/src/main/resources/assets/serverstorage/models/item/drive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/drive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/serverstorage/models/item/drive_container.json b/src/main/resources/assets/serverstorage/models/item/drive_container.json new file mode 100644 index 0000000..9793643 --- /dev/null +++ b/src/main/resources/assets/serverstorage/models/item/drive_container.json @@ -0,0 +1,3 @@ +{ + "parent": "storage:block/drive_container" +} \ No newline at end of file