lazuli-api
Version:
Add some useful instances for Minecraft Bedrock Edition
138 lines (129 loc) • 3.54 kB
text/typescript
import { Player, RawMessage, world } from "@minecraft/server";
import { ActionFormData, MessageFormData } from "@minecraft/server-ui";
import { getModId } from "lazuli-core";
import { setEquipmentItem } from "lazuli-utils";
/**
* A list of registried jobs id.
*/
export const ReistriedJobIdList: string[] = [];
/**
* A list of registried jobs.
*/
export const ReistriedJobList: Job[] = [];
export class Job {
constructor(
/**
* Id of the job.
*/
public readonly id: string,
public effect: JobEffect,
public asset: JobAsset
) {
this.register();
}
protected register() {
ReistriedJobIdList.push(this.id);
ReistriedJobList.push(this);
}
displayInfo(player: Player, board?: JobBoard) {
const infoForm = new MessageFormData()
.title(this.asset.name)
.body(generateJobBody(this, player))
.button1({ translate: "gui.ok" })
.button2({ translate: "job.tryUpdate" });
infoForm.show(player).then((response) => {
if (
response.canceled ||
response.selection === undefined ||
response.selection === 0
) {
board?.display(player);
}
});
}
giveJob(player: Player): void {
player.setDynamicProperty(`${getModId}.job:${this.id}`, true);
player.setDynamicProperty(`${getModId}.job_level:${this.id}`, 1);
}
hasJob(player: Player): boolean {
if (player.getDynamicProperty(`${getModId}.job:${this.id}`)) {
return true;
} else {
return false;
}
}
}
export class JobOffer {
constructor(public readonly typeId: string, public job: Job) {
this.register();
}
protected register() {
world.afterEvents.itemUse.subscribe((event) => {
if (this.typeId === event.itemStack.typeId) {
setEquipmentItem(event.source);
this.job.giveJob(event.source);
}
});
}
}
export class JobBoard {
constructor(public typeId: string) {
this.register();
}
protected register() {
world.afterEvents.itemUse.subscribe((event) => {
if (this.typeId === event.itemStack.typeId) {
this.display(event.source);
}
});
}
display(player: Player) {
const form = new ActionFormData();
const displayedJobs: Job[] = [];
JobManager.getHasJobs(player).forEach((job) => {
form.button(job.asset.name, job.asset.iconPath);
displayedJobs.push(job);
});
form.show(player).then((response) => {
if (response.selection) {
displayedJobs[response.selection].displayInfo(player);
}
});
}
}
export class JobManager {
private constructor() {}
static getRegistriedJobs(): Job[] {
return ReistriedJobList;
}
static getRegistriedJobsId(): string[] {
return ReistriedJobIdList;
}
static getHasJobs(player: Player): Job[] {
const JobList: Job[] = [];
this.getRegistriedJobs().forEach((job) => {
if (job.hasJob(player)) {
JobList.push(job);
}
});
return JobList;
}
}
// TODO
export function generateJobBody(job: Job, player: Player): RawMessage {
const body: RawMessage = {
rawtext: [
typeof job.asset.description === "string"
? { text: job.asset.description }
: job.asset.description,
],
};
return body;
}
// TODO
export interface JobEffect {}
export interface JobAsset {
name: string | RawMessage;
description: string | RawMessage;
iconPath?: string;
}