Browse Source

added @:condSend, added getPropName

ncannasse 9 years ago
parent
commit
5825b247a6
3 changed files with 80 additions and 25 deletions
  1. 68 22
      hxd/net/Macros.hx
  2. 11 3
      hxd/net/NetworkHost.hx
  3. 1 0
      hxd/net/NetworkSerializable.hx

+ 68 - 22
hxd/net/Macros.hx

@@ -51,6 +51,7 @@ typedef PropType = {
 	@:optional var isProxy : Bool;
 	@:optional var isProxy : Bool;
 	@:optional var isNull : Bool;
 	@:optional var isNull : Bool;
 	@:optional var increment : Float;
 	@:optional var increment : Float;
+	@:optional var condSend : Expr;
 }
 }
 
 
 class Macros {
 class Macros {
@@ -97,22 +98,30 @@ class Macros {
 		var t = getPropType(ft);
 		var t = getPropType(ft);
 		if( t == null )
 		if( t == null )
 			return null;
 			return null;
-		var mincr = Lambda.find(meta, function(m) return m.name == ":increment");
-		if( mincr != null ) {
-			var inc : Null<Float> = null;
-			if( mincr.params.length == 1 )
-				switch( mincr.params[0].expr ) {
-				case EConst(CInt(i)): inc = Std.parseInt(i);
-				case EConst(CFloat(f)): inc = Std.parseFloat(f);
+		for( m in meta) {
+			switch( m.name ) {
+			case ":s", ":optional":
+				//
+			case ":increment":
+				var inc : Null<Float> = null;
+				if( m.params.length == 1 )
+					switch( m.params[0].expr ) {
+					case EConst(CInt(i)): inc = Std.parseInt(i);
+					case EConst(CFloat(f)): inc = Std.parseFloat(f);
+					default:
+					}
+				if( inc == null )
+					Context.error("Increment requires value parameter", m.pos);
+				switch( t.d ) {
+				case PFloat:
+					t.increment = inc;
 				default:
 				default:
+					Context.error("Increment not allowed on " + t.t.toString(), m.pos);
 				}
 				}
-			if( inc == null )
-				Context.error("Increment requires value parameter", mincr.pos);
-			switch( t.d ) {
-			case PFloat:
-				t.increment = inc;
+			case ":condSend" if( m.params.length == 1 ):
+				t.condSend = m.params[0];
 			default:
 			default:
-				Context.error("Increment not allowed on " + t.t.toString(), mincr.pos);
+				Context.error("Unsupported network metadata", m.pos);
 			}
 			}
 		}
 		}
 		return t;
 		return t;
@@ -844,10 +853,10 @@ class Macros {
 				}).fields);
 				}).fields);
 		}
 		}
 
 
+		var firstFID = 0;
 		var flushExpr = [];
 		var flushExpr = [];
 		var syncExpr = [];
 		var syncExpr = [];
 		var noComplete : Metadata = [ { name : ":noCompletion", pos : pos } ];
 		var noComplete : Metadata = [ { name : ":noCompletion", pos : pos } ];
-
 		for( f in toSerialize ) {
 		for( f in toSerialize ) {
 			var pos = f.f.pos;
 			var pos = f.f.pos;
 			var fname = f.f.name;
 			var fname = f.f.name;
@@ -1117,6 +1126,28 @@ class Macros {
 		}
 		}
 
 
 
 
+		if( toSerialize.length != 0 || rpc.length != 0 || !isSubSer ) {
+			var cases = [];
+			for( i in 0...toSerialize.length )
+				cases.push( { id : i + firstFID, name : toSerialize[i].f.name } );
+			for( i in 0...rpc.length )
+				cases.push( { id : i + startFID + firstRPCID, name : rpc[i].f.name.substr(0,-6) } );
+			var ecases = [for( c in cases ) { values : [ { expr : EConst(CInt("" + c.id)), pos : pos } ], expr : { expr : EConst(CString(c.name)), pos : pos }, guard : null } ];
+			var swExpr = { expr : EReturn( { expr : ESwitch(macro isRPC ? id + $v { startFID } : id, ecases, macro null), pos : pos } ), pos : pos };
+			fields.push( {
+				name : "networkGetName",
+				pos : pos,
+				access : access,
+				meta : noComplete,
+				kind : FFun({
+					args : [ { name : "id", type : macro : Int }, { name : "isRPC", type : macro : Bool, value:macro false } ],
+					ret : macro : String,
+					expr : if( isSubSer ) macro { if( id < (isRPC ? $v{ firstRPCID } : $v{ firstFID }) ) return super.networkGetName(id, isRPC); $swExpr; } else swExpr,
+				}),
+			});
+		}
+
+
 		// add metadata
 		// add metadata
 
 
 		if( startFID > 32 ) Context.error("Too many serializable fields", pos);
 		if( startFID > 32 ) Context.error("Too many serializable fields", pos);
@@ -1131,17 +1162,32 @@ class Macros {
 	}
 	}
 
 
 	static function makeMarkExpr( fields : Array<Field>, fname : String, t : PropType, mark : Expr ) {
 	static function makeMarkExpr( fields : Array<Field>, fname : String, t : PropType, mark : Expr ) {
+		var rname = "__ref_" + fname;
+		var needRef = false;
 		if( t.increment != null ) {
 		if( t.increment != null ) {
-			var rname = "__ref_" + fname;
-			if( fields != null )
-				fields.push({
-					name : rname,
-					pos : mark.pos,
-					meta : [{ name : ":noCompletion", pos : mark.pos }],
-					kind : FVar(t.t,macro 0),
-				});
+			needRef = true;
 			mark = macro if( hxd.Math.abs(this.$fname - this.$rname) > $v{ t.increment } ) { this.$rname = this.$fname; $mark; };
 			mark = macro if( hxd.Math.abs(this.$fname - this.$rname) > $v{ t.increment } ) { this.$rname = this.$fname; $mark; };
 		}
 		}
+		if( t.condSend != null ) {
+			function loop(e:Expr) {
+				switch( e.expr ) {
+				case EConst(CIdent("current")):
+					return { expr : EConst(CIdent(rname)), pos : e.pos };
+				default:
+					return haxe.macro.ExprTools.map(e, loop);
+				}
+			}
+			var condSend = loop(t.condSend);
+			needRef = true;
+			mark = macro if( $condSend ) { this.$rname = this.$fname; $mark; };
+		}
+		if( needRef && fields != null )
+			fields.push({
+				name : rname,
+				pos : mark.pos,
+				meta : [{ name : ":noCompletion", pos : mark.pos }],
+				kind : FVar(t.t,macro 0),
+			});
 		return mark;
 		return mark;
 	}
 	}
 
 

+ 11 - 3
hxd/net/NetworkHost.hx

@@ -291,7 +291,7 @@ class NetworkHost {
 		ctx.addInt(o.__uid);
 		ctx.addInt(o.__uid);
 		ctx.addByte(id);
 		ctx.addByte(id);
 		if( logger != null )
 		if( logger != null )
-			logger("RPC " + o +"#"+id+(onResult == null ? "" : "->" + (rpcUID-1)));
+			logger("RPC " + o +"."+o.networkGetName(id,true)+"()");
 		return ctx;
 		return ctx;
 	}
 	}
 
 
@@ -434,8 +434,16 @@ class NetworkHost {
 		var o = markHead;
 		var o = markHead;
 		while( o != null ) {
 		while( o != null ) {
 			if( o.__bits != 0 ) {
 			if( o.__bits != 0 ) {
-				if( logger != null )
-					logger("SYNC " + o + "#" + o.__uid + " " + o.__bits);
+				if( logger != null ) {
+					var props = [];
+					var i = 0;
+					while( 1 << i <= o.__bits ) {
+						if( o.__bits & (1 << i) != 0 )
+							props.push(o.networkGetName(i));
+						i++;
+					}
+					logger("SYNC " + o + "#" + o.__uid + " " + props.join("|"));
+				}
 				ctx.addByte(SYNC);
 				ctx.addByte(SYNC);
 				ctx.addInt(o.__uid);
 				ctx.addInt(o.__uid);
 				o.networkFlush(ctx);
 				o.networkFlush(ctx);

+ 1 - 0
hxd/net/NetworkSerializable.hx

@@ -21,6 +21,7 @@ interface NetworkSerializable extends Serializable extends ProxyHost {
 	public function networkSync( ctx : Serializer ) : Void;
 	public function networkSync( ctx : Serializer ) : Void;
 	public function networkRPC( ctx : Serializer, rpcID : Int, clientResult : NetworkHost.NetworkClient ) : Void;
 	public function networkRPC( ctx : Serializer, rpcID : Int, clientResult : NetworkHost.NetworkClient ) : Void;
 	public function networkGetOwner() : NetworkSerializable;
 	public function networkGetOwner() : NetworkSerializable;
+	public function networkGetName( propId : Int, isRPC : Bool = false ) : String;
 }
 }
 
 
 @:genericBuild(hxd.net.Macros.buildSerializableProxy())
 @:genericBuild(hxd.net.Macros.buildSerializableProxy())