HexJSNeo
Provides a way to create custom contents for Hex Casting via KubeJS.
Features
Core Concepts
- Minimal efforts: auto registered great pattern tags, omit all optional args, pipe everything, …
- Weak typed:
ActionJSreturns,ActionRegistryJS.of, etc. - Mutable is best: no registration event and phase limit, writing and reloading everywhere in startup scripts, we're writing JS \yay/
- Clean global scope: everything under a single
HexJSglobal object, no leaks
Game Content Registry
ActionJS: basis for all executables- customizable
operate&operateInParens, with high degree-of-freedom return value handling - additional helper methods for creating
operatevarieties - assigning
mediaCostto auto-attach media-cost side effect on operate, withpreCheckMediamethods to help check & mishap before logics
- customizable
ActionRegistryJS: registering certain patterns with actions- = Registry ID + Pattern prototype + inner
ActionJS+ Great-pattern marker (default false) - weak-typed constructor
ActionRegistryJS.of(...): args in any order among its constructor, missing ones auto-filled (id from pattern signature, freshActionJS,false); only the pattern is required - transparent proxy of inner
ActionJS: operate setters (setOperate& variants),mediaCostandpreCheckMediaare callable directly on the registry object - great spells are auto-tagged with per-world / enlightenment tags
- = Registry ID + Pattern prototype + inner
SpecialHandlerJS: taking an arbitrary pattern and retrieving its meanings- registers a JS
tryMatch(pattern, env)factory consulted for every drawn pattern SpecialHandlerJS.create(action, name)to help build aSpecialHandler, in whichactioncould be another specially createdActionJS- chain setter
setTryMatchfor KJS-ish usage
- registers a JS
IotaJS: highly customizable iota types- NBT-backed custom iotas:
IotaJS.type(id)creates the type, containingCompoundTagiota data - overriding common iota interfaces (display, color, size, etc.) with either callbacks or constants
- optional executability via
setOperate, controlling its execution behaviors outside and inside parens
- NBT-backed custom iotas:
ArgsJS: basically a forwarder for various built-in Kotlin extension functions- used on a mutable iota list manually, or called from
ActionJS.setOperateArgsSplit - typed getters (
double,vec3,entity, …) with auto mishaps on missing args or wrong types
- used on a mutable iota list manually, or called from
CastingEnvironmentComponentJS: vanilla but in JS, with more convenient Key creation- each component takes a key string as the first constructor arg, from which the
Keyis auto-created & cached (setKeyto change it later) - usages and types same as vanilla
- each component takes a key string as the first constructor arg, from which the
MishapJS: highly customizable mishap types- declaring the type using
MishapJS.type()first, quite similar toIotaJS - calling
type.create()ortype.create(data)for a mishap of this type - KJS-ish piped methods to override all behaviors of created mishaps
- declaring the type using
QoL Features
- Hot-swap everything
- everything, simple as
/kjs reload startup-scripts - covers: actions (entry action & prototype replaced in-place), special handlers, iota types
- not for those haven't created on startup, but it's possible to match later-created pattern actions using a special handler :3
- everything, simple as
- API & packages importer:
HexJS.API&HexJS.APIFlat- exposes all Hex Casting classes scanned from the mod jar, either nested by package (
HexJS.API.<...package>.<Class>) or flat (HexJS.APIFlat)
- exposes all Hex Casting classes scanned from the mod jar, either nested by package (
ProbeJS Typing Support
- generates typings for the JS-facing API, including nested
HexJS.APIlevels, fake-singleton classes flattened to static fields, and subclass members assigned onto their parents

