diff --git a/src/datatypes/conditional.js b/src/datatypes/conditional.js new file mode 100644 index 0000000..766cae9 --- /dev/null +++ b/src/datatypes/conditional.js @@ -0,0 +1,26 @@ +var evalCondition= require("../utils").evalCondition; + +module.exports= { + 'condition': [readCondition, writeCondition, sizeOfCondition] +}; + +function readCondition(buffer,offset,typeArgs, rootNode) +{ + if(!evalCondition(typeArgs,rootNode)) + return { value: null, size: 0 }; + return this.read(buffer, offset, { type: typeArgs.type, typeArgs:typeArgs.typeArgs }, rootNode); +} + +function writeCondition(value, buffer, offset, typeArgs, rootNode) { + if(!evalCondition(typeArgs,rootNode)) + return offset; + + return this.write(value, buffer, offset, { type: typeArgs.type, typeArgs:typeArgs.typeArgs }, rootNode); +} + +function sizeOfCondition(value, fieldInfo, rootNode) { + if(!evalCondition(fieldInfo,rootNode)) + return 0; + + return this.sizeOf(value,fieldInfo, rootNode); +} diff --git a/src/protocol.js b/src/protocol.js index 2d11748..652147d 100644 --- a/src/protocol.js +++ b/src/protocol.js @@ -2,7 +2,7 @@ var assert = require('assert'); var util = require('util'); var zlib = require('zlib'); -var getField= require("./utils").getField; +var evalCondition= require("./utils").evalCondition; var STRING_MAX_LENGTH = 240; @@ -54,6 +54,7 @@ var numeric=require("./datatypes/numeric"); var utils=require("./datatypes/utils"); var minecraft=require("./datatypes/minecraft"); var structures=require("./datatypes/structures"); +var conditional=require("./datatypes/conditional"); var types = { 'byte': numeric.byte, @@ -72,7 +73,7 @@ var types = { 'array':structures.array, 'buffer': utils.buffer, 'count': structures.count, - 'condition': [readCondition, writeCondition, sizeOfCondition], + 'condition': conditional.condition, // TODO : remove type-specific, replace with generic containers and arrays. 'restBuffer': minecraft.restBuffer, 'UUID': minecraft.UUID, @@ -124,38 +125,6 @@ for (var n in entityMetadataTypes) { entityMetadataTypeBytes[entityMetadataTypes[n].type] = n; } -function readCondition(buffer,offset,typeArgs, rootNode) -{ - if(!evalCondition(typeArgs,rootNode)) - return { value: null, size: 0 }; - return proto.read(buffer, offset, { type: typeArgs.type, typeArgs:typeArgs.typeArgs }, rootNode); -} - -function writeCondition(value, buffer, offset, typeArgs, rootNode) { - if(!evalCondition(typeArgs,rootNode)) - return offset; - - return proto.write(value, buffer, offset, { type: typeArgs.type, typeArgs:typeArgs.typeArgs }, rootNode); -} - -function sizeOfCondition(value, fieldInfo, rootNode) { - if(!evalCondition(fieldInfo,rootNode)) - return 0; - - return proto.sizeOf(value,fieldInfo, rootNode); -} - - -function evalCondition(condition,field_values) -{ - var field_value_to_test="this" in condition && condition["this"] ? field_values["this"][condition.field] : field_values[condition.field]; - var b=condition.values.some(function(value) {return field_value_to_test===value;}); - if("different" in condition && condition["different"]) - return !b; - else - return b; -} - function readEntityMetadata(buffer, offset) { var cursor = offset; diff --git a/src/utils.js b/src/utils.js index f92ef5a..1f0a5f4 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,4 +1,7 @@ -module.exports= {getField:getField}; +module.exports={ + getField:getField, + evalCondition:evalCondition +}; function getField(countField, rootNode) { var countFieldArr = countField.split("."); @@ -8,3 +11,14 @@ function getField(countField, rootNode) { } return count; } + + +function evalCondition(condition,field_values) +{ + var field_value_to_test="this" in condition && condition["this"] ? field_values["this"][condition.field] : field_values[condition.field]; + var b=condition.values.some(function(value) {return field_value_to_test===value;}); + if("different" in condition && condition["different"]) + return !b; + else + return b; +}