Rust入门实战 编写Minecraft启动器#1启动方法

首发于Enaium的个人博客


引言

想必大家都知道Minecraft这个游戏,它是一个非常有趣的游戏,有没有想过它是如何启动的呢?在本系列中,我们将使用Rust编写一个简单的Minecraft启动器。

本系列文章涉及的Rust知识并不多,了解Rust的基本语法即可,如果你对Minecraft或者Java有一定了解,那么会更容易理解本系列的内容。

观前须知

本系列文章只考虑如何完成一个简单的Minecraft启动器,不考虑支持启动老的游戏版本,也不考虑第三方的客户端,更不会去考虑正版验证等等,只是一个简单的启动器。

启动方法

首先Minecarft是使用Java编写的,所以我们需要通过执行Java命令来启动Minecraft,并且也需要添加一些参数,比如游戏的一些资源文件,Java的一些参数等等。

大概就像这样:

java -Xmx10745m -cp "minecraft.jar;lib/*" -Djava.library.path="natives" net.minecraft.client.main.Main --username yourname --version 1.21

下载资源

第一步我们需要下载Minecraft的资源文件,包括游戏本体、依赖库、资源文件。

http://launchermeta.mojang.com/mc/game/version_manifest.json这个地址可以读取到游戏所有版本。

https://piston-meta.mojang.com/v1/packages/<sha1>/<version>.json这个地址可以获取到游戏的配置信息。

http://resources.download.minecraft.net/<sha1_first_two>/<sha1>这个地址可以获取到游戏的资源文件。

https://libraries.minecraft.net/<group>/<artifact>/<version>/<artifact>-<version>.jar这个地址可以获取到游戏的依赖库。

游戏目录结构

首先游戏的所有资源都在一个目录中,这个目录包括librariesassetsversions等文件夹,这个目录通常是.minecraft

libraries文件夹存放游戏的依赖库,目录结构和Maven的目录结构类似。

assets文件夹存放游戏的资源文件,其中包括objectsindexesobjects存放资源文件,所有的资源文件都是以sha1命名的,所以objects文件夹下有一个以2位sha1命名的文件夹,所有前两位sha1相同的资源文件都在这个文件夹下,indexes存放资源文件的索引文件,也就是包含了资源文件的真实名称和对应的sha1值。

versions文件夹存放游戏的版本文件,每个版本都有一个以版本号命名的文件夹,这个文件夹包括natives,它存放游戏的本地库文件,我们需要在游戏启动的时候将所有nativejar文件都解压到这个文件夹下,这个文件夹还包括<version>.json,这个文件包括了游戏的配置信息,比如mainClassassets等等,还有<version>.jar,这个文件是游戏的本体文件。

拼接命令

完成以上步骤后,我们就可以拼接命令了,首先是java的程序路径,然后是JVM参数,然后是classpath,接着是main方法的类路径,最后是Minecraft的参数。

拼接完成之后就可以执行这个命令启动游戏了。

项目结构

本项目分为 4 个模块:download, launch, model, parse

  • download模块用于下载游戏资源文件。

  • launch模块用于启动游戏。

  • model模块用建立游戏的数据模型。

  • parse模块用于解析游戏的配置文件。

流程

建立资源模型
解析资源配置
下载游戏资源
拼接启动命令
启动游戏

结语

好了,本文就到这里了,之后的一些内容会在后续文章中介绍。

项目地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发编程-05AQS原理

并发编程-深入理解AQS之ReentrantLock 一 认识AQS 在讲解AQS原理以及相关同步器之前&#xff0c;我们需要对AQS有一些基本的认识&#xff0c;了解下它有什么样的机制&#xff0c;这样追踪源码的时候就不会太过于迷茫&#xff01; 1.1 什么是AQS java.util.concurrent包中的大…

【DevOps】运维过程中经常遇到的Http错误码问题分析(二)

目录 一、HTTP 错误400 Bad Request 1、理解 400 Bad Request 错误 2、排查 400 Bad Request 错误 3、常见的解决方法 二、HTTP 错误401 Unauthorized 1、理解 401 Unauthorized 错误 2、排查 401 Unauthorized 错误 3、常见的解决方法 一、HTTP 错误400 Bad Request …

文件上传漏洞: 绕过方式及原理[表格]

序号绕过原理原理简述详细技术解释绕过方法1前端校验绕过禁用或绕过前端JavaScript验证前端JavaScript用于限制用户上传文件类型&#xff0c;但可被用户禁用或修改使用浏览器插件或开发者工具禁用JavaScript&#xff0c;或修改上传逻辑2MIME类型欺骗更改文件MIME类型以欺骗服务…

海康威视摄像头批量更改源码

更改OSD通道名称 # codingutf-8 import os import time import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth import xml.etree.ElementTree as ET#和监控摄像头通讯需要一个双方认可的密钥&#xff0c;可以随机生成 def generate_key():# 生成一个16字…

LabVIEW与OpenCV图像处理对比

LabVIEW和OpenCV在图像处理方面各有特点。LabVIEW擅长图形化编程、实时处理和硬件集成&#xff0c;而OpenCV则提供丰富的算法和多语言支持。通过DLL、Python节点等方式&#xff0c;OpenCV的功能可在LabVIEW中实现。本文将结合具体案例详细分析两者的特点及实现方法。 LabVIEW与…

某大会的影响力正在扩大,吞噬了整个数据库世界!

1.规模空前 你是否曾被那句“上有天堂&#xff0c;下有苏杭”所打动&#xff0c;对杭州的湖光山色心驰神往&#xff1f;7月&#xff0c;正是夏意正浓的时节&#xff0c;也是游览杭州的最佳时期。这座古典与现代交融的城市将迎来了第13届PostgreSQL中国技术大会。作为全球数据库…

kubebuilder示例-新

生成代码 因为kubebuilder 命令工具需要依赖linux环境 所以本例方法使用git 同步代码 在window开发后提交 linux项目里拉代码运行的方式 创建go mod 项目 go mod init kubebuild_demo 初始化项目 生成基础框架 domain 生成group用的 kubebuilder init --domain example.com …

LabVIEW从测试曲线中提取特征值

在LabVIEW中开发用于从测试曲线中提取特征值的功能时&#xff0c;可以考虑以下几点&#xff1a; 数据采集与处理&#xff1a; 确保你能够有效地采集和处理测试曲线数据。这可能涉及使用DAQ模块或其他数据采集设备来获取曲线数据&#xff0c;并在LabVIEW中进行处理和分析。 特…

系统级别的原生弹窗窗口

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生的弹出窗口dialog</title><style>…

【TB作品】51单片机 Proteus仿真 基于单片机的LCD12864万年历及温度监测系统设计

实验报告&#xff1a;基于单片机的LCD12864万年历及温度监测系统设计 背景介绍 本实验旨在设计并实现一个基于STC89C52单片机的LCD12864显示的万年历系统&#xff0c;同时集成温度传感器以实现温度监测功能。系统具备整点报时和闹钟功能&#xff0c;通过蜂鸣器进行提示。该设…

condition_variable---C++条件变量

文章目录 1.C11条件变量2. 相关api方法2.1 wait方法 2.2 wait_for 方法2.3 wait_until 方法2.4 notify_one 和 notify_all 方法 3虚假唤醒等问题 1.C11条件变量 std::condition_variable 是 C11 标准库中提供的一个类&#xff0c;用于在多线程环境中实现线程间的同步和通信。通…

CentOS7安装部署双版本MySQL

文章目录 CentOS7安装部署双版本MySQL一、前言1.场景2.环境 二、安装MySQL 5.6三、安装MySQL 8.01. 解压并移动 MySQL 文件2. 创建并配置 my.cnf3.修改mysql.server4. 添加用户组和用户5. 初始化 MySQL 数据目录6. 创建systemd服务文件7.创建符号链接8.首次登录9.允许所有主机连…

初中物理知识点总结(人教版)

初中物理知识点大全 声现象知识归纳 1 .声音的发生&#xff1a;由物体的振动而产生。振动停止&#xff0c;发声也停止。 2.声音的传播&#xff1a;声音靠介质传播。真空不能传声。通常我们听到的声音是靠空气传来的。 3.声速&#xff1a;在空气中传播速度是&#xff1a;340…

【2024_CUMCM】T检验、F检验、卡方检验

T检验 T检验主要用于比较两组数据的均值差异&#xff0c;适用于小样本数据分析。它可以分为单样本T检验、独立样本T检验和配对样本T检验。 单样本T检验用于比较一个样本与已知的总体均值差异&#xff0c;独立样本T检验用于比较两个独立样本的均值差异&#xff0c;配对样本T检…

【Transformer】transformer模型结构学习笔记

文章目录 1. transformer架构2. transformer子层解析3. transformer注意力机制4. transformer部分释疑 图1 transformer模型架构 图2 transformer主要模块简介 图3 encoder-decoder示意图N6 图4 encoder-decoder子层示意图 1. transformer架构 encoder-decoder框架是一种处理NL…

【Android】自定义换肤框架04之Skinner框架设计

到上一章为止&#xff0c;我们已经完整讲解了换肤所用到的所有技术点 这一章&#xff0c;我们来梳理下&#xff0c;如何从整体和细节上&#xff0c;进行代码设计 毕竟&#xff0c;我们不止是简单实现功能&#xff0c;要做到功能清晰&#xff0c;使用灵活 文章目录 核心组件使…

探索InitializingBean:Spring框架中的隐藏宝藏

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ &#x1f44b; Spring框架的浩瀚海洋中&#x…

Java里的Arrary详解

DK 中提供了一个专门用于操作数组的工具类&#xff0c;即Arrays 类&#xff0c;位于java.util 包中。该类提供了一些列方法来操作数组&#xff0c;如排序、复制、比较、填充等&#xff0c;用户直接调用这些方法即可不需要自己编码实现&#xff0c;降低了开发难度。 java.util.…

用PlantUML和语雀画UML类图

概述 首先阐述一下几个简单概念&#xff1a; UML&#xff1a;是统一建模语言&#xff08;Unified Modeling Language&#xff09;的缩写&#xff0c;它是一种用于软件工程的标准化建模语言&#xff0c;旨在提供一种通用的方式来可视化软件系统的结构、行为和交互。UML由Grady…

用于实时语义分割的可重参数化双分辨率网络

文章目录 摘要一、引言II、相关工作III、方法IV. 实验V、结论摘要 https://arxiv.org/pdf/2406.12496 语义分割在自动驾驶和医学图像等应用中发挥着关键作用。尽管现有的实时语义分割模型在准确性和速度之间取得了令人称赞的平衡,但其多路径块仍然影响着整体速度。为了解决这…