搜索
查看: 3699|回复: 8

谁帮我修改下读取SQL中文ID代码!

[复制链接]
发表于 2009-4-15 01:13:34 | 显示全部楼层 |阅读模式 来自 中国–新疆–乌鲁木齐
本帖最后由 hulianglove 于 2009-4-18 17:06 编辑

/* 本插件由 AMXX-Studio 中文版自动生成 */
/* UTF-8 func by www.DT-Club.net */

new const PLUGINNAME[] = "中文ID"
new const VERSION[]    = "2.1"
new const AUTHORS[]    = "poohoo @ 老友记"


#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <dbi>

new g_RetryOnce[33]
new g_SetName[33][32]
new g_SetAllow[33]
new FILE[256]
new host[33]
new user[33]
new pass[33]
new tabname[33]

public plugin_init()
{
        register_plugin(PLUGINNAME, VERSION, AUTHORS)
       
        register_cvar("dbi_host", "127.0.0.1")
        register_cvar("dbi_user", "root")
        register_cvar("dbi_pass", "123456")
        register_cvar("dbi_tabname", "Discuz")
       
        get_cvar_string("dbi_host",host,32)
        get_cvar_string("dbi_user",user,32)
        get_cvar_string("dbi_pass",pass,32)
        get_cvar_string("dbi_tabname",tabname,32)
}

// 名字更改消息
public client_infochanged(id)
{
        if (!is_user_connected(id))
                return PLUGIN_CONTINUE
       
        // 更换限制标记
        if (!g_SetAllow[id])
        {
                new oldname[32], newname[32]
                get_user_name(id, oldname, 31)
                get_user_info(id, "name", newname, 31)
               
                if (strcmp(newname, oldname)==0)
                        return PLUGIN_CONTINUE
               
                // 兼容 sXe 改名
                if (equal(newname, "[NO-sXe-I]", 10))
                {
                        replace(oldname, 31, "[NO-sXe-I] ", "")
                        formatex(newname, 31, "[NO-sXe-I] %s", oldname)
                        ig_setname(id, newname)
                }
                else
                        ig_setname(id, oldname)
               
                return PLUGIN_CONTINUE
        }
       
        g_SetAllow[id] = 0
        ig_setname(id, g_SetName[id])
       
        return PLUGIN_CONTINUE
}

// 重名检查
one_name(id, name[], len)
{
new sample[32], s
copy(sample, 31, name)

for (new i=0; i<33; i++)
{
        if (s>0)
                formatex(sample, 31, "(%d)%s", s, name)
               
                if (!is_name_inuse(id, sample))
                        break
               
                s++
        }
        copy(name, len, sample)
}

is_name_inuse(id, const sample[])
{
new name[32]
for (new i=1; i<=get_maxplayers(); i++)
{
        if (!is_user_connected(i)) continue
        if (id==i) continue
       
        get_user_name(i, name, 31)
        if (strcmp(name, sample)==0)
                return 1
        }
       
        return 0
}

// 设置 id 需要的名字
public set_name(id, const newname[])
{
        if (strlen(newname)<1)
                return
       
        g_SetAllow[id] = 1
        copy(g_SetName[id], 31, newname)
        one_name(id, g_SetName[id], 31)
        set_user_info(id, "name", g_SetName[id])
}

public client_connect(id)
{
        remove_task(id)
        g_SetAllow[id] = 0
       
        // 强制重新连接一次,以解决因为换中文ID后,换图会出现权限认证问题
        if (!g_RetryOnce[id])
        {
                g_RetryOnce[id] = 1
                client_cmd(id, "retry")
        }
}

public client_putinserver(id)
{
        // 延时足够的时间,等待 admin 权限认证插件完成权限设置后,再执行更换名字
        set_task(random_float(3.0,10.0), "get_name_from_file", id)
}

// 从文件里检查是否有对应的中文ID
public get_name_from_file(id)
{
        if (!is_user_connected(id))
                return
       
        new name[32]
        get_user_name(id, name, 31)
       
        new Sql:dbc
        new Result:result
        new auth[33]
        new cnname[33]
       
        dbc = dbi_connect(host,user,pass,tabname)
        result = dbi_query(dbc, "SELECT * FROM cdb_memberfields")
        while(dbi_nextrow(result > 0))
                (
        dbi_result(result,"auth",auth,32)
        dbi_result(result,"cnname",cnname,32)
        )
        {
        tmpName = ("%s",auth)
        tmpNameCN = ("%s",cnname)
       
        parse(tmpName,sizeof(tmpName)-1, tmpNameCN,sizeof(tmpNameCN)-1)
        trim(tmpName)
        trim(tmpNameCN)
       
        if (strcmp(name, tmpName)==0)
        {
                copy(name, 31, tmpNameCN)
                set = 1
                break
        }
}

// 完成后,设置新的名字
if (set)
        set_name(id, name)
        dbi_close(dbc)
}
发表于 2009-4-15 07:59:00 | 显示全部楼层 来自 中国–广东–中山
期待高手解决
回复

使用道具 举报

发表于 2009-4-15 10:44:15 | 显示全部楼层 来自 中国–上海–上海–浦东新区
加一句
SET NAMES 'UTF8'
回复

使用道具 举报

 楼主| 发表于 2009-4-15 11:59:59 | 显示全部楼层 来自 中国–新疆–乌鲁木齐
高手都来看看啊!
回复

使用道具 举报

发表于 2009-4-15 19:13:21 | 显示全部楼层 来自 中国–四川–遂宁
再加个模块
#include <sqlx>
回复

使用道具 举报

 楼主| 发表于 2009-4-16 02:43:56 | 显示全部楼层 来自 中国–新疆–乌鲁木齐
谢谢啊 人多力量大 一人一点 就可以出来了。我弄好了共享给大家。
回复

使用道具 举报

发表于 2009-4-16 20:08:32 | 显示全部楼层 来自 中国–江苏–连云港
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2009-4-17 13:47:24 | 显示全部楼层 来自 中国–新疆–乌鲁木齐
谢谢啊 我去看看 能不能共享下插件谢谢,我准备弄新疆的正版服务器
回复

使用道具 举报

 楼主| 发表于 2009-4-17 13:48:14 | 显示全部楼层 来自 中国–新疆–乌鲁木齐
我做2个版本,保存所有玩家数据、信息在MySQL数据库里,用快1年了
开始使用ig_setname函数,考没有模块代码,更新不方便和安全问题,所以改用memhack_set_char函数
缺点就是全角空格不好替换,使用有很多讲究的
有兴 ...
111222333 发表于 2009-4-16 20:08


你的服务器地址在那呢
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表