⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 advertisment.c

📁 百宝箱3.27传奇3GQ外挂.支持私服.
💻 C
字号:
// Written by BBX workgroup
// Release: 2004/5/29

// 功能:自动广告

// 广告功能表
mapping advers = ([
    "content" : "你好,这里是自动广告:\n" +
                "1. 什么是自动广告\n" +
                "2. ...\n" +
                "0. 返回上一级\n",
    "1" : ([
        "content" : "你好,自动广告是....\n" +
                    "0. 返回上一级\n"
    ]),
]);

// 当前选择对象
// 关键字:名字
// 值:([ "time" : 最后刷新时间,
//        "ack"  : 最后应答信息,
//        "fail_times" : 连续选择失败的次数
//        "menu" : ({ 当前菜单, 上一级菜单, 上上一级菜单 ..... })
// ])
mapping selections = ([ ]);

// 接收到了用户的密语选择
void on_receive_message(string org, string msg)
{
    mapping cur_menu;
    string  peer_name, pure_msg;

    if (org == MSG_LISTEN)
    {
        sscanf(msg, "%s=> %s", &peer_name, &pure_msg);
        if (! is_mapping(cur_menu = selections[peer_name]))
        {
            // 没有上次对话的信息,初始化信息
            cur_menu = ([ "time" : time(), "ack" : "", "menu" : ({ advers }) ]);
            selections[peer_name] = cur_menu;
        }

        pure_msg = trim(pure_msg);

        // 更新时间和最后一次应答的信息
        cur_menu["time"] = time();
        cur_menu["ack"]  = pure_msg;

        printf("User %s send command %s\n", peer_name, pure_msg);
        if (pure_msg == "0")
        {
            // 返回上一级
            if (sizeof(cur_menu["menu"]) <= 1)
            {
                // 已经到了顶级
                tell(peer_name, "谢谢关注,再见");
                return;
            }

            // 退回一级
            cur_menu["menu"] = cur_menu["menu"][1..<1];
            tell_msgs(peer_name, cur_menu["menu"][0]["content"]);
            selections[peer_name] = cur_menu;
            return;
        }

        if (! is_mapping(cur_menu["menu"][0][pure_msg]))
        {
            // 检查连续发送的错误信息次数
            cur_menu["fail_times"] = (int) cur_menu["fail_times"] + 1;
            if (cur_menu["fail_times"] > 3)
            {
                // 重复发送多次,可能是自动应答
                printf("Received too many duplicated messages. Remove %s.\n", peer_name);
                set_timer(2, 0, "map_delete", selections, peer_name);
            }

            // 没有这个选择,重新提示当前菜单
            tell_msgs(peer_name, "错误的选择\n" + cur_menu["menu"][0]["content"]);
            return;
        }

        // 新选择了子菜单,添加新的选择
        cur_menu["fail_times"] = 0;
        cur_menu["menu"] = ({ cur_menu["menu"][0][pure_msg] }) + cur_menu["menu"];
        tell_msgs(peer_name, cur_menu["menu"][0]["content"]);
        selections[peer_name] = cur_menu;
    }
}

// 人物出现,准备发送广告
void on_char_appear(mapping ob)
{
    if (ob["type"] == OBJECT_TYPE_CHAR && ob["id"] != my_id())
    {
        // 等待 1 秒钟再检查(等待接收用户名字)
        set_timer(1, 0, "check_char", ob["id"]);
    }
}

// 判断是否需要发送广告
void check_char(int id)
{
    mapping ob;
    mapping cur_menu;

    if (! is_mapping(ob = all_objects[id]) || ! ob["got_name"])
    {
        // 没有此人物的信息或者未取得名字
        return;
    }

    if (is_mapping(cur_menu = selections[ob["name"]]) &&
        time() - cur_menu["time"] < 30)
    {
        // 30 秒以内向此人发送过信息
        return;
    }

    // 发送广告信息
    tell_msgs(ob["name"], advers["content"]);
    selections[ob["name"]] = ([ "time" : time(), "ack" : "", "menu" : ({ advers }) ]);
}

// 进入世界
void on_enter_world()
{
    delete_thread("tcheck");
    create_thread(0, "tcheck");
}

// 定期扫描当前选项,取消超时选项
void tcheck()
{
    mapping cur_menu;
    array   ks;
    int     i;

    for (;;)
    {
        sleep(1);

        ks = keys(selections);
        for (i = 0; i < sizeof(ks); i++)
        {
            cur_menu = selections[ks[i]];
            if (time() - cur_menu["time"] > 60)
                // 60秒没有访问
                map_delete(selections, ks[i]);
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -