├── LICENSE.md ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src └── main ├── java └── gd │ └── rf │ └── acro │ └── platos │ ├── ClientInit.java │ ├── ConfigUtils.java │ ├── PlatosTransporters.java │ ├── blocks │ ├── BlockControlWheel.java │ └── NotFullBlock.java │ ├── entity │ ├── BlockShipEntity.java │ ├── BlockShipEntityModel.java │ └── BlockShipEntityRenderer.java │ └── items │ ├── BoardingStairsItem.java │ ├── ClearingScytheItem.java │ ├── ControlKeyItem.java │ ├── LiftJackItem.java │ └── WrenchItem.java └── resources ├── assets └── platos │ ├── blockstates │ ├── balloon_block.json │ ├── float_block.json │ ├── ship_controller.json │ └── wheel_block.json │ ├── icon.png │ ├── lang │ ├── ar_sa.json │ ├── en_us.json │ ├── es_ES.json │ ├── ko_kr.json │ ├── ru_ru.json │ └── zh_cn.json │ └── models │ ├── block │ ├── balloon_block.json │ ├── float_block.json │ ├── ship_controller.json │ └── wheel_block.json │ └── item │ ├── balloon_block.json │ ├── boarding_stairs.json │ ├── clearing_scythe.json │ ├── control_key.json │ ├── float_block.json │ ├── lift_jack.json │ ├── ship_controller.json │ ├── wheel_block.json │ └── wrench.json ├── data └── platos │ ├── loot_tables │ └── blocks │ │ ├── balloon_block.json │ │ ├── float_block.json │ │ ├── ship_controller.json │ │ └── wheel_block.json │ ├── recipes │ ├── balloon.json │ ├── boardingstairs.json │ ├── control_key.json │ ├── controller.json │ ├── float.json │ ├── lift_jack.json │ ├── scythe.json │ ├── wheel.json │ └── wrench.json │ └── tags │ └── blocks │ ├── boat_material.json │ ├── boat_material_blacklist.json │ └── scytheable.json ├── fabric.mod.json ├── modid.mixins.json └── platos.mixins.json /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 James (Acro) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PlatosTransporters 2 | a "spiritual successor" to Archemides Ships/ Da Vincis Vessels, completely rewritten for fabric 1.16, supporting fabric and forge 1.16 and 1.15 3 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'fabric-loom' version '0.9-SNAPSHOT' 3 | id 'maven-publish' 4 | } 5 | 6 | sourceCompatibility = JavaVersion.VERSION_16 7 | targetCompatibility = JavaVersion.VERSION_16 8 | 9 | archivesBaseName = project.archives_base_name 10 | version = project.mod_version 11 | group = project.maven_group 12 | 13 | repositories { 14 | // Add repositories to retrieve artifacts from in here. 15 | // You should only use this when depending on other mods because 16 | // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. 17 | // See https://docs.gradle.org/current/userguide/declaring_repositories.html 18 | // for more information about repositories. 19 | } 20 | 21 | dependencies { 22 | minecraft "com.mojang:minecraft:1.17.1" 23 | mappings "net.fabricmc:yarn:1.17.1+build.46:v2" 24 | modImplementation "net.fabricmc:fabric-loader:0.11.6" 25 | 26 | //Fabric api 27 | modImplementation "net.fabricmc.fabric-api:fabric-api:0.39.2+1.17" 28 | } 29 | 30 | processResources { 31 | inputs.property "version", project.version 32 | 33 | filesMatching("fabric.mod.json") { 34 | expand "version": project.version 35 | } 36 | } 37 | 38 | tasks.withType(JavaCompile).configureEach { 39 | // ensure that the encoding is set to UTF-8, no matter what the system default is 40 | // this fixes some edge cases with special characters not displaying correctly 41 | // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html 42 | // If Javadoc is generated, this must be specified in that task too. 43 | it.options.encoding = "UTF-8" 44 | 45 | // Minecraft 1.17 (21w19a) upwards uses Java 16. 46 | it.options.release = 16 47 | } 48 | 49 | java { 50 | // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task 51 | // if it is present. 52 | // If you remove this line, sources will not be generated. 53 | withSourcesJar() 54 | } 55 | 56 | jar { 57 | from("LICENSE") { 58 | rename { "${it}_${project.archivesBaseName}"} 59 | } 60 | } 61 | 62 | // configure the maven publication 63 | publishing { 64 | publications { 65 | mavenJava(MavenPublication) { 66 | // add all the jars that should be included when publishing to maven 67 | artifact(remapJar) { 68 | builtBy remapJar 69 | } 70 | artifact(sourcesJar) { 71 | builtBy remapSourcesJar 72 | } 73 | } 74 | } 75 | 76 | // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. 77 | repositories { 78 | // Add repositories to publish to here. 79 | // Notice: This block does NOT have the same function as the block in the top level. 80 | // The repositories here will be used for publishing your artifact, not for 81 | // retrieving dependencies. 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Done to increase the memory available to gradle. 2 | org.gradle.jvmargs=-Xmx1G 3 | 4 | # Fabric Properties 5 | # check these on https://fabricmc.net/use 6 | minecraft_version=1.17.1 7 | yarn_mappings=1.17.1+build.46 8 | loader_version=0.11.6 9 | 10 | #Fabric api 11 | fabric_version=0.39.2+1.17 12 | 13 | # Mod Properties 14 | mod_version = 1.0.0 15 | maven_group = com.example 16 | archives_base_name = fabric-example-mod 17 | 18 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSJBDEV/PlatosTransporters/8239c5ea04fe9b613253fdaef05611b810999a50/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-7.0.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSJBDEV/PlatosTransporters/8239c5ea04fe9b613253fdaef05611b810999a50/gradlew -------------------------------------------------------------------------------- /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 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | jcenter() 4 | maven { 5 | name = 'Fabric' 6 | url = 'https://maven.fabricmc.net/' 7 | } 8 | gradlePluginPortal() 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/ClientInit.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos; 2 | 3 | import gd.rf.acro.platos.entity.BlockShipEntityRenderer; 4 | import net.fabricmc.api.ClientModInitializer; 5 | import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; 6 | import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; 7 | import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 8 | import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; 9 | import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; 10 | import net.minecraft.client.option.KeyBinding; 11 | import net.minecraft.client.util.InputUtil; 12 | import net.minecraft.network.PacketByteBuf; 13 | import org.lwjgl.glfw.GLFW; 14 | 15 | import static gd.rf.acro.platos.PlatosTransporters.forwardPacket; 16 | 17 | public class ClientInit implements ClientModInitializer { 18 | public static KeyBinding up; 19 | public static KeyBinding down; 20 | public static KeyBinding stop; 21 | 22 | @Override 23 | public void onInitializeClient() { 24 | EntityRendererRegistry.INSTANCE.register(PlatosTransporters.BLOCK_SHIP_ENTITY_ENTITY_TYPE, BlockShipEntityRenderer::new); 25 | up = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.platos.up", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_Z,"category.platos.main")); 26 | down= KeyBindingHelper.registerKeyBinding(new KeyBinding("key.platos.down", InputUtil.Type.KEYSYM,GLFW.GLFW_KEY_C,"category.platos.main")); 27 | stop = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.platos.stop", InputUtil.Type.KEYSYM,GLFW.GLFW_KEY_V,"category.platos.main")); 28 | 29 | ClientTickEvents.START_CLIENT_TICK.register(client -> 30 | { 31 | while (client.options.keyForward.wasPressed()) { 32 | PacketByteBuf forw = PacketByteBufs.create(); 33 | forw.writeInt(0); 34 | ClientPlayNetworking.send(forwardPacket,forw); 35 | } 36 | 37 | }); 38 | ClientTickEvents.START_CLIENT_TICK.register(client -> 39 | { 40 | while (client.options.keyLeft.wasPressed()) { 41 | PacketByteBuf forw = PacketByteBufs.create(); 42 | forw.writeInt(1); 43 | ClientPlayNetworking.send(forwardPacket,forw); 44 | } 45 | 46 | }); 47 | ClientTickEvents.START_CLIENT_TICK.register(client -> 48 | { 49 | while (client.options.keyRight.wasPressed()) { 50 | PacketByteBuf forw = PacketByteBufs.create(); 51 | forw.writeInt(2); 52 | ClientPlayNetworking.send(forwardPacket,forw); 53 | } 54 | 55 | }); 56 | ClientTickEvents.START_CLIENT_TICK.register(client -> 57 | { 58 | while (up.wasPressed()) { 59 | PacketByteBuf forw = PacketByteBufs.create(); 60 | forw.writeInt(3); 61 | ClientPlayNetworking.send(forwardPacket,forw); 62 | } 63 | 64 | }); 65 | ClientTickEvents.START_CLIENT_TICK.register(client -> 66 | { 67 | while (down.wasPressed()) { 68 | PacketByteBuf forw = PacketByteBufs.create(); 69 | forw.writeInt(4); 70 | ClientPlayNetworking.send(forwardPacket,forw); 71 | } 72 | 73 | }); 74 | ClientTickEvents.END_CLIENT_TICK.register(client -> 75 | { 76 | while (stop.wasPressed()) { 77 | PacketByteBuf forw =PacketByteBufs.create(); 78 | forw.writeInt(5); 79 | ClientPlayNetworking.send(forwardPacket,forw); 80 | } 81 | 82 | }); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/ConfigUtils.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos; 2 | 3 | import net.fabricmc.loader.api.FabricLoader; 4 | import org.apache.commons.io.FileUtils; 5 | 6 | import java.io.File; 7 | import java.io.IOException; 8 | import java.util.ArrayList; 9 | import java.util.HashMap; 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | public class ConfigUtils { 14 | 15 | public static Map config = new HashMap<>(); 16 | 17 | 18 | public static Map loadConfigs() 19 | { 20 | File file = new File(FabricLoader.getInstance().getConfigDirectory().getPath() + "/PlatosTransporters/config.acfg"); 21 | try { 22 | List lines = FileUtils.readLines(file,"utf-8"); 23 | lines.forEach(line-> 24 | { 25 | if(line.charAt(0)!='#') 26 | { 27 | String noSpace = line.replace(" ",""); 28 | String[] entry = noSpace.split("="); 29 | config.put(entry[0],entry[1]); 30 | } 31 | }); 32 | } catch (IOException e) { 33 | e.printStackTrace(); 34 | } 35 | return config; 36 | } 37 | 38 | public static void generateConfigs(List input) 39 | { 40 | File file = new File(FabricLoader.getInstance().getConfigDirectory().getPath() + "/PlatosTransporters/config.acfg"); 41 | 42 | try { 43 | FileUtils.writeLines(file,input); 44 | } catch (IOException e) { 45 | e.printStackTrace(); 46 | } 47 | } 48 | 49 | public static Map checkConfigs() 50 | { 51 | if(new File(FabricLoader.getInstance().getConfigDirectory().getPath() + "/PlatosTransporters/config.acfg").exists()) 52 | { 53 | return loadConfigs(); 54 | } 55 | generateConfigs(makeDefaults()); 56 | return loadConfigs(); 57 | } 58 | 59 | private static List makeDefaults() 60 | { 61 | List defaults = new ArrayList<>(); 62 | defaults.add("#radius of blocks to be used in a single ship (default: 20)"); 63 | defaults.add("radius=20"); 64 | defaults.add("#should vehicle material use a whitelist? (default: false)"); 65 | defaults.add("whitelist=false"); 66 | defaults.add("#amount of blocks 1 Airship Balloon can lift (default: 2)"); 67 | defaults.add("balloon=2"); 68 | defaults.add("#amount of blocks 1 Water Float can lift (default: 20)"); 69 | defaults.add("float=20"); 70 | defaults.add("#amount of blocks 1 wheel can lift (default: 10)"); 71 | defaults.add("wheel=10"); 72 | 73 | defaults.add("#speed of vehicles on their correct terrain (default: 0.2)"); 74 | defaults.add("cspeed=0.2"); 75 | defaults.add("#speed of vehicles when not on their correct terrain (default: 0.05)"); 76 | defaults.add("nspeed=0.05"); 77 | 78 | return defaults; 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/PlatosTransporters.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos; 2 | 3 | import gd.rf.acro.platos.blocks.BlockControlWheel; 4 | import gd.rf.acro.platos.blocks.NotFullBlock; 5 | import gd.rf.acro.platos.entity.BlockShipEntity; 6 | import gd.rf.acro.platos.items.*; 7 | import net.fabricmc.api.ModInitializer; 8 | import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; 9 | import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 10 | import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; 11 | import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; 12 | import net.fabricmc.fabric.api.tag.TagRegistry; 13 | import net.minecraft.block.AbstractBlock; 14 | import net.minecraft.block.Block; 15 | import net.minecraft.block.Material; 16 | import net.minecraft.client.resource.language.I18n; 17 | import net.minecraft.entity.EntityDimensions; 18 | import net.minecraft.entity.EntityType; 19 | import net.minecraft.entity.EquipmentSlot; 20 | import net.minecraft.entity.SpawnGroup; 21 | import net.minecraft.entity.attribute.EntityAttributes; 22 | import net.minecraft.entity.mob.MobEntity; 23 | import net.minecraft.entity.player.PlayerEntity; 24 | import net.minecraft.item.*; 25 | import net.minecraft.nbt.NbtCompound; 26 | import net.minecraft.nbt.NbtList; 27 | import net.minecraft.nbt.NbtString; 28 | import net.minecraft.tag.Tag; 29 | import net.minecraft.util.Identifier; 30 | import net.minecraft.util.math.Vec3d; 31 | import net.minecraft.util.registry.Registry; 32 | 33 | public class PlatosTransporters implements ModInitializer { 34 | public static final ItemGroup TAB = FabricItemGroupBuilder.build( 35 | new Identifier("platos", "tab"), 36 | () -> new ItemStack(PlatosTransporters.BLOCK_CONTROL_WHEEL)); 37 | 38 | public static final EntityType BLOCK_SHIP_ENTITY_ENTITY_TYPE = 39 | Registry.register(Registry.ENTITY_TYPE,new Identifier("platos","block_ship") 40 | , FabricEntityTypeBuilder.create(SpawnGroup.AMBIENT,BlockShipEntity::new).dimensions(EntityDimensions.fixed(3,1)).trackRangeBlocks(100).build()); 41 | 42 | public static final Tag BOAT_MATERIAL = TagRegistry.block(new Identifier("platos","boat_material")); 43 | public static final Tag BOAT_MATERIAL_BLACKLIST = TagRegistry.block(new Identifier("platos","boat_material_blacklist")); 44 | public static final Tag SCYTHEABLE = TagRegistry.block(new Identifier("platos","scytheable")); 45 | 46 | public static Identifier forwardPacket = new Identifier("platos","forwardpacket"); 47 | 48 | 49 | @Override 50 | public void onInitialize() { 51 | // This code runs as soon as Minecraft is in a mod-load-ready state. 52 | // However, some things (like resources) may still be uninitialized. 53 | // Proceed with mild caution. 54 | FabricDefaultAttributeRegistry.register(BLOCK_SHIP_ENTITY_ENTITY_TYPE, MobEntity.createMobAttributes().add(EntityAttributes.GENERIC_MAX_HEALTH, 100.0D).add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.25D)); 55 | registerBlocks(); 56 | registerItems(); 57 | ConfigUtils.checkConfigs(); 58 | System.out.println("Hello Fabric world!"); 59 | 60 | 61 | ServerPlayNetworking.registerGlobalReceiver(forwardPacket,(server,handler,packetContext, attachedData,sender) -> 62 | { 63 | PlayerEntity user = packetContext.player; 64 | 65 | if(user.hasVehicle() && user.getVehicle() instanceof BlockShipEntity) 66 | { 67 | 68 | int move = attachedData.readInt(); 69 | BlockShipEntity vehicle = (BlockShipEntity) user.getVehicle(); 70 | if(move==0) 71 | { 72 | 73 | user.getVehicle().setVelocity(new Vec3d(vehicle.getRotationVector().x,vehicle.getRotationVector().y,vehicle.getRotationVector().z).multiply(0.8)); 74 | } 75 | if(move==2) 76 | { 77 | vehicle.setYaw(vehicle.getYaw()+5); 78 | } 79 | if(move==1) 80 | { 81 | vehicle.setYaw(vehicle.getYaw()-5); 82 | 83 | } 84 | if(move==3 && ((BlockShipEntity) user.getVehicle()).getEquippedStack(EquipmentSlot.CHEST).getNbt().getInt("type")==1) 85 | { 86 | vehicle.setVelocity(new Vec3d(0,0.2,0)); 87 | } 88 | if(move==4 && ((BlockShipEntity) user.getVehicle()).getEquippedStack(EquipmentSlot.CHEST).getNbt().getInt("type")==1) 89 | { 90 | vehicle.setVelocity(new Vec3d(0,-0.2,0)); 91 | 92 | } 93 | if(move==5) 94 | { 95 | 96 | if(vehicle.getEquippedStack(EquipmentSlot.HEAD).getItem()==Items.STICK) 97 | { 98 | vehicle.equipStack(EquipmentSlot.HEAD,ItemStack.EMPTY); 99 | } 100 | else 101 | { 102 | vehicle.equipStack(EquipmentSlot.HEAD,new ItemStack(Items.STICK)); 103 | } 104 | 105 | } 106 | } 107 | }); 108 | } 109 | public static final BlockControlWheel BLOCK_CONTROL_WHEEL = new BlockControlWheel(AbstractBlock.Settings.of(Material.WOOD)); 110 | public static final NotFullBlock BALLOON_BLOCK = new NotFullBlock(AbstractBlock.Settings.of(Material.WOOL)); 111 | public static final NotFullBlock FLOAT_BLOCK = new NotFullBlock(AbstractBlock.Settings.of(Material.WOOL)); 112 | public static final NotFullBlock WHEEL_BLOCK = new NotFullBlock(AbstractBlock.Settings.of(Material.WOOL)); 113 | private void registerBlocks() 114 | { 115 | Registry.register(Registry.BLOCK,new Identifier("platos","ship_controller"),BLOCK_CONTROL_WHEEL); 116 | Registry.register(Registry.BLOCK,new Identifier("platos","balloon_block"),BALLOON_BLOCK); 117 | Registry.register(Registry.BLOCK,new Identifier("platos","float_block"),FLOAT_BLOCK); 118 | Registry.register(Registry.BLOCK,new Identifier("platos","wheel_block"),WHEEL_BLOCK); 119 | } 120 | 121 | public static final ControlKeyItem CONTROL_KEY_ITEM = new ControlKeyItem(new Item.Settings().group(PlatosTransporters.TAB)); 122 | public static final LiftJackItem LIFT_JACK_ITEM = new LiftJackItem(new Item.Settings().group(PlatosTransporters.TAB)); 123 | public static final WrenchItem WRENCH_ITEM = new WrenchItem(new Item.Settings().group(PlatosTransporters.TAB)); 124 | public static final ClearingScytheItem CLEARING_SCYTHE_ITEM = new ClearingScytheItem(new Item.Settings().group(PlatosTransporters.TAB).maxDamage(100)); 125 | public static final BoardingStairsItem BOARDING_STAIRS_ITEM = new BoardingStairsItem(new Item.Settings().group(PlatosTransporters.TAB)); 126 | private void registerItems() 127 | { 128 | Registry.register(Registry.ITEM, new Identifier("platos", "ship_controller"), new BlockItem(BLOCK_CONTROL_WHEEL, new Item.Settings().group(PlatosTransporters.TAB))); 129 | Registry.register(Registry.ITEM, new Identifier("platos", "float_block"), new BlockItem(FLOAT_BLOCK, new Item.Settings().group(PlatosTransporters.TAB))); 130 | Registry.register(Registry.ITEM, new Identifier("platos", "balloon_block"), new BlockItem(BALLOON_BLOCK, new Item.Settings().group(PlatosTransporters.TAB))); 131 | Registry.register(Registry.ITEM, new Identifier("platos", "wheel_block"), new BlockItem(WHEEL_BLOCK, new Item.Settings().group(PlatosTransporters.TAB))); 132 | Registry.register(Registry.ITEM,new Identifier("platos","control_key"),CONTROL_KEY_ITEM); 133 | Registry.register(Registry.ITEM,new Identifier("platos","lift_jack"),LIFT_JACK_ITEM); 134 | Registry.register(Registry.ITEM,new Identifier("platos","wrench"),WRENCH_ITEM); 135 | Registry.register(Registry.ITEM,new Identifier("platos","clearing_scythe"),CLEARING_SCYTHE_ITEM); 136 | Registry.register(Registry.ITEM,new Identifier("platos","boarding_stairs"),BOARDING_STAIRS_ITEM); 137 | } 138 | 139 | public static void givePlayerStartBook(PlayerEntity playerEntity) 140 | { 141 | if(!playerEntity.getScoreboardTags().contains("platos_new") && playerEntity.world.isClient) 142 | { 143 | 144 | playerEntity.giveItemStack(createBook("Acro","Plato's Transporters" 145 | ,I18n.translate("book.platos.page1") 146 | ,I18n.translate("book.platos.page2") 147 | ,I18n.translate("book.platos.page3") 148 | ,I18n.translate("book.platos.page4") 149 | ,I18n.translate("book.platos.page5") 150 | ,I18n.translate("book.platos.page6") 151 | ,I18n.translate("book.platos.page7") 152 | )); 153 | playerEntity.addScoreboardTag("platos_new"); 154 | } 155 | } 156 | private static ItemStack createBook(String author, String title,Object ...pages) 157 | { 158 | ItemStack book = new ItemStack(Items.WRITTEN_BOOK); 159 | NbtCompound tags = new NbtCompound(); 160 | tags.putString("author",author); 161 | tags.putString("title",title); 162 | NbtList contents = new NbtList(); 163 | for (Object page : pages) { 164 | contents.add(NbtString.of("{\"text\":\""+page+"\"}")); 165 | } 166 | tags.put("pages",contents); 167 | book.setNbt(tags); 168 | return book; 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/blocks/BlockControlWheel.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.blocks; 2 | 3 | import gd.rf.acro.platos.ConfigUtils; 4 | import gd.rf.acro.platos.PlatosTransporters; 5 | import gd.rf.acro.platos.entity.BlockShipEntity; 6 | import net.minecraft.block.*; 7 | import net.minecraft.entity.EquipmentSlot; 8 | import net.minecraft.entity.SpawnReason; 9 | import net.minecraft.entity.player.PlayerEntity; 10 | import net.minecraft.item.ItemPlacementContext; 11 | import net.minecraft.item.ItemStack; 12 | import net.minecraft.item.Items; 13 | import net.minecraft.nbt.NbtCompound; 14 | import net.minecraft.nbt.NbtList; 15 | import net.minecraft.nbt.NbtString; 16 | import net.minecraft.server.world.ServerWorld; 17 | import net.minecraft.state.StateManager; 18 | import net.minecraft.state.property.Properties; 19 | import net.minecraft.text.LiteralText; 20 | import net.minecraft.util.ActionResult; 21 | import net.minecraft.util.Clearable; 22 | import net.minecraft.util.Hand; 23 | import net.minecraft.util.hit.BlockHitResult; 24 | import net.minecraft.util.math.BlockPos; 25 | import net.minecraft.util.math.Direction; 26 | import net.minecraft.util.shape.VoxelShape; 27 | import net.minecraft.world.BlockView; 28 | import net.minecraft.world.World; 29 | 30 | import java.util.ArrayList; 31 | import java.util.Arrays; 32 | import java.util.HashMap; 33 | import java.util.List; 34 | 35 | public class BlockControlWheel extends HorizontalFacingBlock { 36 | public BlockControlWheel(Settings settings) { 37 | super(settings); 38 | } 39 | 40 | @Override 41 | public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { 42 | return Block.createCuboidShape(1d,0d,1d,15d,8d,15d); 43 | } 44 | 45 | @Override 46 | public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { 47 | if(!world.isClient && hand==Hand.MAIN_HAND) 48 | { 49 | int balloons = Integer.parseInt(ConfigUtils.config.get("balloon")); 50 | int floats = Integer.parseInt(ConfigUtils.config.get("float")); 51 | int wheels = Integer.parseInt(ConfigUtils.config.get("wheel")); 52 | String whitelist = ConfigUtils.config.getOrDefault("whitelist","false"); 53 | int type = -1; 54 | int blocks = 0; 55 | int balances = 0; 56 | HashMap used = new HashMap<>(); 57 | NbtList list = new NbtList(); 58 | NbtList addons = new NbtList(); 59 | NbtCompound storage = new NbtCompound(); 60 | 61 | List filtered = new ArrayList<>(); 62 | List accepted = new ArrayList<>(); 63 | int mposx = 3; 64 | int mposz = 3; 65 | int nposx = -3; 66 | int nposz = -3; 67 | int mposy = 3; 68 | int nposy = -3; 69 | filtered.add(new Integer[]{0,0,0}); 70 | while(!filtered.isEmpty()) 71 | { 72 | Integer[] thisPos = filtered.get(0); 73 | BlockPos gpos = pos.add(thisPos[0],thisPos[1],thisPos[2]); 74 | for (int i = -1; i < 2; i++) { 75 | for (int j = -1; j < 2; j++) { 76 | for (int k = -1; k < 2; k++) 77 | { 78 | if(!world.getBlockState(gpos.add(i, j, k)).isAir() && !world.getBlockState(gpos.add(i, j, k)).getBlock().getTranslationKey().contains("ore") 79 | && world.getBlockState(gpos.add(i, j, k)).getBlock()!=Blocks.WATER 80 | && world.getBlockState(gpos.add(i, j, k)).getBlock()!=Blocks.LAVA) 81 | { 82 | if ((whitelist.equals("true") && PlatosTransporters.BOAT_MATERIAL.contains(world.getBlockState(gpos.add(i, j, k)).getBlock()) 83 | ) || (whitelist.equals("false") && !PlatosTransporters.BOAT_MATERIAL_BLACKLIST.contains(world.getBlockState(gpos.add(i, j, k)).getBlock()))) 84 | { 85 | Integer[] passable = new Integer[]{thisPos[0]+i,thisPos[1]+j,thisPos[2]+k}; 86 | if (i != 0 || j != 0 || k != 0) 87 | { 88 | boolean b = false; 89 | for (Integer[] integers : filtered) { 90 | if (Arrays.equals(integers, passable)) { 91 | b = true; 92 | break; 93 | } 94 | } 95 | if(!b) 96 | { 97 | boolean result = false; 98 | for (Integer[] inside : accepted) { 99 | if (Arrays.equals(inside, passable)) { 100 | result = true; 101 | break; 102 | } 103 | } 104 | if(!result) 105 | { 106 | filtered.add(passable); 107 | if(passable[0]>mposx) 108 | { 109 | mposx=passable[0]; 110 | } 111 | if(passable[0]mposy) 116 | { 117 | mposy=passable[1]; 118 | } 119 | if(passable[1]mposz) 124 | { 125 | mposz=passable[2]; 126 | } 127 | if(passable[2] 209 | { 210 | String[] vv = block.asString().split(" "); 211 | if(world.getBlockEntity(pos.add(Integer.parseInt(vv[1]),Integer.parseInt(vv[2]),Integer.parseInt(vv[3])))!=null) 212 | { 213 | Clearable.clear(world.getBlockEntity(pos.add(Integer.parseInt(vv[1]),Integer.parseInt(vv[2]),Integer.parseInt(vv[3])))); 214 | } 215 | world.setBlockState(pos.add(Integer.parseInt(vv[1]),Integer.parseInt(vv[2]),Integer.parseInt(vv[3])), Blocks.AIR.getDefaultState()); 216 | }); 217 | 218 | int offset = 1; 219 | if(player.getStackInHand(hand).getItem()==PlatosTransporters.LIFT_JACK_ITEM) 220 | { 221 | if(player.getStackInHand(hand).hasNbt()) 222 | { 223 | offset=player.getStackInHand(hand).getNbt().getInt("off"); 224 | } 225 | } 226 | BlockShipEntity entity = PlatosTransporters.BLOCK_SHIP_ENTITY_ENTITY_TYPE.spawn((ServerWorld) world,null,null,player,player.getBlockPos(), SpawnReason.EVENT,false,false); 227 | entity.setModel(list,getDirection(state),offset,type,storage,addons); 228 | if(type==1 || type == 0) 229 | { 230 | entity.equipStack(EquipmentSlot.HEAD,new ItemStack(Items.STICK)); 231 | } 232 | if(type==1) 233 | { 234 | entity.setNoGravity(true); 235 | } 236 | 237 | player.startRiding(entity, true); 238 | return ActionResult.SUCCESS; 239 | } 240 | return ActionResult.FAIL; 241 | } 242 | 243 | @Override 244 | protected void appendProperties(StateManager.Builder builder) { 245 | builder.add(Properties.HORIZONTAL_FACING); 246 | } 247 | 248 | @Override 249 | public BlockState getPlacementState(ItemPlacementContext ctx) { 250 | return this.getDefaultState().with(FACING,ctx.getPlayerFacing()); 251 | } 252 | 253 | private static int getDirection(BlockState state) 254 | { 255 | if(state.get(Properties.HORIZONTAL_FACING)==Direction.EAST) 256 | { 257 | return 90; 258 | } 259 | if(state.get(Properties.HORIZONTAL_FACING)==Direction.SOUTH) 260 | { 261 | return 180; 262 | } 263 | if(state.get(Properties.HORIZONTAL_FACING)==Direction.WEST) 264 | { 265 | return 270; 266 | } 267 | return 0; 268 | } 269 | 270 | private static HashMap addIfCan(HashMap input, String key, int mod) 271 | { 272 | if(input.containsKey(key)) 273 | { 274 | input.put(key,input.get(key)+mod); 275 | } 276 | else 277 | { 278 | input.put(key,mod); 279 | } 280 | return input; 281 | } 282 | 283 | 284 | } 285 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/blocks/NotFullBlock.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.blocks; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.ShapeContext; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.util.shape.VoxelShape; 8 | import net.minecraft.world.BlockView; 9 | 10 | public class NotFullBlock extends Block { 11 | public NotFullBlock(Settings settings) { 12 | super(settings); 13 | } 14 | 15 | @Override 16 | public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { 17 | return Block.createCuboidShape(1d,0d,1d,15d,15d,15d); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/entity/BlockShipEntity.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.entity; 2 | 3 | import gd.rf.acro.platos.ConfigUtils; 4 | import gd.rf.acro.platos.PlatosTransporters; 5 | import net.minecraft.block.Block; 6 | import net.minecraft.block.BlockState; 7 | import net.minecraft.block.Blocks; 8 | import net.minecraft.block.entity.BlockEntity; 9 | import net.minecraft.entity.Entity; 10 | import net.minecraft.entity.EntityType; 11 | import net.minecraft.entity.EquipmentSlot; 12 | import net.minecraft.entity.LightningEntity; 13 | import net.minecraft.entity.damage.DamageSource; 14 | import net.minecraft.entity.passive.PigEntity; 15 | import net.minecraft.entity.player.PlayerEntity; 16 | import net.minecraft.fluid.Fluid; 17 | import net.minecraft.item.ItemStack; 18 | import net.minecraft.item.Items; 19 | import net.minecraft.nbt.NbtCompound; 20 | import net.minecraft.nbt.NbtElement; 21 | import net.minecraft.nbt.NbtList; 22 | import net.minecraft.nbt.NbtString; 23 | import net.minecraft.server.world.ServerWorld; 24 | import net.minecraft.sound.SoundEvent; 25 | import net.minecraft.sound.SoundEvents; 26 | import net.minecraft.tag.FluidTags; 27 | import net.minecraft.text.LiteralText; 28 | import net.minecraft.util.ActionResult; 29 | import net.minecraft.util.Hand; 30 | import net.minecraft.util.math.BlockPos; 31 | import net.minecraft.util.math.Vec3d; 32 | import net.minecraft.util.math.Vec3f; 33 | import net.minecraft.world.World; 34 | 35 | import java.util.UUID; 36 | 37 | public class BlockShipEntity extends PigEntity { 38 | public BlockShipEntity(EntityType entityType, World world) { 39 | super(entityType, world); 40 | } 41 | 42 | @Override 43 | public boolean canWalkOnFluid(Fluid fluid) { 44 | if(this.getEquippedStack(EquipmentSlot.CHEST).getItem()==Items.OAK_PLANKS) 45 | { 46 | if(this.getEquippedStack(EquipmentSlot.CHEST).getNbt().getInt("type")==0) 47 | { 48 | return FluidTags.WATER.contains(fluid); 49 | } 50 | } 51 | return false; 52 | } 53 | 54 | 55 | @Override 56 | public float getSaddledSpeed() { 57 | 58 | float cspeed = Float.parseFloat(ConfigUtils.config.getOrDefault("cspeed","0.2")); 59 | float nspeed = Float.parseFloat(ConfigUtils.config.getOrDefault("nspeed","0.05")); 60 | if(this.getPrimaryPassenger() instanceof PlayerEntity) 61 | { 62 | if(((PlayerEntity) this.getPrimaryPassenger()).getMainHandStack().getItem()== PlatosTransporters.CONTROL_KEY_ITEM) 63 | { 64 | if(this.getEquippedStack(EquipmentSlot.CHEST).getItem()==Items.OAK_PLANKS) 65 | { 66 | if(this.getEquippedStack(EquipmentSlot.CHEST).getNbt().getInt("type")==0) 67 | { 68 | if(this.world.getBlockState(this.getBlockPos().down()).getBlock()== Blocks.WATER) 69 | { 70 | NbtList go = (NbtList) this.getEquippedStack(EquipmentSlot.CHEST).getNbt().get("addons"); 71 | if(go.contains(NbtString.of("engine"))) 72 | { 73 | return cspeed*1.5f; 74 | } 75 | return cspeed; 76 | } 77 | return nspeed; 78 | } 79 | if(this.getEquippedStack(EquipmentSlot.CHEST).getNbt().getInt("type")==1) 80 | { 81 | return 0f; 82 | } 83 | else 84 | { 85 | NbtList go = (NbtList) this.getEquippedStack(EquipmentSlot.CHEST).getNbt().get("addons"); 86 | if(go.contains(NbtString.of("engine"))) 87 | { 88 | return cspeed*1.5f; 89 | } 90 | return cspeed; 91 | } 92 | } 93 | } 94 | } 95 | return 0; 96 | } 97 | 98 | @Override 99 | protected void initGoals() { } 100 | 101 | @Override 102 | public boolean canBeRiddenInWater() { 103 | return true; 104 | } 105 | 106 | @Override 107 | protected SoundEvent getAmbientSound() { 108 | return SoundEvents.ENTITY_BOAT_PADDLE_WATER; 109 | } 110 | 111 | @Override 112 | protected SoundEvent getDeathSound() { 113 | return SoundEvents.ENTITY_BOAT_PADDLE_WATER; 114 | } 115 | 116 | @Override 117 | protected SoundEvent getHurtSound(DamageSource source) { 118 | return SoundEvents.ENTITY_BOAT_PADDLE_WATER; 119 | } 120 | 121 | @Override 122 | protected SoundEvent getFallSound(int distance) { 123 | return SoundEvents.ENTITY_BOAT_PADDLE_WATER; 124 | } 125 | 126 | @Override 127 | protected SoundEvent getSplashSound() { 128 | return SoundEvents.ENTITY_BOAT_PADDLE_WATER; 129 | } 130 | 131 | @Override 132 | protected SoundEvent getSwimSound() { 133 | return SoundEvents.ENTITY_BOAT_PADDLE_WATER; 134 | } 135 | 136 | @Override 137 | protected int computeFallDamage(float fallDistance, float damageMultiplier) { 138 | return 0; 139 | } 140 | 141 | public void setModel(NbtList input, int direction, int offset, int type, NbtCompound storage,NbtList addons) 142 | { 143 | ItemStack itemStack = new ItemStack(Items.OAK_PLANKS); 144 | NbtCompound tag = new NbtCompound(); 145 | tag.putString("model", UUID.randomUUID().toString()); 146 | tag.put("parts",input); 147 | tag.putInt("direction",direction); 148 | tag.putInt("offset",offset); 149 | tag.putInt("type",type); 150 | tag.put("storage",storage); 151 | tag.put("addons",addons); 152 | itemStack.setNbt(tag); 153 | this.equipStack(EquipmentSlot.CHEST,itemStack); 154 | } 155 | 156 | 157 | 158 | @Override 159 | public int getSafeFallDistance() { 160 | return 400; 161 | } 162 | 163 | public void tryDisassemble() 164 | { 165 | if(this.getEquippedStack(EquipmentSlot.CHEST).getItem()==Items.OAK_PLANKS) 166 | { 167 | NbtList list = (NbtList) this.getEquippedStack(EquipmentSlot.CHEST).getNbt().get("parts"); 168 | int offset = this.getEquippedStack(EquipmentSlot.CHEST).getNbt().getInt("offset"); 169 | NbtCompound storage = this.getEquippedStack(EquipmentSlot.CHEST).getNbt().getCompound("storage"); 170 | for (NbtElement tag : list) 171 | { 172 | String[] split = tag.asString().split(" "); 173 | BlockState state =world.getBlockState(this.getBlockPos().add(Integer.parseInt(split[1]), Integer.parseInt(split[2]) + offset, Integer.parseInt(split[3]))); 174 | if (!state.isAir() && !state.isOf(Blocks.WATER)) { 175 | if (this.getPrimaryPassenger() instanceof PlayerEntity) { 176 | ((PlayerEntity) this.getPrimaryPassenger()).sendMessage(new LiteralText("cannot disassemble, not enough space"), false); 177 | } 178 | return; 179 | } 180 | } 181 | list.forEach(block-> 182 | { 183 | String[] split = block.asString().split(" "); 184 | world.setBlockState(this.getBlockPos().add(Integer.parseInt(split[1]),Integer.parseInt(split[2])+offset,Integer.parseInt(split[3])), Block.getStateFromRawId(Integer.parseInt(split[0]))); 185 | }); 186 | storage.getKeys().forEach(blockEntity-> 187 | { 188 | String[] split = blockEntity.split(" "); 189 | BlockPos newpos = this.getBlockPos().add(Integer.parseInt(split[0]),Integer.parseInt(split[1])+offset,Integer.parseInt(split[2])); 190 | BlockEntity entity = world.getBlockEntity(newpos); 191 | NbtCompound data = storage.getCompound(blockEntity); 192 | if(data!=null) 193 | { 194 | data.putInt("x", newpos.getX()); 195 | data.putInt("y", newpos.getY()); 196 | data.putInt("z", newpos.getZ()); 197 | entity.readNbt(data); 198 | entity.markDirty(); 199 | } 200 | }); 201 | this.removeAllPassengers(); 202 | this.teleport(0,-1000,0); 203 | this.dead=true; 204 | this.remove(RemovalReason.DISCARDED); 205 | } 206 | } 207 | 208 | private Integer[] shouldRotateStructure(int i, int j, int k) 209 | { 210 | if(!world.isClient){ 211 | int direction = this.getEquippedStack(EquipmentSlot.CHEST).getNbt().getInt("direction"); 212 | int curDir = getClosestAxis(); 213 | if(direction==curDir) 214 | { 215 | return new Integer[]{i,j,k}; 216 | } 217 | if(direction+90==curDir) 218 | { 219 | return new Integer[]{k,j,i}; 220 | } 221 | if(direction+180==curDir) 222 | { 223 | return new Integer[]{i,j,k}; 224 | } 225 | } 226 | return new Integer[]{0,0,0}; 227 | } 228 | private int getClosestAxis() 229 | { 230 | if(this.getYaw()>135 && this.getYaw()<225) 231 | { 232 | return 180; 233 | } 234 | if(this.getYaw()>225 && this.getYaw()<315) 235 | { 236 | return 270; 237 | } 238 | if(this.getYaw()>45 && this.getYaw()<135) 239 | { 240 | return 90; 241 | } 242 | return 0; 243 | } 244 | 245 | @Override 246 | public boolean cannotDespawn() { 247 | return true; 248 | } 249 | 250 | @Override 251 | protected boolean movesIndependently() { 252 | if(this.getEquippedStack(EquipmentSlot.HEAD).getItem()==Items.STICK) 253 | { 254 | return true; 255 | } 256 | return false; 257 | } 258 | 259 | @Override 260 | public boolean canMoveVoluntarily() { 261 | if(this.getEquippedStack(EquipmentSlot.HEAD).getItem()==Items.STICK) 262 | { 263 | return true; 264 | } 265 | return false; 266 | } 267 | 268 | @Override 269 | protected boolean isImmobile() { 270 | return true; 271 | } 272 | 273 | @Override 274 | public boolean canBeControlledByRider() { 275 | if(this.getEquippedStack(EquipmentSlot.HEAD).getItem()==Items.STICK) 276 | { 277 | return false; 278 | } 279 | return true; 280 | } 281 | 282 | @Override 283 | public ActionResult interactAt(PlayerEntity player, Vec3d hitPos, Hand hand) { 284 | if(!player.getEntityWorld().isClient && player.getStackInHand(hand)==ItemStack.EMPTY && hand==Hand.MAIN_HAND) 285 | { 286 | player.startRiding(this,true); 287 | return ActionResult.SUCCESS; 288 | } 289 | if(!player.getEntityWorld().isClient && player.getStackInHand(hand).getItem()==PlatosTransporters.LIFT_JACK_ITEM && hand==Hand.MAIN_HAND) 290 | { 291 | this.getEquippedStack(EquipmentSlot.CHEST).getNbt().putInt("offset",player.getStackInHand(hand).getNbt().getInt("off")); 292 | return ActionResult.SUCCESS; 293 | } 294 | return ActionResult.FAIL; 295 | } 296 | 297 | @Override 298 | public boolean isInvulnerable() { 299 | return !dead; 300 | } 301 | 302 | @Override 303 | public boolean isInvulnerableTo(DamageSource damageSource) { 304 | if(damageSource!=DamageSource.OUT_OF_WORLD) 305 | { 306 | return true; 307 | } 308 | return false; 309 | } 310 | 311 | 312 | 313 | @Override 314 | public boolean handleFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { 315 | return false; 316 | } 317 | 318 | @Override 319 | public void updatePassengerPosition(Entity passenger) { 320 | int extra = 0; 321 | passenger.fallDistance=0; 322 | if(this.getEquippedStack(EquipmentSlot.CHEST).getItem()==Items.OAK_PLANKS) 323 | { 324 | extra = this.getEquippedStack(EquipmentSlot.CHEST).getNbt().getInt("offset")-1; 325 | } 326 | if(this.getPrimaryPassenger() instanceof PlayerEntity) 327 | { 328 | if(passenger==this.getPrimaryPassenger()) 329 | { 330 | passenger.updatePosition(this.getX(),this.getY()+0.5+extra,this.getZ()); 331 | } 332 | else 333 | { 334 | Vec3f dir = this.getMovementDirection().getOpposite().getUnitVector(); 335 | int vv = this.getPassengerList().indexOf(passenger); 336 | passenger.updatePosition(this.getPrimaryPassenger().getX()+dir.getX()*vv, this.getPrimaryPassenger().getY()+dir.getY()*vv, this.getPrimaryPassenger().getZ()+dir.getZ()*vv); 337 | } 338 | } 339 | } 340 | 341 | @Override 342 | public void onStruckByLightning(ServerWorld world, LightningEntity lightning) { 343 | } 344 | 345 | @Override 346 | public boolean isCollidable() { 347 | return true; 348 | } 349 | 350 | @Override 351 | public boolean collidesWith(Entity other) { 352 | return true; 353 | } 354 | } 355 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/entity/BlockShipEntityModel.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.entity; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.client.MinecraftClient; 5 | import net.minecraft.client.render.VertexConsumer; 6 | import net.minecraft.client.render.VertexConsumerProvider; 7 | import net.minecraft.client.render.entity.model.EntityModel; 8 | import net.minecraft.client.util.math.MatrixStack; 9 | import net.minecraft.entity.EquipmentSlot; 10 | import net.minecraft.item.Items; 11 | import net.minecraft.nbt.NbtCompound; 12 | import net.minecraft.nbt.NbtList; 13 | import net.minecraft.util.math.Vec3f; 14 | 15 | import java.util.HashMap; 16 | 17 | public class BlockShipEntityModel extends EntityModel { 18 | private HashMap entities; 19 | private String ship; 20 | private int direction; 21 | private float xOffset; 22 | private float zOffset; 23 | private int yOffset; 24 | 25 | @Override 26 | public void setAngles(BlockShipEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { 27 | if(this.entities==null) 28 | { 29 | this.entities=new HashMap<>(); 30 | } 31 | if(entity.getEquippedStack(EquipmentSlot.CHEST).getItem()== Items.OAK_PLANKS) 32 | { 33 | NbtCompound tag = entity.getEquippedStack(EquipmentSlot.CHEST).getNbt(); 34 | this.ship=tag.getString("model"); 35 | this.entities.put(this.ship,(NbtList)tag.get("parts")); 36 | this.direction=tag.getInt("direction"); 37 | this.xOffset=getxOffset(); 38 | this.zOffset=getzOffset(); 39 | this.yOffset=tag.getInt("offset"); 40 | } 41 | } 42 | 43 | private float getxOffset() 44 | { 45 | switch (this.direction) 46 | { 47 | case 90: 48 | return 1f; 49 | case 180: 50 | case 0: 51 | return -0.5f; 52 | case 270: 53 | return -2f; 54 | default: 55 | return 0f; 56 | } 57 | } 58 | private float getzOffset() 59 | { 60 | switch (this.direction) 61 | { 62 | case 90: 63 | case 270: 64 | return -0.5f; 65 | case 180: 66 | return 1f; 67 | case 0: 68 | return -2f; 69 | default: 70 | return 0f; 71 | } 72 | } 73 | 74 | 75 | 76 | @Override 77 | public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { 78 | if(this.ship!=null) 79 | { 80 | VertexConsumerProvider vertexConsumerProvider = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); 81 | matrices.push(); 82 | matrices.scale(-1.0F, -1.0F, 1.0F); 83 | matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(this.direction)); 84 | entities.get(this.ship).forEach(line-> 85 | { 86 | String[] compound = line.asString().split(" "); 87 | //Block block = Registry.BLOCK.get(new Identifier(compound[0])); 88 | matrices.push(); 89 | matrices.translate(Double.parseDouble(compound[1])+this.xOffset,Double.parseDouble(compound[2])+this.yOffset-1.5,Double.parseDouble(compound[3])+this.zOffset); 90 | MinecraftClient.getInstance().getBlockRenderManager().renderBlockAsEntity(Block.getStateFromRawId(Integer.parseInt(compound[0])),matrices, vertexConsumerProvider,light,overlay); 91 | matrices.pop(); 92 | }); 93 | matrices.pop(); 94 | } 95 | } 96 | } -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/entity/BlockShipEntityRenderer.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.entity; 2 | 3 | import net.minecraft.client.render.Frustum; 4 | import net.minecraft.client.render.entity.EntityRenderDispatcher; 5 | import net.minecraft.client.render.entity.EntityRendererFactory; 6 | import net.minecraft.client.render.entity.MobEntityRenderer; 7 | import net.minecraft.util.Identifier; 8 | import net.minecraft.util.math.Vec3d; 9 | 10 | public class BlockShipEntityRenderer extends MobEntityRenderer { 11 | 12 | 13 | public BlockShipEntityRenderer(EntityRendererFactory.Context context) { 14 | super(context, new BlockShipEntityModel(),1); 15 | } 16 | 17 | @Override 18 | public Identifier getTexture(BlockShipEntity entity) { 19 | return new Identifier("minecraft","textures/block/acacia_planks.png"); 20 | } 21 | 22 | @Override 23 | public boolean shouldRender(BlockShipEntity mobEntity, Frustum frustum, double d, double e, double f) { 24 | if(mobEntity.getPos().squaredDistanceTo(new Vec3d(d,e,f))<100*100) 25 | { 26 | return true; 27 | } 28 | return super.shouldRender(mobEntity, frustum, d, e, f); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/items/BoardingStairsItem.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.items; 2 | 3 | import gd.rf.acro.platos.PlatosTransporters; 4 | import gd.rf.acro.platos.entity.BlockShipEntity; 5 | import net.minecraft.client.item.TooltipContext; 6 | import net.minecraft.entity.EntityType; 7 | import net.minecraft.entity.LivingEntity; 8 | import net.minecraft.entity.player.PlayerEntity; 9 | import net.minecraft.item.Item; 10 | import net.minecraft.item.ItemStack; 11 | import net.minecraft.particle.ParticleEffect; 12 | import net.minecraft.particle.ParticleType; 13 | import net.minecraft.particle.ParticleTypes; 14 | import net.minecraft.text.Text; 15 | import net.minecraft.text.TranslatableText; 16 | import net.minecraft.util.Hand; 17 | import net.minecraft.util.TypedActionResult; 18 | import net.minecraft.util.hit.HitResult; 19 | import net.minecraft.util.math.Box; 20 | import net.minecraft.world.World; 21 | 22 | import java.util.List; 23 | 24 | public class BoardingStairsItem extends Item { 25 | public BoardingStairsItem(Settings settings) { 26 | super(settings); 27 | } 28 | 29 | @Override 30 | public TypedActionResult use(World world, PlayerEntity user, Hand hand) { 31 | HitResult result =user.raycast(100,0,true); 32 | for (int i = 0; i < 30; i++) { 33 | world.addParticle(ParticleTypes.SMOKE,user.getRotationVector().multiply(i).x,user.getRotationVector().multiply(i).y,user.getRotationVector().multiply(i).z,0,0,0); 34 | } 35 | List vv = world.getEntitiesByType(PlatosTransporters.BLOCK_SHIP_ENTITY_ENTITY_TYPE,new Box(result.getPos().add(-10,-10,-10),result.getPos().add(10,10,10)), LivingEntity::isAlive); 36 | if(vv.size()>0) 37 | { 38 | user.startRiding(vv.get(0)); 39 | } 40 | return super.use(world, user, hand); 41 | } 42 | 43 | @Override 44 | public void appendTooltip(ItemStack stack, World world, List tooltip, TooltipContext context) { 45 | super.appendTooltip(stack, world, tooltip, context); 46 | tooltip.add(new TranslatableText("boardingstairs.platos.tooltip")); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/items/ClearingScytheItem.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.items; 2 | 3 | import gd.rf.acro.platos.PlatosTransporters; 4 | import net.minecraft.client.item.TooltipContext; 5 | import net.minecraft.entity.player.PlayerEntity; 6 | import net.minecraft.item.Item; 7 | import net.minecraft.item.ItemStack; 8 | import net.minecraft.text.Text; 9 | import net.minecraft.text.TranslatableText; 10 | import net.minecraft.util.Hand; 11 | import net.minecraft.util.TypedActionResult; 12 | import net.minecraft.util.math.BlockPos; 13 | import net.minecraft.world.World; 14 | 15 | import java.util.List; 16 | 17 | public class ClearingScytheItem extends Item { 18 | public ClearingScytheItem(Settings settings) { 19 | super(settings); 20 | } 21 | 22 | @Override 23 | public TypedActionResult use(World world, PlayerEntity user, Hand hand) { 24 | for (int i = user.getBlockPos().getX()-10; i < user.getBlockPos().getX()+10; i++) { 25 | for (int j = user.getBlockPos().getY()-3; j < user.getBlockPos().getY()+3; j++) { 26 | for (int k = user.getBlockPos().getZ()-10; k < user.getBlockPos().getZ()+10; k++) { 27 | if(PlatosTransporters.SCYTHEABLE.contains(world.getBlockState(new BlockPos(i,j,k)).getBlock())) 28 | { 29 | world.breakBlock(new BlockPos(i,j,k),true,user); 30 | user.getStackInHand(hand).damage(1,user,(dobreak)-> dobreak.sendToolBreakStatus(hand)); 31 | } 32 | } 33 | } 34 | } 35 | return super.use(world, user, hand); 36 | } 37 | 38 | @Override 39 | public void appendTooltip(ItemStack stack, World world, List tooltip, TooltipContext context) { 40 | super.appendTooltip(stack, world, tooltip, context); 41 | tooltip.add(new TranslatableText("scythe.platos.tooltip")); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/items/ControlKeyItem.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.items; 2 | 3 | import gd.rf.acro.platos.PlatosTransporters; 4 | import gd.rf.acro.platos.entity.BlockShipEntity; 5 | import net.minecraft.entity.EquipmentSlot; 6 | import net.minecraft.entity.effect.StatusEffectInstance; 7 | import net.minecraft.entity.effect.StatusEffects; 8 | import net.minecraft.entity.player.PlayerEntity; 9 | import net.minecraft.item.Item; 10 | import net.minecraft.item.ItemStack; 11 | import net.minecraft.nbt.NbtCompound; 12 | import net.minecraft.nbt.NbtList; 13 | import net.minecraft.nbt.NbtString; 14 | import net.minecraft.util.Hand; 15 | import net.minecraft.util.TypedActionResult; 16 | import net.minecraft.world.World; 17 | 18 | public class ControlKeyItem extends Item { 19 | public ControlKeyItem(Settings settings) { 20 | super(settings); 21 | } 22 | 23 | @Override 24 | public TypedActionResult use(World world, PlayerEntity user, Hand hand) { 25 | if(user.getVehicle() instanceof BlockShipEntity && !world.isClient) 26 | { 27 | NbtCompound tag =((BlockShipEntity) user.getVehicle()).getEquippedStack(EquipmentSlot.CHEST).getNbt(); 28 | if(tag.getInt("type")==1) 29 | { 30 | user.getVehicle().setVelocity(user.getRotationVector().x,user.getRotationVector().y,user.getRotationVector().z); 31 | if(((NbtList)tag.get("addons")).contains(NbtString.of("altitude"))) 32 | { 33 | user.getVehicle().setNoGravity(false); 34 | ((BlockShipEntity) user.getVehicle()).addStatusEffect(new StatusEffectInstance(StatusEffects.SLOW_FALLING, 9999, 2, true, false)); 35 | } 36 | 37 | } 38 | } 39 | PlatosTransporters.givePlayerStartBook(user); 40 | return super.use(world, user, hand); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/items/LiftJackItem.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.items; 2 | 3 | import gd.rf.acro.platos.PlatosTransporters; 4 | import net.minecraft.client.item.TooltipContext; 5 | import net.minecraft.entity.Entity; 6 | import net.minecraft.entity.player.PlayerEntity; 7 | import net.minecraft.item.Item; 8 | import net.minecraft.item.ItemStack; 9 | import net.minecraft.item.ItemUsageContext; 10 | import net.minecraft.nbt.NbtCompound; 11 | import net.minecraft.text.LiteralText; 12 | import net.minecraft.text.Text; 13 | import net.minecraft.text.TranslatableText; 14 | import net.minecraft.util.ActionResult; 15 | import net.minecraft.util.Hand; 16 | import net.minecraft.world.World; 17 | 18 | import java.util.List; 19 | 20 | public class LiftJackItem extends Item { 21 | public LiftJackItem(Settings settings) { 22 | super(settings); 23 | } 24 | 25 | @Override 26 | public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) { 27 | if(!stack.hasNbt()) 28 | { 29 | NbtCompound tag = new NbtCompound(); 30 | tag.putInt("off",1); 31 | stack.setNbt(tag); 32 | } 33 | } 34 | 35 | @Override 36 | public ActionResult useOnBlock(ItemUsageContext context) { 37 | if(context.getWorld().getBlockState(context.getBlockPos()).getBlock()!= PlatosTransporters.BLOCK_CONTROL_WHEEL) 38 | { 39 | PlayerEntity user = context.getPlayer(); 40 | Hand hand = context.getHand(); 41 | NbtCompound tag = new NbtCompound(); 42 | tag.putInt("off",1); 43 | if(user.getStackInHand(hand).hasNbt()) 44 | { 45 | tag=user.getStackInHand(hand).getNbt(); 46 | } 47 | if(user.isSneaking() && tag.getInt("off")>1) 48 | { 49 | tag.putInt("off",tag.getInt("off")-1); 50 | 51 | } 52 | else 53 | { 54 | tag.putInt("off",tag.getInt("off")+1); 55 | } 56 | user.sendMessage(new LiteralText("new height: "+tag.getInt("off")),true); 57 | user.getStackInHand(hand).setNbt(tag); 58 | PlatosTransporters.givePlayerStartBook(user); 59 | } 60 | return super.useOnBlock(context); 61 | } 62 | 63 | @Override 64 | public void appendTooltip(ItemStack stack, World world, List tooltip, TooltipContext context) { 65 | super.appendTooltip(stack, world, tooltip, context); 66 | if(stack.hasNbt()) 67 | { 68 | tooltip.add(new TranslatableText("liftjack.platos.tooltip")); 69 | tooltip.add(new LiteralText(stack.getNbt().getInt("off")+" ").append(new TranslatableText("liftjack.platos.tooltip2"))); 70 | 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/gd/rf/acro/platos/items/WrenchItem.java: -------------------------------------------------------------------------------- 1 | package gd.rf.acro.platos.items; 2 | 3 | import gd.rf.acro.platos.PlatosTransporters; 4 | import gd.rf.acro.platos.entity.BlockShipEntity; 5 | import net.minecraft.entity.player.PlayerEntity; 6 | import net.minecraft.item.Item; 7 | import net.minecraft.item.ItemStack; 8 | import net.minecraft.item.Items; 9 | import net.minecraft.nbt.NbtCompound; 10 | import net.minecraft.nbt.NbtList; 11 | import net.minecraft.nbt.NbtString; 12 | import net.minecraft.util.Hand; 13 | import net.minecraft.util.TypedActionResult; 14 | import net.minecraft.world.World; 15 | 16 | public class WrenchItem extends Item { 17 | public WrenchItem(Settings settings) { 18 | super(settings); 19 | } 20 | 21 | @Override 22 | public TypedActionResult use(World world, PlayerEntity user, Hand hand) { 23 | if(user.getVehicle() instanceof BlockShipEntity) 24 | { 25 | ((BlockShipEntity) user.getVehicle()).tryDisassemble(); 26 | } 27 | else 28 | { 29 | PlatosTransporters.givePlayerStartBook(user); 30 | } 31 | return super.use(world, user, hand); 32 | } 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/resources/assets/platos/blockstates/balloon_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { "model": "platos:block/balloon_block" } 4 | } 5 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/blockstates/float_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { "model": "platos:block/float_block" } 4 | } 5 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/blockstates/ship_controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "facing=north": { "model": "platos:block/ship_controller" }, 4 | "facing=east": { "model": "platos:block/ship_controller", "y": 90 }, 5 | "facing=south": { "model": "platos:block/ship_controller", "y": 180 }, 6 | "facing=west": { "model": "platos:block/ship_controller", "y": 270 } 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/blockstates/wheel_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { "model": "platos:block/wheel_block" } 4 | } 5 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JSJBDEV/PlatosTransporters/8239c5ea04fe9b613253fdaef05611b810999a50/src/main/resources/assets/platos/icon.png -------------------------------------------------------------------------------- /src/main/resources/assets/platos/lang/ar_sa.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.platos.control_key": "مفتاح التحكم", 3 | "item.platos.wrench": "مفتاح الصواميل", 4 | "item.platos.lift_jack": "سكين الرفع", 5 | "item.platos.clearing_scythe": "محش", 6 | 7 | "block.platos.ship_controller": "جهاز التحكم", 8 | "block.platos.wheel_block": "عجلة", 9 | "block.platos.float_block": "عوامة", 10 | "block.platos.balloon_block": "منطاد", 11 | 12 | "itemGroup.platos.tab": "مواصلات أفلاطون" 13 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/lang/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.platos.control_key": "Control Key", 3 | "item.platos.wrench": "Disassembly Wrench", 4 | "item.platos.lift_jack": "Ship Lift Jack", 5 | "item.platos.clearing_scythe": "Clearing Scythe", 6 | "item.platos.boarding_stairs": "Boarding Stairs", 7 | 8 | "block.platos.ship_controller": "Ship Controller Assembly", 9 | "block.platos.wheel_block": "Wheel", 10 | "block.platos.float_block": "Water Float", 11 | "block.platos.balloon_block": "Airship Balloon", 12 | 13 | "scythe.platos.tooltip": "use this item to clear away grass!", 14 | "liftjack.platos.tooltip":"The player will be sitting on the block", 15 | "liftjack.platos.tooltip2": "above ground/water level", 16 | "boardingstairs.platos.tooltip": "Point at a distant vehicle and interact to get on!", 17 | 18 | "itemGroup.platos.tab": "Plato's Transporters", 19 | 20 | "category.platos.main": "Plato's Transporters", 21 | 22 | "key.platos.up": "Fly airship up", 23 | "key.platos.down": "Fly airship down", 24 | "key.platos.stop": "Freeze/Unfreeze airship direction", 25 | 26 | "book.platos.page1": "Welcome to platos transporters, this mod is in early release so there could be §lbugs", 27 | "book.platos.page2": "§lGetting Started§r \n\nTo get started you first need to craft a §oShip Controller§r and a §oControl Key§r you may also want to craft a §oShip Lift Jack§r. To create a vehicle, it requires the correct amount of floats, balloons or wheel for it's desired terrain", 28 | "book.platos.page3": "1 Water Float = 20 blocks \n\n1 Wheel = 10 blocks \n\n1 airship Balloon = 2 blocks \n\n(these are all configurable) assembly your ship out of valid boat materials and then place the controller", 29 | "book.platos.page4": "The controller will tell you if there is any mistakes or it will create your vehicle. By default the block the player sits on (in front of the controller) will be 1 block above the ground, to change this, use the lift jack", 30 | "book.platos.page5": "the lift jack can raise and lower where the player sits by using or shift-using it (on a block) respectively, to change the height (listed on the jack's tooltip) you can interact with the controller block with the jack in your main hand", 31 | "book.platos.page6": "Once the vehicle is created there is a few controls, to make the water and land variants go forward, one must simply hold the control key, whereas the airship will travel in the direction the player is looking when the key is being used", 32 | "book.platos.page7": "To disassemble the vehicle you must sit on it and then use the Disassembly wrench, it will turn back into blocks IN THE DIRECTION IT WAS BUILT IN if there is space" 33 | 34 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/lang/es_ES.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.platos.control_key": "Clave de Control", 3 | "item.platos.wrench": "Herramienta de Desmontaje", 4 | "item.platos.lift_jack": "Gato de Elevación", 5 | "item.platos.clearing_scythe": "Guadaña", 6 | "item.platos.boarding_stairs": "Escaleras de Embarque", 7 | 8 | "block.platos.ship_controller": "Asamblea Control de Vehículo", 9 | "block.platos.wheel_block": "Rueda", 10 | "block.platos.float_block": "Flotador", 11 | "block.platos.balloon_block": "Globo de Dirigible", 12 | 13 | "scythe.platos.tooltip": "¡Usa esta ítem para cortar la hierba!", 14 | "liftjack.platos.tooltip": "El jugador estará sentado en el bloque", 15 | "liftjack.platos.tooltip2": "encima del nivel del mar/la tierra.", 16 | "boardingstairs.platos.tooltip": "¡Punta a un vehículo distante y haz clic para montar!", 17 | 18 | "itemGroup.platos.tab": "Transportadores de Plato", 19 | 20 | "category.platos.main": "Transportadores de Plato", 21 | 22 | "key.platos.up": "Dirigible hacia arriba", 23 | "key.platos.down": "Dirigible hacia abajo", 24 | "key.platos.stop": "Mantener/desmaneter la posición del vehículo", 25 | 26 | "book.platos.page1": "Bienvenidas a Transportadores de Plato, este mod es un actualización anticipada así que puede contener §lbugs. Traducido al español por kapparill (https://youtube.com/kapparill)", 27 | "book.platos.page2": "§lA empezar§r \n\nPara empezar, primera necesitas crear una §oAsamblea Control de Vehículo§r y un §oClave de Control§r. Puedes crear un §oGato de Elevación§r, también. Para crear un vehículo, necesita el monto correcto de flotadores, globos, o ruedas para su tereno deseado.", 28 | "book.platos.page3": "1 Flotador = 20 bloques \n\n1 Rueda = 10 bloques \n\n1 Globo de Dirigible = 2 bloques \n\n(todos son configurables) armar tu vehículo con materiales correctos de vehículo y luego pones la controlador.", 29 | "book.platos.page4": "El controlador te dirá si hay errores, o va a armar tu vehículo. Por defecto, el bloque en el que el jugador se sienta estará uno bloque hacia arriba del tierra. Para cambiar eso, usa el Gato de Elevación.", 30 | "book.platos.page5": "El Gato de Elevación puede levantar y bajar donde sienta el jugador cuando se hace clic. Para cambiar la altura, haz clic en la Asamblea Control de Vehículo con el Gato de Elevación en la mano.", 31 | "book.platos.page6": "Cuando se crea el vehículo, hay unos controles. Hacer los tipos mar y tierra avanzar, necesitas tener la Clave de Control en la mano, pero si estás usando un dirigible, el vehículo avanzará en tangente del jugador.", 32 | "book.platos.page7": "Para hace un desmontaje del vehículo, debes sentarte en él y luego usar la Herramienta de Desmontaje, si hay espacio." 33 | 34 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/lang/ko_kr.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.platos.control_key": "기구 제어용 열쇠", 3 | "item.platos.wrench": "해체용 렌치", 4 | "item.platos.lift_jack": "기구 잭", 5 | "item.platos.clearing_scythe": "청소용 낫", 6 | 7 | "block.platos.ship_controller": "기구 조종간", 8 | "block.platos.wheel_block": "바퀴", 9 | "block.platos.float_block": "부유용 기낭", 10 | "block.platos.balloon_block": "비행선 기낭", 11 | 12 | "itemGroup.platos.tab": "플라톤의 탈것" 13 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/lang/ru_ru.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "item.platos.control_key": "Ключ Контороля", 4 | "item.platos.wrench": "Ключ для Разборки Судна", 5 | "item.platos.lift_jack": "Домкрат", 6 | "item.platos.clearing_scythe": "Коса", 7 | "item.platos.boarding_stairs": "Посадочная Лестница", 8 | 9 | "block.platos.ship_controller": "Контролер Судна", 10 | "block.platos.wheel_block": "Колесо", 11 | "block.platos.float_block": "Двигатель корабля", 12 | "block.platos.balloon_block": "Воздушный Шар Дирижабля", 13 | 14 | "scythe.platos.tooltip": "используйте этот предмет, чтобы убрать траву!", 15 | "liftjack.platos.tooltip":"Игрок будет сидеть на блоке", 16 | "liftjack.platos.tooltip2": "над уровнем земли/воды", 17 | "boardingstairs.platos.tooltip": "Наведите на отдаленный автомобиль и взаимодействуйте, чтобы попасть дальше!", 18 | 19 | "itemGroup.platos.tab": "Plato's Transporters", 20 | 21 | "book.platos.page1": "Добро пожаловать в platos transporters, этот мод находится в раннем выпуске, так что там может быть §l,баги", 22 | "book.platos.page2": "§lПриступая к работе§r \n\nЧтобы начать работу, вам сначала нужно создать §oКонтролер Судна§r и §oКлюч Контороля§r возможно, вы также захотите создать §oДомкрат§r. Чтобы создать транспортное средство, ему требуется правильное количество двигателей корабля, воздушных шаров или колес для желаемой местности", 23 | "book.platos.page3": "1 Двигатель Корабля = 20 блоков \n\n1 Колесо = 10 блоков \n\n1 Воздушный Шар Дирижабля = 2 блока \n\n(все они настраиваются в конфиге) соберите свой корабль из действительных материалов лодки, а затем Поместите контроллер", 24 | "book.platos.page4": "Контроллер сообщит вам, есть ли какие-либо ошибки, или он создаст ваш автомобиль. По умолчанию блок на котором сидит игрок (в передней части геймпада) будет находиться 1 блок над землей, чтобы изменить это, используйте домкрат", 25 | "book.platos.page5": "Домкрат может подниматься и опускаться там, где сидит игрок, чтобы опустить использовать Shift+ПКМ (по блоку), чтобы изменить высоту судна (указанную во всплывающей подсказке домкрата), вы можете взаимодействовать с блоком контроллера с домкратом в вашей основной руке", 26 | "book.platos.page6": "Как только транспортное средство создано, есть несколько элементов управления, чтобы заставить водные и наземные варианты двигаться вперед, нужно просто держать ключ управления, в то время как дирижабль будет двигаться в том направлении, куда смотрит игрок, когда используется ключ (ПКМ)", 27 | "book.platos.page7": "Чтобы разобрать автомобиль, вы должны сесть на него, а затем использовать ключ для разборки, он снова превратится в блоки в том направлении, в котором он был постороен, если есть место" 28 | 29 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/lang/zh_cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "item.platos.control_key": "驾驶钥匙", 3 | "item.platos.wrench": "拆卸扳手", 4 | "item.platos.lift_jack": "载具起重器", 5 | "item.platos.clearing_scythe": "除草镰刀", 6 | "item.platos.boarding_stairs": "舷梯", 7 | 8 | "block.platos.ship_controller": "载具控制器", 9 | "block.platos.wheel_block": "车轮", 10 | "block.platos.float_block": "浮筒", 11 | "block.platos.balloon_block": "气囊", 12 | 13 | "scythe.platos.tooltip": "高效除草!", 14 | "liftjack.platos.tooltip":"玩家将会坐在这个方块上", 15 | "liftjack.platos.tooltip2": "高于地面或水面的格数", 16 | "boardingstairs.platos.tooltip": "对准远处的载具按右键驾驶!", 17 | 18 | "itemGroup.platos.tab": "Plato's Transporters", 19 | 20 | "book.platos.page1": "欢迎来到 Plato's Transporters 模组,本模组仍处于早起测试版本,所以可能存在§l漏洞", 21 | "book.platos.page2": "§l开始建造§r \n\n首先,你需要制作一个§o载具控制器§r以及一把§o驾驶钥匙§r,你也可能需要一个§o载具起重器§r。要建造一辆载具,你需要根据载具类型和尺寸的不同制作相应数量的车轮、浮筒或气囊。", 22 | "book.platos.page3": "1个车轮支持10个方块 \n\n1个浮筒支持20个方块 \n\n1个气囊支持2个方块 \n\n(这些是可以配置的)使用相应材料建造好你的载具,然后在上面放置载具控制器。", 23 | "book.platos.page4": "对着载具控制器按下右键将会提示是否有建造错误或者成功创建出载具实体,所有容器和物品也都会保存完好。默认情况下玩家将会坐在载具控制器正前方距离地面1格高的位置,你可以使用载具起重器改变驾驶时的位置。", 24 | "book.platos.page5": "载具起重器可以升降玩家驾驶时的位置,按右键或蹲下按右键更改高度(当前高度会显示在物品提示框),将载具起重器放在主手并对着载具控制器按右键即可改变驾驶高度。", 25 | "book.platos.page6": "建造好载具后只需要手持驾驶钥匙即可向面朝着的方向前进,飞艇可以通过抬头或低头进行升降。", 26 | "book.platos.page7": "你可以坐在驾驶座上按右键使用拆卸扳手来将载具变回方块。在旧版本中载具将会依照建造时的方向摆放,并且需要这个方向上没有方块阻挡才能成功,新版可能会有所改变。" 27 | 28 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/block/balloon_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "1": "block/white_wool", 5 | "particle": "block/white_wool" 6 | }, 7 | "elements": [ 8 | { 9 | "from": [1, 1, 1], 10 | "to": [15, 15, 15], 11 | "rotation": {"angle": 0, "axis": "y", "origin": [9, 9, 9]}, 12 | "faces": { 13 | "north": {"uv": [0, 0, 14, 14], "texture": "#1"}, 14 | "east": {"uv": [0, 0, 14, 14], "texture": "#1"}, 15 | "south": {"uv": [0, 0, 14, 14], "texture": "#1"}, 16 | "west": {"uv": [0, 0, 14, 14], "texture": "#1"}, 17 | "up": {"uv": [0, 0, 14, 14], "texture": "#1"}, 18 | "down": {"uv": [0, 0, 14, 14], "texture": "#1"} 19 | } 20 | }, 21 | { 22 | "from": [2, 2, 0], 23 | "to": [14, 14, 1], 24 | "rotation": {"angle": 0, "axis": "y", "origin": [10, 10, 8]}, 25 | "faces": { 26 | "north": {"uv": [0, 0, 12, 12], "texture": "#1"}, 27 | "east": {"uv": [0, 0, 1, 12], "texture": "#1"}, 28 | "south": {"uv": [0, 0, 12, 12], "texture": "#1"}, 29 | "west": {"uv": [0, 0, 1, 12], "texture": "#1"}, 30 | "up": {"uv": [0, 0, 12, 1], "texture": "#1"}, 31 | "down": {"uv": [0, 0, 12, 1], "texture": "#1"} 32 | } 33 | }, 34 | { 35 | "from": [2, 2, 15], 36 | "to": [14, 14, 16], 37 | "rotation": {"angle": 0, "axis": "y", "origin": [10, 10, 23]}, 38 | "faces": { 39 | "north": {"uv": [0, 0, 12, 12], "texture": "#1"}, 40 | "east": {"uv": [0, 0, 1, 12], "texture": "#1"}, 41 | "south": {"uv": [0, 0, 12, 12], "texture": "#1"}, 42 | "west": {"uv": [0, 0, 1, 12], "texture": "#1"}, 43 | "up": {"uv": [0, 0, 12, 1], "texture": "#1"}, 44 | "down": {"uv": [0, 0, 12, 1], "texture": "#1"} 45 | } 46 | }, 47 | { 48 | "from": [2, 0, 2], 49 | "to": [14, 1, 14], 50 | "rotation": {"angle": 0, "axis": "y", "origin": [10, 9, 10]}, 51 | "faces": { 52 | "north": {"uv": [0, 0, 12, 1], "texture": "#1"}, 53 | "east": {"uv": [0, 0, 12, 1], "texture": "#1"}, 54 | "south": {"uv": [0, 0, 12, 1], "texture": "#1"}, 55 | "west": {"uv": [0, 0, 12, 1], "texture": "#1"}, 56 | "up": {"uv": [0, 0, 12, 12], "texture": "#1"}, 57 | "down": {"uv": [0, 0, 12, 12], "texture": "#1"} 58 | } 59 | }, 60 | { 61 | "from": [2, 15, 2], 62 | "to": [14, 16, 14], 63 | "rotation": {"angle": 0, "axis": "y", "origin": [10, 24, 10]}, 64 | "faces": { 65 | "north": {"uv": [0, 0, 12, 1], "texture": "#1"}, 66 | "east": {"uv": [0, 0, 12, 1], "texture": "#1"}, 67 | "south": {"uv": [0, 0, 12, 1], "texture": "#1"}, 68 | "west": {"uv": [0, 0, 12, 1], "texture": "#1"}, 69 | "up": {"uv": [0, 0, 12, 12], "texture": "#1"}, 70 | "down": {"uv": [0, 0, 12, 12], "texture": "#1"} 71 | } 72 | } 73 | ], 74 | "display": { 75 | "thirdperson_righthand": { 76 | "scale": [0.5, 0.5, 0.5] 77 | }, 78 | "gui": { 79 | "rotation": [45, 45, 0], 80 | "translation": [0, 0.5, 0], 81 | "scale": [0.5, 0.5, 0.5] 82 | } 83 | } 84 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/block/float_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "1": "block/blue_concrete_powder", 5 | "particle": "block/blue_concrete_powder" 6 | }, 7 | "elements": [ 8 | { 9 | "from": [1, 1, 1], 10 | "to": [15, 15, 15], 11 | "rotation": {"angle": 0, "axis": "y", "origin": [9, 9, 9]}, 12 | "faces": { 13 | "north": {"uv": [0, 0, 14, 14], "texture": "#1"}, 14 | "east": {"uv": [0, 0, 14, 14], "texture": "#1"}, 15 | "south": {"uv": [0, 0, 14, 14], "texture": "#1"}, 16 | "west": {"uv": [0, 0, 14, 14], "texture": "#1"}, 17 | "up": {"uv": [0, 0, 14, 14], "texture": "#1"}, 18 | "down": {"uv": [0, 0, 14, 14], "texture": "#1"} 19 | } 20 | }, 21 | { 22 | "from": [2, 2, 0], 23 | "to": [14, 14, 1], 24 | "rotation": {"angle": 0, "axis": "y", "origin": [10, 10, 8]}, 25 | "faces": { 26 | "north": {"uv": [0, 0, 12, 12], "texture": "#1"}, 27 | "east": {"uv": [0, 0, 1, 12], "texture": "#1"}, 28 | "south": {"uv": [0, 0, 12, 12], "texture": "#1"}, 29 | "west": {"uv": [0, 0, 1, 12], "texture": "#1"}, 30 | "up": {"uv": [0, 0, 12, 1], "texture": "#1"}, 31 | "down": {"uv": [0, 0, 12, 1], "texture": "#1"} 32 | } 33 | }, 34 | { 35 | "from": [2, 2, 15], 36 | "to": [14, 14, 16], 37 | "rotation": {"angle": 0, "axis": "y", "origin": [10, 10, 23]}, 38 | "faces": { 39 | "north": {"uv": [0, 0, 12, 12], "texture": "#1"}, 40 | "east": {"uv": [0, 0, 1, 12], "texture": "#1"}, 41 | "south": {"uv": [0, 0, 12, 12], "texture": "#1"}, 42 | "west": {"uv": [0, 0, 1, 12], "texture": "#1"}, 43 | "up": {"uv": [0, 0, 12, 1], "texture": "#1"}, 44 | "down": {"uv": [0, 0, 12, 1], "texture": "#1"} 45 | } 46 | }, 47 | { 48 | "from": [2, 0, 2], 49 | "to": [14, 1, 14], 50 | "rotation": {"angle": 0, "axis": "y", "origin": [10, 9, 10]}, 51 | "faces": { 52 | "north": {"uv": [0, 0, 12, 1], "texture": "#1"}, 53 | "east": {"uv": [0, 0, 12, 1], "texture": "#1"}, 54 | "south": {"uv": [0, 0, 12, 1], "texture": "#1"}, 55 | "west": {"uv": [0, 0, 12, 1], "texture": "#1"}, 56 | "up": {"uv": [0, 0, 12, 12], "texture": "#1"}, 57 | "down": {"uv": [0, 0, 12, 12], "texture": "#1"} 58 | } 59 | }, 60 | { 61 | "from": [2, 15, 2], 62 | "to": [14, 16, 14], 63 | "rotation": {"angle": 0, "axis": "y", "origin": [10, 24, 10]}, 64 | "faces": { 65 | "north": {"uv": [0, 0, 12, 1], "texture": "#1"}, 66 | "east": {"uv": [0, 0, 12, 1], "texture": "#1"}, 67 | "south": {"uv": [0, 0, 12, 1], "texture": "#1"}, 68 | "west": {"uv": [0, 0, 12, 1], "texture": "#1"}, 69 | "up": {"uv": [0, 0, 12, 12], "texture": "#1"}, 70 | "down": {"uv": [0, 0, 12, 12], "texture": "#1"} 71 | } 72 | } 73 | ], 74 | "display": { 75 | "thirdperson_righthand": { 76 | "scale": [0.5, 0.5, 0.5] 77 | }, 78 | "gui": { 79 | "rotation": [45, 45, 0], 80 | "translation": [0, 0.5, 0], 81 | "scale": [0.5, 0.5, 0.5] 82 | } 83 | } 84 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/block/ship_controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "3": "block/black_concrete", 5 | "4": "block/brown_wool", 6 | "6": "block/red_concrete", 7 | "7": "block/iron_block", 8 | "10": "block/oak_planks", 9 | "particle": "block/oak_planks" 10 | }, 11 | "elements": [ 12 | { 13 | "from": [0, 1, 0], 14 | "to": [16, 12, 10.8], 15 | "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 11]}, 16 | "faces": { 17 | "north": {"uv": [0, 0, 16, 9], "texture": "#10"}, 18 | "east": {"uv": [0, 0, 10.8, 9], "texture": "#10"}, 19 | "south": {"uv": [0, 0, 16, 9], "texture": "#10"}, 20 | "west": {"uv": [0, 0, 10.8, 9], "texture": "#10"}, 21 | "up": {"uv": [0, 0, 16, 10.8], "texture": "#10"}, 22 | "down": {"uv": [0, 0, 16, 10.8], "texture": "#10"} 23 | } 24 | }, 25 | { 26 | "from": [0, 0, 0], 27 | "to": [16, 1, 16], 28 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 11, 4]}, 29 | "faces": { 30 | "north": {"uv": [0, 2, 16, 3], "texture": "#10"}, 31 | "east": {"uv": [0, 1, 16, 2], "texture": "#10"}, 32 | "south": {"uv": [0, 0, 14, 1], "texture": "#10"}, 33 | "west": {"uv": [0, 2, 16, 3], "texture": "#10"}, 34 | "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#10"}, 35 | "down": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#10"} 36 | } 37 | }, 38 | { 39 | "from": [0, 0, 16], 40 | "to": [16, 1, 32], 41 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 11, 4]}, 42 | "faces": { 43 | "north": {"uv": [0, 0, 14, 1], "texture": "#10"}, 44 | "east": {"uv": [0, 1, 16, 2], "texture": "#10"}, 45 | "south": {"uv": [0, 0, 14, 1], "texture": "#10"}, 46 | "west": {"uv": [0, 2, 16, 3], "texture": "#10"}, 47 | "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#10"}, 48 | "down": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#10"} 49 | } 50 | }, 51 | { 52 | "from": [1, 14.79048, 30], 53 | "to": [15, 27.79048, 32], 54 | "rotation": {"angle": 22.5, "axis": "x", "origin": [9, 10, -1], "rescale": true}, 55 | "faces": { 56 | "north": {"uv": [0, 0, 14, 13], "texture": "#4"}, 57 | "east": {"uv": [0, 0, 2, 13], "texture": "#4"}, 58 | "south": {"uv": [0, 0, 14, 13], "texture": "#4"}, 59 | "west": {"uv": [0, 0, 2, 13], "texture": "#4"}, 60 | "up": {"uv": [0, 0, 14, 2], "texture": "#4"}, 61 | "down": {"uv": [0, 0, 14, 2], "texture": "#4"} 62 | } 63 | }, 64 | { 65 | "from": [15, 1, 23], 66 | "to": [17, 7, 32], 67 | "rotation": {"angle": 0, "axis": "x", "origin": [23, 3, 23], "rescale": true}, 68 | "faces": { 69 | "north": {"uv": [0, 0, 2, 6], "texture": "#4"}, 70 | "east": {"uv": [0, 0, 9, 6], "texture": "#4"}, 71 | "south": {"uv": [0, 0, 2, 6], "texture": "#4"}, 72 | "west": {"uv": [0, 0, 9, 6], "texture": "#4"}, 73 | "up": {"uv": [0, 0, 2, 9], "texture": "#4"}, 74 | "down": {"uv": [0, 0, 2, 9], "texture": "#4"} 75 | } 76 | }, 77 | { 78 | "from": [0, -1.2, 29], 79 | "to": [16, -0.2, 32], 80 | "rotation": {"angle": 0, "axis": "x", "origin": [8, -4.2, 22], "rescale": true}, 81 | "faces": { 82 | "north": {"uv": [0, 0, 16, 1], "texture": "#10"}, 83 | "east": {"uv": [0, 0, 3, 1], "texture": "#10"}, 84 | "south": {"uv": [0, 6, 16, 7], "texture": "#10"}, 85 | "west": {"uv": [0, 0, 3, 1], "texture": "#10"}, 86 | "up": {"uv": [0, 0, 16, 3], "texture": "#10"}, 87 | "down": {"uv": [0, 0, 16, 3], "texture": "#10"} 88 | } 89 | }, 90 | { 91 | "name": "cube2", 92 | "from": [-1, 1, 23], 93 | "to": [1, 7, 32], 94 | "rotation": {"angle": 0, "axis": "x", "origin": [7, 3, 23], "rescale": true}, 95 | "faces": { 96 | "north": {"uv": [0, 0, 2, 6], "texture": "#4"}, 97 | "east": {"uv": [0, 0, 9, 6], "texture": "#4"}, 98 | "south": {"uv": [0, 0, 2, 6], "texture": "#4"}, 99 | "west": {"uv": [0, 0, 9, 6], "texture": "#4"}, 100 | "up": {"uv": [0, 0, 2, 9], "texture": "#4"}, 101 | "down": {"uv": [0, 0, 2, 9], "texture": "#4"} 102 | } 103 | }, 104 | { 105 | "from": [1, 10, 18], 106 | "to": [15, 11, 27], 107 | "rotation": {"angle": 0, "axis": "x", "origin": [9, 33, 10], "rescale": true}, 108 | "faces": { 109 | "north": {"uv": [0, 0, 14, 1], "rotation": 180, "texture": "#4"}, 110 | "east": {"uv": [0, 0, 1, 8], "rotation": 270, "texture": "#4"}, 111 | "south": {"uv": [0, 0, 14, 1], "texture": "#4"}, 112 | "west": {"uv": [0, 0, 1, 8], "rotation": 90, "texture": "#4"}, 113 | "up": {"uv": [0, 0, 14, 8], "rotation": 180, "texture": "#4"}, 114 | "down": {"uv": [0, 0, 14, 8], "texture": "#4"} 115 | } 116 | }, 117 | { 118 | "from": [13, 1.73629, 11.83556], 119 | "to": [14.8, 11.73629, 13.83556], 120 | "rotation": {"angle": -22.5, "axis": "x", "origin": [5, 15, 6]}, 121 | "faces": { 122 | "north": {"uv": [0, 0, 10, 1.8], "rotation": 270, "texture": "#3"}, 123 | "east": {"uv": [0, 0, 10, 2], "rotation": 270, "texture": "#3"}, 124 | "south": {"uv": [0, 0, 10, 1.8], "rotation": 90, "texture": "#3"}, 125 | "west": {"uv": [0, 0, 10, 2], "rotation": 270, "texture": "#3"}, 126 | "up": {"uv": [0, 0, 2, 1.8], "rotation": 90, "texture": "#3"}, 127 | "down": {"uv": [0, 0, 2, 1.8], "texture": "#3"} 128 | } 129 | }, 130 | { 131 | "from": [3, 9.73629, 11.83556], 132 | "to": [13, 11.73629, 13.83556], 133 | "rotation": {"angle": -22.5, "axis": "x", "origin": [5, 15, 6]}, 134 | "faces": { 135 | "north": {"uv": [0, 0, 10, 2], "texture": "#6"}, 136 | "east": {"uv": [0, 0, 2, 2], "texture": "#6"}, 137 | "south": {"uv": [0, 0, 10, 2], "texture": "#6"}, 138 | "west": {"uv": [0, 0, 2, 2], "texture": "#6"}, 139 | "up": {"uv": [0, 0, 10, 2], "rotation": 180, "texture": "#6"}, 140 | "down": {"uv": [0, 0, 10, 2], "rotation": 180, "texture": "#6"} 141 | } 142 | }, 143 | { 144 | "from": [3, 2.73629, 11.83556], 145 | "to": [13, 4.73629, 13.83556], 146 | "rotation": {"angle": -22.5, "axis": "x", "origin": [5, 15, 6]}, 147 | "faces": { 148 | "north": {"uv": [0, 0, 10, 10], "texture": "#6"}, 149 | "east": {"uv": [0, 0, 2, 10], "texture": "#6"}, 150 | "south": {"uv": [0, 0, 16, 16], "texture": "#6"}, 151 | "west": {"uv": [0, 0, 2, 10], "texture": "#6"}, 152 | "up": {"uv": [0, 0, 10, 2], "rotation": 180, "texture": "#6"}, 153 | "down": {"uv": [0, 0, 10, 2], "rotation": 180, "texture": "#6"} 154 | } 155 | }, 156 | { 157 | "from": [6, 2.63629, 11.53556], 158 | "to": [10, 11.93629, 14.03556], 159 | "rotation": {"angle": -22.5, "axis": "x", "origin": [5, 15, 6]}, 160 | "faces": { 161 | "north": {"uv": [0, 0, 9.2, 4], "rotation": 270, "texture": "#3"}, 162 | "east": {"uv": [0, 0, 9.2, 2.5], "rotation": 270, "texture": "#3"}, 163 | "south": {"uv": [0, 0, 9.2, 4], "rotation": 90, "texture": "#3"}, 164 | "west": {"uv": [0, 0, 9.2, 2.5], "rotation": 270, "texture": "#3"}, 165 | "up": {"uv": [0, 0, 2.5, 4], "rotation": 90, "texture": "#3"}, 166 | "down": {"uv": [0, 0, 2.5, 4], "rotation": 90, "texture": "#3"} 167 | } 168 | }, 169 | { 170 | "from": [1.05, 1.73629, 11.83556], 171 | "to": [3, 11.73629, 13.83556], 172 | "rotation": {"angle": -22.5, "axis": "x", "origin": [5, 15, 6]}, 173 | "faces": { 174 | "north": {"uv": [0, 0, 10, 1.95], "rotation": 270, "texture": "#3"}, 175 | "east": {"uv": [0, 0, 10, 2], "rotation": 270, "texture": "#3"}, 176 | "south": {"uv": [0, 0, 10, 1.95], "rotation": 90, "texture": "#3"}, 177 | "west": {"uv": [0, 0, 2, 10], "texture": "#3"}, 178 | "up": {"uv": [0, 0, 2, 1.95], "rotation": 90, "texture": "#3"}, 179 | "down": {"uv": [0, 0, 2, 1.95], "rotation": 90, "texture": "#3"} 180 | } 181 | }, 182 | { 183 | "from": [5, 1, 8], 184 | "to": [11, 10.8, 11], 185 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 11, 4]}, 186 | "faces": { 187 | "north": {"uv": [4, 2, 10, 14.8], "texture": "#7"}, 188 | "east": {"uv": [4, 2, 7, 14.8], "texture": "#7"}, 189 | "south": {"uv": [3, 2, 9, 14.8], "texture": "#7"}, 190 | "west": {"uv": [4, 3, 7, 15.8], "texture": "#7"}, 191 | "up": {"uv": [9, 1, 15, 4], "rotation": 180, "texture": "#7"}, 192 | "down": {"uv": [5, 4, 11, 7], "rotation": 180, "texture": "#7"} 193 | } 194 | }, 195 | { 196 | "from": [4.9, 6.02209, 9.15871], 197 | "to": [11.1, 9.02209, 12.95871], 198 | "rotation": {"angle": -22.5, "axis": "x", "origin": [5, 11, 4]}, 199 | "faces": { 200 | "north": {"uv": [5, 4, 11.2, 7], "texture": "#7"}, 201 | "east": {"uv": [4, 2, 7, 5.8], "rotation": 270, "texture": "#7"}, 202 | "south": {"uv": [9, 1, 15.2, 4], "rotation": 180, "texture": "#7"}, 203 | "west": {"uv": [4, 3, 7, 6.8], "rotation": 90, "texture": "#7"}, 204 | "up": {"uv": [4, 2, 10.2, 5.8], "rotation": 180, "texture": "#7"}, 205 | "down": {"uv": [3, 2, 9.2, 5.8], "texture": "#7"} 206 | } 207 | } 208 | ], 209 | "display": { 210 | "thirdperson_righthand": { 211 | "rotation": [52.75, -90.5, -3.5], 212 | "translation": [0, 3.5, -0.75], 213 | "scale": [0.5, 0.5, 0.5] 214 | }, 215 | "firstperson_righthand": { 216 | "translation": [5, 0, 0] 217 | }, 218 | "firstperson_lefthand": { 219 | "translation": [4.75, 0, 0], 220 | "scale": [0.32227, 0.32227, 0.32227] 221 | }, 222 | "ground": { 223 | "translation": [0, 4, -10.25] 224 | }, 225 | "gui": { 226 | "rotation": [45, 45, 0], 227 | "translation": [-3, 2.5, 0], 228 | "scale": [0.41406, 0.41406, 0.41406] 229 | }, 230 | "head": { 231 | "translation": [0, 0, -20.75] 232 | }, 233 | "fixed": { 234 | "translation": [0, 0, -13] 235 | } 236 | }, 237 | "groups": [0, 1, 2, 238 | { 239 | "name": "down", 240 | "origin": [5, 11, 4], 241 | "children": [3, 4, 5, 6, 7] 242 | }, 243 | { 244 | "name": "group", 245 | "origin": [5, 15, 6], 246 | "children": [ 247 | { 248 | "name": "group", 249 | "origin": [5, 15, 6], 250 | "children": [8, 9, 10, 11, 12] 251 | }, 252 | { 253 | "name": "group", 254 | "origin": [5, 11, 4], 255 | "children": [13, 14] 256 | } 257 | ] 258 | } 259 | ] 260 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/block/wheel_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "0": "block/black_concrete_powder", 5 | "1": "block/acacia_planks", 6 | "2": "block/iron_block", 7 | "particle": "block/black_concrete_powder" 8 | }, 9 | "elements": [ 10 | { 11 | "from": [6, 0, 2], 12 | "to": [10, 2, 14], 13 | "rotation": {"angle": 0, "axis": "y", "origin": [14, 8, 10]}, 14 | "faces": { 15 | "north": {"uv": [0, 0, 4, 2], "texture": "#0"}, 16 | "east": {"uv": [0, 0, 12, 2], "texture": "#0"}, 17 | "south": {"uv": [0, 0, 4, 2], "texture": "#0"}, 18 | "west": {"uv": [0, 0, 12, 2], "texture": "#0"}, 19 | "up": {"uv": [0, 0, 4, 12], "texture": "#0"}, 20 | "down": {"uv": [0, 0, 4, 12], "texture": "#0"} 21 | } 22 | }, 23 | { 24 | "from": [7, 7, 2], 25 | "to": [9, 9, 6], 26 | "rotation": {"angle": 0, "axis": "y", "origin": [15, 15, 10]}, 27 | "faces": { 28 | "north": {"uv": [0, 0, 2, 2], "texture": "#1"}, 29 | "east": {"uv": [0, 0, 4, 2], "texture": "#1"}, 30 | "south": {"uv": [0, 0, 2, 2], "texture": "#1"}, 31 | "west": {"uv": [0, 0, 4, 2], "texture": "#1"}, 32 | "up": {"uv": [0, 0, 2, 4], "texture": "#1"}, 33 | "down": {"uv": [0, 0, 2, 4], "texture": "#1"} 34 | } 35 | }, 36 | { 37 | "from": [7, 7, 10], 38 | "to": [9, 9, 14], 39 | "rotation": {"angle": 0, "axis": "y", "origin": [15, 15, 18]}, 40 | "faces": { 41 | "north": {"uv": [0, 0, 2, 2], "texture": "#1"}, 42 | "east": {"uv": [0, 0, 4, 2], "texture": "#1"}, 43 | "south": {"uv": [0, 0, 2, 2], "texture": "#1"}, 44 | "west": {"uv": [0, 0, 4, 2], "texture": "#1"}, 45 | "up": {"uv": [0, 0, 2, 4], "texture": "#1"}, 46 | "down": {"uv": [0, 0, 2, 4], "texture": "#1"} 47 | } 48 | }, 49 | { 50 | "from": [7, 10, 7], 51 | "to": [9, 14, 9], 52 | "rotation": {"angle": 0, "axis": "x", "origin": [15, 6, 15]}, 53 | "faces": { 54 | "north": {"uv": [0, 0, 2, 4], "rotation": 180, "texture": "#1"}, 55 | "east": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#1"}, 56 | "south": {"uv": [0, 0, 2, 4], "texture": "#1"}, 57 | "west": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#1"}, 58 | "up": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#1"}, 59 | "down": {"uv": [0, 0, 2, 2], "texture": "#1"} 60 | } 61 | }, 62 | { 63 | "from": [7, 2, 7], 64 | "to": [9, 6, 9], 65 | "rotation": {"angle": 0, "axis": "x", "origin": [15, -2, 15]}, 66 | "faces": { 67 | "north": {"uv": [0, 0, 2, 4], "rotation": 180, "texture": "#1"}, 68 | "east": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#1"}, 69 | "south": {"uv": [0, 0, 2, 4], "texture": "#1"}, 70 | "west": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#1"}, 71 | "up": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#1"}, 72 | "down": {"uv": [0, 0, 2, 2], "texture": "#1"} 73 | } 74 | }, 75 | { 76 | "from": [7, 6, 6], 77 | "to": [9, 10, 10], 78 | "rotation": {"angle": 0, "axis": "x", "origin": [15, 2, 14]}, 79 | "faces": { 80 | "north": {"uv": [0, 0, 2, 4], "rotation": 180, "texture": "#2"}, 81 | "east": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#2"}, 82 | "south": {"uv": [0, 0, 2, 4], "texture": "#2"}, 83 | "west": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#2"}, 84 | "up": {"uv": [0, 0, 2, 4], "rotation": 180, "texture": "#2"}, 85 | "down": {"uv": [0, 0, 2, 4], "texture": "#2"} 86 | } 87 | }, 88 | { 89 | "from": [6, 14, 2], 90 | "to": [10, 16, 14], 91 | "rotation": {"angle": 0, "axis": "y", "origin": [14, 22, 10]}, 92 | "faces": { 93 | "north": {"uv": [0, 0, 4, 2], "texture": "#0"}, 94 | "east": {"uv": [0, 0, 12, 2], "texture": "#0"}, 95 | "south": {"uv": [0, 0, 4, 2], "texture": "#0"}, 96 | "west": {"uv": [0, 0, 12, 2], "texture": "#0"}, 97 | "up": {"uv": [0, 0, 4, 12], "texture": "#0"}, 98 | "down": {"uv": [0, 0, 4, 12], "texture": "#0"} 99 | } 100 | }, 101 | { 102 | "from": [6, 2, 0], 103 | "to": [10, 14, 2], 104 | "rotation": {"angle": 0, "axis": "y", "origin": [14, 10, 8]}, 105 | "faces": { 106 | "north": {"uv": [0, 0, 4, 12], "texture": "#0"}, 107 | "east": {"uv": [0, 0, 2, 12], "texture": "#0"}, 108 | "south": {"uv": [0, 0, 4, 12], "texture": "#0"}, 109 | "west": {"uv": [0, 0, 2, 12], "texture": "#0"}, 110 | "up": {"uv": [0, 0, 4, 2], "texture": "#0"}, 111 | "down": {"uv": [0, 0, 4, 2], "texture": "#0"} 112 | } 113 | }, 114 | { 115 | "from": [6, 2, 14], 116 | "to": [10, 14, 16], 117 | "rotation": {"angle": 0, "axis": "y", "origin": [14, 10, 22]}, 118 | "faces": { 119 | "north": {"uv": [0, 0, 4, 12], "texture": "#0"}, 120 | "east": {"uv": [0, 0, 2, 12], "texture": "#0"}, 121 | "south": {"uv": [0, 0, 4, 12], "texture": "#0"}, 122 | "west": {"uv": [0, 0, 2, 12], "texture": "#0"}, 123 | "up": {"uv": [0, 0, 4, 2], "texture": "#0"}, 124 | "down": {"uv": [0, 0, 4, 2], "texture": "#0"} 125 | } 126 | } 127 | ], 128 | "display": { 129 | "gui": { 130 | "rotation": [0, 52, 0], 131 | "scale": [0.5, 0.5, 0.5] 132 | } 133 | }, 134 | "groups": [ 135 | { 136 | "name": "group", 137 | "origin": [14, 10, 22], 138 | "children": [0, 1, 2, 3, 4, 5, 6, 7, 8] 139 | } 140 | ] 141 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/balloon_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "platos:block/balloon_block" 3 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/boarding_stairs.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "0": "block/oak_planks", 5 | "1": "block/red_glazed_terracotta", 6 | "particle": "block/oak_planks" 7 | }, 8 | "elements": [ 9 | { 10 | "from": [0, 0, 0], 11 | "to": [16, 13, 4], 12 | "faces": { 13 | "north": {"uv": [0, 0, 16, 13], "texture": "#0"}, 14 | "east": {"uv": [0, 0, 4, 13], "texture": "#0"}, 15 | "south": {"uv": [0, 0, 16, 13], "texture": "#0"}, 16 | "west": {"uv": [0, 0, 4, 13], "texture": "#0"}, 17 | "up": {"uv": [0, 0, 16, 4], "texture": "#0"}, 18 | "down": {"uv": [0, 0, 16, 4], "texture": "#0"} 19 | } 20 | }, 21 | { 22 | "from": [0, 0, 4], 23 | "to": [16, 8, 8], 24 | "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 12]}, 25 | "faces": { 26 | "north": {"uv": [0, 0, 16, 8], "texture": "#0"}, 27 | "east": {"uv": [0, 0, 4, 8], "texture": "#0"}, 28 | "south": {"uv": [0, 0, 16, 8], "texture": "#0"}, 29 | "west": {"uv": [0, 0, 4, 8], "texture": "#0"}, 30 | "up": {"uv": [0, 0, 16, 4], "texture": "#0"}, 31 | "down": {"uv": [0, 0, 16, 4], "texture": "#0"} 32 | } 33 | }, 34 | { 35 | "from": [0, 0, 8], 36 | "to": [16, 4, 12], 37 | "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 16]}, 38 | "faces": { 39 | "north": {"uv": [0, 0, 16, 4], "texture": "#0"}, 40 | "east": {"uv": [0, 0, 4, 4], "texture": "#0"}, 41 | "south": {"uv": [0, 0, 16, 4], "texture": "#0"}, 42 | "west": {"uv": [0, 0, 4, 4], "texture": "#0"}, 43 | "up": {"uv": [0, 0, 16, 4], "texture": "#0"}, 44 | "down": {"uv": [0, 0, 16, 4], "texture": "#0"} 45 | } 46 | }, 47 | { 48 | "from": [0, 0, 12], 49 | "to": [16, 1, 16], 50 | "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 20]}, 51 | "faces": { 52 | "north": {"uv": [0, 0, 16, 1], "texture": "#1"}, 53 | "east": {"uv": [0, 0, 4, 1], "texture": "#1"}, 54 | "south": {"uv": [0, 0, 16, 1], "texture": "#1"}, 55 | "west": {"uv": [0, 0, 4, 1], "texture": "#1"}, 56 | "up": {"uv": [0, 0, 16, 4], "texture": "#1"}, 57 | "down": {"uv": [0, 0, 16, 4], "texture": "#1"} 58 | } 59 | } 60 | ], 61 | "display": { 62 | "firstperson_righthand": { 63 | "translation": [3.75, 1.25, 0] 64 | }, 65 | "firstperson_lefthand": { 66 | "translation": [4.5, 2.25, 0] 67 | }, 68 | "gui": { 69 | "rotation": [28, 46, 0], 70 | "translation": [0, 1.75, 0], 71 | "scale": [0.63, 0.63, 0.63] 72 | }, 73 | "fixed": { 74 | "rotation": [0, -180, 0], 75 | "translation": [0, 0, -7.5] 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/clearing_scythe.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "0": "block/acacia_planks", 5 | "1": "block/red_wool", 6 | "2": "block/iron_block", 7 | "particle": "block/acacia_planks" 8 | }, 9 | "elements": [ 10 | { 11 | "from": [-5, 0, 6], 12 | "to": [14, 1, 7], 13 | "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, 14]}, 14 | "faces": { 15 | "north": {"uv": [0, 0, 16, 1], "texture": "#0"}, 16 | "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, 17 | "south": {"uv": [0, 0, 16, 1], "texture": "#0"}, 18 | "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, 19 | "up": {"uv": [0, 0, 16, 1], "texture": "#0"}, 20 | "down": {"uv": [0, 0, 16, 1], "texture": "#0"} 21 | } 22 | }, 23 | { 24 | "from": [11, -0.1, 8], 25 | "to": [13, 1.1, 17], 26 | "rotation": {"angle": -22.5, "axis": "y", "origin": [19, 8, 11]}, 27 | "faces": { 28 | "north": {"uv": [0, 0, 2, 1.2], "texture": "#2"}, 29 | "east": {"uv": [0, 0, 9, 1.2], "texture": "#2"}, 30 | "south": {"uv": [0, 0, 2, 1.2], "texture": "#2"}, 31 | "west": {"uv": [0, 0, 9, 1.2], "texture": "#2"}, 32 | "up": {"uv": [0, 0, 9, 2], "rotation": 270, "texture": "#2"}, 33 | "down": {"uv": [0, 0, 9, 2], "rotation": 90, "texture": "#2"} 34 | } 35 | }, 36 | { 37 | "from": [5, 0, 3], 38 | "to": [6, 1, 6], 39 | "rotation": {"angle": 0, "axis": "y", "origin": [13, 8, 6]}, 40 | "faces": { 41 | "north": {"uv": [0, 0, 1, 1], "texture": "#1"}, 42 | "east": {"uv": [0, 0, 3, 1], "texture": "#1"}, 43 | "south": {"uv": [0, 0, 1, 1], "texture": "#1"}, 44 | "west": {"uv": [0, 0, 3, 1], "texture": "#1"}, 45 | "up": {"uv": [0, 0, 3, 1], "rotation": 270, "texture": "#1"}, 46 | "down": {"uv": [0, 0, 3, 1], "rotation": 90, "texture": "#1"} 47 | } 48 | }, 49 | { 50 | "from": [5, 0, 7], 51 | "to": [6, 1, 10], 52 | "rotation": {"angle": 0, "axis": "y", "origin": [13, 8, 10]}, 53 | "faces": { 54 | "north": {"uv": [0, 0, 1, 1], "texture": "#1"}, 55 | "east": {"uv": [0, 0, 3, 1], "texture": "#1"}, 56 | "south": {"uv": [0, 0, 1, 1], "texture": "#1"}, 57 | "west": {"uv": [0, 0, 3, 1], "texture": "#1"}, 58 | "up": {"uv": [0, 0, 3, 1], "rotation": 270, "texture": "#1"}, 59 | "down": {"uv": [0, 0, 3, 1], "rotation": 90, "texture": "#1"} 60 | } 61 | } 62 | ], 63 | "display": { 64 | "thirdperson_righthand": { 65 | "rotation": [-1, -180, 90], 66 | "translation": [7.75, 6.75, 0] 67 | }, 68 | "firstperson_righthand": { 69 | "rotation": [-180, -22, -90], 70 | "translation": [5, 8.25, -2.75] 71 | }, 72 | "gui": { 73 | "rotation": [62, 47, 0], 74 | "translation": [1.25, 3.25, 0], 75 | "scale": [0.6, 0.6, 0.6] 76 | }, 77 | "fixed": { 78 | "rotation": [89, 1, 0], 79 | "translation": [3.25, 0, 7] 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/control_key.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "0": "block/gold_block", 5 | "particle": "block/gold_block" 6 | }, 7 | "elements": [ 8 | { 9 | "from": [4, 0, 5], 10 | "to": [5, 1, 9], 11 | "rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 13]}, 12 | "faces": { 13 | "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, 14 | "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, 15 | "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, 16 | "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, 17 | "up": {"uv": [7, 4, 11, 8], "texture": "#0"}, 18 | "down": {"uv": [0, 0, 4, 4], "texture": "#0"} 19 | } 20 | }, 21 | { 22 | "from": [7, 0, 5], 23 | "to": [8, 1, 9], 24 | "rotation": {"angle": 0, "axis": "y", "origin": [15, 8, 13]}, 25 | "faces": { 26 | "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, 27 | "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, 28 | "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, 29 | "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, 30 | "up": {"uv": [7, 4, 11, 8], "texture": "#0"}, 31 | "down": {"uv": [0, 0, 4, 4], "texture": "#0"} 32 | } 33 | }, 34 | { 35 | "from": [5, 0, 5], 36 | "to": [7, 1, 6], 37 | "rotation": {"angle": 0, "axis": "y", "origin": [1, 8, 13]}, 38 | "faces": { 39 | "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, 40 | "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, 41 | "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, 42 | "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, 43 | "up": {"uv": [7, 4, 11, 8], "rotation": 90, "texture": "#0"}, 44 | "down": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#0"} 45 | } 46 | }, 47 | { 48 | "from": [5, 0, 8], 49 | "to": [7, 1, 9], 50 | "rotation": {"angle": 0, "axis": "y", "origin": [1, 8, 16]}, 51 | "faces": { 52 | "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, 53 | "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, 54 | "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, 55 | "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, 56 | "up": {"uv": [7, 4, 11, 8], "rotation": 90, "texture": "#0"}, 57 | "down": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#0"} 58 | } 59 | }, 60 | { 61 | "from": [8, 0, 5], 62 | "to": [12, 1, 7], 63 | "rotation": {"angle": 0, "axis": "y", "origin": [16, 8, 13]}, 64 | "faces": { 65 | "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, 66 | "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, 67 | "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, 68 | "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, 69 | "up": {"uv": [0, 0, 4, 2], "texture": "#0"}, 70 | "down": {"uv": [0, 0, 4, 2], "texture": "#0"} 71 | } 72 | }, 73 | { 74 | "from": [11, 0, 7], 75 | "to": [12, 1, 9], 76 | "rotation": {"angle": 0, "axis": "y", "origin": [19, 8, 15]}, 77 | "faces": { 78 | "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, 79 | "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, 80 | "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, 81 | "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, 82 | "up": {"uv": [0, 0, 1, 2], "texture": "#0"}, 83 | "down": {"uv": [0, 0, 1, 2], "texture": "#0"} 84 | } 85 | }, 86 | { 87 | "from": [9, 0, 7], 88 | "to": [10, 1, 9], 89 | "rotation": {"angle": 0, "axis": "y", "origin": [17, 8, 15]}, 90 | "faces": { 91 | "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, 92 | "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, 93 | "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, 94 | "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, 95 | "up": {"uv": [0, 0, 1, 2], "texture": "#0"}, 96 | "down": {"uv": [0, 0, 1, 2], "texture": "#0"} 97 | } 98 | } 99 | ], 100 | "display": { 101 | "thirdperson_righthand": { 102 | "rotation": [-145, 0, -90], 103 | "translation": [7.25, 2.5, 1] 104 | }, 105 | "thirdperson_lefthand": { 106 | "translation": [0, 7.5, 1.25] 107 | }, 108 | "firstperson_righthand": { 109 | "rotation": [-7, -180, 83], 110 | "translation": [8.5, 6.5, 0] 111 | }, 112 | "gui": { 113 | "rotation": [50, 55, 0], 114 | "translation": [0.75, 4.75, 0] 115 | } 116 | } 117 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/float_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "platos:block/float_block" 3 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/lift_jack.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "0": "block/acacia_planks", 5 | "1": "block/iron_block", 6 | "particle": "block/acacia_planks" 7 | }, 8 | "elements": [ 9 | { 10 | "from": [6, 0, 0], 11 | "to": [10, 1, 16], 12 | "rotation": {"angle": 0, "axis": "y", "origin": [14, 8, 8]}, 13 | "faces": { 14 | "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, 15 | "east": {"uv": [0, 0, 16, 1], "texture": "#0"}, 16 | "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, 17 | "west": {"uv": [0, 0, 16, 1], "texture": "#0"}, 18 | "up": {"uv": [0, 0, 4, 16], "texture": "#0"}, 19 | "down": {"uv": [0, 0, 4, 16], "texture": "#0"} 20 | } 21 | }, 22 | { 23 | "from": [7, 3, -3], 24 | "to": [9, 4, 10], 25 | "rotation": {"angle": -22.5, "axis": "x", "origin": [15, 11, 5]}, 26 | "faces": { 27 | "north": {"uv": [0, 0, 2, 1], "texture": "#1"}, 28 | "east": {"uv": [0, 0, 13, 1], "texture": "#1"}, 29 | "south": {"uv": [0, 0, 2, 1], "texture": "#1"}, 30 | "west": {"uv": [0, 0, 13, 1], "texture": "#1"}, 31 | "up": {"uv": [0, 0, 2, 13], "texture": "#1"}, 32 | "down": {"uv": [0, 0, 2, 13], "texture": "#1"} 33 | } 34 | }, 35 | { 36 | "from": [7, -1, 9], 37 | "to": [9, 0, 16], 38 | "rotation": {"angle": 22.5, "axis": "x", "origin": [15, 7, 17]}, 39 | "faces": { 40 | "north": {"uv": [0, 0, 2, 1], "texture": "#1"}, 41 | "east": {"uv": [0, 0, 7, 1], "texture": "#1"}, 42 | "south": {"uv": [0, 0, 2, 1], "texture": "#1"}, 43 | "west": {"uv": [0, 0, 7, 1], "texture": "#1"}, 44 | "up": {"uv": [0, 0, 2, 7], "texture": "#1"}, 45 | "down": {"uv": [0, 0, 2, 7], "texture": "#1"} 46 | } 47 | } 48 | ], 49 | "display": { 50 | "thirdperson_righthand": { 51 | "translation": [0, 7.5, 0] 52 | }, 53 | "firstperson_righthand": { 54 | "translation": [0, 8.75, 0] 55 | }, 56 | "gui": { 57 | "rotation": [45, 45, 0], 58 | "translation": [0, 5.75, 0] 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/ship_controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "platos:block/ship_controller" 3 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/wheel_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "platos:block/wheel_block" 3 | } -------------------------------------------------------------------------------- /src/main/resources/assets/platos/models/item/wrench.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "0": "block/iron_block", 5 | "1": "block/blue_wool", 6 | "2": "block/brewing_stand_base", 7 | "particle": "block/iron_block" 8 | }, 9 | "elements": [ 10 | { 11 | "from": [7, 0, 0], 12 | "to": [9, 1, 7], 13 | "rotation": {"angle": 0, "axis": "y", "origin": [15, 8, 8]}, 14 | "faces": { 15 | "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, 16 | "east": {"uv": [0, 0, 7, 1], "texture": "#2"}, 17 | "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, 18 | "west": {"uv": [0, 0, 7, 1], "texture": "#2"}, 19 | "up": {"uv": [0, 0, 2, 7], "texture": "#2"}, 20 | "down": {"uv": [0, 0, 2, 7], "texture": "#2"} 21 | } 22 | }, 23 | { 24 | "from": [5, 0, 7], 25 | "to": [10, 1, 8], 26 | "rotation": {"angle": 0, "axis": "y", "origin": [13, 8, 15]}, 27 | "faces": { 28 | "north": {"uv": [0, 0, 5, 1], "texture": "#1"}, 29 | "east": {"uv": [0, 0, 1, 1], "texture": "#1"}, 30 | "south": {"uv": [0, 0, 5, 1], "texture": "#1"}, 31 | "west": {"uv": [0, 0, 1, 1], "texture": "#1"}, 32 | "up": {"uv": [0, 0, 5, 1], "texture": "#1"}, 33 | "down": {"uv": [0, 0, 5, 1], "texture": "#1"} 34 | } 35 | }, 36 | { 37 | "from": [4, 0, 8], 38 | "to": [6, 1, 12], 39 | "rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 16]}, 40 | "faces": { 41 | "north": {"uv": [0, 0, 2, 1], "texture": "#0"}, 42 | "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, 43 | "south": {"uv": [0, 0, 2, 1], "texture": "#0"}, 44 | "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, 45 | "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, 46 | "down": {"uv": [0, 0, 2, 4], "texture": "#0"} 47 | } 48 | }, 49 | { 50 | "from": [7, 0, 8], 51 | "to": [9, 1, 9], 52 | "rotation": {"angle": 0, "axis": "y", "origin": [15, 8, 16]}, 53 | "faces": { 54 | "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, 55 | "east": {"uv": [0, 0, 1, 1], "texture": "#2"}, 56 | "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, 57 | "west": {"uv": [0, 0, 1, 1], "texture": "#2"}, 58 | "up": {"uv": [0, 0, 2, 1], "texture": "#2"}, 59 | "down": {"uv": [0, 0, 2, 1], "texture": "#2"} 60 | } 61 | }, 62 | { 63 | "from": [4, 0, 12], 64 | "to": [8, 1, 14], 65 | "rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 20]}, 66 | "faces": { 67 | "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, 68 | "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, 69 | "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, 70 | "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, 71 | "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, 72 | "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} 73 | } 74 | }, 75 | { 76 | "from": [8, 0, 10], 77 | "to": [10, 1, 14], 78 | "rotation": {"angle": 0, "axis": "y", "origin": [16, 8, 18]}, 79 | "faces": { 80 | "north": {"uv": [0, 0, 2, 1], "texture": "#0"}, 81 | "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, 82 | "south": {"uv": [0, 0, 2, 1], "texture": "#0"}, 83 | "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, 84 | "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, 85 | "down": {"uv": [0, 0, 2, 4], "texture": "#0"} 86 | } 87 | } 88 | ], 89 | "display": { 90 | "thirdperson_righthand": { 91 | "rotation": [-67, -1, 87], 92 | "translation": [-7.25, 4.5, 2.5] 93 | }, 94 | "firstperson_righthand": { 95 | "rotation": [79, -175, -81], 96 | "translation": [-2.5, 6, -1.25] 97 | }, 98 | "gui": { 99 | "rotation": [-143, 57, 0], 100 | "translation": [0.75, -5, 0] 101 | } 102 | } 103 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/loot_tables/blocks/balloon_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "rolls": 1, 6 | "entries": [ 7 | { 8 | "type": "minecraft:item", 9 | "name": "platos:balloon_block" 10 | } 11 | ], 12 | "conditions": [ 13 | { 14 | "condition": "minecraft:survives_explosion" 15 | } 16 | ] 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/loot_tables/blocks/float_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "rolls": 1, 6 | "entries": [ 7 | { 8 | "type": "minecraft:item", 9 | "name": "platos:float_block" 10 | } 11 | ], 12 | "conditions": [ 13 | { 14 | "condition": "minecraft:survives_explosion" 15 | } 16 | ] 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/loot_tables/blocks/ship_controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "rolls": 1, 6 | "entries": [ 7 | { 8 | "type": "minecraft:item", 9 | "name": "platos:ship_controller" 10 | } 11 | ], 12 | "conditions": [ 13 | { 14 | "condition": "minecraft:survives_explosion" 15 | } 16 | ] 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/loot_tables/blocks/wheel_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "rolls": 1, 6 | "entries": [ 7 | { 8 | "type": "minecraft:item", 9 | "name": "platos:wheel_block" 10 | } 11 | ], 12 | "conditions": [ 13 | { 14 | "condition": "minecraft:survives_explosion" 15 | } 16 | ] 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/balloon.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "WWW", 6 | "WBW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": { 11 | "tag": "minecraft:wool" 12 | }, 13 | "B": { 14 | "item": "minecraft:glowstone" 15 | } 16 | }, 17 | "result": { 18 | "item": "platos:balloon_block", 19 | "count": 1 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/boardingstairs.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "SWW", 6 | "SSW", 7 | "SSS" 8 | ], 9 | "key": { 10 | "W": { 11 | "tag": "minecraft:wool" 12 | }, 13 | "S": { 14 | "tag": "minecraft:stairs" 15 | } 16 | }, 17 | "result": { 18 | "item": "platos:boarding_stairs", 19 | "count": 1 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/control_key.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "WW ", 6 | "WRW", 7 | " WW" 8 | ], 9 | "key": { 10 | "W": { 11 | "item": "minecraft:gold_nugget" 12 | }, 13 | "R": { 14 | "item": "minecraft:iron_ingot" 15 | } 16 | }, 17 | "result": { 18 | "item": "platos:control_key", 19 | "count": 1 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/controller.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "EWE", 6 | "WBW", 7 | "EWE" 8 | ], 9 | "key": { 10 | "W": { 11 | "item": "minecraft:iron_ingot" 12 | }, 13 | "E": { 14 | "tag": "minecraft:logs" 15 | }, 16 | "B": { 17 | "item": "minecraft:clock" 18 | } 19 | }, 20 | "result": { 21 | "item": "platos:ship_controller", 22 | "count": 1 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/float.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "WWW", 6 | "WBW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": { 11 | "tag": "minecraft:wool" 12 | }, 13 | "B": { 14 | "item": "minecraft:stick" 15 | } 16 | }, 17 | "result": { 18 | "item": "platos:float_block", 19 | "count": 1 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/lift_jack.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "WW ", 6 | "WRW", 7 | "RRR" 8 | ], 9 | "key": { 10 | "W": { 11 | "item": "minecraft:iron_ingot" 12 | }, 13 | "R": { 14 | "tag": "minecraft:planks" 15 | } 16 | }, 17 | "result": { 18 | "item": "platos:lift_jack", 19 | "count": 1 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/scythe.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "IHI", 6 | "IHI", 7 | "IHI" 8 | ], 9 | "key": { 10 | "I": { 11 | "item": "minecraft:iron_ingot" 12 | }, 13 | "H": { 14 | "item": "minecraft:stone_hoe" 15 | } 16 | }, 17 | "result": { 18 | "item": "platos:clearing_scythe", 19 | "count": 1 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/wheel.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "WWW", 6 | "WBW", 7 | "WWW" 8 | ], 9 | "key": { 10 | "W": { 11 | "item": "minecraft:iron_nugget" 12 | }, 13 | "B": { 14 | "tag": "minecraft:logs" 15 | } 16 | }, 17 | "result": { 18 | "item": "platos:wheel_block", 19 | "count": 1 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/recipes/wrench.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "group": "platos", 4 | "pattern": [ 5 | "RW ", 6 | "WRW", 7 | " WW" 8 | ], 9 | "key": { 10 | "W": { 11 | "item": "minecraft:cobblestone" 12 | }, 13 | "R": { 14 | "item": "minecraft:iron_ingot" 15 | } 16 | }, 17 | "result": { 18 | "item": "platos:wrench", 19 | "count": 1 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/tags/blocks/boat_material.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "#minecraft:planks", 5 | "#minecraft:wooden_stairs", 6 | "#minecraft:wooden_slabs", 7 | "#minecraft:wooden_fences", 8 | "#minecraft:wooden_trapdoors", 9 | "#minecraft:wool", 10 | "platos:ship_controller", 11 | "platos:wheel_block", 12 | "platos:float_block", 13 | "platos:balloon_block", 14 | "#minecraft:logs", 15 | "#minecraft:buttons", 16 | "#minecraft:carpets", 17 | "minecraft:glass" 18 | ] 19 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/tags/blocks/boat_material_blacklist.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "#minecraft:bamboo_plantable_on", 5 | "#minecraft:wither_immune", 6 | "#minecraft:flowers", 7 | "#minecraft:crops", 8 | "#minecraft:ice", 9 | "#minecraft:leaves", 10 | "#minecraft:nylium", 11 | "minecraft:stone", 12 | "minecraft:snow", 13 | "minecraft:snow_block", 14 | "minecraft:tall_grass", 15 | "minecraft:grass", 16 | "minecraft:infested_stone", 17 | "minecraft:sugar_cane", 18 | "minecraft:bamboo", 19 | "#minecraft:tall_flowers", 20 | "minecraft:large_fern", 21 | "minecraft:fern", 22 | "minecraft:netherrack", 23 | "minecraft:dead_bush", 24 | "minecraft:farmland", 25 | "minecraft:scaffolding", 26 | "minecraft:gravel", 27 | "minecraft:dirt_path", 28 | "minecraft:clay", 29 | "minecraft:sand" 30 | 31 | ] 32 | } -------------------------------------------------------------------------------- /src/main/resources/data/platos/tags/blocks/scytheable.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "minecraft:grass", 5 | "minecraft:tall_grass", 6 | "minecraft:fern", 7 | "minecraft:large_fern", 8 | "minecraft:dead_bush", 9 | "#minecraft:flowers" 10 | 11 | ] 12 | } -------------------------------------------------------------------------------- /src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "platos", 4 | "version": "${version}", 5 | 6 | "name": "Plato's Transporters", 7 | "description": "A spiritual successor to Archemides Ships/ Da Vincis vessels for 1.16", 8 | "authors": [ 9 | "Acro" 10 | ], 11 | "contact": { 12 | "homepage": "http://acro.rf.gd/", 13 | "sources": "https://github.com/JSJBDEV/PlatosTransporters" 14 | }, 15 | 16 | "license": "MIT", 17 | "icon": "assets/platos/icon.png", 18 | 19 | "environment": "*", 20 | "entrypoints": { 21 | "main": [ 22 | "gd.rf.acro.platos.PlatosTransporters" 23 | ], 24 | "client": [{ 25 | "value": "gd.rf.acro.platos.ClientInit" 26 | }] 27 | }, 28 | "mixins": [ 29 | "modid.mixins.json" 30 | ], 31 | 32 | "depends": { 33 | "fabricloader": ">=0.11.0", 34 | "fabric": "*", 35 | "minecraft": "1.17.x" 36 | }, 37 | "suggests": { 38 | "flamingo": "*" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/resources/modid.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "net.fabricmc.example.mixin", 5 | "compatibilityLevel": "JAVA_8", 6 | "mixins": [ 7 | ], 8 | "client": [ 9 | ], 10 | "injectors": { 11 | "defaultRequire": 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/resources/platos.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "net.fabricmc.example.mixin", 5 | "compatibilityLevel": "JAVA_8", 6 | "mixins": [ 7 | ], 8 | "client": [ 9 | ], 10 | "injectors": { 11 | "defaultRequire": 1 12 | } 13 | } 14 | --------------------------------------------------------------------------------