查看: 2247|回复: 24

[巫妖王之怒] 无需复制装备模板的装备升级eluna脚本(数据库已补全)

[复制链接]

69

时沙

0

精华

2

主题

声望: 302   虚弱: 0

Lv.2(潜行者)

 楼主| 发表于 2024-4-6 22:03:54 | 显示全部楼层 |阅读模式
本帖最后由 angelsclan 于 2024-4-7 22:05 编辑

注意:此脚本需要具有module制作和相应的编译能力
此装备升级系统针对所有的装备都可以升级,材料自定义,无需复制创建装备,升级后的装备ID不变,涉及到的两张表已经包含在附件里面
此功能需要自己写一个module应用升级后的装备属性,代码如下
  1. void OnAfterApplyItemMods(Player* player, Item* item, uint8 slot, bool apply) override
  2. {
  3.      //LOG_INFO("entities.player", "player {} OnAfterApplyItemMods【{}】 slot:{} update:{}", player->GetName(), item->GetGUID().GetCounter(), slot, apply ? 'ON' : 'OFF');
  4.    
  5.      //查询装备升级记录
  6.      QueryResult result = CharacterDatabase.Query("SELECT instance_guid, upgrade_lvl, owner_guid, increase_ratio FROM _item_upgrade WHERE instance_guid = '{}'", item->GetGUID().GetCounter());
  7.      if (result) {
  8.          //LOG_INFO("entities.player", "player {} found upgrade【{}】 slot:{} update:{}", player->GetName(), item->GetGUID().GetCounter(), slot, apply ? 'ON' : 'OFF');
  9.          ItemTemplate  itemInstance = GetUpgradeItemInstance(item, result);
  10.          ItemTemplate const* proto = &itemInstance;
  11.          /*
  12.    
  13.          std::string name = proto->Name1;
  14.          if (ItemLocale const* il = sObjectMgr->GetItemLocale(item->GetEntry()))
  15.          {
  16.              ObjectMgr::GetLocaleString(il->Name, static_cast<LocaleConstant>(LOCALE_zhCN), name);
  17.          }
  18.                */
  19.          ApplyUpgradeItemBonuses(player, proto, slot, apply, false);
  20.      }
  21.      // 处理附魔技能效果
  22.      for (uint32 eslot = 0; eslot < MAX_ENCHANTMENT_SLOT; ++eslot){
  23.          EnchantmentSlot slotId = EnchantmentSlot(eslot);
  24.          uint32 enchant_id = item->GetEnchantmentId(slotId);
  25.          if (!enchant_id)
  26.              continue;
  27.          SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
  28.          if (!pEnchant)
  29.              continue;
  30.          for (int s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
  31.          {
  32.              uint32 enchant_display_type = pEnchant->type[s];
  33.              uint32 enchant_amount = pEnchant->amount[s];
  34.              uint32 enchant_spell_id = pEnchant->spellid[s];
  35.              if (enchant_display_type == ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL) {
  36.                  if (enchant_spell_id)
  37.                  {
  38.                      if (apply)
  39.                      {
  40.                          // 学习泰坦之握技能
  41.                          if ((enchant_spell_id == 97001) and !player->HasSpell(enchant_spell_id))
  42.                          {
  43.                              player->learnSpell(enchant_spell_id);
  44.                          }
  45.                      }else{
  46.                          // 取消泰坦之握效果
  47.                          if (enchant_spell_id == 97001 && player->HasSpell(enchant_spell_id))
  48.                          {
  49.                              player->removeSpell(enchant_spell_id, player->GetActiveSpecMask(), false);
  50.                              if (!player->HasTalent(46917, player->GetActiveSpec())){
  51.                                  player->SetCanTitanGrip(false);
  52.                                  //player->AutoUnequipOffhandIfNeed();
  53.                              }
  54.                          }
  55.                      }
  56.                  }
  57.              }
  58.          }
  59.      }
  60. }
  61. void ApplyUpgradeItemBonuses(Player* player, ItemTemplate const* proto, uint8 slot, bool apply, bool only_level_scale /*= false*/)
  62. {
  63.      if (slot >= INVENTORY_SLOT_BAG_END || !proto)
  64.          return;
  65.      ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
  66.      if (only_level_scale && !ssd)
  67.          return;
  68.      // req. check at equip, but allow use for extended range if range limit max level, set proper level
  69.      uint32 ssd_level = player->GetLevel();
  70.      uint32 CustomScalingStatValue = 0;
  71.      sScriptMgr->OnCustomScalingStatValueBefore(player, proto, slot, apply, CustomScalingStatValue);
  72.      uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
  73.      if (ssd && ssd_level > ssd->MaxLevel)
  74.          ssd_level = ssd->MaxLevel;
  75.      ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
  76.      if (only_level_scale && !ssv)
  77.          return;
  78.      for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
  79.      {
  80.          uint32 statType = 0;
  81.          int32  val = 0;
  82.          // If set ScalingStatDistribution need get stats and values from it
  83.          if (ssv)
  84.          {
  85.              if (ssd)
  86.              {
  87.                  if (ssd->StatMod[i] < 0)
  88.                      continue;
  89.                  statType = ssd->StatMod[i];
  90.                  val = (ssv->getssdMultiplier(ScalingStatValue) * ssd->Modifier[i]) / 10000;
  91.              }
  92.              else
  93.              {
  94.                  if (i >= proto->StatsCount)
  95.                      continue;
  96.                  // OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv)
  97.                  sScriptMgr->OnCustomScalingStatValue(player, proto, statType, val, i, ScalingStatValue, ssv);
  98.              }
  99.          }
  100.          else
  101.          {
  102.              if (i >= proto->StatsCount)
  103.                  continue;
  104.              statType = proto->ItemStat[i].ItemStatType;
  105.              val = proto->ItemStat[i].ItemStatValue;
  106.          }
  107.          if (val == 0)
  108.              continue;
  109.          switch (statType)
  110.          {
  111.          case ITEM_MOD_MANA:
  112.              player->HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
  113.              break;
  114.          case ITEM_MOD_HEALTH:                           // modify HP
  115.              player->HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(val), apply);
  116.              break;
  117.          case ITEM_MOD_AGILITY:                          // modify agility
  118.              player->HandleStatModifier(UNIT_MOD_STAT_AGILITY, BASE_VALUE, float(val), apply);
  119.              player->ApplyStatBuffMod(STAT_AGILITY, float(val), apply);
  120.              break;
  121.          case ITEM_MOD_STRENGTH:                         //modify strength
  122.              player->HandleStatModifier(UNIT_MOD_STAT_STRENGTH, BASE_VALUE, float(val), apply);
  123.              player->ApplyStatBuffMod(STAT_STRENGTH, float(val), apply);
  124.              break;
  125.          case ITEM_MOD_INTELLECT:                        //modify intellect
  126.              player->HandleStatModifier(UNIT_MOD_STAT_INTELLECT, BASE_VALUE, float(val), apply);
  127.              player->ApplyStatBuffMod(STAT_INTELLECT, float(val), apply);
  128.              break;
  129.          case ITEM_MOD_SPIRIT:                           //modify spirit
  130.              player->HandleStatModifier(UNIT_MOD_STAT_SPIRIT, BASE_VALUE, float(val), apply);
  131.              player->ApplyStatBuffMod(STAT_SPIRIT, float(val), apply);
  132.              break;
  133.          case ITEM_MOD_STAMINA:                          //modify stamina
  134.              player->HandleStatModifier(UNIT_MOD_STAT_STAMINA, BASE_VALUE, float(val), apply);
  135.              player->ApplyStatBuffMod(STAT_STAMINA, float(val), apply);
  136.              break;
  137.          case ITEM_MOD_DEFENSE_SKILL_RATING:
  138.              player->ApplyRatingMod(CR_DEFENSE_SKILL, int32(val), apply);
  139.              break;
  140.          case ITEM_MOD_DODGE_RATING:
  141.              player->ApplyRatingMod(CR_DODGE, int32(val), apply);
  142.              break;
  143.          case ITEM_MOD_PARRY_RATING:
  144.              player->ApplyRatingMod(CR_PARRY, int32(val), apply);
  145.              break;
  146.          case ITEM_MOD_BLOCK_RATING:
  147.              player->ApplyRatingMod(CR_BLOCK, int32(val), apply);
  148.              break;
  149.          case ITEM_MOD_HIT_MELEE_RATING:
  150.              player->ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
  151.              break;
  152.          case ITEM_MOD_HIT_RANGED_RATING:
  153.              player->ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
  154.              break;
  155.          case ITEM_MOD_HIT_SPELL_RATING:
  156.              player->ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
  157.              break;
  158.          case ITEM_MOD_CRIT_MELEE_RATING:
  159.              player->ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
  160.              break;
  161.          case ITEM_MOD_CRIT_RANGED_RATING:
  162.              player->ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
  163.              break;
  164.          case ITEM_MOD_CRIT_SPELL_RATING:
  165.              player->ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
  166.              break;
  167.          case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
  168.              player->ApplyRatingMod(CR_HIT_TAKEN_MELEE, int32(val), apply);
  169.              break;
  170.          case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
  171.              player->ApplyRatingMod(CR_HIT_TAKEN_RANGED, int32(val), apply);
  172.              break;
  173.          case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
  174.              player->ApplyRatingMod(CR_HIT_TAKEN_SPELL, int32(val), apply);
  175.              break;
  176.          case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
  177.              player->ApplyRatingMod(CR_CRIT_TAKEN_MELEE, int32(val), apply);
  178.              break;
  179.          case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
  180.              player->ApplyRatingMod(CR_CRIT_TAKEN_RANGED, int32(val), apply);
  181.              break;
  182.          case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
  183.              player->ApplyRatingMod(CR_CRIT_TAKEN_SPELL, int32(val), apply);
  184.              break;
  185.          case ITEM_MOD_HASTE_MELEE_RATING:
  186.              player->ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
  187.              break;
  188.          case ITEM_MOD_HASTE_RANGED_RATING:
  189.              player->ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
  190.              break;
  191.          case ITEM_MOD_HASTE_SPELL_RATING:
  192.              player->ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
  193.              break;
  194.          case ITEM_MOD_HIT_RATING:
  195.              player->ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
  196.              player->ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
  197.              player->ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
  198.              break;
  199.          case ITEM_MOD_CRIT_RATING:
  200.              player->ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
  201.              player->ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
  202.              player->ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
  203.              break;
  204.          case ITEM_MOD_HIT_TAKEN_RATING:
  205.              player->ApplyRatingMod(CR_HIT_TAKEN_MELEE, int32(val), apply);
  206.              player->ApplyRatingMod(CR_HIT_TAKEN_RANGED, int32(val), apply);
  207.              player->ApplyRatingMod(CR_HIT_TAKEN_SPELL, int32(val), apply);
  208.              break;
  209.          case ITEM_MOD_CRIT_TAKEN_RATING:
  210.          case ITEM_MOD_RESILIENCE_RATING:
  211.              player->ApplyRatingMod(CR_CRIT_TAKEN_MELEE, int32(val), apply);
  212.              player->ApplyRatingMod(CR_CRIT_TAKEN_RANGED, int32(val), apply);
  213.              player->ApplyRatingMod(CR_CRIT_TAKEN_SPELL, int32(val), apply);
  214.              break;
  215.          case ITEM_MOD_HASTE_RATING:
  216.              player->ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
  217.              player->ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
  218.              player->ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
  219.              break;
  220.          case ITEM_MOD_EXPERTISE_RATING:
  221.              player->ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
  222.              break;
  223.          case ITEM_MOD_ATTACK_POWER:
  224.              player->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(val), apply);
  225.              player->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(val), apply);
  226.              break;
  227.          case ITEM_MOD_RANGED_ATTACK_POWER:
  228.              player->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(val), apply);
  229.              break;
  230.              //            case ITEM_MOD_FERAL_ATTACK_POWER:
  231.              //                ApplyFeralAPBonus(int32(val), apply);
  232.              //                break;
  233.          case ITEM_MOD_MANA_REGENERATION:
  234.              player->ApplyManaRegenBonus(int32(val), apply);
  235.              break;
  236.          case ITEM_MOD_ARMOR_PENETRATION_RATING:
  237.              player->ApplyRatingMod(CR_ARMOR_PENETRATION, int32(val), apply);
  238.              break;
  239.          case ITEM_MOD_SPELL_POWER:
  240.              player->ApplySpellPowerBonus(int32(val), apply);
  241.              break;
  242.          case ITEM_MOD_HEALTH_REGEN:
  243.              player->ApplyHealthRegenBonus(int32(val), apply);
  244.              break;
  245.          case ITEM_MOD_SPELL_PENETRATION:
  246.              player->ApplySpellPenetrationBonus(val, apply);
  247.              break;
  248.          case ITEM_MOD_BLOCK_VALUE:
  249.              player->HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(val), apply);
  250.              break;
  251.              /// @deprecated item mods
  252.          case ITEM_MOD_SPELL_HEALING_DONE:
  253.          case ITEM_MOD_SPELL_DAMAGE_DONE:
  254.              break;
  255.          }
  256.      }
  257.      // 法术强度
  258.      if (ssv)
  259.          if (int32 spellbonus = ssv->getSpellBonus(ScalingStatValue))
  260.              player->ApplySpellPowerBonus(spellbonus, apply);
  261.      // If set ScalingStatValue armor get it or use item armor
  262.      uint32 armor = proto->Armor;
  263.      if (armor)
  264.      {
  265.          UnitModifierType modType = TOTAL_VALUE;
  266.          if (proto->Class == ITEM_CLASS_ARMOR)
  267.          {
  268.              switch (proto->SubClass)
  269.              {
  270.              case ITEM_SUBCLASS_ARMOR_CLOTH:
  271.              case ITEM_SUBCLASS_ARMOR_LEATHER:
  272.              case ITEM_SUBCLASS_ARMOR_MAIL:
  273.              case ITEM_SUBCLASS_ARMOR_PLATE:
  274.              case ITEM_SUBCLASS_ARMOR_SHIELD:
  275.                  modType = BASE_VALUE;
  276.                  break;
  277.              }
  278.          }
  279.          player->HandleStatModifier(UNIT_MOD_ARMOR, modType, float(armor), apply);
  280.      }
  281.      uint8 attType = Player::GetAttackBySlot(slot);
  282.      if (attType != MAX_ATTACK)
  283.      {
  284.          switch (attType)
  285.          {
  286.          case BASE_ATTACK:
  287.          default:
  288.              player->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, BASE_VALUE, float((proto->Damage->DamageMax + proto->Damage->DamageMin) / 2), apply);
  289.              break;
  290.          case OFF_ATTACK:
  291.              player->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, BASE_VALUE, float((proto->Damage->DamageMax + proto->Damage->DamageMin) / 2), apply);
  292.              break;
  293.          case RANGED_ATTACK:
  294.              player->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, BASE_VALUE, float((proto->Damage->DamageMax + proto->Damage->DamageMin) / 2), apply);
  295.              break;
  296.          }
  297.          //player->_ApplyWeaponDamage(slot, proto, nullptr, apply);
  298.      }
  299.      // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
  300.      if (player->getClass() == CLASS_DRUID)
  301.      {
  302.          int32 dpsMod = 0;
  303.          int32 feral_bonus = 0;
  304.          if (ssv)
  305.          {
  306.              dpsMod = ssv->getDPSMod(ScalingStatValue);
  307.              feral_bonus += ssv->getFeralBonus(ScalingStatValue);
  308.          }
  309.          feral_bonus += proto->getFeralBonus(dpsMod);
  310.          sScriptMgr->OnGetFeralApBonus(player, feral_bonus, dpsMod, proto, ssv);
  311.          if (feral_bonus)
  312.              player->ApplyFeralAPBonus(feral_bonus, apply);
  313.      }
  314. }
复制代码

  1.     ItemTemplate GetUpgradeItemInstance(Item* item, QueryResult result)
  2.     {
  3.         ItemTemplate const* itemTemplate = item->GetTemplate();
  4.         ItemTemplate itemInstance = *itemTemplate;
  5.         //ItemTemplate  temp = LoadUpgradeItem(item);
  6. //ItemTemplate const* proto = &temp;
  7.         std::string name = itemTemplate->Name1;
  8.         if (ItemLocale const* il = sObjectMgr->GetItemLocale(item->GetEntry()))
  9.         {
  10.             ObjectMgr::GetLocaleString(il->Name, static_cast<LocaleConstant>(LOCALE_zhCN), name);
  11.         }
  12.         // 初始化属性
  13.         itemInstance.Damage->DamageMin = 0;
  14.         itemInstance.Damage->DamageMax = 0;
  15.         itemInstance.Armor = 0;
  16.         for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) {
  17.             itemInstance.ItemStat[i].ItemStatValue = 0;
  18.         }
  19.         for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) {
  20.             itemInstance.Damage[i].DamageMin = 0;
  21.             itemInstance.Damage[i].DamageMax = 0;
  22.         }
  23.         Field* fields = result->Fetch();
  24.         int32 incRatio = fields[3].Get<uint32>();
  25.         if (incRatio > 0)
  26.         {
  27.             // 基础伤害
  28.             int32 minDamage = itemTemplate->Damage->DamageMin;
  29.             int32 maxDamage = itemTemplate->Damage->DamageMax;
  30.             if (minDamage > 0 && maxDamage > 0)
  31.             {
  32.                 itemInstance.Damage->DamageMin = std::ceil((minDamage / static_cast<float>(100)) * incRatio);
  33.                 itemInstance.Damage->DamageMax = std::ceil((maxDamage / static_cast<float>(100)) * incRatio);
  34.                 LOG_DEBUG("entities.player", ">>{} 伤害{} => {} - {} => {}", name, minDamage, itemInstance.Damage->DamageMin, maxDamage, itemInstance.Damage->DamageMax);
  35.             }
  36.             // 属性伤害
  37.             /**
  38.             for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) {
  39.                 float minDamage = itemTemplate->Damage[i].DamageMin;
  40.                 float maxDamage = itemTemplate->Damage[i].DamageMax;
  41.                 itemInstance.Damage[i].DamageMin = std::ceil((minDamage / static_cast<float>(100)) * incRatio);
  42.                 itemInstance.Damage[i].DamageMax = std::ceil((maxDamage / static_cast<float>(100)) * incRatio);
  43.             }
  44.             */
  45.             // 护甲提升
  46.             int32 armor = itemTemplate->Armor;
  47.             if (armor > 0)
  48.             {
  49.                 itemInstance.Armor = std::ceil((armor / static_cast<float>(100)) * incRatio);
  50.                 LOG_DEBUG("entities.player", ">>{} 护甲{} => {}", name, itemTemplate->Armor, itemInstance.Armor);
  51.             }
  52.             // 属性提升
  53.             for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
  54.             {
  55.                 int32  val = 0;
  56.                 if (i >= itemTemplate->StatsCount)
  57.                     continue;
  58.                 val = itemTemplate->ItemStat[i].ItemStatValue;
  59.                 if (val == 0)
  60.                     continue;
  61.                 itemInstance.ItemStat[i].ItemStatValue = std::ceil((val / static_cast<float>(100)) * incRatio);
  62.                 LOG_DEBUG("entities.player", ">>{} 属性:{} {} => {}", name, itemTemplate->ItemStat[i].ItemStatType, val, itemInstance.ItemStat[i].ItemStatValue);
  63.             }
  64.         }
  65.         itemInstance.Delay = 0;
  66.         return itemInstance;
  67.     }
复制代码



装备升级1.png 装备升级2.png


装备升级3.png

装备升级4.png 装备升级5.png



item.zip

8.07 KB, 下载次数: 16

售价: 10 DKP  [记录]

点评

大佬,已购买。不过我看附件似乎没有客户端显示所需要的代码?  发表于 2024-7-29 18:13
别人发东西出来就是好事情 ,卖东西我欢迎 希望魔兽圈子越来越好  发表于 2024-4-8 20:16
这是换着方式来推销你的软件的?  发表于 2024-4-7 20:04
以我的经验来看, 这个东西必须修改源码实现, 除非所使用的eluna经过魔改, 大致看了一眼, 缺表,和 缺实现  发表于 2024-4-7 19:44

1057

时沙

0

精华

2

主题

声望: 1781   虚弱: 0

Lv.5(无冕者)

永远的萌新

灵蛇献瑞(尚美制作)祥龙贺岁(尚美制作)金兔迎春(尚美制作)炉石今天也只能打恢复的增强萨福虎贺岁(尚美制作)

发表于 2024-4-7 09:12:01 | 显示全部楼层
感谢大佬分享!你这控制台让人更感兴趣呀!
[发帖际遇]: cs297334757在魔古山宝库发现大量宝箱,大肆搜刮后获得543 金币. 幸运榜 / 衰神榜
回复

使用道具 举报

发表于 2024-4-7 09:20:51 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1483

时沙

1

精华

24

主题

声望: 11792   虚弱: 0

Lv.7(复仇者)

Ctrl+C选手

灵蛇献瑞(尚美制作)祥龙贺岁(尚美制作)金兔迎春(尚美制作)炉石时沙之瓶假死猎人今天也只能打恢复的增强萨

发表于 2024-4-7 09:21:36 | 显示全部楼层
不错感谢分享,免得制作升级物品数据了
[发帖际遇]: 月干推倒一粒蛋,获得了狗蛋之颅,熬了一锅汤趁热喝下,获得1 声望. 幸运榜 / 衰神榜
Ctrl+C选手
回复

使用道具 举报

发表于 2024-4-7 09:31:55 | 显示全部楼层
稍微有点小懵逼,这个lua还得配合你的这个软件使用吗大佬
回复

使用道具 举报

发表于 2024-4-7 09:54:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

发表于 2024-4-7 10:32:57 | 显示全部楼层
怎么使用有没有说明???是直接放到LUA文件夹就能用的吗???
[发帖际遇]: yeyq9449推倒一粒蛋,获得了狗蛋之颅,熬了一锅汤趁热喝下,获得1 声望. 幸运榜 / 衰神榜
回复

使用道具 举报

316

时沙

0

精华

7

主题

声望: 1656   虚弱: 0

Lv.5(无冕者)

炉石

发表于 2024-4-7 10:43:18 | 显示全部楼层
软件收费的吧
回复

使用道具 举报

1048

时沙

0

精华

0

主题

声望: 4049   虚弱: 0

Lv.6(觉醒者)

炉石

发表于 2024-4-7 11:05:14 | 显示全部楼层
感谢大佬分享,谢谢了!感觉挺酷的~
[发帖际遇]: okgoba推倒一粒蛋,获得了狗蛋之颅,熬了一锅汤趁热喝下,获得2 声望. 幸运榜 / 衰神榜
回复

使用道具 举报

1185

时沙

0

精华

9

主题

声望: 1252   虚弱: 0

Lv.5(无冕者)

假死猎人今天也只能打恢复的增强萨炉石信仰战

发表于 2024-4-7 11:47:31 | 显示全部楼层
怎么用啊
[发帖际遇]: Review因锻造技术不过关,将灰烬使者打造成灰尘使者,赔偿8 金币. 幸运榜 / 衰神榜
回复

使用道具 举报

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