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

📄 auto_upgrade.c

📁 百宝箱3.27传奇3GQ外挂.支持私服.
💻 C
字号:
// Written by ywygpz
//
// 功能:自动升级武器
//
// 武器,首饰及全身装备均特修
// 黑铁从高到低从库中取出
// 自动判断首饰是否全新,否则丢弃
// 使用前请配置炼制内容、元素、仓库密码、准备地点、各级的首饰和黑铁
// 是否能够升级根据打怪后有否返回武器经验判断,为了保险,连续3次以上没有经验判定为武器可以升级

////////////////////////////////////////////////////////////
// 你必须修改以下内容以选择合适自己的炼制                 //
////////////////////////////////////////////////////////////

// 设置炼制内容:魔法、破坏、元素
#define FORGE_TYPE        "元素"

// 设置元素:火、冰、雷、风、神圣、暗黑、幻影
#define FORGE_ATOM        "火"

// 设置仓库密码
#define PASSWORD          "000000" 

// 设置炼制时使用的材料 
array ar_materials=allocate_array(15);
mapping mp_material; 

// 1 -> 2 级别的材料
ar_materials[0] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 3, 4, 5 })
]);

// 2 -> 3 级别的材料
ar_materials[1] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 4, 5, 6 })
]);

// 3 -> 4 级别的材料
ar_materials[2] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 5, 6, 7 })
]);

// 4 -> 5 级别的材料
ar_materials[3] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 6, 7, 8 })
]);

// 5 -> 6 级别的材料
ar_materials[4] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 7, 8, 9 })
]);

// 6 -> 7 级别的材料
ar_materials[5] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 8, 9, 10 })
]);

// 7 -> 8 级别的材料
ar_materials[6] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 9, 10, 11 })
]);

// 8 -> 9 级别的材料
ar_materials[7] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 10, 11, 12 })
]);

// 9 -> 10 级别的材料
ar_materials[8] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 11, 12, 13 })
]);

// 10 -> 11 级别的材料
ar_materials[9] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 12, 13, 14 })
]);

// 11 -> 12 级别的材料
ar_materials[10] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 13, 14, 15 })
]);

// 12 -> 13 级别的材料
ar_materials[11] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 14, 15, 16 })
]);

// 13 -> 14 级别的材料
ar_materials[12] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 15, 16, 17 })
]);

// 14 -> 15 级别的材料
ar_materials[13] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 16, 17, 18 })
]);

// 15 -> 16 级别的材料
ar_materials[14] = ([
    "jewelrys" : ({ "六绝星环", "六绝星环", "六绝星环", "六绝星环", "六绝星环" }),
    "irons"    : ({ 17, 18, 19 })
]);

////////////////////////////////////////////////////////////
// 配置内容到此结束                                       //
////////////////////////////////////////////////////////////

// 系统设置 - 一般情况下不需要修改
#define FORGE_NPC_NAME    "啊翔"
#define WEAPON_NPC_NAME   "老胡"
#define PREPARE_CITY      "银杏山谷"
#define FORGE_CITY        "沙巴克城"
#define IRON_NAME         "黑铁"
#define HIT_NPC_NAME      "多多"

// 快速卖掉物品
#define QUICKLY           1
#define GET_QUAL(x)       (((x) + 500) / 1000) 

// 不能保存的物品
array excluded_items = ({ "金创药(中)", "金创药(大)", "魔法药(中)",
      "回城卷", "随机传送卷", "金创药(特)"});

mapping forge_cmd=([]);
forge_cmd["破坏"]="@Refine_DC";
forge_cmd["元素"]="@Refine_Atom";
forge_cmd["魔法"]="@Refine_MC";
forge_cmd["火"]="@Refine_Fire";
forge_cmd["冰"]="@Refine_Ice";
forge_cmd["雷"]="@Refine_Light";
forge_cmd["风"]="@Refine_Wind";
forge_cmd["神圣"]="@Refine_Holy";
forge_cmd["暗黑"]="@Refine_Dark";
forge_cmd["幻影"]="@Refine_Pantom";

mapping hit_npc=([]);
hit_npc["多多"]=({211, 183});
hit_npc["老胡"]=({195, 183});
hit_npc["俞公"]=({203, 197});
hit_npc["晶晶"]=({204, 196});
hit_npc["惠莲"]=({214, 128});
hit_npc["双喜"]=({229, 150});
hit_npc["园老板"]=({229, 168});

int weapon_id;       //升级武器的ID
int L_weapon_up=0;   //武器是否可以升级全局变量,末升级=0,能升级=1

int smart_prepare_jewelrys() 
{ 
  mapping mp_npc; 
  int i,j; 
  int weapon_level=(int)(me()["equip"][1]["weapon_level"]-1.2); 
  int jewelrys_amount = sizeof(ar_materials[weapon_level]["jewelrys"]); 
  string jewelry; 
  int count = 0; 
  int jewelry_id;

  tell_user("炼制武器:开始购买首饰!");
  if(close_to_npc("jewelry", &mp_npc)) 
  { 
    sell_item(({ ITEM_RING, ITEM_WRIST, ITEM_NECKLACE }), mp_npc, 0, 1); 
    talk_to(mp_npc); 
    talk_to(mp_npc, "@buy");             
    for(i = 0; i < jewelrys_amount; i++)                 
    { 
      jewelry = ar_materials[weapon_level]["jewelrys"][i];                         
      show_inv(jewelry, 0); 
                                                 
      count = current_npc_inv_page["count"]; 
      if(!count) 
      { 
        tell_user("炼制武器:没有合适的首饰"); 
        return 0; 
      } 
      jewelry_id=current_npc_inv_page[0]["id"];
      tell_user(sprintf("炼制武器:购买首饰%O",jewelry));
      if(!buy(jewelry, 1, mp_npc)) 
      { 
        tell_user("炼制武器:购买首饰出错"); 
        return 0; 
      }
      for(j=sizeof(me()["carry"])-1;j>0;j--)
      {
        if(me()["carry"][j]["id"]==jewelry_id)
        {
          if(me()["carry"][j]["max_durability"]<me()["carry"][j]["org_durability"])
          {
            tell_user("炼制武器:首饰持久不足,丢弃");
            drop(me()["carry"][j]["id"]);
            i--;
            break;
          }
        }
      }
    } 
    return 1; 
  } 
  return 0; 
}
int take_irons() 
{ 
  mapping mp_npc; 
  mapping ob; 
  int i,j; 
  int iron_amount; 
  int iron_quality; 
  int temp_quality; 
  int takeout=0; 
  int weapon_level=(int)(me()["equip"][1]["weapon_level"]-1.2); 
    
  tell_user("炼制武器:开始取黑铁!");               
  if(!close_to_npc("storer", &mp_npc)) 
  { 
    tell_user("炼制武器:不能到达仓库!");
    return 0;
  }
  iron_amount = sizeof(ar_materials[weapon_level]["irons"]); 
  
  for(j=iron_amount-1;j>=0;j--) 
  { 
    iron_quality = ar_materials[weapon_level]["irons"][j]; 
    
    get_storage_info(mp_npc,PASSWORD); 
    if (! is_array(my_storage_info)) 
      my_storage_info = ({ }); 
    for ( i =sizeof(my_storage_info)-1 ; i >=0 ; i--) 
    { 
      if (!is_mapping(ob = my_storage_info[i])) 
        continue; 

      if (ob["name"] == IRON_NAME) 
      { 
        temp_quality = (int)(GET_QUAL(ob["quality"]));  
        if(iron_quality == temp_quality) 
        { 
          tell_user(sprintf("炼制武器:取出品质为%d的黑铁(%O)\n",iron_quality,ob["id"]));
          if(!take(ob["id"], 1, mp_npc))
          {
            tell_user("炼制武器:取出黑铁失败");
            return 0;
          }
          else 
          {
            takeout++; 
            break;
          }
        } 
      } 
      if(iron_amount == takeout) 
        return 1; 
    } 
  }                         
                 
  if(iron_amount > takeout) 
  { 
    tell_user("炼制武器:没有足够的黑铁"); 
    return 0;
  } 
                     
  return 1; 
} 

// 返回身上首饰的 ID,特修完毕以后将重新佩戴这些物品
int get_jewelry_id(string part)
{
  mapping item;

  if (is_mapping(item = me()["equip"][EQUIP_POS(part)]))
    return item["id"];

  return 0;
}

// 修理所有的首饰
int repare_jewelrys() 
{ 
  mixed id1 = get_jewelry_id("项链"); 
  mixed id2 = get_jewelry_id("左手镯"); 
  mixed id3 = get_jewelry_id("右戒指"); 

  int i; 
  mapping mycarry=me()["carry"]; 

  if(!goto_city_ex("银杏山谷",243,234,6))
  {
    tell_user("炼制武器:不能到达银杏山谷");
    return 0;
  } 

  tell_user("炼制武器:开始特修首饰");

  // 修理身上装备
  talk_to("光秀"); 
  talk_to("光秀","头盔"); 
  talk_to("光秀","现在修理"); 
  talk_to("光秀","前一步"); 
  talk_to("光秀","项链"); 
  talk_to("光秀","现在修理"); 
  talk_to("光秀","前一步"); 
  talk_to("光秀","衣服"); 
  talk_to("光秀","现在修理"); 
  talk_to("光秀","前一步"); 
  talk_to("光秀","手镯(左)"); 
  talk_to("光秀","现在修理"); 
  talk_to("光秀","前一步"); 
  talk_to("光秀","手镯(右)"); 
  talk_to("光秀","现在修理"); 
  talk_to("光秀","前一步"); 
  talk_to("光秀","戒指(右)"); 
  talk_to("光秀","现在修理"); 
  talk_to("光秀","前一步"); 
  talk_to("光秀","鞋子"); 
  talk_to("光秀","现在修理"); 
  talk_to("光秀","前一步"); 

  // 特修所有的首饰
  for(i=0;i<sizeof(mycarry);i++) 
  { 
    if(mycarry[i]["item_class"]==20||mycarry[i]["item_class"]==22||mycarry[i]["item_class"]==26) 
    { 
      printf("%O",mycarry[i]["id"]); 

      // 佩戴首饰到合适的位置上以便特修(注意:不能试图佩戴到左戒指,
      // 该位置可能是婚戒)
      if(mycarry[i]["item_class"]==20) 
      { 
        equip(mycarry[i]["id"], EQUIP_POS("项链"));
        talk_to("光秀","项链"); 
      } else
      if(mycarry[i]["item_class"]==26)
      {
        equip(mycarry[i]["id"], EQUIP_POS("左手镯"));
        talk_to("光秀","手镯(左)"); 
      } else
      if(mycarry[i]["item_class"]==22)
      { 
        equip(mycarry[i]["id"], EQUIP_POS("右戒指"));
        talk_to("光秀","戒指(右)"); 
      }

      talk_to("光秀","现在修理"); 
      talk_to("光秀","前一步"); 
    } 
  }

  talk_to("光秀","不修理"); 

  // 将特修时取下的身上的装备重新佩戴回去
  equip(id1, EQUIP_POS("项链"));
  equip(id2, EQUIP_POS("左手镯"));
  equip(id3, EQUIP_POS("右戒指"));
  return 1;
}

int close_to_forge_npc()
{
  mapping npc;
  if(!goto_city_ex(FORGE_CITY, 0, 0, 6))
  {
    tell_user("炼制武器:不能到达攻城战地域");
    return 0;
  }
        
  if(!close_to_npc("weapon", &npc))
  {        
    tell_user("炼制武器:不能到达老胡旁边\n");
    return 0;
  }
  return 1;
}

void forge()
{
  tell_user("炼制武器:开始炼制武器");
  talk_to(FORGE_NPC_NAME);
  talk_to(FORGE_NPC_NAME, "@Refine_Cmd");
  talk_to(FORGE_NPC_NAME, forge_cmd[FORGE_TYPE]);
  if(FORGE_TYPE=="元素")
    talk_to(FORGE_NPC_NAME, forge_cmd[FORGE_ATOM]);
  
  tell_user("炼制武器:取回武器");
  talk_to(FORGE_NPC_NAME);
  talk_to(FORGE_NPC_NAME, "@GetBack_Cmd");        
}

int forge_hit()
{

  mapping npc;
  //close_to_npc("jewelry", &npc);

  unride();        
  walk_close_to(hit_npc[HIT_NPC_NAME][0], hit_npc[HIT_NPC_NAME][1], 1);
                        
  hit(HIT_NPC_NAME);        
  return 1;
}


int auto_forge()
{
  tell_user("炼制武器:开始练刀!");
  weapon_id=me()["equip"][1]["id"];
  if(!goto_city(PREPARE_CITY,0,0))
  {
    tell_user("炼制武器:不能到达银杏山谷");
    return 0;
  } 
  if(!take_irons())
  {
    tell_user("炼制武器:没有取到合适的黑铁");
    return 0;
  } 
  if(!smart_prepare_jewelrys())
  {
    tell_user("炼制武器:没有买到合适的首饰");
    return 0;
  } 
  if(!repare_jewelrys() )
  {
    tell_user("炼制武器:特修首饰出错");
    return 0;
  }
  if(!close_to_forge_npc())
  {
          tell_user("炼制武器:不能到达练刀师傅身旁");
          return 0;
  }
  forge();
  L_weapon_up=0;
  equip(weapon_id);
  forge_hit();
  return 1;
}

int is_need_forge()
{
  if(me()["equip"][1]["weapon_level"] <= 16.1 &&
     L_weapon_up>2)
      return 1;

  return 0;        
}

void on_acquire_exp(int got_exp, int weapon_exp)
{
  if(got_exp>10&&weapon_exp==0)
  {
    if(L_weapon_up<10)
    {
      if(L_weapon_up==3)
      {
        tell_user("可以炼制武器了");
      }
      L_weapon_up++;
    }
  }
  else
  {
    if(L_weapon_up)
      L_weapon_up=0;
  }
}


int on_prepare_for_quest()
{
  if(is_need_forge())
  {
    // 本次准备设置包裹空余数量为 100 以便升级武器
    keep_bag_spare = 100;
    printf("设置包裹空余数量为 100");
  }

  // 采用缺省流程整备
  return 0;
}

void on_post_prepare_for_quest()
{
  if(is_need_forge())
  {
    auto_forge();
  }
}

⌨️ 快捷键说明

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