fix: fixed saving issues

This commit is contained in:
2026-09-19 11:30:49 +02:00
parent 177a96e733
commit dc4ce9c7d3
2 changed files with 1432 additions and 1394 deletions
+118 -93
View File
@@ -12,21 +12,21 @@
*/
// Dependencies: LuckPerms
(function () {
var DAILY_QUESTS_FILE = "kubejs/data/dailyquests/players.json";
var DAILY_QUESTS_CONFIG = "config/dailyquests.json";
var DAILY_QUESTS_FILE = "kubejs/data/dailyquests/players.json";
var DAILY_QUESTS_CONFIG = "config/dailyquests.json";
var data = null;
var config = null;
var lastResetCheckTick = 0;
var data = null;
var config = null;
var lastResetCheckTick = 0;
var LuckPermsApiProvider = Java.loadClass(
var LuckPermsApiProvider = Java.loadClass(
"net.luckperms.api.LuckPermsProvider",
);
);
var luckPermsApi = null;
var luckPermsApi = null;
function getDefaultConfig() {
function getDefaultConfig() {
return {
resetCheckInterval: 20,
questPermissionReroll: "dailyquests.command.reroll",
@@ -218,9 +218,9 @@ function getDefaultConfig() {
],
},
};
}
}
function loadConfig() {
function loadConfig() {
var defaults = getDefaultConfig();
try {
@@ -307,9 +307,9 @@ function loadConfig() {
);
}
}
}
}
function getLuckPerms() {
function getLuckPerms() {
if (luckPermsApi) {
return luckPermsApi;
}
@@ -325,9 +325,9 @@ function getLuckPerms() {
return null;
}
}
}
function hasPermission(player, permission) {
function hasPermission(player, permission) {
var api = getLuckPerms();
if (!api || !player) {
@@ -349,13 +349,13 @@ function hasPermission(player, permission) {
return false;
}
}
}
function pad2(value) {
function pad2(value) {
return String(value).padStart(2, "0");
}
}
function getToday() {
function getToday() {
var now = new Date();
return (
@@ -365,9 +365,9 @@ function getToday() {
"-" +
pad2(now.getDate())
);
}
}
function getResetCountdown() {
function getResetCountdown() {
var now = new Date();
var nextMidnight = new Date(now);
@@ -394,16 +394,16 @@ function getResetCountdown() {
}
return seconds + "s";
}
}
function createEmptyData() {
function createEmptyData() {
return {
lastReset: getToday(),
players: {},
};
}
}
function loadData() {
function loadData() {
try {
var loaded = JsonIO.read(DAILY_QUESTS_FILE);
@@ -426,9 +426,9 @@ function loadData() {
data = createEmptyData();
saveData();
}
}
}
function saveData() {
function saveData() {
if (!data) {
return;
}
@@ -436,11 +436,13 @@ function saveData() {
try {
JsonIO.write(DAILY_QUESTS_FILE, data);
} catch (error) {
console.error("[DailyQuests] Failed to save data: " + String(error));
console.error(
"[DailyQuests] Failed to save data: " + String(error),
);
}
}
}
function randomQuest(category) {
function randomQuest(category) {
var pool = config.quests[category];
if (!Array.isArray(pool) || pool.length === 0) {
@@ -448,9 +450,9 @@ function randomQuest(category) {
}
return pool[Math.floor(Math.random() * pool.length)];
}
}
function getQuestById(id) {
function getQuestById(id) {
if (!id) {
return null;
}
@@ -468,9 +470,9 @@ function getQuestById(id) {
}
return null;
}
}
function getQuestReward(quest) {
function getQuestReward(quest) {
if (!quest) {
return null;
}
@@ -484,13 +486,13 @@ function getQuestReward(quest) {
}
return null;
}
}
function getPlayerUuid(player) {
function getPlayerUuid(player) {
return String(player.uuid);
}
}
function createPlayerData(player) {
function createPlayerData(player) {
var easy = randomQuest("easy");
var medium = randomQuest("medium");
var hard = randomQuest("hard");
@@ -504,9 +506,9 @@ function createPlayerData(player) {
mediumClaimed: false,
hardClaimed: false,
};
}
}
function createOfflinePlayerData(name) {
function createOfflinePlayerData(name) {
var easy = randomQuest("easy");
var medium = randomQuest("medium");
var hard = randomQuest("hard");
@@ -520,9 +522,9 @@ function createOfflinePlayerData(name) {
mediumClaimed: false,
hardClaimed: false,
};
}
}
function repairPlayerData(player, playerData) {
function repairPlayerData(player, playerData) {
var changed = false;
if (!playerData.name) {
@@ -565,9 +567,9 @@ function repairPlayerData(player, playerData) {
}
return changed;
}
}
function getPlayerData(player) {
function getPlayerData(player) {
var uuid = getPlayerUuid(player);
if (!data.players[uuid]) {
@@ -589,9 +591,9 @@ function getPlayerData(player) {
}
return playerData;
}
}
function countItem(player, itemId) {
function countItem(player, itemId) {
var total = 0;
try {
@@ -617,15 +619,17 @@ function countItem(player, itemId) {
total += stack.count;
}
} catch (error) {
console.error("[DailyQuests] Inventory count error: " + String(error));
console.error(
"[DailyQuests] Inventory count error: " + String(error),
);
return 0;
}
return total;
}
}
function removeItems(player, itemId, amount) {
function removeItems(player, itemId, amount) {
var remaining = amount;
try {
@@ -667,9 +671,9 @@ function removeItems(player, itemId, amount) {
}
return remaining <= 0;
}
}
function giveReward(player, reward) {
function giveReward(player, reward) {
if (
!reward ||
!reward.item ||
@@ -688,21 +692,21 @@ function giveReward(player, reward) {
return false;
}
}
}
function getProgress(player, quest) {
function getProgress(player, quest) {
if (!quest) {
return 0;
}
return Math.min(countItem(player, quest.item), quest.amount);
}
}
function separator(player) {
function separator(player) {
player.tell(Text.of("───────────────────────────────────").gray());
}
}
function getCategoryColor(category) {
function getCategoryColor(category) {
if (category === "medium") {
return "yellow";
}
@@ -712,9 +716,9 @@ function getCategoryColor(category) {
}
return "green";
}
}
function tellQuest(player, category, quest, claimed) {
function tellQuest(player, category, quest, claimed) {
if (!quest) {
player.tell(Text.of("Quest data is unavailable.").red());
@@ -726,7 +730,8 @@ function tellQuest(player, category, quest, claimed) {
var progress = getProgress(player, quest);
var itemName =
quest.itemName || quest.description.replace(/^Collect\s+\d+\s+/i, "");
quest.itemName ||
quest.description.replace(/^Collect\s+\d+\s+/i, "");
var rewardName = reward && reward.name ? reward.name : reward.item;
@@ -765,9 +770,9 @@ function tellQuest(player, category, quest, claimed) {
}
player.tell("");
}
}
function openDailyQuests(player) {
function openDailyQuests(player) {
if (!player) {
return;
}
@@ -800,17 +805,23 @@ function openDailyQuests(player) {
tellQuest(player, "hard", hardQuest, playerData.hardClaimed);
player.tell(Text.of("[ REFRESH ]").aqua().clickRunCommand("/dailyquests"));
player.tell(
Text.of("[ REFRESH ]").aqua().clickRunCommand("/dailyquests"),
);
separator(player);
}
}
function claimQuest(player, category) {
function claimQuest(player, category) {
if (!player) {
return 0;
}
if (category !== "easy" && category !== "medium" && category !== "hard") {
if (
category !== "easy" &&
category !== "medium" &&
category !== "hard"
) {
return 0;
}
@@ -848,7 +859,9 @@ function claimQuest(player, category) {
if (!reward) {
player.tell(
Text.of("This quest has an invalid reward configuration.").red(),
Text.of(
"This quest has an invalid reward configuration.",
).red(),
);
return 0;
@@ -861,7 +874,10 @@ function claimQuest(player, category) {
player.tell(
Text.of(
"Required: " + quest.amount + " | You have: " + currentAmount,
"Required: " +
quest.amount +
" | You have: " +
currentAmount,
).gray(),
);
@@ -870,7 +886,9 @@ function claimQuest(player, category) {
if (countItem(player, quest.item) < quest.amount) {
player.tell(
Text.of("Your inventory changed. The claim was cancelled.").red(),
Text.of(
"Your inventory changed. The claim was cancelled.",
).red(),
);
return 0;
@@ -913,9 +931,9 @@ function claimQuest(player, category) {
openDailyQuests(player);
return 1;
}
}
function findOnlinePlayer(server, name) {
function findOnlinePlayer(server, name) {
var target = String(name).toLowerCase();
var players = server.players;
@@ -929,9 +947,9 @@ function findOnlinePlayer(server, name) {
}
return null;
}
}
function findSavedPlayer(name) {
function findSavedPlayer(name) {
var target = String(name).toLowerCase();
for (var uuid in data.players) {
@@ -950,9 +968,9 @@ function findSavedPlayer(name) {
}
return null;
}
}
function rerollPlayer(server, name) {
function rerollPlayer(server, name) {
checkDailyReset(server);
var onlinePlayer = findOnlinePlayer(server, name);
@@ -981,14 +999,16 @@ function rerollPlayer(server, name) {
return false;
}
data.players[savedPlayer.uuid] = createOfflinePlayerData(savedPlayer.name);
data.players[savedPlayer.uuid] = createOfflinePlayerData(
savedPlayer.name,
);
saveData();
return true;
}
}
function resetDailyQuests(server) {
function resetDailyQuests(server) {
var today = getToday();
console.log("[DailyQuests] Resetting daily quests for " + today);
@@ -1015,9 +1035,9 @@ function resetDailyQuests(server) {
}
console.log("[DailyQuests] Daily reset complete.");
}
}
function checkDailyReset(server) {
function checkDailyReset(server) {
if (!data) {
loadData();
}
@@ -1027,9 +1047,9 @@ function checkDailyReset(server) {
if (data.lastReset !== today) {
resetDailyQuests(server);
}
}
}
ServerEvents.commandRegistry(function (event) {
ServerEvents.commandRegistry(function (event) {
var Commands = event.commands;
var Arguments = event.arguments;
@@ -1055,7 +1075,8 @@ ServerEvents.commandRegistry(function (event) {
return 1;
} catch (error) {
console.error(
"[DailyQuests] /dailyquests error: " + String(error),
"[DailyQuests] /dailyquests error: " +
String(error),
);
ctx.source.sendFailure(
@@ -1104,7 +1125,10 @@ ServerEvents.commandRegistry(function (event) {
Arguments.PLAYER.create(event),
).executes((ctx) => {
try {
var target = Arguments.PLAYER.getResult(ctx, "player");
var target = Arguments.PLAYER.getResult(
ctx,
"player",
);
if (!target) {
ctx.source.sendFailure(
@@ -1156,9 +1180,9 @@ ServerEvents.commandRegistry(function (event) {
}),
),
);
});
});
PlayerEvents.loggedIn(function (event) {
PlayerEvents.loggedIn(function (event) {
try {
checkDailyReset(event.server);
@@ -1172,9 +1196,9 @@ PlayerEvents.loggedIn(function (event) {
).red(),
);
}
});
});
ServerEvents.tick(function (event) {
ServerEvents.tick(function (event) {
try {
var currentTick = event.server.tickCount;
@@ -1188,9 +1212,10 @@ ServerEvents.tick(function (event) {
} catch (error) {
console.error("[DailyQuests] Tick error: " + String(error));
}
});
});
loadConfig();
loadData();
loadConfig();
loadData();
console.log("[DailyQuests] Loaded successfully.");
console.log("[DailyQuests] Loaded successfully.");
})();
+65 -52
View File
@@ -12,22 +12,23 @@
*/
// Dependencies: LuckPerms, KubeJSHTTP
(function () {
var DISCORD_WEBHOOK_URL =
"https://discord.com/api/webhooks/1544442801247494226/A-1JQpkeJ2jFFik63uEWPIV0Vd-fOcJV9KoySseGu8LO5SpkxZ23okWXxd-IMkD_tQDP";
var DISCORD_WEBHOOK_URL = "REPLACE_ME";
var MULTIACCOUNT_PERMISSION_CHECKIP = "multiaccount.command.checkip";
var MULTIACCOUNT_PERMISSION_ALERT = "multiaccount.alert";
var MULTIACCOUNT_PERMISSION_CHECKIP = "multiaccount.command.checkip";
var MULTIACCOUNT_PERMISSION_ALERT = "multiaccount.alert";
var LuckPermsApiProvider = Java.loadClass(
var LuckPermsApiProvider = Java.loadClass(
"net.luckperms.api.LuckPermsProvider",
);
);
var HttpAPI = Java.loadClass("com.awizo.KubeJSHTTP.HttpAPI");
var HttpAPI = Java.loadClass("com.awizo.KubeJSHTTP.HttpAPI");
var luckPermsApi = null;
var playerIPMap = new Map();
var luckPermsApi = null;
var playerIPMap = new Map();
function getLuckPerms() {
function getLuckPerms() {
if (luckPermsApi) {
return luckPermsApi;
}
@@ -35,15 +36,17 @@ function getLuckPerms() {
try {
luckPermsApi = LuckPermsApiProvider.get();
console.log("[Multi-Account] luckPermsApi API loaded successfully!");
console.log(
"[Multi-Account] luckPermsApi API loaded successfully!",
);
return luckPermsApi;
} catch (error) {
return null;
}
}
}
function hasPermission(player, permission) {
function hasPermission(player, permission) {
var api = getLuckPerms();
if (!api || !player) {
@@ -70,9 +73,9 @@ function hasPermission(player, permission) {
return false;
}
}
}
function getPlayerIP(player) {
function getPlayerIP(player) {
try {
var ip = player.ipAddress;
@@ -99,16 +102,16 @@ function getPlayerIP(player) {
return null;
}
}
}
function sendPlayerNotification(player, otherPlayers) {
function sendPlayerNotification(player, otherPlayers) {
player.tell(
"§c[ALERT] §fMulti-account detected! Other accounts on your IP: §e" +
otherPlayers.join(", "),
);
}
}
function notifyStaff(server, playerName, otherPlayers) {
function notifyStaff(server, playerName, otherPlayers) {
var message =
"§c[ADMIN] §fPlayer §6" +
playerName +
@@ -120,9 +123,9 @@ function notifyStaff(server, playerName, otherPlayers) {
player.tell(message);
}
});
}
}
function sendDiscordNotification(player, otherPlayers) {
function sendDiscordNotification(player, otherPlayers) {
var playerName =
player && typeof player.getName === "function"
? player.getName().getString()
@@ -147,18 +150,18 @@ function sendDiscordNotification(player, otherPlayers) {
":S>",
color: 3447003,
footer: {
text: "Multi-Account Watch",
text: "Sputnik watch",
},
},
],
}),
);
} catch (e) {
console.error("[Multi-Account Watch] Failed to send webhook: " + e);
console.error("[SputnikWatch] Failed to send webhook: " + e);
}
}
}
function rebuildPlayerIPMap(server) {
function rebuildPlayerIPMap(server) {
playerIPMap.clear();
server.players.forEach((player) => {
@@ -181,9 +184,9 @@ function rebuildPlayerIPMap(server) {
playerIPMap.size +
" IP(s).",
);
}
}
function sendCheckIPWebhook(player, groups) {
function sendCheckIPWebhook(player, groups) {
var playerName =
player && typeof player.getName === "function"
? player.getName().getString()
@@ -217,7 +220,7 @@ function sendCheckIPWebhook(player, groups) {
":S>",
color: 3447003,
footer: {
text: "Multi-Account watch",
text: "Sputnik watch",
},
},
],
@@ -226,11 +229,13 @@ function sendCheckIPWebhook(player, groups) {
console.log("[Multi-Account] /checkip results sent to Discord.");
} catch (e) {
console.error("[Multi-Account Watch] Failed to send /checkip webhook: " + e);
console.error(
"[SputnikWatch] Failed to send /checkip webhook: " + e,
);
}
}
}
function checkMultiAccount(server, player) {
function checkMultiAccount(server, player) {
var name = player.username;
var ip = getPlayerIP(player);
@@ -264,9 +269,9 @@ function checkMultiAccount(server, player) {
}
players.add(name);
}
}
function removePlayer(name) {
function removePlayer(name) {
for (var [ip, players] of playerIPMap) {
if (!players.delete(name)) {
continue;
@@ -286,9 +291,9 @@ function removePlayer(name) {
break;
}
}
}
PlayerEvents.loggedIn((event) => {
PlayerEvents.loggedIn((event) => {
var player = event.player;
var server = event.server;
@@ -302,17 +307,17 @@ PlayerEvents.loggedIn((event) => {
server.schedule(10, () => {
checkMultiAccount(server, player);
});
});
});
PlayerEvents.loggedOut((event) => {
PlayerEvents.loggedOut((event) => {
var name = event.player.username;
console.log("[Multi-Account] " + name + " left the server");
removePlayer(name);
});
});
ServerEvents.commandRegistry((event) => {
ServerEvents.commandRegistry((event) => {
const { commands: Commands } = event;
event.register(
@@ -336,7 +341,10 @@ ServerEvents.commandRegistry((event) => {
rebuildPlayerIPMap(server);
source.sendSuccess(Text.of("§6Players sharing an IP:"), false);
source.sendSuccess(
Text.of("§6Players sharing an IP:"),
false,
);
for (var players of playerIPMap.values()) {
if (players.size <= 1) {
@@ -350,7 +358,9 @@ ServerEvents.commandRegistry((event) => {
groups.push(playerList);
source.sendSuccess(
Text.of(`§7Group ${group}: §e${playerList.join(", ")}`),
Text.of(
`§7Group ${group}: §e${playerList.join(", ")}`,
),
false,
);
@@ -369,23 +379,26 @@ ServerEvents.commandRegistry((event) => {
return 1;
}),
);
});
});
console.log("[Multi-Account] Script loaded successfully!");
console.log("[Multi-Account] Script loaded successfully!");
console.log(
"[Multi-Account] /checkip permission: " + MULTIACCOUNT_PERMISSION_CHECKIP,
);
console.log(
"[Multi-Account] /checkip permission: " +
MULTIACCOUNT_PERMISSION_CHECKIP,
);
console.log(
"[Multi-Account] Chat alert permission: " + MULTIACCOUNT_PERMISSION_ALERT,
);
console.log(
"[Multi-Account] Chat alert permission: " +
MULTIACCOUNT_PERMISSION_ALERT,
);
console.log("[Multi-Account] Commands: /checkip");
console.log("[Multi-Account] Commands: /checkip");
console.log(
console.log(
"[Multi-Account] Webhook: " +
(DISCORD_WEBHOOK_URL !== "REPLACE_ME"
? "✓ Configured"
: "✗ Not configured"),
);
);
})();