-
Notifications
You must be signed in to change notification settings - Fork 1
Offline_Exp_Get_Patch
ここでは技術的な情報を書き記していきます。
主に、スコアボード・タグの情報。各コマンド列での大まかな処理の内容について記述していきます。
このパッチの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 | プレイヤーが職に就いたら付与 |
以下の列に変更が入っています。
- ログイン時処理
- 経験値取得処理
- ジョブロード
-
ExpEntityタグを持っていない(=IDを持っていない)プレイヤーのExpSystemFlagを5に設定
ID登録処理を実行(条件付き) -
ExpEntityタグを持っているプレイヤーのExpSystemFlagを4に設定
ログイン時取得チェック処理を実行(条件付き)
-
clearとstatsで取得したネザースターの数をGotExpFlagに記録
GotExpFlagの値をアマスタストレージのGotExpに加算 -
職業に就いているプレイヤーのExpSystemFlagを1に設定
プレイヤーに経験値を付与する処理を実行 -
haveJobタグを持つアマスタストレージのArmorExpToLevelをGotExpFlagで減算
nothaveJobタグ持つアマスタストレージのArmorExpToLevelをGotExpで減算
haveJobタグを持ち、ArmorLevelが50未満で、ArmorExpToLevelが0以下のアマスタストレージのExpSystemFlagを3に設定する
アマスタのLvUP処理を実行する(条件付き)
- 転職した人のExpSystemFlagを2に設定
転職時にアマスタへ色々コピーする処理を実行
以下の列を追加します。
- ID登録処理 (-1920 8 -128)
- 転職時にアマスタへ色々コピーする処理 (-1920 9 -128)
- アマスタのLvUP処理 (-1920 10 -128)
- プレイヤーに経験値を付与する処理 (-1920 11 -128)
- ログイン時取得チェック処理 (-1920 12 -128)
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をリセット
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のプレイヤーがいたら、プレイヤーに経験値を付与する処理を実行
プレイヤーとアマスタストレージを同期させるための判別システム
それぞれのコマンド列に合わせて組み込まれている
- それぞれのアマスタストレージのExpIDを、アマスタストレージ自身のExpMessageFlagにコピー
- 同期対象のプレイヤーのExpIDで全てのアマスタストレージのExpMessageFlagを減算
- ExpMessageFlagが0になっているアマスタストレージがあるので、それとプレイヤーが同期していると確定する
処理が終わり次第、ExpMessageFlagをリセットする
{
Tags:[
"ExpEntity",
"WillGetID",
"nothaveJob"
],
Small:true,
Marker:true,
NoGravity:true
}