internal void _Write(NetBuffer buffer)
        {
            buffer.Write(position.x); buffer.Write(position.y); buffer.Write(position.z);
            buffer.Write(rotation.x); buffer.Write(rotation.y); buffer.Write(rotation.z); buffer.Write(rotation.w);
            buffer.Write((byte)relativeTo);

            remoteViewID._Write(buffer);
            group._Write(buffer);

            buffer.Write((byte)authFlags);
            buffer.Write(isInstantiatedRemotely);

            buffer.Write(proxyPrefab);
            buffer.Write(ownerPrefab);
            buffer.Write(serverPrefab);
            buffer.Write(cellAuthPrefab);
            buffer.Write(cellProxyPrefab);

            if (_networkView.initialData != null)
            {
                var initialData = _networkView.initialData._ToArray();
                buffer.WriteVariableUInt32((uint)initialData.Length);
                buffer.Write(initialData);
            }
            else
            {
                buffer.WriteVariableUInt32(0);
            }

            if (_networkView._hasSerializeHandover)
            {
                var stream = new BitStream(true, false);
                _networkView._SerializeHandover(stream, new NetworkMessageInfo(NetworkPlayer.unassigned, 0, 0, 0, NetworkFlags.NoTimestamp, _networkView));

                var handoverData = stream._ToArray();
                buffer.WriteVariableUInt32((uint)handoverData.Length);
                buffer.Write(handoverData);
            }
            else
            {
                buffer.WriteVariableUInt32(0);
            }
        }
        // Outgoing forwarded message (non-auth server uses this)
        public NetworkMessage(NetworkBaseLocal network, NetworkMessage msg, NetworkPlayer originalSender)
        {
            flags                   = msg.flags;
            connection              = msg.connection;
            channel                 = msg.channel;
            localTimeSent           = msg.localTimeSent;
            monotonicServerTimeSent = msg.monotonicServerTimeSent;
            rawServerTimeSent       = msg.rawServerTimeSent;
            name       = msg.name;
            internCode = msg.internCode;
            sender     = originalSender;
            target     = msg.target;
            exclude    = msg.exclude;
            viewID     = msg.viewID;

            stream = new BitStream(isTypeSafe);
            var buffer = stream._buffer;

            HeaderFlags headerFlags = 0;

            if (sender != network._localPlayer)
            {
                headerFlags |= HeaderFlags.HasOriginalSenderPlayerID;
            }

            if (isBroadcast)
            {
                headerFlags |= (hasExcludeID) ? HeaderFlags.HasBroadcastExcludePlayerID : HeaderFlags.Broadcast;
            }
            else if (hasTargetID)
            {
                headerFlags |= HeaderFlags.HasTargetPlayerID;
            }

            if (hasViewID && isInternal)
            {
                headerFlags |= HeaderFlags.HasInternalCodeAndViewID;
            }
            else if (hasViewID)
            {
                headerFlags |= (isBuffered) ? HeaderFlags.HasNameAndViewIDAndIsBuffered : HeaderFlags.HasNameAndViewID;
            }
            else
            {
                headerFlags |= HeaderFlags.HasInternalCode;
            }

            // TODO: use 24bit timestamp if needed
            if (hasTimestamp)
            {
                headerFlags |= HeaderFlags.Has16BitTimestamp;
            }

            if (isTypeSafe)
            {
                headerFlags |= HeaderFlags.HasTypeCodes;
            }

            buffer.Write((byte)headerFlags);

            if (sender != network._localPlayer)
            {
                sender._Write(buffer);
            }
            if (hasTargetID)
            {
                target._Write(buffer);
            }
            if (hasExcludeID)
            {
                exclude._Write(buffer);
            }
            if (hasViewID)
            {
                viewID._Write(buffer);
            }

            if (internCode == InternalCode.None)
            {
                buffer.Write(name);
            }
            else
            {
                buffer.Write((byte)internCode);
            }

            if (hasTimestamp)
            {
#if PIKKO_BUILD
                ulong timestampInMillis = (ulong)NetTime.ToMillis(localTimestamp);
#else
                ulong timestampInMillis = (ulong)NetTime.ToMillis(rawServerTimeSent);
#endif

                // TODO: use 24bit timestamp if needed
                buffer.Write(timestampInMillis, 16);
            }

            buffer.PositionBits = buffer.LengthBits;

            int argpos = msg.stream._buffer.PositionBytes;
            stream._buffer.Write(msg.stream._buffer.Data, argpos, msg.stream._buffer.LengthBytes - argpos);
        }
 public void WriteNetworkViewID(NetworkViewID value)
 {
     value._Write(_buffer);
 }
 internal static void _Write(NetBuffer buffer, NetworkViewID viewID, NetBuffer data)
 {
     viewID._Write(buffer);
     SerializedBuffer._Write(buffer, data);
 }