TA的每日心情 | 擦汗 2 小时前 |
|---|
签到天数: 352 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 2478
|
DeepSeek的回答:
原来是泄露的C语言官方版,这就完全不同了。L2J那种Java端的改法完全不适用,你这套是真正的NCSOFT原始服务端架构——客户端强校验 + 服务端存储过程校验的双重关卡。
你现在的情况是:存储过程里的"中文过滤"确实没有,但客户端的"UI输入框验证"把你卡住了。好消息是,C版官方端的逻辑其实更透明,解决思路也更直接。
根本原因分析
官方C语言服务端的名字验证流程是这样的:
text
客户端输入 → 客户端本地正则校验 → 发送封包 → 服务端存储过程校验 → 写入数据库
你卡在第一步。客户端在输入框失去焦点或点击"创建"时,就用自己的规则检查了名字,发现不通过直接弹窗,根本没给服务端发任何数据。所以你改服务端的INI、改数据库字段、改存储过程,都碰不到这个判断。
解决方案:修改客户端DLL
C版六章官方端,客户端的名字校验逻辑硬编码在 ncommon.dll 或 L2Client.dll 里,需要通过反汇编修改或者内存补丁来解决。
方法一:直接找现成补丁(推荐)
去天堂2单机论坛搜索以下关键词,通常能找到已编译好的文件:
"六章 中文名补丁"
"Interlude 中文角色名"
"L2C6 中文名"
找到后通常是修改好的 ncommon.dll 或 L2.exe,直接替换到客户端 system 文件夹即可。
方法二:手动修改(如果有汇编基础)
如果没有现成补丁,需要自己动手:
用到的工具:
OllyDbg 或 x64dbg(反汇编调试)
十六进制编辑器(如 HxD)
操作思路:
用OllyDbg加载 ncommon.dll
搜索报错字符串 "请输入大于1个汉字" 或对应的Unicode字符串
找到调用这个字符串的条件判断指令(通常是 CMP、TEST 后跟 JE、JNE 等跳转)
把判断字符范围的逻辑改成允许中文字符集通过
保存修改后的DLL
这个操作比较硬核,如果没搞过反汇编,建议优先找现成补丁。
服务端层面需要确认的事项
客户端改好后,服务端这边需要确保能接住中文名:
1. 确认存储过程的字符集处理
你说的存储过程里有空格判定、禁止字符判定,但没有中文判定——这其实是好事,说明服务端不拦截中文。
但需要确认一点:存储过程接收参数时,是否用了 N'...' 前缀处理Unicode?检查一下调用的SQL语句类似这样:
sql
-- 正确写法(支持中文)
EXEC CreateNewChar @Account, N'张三', @ClassId...
-- 错误写法(中文会变乱码)
EXEC CreateNewChar @Account, '张三', @ClassId...
如果服务端调用时没有加 N 前缀,中文传入SQL Server后会变成 ??。这个可能在服务端代码里写死了,需要反编译服务端exe才能改,通常官方端默认是正确的,但可以先测试确认。
2. 表字段确认
你已经确认 userdata.charname 是 nvarchar(50),这个没问题。再检查一下 lin2world 数据库的排序规则是否为 Chinese_PRC_CI_AS 或支持Unicode的规则,不过一般 nvarchar 不受排序规则影响。
快速验证:绕过客户端直接写数据库
如果改了客户端还是不行,可以用这个办法定位问题到底在客户端还是服务端:
直接在SQL Server Management Studio里向 userdata 表插入一条带中文名的角色数据:
sql
INSERT INTO userdata (charname, accountname, ...)
VALUES (N'测试中文名', '你的账号', ...)
然后用这个账号登录游戏,看能不能看到这个角色、能不能进游戏
能正常进入 → 服务端完全没问题,问题100%在客户端的输入框验证
不能进入/报错 → 服务端也有过滤,需要继续排查存储过程或服务端exe里的检查逻辑
避坑提醒
别去动 l2cache.ini 和 l2sever.ini 的 country=4,你已经改对了,这个影响的是PK服务器规则之类,跟中文名没关系,保持原样就行。
C版官方端没有 server.properties 或 CnameTemplate,那是L2J的东西,不用找。
如果你用的是俄版或美版泄露端,它们天生就过滤非ASCII字符,因为官方六章时俄罗斯和北美服务器压根不支持中文角色名。这种端大概率需要同时改客户端和服务端的可执行文件,工程量较大,建议换个已整合中文支持的端。 |
|