Browse Source

Add BlockState API

master
TheBrokenRail 10 months ago
parent
commit
17044be8ca
  1. 2
      docs/tutorials/BLOCK.md
  2. 2
      docs/tutorials/BLOCK_ENTITY.md
  3. 4
      docs/tutorials/ITEM.md
  4. 36
      scriptcraft/src/main/c/com_thebrokenrail_scriptcraft_core_quickjs_QuickJSNative.c
  5. 38
      scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/block/CustomBlock.java
  6. 2
      scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/block/CustomBlockWithEntity.java
  7. 5
      scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/BlockBridges.java
  8. 47
      scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/BlockStateBridges.java
  9. 24
      scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/BlockStatePropertyBuilderBridges.java
  10. 1
      scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/Bridges.java
  11. 16
      scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/RegistryBridges.java
  12. 2
      scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/core/quickjs/JSException.java
  13. 3
      scriptcraft/src/main/ts/.vscode/settings.json
  14. 290
      scriptcraft/src/main/ts/src/minecraft/block.ts
  15. 2
      scriptcraft/src/main/ts/src/minecraft/entity.ts
  16. 2
      scriptcraft/src/main/ts/src/minecraft/index.ts
  17. 14
      scriptcraft/src/main/ts/src/minecraft/item.ts
  18. 8
      scriptcraft/src/main/ts/src/minecraft/registry.ts
  19. 2
      scriptcraft/src/main/ts/src/minecraft/tag.ts
  20. 4
      scriptcraft/src/main/ts/src/minecraft/world.ts
  21. 1
      scriptcraft/src/main/ts/types/scriptcraft-core/index.d.ts

2
docs/tutorials/BLOCK.md

@ -48,5 +48,5 @@ Registry.register(Registry.BLOCK, new Identifier('modid', 'my_block'), new MyBlo
```javascript
import { Registry, Identifier, BlockItem, ItemSettings } from 'minecraft';
Registry.register(Registry.ITEM, new Identifier('modid', 'my_block'), new BlockItem(new Identifier('modid', 'my_block'), new ItemSettings().setItemGroup('building_blocks')));
Registry.register(Registry.ITEM, new Identifier('modid', 'my_block'), new BlockItem(new Identifier('modid', 'my_block'), new ItemSettings().itemGroup('building_blocks')));
```

2
docs/tutorials/BLOCK_ENTITY.md

@ -112,5 +112,5 @@ Registry.register(Registry.BLOCK, new Identifier('modid', 'my_block'), new MyBlo
```javascript
import { Registry, Identifier, BlockItem, ItemSettings } from 'minecraft';
Registry.register(Registry.ITEM, new Identifier('modid', 'my_block'), new BlockItem(new Identifier('modid', 'my_block'), new ItemSettings().setItemGroup('building_blocks')));
Registry.register(Registry.ITEM, new Identifier('modid', 'my_block'), new BlockItem(new Identifier('modid', 'my_block'), new ItemSettings().itemGroup('building_blocks')));
```

4
docs/tutorials/ITEM.md

@ -7,7 +7,7 @@ import { ActionResult, ItemSettings, CustomItem } from 'minecraft';
class MyItem extends CustomItem {
constructor() {
super(new ItemSettings().setItemGroup('building_blocks').setMaxCount(16));
super(new ItemSettings().itemGroup('building_blocks').maxCount(16));
}
onUse(world, player, hand) {
@ -33,7 +33,7 @@ import { ActionResult, World, Pos, Hand, PlayerEntity, ItemSettings, CustomItem,
class MyItem extends CustomItem {
constructor() {
super(new ItemSettings().setItemGroup('building_blocks').setMaxCount(18));
super(new ItemSettings().itemGroup('building_blocks').maxCount(18));
}
onUse(world: World, player: PlayerEntity, hand: Hand): ActionResult {

36
scriptcraft/src/main/c/com_thebrokenrail_scriptcraft_core_quickjs_QuickJSNative.c

@ -9,6 +9,14 @@
#include "com_thebrokenrail_scriptcraft_core_quickjs_QuickJSNative.h"
#include "console.h"
#define GET_JAVA_ERROR \
jclass exception_clazz = (*env)->FindClass(env, "com/thebrokenrail/scriptcraft/core/quickjs/JSException"); \
jmethodID err_to_string = (*env)->GetStaticMethodID(env, exception_clazz, "getStackTrace", "(Ljava/lang/Throwable;)Ljava/lang/String;"); \
jstring err_java_string = (jstring) (*env)->CallObjectMethod(env, exception_clazz, err_to_string, err); \
const char *err_str = (*env)->GetStringUTFChars(env, err_java_string, 0);
#define FREE_JAVA_ERROR (*env)->ReleaseStringUTFChars(env, err_java_string, err_str);
typedef struct {
JSContext *ctx;
JSRuntime *rt;
@ -66,13 +74,12 @@ static char *js_module_normalize_name(JSContext *ctx, const char *base_name, con
} else {
jthrowable err = (*env)->ExceptionOccurred(env);
if (err) {
jmethodID to_string = (*env)->GetMethodID(env, (*env)->FindClass(env, "java/lang/Object"), "toString", "()Ljava/lang/String;");
jstring java_string = (jstring) (*env)->CallObjectMethod(env, err, to_string);
const char *str = (*env)->GetStringUTFChars(env, java_string, 0);
GET_JAVA_ERROR;
JS_ThrowReferenceError(ctx, "could not normalize module name '%s': %s", name, err_str);
JS_ThrowReferenceError(ctx, "could not normalize module name '%s': %s", name, str);
FREE_JAVA_ERROR;
(*env)->ReleaseStringUTFChars(env, java_string, str);
(*env)->ExceptionClear(env);
} else {
JS_ThrowReferenceError(ctx, "could not normalize module name '%s'", name);
@ -135,13 +142,12 @@ static char *js_load_file(JSContext *ctx, const char *filename) {
} else {
jthrowable err = (*env)->ExceptionOccurred(env);
if (err) {
jmethodID to_string = (*env)->GetMethodID(env, (*env)->FindClass(env, "java/lang/Object"), "toString", "()Ljava/lang/String;");
jstring java_string = (jstring) (*env)->CallObjectMethod(env, err, to_string);
const char *str = (*env)->GetStringUTFChars(env, java_string, 0);
GET_JAVA_ERROR;
JS_ThrowReferenceError(ctx, "could not load module filename '%s': %s", filename, str);
JS_ThrowReferenceError(ctx, "could not load module filename '%s': %s", filename, err_str);
FREE_JAVA_ERROR;
(*env)->ReleaseStringUTFChars(env, java_string, str);
(*env)->ExceptionClear(env);
} else {
JS_ThrowReferenceError(ctx, "could not load module filename '%s'", filename);
@ -334,14 +340,12 @@ static JSValue js_use_bridge(JSContext *ctx, JSValueConst this_val, int argc, JS
} else {
jthrowable err = (*env)->ExceptionOccurred(env);
if (err) {
jclass exception_clazz = (*env)->FindClass(env, "com/thebrokenrail/scriptcraft/core/quickjs/JSException");
jmethodID to_string = (*env)->GetMethodID(env, exception_clazz, "getStackTrace", "(Ljava/lang/Throwable;)Ljava/lang/String;");
jstring java_string = (jstring) (*env)->CallObjectMethod(env, err, to_string);
const char *str = (*env)->GetStringUTFChars(env, java_string, 0);
GET_JAVA_ERROR;
js_out = JS_ThrowReferenceError(ctx, "unable to use bridge '%s': %s", js_bridge_name, err_str);
js_out = JS_ThrowReferenceError(ctx, "unable to use bridge '%s': %s", js_bridge_name, str);
FREE_JAVA_ERROR;
(*env)->ReleaseStringUTFChars(env, java_string, str);
(*env)->ExceptionClear(env);
} else {
js_out = JS_NULL;

38
scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/block/CustomBlock.java

@ -5,6 +5,8 @@ import com.thebrokenrail.scriptcraft.api.util.ValueUtil;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.Property;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier;
@ -12,17 +14,51 @@ import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("deprecation")
public class CustomBlock extends Block {
public abstract class CustomBlock extends Block {
@SuppressWarnings({"unchecked", "rawtypes"})
public static class BlockStatePropertyBuilder {
private final Map<Property, Comparable> map = new HashMap<>();
public void add(Property<?> property, Comparable defaultValue) {
map.put(property, defaultValue);
}
private void appendProperties(StateManager.Builder<Block, BlockState> builder) {
for (Property property : map.keySet()) {
builder.add(property);
}
}
private BlockState updateDefaultState(BlockState defaultState) {
for (Map.Entry<Property, Comparable> entry : map.entrySet()) {
defaultState = defaultState.with(entry.getKey(), entry.getValue());
}
return defaultState;
}
}
protected final Identifier id;
public CustomBlock(Settings settings, Identifier id) {
super(settings);
this.id = id;
setDefaultState(getPropertyBuilder().updateDefaultState(getDefaultState()));
}
@Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
return ValueUtil.getEnumValue(ActionResult.class, (String) ScriptCraftCore.useBridge("CustomBlock.onUse", id.toString(), world, state, pos.getX(), pos.getY(), pos.getZ(), hit.getSide().name(), player, hand.name()), ActionResult.PASS);
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
super.appendProperties(builder);
getPropertyBuilder().appendProperties(builder);
}
protected abstract BlockStatePropertyBuilder getPropertyBuilder();
}

2
scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/block/CustomBlockWithEntity.java

@ -6,7 +6,7 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.BlockView;
public class CustomBlockWithEntity extends CustomBlock implements BlockEntityProvider {
public abstract class CustomBlockWithEntity extends CustomBlock implements BlockEntityProvider {
public CustomBlockWithEntity(Settings settings, Identifier id) {
super(settings, id);
}

5
scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/BlockBridges.java

@ -2,12 +2,15 @@ package com.thebrokenrail.scriptcraft.api.bridge;
import com.thebrokenrail.scriptcraft.core.ScriptCraftCore;
import net.minecraft.block.Block;
import net.minecraft.block.Material;
import net.minecraft.util.registry.Registry;
class BlockBridges {
static void register() {
ScriptCraftCore.addBridge("Block.getMaterial", args -> ((Block) args[0]).getDefaultState().getMaterial());
ScriptCraftCore.addBridge("Block.getMaterialColor", args -> ((Block) args[0]).getDefaultState().getTopMaterialColor(null, null));
ScriptCraftCore.addBridge("Block.getID", args -> Registry.BLOCK.getId((Block) args[0]).toString());
ScriptCraftCore.addBridge("Block.getDefaultState", args -> ((Block) args[0]).getDefaultState());
ScriptCraftCore.addBridge("Block.isValid", args -> args[0] instanceof Block);
}
}

47
scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/BlockStateBridges.java

@ -2,13 +2,52 @@ package com.thebrokenrail.scriptcraft.api.bridge;
import com.thebrokenrail.scriptcraft.core.ScriptCraftCore;
import net.minecraft.block.BlockState;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.state.property.Property;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@SuppressWarnings({"rawtypes", "unchecked"})
class BlockStateBridges {
static void register() {
ScriptCraftCore.addBridge("BlockState.getDefaultState", args -> Registry.BLOCK.get(new Identifier((String) args[0])).getDefaultState());
ScriptCraftCore.addBridge("BlockState.getBlock", args -> Registry.BLOCK.getId(((BlockState) args[0]).getBlock()).toString());
ScriptCraftCore.addBridge("BlockState.getBlock", args -> ((BlockState) args[0]).getBlock());
ScriptCraftCore.addBridge("BlockState.get", args -> {
BlockState state = (BlockState) args[0];
String name = (String) args[1];
Collection<Property<?>> properties = state.getProperties();
for (Property property : properties) {
if (property.getName().equals(name)) {
return property.name(state.get(property));
}
}
return null;
});
ScriptCraftCore.addBridge("BlockState.with", args -> {
BlockState state = (BlockState) args[0];
String name = (String) args[1];
Comparable value = (Comparable) args[2];
Collection<Property<?>> properties = state.getProperties();
for (Property property : properties) {
if (property.getName().equals(name)) {
if (value instanceof String) {
value = (Comparable) property.parse((String) value).orElse(null);
}
return state.with(property, value);
}
}
return null;
});
ScriptCraftCore.addBridge("BlockState.properties", args -> {
BlockState state = (BlockState) args[0];
List<String> names = new ArrayList<>();
Collection<Property<?>> properties = state.getProperties();
for (Property<?> property : properties) {
names.add(property.getName());
}
return names.toArray();
});
ScriptCraftCore.addBridge("BlockState.isValid", args -> args[0] instanceof BlockState);
}

24
scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/BlockStatePropertyBuilderBridges.java

@ -0,0 +1,24 @@
package com.thebrokenrail.scriptcraft.api.bridge;
import com.thebrokenrail.scriptcraft.api.block.CustomBlock;
import com.thebrokenrail.scriptcraft.api.util.ValueUtil;
import com.thebrokenrail.scriptcraft.core.ScriptCraftCore;
import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.IntProperty;
class BlockStatePropertyBuilderBridges {
static void register() {
ScriptCraftCore.addBridge("BlockStatePropertyBuilder.create", args -> new CustomBlock.BlockStatePropertyBuilder());
ScriptCraftCore.addBridge("BlockStatePropertyBuilder.intProperty", args -> {
((CustomBlock.BlockStatePropertyBuilder) args[0]).add(IntProperty.of((String) args[1], (int) ValueUtil.toDouble(args[2], 0), (int) ValueUtil.toDouble(args[3], 0)), (int) ValueUtil.toDouble(args[4], 0));
return null;
});
ScriptCraftCore.addBridge("BlockStatePropertyBuilder.booleanProperty", args -> {
((CustomBlock.BlockStatePropertyBuilder) args[0]).add(BooleanProperty.of((String) args[1]), (Boolean) args[2]);
return null;
});
ScriptCraftCore.addBridge("BlockStatePropertyBuilder.isValid", args -> args[0] instanceof CustomBlock.BlockStatePropertyBuilder);
}
}

1
scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/Bridges.java

@ -20,5 +20,6 @@ public class Bridges {
MaterialColorBridges.register();
BlockBridges.register();
BuiltinRegistryBridges.register();
BlockStatePropertyBuilderBridges.register();
}
}

16
scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/api/bridge/RegistryBridges.java

@ -15,11 +15,23 @@ import net.minecraft.util.registry.Registry;
class RegistryBridges {
static void register() {
ScriptCraftCore.addBridge("Registry.registerBlock", args -> {
Registry.register(Registry.BLOCK, new Identifier((String) args[0]), new CustomBlock((Block.Settings) args[1], new Identifier((String) args[0])));
CustomBlock.BlockStatePropertyBuilder builder = (CustomBlock.BlockStatePropertyBuilder) args[2];
Registry.register(Registry.BLOCK, new Identifier((String) args[0]), new CustomBlock((Block.Settings) args[1], new Identifier((String) args[0])) {
@Override
protected BlockStatePropertyBuilder getPropertyBuilder() {
return builder;
}
});
return null;
});
ScriptCraftCore.addBridge("Registry.registerBlockWithEntity", args -> {
Registry.register(Registry.BLOCK, new Identifier((String) args[0]), new CustomBlockWithEntity((Block.Settings) args[1], new Identifier((String) args[0])));
CustomBlock.BlockStatePropertyBuilder builder = (CustomBlock.BlockStatePropertyBuilder) args[2];
Registry.register(Registry.BLOCK, new Identifier((String) args[0]), new CustomBlockWithEntity((Block.Settings) args[1], new Identifier((String) args[0])) {
@Override
protected BlockStatePropertyBuilder getPropertyBuilder() {
return builder;
}
});
Registry.register(Registry.BLOCK_ENTITY_TYPE, new Identifier((String) args[0]), BlockEntityType.Builder.create(() -> new CustomBlockEntity(Registry.BLOCK_ENTITY_TYPE.get(new Identifier((String) args[0])), new Identifier((String) args[0])), Registry.BLOCK.get(new Identifier((String) args[0]))).build(null));
return null;
});

2
scriptcraft/src/main/java/com/thebrokenrail/scriptcraft/core/quickjs/JSException.java

@ -9,7 +9,7 @@ public class JSException extends Exception {
}
@SuppressWarnings("unused")
public String getStackTrace(Throwable e) {
public static String getStackTrace(Throwable e) {
StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
return writer.toString();

3
scriptcraft/src/main/ts/.vscode/settings.json

@ -7,5 +7,6 @@
"eslint.format.enable": true,
"editor.insertSpaces": true,
"editor.detectIndentation": false,
"editor.tabSize": 4
"editor.tabSize": 4,
"typescript.tsdk": "./node_modules/typescript/lib"
}

290
scriptcraft/src/main/ts/src/minecraft/block.ts

@ -4,11 +4,12 @@ import { Identifier, Hand, Pos, ActionResult, Direction, SimpleRegistry, JavaObj
import { CompoundTag } from './tag';
import { useBridge, addBridge } from 'scriptcraft-core';
import { Inventory } from './inventory';
import { Registry } from './registry';
/**
* Block Material
*/
class Material extends JavaObjectWrapper {
export class Material extends JavaObjectWrapper {
/**
* Create Material Wrapper From Java Object
* @param javaObject Java Object
@ -24,7 +25,7 @@ class Material extends JavaObjectWrapper {
*/
getColor(): MaterialColor {
const obj = useBridge('Material.getColor', this.getJavaObject()) as JavaObject;
if (obj) {
if (obj !== null) {
return new MaterialColor(obj);
} else {
return null;
@ -35,7 +36,7 @@ class Material extends JavaObjectWrapper {
/**
* Block Material Color
*/
class MaterialColor extends JavaObjectWrapper {
export class MaterialColor extends JavaObjectWrapper {
/**
* Create Material Color Wrapper From Java Object
* @param javaObject Java Object
@ -76,7 +77,7 @@ export class BlockSettings {
* @param hardness Hardness Value
* @param resistance Blast Resistance Value
*/
setStrength(hardness: number, resistance: number): BlockSettings {
strength(hardness: number, resistance: number): BlockSettings {
this.#hardness = hardness;
this.#resistance = resistance;
return this;
@ -86,7 +87,7 @@ export class BlockSettings {
* Set Hardness
* @param hardness Hardness Value
*/
setHardness(hardness: number): BlockSettings {
hardness(hardness: number): BlockSettings {
this.#hardness = hardness;
return this;
}
@ -95,7 +96,7 @@ export class BlockSettings {
* Set Blast Resistance
* @param resistance Blast Resistance Value
*/
setResistance(resistance: number): BlockSettings {
resistance(resistance: number): BlockSettings {
this.#resistance = resistance;
return this;
}
@ -112,7 +113,7 @@ export class BlockSettings {
* Set Material
* @param material Material
*/
setMaterial(material: Material): BlockSettings {
material(material: Material): BlockSettings {
this.#material = material;
return this;
}
@ -121,7 +122,7 @@ export class BlockSettings {
* Set Material Color
* @param materialColor Material Color
*/
setMaterialColor(materialColor: MaterialColor): BlockSettings {
materialColor(materialColor: MaterialColor): BlockSettings {
this.#materialColor = materialColor;
return this;
}
@ -164,6 +165,7 @@ export class BlockSettings {
*/
export class CustomBlock {
readonly #settings: Readonly<BlockSettings>;
readonly #propertyBuilder: BlockStatePropertyBuilder;
/**
* Create Custom Block
@ -171,6 +173,8 @@ export class CustomBlock {
*/
constructor(settings: BlockSettings) {
this.#settings = Object.freeze(settings);
this.#propertyBuilder = BlockStatePropertyBuilder.create();
this.appendProperties(this.getPropertyBuilder());
}
/**
@ -181,6 +185,14 @@ export class CustomBlock {
return this.#settings;
}
/**
* Get Block State Property Builder
* @returns Block State Property Builder
*/
getPropertyBuilder(): BlockStatePropertyBuilder {
return this.#propertyBuilder;
}
/**
* Called When The Block Is Used
* @param world World
@ -194,6 +206,13 @@ export class CustomBlock {
onUse(world: World, blockState: BlockState, pos: Pos, side: Direction, player: PlayerEntity, hand: Hand): ActionResult {
return ActionResult.PASS;
}
/**
* Add Block State Properties
* @param builder Block State Property Builder
*/
appendProperties(builder: BlockStatePropertyBuilder): void {
}
}
/**
@ -266,43 +285,153 @@ export class CustomBlockEntity {
}
}
}
/**
* Get Custom Block Entity by ID
* @param id ID
* @returns Custom Block Entity
*/
static getByID(id: number): CustomBlockEntity {
return BlockRegistry.INSTANCE.getCustomBlockEntityByID(id);
}
}
/**
* Block State
* Block
*/
export class BlockState extends JavaObjectWrapper {
export class Block extends JavaObjectWrapper {
/**
* Create Block State Wrapper From Java Object
* Create Block Wrapper From Java Object
* @param javaObject Java Object
*/
constructor(javaObject: JavaObject | JavaObjectWrapper) {
super(javaObject);
this.assertValidJavaObject('BlockState');
this.assertValidJavaObject('Block');
}
/**
* Get Block Material
*/
getMaterial(): Material {
const obj = useBridge('Block.getMaterial', this.getJavaObject()) as JavaObject;
if (obj !== null) {
return new Material(obj);
} else {
return null;
}
}
/**
* Get Block Material Color
*/
getMaterialColor(): MaterialColor {
const obj = useBridge('Block.getMaterialColor', this.getJavaObject()) as JavaObject;
if (obj !== null) {
return new MaterialColor(obj);
} else {
return null;
}
}
/**
* Get Block ID
* @returns ID
*/
getID(): Identifier {
const obj = useBridge('Block.getID', this.getJavaObject()) as string;
if (obj !== null) {
return new Identifier(obj);
} else {
return null;
}
}
/**
* Get Default Block State for Block
* @param block Block ID
* Get Default Block State
* @returns Default Block State
*/
static getDefaultState(block: Identifier): BlockState {
const obj = useBridge('BlockState.getDefaultState', block.toString()) as JavaObject;
if (obj) {
getDefaultState(): BlockState {
const obj = useBridge('Block.getDefaultState', this.getJavaObject()) as JavaObject;
if (obj !== null) {
return new BlockState(obj);
} else {
return null;
}
}
}
/**
* Custom Block State Property Builder
*/
export class BlockStatePropertyBuilder extends JavaObjectWrapper {
/**
* Create Block State Property Builder Wrapper From Java Object
* @param javaObject Java Object
*/
constructor(javaObject: JavaObject | JavaObjectWrapper) {
super(javaObject);
this.assertValidJavaObject('BlockStatePropertyBuilder');
}
/**
* Create Block State Property Builder
* @returns New Block State Property Builder
*/
static create(): BlockStatePropertyBuilder {
const obj = useBridge('BlockStatePropertyBuilder.create') as JavaObject;
if (obj) {
return new BlockStatePropertyBuilder(obj);
} else {
return null;
}
}
/**
* Add Integer Property
* @param name Property Name
* @param min Minimum Value
* @param max Maximum Value
* @param defaultValue Default Value
*/
intProperty(name: string, min: number, max: number, defaultValue: number): BlockStatePropertyBuilder {
useBridge('BlockStatePropertyBuilder.intProperty', this.getJavaObject(), name, min, max, defaultValue);
return this;
}
/**
* Add Boolean Property
* @param name Property Name
* @param defaultValue Default Value
*/
booleanProperty(name: string, defaultValue: boolean): BlockStatePropertyBuilder {
useBridge('BlockStatePropertyBuilder.booleanProperty', this.getJavaObject(), name, defaultValue);
return this;
}
}
type BlockStatePropertyType = string | number | boolean;
/**
* Block State
*/
export class BlockState extends JavaObjectWrapper {
/**
* Create Block State Wrapper From Java Object
* @param javaObject Java Object
*/
constructor(javaObject: JavaObject | JavaObjectWrapper) {
super(javaObject);
this.assertValidJavaObject('BlockState');
}
/**
* Get Block ID
* @returns Block ID
*/
getBlock(): Identifier {
const obj = useBridge('BlockState.getBlock', this.getJavaObject()) as string;
if (obj) {
return new Identifier(obj);
getBlock(): Block {
const obj = useBridge('BlockState.getBlock', this.getJavaObject()) as JavaObject;
if (obj !== null) {
return new Block(obj);
} else {
return null;
}
@ -314,7 +443,53 @@ export class BlockState extends JavaObjectWrapper {
*/
getCustomBlock(): CustomBlock {
const id = this.getBlock();
return BlockRegistry.INSTANCE.get(id);
return BlockRegistry.INSTANCE.get(id.getID());
}
/**
* Get Block State Property
* @param property Property Name
* @returns Value
*/
get(property: string): BlockStatePropertyType {
return useBridge('BlockState.get', this.getJavaObject(), property) as BlockStatePropertyType;
}
/**
* Get New Block State With Property Set To Value
* @param property Property Name
* @param value Value
* @returns New Block State
*/
with(property: string, value: BlockStatePropertyType): BlockState {
const obj = useBridge('BlockState.with', this.getJavaObject(), property, value) as JavaObject;
if (obj !== null) {
return new BlockState(obj);
} else {
return null;
}
}
/**
* Get All Block State Properties
* @returns All Block State Properties
*/
properties(): string[] {
return useBridge('BlockState.properties', this.getJavaObject()) as string[];
}
/**
* Convert To String
* @returns String
*/
toString(): string {
const start = this.getBlock().getID().toString();
const properties = this.properties();
const parts: string[] = [];
for (const property of properties) {
parts.push(property + ' = ' + this.get(property).toString());
}
return start + '[' + parts.join(', ') + ']';
}
}
@ -378,49 +553,8 @@ export class CustomBlockWithEntity extends CustomBlock {
}
}
/**
* Built-In Block
*/
export class Block extends JavaObjectWrapper {
/**
* Create Built-In Block Wrapper From Java Object
* @param javaObject Java Object
*/
constructor(javaObject: JavaObject | JavaObjectWrapper) {
super(javaObject);
this.assertValidJavaObject('Block');
}
/**
* Get Block Material
*/
getMaterial(): Material {
const obj = useBridge('Block.getMaterial', this.getJavaObject()) as JavaObject;
if (obj) {
return new Material(obj);
} else {
return null;
}
}
/**
* Get Block MaterialColor
*/
getMaterialColor(): MaterialColor {
const obj = useBridge('Block.getMaterialColor', this.getJavaObject()) as JavaObject;
if (obj) {
return new MaterialColor(obj);
} else {
return null;
}
}
}
/**
* @internal
*/
export class BlockRegistry implements SimpleRegistry<CustomBlock> {
static readonly INSTANCE = new BlockRegistry();
class BlockRegistry implements SimpleRegistry<CustomBlock> {
static INSTANCE = new BlockRegistry();
readonly #blocks: Map<string, CustomBlock>;
@ -433,11 +567,7 @@ export class BlockRegistry implements SimpleRegistry<CustomBlock> {
register(id: Identifier, obj: CustomBlock): void {
this.#blocks.set(id.toString(), obj);
if (obj instanceof CustomBlockWithEntity) {
useBridge('Registry.registerBlockWithEntity', id.toString(), obj.getSettings().createJavaObject());
} else {
useBridge('Registry.registerBlock', id.toString(), obj.getSettings().createJavaObject());
}
useBridge(obj instanceof CustomBlockWithEntity ? 'Registry.registerBlockWithEntity' : 'Registry.registerBlock', id.toString(), obj.getSettings().createJavaObject(), obj.getPropertyBuilder().getJavaObject());
}
get(id: Identifier): CustomBlock {
@ -453,12 +583,8 @@ export class BlockRegistry implements SimpleRegistry<CustomBlock> {
return null;
}
getCustomBlockEntity(i: number): CustomBlockEntity {
return this.#blockEntities[i];
}
getCustomBlockEntities(): CustomBlockEntity[] {
return this.#blockEntities;
getCustomBlockEntityByID(id: number): CustomBlockEntity {
return this.#blockEntities[id];
}
createCustomBlockEntity(id: Identifier, i: number): void {
@ -471,24 +597,26 @@ export class BlockRegistry implements SimpleRegistry<CustomBlock> {
}
}
Registry.BLOCK = BlockRegistry.INSTANCE;
addBridge('CustomBlockEntity.create', (id: string, i: number) => {
BlockRegistry.INSTANCE.createCustomBlockEntity(new Identifier(id), i);
});
addBridge('CustomBlockEntity.fromTag', (i: number, tag: JavaObject) => {
BlockRegistry.INSTANCE.getCustomBlockEntity(i).fromTag(new CompoundTag(tag));
BlockRegistry.INSTANCE.getCustomBlockEntityByID(i).fromTag(new CompoundTag(tag));
});
addBridge('CustomBlockEntity.toTag', (i: number, tag: JavaObject): JavaObject => {
return BlockRegistry.INSTANCE.getCustomBlockEntity(i).toTag(new CompoundTag(tag)).getJavaObject();
return BlockRegistry.INSTANCE.getCustomBlockEntityByID(i).toTag(new CompoundTag(tag)).getJavaObject();
});
addBridge('CustomBlockEntity.tick', (i: number) => {
BlockRegistry.INSTANCE.getCustomBlockEntity(i).tick();
BlockRegistry.INSTANCE.getCustomBlockEntityByID(i).tick();
});
addBridge('CustomBlockEntity.setLocation', (i: number, world: JavaObject, x: number, y: number, z: number) => {
BlockRegistry.INSTANCE.getCustomBlockEntity(i).setLocation(new World(world), new Pos(x, y, z));
BlockRegistry.INSTANCE.getCustomBlockEntityByID(i).setLocation(new World(world), new Pos(x, y, z));
});
addBridge('CustomBlockEntity.free', (i: number) => {
@ -510,7 +638,7 @@ export class BlockBuiltinRegistry implements SimpleBuiltinRegistry<Block> {
get(id: Identifier): Block {
const obj = useBridge('BuiltinRegistry.getBlock', id.toString()) as JavaObject;
if (obj) {
if (obj !== null) {
return new Block(obj);
} else {
return null;

2
scriptcraft/src/main/ts/src/minecraft/entity.ts

@ -242,7 +242,7 @@ export class LivingEntity extends Entity {
*/
getStackInHand(hand: Hand): ItemStack {
const obj = useBridge('LivingEntity.getStackInHand', this.getJavaObject(), hand.toString()) as JavaObject;
if (obj) {
if (obj !== null) {
return new ItemStack(obj);
} else {
return null;

2
scriptcraft/src/main/ts/src/minecraft/index.ts

@ -9,7 +9,7 @@
*/
export { Identifier, ActionResult, Hand, Pos, Direction, DirectionUtil } from './core';
export { CustomBlock, CustomBlockEntity, CustomBlockWithEntity, BlockSettings, BlockState, BlockEntity } from './block';
export { CustomBlock, CustomBlockEntity, CustomBlockWithEntity, BlockSettings, BlockState, Block, Material, MaterialColor } from './block';
export { ItemStack, ItemSettings, CustomItem, BlockItem, ItemRarity } from './item';
export { World } from './world';
export { LivingEntity, PlayerEntity } from './entity';

14
scriptcraft/src/main/ts/src/minecraft/item.ts

@ -3,6 +3,7 @@ import { World } from './world';
import { PlayerEntity, LivingEntity } from './entity';
import { CompoundTag } from './tag';
import { useBridge, addBridge } from 'scriptcraft-core';
import { Registry } from './registry';
/**
* Item Stack
@ -185,7 +186,7 @@ export class ItemSettings {
* Set Max Count
* @param maxCount Max Count
*/
setMaxCount(maxCount: number): ItemSettings {
maxCount(maxCount: number): ItemSettings {
this.#maxCount = maxCount;
return this;
}
@ -194,7 +195,7 @@ export class ItemSettings {
* Set Item Group
* @param itemGroup Item Group
*/
setItemGroup(itemGroup: string | Identifier): ItemSettings {
itemGroup(itemGroup: string | Identifier): ItemSettings {
this.#itemGroup = itemGroup.toString();
return this;
}
@ -203,7 +204,7 @@ export class ItemSettings {
* Set Item Rarity
* @param rarity Item Rarity
*/
setRarity(rarity: ItemRarity): ItemSettings {
rarity(rarity: ItemRarity): ItemSettings {
this.#rarity = rarity;
return this;
}
@ -310,10 +311,7 @@ export class BlockItem {
}
}
/**
* @internal
*/
export class ItemRegistry implements SimpleRegistry<CustomItem | BlockItem> {
class ItemRegistry implements SimpleRegistry<CustomItem | BlockItem> {
static readonly INSTANCE = new ItemRegistry();
readonly #items: Map<string, CustomItem>;
@ -345,6 +343,8 @@ export class ItemRegistry implements SimpleRegistry<CustomItem | BlockItem> {
}
}
Registry.ITEM = ItemRegistry.INSTANCE;
addBridge('CustomItem.onUse', (id: string, world: JavaObject, player: JavaObject, hand: keyof typeof Hand): string => {
return ItemRegistry.INSTANCE.get(new Identifier(id)).onUse(new World(world), new PlayerEntity(player), Hand[hand]);
});

8
scriptcraft/src/main/ts/src/minecraft/registry.ts

@ -1,6 +1,6 @@
import { Identifier, SimpleRegistry } from './core';
import { BlockRegistry, CustomBlock } from './block';
import { ItemRegistry, CustomItem, BlockItem } from './item';
import { CustomBlock } from './block';
import { CustomItem, BlockItem } from './item';
/**
* Registry
@ -9,11 +9,11 @@ export abstract class Registry {
/**
* Block Registry
*/
static BLOCK: SimpleRegistry<CustomBlock> = BlockRegistry.INSTANCE;
static BLOCK: SimpleRegistry<CustomBlock>;
/**
* Item Registry
*/
static ITEM: SimpleRegistry<CustomItem | BlockItem> = ItemRegistry.INSTANCE;
static ITEM: SimpleRegistry<CustomItem | BlockItem>;
/**
* Register Object

2
scriptcraft/src/main/ts/src/minecraft/tag.ts

@ -3,7 +3,7 @@ import { JavaObjectWrapper } from './core';
type TagType = number | boolean | string | CompoundTag | ListTag;
function getTagValue(obj: [boolean, BridgeValueType]): Exclude<TagType, boolean> {
function getTagValue(obj: [isList: boolean, value: BridgeValueType]): Exclude<TagType, boolean> {
if (typeof obj[1] === 'object') {
if (obj[0]) {
return new ListTag(obj[1] as JavaObject);

4
scriptcraft/src/main/ts/src/minecraft/world.ts

@ -1,4 +1,4 @@
import { BlockState, CustomBlockEntity, BlockRegistry, BlockEntity } from './block';
import { BlockState, CustomBlockEntity, BlockEntity } from './block';
import { Entity } from './entity';
import { Pos, Identifier, JavaObjectWrapper } from './core';
import { useBridge } from 'scriptcraft-core';
@ -62,7 +62,7 @@ export class World extends JavaObjectWrapper {
getCustomBlockEntity(pos: Pos): CustomBlockEntity {
const obj = useBridge('World.getCustomBlockEntity', this.getJavaObject(), pos.getX(), pos.getY(), pos.getZ()) as number;
if (obj !== null) {
return BlockRegistry.INSTANCE.getCustomBlockEntity(obj);
return CustomBlockEntity.getByID(obj);
} else {
return null;
}

1
scriptcraft/src/main/ts/types/scriptcraft-core/index.d.ts

@ -20,6 +20,7 @@ interface Console {
declare const console: Console;
interface String {
// eslint-disable-next-line @typescript-eslint/naming-convention
__quote(): string;
}

Loading…
Cancel
Save