搜索
查看: 2065|回复: 4

[求助] CD Mediator 插件无法在1.6服务器中使用,外国人指望不了了,请弟兄们帮帮忙!

[复制链接]
发表于 2003-10-14 21:59:59 | 显示全部楼层 |阅读模式 来自 中国–湖北–襄阳
这个插件的功能是检查服务器中名字包括[NO C-D]的PLAYER的比分,超过某个限制就需要KICK,可以解决人气和CD之间的关系,请编程大侠们帮帮忙!谢谢!设定的有奖金,不过如果哪位大侠可以解决,请直接共享给大家一起使用,再次感谢!

这个插件目前的主要问题就是无法识别目前的steamid,官方地址如下:
http://amxmod.net/forums/viewtop ... der=asc&start=0
为了顶这个帖子还被 AMXMOD.NET 版主警告了一次,真是没办法呀........
// PsychoMediator, Copyright 2002, PsychoGuard. No warranties.
// Props to JustinHoMi for his Mediator plugin.
//
// This is a simple C-D Mediator plugin. Players without C-D
// can be warned and kicked after a certain amount of kills.
// The decision can also be based on their K/D ratio.
// Checks are performed on round start.
// Already kicked players are remembered by their wonid and
// are immediately required to run C-D after they reconnected.
//
// The plugin stores remembered wonids in
//   .../addons/amx/pdmed.ini
//
// Cvars:
//   pd_mediator_kills - default 9
//     After that many kills players without C-D maybe kicked.
//     See mode "c" and pd_mediator_ratio.
//
//   pd_mediator_warn - default 5
//     After that many kills players without C-D maybe warned.
//     See mode "c" and pd_mediator_ratio.
//
//   pd_mediator_ratio - default 2.0
//     If mode "c" is active, players are not warned or kicked
//     based only on their kills, but also on ther kill/death-
//     ratio. If they have pd_mediator_kills many kills *and*
//     their K/D is higher than pd_mediator_ratio they are
//     kicked. The same goes for warnings.
//
//   pd_mediator_mode - default "ab"
//     a - Enabled. Without this flag the mediator will not
//         do any kicks or warnings.
//     b - Warn players before being kicked
//     c - Decide by K/D ratio
//
// Commands:
//   pd_mediator_add <part of nick>
//     Requires the player to immediately use Cheating-Death,
//     without the neccessity to be kicked before.

#include <amxmod>
#include <amxmisc>

#define MAX_KICK_HISTORY 128

#define MODE_ENABLED 1 << 0
#define MODE_WARN    1 << 1
#define MODE_RATIO   1 << 2

#define REASON_ALREADY_KICKED 1
#define REASON_NORMAL_KICK 2

new bool:is_invalid[33];
new kicked_wonids[MAX_KICK_HISTORY];
new kick_count = 0;
new mode_flags = 0;
new max_kills = 0;
new max_warn = 0;

new settings_file[] = "addons/amx/pdmed.ini";

already_kicked(id) {
    new wonid = get_user_wonid(id);

    for (new i = 0; i < kick_count; i++) {
        if (kicked_wonids == wonid)
            return true;
    }
    return false;
}

check_player(id) {
    new kills = get_user_frags(id);
    new deaths = get_user_deaths(id);
    if (deaths == 0) deaths = 1;

    new name[32];
    get_user_name(id, name, 31);
    log_message("[PD-MED] Checking player '%s', K/D: %.2f", name, float(kills) / float(deaths));

    if (already_kicked(id)) {
        kick_player(id, REASON_ALREADY_KICKED);
    } else if (kills > max_kills) {
        if (! (mode_flags & MODE_RATIO)
            || (float(kills) / float(deaths)) >= get_cvar_float("pd_mediator_ratio")) {
            remember_player(id);
            kick_player(id, REASON_NORMAL_KICK);
        }
    } else if (kills > max_warn && (mode_flags & MODE_WARN)) {
        if (! (mode_flags & MODE_RATIO)
            || (float(kills) / float(deaths)) >= get_cvar_float("pd_mediator_ratio")) {
            warn_player(id);
        }
    }
}


remember_player(id) {
    kicked_wonids[kick_count] = get_user_wonid(id);
    kick_count++;
    if (kick_count > (MAX_KICK_HISTORY - 1))
        kick_count = 0;
}

warn_player(id) {
    set_hudmessage(0, 225, 0);
    show_hudmessage(id, "Get Cheating-Death from http://www.unitedadmins.com/");
}

kick_player(id, reason) {
    new name[32];
    get_user_name(id, name, 31);
    client_print(0, print_chat, "%s kicked for not having C-D running.", name);
    switch (reason) {
    case REASON_NORMAL_KICK: {
        log_message("[PD-MED] %s kicked for not having C-D running.", name);
    }
    case REASON_ALREADY_KICKED: {
        log_message("[PD-MED] %s kicked for repeatedly not having C-D running.", name);
    }
    }
    client_cmd(id, "echo ^"Cheating-Death is required to play here.^"");
    client_cmd(id, "echo ^"Get it from www.unitedadmins.com.^"");
    server_cmd("kick #%d", get_user_userid(id));
}


public round_start() {
    mode_flags = get_mode();
    if (mode_flags & MODE_ENABLED == 0)
        return;

    max_kills = get_cvar_num("pd_mediator_kills");
    max_warn = get_cvar_num("pd_mediator_warn");

    new player_count = get_playersnum();
    new players[32];
    get_players(players, player_count, "c");

    for (new i = 0; i < player_count; i++) {
        if (is_invalid[players]) {
            check_player(players);
        }
    }
}

public user_invalid_event(id) {
    new user_id[8];
    read_argv(1, user_id, 7);
    new player_id = find_player("k", strtonum(user_id));
    is_invalid[player_id] = true;
}

get_mode() {
    new mode_str[4];
    get_cvar_string("pd_mediator_mode", mode_str, 4);
    return read_flags(mode_str);
}

public add_player(id, level, cid) {
    if (! cmd_access(id, level, cid, 2))
        return PLUGIN_HANDLED;

    new name[32];
    read_argv(1, name, 31);
    new player = find_player("b", name);

    if (! player) {
        console_print(id, "[PD-MED] No client matching '%s'.", name);
    } else {
        get_user_name(player, name, 31);
        if (already_kicked(player)) {
            console_print(id, "[PD-MED] %s is already required to use C-D.", name);
        } else {
            remember_player(get_user_wonid(player));
            console_print(id, "[PD-MED] %s is required to use C-D under all circumstances now.", name);
        }
    }

    return PLUGIN_HANDLED;
}

public list_kicks(id, level, cid) {
    if (! cmd_access(id, level, cid, 1))
        return PLUGIN_HANDLED;

    console_print(id, "%d registered wonids", kick_count);

    for (new i = 0; i < kick_count; i++) {
        console_print(id, "%d", kicked_wonids);
    }

    return PLUGIN_HANDLED;
}

load_settings() {
    if (!file_exists(settings_file)) {
        kick_count = 0;
    } else {
        new line = 0;
        new text[256];
        new wonid[12];
        new len;

        while (read_file(settings_file, line, text, 255, len)){
            if ( text[0] != ';' ) {
                parse(text, wonid, 11);
                kicked_wonids[line] = strtonum(wonid);
            }
            line++;
        }
        kick_count = line;
    }
}

save_settings() {
    if (file_exists(settings_file)) {
        delete_file(settings_file);
    }

    new text[256];
    for (new i = 0; i < kick_count; i++) {
        format(text, 255, "%d", kicked_wonids);
        write_file(settings_file, text);
    }
}

public client_connect(id) {
    is_invalid[id] = false;
    return PLUGIN_CONTINUE;
}

public plugin_end() {
    save_settings();
    return PLUGIN_CONTINUE;
}

public plugin_init() {
    register_plugin("Psycho's CD-Mediator", "0.9.3.1", "PsychoGuard");
    register_srvcmd("pd_user_invalid", "user_invalid_event");
    register_concmd("pd_mediator_list", "list_kicks", ADMIN_RCON, "");
    register_concmd("pd_mediator_add", "add_player", ADMIN_RCON, "<part of nick>");
    register_logevent("round_start", 2, "1=Round_Start");
    register_cvar("pd_mediator_mode", "ab");
    register_cvar("pd_mediator_kills", "9");
    register_cvar("pd_mediator_warn", "5");
    register_cvar("pd_mediator_ratio", "2");
    set_cvar_string("cdnovalidatecmd","pd_user_invalid %d");
    set_cvar_string("cdoldvalidatecmd","pd_user_invalid %d");
    load_settings();
    return PLUGIN_CONTINUE;
}
发表于 2003-10-20 12:38:05 | 显示全部楼层 来自 中国–湖北–武汉
不知道这个插件可否达到你的要求!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
回复

使用道具 举报

发表于 2003-10-20 14:41:11 | 显示全部楼层 来自 中国–福建–厦门
由于无法记录steamwonid,作者改为记录authid~附件如下
http://amxmod.net/forums/download.php?id=3870
或者使用becking提供的这个C-D Mediator Extended插件(也是记录authid)
当然是正版就无所谓了~
但如果是免cdkey的话,有一个玩家被踢,由于记录的是authid,其他的玩家也进不来了,还有可能kick掉所有玩家~
可通过把记录authid改为记录玩家name或ip来实现~
回复

使用道具 举报

 楼主| 发表于 2003-10-20 20:41:23 | 显示全部楼层 来自 中国–湖北–襄阳
呵呵,太感谢了,官方网站有结果了,但是作者说没有测试所以我没有把这个插件转过来,
插件全部收到,特此感谢!!
回复

使用道具 举报

 楼主| 发表于 2003-10-20 21:06:50 | 显示全部楼层 来自 中国–湖北–襄阳

[分享]CD Mediator FOR CS1.6,解决CD和人气的矛盾,功能内详!

在这里感谢两位大侠的热情帮助:becking兄 ,飘风 兄。

这个插件主要是设置一个规则来检查名字包括[NO C-D]的player的比分,超过某个限度(自己设定)就警告此玩家必须安装CD,如果不退出安装就记录这个玩家的steamid,次玩家以后必须开CD才可以进入服务器。
超过指标的[NO C-D] STEAMid 记录到 .../addons/amx/pdmed.ini 中
参数说明:
// Cvars:
//   pd_mediator_kills - default 9  (杀敌人数到此数开始检查)
//     After that many kills players without C-D maybe kicked.
//     See mode "c" and pd_mediator_ratio.
//
//   pd_mediator_warn - default 5 (死亡人数到此数时开始检查)
//     After that many kills players without C-D maybe warned.
//     See mode "c" and pd_mediator_ratio.
//
//   pd_mediator_ratio - default 2.0 (杀人比:K/D)
//     If mode "c" is active, players are not warned or kicked
//     based only on their kills, but also on ther kill/death-
//     ratio. If they have pd_mediator_kills many kills *and*
//     their K/D is higher than pd_mediator_ratio they are
//     kicked. The same goes for warnings.
//
//   pd_mediator_mode - default "ab" 插件工作模式
//     a - Enabled. Without this flag the mediator will not
//         do any kicks or warnings. (插件工作)
//     b - Warn players before being kicked (达到检查人数,先警告然后KICK)
//     c - Decide by K/D ratio (计算并且判断杀人比,超过设定比率,警告然后KICK)

本人使用中其他没有更改只是修改工作模式
pd_mediator_mode "ac"

作者声明修改为记录STEAMID后没有测试就发布了,本人使用一天发现没有什么问题,特此共享!由于能力有限解释的如果有问题请慷慨指出,好让大家明白。:tongue:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
回复

使用道具 举报

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

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