diff --git a/MLAPI/Attributes/SyncedVar.cs b/MLAPI/Attributes/SyncedVar.cs index f01705c..5147a3f 100644 --- a/MLAPI/Attributes/SyncedVar.cs +++ b/MLAPI/Attributes/SyncedVar.cs @@ -5,6 +5,11 @@ namespace MLAPI.Attributes [AttributeUsage(AttributeTargets.Field)] public class SyncedVar : Attribute { + public string hook; + public SyncedVar() + { + + } } } diff --git a/MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs b/MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs index 0ef3a0b..ad1ff7e 100644 --- a/MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs +++ b/MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs @@ -133,6 +133,7 @@ namespace MLAPI private List syncedFields = new List(); internal List syncedFieldTypes = new List(); private List syncedFieldValues = new List(); + private List syncedVarHooks = new List(); //A dirty field is a field that's not synced. public bool[] dirtyFields; internal void SyncVarInit() @@ -142,107 +143,134 @@ namespace MLAPI { if(sortedFields[i].IsDefined(typeof(SyncedVar), true)) { + object[] syncedVarAttributes = sortedFields[i].GetCustomAttributes(typeof(SyncedVar), true); + MethodInfo method = null; + for (int j = 0; j < syncedVarAttributes.Length; j++) + { + if(!string.IsNullOrEmpty(((SyncedVar)syncedVarAttributes[j]).hook)) + { + method = GetType().GetMethod(((SyncedVar)syncedVarAttributes[j]).hook, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + break; + } + } if (sortedFields[i].FieldType == typeof(bool)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Bool); + syncedVarHooks.Add(method); } else if(sortedFields[i].FieldType == typeof(byte)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Byte); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(char)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Char); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(double)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Double); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(float)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Single); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(int)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Int); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(long)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Long); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(sbyte)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.SByte); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(short)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Short); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(uint)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.UInt); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(ulong)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.ULong); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(ushort)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.UShort); + syncedVarHooks.Add(method); } else if(sortedFields[i].FieldType == typeof(string)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.String); + syncedVarHooks.Add(method); } else if(sortedFields[i].FieldType == typeof(Vector3)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Vector3); + syncedVarHooks.Add(method); } else if(sortedFields[i].FieldType == typeof(Vector2)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Vector2); + syncedVarHooks.Add(method); } else if (sortedFields[i].FieldType == typeof(Quaternion)) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.Quaternion); + syncedVarHooks.Add(method); } else if(sortedFields[i].FieldType == typeof(byte[])) { syncedFields.Add(sortedFields[i]); syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldTypes.Add(FieldType.ByteArray); + syncedVarHooks.Add(method); } else { @@ -260,6 +288,8 @@ namespace MLAPI internal void OnSyncVarUpdate(object value, byte fieldIndex) { syncedFields[fieldIndex].SetValue(this, value); + if (syncedVarHooks[fieldIndex] != null) + syncedVarHooks[fieldIndex].Invoke(this, null); } internal void FlushToClient(int clientId)