public static void WriteDeltaPlayerstate(NetBuffer msg, Common.PlayerState from, Common.PlayerState to) { int msgStart = msg.LengthBits; if (from == null) from = new Common.PlayerState(); if (from.commandTime != to.commandTime) { msg.Write(true); msg.Write(to.commandTime); } else { msg.Write(false); } if (from.pm_type != to.pm_type) { msg.Write(true); msg.Write((int)to.pm_type); } else { msg.Write(false); } if (from.pm_flags != to.pm_flags) { msg.Write(true); msg.Write((int)to.pm_flags); } else { msg.Write(false); } if (from.pm_time != to.pm_time) { msg.Write(true); msg.Write(to.pm_time); } else { msg.Write(false); } if (from.origin.X != to.origin.X) { msg.Write(true); msg.Write(to.origin.X); } else { msg.Write(false); } if (from.origin.Y != to.origin.Y) { msg.Write(true); msg.Write(to.origin.Y); } else { msg.Write(false); } if (from.origin.Z != to.origin.Z) { msg.Write(true); msg.Write(to.origin.Z); } else { msg.Write(false); } if (from.velocity.X != to.velocity.X) { msg.Write(true); msg.Write(to.velocity.X); } else { msg.Write(false); } if (from.velocity.Y != to.velocity.Y) { msg.Write(true); msg.Write(to.velocity.Y); } else { msg.Write(false); } if (from.velocity.Z != to.velocity.Z) { msg.Write(true); msg.Write(to.velocity.Z); } else { msg.Write(false); } if (from.weaponTime != to.weaponTime) { msg.Write(true); msg.Write(to.weaponTime); } else { msg.Write(false); } if (from.gravity != to.gravity) { msg.Write(true); msg.Write(to.gravity); } else { msg.Write(false); } if (from.delta_angles[0] != to.delta_angles[0]) { msg.Write(true); msg.Write(to.delta_angles[0]); } else { msg.Write(false); } if (from.delta_angles[1] != to.delta_angles[1]) { msg.Write(true); msg.Write(to.delta_angles[1]); } else { msg.Write(false); } if (from.delta_angles[2] != to.delta_angles[2]) { msg.Write(true); msg.Write(to.delta_angles[2]); } else { msg.Write(false); } if (from.groundEntityNum != to.groundEntityNum) { msg.Write(true); msg.Write(to.groundEntityNum); } else { msg.Write(false); } if (from.movementDir != to.movementDir) { msg.Write(true); msg.Write(to.movementDir); } else { msg.Write(false); } if (from.ladderNormal.X != to.ladderNormal.X) { msg.Write(true); msg.Write(to.ladderNormal.X); } else { msg.Write(false); } if (from.ladderNormal.Y != to.ladderNormal.Y) { msg.Write(true); msg.Write(to.ladderNormal.Y); } else { msg.Write(false); } if (from.ladderNormal.Z != to.ladderNormal.Z) { msg.Write(true); msg.Write(to.ladderNormal.Z); } else { msg.Write(false); } if (from.speed != to.speed) { msg.Write(true); msg.Write(from.speed); } else { msg.Write(false); } if (from.eFlags != to.eFlags) { msg.Write(true); msg.Write((int)to.eFlags); } else { msg.Write(false); } if (from.eventSequence != to.eventSequence) { msg.Write(true); msg.Write(to.eventSequence); } else { msg.Write(false); } if (from.events[0] != to.events[0]) { msg.Write(true); msg.Write(to.events[0]); } else { msg.Write(false); } if (from.events[1] != to.events[1]) { msg.Write(true); msg.Write(to.events[1]); } else { msg.Write(false); } if (from.eventParms[0] != to.eventParms[0]) { msg.Write(true); msg.Write(to.eventParms[0]); } else { msg.Write(false); } if (from.eventParms[1] != to.eventParms[1]) { msg.Write(true); msg.Write(to.eventParms[1]); } else { msg.Write(false); } if (from.externalEvent != to.externalEvent) { msg.Write(true); msg.Write(to.externalEvent); } else { msg.Write(false); } if (from.externalEventParm != to.externalEventParm) { msg.Write(true); msg.Write(to.externalEventParm); } else { msg.Write(false); } if (from.externalEventTime != to.externalEventTime) { msg.Write(true); msg.Write(to.externalEventTime); } else { msg.Write(false); } if (from.clientNum != to.clientNum) { msg.Write(true); msg.Write(to.clientNum); } else { msg.Write(false); } if (from.viewangles.X != to.viewangles.X) { msg.Write(true); msg.Write(to.viewangles.X); } else { msg.Write(false); } if (from.viewangles.Y != to.viewangles.Y) { msg.Write(true); msg.Write(to.viewangles.Y); } else { msg.Write(false); } if (from.viewangles.Z != to.viewangles.Z) { msg.Write(true); msg.Write(to.viewangles.Z); } else { msg.Write(false); } if (from.viewheight != to.viewheight) { msg.Write(true); msg.Write(to.viewheight); } else { msg.Write(false); } if (from.generic1 != to.generic1) { msg.Write(true); msg.Write(to.generic1); } else { msg.Write(false); } if (from.bobCycle != to.bobCycle) { msg.Write(true); msg.Write(to.bobCycle); } else { msg.Write(false); } if (from.Ducked != to.Ducked) { msg.Write(true); msg.Write(to.Ducked); } else { msg.Write(false); } if (from.Ducking != to.Ducking) { msg.Write(true); msg.Write(to.Ducking); } else { msg.Write(false); } if (from.DuckTime != to.DuckTime) { msg.Write(true); msg.Write(to.DuckTime); } else { msg.Write(false); } if (from.OldButtons != to.OldButtons) { msg.Write(true); msg.Write(to.OldButtons); } else { msg.Write(false); } // // send the arrays // int statbits = 0; for (int i = 0; i < 16; i++) { if (from.stats[i] != to.stats[i]) statbits |= 1 << i; } int persbits = 0; for (int i = 0; i < 16; i++) { if (from.persistant[i] != to.persistant[i]) persbits |= 1 << i; } if (persbits == statbits && statbits == 0) { // no change msg.Write(false); return; } msg.Write(true); if (statbits > 0) { msg.Write(true); msg.Write(statbits); for (int i = 0; i < 16; i++) { if ((statbits & (1 << i)) == (1 << i)) { msg.Write((short)to.stats[i]); } } } else msg.Write(false); int msgMiddle = msg.LengthBits; if (persbits > 0) { msg.Write(true); msg.Write(persbits); for (int i = 0; i < 16; i++) { if ((persbits & (1 << i)) == (1 << i)) { msg.Write((short)to.persistant[i]); } } } else msg.Write(false); // System.Console.WriteLine("Wrote {0}bits snapshot, {1} middle", msg.LengthBits - msgStart, msgMiddle - msgStart); }
public static void ReadDeltaPlayerstate(NetBuffer msg, Common.PlayerState from, Common.PlayerState to) { int startoffset = msg.Position; if (from == null) from = new Common.PlayerState(); to.commandTime = msg.ReadBoolean() ? msg.ReadInt32() : from.commandTime; to.pm_type = msg.ReadBoolean() ? (Common.PMType)msg.ReadInt32() : from.pm_type; to.pm_flags = msg.ReadBoolean() ? (client.PMFlags)msg.ReadInt32() : from.pm_flags; to.pm_time = msg.ReadBoolean() ? msg.ReadInt32() : from.pm_time; to.origin.X = msg.ReadBoolean() ? msg.ReadFloat() : from.origin.X; to.origin.Y = msg.ReadBoolean() ? msg.ReadFloat() : from.origin.Y; to.origin.Z = msg.ReadBoolean() ? msg.ReadFloat() : from.origin.Z; to.velocity.X = msg.ReadBoolean() ? msg.ReadFloat() : from.velocity.X; to.velocity.Y = msg.ReadBoolean() ? msg.ReadFloat() : from.velocity.Y; to.velocity.Z = msg.ReadBoolean() ? msg.ReadFloat() : from.velocity.Z; to.weaponTime = msg.ReadBoolean() ? msg.ReadInt32() : from.weaponTime; to.gravity = msg.ReadBoolean() ? msg.ReadInt32() : from.gravity; to.delta_angles[0] = msg.ReadBoolean() ? msg.ReadInt32() : from.delta_angles[0]; to.delta_angles[1] = msg.ReadBoolean() ? msg.ReadInt32() : from.delta_angles[1]; to.delta_angles[2] = msg.ReadBoolean() ? msg.ReadInt32() : from.delta_angles[2]; to.groundEntityNum = msg.ReadBoolean() ? msg.ReadInt32() : from.groundEntityNum; to.movementDir = msg.ReadBoolean() ? msg.ReadInt32() : from.movementDir; to.ladderNormal.X = msg.ReadBoolean() ? msg.ReadFloat() : from.ladderNormal.X; to.ladderNormal.Y = msg.ReadBoolean() ? msg.ReadFloat() : from.ladderNormal.Y; to.ladderNormal.Z = msg.ReadBoolean() ? msg.ReadFloat() : from.ladderNormal.Z; to.speed = msg.ReadBoolean() ? msg.ReadInt32() : from.speed; to.eFlags = msg.ReadBoolean() ? (Common.EntityFlags)Enum.Parse(typeof(Common.EntityFlags), ""+msg.ReadInt32()) : from.eFlags; to.eventSequence = msg.ReadBoolean() ? msg.ReadInt32() : from.eventSequence; to.events[0] = msg.ReadBoolean() ? msg.ReadInt32() : from.events[0]; to.events[1] = msg.ReadBoolean() ? msg.ReadInt32() : from.events[1]; to.eventParms[0] = msg.ReadBoolean() ? msg.ReadInt32() : from.eventParms[0]; to.eventParms[1] = msg.ReadBoolean() ? msg.ReadInt32() : from.eventParms[1]; to.externalEvent = msg.ReadBoolean() ? msg.ReadInt32() : from.externalEvent; to.externalEventParm = msg.ReadBoolean() ? msg.ReadInt32() : from.externalEventParm; to.externalEventTime = msg.ReadBoolean() ? msg.ReadInt32() : from.externalEventTime; to.clientNum = msg.ReadBoolean() ? msg.ReadInt32() : from.clientNum; to.viewangles.X = msg.ReadBoolean() ? msg.ReadFloat() : from.viewangles.X; to.viewangles.Y = msg.ReadBoolean() ? msg.ReadFloat() : from.viewangles.Y; to.viewangles.Z = msg.ReadBoolean() ? msg.ReadFloat() : from.viewangles.Z; to.viewheight = msg.ReadBoolean() ? msg.ReadInt32() : from.viewheight; //if (to.viewheight == 16) //{ // int test = 2; //} to.generic1 = msg.ReadBoolean() ? msg.ReadInt32() : from.generic1; to.bobCycle = msg.ReadBoolean() ? msg.ReadInt32() : from.bobCycle; to.Ducked = msg.ReadBoolean() ? msg.ReadBoolean() : from.Ducked; to.Ducking = msg.ReadBoolean() ? msg.ReadBoolean() : from.Ducking; to.DuckTime = msg.ReadBoolean() ? msg.ReadInt32() : from.DuckTime; to.OldButtons = msg.ReadBoolean() ? msg.ReadInt32() : from.OldButtons; // Got diff arrays int msgMiddle = 99999; if (msg.ReadBoolean()) { if (msg.ReadBoolean()) { // stat int statbits = msg.ReadInt32(); for (int i = 0; i < 16; i++) { if ((statbits & (1 << i)) == (1 << i)) { to.stats[i] = msg.ReadInt16(); } else to.stats[i] = from.stats[i]; } } else to.stats = from.stats; msgMiddle = msg.Position; if (msg.ReadBoolean()) { // pers int persbits = msg.ReadInt32(); for (int i = 0; i < 16; i++) { if ((persbits & (1 << i)) == (1 << i)) { to.persistant[i] = msg.ReadInt16(); } else to.persistant[i] = from.persistant[i]; } } else to.persistant = from.persistant; } else { to.stats = from.stats; to.persistant = from.persistant; } //System.Console.WriteLine("Read {0}bits snapshot, {1} middle", msg.Position - startoffset, msgMiddle - startoffset); }