就是个静态页面,有什么好试的,也没后台地址,天天login
此项目后续会整合进机器人插件里,仓库已归档
[MD]
%20网页背包插件&fontAlign=50&fontAlignY=50&descAlignY=70&descSize=18)
[/MD]
使用示例
1. 读取本地指定JSON文件
https://example.com/demo.html?target={文件名}
例如: https://static.217.im/mc/dev/inventory/demo.html?target=114514
2. 调用远程API
https://example.com/demo.html?remote={API}
不管是本地读取还是远程调用,读取(响应)的内容需要符合下面格式
前端并不会对物品能不能堆叠,有没有耐久度进行校验
请确定保存背包数据时已经校验过这些信息
不然可能会出现既有耐久度条又有物品数量
JSON:
{
"playerInventory": [
{
"name": "草方块",
"count": 64,
"slot": 27,
"icon": "./images/block/grass_block.png"
},
{
"name": "钻石剑",
"slot": 0,
"icon": "./images/item/diamond_sword.png",
"damage": 114,
"maxDamage": 2333
}
],
"enderChest": [
{
"name": "钻石",
"count": 1,
"slot": 10,
"icon": "./images/item/diamond.png"
}
]
}
下面是LSE插件示例 仅供参考
JavaScript:
ll.registerPlugin(
/* name */ "114514",
/* introduction */ "114514",
/* version */[11, 45, 14],
/* otherInformation */ {}
);
type itemData = {
name: string,
icon: string,
slot: number,
count?: number,
damage?: number,
maxDamage?: number
}
type InventoryData = {
playerInventory: itemData[],
enderChest: itemData[]
}
const BASE_DATA_PATH = "./plugins/LK/Inventory/Data"
const STATIC_PATH = "./plugins/LK/Inventory/Web"
function getInventoryData(player: Player) {
if (!player) return
const inventory = player.getInventory()
const enderChest = player.getEnderChest()
const inventoryData: InventoryData = {
playerInventory: [],
enderChest: []
}
inventory.getAllItems().forEach((item, index) => {
let { count, type, name, isBlock, isStackable, isDamageableItem, damage, maxDamage } = item
if (item.isNull()) return
const data: itemData = {
name,
icon: `./images/${isBlock ? "block" : "item"}/${type.split("minecraft:")[1]}.png`,
slot: index,
count: isStackable ? count : undefined,
damage: isDamageableItem ? maxDamage - damage : undefined,
maxDamage: isDamageableItem ? maxDamage : undefined
}
inventoryData.playerInventory.push(data)
})
enderChest.getAllItems().forEach((item, index) => {
let { count, type, name, isBlock, isStackable, isDamageableItem, damage, maxDamage } = item
if (item.isNull()) return
const data: itemData = {
name,
icon: `./images/${isBlock ? "block" : "item"}/${type}.png`,
slot: index,
count: isStackable ? count : undefined,
damage: isDamageableItem ? maxDamage - damage : undefined,
maxDamage: isDamageableItem ? maxDamage : undefined
}
inventoryData.enderChest.push(data)
})
return inventory
}
mc.listen("onLeft", player => {
const inventory = player.getInventory()
const enderChest = player.getEnderChest()
const inventoryData: InventoryData = {
playerInventory: [],
enderChest: []
}
inventory.getAllItems().forEach((item, index) => {
let { count, type, name, isBlock, isStackable, isDamageableItem, damage, maxDamage } = item
if (item.isNull()) return
const data: itemData = {
name,
icon: `./images/${isBlock ? "block" : "item"}/${type}.png`,
slot: index,
count: isStackable ? count : undefined,
damage: isDamageableItem ? maxDamage - damage : undefined,
maxDamage: isDamageableItem ? maxDamage : undefined
}
inventoryData.playerInventory.push(data)
})
enderChest.getAllItems().forEach((item, index) => {
let { count, type, name, isBlock, isStackable, isDamageableItem, damage, maxDamage } = item
if (item.isNull()) return
const data: itemData = {
name,
icon: `./images/${isBlock ? "block" : "item"}/${type}.png`,
slot: index,
count: isStackable ? count : undefined,
damage: isDamageableItem ? maxDamage - damage : undefined,
maxDamage: isDamageableItem ? maxDamage : undefined
}
inventoryData.enderChest.push(data)
})
//这里用的是玩家uuid作为文件名,你也可以用玩家名/xuid作为文件名
File.writeTo(`${BASE_DATA_PATH}/${player.uuid}.json`, JSON.stringify(inventoryData))
})
const server = new HttpServer();
const LISTEN_ADDRESS = "127.0.0.1"
const LISTEN_PORT = 11451
mc.listen("onServerStarted", () => {
//这个只是一个示例,当前版本lse的HttpServer不能正常运行
//你可以直接从minebbs下载适用于nodejs引擎基于express的插件
server.onGet("/inventory", (req, resp) => {
const playerName = req.query["name"]
if (typeof playerName === "undefined"){
resp.status = 400;
resp.reason = "Bad Request";
return
}
const uuid = data.name2uuid(playerName)
if (uuid === null) {
resp.status = 400;
resp.reason = "Bad Request";
return
}
let player = mc.getOnlinePlayers().find(pl => pl.uuid === uuid)
if (typeof player !== "undefined") {
resp.body = JSON.stringify(getInventoryData(player))
resp.status = 200;
resp.reason = "OK";
return
}
resp.body = File.readFrom(`${BASE_DATA_PATH}/${uuid}.json`)
resp.status = 200;
resp.reason = "OK";
}).onGet("/static/(.+)", (req, resp) => {
const fileName = req.matches[1]
const path = `${STATIC_PATH}/${fileName}`
if (File.exists(path)) {
resp.body = File.readFrom(path)
resp.status = 200;
resp.reason = "OK";
return
}
resp.status = 404;
resp.reason = "Not Found";
}).onGet("/404", (req, resp) => {
resp.status = 404;
resp.reason = "Not Found";
}).onGet("/(.+)", (req, resp) => {
resp.status = 404;
resp.reason = "Not Found";
}).onPreRouting((req, resp) => {
logger.info(`onPreRouting [${req.method}] Path ${req.path}\n`, req.query, req.body)
}).onPostRouting((req, resp) => {
}).onError((req, resp) => {
}).onException((req, resp, error) => {
logger.error(error)
}).listen(LISTEN_ADDRESS, LISTEN_PORT);
})
ll.onUnload(() => {
server.stop()
})