Skip to content

plugin_generateOfflineUUID

根据玩家名称生成离线模式的 UUID。

函数签名

javascript
plugin_generateOfflineUUID(playerName: string): string

参数说明

参数类型必填说明
playerNamestring玩家名称

参数详解

  • playerName:玩家的游戏名称,用于生成对应的离线 UUID

返回值

返回一个格式化的 UUID 字符串,格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

功能描述

plugin_generateOfflineUUID 用于生成 Minecraft 离线模式下的玩家 UUID。在离线模式(offline-mode=false)的服务器中,玩家的 UUID 是根据玩家名称通过特定算法生成的,而不是从 Mojang 的认证服务器获取。

这个函数使用与 Minecraft 相同的算法生成 UUID,确保生成的 UUID 与服务器生成的 UUID 完全一致。这对于需要存储玩家数据、查询玩家信息等场景非常有用。

算法说明

UUID 生成算法:

  1. 将字符串 OfflinePlayer: 与玩家名称拼接
  2. 使用 MD5 算法计算哈希值
  3. 设置版本号(版本 3)和变体标识
  4. 格式化为标准 UUID 格式

使用示例

基本用法

javascript
// 生成 Steve 的离线 UUID
const uuid = plugin_generateOfflineUUID("Steve");
plugin_log("INFO", `Steve 的 UUID: ${uuid}`);
// 输出: Steve 的 UUID: 8667ba71-b85a-4004-af54-457a9734eed7

存储玩家数据

javascript
// 使用 UUID 作为键存储玩家数据
plugin_onEvent("playerJoin", (time, player) => {
    const uuid = plugin_generateOfflineUUID(player);
    
    // 存储玩家数据
    const playerData = plugin_pull("playerData") || {};
    if (!playerData[uuid]) {
        playerData[uuid] = {
            name: player,
            firstJoin: new Date().toISOString(),
            joinCount: 0
        };
    }
    playerData[uuid].joinCount++;
    playerData[uuid].lastJoin = new Date().toISOString();
    plugin_push("playerData", playerData);
    
    plugin_log("INFO", `${player} (${uuid}) 第 ${playerData[uuid].joinCount} 次加入`);
});

查询玩家数据

javascript
// 根据玩家名查询数据
function getPlayerData(player) {
    const uuid = plugin_generateOfflineUUID(player);
    const playerData = plugin_pull("playerData") || {};
    return playerData[uuid] || null;
}

// 使用示例
plugin_registerCommand("!stats", (player) => {
    const data = getPlayerData(player);
    if (data) {
        plugin_executeCommand(`tellraw ${player} {"text":"你的数据:","color":"green"}`);
        plugin_executeCommand(`tellraw ${player} {"text":"加入次数: ${data.joinCount}","color":"white"}`);
    } else {
        plugin_executeCommand(`tellraw ${player} {"text":"暂无数据","color":"yellow"}`);
    }
});

白名单管理

javascript
// 添加白名单
function addToWhitelist(player) {
    const uuid = plugin_generateOfflineUUID(player);
    const whitelist = plugin_pull("whitelist") || {};
    whitelist[uuid] = {
        name: player,
        addedAt: new Date().toISOString()
    };
    plugin_push("whitelist", whitelist);
    plugin_log("INFO", `已将 ${player} (${uuid}) 添加到白名单`);
}

// 检查白名单
function isInWhitelist(player) {
    const uuid = plugin_generateOfflineUUID(player);
    const whitelist = plugin_pull("whitelist") || {};
    return !!whitelist[uuid];
}

// 使用示例
plugin_onEvent("playerJoin", (time, player) => {
    if (!isInWhitelist(player)) {
        plugin_executeCommand(`kick ${player} 你不在白名单中`);
    }
});

封禁系统

javascript
// 封禁玩家
function banPlayer(player, reason) {
    const uuid = plugin_generateOfflineUUID(player);
    const banList = plugin_pull("banList") || {};
    banList[uuid] = {
        name: player,
        reason: reason,
        bannedAt: new Date().toISOString()
    };
    plugin_push("banList", banList);
    plugin_log("INFO", `已封禁 ${player} (${uuid}),原因: ${reason}`);
}

// 检查封禁
function isBanned(player) {
    const uuid = plugin_generateOfflineUUID(player);
    const banList = plugin_pull("banList") || {};
    return banList[uuid] || null;
}

// 使用示例
plugin_onEvent("playerJoin", (time, player) => {
    const banInfo = isBanned(player);
    if (banInfo) {
        plugin_executeCommand(`kick ${player} 你已被封禁: ${banInfo.reason}`);
    }
});

经济系统

javascript
// 初始化玩家账户
plugin_onEvent("playerJoin", (time, player) => {
    const uuid = plugin_generateOfflineUUID(player);
    const economy = plugin_pull("economy") || {};
    
    if (!economy[uuid]) {
        economy[uuid] = {
            name: player,
            balance: 1000,  // 初始金币
            createdAt: new Date().toISOString()
        };
        plugin_push("economy", economy);
        plugin_log("INFO", `为 ${player} 创建账户,初始金币: 1000`);
    }
});

// 查询余额
function getBalance(player) {
    const uuid = plugin_generateOfflineUUID(player);
    const economy = plugin_pull("economy") || {};
    return economy[uuid]?.balance || 0;
}

// 转账
function transfer(from, to, amount) {
    const fromUuid = plugin_generateOfflineUUID(from);
    const toUuid = plugin_generateOfflineUUID(to);
    const economy = plugin_pull("economy") || {};
    
    if ((economy[fromUuid]?.balance || 0) >= amount) {
        economy[fromUuid].balance -= amount;
        economy[toUuid] = economy[toUuid] || { name: to, balance: 0 };
        economy[toUuid].balance += amount;
        plugin_push("economy", economy);
        return true;
    }
    return false;
}

注意事项

  1. 仅适用于离线模式:此函数生成的 UUID 仅适用于 offline-mode=false 的服务器
  2. 在线模式服务器:在线模式服务器的 UUID 由 Mojang 认证服务器提供,与此函数生成的不同
  3. 名称唯一性:相同的玩家名称总是生成相同的 UUID
  4. 大小写敏感:玩家名称区分大小写,Stevesteve 会生成不同的 UUID

相关 API

相关指南