发新话题
打印

[发布] SA-MP Server 0.2X/0.3 通用汉字昵称插件 (仅Windows, 2011/8/4 更新)

Powered by MK124 and H.Armor (aka. Horse.A).
本插件兼容0.2X~0.3版的SA-MP Server。若SA-MP的新版服务器的昵称过滤机制不改动的话,新版的服务器也能够使用。

更新内容:
2011/8/4:
  插件不再依赖detoured.dll;
  修复GTABBS上的正文上的代码因转换论坛(DZ->PW)引起的残缺问题。

使用方法:
  将压缩包内的NPatcher.dll解压缩到SA-MP服务器的plugins目录里(若没有请自行创建),并且修改server.cfg,在plugins行加上NPatcher即可。

新的昵称限制:
  允许使用双字节文字(汉字)。
  不允许使用的符号有:!"#$%&'*\/:<>?|。
  其他字符和符号皆允许使用。

工作原理:
  通过特征码搜索执行代码确定CheckPlayerName函数的地址,并Hook托管之。
  通过Hook修复了samp_server.exe错误使用CharLowerA造成的CRASH的问题。

使用者注意:
* 请使用这个函数来获取修正后玩家名字:
复制内容到剪贴板
代码:
GetPlayerName_fixed(playerid, name[], len)
{
        new ret = GetPlayerName( playerid, name, len );
        for( new i=0; name[i]!=0; i++ )
                if( name[i]<0 ) name[i] += 256;
        return ret;
}
* 如果你需要在脚本中处理名字,请使用我修正的strlen、strcmp、strfind来编译你服务器上运行的脚本。下载见二楼。

* 由于服务器允许使用带特殊符号/汉字的昵称进入服务器了,所以:
   - 请需要账号登陆的脚本过滤一下,OnPlayerConnect()的时候T掉带特殊符号的不符合要求的昵称。
   - 请注意使用MySQL的同学需要将数据库的编码改成UTF-8或GBK(简体)或BIG5(繁体),在连接数据库服务器指令以后调用mysql_set_charset(或查询"set names 你的系统编码集名称")修改字符集为"gbk"(简体)或"big5"(繁体)。

* 由于昵称中可能带双字节文字,需要将玩家昵称小写化的时候请考虑双字节的问题。则,若当前字节>0x7F的话,跳过两个字符。范例代码如下:
复制内容到剪贴板
代码:
strlower( dest[] )
{
    for( new i=0; dest[i]!=0; i++ )
        if( dest[i] > 0x7F ) i+=2;
        else dest[i] = tolower(dest[i]);
}
* GameText和TextDraw系列函数无法显示中文字体,会出现乱码,需要注意一下。
附件: 您所在的用户组无法下载或查看附件
Project Shoebill MS2差不多要完工了,有着更规范的API、更健壮的系统、更清晰的框架、更强的扩展力、支持Java插件扩展开发,同时还将提供Linux版。
MkMatch(MKLMS)重新启动开发,同时计划开发着4个Shoebill插件组件:
        Auth - 通用用户验证插件,带权限和组权限功能,验证模块支持本地YAML库、MongoDB、HTTPS网页验证登陆
        MultiDialog - 状态保存式多对话框系统插件
        MultiLanguage - 多语言文本支持插件
        GuiPluginManager - Shoebill的图形化(窗口)插件管理器

TOP

附:支持进行中文字符串处理的自己写的 strlen、strcmp、strfind 替换函数:
由于strcmp、strfind不支持双字节文字且strlen有个不支持非正数双字节文字的BUG,所以我重写了这3个函数。
用法跟原函数一致,不过使用本inc以后Pawno编辑器的函数列表中不会再出现这三个函数,需要手动去使用,请注意一下。

INC使用方法:解压缩到Pawno的Include目录并覆盖原有文件,然后将你的脚本重新编译一下。

修改的代码如下:
复制内容到剪贴板
代码:
strlen(const string[])
{
        new i;
        while( string[i]!=0 )i++;
        return i;
}
复制内容到剪贴板
代码:
strcmp(const string1[], const string2[], bool:ignorecase=false, length=cellmax)
{
        new mbcs;

        for( new i=0; i<length; i++ )
        {
                new c1=string1[i], c2=string2[i];
                if( c1 < 0 ) c1+=256;
                if( c2 < 0 ) c2+=256;
                if( ignorecase && c1 <= 0x7F && c2 <= 0x7F && mbcs==0 )
                {
                        c1 = tolower(c1);
                        c2 = tolower(c2);
                }
                if(mbcs==1) mbcs=0;
                else if( c1 > 0x7F || c2 > 0x7F ) mbcs=1;
               
                if( c1 != c2 || (c1==0 && c2==0) ) return c1-c2;
        }
       
        return 0;
}
复制内容到剪贴板
代码:
strfind(const string[], const sub[], bool:ignorecase=false, pos=0)
{
        new len = strlen(string), sublen = strlen(sub), count, mbcs, i;

        for( i=pos; i<=len && sublen-count<=len-i; i++ )
        {
                new c1=string[i], c2=sub[count];
                if( c1 < 0 ) c1+=256;
                if( c2 < 0 ) c2+=256;
                if( ignorecase && mbcs==0 )
                {
                        c1 = tolower(c1);
                        c2 = tolower(c2);
                }
                if(mbcs==1) mbcs=0;
                else if( c1 > 0x7F || c2 > 0x7F ) mbcs=1;

                if( c1 == c2 )
                {
                        if( count == sublen-1 ) return i-count;
                        count++;
                }
                else count = 0;
        }

        return -1;
}
附件: 您所在的用户组无法下载或查看附件
Project Shoebill MS2差不多要完工了,有着更规范的API、更健壮的系统、更清晰的框架、更强的扩展力、支持Java插件扩展开发,同时还将提供Linux版。
MkMatch(MKLMS)重新启动开发,同时计划开发着4个Shoebill插件组件:
        Auth - 通用用户验证插件,带权限和组权限功能,验证模块支持本地YAML库、MongoDB、HTTPS网页验证登陆
        MultiDialog - 状态保存式多对话框系统插件
        MultiLanguage - 多语言文本支持插件
        GuiPluginManager - Shoebill的图形化(窗口)插件管理器

TOP

感謝分享阿,等好久了

TOP

可以在a_players.inc新增GetPlayerName_fixed嗎@@
大概像這樣,新增在最底下
复制内容到剪贴板
代码:
GetPlayerName_fixed(playerid, name[], len)
{
    new ret = GetPlayerName( playerid, name, len );
    for( new i=0; name[i]!=0; i++ )
    if( name[i]<0 ) name[i] += 256;
    return ret;
}

#define GetPlayerName        GetPlayerName_fixed
而且用中文名稱後音頻插件好像無效了@@

[ 本帖最后由 永恆之風 于 2011-8-4 18:51 编辑 ]

TOP

引用:
原帖由 永恆之風 於 2011-8-4 17:20 發表
可以在a_players.inc新增GetPlayerName_fixed嗎@@
大概像這樣,新增在最底下
GetPlayerName_fixed(playerid, name[], len)
{
    new ret = GetPlayerName( playerid, name, len );
    for( new i=0; name!=0; i++ ) ...
可以
中文名插件应该不会跟Audio插件冲突才对啊?
Project Shoebill MS2差不多要完工了,有着更规范的API、更健壮的系统、更清晰的框架、更强的扩展力、支持Java插件扩展开发,同时还将提供Linux版。
MkMatch(MKLMS)重新启动开发,同时计划开发着4个Shoebill插件组件:
        Auth - 通用用户验证插件,带权限和组权限功能,验证模块支持本地YAML库、MongoDB、HTTPS网页验证登陆
        MultiDialog - 状态保存式多对话框系统插件
        MultiLanguage - 多语言文本支持插件
        GuiPluginManager - Shoebill的图形化(窗口)插件管理器

TOP

引用:
原帖由 mk124 于 2011-8-5 00:41 发表
可以
中文名插件应该不会跟Audio插件冲突才对啊?
我這顯示audio有偵測到IP,但是玩家名稱似乎偵測不到@@

[ 本帖最后由 永恆之風 于 2011-8-5 10:02 编辑 ]

TOP

引用:
原帖由 永恆之風 於 2011-8-5 09:59 發表


我這顯示audio有偵測到IP,但是玩家名稱似乎偵測不到@@
看样子Audio不支持双字节文字……需要自己修改一下才能用了
Project Shoebill MS2差不多要完工了,有着更规范的API、更健壮的系统、更清晰的框架、更强的扩展力、支持Java插件扩展开发,同时还将提供Linux版。
MkMatch(MKLMS)重新启动开发,同时计划开发着4个Shoebill插件组件:
        Auth - 通用用户验证插件,带权限和组权限功能,验证模块支持本地YAML库、MongoDB、HTTPS网页验证登陆
        MultiDialog - 状态保存式多对话框系统插件
        MultiLanguage - 多语言文本支持插件
        GuiPluginManager - Shoebill的图形化(窗口)插件管理器

TOP

方便更新一下mysql如何解决吗

TOP

发新话题