戦闘・報酬関連修正まとめ


SAAFのマジックプロパティ(保留)

なんとなく諸王の墓にいるボス(名前がわかりません)で実験
例の如くプロパ付きSAAFが出ることしか確認は取ってません。
メソッド変えてるので不具合でるかも?
既存のメソッドを修正するより、モンスターのgetter/setter用意したほうが安全かなあ。

修正箇所

BaseCreature.cs
5173行目あたり
 public static void GiveSAArtifact(Mobile m) を
 public static void GiveSAArtifact(Mobile m, BaseCreature monster) に変更

すぐ下あたり
Item item = Activator.CreateInstance(m_SAArtifacts[Utility.Random(m_SAArtifacts.Length)]) as Item;
の下に
RandomItemGenerator.GenerateRandomItem(item, m, monster);
を追加

5226行あたりのOnKilledByメソッド

GiveSAArtifact(mob); を
GiveSAArtifact(mob , this); に変更。

2017/4/22のアップデートで付かなくなった原因

[Scripts\Services\RunicReforging\RunicReforging.cs]
●1522行目~
 if (artifact)
 {
     ChooseArtifactMods(item, budget, out mods, out perclow, out perchigh);
 }
アーティファクトの場合は別処理に飛ぶように変更されてしまっています。
ここを無効にすれば、また以前のようにランダムにマジックが付くようになります。
 if (false) // (artifact)
 {
     // ChooseArtifactMods(item, budget, out mods, out perclow, out perchigh); ←コメントにしなくてもいいけど絶対に通らないパスになるのでWarningが出ますw
 }

DOOMパパのアーティファクトのマジックプロパティ(導入済み)

パパスクリプトの203行目に以下追加
 RandomItemGenerator.GenerateRandomItem(i, pm, bc);

2017/4/22のアップデートで付かなくなった原因

SAAFが付かなくなった原因と同じで、上記のSAAFの修正をすればDOOM AFも治ります。
ただし注意点として、新ソースではCore.TOLがTrueのとき、DemonKnight.csの216行目の下に追加しないと意味がありません。(221行目の下ではありません。)

チャンピオン系レプリカとHSAFのマジックプロパティ(保留)

★HSAFはチャンピオンレプリカと同じ処理を使って実装されているようです。
★サッシュなどに付くと強力すぎて問題ありなら、条件文内の || artifact is BaseClothing は付けない。

[Scripts\Mobiles\Bosses\BaseChampion.cs]
128行目からのpublic Item CreateArtifact(Type[] list)内
●144行目に追加
else if (artifact is BaseWeapon || artifact is BaseArmor || artifact is BaseJewel || artifact is BaseClothing) // ★追加ここから
{
  if (Core.HS && RandomItemGenerator.Enabled)
  {
    RunicReforging.GenerateRandomItem(artifact, null, 1000, 0, ReforgedPrefix.None, ReforgedSuffix.None, null);
  }
} // ★追加ここまで
本当は、RandomItemGenerator.GenerateRandomItem(artifact, null, this);を使った方が、メソッド内でアイテムの種類をチェックしてくれるので、あらかじめチェックが不要になるのですが、BaseClothingが含まれていないため「ネクロマンサーの衣」などが対象外になってしまいます。
更に、モンスターのフェイムベースでbasebudgetが自動算出されると、チャンピオンクラスはかなり高プロパが付いてしまうので、引数を使って単独で調整できるメソッドの方がいいと判断しました。
引数1000の箇所がbasebudgetなので、ここで強度調整可能です。

トレハン箱とSOS宝箱の品質改善(適応済)

どのレベルも現在の値の10倍くらいでちょうどいい気がしますので以下に変更案を書きます。
[Scripts\Items\Containers\TreasureMapChest.cs]
●230行目あたりから
 switch (level)
 {
   case 1:
     numberItems = 32;
     propsScale = 5.625; // ←★この数値に変更を提案
     break;
   case 2:
     numberItems = 40;
     propsScale = 6.875; // ←★この数値に変更を提案
     break;
   case 3:
     numberItems = 48;
     propsScale = 8.75; // ←★この数値に変更を提案
     break;
   case 4:
     numberItems = 56;
     propsScale = 10.0; // ←★行ごと追加
     break;
   case 5:
     numberItems = 64;
     propsScale = 10.0; // ←★行ごと追加 (レベル4より少し上げてもいいかも)
     break;
   case 6:
     numberItems = 72;
     propsScale = 10.0; // ←★行ごと追加 (レベル5より少し上げてもいいかも)
     break;
   case 7:
     numberItems = 80;
     propsScale = 10.0; // ←★行ごと追加 (レベル6より少し上げてもいいかも)
     break;
   default:
     numberItems = 0;
     break;
 }

パラゴン箱の品質改善(導入予定)

トレハン箱のランダムアイテム生成関数を再利用します。ただし、幸運は無関係です。
(Scripts\Items\Containers\TreasureMapChest.csの273行目あたりが参考になります。)

[Scripts\Items\Containers\ParagonChest.cs]
●163行目の前に追加 (なおかつ、元163行目の行頭にelse を追加)
 if (item != null && Core.HS && RandomItemGenerator.Enabled) // ★ここから行追加
 {
   int min, max;
   double propsScale = 10.0; // ★デフォルトの品質
 
   switch (level) // ☆レベルごとに変えるならここからも追加
   {
       case 1:
           propsScale = 5.625;
           break;
       case 2:
           propsScale = 6.875;
           break;
       case 3:
           propsScale = 8.75;
           break;
       case 4:
           propsScale = 10.0;
           break;
       case 5:
           propsScale = 10.0;
           break;
       case 6:
           propsScale = 10.0;
           break;
       default:
           break;
   } // ☆レベルごとに変えるならここまでも追加
 
   TreasureMapChest.GetRandomItemStat(out min, out max, propsScale); // ★propsScaleの値で品質調整可
   RunicReforging.GenerateRandomItem(item, 0, min, max); // ★luck = 0 幸運ボーナスは無し
   this.DropItem(item);
 } // ★ここまで行追加
 else if (item is BaseWeapon) // ★else を追加
 {
●2行目
using Server.Mobiles; // ★行追加
ローカルのMaster Jonathで試して異常なし及びアイテム強度適正を確認しました。

☆パラゴン箱のレベルによる品質分けをしていなかったので、switch文を追加しました。これがないと、モンバットのパラゴンから出た箱でも同じ品質のものが出てしまいますねw
TreasureMapChest.cs内のswitch部分を関数化しようとも思ったのですが、トレハン箱とパラゴン箱ではアイテム数も異なるようですし、品質も個別に設定できた方が便利なので、ベタ書きにしました。
★ただ、数量がレベル×2個しか出ないので、全レベル最高品質だとしても、ゲーム内でほとんど無視されるモンバットのパラゴンなどが少しは注目されて楽しいかもしれません。

ネガプロパ付与確率の調整

本家をあまり知らないのですが、たしか非常に低確率ではあるものの、伝説級でもネガプロパが付かない確率はあったように思います。
ネガプロパについて、
[Scripts\Services\RunicReforging\RunicReforging.cs]

マジック最上級で50%の確率で付かないのに、その次のランクのアーティファクト低級で1%というのは随分極端なので、エミュとしてはここは20~30%くらいでいいように思います。
●1911行目
 if (0.01 > chance) // ←★0.3くらいに変更を提案
   return;

その下、アーティファクト中級上級の分岐はなく、中級以上は必ずネガプロパが付くようになってしまっているので、中級と上級に10~20%程度の確率で付かないようにして、
●1931行目のすぐ下に追加
 if (0.2 > chance) return; // ←★0.2くらいで行追加を提案

上級と伝説級では5%~10%程度の確率で付かないようにするくらいでどうでしょうか?
●1948行目のすぐ下に追加 (上の追加で2行ズレたら1950行目)
 if (0.1 > chance) return; // ←★0.1くらいで行追加を提案

これでもアップデート前よりは厳しい状態かもしれません。

追伸

ServUOオリジナルの不具合として、1873~1876行が原因でbudgetが400~549の範囲で生成されるアイテムに、+100ボーナスbudget付きのPrizedが付くことがないようです。
一度しか乱数を取得していないchance変数を2回連続で使っており、なおかつ1回目で0.5未満ではreturnしてしまっているのに、その下で0.4未満の場合をコーディングしてしまっています。
ソースのコメントでは「// major magic」と書いてありますが、ランク評価はアイテムの種類によって異なるため、必ずしも「マジックアイテム最上級」のものとは限らず、多少ランクが前後してPrizedが付かないものがあるようです。

SAAFやDOOM AFなど追加プロパに使用しているメソッドでパーフェクションによる幸運値ボーナスが含まれていない件(修正予定)

[Scripts\Services\RunicReforging\RunicReforging.cs]
●1601行目あたりから
 public static int GetLuckForKiller(BaseCreature dead)
 {
   Mobile highest = dead.GetHighestDamager();
 
   if (highest != null)
   {
     int LuckBonusPerfection = 0; // ★行追加ここから
 
     if (highest is PlayerMobile)
     {
       PlayerMobile pm = highest as PlayerMobile;
 
       if (pm.SentHonorContext != null && pm.SentHonorContext.Target == dead)
       {
         LuckBonusPerfection = pm.SentHonorContext.PerfectionLuckBonus;
       }
     } // ★行追加ここまで
 
     // ★末尾に + LuckBonusPerfection を追加
     return highest.Luck + TenthAnniversarySculpture.GetLuckBonus(highest) + FountainOfFortune.GetLuckBonus(highest) + LuckBonusPerfection;
   }
 
   return 0;
 }
上記の修正で、一応、幸運値には加算されます。

★ただ、先日のドロップアイテム品質改善時の調整値にもよるのですが、AFを出すようなMOBは元々フェイムが高すぎて、幸運は影響しにくい状態になっています。
(幸運は、たまたま乱数で品質が低すぎる(budget < 550)ときに品質を上げる救済措置的な処理になっているため。)
でも、ロジックとしては、やはりパーフェクションの分も幸運値には加算しておくべきと思います。

チャンピオン系AF/レプリカをチャンピオンの棺桶のドロップにする場合のメモ

Tipsへ移動しました。

アビスの沸きの新悪魔や新リッチのレプリカがシェアード系も内装系もリスト登録がない 2016/12/10アプデにてServUOが修正。

(内装アイテムの魔法の扉なども実装された模様です。さらし台(Pillory)はないっぽい?)

[Scripts\Mobiles\Bosses\AbyssalInfernal.cs]
●69行目から (PrimevalLich.csは111行目から)
 public override Type[] SharedList
 {
   get
   {
     return new Type[] { };
   }
 }
 public override Type[] DecorativeList
 {
   get
   {
     return new Type[] { };
   }
 }
★リストに追加すればいいかと思い気や、なんとこれらについては、クラス定義も見当たらず。
例えば、アークデーモン像(ArchdemonStatue)や、さらし台(Pillory)など。
ServUO側で、クラスファイルがリリースされれば追加が楽ですね・・・。

コロスケのディスペル耐性があまりにも低すぎる件(保留)

ディスペル確率の計算は、[Scripts\Spells\Sixth\Dispel.cs]の62行目にあります。
 double dispelChance = (50.0 + ((100 * (from.Skills.Magery.Value - bc.GetDispelDifficulty())) / (bc.DispelFocus * 2))) / 100;
各召喚MOBごとの特性は、例えば土エレの場合、
[Scripts\Mobiles\Summons\SummonedEarthElemental.cs]
●45行目から
 public override double DispelDifficulty
 {
   get
   {
     return 117.5;
   }
 }
 public override double DispelFocus
 {
   get
   {
     return 45.0;
   }
 }
となっています。
コロスケの場合は、
[Scripts\Mobiles\Summons\RisingColossus.cs]
●10行目から
 public override double DispelDifficulty{ get{ return 125.0; } }  // ★低すぎ?
 public override double DispelFocus{ get{ return 45.0; } }
となっています。

ServUOデフォルトでは、土エレよりちょっとマシな程度になっており、DispelDifficultyをもっと高くしていいようです。

2017/4/23アップデートでドロップアイテムの質が低くなりすぎた件の応急処置

[Scripts\Services\RunicReforging\RandomItemGenerator.cs]
●30行目~
 MaxBaseBudget = Config.Get("Loot.MaxBaseBudget", 700); // ←★最大「基礎」強度: 以前は1400を提案していた値に該当します。
 MinBaseBudget = Config.Get("Loot.MinBaseBudget", 150); // ←★最小「基礎」強度: 質の底上げをする場合ここを増やすといいかも。
 MaxProps = Config.Get("Loot.MaxProps", 11); // 1アイテムあたりの最大プロパティー数
 
 MaxAdjustedBudget = Config.Get("Loot.MaxAdjustedBudget", 1450); // ←★絶対最大強度: 以前は1500を提案していた値に該当します。
 MinAdjustedBudget = Config.Get("Loot.MinAdjustedBudget", 150);  // ←★絶対最小強度

2017/4/23アップデートで近くにいないと保護キャラがPSを貰えなくなった件

[Scripts\Mobiles\Bosses\BaseChampion.cs]
●159行目
全参加者について、100マス以内とファセットチェックが追加されています。
 if (ds.m_HasRight && InRange(ds.m_Mobile, 100) && ds.m_Mobile.Map == this.Map)
         toGive.Add(ds.m_Mobile);
●63行目
保護キャラについては、こちらにも100マス以内とファセットチェックがあります。
 if (prot.Map != m.Map || prot.Murderer || prot.Criminal || !JusticeVirtue.CheckMapRegion(m, prot) || !prot.InRange(champ, 100))
         continue;
★マスタリー手引きについては、現在のところ保護キャラが獲得する処理は未実装のようです。
206~224行の処理を参考に、96行目の下にも追加すれば保護キャラも獲得できるようになります。

レイスでターゲットを一撃で倒した場合にマナが吸えない不具合の応急処置方法

[Scripts\Spells\Base\SpellHelper.cs]
●1394行目~ と 1226行目~ (同じパターンが2箇所です)
 int intMana = target.Mana;  // ★(行追加)ターゲット死亡前のマナ値退避
 int damageGiven = AOS.Damage(damageable, from, iDamage, phys, fire, cold, pois, nrgy, chaos, direct);
 
 if (from != null && target != null) // sanity check
 {
     DoLeech(damageGiven, from, target, intMana);  // ★第4引数追加
 }

●1260行目
 if (target.Alive) mana = target.Mana; // ★(行追加)ターゲットがまだ生きているならきちんと最新値を取得
 int wraithLeech = Math.Min(mana, (5 + (int)((15 * from.Skills.SpiritSpeak.Value) / 100))); // ★第1引数変更 Wraith form gives 5-20% mana leech

●1252行目 (関数実体)
 public static void DoLeech(int damageGiven, Mobile from, Mobile target, int mana)  // ★第4引数追加
 {

[Scripts\Spells\Necromancy\PainSpike.cs]
PainSpikeだけはSpellHelperのDamage()を使っていないので、ここも修正。
●111行目
 int intMana = m.Mana;  //  ★ターゲット死亡前のマナ値退避
 AOS.Damage(m, Caster, (int)damage, 0, 0, 0, 0, 0, 0, 100);
 SpellHelper.DoLeech((int)damage, Caster, m, intMana);  // ★第4引数追加

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2017年05月04日 01:11
添付ファイル