Skip to content

Offline_Exp_Get_Patch

Ponpon edited this page Dec 20, 2021 · 3 revisions

オフライン経験値取得パッチ

ここでは技術的な情報を書き記していきます。
主に、スコアボード・タグの情報。各コマンド列での大まかな処理の内容について記述していきます。
このパッチのIDは "minecraft:quartz_block" です。

目次


スコアボード

使用するスコアボードの情報です。
ワールドにすでに用意されているものと新規に作成するものがあります。また、ダミーエンティティも追加します。

既存のスコアボード

以下の2つのスコアボードを使用します。

スコアボード名 表示名 使用用途
GotExpFlag - ネザースターの数を記録する
ExpMessageFlag - このパッチではアマスタとプレイヤーを同期するためのスコア置き場にする

新規のスコアボード

以下の6つのスコアボードを追加します。

スコアボード名 表示名 使用用途
ExpID 経験値保持同期用ID プレイヤーとアマスタを同期させるためのID
GotExp 保存経験値量 オフラインプレイヤーの取得経験値
ArmorExpToLevel アマスタの残り経験値 アマスタの必要経験値量を保存
ArmorLevel アマスタのレベル アマスタのレベルを保存
ArmorNextExp アマスタの次の経験値 次のレベルの必要経験値量を保存。7ずつプラスする
ExpSystemFlag 経験値システム処理フラグ システムを処理するためのフラグ保存用

ExpSystemFlag : フラグの説明

フラグ番号 フラグ内容
1 経験値未取得フラグ(プレイヤーのみ)
2 プレイヤー転職時にデータをアマスタにコピペするフラグ
3 アマスタのレベルが上がった時の処理フラグ
4 ログインフラグ
5 ExpID登録フラグ

ダミーエンティティ

以下のダミーエンティティを1体追加します。

ダミーエンティティ名 依存スコアボード 使用用途
#NextExpID ExpID 次に取得することになるIDの記録

使用タグ

タグ名 使用用途
GetExpID IDを取得するプレイヤー1人に付与
ExpEntity ID取得済みのプレイヤーと保存用アマスタに付与
WillGetID ID未取得のアマスタに付与。取得後削除
WillGetExp 経験値取得者に付与
nothaveJob プレイヤーが職に就いたら削除
haveJob プレイヤーが職に就いたら付与

コマンド列

変更するコマンド列

以下の列に変更が入っています。

  • ログイン時処理
  • 経験値取得処理
  • ジョブロード
ログイン時処理
  1. ExpEntityタグを持っていない(=IDを持っていない)プレイヤーのExpSystemFlagを5に設定
    ID登録処理を実行(条件付き)

  2. ExpEntityタグを持っているプレイヤーのExpSystemFlagを4に設定
    ログイン時取得チェック処理を実行(条件付き)

経験値取得処理
  1. clearとstatsで取得したネザースターの数をGotExpFlagに記録
    GotExpFlagの値をアマスタストレージのGotExpに加算

  2. 職業に就いているプレイヤーのExpSystemFlagを1に設定
    プレイヤーに経験値を付与する処理を実行

  3. haveJobタグを持つアマスタストレージのArmorExpToLevelをGotExpFlagで減算
    nothaveJobタグ持つアマスタストレージのArmorExpToLevelをGotExpで減算
    haveJobタグを持ち、ArmorLevelが50未満で、ArmorExpToLevelが0以下のアマスタストレージのExpSystemFlagを3に設定する
    アマスタのLvUP処理を実行する(条件付き)

ジョブロード
  1. 転職した人のExpSystemFlagを2に設定
    転職時にアマスタへ色々コピーする処理を実行

追加するコマンド列

以下の列を追加します。

  • ID登録処理 (-1920 8 -128)
  • 転職時にアマスタへ色々コピーする処理 (-1920 9 -128)
  • アマスタのLvUP処理 (-1920 10 -128)
  • プレイヤーに経験値を付与する処理 (-1920 11 -128)
  • ログイン時取得チェック処理 (-1920 12 -128)
ID登録処理

ExpSystemFlagが5のプレイヤー1人にGetExpIDタグを付与
tag=GetExpIDのプレイヤーのExpIDに#NextExpIDをコピー
アマスタストレージを召喚 NBTデータなどはこちら
WillGetIDタグを持っているアマスタストレージのExpIDに#NextExpID
WillGetIDタグを削除
#NextExpIDに1加算
ID登録通知を表示
tag=GetExpIDのプレイヤーにExpEntityタグを付与
tag=GetExpIDのプレイヤーのExpSystemFlagを2に設定
転職時にアマスタストレージへ色々コピーする処理を実行
GetExpIDタグを削除
ExpSystemFlagが5のプレイヤーがいれば、もう一度[同じ処理](# ID登録処理)を実行

転職時にアマスタストレージへ色々コピーする処理

<ID同期処理システム>を実行

これ以降のアマスタストレージはExpMessageFlagが0であり、プレイヤーと同期している状態とする。

アマスタストレージのArmorLevelにExpSystemFlagが2のプレイヤーのLevelをコピー
同様に、ArmorExpToLevelにExpToLevelをコピー
アマスタストレージのArmorNextExpに自身のArmorLevelをコピー
〃のArmorNextExpに1加算
〃のArmorNextExpにオブジェクトConstの#ExpMul(値:7)を乗算
〃のArmorExpToLevelが0以下なら自身のExpSystemFlagを3に設定
〃のLvUP処理を実行(条件付き)
〃のArmorLevelが1以上でnothaveJobタグが付いていたらhaveJobタグを付与
〃のArmorLevelが1以上でhaveJobタグが付いていたらnothaveJobタグを削除(条件付き)
全てのアマスタストレージのExpMessageFlagをリセット
プレイヤーのExpSystemFlagをリセット

アマスタストレージのLvUP処理

ExpSystemFlagが3のアマスタストレージのArmorExpToLevelにArmorNextExpを加算
〃のArmorNextExpに7を加算
〃のArmorLevelが50以上なら50Lv通知を表示
#〃のArmorLevelが1以上でnothaveJobタグが付いていたらhaveJobタグを付与
#〃のArmorLevelが1以上でhaveJobタグが付いていたらnothaveJobタグを削除(条件付き)
#〃のArmorExpToLevelを自身のGotExpで減算(条件付き)(先頭が#で始まっているこの3行はコマンドこそ実装されているが実際は必要のない部分🤔)
〃のArmorExpToLevelが1以上なら自身のExpSystemFlagを削除
もしExpSystemFlagが3のアマスタストレージが存在したら、もう一度同じ処理を実行

プレイヤーに経験値を付与する処理

ランダムにExpSystemFlagが1のプレイヤー1人にWillGetExpタグを付与
<ID同期処理システム>を実行

これ以降のアマスタストレージはExpMessageFlagが0であり、プレイヤーと同期している状態とする。

WillGetExpタグを持っているプレイヤーのExpToLevelをアマスタストレージのGotExpで減算
経験値取得メッセージを表示
経験値取得サウンドを再生
WillGetExpタグを持っているプレイヤーのExpSystemFlagを削除する
WillGetExpタグを削除する
ExpMessageFlagを削除する
もしExpSystemFlagが1のプレイヤーがいたら、もう一度同じ処理を実行

ログイン時取得チェック処理

<ID同期処理システム>を実行

これ以降のアマスタストレージはExpMessageFlagが0であり、プレイヤーと同期している状態とする。

アマスタストレージのGotExpが1以上ならExpSystemFlagが4のプレイヤーのExpSystemFlagを1に設定する
ExpSystemFlagが4のプレイヤーのExpSystemFlagを削除する
もしExpSystemFlagが1のプレイヤーがいたら、プレイヤーに経験値を付与する処理を実行

コマンド補足

ID同期処理システム

プレイヤーとアマスタストレージを同期させるための判別システム
それぞれのコマンド列に合わせて組み込まれている

  1. それぞれのアマスタストレージのExpIDを、アマスタストレージ自身のExpMessageFlagにコピー
  2. 同期対象のプレイヤーのExpIDで全てのアマスタストレージのExpMessageFlagを減算
  3. ExpMessageFlagが0になっているアマスタストレージがあるので、それとプレイヤーが同期していると確定する

処理が終わり次第、ExpMessageFlagをリセットする

アマスタストレージのNBTデータ
{
    Tags:[  
        "ExpEntity",  
        "WillGetID",  
        "nothaveJob"  
    ],  
    Small:true,  
    Marker:true,  
    NoGravity:true  
}