├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── src └── main │ ├── resources │ ├── pack.mcmeta │ ├── assets │ │ └── enderstorage │ │ │ ├── textures │ │ │ ├── buttons.png │ │ │ ├── enderchest.png │ │ │ ├── enderpouch.png │ │ │ ├── enderpouch.psd │ │ │ ├── endertank.png │ │ │ ├── hedronmap.png │ │ │ ├── hedronmap.psd │ │ │ └── item │ │ │ │ └── pouch │ │ │ │ ├── open.png │ │ │ │ ├── closed.png │ │ │ │ ├── owned_closed.png │ │ │ │ ├── owned_open.png │ │ │ │ └── buttons │ │ │ │ ├── left │ │ │ │ ├── blue.png │ │ │ │ ├── cyan.png │ │ │ │ ├── gray.png │ │ │ │ ├── lime.png │ │ │ │ ├── pink.png │ │ │ │ ├── red.png │ │ │ │ ├── black.png │ │ │ │ ├── brown.png │ │ │ │ ├── green.png │ │ │ │ ├── orange.png │ │ │ │ ├── purple.png │ │ │ │ ├── white.png │ │ │ │ ├── yellow.png │ │ │ │ ├── magenta.png │ │ │ │ ├── light_blue.png │ │ │ │ └── light_gray.png │ │ │ │ ├── right │ │ │ │ ├── red.png │ │ │ │ ├── black.png │ │ │ │ ├── blue.png │ │ │ │ ├── brown.png │ │ │ │ ├── cyan.png │ │ │ │ ├── gray.png │ │ │ │ ├── green.png │ │ │ │ ├── lime.png │ │ │ │ ├── pink.png │ │ │ │ ├── white.png │ │ │ │ ├── magenta.png │ │ │ │ ├── orange.png │ │ │ │ ├── purple.png │ │ │ │ ├── yellow.png │ │ │ │ ├── light_blue.png │ │ │ │ └── light_gray.png │ │ │ │ └── middle │ │ │ │ ├── blue.png │ │ │ │ ├── cyan.png │ │ │ │ ├── gray.png │ │ │ │ ├── lime.png │ │ │ │ ├── pink.png │ │ │ │ ├── red.png │ │ │ │ ├── black.png │ │ │ │ ├── brown.png │ │ │ │ ├── green.png │ │ │ │ ├── magenta.png │ │ │ │ ├── orange.png │ │ │ │ ├── purple.png │ │ │ │ ├── white.png │ │ │ │ ├── yellow.png │ │ │ │ ├── light_blue.png │ │ │ │ └── light_gray.png │ │ │ ├── lang │ │ │ ├── sv_se.json │ │ │ ├── zh_cn.json │ │ │ ├── zh_tw.json │ │ │ ├── ko_kr.json │ │ │ ├── de_de.json │ │ │ ├── ja_jp.json │ │ │ ├── en_ud.json │ │ │ ├── en_us.json │ │ │ ├── hu_hu.json │ │ │ ├── cs_cz.json │ │ │ ├── pt_br.json │ │ │ ├── pt_pt.json │ │ │ ├── ru_ru.json │ │ │ ├── tr_tr.json │ │ │ ├── sk_sk.json │ │ │ ├── it_it.json │ │ │ ├── fr_ca.json │ │ │ ├── fr_fr.json │ │ │ └── pl_pl.json │ │ │ └── shaders │ │ │ └── core │ │ │ ├── starfield.vsh │ │ │ ├── starfield.json │ │ │ └── starfield.fsh │ └── META-INF │ │ ├── accesstransformer.cfg │ │ └── neoforge.mods.toml │ ├── generated │ ├── assets │ │ └── enderstorage │ │ │ ├── blockstates │ │ │ ├── ender_chest.json │ │ │ └── ender_tank.json │ │ │ └── models │ │ │ ├── block │ │ │ └── dummy.json │ │ │ └── item │ │ │ ├── ender_pouch_open.json │ │ │ ├── ender_pouch_closed.json │ │ │ ├── ender_pouch_owned_open.json │ │ │ ├── ender_pouch_owned_closed.json │ │ │ ├── ender_pouch_button_left_red.json │ │ │ ├── ender_pouch_button_left_black.json │ │ │ ├── ender_pouch_button_left_blue.json │ │ │ ├── ender_pouch_button_left_brown.json │ │ │ ├── ender_pouch_button_left_cyan.json │ │ │ ├── ender_pouch_button_left_gray.json │ │ │ ├── ender_pouch_button_left_green.json │ │ │ ├── ender_pouch_button_left_lime.json │ │ │ ├── ender_pouch_button_left_pink.json │ │ │ ├── ender_pouch_button_left_white.json │ │ │ ├── ender_pouch_button_middle_red.json │ │ │ ├── ender_pouch_button_right_blue.json │ │ │ ├── ender_pouch_button_right_cyan.json │ │ │ ├── ender_pouch_button_right_gray.json │ │ │ ├── ender_pouch_button_right_lime.json │ │ │ ├── ender_pouch_button_right_pink.json │ │ │ ├── ender_pouch_button_right_red.json │ │ │ ├── ender_pouch_button_left_magenta.json │ │ │ ├── ender_pouch_button_left_orange.json │ │ │ ├── ender_pouch_button_left_purple.json │ │ │ ├── ender_pouch_button_left_yellow.json │ │ │ ├── ender_pouch_button_middle_black.json │ │ │ ├── ender_pouch_button_middle_blue.json │ │ │ ├── ender_pouch_button_middle_brown.json │ │ │ ├── ender_pouch_button_middle_cyan.json │ │ │ ├── ender_pouch_button_middle_gray.json │ │ │ ├── ender_pouch_button_middle_green.json │ │ │ ├── ender_pouch_button_middle_lime.json │ │ │ ├── ender_pouch_button_middle_orange.json │ │ │ ├── ender_pouch_button_middle_pink.json │ │ │ ├── ender_pouch_button_middle_purple.json │ │ │ ├── ender_pouch_button_middle_white.json │ │ │ ├── ender_pouch_button_middle_yellow.json │ │ │ ├── ender_pouch_button_right_black.json │ │ │ ├── ender_pouch_button_right_brown.json │ │ │ ├── ender_pouch_button_right_green.json │ │ │ ├── ender_pouch_button_right_magenta.json │ │ │ ├── ender_pouch_button_right_orange.json │ │ │ ├── ender_pouch_button_right_purple.json │ │ │ ├── ender_pouch_button_right_white.json │ │ │ ├── ender_pouch_button_right_yellow.json │ │ │ ├── ender_pouch_button_left_light_blue.json │ │ │ ├── ender_pouch_button_left_light_gray.json │ │ │ ├── ender_pouch_button_middle_magenta.json │ │ │ ├── ender_tank.json │ │ │ ├── ender_chest.json │ │ │ ├── ender_pouch_button_middle_light_blue.json │ │ │ ├── ender_pouch_button_middle_light_gray.json │ │ │ ├── ender_pouch_button_right_light_blue.json │ │ │ └── ender_pouch_button_right_light_gray.json │ ├── data │ │ ├── minecraft │ │ │ └── tags │ │ │ │ └── block │ │ │ │ └── mineable │ │ │ │ └── pickaxe.json │ │ └── enderstorage │ │ │ └── recipe │ │ │ ├── recolour_ender_tank.json │ │ │ ├── recolour_ender_chest.json │ │ │ ├── recolour_ender_pouch.json │ │ │ ├── ender_pouch.json │ │ │ ├── ender_chest.json │ │ │ └── ender_tank.json │ └── .cache │ │ ├── 53c252d47159caa2725cf9322152d4faa8adddc2 │ │ ├── 4dc38c3db68a3f5d2829c70f6393f40139139856 │ │ ├── abeef144278732cea2d82cd73e81bf44656e216c │ │ └── 282910bf22b00ad347f56cc1dfb6815b78e846d9 │ └── java │ └── codechicken │ └── enderstorage │ ├── package-info.java │ ├── api │ ├── package-info.java │ ├── StorageType.java │ ├── EnderStoragePlugin.java │ ├── AbstractEnderStorage.java │ └── Frequency.java │ ├── block │ ├── package-info.java │ ├── BlockEnderTank.java │ └── BlockEnderChest.java │ ├── init │ ├── package-info.java │ ├── ClientInit.java │ └── EnderStorageModContent.java │ ├── item │ ├── package-info.java │ ├── ItemEnderStorage.java │ └── ItemEnderPouch.java │ ├── misc │ ├── package-info.java │ └── EnderKnobSlot.java │ ├── tile │ ├── package-info.java │ ├── TileFrequencyOwner.java │ └── TileEnderChest.java │ ├── client │ ├── package-info.java │ ├── gui │ │ ├── package-info.java │ │ └── GuiEnderItemStorage.java │ ├── model │ │ ├── package-info.java │ │ └── ButtonModelLibrary.java │ ├── render │ │ ├── package-info.java │ │ ├── item │ │ │ ├── package-info.java │ │ │ ├── EnderChestItemRender.java │ │ │ └── EnderTankItemRender.java │ │ ├── tile │ │ │ ├── package-info.java │ │ │ ├── RenderTileEnderTank.java │ │ │ └── RenderTileEnderChest.java │ │ ├── entity │ │ │ ├── package-info.java │ │ │ └── TankLayerRenderer.java │ │ └── RenderCustomEndPortal.java │ └── Shaders.java │ ├── config │ ├── package-info.java │ └── EnderStorageConfig.java │ ├── manager │ └── package-info.java │ ├── network │ ├── package-info.java │ ├── EnderStorageNetwork.java │ ├── EnderStorageSPH.java │ └── EnderStorageCPH.java │ ├── plugin │ ├── package-info.java │ ├── EnderLiquidStoragePlugin.java │ ├── EnderItemStoragePlugin.java │ └── jei │ │ ├── EnderStorageJEIPlugin.java │ │ └── ESCraftingRecipeWrapper.java │ ├── recipe │ ├── package-info.java │ ├── CreateRecipe.java │ └── ReColourRecipe.java │ ├── storage │ ├── package-info.java │ └── EnderLiquidStorage.java │ ├── container │ ├── package-info.java │ └── ContainerEnderItemStorage.java │ ├── command │ ├── help │ │ ├── ColourHelp.java │ │ ├── FrequencyHelp.java │ │ └── ValidStorageHelp.java │ ├── EnderStorageCommand.java │ └── ClearCommand.java │ └── EnderStorage.java ├── gradle.properties ├── .gitignore ├── settings.gradle ├── .github └── workflows │ └── check.yml ├── LICENSE.txt ├── README.md └── gradlew.bat /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/main/resources/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 4, 4 | "description": "EnderStorage resource pack" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | mc_version=1.21.1 2 | forge_version=21.1.72 3 | ccl_version=4.6.0.+ 4 | ccl_version_max=5.0.0 5 | jei_version=19.21.0.246 6 | mod_version=2.13.0 7 | -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/blockstates/ender_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "enderstorage:block/dummy" 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/blockstates/ender_tank.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "enderstorage:block/dummy" 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /src/main/generated/data/minecraft/tags/block/mineable/pickaxe.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "enderstorage:ender_chest", 4 | "enderstorage:ender_tank" 5 | ] 6 | } -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/api/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.api; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/block/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.block; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/init/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.init; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/item/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.item; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/misc/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.misc; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/tile/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.tile; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/buttons.png -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/block/dummy.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:block/block", 3 | "textures": { 4 | "particle": "minecraft:block/obsidian" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.client; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/config/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.config; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/manager/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.manager; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/network/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.network; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/plugin/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.plugin; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/recipe/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.recipe; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/storage/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.storage; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/enderchest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/enderchest.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/enderpouch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/enderpouch.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/enderpouch.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/enderpouch.psd -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/endertank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/endertank.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/hedronmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/hedronmap.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/hedronmap.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/hedronmap.psd -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/gui/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.client.gui; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/container/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.container; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/model/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.client.model; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.client.render; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/open.png -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_open.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/open" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/closed.png -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_closed.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/closed" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/data/enderstorage/recipe/recolour_ender_tank.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "enderstorage:recolour_recipe", 3 | "result": { 4 | "count": 1, 5 | "id": "enderstorage:ender_tank" 6 | } 7 | } -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/item/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.client.render.item; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/tile/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.client.render.tile; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_owned_open.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/owned_open" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/data/enderstorage/recipe/recolour_ender_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "enderstorage:recolour_recipe", 3 | "result": { 4 | "count": 1, 5 | "id": "enderstorage:ender_chest" 6 | } 7 | } -------------------------------------------------------------------------------- /src/main/generated/data/enderstorage/recipe/recolour_ender_pouch.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "enderstorage:recolour_recipe", 3 | "result": { 4 | "count": 1, 5 | "id": "enderstorage:ender_pouch" 6 | } 7 | } -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/entity/package-info.java: -------------------------------------------------------------------------------- 1 | @NonNullApi 2 | package codechicken.enderstorage.client.render.entity; 3 | 4 | import net.covers1624.quack.annotation.NonNullApi; 5 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/owned_closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/owned_closed.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/owned_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/owned_open.png -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_owned_closed.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/owned_closed" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/red" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/blue.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/cyan.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/gray.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/lime.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/pink.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/red.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/red.png -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/black" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/blue" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/brown" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/cyan" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/gray" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/green" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/lime" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/pink" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/white" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/red" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/blue" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/cyan" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/gray" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/lime" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/pink" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/red" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/black.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/brown.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/green.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/orange.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/purple.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/white.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/yellow.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/blue.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/cyan.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/gray.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/lime.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/pink.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/red.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/black.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/blue.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/brown.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/cyan.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/gray.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/green.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/lime.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/pink.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/white.png -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/magenta" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/orange" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/purple" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/yellow" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/black" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/blue" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/brown" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/cyan" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/gray" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/green" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/lime" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/orange" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/pink" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/purple" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/white" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/yellow" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/black" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/brown" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/green" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/magenta" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/orange" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/purple" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/white" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/yellow" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/magenta.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/black.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/brown.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/green.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/magenta.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/orange.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/purple.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/white.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/yellow.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/magenta.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/orange.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/purple.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/yellow.png -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/light_blue" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_left_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/left/light_gray" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/magenta" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_tank.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "class": "codechicken.enderstorage.client.render.item.EnderTankItemRender", 4 | "loader": "codechickenlib:class" 5 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/light_blue.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/light_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/left/light_gray.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/light_blue.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/light_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/right/light_gray.png -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "class": "codechicken.enderstorage.client.render.item.EnderChestItemRender", 4 | "loader": "codechickenlib:class" 5 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/light_blue" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_middle_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/middle/light_gray" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/light_blue" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/generated/assets/enderstorage/models/item/ender_pouch_button_right_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/generated", 3 | "textures": { 4 | "layer0": "enderstorage:item/pouch/buttons/right/light_gray" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/api/StorageType.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.api; 2 | 3 | /** 4 | * Created by covers1624 on 17/9/24. 5 | */ 6 | public record StorageType(String name) { } 7 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/light_blue.png -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/light_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheCBProject/EnderStorage/master/src/main/resources/assets/enderstorage/textures/item/pouch/buttons/middle/light_gray.png -------------------------------------------------------------------------------- /src/main/generated/.cache/53c252d47159caa2725cf9322152d4faa8adddc2: -------------------------------------------------------------------------------- 1 | // 1.21.1 2024-10-29T17:38:05.796936778 Tags for minecraft:block mod id enderstorage 2 | 5b2130f55986594660c630dadb50eede58d67c12 data/minecraft/tags/block/mineable/pickaxe.json 3 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/sv_se.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Enderp�se", 3 | "block.enderstorage.ender_chest": "Enderkista", 4 | "block.enderstorage.ender_tank": "Endertank", 5 | "enderstorage.serverop": "Operat�r" 6 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/shaders/core/starfield.vsh: -------------------------------------------------------------------------------- 1 | #version 150 2 | 3 | in vec3 Position; 4 | 5 | uniform mat4 ModelViewMat; 6 | uniform mat4 ProjMat; 7 | 8 | out vec3 fPos; 9 | 10 | void main() { 11 | gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); 12 | fPos = (ModelViewMat * vec4(Position, 1.0)).xyz; 13 | } 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # exclude all 2 | /* 3 | 4 | # Gradle stuff 5 | !gradle/ 6 | !gradlew 7 | !gradlew.bat 8 | !build.gradle 9 | !gradle.properties 10 | !settings.gradle 11 | 12 | # Other Files. 13 | !LICENSE.txt 14 | !README.md 15 | 16 | # Include git important files 17 | !.gitmodules 18 | !.gitignore 19 | !.github/ 20 | 21 | # Include Important Folders 22 | !src/ 23 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | maven { 5 | name = 'NeoForged' 6 | url = 'https://maven.neoforged.net/releases' 7 | } 8 | } 9 | } 10 | 11 | plugins { 12 | id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' 13 | } 14 | 15 | rootProject.name = 'EnderStorage' 16 | -------------------------------------------------------------------------------- /src/main/generated/.cache/4dc38c3db68a3f5d2829c70f6393f40139139856: -------------------------------------------------------------------------------- 1 | // 1.21.1 2024-10-29T17:38:05.797054219 Block States: enderstorage 2 | 31ae921e4029b7a18bfc63f7cee5e5bf4ce92828 assets/enderstorage/blockstates/ender_chest.json 3 | 31ae921e4029b7a18bfc63f7cee5e5bf4ce92828 assets/enderstorage/blockstates/ender_tank.json 4 | f105c225def5c2a406cab5c02f6b08774a37e9de assets/enderstorage/models/block/dummy.json 5 | -------------------------------------------------------------------------------- /.github/workflows/check.yml: -------------------------------------------------------------------------------- 1 | name: Check 2 | 3 | on: [push, pull_request] 4 | 5 | env: 6 | BUILD_NUMBER: 9999 7 | GITHUB_CI: true 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Setup JDK 1.8 16 | uses: actions/setup-java@v1 17 | with: 18 | java-version: 1.8 19 | - name: Build 20 | run: ./gradlew build 21 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/accesstransformer.cfg: -------------------------------------------------------------------------------- 1 | #EnderStorage Access Transformer 2 | public net.minecraft.client.renderer.RenderStateShard * 3 | public net.minecraft.client.renderer.RenderType *() # All Methods 4 | 5 | public net.minecraft.core.Direction BY_3D_DATA 6 | 7 | public net.minecraft.world.item.crafting.ShapedRecipe group 8 | public net.minecraft.world.item.crafting.ShapedRecipe pattern 9 | public net.minecraft.world.item.crafting.ShapedRecipe result 10 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/zh_cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "末影袋子", 3 | "block.enderstorage.ender_chest": "末影箱子", 4 | "enderstorage.command.no_colour": "无效颜色:%s", 5 | "enderstorage.command.usage": "enderstorage |( ) [owner]", 6 | "enderstorage.command.no_freq": "无效频率", 7 | "block.enderstorage.ender_tank": "末影蓄水槽", 8 | "enderstorage.command.no_arguments": "该数字无法作为有效参数", 9 | "enderstorage.serverop": "OP" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/zh_tw.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "終界袋", 3 | "block.enderstorage.ender_chest": "終界箱", 4 | "enderstorage.command.no_colour": "顏色參數不正確: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [owner]", 6 | "enderstorage.command.no_freq": "頻率參數不正確", 7 | "block.enderstorage.ender_tank": "終界蓄水槽", 8 | "enderstorage.command.no_arguments": "數量參數不正確", 9 | "enderstorage.serverop": "管理員" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/ko_kr.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "엔더 파우치", 3 | "block.enderstorage.ender_chest": "엔더 체스트", 4 | "enderstorage.command.no_colour": "잘못된 색깔: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [owner]", 6 | "enderstorage.command.no_freq": "잘못된 주파수", 7 | "block.enderstorage.ender_tank": "엔더 탱크", 8 | "enderstorage.command.no_arguments": "잘못된 개수의 인수", 9 | "enderstorage.serverop": "오퍼레이터" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/de_de.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Enderbeutel", 3 | "block.enderstorage.ender_chest": "Endertruhe", 4 | "enderstorage.command.no_colour": "Ungültige Farbe: %s", 5 | "enderstorage.command.no_freq": "Ungültige Frequenz", 6 | "block.enderstorage.ender_tank": "Endertank", 7 | "enderstorage.command.no_arguments": "Ungültige Anzahl an Parametern", 8 | "enderstorage.serverop": "enderstorage |( ) [Eigentümer]" 9 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/ja_jp.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "エンダーポーチ", 3 | "block.enderstorage.ender_chest": "エンダーチェスト", 4 | "enderstorage.command.no_colour": "無効な色です:%s", 5 | "enderstorage.command.usage": "enderstorage |( ) [owner]", 6 | "enderstorage.command.no_freq": "無効な周波数です", 7 | "block.enderstorage.ender_tank": "エンダータンク", 8 | "enderstorage.command.no_arguments": "無効な数の引数です", 9 | "enderstorage.serverop": "管理者" 10 | } 11 | -------------------------------------------------------------------------------- /src/main/generated/data/enderstorage/recipe/ender_pouch.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "enderstorage:create_recipe", 3 | "key": { 4 | "B": { 5 | "item": "minecraft:blaze_powder" 6 | }, 7 | "L": { 8 | "tag": "c:leathers" 9 | }, 10 | "P": { 11 | "tag": "c:ender_pearls" 12 | }, 13 | "W": { 14 | "tag": "c:wools" 15 | } 16 | }, 17 | "pattern": [ 18 | "BLB", 19 | "LPL", 20 | "BWB" 21 | ], 22 | "result": { 23 | "count": 1, 24 | "id": "enderstorage:ender_pouch" 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/api/EnderStoragePlugin.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.api; 2 | 3 | import codechicken.enderstorage.manager.EnderStorageManager; 4 | import net.minecraft.server.level.ServerPlayer; 5 | 6 | import java.util.List; 7 | 8 | public interface EnderStoragePlugin { 9 | 10 | T createEnderStorage(EnderStorageManager manager, Frequency freq); 11 | 12 | StorageType identifier(); 13 | 14 | void sendClientInfo(ServerPlayer player, List list); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/en_ud.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "ɥɔnoԀ ɹǝpuƎ", 3 | "block.enderstorage.ender_chest": "ʇsǝɥƆ ɹǝpuƎ", 4 | "enderstorage.command.no_colour": "%s :ɹoꞁoɔ pᴉꞁɐʌuI", 5 | "enderstorage.command.usage": "[ɹǝuʍo] (<ɹnoꞁoɔ> <ɹnoꞁoɔ> <ɹnoꞁoɔ>)| ǝᵷɐɹoʇsɹǝpuǝ", 6 | "enderstorage.command.no_freq": "bǝɹɟ pᴉꞁɐʌuI", 7 | "block.enderstorage.ender_tank": "ʞuɐ⟘ ɹǝpuƎ", 8 | "enderstorage.command.no_arguments": "sʇuǝɯnᵷɹɐ ɟo ɹǝqɯnu pᴉꞁɐʌuI", 9 | "enderstorage.serverop": "ɹoʇɐɹǝdO" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Ender Pouch", 3 | "block.enderstorage.ender_chest": "Ender Chest", 4 | "enderstorage.command.no_colour": "Invalid color: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [owner]", 6 | "enderstorage.command.no_freq": "Invalid freq", 7 | "block.enderstorage.ender_tank": "Ender Tank", 8 | "enderstorage.command.no_arguments": "Invalid number of arguments", 9 | "enderstorage.serverop": "Operator" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/hu_hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Ender táska", 3 | "block.enderstorage.ender_chest": "Ender láda", 4 | "enderstorage.command.no_colour": "Helytelen szín: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [tulaj.]", 6 | "enderstorage.command.no_freq": "Helytelen frekv.", 7 | "block.enderstorage.ender_tank": "Ender tank", 8 | "enderstorage.command.no_arguments": "Érvénytelen számú argumentum", 9 | "enderstorage.serverop": "Operátor" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/cs_cz.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Vak z Endu", 3 | "block.enderstorage.ender_chest": "Truhla z Endu", 4 | "enderstorage.command.no_colour": "Neplatná barva: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [majitel]", 6 | "enderstorage.command.no_freq": "Neplatná frekvence", 7 | "block.enderstorage.ender_tank": "Nádrž z Endu", 8 | "enderstorage.command.no_arguments": "Nesprávný počet parametrů", 9 | "enderstorage.serverop": "Operátor" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/pt_br.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Bolsa do Fim", 3 | "block.enderstorage.ender_chest": "Baú do Fim", 4 | "enderstorage.command.no_colour": "Cor inválida: %s", 5 | "enderstorage.command.usage": "/enderstorage |( ) [dono]", 6 | "enderstorage.command.no_freq": "Frequência inválida", 7 | "block.enderstorage.ender_tank": "Tanque do Fim", 8 | "enderstorage.command.no_arguments": "Número de argumentos inválidos", 9 | "enderstorage.serverop": "Operador" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/pt_pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Mochila do Fim", 3 | "block.enderstorage.ender_chest": "Baú do Fim", 4 | "enderstorage.command.no_colour": "Cor inválida: %s", 5 | "enderstorage.command.usage": "/enderstorage |( ) [dono]", 6 | "enderstorage.command.no_freq": "Frequência inválida", 7 | "block.enderstorage.ender_tank": "Tanque do Fim", 8 | "enderstorage.command.no_arguments": "Número de argumentos inválidos", 9 | "enderstorage.serverop": "Operador" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/ru_ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Эндер-сумка", 3 | "block.enderstorage.ender_chest": "Эндер-сундук", 4 | "enderstorage.command.no_colour": "Неверный цвет: %s", 5 | "enderstorage.command.usage": "enderstorage <частота>|(<цвет> <цвет> <цвет>) [владелец]", 6 | "enderstorage.command.no_freq": "Неизвестная частота", 7 | "block.enderstorage.ender_tank": "Эндер-резервуар", 8 | "enderstorage.command.no_arguments": "Неверное число аргументов", 9 | "enderstorage.serverop": "Оператор" 10 | } 11 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/tr_tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Ender Sırt Çantası", 3 | "block.enderstorage.ender_chest": "Ender Sandığı", 4 | "enderstorage.command.no_colour": "Geçersiz Renk: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [sahibi]", 6 | "enderstorage.command.no_freq": "Geçersiz Frekans", 7 | "block.enderstorage.ender_tank": "Ender Sıvı Tankı", 8 | "enderstorage.command.no_arguments": "Girdiğiniz bilgiler yanlış", 9 | "enderstorage.serverop": "Operatör" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/sk_sk.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Vak z Konca", 3 | "block.enderstorage.ender_chest": "Truhlica z Konca", 4 | "enderstorage.command.no_colour": "Neplatná farba: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [majiteľ]", 6 | "enderstorage.command.no_freq": "Neplatná frekvencia", 7 | "block.enderstorage.ender_tank": "Nádrž z Konca", 8 | "enderstorage.command.no_arguments": "Nesprávny počet parametrov", 9 | "enderstorage.serverop": "Operátor" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/it_it.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Borsa d'omega", 3 | "block.enderstorage.ender_chest": "Baule d'omega", 4 | "enderstorage.command.no_colour": "Colore invalido: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [proprietario]", 6 | "enderstorage.command.no_freq": "Frequenza invalida", 7 | "block.enderstorage.ender_tank": "Serbatoio d'omega", 8 | "enderstorage.command.no_arguments": "Numero invalido di argomenti", 9 | "enderstorage.serverop": "Operatore" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/fr_ca.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Sac des limbes", 3 | "block.enderstorage.ender_chest": "Coffre des limbes", 4 | "enderstorage.command.no_colour": "Couleur invalide : %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [propriétaire]", 6 | "enderstorage.command.no_freq": "Fréquence invalide", 7 | "block.enderstorage.ender_tank": "Tank des limbes", 8 | "enderstorage.command.no_arguments": "Nombre invalide d'arguments", 9 | "enderstorage.serverop": "Opérateur" 10 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/fr_fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Bourse du Néant", 3 | "block.enderstorage.ender_chest": "Coffre du Néant", 4 | "enderstorage.command.no_colour": "Couleur invalide: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [propriétaire]", 6 | "enderstorage.command.no_freq": "Fréquence invalide", 7 | "block.enderstorage.ender_tank": "Réservoir du Néant", 8 | "enderstorage.command.no_arguments": "Nombre de fréquences invalide", 9 | "enderstorage.serverop": "Opérateur" 10 | } -------------------------------------------------------------------------------- /src/main/generated/data/enderstorage/recipe/ender_chest.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "enderstorage:create_recipe", 3 | "key": { 4 | "B": { 5 | "item": "minecraft:blaze_rod" 6 | }, 7 | "C": { 8 | "tag": "c:chests/wooden" 9 | }, 10 | "O": { 11 | "tag": "c:obsidians" 12 | }, 13 | "P": { 14 | "tag": "c:ender_pearls" 15 | }, 16 | "W": { 17 | "tag": "c:wools" 18 | } 19 | }, 20 | "pattern": [ 21 | "BWB", 22 | "OCO", 23 | "BPB" 24 | ], 25 | "result": { 26 | "count": 1, 27 | "id": "enderstorage:ender_chest" 28 | } 29 | } -------------------------------------------------------------------------------- /src/main/generated/data/enderstorage/recipe/ender_tank.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "enderstorage:create_recipe", 3 | "key": { 4 | "B": { 5 | "item": "minecraft:blaze_rod" 6 | }, 7 | "C": { 8 | "item": "minecraft:cauldron" 9 | }, 10 | "O": { 11 | "tag": "c:obsidians" 12 | }, 13 | "P": { 14 | "tag": "c:ender_pearls" 15 | }, 16 | "W": { 17 | "tag": "c:wools" 18 | } 19 | }, 20 | "pattern": [ 21 | "BWB", 22 | "OCO", 23 | "BPB" 24 | ], 25 | "result": { 26 | "count": 1, 27 | "id": "enderstorage:ender_tank" 28 | } 29 | } -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/lang/pl_pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.enderstorage.ender_pouch": "Międzywymiarowa sakwa", 3 | "block.enderstorage.ender_chest": "Międzywymiarowa skrzynia", 4 | "enderstorage.command.no_colour": "Nieprawidłowy kolor: %s", 5 | "enderstorage.command.usage": "enderstorage |( ) [właściciel]", 6 | "enderstorage.command.no_freq": "Nieprawidłowa częstotliwość", 7 | "block.enderstorage.ender_tank": "Międzywymiarowy zbiornik", 8 | "enderstorage.command.no_arguments": "Nieprawidłowa ilość argumentów", 9 | "enderstorage.serverop": "Operator" 10 | } 11 | -------------------------------------------------------------------------------- /src/main/generated/.cache/abeef144278732cea2d82cd73e81bf44656e216c: -------------------------------------------------------------------------------- 1 | // 1.21.1 2024-10-29T17:38:05.795940909 enderstorage Recipes. 2 | 691084b31f379bca3ee5012d2e1ed60fd81a21dd data/enderstorage/recipe/ender_chest.json 3 | 13dfd4bf2b32ea1765585784ed682be1f51df748 data/enderstorage/recipe/ender_pouch.json 4 | a1754f0a9dc4bbf739c0e028ccac04918adf5011 data/enderstorage/recipe/ender_tank.json 5 | 87e69e3098b99f159f035d53c75fcefe47f06e21 data/enderstorage/recipe/recolour_ender_chest.json 6 | 0cca6be6a44775be872a3b7f21475256d6b853fb data/enderstorage/recipe/recolour_ender_pouch.json 7 | d731673c810f7ad214dd149dc3cbb3b6f4873071 data/enderstorage/recipe/recolour_ender_tank.json 8 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/command/help/ColourHelp.java: -------------------------------------------------------------------------------- 1 | //package codechicken.enderstorage.command.help; 2 | // 3 | //import codechicken.lib.colour.EnumColour; 4 | //import codechicken.lib.command.help.IHelpPage; 5 | // 6 | //import java.util.ArrayList; 7 | //import java.util.List; 8 | // 9 | ///** 10 | // * Created by covers1624 on 23/01/2017. 11 | // */ 12 | //public class ColourHelp implements IHelpPage { 13 | // 14 | // @Override 15 | // public String getName() { 16 | // return "colour"; 17 | // } 18 | // 19 | // @Override 20 | // public String getDesc() { 21 | // return "Displays the valid colours used by EnderStorage"; 22 | // } 23 | // 24 | // @Override 25 | // public List getHelp() { 26 | // List list = new ArrayList<>(); 27 | // list.add("A colour can be one of the following names: "); 28 | // for (EnumColour colour : EnumColour.values()) { 29 | // list.add(colour.getName()); 30 | // } 31 | // return list; 32 | // } 33 | //} 34 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/plugin/EnderLiquidStoragePlugin.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.plugin; 2 | 3 | import codechicken.enderstorage.api.EnderStoragePlugin; 4 | import codechicken.enderstorage.api.Frequency; 5 | import codechicken.enderstorage.api.StorageType; 6 | import codechicken.enderstorage.manager.EnderStorageManager; 7 | import codechicken.enderstorage.storage.EnderLiquidStorage; 8 | import net.minecraft.server.level.ServerPlayer; 9 | 10 | import java.util.List; 11 | 12 | public class EnderLiquidStoragePlugin implements EnderStoragePlugin { 13 | 14 | @Override 15 | public EnderLiquidStorage createEnderStorage(EnderStorageManager manager, Frequency freq) { 16 | return new EnderLiquidStorage(manager, freq); 17 | } 18 | 19 | @Override 20 | public StorageType identifier() { 21 | return EnderLiquidStorage.TYPE; 22 | } 23 | 24 | @Override 25 | public void sendClientInfo(ServerPlayer player, List list) { 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/shaders/core/starfield.json: -------------------------------------------------------------------------------- 1 | { 2 | "blend": { 3 | "func": "add", 4 | "srcrgb": "srcalpha", 5 | "dstrgb": "1-srcalpha" 6 | }, 7 | "vertex": "enderstorage:starfield", 8 | "fragment": "enderstorage:starfield", 9 | "attributes": [ ], 10 | "samplers": [ 11 | { "name": "Sampler0" } 12 | ], 13 | "uniforms": [ 14 | { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, 15 | { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, 16 | { "name": "Time", "type": "float", "count": 1, "values": [ 0.0 ] }, 17 | { "name": "Yaw", "type": "float", "count": 1, "values": [ 0.0 ] }, 18 | { "name": "Pitch", "type": "float", "count": 1, "values": [ 0.0 ] }, 19 | { "name": "Alpha", "type": "float", "count": 1, "values": [ 0.0 ] } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/command/help/FrequencyHelp.java: -------------------------------------------------------------------------------- 1 | //package codechicken.enderstorage.command.help; 2 | // 3 | //import codechicken.lib.command.help.IHelpPage; 4 | // 5 | //import java.util.ArrayList; 6 | //import java.util.List; 7 | // 8 | ///** 9 | // * Created by covers1624 on 18/01/2017. 10 | // */ 11 | //public class FrequencyHelp implements IHelpPage { 12 | // 13 | // @Override 14 | // public String getName() { 15 | // return "frequency"; 16 | // } 17 | // 18 | // @Override 19 | // public String getDesc() { 20 | // return "Shows you how frequency is formatted inside EnderStorage commands."; 21 | // } 22 | // 23 | // @Override 24 | // public List getHelp() { 25 | // List list = new ArrayList<>(); 26 | // list.add("Frequency for commands is defined as follows:"); 27 | // list.add("\",,\""); 28 | // list.add("Colour must be the name of the colour i.e. \"red\""); 29 | // list.add("Colour can be Upper or Lowercase."); 30 | // return list; 31 | // } 32 | //} 33 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 covers1624, ChickenBones, Christopher R. Thompson (Ecu) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/neoforge.mods.toml: -------------------------------------------------------------------------------- 1 | modLoader="javafml" 2 | loaderVersion="[2,)" 3 | issueTrackerURL="https://github.com/TheCBProject/EnderStorage" 4 | license="The MIT License (MIT)" 5 | 6 | [[mods]] 7 | modId="enderstorage" 8 | displayName="EnderStorage" 9 | version="${file.jarVersion}" 10 | 11 | updateJSONURL="https://version-check.covers1624.net/check/?mod=EnderStorage&mc=${mc_version}" 12 | displayURL="https://www.curseforge.com/minecraft/mc-mods/ender-storage-1-8" 13 | authors="ChickenBones, covers1624" 14 | description=''' 15 | Stores your stuff in the END! 16 | Credits: Ecu - original idea, design, chest and pouch texture 17 | Rosethorns - tank model 18 | Soaryn - tank texture 19 | ''' 20 | [[dependencies.enderstorage]] 21 | modId="neoforge" 22 | type="required" 23 | versionRange="[${forge_version},)" 24 | ordering="NONE" 25 | side="BOTH" 26 | [[dependencies.enderstorage]] 27 | modId="minecraft" 28 | type="required" 29 | versionRange="[1.21.1]" 30 | ordering="NONE" 31 | side="BOTH" 32 | [[dependencies.enderstorage]] 33 | modId="codechickenlib" 34 | type="required" 35 | versionRange="${ccl_version_range}" 36 | ordering="AFTER" 37 | side="BOTH" 38 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/plugin/EnderItemStoragePlugin.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.plugin; 2 | 3 | import codechicken.enderstorage.api.EnderStoragePlugin; 4 | import codechicken.enderstorage.api.Frequency; 5 | import codechicken.enderstorage.api.StorageType; 6 | import codechicken.enderstorage.manager.EnderStorageManager; 7 | import codechicken.enderstorage.network.EnderStorageSPH; 8 | import codechicken.enderstorage.storage.EnderItemStorage; 9 | import net.minecraft.server.level.ServerPlayer; 10 | 11 | import java.util.List; 12 | 13 | public class EnderItemStoragePlugin implements EnderStoragePlugin { 14 | 15 | @Override 16 | public EnderItemStorage createEnderStorage(EnderStorageManager manager, Frequency freq) { 17 | return new EnderItemStorage(manager, freq); 18 | } 19 | 20 | @Override 21 | public StorageType identifier() { 22 | return EnderItemStorage.TYPE; 23 | } 24 | 25 | @Override 26 | public void sendClientInfo(ServerPlayer player, List list) { 27 | for (EnderItemStorage inv : list) { 28 | if (inv.openCount() > 0) { 29 | EnderStorageSPH.sendOpenUpdateTo(player, inv.freq, true); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/plugin/jei/EnderStorageJEIPlugin.java: -------------------------------------------------------------------------------- 1 | //package codechicken.enderstorage.plugin.jei; 2 | // 3 | //import codechicken.enderstorage.recipe.Factories; 4 | //import codechicken.enderstorage.recipe.RecipeBase; 5 | //import com.google.common.collect.Sets; 6 | //import mezz.jei.api.*; 7 | //import mezz.jei.api.gui.ICraftingGridHelper; 8 | //import mezz.jei.api.recipe.VanillaRecipeCategoryUid; 9 | //import net.minecraft.util.ResourceLocation; 10 | //import net.minecraftforge.fml.common.registry.ForgeRegistries; 11 | // 12 | //import java.util.HashSet; 13 | //import java.util.Set; 14 | // 15 | ///** 16 | // * Created by covers1624 on 8/07/2017. 17 | // */ 18 | //@JEIPlugin//TODO FIXME TODO, Recipe handler for recoloring. 19 | //public class EnderStorageJEIPlugin implements IModPlugin { 20 | // 21 | // public static ICraftingGridHelper gridHelper; 22 | // 23 | // @Override 24 | // public void register(IModRegistry registry) { 25 | // IJeiHelpers helpers = registry.getJeiHelpers(); 26 | // IGuiHelper guiHelpers = helpers.getGuiHelper(); 27 | // 28 | // gridHelper = guiHelpers.createCraftingGridHelper(1, 0); 29 | // registry.handleRecipes(Factories.CraftingRecipe.class, ESCraftingRecipeWrapper::new, VanillaRecipeCategoryUid.CRAFTING); 30 | // } 31 | // 32 | //} 33 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/api/AbstractEnderStorage.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.api; 2 | 3 | import codechicken.enderstorage.manager.EnderStorageManager; 4 | import net.minecraft.core.HolderLookup; 5 | import net.minecraft.nbt.CompoundTag; 6 | 7 | public abstract class AbstractEnderStorage { 8 | 9 | public final EnderStorageManager manager; 10 | public final Frequency freq; 11 | private boolean dirty; 12 | private int changeCount; 13 | 14 | public AbstractEnderStorage(EnderStorageManager manager, Frequency freq) { 15 | this.manager = manager; 16 | this.freq = freq; 17 | } 18 | 19 | public void setDirty() { 20 | if (manager.client) { 21 | return; 22 | } 23 | 24 | if (!dirty) { 25 | dirty = true; 26 | manager.requestSave(this); 27 | } 28 | changeCount++; 29 | } 30 | 31 | public void setClean() { 32 | dirty = false; 33 | } 34 | 35 | public int getChangeCount() { 36 | return changeCount; 37 | } 38 | 39 | public abstract void clearStorage(); 40 | 41 | public abstract String type(); 42 | 43 | public abstract CompoundTag saveToTag(HolderLookup.Provider registries); 44 | 45 | public abstract void loadFromTag(CompoundTag tag, HolderLookup.Provider registries); 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/network/EnderStorageNetwork.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.network; 2 | 3 | import codechicken.enderstorage.EnderStorage; 4 | import codechicken.lib.packet.PacketCustomChannel; 5 | import net.minecraft.resources.ResourceLocation; 6 | import net.neoforged.bus.api.IEventBus; 7 | 8 | import static codechicken.enderstorage.EnderStorage.MOD_ID; 9 | 10 | /** 11 | * Created by covers1624 on 28/10/19. 12 | */ 13 | public class EnderStorageNetwork { 14 | 15 | public static final ResourceLocation NET_CHANNEL = ResourceLocation.fromNamespaceAndPath(MOD_ID, "network"); 16 | public static final PacketCustomChannel channel = new PacketCustomChannel(NET_CHANNEL) 17 | .versioned(EnderStorage.container().getModInfo().getVersion().toString()) 18 | .client(() -> EnderStorageCPH::new) 19 | .server(() -> EnderStorageSPH::new); 20 | 21 | //Client Handled. 22 | public static final int C_TILE_UPDATE = 1; 23 | public static final int C_SET_CLIENT_OPEN = 2; 24 | public static final int C_TANK_SYNC = 3; 25 | public static final int C_LIQUID_SYNC = 4; 26 | public static final int C_PRESSURE_SYNC = 5; 27 | 28 | //Server Handled. 29 | public static final int S_VISIBILITY = 1; 30 | 31 | public static void init(IEventBus modBus) { 32 | channel.init(modBus); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/command/help/ValidStorageHelp.java: -------------------------------------------------------------------------------- 1 | //package codechicken.enderstorage.command.help; 2 | // 3 | //import codechicken.enderstorage.api.EnderStoragePlugin; 4 | //import codechicken.enderstorage.manager.EnderStorageManager; 5 | //import codechicken.lib.command.help.IHelpPage; 6 | // 7 | //import java.util.ArrayList; 8 | //import java.util.List; 9 | //import java.util.Map.Entry; 10 | // 11 | ///** 12 | // * Created by covers1624 on 18/01/2017. 13 | // */ 14 | //public class ValidStorageHelp implements IHelpPage { 15 | // 16 | // @Override 17 | // public String getName() { 18 | // return "validStorage"; 19 | // } 20 | // 21 | // @Override 22 | // public String getDesc() { 23 | // return "Displays the valid key words for systems managed by EnderStorage."; 24 | // } 25 | // 26 | // @Override 27 | // public List getHelp() { 28 | // List list = new ArrayList<>(); 29 | // list.add("This directly references what plugins are installed to EnderStorage"); 30 | // list.add("\"*\" is a valid keyword and essentially means All Plugins."); 31 | // list.add("Valid keywords:"); 32 | // for (Entry entry : EnderStorageManager.getPlugins().entrySet()) { 33 | // list.add(" " + entry.getKey()); 34 | // } 35 | // return list; 36 | // } 37 | //} 38 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/network/EnderStorageSPH.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.network; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.lib.packet.ICustomPacketHandler.IServerPacketHandler; 5 | import codechicken.lib.packet.PacketCustom; 6 | import net.minecraft.network.protocol.game.ServerGamePacketListener; 7 | import net.minecraft.server.level.ServerPlayer; 8 | import net.minecraft.server.network.ServerGamePacketListenerImpl; 9 | import net.neoforged.neoforge.server.ServerLifecycleHooks; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import static codechicken.enderstorage.network.EnderStorageNetwork.S_VISIBILITY; 13 | 14 | public class EnderStorageSPH implements IServerPacketHandler { 15 | 16 | @Override 17 | public void handlePacket(PacketCustom packet, ServerPlayer sender) { 18 | switch (packet.getType()) { 19 | case S_VISIBILITY: 20 | TankSynchroniser.handleVisiblityPacket(sender, packet); 21 | break; 22 | } 23 | } 24 | 25 | public static void sendOpenUpdateTo(@Nullable ServerPlayer player, Frequency freq, boolean open) { 26 | PacketCustom packet = new PacketCustom(EnderStorageNetwork.NET_CHANNEL, EnderStorageNetwork.C_SET_CLIENT_OPEN, ServerLifecycleHooks.getCurrentServer().registryAccess()); 27 | freq.writeToPacket(packet); 28 | packet.writeBoolean(open); 29 | packet.sendToPlayer(player); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | EnderStorage 2 | ============ 3 | EnderStorage is a mod that offers a means to store your items in The END, causing them to be everywhere and nowhere at the same time. All EnderStorage makes use of the magic of colors to link storage with its little piece of The END. Any EnderStorage with the same color code share inventory (even across dimensions). Currently there are three types of storage, EnderChest, EnderPouch, and EnderTank. 4 | 5 | EnderChests are a stationary type of EnderStorage. You can use dye on the wool pads on top of the chest to alter its color code. As an alternative, you can craft an EnderChest with three dyes to change the color code as well. EnderChests work as any other chest for the purposes of blocks that manipulate chests contents. This makes EnderChests an ideal way to transport items over vast distances in an instant. 6 | 7 | EnderPouches are a mobile type of EnderStorage. You can use an EnderPouch on any EnderChest to change the pouch color code to match that of the chest. EnderPouches access the same inventory as their EnderChest counterparts, allowing easy access to your base resources right from your inventory. 8 | 9 | EnderTanks are a stationary type of EnderStorage. You can use dye on the wool pads on top of the tank to alter its color code. EnderTanks work as a tank to store liquids. Right clicking on the dial on the front will change it between input (blue) and output (orange) mode. 10 | 11 | Current recommended and latest builds can be found at http://chickenbones.net/Pages/links.html 12 | 13 | Current maven: http://chickenbones.net/maven/ 14 | 15 | Join us on IRC: 16 | - Server: Esper.net 17 | - Channel: #ChickenBones 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/item/EnderChestItemRender.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client.render.item; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.client.render.tile.RenderTileEnderChest; 5 | import codechicken.lib.model.PerspectiveModelState; 6 | import codechicken.lib.render.CCRenderState; 7 | import codechicken.lib.render.item.IItemRenderer; 8 | import codechicken.lib.util.TransformUtils; 9 | import com.mojang.blaze3d.vertex.PoseStack; 10 | import net.minecraft.client.renderer.MultiBufferSource; 11 | import net.minecraft.world.item.ItemDisplayContext; 12 | import net.minecraft.world.item.ItemStack; 13 | 14 | /** 15 | * Created by covers1624 on 4/27/2016. 16 | */ 17 | public class EnderChestItemRender implements IItemRenderer { 18 | 19 | private final RenderTileEnderChest tileRender = new RenderTileEnderChest(null); 20 | 21 | @Override 22 | public void renderItem(ItemStack stack, ItemDisplayContext context, PoseStack poseStack, MultiBufferSource source, int packedLight, int packedOverlay) { 23 | CCRenderState ccrs = CCRenderState.instance(); 24 | ccrs.reset(); 25 | Frequency freq = Frequency.readFromStack(stack); 26 | ccrs.brightness = packedLight; 27 | ccrs.overlay = packedOverlay; 28 | tileRender.renderChest(ccrs, poseStack, source, 2, freq, 0, 0); 29 | } 30 | 31 | @Override 32 | public PerspectiveModelState getModelState() { 33 | return TransformUtils.DEFAULT_BLOCK; 34 | } 35 | 36 | @Override 37 | public boolean useAmbientOcclusion() { 38 | return false; 39 | } 40 | 41 | @Override 42 | public boolean isGui3d() { 43 | return false; 44 | } 45 | 46 | @Override 47 | public boolean usesBlockLight() { 48 | return false; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/misc/EnderKnobSlot.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.misc; 2 | 3 | import codechicken.lib.vec.Vector3; 4 | import net.minecraft.world.phys.AABB; 5 | 6 | public class EnderKnobSlot { 7 | 8 | public EnderKnobSlot(int meta) { 9 | Vector3[] verts = new Vector3[8]; 10 | verts[0] = new Vector3(-0.0625, 0.4375, -0.5); 11 | verts[1] = new Vector3(0.0625, 0.4375, -0.5); 12 | verts[3] = new Vector3(-0.0625, 0.4375, -0.4375); 13 | verts[2] = new Vector3(0.0625, 0.4375, -0.4375); 14 | verts[5] = new Vector3(-0.0625, 0.6875, -0.5); 15 | verts[4] = new Vector3(0.0625, 0.6875, -0.5); 16 | verts[6] = new Vector3(-0.0625, 0.6875, -0.4375); 17 | verts[7] = new Vector3(0.0625, 0.6875, -0.4375); 18 | 19 | for (int i = 0; i < 8; i++) { 20 | verts[i].rotate((meta + 2) * -0.5 * 3.14159, new Vector3(0, 1, 0)); 21 | verts[i].add(0.5, 0, 0.5); 22 | } 23 | 24 | aabb = cornersToAABB(verts); 25 | } 26 | 27 | private final AABB aabb; 28 | 29 | public AABB getSelectionBB() { 30 | return aabb; 31 | } 32 | 33 | public static AABB cornersToAABB(Vector3[] corners) { 34 | Vector3 min = corners[0].copy(); 35 | Vector3 max = corners[0].copy(); 36 | for (int i = 1; i < corners.length; i++) { 37 | Vector3 vec = corners[i]; 38 | if (vec.x < min.x) { 39 | min.x = vec.x; 40 | } else if (vec.x > max.x) { 41 | max.x = vec.x; 42 | } 43 | if (vec.y < min.y) { 44 | min.y = vec.y; 45 | } else if (vec.y > max.y) { 46 | max.y = vec.y; 47 | } 48 | if (vec.z < min.z) { 49 | min.z = vec.z; 50 | } else if (vec.z > max.z) { 51 | max.z = vec.z; 52 | } 53 | } 54 | return new AABB(min.x, min.y, min.z, max.x, max.y, max.z); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/item/EnderTankItemRender.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client.render.item; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.client.render.tile.RenderTileEnderTank; 5 | import codechicken.enderstorage.network.TankSynchroniser; 6 | import codechicken.lib.math.MathHelper; 7 | import codechicken.lib.model.PerspectiveModelState; 8 | import codechicken.lib.render.CCRenderState; 9 | import codechicken.lib.render.item.IItemRenderer; 10 | import codechicken.lib.util.TransformUtils; 11 | import codechicken.lib.vec.Matrix4; 12 | import com.mojang.blaze3d.vertex.PoseStack; 13 | import net.minecraft.client.renderer.MultiBufferSource; 14 | import net.minecraft.world.item.ItemDisplayContext; 15 | import net.minecraft.world.item.ItemStack; 16 | import net.neoforged.neoforge.fluids.FluidStack; 17 | 18 | /** 19 | * Created by covers1624 on 4/27/2016. 20 | */ 21 | public class EnderTankItemRender implements IItemRenderer { 22 | 23 | @Override 24 | public void renderItem(ItemStack stack, ItemDisplayContext context, PoseStack poseStack, MultiBufferSource source, int packedLight, int packedOverlay) { 25 | CCRenderState ccrs = CCRenderState.instance(); 26 | ccrs.reset(); 27 | ccrs.brightness = packedLight; 28 | ccrs.overlay = packedOverlay; 29 | Frequency freq = Frequency.readFromStack(stack); 30 | FluidStack fluid = TankSynchroniser.getClientLiquid(freq); 31 | Matrix4 mat = new Matrix4(poseStack); 32 | RenderTileEnderTank.renderTank(ccrs, mat, source, 2, (float) (MathHelper.torad * 90F), freq, 0); 33 | mat.translate(-0.5, 0, -0.5); 34 | RenderTileEnderTank.renderFluid(ccrs, mat, source, fluid); 35 | } 36 | 37 | @Override 38 | public PerspectiveModelState getModelState() { 39 | return TransformUtils.DEFAULT_BLOCK; 40 | } 41 | 42 | @Override 43 | public boolean useAmbientOcclusion() { 44 | return false; 45 | } 46 | 47 | @Override 48 | public boolean isGui3d() { 49 | return false; 50 | } 51 | 52 | @Override 53 | public boolean usesBlockLight() { 54 | return false; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/network/EnderStorageCPH.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.network; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.manager.EnderStorageManager; 5 | import codechicken.enderstorage.storage.EnderItemStorage; 6 | import codechicken.enderstorage.tile.TileEnderTank; 7 | import codechicken.enderstorage.tile.TileFrequencyOwner; 8 | import codechicken.lib.packet.ICustomPacketHandler.IClientPacketHandler; 9 | import codechicken.lib.packet.PacketCustom; 10 | import net.minecraft.client.Minecraft; 11 | import net.minecraft.client.multiplayer.ClientPacketListener; 12 | import net.minecraft.core.BlockPos; 13 | import net.minecraft.world.level.Level; 14 | 15 | import static codechicken.enderstorage.network.EnderStorageNetwork.*; 16 | 17 | public class EnderStorageCPH implements IClientPacketHandler { 18 | 19 | @Override 20 | public void handlePacket(PacketCustom packet, Minecraft mc) { 21 | assert mc.level != null; 22 | switch (packet.getType()) { 23 | case C_TILE_UPDATE: 24 | if (mc.level.getBlockEntity(packet.readPos()) instanceof TileFrequencyOwner tile) { 25 | tile.readFromPacket(packet); 26 | } 27 | break; 28 | case C_SET_CLIENT_OPEN: 29 | EnderStorageManager.instance(true).getStorage(Frequency.readFromPacket(packet), EnderItemStorage.TYPE).setClientOpen(packet.readBoolean() ? 1 : 0); 30 | break; 31 | case C_TANK_SYNC: 32 | TankSynchroniser.syncClient(Frequency.readFromPacket(packet), packet.readFluidStack()); 33 | break; 34 | case C_LIQUID_SYNC: 35 | if (mc.level.getBlockEntity(packet.readPos()) instanceof TileEnderTank tile) { 36 | tile.liquid_state.sync(packet.readFluidStack()); 37 | } 38 | break; 39 | case C_PRESSURE_SYNC: 40 | if (mc.level.getBlockEntity(packet.readPos()) instanceof TileEnderTank tile) { 41 | tile.pressure_state.a_pressure = packet.readBoolean(); 42 | } 43 | break; 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/EnderStorage.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage; 2 | 3 | import codechicken.enderstorage.config.EnderStorageConfig; 4 | import codechicken.enderstorage.init.ClientInit; 5 | import codechicken.enderstorage.init.DataGenerators; 6 | import codechicken.enderstorage.init.EnderStorageModContent; 7 | import codechicken.enderstorage.manager.EnderStorageManager; 8 | import codechicken.enderstorage.network.EnderStorageNetwork; 9 | import codechicken.enderstorage.network.TankSynchroniser; 10 | import codechicken.enderstorage.plugin.EnderItemStoragePlugin; 11 | import codechicken.enderstorage.plugin.EnderLiquidStoragePlugin; 12 | import net.neoforged.bus.api.IEventBus; 13 | import net.neoforged.fml.ModContainer; 14 | import net.neoforged.fml.common.Mod; 15 | import net.neoforged.fml.loading.FMLEnvironment; 16 | import net.neoforged.neoforge.common.NeoForge; 17 | import org.jetbrains.annotations.Nullable; 18 | 19 | import static codechicken.enderstorage.EnderStorage.MOD_ID; 20 | import static java.util.Objects.requireNonNull; 21 | 22 | @Mod (MOD_ID) 23 | public class EnderStorage { 24 | 25 | public static final String MOD_ID = "enderstorage"; 26 | 27 | private static @Nullable ModContainer container; 28 | 29 | public EnderStorage(ModContainer container, IEventBus modBus) { 30 | EnderStorage.container = container; 31 | EnderStorageConfig.load(); 32 | 33 | EnderStorageModContent.init(modBus); 34 | if (FMLEnvironment.dist.isClient()) { 35 | ClientInit.init(modBus); 36 | } 37 | 38 | EnderStorageNetwork.init(modBus); 39 | 40 | EnderStorageManager.init(); 41 | EnderStorageManager.registerPlugin(new EnderItemStoragePlugin()); 42 | EnderStorageManager.registerPlugin(new EnderLiquidStoragePlugin()); 43 | 44 | NeoForge.EVENT_BUS.register(new EnderStorageManager.EnderStorageSaveHandler()); 45 | NeoForge.EVENT_BUS.register(new TankSynchroniser()); 46 | 47 | DataGenerators.init(modBus); 48 | } 49 | 50 | public static ModContainer container() { 51 | return requireNonNull(container); 52 | } 53 | 54 | // @Mod.EventHandler 55 | // public void serverStarting(FMLServerStartingEvent event) { 56 | // event.registerServerCommand(new EnderStorageCommand()); 57 | // } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/Shaders.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client; 2 | 3 | import codechicken.lib.render.shader.CCShaderInstance; 4 | import codechicken.lib.render.shader.CCUniform; 5 | import com.mojang.blaze3d.vertex.DefaultVertexFormat; 6 | import net.covers1624.quack.util.CrashLock; 7 | import net.minecraft.resources.ResourceLocation; 8 | import net.neoforged.bus.api.IEventBus; 9 | import net.neoforged.neoforge.client.event.RegisterShadersEvent; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import static codechicken.enderstorage.EnderStorage.MOD_ID; 13 | import static java.util.Objects.requireNonNull; 14 | 15 | /** 16 | * Created by covers1624 on 6/4/22. 17 | */ 18 | public class Shaders { 19 | 20 | private static final CrashLock LOCK = new CrashLock("Already Initialized"); 21 | 22 | private static @Nullable CCShaderInstance starfieldShader; 23 | private static @Nullable CCUniform starfieldTime; 24 | private static @Nullable CCUniform starfieldYaw; 25 | private static @Nullable CCUniform starfieldPitch; 26 | private static @Nullable CCUniform starfieldAlpha; 27 | 28 | public static void init(IEventBus modBus) { 29 | LOCK.lock(); 30 | modBus.addListener(Shaders::onRegisterShaders); 31 | } 32 | 33 | private static void onRegisterShaders(RegisterShadersEvent event) { 34 | event.registerShader(CCShaderInstance.create(event.getResourceProvider(), ResourceLocation.fromNamespaceAndPath(MOD_ID, "starfield"), DefaultVertexFormat.POSITION), e -> { 35 | starfieldShader = (CCShaderInstance) e; 36 | starfieldTime = starfieldShader.getUniform("Time"); 37 | starfieldYaw = starfieldShader.getUniform("Yaw"); 38 | starfieldPitch = starfieldShader.getUniform("Pitch"); 39 | starfieldAlpha = starfieldShader.getUniform("Alpha"); 40 | }); 41 | } 42 | 43 | // @formatter:off 44 | public static CCShaderInstance starfieldShader() { return requireNonNull(starfieldShader); } 45 | public static CCUniform starfieldTime() { return requireNonNull(starfieldTime); } 46 | public static CCUniform starfieldYaw() { return requireNonNull(starfieldYaw); } 47 | public static CCUniform starfieldPitch() { return requireNonNull(starfieldPitch); } 48 | public static CCUniform starfieldAlpha() { return requireNonNull(starfieldAlpha); } 49 | // @formatter:on 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/gui/GuiEnderItemStorage.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client.gui; 2 | 3 | import codechicken.enderstorage.container.ContainerEnderItemStorage; 4 | import net.minecraft.client.gui.GuiGraphics; 5 | import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; 6 | import net.minecraft.network.chat.Component; 7 | import net.minecraft.resources.ResourceLocation; 8 | import net.minecraft.world.entity.player.Inventory; 9 | 10 | public class GuiEnderItemStorage extends AbstractContainerScreen { 11 | 12 | public GuiEnderItemStorage(ContainerEnderItemStorage container, Inventory playerInv, Component title) { 13 | super(container, playerInv, title); 14 | 15 | if (container.chestInv.getSize() == 2) { 16 | imageHeight = 222; 17 | } 18 | } 19 | 20 | @Override 21 | public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { 22 | renderBackground(graphics, mouseX, mouseY, partialTicks); 23 | super.render(graphics, mouseX, mouseY, partialTicks); 24 | renderTooltip(graphics, mouseX, mouseY); 25 | } 26 | 27 | @Override 28 | protected void renderLabels(GuiGraphics graphics, int mouseX, int mouseY) { 29 | graphics.drawString(font, title.getVisualOrderText(), 8, 6, 0x404040, false); 30 | graphics.drawString(font, playerInventoryTitle.getVisualOrderText(), 8, imageHeight - 94, 0x404040, false); 31 | menu.chestInv.freq.ownerName().ifPresent(name -> { 32 | graphics.drawString(font, name.getVisualOrderText(), 170 - font.width(name), 6, 0x404040, false); 33 | }); 34 | } 35 | 36 | @Override 37 | protected void renderBg(GuiGraphics graphics, float partialTicks, int mouseX, int mouseY) { 38 | ResourceLocation texture = ResourceLocation.withDefaultNamespace(menu.chestInv.getSize() == 0 ? "textures/gui/container/dispenser.png" : "textures/gui/container/generic_54.png"); 39 | int x = (width - imageWidth) / 2; 40 | int y = (height - imageHeight) / 2; 41 | 42 | switch (menu.chestInv.getSize()) { 43 | case 0: 44 | case 2: 45 | graphics.blit(texture, x, y, 0, 0, imageWidth, imageHeight); 46 | break; 47 | case 1: 48 | graphics.blit(texture, x, y, 0, 0, imageWidth, 71); 49 | graphics.blit(texture, x, y + 71, 0, 126, imageWidth, 96); 50 | break; 51 | 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/model/ButtonModelLibrary.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client.model; 2 | 3 | import codechicken.enderstorage.tile.TileFrequencyOwner; 4 | import codechicken.lib.render.CCModel; 5 | import codechicken.lib.vec.Vector3; 6 | import codechicken.lib.vec.Vertex5; 7 | 8 | public class ButtonModelLibrary { 9 | 10 | public static CCModel button; 11 | 12 | static { 13 | button = CCModel.quadModel(20); 14 | Vector3 min = TileFrequencyOwner.SELECTION_BUTTON.min; 15 | Vector3 max = TileFrequencyOwner.SELECTION_BUTTON.max; 16 | Vector3[] corners = new Vector3[8]; 17 | corners[0] = new Vector3(min.x, min.y, min.z); 18 | corners[1] = new Vector3(max.x, min.y, min.z); 19 | corners[3] = new Vector3(min.x, max.y, min.z); 20 | corners[2] = new Vector3(max.x, max.y, min.z); 21 | corners[4] = new Vector3(min.x, min.y, max.z); 22 | corners[5] = new Vector3(max.x, min.y, max.z); 23 | corners[7] = new Vector3(min.x, max.y, max.z); 24 | corners[6] = new Vector3(max.x, max.y, max.z); 25 | 26 | int i = 0; 27 | Vertex5[] verts = button.verts; 28 | 29 | verts[i++] = new Vertex5(corners[7], 0.0938, 0.0625); 30 | verts[i++] = new Vertex5(corners[6], 0.1562, 0.0625); 31 | verts[i++] = new Vertex5(corners[2], 0.1562, 0.1875); 32 | verts[i++] = new Vertex5(corners[3], 0.0938, 0.1875); 33 | 34 | verts[i++] = new Vertex5(corners[4], 0.0938, 0.0313); 35 | verts[i++] = new Vertex5(corners[5], 0.1562, 0.0624); 36 | verts[i++] = new Vertex5(corners[6], 0.1562, 0.0624); 37 | verts[i++] = new Vertex5(corners[7], 0.0938, 0.0313); 38 | 39 | verts[i++] = new Vertex5(corners[0], 0.0938, 0.2186); 40 | verts[i++] = new Vertex5(corners[3], 0.0938, 0.1876); 41 | verts[i++] = new Vertex5(corners[2], 0.1562, 0.1876); 42 | verts[i++] = new Vertex5(corners[1], 0.1562, 0.2186); 43 | 44 | verts[i++] = new Vertex5(corners[6], 0.1563, 0.0626); 45 | verts[i++] = new Vertex5(corners[5], 0.1874, 0.0626); 46 | verts[i++] = new Vertex5(corners[1], 0.1874, 0.1874); 47 | verts[i++] = new Vertex5(corners[2], 0.1563, 0.1874); 48 | 49 | verts[i++] = new Vertex5(corners[7], 0.0937, 0.0626); 50 | verts[i++] = new Vertex5(corners[3], 0.0937, 0.1874); 51 | verts[i++] = new Vertex5(corners[0], 0.0626, 0.1874); 52 | verts[i++] = new Vertex5(corners[4], 0.0626, 0.0626); 53 | 54 | button.computeNormals(); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/command/EnderStorageCommand.java: -------------------------------------------------------------------------------- 1 | //package codechicken.enderstorage.command; 2 | // 3 | //import codechicken.enderstorage.command.help.ColourHelp; 4 | //import codechicken.enderstorage.command.help.FrequencyHelp; 5 | //import codechicken.enderstorage.command.help.ValidStorageHelp; 6 | //import codechicken.lib.command.help.HelpCommandBase; 7 | //import codechicken.lib.command.help.IHelpCommandHost; 8 | //import com.google.common.collect.ImmutableList; 9 | //import net.minecraft.command.CommandException; 10 | //import net.minecraft.command.ICommand; 11 | //import net.minecraft.command.ICommandSender; 12 | //import net.minecraft.server.MinecraftServer; 13 | //import net.minecraftforge.server.command.CommandTreeBase; 14 | // 15 | //import java.util.List; 16 | //import java.util.Map; 17 | // 18 | ///** 19 | // * Created by covers1624 on 18/01/2017. 20 | // */ 21 | //public class EnderStorageCommand extends CommandTreeBase implements IHelpCommandHost { 22 | // 23 | // private HelpCommandBase helpCommand; 24 | // 25 | // public EnderStorageCommand() { 26 | // helpCommand = new HelpCommandBase(this); 27 | // addSubcommand(helpCommand); 28 | // addSubcommand(new ClearCommand()); 29 | // helpCommand.addHelpPage(new ColourHelp()); 30 | // helpCommand.addHelpPage(new FrequencyHelp()); 31 | // helpCommand.addHelpPage(new ValidStorageHelp()); 32 | // } 33 | // 34 | // @Override 35 | // public String getName() { 36 | // return "EnderStorage"; 37 | // } 38 | // 39 | // @Override 40 | // public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { 41 | // if (args.length < 1) { 42 | // helpCommand.displayHelp(server, sender); 43 | // } else { 44 | // super.execute(server, sender, args); 45 | // } 46 | // } 47 | // 48 | // @Override 49 | // public List getAliases() { 50 | // //TODO Is "ES" already used by someone? 51 | // return ImmutableList.of("ES", "es", "EnderStorage", "enderstorage"); 52 | // } 53 | // 54 | // @Override 55 | // public String getUsage(ICommandSender sender) { 56 | // return "/" + getName() + " help"; 57 | // } 58 | // 59 | // @Override 60 | // public int getRequiredPermissionLevel() { 61 | // return 0; 62 | // } 63 | // 64 | // @Override 65 | // public Map getSubCommandMap() { 66 | // return getCommandMap(); 67 | // } 68 | // 69 | // @Override 70 | // public String getParentName() { 71 | // return getName(); 72 | // } 73 | //} 74 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/item/ItemEnderStorage.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.item; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.tile.TileFrequencyOwner; 5 | import net.minecraft.core.BlockPos; 6 | import net.minecraft.network.chat.Component; 7 | import net.minecraft.world.entity.player.Player; 8 | import net.minecraft.world.item.*; 9 | import net.minecraft.world.level.Level; 10 | import net.minecraft.world.level.block.Block; 11 | import net.minecraft.world.level.block.state.BlockState; 12 | import org.jetbrains.annotations.Nullable; 13 | 14 | import java.util.List; 15 | 16 | public class ItemEnderStorage extends BlockItem { 17 | 18 | public ItemEnderStorage(Block block) { 19 | super(block, new Properties()); 20 | } 21 | 22 | public Frequency getFreq(ItemStack stack) { 23 | return Frequency.readFromStack(stack); 24 | } 25 | 26 | @Override 27 | protected boolean updateCustomBlockEntityTag(BlockPos pos, Level world, @Nullable Player player, ItemStack stack, BlockState state) { 28 | boolean flag = super.updateCustomBlockEntityTag(pos, world, player, stack, state); 29 | TileFrequencyOwner tile = (TileFrequencyOwner) world.getBlockEntity(pos); 30 | if (tile != null) { 31 | tile.setFreq(getFreq(stack)); 32 | return true; 33 | } 34 | 35 | return flag; 36 | } 37 | 38 | @Override 39 | public void appendHoverText(ItemStack stack, Item.TooltipContext ctx, List tooltip, TooltipFlag flagIn) { 40 | Frequency frequency = Frequency.readFromStack(stack); 41 | frequency.ownerName().ifPresent(tooltip::add); 42 | tooltip.add(frequency.getTooltip()); 43 | } 44 | 45 | // private EnderLiquidStorage getLiquidStorage(ItemStack stack) { 46 | // return (EnderLiquidStorage) EnderStorageManager.instance(FMLCommonHandler.instance().getSide().isClient()).getStorage(getFreq(stack), "liquid"); 47 | // } 48 | // 49 | // @Override 50 | // public ICapabilityProvider initCapabilities(final ItemStack stack, NBTTagCompound nbt) { 51 | // if (getMetadata(stack) == 1) { 52 | // return new ICapabilityProvider() { 53 | // @Override 54 | // public boolean hasCapability(Capability capability, @Nullable EnumFacing facing) { 55 | // 56 | // return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY; 57 | // } 58 | // 59 | // @Override 60 | // public T getCapability(Capability capability, @Nullable EnumFacing facing) { 61 | // 62 | // return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY ? getLiquidStorage(stack) : null); 63 | // } 64 | // }; 65 | // } 66 | // return null; 67 | // } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/item/ItemEnderPouch.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.item; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.config.EnderStorageConfig; 5 | import codechicken.enderstorage.manager.EnderStorageManager; 6 | import codechicken.enderstorage.storage.EnderItemStorage; 7 | import codechicken.enderstorage.tile.TileEnderChest; 8 | import net.minecraft.network.chat.Component; 9 | import net.minecraft.server.level.ServerPlayer; 10 | import net.minecraft.world.InteractionHand; 11 | import net.minecraft.world.InteractionResult; 12 | import net.minecraft.world.InteractionResultHolder; 13 | import net.minecraft.world.entity.player.Player; 14 | import net.minecraft.world.item.Item; 15 | import net.minecraft.world.item.ItemStack; 16 | import net.minecraft.world.item.TooltipFlag; 17 | import net.minecraft.world.item.context.UseOnContext; 18 | import net.minecraft.world.level.Level; 19 | import net.minecraft.world.level.block.entity.BlockEntity; 20 | 21 | import java.util.List; 22 | 23 | public class ItemEnderPouch extends Item { 24 | 25 | public ItemEnderPouch() { 26 | super(new Item.Properties() 27 | .stacksTo(1) 28 | ); 29 | } 30 | 31 | @Override 32 | public void appendHoverText(ItemStack stack, Item.TooltipContext ctx, List tooltip, TooltipFlag flagIn) { 33 | Frequency frequency = Frequency.readFromStack(stack); 34 | frequency.ownerName().ifPresent(tooltip::add); 35 | tooltip.add(frequency.getTooltip()); 36 | } 37 | 38 | @Override 39 | public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { 40 | Level world = context.getLevel(); 41 | if (world.isClientSide()) { 42 | return InteractionResult.PASS; 43 | } 44 | 45 | Player player = context.getPlayer(); 46 | BlockEntity tile = world.getBlockEntity(context.getClickedPos()); 47 | if (tile instanceof TileEnderChest chest && player != null && player.isCrouching()) { 48 | Frequency frequency = chest.getFrequency(); 49 | if (EnderStorageConfig.anarchyMode && !(frequency.owner().isPresent() && frequency.owner().get().equals(player.getUUID()))) { 50 | frequency = frequency.withoutOwner(); 51 | } 52 | 53 | frequency.writeToStack(stack); 54 | 55 | return InteractionResult.SUCCESS; 56 | } 57 | return InteractionResult.PASS; 58 | } 59 | 60 | @Override 61 | public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { 62 | ItemStack stack = player.getItemInHand(hand); 63 | if (player.isCrouching()) { 64 | return new InteractionResultHolder<>(InteractionResult.PASS, stack); 65 | } 66 | if (!world.isClientSide) { 67 | Frequency frequency = Frequency.readFromStack(stack); 68 | EnderStorageManager.instance(false).getStorage(frequency, EnderItemStorage.TYPE).openContainer((ServerPlayer) player, Component.translatable(stack.getDescriptionId())); 69 | } 70 | return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | @rem SPDX-License-Identifier: Apache-2.0 17 | @rem 18 | 19 | @if "%DEBUG%"=="" @echo off 20 | @rem ########################################################################## 21 | @rem 22 | @rem Gradle startup script for Windows 23 | @rem 24 | @rem ########################################################################## 25 | 26 | @rem Set local scope for the variables with windows NT shell 27 | if "%OS%"=="Windows_NT" setlocal 28 | 29 | set DIRNAME=%~dp0 30 | if "%DIRNAME%"=="" set DIRNAME=. 31 | @rem This is normally unused 32 | set APP_BASE_NAME=%~n0 33 | set APP_HOME=%DIRNAME% 34 | 35 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 36 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 37 | 38 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 39 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 40 | 41 | @rem Find java.exe 42 | if defined JAVA_HOME goto findJavaFromJavaHome 43 | 44 | set JAVA_EXE=java.exe 45 | %JAVA_EXE% -version >NUL 2>&1 46 | if %ERRORLEVEL% equ 0 goto execute 47 | 48 | echo. 1>&2 49 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 50 | echo. 1>&2 51 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 52 | echo location of your Java installation. 1>&2 53 | 54 | goto fail 55 | 56 | :findJavaFromJavaHome 57 | set JAVA_HOME=%JAVA_HOME:"=% 58 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 59 | 60 | if exist "%JAVA_EXE%" goto execute 61 | 62 | echo. 1>&2 63 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 64 | echo. 1>&2 65 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 66 | echo location of your Java installation. 1>&2 67 | 68 | goto fail 69 | 70 | :execute 71 | @rem Setup the command line 72 | 73 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 74 | 75 | 76 | @rem Execute Gradle 77 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 78 | 79 | :end 80 | @rem End local scope for the variables with windows NT shell 81 | if %ERRORLEVEL% equ 0 goto mainEnd 82 | 83 | :fail 84 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 85 | rem the _cmd.exe /c_ return code! 86 | set EXIT_CODE=%ERRORLEVEL% 87 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 88 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 89 | exit /b %EXIT_CODE% 90 | 91 | :mainEnd 92 | if "%OS%"=="Windows_NT" endlocal 93 | 94 | :omega 95 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/storage/EnderLiquidStorage.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.storage; 2 | 3 | import codechicken.enderstorage.api.AbstractEnderStorage; 4 | import codechicken.enderstorage.api.Frequency; 5 | import codechicken.enderstorage.api.StorageType; 6 | import codechicken.enderstorage.manager.EnderStorageManager; 7 | import codechicken.lib.fluid.FluidUtils; 8 | import net.minecraft.core.HolderLookup; 9 | import net.minecraft.nbt.CompoundTag; 10 | import net.neoforged.neoforge.fluids.FluidStack; 11 | import net.neoforged.neoforge.fluids.IFluidTank; 12 | import net.neoforged.neoforge.fluids.capability.IFluidHandler; 13 | import net.neoforged.neoforge.fluids.capability.templates.FluidTank; 14 | 15 | public class EnderLiquidStorage extends AbstractEnderStorage implements IFluidHandler, IFluidTank { 16 | 17 | public static final StorageType TYPE = new StorageType<>("liquid"); 18 | 19 | public static final int CAPACITY = 16 * FluidUtils.B; 20 | 21 | private class Tank extends FluidTank { 22 | 23 | public Tank(int capacity) { 24 | super(capacity); 25 | } 26 | 27 | @Override 28 | protected void onContentsChanged() { 29 | setDirty(); 30 | } 31 | } 32 | 33 | private Tank tank; 34 | 35 | public EnderLiquidStorage(EnderStorageManager manager, Frequency freq) { 36 | super(manager, freq); 37 | tank = new Tank(CAPACITY); 38 | } 39 | 40 | @Override 41 | public void clearStorage() { 42 | tank = new Tank(CAPACITY); 43 | setDirty(); 44 | } 45 | 46 | @Override 47 | public void loadFromTag(CompoundTag tag, HolderLookup.Provider registries) { 48 | tank.readFromNBT(registries, tag.getCompound("tank")); 49 | } 50 | 51 | @Override 52 | public String type() { 53 | return "liquid"; 54 | } 55 | 56 | @Override 57 | public CompoundTag saveToTag(HolderLookup.Provider registries) { 58 | CompoundTag compound = new CompoundTag(); 59 | compound.put("tank", tank.writeToNBT(registries, new CompoundTag())); 60 | 61 | return compound; 62 | } 63 | 64 | //@formatter:off 65 | @Override public FluidStack getFluid() { return tank.getFluid(); } 66 | @Override public int getFluidAmount() { return tank.getFluidAmount(); } 67 | @Override public int getCapacity() { return tank.getCapacity(); } 68 | @Override public boolean isFluidValid(FluidStack stack) { return tank.isFluidValid(stack); } 69 | @Override public int getTanks() { return tank.getTanks(); } 70 | @Override public FluidStack getFluidInTank(int tankId) { return tank.getFluidInTank(tankId); } 71 | @Override public int getTankCapacity(int tankId) { return tank.getTankCapacity(tankId); } 72 | @Override public boolean isFluidValid(int tankId, FluidStack stack) { return tank.isFluidValid(tankId, stack); } 73 | @Override public int fill(FluidStack resource, FluidAction action) { return tank.fill(resource, action); } 74 | @Override public FluidStack drain(FluidStack resource, FluidAction action) { return tank.drain(resource, action); } 75 | @Override public FluidStack drain(int maxDrain, FluidAction action) { return tank.drain(maxDrain, action); } 76 | //@formatter:on 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/recipe/CreateRecipe.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.recipe; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.init.EnderStorageModContent; 5 | import codechicken.lib.colour.EnumColour; 6 | import com.mojang.serialization.Codec; 7 | import com.mojang.serialization.MapCodec; 8 | import com.mojang.serialization.codecs.RecordCodecBuilder; 9 | import net.minecraft.core.HolderLookup; 10 | import net.minecraft.network.RegistryFriendlyByteBuf; 11 | import net.minecraft.network.codec.ByteBufCodecs; 12 | import net.minecraft.network.codec.StreamCodec; 13 | import net.minecraft.world.item.ItemStack; 14 | import net.minecraft.world.item.crafting.*; 15 | 16 | /** 17 | * Created by covers1624 on 1/11/19. 18 | */ 19 | public class CreateRecipe extends ShapedRecipe { 20 | 21 | public CreateRecipe(String group, ShapedRecipePattern pattern, ItemStack result) { 22 | super(group, CraftingBookCategory.MISC, pattern, result.copy(), true); 23 | } 24 | 25 | @Override 26 | public ItemStack assemble(CraftingInput inv, HolderLookup.Provider registries) { 27 | EnumColour colour = EnumColour.WHITE; 28 | // Create recipe only has a single wool. 29 | // We find it and set the colour to that. 30 | finish: 31 | for (int x = 0; x < inv.width(); x++) { 32 | for (int y = 0; y < inv.height(); y++) { 33 | ItemStack stack = inv.getItem(x, y); 34 | if (!stack.isEmpty()) { 35 | EnumColour c = EnumColour.fromWoolStack(stack); 36 | if (c != null) { 37 | colour = c; 38 | break finish; 39 | } 40 | } 41 | } 42 | } 43 | Frequency frequency = new Frequency(colour, colour, colour); 44 | return frequency.writeToStack(super.assemble(inv, registries)); 45 | } 46 | 47 | @Override 48 | public RecipeSerializer getSerializer() { 49 | return EnderStorageModContent.CREATE_RECIPE_SERIALIZER.get(); 50 | } 51 | 52 | public static class Serializer implements RecipeSerializer { 53 | 54 | private static final MapCodec CODEC = RecordCodecBuilder.mapCodec(builder -> builder.group( 55 | Codec.STRING.optionalFieldOf("group", "").forGetter(e -> e.group), 56 | ShapedRecipePattern.MAP_CODEC.forGetter(e -> e.pattern), 57 | ItemStack.STRICT_CODEC.fieldOf("result").forGetter(e -> e.result) 58 | ).apply(builder, CreateRecipe::new) 59 | ); 60 | 61 | private static final StreamCodec STREAM_CODEC = StreamCodec.composite( 62 | ByteBufCodecs.STRING_UTF8, e -> e.group, 63 | ShapedRecipePattern.STREAM_CODEC, e -> e.pattern, 64 | ItemStack.STREAM_CODEC, e -> e.result, 65 | CreateRecipe::new 66 | ); 67 | 68 | @Override 69 | public MapCodec codec() { 70 | return CODEC; 71 | } 72 | 73 | @Override 74 | public StreamCodec streamCodec() { 75 | return STREAM_CODEC; 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/entity/TankLayerRenderer.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client.render.entity; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.client.render.tile.RenderTileEnderTank; 5 | import codechicken.lib.fluid.FluidUtils; 6 | import codechicken.lib.math.MathHelper; 7 | import codechicken.lib.render.CCRenderState; 8 | import codechicken.lib.render.RenderUtils; 9 | import codechicken.lib.util.ClientUtils; 10 | import codechicken.lib.vec.Matrix4; 11 | import codechicken.lib.vec.Vector3; 12 | import com.mojang.blaze3d.vertex.PoseStack; 13 | import net.minecraft.client.model.PlayerModel; 14 | import net.minecraft.client.player.AbstractClientPlayer; 15 | import net.minecraft.client.renderer.MultiBufferSource; 16 | import net.minecraft.client.renderer.entity.RenderLayerParent; 17 | import net.minecraft.client.renderer.entity.layers.RenderLayer; 18 | import net.minecraft.client.renderer.texture.OverlayTexture; 19 | import net.neoforged.neoforge.fluids.FluidStack; 20 | 21 | import java.util.Arrays; 22 | import java.util.Set; 23 | import java.util.UUID; 24 | import java.util.stream.Collectors; 25 | 26 | /** 27 | * Created by covers1624 on 15/12/2016. 28 | */ 29 | public class TankLayerRenderer extends RenderLayer> { 30 | 31 | private static final String[] UUID_STRINGS = { 32 | "c85f3fd3-1754-45ec-ab3d-a33d6312dfef", 33 | "c501d550-7e3c-463e-8a95-256f86d9a47d", 34 | "cf3e2c7e-d703-48e0-808e-f139bf26ff9d", 35 | "44ba40ef-fd8a-446f-834b-5aea42119c92" 36 | }; 37 | private static final Set UUIDS = Arrays.stream(UUID_STRINGS) 38 | .map(UUID::fromString) 39 | .collect(Collectors.toSet()); 40 | private static final Frequency BLANK = new Frequency(); 41 | 42 | public TankLayerRenderer(RenderLayerParent> parent) { 43 | super(parent); 44 | } 45 | 46 | @Override 47 | public void render(PoseStack mStack, MultiBufferSource buffers, int packedLight, AbstractClientPlayer entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { 48 | if (UUIDS.contains(entity.getUUID())) { 49 | CCRenderState ccrs = CCRenderState.instance(); 50 | ccrs.brightness = packedLight; 51 | ccrs.overlay = OverlayTexture.NO_OVERLAY; 52 | Matrix4 mat = new Matrix4(mStack); 53 | mat.rotate(MathHelper.torad * 180, Vector3.X_POS); 54 | mat.scale(0.5); 55 | if (entity.isCrouching()) { 56 | mat.translate(0, -0.5, 0); 57 | } 58 | if (entity.isFallFlying()) { 59 | headPitch = -45; 60 | } 61 | mat.rotate(netHeadYaw * MathHelper.torad, Vector3.Y_NEG); 62 | mat.rotate(headPitch * MathHelper.torad, Vector3.X_POS); 63 | mat.translate(-0.5, 1, -0.5); 64 | RenderTileEnderTank.renderTank(ccrs, mat, buffers, 0, (float) (MathHelper.torad * 90F), BLANK, 0); 65 | 66 | FluidStack stack = FluidUtils.water.copy(); 67 | float bob = 0.45F + RenderUtils.getPearlBob(ClientUtils.getRenderTime()) * 2; 68 | stack.setAmount((int) MathHelper.map(bob, 0.2, 0.6, 1000, 14000)); 69 | mat.translate(-0.5, 0, -0.5); 70 | RenderTileEnderTank.renderFluid(ccrs, mat, buffers, stack); 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/config/EnderStorageConfig.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.config; 2 | 3 | import codechicken.lib.config.ConfigCategory; 4 | import codechicken.lib.config.ConfigFile; 5 | import codechicken.lib.config.ConfigValue; 6 | import com.mojang.logging.LogUtils; 7 | import net.covers1624.quack.util.CrashLock; 8 | import net.minecraft.core.registries.BuiltInRegistries; 9 | import net.minecraft.resources.ResourceLocation; 10 | import net.minecraft.world.item.Item; 11 | import net.minecraft.world.item.ItemStack; 12 | import net.minecraft.world.item.Items; 13 | import org.jetbrains.annotations.Nullable; 14 | import org.slf4j.Logger; 15 | 16 | import java.nio.file.Paths; 17 | 18 | import static codechicken.enderstorage.EnderStorage.MOD_ID; 19 | import static java.util.Objects.requireNonNull; 20 | 21 | /** 22 | * Created by covers1624 on 28/10/19. 23 | */ 24 | public class EnderStorageConfig { 25 | 26 | private static final Logger LOGGER = LogUtils.getLogger(); 27 | private static final CrashLock LOCK = new CrashLock("Already initialized."); 28 | 29 | private static @Nullable ConfigValue personalItemTag; 30 | @Nullable 31 | private static ItemStack personalItem; 32 | public static boolean anarchyMode; 33 | public static int storageSize; 34 | 35 | public static boolean disableCreatorVisuals; 36 | public static boolean useVanillaEnderChestSounds; 37 | 38 | public static void load() { 39 | LOCK.lock(); 40 | 41 | ConfigCategory config = new ConfigFile(MOD_ID) 42 | .path(Paths.get("./config/EnderStorage.cfg")) 43 | .load(); 44 | // ConfigSyncManager.registerSync(new ResourceLocation("enderstorage:config"), config); 45 | personalItemTag = config.getValue("personalItem") 46 | .setComment("The RegistryName for the Item to lock EnderChests and Tanks.") 47 | .setDefaultString("minecraft:diamond"); 48 | anarchyMode = config.getValue("anarchyMode") 49 | .setComment("Causes chests to lose personal settings and drop the diamond on break.") 50 | .setDefaultBoolean(false) 51 | .getBoolean(); 52 | storageSize = config.getValue("item_storage_size") 53 | .setComment("The size of each inventory of EnderStorage, 0 = 3x3, 1 = 3x9, 2 = 6x9, default = 1") 54 | .setDefaultInt(1) 55 | .getInt(); 56 | 57 | disableCreatorVisuals = config.getValue("disableCreatorVisuals") 58 | .setComment("Disables the tank on top of creators heads.") 59 | .setDefaultBoolean(false) 60 | .getBoolean(); 61 | useVanillaEnderChestSounds = config.getValue("useVanillaEnderChestsSounds") 62 | .setComment("Enable this to make EnderStorage use vanilla's EnderChest sounds instead of the standard chest.") 63 | .setDefaultBoolean(false) 64 | .getBoolean(); 65 | config.save(); 66 | } 67 | 68 | public static ItemStack getPersonalItem() { 69 | requireNonNull(personalItemTag); 70 | 71 | if (personalItem == null) { 72 | Item item = BuiltInRegistries.ITEM.get(ResourceLocation.parse(personalItemTag.getString())); 73 | if (item == Items.AIR) { 74 | LOGGER.error("Invalid personal item in config. Got: '{}. Resetting to default.", personalItemTag.getString()); 75 | item = Items.DIAMOND; 76 | personalItemTag.reset(); 77 | personalItemTag.save(); 78 | } 79 | personalItem = new ItemStack(item); 80 | } 81 | return personalItem; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/RenderCustomEndPortal.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client.render; 2 | 3 | import codechicken.enderstorage.client.Shaders; 4 | import codechicken.lib.math.MathHelper; 5 | import codechicken.lib.render.buffer.TransformingVertexConsumer; 6 | import codechicken.lib.util.ClientUtils; 7 | import codechicken.lib.vec.Matrix4; 8 | import com.mojang.blaze3d.vertex.DefaultVertexFormat; 9 | import com.mojang.blaze3d.vertex.PoseStack; 10 | import com.mojang.blaze3d.vertex.VertexConsumer; 11 | import com.mojang.blaze3d.vertex.VertexFormat; 12 | import net.minecraft.client.Minecraft; 13 | import net.minecraft.client.player.LocalPlayer; 14 | import net.minecraft.client.renderer.MultiBufferSource; 15 | import net.minecraft.client.renderer.RenderStateShard; 16 | import net.minecraft.client.renderer.RenderType; 17 | import net.minecraft.client.renderer.blockentity.TheEndPortalRenderer; 18 | 19 | public class RenderCustomEndPortal { 20 | 21 | private static final RenderType STARFIELD_TYPE = RenderType.create("starfield", DefaultVertexFormat.POSITION, VertexFormat.Mode.QUADS, 256, 22 | RenderType.CompositeState.builder() 23 | .setShaderState(new RenderStateShard.ShaderStateShard(Shaders::starfieldShader)) 24 | .setTextureState(new RenderStateShard.TextureStateShard(TheEndPortalRenderer.END_PORTAL_LOCATION, false, false)) 25 | .createCompositeState(false) 26 | ); 27 | 28 | private final double surfaceY; 29 | private final double surfaceX1; 30 | private final double surfaceX2; 31 | private final double surfaceZ1; 32 | private final double surfaceZ2; 33 | 34 | public RenderCustomEndPortal(double y, double x1, double x2, double z1, double z2) { 35 | surfaceY = y; 36 | surfaceX1 = x1; 37 | surfaceX2 = x2; 38 | surfaceZ1 = z1; 39 | surfaceZ2 = z2; 40 | } 41 | 42 | public void render(Matrix4 mat, MultiBufferSource source) { 43 | LocalPlayer localPlayer = Minecraft.getInstance().player; 44 | assert localPlayer != null; 45 | 46 | Shaders.starfieldTime().glUniform1f((float) ClientUtils.getRenderTime()); 47 | Shaders.starfieldYaw().glUniform1f((float) (localPlayer.getYRot() * MathHelper.torad)); 48 | Shaders.starfieldPitch().glUniform1f((float) -(localPlayer.getXRot() * MathHelper.torad)); 49 | 50 | VertexConsumer cons = new TransformingVertexConsumer(source.getBuffer(STARFIELD_TYPE), mat); 51 | cons.addVertex((float) surfaceX1, (float) surfaceY, (float) surfaceZ1); 52 | cons.addVertex((float) surfaceX1, (float) surfaceY, (float) surfaceZ2); 53 | cons.addVertex((float) surfaceX2, (float) surfaceY, (float) surfaceZ2); 54 | cons.addVertex((float) surfaceX2, (float) surfaceY, (float) surfaceZ1); 55 | } 56 | 57 | public void render(PoseStack pStack, MultiBufferSource source) { 58 | LocalPlayer localPlayer = Minecraft.getInstance().player; 59 | assert localPlayer != null; 60 | 61 | Shaders.starfieldTime().glUniform1f((float) ClientUtils.getRenderTime()); 62 | Shaders.starfieldYaw().glUniform1f((float) (localPlayer.getYRot() * MathHelper.torad)); 63 | Shaders.starfieldPitch().glUniform1f((float) -(localPlayer.getXRot() * MathHelper.torad)); 64 | 65 | VertexConsumer cons = source.getBuffer(STARFIELD_TYPE); 66 | cons.addVertex(pStack.last().pose(), (float) surfaceX1, (float) surfaceY, (float) surfaceZ1); 67 | cons.addVertex(pStack.last().pose(), (float) surfaceX1, (float) surfaceY, (float) surfaceZ2); 68 | cons.addVertex(pStack.last().pose(), (float) surfaceX2, (float) surfaceY, (float) surfaceZ2); 69 | cons.addVertex(pStack.last().pose(), (float) surfaceX2, (float) surfaceY, (float) surfaceZ1); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/block/BlockEnderTank.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.block; 2 | 3 | import codechicken.enderstorage.init.EnderStorageModContent; 4 | import codechicken.enderstorage.tile.TileEnderTank; 5 | import codechicken.enderstorage.tile.TileFrequencyOwner; 6 | import codechicken.lib.raytracer.IndexedVoxelShape; 7 | import codechicken.lib.raytracer.MultiIndexedVoxelShape; 8 | import codechicken.lib.raytracer.VoxelShapeCache; 9 | import codechicken.lib.vec.*; 10 | import com.google.common.collect.ImmutableSet; 11 | import net.minecraft.core.BlockPos; 12 | import net.minecraft.world.level.BlockGetter; 13 | import net.minecraft.world.level.Level; 14 | import net.minecraft.world.level.block.entity.BlockEntity; 15 | import net.minecraft.world.level.block.entity.BlockEntityTicker; 16 | import net.minecraft.world.level.block.entity.BlockEntityType; 17 | import net.minecraft.world.level.block.state.BlockState; 18 | import net.minecraft.world.phys.shapes.CollisionContext; 19 | import net.minecraft.world.phys.shapes.Shapes; 20 | import net.minecraft.world.phys.shapes.VoxelShape; 21 | import org.jetbrains.annotations.Nullable; 22 | 23 | import static codechicken.lib.vec.Vector3.CENTER; 24 | 25 | /** 26 | * Created by covers1624 on 29/10/19. 27 | */ 28 | public class BlockEnderTank extends BlockEnderStorage { 29 | 30 | private static final IndexedVoxelShape TANK = new IndexedVoxelShape(Shapes.create(0.15, 0, 0.15, 0.85, 0.916, 0.85), 0); 31 | private static final IndexedVoxelShape[][] BUTTONS = new IndexedVoxelShape[4][3]; 32 | private static final IndexedVoxelShape[] DIAL = new IndexedVoxelShape[4]; 33 | private static final MultiIndexedVoxelShape[] SHAPES = new MultiIndexedVoxelShape[4]; 34 | 35 | public static Transformation[] buttonT = new Transformation[3]; 36 | 37 | static { 38 | for (int i = 0; i < 3; i++) { 39 | buttonT[i] = new Scale(0.6).with(new Translation(0.35 + (2 - i) * 0.15, 0.91, 0.5)); 40 | } 41 | 42 | Cuboid6 dialBase = new Cuboid6(0.358, 0.268, 0.05, 0.662, 0.565, 0.15); 43 | for (int rot = 0; rot < 4; rot++) { 44 | Transformation rotation = Rotation.quarterRotations[rot ^ 2].at(CENTER); 45 | for (int button = 0; button < 3; button++) { 46 | BUTTONS[rot][button] = new IndexedVoxelShape( 47 | VoxelShapeCache.getShape(TileFrequencyOwner.SELECTION_BUTTON.copy().apply(buttonT[button]).apply(rotation)), 48 | button + 1 49 | ); 50 | } 51 | DIAL[rot] = new IndexedVoxelShape(VoxelShapeCache.getShape(dialBase.copy().apply(rotation)), 4); 52 | 53 | ImmutableSet.Builder cuboids = ImmutableSet.builder(); 54 | cuboids.add(TANK); 55 | cuboids.add(BUTTONS[rot]); 56 | cuboids.add(DIAL[rot]); 57 | SHAPES[rot] = new MultiIndexedVoxelShape(TANK, cuboids.build()); 58 | } 59 | } 60 | 61 | public BlockEnderTank(Properties properties) { 62 | super(properties); 63 | } 64 | 65 | @Override 66 | public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { 67 | VoxelShape shape = TANK; 68 | BlockEntity t = worldIn.getBlockEntity(pos); 69 | if (t instanceof TileEnderTank tile) { 70 | shape = SHAPES[tile.rotation]; 71 | } 72 | return shape; 73 | } 74 | 75 | @Nullable 76 | @Override 77 | public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { 78 | return new TileEnderTank(pos, state); 79 | } 80 | 81 | @Nullable 82 | @Override 83 | public BlockEntityTicker getTicker(Level p_153212_, BlockState p_153213_, BlockEntityType p_153214_) { 84 | return createTickerHelper(p_153214_, EnderStorageModContent.ENDER_TANK_TILE.get(), (level, pos, state, tile) -> tile.tick()); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/block/BlockEnderChest.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.block; 2 | 3 | import codechicken.enderstorage.init.EnderStorageModContent; 4 | import codechicken.enderstorage.misc.EnderKnobSlot; 5 | import codechicken.enderstorage.tile.TileEnderChest; 6 | import codechicken.enderstorage.tile.TileFrequencyOwner; 7 | import codechicken.lib.math.MathHelper; 8 | import codechicken.lib.raytracer.IndexedVoxelShape; 9 | import codechicken.lib.raytracer.MultiIndexedVoxelShape; 10 | import codechicken.lib.raytracer.VoxelShapeCache; 11 | import codechicken.lib.vec.*; 12 | import com.google.common.collect.ImmutableSet; 13 | import net.minecraft.core.BlockPos; 14 | import net.minecraft.world.level.BlockGetter; 15 | import net.minecraft.world.level.Level; 16 | import net.minecraft.world.level.block.entity.BlockEntity; 17 | import net.minecraft.world.level.block.entity.BlockEntityTicker; 18 | import net.minecraft.world.level.block.entity.BlockEntityType; 19 | import net.minecraft.world.level.block.state.BlockBehaviour; 20 | import net.minecraft.world.level.block.state.BlockState; 21 | import net.minecraft.world.phys.shapes.CollisionContext; 22 | import net.minecraft.world.phys.shapes.VoxelShape; 23 | import org.jetbrains.annotations.Nullable; 24 | 25 | /** 26 | * Created by covers1624 on 29/10/19. 27 | */ 28 | public class BlockEnderChest extends BlockEnderStorage { 29 | 30 | private static final IndexedVoxelShape CHEST = new IndexedVoxelShape(VoxelShapeCache.getShape(new Cuboid6(1 / 16D, 0, 1 / 16D, 15 / 16D, 14 / 16D, 15 / 16D)), 0); 31 | private static final IndexedVoxelShape[][] BUTTONS = new IndexedVoxelShape[4][3]; 32 | private static final IndexedVoxelShape[] LATCH = new IndexedVoxelShape[4]; 33 | 34 | private static final VoxelShape[][] SHAPES = new VoxelShape[4][2]; 35 | 36 | public static final Transformation[] buttonT = new Transformation[3]; 37 | 38 | static { 39 | for (int button = 0; button < 3; button++) { 40 | buttonT[button] = new Translation(-(3 / 16D) + ((3D / 16D) * button), 14D / 16D, 0); 41 | } 42 | for (int rot = 0; rot < 4; rot++) { 43 | //Build buttons and latch. 44 | for (int button = 0; button < 3; button++) { 45 | Cuboid6 cuboid = TileFrequencyOwner.SELECTION_BUTTON.copy(); 46 | cuboid.apply(buttonT[button]); 47 | cuboid.apply(new Translation(0.5, 0, 0.5)); 48 | cuboid.apply(new Rotation((-90 * (rot)) * MathHelper.torad, Vector3.Y_POS).at(new Vector3(0.5, 0, 0.5))); 49 | BUTTONS[rot][button] = new IndexedVoxelShape(VoxelShapeCache.getShape(cuboid), button + 1); 50 | } 51 | LATCH[rot] = new IndexedVoxelShape(VoxelShapeCache.getShape(new Cuboid6(new EnderKnobSlot(rot).getSelectionBB())), 4); 52 | 53 | //Build all VoxelShapes. 54 | for (int state = 0; state < 2; state++) { 55 | ImmutableSet.Builder cuboids = ImmutableSet.builder(); 56 | cuboids.add(CHEST); 57 | if (state == 0) { 58 | cuboids.add(BUTTONS[rot]); 59 | cuboids.add(LATCH[rot]); 60 | } 61 | SHAPES[rot][state] = new MultiIndexedVoxelShape(CHEST, cuboids.build()); 62 | } 63 | } 64 | } 65 | 66 | public BlockEnderChest(BlockBehaviour.Properties properties) { 67 | super(properties); 68 | } 69 | 70 | @Override 71 | public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { 72 | VoxelShape shape = CHEST; 73 | BlockEntity t = worldIn.getBlockEntity(pos); 74 | if (t instanceof TileEnderChest tile) { 75 | shape = SHAPES[tile.rotation][tile.getRadianLidAngle(0) >= 0 ? 0 : 1]; 76 | } 77 | return shape; 78 | } 79 | 80 | @Nullable 81 | @Override 82 | public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { 83 | return new TileEnderChest(pos, state); 84 | } 85 | 86 | @Nullable 87 | @Override 88 | public BlockEntityTicker getTicker(Level p_153212_, BlockState p_153213_, BlockEntityType p_153214_) { 89 | return createTickerHelper(p_153214_, EnderStorageModContent.ENDER_CHEST_TILE.get(), (level, pos, state, tile) -> tile.tick()); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/container/ContainerEnderItemStorage.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.container; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.init.EnderStorageModContent; 5 | import codechicken.enderstorage.manager.EnderStorageManager; 6 | import codechicken.enderstorage.storage.EnderItemStorage; 7 | import codechicken.lib.data.MCDataInput; 8 | import net.minecraft.world.Container; 9 | import net.minecraft.world.entity.player.Inventory; 10 | import net.minecraft.world.entity.player.Player; 11 | import net.minecraft.world.inventory.AbstractContainerMenu; 12 | import net.minecraft.world.inventory.Slot; 13 | import net.minecraft.world.item.ItemStack; 14 | 15 | public class ContainerEnderItemStorage extends AbstractContainerMenu { 16 | 17 | public EnderItemStorage chestInv; 18 | 19 | public ContainerEnderItemStorage(int windowId, Inventory playerInv, MCDataInput packet) { 20 | this(windowId, playerInv, EnderStorageManager.instance(true).getStorage(Frequency.readFromPacket(packet), EnderItemStorage.TYPE)); 21 | chestInv.handleContainerPacket(packet); 22 | } 23 | 24 | public ContainerEnderItemStorage(int windowId, Inventory playerInv, EnderItemStorage chestInv) { 25 | super(EnderStorageModContent.ENDER_ITEM_STORAGE.get(), windowId); 26 | this.chestInv = chestInv; 27 | chestInv.openInventory(); 28 | 29 | switch (chestInv.getSize()) { 30 | case 0: 31 | for (int row = 0; row < 3; ++row) { 32 | for (int col = 0; col < 3; ++col) { 33 | addSlot(new Slot(chestInv, col + row * 3, 62 + col * 18, 17 + row * 18)); 34 | } 35 | } 36 | addPlayerSlots(playerInv, 84); 37 | break; 38 | case 1: 39 | for (int row = 0; row < 3; ++row) { 40 | for (int col = 0; col < 9; ++col) { 41 | addSlot(new Slot(chestInv, col + row * 9, 8 + col * 18, 18 + row * 18)); 42 | } 43 | } 44 | addPlayerSlots(playerInv, 85); 45 | break; 46 | case 2: 47 | for (int row = 0; row < 6; ++row) { 48 | for (int col = 0; col < 9; ++col) { 49 | addSlot(new Slot(chestInv, col + row * 9, 8 + col * 18, 18 + row * 18)); 50 | } 51 | } 52 | addPlayerSlots(playerInv, 140); 53 | break; 54 | } 55 | 56 | } 57 | 58 | private void addPlayerSlots(Container invplayer, int yOffset) { 59 | for (int row = 0; row < 3; row++) { 60 | for (int col = 0; col < 9; col++) { 61 | addSlot(new Slot(invplayer, col + row * 9 + 9, 8 + col * 18, yOffset + row * 18)); 62 | } 63 | } 64 | 65 | for (int col = 0; col < 9; col++) { 66 | addSlot(new Slot(invplayer, col, 8 + col * 18, yOffset + 58)); 67 | } 68 | } 69 | 70 | @Override 71 | public boolean stillValid(Player entityplayer) { 72 | return chestInv.stillValid(entityplayer); 73 | } 74 | 75 | @Override 76 | public ItemStack quickMoveStack(Player par1EntityPlayer, int i) { 77 | ItemStack itemstack = ItemStack.EMPTY; 78 | Slot slot = slots.get(i); 79 | 80 | if (slot.hasItem()) { 81 | ItemStack itemstack1 = slot.getItem(); 82 | itemstack = itemstack1.copy(); 83 | 84 | int chestSlots = EnderItemStorage.sizes[chestInv.getSize()]; 85 | if (i < chestSlots) { 86 | if (!moveItemStackTo(itemstack1, chestSlots, slots.size(), true)) { 87 | return ItemStack.EMPTY; 88 | } 89 | } else if (!moveItemStackTo(itemstack1, 0, chestSlots, false)) { 90 | return ItemStack.EMPTY; 91 | } 92 | if (itemstack1.getCount() == 0) { 93 | slot.set(ItemStack.EMPTY); 94 | } else { 95 | slot.setChanged(); 96 | } 97 | } 98 | return itemstack; 99 | } 100 | 101 | @Override 102 | public void removed(Player entityplayer) { 103 | super.removed(entityplayer); 104 | chestInv.closeInventory(); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/init/ClientInit.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.init; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.client.Shaders; 5 | import codechicken.enderstorage.client.gui.GuiEnderItemStorage; 6 | import codechicken.enderstorage.client.render.entity.TankLayerRenderer; 7 | import codechicken.enderstorage.client.render.tile.RenderTileEnderChest; 8 | import codechicken.enderstorage.client.render.tile.RenderTileEnderTank; 9 | import codechicken.enderstorage.config.EnderStorageConfig; 10 | import codechicken.enderstorage.manager.EnderStorageManager; 11 | import codechicken.enderstorage.storage.EnderItemStorage; 12 | import net.covers1624.quack.util.CrashLock; 13 | import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; 14 | import net.minecraft.client.renderer.entity.LivingEntityRenderer; 15 | import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; 16 | import net.minecraft.client.renderer.item.ItemProperties; 17 | import net.minecraft.client.resources.PlayerSkin; 18 | import net.minecraft.resources.ResourceLocation; 19 | import net.neoforged.bus.api.IEventBus; 20 | import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; 21 | import net.neoforged.neoforge.client.event.EntityRenderersEvent; 22 | import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; 23 | 24 | import static codechicken.enderstorage.EnderStorage.MOD_ID; 25 | import static codechicken.enderstorage.init.EnderStorageModContent.*; 26 | 27 | /** 28 | * Created by covers1624 on 6/4/22. 29 | */ 30 | public class ClientInit { 31 | 32 | private static final CrashLock LOCK = new CrashLock("Already Initialized."); 33 | 34 | public static void init(IEventBus modBus) { 35 | LOCK.lock(); 36 | 37 | modBus.addListener(ClientInit::onRegisterRenderers); 38 | modBus.addListener(ClientInit::onAddRenderLayers); 39 | modBus.addListener(ClientInit::onRegisterMenuScreens); 40 | modBus.addListener(ClientInit::onClientSetupEvent); 41 | Shaders.init(modBus); 42 | } 43 | 44 | private static void onRegisterRenderers(EntityRenderersEvent.RegisterRenderers event) { 45 | BlockEntityRenderers.register(ENDER_CHEST_TILE.get(), RenderTileEnderChest::new); 46 | BlockEntityRenderers.register(ENDER_TANK_TILE.get(), RenderTileEnderTank::new); 47 | } 48 | 49 | @SuppressWarnings ({ "rawtypes", "unchecked" }) 50 | private static void onAddRenderLayers(EntityRenderersEvent.AddLayers event) { 51 | if (!EnderStorageConfig.disableCreatorVisuals) { 52 | for (PlayerSkin.Model skin : event.getSkins()) { 53 | var skinRenderer = (LivingEntityRenderer) event.getSkin(skin); 54 | assert skinRenderer != null; 55 | skinRenderer.addLayer(new TankLayerRenderer(skinRenderer)); 56 | } 57 | } 58 | } 59 | 60 | private static void onRegisterMenuScreens(RegisterMenuScreensEvent event) { 61 | event.register(ENDER_ITEM_STORAGE.get(), GuiEnderItemStorage::new); 62 | } 63 | 64 | private static void onClientSetupEvent(FMLClientSetupEvent event) { 65 | event.enqueueWork(ClientInit::registerPredicates); 66 | } 67 | 68 | private static void registerPredicates() { 69 | ItemProperties.register( 70 | ENDER_POUCH.get(), 71 | ResourceLocation.fromNamespaceAndPath(MOD_ID, "owned"), 72 | (ClampedItemPropertyFunction) (pStack, pLevel, pEntity, pSeed) -> Frequency.readFromStack(pStack).hasOwner() ? 1 : 0 73 | ); 74 | ItemProperties.register( 75 | ENDER_POUCH.get(), 76 | ResourceLocation.fromNamespaceAndPath(MOD_ID, "open"), 77 | (ClampedItemPropertyFunction) (pStack, pLevel, pEntity, pSeed) -> EnderStorageManager.instance(true).getStorage(Frequency.readFromStack(pStack), EnderItemStorage.TYPE).openCount() 78 | ); 79 | ItemProperties.register( 80 | ENDER_POUCH.get(), 81 | ResourceLocation.fromNamespaceAndPath(MOD_ID, "left"), 82 | (pStack, pLevel, pEntity, pSeed) -> Frequency.readFromStack(pStack).left().ordinal() 83 | ); 84 | ItemProperties.register( 85 | ENDER_POUCH.get(), 86 | ResourceLocation.fromNamespaceAndPath(MOD_ID, "middle"), 87 | (pStack, pLevel, pEntity, pSeed) -> Frequency.readFromStack(pStack).middle().ordinal() 88 | ); 89 | ItemProperties.register( 90 | ENDER_POUCH.get(), 91 | ResourceLocation.fromNamespaceAndPath(MOD_ID, "right"), 92 | (pStack, pLevel, pEntity, pSeed) -> Frequency.readFromStack(pStack).right().ordinal() 93 | ); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/plugin/jei/ESCraftingRecipeWrapper.java: -------------------------------------------------------------------------------- 1 | //package codechicken.enderstorage.plugin.jei; 2 | // 3 | //import codechicken.enderstorage.api.Frequency; 4 | //import codechicken.enderstorage.recipe.Factories.MultiIngredient; 5 | //import codechicken.enderstorage.recipe.RecipeBase; 6 | //import codechicken.enderstorage.util.LogHelper; 7 | //import codechicken.lib.colour.EnumColour; 8 | //import mezz.jei.api.gui.IGuiItemStackGroup; 9 | //import mezz.jei.api.gui.IRecipeLayout; 10 | //import mezz.jei.api.ingredients.IIngredients; 11 | //import mezz.jei.api.recipe.IFocus; 12 | //import mezz.jei.api.recipe.IFocus.Mode; 13 | //import mezz.jei.api.recipe.IRecipeWrapper; 14 | //import mezz.jei.api.recipe.wrapper.ICustomCraftingRecipeWrapper; 15 | //import net.minecraft.item.ItemStack; 16 | //import net.minecraft.item.crafting.Ingredient; 17 | //import net.minecraft.util.NonNullList; 18 | //import net.minecraftforge.oredict.OreDictionary; 19 | //import org.apache.logging.log4j.Level; 20 | // 21 | //import java.util.*; 22 | // 23 | ///** 24 | // * Created by covers1624 on 8/07/2017. 25 | // */ 26 | //public class ESCraftingRecipeWrapper implements IRecipeWrapper, ICustomCraftingRecipeWrapper { 27 | // 28 | // private final List output; 29 | // private final List> inputs; 30 | // private final RecipeBase recipe; 31 | // private final int woolIndex; 32 | // private final Map> woolOres = new HashMap<>(); 33 | // 34 | // public ESCraftingRecipeWrapper(RecipeBase recipe) { 35 | // this.recipe = recipe; 36 | // 37 | // ItemStack outputStack = recipe.getRecipeOutput(); 38 | // 39 | // inputs = new LinkedList<>(); 40 | // List wools = new LinkedList<>(); 41 | // for (EnumColour colour : EnumColour.values()) { 42 | // List wool = OreDictionary.getOres(colour.getWoolOreName()); 43 | // wools.addAll(wool); 44 | // woolOres.put(colour, wool); 45 | // } 46 | // NonNullList ingredients = recipe.getIngredients(); 47 | // int woolIndex = 0; 48 | // for (int i = 0; i < ingredients.size(); i++) { 49 | // Ingredient ingredient = ingredients.get(i); 50 | // List stacks = new LinkedList<>(); 51 | // if (ingredient instanceof MultiIngredient) { 52 | // woolIndex = i; 53 | // stacks.addAll(wools); 54 | // } else { 55 | // Collections.addAll(stacks, ingredient.getMatchingStacks()); 56 | // } 57 | // inputs.add(stacks); 58 | // } 59 | // this.woolIndex = woolIndex; 60 | // output = new LinkedList<>(); 61 | // for (ItemStack stack : wools) { 62 | // EnumColour colour = EnumColour.fromWoolStack(stack); 63 | // if (colour != null) { 64 | // Frequency frequency = new Frequency(colour, colour, colour); 65 | // output.add(frequency.writeToStack(outputStack.copy())); 66 | // } else { 67 | // LogHelper.log(Level.WARN, "Colour is null for known wool stack.. wot. {}", stack); 68 | // } 69 | // } 70 | // 71 | // } 72 | // 73 | // @Override 74 | // public void getIngredients(IIngredients ingredients) { 75 | // ingredients.setInputLists(ItemStack.class, inputs); 76 | // ingredients.setOutput(ItemStack.class, output); 77 | // } 78 | // 79 | // @Override 80 | // public void setRecipe(IRecipeLayout recipeLayout, IIngredients ingredients) { 81 | // IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); 82 | // List> inputs = ingredients.getInputs(ItemStack.class); 83 | // List outputs = ingredients.getOutputs(ItemStack.class).get(0); 84 | // 85 | // IFocus iFocus = recipeLayout.getFocus(); 86 | // Object focusObject = iFocus.getValue(); 87 | // 88 | // if (focusObject instanceof ItemStack) { 89 | // ItemStack focus = (ItemStack) focusObject; 90 | // Mode mode = iFocus.getMode(); 91 | // 92 | // if (mode == Mode.INPUT) { 93 | // EnumColour woolColour = EnumColour.fromWoolStack(focus); 94 | // if (woolColour != null) { 95 | // Frequency freq = new Frequency(woolColour, woolColour, woolColour); 96 | // ItemStack newStack = freq.writeToStack(recipe.getRecipeOutput().copy()); 97 | // outputs = Collections.singletonList(newStack); 98 | // } 99 | // } else { 100 | // Frequency frequency = Frequency.readFromStack(focus); 101 | // EnumColour colour = frequency.getLeft(); 102 | // inputs.set(woolIndex, woolOres.get(colour)); 103 | // 104 | // } 105 | // } 106 | // EnderStorageJEIPlugin.gridHelper.setInputs(guiItemStacks, inputs, 3, 3); 107 | // guiItemStacks.set(0, outputs); 108 | // } 109 | //} 110 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/tile/TileFrequencyOwner.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.tile; 2 | 3 | import codechicken.enderstorage.api.AbstractEnderStorage; 4 | import codechicken.enderstorage.api.Frequency; 5 | import codechicken.enderstorage.network.EnderStorageNetwork; 6 | import codechicken.lib.data.MCDataInput; 7 | import codechicken.lib.data.MCDataOutput; 8 | import codechicken.lib.packet.PacketCustom; 9 | import codechicken.lib.vec.Cuboid6; 10 | import net.minecraft.core.BlockPos; 11 | import net.minecraft.core.HolderLookup; 12 | import net.minecraft.nbt.CompoundTag; 13 | import net.minecraft.nbt.NbtOps; 14 | import net.minecraft.world.InteractionHand; 15 | import net.minecraft.world.entity.LivingEntity; 16 | import net.minecraft.world.entity.player.Player; 17 | import net.minecraft.world.level.Level; 18 | import net.minecraft.world.level.block.entity.BlockEntity; 19 | import net.minecraft.world.level.block.entity.BlockEntityType; 20 | import net.minecraft.world.level.block.state.BlockState; 21 | import org.jetbrains.annotations.Nullable; 22 | 23 | public abstract class TileFrequencyOwner extends BlockEntity { 24 | 25 | public static final Cuboid6 SELECTION_BUTTON = new Cuboid6(-1 / 16D, 0, -2 / 16D, 1 / 16D, 1 / 16D, 2 / 16D); 26 | 27 | protected Frequency frequency = new Frequency(); 28 | private int changeCount; 29 | 30 | public TileFrequencyOwner(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) { 31 | super(tileEntityTypeIn, pos, state); 32 | } 33 | 34 | public Frequency getFrequency() { 35 | return frequency; 36 | } 37 | 38 | public void setFreq(Frequency frequency) { 39 | assert level != null; 40 | this.frequency = frequency; 41 | onFrequencySet(); 42 | setChanged(); 43 | BlockState state = level.getBlockState(worldPosition); 44 | level.sendBlockUpdated(worldPosition, state, state, 3); 45 | if (!level.isClientSide) { 46 | sendUpdatePacket(); 47 | } 48 | } 49 | 50 | public void tick() { 51 | assert level != null; 52 | if (getStorage().getChangeCount() > changeCount) { 53 | level.updateNeighbourForOutputSignal(worldPosition, getBlockState().getBlock()); 54 | changeCount = getStorage().getChangeCount(); 55 | } 56 | } 57 | 58 | public abstract AbstractEnderStorage getStorage(); 59 | 60 | public void onFrequencySet() { 61 | } 62 | 63 | @Override 64 | protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { 65 | super.loadAdditional(tag, registries); 66 | frequency = Frequency.CODEC 67 | .parse(registries.createSerializationContext(NbtOps.INSTANCE), tag.get("Frequency")) 68 | .getOrThrow(); 69 | } 70 | 71 | @Override 72 | protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { 73 | super.saveAdditional(tag, registries); 74 | 75 | tag.put("Frequency", Frequency.CODEC 76 | .encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), frequency) 77 | .getOrThrow() 78 | ); 79 | } 80 | 81 | @Override 82 | public void setLevel(Level p_155231_) { 83 | super.setLevel(p_155231_); 84 | onFrequencySet(); 85 | } 86 | 87 | public boolean activate(Player player, int subHit, InteractionHand hand) { 88 | return false; 89 | } 90 | 91 | public void onPlaced(@Nullable LivingEntity entity) { 92 | } 93 | 94 | protected void sendUpdatePacket() { 95 | assert level != null; 96 | createPacket().sendToChunk(this); 97 | } 98 | 99 | public PacketCustom createPacket() { 100 | PacketCustom packet = new PacketCustom(EnderStorageNetwork.NET_CHANNEL, EnderStorageNetwork.C_TILE_UPDATE, level.registryAccess()); 101 | packet.writePos(getBlockPos()); 102 | writeToPacket(packet); 103 | return packet; 104 | } 105 | 106 | public void writeToPacket(MCDataOutput packet) { 107 | packet.writeWithRegistryCodec(Frequency.STREAM_CODEC, frequency); 108 | } 109 | 110 | public void readFromPacket(MCDataInput packet) { 111 | frequency = packet.readWithRegistryCodec(Frequency.STREAM_CODEC); 112 | onFrequencySet(); 113 | } 114 | 115 | @Override 116 | public CompoundTag getUpdateTag(HolderLookup.Provider registries) { 117 | return saveWithoutMetadata(registries); 118 | } 119 | 120 | @Override 121 | public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider registries) { 122 | loadWithComponents(tag, registries); 123 | } 124 | 125 | public int getLightValue() { 126 | return 0; 127 | } 128 | 129 | public boolean redstoneInteraction() { 130 | return false; 131 | } 132 | 133 | public int comparatorOutput() { 134 | return 0; 135 | } 136 | 137 | public boolean rotate() { 138 | return false; 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/tile/RenderTileEnderTank.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client.render.tile; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.block.BlockEnderTank; 5 | import codechicken.enderstorage.client.model.ButtonModelLibrary; 6 | import codechicken.enderstorage.client.render.RenderCustomEndPortal; 7 | import codechicken.enderstorage.tile.TileEnderTank; 8 | import codechicken.lib.colour.EnumColour; 9 | import codechicken.lib.fluid.FluidUtils; 10 | import codechicken.lib.math.MathHelper; 11 | import codechicken.lib.render.*; 12 | import codechicken.lib.render.model.OBJParser; 13 | import codechicken.lib.util.ClientUtils; 14 | import codechicken.lib.vec.*; 15 | import codechicken.lib.vec.uv.UVTranslation; 16 | import com.mojang.blaze3d.vertex.PoseStack; 17 | import net.minecraft.client.renderer.MultiBufferSource; 18 | import net.minecraft.client.renderer.RenderType; 19 | import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; 20 | import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; 21 | import net.minecraft.resources.ResourceLocation; 22 | import net.neoforged.neoforge.fluids.FluidStack; 23 | 24 | import java.util.Map; 25 | 26 | import static codechicken.enderstorage.EnderStorage.MOD_ID; 27 | 28 | public class RenderTileEnderTank implements BlockEntityRenderer { 29 | 30 | private static final RenderType baseType = RenderType.entityCutout(ResourceLocation.fromNamespaceAndPath(MOD_ID, "textures/endertank.png")); 31 | private static final RenderType buttonType = RenderType.entitySolid(ResourceLocation.fromNamespaceAndPath(MOD_ID, "textures/buttons.png")); 32 | private static final RenderType pearlType = CCModelLibrary.getIcos4RenderType(ResourceLocation.fromNamespaceAndPath(MOD_ID, "textures/hedronmap.png")); 33 | 34 | public static final CCModel tankModel; 35 | public static final CCModel valveModel; 36 | public static final CCModel[] buttons; 37 | public static final RenderCustomEndPortal renderEndPortal = new RenderCustomEndPortal(0.1205, 0.24, 0.76, 0.24, 0.76); 38 | 39 | static { 40 | Map models = new OBJParser(ResourceLocation.fromNamespaceAndPath(MOD_ID, "models/endertank.obj")) 41 | .quads() 42 | .swapYZ() 43 | .parse(); 44 | Transformation fix = new Translation(-0.0099 - 0.5, 0, -0.0027 - 0.5); 45 | valveModel = models.remove("Valve").apply(fix).computeNormals(); 46 | tankModel = CCModel.combine(models.values()).apply(fix).computeNormals().shrinkUVs(0.004); 47 | 48 | buttons = new CCModel[3]; 49 | for (int i = 0; i < 3; i++) { 50 | buttons[i] = ButtonModelLibrary.button.copy().apply(BlockEnderTank.buttonT[i].with(new Translation(-0.5, 0, -0.5))); 51 | } 52 | } 53 | 54 | public RenderTileEnderTank(BlockEntityRendererProvider.Context context) { 55 | } 56 | 57 | @Override 58 | public void render(TileEnderTank enderTank, float partialTicks, PoseStack mStack, MultiBufferSource source, int packedLight, int packedOverlay) { 59 | CCRenderState ccrs = CCRenderState.instance(); 60 | ccrs.brightness = packedLight; 61 | ccrs.overlay = packedOverlay; 62 | float valveRot = (float) MathHelper.interpolate(enderTank.pressure_state.b_rotate, enderTank.pressure_state.a_rotate, partialTicks) * 0.01745F; 63 | int pearlOffset = RenderUtils.getTimeOffset(enderTank.getBlockPos()); 64 | Matrix4 mat = new Matrix4(mStack); 65 | renderTank(ccrs, mat.copy(), source, enderTank.rotation, valveRot, enderTank.getFrequency(), pearlOffset); 66 | renderFluid(ccrs, mat, source, enderTank.liquid_state.c_liquid); 67 | ccrs.reset(); 68 | } 69 | 70 | public static void renderTank(CCRenderState ccrs, Matrix4 mat, MultiBufferSource buffers, int rotation, float valveRot, Frequency freq, int pearlOffset) { 71 | renderEndPortal.render(mat, buffers); 72 | ccrs.reset(); 73 | mat.translate(0.5, 0, 0.5); 74 | mat.rotate((-90 * (rotation + 2)) * MathHelper.torad, Vector3.Y_POS); 75 | ccrs.bind(baseType, buffers); 76 | tankModel.render(ccrs, mat); 77 | Matrix4 valveMat = mat.copy().apply(new Rotation(valveRot, Vector3.Z_POS).at(new Vector3(0, 0.4165, 0))); 78 | valveModel.render(ccrs, valveMat, new UVTranslation(0, freq.hasOwner() ? 13 / 64D : 0)); 79 | 80 | ccrs.bind(buttonType, buffers); 81 | EnumColour[] colours = freq.toArray(); 82 | for (int i = 0; i < 3; i++) { 83 | //noinspection IntegerDivisionInFloatingPointContext 84 | buttons[i].render(ccrs, mat, new UVTranslation(0.25 * (colours[i].getWoolMeta() % 4), 0.25 * (colours[i].getWoolMeta() / 4))); 85 | } 86 | 87 | double time = ClientUtils.getRenderTime() + pearlOffset; 88 | Matrix4 pearlMat = RenderUtils.getMatrix(mat.copy(), new Vector3(0, 0.45 + RenderUtils.getPearlBob(time) * 2, 0), new Rotation(time / 3, Vector3.Y_POS), 0.04); 89 | ccrs.brightness = 15728880; 90 | ccrs.bind(pearlType, buffers); 91 | CCModelLibrary.icosahedron4.render(ccrs, pearlMat); 92 | ccrs.reset(); 93 | } 94 | 95 | public static void renderFluid(CCRenderState ccrs, Matrix4 mat, MultiBufferSource getter, FluidStack stack) { 96 | RenderUtils.renderFluidCuboid(ccrs, mat, RenderUtils.getFluidRenderType(), getter, stack, new Cuboid6(0.22, 0.12, 0.22, 0.78, 0.121 + 0.63, 0.78), stack.getAmount() / (16D * FluidUtils.B), 0.75); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/main/resources/assets/enderstorage/shaders/core/starfield.fsh: -------------------------------------------------------------------------------- 1 | #version 150 2 | 3 | #define M_PI 3.1415926535897932384626433832795 4 | 5 | uniform sampler2D Sampler0; 6 | uniform float Time; 7 | 8 | uniform float Yaw; 9 | uniform float Pitch; 10 | 11 | uniform float Alpha; 12 | 13 | in vec3 fPos; 14 | 15 | out vec4 fragColor; 16 | 17 | mat4 rotationMatrix(vec3 axis, float angle) { 18 | axis = normalize(axis); 19 | float s = sin(angle); 20 | float c = cos(angle); 21 | float oc = 1.0 - c; 22 | 23 | return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, 24 | oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, 25 | oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, 26 | 0.0, 0.0, 0.0, 1.0); 27 | } 28 | 29 | vec3 mod289(vec3 x) { 30 | return x - floor(x * (1.0 / 289.0)) * 289.0; 31 | } 32 | 33 | vec2 mod289(vec2 x) { 34 | return x - floor(x * (1.0 / 289.0)) * 289.0; 35 | } 36 | 37 | vec3 permute(vec3 x) { 38 | return mod289(((x * 34.0) + 1.0) * x); 39 | } 40 | 41 | float snoise(vec2 v) { 42 | const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 43 | 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) 44 | -0.577350269189626, // -1.0 + 2.0 * C.x 45 | 0.024390243902439); // 1.0 / 41.0 46 | // First corner 47 | vec2 i = floor(v + dot(v, C.yy) ); 48 | vec2 x0 = v - i + dot(i, C.xx); 49 | 50 | // Other corners 51 | vec2 i1; 52 | //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 53 | //i1.y = 1.0 - i1.x; 54 | i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); 55 | // x0 = x0 - 0.0 + 0.0 * C.xx ; 56 | // x1 = x0 - i1 + 1.0 * C.xx ; 57 | // x2 = x0 - 1.0 + 2.0 * C.xx ; 58 | vec4 x12 = x0.xyxy + C.xxzz; 59 | x12.xy -= i1; 60 | 61 | // Permutations 62 | i = mod289(i); // Avoid truncation effects in permutation 63 | vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0 )) + i.x + vec3(0.0, i1.x, 1.0)); 64 | 65 | vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); 66 | m = m * m; 67 | m = m * m; 68 | 69 | // Gradients: 41 points uniformly over a line, mapped onto a diamond. 70 | // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) 71 | 72 | vec3 x = 2.0 * fract(p * C.www) - 1.0; 73 | vec3 h = abs(x) - 0.5; 74 | vec3 ox = floor(x + 0.5); 75 | vec3 a0 = x - ox; 76 | 77 | // Normalise gradients implicitly by scaling m 78 | // Approximation of: m *= inversesqrt( a0*a0 + h*h ); 79 | m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); 80 | 81 | // Compute final noise value at P 82 | vec3 g; 83 | g.x = a0.x * x0.x + h.x * x0.y; 84 | g.yz = a0.yz * x12.xz + h.yz * x12.yw; 85 | return 130.0 * dot(m, g); 86 | } 87 | 88 | void main() { 89 | // background color 90 | vec4 col = vec4(0.047, 0.035, 0.063, 1) + snoise(gl_FragCoord.xy) * vec4(0.0196, 0.0216, 0.0235, 0); 91 | 92 | // get ray from camera to fragment 93 | vec4 dir = normalize(vec4(-fPos, 0)); 94 | 95 | // rotate the ray to show the right bit of the sphere for the angle 96 | float sb = sin(Pitch); 97 | float cb = cos(Pitch); 98 | dir = normalize(vec4(dir.x, dir.y * cb - dir.z * sb, dir.y * sb + dir.z * cb, 0)); 99 | 100 | float sa = sin(-Yaw); 101 | float ca = cos(-Yaw); 102 | dir = normalize(vec4(dir.z * sa + dir.x * ca, dir.y, dir.z * ca - dir.x * sa, 0)); 103 | 104 | vec4 ray; 105 | 106 | // draw the layers 107 | for (int i = 0; i < 16; i++) { 108 | int mult = 16 - i; 109 | 110 | // get semi-random stuff 111 | int j = i + 7; 112 | float rand1 = (j * j * 4321 + j * 8) * 2.0F; 113 | int k = j + 1; 114 | float rand2 = (k * k * k * 239 + k * 37) * 3.6F; 115 | float rand3 = rand1 * 347.4 + rand2 * 63.4; 116 | 117 | // random rotation matrix by random rotation around random axis 118 | vec3 axis = normalize(vec3(sin(mod(rand1, 2 * M_PI)), sin(mod(rand2, 2 * M_PI)) , cos(mod(rand3, 2 * M_PI)))); 119 | 120 | // apply 121 | ray = dir * rotationMatrix(axis, mod(rand3, 2 * M_PI)); 122 | 123 | // calcuate the UVs from the final ray 124 | float u = 0.5 + (atan(ray.z, ray.x) / (2 * M_PI)); 125 | float v = 0.5 + (asin(ray.y) / M_PI); 126 | 127 | // get UV scaled for layers and offset by time; 128 | float scale = mult * 0.5 + 2.75; 129 | vec2 tex = vec2(u * scale, (v + Time * 0.00006) * scale * 0.6 ); 130 | 131 | // sample the texture 132 | vec4 tcol = texture(Sampler0, tex); 133 | 134 | // set the alpha, blending out at the bunched ends 135 | float a = tcol.r * (0.05 + (1.0 / mult) * 0.65) * (1 - smoothstep(0.15, 0.48, abs(v - 0.5))); 136 | 137 | // get end-portal-y colors 138 | float r = (mod(rand1, 29.0) / 29.0) * 0.5 + 0.1; 139 | float g = (mod(rand2, 35.0) / 35.0) * 0.5 + 0.4; 140 | float b = (mod(rand1, 17.0) / 17.0) * 0.5 + 0.5; 141 | 142 | // mix the colors 143 | col = col * (1 - a) + vec4(r, g, b, 1) * a; 144 | } 145 | 146 | float br = clamp(2.5 * gl_FragCoord.w + Alpha, 0, 1); 147 | 148 | col = col * br + vec4(0.047, 0.035, 0.063, 1) * (1 - br); 149 | 150 | // increase the brightness of flashing ducts 151 | col.rgb = clamp(col.rgb * (1 + Alpha * 4),0,1); 152 | 153 | col.a = 1; 154 | 155 | fragColor = col; 156 | } 157 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/tile/TileEnderChest.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.tile; 2 | 3 | import codechicken.enderstorage.config.EnderStorageConfig; 4 | import codechicken.enderstorage.init.EnderStorageModContent; 5 | import codechicken.enderstorage.manager.EnderStorageManager; 6 | import codechicken.enderstorage.storage.EnderItemStorage; 7 | import codechicken.lib.data.MCDataInput; 8 | import codechicken.lib.data.MCDataOutput; 9 | import codechicken.lib.math.MathHelper; 10 | import codechicken.lib.packet.PacketCustom; 11 | import net.minecraft.core.BlockPos; 12 | import net.minecraft.core.Direction; 13 | import net.minecraft.core.HolderLookup; 14 | import net.minecraft.nbt.CompoundTag; 15 | import net.minecraft.network.chat.Component; 16 | import net.minecraft.server.level.ServerPlayer; 17 | import net.minecraft.sounds.SoundSource; 18 | import net.minecraft.world.InteractionHand; 19 | import net.minecraft.world.entity.LivingEntity; 20 | import net.minecraft.world.entity.player.Player; 21 | import net.minecraft.world.level.block.state.BlockState; 22 | import net.neoforged.neoforge.items.IItemHandler; 23 | import net.neoforged.neoforge.items.ItemHandlerHelper; 24 | import net.neoforged.neoforge.items.wrapper.InvWrapper; 25 | import org.jetbrains.annotations.Nullable; 26 | 27 | import static net.minecraft.sounds.SoundEvents.*; 28 | 29 | public class TileEnderChest extends TileFrequencyOwner { 30 | 31 | public double a_lidAngle; 32 | public double b_lidAngle; 33 | public int c_numOpen; 34 | public int rotation; 35 | 36 | private @Nullable IItemHandler itemHandler; 37 | 38 | public TileEnderChest(BlockPos pos, BlockState state) { 39 | super(EnderStorageModContent.ENDER_CHEST_TILE.get(), pos, state); 40 | } 41 | 42 | @Override 43 | public void tick() { 44 | super.tick(); 45 | 46 | assert level != null; 47 | if (!level.isClientSide && (level.getGameTime() % 20 == 0 || c_numOpen != getStorage().getNumOpen())) { 48 | c_numOpen = getStorage().getNumOpen(); 49 | level.blockEvent(getBlockPos(), getBlockState().getBlock(), 1, c_numOpen); 50 | level.updateNeighborsAt(worldPosition, getBlockState().getBlock()); 51 | } 52 | 53 | b_lidAngle = a_lidAngle; 54 | a_lidAngle = MathHelper.approachLinear(a_lidAngle, c_numOpen > 0 ? 1 : 0, 0.1); 55 | 56 | if (b_lidAngle >= 0.5 && a_lidAngle < 0.5) { 57 | level.playSound(null, getBlockPos(), EnderStorageConfig.useVanillaEnderChestSounds ? ENDER_CHEST_CLOSE : CHEST_CLOSE, SoundSource.BLOCKS, 0.5F, level.random.nextFloat() * 0.1F + 0.9F); 58 | } else if (b_lidAngle == 0 && a_lidAngle > 0) { 59 | level.playSound(null, getBlockPos(), EnderStorageConfig.useVanillaEnderChestSounds ? ENDER_CHEST_OPEN : CHEST_OPEN, SoundSource.BLOCKS, 0.5F, level.random.nextFloat() * 0.1F + 0.9F); 60 | } 61 | } 62 | 63 | @Override 64 | public boolean triggerEvent(int id, int type) { 65 | if (id == 1) { 66 | c_numOpen = type; 67 | return true; 68 | } 69 | return false; 70 | } 71 | 72 | public double getRadianLidAngle(float frame) { 73 | double a = MathHelper.interpolate(b_lidAngle, a_lidAngle, frame); 74 | a = 1.0F - a; 75 | a = 1.0F - a * a * a; 76 | return a * 3.141593 * -0.5; 77 | } 78 | 79 | @Override 80 | public EnderItemStorage getStorage() { 81 | assert level != null; 82 | return EnderStorageManager.instance(level.isClientSide).getStorage(frequency, EnderItemStorage.TYPE); 83 | } 84 | 85 | @Override 86 | public void onFrequencySet() { 87 | invalidateCapabilities(); 88 | itemHandler = null; 89 | } 90 | 91 | @Override 92 | public void writeToPacket(MCDataOutput packet) { 93 | super.writeToPacket(packet); 94 | packet.writeByte(rotation); 95 | } 96 | 97 | @Override 98 | public void readFromPacket(MCDataInput packet) { 99 | super.readFromPacket(packet); 100 | rotation = packet.readUByte() & 3; 101 | } 102 | 103 | @Override 104 | public void onPlaced(@Nullable LivingEntity entity) { 105 | assert level != null; 106 | rotation = entity != null ? (int) Math.floor(entity.getYRot() * 4 / 360 + 2.5D) & 3 : 0; 107 | onFrequencySet(); 108 | if (!level.isClientSide) { 109 | sendUpdatePacket(); 110 | } 111 | } 112 | 113 | @Override 114 | public void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { 115 | super.saveAdditional(tag, registries); 116 | tag.putByte("rot", (byte) rotation); 117 | } 118 | 119 | @Override 120 | public void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { 121 | super.loadAdditional(tag, registries); 122 | rotation = tag.getByte("rot") & 3; 123 | } 124 | 125 | @Override 126 | public boolean activate(Player player, int subHit, InteractionHand hand) { 127 | getStorage().openContainer((ServerPlayer) player, Component.translatable(getBlockState().getBlock().getDescriptionId())); 128 | return true; 129 | } 130 | 131 | @Override 132 | public boolean rotate() { 133 | assert level != null; 134 | if (!level.isClientSide) { 135 | rotation = (rotation + 1) % 4; 136 | sendUpdatePacket(); 137 | } 138 | return true; 139 | } 140 | 141 | @Override 142 | public int comparatorOutput() { 143 | return ItemHandlerHelper.calcRedstoneFromInventory(getItemHandler()); 144 | } 145 | 146 | public IItemHandler getItemHandler() { 147 | if (itemHandler == null) { 148 | itemHandler = new InvWrapper(getStorage()); 149 | } 150 | return itemHandler; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /src/main/generated/.cache/282910bf22b00ad347f56cc1dfb6815b78e846d9: -------------------------------------------------------------------------------- 1 | // 1.21.1 2024-10-29T17:38:05.796472454 EnderStorage Item models 2 | acba8f17e2d7962b4f284bd0141fb59b507bce0a assets/enderstorage/models/item/ender_chest.json 3 | e56e5f4371f82507db4f3edcd5514ff7a7c9b91c assets/enderstorage/models/item/ender_pouch.json 4 | d85340997885467c20e49061f74a4858f9a276fd assets/enderstorage/models/item/ender_pouch_button_left_black.json 5 | 7e07a5bb75528acb4596870d5e8420545f848888 assets/enderstorage/models/item/ender_pouch_button_left_blue.json 6 | 9ba8d58cfa07266d7f941829cd29bcdc1f889f2e assets/enderstorage/models/item/ender_pouch_button_left_brown.json 7 | ae29c7450647265a9c7f0ff07baf06e573df3e1b assets/enderstorage/models/item/ender_pouch_button_left_cyan.json 8 | 0bae0abe6a19fe6426e06fce6f635a339f292aea assets/enderstorage/models/item/ender_pouch_button_left_gray.json 9 | 68508de7b1433a03590fb48052aa939e9d7ef7ba assets/enderstorage/models/item/ender_pouch_button_left_green.json 10 | fb37cc876ba2daa64181107a1b5fc88636f5b25e assets/enderstorage/models/item/ender_pouch_button_left_light_blue.json 11 | e56b61acf5f109eccc0247dd30b6ea6aa5425169 assets/enderstorage/models/item/ender_pouch_button_left_light_gray.json 12 | df4aa3277de16aa9229055405a710049d5147948 assets/enderstorage/models/item/ender_pouch_button_left_lime.json 13 | 0b05fbcaba35bdbd11705d3a911304f42cc08a7c assets/enderstorage/models/item/ender_pouch_button_left_magenta.json 14 | cf155a4b5328e7e985529648d6c3ca7cf96cc5c3 assets/enderstorage/models/item/ender_pouch_button_left_orange.json 15 | e709c3b2417e069e48566b1a400212c35e726d38 assets/enderstorage/models/item/ender_pouch_button_left_pink.json 16 | c94ae073ceb74495d10bc64f3790b141f686d069 assets/enderstorage/models/item/ender_pouch_button_left_purple.json 17 | f20570ea965c501e0c2db1b4b21897768e1ea98d assets/enderstorage/models/item/ender_pouch_button_left_red.json 18 | 4fa420edf72a3e76a0e4f9372459ce22a046c213 assets/enderstorage/models/item/ender_pouch_button_left_white.json 19 | 4a627837eaf71af214d24040529be7b5ca9f52ab assets/enderstorage/models/item/ender_pouch_button_left_yellow.json 20 | a36cb8e8e50a95d480130bf089afa14f06dfd431 assets/enderstorage/models/item/ender_pouch_button_middle_black.json 21 | c1e6ab2e28ba662c73dcd83b1da11fdb2d1b5188 assets/enderstorage/models/item/ender_pouch_button_middle_blue.json 22 | c5e4fe646dbb3f3686b2b4c62bc74f538e888c96 assets/enderstorage/models/item/ender_pouch_button_middle_brown.json 23 | 84ed513eb12f71f7b33aa4b1ab2b0a41f9a311fc assets/enderstorage/models/item/ender_pouch_button_middle_cyan.json 24 | 24e35f004fdd1f5734492f291b77b61c52496164 assets/enderstorage/models/item/ender_pouch_button_middle_gray.json 25 | 8936ae49cad86d81719abef9790c42c46d678704 assets/enderstorage/models/item/ender_pouch_button_middle_green.json 26 | cbf4cde1d31296215d534fcd1deb01dc1cb3706a assets/enderstorage/models/item/ender_pouch_button_middle_light_blue.json 27 | 135c1b09d882c711e41b711432fbd2b24c9062eb assets/enderstorage/models/item/ender_pouch_button_middle_light_gray.json 28 | d6ef6c867d7a6d608088f0b26b78ffcb29797612 assets/enderstorage/models/item/ender_pouch_button_middle_lime.json 29 | e3a0dc7d67cba57b5c6cd45ab6cc188d45272763 assets/enderstorage/models/item/ender_pouch_button_middle_magenta.json 30 | 24eb1f3eb178c1cd5619d11480b65b1b61948505 assets/enderstorage/models/item/ender_pouch_button_middle_orange.json 31 | ce49f986c5261fd959c5f4893059afe4db439528 assets/enderstorage/models/item/ender_pouch_button_middle_pink.json 32 | 96a75d37944398a89cf903011dff73b007778a88 assets/enderstorage/models/item/ender_pouch_button_middle_purple.json 33 | 1542a7dad4f290fd2e6b0b96b00aa12c499e82f5 assets/enderstorage/models/item/ender_pouch_button_middle_red.json 34 | 6bef062d2143f22b7c755844764883bcf30a9b71 assets/enderstorage/models/item/ender_pouch_button_middle_white.json 35 | 7707574198d4a2c1fe2396e05bc235bd06f8694e assets/enderstorage/models/item/ender_pouch_button_middle_yellow.json 36 | 53f3ca761620deb019264957b577b6ddcb63ec0b assets/enderstorage/models/item/ender_pouch_button_right_black.json 37 | 5367df26aa79aac9de1eb31bf0e4194e953baa3f assets/enderstorage/models/item/ender_pouch_button_right_blue.json 38 | c670f1dfb94a097b4d1ba73defe77665182e7704 assets/enderstorage/models/item/ender_pouch_button_right_brown.json 39 | 0d9172c44aead9f4a453ef04da1f441e8d9c8056 assets/enderstorage/models/item/ender_pouch_button_right_cyan.json 40 | 2f57fa614a12c1b40666472fb17e435907ca07f9 assets/enderstorage/models/item/ender_pouch_button_right_gray.json 41 | 2fca4fee9aff00230c15150cb5a6a87dde46c7db assets/enderstorage/models/item/ender_pouch_button_right_green.json 42 | 1a1b9f0868fecc4b4f272bd3bef9c2a469f23497 assets/enderstorage/models/item/ender_pouch_button_right_light_blue.json 43 | 2507c0a4b464eca8a7d281a8b2b2fa5459d8ea4b assets/enderstorage/models/item/ender_pouch_button_right_light_gray.json 44 | 822d51cd201234893046880c06e2cca45935b14d assets/enderstorage/models/item/ender_pouch_button_right_lime.json 45 | 091b55afb1f5622d46b99fe7004b173bf717eafa assets/enderstorage/models/item/ender_pouch_button_right_magenta.json 46 | 5eb9d6f12300b44ac14cd038afe8c9ab2faf1355 assets/enderstorage/models/item/ender_pouch_button_right_orange.json 47 | 825a4fc6b7a6106104f42d0aeb692761484a422d assets/enderstorage/models/item/ender_pouch_button_right_pink.json 48 | a5ad7b32224d2bd0ddfd87d1ec054c4f32ab2010 assets/enderstorage/models/item/ender_pouch_button_right_purple.json 49 | 480c7b301c1d83feb74235d85a5537c48aaeb7a7 assets/enderstorage/models/item/ender_pouch_button_right_red.json 50 | c23266a51bb6eb50d6ee13cb45658690466b7b29 assets/enderstorage/models/item/ender_pouch_button_right_white.json 51 | 44b16aafa3e4588c3fb1f07f9aa9179685ff8bb9 assets/enderstorage/models/item/ender_pouch_button_right_yellow.json 52 | 37965b95c13cb39b499b7925c76a2fbbeee31bce assets/enderstorage/models/item/ender_pouch_closed.json 53 | 4f79a4c9572e3d1f01b41505c777038ea2c72b85 assets/enderstorage/models/item/ender_pouch_open.json 54 | bca93d7cdab91d358aa60130acba6f555663a3b2 assets/enderstorage/models/item/ender_pouch_owned_closed.json 55 | 9cc9edaa2b3e3572f77a34d3ec878c8e0ebd4f75 assets/enderstorage/models/item/ender_pouch_owned_open.json 56 | e27ce04e6f2a4fc9cfe7f7816f9e5c7081b91958 assets/enderstorage/models/item/ender_tank.json 57 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/init/EnderStorageModContent.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.init; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.block.BlockEnderChest; 5 | import codechicken.enderstorage.block.BlockEnderTank; 6 | import codechicken.enderstorage.container.ContainerEnderItemStorage; 7 | import codechicken.enderstorage.item.ItemEnderPouch; 8 | import codechicken.enderstorage.item.ItemEnderStorage; 9 | import codechicken.enderstorage.recipe.CreateRecipe; 10 | import codechicken.enderstorage.recipe.ReColourRecipe; 11 | import codechicken.enderstorage.tile.TileEnderChest; 12 | import codechicken.enderstorage.tile.TileEnderTank; 13 | import codechicken.lib.inventory.container.CCLMenuType; 14 | import net.covers1624.quack.util.CrashLock; 15 | import net.minecraft.core.component.DataComponentType; 16 | import net.minecraft.core.registries.Registries; 17 | import net.minecraft.world.inventory.MenuType; 18 | import net.minecraft.world.item.CreativeModeTabs; 19 | import net.minecraft.world.item.Item; 20 | import net.minecraft.world.item.crafting.RecipeSerializer; 21 | import net.minecraft.world.level.block.Block; 22 | import net.minecraft.world.level.block.entity.BlockEntityType; 23 | import net.minecraft.world.level.block.state.BlockBehaviour; 24 | import net.minecraft.world.level.material.MapColor; 25 | import net.neoforged.bus.api.IEventBus; 26 | import net.neoforged.neoforge.capabilities.Capabilities; 27 | import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; 28 | import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; 29 | import net.neoforged.neoforge.registries.DeferredHolder; 30 | import net.neoforged.neoforge.registries.DeferredRegister; 31 | 32 | import static codechicken.enderstorage.EnderStorage.MOD_ID; 33 | 34 | /** 35 | * Created by covers1624 on 29/10/19. 36 | */ 37 | public class EnderStorageModContent { 38 | 39 | private static final CrashLock LOCK = new CrashLock("Already Initialized."); 40 | private static final DeferredRegister BLOCKS = DeferredRegister.create(Registries.BLOCK, MOD_ID); 41 | private static final DeferredRegister ITEMS = DeferredRegister.create(Registries.ITEM, MOD_ID); 42 | private static final DeferredRegister> BLOCK_ENTITY_TYPES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, MOD_ID); 43 | private static final DeferredRegister> DATA_COMPONENTS = DeferredRegister.create(Registries.DATA_COMPONENT_TYPE, MOD_ID); 44 | private static final DeferredRegister> MENU_TYPES = DeferredRegister.create(Registries.MENU, MOD_ID); 45 | private static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(Registries.RECIPE_SERIALIZER, MOD_ID); 46 | 47 | private static final BlockBehaviour.Properties blockProps = Block.Properties.of() 48 | .mapColor(MapColor.STONE) 49 | .strength(20, 100); 50 | public static final DeferredHolder ENDER_CHEST_BLOCK = BLOCKS.register("ender_chest", () -> new BlockEnderChest(blockProps)); 51 | public static final DeferredHolder ENDER_TANK_BLOCK = BLOCKS.register("ender_tank", () -> new BlockEnderTank(blockProps)); 52 | 53 | public static final DeferredHolder ENDER_CHEST_ITEM = ITEMS.register("ender_chest", () -> new ItemEnderStorage(ENDER_CHEST_BLOCK.get())); 54 | public static final DeferredHolder ENDER_TANK_ITEM = ITEMS.register("ender_tank", () -> new ItemEnderStorage(ENDER_TANK_BLOCK.get())); 55 | 56 | public static final DeferredHolder ENDER_POUCH = ITEMS.register("ender_pouch", ItemEnderPouch::new); 57 | 58 | public static final DeferredHolder, BlockEntityType> ENDER_CHEST_TILE = BLOCK_ENTITY_TYPES.register("ender_chest", () -> 59 | BlockEntityType.Builder.of(TileEnderChest::new, ENDER_CHEST_BLOCK.get()).build(null) 60 | ); 61 | public static final DeferredHolder, BlockEntityType> ENDER_TANK_TILE = BLOCK_ENTITY_TYPES.register("ender_tank", () -> 62 | BlockEntityType.Builder.of(TileEnderTank::new, ENDER_TANK_BLOCK.get()).build(null) 63 | ); 64 | 65 | public static final DeferredHolder, DataComponentType> FREQUENCY_DATA_COMPONENT = DATA_COMPONENTS.register("frequency", () -> 66 | DataComponentType.builder() 67 | .persistent(Frequency.CODEC) 68 | .networkSynchronized(Frequency.STREAM_CODEC) 69 | .build() 70 | ); 71 | 72 | public static final DeferredHolder, MenuType> ENDER_ITEM_STORAGE = MENU_TYPES.register("ender_item_storage", () -> 73 | CCLMenuType.create(ContainerEnderItemStorage::new) 74 | ); 75 | 76 | public static final DeferredHolder, RecipeSerializer> CREATE_RECIPE_SERIALIZER = RECIPE_SERIALIZERS.register("create_recipe", 77 | CreateRecipe.Serializer::new 78 | ); 79 | public static final DeferredHolder, RecipeSerializer> RECOLOUR_RECIPE_SERIALIZER = RECIPE_SERIALIZERS.register("recolour_recipe", 80 | ReColourRecipe.Serializer::new 81 | ); 82 | 83 | public static void init(IEventBus modBus) { 84 | LOCK.lock(); 85 | BLOCKS.register(modBus); 86 | ITEMS.register(modBus); 87 | BLOCK_ENTITY_TYPES.register(modBus); 88 | DATA_COMPONENTS.register(modBus); 89 | MENU_TYPES.register(modBus); 90 | RECIPE_SERIALIZERS.register(modBus); 91 | modBus.addListener(EnderStorageModContent::onCreativeTabBuild); 92 | modBus.addListener(EnderStorageModContent::onRegisterCaps); 93 | } 94 | 95 | private static void onCreativeTabBuild(BuildCreativeModeTabContentsEvent event) { 96 | if (event.getTabKey() == CreativeModeTabs.BUILDING_BLOCKS) { 97 | event.accept(ENDER_POUCH.get()); 98 | event.accept(ENDER_CHEST_BLOCK.get()); 99 | event.accept(ENDER_TANK_BLOCK.get()); 100 | } 101 | } 102 | 103 | private static void onRegisterCaps(RegisterCapabilitiesEvent event) { 104 | event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ENDER_CHEST_TILE.get(), (object, context) -> object.getItemHandler()); 105 | event.registerBlockEntity(Capabilities.FluidHandler.BLOCK, ENDER_TANK_TILE.get(), (object, context) -> object.getFluidHandler()); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/api/Frequency.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.api; 2 | 3 | import codechicken.enderstorage.init.EnderStorageModContent; 4 | import codechicken.lib.colour.EnumColour; 5 | import codechicken.lib.data.MCDataInput; 6 | import codechicken.lib.data.MCDataOutput; 7 | import com.mojang.serialization.Codec; 8 | import com.mojang.serialization.codecs.RecordCodecBuilder; 9 | import net.minecraft.core.RegistryAccess; 10 | import net.minecraft.core.UUIDUtil; 11 | import net.minecraft.nbt.CompoundTag; 12 | import net.minecraft.network.RegistryFriendlyByteBuf; 13 | import net.minecraft.network.chat.Component; 14 | import net.minecraft.network.chat.ComponentSerialization; 15 | import net.minecraft.network.codec.ByteBufCodecs; 16 | import net.minecraft.network.codec.StreamCodec; 17 | import net.minecraft.world.entity.player.Player; 18 | import net.minecraft.world.item.ItemStack; 19 | import org.jetbrains.annotations.Nullable; 20 | 21 | import java.util.Optional; 22 | import java.util.UUID; 23 | 24 | /** 25 | * Created by covers1624 on 4/26/2016. 26 | */ 27 | public record Frequency( 28 | EnumColour left, 29 | EnumColour middle, 30 | EnumColour right, 31 | Optional owner, 32 | Optional ownerName 33 | ) { 34 | 35 | public static final Codec CODEC = RecordCodecBuilder.create(builder -> builder.group( 36 | EnumColour.CODEC.fieldOf("left").forGetter(Frequency::left), 37 | EnumColour.CODEC.fieldOf("middle").forGetter(Frequency::middle), 38 | EnumColour.CODEC.fieldOf("right").forGetter(Frequency::right), 39 | UUIDUtil.CODEC.optionalFieldOf("owner").forGetter(Frequency::owner), 40 | ComponentSerialization.CODEC.optionalFieldOf("ownerName").forGetter(Frequency::ownerName) 41 | ).apply(builder, Frequency::new) 42 | ); 43 | public static final StreamCodec STREAM_CODEC = StreamCodec.composite( 44 | EnumColour.STREAM_CODEC, Frequency::left, 45 | EnumColour.STREAM_CODEC, Frequency::middle, 46 | EnumColour.STREAM_CODEC, Frequency::right, 47 | ByteBufCodecs.optional(UUIDUtil.STREAM_CODEC), Frequency::owner, 48 | ByteBufCodecs.optional(ComponentSerialization.STREAM_CODEC), Frequency::ownerName, 49 | Frequency::new 50 | ); 51 | 52 | public Frequency() { 53 | this(EnumColour.WHITE, EnumColour.WHITE, EnumColour.WHITE); 54 | } 55 | 56 | public Frequency(EnumColour left, EnumColour middle, EnumColour right) { 57 | this(left, middle, right, Optional.empty(), Optional.empty()); 58 | } 59 | 60 | @Deprecated 61 | public Frequency(CompoundTag tagCompound) { 62 | this( 63 | EnumColour.fromWoolMeta(tagCompound.getInt("left")), 64 | EnumColour.fromWoolMeta(tagCompound.getInt("middle")), 65 | EnumColour.fromWoolMeta(tagCompound.getInt("right")), 66 | tagCompound.hasUUID("owner") ? Optional.of(tagCompound.getUUID("owner")) : Optional.empty(), 67 | tagCompound.contains("owner_name") ? Optional.of(Component.Serializer.fromJson(tagCompound.getString("owner_name"), RegistryAccess.EMPTY)) : Optional.empty() 68 | ); 69 | } 70 | 71 | public Frequency withLeft(@Nullable EnumColour left) { 72 | if (left != null) { 73 | return new Frequency(left, middle, right, owner, ownerName); 74 | } 75 | return this; 76 | } 77 | 78 | public Frequency withMiddle(@Nullable EnumColour middle) { 79 | if (middle != null) { 80 | return new Frequency(left, middle, right, owner, ownerName); 81 | } 82 | return this; 83 | } 84 | 85 | public Frequency withRight(@Nullable EnumColour right) { 86 | if (right != null) { 87 | return new Frequency(left, middle, right, owner, ownerName); 88 | } 89 | return this; 90 | } 91 | 92 | public Frequency withOwner(Player player) { 93 | return new Frequency(left, middle, right, Optional.of(player.getUUID()), Optional.of(player.getName())); 94 | } 95 | 96 | public Frequency withoutOwner() { 97 | return new Frequency(left, middle, right, Optional.empty(), Optional.empty()); 98 | } 99 | 100 | public boolean hasOwner() { 101 | return owner.isPresent() && ownerName.isPresent(); 102 | } 103 | 104 | public Frequency withColours(@Nullable EnumColour[] colours) { 105 | return withLeft(colours[0]) 106 | .withMiddle(colours[1]) 107 | .withRight(colours[2]); 108 | } 109 | 110 | public EnumColour[] toArray() { 111 | return new EnumColour[] { left, middle, right }; 112 | } 113 | 114 | private CompoundTag write_internal(CompoundTag tagCompound) { 115 | tagCompound.putInt("left", left.getWoolMeta()); 116 | tagCompound.putInt("middle", middle.getWoolMeta()); 117 | tagCompound.putInt("right", right.getWoolMeta()); 118 | owner.ifPresent(uuid -> tagCompound.putUUID("owner", uuid)); 119 | ownerName.ifPresent(component -> tagCompound.putString("owner_name", Component.Serializer.toJson(component, RegistryAccess.EMPTY))); 120 | return tagCompound; 121 | } 122 | 123 | @Deprecated 124 | public void writeToPacket(MCDataOutput packet) { 125 | packet.writeCompoundNBT(write_internal(new CompoundTag())); 126 | } 127 | 128 | @Deprecated 129 | public static Frequency readFromPacket(MCDataInput packet) { 130 | return new Frequency(packet.readCompoundNBT()); 131 | } 132 | 133 | @Deprecated // Maybe? 134 | public static Frequency readFromStack(ItemStack stack) { 135 | return stack.getOrDefault(EnderStorageModContent.FREQUENCY_DATA_COMPONENT, new Frequency()); 136 | } 137 | 138 | @Deprecated // Maybe? 139 | public ItemStack writeToStack(ItemStack stack) { 140 | stack.set(EnderStorageModContent.FREQUENCY_DATA_COMPONENT, this); 141 | return stack; 142 | } 143 | 144 | @Override 145 | public String toString() { 146 | String owner = ""; 147 | if (hasOwner()) { 148 | owner = ",owner=" + this.owner; 149 | } 150 | return "left=" + left().getSerializedName() + ",middle=" + middle().getSerializedName() + ",right=" + right().getSerializedName() + owner; 151 | } 152 | 153 | public Component getTooltip() { 154 | return Component.translatable(left().getUnlocalizedName()) 155 | .append("/") 156 | .append(Component.translatable(middle().getUnlocalizedName())) 157 | .append("/") 158 | .append(Component.translatable(right().getUnlocalizedName())); 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/recipe/ReColourRecipe.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.recipe; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.init.EnderStorageModContent; 5 | import codechicken.lib.colour.EnumColour; 6 | import com.mojang.serialization.Codec; 7 | import com.mojang.serialization.MapCodec; 8 | import com.mojang.serialization.codecs.RecordCodecBuilder; 9 | import net.covers1624.quack.collection.ColUtils; 10 | import net.minecraft.core.HolderLookup; 11 | import net.minecraft.network.RegistryFriendlyByteBuf; 12 | import net.minecraft.network.codec.ByteBufCodecs; 13 | import net.minecraft.network.codec.StreamCodec; 14 | import net.minecraft.world.item.ItemStack; 15 | import net.minecraft.world.item.crafting.*; 16 | import net.minecraft.world.level.Level; 17 | import org.jetbrains.annotations.Nullable; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | import java.util.Objects; 22 | 23 | /** 24 | * Created by covers1624 on 8/07/2017. 25 | */ 26 | public class ReColourRecipe implements CraftingRecipe { 27 | 28 | protected final String group; 29 | protected final ItemStack result; 30 | protected final Ingredient ingredient; 31 | 32 | public ReColourRecipe(ItemStack result) { 33 | this("", result); 34 | } 35 | 36 | public ReColourRecipe(String group, ItemStack result) { 37 | this.group = group; 38 | this.result = result; 39 | ingredient = Ingredient.of(result); 40 | } 41 | 42 | @Override 43 | public boolean matches(CraftingInput inv, Level worldIn) { 44 | if (inv.isEmpty()) { 45 | return false; 46 | } 47 | ItemWithPos chest = findChest(inv); 48 | if (chest == null || chest.y == 0) { 49 | return false; 50 | } 51 | List validPositions = new ArrayList<>(); 52 | validPositions.add(chest); 53 | 54 | EnumColour[] colours = findDyes(inv, chest, validPositions); 55 | if (colours == null) return false; 56 | 57 | for (int x = 0; x < inv.width(); x++) { 58 | for (int y = 0; y < inv.height(); y++) { 59 | ItemStack stack = inv.getItem(x + y * inv.width()); 60 | if (!stack.isEmpty() && !validPositions.contains(new ItemWithPos(x, y, stack))) { 61 | return false; 62 | } 63 | } 64 | } 65 | return true; 66 | } 67 | 68 | @Override 69 | public ItemStack assemble(CraftingInput inv, HolderLookup.Provider registries) { 70 | ItemWithPos chestPos = findChest(inv); 71 | if (chestPos == null) return result.copy(); // This should not happen... 72 | 73 | EnumColour[] colours = findDyes(inv, chestPos, null); 74 | if (colours == null) return result.copy(); // This should also not happen... 75 | 76 | return Frequency.readFromStack(chestPos.stack) 77 | .withColours(colours) 78 | .writeToStack(result.copy()); 79 | } 80 | 81 | @Override 82 | public boolean isSpecial() { 83 | return true; 84 | } 85 | 86 | @Override 87 | public RecipeSerializer getSerializer() { 88 | return EnderStorageModContent.RECOLOUR_RECIPE_SERIALIZER.get(); 89 | } 90 | 91 | @Override 92 | public boolean canCraftInDimensions(int width, int height) { 93 | return width >= 3 && height >= 3; 94 | } 95 | 96 | @Override 97 | public String getGroup() { 98 | return group; 99 | } 100 | 101 | @Override 102 | public ItemStack getResultItem(HolderLookup.Provider registries) { 103 | return result; 104 | } 105 | 106 | @Override 107 | public CraftingBookCategory category() { 108 | return CraftingBookCategory.MISC; 109 | } 110 | 111 | private @Nullable ItemWithPos findChest(CraftingInput inv) { 112 | ItemWithPos chest = null; 113 | for (int x = 0; x < inv.width(); x++) { 114 | for (int y = 0; y < inv.height(); y++) { 115 | ItemStack stack = inv.getItem(x, y); 116 | if (stack.isEmpty()) continue; 117 | if (!ingredient.test(stack)) continue; 118 | 119 | chest = new ItemWithPos(x, y, stack); 120 | break; 121 | } 122 | } 123 | return chest; 124 | } 125 | 126 | private EnumColour @Nullable [] findDyes(CraftingInput inv, ItemWithPos chest, @Nullable List validPositions) { 127 | EnumColour[] colours = new EnumColour[] { null, null, null }; 128 | for (int x = 0; x < inv.width(); x++) { 129 | for (int y = 0; y < chest.y; y++) { 130 | ItemStack stack = inv.getItem(x, y); 131 | if (stack.isEmpty()) continue; 132 | 133 | EnumColour colour = EnumColour.fromDyeStack(stack); 134 | if (colour == null) continue; // Not a dye. 135 | 136 | int effectiveColour = chest.x == x ? 1 : chest.x < x ? 2 : 0; 137 | 138 | if (colours[effectiveColour] != null) { 139 | EnumColour merge = EnumColour.mix(colours[effectiveColour], colour); 140 | if (merge == null || merge == colour) return null; 141 | 142 | colours[effectiveColour] = merge; 143 | } else { 144 | colours[effectiveColour] = colour; 145 | } 146 | if (validPositions != null) { 147 | validPositions.add(new ItemWithPos(x, y, stack)); 148 | } 149 | } 150 | } 151 | return !ColUtils.allMatch(colours, Objects::isNull) ? colours : null; 152 | } 153 | 154 | private record ItemWithPos(int x, int y, ItemStack stack) { } 155 | 156 | public static class Serializer implements RecipeSerializer { 157 | 158 | private static final MapCodec CODEC = RecordCodecBuilder.mapCodec(builder -> builder.group( 159 | Codec.STRING.optionalFieldOf("group", "").forGetter(e -> e.group), 160 | ItemStack.STRICT_CODEC.fieldOf("result").forGetter(e -> e.result) 161 | ).apply(builder, ReColourRecipe::new) 162 | ); 163 | 164 | private static final StreamCodec STREAM_CODEC = StreamCodec.composite( 165 | ByteBufCodecs.STRING_UTF8, e -> e.group, 166 | ItemStack.STREAM_CODEC, e -> e.result, 167 | ReColourRecipe::new 168 | ); 169 | 170 | @Override 171 | public MapCodec codec() { 172 | return CODEC; 173 | } 174 | 175 | @Override 176 | public StreamCodec streamCodec() { 177 | return STREAM_CODEC; 178 | } 179 | } 180 | } 181 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/client/render/tile/RenderTileEnderChest.java: -------------------------------------------------------------------------------- 1 | package codechicken.enderstorage.client.render.tile; 2 | 3 | import codechicken.enderstorage.api.Frequency; 4 | import codechicken.enderstorage.block.BlockEnderChest; 5 | import codechicken.enderstorage.client.model.ButtonModelLibrary; 6 | import codechicken.enderstorage.client.render.RenderCustomEndPortal; 7 | import codechicken.enderstorage.tile.TileEnderChest; 8 | import codechicken.lib.colour.EnumColour; 9 | import codechicken.lib.math.MathHelper; 10 | import codechicken.lib.render.CCModelLibrary; 11 | import codechicken.lib.render.CCRenderState; 12 | import codechicken.lib.render.RenderUtils; 13 | import codechicken.lib.util.ClientUtils; 14 | import codechicken.lib.vec.Matrix4; 15 | import codechicken.lib.vec.Rotation; 16 | import codechicken.lib.vec.Vector3; 17 | import codechicken.lib.vec.uv.UVTranslation; 18 | import com.mojang.blaze3d.vertex.PoseStack; 19 | import com.mojang.blaze3d.vertex.VertexConsumer; 20 | import net.minecraft.client.model.geom.ModelPart; 21 | import net.minecraft.client.model.geom.PartPose; 22 | import net.minecraft.client.model.geom.builders.CubeListBuilder; 23 | import net.minecraft.client.model.geom.builders.LayerDefinition; 24 | import net.minecraft.client.model.geom.builders.MeshDefinition; 25 | import net.minecraft.client.model.geom.builders.PartDefinition; 26 | import net.minecraft.client.renderer.MultiBufferSource; 27 | import net.minecraft.client.renderer.RenderType; 28 | import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; 29 | import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; 30 | import net.minecraft.resources.ResourceLocation; 31 | import org.joml.Quaternionf; 32 | 33 | import static codechicken.enderstorage.EnderStorage.MOD_ID; 34 | 35 | /** 36 | * Created by covers1624 on 4/12/2016. 37 | */ 38 | public class RenderTileEnderChest implements BlockEntityRenderer { 39 | 40 | private static final RenderType chestType = RenderType.entityCutout(ResourceLocation.fromNamespaceAndPath(MOD_ID, "textures/enderchest.png")); 41 | private static final RenderType buttonType = RenderType.entitySolid(ResourceLocation.fromNamespaceAndPath(MOD_ID, "textures/buttons.png")); 42 | private static final RenderType pearlType = CCModelLibrary.getIcos4RenderType(ResourceLocation.fromNamespaceAndPath(MOD_ID, "textures/hedronmap.png")); 43 | private static final RenderCustomEndPortal renderEndPortal = new RenderCustomEndPortal(0.626, 0.188, 0.812, 0.188, 0.812); 44 | 45 | private final ModelPart bottom; 46 | private final ModelPart lid; 47 | private final ModelPart lock; 48 | private final ModelPart diamondLock; 49 | 50 | public RenderTileEnderChest(BlockEntityRendererProvider.Context context) { 51 | ModelPart chestRoot = createChestLayer().bakeRoot(); 52 | bottom = chestRoot.getChild("bottom"); 53 | lid = chestRoot.getChild("lid"); 54 | lock = chestRoot.getChild("lock"); 55 | diamondLock = chestRoot.getChild("diamond_lock"); 56 | } 57 | 58 | public static LayerDefinition createChestLayer() { 59 | MeshDefinition mesh = new MeshDefinition(); 60 | PartDefinition root = mesh.getRoot(); 61 | root.addOrReplaceChild("bottom", CubeListBuilder.create().texOffs(0, 19).addBox(0.0F, 0.0F, 0.0F, 14, 10, 14), PartPose.offset(1.0F, 6F, 1.0F)); 62 | root.addOrReplaceChild("lid", CubeListBuilder.create().texOffs(0, 0).addBox(0.0F, -5F, -14F, 14, 5, 14), PartPose.offset(1.0F, 7F, 15F)); 63 | root.addOrReplaceChild("lock", CubeListBuilder.create().texOffs(0, 0).addBox(-1F, -2F, -15F, 2, 4, 1), PartPose.offset(8F, 7F, 15F)); 64 | root.addOrReplaceChild("diamond_lock", CubeListBuilder.create().texOffs(0, 5).addBox(-1F, -2F, -15F, 2, 4, 1), PartPose.offset(8F, 7F, 15F)); 65 | return LayerDefinition.create(mesh, 64, 64); 66 | } 67 | 68 | @Override 69 | public void render(TileEnderChest enderChest, float partialTicks, PoseStack mStack, MultiBufferSource getter, int packedLight, int packedOverlay) { 70 | CCRenderState ccrs = CCRenderState.instance(); 71 | ccrs.brightness = packedLight; 72 | ccrs.overlay = packedOverlay; 73 | renderChest(ccrs, mStack, getter, enderChest.rotation, enderChest.getFrequency(), (float) enderChest.getRadianLidAngle(partialTicks), RenderUtils.getTimeOffset(enderChest.getBlockPos())); 74 | } 75 | 76 | public void renderChest(CCRenderState ccrs, PoseStack pose, MultiBufferSource source, int rotation, Frequency freq, float lidAngle, int pearlOffset) { 77 | Matrix4 mat = new Matrix4(pose); 78 | if (lidAngle != 0) { 79 | renderEndPortal.render(mat, source); 80 | } 81 | ccrs.reset(); 82 | 83 | // Render chest 84 | pose.pushPose(); 85 | pose.translate(0, 1.0, 1.0); 86 | pose.scale(1.0F, -1.0F, -1.0F); 87 | pose.translate(0.5, 0.5, 0.5); 88 | pose.mulPose(new Quaternionf().rotateXYZ(0, (float) (rotation * 90F * MathHelper.torad), 0)); 89 | pose.translate(-0.5, -0.5, -0.5); 90 | VertexConsumer chestCons = source.getBuffer(chestType); 91 | lid.xRot = lidAngle; 92 | lock.xRot = lidAngle; 93 | diamondLock.xRot = lidAngle; 94 | lid.render(pose, chestCons, ccrs.brightness, ccrs.overlay); 95 | bottom.render(pose, chestCons, ccrs.brightness, ccrs.overlay); 96 | if (freq.hasOwner()) { 97 | diamondLock.render(pose, chestCons, ccrs.brightness, ccrs.overlay); 98 | } else { 99 | lock.render(pose, chestCons, ccrs.brightness, ccrs.overlay); 100 | } 101 | pose.popPose(); 102 | 103 | mat.translate(0.5, 0, 0.5); 104 | // Buttons 105 | ccrs.bind(buttonType, source); 106 | Matrix4 buttonCommon = mat.copy(); 107 | buttonCommon.rotate((-90 * (rotation)) * MathHelper.torad, Vector3.Y_POS); 108 | buttonCommon.apply(new Rotation(lidAngle, 1, 0, 0).at(new Vector3(-8 / 16D, 9D / 16D, -7 / 16D))); 109 | 110 | EnumColour[] colours = freq.toArray(); 111 | for (int i = 0; i < 3; i++) { 112 | Matrix4 buttonMat = buttonCommon.copy(); 113 | buttonMat.apply(BlockEnderChest.buttonT[i]); 114 | ButtonModelLibrary.button.render(ccrs, buttonMat, new UVTranslation(0.25 * (colours[i].getWoolMeta() % 4), 0.25 * (colours[i].getWoolMeta() / 4))); 115 | } 116 | 117 | // Pearl 118 | if (lidAngle != 0) { 119 | double time = ClientUtils.getRenderTime() + pearlOffset; 120 | Matrix4 pearlMat = RenderUtils.getMatrix(mat.copy(), new Vector3(0, 0.2 + lidAngle * -0.5 + RenderUtils.getPearlBob(time), 0), new Rotation(time / 3, new Vector3(0, 1, 0)), 0.04); 121 | ccrs.brightness = 15728880; 122 | ccrs.bind(pearlType, source); 123 | CCModelLibrary.icosahedron4.render(ccrs, pearlMat); 124 | } 125 | ccrs.reset(); 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /src/main/java/codechicken/enderstorage/command/ClearCommand.java: -------------------------------------------------------------------------------- 1 | //package codechicken.enderstorage.command; 2 | // 3 | //import codechicken.enderstorage.api.AbstractEnderStorage; 4 | //import codechicken.enderstorage.api.Frequency; 5 | //import codechicken.enderstorage.manager.EnderStorageManager; 6 | //import codechicken.lib.colour.EnumColour; 7 | //import codechicken.lib.command.help.IBetterHelpCommand; 8 | //import codechicken.lib.util.ArrayUtils; 9 | //import com.google.common.base.Strings; 10 | //import net.minecraft.command.CommandBase; 11 | //import net.minecraft.command.CommandException; 12 | //import net.minecraft.command.ICommandSender; 13 | //import net.minecraft.server.MinecraftServer; 14 | //import net.minecraft.util.text.TextComponentString; 15 | // 16 | //import java.util.*; 17 | //import java.util.function.Predicate; 18 | // 19 | //import static net.minecraft.util.text.TextFormatting.*; 20 | // 21 | ///** 22 | // * Created by covers1624 on 18/01/2017. 23 | // */ 24 | //public class ClearCommand extends CommandBase implements IBetterHelpCommand { 25 | // 26 | // @Override 27 | // public String getName() { 28 | // return "clear"; 29 | // } 30 | // 31 | // @Override 32 | // public String getDesc() { 33 | // return "Provides ability to clear a users EnderStorage."; 34 | // } 35 | // 36 | // @Override 37 | // public List getHelp() { 38 | // List lines = new LinkedList<>(); 39 | // lines.add("[] Defines required choice parameters."); 40 | // lines.add("<> Defines optional parameters."); 41 | // lines.add("Syntax: \"/EnderStorage clear [item|liquid|*] [freq|*] \""); 42 | // lines.add("If you don't provide a player it will clear all global Storage's."); 43 | // lines.add("To clear all player Storage's provide \"*\" as the player."); 44 | // lines.add("For frequency syntax use \"/EnderStorage help frequency\""); 45 | // return lines; 46 | // } 47 | // 48 | // @Override 49 | // public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { 50 | // if (args.length < 2) { 51 | // sender.sendMessage(new TextComponentString(RED + "Not Enough Arguments!")); 52 | // displayHelpText(sender); 53 | // return; 54 | // } 55 | // String identifier = args[0]; 56 | // String frequency = args[1]; 57 | // 58 | // String owner = null; 59 | // if (args.length == 3) { 60 | // owner = args[2]; 61 | // } 62 | // 63 | // Set identifiers = EnderStorageManager.getPlugins().keySet(); 64 | // 65 | // if ("*".equals(identifier)) { 66 | // for (String ident : identifiers) { 67 | // nukeStorage(ident, frequency, owner, sender); 68 | // } 69 | // } else { 70 | // if (identifiers.contains(identifier)) { 71 | // nukeStorage(identifier, frequency, owner, sender); 72 | // } else { 73 | // sender.sendMessage(new TextComponentString(RED + "Invalid Storage Identifier [" + identifier + "]")); 74 | // sender.sendMessage(new TextComponentString("For valid Identifiers run, " + YELLOW + "\"/EnderStorage help validStorage\"")); 75 | // } 76 | // } 77 | // } 78 | // 79 | // private static void nukeStorage(String identifier, String frequency, final String owner, ICommandSender sender) throws CommandException { 80 | // EnderStorageManager manager = EnderStorageManager.instance(false); 81 | // List validKeys = manager.getValidKeys(identifier); 82 | // Predicate frequencyPredicate; 83 | // Predicate ownerPredicate; 84 | // 85 | // if ("*".equals(frequency)) { 86 | // frequencyPredicate = input -> true; 87 | // } else { 88 | // final String[] split = frequency.split(","); 89 | // if (split != null && split.length == 3) { 90 | // for (String c : split) {//Validate that all colours exist. 91 | // boolean valid = false; 92 | // for (EnumColour colour : EnumColour.values()) { 93 | // if (colour.getName().equalsIgnoreCase(c)) { 94 | // valid = true; 95 | // } 96 | // } 97 | // if (!valid) { 98 | // throw new CommandException(c + " is an invalid colour! \"/EnderStorage help colour\""); 99 | // } 100 | // } 101 | // //If we've come this far the colour is probably valid. 102 | // frequencyPredicate = input -> { 103 | // if (Strings.isNullOrEmpty(input)) { 104 | // return false; 105 | // } 106 | // //Assume this is valid as we control what comes in here. 107 | // Map kvArray = ArrayUtils.convertKeyValueArrayToMap(input.split(",")); 108 | // if (kvArray.get("left").equalsIgnoreCase(split[0])) { 109 | // if (kvArray.get("middle").equalsIgnoreCase(split[1])) { 110 | // if (kvArray.get("right").equalsIgnoreCase(split[2])) { 111 | // return true; 112 | // } 113 | // } 114 | // } 115 | // return false; 116 | // }; 117 | // } else { 118 | // throw new CommandException("Invalid frequency format! \",,\""); 119 | // } 120 | // } 121 | // 122 | // if (owner == null) { 123 | // //No owner, cool, only global then. 124 | // ownerPredicate = Objects::isNull; 125 | // } else { 126 | // if ("*".equals(owner)) { 127 | // //Any owner, not global. 128 | // ownerPredicate = input -> !Strings.isNullOrEmpty(input); 129 | // } else { 130 | // //Specific owner. 131 | // ownerPredicate = owner::equals; 132 | // } 133 | // } 134 | // 135 | // boolean noStorage = true; 136 | // List cleared = new ArrayList<>(); 137 | // for (String key : validKeys) { 138 | // Map kvArray = ArrayUtils.convertKeyValueArrayToMap(key.split(",")); 139 | // if (frequencyPredicate.test(key)) { 140 | // if (ownerPredicate.test(kvArray.get("owner"))) { 141 | // noStorage = false; 142 | // Frequency freq = Frequency.fromString(kvArray.get("left"), kvArray.get("middle"), kvArray.get("right"), kvArray.get("owner")); 143 | // AbstractEnderStorage storage = manager.getStorage(freq, identifier); 144 | // storage.clearStorage(); 145 | // cleared.add(freq.toString()); 146 | // } 147 | // } 148 | // } 149 | // if (noStorage) { 150 | // throw new CommandException("No storage's exist for that colour and owner.."); 151 | // } else { 152 | // sender.sendMessage(new TextComponentString(YELLOW + "Successfully cleared " + cleared.size() + " Storage's!")); 153 | // for (String entry : cleared) { 154 | // sender.sendMessage(new TextComponentString(BLUE + entry)); 155 | // } 156 | // } 157 | // } 158 | //} 159 | --------------------------------------------------------------------------------