Add chunk generation export
This commit is contained in:
parent
37375b5655
commit
f4e1584c16
37
dist/index.ts
vendored
37
dist/index.ts
vendored
@ -11,7 +11,11 @@ import { IpcMessage, PluginId } from "pumpkin:plugin/ipc@0.1.0";
|
|||||||
import { PluginMetadata } from "pumpkin:plugin/metadata@0.1.0";
|
import { PluginMetadata } from "pumpkin:plugin/metadata@0.1.0";
|
||||||
import * as scheduler from "pumpkin:plugin/scheduler@0.1.0";
|
import * as scheduler from "pumpkin:plugin/scheduler@0.1.0";
|
||||||
import { Server } from "pumpkin:plugin/server@0.1.0";
|
import { Server } from "pumpkin:plugin/server@0.1.0";
|
||||||
import { Entity } from "pumpkin:plugin/world@0.1.0";
|
import {
|
||||||
|
ChunkBuffer,
|
||||||
|
Entity,
|
||||||
|
GenerationPhase,
|
||||||
|
} from "pumpkin:plugin/world@0.1.0";
|
||||||
|
|
||||||
export type EventHandler<T = any> = (srv: Server, evt: T) => T | void;
|
export type EventHandler<T = any> = (srv: Server, evt: T) => T | void;
|
||||||
export type CommandHandler = (
|
export type CommandHandler = (
|
||||||
@ -27,23 +31,23 @@ export interface AiGoal {
|
|||||||
tick: (server: Server, entity: Entity) => void;
|
tick: (server: Server, entity: Entity) => void;
|
||||||
stop: (server: Server, entity: Entity) => void;
|
stop: (server: Server, entity: Entity) => void;
|
||||||
}
|
}
|
||||||
|
export type ChunkGenerator = (
|
||||||
|
phase: GenerationPhase,
|
||||||
|
chunk: ChunkBuffer,
|
||||||
|
) => void;
|
||||||
|
|
||||||
let pluginInstance: Plugin | null = null;
|
let pluginInstance: Plugin | null = null;
|
||||||
const eventHandlers = new Map<number, EventHandler>();
|
const eventHandlers = new Map<number, EventHandler>();
|
||||||
const commandHandlers = new Map<number, CommandHandler>();
|
const commandHandlers = new Map<number, CommandHandler>();
|
||||||
const taskHandlers = new Map<number, TaskHandler>();
|
const taskHandlers = new Map<number, TaskHandler>();
|
||||||
|
const generators = new Map<number, ChunkGenerator>();
|
||||||
const aiGoals = new Map<number, AiGoal>();
|
const aiGoals = new Map<number, AiGoal>();
|
||||||
let nextHandlerId = 0;
|
let nextHandlerId = 0;
|
||||||
let nextAiGoalId = 0;
|
|
||||||
|
|
||||||
function getNextHandlerId(): number {
|
function getNextHandlerId(): number {
|
||||||
return nextHandlerId++;
|
return nextHandlerId++;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAiGoalId(): number {
|
|
||||||
return nextAiGoalId++;
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class Plugin {
|
export abstract class Plugin {
|
||||||
private pendingEvents: Array<{
|
private pendingEvents: Array<{
|
||||||
eventType: EventType;
|
eventType: EventType;
|
||||||
@ -115,10 +119,16 @@ export abstract class Plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
registerAiGoal(goal: AiGoal): number {
|
registerAiGoal(goal: AiGoal): number {
|
||||||
const aiGoalId = getAiGoalId();
|
const aiGoalId = getNextHandlerId();
|
||||||
aiGoals.set(aiGoalId, goal);
|
aiGoals.set(aiGoalId, goal);
|
||||||
return aiGoalId;
|
return aiGoalId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
registerGeneratePhaseHandler(generator: ChunkGenerator): number {
|
||||||
|
const generatorId = getNextHandlerId();
|
||||||
|
generators.set(generatorId, generator);
|
||||||
|
return generatorId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function registerPlugin(plugin: Plugin) {
|
export function registerPlugin(plugin: Plugin) {
|
||||||
@ -244,6 +254,19 @@ export function handleAiGoalStop(
|
|||||||
throw new Error(`No AI goal registered for ID ${goalId}`);
|
throw new Error(`No AI goal registered for ID ${goalId}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function handleGeneratePhase(
|
||||||
|
generatorId: number,
|
||||||
|
phase: GenerationPhase,
|
||||||
|
chunk: ChunkBuffer,
|
||||||
|
): void {
|
||||||
|
const generator = generators.get(generatorId);
|
||||||
|
if (generator) {
|
||||||
|
generator(phase, chunk);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new Error(`No generator registered for ID ${generatorId}`);
|
||||||
|
}
|
||||||
|
|
||||||
export const metadata = {
|
export const metadata = {
|
||||||
getMetadata(): PluginMetadata {
|
getMetadata(): PluginMetadata {
|
||||||
if (pluginInstance) {
|
if (pluginInstance) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user