Actually implement mod code into server

This commit is contained in:
2026-09-25 23:13:46 -03:00
parent 099811670f
commit 9237152aa1
22 changed files with 1359 additions and 457 deletions
+8 -4
View File
@@ -49,7 +49,7 @@ export class ContainerSlot {
#item_stack: ItemStack | undefined;
has_item() {
return this.#item_stack !== undefined;
return this.get_item() !== undefined;
}
set_item(item_stack: ItemStack | undefined) {
@@ -60,11 +60,15 @@ export class ContainerSlot {
}
get_item() {
// scripts can count a stack down to nothing, it's gone then
if (this.#item_stack && this.#item_stack.amount <= 0) {
this.#item_stack = undefined;
}
return this.#item_stack;
}
get type_id() {
return this.#item_stack?.type_id;
return this.get_item()?.type_id;
}
set amount(new_amount: number) {
@@ -77,11 +81,11 @@ export class ContainerSlot {
}
get amount(): number | undefined {
return this.#item_stack?.amount;
return this.get_item()?.amount;
}
get max_amount() {
return this.#item_stack?.max_amount;
return this.get_item()?.max_amount;
}
}
+34 -6
View File
@@ -12,6 +12,7 @@ export interface ServerContext {
world: ServerWorld;
players: PlayerList;
containers: ContainerApi;
items: ItemApi;
recipes: RecipeApi;
ui: ServerUi;
net: ServerNet;
@@ -123,6 +124,8 @@ export interface ServerWorld {
get_state(x: number, y: number, z: number, name: string): number | undefined;
set_state(x: number, y: number, z: number, name: string, value: number): boolean;
get_block_data<T>(x: number, y: number, z: number): T | undefined;
// pops an item out of the block at x y z, like a broken block's drops
drop_item(x: number, y: number, z: number, item: ItemStack): void;
is_loaded(x: number, z: number): boolean;
readonly seed: string;
}
@@ -177,6 +180,12 @@ export interface ContainerApi {
delete(id: string): void;
}
export interface ItemApi {
exists(id: Id): boolean;
// how many fit in one slot
max_stack(id: Id): number;
}
export interface RecipeApi {
furnace_result(input: Id): { output: ItemStack; cook_time: number } | undefined;
fuel_value(item: Id): number; // burn time in ticks, 0 if it isn't fuel
@@ -214,20 +223,39 @@ export type FormResult<T> = ({ canceled: true } & Partial<T>) | ({ canceled: fal
export type SlotFilter = "smeltable" | "fuel" | ((item: ItemStack) => boolean);
export interface ContainerScreenOptions {
title: string;
container: Container;
// x and y in slot units
layout: { slot: number; x: number; y: number; filter?: SlotFilter; output_only?: boolean }[];
player_inventory?: boolean;
bars?: { id: string; x: number; y: number; texture: Id }[];
labels?: { x: number; y: number; property: string }[];
// x and y in slot units, below the player's inventory. can be fractional
layout: {
slot: number;
x: number;
y: number;
// what can be put in, checked on the server
filter?: SlotFilter;
// can only be taken from, all at once, like the furnace result
output_only?: boolean;
}[];
// height of the screen's area in slots, fits the layout and bars when not set
rows?: number;
// progress bars, filled with the property value divided by the property max
bars?: {
x: number;
y: number;
value: string;
max: string;
direction: "up" | "right";
empty_texture: Id;
full_texture: Id;
}[];
}
export interface ScreenHandle<Props = unknown> {
readonly player: Player;
readonly open: boolean;
// numbers the bars show, synced to the player when they change
set_property(id: string, value: number): void;
update(props: Props): void; // custom screens only
close(): void;
// when it closes for any reason: the player closed it, left, opened another screen, or it was closed
on_close(fn: () => void): void;
}