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

📄 auto_ore.c

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

// 功能:回城准备完毕之后自动合成刚玉石
// 说明:当回城准备完毕之后,系统会调用:
//       on_post_prepare_for_quest()
//       在该消息处理函数中,首先调用函数 process_ore()
//       选择合适的矿石,然后前往边境城市啊彬处,与啊彬
//       对话,合成刚玉石,重复上面的过程,直至没有合适
//       的矿石可以选择。
//
//       函数: 
//       int process_ore() 
//       用来存放和好的钢玉石,然后取得合适的矿石。
//       先去仓库,取得仓库信息,然后从仓库和包裹中挑选
//       合适的矿石,并从仓库中取出相应矿石。
//       如果成功返回 1,失败返回 0。
//
//       选择矿石的算法:
//       1、将矿石从小到大排列,取纯度最低的10块矿石。
//       2、如果不满足条件,将先前10块矿石中纯度最高的
//          替换为所有矿石中纯度最高的。
//       3、如果仍不满足条件,继续将纯度次高的替换为所有
//          矿石中纯度次高的。
//       4、依次循环。

// 取得矿物的品质,四舍五入
#define GET_QUAL(x) (((x) + 500) / 1000)
#define ORE_NAME    "钢玉矿石"

// 从仓库和包裹里选择合适的矿石
int process_ore()
{
    int      i, j;
    int      quality;
    int      total_num;
    int      total_quality;
    array    ore_list;
    mapping  my = me();
    mapping  mc;
    mapping  ob;
    mapping  npc;

    total_num     = 0;
    total_quality = 0;

    // 取得包裹信息
    mc       = my["carry"];
    // 分配数组,存放所有钢玉矿石的信息
    ore_list = allocate_array(sizeof(my_storage_info) + sizeof(mc));

    // 靠近仓库管理员,取得 npc 信息
    close_to_npc("storer", &npc);

    // 尝试将身上的矿物存入仓库
    for (i = sizeof(mc) - 1; i >= 0; i--)
    {
        ob = mc[i];

        if (ob["item_class"] == ITEM_MINE)
        {
            // 如果物品类型是矿物
            if (get_mine_treatment(ob) == ITEM_STORED)
                // 该矿物的处理方式是 存 ,存入仓库
                store(-i, npc);
            continue;                
        }
    }

    // 取得仓库内物品信息
    get_storage_info(npc, storage_password);
    if (! is_array(my_storage_info))
        // 如果没有取到,设置为空
        my_storage_info = ({ });

    // 获得仓库内钢玉矿石的信息
    for ( i = 0; i < sizeof(my_storage_info); i++)
    {
        if (! is_mapping(ob = my_storage_info[i]))
            continue;

        if (ob["name"] == ORE_NAME)
        {
            ore_list[total_num++] = ob;
            total_quality += GET_QUAL(ob["quality"]);
        }
    }

    // 刷新包裹
    refresh_inv();
    while (! is_mapping(my = me()) || ! my["got_inventory"])
        sleep(1);

    // 获得包裹内内钢玉矿石的信息
    mc       = my["carry"];
    for ( i = 0; i < sizeof(mc); i++)
    {
        if (! is_mapping(ob = mc[i]))
            continue;

        if (ob["name"] == ORE_NAME)
        {
            ore_list[total_num++] = ob;
            total_quality += GET_QUAL(ob["quality"]);
        }
    }

    if (total_num < 10 || total_quality < 100)
        // 如果矿石数目少于 10 或者 总纯度少于 100,返回 */
        return 0;

    // 将钢玉矿石数组从小到大排序
    for (i = 0; i < total_num - 1; i++)
    {
        for (j = total_num - 1; j > i; j--)
        {
            if (ore_list[j]["quality"] < ore_list[j - 1]["quality"])
            {
                ob = ore_list[j];
                ore_list[j] = ore_list[j - 1];
                ore_list[j - 1] = ob;
            }
        }
    }

    // 调试信息
    printf("After sort (%d):\n", total_num);
    for (i = 0; i < total_num; i++)
        printf(" %d ", GET_QUAL(ore_list[i]["quality"]));
    printf("\n");

    quality = 0;

    // 计算纯度最低的10块钢玉石的纯度总和
    for (i = 0; i < 10; i++)
    {
        quality += GET_QUAL(ore_list[i]["quality"]);
        // 标记将要使用该块矿石
        ore_list[i]["will_use"] = 1;
    }

    // 将先前10块矿石中纯度最高的替换为所有矿石中纯度最高的
    // 如果仍不满足条件,继续将纯度次高的替换为所有矿石中纯度次高的
    // 依次循环
    for (i = 9, j = 0; i >= 0; i--, j++)
    {
        if (quality >= 100)
            break;

        quality -= GET_QUAL(ore_list[i]["quality"]);
        ore_list[i]["will_use"] = 0;

        while (1)
        {
            if (quality + GET_QUAL(ore_list[total_num - 1 - j]["quality"]) <= 100)
                break;
            else
            if (quality + GET_QUAL(ore_list[total_num - 1 - j]["quality"]) >= 100 &&
                quality + GET_QUAL(ore_list[total_num - 1 - j - 1]["quality"]) < 100)
                break;
            else
                j++;
        }

        // 调试信息
        printf("Replace i %d with %d \n", i, total_num - 1 - j);

        quality += GET_QUAL(ore_list[total_num - 1 - j]["quality"]);
        ore_list[total_num - 1 - j]["will_use"] = 1;

        // 调试信息
        printf("Selected ore (%d):\n", quality);
        for (m = 0; m < total_num; m++)
            if (ore_list[m]["will_use"])
                printf(" %d ", GET_QUAL(ore_list[m]["quality"]));
        printf("\n");
    }

    if (quality < 100)
        // 没有找到合适的钢玉矿石
        return 0;

    // 从仓库中取出相应的矿石
    for (i = 0, j = 0; i < total_num; i++)
    {
        if (ore_list[i]["will_use"])
        {
            take(ore_list[i]["id"], 1, npc);
            // 等待操作完成
            clear_command();
        }
    }

    return 1;
}

//回城准备完毕之后自动合成刚玉石
int on_post_prepare_for_quest()
{
    tell_user("开始自动合成钢玉矿石");

    do
    {
        // 选择合适的矿石
        if (! process_ore())
        {
            // 没有合适的矿石
            tell_user("没有合适的矿石");
            return 0;
        }

        if (! goto_city_ex("边境城市", 0, 0, 6) ||
            ! run_close_to(422, 262, 6))
        {
            // 前往边境城市阿彬处失败(尝试6次)
            tell_user("靠近啊彬失败");
            return 0;
        }

        // 与啊彬对话
        talk_to("啊彬");
        talk_to("啊彬", "制作钢玉石");
        talk_to("啊彬", "收集完所需材料");
        talk_to("啊彬", "关闭");

    } while (1);
}

⌨️ 快捷键说明

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