Tips・アイテム関連修正まとめ

使用できるガンプ

ググっても一覧が見られるサイトがなかったので、
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が定義されているもの)

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

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

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

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

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

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

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

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

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) -------------------------
}

アイテムの置かれる位置がおかしいんだが? 2016/12/10のアプデにてServUOが修正済み。

置かれる位置がおかしいのは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/レプリカをチャンピオンの棺桶のドロップにする場合のメモ

チャンピオン沸きの場合、AF/レプリカのドロップのトリガは、

[Scripts\Services\ChampionSystem\ChampionSpawn.cs]
●524行目
 if (this.m_Champion is BaseChampion)
   this.AwardArtifact(((BaseChampion)this.m_Champion).GetArtifact());
にあります。

しかし、現在、上記の貢献度評価処理の一部がバグっているのか、レプリカが全く出ないという情報があるため、あくまでも「当座の代替処置」として、とりあえずフェルッカのチャンピオンの棺桶に直接ドロップさせる場合は、以下のコード追加で可能です。

[Scripts\Mobiles\Bosses\BaseChampion.cs]
●244++行目あたり
 Item 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です。
(上記の確率配分は「数直線」を使って考えると判りやすいです。)

MoonstoneCrystalがアクセスできない不具合修正 (2017/5/8 ServUO側にも反映済み)

[Scripts\Quests\Eodon\MyrmidexThreat\Items\Rewards.cs]
●84行目
 public class MoonstoneCrystal : Item, ISecurable // ★, ISecurableを追加
 {
     public static Dictionary<int, Point3D> Locations { get; set; }
     // ★追加ここから
     private SecureLevel m_SecureLevel;
 
     [CommandProperty(AccessLevel.GameMaster)]
     public SecureLevel Level
     {
         get
         {
             return this.m_SecureLevel;
         }
         set
         {
             this.m_SecureLevel = value;
         }
     }
 
     public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
     {
         base.GetContextMenuEntries(from, list);
         SetSecureLevelEntry.AddTo(from, this, list);
     }
     // ★追加ここまで
 
     public static void Initialize()
     {
●8行目
 using Server.ContextMenus; // ★追加
 using Server.Multis; // ★追加

【注意】

以下は、両方の★を一度に追加すると旧セーブデータの互換性がなくMoonstoneCrystalインスタンスが読み込めなくなります!
もし実装する場合は、
Step1. いったんSerialize()の方の★だけ追加した状態でサーバーを再起動し、最低1回のWorldSavingを行う。
Step2. その後にDeserialize()の方の★を追加しておく。
という手順が必要です。

●上記追加後の239行目付近
 public override void Serialize(GenericWriter writer)
 {
     base.Serialize(writer);
     writer.Write(0);
     writer.Write((int)this.m_SecureLevel); // ★先に追加してWorldSaving実行
 }
 
 public override void Deserialize(GenericReader reader)
 {
     base.Deserialize(reader);
     int version = reader.ReadInt();
     this.m_SecureLevel = (SecureLevel)reader.ReadInt(); // ★WorldSavingを実行した後に追加
 }

ゴザが素材色を継承しない

Items\Addons\GozaMats.cs
GozaMatEastDeed
GozaMatSouthDeed
SquareGozaMatEastDeed
SquareGozaMatSouthDeed
BrocadeGozaMatEastDeed
BrocadeGozaMatSouthDeed
BrocadeSquareGozaMatEastDeed
BrocadeSquareGozaMatSouthDeed
の中に、以下の OnCraft() オーバーライドを定義すると色が反映されるようになります。(設置まで確認済み。)

public override int OnCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue)
{
  base.OnCraft(quality, makersMark, from, craftSystem, typeRes, tool, craftItem, resHue);
  Hue = resHue; // ★素材の色を反映

  return quality;
}

タグ:

+ タグ編集
  • タグ:

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

最終更新:2017年12月27日 19:57
添付ファイル