HMCL-dev / HMCL

A Minecraft Launcher which is multi-functional, cross-platform and popular
https://hmcl.huangyuhui.net
GNU General Public License v3.0
6.89k stars 676 forks source link

[Bug] ${HOME}/.minecraft总是被无意义的创建并且持久化 #2970

Open strayedstar opened 6 months ago

strayedstar commented 6 months ago

平台 | Platform

ALL

问题描述 | Problem Description

multimc及其延伸版本以及其他的一些启动器则不会乱创建,并且会在自己的工作目录创建该文件. 这个问题贯穿所有HMCL版本,window上用户目录不经常被显现使用因此这个几乎不是问题,但是在类unix系统上则是经常使用的. 修复这个问题可以使得环境更干净,而且并不是很难,至少别的启动器实现了,希望跟进一下.

启动器崩溃报告 / 启动器日志文件 | Launcher Crash Report / Launcher Log File

null

LJS08 commented 6 months ago

.minecraft 好像应该是会隐藏的吧? ~(毕竟有个" . ")~

burningtnt commented 6 months ago

经过测试,当在版本列表中删除“官方启动器文件夹”时,用户目录下的 .minecraft 不再会被 HMCL 使用。 请前往版本列表操作左侧的游戏仓库

strayedstar commented 6 months ago

经过测试,当在版本列表中删除“官方启动器文件夹”时,用户目录下的 .minecraft 不再会被 HMCL 使用。 请前往版本列表操作左侧的游戏仓库

好吧,你是对的,但不完全对,这更加表明这是一个bug,当游戏使用相对目录.minecraft(实际在workdir下),还是会创建~/.minecraft文件夹,改为其他的名称则不会,但是!没有~/.minecraft文件夹(里面只有皮肤文件)会导致HMCL左边显示和进入游戏的皮肤异常! 强制刷新皮肤以后,皮肤正常了,但是~/.minecraft又回来了. 目录内容:assets/skins/91/$(皮肤的sha256值)

strayedstar commented 6 months ago

经过测试,当在版本列表中删除“官方启动器文件夹”时,用户目录下的 .minecraft 不再会被 HMCL 使用。 请前往版本列表操作左侧的游戏仓库

也就是实际上是皮肤自动加载中不正确的路径(HMCL自身问题),导致~/.minecraft文件夹的出现.

平台:linux 启动脚本:#!/bin/bash

jfx path

jfx=${HOME}/.local/lib/runtimes/java/jrefx11

data path

dp=${HOME}/.local/apps/hmcl

executable file

ELF=$dp/hmcl.jar

network

export https_proxy=http://127.0.0.1:33389 export http_proxy=http://127.0.0.1:33389 export all_proxy=socks5://127.0.0.1:33389

rm -rf ~/.minecraft

cd $dp #workdir $jfx/bin/java -XX:+CMSConcurrentMTEnabled -XX:ParallelGCThreads=8 -XX:+UseAdaptiveSizePolicy --module-path $jfx/lib/javafx.base.jar:$jfx/lib/javafx.fxml.jar:$jfx/lib/javafx.graphics.jar:$jfx/lib/javafx.media.jar:$jfx/lib/javafx.swing.jar:$jfx/lib/javafx.web.jar:$jfx/lib/javafx.controls.jar --add-modules=javafx.base --add-modules=javafx.fxml --add-modules=javafx.graphics --add-modules=javafx.media --add-modules=javafx.swing --add-modules=javafx.web --add-modules=javafx.controls -Dhmcl.self_integrity_check.disable=true -Dhmcl.home=$dp -Dhmcl.authlibinjector.location=lib/authlib-injector.jar -Xmx256M -jar $ELF '$@'

remove cache and old logs after close

mkdir -p ~/.cache/hmcl/{temp,saves} ln -sf ~/.cache/hmcl/ ./ rm -rf temp/

remove old logs

rm -f logs/hmcl.log.*

rm -rf ~/.minecraft

100%复现.

burningtnt commented 6 months ago

没听懂,请详细描述一下

strayedstar commented 6 months ago

没听懂,请详细描述一下

e,就是皮肤刷新必然会导致~/.minecraft的产生,目录的内容是assets/skins/91/$(皮肤的sha256值). 删除以后进游戏和HMCL的左侧栏头像显示都会异常. HMCL:最新测试版

strayedstar commented 6 months ago

没听懂,请详细描述一下

直接上日志 [23:25:49] [org.jackhuang.hmcl.ui.construct.Navigator.navigate/INFO] Navigate to AccountListPage@7eed7b29[styleClass=gray-background] [23:25:49] [org.jackhuang.hmcl.auth.microsoft.MicrosoftService.lambda$new$0/INFO] Fetching properties of 7421459f-8587-4a89-9ba6-cd3218de132e [23:25:50] [org.jackhuang.hmcl.task.Task.run/TRACE] Executing task: hash [23:25:50] [org.jackhuang.hmcl.task.Task.run/TRACE] Executing task: hash [23:25:50] [org.jackhuang.hmcl.task.FileDownloadTask.beforeDownload/TRACE] Downloading http://textures.minecraft.net/texture/hash to ${HOME}/.minecraft/assets/skins/91/hash [23:25:50] [org.jackhuang.hmcl.task.FileDownloadTask.beforeDownload/TRACE] Downloading http://textures.minecraft.net/texture/hash to ${HOME}/.minecraft/assets/skins/91/hash [23:25:50] [org.jackhuang.hmcl.game.TexturesLoader.loadTexture/INFO] Texture downloaded: http://textures.minecraft.net/texture/hash [23:25:50] [org.jackhuang.hmcl.game.TexturesLoader.loadTexture/INFO] Texture downloaded: http://textures.minecraft.net/texture/hash 家目录的绝对地址显示已经替换为${HOME},皮肤的hash已改为hash 睡觉去了,明天还要上学.

zkitefly commented 6 months ago

确实是这样,我记得无论哪个平台都会这样?

burningtnt commented 6 months ago

看起来确实是个 Bug,我们会处理的

burningtnt commented 5 months ago

哦,这个是因为 HMCL 需要找个地方保存你的皮肤 ———— 不然你的皮肤预览功能每次都得去拉取

burningtnt commented 5 months ago

如果改成其他的(比如直接放到你当前选中的那个游戏目录里),虽说是可以的,但会导致更多的问题…… 所以就这样吧。实在不行你就把那个文件隐藏了

strayedstar commented 5 months ago

如果改成其他的(比如直接放到你当前选中的那个游戏目录里),虽说是可以的,但会导致更多的问题…… 所以就这样吧。实在不行你就把那个文件隐藏了

所以可以通过一个环境变量指示或者使用游戏工作目录?或者在Linux构建上保存到~/.cache目录?

我现在通过bwrap“解决”了这个问题,不过要是原生支持就更好了。毕竟相关修改只要不超过5行的主要代码。

burningtnt commented 5 months ago

reopen,这个问题还是有必要解决的

strayedstar commented 2 months ago

现在在hmcl指定的cache目录里已经有对应的皮肤文件,这下子~/.minecraft的实际用处也无了,可以把指定的调用重定向到$cache下面

strayedstar commented 2 months ago

reopen,这个问题还是有必要解决的

现在在hmcl指定的cache目录里已经有对应的皮肤文件,这下子~/.minecraft的实际用处也无了,可以把指定的调用重定向到$cache下面,而且我看了一下,这是HMCl 设置/通用/文件下载缓存这个地址,(默认~/,minecraft,修改以后依然会把皮肤文件放里面,但是修改以后的cache路径里也会有对应的皮肤文件,不过后续的游戏资源下载会存到修改以后的路径里),所以这实际是一个关于缓存的BUG?在启动时获取皮肤文件被硬编码到了${HOME}/.minecraft,随后再把对应的文件按照HMCL自己的规范复制到$cache?或者是下载到$cache,~/.minecraft,但是后者只是没有删除过时的代码导致的,新的逻辑已经不依赖于~/.minecraft了?(新版本改的,老版本删除~/.minecraft,hmcl里面的皮肤头像会变,但是现在不会,强制刷新账户也不会再创建~/.minecraft,$cache/assest,也就是读到内存里了)

strayedstar commented 2 months ago

reopen,这个问题还是有必要解决的

我测试了一下,~/minecraft依然作为第一步的皮肤资源下载地址,使其不可写以后,$cache下没有任何皮肤文件生成,在启动游戏(检查资源时)会建成$cache下的皮肤文件,如果手动使其不可写,随后强制启动游戏,游戏内的皮肤也是显示的,所以对于minecraft本身而言,hmcl下载的皮肤文件并不是必要的. 但是把皮肤文件下载到.minecraft对于hmcl而言是近似于必要的,因为hmcl左上角的头像显示需要皮肤文件支持,这里让~/.minecraft不可写以后,把已经结构化的皮肤文件放到$cache里,再修改时间戳,但是hmlc依然无法正确显示皮肤头像,反之,使$cache不可写,其通过~/.minecrfat里的皮肤文件依然可以正确加载出皮肤头像,那就是说明 1.$cache下的皮肤文件没有任何存在的必要,要删除 2.需要修改初始皮肤文件的下载位置,改到$cache里,不要再硬编码了 依赖皮肤文件的对于只有hmcl的头像显示,对于游戏本身是不需要hmcl提供的皮肤文件的.