はじめに
BF6のPortalを触っていて気づいたことやメモを書いていきます。
この記事を見た人にあらかじめ書いておきますがVer.1.1.3時点でPortalを真面目に触ることはおすすめしません。動作しない関数やバグっている関数が多々あり気づきづらいです。また情報が乏しく仕様なのかバグなのかも判明しない点も多いので注意です。
Memo
SetCapturePointCapturingTime()
SetCapturePointNeutralizationTime()
はうまく動作していません。OnGameModeStarted()内で同時に呼んでもうまく設定されず、デフォルトに戻ることもあります。どちらか片方のみを利用する事が可能のようですがそのような設定状態にすることはかなり少ないケースだと思います。下記のようなコードが一番うまく動作しますが結局デフォルトに戻ってしまったり、設定されない事が多いです。
// 前回progress
const gPrevProg = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
// 前回がCapturing方向だったか(1=Capturing / 0=Neutralizing)
const gWasCapturing = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
// 初回かどうか(初回は切替判定しない)
const gHasPrev = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
// おそらくこれでも設定できていないバグが存在する?未検証
export function TickCapturePoint(cp: mod.CapturePoint): void {
const prog = mod.GetCaptureProgress(cp);
// 0 or 1 は監視しない(海外コード踏襲)
// if (prog === 0 || prog === 1) return;
const cpId = mod.GetObjId(cp);
const idx = GetCpIndexById(cpId);
if (idx < 0) return; // 管理対象外CP
// 初回だけは比較せず記録だけ(誤爆防止)
if (gHasPrev[idx] === 0) {
gHasPrev[idx] = 1;
gPrevProg[idx] = prog;
gWasCapturing[idx] = 1; // 初期はCapturing扱いでOK(好みで0でも)
return;
}
const prevProg = gPrevProg[idx];
const wasCapturing = gWasCapturing[idx];
console.log(":" + cpId);
if (prog < prevProg) {
// Neutralizing方向(減ってる)
if (wasCapturing === 1) {
mod.SetCapturePointNeutralizationTime(cp, CP_CAPTURINGTIME);
}
gWasCapturing[idx] = 0;
} else if (prog > prevProg) {
// Capturing方向(増えてる)
if (wasCapturing === 0) {
mod.SetCapturePointCapturingTime(cp, CP_CAPTURINGTIME);
}
gWasCapturing[idx] = 1;
} else {
// progが変化してない(停止/拮抗など)
// ここは「何もしない」が一番安全
}
gPrevProg[idx] = prog;
}


コメント