スクリプト

「スクリプト」の編集履歴(バックアップ)一覧に戻る

スクリプト - (2016/10/24 (月) 16:44:12) の編集履歴(バックアップ)


スクリプトはこちらのページにアップロード、説明、Tips等をお書きください。
希望するアップデートのスクリプトをアップロードしていただいてもOKですが、必ず採用するわけではないのでよろしくお願いします。
で・す・が
やはりこちらの作業無しで修正されている、アップデートされているファイルがあるなら利用することに基本的に前向きですw

こちらのリアル都合や力量の具合によりプレイヤーさんにスクリプト、修正などの協力を申し出ることがあります。
協力して頂けるととても助かります。

まさかのスクリプトまで、皆で作るラピスになります^^;

HSアップデート前のラピスのファイルはこちら
です。
パスワードは Lapis です。

現在のラピスのバージョンのServUOはこちら
です。
パスワードは同じく Lapis です。

これらファイルは適用しているバージョンを変更した際にリンク修正します。

現在の修正協力要請
様々なバグ除去w

釣り関連まとめ

生産関連修正まとめ

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

Tips

スキル上昇判定とかしてるところ

Moblie.cs
  • CheckSkill(SkillName skill, double minSkill, double maxSkill)
  • CheckSkill(SkillName skill, double chance)
  • CheckTargetSkill(SkillName skill, object target, double minSkill, double maxSkill)
  • CheckTargetSkill(SkillName skill, object target, double chance)

使用できるガンプ

ググっても一覧が見られるサイトがなかったので、
mulかuopか知らんですけどガンプを読み込んでc:\workにpng出力するようにしました。
UOFiddlerが使える環境なら不要かな?
全部のガンプを出力するのに数秒かかります。

思った以上に見たことないのが多かった。

var count = 65535;
for (var id = 0; id < count; id++)
{
  try
  {
      Bitmap img = Ultima.Gumps.GetGump(id);
      String path = "C:\\work\\";
      String fileName = String.Format("{0:X4}_{1}x{2}.png", id, img.Width, img.Height);
      img.Save(path + fileName);
  }
  catch { }
}

保管系アイテムのSerialize/Deserialize

ちょっとコアな話。
保管系のアイテムのSerialize/Deserializeは
保管したアイテム自体もSerialize/Deserializeしている。
つまり内部的にオブジェクトを生成している。
これが結構メモリの無駄で、
必要な情報のみを記述したデータクラスでも作ってSerialize/Deserializeし、
取出し時にデータクラスを元にオブジェクト生成すればかなりオブジェクト削減になると思われる。
今後の課題かなあ?
花箱の動作確認してるときに思いました。

言うは易く行うは難し。

自然染料が使える対象

こういうのTipsに書いとけばいいんじゃないか!と思った。
ServUOのデフォルトで自然染料が使える対象です。
  • タブで染められると定義されているもの(定義はされていても弾いてる場合があります)
  • 本系 a bookとかです
  • 布で作ったもの
  • リングとかブレスレットとかの宝石系
  • スタチュー
  • 武器
  • ルーンブック
  • スペルブック系
  • 皮(色はなんでもいい)、または鉄(色はなんでもいい)で作成されており、骨ではない防具
  • 家具(内部処理の話になりますがFurnitureAttributeが定義されているもの)

防具のわけわからん判定文はいらないんじゃないかと思います。
なぜこうしてるのか理由が思い浮かびません。
きっと作成者は骨と木が嫌いなんだろうなあ。

このほかは個別に対応していく必要あり。
がんばってくれると思います。なるさんが。


イヤリングとネックレスの錬成対象化

[Scripts\Skills\Imbuing\Core\Imbuing.cs]
●76行目の条件文に追加
 else if (item is BaseJewel && !(item is BaseRing) && !(item is BaseBracelet) && !(item is BaseEarrings) && !(item is BaseNecklace))

ネックレス(銀)について

ネックレス(銀)については以下の部分も追加が必要です。
●169行目
 if (item.GetType() == typeof(SilverRing) || item.GetType() == typeof(SilverBracelet) || item.GetType() == typeof(Necklace) || item.GetType() == typeof(SilverNecklace))
   return false;
上記の通り条件に、|| item.GetType() == typeof(Necklace) || item.GetType() == typeof(SilverNecklace) を追加します。

★一見、NPC店売りのネックレス(銀)はSilverNecklace(0x1F08)と思ってしまいますが、(0x1085)なのでただのNecklaceなんですね。
(おそらくUO初期からある普通のネックレスで、見た目が銀なだけだったんですね。)

勤勉の首飾り(NecklaceofDiligence.cs)は、SilverNecklace(0x1F08)クラスを継承していますが、個別にアーティファクト扱いになっているので錬成不可で問題ありませんでした。
公正のアミュレット(AmuletOfRighteousness.cs)も、アーティファクト扱い&Blessなので錬成不可で問題ありませんでした。

なお、Gold系のアクセはすでに錬成可能なので、その下のforeachブロックのCraftSystem.Systemsに含まれていて、特殊アイテム=falseで返っているようです。
あと、ネックレスにはビーズタイプのSilverBeadNecklace(0x1F05)クラスもありますが、こちらもクラフトアイテム扱いですでに錬成可能でした。

オークヘルムについて

★その他、オークヘルムなど、生産可能品「以外」は上記の169行目の部分でfalseを返してやらないとスペシャルアイテム扱いとなり、"You cannot imbue an item with such strange magical properties."のメッセージが出て錬成対象から弾かれます。

例えば、"OrcHelm"を錬成可能にするためには、
 || item.GetType() == typeof(OrcHelm)
 // (実際は || item is OrcHelm という表現でよいのですがw)
を追加する形になりますが、"OrcHelm"を錬成可能にした場合、これを継承している"EvilOrcHelm"も自動的に錬成可能となりますので、"EvilOrcHelm"は錬成不可にしたい場合は、EvilOrcHelm.cs に、
 public override bool IsArtifact { get { return true; } }
を追加してアーティファクト扱いにすればOKです。

骨腕が錬成できない不具合修正 修正済

原因

BoneArms.csが、Scripts\Items\Artifacts\Equipment\Armor\Sets\DaemonBone\内にあり、なおかつ8行目に
 public override bool IsArtifact { get { return true; } }
があり、アーティファクト扱いになっている。

修正内容

(1) Scripts\Items\Artifacts\Equipment\Armor\Sets\DaemonBone\BoneArms.csの8行目
 public override bool IsArtifact { get { return true; } }
をコメントアウトして無効化する。
(ネクロ腕は独自ファイルがありちゃんとアーティファクト扱いになっています。)
(2) できれば上記のBoneArms.csを、適切な場所であるScripts\Items\Equipment\Armor\内に移動する。
(3) 逆に、Scripts\Items\Equipment\Armor\内に、DaemonArms.csとDaemonHelm.csがあるので、これらはScripts\Items\Artifacts\Equipment\Armor\Sets\DaemonBone\内に移動した方が良いかも。


アニマルロアあがんねー

ServUOのバグ。
調教済みの動物をロアった時に上昇チェックがない。
これでいいのかわからないけどアナトミーと同じよう直接スキルを使用しての上昇はGMまでとしました。
AnimalLore.cs

protected override void OnTarget(Mobile from, object targeted)
これの

double skill = from.Skills[SkillName.AnimalLore].Value;
if(skill < 100.0)
{
  if (c.Controlled)
// Rev.1(Mod S)----------------------------------------
//   SendGump(from, c);
  {
    from.CheckTargetSkill(SkillName.AnimalLore, targeted, 0, 100);
    SendGump(from, c);
  }
// Rev.1(Mod E)----------------------------------------
  else
    from.SendLocalizedMessage(1049674); // At your skill level, you can only lore tamed creatures.
}

アイテムのランク評価が適切でない件→適用済

変だと思う例

(1) 強度475の指輪が「マジックアイテム (上級)」
(2) 強度562の指輪が「マジックアイテム (最上級)」

参考記事

パブリッシュ73の記事によると
http://www.uoguide.com/Publish_73
"Lesser Artifact (this is approximately equivalent to an item Imbued to the max)"
「アーティファクト(低級)は最大まで練成したアイテムとほぼ同程度の強度」

原因

[Scripts\Services\RunicReforging\RunicReforging.cs] 2015++行目付近
 public static ItemPower GetItemPower(Item item, bool playermade) // アイテム強度評価を返す関数
●2017++行目付近
   double max = Imbuing.GetMaxWeight(item) + 50; // ←★+50不要
●2021++行目付近
   double preArty = (max + 50); // ←★+50不要かも?

修正前

480~600「マジックアイテム(最上級)」
601~719「アーティファクト (低級)」

修正後

400~500「マジックアイテム (最上級)」
501~659「アーティファクト (低級)」

なお、ちょっと変わりすぎかな?ということでしたら、2017++行目付近の方の+50だけを削除すれば、
preArty = 550 になり
440~550「マジックアイテム (最上級)」
551~689「アーティファクト (低級)」
となりますので、これくらいでもいいのかもしれません。

神秘呪文にFC/CRが効いていない不具合修正→適用済

[Scripts\Spells\Mysticism\MysticSpell.cs]
●76行目
 return TimeSpan.FromSeconds(0.5 + (0.25 * (int)Circle));
 ↓変更
 return base.GetCastDelay();
●68行目
 return TimeSpan.FromSeconds(0.75);
 ↓変更
 return base.GetCastRecovery();
●21行目
 public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds(1.0); } }
 ↓変更
 public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds(0.5 + 0.25 * (int)Circle); } }

コロ助の召喚時間についての不具合修正→適用済

錬成スキルと集中スキルがともに0のときに一瞬でご帰還される。
[Scripts\Spells\Mysticism\SpellDefinitions\RisingColossusSpell.cs]
●46行目
 TimeSpan duration = TimeSpan.FromSeconds(Caster.Skills[CastSkill].Value / 4 + Caster.Skills[DamageSkill].Value / 4);
に修正する。併せて、すぐ下のSpellHelper.Summon()の第5引数のscaleDurationをfalseに変更しておかないと、神秘スキル値によって時間を再調整されてしまいます。
●47行目
 SpellHelper.Summon( new RisingColossus(), Caster, 0x216, duration, false, true, Caster.Player, CastSkill );

色付きコイン→一部事情を変えて導入済

昔、色が染められたらなあって話があったのでサクッと作ってみました。
新規追加アイテムとなるので、ドSGMと優しいSubGMとで協議してください。
かなりマニア向けなものです。

Zipファイルにリンク張ろうと思ったけどうまくいかないね。
アップロードファイルをもつページ一覧からスクリプト→Scripts.zipになります。
というか下の添付ファイルからもいけた。

ステータスウィンドウのFC表示不具合修正 修正済

「騎士道スキルが70.0未満」のときのみ最大4までとなり、それ以外は最大2までとなってしまっている。
ここは、「魔法スキルが70.0未満」の間違いです。
[Scripts\Misc\AOS.cs]
●276行目
 int max = from.Skills[SkillName.Chivalry].Value < 70.0 ? 4 : 2;
 ↓修正
 int max = from.Skills[SkillName.Magery].Value < 70.0 ? 4 : 2;
変化したときに、PDのSTATUSボタンを押さないと表示更新されないのは鹿さんと遊ぶときと同じようですが、FC=4になるのをローカルで確認しました。

10th Anniversary Sculpture(幸運壺)について

使用してもステータスウィンドウの幸運値が上昇しない不具合の修正

[Server\Mobile.cs]
●8452行目
 public virtual int LuckBonusSculpture { get { return 0; } } // ★行追加
 public virtual int LuckBonusFountain { get { return 0; } } // ★行追加

[Scripts\Mobiles\PlayerMobile.cs]
●3589行目
 public override int LuckBonusSculpture { get { return TenthAnniversarySculpture.GetLuckBonus(this); } } // ★行追加
 public override int LuckBonusFountain { get { return FountainOfFortune.GetLuckBonus(this); } } // ★行追加

[Server\Network\Packets.cs]
●3550行目
 m_Stream.Write((short)m.Luck); // Luck
 ↓変更
 m_Stream.Write((short)(m.Luck + m.LuckBonusSculpture + m.LuckBonusFountain)); // Luck
●3664行目
 m_Stream.Write((short)beheld.Luck); // Luck
 ↓変更
 m_Stream.Write((short)(beheld.Luck + beheld.LuckBonusSculpture + beheld.LuckBonusFountain)); // Luck
★注意★
Serverプロジェクト内ソースなので、反映にはCompile.WIN.batの実行かVisualStudioでのビルドが必要です。
また、ゲーム内では鹿さんと遊んぶときと同様に、自動では表示が更新されないため、PDのSTATUSボタンを押して最新状態に表示更新して下さい。

アカ歴による上昇値の追加(導入する場合)

[Scripts\Items\Artifacts\Decorative\TenthAnniversarySculpture.cs]
●2行目
 using Server.Accounting; // ★追加
 using Server.Engines.VeteranRewards; // ★追加
●新21行目
 private static readonly int LuckBonus = 200; // ★新規さん含めて底上げしたいときはこの値です
●新116行目
 // ★追加ここから
 private static int GetLuckExtend(Mobile from)
 {
   Account acct = from.Account as Account;
   if (acct == null) return 0;
 
   TimeSpan totalTime = (DateTime.UtcNow - acct.Created) + TimeSpan.FromDays(RewardSystem.RewardInterval.TotalDays * RewardSystem.StartingLevel);
 
   int luckExtend = (totalTime.Days / 30) * 50; // ★ここでアカ歴による上昇分を調整可能です
   if (luckExtend > 1000) luckExtend = 1000;
 
   return luckExtend;
 }
 // ★追加ここまで
●新134行目
 return LuckBonus + GetLuckExtend(from); // ★ + GetLuckExtend(from)を追加

★効果継続状態で別な壺を使うと、表示されるメッセージが変なのはServUO元々のようですw

ガーゴイル専用版のプリズムレンズがヒューマンやエルフでイヤリングとして装備できる不具合について 修正済

[Scripts\Items\Artifacts\Equipment\Glasses\GargishGlasses.cs]

以下の2行を追加します。
●8行目
 public override Race RequiredRace { get { return Race.Gargoyle; } } // ★追加
 public override bool CanBeWornByGargoyles { get { return true; } }  // ★追加
ローカルで試した際に、これを追加してもエルフで装備できてしまったので変だなと思ったのですが、GMキャラだと一時的に装備できてしまうのでしょうか。
いったん装備して、ステータスが変化するような別の装備を外したりすると、「プリズムレンズはもう着ていられません」と出て自動的に外されました。
上記の追加だけで、きちんとヒューマンやエルフの通常キャラが着用できなくなるかは未確認ですが、とりあえずガーゴイル専用の表記は付くようになりました。

単一の神殿のクエストマゾいっす→2時間へ修正済み

ServUOのバグ。
よくわからんけど指摘通り24時間(リアルでの1日)になってた。
本家なら2時間(UOでの1日)だけど合わせる必要は無いと思う。

ShrineOfSingularity.cs

// Rev.1(Mod S) --------------------
//private static readonly TimeSpan FailDelay = TimeSpan.FromHours(24);
private static readonly TimeSpan FailDelay = TimeSpan.FromMinutes(1);
// Rev.1(Mod E) --------------------

削除だと動かないだの達成できないだのよろしくないことが起きそうなので時間変更で。
結局はなるさんの裁量次第だけど、1分でいいよね!

ドーンのオルゴールが他人だと使えない

なぜかよくわからないけど内部的に2個存在する。
ラピスではどちらが採用されているかわからないので両方とも修正。
オルゴールを突っ込んだら取り外せない仕様のようなのでセキュリティ面は気にしなくてよさそう。

DawnsMusicBox

public override void OnDoubleClick(Mobile from)
{
  // Rev.1(Mod S) --------------------
  if (!this.IsChildOf(from.Backpack) && !this.IsLockedDown)
    from.SendLocalizedMessage(1061856); // You must have the item in your backpack or locked down in order to use it.
  else if (!this.IsLockedDown)
    from.SendLocalizedMessage(502436); // That is not accessible.
  else
  {
    from.CloseGump(typeof(DawnsMusicBoxGump));
    from.SendGump(new DawnsMusicBoxGump(this));
  }
  /*
  if (!this.IsChildOf(from.Backpack) && !this.IsLockedDown)
    from.SendLocalizedMessage(1061856); // You must have the item in your backpack or locked down in order to use it.
  else if (this.IsLockedDown && !this.HasAccces(from))
    from.SendLocalizedMessage(502436); // That is not accessible.
  else
  {
    from.CloseGump(typeof(DawnsMusicBoxGump));
    from.SendGump(new DawnsMusicBoxGump(this));
  }
  */
  // Rev.1(Mod E) --------------------
}

RewardVersionのDawnsMusicBox.cs

public override void OnDoubleClick(Mobile from)
{
  if (this.m_Tracks.Count < 1)
  {
    from.SendMessage("This music box is empty.");
  }
  // Rev.1(Del S) -------------------------
  //else if (this.IsOwner(from))
  //{
  // Rev.1(Del E) -------------------------
  if (!this.IsLockedDown)
    from.SendLocalizedMessage(502692); // This must be in a house and be locked down to work.
  else
  {
    if (from.HasGump(typeof(MusicGump)))
      from.CloseGump(typeof(MusicGump));
				
    from.SendGump(new MusicGump(this));
  }
  // Rev.1(Del S) -------------------------
  //}
  //else
  //{
  //    from.SendLocalizedMessage(502691); // You must be the owner to use this.
  //}
  // Rev.1(Del E) -------------------------
}

アイテムの置かれる位置がおかしいんだが?

置かれる位置がおかしいのはServUOのバグなんだけど、
コードにバグがあるからコメントアウトされてるのか不明。
コメントアウトにより小型テーブルにアイテム置くと妙に上に置かれたり、
本来積めるはずのアイテムが積めなかったりする。
旧ソースではコードが生きてます。

Item.cs

private Point3D FindDropPoint(Point3D p, Map map, int maxZ)
if (myTop != -255)
{
  int match = (1 << height) - 1;
  bool okay = false;

  for (int i = 0; i < 20; ++i)
  {
    if ((i + height) > 20)
    {
      match >>= 1;
    }

    okay = ((m_OpenSlots >> i) & match) == match;
                 
    if (okay)
    {
      z += i;
      break;
    }                   
  }
  if (!okay)
  {
    return Point3D.Zero;
  }
}
こいつがコメントアウトされてるのでコメントアウトをはずす。
また、旧ソースとあわせるため
if (myTop != -255)をコメントアウトする。
中括弧もね!

チャンピオン系AF/レプリカがドロップしない不具合

すでに修正されていると思っていましたが、出ないとの情報があるため改めて掲載します。
★★すみません、この修正は不要かもしれません!★★
[Scripts\Services\ChampionSystem\ChampionSpawn.cs]
○524行目
 if (this.m_Champion is BaseChampion)
   this.AwardArtifact(((BaseChampion)this.m_Champion).GetArtifact());
こんな所をトリガにドロップしてたのか・・・?w

★以下、不要と思われますが、しばらく残しておきます。
[Scripts\Mobiles\Bosses\BaseChampion.cs]
●244++行目あたり
 Item artifact; // ★追加ここから
 artifact = GetArtifact();
 if (artifact != null)
 {
   this.PlaySound(0x5B4); // ピピーの音を流すと見逃しがなくて素敵かも
   c.DropItem(artifact);
 } // ★追加ここまで

上記の(またはこれに相当する)修正が既に入っていて確率だけ調整する場合

●116行目
 public virtual Item GetArtifact()
 {
   double random = Utility.RandomDouble();            // random には、0.0~0.9999・・・の値が返る
   if (0.05 >= random)                                // 5%の確率で、
     return this.CreateArtifact(this.UniqueList);     // ユニーク系レプリカ(ねずみボスの場合はFangOfRactusのみでGauntletsOfAngerはなぜかシェアード系扱いになっている)
   else if (0.15 >= random)                           // 10%(15%じゃない点に注意)の確率で、
     return this.CreateArtifact(this.SharedList);     // シェアード系レプリカ
   else if (0.30 >= random)                           // 15%(30%じゃない点に注意)の確率で、
     return this.CreateArtifact(this.DecorativeList); // 内装系アイテム
   return null;                                       // 70%の確率でドロップなし
 }
ServUOオリジナルでは、上記の確率になっていますので、ここの数値を調整すればOKです。
(上記の確率配分は「数直線」を使って考えると判りやすいです。)

アビスの沸きでAFがドロップしない件

新悪魔(AbyssalInfernal.cs)、新リッチ(PrimevalLich.cs)から出るはずの、
 DeathsHead, WallofHungryMouths, AbyssalBlade
 --
 BansheesCall, CastOffZombieSkin, ProtectoroftheBattleMage, ChannelersDefender
が出ない。

前提

上記の「チャンピオン系AF/レプリカがドロップしない不具合」が修正してあること。

原因

両者ともBaseChampionクラスを継承しており、チャンピオン系のUniqueListからのドロップとなっています。
OnDeath()のオーバーライド内でbase.OnDeath()を呼んでいますが、base.OnDeath()内では先頭に、
[Scripts\Mobiles\Bosses\BaseChampion.cs]
●222++行目あたり
 if (this.Map == Map.Felucca)  // フェルッカのみ
の条件があるため、特別な修正をしていない限り、アビス(テルマーのファセット)ではAF類のドロップ処理が行われていません。

実際ローカルで試したところ、フェルッカでは出ますがアビスでは出ませんでした。

★同様に、トクノ沸き(Serado)、ツイステッド沸き(Twaulo)、ベドラム沸き(Ilhenir)などからも、フェルッカ以外のファセットではドロップしていないと思われます。

★ChampionSpawn.csの525行目にGetArtifact()のトリガがありますが、シェアード系と内装系のリストにアイテム登録がないため、シェアード系と内装系が出ていないだけのようです。

修正方法

最も簡単な修正は、ここを、
 if (this.Map == Map.Felucca || this.Map == Map.TerMur)
にすることですが、注意点として、テルマーのファセット内にAF類が「出てはいけない」チャンピオン系がいないことが必要です。
おそらくそんなものはいないですよね?

★また、トクノ沸き、ツイステッド沸き、ベドラム沸きなどのことも考えると、ここのファセット条件文は、AF/レプリカ類のドロップの邪魔になっていると思います。

レプリカについてはシェアード系も内装系もリスト登録すらない

[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側で、クラスファイルがリリースされれば追加が楽ですね・・・。