zlainsama/OfflineSkins

somthing about custom server on 1.14

Opened this issue · 13 comments

I tryed the Mojang,Crafatar,Offline skin V2 is work on 1.14 pre3.When I use custom server
Blessin-skin-server,it is not work.

The frist,blessin skin's API is
GET /skin/username.png
GET /cape/username.png

I changed API to
GET /skins/username

It's still not work.
I think maby the proplem is
my skin is 64X64 and the skin from Mojang is 64X32.

I tryed to change my skin. it's still nothing.

Here is server log,

 - - [19/Apr/2019:02:33:55 +0800] "GET /skins/Colin HTTP/1.1" 200 1478 "-" "Java/1.8.0_161"
 - - [19/Apr/2019:02:33:55 +0800] "GET /skins/e94a044e-53ca-4e95-846f-b5cf839e15a1 HTTP/1.1" 204 0 "-" "Java/1.8.0_161"
 - - [19/Apr/2019:02:33:55 +0800] "GET /skins/e94a044e-53ca-4e95-846f-b5cf839e15a1 HTTP/1.1" 204 0 "-" "Java/1.8.0_161"
 - - [19/Apr/2019:02:33:55 +0800] "GET /capes/e94a044e-53ca-4e95-846f-b5cf839e15a1 HTTP/1.1" 204 0 "-" "Java/1.8.0_161"
 - - [19/Apr/2019:02:33:55 +0800] "GET /capes/e94a044e-53ca-4e95-846f-b5cf839e15a1 HTTP/1.1" 204 0 "-" "Java/1.8.0_161"

maby you can find a bug from server log

and some API from Blessin skin

GET http://example.com/username.json
to take detail

return


{
    "username": "621sama",
    "skins": {
        "default": "834cbd848f0a29008bf5b1d59d02ecb1cf25dfd21fc88be1c183c9261f5fdd69",
        "slim": "3d82f454ceeb30f2546283e08ab060a45d450dc6042c9077f638f10ca51205d4"
    },
    "cape": "2911438e8282d40e6d64fbefd076eef0a901cb90d3deae4057fec60c66eb93d2"
}

you can

GET http://example.com/textures/834cbd848f0a29008bf5b1d59d02ecb1cf25dfd21fc88be1c183c9261f5fdd69

to take skin.

Take skin/cape of player

example.com/{skin|cape}/{username}.png

Take skin/cape of player(steve or alex)

example.com/skin/{username}-{steve|alex}.png

Take skin from texture id

example.com/raw/{tid}.png

Take skin from hash

example.com/textures/{hash}

From the look of server log, it should work.
Can you describe in more detail as what part doesn't work?
If it helps, you may type in Chinese, I can read them.

正如你所说,从LOG来看,应该会有用。

我测试脱离皮肤站,改用手动。
在example.com/skins/用户名/index.php 写好了输出皮肤文件 (没有用)
由于在LOG中看到,有访问UUID
于是我测试将原先的用户名改为UUID
也就是
example.com/skins/UUID/index.php

一切正常

Blessin skin server这个皮肤站获取皮肤可以直接(虽然我也不确定是不是只有这个皮肤站是这样还是大部分都是这样获取皮肤)
example.com/skin/username.png
example.com/cape/username.png

您当前的是
skins/username

还有一点就是 对中文名字的支持~~~

为什么要用 /skins/用户名/index.php 这样的方式来处理请求?
这个服务器程序不能处理 /skins/用户名 吗?
还有, 对于不存在的皮肤文件, 它应当返回代码404.
我不认为MC内部支持中文的用户名, 不过你应该可以做到使用中文的显示名.

目前, OfflineSkins会这样请求自定义服务器:

  • 假如该玩家拥有一个非离线用户的UUID, 会先尝试请求关于该UUID的皮肤文件, 失败后才会尝试请求关于用户名的皮肤文件
  • 假如该玩家拥有一个离线用户的UUID (它的生成方法是依照了游戏里的代码), 会直接尝试请求关于用户名的皮肤文件

最后, 那个皮肤站点有提到CustomSkinLoader这个模组, 你或许能从它得到你想要的结果.

这是皮肤站接受的方式。

example.com/skin/username.png
example.com/cape/username.png

而这个MOD的是

example.com/skins/username
example.com/capes/username

我前面说到的手动新建对应目录
skins/用户名/index.php
skins/UUID/index.php
是为了测试,
最终只有通过uuid获取的皮肤才能正常显示。

也就是说

skins/用户名/index.php (无效)
skins/UUID/index.php (有效)

关于中文用户名,我在log中发现,访问的用户名会出现类似于


skins/\xCE\xD2\xD3\xC0\xD4\xB6\xD6\xBB\xB0\xAE\xD3\xA3\xB5\xBA\xC2\xE9\xD2\xC2
skins/????

而皮肤站中接受的中文是url编码。

我仍然不清楚你为什么要以用户名或UUID建立目录? 直接放对应文件在那个位置是不行的吗?
只要这个服务器程序在收到关于 /skins/用户名 或者 /skins/UUID 的请求的时候回答一个正确的皮肤文件就应该不会有问题.
我使用了Nginx进行测试, 结果很正常.
你能试试看使用常见的服务器程序吗? 比如我测试使用的Nginx.

关于中文用户名, 我并不打算写特殊代码来支持, 倘若目前的状态无法使用的话, 那么十分可能会持续这个状态下去.

以用户名或UUID建立目录只是为了查找出,哪里有问题。
我测试的最终结论就是,取用户名无效 取UUID OK
我也是NGINGX~~~
不搞中文支持的话没事的,我们也只是图新鲜 出1.14了 就玩一玩 要是CSL出了 我们还在玩的话 就换CSL 随缘吧23333

感觉好像是我的表达能力有问题,一直没让你听懂我的点

可是我仍然没办法再现出你遇到的问题, 自然也不能解决它.
你可否只使用Nginx本身的HTTP服务器功能来测试?

xfl03 commented

中文用户名这个问题在请求前处理一下url即可解决。中文url需要进行编码。

url=new URI(url).toASCIIString();

代码来源

@xfl03 这会在其他情况下造成额外的可能的负面结果吗? 比如其他语言环境下

xfl03 commented

@zlainsama
这是URI本身的规定,除了英文字母、数字和有限的几个符号以外都需要进行编码,详见RFC 3986的规定。换而言之,除了中文之外,其他语言的字符也需要进行同样的编码。
https://tools.ietf.org/pdf/rfc3986.pdf