したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

スクリプトTIPS

76まもる:2019/05/17(金) 06:22:53 ID:.Wf8mbjQ
>>75
ServUOの新しいペットコントロール関係の処理を少し追ってみたのですが、やっぱりなんだか随分と変なことやってますね〜。

■[Scripts\Services\Pet Training\PetTrainingHelper.cs]
967行目
return m.Skills[SkillName.AnimalTaming].Value >= bc.CurrentTameSkill + trainProfile.GetRequirementIncrease(!trainProfile.HasIncreasedControlSlot);

ガンプに訓練ボタンが出ない原因のスタート地点です。
なんか複雑なことやっていますが、結局上記と似たような間違いをやっているようで、スロットがまだ増えていないペットですら、最初からベースの調教スキルに+22されたスキルが必要になっています。
(せめて、!trainProfile.HasIncreasedControlSlotの「!」がなければまだわからないでもない。)

■[Scripts\Mobiles\Normal\BaseCreature.cs]
746行目
CurrentTameSkill = ((ControlSlots - ControlSlotsMin) * 21) + 1;

→こんなことやちゃったら、スロット1つ増えたペットは、種類を問わず必要な調教スキルが一律22.0になってしまいます。(全部馬以下w)
かと言って、
CurrentTameSkill = MinTameSkill + ((ControlSlots - ControlSlotsMin) * 21) + 1;

の間違いだったとすると、例えば話題のユニコーンなんかだと、ほしさんも指摘してくれているように、いきなりぶっとんで117.1になってしまう。
(108.0超える時点で明らかに変なんですけどね。)

とりあえず、丸投げなPullRequestにして出しておきました。(デクスターさんかケビンさんあたりに怒られるかもw)
ttps://github.com/ServUO/ServUO/pull/4401

77NARU ◆23uN154idM:2019/05/17(金) 08:07:54 ID:cfXdPuZA
本当に今回のペットトレーニングの変更はおかしな状況です。
以前の状態に戻そうかとも思ったのですが、BaseCreatureを弄っている以上、それも得策ではありません。(セーブデータの整合性が損なわれるので・・・)
今回まもちゃんがPullってくれた内容に対してどう反応するかを待つしかなさそうですね〜・・

78まもる:2019/05/17(金) 14:22:47 ID:.Wf8mbjQ
さきほど、前者のガンプ表示条件では最大値(108.0)を超えないように修正されたのですが、それでも最初のトレーニング開始にそんな高いスキルが要るのは変ですね。
予想通りケビンさんに軽く怒られましたが、ケビンさんも妙な思い込みがあるようで、ServUOでも本家でも自分でテストしているとは思えませんね。
よほど自分のコードに自信があるのかなぁ。ちゃんと本家も自分で確かめてきてほしいですね。例のユニコーンの訓練開始は96.0で可能なんですけどねw
後者のBaseCreature.csの方も、最大値のことばかりに囚われて、どんなペットもスロット依存で同じに値になってしまうことをわかっておらず。
うーーんw
とりあえず、前者の修正は反映すると最大値の108.0で済むようになるので、以前のように調教110や115で可能に戻りますね。

79まもる:2019/05/17(金) 15:03:07 ID:.Wf8mbjQ
なお、修正された内容はこれです。
ttps://github.com/ServUO/ServUO/commit/62bdbe2a02a455671f9ddd97e4d39454f4da4579

80NARU ◆23uN154idM:2019/05/17(金) 17:07:48 ID:cfXdPuZA
>>78-79
まもちゃん
ServUOの方々には感謝していますが、なにぶん「マジかこれ」っていう指摘をしてもスルーかテストなしで適当に修正して終わらせるパターンが多いですからね・・
それでもぶっこんでくれた内容はせめて導入しました。
幾分かマシにはなっているようですしね。
今回これだけ突っ込んでもこの感じなので、もしかしたら今後もこれでいくのかもしれません・・
ありがとでした!

81まもる:2019/05/17(金) 18:17:38 ID:.Wf8mbjQ
>>80
なるさん乙です。
テストなしが一番ダメですよね〜。ケビンさんよぉ。(T_T)
で、ちょっと嫌な予感がするのですが、ほしさんも書いてくれているように、ペットの野生化が更に悪化しているような・・・。
大規模なペット粛清テロにならなければいいのですが・・・。私も生産キャラのゴキを再度チェックします。

82まもる:2019/05/31(金) 21:13:25 ID:bc4OOigk
実施するかは別として、いうことをきかない病になったゴキちゃんのワクチンです。
ペットのミニチュア化システムのソースを持っていないので、ミニチュア化されたものまでは治せないかもしれません。
ミニチュア化のシステムが遠隔厩舎を使う方式なら、併せて治ると思います。

[Scripts\Mobiles\Normal\Beetle.cs] Deserialize() の最後

if (this is Beetle && ControlSlots == 1) // スロット1の個体のみ
{
CurrentTameSkill = 29.1;
}

上記を追加してサーバー再起動すると、ワクチンが発動します。
一度発動した後は、上記の追加コードを削除しても問題ありませんし、残っていたとしてもどうということはありません。
ローカルで一時的にCurrentTameSkillを98.7に設定して再起動した後、29.1になっていることを確認しました。
また、訓練してスロット2になっているゴキは、29.1にならないことも確認しました。

なお、this is Beetleの部分は、一見必要ないように思いますが、Beetleを継承するサブクラスがあったときに影響しないようにするために必要です。

83NARU ◆23uN154idM:2019/06/01(土) 22:11:50 ID:e.ZzRBAQ
>>82
まもちゃん
ありがとうございます。
デシリアライズで書き換え導入しました。
ああ、ServUOまともにしてくれ・・・w

84まもる:2019/06/02(日) 19:44:07 ID:RugYCLwg
>>83
サーバーのH/Wメンテお疲れ様でした〜!^^
あれ、ワクチン発動してない・・・。なぜだろ?うちの生産キャラのゴキはまだ要98.7でした。厩舎に入れてるとダメなのかなぁ。

85まもる:2019/06/03(月) 00:32:40 ID:RugYCLwg
これって、version 0 の古いゴキに対して、220行目にもろに
MinTameSkill = 98.7;
があるので、たぶん MinTameSkill の方が悪さしていますね。
CurrentTameSkill を修正してあげても、その後 MinTameSkill から上書きされている可能性が高いのかも。
となると、古いゴキに対してわざわざ MinTameSkill を 98.7 にしている ServUO 側の意図を知る必要が出てきました・・・。

86まもる:2019/06/03(月) 01:39:12 ID:RugYCLwg
連投すみません。いいかげんゴキのいうこときかない病に終止符を打ちたいので、少し長いですがご容赦ください。

さて、古いゴキの MinTameSkill を 98.7 にしている箇所てすが、コードを素直に読むと、
version = 0 の古いゴキで、現在ペット訓練システムが有効で、スロットが3以下で、追加能力がない(自然体から変更していない)個体に対して、
MinTameSkill = 98.7;
ControlSlotsMin = 1;
ControlSlots = 1;
という処理をやっちゃってます。

そこで、幸い私も本家で訓練システム導入前の古いゴキを持っていたので、確認に行ってまいりました。
その結果、古いゴキはスロット3のままで、要テイムスキル値は30.0でした。

このことから推察すると、ServUOでは、
「古いゴキもスロット1にしてやる代わりに、要テイムスキルを98.7にする。」
という処理をなぜかやってしまったようです。

ラピスでは、このままでは生産キャラが不便だと思いますので、先日のワクチンを少しだけ変更してもう一度試して頂けないでしょうか。

if (this is Beetle && ControlSlots == 1) // スロット1の個体のみ
{
CurrentTameSkill = MinTameSkill = 29.1; // ←★MinTameSkillも治療
}

なお、本家では要スキル30.0になっていてもテイム0でコントロールできましたが、ServUOではペットのコントロール可否判定処理に29.1という直接記載があるため、30.0にするのはやめておいた方がいいです。

87NARU ◆23uN154idM:2019/06/03(月) 06:58:17 ID:cfXdPuZA
>>84-86
まもちゃん
上記処理は既に入れてあります。
でも機能していないようです・・であれば、 version = 0 で profile == null の個体に対しては、の記述を素直に

if (version < 1 && profile == null)
{
MinTameSkill = 29.1;
ControlSlotsMin = 3;
ControlSlots = 3;
}
としちゃったらどうかなぁと考えていますが、まだ実験もなにもしていません汗
いかにもServUOらしい記述だなぁ・・
私も同じくテストを行いたいのですが、プレイヤーキャラでも既に古いゴキを持っていないのですよね。

88まもる:2019/06/03(月) 14:19:15 ID:RugYCLwg
なるさん、おつです。暑いですね〜。
既に MinTameSkill の治療も入れてくださっていたんですね。まさかそれでも効かないなんて・・・。

えと、当該箇所の profile == null っていうのは、おそらくその後に続く || !profile.HasCustomized() 用の assert 的な意味合いが強くて(本当はServUOのこのコーディングの仕方も危険※)、profile を持っていてもスロット1で 98.7 になっちゃってるゴキはありそうなんですよ。

あと、スロット1のゴキに対して単純に MinTameSkill = 29.1 が通用しなかったということであれば、たぶん if (version < 1 && profile == null) の条件を付けても、その中で MinTameSkill = 29.1 が効かないのは同じような気もします。

少なくとも、ServUOのソースに MinTameSkill = 98.7; という数値が書かれたコードが存在していて、実際にその要スキル値になってバグっているという点から、やはりもう少し MinTameSkill を中心に調査した方が無難な気がします。
とりあえず、バグっているゴキをテスト用にほしさんが提供してくださるようで良かったです。
うちでは MinTameSkill と CurrentTameSkill を同時に治療したら効果あったんですけどね・・・。うーむ。

※ 以下は、今回の問題とは直接関係なく、プログラミングの余談です。
ご存知と思いますが、if文の条件内で A || B() という表現で関数呼び出しをしていると、コンパイラによっては、A の条件が成立した時点で B を実行しないコンパイラもあれば、A が成立しても、B() もとりあえず実行してくれるコンパイラもあります。
ここで問題なのは、後者のコンパイラの場合、profile == null であっても .HasCustomized() を実行してしまう点です。

89Hosi:2019/06/03(月) 15:33:02 ID:VUVjzJc6
>古いゴキに対してわざわざ MinTameSkill を 98.7 にしている ServUO 側の意図
手掛かりになるかわかりませんが、その部分が追加された時期のゴキに関する過去ログを貼っておきます。
https://www.servuo.com/threads/animal-taming-problems-after-latest-svn-changes.9932/
https://www.servuo.com/threads/fire-beetle-and-number-of-control-slots.9942/

90まもる:2019/06/03(月) 17:45:20 ID:RugYCLwg
おー!さすがほしさん、アンテナでっかいアレシボ級!
これは参考になりますね〜。ありがとうございます。
残念ながら98.7云々については載っていないので、やっぱりServUOの独断で入れてた可能性が高そうですね。

91ほし:2019/06/03(月) 20:41:37 ID:VUVjzJc6
ごめんなさい、よく見たらもうちょっと古い所にありました。
https://www.servuo.com/threads/pet-slots-vs-control-chance-bug-since-last-update.9602/

92まもる:2019/06/03(月) 20:45:33 ID:RugYCLwg
ゴキ治ってるぅぅ〜!なるさん、あめりあさん、ほしさん、ありがとうございます。

93まもる:2019/06/15(土) 18:04:57 ID:TlzyDcEA
>>82
すみません、ServUO には直接関係ないのですが、一部訂正があります。
今更かもしれませんが this is Beetle の箇所は、正しくは this.GetType() == typeof(Beetle) にすべきでした。
is 演算子の場合は、サブクラスのインスタンスであっても true が返ってしまうので不適切でした。
実際は Beetle を継承したサブクラスがいない(FireBeetleもBaseMount継承)ので影響はありませんでしたが、もしC#を学習している方がいらっしゃった場合に誤った使い方を示したことになってしまうので、改めて訂正させて下さい。失礼いたしました。

94出来るだけ代表プレイヤー名を書いてくださいな名無しさん:2023/01/12(木) 14:07:55 ID:sNaixQ46
|   |  ;|イ|  ∨/>'  ||    .|| |`>==ミ 、 !|ハ    |、   ∧
   |   ; ..;|; |,,ィ彡=.ヘ   ||    .|| | ",,ニニミミヽリ ',     | ヽ_ノ  ゝ
   ',   ', .|| .// /::::::::Y.  ;ゝ   リ. ノ /::::::::::::::::Yヾ、 .',   ノ
    ',   ', ||.∥ i::::::::(..}            ;::::::::::::::::(..} Yi! \"   || i! i!
    ハ  ',..|.i.|| |:::::::::::::|         |:::::::::::::::::::::| .|}}  Y.  ||==
   , ヘ   ' .|| |:::::::::::::|         |:::::::::::::::::::::| .||!_ノ.   ||
   /   .  ハ`.. !::::::::::: |         |:::::::::::::::::::::|  \
.  /  /   / | 丶::::::::ノ           ';::::::::::::::::ノ  / Y   ||
 ,  ,{   ;.   | / l` ´           ゝ-- '    /_.ノ.    ||
 ;  ,{   {  {       ____      / | / \
...;   ,'',   ', /ヘ      |::::::::::::::::::::::: ̄::::ヘ     /__.ノ    ミ //
. |  / |    ∨  ヽ.    ;:::::::::::::::::::::::::::::::::::|   / \     ___//
...| { ハ   {  / ヘ    ';:::::::::::::::::::::::::::::::::;   {   .Y     ̄
 | .| |. ',  r‐<   \   ゝ:::::::::::::::::::::::::ノ    ゝ_,ノ   =||==ヾ
 | .', ! ',  ヘ  ``ー─''''''"´ ̄ ̄ ̄ ̄ ̄ ̄`` ヽ `ヽ..    ..|| ==
 ', ', |  ヘ  丶..______  ィ´         \ )     || ==
  ゝ |  | \  ヽ  /   /    /      <   
..   |  | 〔``ー‐'"   /   ,,ィ/    /   / )   \__/
..   ',  ',___ヽ、___,/   / .〈   ,ィ/     /<      || 
    ',  ;      /   /   ` ニ/   /  ヽ   ___
     ',  .',    / ノ , ィ      ./   / __ノ   //ヘヘ
     ヘ ヘ   ゝー'           (__,,/    `ヽ   |.| //
                              ノ    ̄"


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板