Add chunk generation export

This commit is contained in:
Demetrius Kanios 2026-08-17 11:57:52 -07:00
parent 37375b5655
commit f4e1584c16

37
dist/index.ts vendored
View File

@ -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) {