ggejs
Version:
A powerful JavaScript library for interacting with the server of Goodgame Empire: Four Kingdoms
63 lines (58 loc) • 2.88 kB
JavaScript
const {execute: mercenaryPackage} = require('../../commands/mercenaryPackage');
module.exports.name = "mpe";
/**
* @param {Socket} socket
* @param {number} errorCode
* @param {{NM:number, M:{D:number, RD:number, P:number, Q:number, S:number, R:[], ID: number}[]}} params
*/
module.exports.execute = function (socket, errorCode, params) {
if (!params?.M) return;
if (params.M.length === 0) return refreshMissions(socket, params.NM);
/** @type {{missionId: number, duration: number, remainingDuration: number, price: number, quality: number, state: number, rewards: [], rewardsChanged: boolean}[]} */
const mercenaryCampMissions = params.M.map(m => {
return /* MercenariesCampMissionItemVO */{
missionId: m.ID,
duration: m.D,
remainingDuration: m.RD,
price: m.P,
quality: m.Q,
state: m.S,
rewards: m.R,
rewardsChanged: true,
}
});
/** @type {{missionId: number, duration: number, remainingDuration: number, price: number, quality: number, state: number, rewards: [], rewardsChanged: boolean}} */
const currentMission = mercenaryCampMissions.find(m => m.state === 1 || m.state === 2);
if (currentMission) {
switch (currentMission.state) {
case 1:
return refreshMissions(socket, currentMission.remainingDuration);
case 2:
return mercenaryPackage(socket, currentMission.missionId)
default:
break;
}
}
/** @type {{missionId: number, duration: number, remainingDuration: number, price: number, quality: number, state: number, rewards: [], rewardsChanged: boolean}[]} */
const sortedMissions = mercenaryCampMissions.filter(m => m.state === 0).sort((a, b) => a.price - b.price);
if (sortedMissions.length === 0) return refreshMissions(socket, params.NM);
/** @type {{missionId: number, duration: number, remainingDuration: number, price: number, quality: number, state: number, rewards: [], rewardsChanged: boolean}} */
const cheapestMission = sortedMissions[0];
const currentCoins = socket.client.clientUserData.globalCurrencies.find(g => g.item === "currency1").count;
if (cheapestMission.price <= currentCoins) {
mercenaryPackage(socket, cheapestMission.missionId);
refreshMissions(socket, cheapestMission.duration);
return
}
// Coin shortage => Retry after a minute
return refreshMissions(socket, 60 - 5);
}
function refreshMissions(socket, seconds) {
if (socket["inMpeTimeout"]) return;
socket["inMpeTimeout"] = true;
setTimeout(() => {
socket["inMpeTimeout"] = false;
if (!socket["__connected"]) return;
mercenaryPackage(socket, -1);
}, (seconds + 5) * 1000);
}