Skip to content

Commit

Permalink
1.0
Browse files Browse the repository at this point in the history
完成留言系统。
  • Loading branch information
ljm12914 committed Aug 13, 2024
1 parent 54d733a commit 56fef3a
Show file tree
Hide file tree
Showing 10 changed files with 372 additions and 202 deletions.
74 changes: 47 additions & 27 deletions scripts/commandBase.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ let prefix = ".";
* args :argumentDef[];
* description :string;
* callback :(usedName :string, player :Player, args :Record<string, (string | number | boolean)>)=>boolean;
* tagRequired? :string[];
* tagsRequired? :string[];
* hidden? :boolean;
* }} Command
* @type {Command[]}
Expand All @@ -27,16 +27,28 @@ const commands = [];
//#region 命令注册
/**注册命令,可选参数必须排在必选参数后面
* @param {Command} args 函数参数
* @returns {boolean} 是否成功注册命令。
*/
export function registerCommand(args){
if(args.names.length === 0){
world.sendMessage("§c内部错误。请报告管理员。");
console.error(`Found command with no names!`);
return false;
}
for(let i = 0; i < commands.length; i++) for(let j = 0; j < commands[i].names.length; j++) for(let k = 0; k < args.names.length; k++) if(commands[i].names[j] === args.names[k]){
world.sendMessage("§c内部错误。请报告管理员。");
console.error(`Duplicate name on [${commands[i].names.join(", ")}] and new [${args.names.join(", ")}]`);
return false;
}
commands.push({
names: args.names,
args: args.args,
description: args.description,
tagRequired: args.tagRequired,
tagsRequired: args.tagsRequired,
hidden: args.hidden,
callback: args.callback
});
return true;
}
//#endregion

Expand All @@ -50,7 +62,7 @@ world.beforeEvents.chatSend.subscribe(data=>{
raw = message.substring(1, message.length).split(" "),
name = raw.shift();
let firedCommand = false;
for(let i = 0; i < commands.length; i++) for(let j = 0; j < commands[i].names.length; j++) if(commands[i].names[j] === name){
for(let i = 0; i < commands.length; i++) for(let j = 0; j < commands[i].names.length; j++) if(commands[i].names[j] === name && checkTags(commands[i].tagsRequired, data.sender)){
const
argDefs = commands[i].args,
/**@type {Record<string, (string | number | boolean)>}*/
Expand All @@ -70,16 +82,16 @@ world.beforeEvents.chatSend.subscribe(data=>{
else if(raw[k] !== undefined || !foundOptional) hasError = true;
break;
case "string":
if(raw[k] !== "") argsToSend[argDefs[k].name] = raw[k];
else if(raw[k] !== undefined || !foundOptional) hasError = true;
if(raw[k] !== undefined && raw[k] !== "") argsToSend[argDefs[k].name] = raw[k];
else if(!foundOptional) hasError = true;
break;
default:
console.error(`Illegal argument type in command ${name}: ${argDefs[k].name} is ${argDefs[k].type}`);
data.sender.sendMessage("§c内部错误。请报告管理员。");
return;
}
if(hasError){
errorString = `§c.${name}语法错误:意外的“${raw[k]}”出现在参数“${argDefs[k].name}”,应为${argDefs[k].type}类型`;
errorString = `§c.${name}错误:意外的“${raw[k]}”出现在参数“${argDefs[k].name}”,应为${argDefs[k].type}类型`;
break;
}
}
Expand All @@ -88,39 +100,47 @@ world.beforeEvents.chatSend.subscribe(data=>{
firedCommand = true;
}
else{
console.warn(`Player ${data.sender.name} executed command .${name} and occured an error: ${errorString}`);
console.warn(`${data.sender.name} executed .${name} occured error: ${errorString}`);
data.sender.sendMessage(errorString);
}
return;
}
if(!firedCommand) data.sender.sendMessage(`§c命令不存在或执行权限不足:${name}。输入.help获取命令帮助。`);
return;
}
if(data.message[0] != prefix) console.log(`<${data.sender.name}>${data.message}`);
if(data.message[0] !== prefix) console.log(`<${data.sender.name}>${data.message}`);
});

registerCommand({
names: ["h", "bz", "help"],
description: "显示命令帮助。",
args: [],
callback: (_name, player)=>{
let validCommands = 0;
for(let i = 0; i < commands.length; i++) if(!commands[i].hidden && checkTags(commands[i].tagRequired, player)){
validCommands++;
let argString = "";
for(let j = 0; j < commands[i].args.length; j++){
if(!j) argString += " ";
const arg = commands[i].args[j];
argString += `${arg.optional ? "[" : "<"}${arg.name} :${arg.type}${arg.optional ? "]" : ">"}`;
if(j < commands[i].args.length - 1) argString += " ";
args: [{
name: "wantsMore",
optional: true,
type: "boolean"
}],
callback: (_name, player, args)=>{
if(args.wantsMore === true){
player.sendMessage("§e§l——基岩服自定义命令使用手册——\nnouino");
}
else{
let validCommands = 0;
for(let i = 0; i < commands.length; i++) if(!commands[i].hidden && checkTags(commands[i].tagsRequired, player)){
validCommands++;
let argString = "";
for(let j = 0; j < commands[i].args.length; j++){
if(!j) argString += " ";
const arg = commands[i].args[j];
argString += `${arg.optional ? "[" : "<"}${arg.name} :${arg.type}${arg.optional ? "]" : ">"}`;
if(j < commands[i].args.length - 1) argString += " ";
}
player.sendMessage(`${prefix}${commands[i].names.length - 1 ? "<" : ""}${commands[i].names.join(" | ")}${commands[i].names.length - 1 ? ">" : ""}${argString} —— ${commands[i].description}`);
}
player.sendMessage(`${prefix}<${commands[i].names.join(" | ")}>${argString} —— ${commands[i].description}`);
player.sendMessage(`§e列出完毕,共有 ${validCommands} 条命令。\n§7<>内为必选项;[]内为可选项;|分隔的为多选一;:前为参数名,后为参数类型。输入.h true获取更详细的帮助手册。`);
}
player.sendMessage(`§e列出完毕,共有 ${validCommands} 条命令。`);
player.sendMessage("§7<>内为必选项;[]内为可选项;|分隔的为多选一;:前为参数名,后为参数类型。");
return true;
}}
);
}
});

/**检查玩家是否有权限看到并执行某个命令。
* @param {string[] | undefined} tags 需要检查的标签集合,以或门连接。
Expand All @@ -137,13 +157,13 @@ const confirmStagePlayers = [];

registerCommand({
names: ["reset_all", "reset_all_confirm", "nope"],
description: "【仅限出现故障时使用】清除所有玩家关联的命令数据,如常用语等。",
description: "【仅限出现故障时使用】清除所有你关联的命令数据,如常用语等。",
args: [],
callback: (name, player)=>{
if(name == "reset_all"){
if(confirmStagePlayers.includes(player.name)) player.sendMessage(c错误:你已经在清除确认阶段了!请先输入.nope取消清除。");
if(confirmStagePlayers.includes(player.name)) player.sendMessage(c你已经在清除确认阶段了!请先输入.nope取消清除。");
else{
player.sendMessage(`§c§l你确定要清除所有你关联的数据吗?这可能会导致信息丢失或产生bug!确保你得到了可信的指导再这样做!如果你确认,请输入指令.reset_all_confirm;否则请输入.nope取消清除。`);
player.sendMessage(`§c§l你确定要清除所有你关联的数据吗?这可能会导致信息丢失或产生bug!确保你得到了可信的指导再这样做!如果你确认,请输入.reset_all_confirm;否则请输入.nope取消清除。`);
confirmStagePlayers.push(player.name);
}
}
Expand Down
5 changes: 1 addition & 4 deletions scripts/day.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,7 @@ registerCommand({
description: "显示时间量。",
args: [],
callback: (_name, player)=>{
system.runTimeout(()=>{
player.sendMessage(getTimeString(world.getAbsoluteTime(), "世界"));
player.sendMessage(getTimeString(system.currentTick, "服务器"));
}, Math.random() * 3);
system.runTimeout(()=>{player.sendMessage(`${getTimeString(world.getAbsoluteTime(), "世界")}\n${getTimeString(system.currentTick, "服务器")}`)}, Math.random() * 3);
return true;
}
});
Expand Down
23 changes: 23 additions & 0 deletions scripts/deathCoords.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//@ts-check
import { Player, world } from "@minecraft/server";

export function deathCoordsInit(){}

/**@type {Map<string, import("@minecraft/server").Vector3>}*/
const deadPlayerLocations = new Map();

world.afterEvents.entityDie.subscribe(data=>{
if(data.deadEntity.typeId === "minecraft:player"){
deadPlayerLocations.set(/**@type {Player}*/ (data.deadEntity).name, data.deadEntity.location);
console.log(`${/**@type {Player}*/ (data.deadEntity).name} died at (${data.deadEntity.location.x.toFixed(0)}, ${data.deadEntity.location.y.toFixed(0)}, ${data.deadEntity.location.z.toFixed(0)}) from ${data.damageSource.cause}, ${data.damageSource.damagingEntity?.typeId}, ${data.damageSource.damagingProjectile?.typeId}`);
}
});

world.afterEvents.playerSpawn.subscribe(data=>{
if(!data.initialSpawn){
const location = deadPlayerLocations.get(data.player.name);
deadPlayerLocations.delete(data.player.name);
if(location) data.player.sendMessage(`§4§l您死在了(${location.x.toFixed(0)}, ${location.y.toFixed(0)}, ${location.z.toFixed(0)})。`);
else data.player.sendMessage("§e§l您死在了没有坐标的地方!");
}
});
149 changes: 134 additions & 15 deletions scripts/debug.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
//@ts-check
import { system, Player, world } from "@minecraft/server";
import { world } from "@minecraft/server";
import { registerCommand } from "./commandBase";

export function debugInit(){}

registerCommand({
names: ["getpp"],
names: ["gpp"],
description: "获取玩家的附加属性。",
tagRequired: ["dev"],
tagsRequired: ["dev"],
args: [
{
name: "player",
Expand All @@ -28,18 +28,16 @@ registerCommand({
switch(typeof content){
case "string":
case "number":
player.sendMessage(`${content}`);
player.sendMessage(`${args.property}${content}`);
break;
case "boolean":
player.sendMessage(content ? "true" : "false");
player.sendMessage(`${args.property}${content ? "true" : "false"}`);
break;
case "undefined":
player.sendMessage("undefined");
player.sendMessage("real undefined!");
player.sendMessage(`${args.property}: undefined\nreal undefined!`);
break;
case "object":
player.sendMessage(`${content.x}, ${content.y}, ${content.z}`);
player.sendMessage("real Vector3!");
player.sendMessage(`${args.property}${content.x}, ${content.y}, ${content.z}\nreal Vector3!`);
break;
}
}
Expand All @@ -48,9 +46,9 @@ registerCommand({
});

registerCommand({
names: ["setpp"],
names: ["spp"],
description: "设置玩家的附加属性,undefined6,true6,false6,不支持坐标。",
tagRequired: ["dev"],
tagsRequired: ["dev"],
args: [
{
name: "player",
Expand All @@ -72,11 +70,132 @@ registerCommand({
const target = world.getPlayers({name: /**@type {string}*/ (args.player)});
if(target.length === 0) player.sendMessage("§c玩家不在线");
else{
if(args.value === "undefined6") player.setDynamicProperty(/**@type {string}*/ (args.property), undefined);
else if(args.value === "true6") player.setDynamicProperty(/**@type {string}*/ (args.property), true);
else if(args.value === "false6") player.setDynamicProperty(/**@type {string}*/ (args.property), false);
else player.setDynamicProperty(/**@type {string}*/ (args.property), args.value);
if(args.value === "undefined6") target[0].setDynamicProperty(/**@type {string}*/ (args.property), undefined);
else if(args.value === "true6") target[0].setDynamicProperty(/**@type {string}*/ (args.property), true);
else if(args.value === "false6") target[0].setDynamicProperty(/**@type {string}*/ (args.property), false);
else target[0].setDynamicProperty(/**@type {string}*/ (args.property), args.value);
player.sendMessage(`成功设置${target[0].name}的附加属性${args.property}${args.value}。`);
}
return true;
}
});

registerCommand({
names: ["cpp"],
description: "清除玩家的附加属性。",
tagsRequired: ["dev"],
args: [{
name: "player",
optional: false,
type: "string"
}],
callback: (_name, player, args)=>{
const target = world.getPlayers({name: /**@type {string}*/ (args.player)});
if(target.length === 0) player.sendMessage("§c玩家不在线");
else{
target[0].clearDynamicProperties();
player.sendMessage(`成功清除${target[0].name}的附加属性。`);
}
return true;
}
});

registerCommand({
names: ["qpp"],
description: "查询玩家的附加属性信息。",
tagsRequired: ["dev"],
args: [{
name: "player",
optional: false,
type: "string"
}],
callback: (_name, player, args)=>{
const target = world.getPlayers({name: /**@type {string}*/ (args.player)});
if(target.length === 0) player.sendMessage("§c玩家不在线");
else{
player.sendMessage(`所有ID:${[target[0].getDynamicPropertyIds().join(",")]}`);
player.sendMessage(`占用大小:${target[0].getDynamicPropertyTotalByteCount()}`);
}
return true;
}
});

registerCommand({
names: ["gwp"],
description: "获取世界的附加属性。",
tagsRequired: ["dev"],
args: [{
name: "property",
optional: false,
type: "string"
}],
callback: (_name, player, args)=>{
const content = world.getDynamicProperty(/**@type {string}*/ (args.property));
switch(typeof content){
case "string":
case "number":
player.sendMessage(`${args.property}${content}`);
break;
case "boolean":
player.sendMessage(`${args.property}${content ? "true" : "false"}`);
break;
case "undefined":
player.sendMessage(`${args.property}: undefined\nreal undefined!`);
break;
case "object":
player.sendMessage(`${args.property}${content.x}, ${content.y}, ${content.z}\nreal Vector3!`);
break;
}
return true;
}
});

registerCommand({
names: ["swp"],
description: "设置世界的附加属性,undefined6,true6,false6,不支持坐标。",
tagsRequired: ["dev"],
args: [
{
name: "property",
optional: false,
type: "string"
},
{
name: "value",
optional: false,
type: "string"
}
],
callback: (_name, player, args)=>{
if(args.value === "undefined6") world.setDynamicProperty(/**@type {string}*/ (args.property), undefined);
else if(args.value === "true6") world.setDynamicProperty(/**@type {string}*/ (args.property), true);
else if(args.value === "false6") world.setDynamicProperty(/**@type {string}*/ (args.property), false);
else world.setDynamicProperty(/**@type {string}*/ (args.property), args.value);
player.sendMessage(`成功设置世界附加属性${args.property}${args.value}。`);
return true;
}
});

registerCommand({
names: ["cwp"],
description: "清除世界的附加属性。",
tagsRequired: ["dev"],
args: [],
callback: (_name, player)=>{
world.clearDynamicProperties();
player.sendMessage("成功清除世界附加属性。");
return true;
}
});

registerCommand({
names: ["qwp"],
description: "查询世界的附加属性信息。",
tagsRequired: ["dev"],
args: [],
callback: (_name, player)=>{
player.sendMessage(`所有ID:${[world.getDynamicPropertyIds().join(" ")]}`);
player.sendMessage(`占用大小:${world.getDynamicPropertyTotalByteCount()}`);
return true;
}
});
Loading

0 comments on commit 56fef3a

Please sign in to comment.