update block.get_field, block.set_field and fields-related docs
This commit is contained in:
parent
e0a4876f3f
commit
87cf6c41bc
@ -168,6 +168,6 @@ Available data types:
|
|||||||
| f64 | 8 bytes | floating-point 64 bits |
|
| f64 | 8 bytes | floating-point 64 bits |
|
||||||
| char | 1 byte | character |
|
| char | 1 byte | character |
|
||||||
|
|
||||||
Currently, the total sum of the field sizes cannot exceed 240 bytes.
|
- Currently, the total sum of the field sizes cannot exceed 240 bytes.
|
||||||
|
- A field without an array length specification is equivalent to an array of 1 element.
|
||||||
A character array can be used to store UTF-8 strings.
|
- A character array can be used to store UTF-8 strings.
|
||||||
|
|||||||
@ -138,6 +138,7 @@ The result will use the destination table instead of creating a new one if the o
|
|||||||
```lua
|
```lua
|
||||||
-- writes a value to the specified block field
|
-- writes a value to the specified block field
|
||||||
-- * throws an exception if the types are incompatible
|
-- * throws an exception if the types are incompatible
|
||||||
|
-- * throws an exception when array is out of bounds
|
||||||
-- * does nothing if the block does not have the field
|
-- * does nothing if the block does not have the field
|
||||||
block.set_field(
|
block.set_field(
|
||||||
x: int, y: int, z: int,
|
x: int, y: int, z: int,
|
||||||
@ -150,6 +151,7 @@ block.set_field(
|
|||||||
-- * returns nil if:
|
-- * returns nil if:
|
||||||
-- 1. the field does not exist
|
-- 1. the field does not exist
|
||||||
-- 2. no writes were made to any block field
|
-- 2. no writes were made to any block field
|
||||||
|
-- * throws an exception when array is out of bounds
|
||||||
block.get_field(
|
block.get_field(
|
||||||
x: int, y: int, z: int,
|
x: int, y: int, z: int,
|
||||||
name: str,
|
name: str,
|
||||||
|
|||||||
@ -171,6 +171,6 @@
|
|||||||
| f64 | 8 байт | вещественный 64 бит |
|
| f64 | 8 байт | вещественный 64 бит |
|
||||||
| char | 1 байт | символьный |
|
| char | 1 байт | символьный |
|
||||||
|
|
||||||
На данный момент общая сумма размеров полей не может превышать 240 байт.
|
- На данный момент общая сумма размеров полей не может превышать 240 байт.
|
||||||
|
- Поле без указания длины массива эквивалентно массиву из 1 элемента.
|
||||||
Массив символьного типа может использоваться для хранения UTF-8 строк.
|
- Массив символьного типа может использоваться для хранения UTF-8 строк.
|
||||||
|
|||||||
@ -165,6 +165,7 @@ block.get_textures(id: int) -> таблица строк
|
|||||||
```lua
|
```lua
|
||||||
-- записывает значение в указанное поле блока
|
-- записывает значение в указанное поле блока
|
||||||
-- * бросает исключение при несовместимости типов
|
-- * бросает исключение при несовместимости типов
|
||||||
|
-- * бросает исключение при выходе за границы массива
|
||||||
-- * ничего не делает при отсутствии поля у блока
|
-- * ничего не делает при отсутствии поля у блока
|
||||||
block.set_field(
|
block.set_field(
|
||||||
x: int, y: int, z: int,
|
x: int, y: int, z: int,
|
||||||
@ -177,6 +178,7 @@ block.set_field(
|
|||||||
-- * возвращает nil если:
|
-- * возвращает nil если:
|
||||||
-- 1. поле не существует
|
-- 1. поле не существует
|
||||||
-- 2. ни в одно поле блока не было произведено записи
|
-- 2. ни в одно поле блока не было произведено записи
|
||||||
|
-- * бросает исключение при выходе за границы массива
|
||||||
block.get_field(
|
block.get_field(
|
||||||
x: int, y: int, z: int,
|
x: int, y: int, z: int,
|
||||||
name: str,
|
name: str,
|
||||||
|
|||||||
@ -372,6 +372,12 @@ void StructLayout::deserialize(const dv::value& src) {
|
|||||||
|
|
||||||
int elements = 1;
|
int elements = 1;
|
||||||
fieldmap.at("length").get(elements);
|
fieldmap.at("length").get(elements);
|
||||||
|
if (elements <= 0) {
|
||||||
|
throw std::runtime_error(
|
||||||
|
"invalid field " + util::quote(name) + " length: " +
|
||||||
|
std::to_string(elements)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
auto convertStrategy = FieldConvertStrategy::RESET;
|
auto convertStrategy = FieldConvertStrategy::RESET;
|
||||||
if (fieldmap.has("convert-strategy")) {
|
if (fieldmap.has("convert-strategy")) {
|
||||||
|
|||||||
@ -489,6 +489,10 @@ static int l_get_field(lua::State* L) {
|
|||||||
if (field == nullptr) {
|
if (field == nullptr) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (index >= field->elements) {
|
||||||
|
throw std::out_of_range(
|
||||||
|
"index out of bounds [0, "+std::to_string(field->elements)+"]");
|
||||||
|
}
|
||||||
const ubyte* src = chunk->blocksMetadata.find(voxelIndex);
|
const ubyte* src = chunk->blocksMetadata.find(voxelIndex);
|
||||||
if (src == nullptr) {
|
if (src == nullptr) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -553,6 +557,10 @@ static int l_set_field(lua::State* L) {
|
|||||||
if (field == nullptr) {
|
if (field == nullptr) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (index >= field->elements) {
|
||||||
|
throw std::out_of_range(
|
||||||
|
"index out of bounds [0, "+std::to_string(field->elements)+"]");
|
||||||
|
}
|
||||||
ubyte* dst = chunk->blocksMetadata.find(voxelIndex);
|
ubyte* dst = chunk->blocksMetadata.find(voxelIndex);
|
||||||
if (dst == nullptr) {
|
if (dst == nullptr) {
|
||||||
dst = chunk->blocksMetadata.allocate(voxelIndex, dataStruct.size());
|
dst = chunk->blocksMetadata.allocate(voxelIndex, dataStruct.size());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user