Improve Manipulating Tag Number Types
ScriptCraft/pipeline/head This commit looks good Details

This commit is contained in:
TheBrokenRail 2020-04-27 14:01:23 -04:00
parent 9e9710653f
commit 80559457f5
4 changed files with 61 additions and 12 deletions

View File

@ -6,9 +6,16 @@ import net.minecraft.nbt.AbstractNumberTag;
import net.minecraft.nbt.ByteTag;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.DoubleTag;
import net.minecraft.nbt.FloatTag;
import net.minecraft.nbt.IntTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.LongTag;
import net.minecraft.nbt.ShortTag;
import net.minecraft.nbt.StringTag;
import net.minecraft.nbt.Tag;
import net.minecraft.util.math.MathHelper;
import java.util.Locale;
@SuppressWarnings({"rawtypes", "unchecked"})
class TagBridges {
@ -18,7 +25,7 @@ class TagBridges {
if (obj instanceof StringTag) {
out[1] = obj.asString();
} else if (obj instanceof AbstractNumberTag) {
out[1] = ((AbstractNumberTag) obj).getNumber().doubleValue();
out[1] = ((AbstractNumberTag) obj).getDouble();
} else if (obj instanceof AbstractListTag) {
out[0] = true;
out[1] = obj;
@ -28,13 +35,37 @@ class TagBridges {
return out;
}
private static Tag toTag(Object obj) {
private static Tag toTag(Object obj, String numberType) {
if (obj instanceof Tag) {
return (Tag) obj;
} else if (obj instanceof Boolean) {
return ByteTag.of((Boolean) obj);
} else if (obj instanceof Double) {
return DoubleTag.of((Double) obj);
double value = (Double) obj;
numberType = numberType.toUpperCase(Locale.ROOT);
switch (numberType.toUpperCase(Locale.ROOT)) {
case "INT": {
return IntTag.of(MathHelper.floor(value));
}
case "BYTE": {
return ByteTag.of((byte) (MathHelper.floor(value) & 255));
}
case "DOUBLE": {
return DoubleTag.of(value);
}
case "LONG": {
return LongTag.of((long) Math.floor(value));
}
case "FLOAT": {
return FloatTag.of((float) value);
}
case "SHORT": {
return ShortTag.of((short) (MathHelper.floor(value) & '\uffff'));
}
default: {
throw new RuntimeException("Invalid Number Type: " + numberType);
}
}
} else if (obj instanceof String) {
return StringTag.of((String) obj);
} else {
@ -50,7 +81,7 @@ class TagBridges {
});
Bridges.addBridge("CompoundTag.set", args -> {
CompoundTag tag = (CompoundTag) args[0];
tag.put((String) args[1], toTag(args[2]));
tag.put((String) args[1], toTag(args[2], (String) args[3]));
return null;
});
Bridges.addBridge("CompoundTag.keys", args -> {
@ -65,7 +96,7 @@ class TagBridges {
});
Bridges.addBridge("ListTag.set", args -> {
AbstractListTag tag = (AbstractListTag) args[0];
tag.set((int) Util.toDouble(args[1], 0), toTag(args[2]));
tag.set((int) Util.toDouble(args[1], 0), toTag(args[2], (String) args[3]));
return null;
});
Bridges.addBridge("ListTag.size", args -> {

View File

@ -3,5 +3,5 @@ export { CustomBlock, CustomBlockEntity, CustomBlockWithEntity, BlockSettings, B
export { ItemStack, ItemSettings, CustomItem, BlockItem } from './item';
export { World } from './world';
export { LivingEntity, PlayerEntity } from './entity';
export { CompoundTag, ListTag } from './tag';
export { CompoundTag, ListTag, NumberType } from './tag';
export { Registry } from './registry';

View File

@ -19,6 +19,18 @@ function getTagValue(obj: [boolean, BridgeValueType]): TagType {
}
}
/**
* Number Types
*/
export enum NumberType {
INT = 'INT',
BYTE = 'BYTE',
DOUBLE = 'DOUBLE',
LONG = 'LONG',
FLOAT = 'FLOAT',
SHORT = 'SHORT'
}
/**
* Compound Tag
*/
@ -49,9 +61,12 @@ export class CompoundTag {
* Set Value In Tag
* @param key Key
* @param value Value
* @param numberType Number Type
*/
set(key: string, value: TagType) {
useBridge('CompoundTag.set', this.javaObject, key, (value instanceof CompoundTag || value instanceof ListTag) ? value.javaObject : value);
set(key: string, value: number, numberType: NumberType): void;
set(key: string, value: Exclude<TagType, number>): void;
set(key: string, value: TagType, numberType?: NumberType) {
useBridge('CompoundTag.set', this.javaObject, key, (value instanceof CompoundTag || value instanceof ListTag) ? value.javaObject : value, numberType);
}
/**
@ -106,9 +121,12 @@ export class ListTag {
* Set Value In Tag
* @param key Key
* @param value Value
* @param numberType Number Type
*/
set(key: number, value: TagType) {
useBridge('ListTag.set', this.javaObject, key, (value instanceof CompoundTag || value instanceof ListTag) ? value.javaObject : value);
set(key: number, value: number, numberType: NumberType): void;
set(key: number, value: Exclude<TagType, number>): void;
set(key: number, value: TagType, numberType?: NumberType) {
useBridge('ListTag.set', this.javaObject, key, (value instanceof CompoundTag || value instanceof ListTag) ? value.javaObject : value, numberType);
}
/**

View File

@ -1,4 +1,4 @@
import { BlockSettings, Identifier, Registry, BlockState, ActionResult, World, Pos, Hand, PlayerEntity, BlockItem, ItemSettings, CustomItem, Direction, LivingEntity, CustomBlockWithEntity, CustomBlockEntity, CompoundTag } from 'minecraft';
import { BlockSettings, Identifier, Registry, BlockState, ActionResult, World, Pos, Hand, PlayerEntity, BlockItem, ItemSettings, CustomItem, Direction, LivingEntity, CustomBlockWithEntity, CustomBlockEntity, CompoundTag, NumberType } from 'minecraft';
console.log('hello');
@ -6,7 +6,7 @@ class MyBlockEntity extends CustomBlockEntity {
ticks: number;
toTag(tag: CompoundTag): CompoundTag {
tag.set('MyTicks', this.ticks);
tag.set('MyTicks', this.ticks, NumberType.INT);
return tag;
}