From 877ede063d822872bd94520d64541d0f8feb7e6b Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Wed, 13 May 2015 04:02:46 +0200 Subject: [PATCH] move condition type to conditional.js --- src/datatypes/conditional.js | 26 +++++++++++++++++++++++++ src/protocol.js | 37 +++--------------------------------- src/utils.js | 16 +++++++++++++++- 3 files changed, 44 insertions(+), 35 deletions(-) create mode 100644 src/datatypes/conditional.js 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; +}