├── .github └── workflows │ └── build.yml ├── .gitignore ├── README.md ├── build.gradle ├── common ├── build.gradle └── src │ └── main │ ├── java │ └── com │ │ └── vsngarcia │ │ ├── Config.java │ │ ├── ElevatorBlockBase.java │ │ ├── ElevatorHandler.java │ │ ├── ElevatorMod.java │ │ ├── client │ │ ├── ColorCamoElevator.java │ │ └── gui │ │ │ ├── ElevatorScreen.java │ │ │ ├── FacingButton.java │ │ │ └── FacingControllerWrapper.java │ │ ├── level │ │ ├── ElevatorBlockEntityBase.java │ │ └── ElevatorContainer.java │ │ ├── network │ │ ├── ClientPacketSender.java │ │ ├── TeleportPacket.java │ │ └── client │ │ │ ├── RemoveCamoPacket.java │ │ │ ├── SetArrowPacket.java │ │ │ ├── SetDirectionalPacket.java │ │ │ └── SetFacingPacket.java │ │ └── util │ │ └── FakeUseContext.java │ └── resources │ ├── assets │ └── elevatorid │ │ ├── blockstates │ │ ├── elevator_black.json │ │ ├── elevator_blue.json │ │ ├── elevator_brown.json │ │ ├── elevator_cyan.json │ │ ├── elevator_gray.json │ │ ├── elevator_green.json │ │ ├── elevator_light_blue.json │ │ ├── elevator_light_gray.json │ │ ├── elevator_lime.json │ │ ├── elevator_magenta.json │ │ ├── elevator_orange.json │ │ ├── elevator_pink.json │ │ ├── elevator_purple.json │ │ ├── elevator_red.json │ │ ├── elevator_white.json │ │ └── elevator_yellow.json │ │ ├── items │ │ ├── elevator_black.json │ │ ├── elevator_blue.json │ │ ├── elevator_brown.json │ │ ├── elevator_cyan.json │ │ ├── elevator_gray.json │ │ ├── elevator_green.json │ │ ├── elevator_light_blue.json │ │ ├── elevator_light_gray.json │ │ ├── elevator_lime.json │ │ ├── elevator_magenta.json │ │ ├── elevator_orange.json │ │ ├── elevator_pink.json │ │ ├── elevator_purple.json │ │ ├── elevator_red.json │ │ ├── elevator_white.json │ │ └── elevator_yellow.json │ │ ├── lang │ │ ├── de_de.json │ │ ├── en_us.json │ │ ├── es_ar.json │ │ ├── es_es.json │ │ ├── es_mx.json │ │ ├── fr_fr.json │ │ ├── it_it.json │ │ ├── ja_jp.json │ │ ├── kk_kz.json │ │ ├── ko_kr.json │ │ ├── pl_pl.json │ │ ├── pt_br.json │ │ ├── pt_pt.json │ │ ├── ru_ru.json │ │ ├── sv_se.json │ │ ├── tr_tr.json │ │ ├── uk_ua.json │ │ ├── zh_cn.json │ │ └── zh_tw.json │ │ ├── models │ │ ├── arrow.json │ │ ├── block │ │ │ ├── elevator_black.json │ │ │ ├── elevator_blue.json │ │ │ ├── elevator_brown.json │ │ │ ├── elevator_cyan.json │ │ │ ├── elevator_gray.json │ │ │ ├── elevator_green.json │ │ │ ├── elevator_light_blue.json │ │ │ ├── elevator_light_gray.json │ │ │ ├── elevator_lime.json │ │ │ ├── elevator_magenta.json │ │ │ ├── elevator_orange.json │ │ │ ├── elevator_pink.json │ │ │ ├── elevator_purple.json │ │ │ ├── elevator_red.json │ │ │ ├── elevator_white.json │ │ │ └── elevator_yellow.json │ │ └── item │ │ │ ├── elevator_black.json │ │ │ ├── elevator_blue.json │ │ │ ├── elevator_brown.json │ │ │ ├── elevator_cyan.json │ │ │ ├── elevator_gray.json │ │ │ ├── elevator_green.json │ │ │ ├── elevator_light_blue.json │ │ │ ├── elevator_light_gray.json │ │ │ ├── elevator_lime.json │ │ │ ├── elevator_magenta.json │ │ │ ├── elevator_orange.json │ │ │ ├── elevator_pink.json │ │ │ ├── elevator_purple.json │ │ │ ├── elevator_red.json │ │ │ ├── elevator_white.json │ │ │ └── elevator_yellow.json │ │ ├── sounds.json │ │ ├── sounds │ │ └── teleport.ogg │ │ └── textures │ │ ├── block │ │ ├── arrow.png │ │ ├── elevator_black.png │ │ ├── elevator_blue.png │ │ ├── elevator_brown.png │ │ ├── elevator_cyan.png │ │ ├── elevator_gray.png │ │ ├── elevator_green.png │ │ ├── elevator_light_blue.png │ │ ├── elevator_light_gray.png │ │ ├── elevator_lime.png │ │ ├── elevator_magenta.png │ │ ├── elevator_orange.png │ │ ├── elevator_pink.png │ │ ├── elevator_purple.png │ │ ├── elevator_red.png │ │ ├── elevator_white.png │ │ └── elevator_yellow.png │ │ └── gui │ │ └── elevator_gui.png │ ├── data │ └── elevatorid │ │ ├── loot_table │ │ └── blocks │ │ │ ├── elevator_black.json │ │ │ ├── elevator_blue.json │ │ │ ├── elevator_brown.json │ │ │ ├── elevator_cyan.json │ │ │ ├── elevator_gray.json │ │ │ ├── elevator_green.json │ │ │ ├── elevator_light_blue.json │ │ │ ├── elevator_light_gray.json │ │ │ ├── elevator_lime.json │ │ │ ├── elevator_magenta.json │ │ │ ├── elevator_orange.json │ │ │ ├── elevator_pink.json │ │ │ ├── elevator_purple.json │ │ │ ├── elevator_red.json │ │ │ ├── elevator_white.json │ │ │ └── elevator_yellow.json │ │ ├── recipe │ │ ├── elevator_black.json │ │ ├── elevator_blue.json │ │ ├── elevator_brown.json │ │ ├── elevator_cyan.json │ │ ├── elevator_gray.json │ │ ├── elevator_green.json │ │ ├── elevator_light_blue.json │ │ ├── elevator_light_gray.json │ │ ├── elevator_lime.json │ │ ├── elevator_magenta.json │ │ ├── elevator_orange.json │ │ ├── elevator_pink.json │ │ ├── elevator_purple.json │ │ ├── elevator_red.json │ │ ├── elevator_white.json │ │ ├── elevator_yellow.json │ │ ├── redye_black.json │ │ ├── redye_blue.json │ │ ├── redye_brown.json │ │ ├── redye_cyan.json │ │ ├── redye_gray.json │ │ ├── redye_green.json │ │ ├── redye_light_blue.json │ │ ├── redye_light_gray.json │ │ ├── redye_lime.json │ │ ├── redye_magenta.json │ │ ├── redye_orange.json │ │ ├── redye_pink.json │ │ ├── redye_purple.json │ │ ├── redye_red.json │ │ ├── redye_white.json │ │ └── redye_yellow.json │ │ └── tags │ │ ├── block │ │ └── elevators.json │ │ └── item │ │ └── elevators.json │ ├── elevatorid.mixins.json │ ├── elevatormod.accesswidener │ └── logo.png ├── docs ├── crafting_base.png ├── crafting_redye.png └── elevator_options.png ├── fabric ├── build.gradle └── src │ └── main │ ├── java │ └── com │ │ └── vsngarcia │ │ └── fabric │ │ ├── ElevatorBlock.java │ │ ├── ElevatorModFabric.java │ │ ├── FabricRegistry.java │ │ ├── client │ │ ├── ElevatorModFabricClient.java │ │ └── render │ │ │ └── ElevatorBakedModel.java │ │ ├── network │ │ └── NetworkHandler.java │ │ └── tile │ │ └── ElevatorBlockEntity.java │ └── resources │ └── fabric.mod.json ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── neoforge ├── build.gradle ├── gradle.properties └── src │ └── main │ ├── java │ └── com │ │ └── vsngarcia │ │ └── neoforge │ │ ├── ElevatorBlock.java │ │ ├── ElevatorModNeoForge.java │ │ ├── client │ │ ├── ClientRegistry.java │ │ └── render │ │ │ └── ElevatorBakedModel.java │ │ ├── init │ │ └── Registry.java │ │ ├── network │ │ └── NetworkHandler.java │ │ └── tile │ │ └── ElevatorBlockEntity.java │ └── resources │ └── META-INF │ └── neoforge.mods.toml └── settings.gradle /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: 'Build' 2 | 3 | on: [ push, pull_request ] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | permissions: { contents: write } 9 | 10 | steps: 11 | - uses: actions/checkout@v4 12 | - name: Set up JDK 21 13 | uses: actions/setup-java@v4 14 | with: 15 | java-version: '21' 16 | distribution: 'temurin' 17 | - uses: gradle/actions/setup-gradle@v4 18 | - run: ./gradlew build 19 | 20 | - uses: softprops/action-gh-release@v2 21 | if: startsWith(github.ref, 'refs/tags/') 22 | with: 23 | files: | 24 | **/fabric/build/libs/*-${{ github.ref_name }}.jar 25 | **/neoforge/build/libs/*-${{ github.ref_name }}.jar 26 | generate_release_notes: true 27 | fail_on_unmatched_files: true 28 | draft: true 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # User-specific stuff 2 | .idea/ 3 | 4 | *.iml 5 | *.ipr 6 | *.iws 7 | 8 | # IntelliJ 9 | out/ 10 | # mpeltonen/sbt-idea plugin 11 | .idea_modules/ 12 | 13 | # JIRA plugin 14 | atlassian-ide-plugin.xml 15 | 16 | # Compiled class file 17 | *.class 18 | 19 | # Log file 20 | *.log 21 | 22 | # BlueJ files 23 | *.ctxt 24 | 25 | # Package Files # 26 | *.jar 27 | *.war 28 | *.nar 29 | *.ear 30 | *.zip 31 | *.tar.gz 32 | *.rar 33 | 34 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 35 | hs_err_pid* 36 | 37 | *~ 38 | 39 | # temporary files which can be created if a process still has a handle open of a deleted file 40 | .fuse_hidden* 41 | 42 | # KDE directory preferences 43 | .directory 44 | 45 | # Linux trash folder which might appear on any partition or disk 46 | .Trash-* 47 | 48 | # .nfs files are created when an open file is removed but is still being accessed 49 | .nfs* 50 | 51 | # General 52 | .DS_Store 53 | .AppleDouble 54 | .LSOverride 55 | 56 | # Icon must end with two \r 57 | Icon 58 | 59 | # Thumbnails 60 | ._* 61 | 62 | # Files that might appear in the root of a volume 63 | .DocumentRevisions-V100 64 | .fseventsd 65 | .Spotlight-V100 66 | .TemporaryItems 67 | .Trashes 68 | .VolumeIcon.icns 69 | .com.apple.timemachine.donotpresent 70 | 71 | # Directories potentially created on remote AFP share 72 | .AppleDB 73 | .AppleDesktop 74 | Network Trash Folder 75 | Temporary Items 76 | .apdisk 77 | 78 | # Windows thumbnail cache files 79 | Thumbs.db 80 | Thumbs.db:encryptable 81 | ehthumbs.db 82 | ehthumbs_vista.db 83 | 84 | # Dump file 85 | *.stackdump 86 | 87 | # Folder config file 88 | [Dd]esktop.ini 89 | 90 | # Recycle Bin used on file shares 91 | $RECYCLE.BIN/ 92 | 93 | # Windows Installer files 94 | *.cab 95 | *.msi 96 | *.msix 97 | *.msm 98 | *.msp 99 | 100 | # Windows shortcuts 101 | *.lnk 102 | 103 | .gradle 104 | build/ 105 | 106 | # Ignore Gradle GUI config 107 | gradle-app.setting 108 | 109 | # Cache of project 110 | .gradletasknamecache 111 | 112 | **/build/ 113 | 114 | # Common working directory 115 | run/ 116 | 117 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 118 | !gradle-wrapper.jar 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ElevatorMod 2 | 3 | GitHub 4 | CurseForge 5 | Modrinth 6 | 7 | Port of the elevator from OpenBlocks to Minecraft 1.8+ 8 | 9 | ## Dependencies 10 | 11 | **Forge / NeoForge** 12 | 13 | - None 14 | 15 | **Fabric** 16 | 17 | - [Fabric API](https://github.com/FabricMC/fabric) - Mandatory 18 | - [Forge Config API Port](https://github.com/Fuzss/forgeconfigapiport) - Embedded 19 | 20 | ## Crafting 21 | 22 | The default recipe is the same as in OpenBlocks. 23 | 24 | Example of the white elevator recipe: 25 | 26 | ![Elevator recipe](https://github.com/VsnGamer/ElevatorMod/blob/1.21-architectury/docs/crafting_base.png?raw=true) 27 | 28 | You can also re-dye any elevator: 29 | 30 | ![Dyeing](https://github.com/VsnGamer/ElevatorMod/blob/1.21-architectury/docs/crafting_redye.png?raw=true) 31 | 32 | ## Usage 33 | 34 | To use them, place two or more elevators in the same X and Z coordinates, to move between them simply jump to go to the 35 | elevator above or sneak to go to the one below. 36 | 37 | Elevators need at least 1 block of air (or non-solid block) above to be considered valid. 38 | 39 | You can configure the range of the elevators and if they should require XP to teleport in 40 | the [configuration file](#configuration). 41 | 42 | ### Options Interface 43 | 44 | You can access the options interface by right-clicking on the elevator with an empty hand. 45 | 46 | ![Options](https://github.com/VsnGamer/ElevatorMod/blob/1.21-architectury/docs/elevator_options.png?raw=true) 47 | 48 | ### Directional 49 | 50 | When the `Directional` checkbox is enabled, the elevator will adjust the yaw rotation of players who teleport to it 51 | based on the configured direction. 52 | 53 | You can change the direction by clicking on the desired direction button. _The display order of the buttons will match 54 | the current direction the player is facing._ 55 | 56 | It will also show an arrow on the elevator to indicate the direction it is facing. You can hide it by selecting 57 | the `Hide arrow` checkbox. 58 | 59 | **This has nothing to do with horizontal movement, it only changes the direction the player is facing.** 60 | 61 | ### Camouflage 62 | 63 | You can use any solid block to camouflage the elevator, just right-click on the elevator with the desired block on your 64 | hand. 65 | 66 | Most blocks can be used as camouflage with some exceptions. For example, you can't use a chest because it uses a 67 | different rendering method. 68 | 69 | **Note for _Fabric_ users:** If you are using Sodium, you need to install Lithium to make the camouflage 70 | work[^lithium]. 71 | 72 | [^lithium]: Since Sodium `0.6.0-beta.1` FRAPI is supported out of the box, so it should work **without** Lithium. 73 | 74 | ## Configuration 75 | 76 | The configuration file is per-world and is located at `/serverconfig/elevatorid-server.toml`. 77 | 78 | **Note for _Fabric_ users:** By default it is located at `.minecraft/config/elevatorid-server.toml` but per-world 79 | overrides are possible, 80 | see [FCAP Wiki](https://github.com/Fuzss/forgeconfigapiport/wiki/Understanding-ModConfig-Types#server-config-type) 81 | 82 |
83 | Here are the default values: 84 | 85 | ```toml 86 | [General] 87 | #Should elevators have the same color in order to teleport ? 88 | sameColor = false 89 | 90 | #Elevator range 91 | #Range: 3 ~ 4064 92 | range = 384 93 | 94 | #Realign players to the center of elevator ? 95 | precisionTarget = true 96 | 97 | #Can mobs spawn on elevators ? 98 | mobSpawn = false 99 | 100 | #Reset pitch to 0 when teleporting to normal elevators ? 101 | resetPitchNormal = false 102 | 103 | #Reset pitch to 0 when teleporting to directional elevators ? 104 | resetPitchDirectional = true 105 | 106 | #Should teleporting require XP ? 107 | useXP = false 108 | 109 | #Amount of XP points to use when useXP is enabled 110 | #Note this is NOT experience levels 111 | #Range: > 1 112 | XPPointsAmount = 1 113 | ``` 114 | 115 |
116 | 117 | ## Thanks 118 | 119 | - OpenBlocks Team 120 | - All contributors on GitHub 121 | 122 | ## Modpacks 123 | 124 | Feel free to use this in any modpack. 125 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'dev.architectury.loom' version '1.9-SNAPSHOT' apply false 3 | id 'architectury-plugin' version '3.4-SNAPSHOT' 4 | id 'com.github.johnrengelman.shadow' version '8.1.1' apply false 5 | } 6 | 7 | architectury { 8 | minecraft = project.minecraft_version 9 | } 10 | 11 | allprojects { 12 | group = rootProject.maven_group 13 | version = rootProject.mod_version 14 | } 15 | 16 | subprojects { 17 | apply plugin: 'dev.architectury.loom' 18 | apply plugin: 'architectury-plugin' 19 | apply plugin: 'maven-publish' 20 | 21 | base { 22 | // Set up a suffixed format for the mod jar names, e.g. `example-fabric`. 23 | archivesName = "$rootProject.archives_name-$project.name" 24 | } 25 | 26 | repositories { 27 | // Add repositories to retrieve artifacts from in here. 28 | // You should only use this when depending on other mods because 29 | // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. 30 | // See https://docs.gradle.org/current/userguide/declaring_repositories.html 31 | // for more information about repositories. 32 | 33 | exclusiveContent { 34 | forRepository { 35 | maven { 36 | name = "Modrinth" 37 | url = "https://api.modrinth.com/maven" 38 | } 39 | } 40 | filter { 41 | includeGroup "maven.modrinth" 42 | } 43 | } 44 | 45 | maven { 46 | name = "Fuzs Mod Resources" 47 | url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" 48 | } 49 | } 50 | 51 | loom { 52 | silentMojangMappingsLicense() 53 | } 54 | 55 | dependencies { 56 | minecraft "net.minecraft:minecraft:$rootProject.minecraft_version" 57 | mappings loom.officialMojangMappings() 58 | } 59 | 60 | java { 61 | // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task 62 | // if it is present. 63 | // If you remove this line, sources will not be generated. 64 | withSourcesJar() 65 | 66 | sourceCompatibility = JavaVersion.VERSION_21 67 | targetCompatibility = JavaVersion.VERSION_21 68 | } 69 | 70 | tasks.withType(JavaCompile).configureEach { 71 | it.options.release = 21 72 | } 73 | 74 | // Configure Maven publishing. 75 | publishing { 76 | publications { 77 | mavenJava(MavenPublication) { 78 | artifactId = base.archivesName.get() 79 | from components.java 80 | } 81 | } 82 | 83 | // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. 84 | repositories { 85 | // Add repositories to publish to here. 86 | // Notice: This block does NOT have the same function as the block in the top level. 87 | // The repositories here will be used for publishing your artifact, not for 88 | // retrieving dependencies. 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /common/build.gradle: -------------------------------------------------------------------------------- 1 | loom { 2 | accessWidenerPath = file("src/main/resources/elevatormod.accesswidener") 3 | } 4 | 5 | architectury { 6 | common rootProject.enabled_platforms.split(',') 7 | } 8 | 9 | dependencies { 10 | // We depend on Fabric Loader here to use the Fabric @Environment annotations, 11 | // which get remapped to the correct annotations on each platform. 12 | // Do NOT use other classes from Fabric Loader. 13 | modImplementation "net.fabricmc:fabric-loader:$rootProject.fabric_loader_version" 14 | 15 | modApi "fuzs.forgeconfigapiport:forgeconfigapiport-common-neoforgeapi:$rootProject.forge_config_api_port_version" 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/Config.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia; 2 | 3 | import net.neoforged.neoforge.common.ModConfigSpec; 4 | 5 | 6 | public class Config { 7 | private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); 8 | public static final CommonGeneral GENERAL = new CommonGeneral(BUILDER); 9 | public static final ModConfigSpec SPEC = BUILDER.build(); 10 | 11 | public static class CommonGeneral { 12 | public final ModConfigSpec.BooleanValue sameColor; 13 | public final ModConfigSpec.IntValue range; 14 | public final ModConfigSpec.IntValue activationRange; 15 | public final ModConfigSpec.BooleanValue precisionTarget; 16 | public final ModConfigSpec.BooleanValue mobSpawn; 17 | public final ModConfigSpec.BooleanValue resetPitchNormal; 18 | public final ModConfigSpec.BooleanValue resetPitchDirectional; 19 | public final ModConfigSpec.BooleanValue useXP; 20 | public final ModConfigSpec.IntValue XPPointsAmount; 21 | 22 | CommonGeneral(ModConfigSpec.Builder builder) { 23 | builder.push("General"); 24 | 25 | sameColor = builder 26 | .comment("Should elevators have the same color in order to teleport ?") 27 | .define("sameColor", false); 28 | 29 | range = builder 30 | .comment("Elevator range") 31 | .defineInRange("range", 384, 3, 4064); 32 | 33 | activationRange = builder 34 | .comment("Elevator activation range, increasing it can help with jump boost effects") 35 | .defineInRange("activationRange", 6, 1, 64); 36 | 37 | precisionTarget = builder 38 | .comment("Realign players to the center of elevator ?") 39 | .define("precisionTarget", true); 40 | 41 | mobSpawn = builder 42 | .worldRestart() 43 | .comment("Can mobs spawn on elevators ?") 44 | .define("mobSpawn", false); 45 | 46 | resetPitchNormal = builder 47 | .comment("Reset pitch to 0 when teleporting to normal elevators ?") 48 | .define("resetPitchNormal", false); 49 | 50 | resetPitchDirectional = builder 51 | .comment("Reset pitch to 0 when teleporting to directional elevators ?") 52 | .define("resetPitchDirectional", true); 53 | 54 | useXP = builder 55 | .comment("Should teleporting require XP ?") 56 | .define("useXP", false); 57 | 58 | XPPointsAmount = builder 59 | .comment("Amount of XP points to use when useXP is enabled", "Note this is NOT experience levels") 60 | .defineInRange("XPPointsAmount", 1, 1, Integer.MAX_VALUE); 61 | 62 | builder.pop(); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/ElevatorBlockBase.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia; 2 | 3 | import com.vsngarcia.level.ElevatorBlockEntityBase; 4 | import com.vsngarcia.util.FakeUseContext; 5 | import net.minecraft.core.BlockPos; 6 | import net.minecraft.core.Direction; 7 | import net.minecraft.core.Registry; 8 | import net.minecraft.core.registries.Registries; 9 | import net.minecraft.resources.ResourceKey; 10 | import net.minecraft.resources.ResourceLocation; 11 | import net.minecraft.util.RandomSource; 12 | import net.minecraft.world.InteractionHand; 13 | import net.minecraft.world.InteractionResult; 14 | import net.minecraft.world.entity.EntityType; 15 | import net.minecraft.world.entity.player.Player; 16 | import net.minecraft.world.item.DyeColor; 17 | import net.minecraft.world.item.ItemStack; 18 | import net.minecraft.world.item.context.BlockPlaceContext; 19 | import net.minecraft.world.level.BlockGetter; 20 | import net.minecraft.world.level.Level; 21 | import net.minecraft.world.level.LevelReader; 22 | import net.minecraft.world.level.ScheduledTickAccess; 23 | import net.minecraft.world.level.block.Block; 24 | import net.minecraft.world.level.block.EntityBlock; 25 | import net.minecraft.world.level.block.HorizontalDirectionalBlock; 26 | import net.minecraft.world.level.block.SoundType; 27 | import net.minecraft.world.level.block.entity.BlockEntityType; 28 | import net.minecraft.world.level.block.state.BlockState; 29 | import net.minecraft.world.level.block.state.StateDefinition; 30 | import net.minecraft.world.level.block.state.properties.BooleanProperty; 31 | import net.minecraft.world.phys.BlockHitResult; 32 | import net.minecraft.world.phys.shapes.CollisionContext; 33 | import net.minecraft.world.phys.shapes.VoxelShape; 34 | 35 | import java.util.Optional; 36 | import java.util.function.Supplier; 37 | 38 | 39 | public abstract class ElevatorBlockBase extends HorizontalDirectionalBlock implements EntityBlock { 40 | public static final BooleanProperty DIRECTIONAL = BooleanProperty.create("directional"); 41 | public static final BooleanProperty SHOW_ARROW = BooleanProperty.create("show_arrow"); 42 | 43 | 44 | private final DyeColor dyeColor; 45 | private final Supplier> tileEntityType; 46 | 47 | 48 | public ElevatorBlockBase( 49 | DyeColor color, 50 | Supplier> type, 51 | Properties props 52 | ) { 53 | super(props.mapColor(color) 54 | .sound(SoundType.WOOL) 55 | .strength(0.8F) 56 | .dynamicShape() 57 | .noOcclusion() 58 | .isValidSpawn(isValidSpawn(type)) 59 | .setId(getResourceKey(Registries.BLOCK, color))); 60 | 61 | registerDefaultState( 62 | defaultBlockState() 63 | .setValue(FACING, Direction.NORTH) 64 | .setValue(DIRECTIONAL, false) 65 | .setValue(SHOW_ARROW, true) 66 | ); 67 | 68 | dyeColor = color; 69 | tileEntityType = type; 70 | } 71 | 72 | public ElevatorBlockBase(DyeColor color, Supplier> type) { 73 | this(color, type, Properties.of()); 74 | } 75 | 76 | public static ResourceKey getResourceKey(ResourceKey> type, DyeColor color) { 77 | return ResourceKey.create( 78 | type, 79 | getResourceLocation(color) 80 | ); 81 | } 82 | 83 | public static ResourceLocation getResourceLocation(DyeColor color) { 84 | return ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "elevator_" + color.getName()); 85 | } 86 | 87 | @Override 88 | protected void createBlockStateDefinition(StateDefinition.Builder builder) { 89 | builder.add(FACING, DIRECTIONAL, SHOW_ARROW); 90 | } 91 | 92 | @Override 93 | public boolean canBeReplaced(BlockState state, BlockPlaceContext useContext) { 94 | return false; 95 | } 96 | 97 | 98 | protected abstract void openMenu(Player player, ElevatorBlockEntityBase tile, BlockPos pos); 99 | 100 | @Override 101 | public InteractionResult useItemOn( 102 | ItemStack itemStack, 103 | BlockState state, 104 | Level worldIn, 105 | BlockPos pos, 106 | Player player, 107 | InteractionHand handIn, 108 | BlockHitResult hit 109 | ) { 110 | if (worldIn.isClientSide) { 111 | return InteractionResult.SUCCESS; 112 | } 113 | 114 | return getElevatorTile(worldIn, pos).map(tile -> { 115 | Block handBlock = Block.byItem(player.getItemInHand(handIn).getItem()); 116 | BlockState stateToApply = handBlock.getStateForPlacement(new FakeUseContext(player, handIn, hit)); 117 | if (stateToApply != null && tile.setCamoAndUpdate(stateToApply)) 118 | return InteractionResult.SUCCESS_SERVER; // If we successfully set camo, don't open the menu 119 | 120 | // Remove camo 121 | if (player.isCrouching() && tile.getHeldState() != null) { 122 | tile.setCamoAndUpdate(null); 123 | return InteractionResult.SUCCESS_SERVER; 124 | } 125 | 126 | openMenu(player, tile, pos); 127 | return InteractionResult.SUCCESS_SERVER; 128 | }).orElse(InteractionResult.PASS); 129 | } 130 | 131 | public static StateArgumentPredicate> isValidSpawn(Supplier> tileType) { 132 | return (BlockState state, BlockGetter world, BlockPos pos, EntityType entityType) -> 133 | Config.GENERAL.mobSpawn.get() && 134 | world.getBlockEntity(pos, tileType.get()).map(ElevatorBlockEntityBase::getHeldState) 135 | .map(s -> s.isValidSpawn(world, pos, entityType)) 136 | .orElse(state.isFaceSturdy(world, pos, Direction.UP)); 137 | } 138 | 139 | // Collision 140 | 141 | @Override 142 | public VoxelShape getCollisionShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { 143 | return getHeldState(worldIn, pos) 144 | .map(s -> s.getCollisionShape(worldIn, pos, context)) 145 | .orElse(super.getCollisionShape(state, worldIn, pos, context)); 146 | } 147 | 148 | @Override 149 | public boolean isCollisionShapeFullBlock(BlockState state, BlockGetter world, BlockPos pos) { 150 | return getHeldState(world, pos) 151 | .map(s -> s.isCollisionShapeFullBlock(world, pos)) 152 | .orElse(super.isCollisionShapeFullBlock(state, world, pos)); 153 | } 154 | 155 | // Visual outline 156 | @Override 157 | public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { 158 | return getHeldState(worldIn, pos) 159 | .map(s -> s.getShape(worldIn, pos, context)) 160 | .orElse(super.getShape(state, worldIn, pos, context)); 161 | } 162 | 163 | // TODO soulsand and honey use this 164 | @Override 165 | public float getSpeedFactor() { 166 | return super.getSpeedFactor(); 167 | } 168 | 169 | // TODO honey uses this 170 | @Override 171 | public float getJumpFactor() { 172 | return super.getJumpFactor(); 173 | } 174 | 175 | 176 | @Override 177 | protected BlockState updateShape( 178 | BlockState blockState, 179 | LevelReader levelReader, 180 | ScheduledTickAccess scheduledTickAccess, 181 | BlockPos currentPos, 182 | Direction direction, 183 | BlockPos facingPos, 184 | BlockState facingState, 185 | RandomSource randomSource 186 | ) { 187 | getElevatorTile(levelReader, currentPos) 188 | .ifPresent(t -> { 189 | if (t.getHeldState() == null) { 190 | return; 191 | } 192 | 193 | BlockState appearance = getAppearance( 194 | facingState, 195 | levelReader, 196 | facingPos, 197 | direction, 198 | t.getHeldState(), 199 | currentPos 200 | ); 201 | BlockState updatedState = t.getHeldState().updateShape( 202 | levelReader, 203 | scheduledTickAccess, 204 | currentPos, 205 | direction, 206 | facingPos, 207 | appearance, 208 | randomSource 209 | ); 210 | if (!updatedState.equals(t.getHeldState())) { 211 | t.setHeldState(updatedState); 212 | } 213 | }); 214 | 215 | return super.updateShape( 216 | blockState, 217 | levelReader, 218 | scheduledTickAccess, 219 | currentPos, 220 | direction, 221 | facingPos, 222 | facingState, 223 | randomSource 224 | ); 225 | } 226 | 227 | protected abstract BlockState getAppearance( 228 | BlockState facingState, 229 | LevelReader worldIn, 230 | BlockPos facingPos, 231 | Direction opposite, 232 | BlockState heldState, 233 | BlockPos currentPos 234 | ); 235 | 236 | // Redstone 237 | @Override 238 | public boolean isSignalSource(BlockState state) { 239 | return true; 240 | } 241 | 242 | @Override 243 | public int getSignal(BlockState state, BlockGetter reader, BlockPos pos, Direction direction) { 244 | return getHeldState(reader, pos) 245 | .map(s -> s.getSignal(reader, pos, direction)) 246 | .orElse(super.getSignal(state, reader, pos, direction)); 247 | } 248 | 249 | @Override 250 | public int getDirectSignal(BlockState state, BlockGetter reader, BlockPos pos, Direction direction) { 251 | return getHeldState(reader, pos) 252 | .map(s -> s.getDirectSignal(reader, pos, direction)) 253 | .orElse(super.getDirectSignal(state, reader, pos, direction)); 254 | } 255 | 256 | // Light 257 | 258 | @Override 259 | public boolean useShapeForLightOcclusion(BlockState state) { 260 | return true; 261 | } 262 | 263 | @Override 264 | protected boolean propagatesSkylightDown(BlockState blockState) { 265 | return true; 266 | } 267 | 268 | @Override 269 | protected int getLightBlock(BlockState blockState) { 270 | // TODO: Not dynamic 271 | return super.getLightBlock(blockState); 272 | } 273 | 274 | // @Override 275 | // public int getLightBlock(BlockState state, BlockGetter worldIn, BlockPos pos) { 276 | // return getHeldState(worldIn, pos) 277 | // .map(s -> s.getLightBlock(worldIn, pos)) 278 | // .orElse(worldIn.getMaxLightLevel()); 279 | // } 280 | 281 | @Override 282 | protected float getShadeBrightness(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos) { 283 | return getHeldState(blockGetter, blockPos) 284 | .map(s -> s.getShadeBrightness(blockGetter, blockPos)) 285 | .orElse(super.getShadeBrightness(blockState, blockGetter, blockPos)); 286 | } 287 | 288 | @Override 289 | protected VoxelShape getOcclusionShape(BlockState blockState) { 290 | // TODO: Not dynamic 291 | return super.getOcclusionShape(blockState); 292 | } 293 | 294 | // @Override 295 | // public VoxelShape getOcclusionShape(BlockState state, BlockGetter world, BlockPos pos) { 296 | // return getHeldState(world, pos) 297 | // .map(s -> s.getOcclusionShape(world, pos)) 298 | // .orElse(super.getOcclusionShape(state, world, pos)); 299 | // } 300 | 301 | public DyeColor getColor() { 302 | return dyeColor; 303 | } 304 | 305 | private Optional getElevatorTile(BlockGetter world, BlockPos pos) { 306 | if (world == null || pos == null) { 307 | return Optional.empty(); 308 | } 309 | 310 | return world.getBlockEntity(pos, tileEntityType.get()); 311 | } 312 | 313 | protected Optional getHeldState(BlockGetter world, BlockPos pos) { 314 | return getElevatorTile(world, pos).map(ElevatorBlockEntityBase::getHeldState); 315 | } 316 | } 317 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/ElevatorHandler.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia; 2 | 3 | import com.vsngarcia.network.ClientPacketSender; 4 | import com.vsngarcia.network.TeleportPacket; 5 | import net.minecraft.client.Minecraft; 6 | import net.minecraft.client.player.LocalPlayer; 7 | import net.minecraft.core.BlockPos; 8 | import net.minecraft.core.Direction; 9 | import net.minecraft.world.level.Level; 10 | 11 | 12 | public class ElevatorHandler { 13 | 14 | private static boolean lastSneaking; 15 | private static boolean lastJumping; 16 | 17 | public static void handleInput(ClientPacketSender sender) { 18 | LocalPlayer player = Minecraft.getInstance().player; 19 | if (player == null || player.isSpectator() || !player.isAlive() || player.input == null) 20 | return; 21 | 22 | boolean sneaking = player.input.keyPresses.shift(); 23 | if (lastSneaking != sneaking) { 24 | lastSneaking = sneaking; 25 | if (sneaking) { 26 | tryTeleport(player, Direction.DOWN, sender); 27 | } 28 | } 29 | 30 | boolean jumping = player.input.keyPresses.jump(); 31 | if (lastJumping != jumping) { 32 | lastJumping = jumping; 33 | if (jumping) { 34 | tryTeleport(player, Direction.UP, sender); 35 | } 36 | } 37 | } 38 | 39 | private static void tryTeleport(LocalPlayer player, Direction facing, ClientPacketSender sender) { 40 | Level world = player.level(); 41 | 42 | BlockPos fromPos = getOriginElevator(player); 43 | if (fromPos == null) { 44 | return; 45 | } 46 | 47 | BlockPos.MutableBlockPos toPos = fromPos.mutable(); 48 | 49 | var fromElevator = TeleportPacket.getElevator(world.getBlockState(fromPos)); 50 | if (fromElevator == null) { 51 | return; 52 | } 53 | 54 | while (true) { 55 | toPos.setY(toPos.getY() + facing.getStepY()); 56 | if (world.isOutsideBuildHeight(toPos) || 57 | Math.abs(toPos.getY() - fromPos.getY()) > Config.GENERAL.range.get()) { 58 | break; 59 | } 60 | 61 | var toElevator = TeleportPacket.getElevator(world.getBlockState(toPos)); 62 | if (toElevator != null && TeleportPacket.isValidPos(world, toPos)) { 63 | if (!Config.GENERAL.sameColor.get() || fromElevator.getColor() == toElevator.getColor()) { 64 | sender.sendToServer(new TeleportPacket(fromPos, toPos)); 65 | break; 66 | } 67 | } 68 | } 69 | } 70 | 71 | /** 72 | * Checks if a player(lower part) is in or has an elevator up to 2 blocks below 73 | * 74 | * @param player the player trying to teleport 75 | * @return the position of the first valid elevator or null if it doesn't exist 76 | */ 77 | private static BlockPos getOriginElevator(LocalPlayer player) { 78 | BlockPos pos = player.blockPosition(); 79 | 80 | for (int i = 0; i < Config.GENERAL.activationRange.getAsInt(); i++) { 81 | if (TeleportPacket.getElevator(player.level().getBlockState(pos)) != null) { 82 | if (!TeleportPacket.isValidPos(player.level(), pos)) { 83 | return null; 84 | } 85 | return pos; 86 | } 87 | pos = pos.below(); 88 | } 89 | 90 | // Elevator doesn't exist or it's invalid 91 | return null; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/ElevatorMod.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | 6 | public final class ElevatorMod { 7 | public static final String ID = "elevatorid"; 8 | public static final Logger LOGGER = LogManager.getLogger(ID); 9 | 10 | public static void init() { 11 | // Write common init code here. 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/client/ColorCamoElevator.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.client; 2 | 3 | import com.vsngarcia.ElevatorBlockBase; 4 | import com.vsngarcia.level.ElevatorBlockEntityBase; 5 | import net.minecraft.client.Minecraft; 6 | import net.minecraft.client.color.block.BlockColor; 7 | import net.minecraft.core.BlockPos; 8 | import net.minecraft.world.level.BlockAndTintGetter; 9 | import net.minecraft.world.level.block.state.BlockState; 10 | 11 | public class ColorCamoElevator implements BlockColor { 12 | 13 | @Override 14 | public int getColor(BlockState state, BlockAndTintGetter lightReader, BlockPos pos, int tintIndex) { 15 | if (lightReader == null || pos == null) { 16 | return -1; 17 | } 18 | 19 | if (state.getBlock() instanceof ElevatorBlockBase && 20 | lightReader.getBlockEntity(pos) instanceof ElevatorBlockEntityBase tile) { 21 | if (tile.getHeldState() != null) { 22 | return Minecraft.getInstance().getBlockColors().getColor( 23 | tile.getHeldState(), 24 | lightReader, 25 | pos, 26 | tintIndex 27 | ); 28 | } 29 | } 30 | return -1; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/client/gui/ElevatorScreen.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.client.gui; 2 | 3 | import com.vsngarcia.ElevatorBlockBase; 4 | import com.vsngarcia.ElevatorMod; 5 | import com.vsngarcia.level.ElevatorBlockEntityBase; 6 | import com.vsngarcia.level.ElevatorContainer; 7 | import com.vsngarcia.network.ClientPacketSender; 8 | import com.vsngarcia.network.client.RemoveCamoPacket; 9 | import com.vsngarcia.network.client.SetArrowPacket; 10 | import com.vsngarcia.network.client.SetDirectionalPacket; 11 | import net.minecraft.client.gui.GuiGraphics; 12 | import net.minecraft.client.gui.components.Button; 13 | import net.minecraft.client.gui.components.Checkbox; 14 | import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; 15 | import net.minecraft.client.renderer.RenderType; 16 | import net.minecraft.core.Direction; 17 | import net.minecraft.network.chat.Component; 18 | import net.minecraft.resources.ResourceLocation; 19 | import net.minecraft.world.entity.player.Inventory; 20 | 21 | 22 | public class ElevatorScreen extends AbstractContainerScreen { 23 | 24 | private final ResourceLocation GUI_TEXTURE = ResourceLocation.fromNamespaceAndPath( 25 | ElevatorMod.ID, 26 | "textures/gui/elevator_gui.png" 27 | ); 28 | private final ElevatorBlockEntityBase tile; 29 | private final Direction playerFacing; 30 | private final ClientPacketSender packetSender; 31 | 32 | private Checkbox dirButton; 33 | private Checkbox hideArrowButton; 34 | private Button resetCamoButton; 35 | private FacingControllerWrapper facingController; 36 | 37 | public ElevatorScreen(ElevatorContainer container, Inventory inv, Component titleIn, ClientPacketSender pktSender) { 38 | super(container, inv, titleIn); 39 | imageWidth = 200; 40 | imageHeight = 100; 41 | 42 | tile = container.getTile(); 43 | playerFacing = container.getPlayerFacing(); 44 | 45 | packetSender = pktSender; 46 | } 47 | 48 | @Override 49 | public void init() { 50 | super.init(); 51 | 52 | // Toggle directional button 53 | dirButton = Checkbox.builder(Component.translatable("screen.elevatorid.elevator.directional"), font) 54 | .pos(leftPos + 8, topPos + 25) 55 | .selected(tile.getBlockState().getValue(ElevatorBlockBase.DIRECTIONAL)) 56 | .onValueChange((checkbox, selected) -> packetSender.sendToServer(new SetDirectionalPacket( 57 | selected, 58 | tile.getBlockPos() 59 | ))) 60 | .build(); 61 | addRenderableWidget(dirButton); 62 | 63 | // Toggle arrow button 64 | hideArrowButton = Checkbox.builder(Component.translatable("screen.elevatorid.elevator.hide_arrow"), font) 65 | .pos(leftPos + 8, topPos + 50) 66 | .selected(!tile.getBlockState().getValue(ElevatorBlockBase.SHOW_ARROW)) 67 | .onValueChange((checkbox, selected) -> packetSender.sendToServer(new SetArrowPacket( 68 | !selected, 69 | tile.getBlockPos() 70 | ))) 71 | .build(); 72 | hideArrowButton.visible = tile.getBlockState().getValue(ElevatorBlockBase.DIRECTIONAL); 73 | addRenderableWidget(hideArrowButton); 74 | 75 | // Directional controller 76 | facingController = new FacingControllerWrapper( 77 | leftPos + 120, 78 | topPos + 20, 79 | tile.getBlockPos(), 80 | playerFacing, 81 | packetSender 82 | ); 83 | facingController.getButtons().forEach(this::addRenderableWidget); 84 | facingController.getButtons().forEach(button -> { 85 | button.visible = tile.getBlockState().getValue(ElevatorBlockBase.DIRECTIONAL); 86 | button.active = tile.getBlockState().getValue(ElevatorBlockBase.FACING) != button.direction; 87 | }); 88 | 89 | // Reset camouflage button 90 | resetCamoButton = Button.builder( 91 | Component.translatable("screen.elevatorid.elevator.reset_camo"), 92 | but -> packetSender.sendToServer(new RemoveCamoPacket(tile.getBlockPos())) 93 | ) 94 | .pos(leftPos + 8, topPos + 75) 95 | .size(110, 20) 96 | .build(); 97 | addRenderableWidget(resetCamoButton); 98 | resetCamoButton.active = tile.getHeldState() != null; 99 | } 100 | 101 | @Override 102 | public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) { 103 | super.render(guiGraphics, mouseX, mouseY, partialTicks); 104 | } 105 | 106 | @Override 107 | public void containerTick() { 108 | super.containerTick(); 109 | 110 | dirButton.selected = tile.getBlockState().getValue(ElevatorBlockBase.DIRECTIONAL); 111 | 112 | facingController.getButtons().forEach(button -> { 113 | button.visible = tile.getBlockState().getValue(ElevatorBlockBase.DIRECTIONAL); 114 | button.active = tile.getBlockState().getValue(ElevatorBlockBase.FACING) != button.direction; 115 | }); 116 | 117 | hideArrowButton.visible = tile.getBlockState().getValue(ElevatorBlockBase.DIRECTIONAL); 118 | hideArrowButton.selected = !tile.getBlockState().getValue(ElevatorBlockBase.SHOW_ARROW); 119 | 120 | resetCamoButton.active = tile.getHeldState() != null; 121 | } 122 | 123 | @Override 124 | protected void renderBg(GuiGraphics guiGraphics, float v, int mouseX, int mouseY) { 125 | guiGraphics.blit( 126 | RenderType::guiTextured, 127 | GUI_TEXTURE, 128 | (this.width - this.imageWidth) / 2, 129 | (this.height - this.imageHeight) / 2, 130 | 0, 131 | 0, 132 | this.imageWidth, 133 | this.imageHeight, 134 | 256, 135 | 256 136 | ); 137 | } 138 | 139 | @Override 140 | protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { 141 | guiGraphics.drawString(font, title, 8, 8, 14737632); 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/client/gui/FacingButton.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.client.gui; 2 | 3 | import com.vsngarcia.network.ClientPacketSender; 4 | import com.vsngarcia.network.client.SetFacingPacket; 5 | import net.minecraft.client.Minecraft; 6 | import net.minecraft.client.gui.GuiGraphics; 7 | import net.minecraft.client.gui.components.Button; 8 | import net.minecraft.core.BlockPos; 9 | import net.minecraft.core.Direction; 10 | import net.minecraft.network.chat.Component; 11 | 12 | import java.awt.*; 13 | 14 | 15 | class FacingButton extends Button { 16 | 17 | final Direction direction; 18 | 19 | FacingButton(Point slot, Direction direction, BlockPos pos, ClientPacketSender packetSender) { 20 | super( 21 | slot.x, 22 | slot.y, 23 | 20, 24 | 20, 25 | Component.translatable("screen.elevatorid.elevator.directional_" + direction.getName()), 26 | but -> { 27 | packetSender.sendToServer(new SetFacingPacket(direction, pos)); 28 | but.setFocused(false); 29 | }, 30 | DEFAULT_NARRATION 31 | ); 32 | 33 | this.direction = direction; 34 | } 35 | 36 | @Override 37 | public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partial) { 38 | //RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); 39 | if (isHoveredOrFocused() && active) { 40 | guiGraphics.fill(getX(), getY(), getX() + width, getY() + height, -2130706433); 41 | } 42 | 43 | guiGraphics.drawCenteredString( 44 | Minecraft.getInstance().font, 45 | getMessage().getString(), 46 | getX() + this.width / 2, 47 | getY() + (this.height - 8) / 2, 48 | active ? 16777215 : 65280 49 | ); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/client/gui/FacingControllerWrapper.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.client.gui; 2 | 3 | import com.vsngarcia.network.ClientPacketSender; 4 | import net.minecraft.core.BlockPos; 5 | import net.minecraft.core.Direction; 6 | 7 | import java.awt.*; 8 | import java.util.ArrayList; 9 | import java.util.Collections; 10 | import java.util.HashSet; 11 | 12 | class FacingControllerWrapper { 13 | 14 | private final HashSet bakedButtons = new HashSet<>(); 15 | private final ArrayList slots = new ArrayList<>(); 16 | 17 | FacingControllerWrapper( 18 | int xIn, 19 | int yIn, 20 | BlockPos blockPos, 21 | Direction playerFacing, 22 | ClientPacketSender packetSender 23 | ) { 24 | initSlots(xIn, yIn); 25 | initButtons(playerFacing, blockPos, packetSender); 26 | } 27 | 28 | private void initSlots(int xIn, int yIn) { 29 | slots.add(new Point(xIn + 20, yIn)); // UP 30 | slots.add(new Point(xIn + 40, yIn + 20)); // RIGHT 31 | slots.add(new Point(xIn + 20, yIn + 40)); // BOTTOM 32 | slots.add(new Point(xIn, yIn + 20)); //LEFT 33 | } 34 | 35 | private void initButtons(Direction playerFacing, BlockPos pos, ClientPacketSender packetSender) { 36 | Collections.rotate(slots, playerFacing.get2DDataValue()); // Modifies list 37 | bakedButtons.add(new FacingButton(slots.get(0), Direction.SOUTH, pos, packetSender)); 38 | bakedButtons.add(new FacingButton(slots.get(1), Direction.WEST, pos, packetSender)); 39 | bakedButtons.add(new FacingButton(slots.get(2), Direction.NORTH, pos, packetSender)); 40 | bakedButtons.add(new FacingButton(slots.get(3), Direction.EAST, pos, packetSender)); 41 | } 42 | 43 | HashSet getButtons() { 44 | return bakedButtons; 45 | } 46 | } 47 | 48 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/level/ElevatorBlockEntityBase.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.level; 2 | 3 | import com.vsngarcia.ElevatorBlockBase; 4 | import net.minecraft.core.BlockPos; 5 | import net.minecraft.core.Direction; 6 | import net.minecraft.core.HolderLookup; 7 | import net.minecraft.core.registries.BuiltInRegistries; 8 | import net.minecraft.core.registries.Registries; 9 | import net.minecraft.nbt.CompoundTag; 10 | import net.minecraft.nbt.NbtUtils; 11 | import net.minecraft.nbt.Tag; 12 | import net.minecraft.network.chat.Component; 13 | import net.minecraft.network.protocol.Packet; 14 | import net.minecraft.network.protocol.game.ClientGamePacketListener; 15 | import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; 16 | import net.minecraft.sounds.SoundEvent; 17 | import net.minecraft.sounds.SoundSource; 18 | import net.minecraft.world.MenuProvider; 19 | import net.minecraft.world.level.block.Block; 20 | import net.minecraft.world.level.block.Blocks; 21 | import net.minecraft.world.level.block.RenderShape; 22 | import net.minecraft.world.level.block.entity.BlockEntity; 23 | import net.minecraft.world.level.block.entity.BlockEntityType; 24 | import net.minecraft.world.level.block.state.BlockState; 25 | 26 | 27 | public abstract class ElevatorBlockEntityBase extends BlockEntity implements MenuProvider { 28 | 29 | protected BlockState heldState; 30 | 31 | public ElevatorBlockEntityBase(BlockEntityType type, BlockPos pos, BlockState state) { 32 | super(type, pos, state); 33 | } 34 | 35 | @Override 36 | public void loadAdditional(CompoundTag tag, HolderLookup.Provider holder) { 37 | super.loadAdditional(tag, holder); 38 | if (tag.contains("held_id", Tag.TAG_COMPOUND)) { 39 | // Get blockstate from compound, always check if it's valid 40 | BlockState state = NbtUtils.readBlockState( 41 | this.level != null ? this.level.holderLookup(Registries.BLOCK) : BuiltInRegistries.BLOCK, 42 | tag.getCompound("held_id") 43 | ); 44 | heldState = isValidState(state) ? state : null; 45 | } else { 46 | heldState = null; 47 | } 48 | 49 | if (level != null && level.isClientSide()) { 50 | level.sendBlockUpdated(getBlockPos(), null, null, 0); 51 | level.getLightEngine().checkBlock(getBlockPos()); 52 | } 53 | } 54 | 55 | @Override 56 | protected void saveAdditional(CompoundTag tag, HolderLookup.Provider holder) { 57 | super.saveAdditional(tag, holder); 58 | 59 | if (heldState != null) { 60 | tag.put("held_id", NbtUtils.writeBlockState(heldState)); 61 | } else { 62 | tag.putBoolean("held_id", false); 63 | } 64 | } 65 | 66 | @Override 67 | public CompoundTag getUpdateTag(HolderLookup.Provider holder) { 68 | return saveCustomOnly(holder); 69 | } 70 | 71 | @Override 72 | public Packet getUpdatePacket() { 73 | return ClientboundBlockEntityDataPacket.create(this); 74 | } 75 | 76 | @Override 77 | public Component getDisplayName() { 78 | return Component.translatable("screen.elevatorid.elevator"); 79 | } 80 | 81 | 82 | public void setHeldState(BlockState state) { 83 | this.heldState = state; 84 | setChanged(); 85 | } 86 | 87 | @Override 88 | public void setChanged() { 89 | super.setChanged(); 90 | 91 | if (level != null && !level.isClientSide()) { 92 | level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); 93 | level.getLightEngine().checkBlock(getBlockPos()); 94 | level.updateNeighborsAt(getBlockPos(), getBlockState().getBlock()); 95 | 96 | // Hack to update our own shape. For example, connect to other elevator camouflaged as a fence 97 | // Vanilla blocks' getStateForPlacement should be patched to use getAppearance, making this unnecessary 98 | // Also doesn't fix vanilla blocks not connecting to us, their updateShape should also be patched 99 | getBlockState().updateNeighbourShapes(level, getBlockPos(), 0); 100 | if (heldState != null) { 101 | for (Direction direction : Direction.values()) { 102 | getBlockState().updateShape( 103 | level, 104 | level, 105 | getBlockPos(), 106 | direction, 107 | getBlockPos().relative(direction), 108 | level.getBlockState(getBlockPos().relative(direction)), 109 | level.random 110 | ); 111 | } 112 | } 113 | } 114 | } 115 | 116 | public BlockState getHeldState() { 117 | return heldState; 118 | } 119 | 120 | public boolean setCamoAndUpdate(BlockState newState) { 121 | if (heldState == newState) return false; 122 | 123 | if (!isValidState(newState)) return false; 124 | 125 | setHeldState(newState); 126 | if (getLevel() != null) { 127 | getLevel().playSound(null, getBlockPos(), camouflageSound(), SoundSource.BLOCKS, 1F, 1F); 128 | } 129 | 130 | return true; 131 | } 132 | 133 | protected abstract SoundEvent camouflageSound(); 134 | 135 | public boolean isValidState(BlockState state) { 136 | if (state == null) return true; 137 | 138 | if (state.getBlock() == Blocks.AIR) return false; 139 | 140 | // Tile entities can cause problems 141 | // if (state.hasBlockEntity()) return false; 142 | 143 | // Don't try to camouflage with itself 144 | if (state.getBlock() instanceof ElevatorBlockBase) { 145 | return false; 146 | } 147 | 148 | // Only normally rendered blocks (not chests, ...) 149 | if (state.getRenderShape() != RenderShape.MODEL) { 150 | return false; 151 | } 152 | 153 | // Only blocks with a collision box 154 | return !state.getCollisionShape(level, worldPosition).isEmpty(); 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/level/ElevatorContainer.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.level; 2 | 3 | import net.minecraft.core.BlockPos; 4 | import net.minecraft.core.Direction; 5 | import net.minecraft.world.entity.player.Player; 6 | import net.minecraft.world.inventory.AbstractContainerMenu; 7 | import net.minecraft.world.inventory.ContainerLevelAccess; 8 | import net.minecraft.world.inventory.MenuType; 9 | import net.minecraft.world.item.ItemStack; 10 | import net.minecraft.world.level.block.entity.BlockEntity; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | 14 | public class ElevatorContainer extends AbstractContainerMenu { 15 | 16 | private final Direction playerFacing; 17 | private ElevatorBlockEntityBase elevatorTile; 18 | private final BlockPos pos; 19 | 20 | public ElevatorContainer(MenuType menuType, int id, BlockPos pos, Player player) { 21 | super(menuType, id); 22 | 23 | // TODO: 08/06/2023 Check if this is the correct way to get the level 24 | BlockEntity tile = player.level().getBlockEntity(pos); 25 | if (tile instanceof ElevatorBlockEntityBase) 26 | elevatorTile = (ElevatorBlockEntityBase) tile; 27 | 28 | playerFacing = player.getDirection(); 29 | this.pos = pos; 30 | } 31 | 32 | @Override 33 | @NotNull 34 | public ItemStack quickMoveStack(@NotNull Player player, int id) { 35 | return ItemStack.EMPTY; // TODO: Handle this properly if in the future we start using items 36 | } 37 | 38 | @Override 39 | public boolean stillValid(Player playerIn) { 40 | return stillValid( 41 | ContainerLevelAccess.create(playerIn.level(), elevatorTile.getBlockPos()), 42 | playerIn, 43 | elevatorTile.getBlockState().getBlock() 44 | ); 45 | } 46 | 47 | public BlockPos getPos() { 48 | return pos; 49 | } 50 | 51 | public ElevatorBlockEntityBase getTile() { 52 | return elevatorTile; 53 | } 54 | 55 | public Direction getPlayerFacing() { 56 | return playerFacing; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/network/ClientPacketSender.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.network; 2 | 3 | import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 4 | 5 | public interface ClientPacketSender { 6 | void sendToServer(CustomPacketPayload packet); 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/network/TeleportPacket.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.network; 2 | 3 | import com.vsngarcia.Config; 4 | import com.vsngarcia.ElevatorBlockBase; 5 | import com.vsngarcia.ElevatorMod; 6 | import com.vsngarcia.level.ElevatorContainer; 7 | import io.netty.buffer.ByteBuf; 8 | import net.minecraft.ChatFormatting; 9 | import net.minecraft.core.BlockPos; 10 | import net.minecraft.core.Direction; 11 | import net.minecraft.network.chat.Component; 12 | import net.minecraft.network.codec.StreamCodec; 13 | import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 14 | import net.minecraft.resources.ResourceLocation; 15 | import net.minecraft.server.level.ServerLevel; 16 | import net.minecraft.server.level.ServerPlayer; 17 | import net.minecraft.sounds.SoundEvent; 18 | import net.minecraft.sounds.SoundSource; 19 | import net.minecraft.world.entity.player.Player; 20 | import net.minecraft.world.level.BlockGetter; 21 | import net.minecraft.world.level.Level; 22 | import net.minecraft.world.level.block.state.BlockState; 23 | import net.minecraft.world.phys.Vec3; 24 | 25 | import java.util.Set; 26 | 27 | public record TeleportPacket(BlockPos from, BlockPos to) implements CustomPacketPayload { 28 | public static final Type TYPE = new Type<>( 29 | ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "teleport_request") 30 | ); 31 | 32 | public static final StreamCodec STREAM_CODEC = StreamCodec.composite( 33 | BlockPos.STREAM_CODEC, 34 | TeleportPacket::from, 35 | BlockPos.STREAM_CODEC, 36 | TeleportPacket::to, 37 | TeleportPacket::new 38 | ); 39 | 40 | @Override 41 | public Type type() { 42 | return TYPE; 43 | } 44 | 45 | public static void handle(TeleportPacket message, ServerPlayer player, SoundEvent soundEvent) { 46 | if (isBadTeleportPacket(message, player)) { 47 | return; 48 | } 49 | 50 | // XP 51 | if (Config.GENERAL.useXP.get() && !player.isCreative()) { 52 | Integer xpCost = Config.GENERAL.XPPointsAmount.get(); 53 | if (getPlayerExperienceProgress(player) - xpCost >= 0 || player.experienceLevel > 0) { 54 | player.giveExperiencePoints(-xpCost); 55 | } else { 56 | player.displayClientMessage( 57 | Component.translatable("elevatorid.message.missing_xp").withStyle(ChatFormatting.RED), 58 | true 59 | ); 60 | return; 61 | } 62 | } 63 | 64 | if (!(player.level() instanceof ServerLevel world)) 65 | return; 66 | 67 | BlockPos toPos = message.to(); 68 | BlockState toState = world.getBlockState(message.to()); 69 | 70 | // Check yaw and pitch 71 | final float yaw = toState.getValue(ElevatorBlockBase.DIRECTIONAL) 72 | ? toState.getValue(ElevatorBlockBase.FACING).toYRot() : player.getYRot(); 73 | 74 | final float pitch = 75 | (toState.getValue(ElevatorBlockBase.DIRECTIONAL) && Config.GENERAL.resetPitchDirectional.get()) 76 | || (!toState.getValue(ElevatorBlockBase.DIRECTIONAL) && Config.GENERAL.resetPitchNormal.get()) 77 | ? 0F : player.getXRot(); 78 | 79 | // Check X and Z 80 | final double toX, toZ; 81 | if (Config.GENERAL.precisionTarget.get()) { 82 | toX = toPos.getX() + .5D; 83 | toZ = toPos.getZ() + .5D; 84 | } else { 85 | toX = player.getX(); 86 | toZ = player.getZ(); 87 | } 88 | 89 | double blockYOffset = toState.getBlockSupportShape(world, toPos).max(Direction.Axis.Y); 90 | player.teleportTo( 91 | world, 92 | toX, 93 | Math.max(toPos.getY(), toPos.getY() + blockYOffset), 94 | toZ, 95 | Set.of(), 96 | yaw, 97 | pitch, 98 | true 99 | ); 100 | player.setDeltaMovement(player.getDeltaMovement().multiply(new Vec3(1D, 0D, 1D))); 101 | 102 | world.playSound(null, toPos, soundEvent, SoundSource.BLOCKS, 1F, 1F); 103 | } 104 | 105 | private static boolean isBadTeleportPacket(TeleportPacket msg, Player player) { 106 | if (player == null || !player.isAlive()) 107 | return true; 108 | 109 | Level world = player.level(); 110 | BlockPos fromPos = msg.from(); 111 | BlockPos toPos = msg.to(); 112 | 113 | if (!world.isLoaded(fromPos) || !world.isLoaded(toPos)) 114 | return true; 115 | 116 | // This ensures the player is still standing on the "from" elevator 117 | if (player.blockPosition().distManhattan(fromPos) > Config.GENERAL.activationRange.getAsInt()) 118 | return true; 119 | 120 | if (fromPos.getX() != toPos.getX() || fromPos.getZ() != toPos.getZ()) 121 | return true; 122 | 123 | if (fromPos.getY() == toPos.getY()) 124 | return true; 125 | 126 | ElevatorBlockBase fromElevator = getElevator(world.getBlockState(fromPos)); 127 | ElevatorBlockBase toElevator = getElevator(world.getBlockState(toPos)); 128 | 129 | if (fromElevator == null || toElevator == null) 130 | return true; 131 | 132 | if (!isValidPos(world, toPos)) 133 | return true; 134 | 135 | return Config.GENERAL.sameColor.get() && fromElevator.getColor() != toElevator.getColor(); 136 | } 137 | 138 | private static int getPlayerExperienceProgress(Player player) { 139 | return Math.round(player.experienceProgress * player.getXpNeededForNextLevel()); 140 | } 141 | 142 | public static boolean isValidPos(BlockGetter world, BlockPos pos) { 143 | return !world.getBlockState(pos.above()).isSuffocating(world, pos.above()); 144 | } 145 | 146 | public static ElevatorBlockBase getElevator(BlockState blockState) { 147 | if (blockState.getBlock() instanceof ElevatorBlockBase elevator) { 148 | return elevator; 149 | } 150 | 151 | return null; 152 | } 153 | 154 | public static boolean isBadClientPacket(Player player, BlockPos pos) { 155 | if (player == null || player.isDeadOrDying() || player.isRemoved()) 156 | return true; 157 | 158 | Level world = player.level(); 159 | if (!world.isLoaded(pos)) 160 | return true; 161 | 162 | if (!(player.containerMenu instanceof ElevatorContainer container)) 163 | return true; 164 | 165 | return !container.getPos().equals(pos); 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/network/client/RemoveCamoPacket.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.network.client; 2 | 3 | import com.vsngarcia.ElevatorMod; 4 | import com.vsngarcia.level.ElevatorBlockEntityBase; 5 | import com.vsngarcia.network.TeleportPacket; 6 | import io.netty.buffer.ByteBuf; 7 | import net.minecraft.core.BlockPos; 8 | import net.minecraft.network.codec.StreamCodec; 9 | import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 10 | import net.minecraft.resources.ResourceLocation; 11 | import net.minecraft.server.level.ServerPlayer; 12 | 13 | 14 | public record RemoveCamoPacket(BlockPos pos) implements CustomPacketPayload { 15 | public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath( 16 | ElevatorMod.ID, 17 | "remove_camo" 18 | )); 19 | 20 | public static final StreamCodec STREAM_CODEC = StreamCodec.composite( 21 | BlockPos.STREAM_CODEC, 22 | RemoveCamoPacket::pos, 23 | RemoveCamoPacket::new 24 | ); 25 | 26 | @Override 27 | public Type type() { 28 | return TYPE; 29 | } 30 | 31 | public static void handle(RemoveCamoPacket msg, ServerPlayer player) { 32 | if (TeleportPacket.isBadClientPacket(player, msg.pos)) { 33 | return; 34 | } 35 | 36 | if (player.level().getBlockEntity(msg.pos) instanceof ElevatorBlockEntityBase tile) { 37 | tile.setCamoAndUpdate(null); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/network/client/SetArrowPacket.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.network.client; 2 | 3 | import com.vsngarcia.ElevatorBlockBase; 4 | import com.vsngarcia.ElevatorMod; 5 | import com.vsngarcia.network.TeleportPacket; 6 | import io.netty.buffer.ByteBuf; 7 | import net.minecraft.core.BlockPos; 8 | import net.minecraft.network.codec.ByteBufCodecs; 9 | import net.minecraft.network.codec.StreamCodec; 10 | import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 11 | import net.minecraft.resources.ResourceLocation; 12 | import net.minecraft.server.level.ServerPlayer; 13 | import net.minecraft.world.level.Level; 14 | import net.minecraft.world.level.block.state.BlockState; 15 | 16 | 17 | public record SetArrowPacket(boolean value, BlockPos pos) implements CustomPacketPayload { 18 | public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath( 19 | ElevatorMod.ID, 20 | "set_arrow" 21 | )); 22 | 23 | public static final StreamCodec STREAM_CODEC = StreamCodec.composite( 24 | ByteBufCodecs.BOOL, 25 | SetArrowPacket::value, 26 | BlockPos.STREAM_CODEC, 27 | SetArrowPacket::pos, 28 | SetArrowPacket::new 29 | ); 30 | 31 | @Override 32 | public Type type() { 33 | return TYPE; 34 | } 35 | 36 | public static void handle(SetArrowPacket msg, ServerPlayer player) { 37 | if (TeleportPacket.isBadClientPacket(player, msg.pos)) { 38 | return; 39 | } 40 | 41 | Level world = player.level(); 42 | BlockState state = world.getBlockState(msg.pos); 43 | if (state.getBlock() instanceof ElevatorBlockBase) { 44 | world.setBlockAndUpdate(msg.pos, state.setValue(ElevatorBlockBase.SHOW_ARROW, msg.value)); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/network/client/SetDirectionalPacket.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.network.client; 2 | 3 | import com.vsngarcia.ElevatorBlockBase; 4 | import com.vsngarcia.ElevatorMod; 5 | import com.vsngarcia.network.TeleportPacket; 6 | import io.netty.buffer.ByteBuf; 7 | import net.minecraft.core.BlockPos; 8 | import net.minecraft.network.codec.ByteBufCodecs; 9 | import net.minecraft.network.codec.StreamCodec; 10 | import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 11 | import net.minecraft.resources.ResourceLocation; 12 | import net.minecraft.server.level.ServerPlayer; 13 | import net.minecraft.world.level.Level; 14 | import net.minecraft.world.level.block.state.BlockState; 15 | 16 | 17 | public record SetDirectionalPacket(boolean value, BlockPos pos) implements CustomPacketPayload { 18 | public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath( 19 | ElevatorMod.ID, 20 | "set_directional" 21 | )); 22 | 23 | public static final StreamCodec STREAM_CODEC = StreamCodec.composite( 24 | ByteBufCodecs.BOOL, 25 | SetDirectionalPacket::value, 26 | BlockPos.STREAM_CODEC, 27 | SetDirectionalPacket::pos, 28 | SetDirectionalPacket::new 29 | ); 30 | 31 | @Override 32 | public Type type() { 33 | return TYPE; 34 | } 35 | 36 | 37 | public static void handle(SetDirectionalPacket msg, ServerPlayer player) { 38 | if (TeleportPacket.isBadClientPacket(player, msg.pos)) { 39 | return; 40 | } 41 | 42 | Level world = player.level(); 43 | BlockState state = world.getBlockState(msg.pos); 44 | if (state.getBlock() instanceof ElevatorBlockBase) { 45 | world.setBlockAndUpdate(msg.pos, state.setValue(ElevatorBlockBase.DIRECTIONAL, msg.value)); 46 | } 47 | } 48 | } 49 | 50 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/network/client/SetFacingPacket.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.network.client; 2 | 3 | import com.vsngarcia.ElevatorBlockBase; 4 | import com.vsngarcia.ElevatorMod; 5 | import com.vsngarcia.network.TeleportPacket; 6 | import io.netty.buffer.ByteBuf; 7 | import net.minecraft.core.BlockPos; 8 | import net.minecraft.core.Direction; 9 | import net.minecraft.network.codec.StreamCodec; 10 | import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 11 | import net.minecraft.resources.ResourceLocation; 12 | import net.minecraft.server.level.ServerPlayer; 13 | import net.minecraft.world.level.Level; 14 | import net.minecraft.world.level.block.state.BlockState; 15 | 16 | 17 | public record SetFacingPacket(Direction direction, BlockPos pos) implements CustomPacketPayload { 18 | public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath( 19 | ElevatorMod.ID, 20 | "set_facing" 21 | )); 22 | 23 | public static final StreamCodec STREAM_CODEC = StreamCodec.composite( 24 | Direction.STREAM_CODEC, 25 | SetFacingPacket::direction, 26 | BlockPos.STREAM_CODEC, 27 | SetFacingPacket::pos, 28 | SetFacingPacket::new 29 | ); 30 | 31 | @Override 32 | public Type type() { 33 | return TYPE; 34 | } 35 | 36 | public static void handle(SetFacingPacket msg, ServerPlayer player) { 37 | if (TeleportPacket.isBadClientPacket(player, msg.pos)) { 38 | return; 39 | } 40 | 41 | Level world = player.level(); 42 | BlockState state = world.getBlockState(msg.pos); 43 | if (state.getBlock() instanceof ElevatorBlockBase) { 44 | world.setBlockAndUpdate(msg.pos, state.setValue(ElevatorBlockBase.FACING, msg.direction)); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /common/src/main/java/com/vsngarcia/util/FakeUseContext.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.util; 2 | 3 | import net.minecraft.core.BlockPos; 4 | import net.minecraft.world.InteractionHand; 5 | import net.minecraft.world.entity.player.Player; 6 | import net.minecraft.world.item.context.BlockPlaceContext; 7 | import net.minecraft.world.item.context.UseOnContext; 8 | import net.minecraft.world.phys.BlockHitResult; 9 | 10 | 11 | public class FakeUseContext extends BlockPlaceContext { 12 | public FakeUseContext(Player player, InteractionHand handIn, BlockHitResult hit) { 13 | super(new UseOnContext(player, handIn, hit)); 14 | } 15 | 16 | @Override 17 | public BlockPos getClickedPos() { 18 | return getHitResult().getBlockPos(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_black" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_blue" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_brown" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_cyan" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_gray" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_green" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_light_blue" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_light_gray" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_lime" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_magenta" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_orange" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_pink" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_purple" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_red" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_white" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/blockstates/elevator_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "elevatorid:block/elevator_yellow" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_black" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_blue" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_brown" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_cyan" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_gray" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_green" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_light_blue" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_light_gray" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_lime" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_magenta" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_orange" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_pink" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_purple" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_red" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_white" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/items/elevator_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "elevatorid:item/elevator_yellow" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/de_de.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Weisser Aufzug", 3 | "block.elevatorid.elevator_black": "Schwarzer Aufzug", 4 | "block.elevatorid.elevator_blue": "Blauer Aufzug", 5 | "block.elevatorid.elevator_brown": "Brauner Aufzug", 6 | "block.elevatorid.elevator_cyan": "Türkiser Aufzug", 7 | "block.elevatorid.elevator_gray": "Grauer Aufzug", 8 | "block.elevatorid.elevator_green": "Grüner Aufzug", 9 | "block.elevatorid.elevator_light_blue": "Hellblauer Aufzug", 10 | "block.elevatorid.elevator_lime": "Hellgrüner Aufzug", 11 | "block.elevatorid.elevator_magenta": "Magenta Aufzug", 12 | "block.elevatorid.elevator_orange": "Oranger Aufzug", 13 | "block.elevatorid.elevator_pink": "Pinker Aufzug", 14 | "block.elevatorid.elevator_purple": "Violetter Aufzug", 15 | "block.elevatorid.elevator_red": "Roter Aufzug", 16 | "block.elevatorid.elevator_light_gray": "Hellgrauer Aufzug", 17 | "block.elevatorid.elevator_yellow": "Gelber Aufzug", 18 | 19 | "elevatorid.subtitle.teleport": "Aufzug benutzt", 20 | 21 | "itemGroup.elevators_tab": "Aufzüge" 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "White Elevator", 3 | "block.elevatorid.elevator_black": "Black Elevator", 4 | "block.elevatorid.elevator_blue": "Blue Elevator", 5 | "block.elevatorid.elevator_brown": "Brown Elevator", 6 | "block.elevatorid.elevator_cyan": "Cyan Elevator", 7 | "block.elevatorid.elevator_gray": "Gray Elevator", 8 | "block.elevatorid.elevator_green": "Green Elevator", 9 | "block.elevatorid.elevator_light_blue": "Light Blue Elevator", 10 | "block.elevatorid.elevator_lime": "Lime Elevator", 11 | "block.elevatorid.elevator_magenta": "Magenta Elevator", 12 | "block.elevatorid.elevator_orange": "Orange Elevator", 13 | "block.elevatorid.elevator_pink": "Pink Elevator", 14 | "block.elevatorid.elevator_purple": "Purple Elevator", 15 | "block.elevatorid.elevator_red": "Red Elevator", 16 | "block.elevatorid.elevator_light_gray": "Light Gray Elevator", 17 | "block.elevatorid.elevator_yellow": "Yellow Elevator", 18 | 19 | "elevatorid.subtitle.teleport": "Elevator used", 20 | "elevatorid.subtitle.camouflage": "Elevator camouflaged", 21 | 22 | "screen.elevatorid.elevator": "Elevator Options", 23 | "screen.elevatorid.elevator.directional": "Directional", 24 | "screen.elevatorid.elevator.directional_north": "N", 25 | "screen.elevatorid.elevator.directional_east": "E", 26 | "screen.elevatorid.elevator.directional_south": "S", 27 | "screen.elevatorid.elevator.directional_west": "W", 28 | "screen.elevatorid.elevator.hide_arrow": "Hide arrow", 29 | "screen.elevatorid.elevator.reset_camo": "Remove camouflage", 30 | 31 | "elevatorid.message.missing_xp": "You do not have enough XP to use elevators", 32 | 33 | "itemGroup.elevators_tab": "Elevators", 34 | 35 | "tag.item.elevatorid.elevators": "Elevators" 36 | } 37 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/es_ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Ascensor blanco", 3 | "block.elevatorid.elevator_black": "Ascensor negro", 4 | "block.elevatorid.elevator_blue": "Ascensor azul", 5 | "block.elevatorid.elevator_brown": "Ascensor marrón", 6 | "block.elevatorid.elevator_cyan": "Ascensor cian", 7 | "block.elevatorid.elevator_gray": "Ascensor gris", 8 | "block.elevatorid.elevator_green": "Ascensor verde", 9 | "block.elevatorid.elevator_light_blue": "Ascensor azul celeste", 10 | "block.elevatorid.elevator_lime": "Ascensor verde lima", 11 | "block.elevatorid.elevator_magenta": "Ascensor magenta", 12 | "block.elevatorid.elevator_orange": "Ascensor naranja", 13 | "block.elevatorid.elevator_pink": "Ascensor rosa", 14 | "block.elevatorid.elevator_purple": "Ascensor violeta", 15 | "block.elevatorid.elevator_red": "Ascensor rojo", 16 | "block.elevatorid.elevator_light_gray": "Ascensor gris claro", 17 | "block.elevatorid.elevator_yellow": "Ascensor amarillo", 18 | 19 | "elevatorid.subtitle.teleport": "Ascensor es utilizado", 20 | 21 | "screen.elevatorid.elevator": "Opciones de ascensor", 22 | "screen.elevatorid.elevator.directional": "Direccional", 23 | "screen.elevatorid.elevator.hide_arrow": "Esconder flecha", 24 | "screen.elevatorid.elevator.reset_camo": "Quitar camuflage", 25 | 26 | "elevatorid.message.missing_xp": "Necesitás más XP para poder teletransportarte", 27 | 28 | "itemGroup.elevators_tab": "Ascensores" 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/es_es.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Ascensor blanco", 3 | "block.elevatorid.elevator_black": "Ascensor negro", 4 | "block.elevatorid.elevator_blue": "Ascensor azul", 5 | "block.elevatorid.elevator_brown": "Ascensor marrón", 6 | "block.elevatorid.elevator_cyan": "Ascensor cian", 7 | "block.elevatorid.elevator_gray": "Ascensor gris", 8 | "block.elevatorid.elevator_green": "Ascensor verde", 9 | "block.elevatorid.elevator_light_blue": "Ascensor azul claro", 10 | "block.elevatorid.elevator_lime": "Ascensor verde lima", 11 | "block.elevatorid.elevator_magenta": "Ascensor magenta", 12 | "block.elevatorid.elevator_orange": "Ascensor naranja", 13 | "block.elevatorid.elevator_pink": "Ascensor rosa", 14 | "block.elevatorid.elevator_purple": "Ascensor morado", 15 | "block.elevatorid.elevator_red": "Ascensor rojo", 16 | "block.elevatorid.elevator_light_gray": "Ascensor gris claro", 17 | "block.elevatorid.elevator_yellow": "Ascensor amarillo", 18 | 19 | "elevatorid.subtitle.teleport": "Ascensor usado", 20 | "elevatorid.subtitle.camouflage": "Ascensor camuflado", 21 | 22 | "screen.elevatorid.elevator": "Opciones de ascensor", 23 | "screen.elevatorid.elevator.directional": "Dirección", 24 | "screen.elevatorid.elevator.hide_arrow": "Esconder flecha", 25 | "screen.elevatorid.elevator.reset_camo": "Eliminar camuflaje", 26 | 27 | "elevatorid.message.missing_xp": "Necesitas más experiencia para teletransportarte", 28 | 29 | "itemGroup.elevators_tab": "Ascensores" 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/es_mx.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Ascensor blanco", 3 | "block.elevatorid.elevator_black": "Ascensor negro", 4 | "block.elevatorid.elevator_blue": "Ascensor azul", 5 | "block.elevatorid.elevator_brown": "Ascensor café", 6 | "block.elevatorid.elevator_cyan": "Ascensor cian", 7 | "block.elevatorid.elevator_gray": "Ascensor gris", 8 | "block.elevatorid.elevator_green": "Ascensor verde", 9 | "block.elevatorid.elevator_light_blue": "Ascensor azul claro", 10 | "block.elevatorid.elevator_lime": "Ascensor verde lima", 11 | "block.elevatorid.elevator_magenta": "Ascensor magenta", 12 | "block.elevatorid.elevator_orange": "Ascensor naranja", 13 | "block.elevatorid.elevator_pink": "Ascensor rosa", 14 | "block.elevatorid.elevator_purple": "Ascensor morado", 15 | "block.elevatorid.elevator_red": "Ascensor rojo", 16 | "block.elevatorid.elevator_light_gray": "Ascensor gris claro", 17 | "block.elevatorid.elevator_yellow": "Ascensor amarillo", 18 | 19 | "elevatorid.subtitle.teleport": "Ascensor es utilizado", 20 | 21 | "screen.elevatorid.elevator": "Opciones de ascensor", 22 | "screen.elevatorid.elevator.directional": "Direccional", 23 | "screen.elevatorid.elevator.hide_arrow": "Esconder flecha", 24 | "screen.elevatorid.elevator.reset_camo": "Quitar camuflage", 25 | 26 | "elevatorid.message.missing_xp": "Necesitas más XP para poder teletransportarte", 27 | 28 | "itemGroup.elevators_tab": "Ascensores" 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/fr_fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Ascenseur blanc", 3 | "block.elevatorid.elevator_black": "Ascenseur noir", 4 | "block.elevatorid.elevator_blue": "Ascenseur bleu", 5 | "block.elevatorid.elevator_brown": "Ascenseur marron", 6 | "block.elevatorid.elevator_cyan": "Ascenseur cyan", 7 | "block.elevatorid.elevator_gray": "Ascenseur gris", 8 | "block.elevatorid.elevator_green": "Ascenseur vert", 9 | "block.elevatorid.elevator_light_blue": "Ascenseur bleu clair", 10 | "block.elevatorid.elevator_lime": "Ascenseur citron vert", 11 | "block.elevatorid.elevator_magenta": "Ascenseur magenta", 12 | "block.elevatorid.elevator_orange": "Ascenseur orange", 13 | "block.elevatorid.elevator_pink": "Ascenseur rose", 14 | "block.elevatorid.elevator_purple": "Ascenseur violet", 15 | "block.elevatorid.elevator_red": "Ascenseur rouge", 16 | "block.elevatorid.elevator_light_gray": "Ascenseur gris clair", 17 | "block.elevatorid.elevator_yellow": "Ascenseur jaune", 18 | 19 | "elevatorid.subtitle.teleport": "Ascenseur utilisé", 20 | 21 | "screen.elevatorid.elevator": "Options d'ascenseur", 22 | "screen.elevatorid.elevator.directional": "Directionnel", 23 | "screen.elevatorid.elevator.hide_arrow": "Masquer la flèche", 24 | "screen.elevatorid.elevator.reset_camo": "Supprimer le camouflage", 25 | 26 | "elevatorid.message.missing_xp": "Vous n'avez pas assez d'XP pour vous téléporter", 27 | 28 | "itemGroup.elevators_tab": "Ascenseurs" 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/it_it.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Ascensore bianco", 3 | "block.elevatorid.elevator_black": "Ascensore nero", 4 | "block.elevatorid.elevator_blue": "Ascensore blu", 5 | "block.elevatorid.elevator_brown": "Ascensore marrone", 6 | "block.elevatorid.elevator_cyan": "Ascensore ciano", 7 | "block.elevatorid.elevator_gray": "Ascensore grigio", 8 | "block.elevatorid.elevator_green": "Ascensore verde", 9 | "block.elevatorid.elevator_light_blue": "Ascensore azzurro", 10 | "block.elevatorid.elevator_lime": "Ascensore lime", 11 | "block.elevatorid.elevator_magenta": "Ascensore magenta", 12 | "block.elevatorid.elevator_orange": "Ascensore arancione", 13 | "block.elevatorid.elevator_pink": "Ascensore rosa", 14 | "block.elevatorid.elevator_purple": "Ascensore viola", 15 | "block.elevatorid.elevator_red": "Ascensore rosso", 16 | "block.elevatorid.elevator_light_gray": "Ascensore grigio chiaro", 17 | "block.elevatorid.elevator_yellow": "Ascensore giallo", 18 | 19 | "elevatorid.subtitle.teleport": "Ascensore in azione", 20 | "elevatorid.subtitle.camouflage": "Ascensore camuffato", 21 | 22 | "screen.elevatorid.elevator": "Opzioni ascensore", 23 | "screen.elevatorid.elevator.directional": "Direzionale", 24 | "screen.elevatorid.elevator.hide_arrow": "Nascondi freccia", 25 | "screen.elevatorid.elevator.reset_camo": "Rimuovi occultamento", 26 | 27 | "elevatorid.message.missing_xp": "Non hai abbastanza esperienza per teletrasportarti", 28 | 29 | "itemGroup.elevators_tab": "Elevators" 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/ja_jp.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "白色のエレベーター", 3 | "block.elevatorid.elevator_black": "黒色のエレベーター", 4 | "block.elevatorid.elevator_blue": "青色のエレベーター", 5 | "block.elevatorid.elevator_brown": "茶色のエレベーター", 6 | "block.elevatorid.elevator_cyan": "青緑色のエレベーター", 7 | "block.elevatorid.elevator_gray": "灰色のエレベーター", 8 | "block.elevatorid.elevator_green": "緑色のエレベーター", 9 | "block.elevatorid.elevator_light_blue": "空色のエレベーター", 10 | "block.elevatorid.elevator_lime": "黄緑色のエレベーター", 11 | "block.elevatorid.elevator_magenta": "赤紫色のエレベーター", 12 | "block.elevatorid.elevator_orange": "橙色のエレベーター", 13 | "block.elevatorid.elevator_pink": "桃色のエレベーター", 14 | "block.elevatorid.elevator_purple": "紫色のエレベーター", 15 | "block.elevatorid.elevator_red": "赤色のエレベーター", 16 | "block.elevatorid.elevator_light_gray": "薄灰色のエレベーター", 17 | "block.elevatorid.elevator_yellow": "黄色のエレベーター", 18 | 19 | "elevatorid.subtitle.teleport": "エレベーターが使用される", 20 | "elevatorid.subtitle.camouflage": "エレベーターがカモフラージュされる", 21 | 22 | "screen.elevatorid.elevator": "エレベーターの設定", 23 | "screen.elevatorid.elevator.directional": "方向", 24 | "screen.elevatorid.elevator.directional_north": "北", 25 | "screen.elevatorid.elevator.directional_east": "東", 26 | "screen.elevatorid.elevator.directional_south": "南", 27 | "screen.elevatorid.elevator.directional_west": "西", 28 | "screen.elevatorid.elevator.hide_arrow": "矢印を隠す", 29 | "screen.elevatorid.elevator.reset_camo": "カモフラージュを削除", 30 | 31 | "elevatorid.message.missing_xp": "経験値が不足しているため、テレポートできません", 32 | 33 | "itemGroup.elevators_tab": "エレベーター" 34 | } 35 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/kk_kz.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Ақ лифт", 3 | "block.elevatorid.elevator_black": "Қара лифт", 4 | "block.elevatorid.elevator_blue": "Көк лифт", 5 | "block.elevatorid.elevator_brown": "Қоңыр лифт", 6 | "block.elevatorid.elevator_cyan": "Көкзеңгір лифт", 7 | "block.elevatorid.elevator_gray": "Сұр лифт", 8 | "block.elevatorid.elevator_green": "Жасыл лифт", 9 | "block.elevatorid.elevator_light_blue": "Көгілдір лифт", 10 | "block.elevatorid.elevator_lime": "Лайм лифт", 11 | "block.elevatorid.elevator_magenta": "Ашық жасыл лифт", 12 | "block.elevatorid.elevator_orange": "Қызғылт сары лифт", 13 | "block.elevatorid.elevator_pink": "Қызғылт лифт", 14 | "block.elevatorid.elevator_purple": "Күлгін лифт", 15 | "block.elevatorid.elevator_red": "Қызыл лифт", 16 | "block.elevatorid.elevator_light_gray": "Боз лифт", 17 | "block.elevatorid.elevator_yellow": "Сары лифт", 18 | 19 | "elevatorid.subtitle.teleport": "Лифт қолданылды", 20 | "elevatorid.subtitle.camouflage": "Лифт жасырылды", 21 | 22 | "screen.elevatorid.elevator": "Лифтті баптау", 23 | "screen.elevatorid.elevator.directional": "Бағытты", 24 | "screen.elevatorid.elevator.hide_arrow": "Оқшаны жасыру", 25 | "screen.elevatorid.elevator.reset_camo": "Камуфляжды алып тастау", 26 | 27 | "elevatorid.message.missing_xp": "Телепорттануға тәжірибеңіз жетпейді", 28 | 29 | "itemGroup.elevators_tab": "Elevators" 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/ko_kr.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "하얀색 엘리베이터", 3 | "block.elevatorid.elevator_black": "검은색 엘리베이터", 4 | "block.elevatorid.elevator_blue": "파란색 엘리베이터", 5 | "block.elevatorid.elevator_brown": "갈색 엘리베이터", 6 | "block.elevatorid.elevator_cyan": "청록색 엘리베이터", 7 | "block.elevatorid.elevator_gray": "회색 엘리베이터", 8 | "block.elevatorid.elevator_green": "초록색 엘리베이터", 9 | "block.elevatorid.elevator_light_blue": "하늘색 엘리베이터", 10 | "block.elevatorid.elevator_lime": "연두색 엘리베이터", 11 | "block.elevatorid.elevator_magenta": "자홍색 엘리베이터", 12 | "block.elevatorid.elevator_orange": "주황색 엘리베이터", 13 | "block.elevatorid.elevator_pink": "분홍색 엘리베이터", 14 | "block.elevatorid.elevator_purple": "보라색 엘리베이터", 15 | "block.elevatorid.elevator_red": "빨강색 엘리베이터", 16 | "block.elevatorid.elevator_light_gray": "회백색 엘리베이터", 17 | "block.elevatorid.elevator_yellow": "노랑색 엘리베이터", 18 | 19 | "elevatorid.subtitle.teleport": "엘리베이터가 작동됩니다.", 20 | "elevatorid.subtitle.camouflage": "엘리베이터가 위장되었습니다.", 21 | 22 | "screen.elevatorid.elevator": "엘리베이터 설정", 23 | "screen.elevatorid.elevator.directional": "방향", 24 | "screen.elevatorid.elevator.hide_arrow": "화살표 미표시", 25 | "screen.elevatorid.elevator.reset_camo": "위장 미표시", 26 | 27 | "elevatorid.message.missing_xp": "충분한 경험치가 없어서 텔레포트를 할 수 없습니다.", 28 | 29 | "itemGroup.elevators_tab": "엘리베이터" 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/pl_pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Biała winda", 3 | "block.elevatorid.elevator_black": "Czarna winda", 4 | "block.elevatorid.elevator_blue": "Niebieska winda", 5 | "block.elevatorid.elevator_brown": "Brązowa winda", 6 | "block.elevatorid.elevator_cyan": "Błękitna winda", 7 | "block.elevatorid.elevator_gray": "Szara winda", 8 | "block.elevatorid.elevator_green": "Zielona winda", 9 | "block.elevatorid.elevator_light_blue": "Jasnoniebieska winda", 10 | "block.elevatorid.elevator_lime": "Jasnozielona winda", 11 | "block.elevatorid.elevator_magenta": "Karmazynowa winda", 12 | "block.elevatorid.elevator_orange": "Pomarańczowa winda", 13 | "block.elevatorid.elevator_pink": "Różowa winda", 14 | "block.elevatorid.elevator_purple": "Fioletowa winda", 15 | "block.elevatorid.elevator_red": "Czerwona winda", 16 | "block.elevatorid.elevator_light_gray": "Jasnoszara winda", 17 | "block.elevatorid.elevator_yellow": "Żółta winda", 18 | 19 | "elevatorid.subtitle.teleport": "Używana winda", 20 | 21 | "itemGroup.elevators_tab": "Elevators" 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/pt_br.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Elevador branco", 3 | "block.elevatorid.elevator_black": "Elevador preto", 4 | "block.elevatorid.elevator_blue": "Elevador azul", 5 | "block.elevatorid.elevator_brown": "Elevador marrom", 6 | "block.elevatorid.elevator_cyan": "Elevador ciano", 7 | "block.elevatorid.elevator_gray": "Elevador cinza", 8 | "block.elevatorid.elevator_green": "Elevador verde", 9 | "block.elevatorid.elevator_light_blue": "Elevador azul-claro", 10 | "block.elevatorid.elevator_lime": "Elevador verde-limão", 11 | "block.elevatorid.elevator_magenta": "Elevador magenta", 12 | "block.elevatorid.elevator_orange": "Elevador laranja", 13 | "block.elevatorid.elevator_pink": "Elevador rosa", 14 | "block.elevatorid.elevator_purple": "Elevador roxo", 15 | "block.elevatorid.elevator_red": "Elevador vermelho", 16 | "block.elevatorid.elevator_light_gray": "Elevador cinza-claro", 17 | "block.elevatorid.elevator_yellow": "Elevador amarelo", 18 | 19 | "elevatorid.subtitle.teleport": "Elevador usado", 20 | "elevatorid.subtitle.camouflage": "Elevador camuflado", 21 | 22 | "screen.elevatorid.elevator": "Opções do elevador", 23 | "screen.elevatorid.elevator.directional": "Direcional", 24 | "screen.elevatorid.elevator.directional_north": "N", 25 | "screen.elevatorid.elevator.directional_east": "L", 26 | "screen.elevatorid.elevator.directional_south": "S", 27 | "screen.elevatorid.elevator.directional_west": "O", 28 | "screen.elevatorid.elevator.hide_arrow": "Ocultar seta", 29 | "screen.elevatorid.elevator.reset_camo": "Remover camuflagem", 30 | 31 | "elevatorid.message.missing_xp": "Você não tem XP suficiente para usar elevadores", 32 | 33 | "itemGroup.elevators_tab": "Elevadores" 34 | } 35 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/pt_pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Elevador Branco", 3 | "block.elevatorid.elevator_black": "Elevador Preto", 4 | "block.elevatorid.elevator_blue": "Elevador Azul", 5 | "block.elevatorid.elevator_brown": "Elevador Castanho", 6 | "block.elevatorid.elevator_cyan": "Elevador Ciano", 7 | "block.elevatorid.elevator_gray": "Elevador Cinza", 8 | "block.elevatorid.elevator_green": "Elevador Verde", 9 | "block.elevatorid.elevator_light_blue": "Elevador Azul Claro", 10 | "block.elevatorid.elevator_lime": "Elevador Lima", 11 | "block.elevatorid.elevator_magenta": "Elevador Magenta", 12 | "block.elevatorid.elevator_orange": "Elevador Laranja", 13 | "block.elevatorid.elevator_pink": "Elevador Rosa", 14 | "block.elevatorid.elevator_purple": "Elevador Roxo", 15 | "block.elevatorid.elevator_red": "Elevador Vermelho", 16 | "block.elevatorid.elevator_light_gray": "Elevador Cinza Claro", 17 | "block.elevatorid.elevator_yellow": "Elevador Amarelo", 18 | 19 | "elevatorid.subtitle.teleport": "Elevador usado", 20 | "elevatorid.subtitle.camouflage": "Elevador camuflado", 21 | 22 | "screen.elevatorid.elevator": "Opções do Elevator", 23 | "screen.elevatorid.elevator.directional": "Direcional", 24 | "screen.elevatorid.elevator.hide_arrow": "Esconder seta", 25 | "screen.elevatorid.elevator.reset_camo": "Remover camuflagem", 26 | 27 | "elevatorid.message.missing_xp": "Não tens experiência suficiente para usar elevadores", 28 | 29 | "itemGroup.elevators_tab": "Elevadores" 30 | } 31 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/ru_ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Белый лифт", 3 | "block.elevatorid.elevator_black": "Чёрный лифт", 4 | "block.elevatorid.elevator_blue": "Синий лифт", 5 | "block.elevatorid.elevator_brown": "Коричневый лифт", 6 | "block.elevatorid.elevator_cyan": "Бирюзовый лифт", 7 | "block.elevatorid.elevator_gray": "Серый лифт", 8 | "block.elevatorid.elevator_green": "Зелёный лифт", 9 | "block.elevatorid.elevator_light_blue": "Голубой лифт", 10 | "block.elevatorid.elevator_lime": "Лаймовый лифт", 11 | "block.elevatorid.elevator_magenta": "Фиолетовый лифт", 12 | "block.elevatorid.elevator_orange": "Оранжевый лифт", 13 | "block.elevatorid.elevator_pink": "Розовый лифт", 14 | "block.elevatorid.elevator_purple": "Пурпурный лифт", 15 | "block.elevatorid.elevator_red": "Красный лифт", 16 | "block.elevatorid.elevator_light_gray": "Светло-серый лифт", 17 | "block.elevatorid.elevator_yellow": "Жёлтый лифт", 18 | 19 | "elevatorid.subtitle.teleport": "Лифт использовался", 20 | "elevatorid.subtitle.camouflage": "Лифт замаскирован", 21 | 22 | "screen.elevatorid.elevator": "Настройки лифта", 23 | "screen.elevatorid.elevator.directional": "Направление", 24 | "screen.elevatorid.elevator.directional_north": "С", 25 | "screen.elevatorid.elevator.directional_east": "В", 26 | "screen.elevatorid.elevator.directional_south": "Ю", 27 | "screen.elevatorid.elevator.directional_west": "З", 28 | "screen.elevatorid.elevator.hide_arrow": "Скрыть указатель", 29 | "screen.elevatorid.elevator.reset_camo": "Снять маскировку", 30 | 31 | "elevatorid.message.missing_xp": "Недостаточно опыта для телепортации.", 32 | 33 | "itemGroup.elevators_tab": "Elevators" 34 | } 35 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/sv_se.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Vit hiss", 3 | "block.elevatorid.elevator_black": "Svart hiss", 4 | "block.elevatorid.elevator_blue": "Blå hiss", 5 | "block.elevatorid.elevator_brown": "Brun hiss", 6 | "block.elevatorid.elevator_cyan": "Turkos hiss", 7 | "block.elevatorid.elevator_gray": "Grå hiss", 8 | "block.elevatorid.elevator_green": "Grön hiss", 9 | "block.elevatorid.elevator_light_blue": "Ljusblå hiss", 10 | "block.elevatorid.elevator_lime": "Limegrön hiss", 11 | "block.elevatorid.elevator_magenta": "Ljuslila hiss", 12 | "block.elevatorid.elevator_orange": "Orange hiss", 13 | "block.elevatorid.elevator_pink": "Rosa hiss", 14 | "block.elevatorid.elevator_purple": "Lila hiss", 15 | "block.elevatorid.elevator_red": "Röd hiss", 16 | "block.elevatorid.elevator_light_gray": "Ljusgrå hiss", 17 | "block.elevatorid.elevator_yellow": "Gul hiss", 18 | 19 | "elevatorid.subtitle.teleport": "Hiss används", 20 | "elevatorid.subtitle.camouflage": "Hiss kamoufleras", 21 | 22 | "screen.elevatorid.elevator": "Hissalternativ", 23 | "screen.elevatorid.elevator.directional": "Riktning", 24 | "screen.elevatorid.elevator.directional_north": "N", 25 | "screen.elevatorid.elevator.directional_east": "Ö", 26 | "screen.elevatorid.elevator.directional_south": "S", 27 | "screen.elevatorid.elevator.directional_west": "V", 28 | "screen.elevatorid.elevator.hide_arrow": "Dölj pil", 29 | "screen.elevatorid.elevator.reset_camo": "Ta bort kamouflage", 30 | 31 | "elevatorid.message.missing_xp": "Du har inte tillräckligt mycket erfarenhet för att teleportera", 32 | 33 | "itemGroup.elevators_tab": "Elevators" 34 | } 35 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/tr_tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Beyaz Asansör", 3 | "block.elevatorid.elevator_black": "Siyah Asansör", 4 | "block.elevatorid.elevator_blue": "Mavi Asansör", 5 | "block.elevatorid.elevator_brown": "Kahverengi Asansör", 6 | "block.elevatorid.elevator_cyan": "Camgöbeği Asansör", 7 | "block.elevatorid.elevator_gray": "Gri Asansör", 8 | "block.elevatorid.elevator_green": "Yeşil Asansör", 9 | "block.elevatorid.elevator_light_blue": "Açık Mavi Asansör", 10 | "block.elevatorid.elevator_lime": "Açık Yeşil Asansör", 11 | "block.elevatorid.elevator_magenta": "Pembe Asansör", 12 | "block.elevatorid.elevator_orange": "Turuncu Asansör", 13 | "block.elevatorid.elevator_pink": "Eflatun Asansör", 14 | "block.elevatorid.elevator_purple": "Mor Asansör", 15 | "block.elevatorid.elevator_red": "Kırmızı Asansör", 16 | "block.elevatorid.elevator_light_gray": "Açık Gri Asansör", 17 | "block.elevatorid.elevator_yellow": "Sarı Asansör", 18 | 19 | "elevatorid.subtitle.teleport": "Asansör Kullanımı", 20 | "elevatorid.subtitle.camouflage": "Asansör kamuflajı", 21 | 22 | "screen.elevatorid.elevator": "Asansör Ayarları", 23 | "screen.elevatorid.elevator.directional": "Directional", 24 | "screen.elevatorid.elevator.directional_north": "K", 25 | "screen.elevatorid.elevator.directional_east": "D", 26 | "screen.elevatorid.elevator.directional_south": "G", 27 | "screen.elevatorid.elevator.directional_west": "B", 28 | "screen.elevatorid.elevator.hide_arrow": "Oku gizle", 29 | "screen.elevatorid.elevator.reset_camo": "Kamuflajı kaldır", 30 | 31 | "elevatorid.message.missing_xp": "Işınlanmak için yeterli tecrübe puanınız yok", 32 | 33 | "itemGroup.elevators_tab": "Asansörler" 34 | } 35 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/uk_ua.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "Білий ліфт", 3 | "block.elevatorid.elevator_black": "Чорний ліфт", 4 | "block.elevatorid.elevator_blue": "Синій ліфт", 5 | "block.elevatorid.elevator_brown": "Коричневий ліфт", 6 | "block.elevatorid.elevator_cyan": "Блакитний ліфт", 7 | "block.elevatorid.elevator_gray": "Сірий ліфт", 8 | "block.elevatorid.elevator_green": "Зелений ліфт", 9 | "block.elevatorid.elevator_light_blue": "Світло-синій ліфт", 10 | "block.elevatorid.elevator_lime": "Лаймовий ліфт", 11 | "block.elevatorid.elevator_magenta": "Малиновий ліфт", 12 | "block.elevatorid.elevator_orange": "Помаранчевий ліфт", 13 | "block.elevatorid.elevator_pink": "Рожевий ліфт", 14 | "block.elevatorid.elevator_purple": "Фіолетовий ліфт", 15 | "block.elevatorid.elevator_red": "Червоний ліфт", 16 | "block.elevatorid.elevator_light_gray": "Срібний ліфт", 17 | "block.elevatorid.elevator_yellow": "Жовтий ліфт", 18 | 19 | "elevatorid.subtitle.teleport": "Використовування ліфту", 20 | 21 | "screen.elevatorid.elevator": "Параметри ліфта", 22 | "screen.elevatorid.elevator.directional": "Спрямований", 23 | "screen.elevatorid.elevator.hide_arrow": "Сховати стрілку", 24 | "screen.elevatorid.elevator.reset_camo": "Зняти камуфляж", 25 | 26 | "elevatorid.message.missing_xp": "У вас недостатньо досвіду для телепортації", 27 | 28 | "itemGroup.elevators_tab": "Elevator Mod" 29 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/zh_cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "白色电梯", 3 | "block.elevatorid.elevator_black": "黑色电梯", 4 | "block.elevatorid.elevator_blue": "蓝色电梯", 5 | "block.elevatorid.elevator_brown": "棕色电梯", 6 | "block.elevatorid.elevator_cyan": "青色电梯", 7 | "block.elevatorid.elevator_gray": "灰色电梯", 8 | "block.elevatorid.elevator_green": "绿色电梯", 9 | "block.elevatorid.elevator_light_blue": "浅蓝色电梯", 10 | "block.elevatorid.elevator_lime": "黄绿色电梯", 11 | "block.elevatorid.elevator_magenta": "品红色电梯", 12 | "block.elevatorid.elevator_orange": "橙色电梯", 13 | "block.elevatorid.elevator_pink": "粉色电梯", 14 | "block.elevatorid.elevator_purple": "紫色电梯", 15 | "block.elevatorid.elevator_red": "红色电梯", 16 | "block.elevatorid.elevator_light_gray": "浅灰色电梯", 17 | "block.elevatorid.elevator_yellow": "黄色电梯", 18 | 19 | "elevatorid.subtitle.teleport": "使用电梯", 20 | 21 | "itemGroup.elevators_tab": "电梯" 22 | } 23 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/lang/zh_tw.json: -------------------------------------------------------------------------------- 1 | { 2 | "block.elevatorid.elevator_white": "白色電梯", 3 | "block.elevatorid.elevator_black": "黑色電梯", 4 | "block.elevatorid.elevator_blue": "藍色電梯", 5 | "block.elevatorid.elevator_brown": "棕色電梯", 6 | "block.elevatorid.elevator_cyan": "青色電梯", 7 | "block.elevatorid.elevator_gray": "灰色電梯", 8 | "block.elevatorid.elevator_green": "綠色電梯", 9 | "block.elevatorid.elevator_light_blue": "淺藍色電梯", 10 | "block.elevatorid.elevator_lime": "淺綠色電梯", 11 | "block.elevatorid.elevator_magenta": "洋紅色電梯", 12 | "block.elevatorid.elevator_orange": "橙色電梯", 13 | "block.elevatorid.elevator_pink": "粉紅色電梯", 14 | "block.elevatorid.elevator_purple": "紫色電梯", 15 | "block.elevatorid.elevator_red": "紅色電梯", 16 | "block.elevatorid.elevator_light_gray": "淺灰色電梯", 17 | "block.elevatorid.elevator_yellow": "黃色電梯", 18 | 19 | "elevatorid.subtitle.teleport": "電梯已使用", 20 | "elevatorid.subtitle.camouflage": "電梯已偽裝", 21 | 22 | "screen.elevatorid.elevator": "電梯選項", 23 | "screen.elevatorid.elevator.directional": "定向", 24 | "screen.elevatorid.elevator.directional_north": "北", 25 | "screen.elevatorid.elevator.directional_east": "東", 26 | "screen.elevatorid.elevator.directional_south": "南", 27 | "screen.elevatorid.elevator.directional_west": "西", 28 | "screen.elevatorid.elevator.hide_arrow": "隱藏箭頭", 29 | "screen.elevatorid.elevator.reset_camo": "移除偽裝", 30 | 31 | "elevatorid.message.missing_xp": "你沒有足夠的經驗使用電梯", 32 | 33 | "itemGroup.elevators_tab": "電梯", 34 | 35 | "tag.item.elevatorid.elevators": "電梯" 36 | } 37 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/arrow.json: -------------------------------------------------------------------------------- 1 | { 2 | "textures": { 3 | "arrow": "elevatorid:block/arrow" 4 | }, 5 | "elements": [ 6 | { 7 | "from": [5, 16.1, 10], 8 | "to": [11, 16.1, 16], 9 | "faces": { 10 | "up": {"texture": "#arrow", "rotation": 270, "uv": [0, 0, 16, 16]} 11 | }, 12 | "__comment": "The arrow (default south)" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_black" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_blue" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_brown" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_cyan" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_gray" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_green" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_light_blue" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_light_gray" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_lime" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_magenta" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_orange" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_pink" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_purple" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_red" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_white" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/block/elevator_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "elevatorid:block/elevator_yellow" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_black" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_blue" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_brown" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_cyan" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_gray" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_green" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_light_blue" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_light_gray" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_lime" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_magenta" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_orange" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_pink" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_purple" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_red" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_white" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/models/item/elevator_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "elevatorid:block/elevator_yellow" 3 | } 4 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/sounds.json: -------------------------------------------------------------------------------- 1 | { 2 | "teleport": { 3 | "category": "block", 4 | "sounds": ["elevatorid:teleport"], 5 | "subtitle": "elevatorid.subtitle.teleport" 6 | }, 7 | "camouflage": { 8 | "category": "block", 9 | "sounds": ["mob/endermen/portal", "mob/endermen/portal2"], 10 | "subtitle": "elevatorid.subtitle.camouflage" 11 | } 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/sounds/teleport.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/sounds/teleport.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/arrow.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_black.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_blue.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_brown.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_cyan.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_gray.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_green.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_light_blue.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_light_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_light_gray.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_lime.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_magenta.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_orange.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_pink.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_purple.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_red.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_white.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/block/elevator_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/block/elevator_yellow.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/elevatorid/textures/gui/elevator_gui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/assets/elevatorid/textures/gui/elevator_gui.png -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_black", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_black" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_blue", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_blue" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_brown", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_brown" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_cyan", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_cyan" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_gray", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_gray" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_green", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_green" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_light_blue", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_light_blue" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_light_gray", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_light_gray" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_lime", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_lime" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_magenta", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_magenta" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_orange", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_orange" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_pink", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_pink" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_purple", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_purple" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_red", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_red" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_white", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_white" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/loot_table/blocks/elevator_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "name": "elevator_yellow", 6 | "rolls": 1, 7 | "entries": [ 8 | { 9 | "type": "minecraft:item", 10 | "name": "elevatorid:elevator_yellow" 11 | } 12 | ], 13 | "conditions": [ 14 | { 15 | "condition": "minecraft:survives_explosion" 16 | } 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:black_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_black" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:blue_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_blue" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:brown_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_brown" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:cyan_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_cyan" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:gray_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_gray" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:green_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_green" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:light_blue_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_light_blue" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:light_gray_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_light_gray" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:lime_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_lime" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:magenta_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_magenta" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:orange_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_orange" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:pink_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_pink" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:purple_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_purple" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:red_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_red" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:white_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_white" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/elevator_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "elevator", 4 | "pattern": [ 5 | "WWW", 6 | "WEW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": "minecraft:yellow_wool", 11 | "E": "minecraft:ender_pearl" 12 | }, 13 | "result": { 14 | "id": "elevatorid:elevator_yellow" 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_black.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/black" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_black" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/blue" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_blue" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_brown.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/brown" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_brown" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_cyan.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/cyan" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_cyan" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/gray" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_gray" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_green.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/green" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_green" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_light_blue.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/light_blue" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_light_blue" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_light_gray.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/light_gray" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_light_gray" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_lime.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/lime" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_lime" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_magenta.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/magenta" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_magenta" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_orange.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/orange" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_orange" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_pink.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/pink" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_pink" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_purple.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/purple" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_purple" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_red.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/red" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_red" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_white.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/white" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_white" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/recipe/redye_yellow.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "group": "elevatorsRedye", 4 | "ingredients": [ 5 | "#elevatorid:elevators", 6 | "#c:dyes/yellow" 7 | ], 8 | "result": { 9 | "id": "elevatorid:elevator_yellow" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/tags/block/elevators.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "elevatorid:elevator_black", 4 | "elevatorid:elevator_blue", 5 | "elevatorid:elevator_brown", 6 | "elevatorid:elevator_cyan", 7 | "elevatorid:elevator_gray", 8 | "elevatorid:elevator_green", 9 | "elevatorid:elevator_light_blue", 10 | "elevatorid:elevator_light_gray", 11 | "elevatorid:elevator_lime", 12 | "elevatorid:elevator_magenta", 13 | "elevatorid:elevator_orange", 14 | "elevatorid:elevator_pink", 15 | "elevatorid:elevator_purple", 16 | "elevatorid:elevator_red", 17 | "elevatorid:elevator_white", 18 | "elevatorid:elevator_yellow" 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/elevatorid/tags/item/elevators.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "elevatorid:elevator_black", 4 | "elevatorid:elevator_blue", 5 | "elevatorid:elevator_brown", 6 | "elevatorid:elevator_cyan", 7 | "elevatorid:elevator_gray", 8 | "elevatorid:elevator_green", 9 | "elevatorid:elevator_light_blue", 10 | "elevatorid:elevator_light_gray", 11 | "elevatorid:elevator_lime", 12 | "elevatorid:elevator_magenta", 13 | "elevatorid:elevator_orange", 14 | "elevatorid:elevator_pink", 15 | "elevatorid:elevator_purple", 16 | "elevatorid:elevator_red", 17 | "elevatorid:elevator_white", 18 | "elevatorid:elevator_yellow" 19 | ] 20 | } -------------------------------------------------------------------------------- /common/src/main/resources/elevatorid.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "com.vsngarcia.mixin", 4 | "compatibilityLevel": "JAVA_21", 5 | "minVersion": "0.8", 6 | "client": [ 7 | ], 8 | "mixins": [ 9 | ], 10 | "injectors": { 11 | "defaultRequire": 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/resources/elevatormod.accesswidener: -------------------------------------------------------------------------------- 1 | accessWidener v2 named 2 | accessible field net/minecraft/client/gui/components/Checkbox selected Z 3 | accessible method net/minecraft/world/level/block/entity/BlockEntityType (Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;Ljava/util/Set;)V 4 | accessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier 5 | -------------------------------------------------------------------------------- /common/src/main/resources/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/common/src/main/resources/logo.png -------------------------------------------------------------------------------- /docs/crafting_base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/docs/crafting_base.png -------------------------------------------------------------------------------- /docs/crafting_redye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/docs/crafting_redye.png -------------------------------------------------------------------------------- /docs/elevator_options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/docs/elevator_options.png -------------------------------------------------------------------------------- /fabric/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.github.johnrengelman.shadow' 3 | } 4 | 5 | loom { 6 | accessWidenerPath = project(":common").loom.accessWidenerPath 7 | } 8 | 9 | architectury { 10 | platformSetupLoomIde() 11 | fabric() 12 | } 13 | 14 | configurations { 15 | common { 16 | canBeResolved = true 17 | canBeConsumed = false 18 | } 19 | compileClasspath.extendsFrom common 20 | runtimeClasspath.extendsFrom common 21 | developmentFabric.extendsFrom common 22 | 23 | // Files in this configuration will be bundled into your mod using the Shadow plugin. 24 | // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. 25 | shadowBundle { 26 | canBeResolved = true 27 | canBeConsumed = false 28 | } 29 | } 30 | 31 | dependencies { 32 | modImplementation "net.fabricmc:fabric-loader:$rootProject.fabric_loader_version" 33 | 34 | // Fabric API. This is technically optional, but you probably want it anyway. 35 | modImplementation "net.fabricmc.fabric-api:fabric-api:$rootProject.fabric_api_version" 36 | 37 | common(project(path: ':common', configuration: 'namedElements')) { transitive false } 38 | shadowBundle project(path: ':common', configuration: 'transformProductionFabric') 39 | 40 | modApi "fuzs.forgeconfigapiport:forgeconfigapiport-fabric:$rootProject.forge_config_api_port_version" 41 | include "fuzs.forgeconfigapiport:forgeconfigapiport-fabric:$rootProject.forge_config_api_port_version" 42 | 43 | // modLocalRuntime "maven.modrinth:modmenu:12.0.0-beta.1" 44 | // modLocalRuntime "maven.modrinth:sodium:mc1.21.2-0.6.0-beta.3-fabric" 45 | } 46 | 47 | processResources { 48 | inputs.property 'version', project.version 49 | 50 | filesMatching('fabric.mod.json') { 51 | expand version: project.version 52 | } 53 | } 54 | 55 | shadowJar { 56 | configurations = [project.configurations.shadowBundle] 57 | archiveClassifier = 'dev-shadow' 58 | } 59 | 60 | remapJar { 61 | injectAccessWidener = true 62 | input.set shadowJar.archiveFile 63 | } 64 | -------------------------------------------------------------------------------- /fabric/src/main/java/com/vsngarcia/fabric/ElevatorBlock.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.fabric; 2 | 3 | import com.mojang.serialization.MapCodec; 4 | import com.mojang.serialization.codecs.RecordCodecBuilder; 5 | import com.vsngarcia.ElevatorBlockBase; 6 | import com.vsngarcia.fabric.tile.ElevatorBlockEntity; 7 | import com.vsngarcia.level.ElevatorBlockEntityBase; 8 | import net.minecraft.core.BlockPos; 9 | import net.minecraft.core.Direction; 10 | import net.minecraft.server.level.ServerLevel; 11 | import net.minecraft.world.entity.player.Player; 12 | import net.minecraft.world.item.DyeColor; 13 | import net.minecraft.world.level.BlockAndTintGetter; 14 | import net.minecraft.world.level.LevelReader; 15 | import net.minecraft.world.level.block.Block; 16 | import net.minecraft.world.level.block.HorizontalDirectionalBlock; 17 | import net.minecraft.world.level.block.entity.BlockEntity; 18 | import net.minecraft.world.level.block.state.BlockState; 19 | import net.minecraft.world.level.block.state.StateDefinition; 20 | import net.minecraft.world.level.block.state.properties.IntegerProperty; 21 | import org.jetbrains.annotations.Nullable; 22 | 23 | public class ElevatorBlock extends ElevatorBlockBase { 24 | private final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance 25 | .group(DyeColor.CODEC.fieldOf("color").forGetter(ElevatorBlockBase::getColor)) 26 | .apply(instance, ElevatorBlock::new) 27 | ); 28 | 29 | public static final IntegerProperty LIGHT = IntegerProperty.create("light", 0, 15); 30 | 31 | public ElevatorBlock(DyeColor color) { 32 | super( 33 | color, 34 | () -> FabricRegistry.ELEVATOR_BLOCK_ENTITY_TYPE, 35 | Properties.of().lightLevel(state -> state.getValue(LIGHT)) 36 | ); 37 | 38 | registerDefaultState(defaultBlockState().setValue(LIGHT, 0)); 39 | } 40 | 41 | @Override 42 | protected void createBlockStateDefinition(StateDefinition.Builder builder) { 43 | super.createBlockStateDefinition(builder); 44 | builder.add(LIGHT); 45 | } 46 | 47 | @Override 48 | protected void openMenu(Player player, ElevatorBlockEntityBase tile, BlockPos pos) { 49 | player.openMenu(tile); 50 | } 51 | 52 | @Override 53 | protected BlockState getAppearance( 54 | BlockState facingState, 55 | LevelReader worldIn, 56 | BlockPos facingPos, 57 | Direction opposite, 58 | BlockState heldState, 59 | BlockPos currentPos 60 | ) { 61 | return facingState.getAppearance(worldIn, facingPos, opposite, heldState, currentPos); 62 | } 63 | 64 | @Override 65 | protected MapCodec codec() { 66 | return CODEC; 67 | } 68 | 69 | @Nullable 70 | @Override 71 | public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { 72 | return new ElevatorBlockEntity(blockPos, blockState); 73 | } 74 | 75 | @Override 76 | public BlockState getAppearance( 77 | BlockState state, 78 | BlockAndTintGetter renderView, 79 | BlockPos pos, 80 | Direction side, 81 | @Nullable BlockState sourceState, 82 | @Nullable BlockPos sourcePos 83 | ) { 84 | if (renderView instanceof ServerLevel) { 85 | return getHeldState(renderView, pos) 86 | .map(s -> s.getAppearance(renderView, pos, side, sourceState, sourcePos)) 87 | .orElse(state); 88 | } 89 | 90 | if (renderView.getBlockEntityRenderData(pos) instanceof BlockState heldState) { 91 | return heldState; 92 | } 93 | 94 | return state; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /fabric/src/main/java/com/vsngarcia/fabric/ElevatorModFabric.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.fabric; 2 | 3 | import com.vsngarcia.Config; 4 | import com.vsngarcia.ElevatorMod; 5 | import com.vsngarcia.fabric.network.NetworkHandler; 6 | import fuzs.forgeconfigapiport.fabric.api.neoforge.v4.NeoForgeConfigRegistry; 7 | import fuzs.forgeconfigapiport.fabric.api.neoforge.v4.NeoForgeModConfigEvents; 8 | import net.fabricmc.api.ModInitializer; 9 | import net.neoforged.fml.config.ModConfig; 10 | 11 | public final class ElevatorModFabric implements ModInitializer { 12 | @Override 13 | public void onInitialize() { 14 | // This code runs as soon as Minecraft is in a mod-load-ready state. 15 | // However, some things (like resources) may still be uninitialized. 16 | // Proceed with mild caution. 17 | 18 | // Run our common setup. 19 | ElevatorMod.init(); 20 | FabricRegistry.init(); 21 | NetworkHandler.init(); 22 | 23 | NeoForgeConfigRegistry.INSTANCE.register(ElevatorMod.ID, ModConfig.Type.SERVER, Config.SPEC); 24 | NeoForgeModConfigEvents.reloading(ElevatorMod.ID).register(cfg -> ElevatorMod.LOGGER.info("Config reloaded")); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /fabric/src/main/java/com/vsngarcia/fabric/FabricRegistry.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.fabric; 2 | 3 | import com.vsngarcia.ElevatorBlockBase; 4 | import com.vsngarcia.ElevatorMod; 5 | import com.vsngarcia.fabric.tile.ElevatorBlockEntity; 6 | import com.vsngarcia.level.ElevatorContainer; 7 | import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; 8 | import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; 9 | import net.minecraft.core.BlockPos; 10 | import net.minecraft.core.Registry; 11 | import net.minecraft.core.registries.BuiltInRegistries; 12 | import net.minecraft.core.registries.Registries; 13 | import net.minecraft.network.RegistryFriendlyByteBuf; 14 | import net.minecraft.network.chat.Component; 15 | import net.minecraft.network.codec.StreamCodec; 16 | import net.minecraft.resources.ResourceLocation; 17 | import net.minecraft.sounds.SoundEvent; 18 | import net.minecraft.world.item.BlockItem; 19 | import net.minecraft.world.item.DyeColor; 20 | import net.minecraft.world.level.block.Block; 21 | import net.minecraft.world.level.block.entity.BlockEntityType; 22 | 23 | import java.util.Arrays; 24 | import java.util.EnumMap; 25 | import java.util.HashSet; 26 | 27 | public class FabricRegistry { 28 | 29 | public static final EnumMap ELEVATOR_BLOCKS = new EnumMap<>(DyeColor.class); 30 | 31 | static { 32 | Arrays.stream(DyeColor.values()).forEach(color -> 33 | ELEVATOR_BLOCKS.put( 34 | color, 35 | Registry.register( 36 | BuiltInRegistries.BLOCK, 37 | ElevatorBlockBase.getResourceLocation(color), 38 | new ElevatorBlock(color) 39 | ) 40 | ) 41 | ); 42 | } 43 | 44 | public static final EnumMap ELEVATOR_ITEMS = new EnumMap<>(DyeColor.class); 45 | 46 | static { 47 | ELEVATOR_BLOCKS.forEach( 48 | (color, block) -> ELEVATOR_ITEMS.put( 49 | color, 50 | Registry.register( 51 | BuiltInRegistries.ITEM, 52 | ElevatorBlockBase.getResourceLocation(color), 53 | new BlockItem(block, new BlockItem.Properties().useBlockDescriptionPrefix().setId( 54 | ElevatorBlockBase.getResourceKey(Registries.ITEM, color) 55 | )) 56 | ) 57 | ) 58 | ); 59 | } 60 | 61 | public static final BlockEntityType ELEVATOR_BLOCK_ENTITY_TYPE = Registry.register( 62 | BuiltInRegistries.BLOCK_ENTITY_TYPE, 63 | ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "elevator_tile"), 64 | new BlockEntityType<>(ElevatorBlockEntity::new, new HashSet<>(ELEVATOR_BLOCKS.values())) 65 | ); 66 | 67 | public static ExtendedScreenHandlerType ELEVATOR_CONTAINER = null; 68 | 69 | static { 70 | ELEVATOR_CONTAINER = new ExtendedScreenHandlerType<>( 71 | (syncId, inventory, data) -> new ElevatorContainer( 72 | ELEVATOR_CONTAINER, 73 | syncId, 74 | data.pos(), 75 | inventory.player 76 | ), 77 | ElevatorContainerData.CODEC 78 | ); 79 | 80 | Registry.register( 81 | BuiltInRegistries.MENU, 82 | ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "elevator_container"), 83 | ELEVATOR_CONTAINER 84 | ); 85 | } 86 | 87 | public static final SoundEvent TELEPORT_SOUND = Registry.register( 88 | BuiltInRegistries.SOUND_EVENT, 89 | ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "teleport"), 90 | SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "teleport")) 91 | ); 92 | 93 | public static final SoundEvent CAMOUFLAGE_SOUND = Registry.register( 94 | BuiltInRegistries.SOUND_EVENT, 95 | ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "camouflage"), 96 | SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "camouflage")) 97 | ); 98 | 99 | static { 100 | Registry.register( 101 | BuiltInRegistries.CREATIVE_MODE_TAB, 102 | ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "elevators_tab"), 103 | FabricItemGroup.builder() 104 | .icon(() -> ELEVATOR_BLOCKS.get(DyeColor.WHITE).asItem().getDefaultInstance()) 105 | .displayItems((params, output) -> ELEVATOR_ITEMS.values().forEach(output::accept)) 106 | .title(Component.translatable("itemGroup.elevators_tab")) 107 | .build() 108 | ); 109 | } 110 | 111 | public static void init() { 112 | // Register our items and blocks here. 113 | } 114 | 115 | public record ElevatorContainerData(BlockPos pos) { 116 | public static final StreamCodec CODEC = 117 | StreamCodec.composite(BlockPos.STREAM_CODEC, ElevatorContainerData::pos, ElevatorContainerData::new); 118 | } 119 | } 120 | 121 | -------------------------------------------------------------------------------- /fabric/src/main/java/com/vsngarcia/fabric/client/ElevatorModFabricClient.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.fabric.client; 2 | 3 | import com.vsngarcia.ElevatorHandler; 4 | import com.vsngarcia.ElevatorMod; 5 | import com.vsngarcia.client.ColorCamoElevator; 6 | import com.vsngarcia.client.gui.ElevatorScreen; 7 | import com.vsngarcia.fabric.client.render.ElevatorBakedModel; 8 | import com.vsngarcia.level.ElevatorContainer; 9 | import net.fabricmc.api.ClientModInitializer; 10 | import net.fabricmc.api.EnvType; 11 | import net.fabricmc.api.Environment; 12 | import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; 13 | import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; 14 | import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier; 15 | import net.fabricmc.fabric.api.client.model.loading.v1.WrapperGroupableModel; 16 | import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 17 | import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; 18 | import net.minecraft.client.gui.screens.MenuScreens; 19 | import net.minecraft.client.resources.model.BakedModel; 20 | import net.minecraft.client.resources.model.ModelBaker; 21 | import net.minecraft.client.resources.model.ModelResourceLocation; 22 | import net.minecraft.network.chat.Component; 23 | import net.minecraft.resources.ResourceLocation; 24 | import net.minecraft.world.entity.player.Inventory; 25 | import net.minecraft.world.level.block.Block; 26 | 27 | import static com.vsngarcia.fabric.FabricRegistry.ELEVATOR_BLOCKS; 28 | import static com.vsngarcia.fabric.FabricRegistry.ELEVATOR_CONTAINER; 29 | 30 | @Environment(EnvType.CLIENT) 31 | public final class ElevatorModFabricClient implements ClientModInitializer { 32 | @Override 33 | public void onInitializeClient() { 34 | ClientTickEvents.END_CLIENT_TICK.register(client -> ElevatorHandler.handleInput(ClientPlayNetworking::send)); 35 | 36 | ColorProviderRegistry.BLOCK.register( 37 | new ColorCamoElevator(), 38 | ELEVATOR_BLOCKS.values().toArray(new Block[0]) 39 | ); 40 | ModelLoadingPlugin.register(new ElevatorModelLoadingPlugin()); 41 | 42 | MenuScreens.register( 43 | ELEVATOR_CONTAINER, 44 | (ElevatorContainer container, Inventory inv, Component title) -> 45 | new ElevatorScreen(container, inv, title, ClientPlayNetworking::send) 46 | ); 47 | } 48 | 49 | public static class ElevatorModelLoadingPlugin implements ModelLoadingPlugin { 50 | @Override 51 | public void initialize(Context ctx) { 52 | ctx.modifyBlockModelOnLoad().register( 53 | ModelModifier.WRAP_PHASE, 54 | (model, context) -> { 55 | ModelResourceLocation location = context.id(); 56 | if (location == null || "inventory".equals(location.variant())) { 57 | return model; 58 | } 59 | 60 | var modelId = location.id(); 61 | if (!ElevatorMod.ID.equals(modelId.getNamespace()) || 62 | !modelId.getPath().startsWith("elevator_")) { 63 | return model; 64 | } 65 | 66 | ElevatorMod.LOGGER.debug("Wrapping elevator model: {}", modelId); 67 | return new WrapperGroupableModel(model) { 68 | 69 | // @Override 70 | // public void resolveDependencies(Resolver resolver) { 71 | // super.resolveDependencies(resolver); 72 | // resolver.resolve(location.id()); 73 | // } 74 | 75 | @Override 76 | public BakedModel bake(ModelBaker baker) { 77 | return new ElevatorBakedModel(model.bake(baker)); 78 | } 79 | }; 80 | } 81 | ); 82 | 83 | ctx.addModels(ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "arrow")); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /fabric/src/main/java/com/vsngarcia/fabric/client/render/ElevatorBakedModel.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.fabric.client.render; 2 | 3 | import com.vsngarcia.ElevatorMod; 4 | import net.fabricmc.api.EnvType; 5 | import net.fabricmc.api.Environment; 6 | import net.fabricmc.fabric.api.renderer.v1.Renderer; 7 | import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; 8 | import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; 9 | import net.minecraft.client.Minecraft; 10 | import net.minecraft.client.renderer.ItemBlockRenderTypes; 11 | import net.minecraft.client.resources.model.BakedModel; 12 | import net.minecraft.client.resources.model.DelegateBakedModel; 13 | import net.minecraft.core.BlockPos; 14 | import net.minecraft.core.Direction; 15 | import net.minecraft.resources.ResourceLocation; 16 | import net.minecraft.util.RandomSource; 17 | import net.minecraft.world.level.BlockAndTintGetter; 18 | import net.minecraft.world.level.block.state.BlockState; 19 | import org.jetbrains.annotations.Nullable; 20 | import org.joml.Vector3f; 21 | 22 | import java.util.function.Predicate; 23 | import java.util.function.Supplier; 24 | 25 | import static com.vsngarcia.fabric.ElevatorBlock.DIRECTIONAL; 26 | import static com.vsngarcia.fabric.ElevatorBlock.SHOW_ARROW; 27 | import static net.minecraft.world.level.block.HorizontalDirectionalBlock.FACING; 28 | 29 | @Environment(EnvType.CLIENT) 30 | public class ElevatorBakedModel extends DelegateBakedModel { 31 | private static final Minecraft MC = Minecraft.getInstance(); 32 | 33 | public ElevatorBakedModel(BakedModel originalModel) { 34 | super(originalModel); 35 | } 36 | 37 | @Override 38 | public boolean isVanillaAdapter() { 39 | return false; 40 | } 41 | 42 | @Override 43 | public void emitBlockQuads( 44 | QuadEmitter emitter, 45 | BlockAndTintGetter blockView, 46 | BlockState state, 47 | BlockPos pos, 48 | Supplier randomSupplier, 49 | Predicate<@Nullable Direction> cullTest 50 | ) { 51 | if (state != null && state.getValue(DIRECTIONAL) && state.getValue(SHOW_ARROW)) { 52 | emitter.pushTransform( 53 | quad -> { 54 | quad.material( 55 | Renderer.get() 56 | .materialFinder() 57 | .blendMode(BlendMode.CUTOUT) 58 | .find() 59 | ); 60 | 61 | Vector3f vec = null; 62 | for (int i = 0; i < 4; i++) { 63 | vec = quad.copyPos(i, vec); 64 | vec.sub(.5f, 0, .5f); 65 | vec.rotateY((float) Math.toRadians(-state.getValue(FACING).toYRot())); 66 | vec.add(.5f, 0, .5f); 67 | 68 | quad.pos(i, vec); 69 | } 70 | return true; 71 | } 72 | ); 73 | 74 | MC.getModelManager() 75 | .getModel(ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "arrow")) 76 | .emitBlockQuads(emitter, blockView, state, pos, randomSupplier, cullTest); 77 | emitter.popTransform(); 78 | } 79 | 80 | if (blockView.getBlockEntityRenderData(pos) instanceof BlockState heldState) { 81 | // ElevatorMod.LOGGER.warn("Found held state for elevator at {}", pos); 82 | 83 | emitter.pushTransform( 84 | quad -> { 85 | quad.material( 86 | Renderer.get() 87 | .materialFinder() 88 | .blendMode(BlendMode.fromRenderLayer( 89 | ItemBlockRenderTypes.getChunkRenderType(heldState) 90 | )) 91 | .find() 92 | ); 93 | 94 | return true; 95 | } 96 | ); 97 | 98 | MC.getBlockRenderer().getBlockModel(heldState) 99 | .emitBlockQuads(emitter, blockView, heldState, pos, randomSupplier, cullTest); 100 | 101 | emitter.popTransform(); 102 | return; 103 | } 104 | 105 | // ElevatorMod.LOGGER.warn("No held state found for elevator at {}", pos); 106 | super.emitBlockQuads(emitter, blockView, state, pos, randomSupplier, cullTest); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /fabric/src/main/java/com/vsngarcia/fabric/network/NetworkHandler.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.fabric.network; 2 | 3 | import com.vsngarcia.fabric.FabricRegistry; 4 | import com.vsngarcia.network.TeleportPacket; 5 | import com.vsngarcia.network.client.RemoveCamoPacket; 6 | import com.vsngarcia.network.client.SetArrowPacket; 7 | import com.vsngarcia.network.client.SetDirectionalPacket; 8 | import com.vsngarcia.network.client.SetFacingPacket; 9 | import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; 10 | import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 11 | 12 | 13 | public class NetworkHandler { 14 | 15 | 16 | public static void init() { 17 | PayloadTypeRegistry.playC2S().register(TeleportPacket.TYPE, TeleportPacket.STREAM_CODEC); 18 | ServerPlayNetworking.registerGlobalReceiver( 19 | TeleportPacket.TYPE, 20 | (pkt, ctx) -> TeleportPacket.handle(pkt, ctx.player(), FabricRegistry.TELEPORT_SOUND) 21 | ); 22 | 23 | PayloadTypeRegistry.playC2S().register(SetDirectionalPacket.TYPE, SetDirectionalPacket.STREAM_CODEC); 24 | ServerPlayNetworking.registerGlobalReceiver( 25 | SetDirectionalPacket.TYPE, 26 | (pkt, ctx) -> SetDirectionalPacket.handle(pkt, ctx.player()) 27 | ); 28 | 29 | PayloadTypeRegistry.playC2S().register(SetArrowPacket.TYPE, SetArrowPacket.STREAM_CODEC); 30 | ServerPlayNetworking.registerGlobalReceiver( 31 | SetArrowPacket.TYPE, 32 | (pkt, ctx) -> SetArrowPacket.handle(pkt, ctx.player()) 33 | ); 34 | 35 | PayloadTypeRegistry.playC2S().register(RemoveCamoPacket.TYPE, RemoveCamoPacket.STREAM_CODEC); 36 | ServerPlayNetworking.registerGlobalReceiver( 37 | RemoveCamoPacket.TYPE, 38 | (pkt, ctx) -> RemoveCamoPacket.handle(pkt, ctx.player()) 39 | ); 40 | 41 | PayloadTypeRegistry.playC2S().register(SetFacingPacket.TYPE, SetFacingPacket.STREAM_CODEC); 42 | ServerPlayNetworking.registerGlobalReceiver( 43 | SetFacingPacket.TYPE, 44 | (pkt, ctx) -> SetFacingPacket.handle(pkt, ctx.player()) 45 | ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /fabric/src/main/java/com/vsngarcia/fabric/tile/ElevatorBlockEntity.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.fabric.tile; 2 | 3 | import com.vsngarcia.fabric.ElevatorBlock; 4 | import com.vsngarcia.fabric.FabricRegistry; 5 | import com.vsngarcia.level.ElevatorBlockEntityBase; 6 | import com.vsngarcia.level.ElevatorContainer; 7 | import net.fabricmc.fabric.api.blockview.v2.RenderDataBlockEntity; 8 | import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; 9 | import net.minecraft.core.BlockPos; 10 | import net.minecraft.server.level.ServerPlayer; 11 | import net.minecraft.sounds.SoundEvent; 12 | import net.minecraft.world.entity.player.Inventory; 13 | import net.minecraft.world.entity.player.Player; 14 | import net.minecraft.world.inventory.AbstractContainerMenu; 15 | import net.minecraft.world.level.block.state.BlockState; 16 | import org.jetbrains.annotations.Nullable; 17 | 18 | 19 | public class ElevatorBlockEntity extends ElevatorBlockEntityBase implements RenderDataBlockEntity, ExtendedScreenHandlerFactory { 20 | public ElevatorBlockEntity(BlockPos pos, BlockState state) { 21 | super(FabricRegistry.ELEVATOR_BLOCK_ENTITY_TYPE, pos, state); 22 | } 23 | 24 | @Override 25 | protected SoundEvent camouflageSound() { 26 | return FabricRegistry.CAMOUFLAGE_SOUND; 27 | } 28 | 29 | @Nullable 30 | @Override 31 | public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) { 32 | return new ElevatorContainer(FabricRegistry.ELEVATOR_CONTAINER, id, worldPosition, player); 33 | } 34 | 35 | @Override 36 | public @Nullable Object getRenderData() { 37 | return heldState; 38 | } 39 | 40 | @Override 41 | public FabricRegistry.ElevatorContainerData getScreenOpeningData(ServerPlayer player) { 42 | return new FabricRegistry.ElevatorContainerData(worldPosition); 43 | } 44 | 45 | @Override 46 | public void setChanged() { 47 | super.setChanged(); 48 | 49 | if (level != null) { 50 | level.setBlock( 51 | worldPosition, 52 | getBlockState().setValue(ElevatorBlock.LIGHT, heldState != null ? heldState.getLightEmission() : 0), 53 | ElevatorBlock.UPDATE_ALL 54 | ); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /fabric/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "elevatorid", 4 | "version": "${version}", 5 | "name": "ElevatorMod", 6 | "description": "Simple port of the elevator from OpenBlocks to 1.8+", 7 | "authors": [ 8 | "VsnGamer" 9 | ], 10 | "contact": { 11 | "sources": "https://github.com/VsnGamer/ElevatorMod" 12 | }, 13 | "license": "MIT", 14 | "icon": "logo.png", 15 | "environment": "*", 16 | "entrypoints": { 17 | "main": [ 18 | "com.vsngarcia.fabric.ElevatorModFabric" 19 | ], 20 | "client": [ 21 | "com.vsngarcia.fabric.client.ElevatorModFabricClient" 22 | ] 23 | }, 24 | "mixins": [ 25 | "elevatorid.mixins.json" 26 | ], 27 | "depends": { 28 | "fabricloader": ">=0.16.0", 29 | "minecraft": "~1.21.3", 30 | "java": ">=21", 31 | "fabric-api": "*", 32 | "forgeconfigapiport": ">=21.4.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2G 2 | org.gradle.parallel=true 3 | 4 | 5 | minecraft_version=1.21.4 6 | 7 | # Mod properties 8 | mod_version=1.21.4-1.13.3 9 | maven_group=com.vsngarcia 10 | archives_name=elevatorid 11 | enabled_platforms=fabric,neoforge 12 | 13 | # Dependencies 14 | fabric_loader_version=0.16.9 15 | fabric_api_version=0.112.0+1.21.4 16 | neoforge_version=21.4.22-beta 17 | 18 | forge_config_api_port_version=21.4.1 19 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VsnGamer/ElevatorMod/6dd5255bb41e4a9caeff12e3a0846212ba5cd11d/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | # This is normally unused 84 | # shellcheck disable=SC2034 85 | APP_BASE_NAME=${0##*/} 86 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 87 | APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit 88 | 89 | # Use the maximum available, or set MAX_FD != -1 to use that value. 90 | MAX_FD=maximum 91 | 92 | warn () { 93 | echo "$*" 94 | } >&2 95 | 96 | die () { 97 | echo 98 | echo "$*" 99 | echo 100 | exit 1 101 | } >&2 102 | 103 | # OS specific support (must be 'true' or 'false'). 104 | cygwin=false 105 | msys=false 106 | darwin=false 107 | nonstop=false 108 | case "$( uname )" in #( 109 | CYGWIN* ) cygwin=true ;; #( 110 | Darwin* ) darwin=true ;; #( 111 | MSYS* | MINGW* ) msys=true ;; #( 112 | NONSTOP* ) nonstop=true ;; 113 | esac 114 | 115 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 116 | 117 | 118 | # Determine the Java command to use to start the JVM. 119 | if [ -n "$JAVA_HOME" ] ; then 120 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 121 | # IBM's JDK on AIX uses strange locations for the executables 122 | JAVACMD=$JAVA_HOME/jre/sh/java 123 | else 124 | JAVACMD=$JAVA_HOME/bin/java 125 | fi 126 | if [ ! -x "$JAVACMD" ] ; then 127 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 128 | 129 | Please set the JAVA_HOME variable in your environment to match the 130 | location of your Java installation." 131 | fi 132 | else 133 | JAVACMD=java 134 | if ! command -v java >/dev/null 2>&1 135 | then 136 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137 | 138 | Please set the JAVA_HOME variable in your environment to match the 139 | location of your Java installation." 140 | fi 141 | fi 142 | 143 | # Increase the maximum file descriptors if we can. 144 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 145 | case $MAX_FD in #( 146 | max*) 147 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 148 | # shellcheck disable=SC2039,SC3045 149 | MAX_FD=$( ulimit -H -n ) || 150 | warn "Could not query maximum file descriptor limit" 151 | esac 152 | case $MAX_FD in #( 153 | '' | soft) :;; #( 154 | *) 155 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 156 | # shellcheck disable=SC2039,SC3045 157 | ulimit -n "$MAX_FD" || 158 | warn "Could not set maximum file descriptor limit to $MAX_FD" 159 | esac 160 | fi 161 | 162 | # Collect all arguments for the java command, stacking in reverse order: 163 | # * args from the command line 164 | # * the main class name 165 | # * -classpath 166 | # * -D...appname settings 167 | # * --module-path (only if needed) 168 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 169 | 170 | # For Cygwin or MSYS, switch paths to Windows format before running java 171 | if "$cygwin" || "$msys" ; then 172 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 173 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 174 | 175 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 176 | 177 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 178 | for arg do 179 | if 180 | case $arg in #( 181 | -*) false ;; # don't mess with options #( 182 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 183 | [ -e "$t" ] ;; #( 184 | *) false ;; 185 | esac 186 | then 187 | arg=$( cygpath --path --ignore --mixed "$arg" ) 188 | fi 189 | # Roll the args list around exactly as many times as the number of 190 | # args, so each arg winds up back in the position where it started, but 191 | # possibly modified. 192 | # 193 | # NB: a `for` loop captures its iteration list before it begins, so 194 | # changing the positional parameters here affects neither the number of 195 | # iterations, nor the values presented in `arg`. 196 | shift # remove old arg 197 | set -- "$@" "$arg" # push replacement arg 198 | done 199 | fi 200 | 201 | 202 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 203 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 204 | 205 | # Collect all arguments for the java command: 206 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, 207 | # and any embedded shellness will be escaped. 208 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be 209 | # treated as '${Hostname}' itself on the command line. 210 | 211 | set -- \ 212 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 213 | -classpath "$CLASSPATH" \ 214 | org.gradle.wrapper.GradleWrapperMain \ 215 | "$@" 216 | 217 | # Stop when "xargs" is not available. 218 | if ! command -v xargs >/dev/null 2>&1 219 | then 220 | die "xargs is not available" 221 | fi 222 | 223 | # Use "xargs" to parse quoted args. 224 | # 225 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 226 | # 227 | # In Bash we could simply go: 228 | # 229 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 230 | # set -- "${ARGS[@]}" "$@" 231 | # 232 | # but POSIX shell has neither arrays nor command substitution, so instead we 233 | # post-process each arg (as a line of input to sed) to backslash-escape any 234 | # character that might be a shell metacharacter, then use eval to reverse 235 | # that process (while maintaining the separation between arguments), and wrap 236 | # the whole thing up as a single "set" statement. 237 | # 238 | # This will of course break if any of these variables contains a newline or 239 | # an unmatched quote. 240 | # 241 | 242 | eval "set -- $( 243 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 244 | xargs -n1 | 245 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 246 | tr '\n' ' ' 247 | )" '"$@"' 248 | 249 | exec "$JAVACMD" "$@" 250 | -------------------------------------------------------------------------------- /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 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 1>&2 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 48 | echo. 1>&2 49 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 50 | echo location of your Java installation. 1>&2 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 1>&2 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 62 | echo. 1>&2 63 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 64 | echo location of your Java installation. 1>&2 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /neoforge/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.github.johnrengelman.shadow' 3 | } 4 | 5 | loom { 6 | accessWidenerPath = project(":common").loom.accessWidenerPath 7 | } 8 | 9 | architectury { 10 | platformSetupLoomIde() 11 | neoForge() 12 | } 13 | 14 | configurations { 15 | common { 16 | canBeResolved = true 17 | canBeConsumed = false 18 | } 19 | compileClasspath.extendsFrom common 20 | runtimeClasspath.extendsFrom common 21 | developmentNeoForge.extendsFrom common 22 | 23 | // Files in this configuration will be bundled into your mod using the Shadow plugin. 24 | // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. 25 | shadowBundle { 26 | canBeResolved = true 27 | canBeConsumed = false 28 | } 29 | } 30 | 31 | repositories { 32 | maven { 33 | name = 'NeoForged' 34 | url = 'https://maven.neoforged.net/releases' 35 | } 36 | } 37 | 38 | dependencies { 39 | neoForge "net.neoforged:neoforge:$rootProject.neoforge_version" 40 | 41 | common(project(path: ':common', configuration: 'namedElements')) { transitive false } 42 | shadowBundle project(path: ':common', configuration: 'transformProductionNeoForge') 43 | } 44 | 45 | processResources { 46 | inputs.property 'version', project.version 47 | 48 | filesMatching('META-INF/neoforge.mods.toml') { 49 | expand version: project.version 50 | } 51 | } 52 | 53 | shadowJar { 54 | configurations = [project.configurations.shadowBundle] 55 | archiveClassifier = 'dev-shadow' 56 | } 57 | 58 | remapJar { 59 | atAccessWideners.add "elevatormod.accesswidener" 60 | input.set shadowJar.archiveFile 61 | } 62 | -------------------------------------------------------------------------------- /neoforge/gradle.properties: -------------------------------------------------------------------------------- 1 | loom.platform=neoforge 2 | -------------------------------------------------------------------------------- /neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorBlock.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.neoforge; 2 | 3 | import com.mojang.serialization.MapCodec; 4 | import com.mojang.serialization.codecs.RecordCodecBuilder; 5 | import com.vsngarcia.ElevatorBlockBase; 6 | import com.vsngarcia.level.ElevatorBlockEntityBase; 7 | import com.vsngarcia.neoforge.client.render.ElevatorBakedModel; 8 | import com.vsngarcia.neoforge.init.Registry; 9 | import com.vsngarcia.neoforge.tile.ElevatorBlockEntity; 10 | import net.minecraft.core.BlockPos; 11 | import net.minecraft.core.Direction; 12 | import net.minecraft.server.level.ServerLevel; 13 | import net.minecraft.world.entity.Entity; 14 | import net.minecraft.world.entity.player.Player; 15 | import net.minecraft.world.item.DyeColor; 16 | import net.minecraft.world.level.BlockAndTintGetter; 17 | import net.minecraft.world.level.BlockGetter; 18 | import net.minecraft.world.level.LevelReader; 19 | import net.minecraft.world.level.SignalGetter; 20 | import net.minecraft.world.level.block.HorizontalDirectionalBlock; 21 | import net.minecraft.world.level.block.SoundType; 22 | import net.minecraft.world.level.block.entity.BlockEntity; 23 | import net.minecraft.world.level.block.state.BlockState; 24 | import net.neoforged.neoforge.client.model.data.ModelData; 25 | 26 | import java.util.Optional; 27 | 28 | public class ElevatorBlock extends ElevatorBlockBase { 29 | 30 | private final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance 31 | .group(DyeColor.CODEC.fieldOf("color").forGetter(ElevatorBlockBase::getColor)) 32 | .apply(instance, ElevatorBlock::new) 33 | ); 34 | 35 | public ElevatorBlock(DyeColor color) { 36 | super(color, Registry.ELEVATOR_TILE_ENTITY::get); 37 | } 38 | 39 | @Override 40 | protected MapCodec codec() { 41 | return CODEC; 42 | } 43 | 44 | @Override 45 | public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { 46 | return new ElevatorBlockEntity(pos, state); 47 | } 48 | 49 | @Override 50 | protected void openMenu(Player player, ElevatorBlockEntityBase tile, BlockPos pos) { 51 | player.openMenu(tile, pos); 52 | } 53 | 54 | @Override 55 | public boolean collisionExtendsVertically( 56 | BlockState state, 57 | BlockGetter level, 58 | BlockPos pos, 59 | Entity collidingEntity 60 | ) { 61 | return getHeldState(level, pos) 62 | .map(s -> s.collisionExtendsVertically(level, pos, collidingEntity)) 63 | .orElse(super.collisionExtendsVertically(state, level, pos, collidingEntity)); 64 | } 65 | 66 | @Override 67 | public float getFriction(BlockState state, LevelReader level, BlockPos pos, Entity entity) { 68 | return getHeldState(level, pos) 69 | .map(s -> s.getFriction(level, pos, entity)) 70 | .orElse(super.getFriction(state, level, pos, entity)); 71 | } 72 | 73 | @Override 74 | public BlockState getAppearance( 75 | BlockState state, 76 | BlockAndTintGetter level, 77 | BlockPos pos, 78 | Direction side, 79 | BlockState queryState, 80 | BlockPos queryPos 81 | ) { 82 | if (level instanceof ServerLevel) { 83 | return getHeldState(level, pos) 84 | .map(s -> s.getAppearance(level, pos, side, queryState, queryPos)) 85 | .orElse(super.getAppearance(state, level, pos, side, queryState, queryPos)); 86 | } 87 | 88 | var data = level.getModelData(pos); 89 | if (data == ModelData.EMPTY) { 90 | return super.getAppearance(state, level, pos, side, queryState, queryPos); 91 | } 92 | 93 | var heldState = data.get(ElevatorBakedModel.HELD_STATE); 94 | if (heldState == null) { 95 | return super.getAppearance(state, level, pos, side, queryState, queryPos); 96 | } 97 | 98 | return heldState.getAppearance(level, pos, side, queryState, queryPos); 99 | } 100 | 101 | 102 | @Override 103 | protected BlockState getAppearance( 104 | BlockState facingState, 105 | LevelReader worldIn, 106 | BlockPos facingPos, 107 | Direction opposite, 108 | BlockState heldState, 109 | BlockPos currentPos 110 | ) { 111 | return facingState.getAppearance(worldIn, facingPos, opposite, heldState, currentPos); 112 | } 113 | 114 | @Override 115 | public boolean supportsExternalFaceHiding(BlockState state) { 116 | return true; 117 | } 118 | 119 | @Override 120 | public boolean hidesNeighborFace( 121 | BlockGetter level, 122 | BlockPos pos, 123 | BlockState state, 124 | BlockState neighborState, 125 | Direction dir 126 | ) { 127 | var modelData = level.getModelData(pos); 128 | if (modelData == ModelData.EMPTY) { 129 | return super.hidesNeighborFace(level, pos, state, neighborState, dir); 130 | } 131 | 132 | var heldState = modelData.get(ElevatorBakedModel.HELD_STATE); 133 | if (heldState == null) { 134 | return super.hidesNeighborFace(level, pos, state, neighborState, dir); 135 | } 136 | 137 | var neighborModelData = level.getModelData(pos.relative(dir)); 138 | if (neighborModelData == ModelData.EMPTY) { 139 | return heldState.skipRendering(neighborState, dir); 140 | } 141 | 142 | var neighborHeldState = neighborModelData.get(ElevatorBakedModel.HELD_STATE); 143 | return heldState.skipRendering(neighborHeldState != null ? neighborHeldState : neighborState, dir); 144 | } 145 | 146 | @Override 147 | public boolean hasDynamicLightEmission(BlockState state) { 148 | return true; 149 | } 150 | 151 | @Override 152 | public int getLightEmission(BlockState state, BlockGetter level, BlockPos pos) { 153 | return Optional.ofNullable(level.getAuxLightManager(pos)).map(lm -> lm.getLightAt(pos)).orElse(0); 154 | } 155 | 156 | @Override 157 | public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { 158 | return getHeldState(level, pos) 159 | .map(s -> s.getBlock().canConnectRedstone(s, level, pos, direction)) 160 | .orElse(super.canConnectRedstone(state, level, pos, direction)); 161 | } 162 | 163 | @Override 164 | public boolean shouldCheckWeakPower(BlockState state, SignalGetter level, BlockPos pos, Direction side) { 165 | return getHeldState(level, pos) 166 | .map(s -> s.shouldCheckWeakPower(level, pos, side)) 167 | .orElse(super.shouldCheckWeakPower(state, level, pos, side)); 168 | } 169 | 170 | @Override 171 | public SoundType getSoundType(BlockState state, LevelReader level, BlockPos pos, Entity entity) { 172 | return getHeldState(level, pos) 173 | .map(s -> s.getSoundType(level, pos, entity)) 174 | .orElse(super.getSoundType(state, level, pos, entity)); 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /neoforge/src/main/java/com/vsngarcia/neoforge/ElevatorModNeoForge.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.neoforge; 2 | 3 | import com.vsngarcia.Config; 4 | import com.vsngarcia.ElevatorHandler; 5 | import com.vsngarcia.ElevatorMod; 6 | import com.vsngarcia.neoforge.init.Registry; 7 | import net.neoforged.bus.api.IEventBus; 8 | import net.neoforged.fml.ModContainer; 9 | import net.neoforged.fml.common.Mod; 10 | import net.neoforged.fml.config.ModConfig; 11 | import net.neoforged.fml.event.config.ModConfigEvent; 12 | import net.neoforged.neoforge.client.event.InputEvent; 13 | import net.neoforged.neoforge.common.NeoForge; 14 | import net.neoforged.neoforge.network.PacketDistributor; 15 | 16 | @Mod(ElevatorMod.ID) 17 | public final class ElevatorModNeoForge { 18 | public ElevatorModNeoForge(IEventBus eventBus, ModContainer container) { 19 | ElevatorMod.init(); 20 | 21 | Registry.init(eventBus); 22 | eventBus.addListener((ModConfigEvent.Reloading event) -> ElevatorMod.LOGGER.info("Config reloaded")); 23 | 24 | NeoForge.EVENT_BUS.addListener( 25 | (InputEvent.Key e) -> ElevatorHandler.handleInput(PacketDistributor::sendToServer) 26 | ); 27 | NeoForge.EVENT_BUS.addListener( 28 | (InputEvent.MouseButton.Post e) -> ElevatorHandler.handleInput(PacketDistributor::sendToServer) 29 | ); 30 | 31 | container.registerConfig(ModConfig.Type.SERVER, Config.SPEC); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /neoforge/src/main/java/com/vsngarcia/neoforge/client/ClientRegistry.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.neoforge.client; 2 | 3 | import com.vsngarcia.ElevatorMod; 4 | import com.vsngarcia.client.ColorCamoElevator; 5 | import com.vsngarcia.client.gui.ElevatorScreen; 6 | import com.vsngarcia.level.ElevatorContainer; 7 | import com.vsngarcia.neoforge.ElevatorBlock; 8 | import com.vsngarcia.neoforge.client.render.ElevatorBakedModel; 9 | import com.vsngarcia.neoforge.init.Registry; 10 | import net.minecraft.network.chat.Component; 11 | import net.minecraft.resources.ResourceLocation; 12 | import net.minecraft.world.entity.player.Inventory; 13 | import net.neoforged.api.distmarker.Dist; 14 | import net.neoforged.bus.api.SubscribeEvent; 15 | import net.neoforged.fml.common.EventBusSubscriber; 16 | import net.neoforged.neoforge.client.event.ModelEvent; 17 | import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; 18 | import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; 19 | import net.neoforged.neoforge.network.PacketDistributor; 20 | import net.neoforged.neoforge.registries.DeferredHolder; 21 | 22 | 23 | @EventBusSubscriber(modid = ElevatorMod.ID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) 24 | public class ClientRegistry { 25 | @SubscribeEvent 26 | public static void onMenuScreensRegistry(RegisterMenuScreensEvent e) { 27 | e.register( 28 | Registry.ELEVATOR_CONTAINER.get(), 29 | (ElevatorContainer container, Inventory inv, Component title) -> 30 | new ElevatorScreen(container, inv, title, PacketDistributor::sendToServer) 31 | ); 32 | } 33 | 34 | @SubscribeEvent 35 | public static void onBlockColorHandlersRegistry(RegisterColorHandlersEvent.Block e) { 36 | e.register( 37 | new ColorCamoElevator(), 38 | Registry.ELEVATOR_BLOCKS.values().stream().map(DeferredHolder::get).toArray(ElevatorBlock[]::new) 39 | ); 40 | } 41 | 42 | @SubscribeEvent 43 | public static void onModelRegistry(ModelEvent.RegisterAdditional e) { 44 | e.register(ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "arrow")); 45 | } 46 | 47 | @SubscribeEvent 48 | public static void onModelBake(ModelEvent.ModifyBakingResult e) { 49 | e.getBakingResult().blockStateModels().entrySet().stream() 50 | .filter(entry -> ElevatorMod.ID.equals(entry.getKey().id().getNamespace()) && 51 | entry.getKey().id().getPath().contains("elevator_")) 52 | .forEach(entry -> e.getBakingResult() 53 | .blockStateModels() 54 | .put(entry.getKey(), new ElevatorBakedModel(entry.getValue()))); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /neoforge/src/main/java/com/vsngarcia/neoforge/client/render/ElevatorBakedModel.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.neoforge.client.render; 2 | 3 | import com.vsngarcia.ElevatorMod; 4 | import com.vsngarcia.neoforge.ElevatorBlock; 5 | import net.minecraft.client.Minecraft; 6 | import net.minecraft.client.renderer.RenderType; 7 | import net.minecraft.client.renderer.block.BlockRenderDispatcher; 8 | import net.minecraft.client.renderer.block.model.BakedQuad; 9 | import net.minecraft.client.renderer.texture.TextureAtlasSprite; 10 | import net.minecraft.client.resources.model.BakedModel; 11 | import net.minecraft.client.resources.model.BlockModelRotation; 12 | import net.minecraft.client.resources.model.DelegateBakedModel; 13 | import net.minecraft.core.Direction; 14 | import net.minecraft.resources.ResourceLocation; 15 | import net.minecraft.util.RandomSource; 16 | import net.minecraft.world.level.block.state.BlockState; 17 | import net.neoforged.neoforge.client.ChunkRenderTypeSet; 18 | import net.neoforged.neoforge.client.model.IQuadTransformer; 19 | import net.neoforged.neoforge.client.model.QuadTransformers; 20 | import net.neoforged.neoforge.client.model.data.ModelData; 21 | import net.neoforged.neoforge.client.model.data.ModelProperty; 22 | import org.jetbrains.annotations.NotNull; 23 | 24 | import javax.annotation.Nonnull; 25 | import javax.annotation.Nullable; 26 | import java.util.ArrayList; 27 | import java.util.List; 28 | 29 | 30 | public class ElevatorBakedModel extends DelegateBakedModel { 31 | 32 | public static final ModelProperty HELD_STATE = new ModelProperty<>(); 33 | 34 | public ElevatorBakedModel(BakedModel originalModel) { 35 | super(originalModel); 36 | } 37 | 38 | @Nonnull 39 | @Override 40 | public TextureAtlasSprite getParticleIcon(@Nonnull ModelData data) { 41 | BlockState state = data.get(HELD_STATE); 42 | if (state != null) { 43 | return Minecraft.getInstance().getBlockRenderer().getBlockModel(state).getParticleIcon(data); 44 | } 45 | 46 | return super.getParticleIcon(data); 47 | } 48 | 49 | @NotNull 50 | @Override 51 | public ChunkRenderTypeSet getRenderTypes( 52 | @NotNull BlockState state, 53 | @NotNull RandomSource rand, 54 | @NotNull ModelData data 55 | ) { 56 | BlockState heldState = data.get(HELD_STATE); 57 | ChunkRenderTypeSet types; 58 | if (heldState != null) 59 | types = Minecraft.getInstance().getBlockRenderer().getBlockModel(heldState).getRenderTypes( 60 | heldState, 61 | rand, 62 | data 63 | ); 64 | else 65 | types = super.getRenderTypes(state, rand, data); 66 | 67 | return ChunkRenderTypeSet.union(types, ChunkRenderTypeSet.of(RenderType.cutoutMipped())); 68 | } 69 | 70 | @Nonnull 71 | @Override 72 | public List getQuads( 73 | BlockState state, 74 | @Nullable Direction side, 75 | @Nonnull RandomSource rand, 76 | @Nonnull ModelData extraData, 77 | RenderType renderType 78 | ) { 79 | List result = new ArrayList<>(); 80 | BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); 81 | 82 | // Directional arrow 83 | if (renderType == RenderType.cutoutMipped()) { 84 | if (state.getValue(ElevatorBlock.DIRECTIONAL) && state.getValue(ElevatorBlock.SHOW_ARROW)) { 85 | BakedModel arrowModel = Minecraft.getInstance().getModelManager().getStandaloneModel( 86 | ResourceLocation.fromNamespaceAndPath( 87 | ElevatorMod.ID, 88 | "arrow" 89 | ) 90 | ); 91 | BlockModelRotation rot = BlockModelRotation.by(0, (int) state.getValue(ElevatorBlock.FACING).toYRot()); 92 | IQuadTransformer transformer = QuadTransformers.applying(rot.getRotation().blockCenterToCorner()); 93 | 94 | 95 | result.addAll(transformer.process(arrowModel.getQuads(state, null, rand, extraData, renderType))); 96 | } 97 | } 98 | 99 | BlockState heldState = extraData.get(HELD_STATE); 100 | if (heldState != null) { 101 | var types = Minecraft.getInstance() 102 | .getBlockRenderer() 103 | .getBlockModel(heldState) 104 | .getRenderTypes(heldState, rand, ModelData.EMPTY); 105 | 106 | if (renderType == null || types.contains(renderType)) { 107 | BakedModel model = dispatcher.getBlockModel(heldState); 108 | result.addAll(model.getQuads(heldState, side, rand, extraData, renderType)); 109 | } 110 | 111 | return result; 112 | } 113 | 114 | // Fallback / original model 115 | result.addAll(parent.getQuads(state, side, rand, extraData, renderType)); 116 | return result; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /neoforge/src/main/java/com/vsngarcia/neoforge/init/Registry.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.neoforge.init; 2 | 3 | import com.vsngarcia.ElevatorMod; 4 | import com.vsngarcia.level.ElevatorContainer; 5 | import com.vsngarcia.neoforge.ElevatorBlock; 6 | import com.vsngarcia.neoforge.tile.ElevatorBlockEntity; 7 | import net.minecraft.core.registries.Registries; 8 | import net.minecraft.network.chat.Component; 9 | import net.minecraft.resources.ResourceLocation; 10 | import net.minecraft.sounds.SoundEvent; 11 | import net.minecraft.world.inventory.MenuType; 12 | import net.minecraft.world.item.BlockItem; 13 | import net.minecraft.world.item.CreativeModeTab; 14 | import net.minecraft.world.item.DyeColor; 15 | import net.minecraft.world.level.block.Block; 16 | import net.minecraft.world.level.block.entity.BlockEntityType; 17 | import net.neoforged.bus.api.IEventBus; 18 | import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; 19 | import net.neoforged.neoforge.registries.DeferredBlock; 20 | import net.neoforged.neoforge.registries.DeferredItem; 21 | import net.neoforged.neoforge.registries.DeferredRegister; 22 | 23 | import java.util.Arrays; 24 | import java.util.EnumMap; 25 | import java.util.function.Supplier; 26 | 27 | public class Registry { 28 | public static final EnumMap> ELEVATOR_BLOCKS = new EnumMap<>(DyeColor.class); 29 | private static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(ElevatorMod.ID); 30 | 31 | static { 32 | Arrays.stream(DyeColor.values()).forEach(color -> 33 | ELEVATOR_BLOCKS.put( 34 | color, 35 | BLOCKS.register("elevator_" + color.getName(), () -> new ElevatorBlock(color)) 36 | ) 37 | ); 38 | } 39 | 40 | private static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create( 41 | Registries.BLOCK_ENTITY_TYPE, 42 | ElevatorMod.ID 43 | ); 44 | public static final Supplier> ELEVATOR_TILE_ENTITY = BLOCK_ENTITIES.register( 45 | "elevator_tile", 46 | () -> new BlockEntityType<>( 47 | ElevatorBlockEntity::new, 48 | ELEVATOR_BLOCKS.values().stream().map(DeferredBlock::get).toArray(Block[]::new) 49 | ) 50 | ); 51 | 52 | public static final EnumMap> ELEVATOR_ITEMS = new EnumMap<>(DyeColor.class); 53 | private static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(ElevatorMod.ID); 54 | 55 | static { 56 | ELEVATOR_BLOCKS.forEach((color, o) -> 57 | ELEVATOR_ITEMS.put(color, ITEMS.registerSimpleBlockItem(o)) 58 | ); 59 | } 60 | 61 | private static final DeferredRegister> CONTAINERS = DeferredRegister.create( 62 | Registries.MENU, 63 | ElevatorMod.ID 64 | ); 65 | public static Supplier> ELEVATOR_CONTAINER = null; 66 | 67 | static { 68 | ELEVATOR_CONTAINER = CONTAINERS.register( 69 | "elevator_container", () -> 70 | IMenuTypeExtension.create((windowId, inv, data) -> 71 | new ElevatorContainer( 72 | ELEVATOR_CONTAINER.get(), 73 | windowId, 74 | data.readBlockPos(), 75 | inv.player 76 | ) 77 | ) 78 | ); 79 | } 80 | 81 | private static final DeferredRegister SOUNDS = DeferredRegister.create( 82 | Registries.SOUND_EVENT, 83 | ElevatorMod.ID 84 | ); 85 | public static final Supplier TELEPORT_SOUND = SOUNDS.register( 86 | "teleport", 87 | () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(ElevatorMod.ID, "teleport")) 88 | ); 89 | public static final Supplier CAMOUFLAGE_SOUND = SOUNDS.register( 90 | "camouflage", 91 | () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath( 92 | ElevatorMod.ID, 93 | "camouflage" 94 | )) 95 | ); 96 | 97 | private static final DeferredRegister CREATIVE_TABS = DeferredRegister.create( 98 | Registries.CREATIVE_MODE_TAB, 99 | ElevatorMod.ID 100 | ); 101 | 102 | private static final Supplier ELEVATORS_TAB = CREATIVE_TABS.register( 103 | "elevators_tab", 104 | () -> CreativeModeTab.builder() 105 | .icon(() -> ELEVATOR_ITEMS.get(DyeColor.WHITE).get().getDefaultInstance()) 106 | .displayItems((params, output) -> ELEVATOR_ITEMS.values().forEach(item -> output.accept(item.get()))) 107 | .title(Component.translatable("itemGroup.elevators_tab")) 108 | .build() 109 | ); 110 | 111 | public static void init(IEventBus modEventBus) { 112 | BLOCKS.register(modEventBus); 113 | ITEMS.register(modEventBus); 114 | BLOCK_ENTITIES.register(modEventBus); 115 | CONTAINERS.register(modEventBus); 116 | SOUNDS.register(modEventBus); 117 | CREATIVE_TABS.register(modEventBus); 118 | } 119 | 120 | // TODO: Config GUI 121 | /*@SubscribeEvent 122 | public static void configChanged(ConfigChangedEvent.OnConfigChangedEvent event) { 123 | if (event.getModID().equals(ElevatorMod.ID)) { 124 | ConfigManager.sync(ElevatorMod.ID, Config.Type.INSTANCE); 125 | } 126 | }*/ 127 | } 128 | -------------------------------------------------------------------------------- /neoforge/src/main/java/com/vsngarcia/neoforge/network/NetworkHandler.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.neoforge.network; 2 | 3 | import com.vsngarcia.neoforge.init.Registry; 4 | import com.vsngarcia.network.TeleportPacket; 5 | import com.vsngarcia.network.client.RemoveCamoPacket; 6 | import com.vsngarcia.network.client.SetArrowPacket; 7 | import com.vsngarcia.network.client.SetDirectionalPacket; 8 | import com.vsngarcia.network.client.SetFacingPacket; 9 | import net.minecraft.server.level.ServerPlayer; 10 | import net.neoforged.bus.api.SubscribeEvent; 11 | import net.neoforged.fml.common.EventBusSubscriber; 12 | import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; 13 | import net.neoforged.neoforge.network.registration.PayloadRegistrar; 14 | 15 | 16 | @EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) 17 | public class NetworkHandler { 18 | @SubscribeEvent 19 | public static void register(final RegisterPayloadHandlersEvent event) { 20 | PayloadRegistrar registrar = event.registrar("1.0.0"); 21 | 22 | registrar.playToServer( 23 | TeleportPacket.TYPE, 24 | TeleportPacket.STREAM_CODEC, 25 | (pkt, ctx) -> TeleportPacket.handle(pkt, (ServerPlayer) ctx.player(), Registry.TELEPORT_SOUND.get()) 26 | ); 27 | 28 | registrar.playToServer( 29 | SetDirectionalPacket.TYPE, 30 | SetDirectionalPacket.STREAM_CODEC, 31 | (pkt, ctx) -> SetDirectionalPacket.handle(pkt, (ServerPlayer) ctx.player()) 32 | ); 33 | registrar.playToServer( 34 | SetArrowPacket.TYPE, 35 | SetArrowPacket.STREAM_CODEC, 36 | (pkt, ctx) -> SetArrowPacket.handle(pkt, (ServerPlayer) ctx.player()) 37 | ); 38 | registrar.playToServer( 39 | RemoveCamoPacket.TYPE, 40 | RemoveCamoPacket.STREAM_CODEC, 41 | (pkt, ctx) -> RemoveCamoPacket.handle(pkt, (ServerPlayer) ctx.player()) 42 | ); 43 | registrar.playToServer( 44 | SetFacingPacket.TYPE, 45 | SetFacingPacket.STREAM_CODEC, 46 | (pkt, ctx) -> SetFacingPacket.handle(pkt, (ServerPlayer) ctx.player()) 47 | ); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /neoforge/src/main/java/com/vsngarcia/neoforge/tile/ElevatorBlockEntity.java: -------------------------------------------------------------------------------- 1 | package com.vsngarcia.neoforge.tile; 2 | 3 | import com.vsngarcia.level.ElevatorBlockEntityBase; 4 | import com.vsngarcia.level.ElevatorContainer; 5 | import com.vsngarcia.neoforge.client.render.ElevatorBakedModel; 6 | import com.vsngarcia.neoforge.init.Registry; 7 | import net.minecraft.core.BlockPos; 8 | import net.minecraft.core.HolderLookup; 9 | import net.minecraft.nbt.CompoundTag; 10 | import net.minecraft.network.Connection; 11 | import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; 12 | import net.minecraft.sounds.SoundEvent; 13 | import net.minecraft.world.entity.player.Inventory; 14 | import net.minecraft.world.entity.player.Player; 15 | import net.minecraft.world.inventory.AbstractContainerMenu; 16 | import net.minecraft.world.level.block.state.BlockState; 17 | import net.neoforged.neoforge.client.model.data.ModelData; 18 | import org.jetbrains.annotations.Nullable; 19 | 20 | public class ElevatorBlockEntity extends ElevatorBlockEntityBase { 21 | public ElevatorBlockEntity(BlockPos pos, BlockState state) { 22 | super(Registry.ELEVATOR_TILE_ENTITY.get(), pos, state); 23 | } 24 | 25 | @Override 26 | protected SoundEvent camouflageSound() { 27 | return Registry.CAMOUFLAGE_SOUND.get(); 28 | } 29 | 30 | @Nullable 31 | @Override 32 | public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { 33 | return new ElevatorContainer(Registry.ELEVATOR_CONTAINER.get(), id, worldPosition, player); 34 | } 35 | 36 | @Override 37 | public ModelData getModelData() { 38 | return ModelData.builder().with(ElevatorBakedModel.HELD_STATE, heldState).build(); 39 | } 40 | 41 | @Override 42 | public void setChanged() { 43 | super.setChanged(); 44 | 45 | requestModelDataUpdate(); 46 | 47 | var auxLightManager = level != null ? level.getAuxLightManager(worldPosition) : null; 48 | if (auxLightManager == null) { 49 | return; 50 | } 51 | 52 | auxLightManager.setLightAt( 53 | worldPosition, 54 | heldState != null ? heldState.getLightEmission(level, worldPosition) : 0 55 | ); 56 | } 57 | 58 | @Override 59 | public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider lookupProvider) { 60 | super.handleUpdateTag(tag, lookupProvider); 61 | setChanged(); 62 | } 63 | 64 | @Override 65 | public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider provider) { 66 | handleUpdateTag(pkt.getTag(), provider); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /neoforge/src/main/resources/META-INF/neoforge.mods.toml: -------------------------------------------------------------------------------- 1 | modLoader = "javafml" 2 | loaderVersion = "[4,)" 3 | issueTrackerURL = "https://github.com/VsnGamer/ElevatorMod/issues/" 4 | license = "MIT" 5 | 6 | [[mods]] 7 | modId = "elevatorid" 8 | version = "${version}" 9 | displayName = "ElevatorMod" 10 | authors = "VsnGamer" 11 | logoFile = "logo.png" 12 | credits = "OpenBlocks Team" 13 | displayURL = "https://github.com/VsnGamer/ElevatorMod" 14 | description = '''Simple port of the elevator from OpenBlocks to 1.8+''' 15 | 16 | [[dependencies.elevatorid]] 17 | modId = "neoforge" 18 | type = "required" 19 | versionRange = "[21.4.11-beta,)" 20 | ordering = "NONE" 21 | side = "BOTH" 22 | 23 | [[dependencies.elevatorid]] 24 | modId = "minecraft" 25 | type = "required" 26 | versionRange = "[1.21.4,)" 27 | ordering = "NONE" 28 | side = "BOTH" 29 | 30 | [[mixins]] 31 | config = "elevatorid.mixins.json" 32 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | maven { url "https://maven.fabricmc.net/" } 4 | maven { url "https://maven.architectury.dev/" } 5 | maven { url "https://files.minecraftforge.net/maven/" } 6 | gradlePluginPortal() 7 | } 8 | } 9 | 10 | rootProject.name = 'elevatorid' 11 | 12 | include 'common' 13 | include 'fabric' 14 | include 'neoforge' 15 | --------------------------------------------------------------------------------