├── .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 |
4 |
5 |
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 | 
27 |
28 | You can also re-dye any elevator:
29 |
30 | 
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 | 
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 extends ElevatorBlockEntityBase> 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 extends HorizontalDirectionalBlock> 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 extends HorizontalDirectionalBlock> 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 |
--------------------------------------------------------------------------------