目 录CONTENT

文章目录

第一个l4d2数据库插件开发

16Reverie
2025-03-20 / 0 评论 / 0 点赞 / 46 阅读 / 0 字

万事开头难,中间难,后面难。

成功让插件和数据库联系上了,对于数据库操作并不熟悉的我也算是阶段性成果了。

有了数据交互的渠道,就算是通上了路,接下来路上走什么车,房子怎么装修,应该也能水到渠成。

插件实现

目前时简单实现了一个数据库插件,在用户连接服务器时,使用SQLite数据库记录steam_id、用户名字、用户连接服务器的次数、以及最后一次连接的时间。

  • 表结构

  • 表创建代码

CREATE TABLE user_connections (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    steamid VARCHAR(32) NOT NULL UNIQUE,
    name VARCHAR(64) NOT NULL,
    connections INTEGER DEFAULT 0,
    last_connect TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • 插件代码

#include <sourcemod>

#pragma semicolon 1
#pragma newdecls required

#define PLUGIN_VERSION "1.0"

public Plugin myinfo = 
{
    name = "16Reverie",
    author = "Your Name",
    description = "Tracks user connections and stores them in an SQLite database.",
    version = PLUGIN_VERSION,
    url = "http://yourwebsite.com"
};

Database g_db;

public void OnPluginStart()
{
    PrintToServer("连接数据库中***************************************************************************************************************************************************************************************************************************");
    char error[255];
    // 初始化数据库
    if (SQL_CheckConfig("user_connections"))
    {
        g_db = SQL_Connect("user_connections", true, error, sizeof(error));
        if (g_db == null)
        {
            SetFailState("连接数据库失败: %s", error);
            PrintToServer("连接数据库失败: %s", error);
        }
    }
    else
    {
         SetFailState("Database configuration 'user_connections' not found.");
    }
}

public void OnClientAuthorized(int client, const char[] auth)
{
    if (IsFakeClient(client)) // 忽略机器人
        return;

    char steamid[32];
    if (!GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid)))
    {
        PrintToChatAll("Failed to get SteamID for client %d", client);
        LogError("Failed to get SteamID for client %d", client);
        return;
    }

    char name[MAX_NAME_LENGTH];
    GetClientName(client, name, sizeof(name));

    // 更新数据库
    UpdateUserConnection(steamid, name);
}

void UpdateUserConnection(const char[] steamid, const char[] name)
{
    char safe_steamid[64];
    char safe_name[MAX_NAME_LENGTH * 2 + 1];

    g_db.Escape(steamid, safe_steamid, sizeof(safe_steamid));
    g_db.Escape(name, safe_name, sizeof(safe_name));

    char query[512];
    Format(query, sizeof(query), 
        "INSERT INTO user_connections (steamid, name, connections, last_connect)\
            VALUES ('%s', '%s', 1, CURRENT_TIMESTAMP) \
            ON CONFLICT(steamid) DO UPDATE \
        SET connections = connections + 1, last_connect = CURRENT_TIMESTAMP, name = '%s'",
        safe_steamid, safe_name, safe_name);

    if (!SQL_FastQuery(g_db, query))
    {
        char error[255];
        SQL_GetError(g_db, error, sizeof(error));
        PrintToChatAll("Failed to update user connection: %s", error);
        LogError("Failed to update user connection=====================================================================================: %s", error);
    }
    else {
        PrintToServer("数据库更新成功=====================================================================================");
    }
}

public void OnPluginEnd()
{
    if (g_db != null)
    {
        delete g_db;
    }
}

请忽略一长串的符号,它存在就肯定有作用,比如在只有两种文字颜色并且充满文字的控制台上找到它。

  • 效果

接下来是总结遇到的一些问题和经验。

总结

  1. 求生之路插件出现错误会产生日志,但是日志给到的信息并不多,日志所在:left4dead2\addons\sourcemod\logs

  2. 错误提示:Configuration "user_connections" not found“

原因找不到数据库的配置,解决方法:在left4dead2/addons/sourcemod/configs/databases.cfg文件中加入数据库配置

"Databases"
{
     ...
	"user_connections"
	{
		"driver"            "sqlite"
		"host"				"localhost"
		"database"          "user_connections"
	}
}
  1. 数据库文件

  • 求生之路的数据库文件放在left4dead2/addons/sourcemod/data/sqlite 里。

  • 数据库的文件后缀需要是.sq3 ,当你的数据库不是这个后缀时,运行插件会自动生成一个空.sq3的数据库。

  • 创建的空数据库会自动执行left4dead2\addons\sourcemod\configs\sql-init-scripts\sqlite文件下的同名sql文件里的命令,一般是创建表的命令(未测试)

  • SQLite的CURRENT_TIMESTAMP 获得的是GMT时间,而非本地时区的时间。

0

评论区