using UnityEngine;
using System.Collections;
using TNet;
using System.IO;
public class GlaielBitStream {
public bool isReading;
public bool isWriting;
MemoryStream stream;
BinaryReader reader;
BinaryWriter writer;
public byte[] getData(){
return stream.GetBuffer();
}
public GlaielBitStream(byte[] initialData = null){
bool writing = initialData == null;
isReading = !writing;
isWriting = writing;
if(isReading){
stream
= new MemoryStream
(initialData
); reader
= new BinaryReader
(stream
); } else {
stream
= new MemoryStream
(); writer
= new BinaryWriter
(stream
); }
}
public void Serialize(ref bool value){
if(isReading){
value = reader.ReadBoolean();
}
if(isWriting){
writer.Write(value);
}
}
public void Serialize(ref char value){
if (isReading) {
value = reader.ReadChar();
}
if (isWriting) {
writer.Write(value);
}
}
public void Serialize(ref float value){
if (isReading) {
value = reader.ReadSingle();
}
if (isWriting) {
writer.Write(value);
}
}
public void Serialize(ref int value){
if (isReading) {
value = reader.ReadInt32();
}
if (isWriting) {
writer.Write(value);
}
}
/*public void Serialize(ref NetworkPlayer value);
public void Serialize(ref NetworkViewID viewID);*/
public void Serialize(ref Quaternion value){
if (isReading) {
value.x = reader.ReadSingle();
value.y = reader.ReadSingle();
value.z = reader.ReadSingle();
value.w = reader.ReadSingle();
}
if (isWriting) {
writer.Write(value.x);
writer.Write(value.y);
writer.Write(value.z);
writer.Write(value.w);
}
}
public void Serialize(ref short value){
if (isReading) {
value = reader.ReadInt16();
}
if (isWriting) {
writer.Write(value);
}
}
public void Serialize(ref Vector3 value){
if (isReading) {
value.x = reader.ReadSingle();
value.y = reader.ReadSingle();
value.z = reader.ReadSingle();
}
if (isWriting) {
writer.Write(value.x);
writer.Write(value.y);
writer.Write(value.z);
}
}
/*public void Serialize(ref float value, float maxDelta);
public void Serialize(ref Quaternion value, float maxDelta);
public void Serialize(ref Vector3 value, float maxDelta);*/
}
public class TNAutoSerializer : TNBehaviour {
public MonoBehaviour scriptToListenOn;
bool mCanSync = false;
void OnNetworkJoinChannel(bool success, string err) { mCanSync = success; }
public int updatesPerSecond = 20;
public bool isSavedOnServer = true;
public bool onlyOwnerCanSync = true;
public bool isImportant = true;
// Use this for initialization
void Awake () {
if (TNManager.isInChannel) mCanSync = true;
StartCoroutine(PeriodicSync());
}
IEnumerator PeriodicSync() {
for (; ; ) {
//if (!TNManager.isInChannel) break;
if (mCanSync && (!onlyOwnerCanSync || tno.isMine)) Sync();
yield return new WaitForSeconds
(1f
/ updatesPerSecond
); }
}
void Sync(){
GlaielBitStream gStream
= new GlaielBitStream
(); scriptToListenOn.BroadcastMessage("SyncNetworkBytes", gStream);
if (isImportant) {
tno.Send(255, isSavedOnServer ? Target.OthersSaved : Target.Others, gStream.getData());
} else {
tno.SendQuickly(255, isSavedOnServer ? Target.OthersSaved : Target.Others, gStream.getData());
}
}
[RFC(255)]
void Syncer(byte[] bytes){
GlaielBitStream gStream
= new GlaielBitStream
(bytes
); scriptToListenOn.BroadcastMessage("SyncNetworkBytes", gStream);
}
}