ggejs
Version:
A powerful JavaScript library for interacting with the server of Goodgame Empire: Four Kingdoms
599 lines (508 loc) • 16.2 kB
JavaScript
const Crest = require("./Crest");
const Coordinate = require("./Coordinate");
const CastlePosition = require("./CastlePosition");
class WorldMapOwnerInfo {
/** @type {Client} */
#client;
/** @type {number} */
playerId = -1;
/**
* @type {string}
* @private
*/
_playerName = "";
/** @type {number} */
playerLevel = -1;
/** @type {number} */
paragonLevel = -1;
/** @type {Crest} */
crest;
/** @type {Date} */
noobEndTime = new Date(0);
/** @type {Date} */
peaceEndTime = new Date(0);
/**
* @type {number}
* @private
*/
_honor = -1;
/**
* @type {number}
* @private
*/
_famePoints = -1;
/** @type {number} */
highestFamePoints = -1;
/** @type {number} */
fameTopX = -1
/**
* @type {boolean}
* @private
*/
_isRuin = false;
/**
* @type {number}
* @private
*/
_allianceId = -1;
/**
* @type {number}
* @private
*/
_allianceRank = -1;
/**
* @type {string}
* @private
*/
_allianceName = "";
/**
* @type {number}
* @private
*/
_allianceFame = -1;
/**
* @type {boolean}
* @private
*/
_isSearchingAlliance;
/** @type {boolean} */
isOutpostOwner = false;
/** @type {boolean} */
isNPC = false;
/**
* @type {CastlePosition[]}
* @private
*/
_castlePosList = [];
/**
* @type {CastlePosition[]}
* @private
*/
_villagePosList = [];
/**
* @type {boolean}
* @private
*/
_hasPremiumFlag = false;
/**
* @type {boolean}
* @private
*/
_hasVIPFlag = false;
/**
* @type {boolean}
* @private
*/
_isDummy = false;
/**
* @type {number}
* @private
*/
_achievementPoints = -1;
/** @type {Date} */
relocateDurationEndTime = new Date(0);
/**
* @type {number}
* @private
*/
_might = -1;
/** @type {number} */
factionId = 0;
/**
* @type {number}
* @private
*/
_factionMainCampId = -1;
/** @type {number} */
factionProtectionStatus = -1;
/** @type {Date} */
factionProtectionEndTime = new Date(0);
/** @type {Date} */
factionNoobProtectionEndTime = new Date(0);
/** @type {boolean} */
factionIsSpectator = false;
/**
* @type {IsleTitleViewVO}
* @private
*/
_titleVO;
/**
* @type {GameTickOnlySecondsSignal}
* @private
*/
gameTickSignal;
/**
* @type {KingdomSkinNamesFactory}
* @private
*/
_namesFactory;
/**
* @type {string}
* @private
*/
_nameTextId;
/**
* @type {number}
* @private
*/
_prefixTitleId = -1;
/**
* @type {number}
* @private
*/
_suffixTitleId = -1;
/**
* @type {string}
* @private
*/
_staticAreaName;
/** @param {Client} client */
constructor(client) {
this.#client = client
}
/** @param {{OID: number,DUM: boolean,N: string,E: number[],L: number,LL: number, RNP:number,H: number,AVP: number,CF: number,HF: number,PRE: number,SUF: number,TOPX: number,MP: number,R: number,AID: number,AR:number,AN:string,ACF:number,RPT: number,AP: number[][],VP: number[][],SA: number,VF: number,PF: number,RRD: number,TI: number,FN: {FID: number, MC: number, SPC:number, PMS:number, PMT:number, NS:number}}} params */
fillFromParamObject(params) {
this.playerId = params.OID;
this._isDummy = params.DUM;
if (this._isDummy) {
this.dummyFill();
} else {
this.playerName = params.N;
this.crest = new Crest(this.#client, params.E);
this.playerLevel = params.L;
this.paragonLevel = params.LL;
if (params.RNP > 0) this.noobEndTime = new Date(Date.now() + params.RNP * 1000);
this._honor = params.H;
this._famePoints = params.CF;
this.highestFamePoints = params.HF;
this.fameTopX = params.TOPX;
this._isRuin = params.R === 1;
this._allianceId = params.AID;
this._allianceRank = params.AID === -1 ? -1 : params.AR;
this._allianceName = params.AID === -1 ? "" : params.AN;
this._allianceFame = params.AID === -1 ? -1 : params.ACF;
this._isSearchingAlliance = params.SA === 1;
if (params.RPT > 0) this.peaceEndTime = new Date(Date.now() + params.RPT * 1000);
const castlePosItems = [];
if (params.AP) this.ungroupArrayFromServer(params.AP, castlePosItems);
this._castlePosList = this.parsePosList(castlePosItems);
if (params.VP) {
this._villagePosList = this.parsePosList(params.VP);
}
this._hasPremiumFlag = params.PF === 1;
this._hasVIPFlag = params.VF === 1;
this._might = !isNaN(params.MP) ? params.MP : -1;
this._achievementPoints = params.AVP;
this._prefixTitleId = params.PRE;
this._suffixTitleId = params.SUF;
if (params.RRD > 0) this.relocateDurationEndTime = new Date(Date.now() + params.RRD * 1000);
if (params.FN && params.FN.FID !== -1) {
this.fillFromFactionParamObject(params.FN);
}
}
return this;
}
/**
* @param {Array<Array>} sourceArray
* @param {Array} returnArray
* @private
*/
ungroupArrayFromServer(sourceArray, returnArray) {
for (const subArray of sourceArray) {
if (subArray.length > 0 && Array.isArray(subArray[0])) {
this.ungroupArrayFromServer(subArray, returnArray);
} else {
returnArray.push(subArray);
}
}
}
/**
* @param {Array} posItems
* @returns {CastlePosition[]}
* @private
*/
parsePosList(posItems) {
/**@type {CastlePosition[]} */
const castlePositions = [];
for (const item of posItems) {
const castlePosition = new CastlePosition();
castlePosition.kingdomId = item[0];
castlePosition.objectId = item[1];
castlePosition.xPos = item[2];
castlePosition.yPos = item[3];
castlePosition.areaType = item[4];
castlePositions.push(castlePosition);
}
return castlePositions;
}
/** @param {{FID: number, MC: number, SPC:number, PMS:number, PMT:number, NS:number}} paramObj */
fillFromFactionParamObject(paramObj) {
if (paramObj) {
this.factionId = paramObj.FID;
this._factionMainCampId = paramObj.MC;
this.updateFactionProtectionFromParamObject(paramObj);
this.factionIsSpectator = paramObj.SPC === 1;
}
}
/** @param {{FID: number, MC: number, SPC:number, PMS:number, PMT:number, NS:number}} paramObj */
updateFactionProtectionFromParamObject(paramObj) {
this.factionProtectionStatus = paramObj.PMS;
if (paramObj.PMT) this.factionProtectionEndTime = new Date(Date.now() + paramObj.PMT * 1000);
if (paramObj.NS > 0) this.factionNoobProtectionEndTime = new Date(Date.now() + paramObj.NS * 1000);
if (this.factionProtectionEndTime.getTime() > Date.now() && this.factionProtectionStatus !== -1) {
if (!this.gameTickSignal) {
//this.gameTickSignal = AppCore.getInstance().getSignal(GameTickOnlySecondsSignal)/* as GameTickOnlySecondsSignal*/;
//this.gameTickSignal.add(this.onGameTick);
}
} else {
this.removeTimerListener();
}
}
/** @private */
removeTimerListener() {
if (this.gameTickSignal) {
//this.gameTickSignal.remove(this.onGameTick);
this.gameTickSignal = null;
}
}
/**
* @param {GameTickVO} gameTickVO
* @private
*/
onGameTick(gameTickVO) {
if (this.factionProtectionEndTime.getTime() <= Date.now()) {
this.removeTimerListener();
//AppCore.getInstance().sendNotification(UpdateFactionProtectionSignal);
}
}
dummyFill() {
this._isDummy = true;
}
get isFactionNoobProtected() {
return this.factionNoobProtectionEndTime.getTime() > Date.now();
}
/** @returns {boolean} */
isFactionProtected() {
return this.factionProtectionEndTime.getTime() > Date.now() && this.factionProtectionStatus === 1;
}
getFactionMainCampPosition() {
if (this.factionMainCampId < 0) return null;
let i = 0;
while (i < this.castlePosList.length) {
const castlePosition = this.castlePosList[i];
if (castlePosition.kingdomId === 10 && castlePosition.objectId === this.factionMainCampId) {
return castlePosition.position;
}
i++;
}
return null;
}
get might() {
return this._might;
}
/** @returns {boolean} */
isNoobProtected() {
return this.noobEndTime.getTime() > Date.now() || this.#client.clientUserData.noobProtected && this.isOwnOwnerInfo;
}
/** @returns {boolean} */
isPeaceProtected() {
return this.peaceEndTime.getTime() > Date.now() || this.#client.clientUserData.peaceModeStatus === 1 && this.isOwnOwnerInfo;
}
get allianceId() {
return this._allianceId;
}
get allianceRank() {
return this._allianceRank;
}
get isRuin() {
return this._isRuin;
}
get honor() {
return this._honor;
}
/** @returns {number} */
get playerTotalLevel() {
return this.playerLevel + this.paragonLevel;
}
get isParagon() {
return this.paragonLevel > 0;
}
/**
* @param {number} kingdomId
* @param {boolean} isShadowMovement
*/
getCrestByKingdomId(kingdomId, isShadowMovement = false) {
if (kingdomId === 10 && this.factionId !== -1 && !isShadowMovement) {
// TODO: FactionConstClient
return FactionConstClient.getCrestByFactionId(this.factionId);
}
return this.crest;
}
get playerName() {
let playerName = this._playerName;
if ((!playerName || playerName === "") && this._namesFactory) {
playerName = this._namesFactory.getNameByTextId(this._nameTextId);
}
return playerName;
}
set playerName(value) {
this._playerName = value;
}
get isInAlliance() {
return this._allianceId >= 0;
}
get allianceName() {
return !this._allianceName ? "" : this._allianceName
}
get castlePosList() {
return this._castlePosList;
}
/** @param {number} kingdomId */
getMainCastlePositionFromPosListByKingdomId(kingdomId) {
let i = 0;
while (i < this.castlePosList.length) {
const castlePosition = this.castlePosList[i];
if (this.isMainCastlePosInKingdom(castlePosition, kingdomId)) {
return new Coordinate(this.#client, [castlePosition.xPos, castlePosition.yPos]);
}
i++;
}
return null;
}
/** @param {Coordinate} pos */
getCastlePosListItemByPos(pos) {
let castlePosListItem
let i = 0;
while (i < this.castlePosList.length) {
castlePosListItem = this.castlePosList[i];
if (castlePosListItem.xPos === pos.X && castlePosListItem.yPos === pos.Y) {
return castlePosListItem;
}
i++;
}
return castlePosListItem;
}
/** @returns {Coordinate} */
getMainCastlePositionFromPosListForCurrentKingdom() {
return this.getMainCastlePositionFromPosListByKingdomId(this.kingdomData.activeKingdomId);
}
/**
* @param {number} kID
* @returns {CastlePosition[]}
*/
getCastlePosListByKingdomId(kID) {
/** @type {CastlePosition[]} */
const castlePositions = [];
let i = 0;
while (i < this._castlePosList.length) {
const castlePosition = this._castlePosList[i];
const kingdomId = castlePosition.kingdomId;
const areaType = castlePosition.areaType;
if (kingdomId === kID) {
if (areaType === 1) {
castlePositions.unshift(castlePosition);
} else {
castlePositions.push(castlePosition);
}
}
i++;
}
if (this._villagePosList) {
let i = 0;
while (i < this._villagePosList.length) {
const villagePosition = this._villagePosList[i];
if (villagePosition.kingdomId === kID) {
castlePositions.push(villagePosition);
}
i++;
}
}
return castlePositions;
}
/** @returns {boolean} */
get isOwnOwnerInfo() {
return this.#client.clientUserData.playerId === this.playerId;
}
/** @returns {number} */
get famePoints() {
return this._famePoints;
}
/** @returns {boolean} */
get isSearchingAlliance() {
return this._isSearchingAlliance;
}
/** @returns {boolean} */
get hasPremiumFlag() {
return this._hasPremiumFlag;
}
/** @returns {boolean} */
get hasVIPFlag() {
return this._hasVIPFlag;
}
/** @returns {boolean} */
isRankInfoVisible() {
if (this.#client.clientUserData.isInAlliance && !this.isOwnOwnerInfo && this.allianceId === this.#client.clientUserData.allianceId) {
return /*(*/AppCore.getInstance().getModel(AllianceRankService)/* as AllianceRankService)*/.mayRerank(this.allianceRank);
}
return false;
}
/** @returns {number} */
get achievementPoints() {
return this._achievementPoints;
}
/** @returns {number} */
get factionMainCampId() {
return this._factionMainCampId;
}
/**
* @param {CastlePosition} castlePos
* @param {number} kingdomId
* @returns {boolean}
*/
isMainCastlePosInKingdom(castlePos, kingdomId) {
if (castlePos.kingdomId !== kingdomId) {
return false;
}
if (kingdomId === 10) {
return castlePos.objectId === this.factionMainCampId;
}
return castlePos.areaType === 1 || castlePos.areaType === 12;
}
/** @returns {IsleTitleViewVO} */
get titleVO() {
return this._titleVO;
}
/** @param {IsleTitleViewVO} value */
set titleVO(value) {
this._titleVO = value;
}
/** @returns {number} */
get prefixTitleId() {
return this._prefixTitleId;
}
/** @returns {number} */
get suffixTitleId() {
return this._suffixTitleId;
}
/** @returns {string} */
get staticAreaName() {
return this._staticAreaName;
}
/** @param {string} value */
set staticAreaName(value) {
this._staticAreaName = value;
}
/**
* @param {KingdomSkinNamesFactory} value
* @param {string} nameTextId
*/
setNamesFactory(value, nameTextId) {
this._namesFactory = value;
this._nameTextId = nameTextId;
}
/** @param {CastlePosition[]} value */
set castlePosList(value) {
this._castlePosList = value;
}
}
module.exports = WorldMapOwnerInfo