1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-06-06 17:44:33 +00:00

Modloader custom items fix (#1369)

* Added item register and resolver for savegames

* Changed new item type example to register

* Fixed typings
This commit is contained in:
Thomas (DJ1TJOO) 2022-02-03 20:03:02 +01:00 committed by GitHub
parent edd57b3956
commit 8e38ef0708
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 34 additions and 15 deletions

View File

@ -120,11 +120,10 @@ class Mod extends shapez.Mod {
this.modInterface.registerSprite("sprites/fluids/water.png", RESOURCES["water.png"]); this.modInterface.registerSprite("sprites/fluids/water.png", RESOURCES["water.png"]);
// Make the item spawn on the map // Make the item spawn on the map
this.modInterface.runAfterMethod(shapez.MapChunk, "generatePatches", function ({ this.modInterface.runAfterMethod(
rng, shapez.MapChunk,
chunkCenter, "generatePatches",
distanceToOriginInChunks, function ({ rng, chunkCenter, distanceToOriginInChunks }) {
}) {
// Generate a simple patch // Generate a simple patch
// ALWAYS use rng and NEVER use Math.random() otherwise the map will look different // ALWAYS use rng and NEVER use Math.random() otherwise the map will look different
// every time you resume the game // every time you resume the game
@ -132,7 +131,10 @@ class Mod extends shapez.Mod {
const fluidType = rng.choice(Array.from(Object.keys(enumFluidType))); const fluidType = rng.choice(Array.from(Object.keys(enumFluidType)));
this.internalGeneratePatch(rng, 4, FLUID_ITEM_SINGLETONS[fluidType]); this.internalGeneratePatch(rng, 4, FLUID_ITEM_SINGLETONS[fluidType]);
} }
}); }
);
this.modInterface.registerItem(FluidItem, itemData => FLUID_ITEM_SINGLETONS[itemData]);
} }
} }

View File

@ -15,7 +15,7 @@ export class BaseItem extends BasicSerializableObject {
return "base_item"; return "base_item";
} }
/** @returns {object} */ /** @returns {import("../savegame/serialization").Schema} */
static getSchema() { static getSchema() {
return {}; return {};
} }

View File

@ -4,6 +4,8 @@ import { BooleanItem, BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON } from "./items/
import { ShapeItem } from "./items/shape_item"; import { ShapeItem } from "./items/shape_item";
import { ColorItem, COLOR_ITEM_SINGLETONS } from "./items/color_item"; import { ColorItem, COLOR_ITEM_SINGLETONS } from "./items/color_item";
export const MODS_ADDITIONAL_ITEMS = {};
/** /**
* Resolves items so we share instances * Resolves items so we share instances
* @param {import("../savegame/savegame_serializer").GameRoot} root * @param {import("../savegame/savegame_serializer").GameRoot} root
@ -13,6 +15,10 @@ export function itemResolverSingleton(root, data) {
const itemType = data.$; const itemType = data.$;
const itemData = data.data; const itemData = data.data;
if (MODS_ADDITIONAL_ITEMS[itemType]) {
return MODS_ADDITIONAL_ITEMS[itemType](itemData);
}
switch (itemType) { switch (itemType) {
case BooleanItem.getId(): { case BooleanItem.getId(): {
return itemData ? BOOL_TRUE_SINGLETON : BOOL_FALSE_SINGLETON; return itemData ? BOOL_TRUE_SINGLETON : BOOL_FALSE_SINGLETON;

View File

@ -17,7 +17,7 @@ import { Loader } from "../core/loader";
import { LANGUAGES } from "../languages"; import { LANGUAGES } from "../languages";
import { matchDataRecursive, T } from "../translations"; import { matchDataRecursive, T } from "../translations";
import { gBuildingVariants, registerBuildingVariant } from "../game/building_codes"; import { gBuildingVariants, registerBuildingVariant } from "../game/building_codes";
import { gComponentRegistry, gMetaBuildingRegistry } from "../core/global_registries"; import { gComponentRegistry, gItemRegistry, gMetaBuildingRegistry } from "../core/global_registries";
import { MODS_ADDITIONAL_SHAPE_MAP_WEIGHTS } from "../game/map_chunk"; import { MODS_ADDITIONAL_SHAPE_MAP_WEIGHTS } from "../game/map_chunk";
import { MODS_ADDITIONAL_SYSTEMS } from "../game/game_system_manager"; import { MODS_ADDITIONAL_SYSTEMS } from "../game/game_system_manager";
import { MOD_CHUNK_DRAW_HOOKS } from "../game/map_chunk_view"; import { MOD_CHUNK_DRAW_HOOKS } from "../game/map_chunk_view";
@ -28,6 +28,8 @@ import { ModMetaBuilding } from "./mod_meta_building";
import { BaseHUDPart } from "../game/hud/base_hud_part"; import { BaseHUDPart } from "../game/hud/base_hud_part";
import { Vector } from "../core/vector"; import { Vector } from "../core/vector";
import { GameRoot } from "../game/root"; import { GameRoot } from "../game/root";
import { BaseItem } from "../game/base_item";
import { MODS_ADDITIONAL_ITEMS } from "../game/item_resolver";
/** /**
* @typedef {{new(...args: any[]): any, prototype: any}} constructable * @typedef {{new(...args: any[]): any, prototype: any}} constructable
@ -190,6 +192,15 @@ export class ModInterface {
} }
} }
/**
* @param {typeof BaseItem} item
* @param {(itemData: any) => BaseItem} resolver
*/
registerItem(item, resolver) {
gItemRegistry.register(item);
MODS_ADDITIONAL_ITEMS[item.getId()] = resolver;
}
/** /**
* *
* @param {typeof Component} component * @param {typeof Component} component

View File

@ -192,7 +192,7 @@ export class BasicSerializableObject {
return schema; return schema;
} }
/** @returns {object} */ /** @returns {object | string | number} */
serialize() { serialize() {
return serializeSchema( return serializeSchema(
this, this,