Added SyncVar hooks

This commit is contained in:
Albin Corén 2018-03-13 08:58:41 +01:00
parent e7372d6cc3
commit 965d644fb7
2 changed files with 35 additions and 0 deletions

View File

@ -5,6 +5,11 @@ namespace MLAPI.Attributes
[AttributeUsage(AttributeTargets.Field)] [AttributeUsage(AttributeTargets.Field)]
public class SyncedVar : Attribute public class SyncedVar : Attribute
{ {
public string hook;
public SyncedVar()
{
}
} }
} }

View File

@ -133,6 +133,7 @@ namespace MLAPI
private List<FieldInfo> syncedFields = new List<FieldInfo>(); private List<FieldInfo> syncedFields = new List<FieldInfo>();
internal List<FieldType> syncedFieldTypes = new List<FieldType>(); internal List<FieldType> syncedFieldTypes = new List<FieldType>();
private List<object> syncedFieldValues = new List<object>(); private List<object> syncedFieldValues = new List<object>();
private List<MethodInfo> syncedVarHooks = new List<MethodInfo>();
//A dirty field is a field that's not synced. //A dirty field is a field that's not synced.
public bool[] dirtyFields; public bool[] dirtyFields;
internal void SyncVarInit() internal void SyncVarInit()
@ -142,107 +143,134 @@ namespace MLAPI
{ {
if(sortedFields[i].IsDefined(typeof(SyncedVar), true)) 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)) if (sortedFields[i].FieldType == typeof(bool))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Bool); syncedFieldTypes.Add(FieldType.Bool);
syncedVarHooks.Add(method);
} }
else if(sortedFields[i].FieldType == typeof(byte)) else if(sortedFields[i].FieldType == typeof(byte))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Byte); syncedFieldTypes.Add(FieldType.Byte);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(char)) else if (sortedFields[i].FieldType == typeof(char))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Char); syncedFieldTypes.Add(FieldType.Char);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(double)) else if (sortedFields[i].FieldType == typeof(double))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Double); syncedFieldTypes.Add(FieldType.Double);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(float)) else if (sortedFields[i].FieldType == typeof(float))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Single); syncedFieldTypes.Add(FieldType.Single);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(int)) else if (sortedFields[i].FieldType == typeof(int))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Int); syncedFieldTypes.Add(FieldType.Int);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(long)) else if (sortedFields[i].FieldType == typeof(long))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Long); syncedFieldTypes.Add(FieldType.Long);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(sbyte)) else if (sortedFields[i].FieldType == typeof(sbyte))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.SByte); syncedFieldTypes.Add(FieldType.SByte);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(short)) else if (sortedFields[i].FieldType == typeof(short))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Short); syncedFieldTypes.Add(FieldType.Short);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(uint)) else if (sortedFields[i].FieldType == typeof(uint))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.UInt); syncedFieldTypes.Add(FieldType.UInt);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(ulong)) else if (sortedFields[i].FieldType == typeof(ulong))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.ULong); syncedFieldTypes.Add(FieldType.ULong);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(ushort)) else if (sortedFields[i].FieldType == typeof(ushort))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.UShort); syncedFieldTypes.Add(FieldType.UShort);
syncedVarHooks.Add(method);
} }
else if(sortedFields[i].FieldType == typeof(string)) else if(sortedFields[i].FieldType == typeof(string))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.String); syncedFieldTypes.Add(FieldType.String);
syncedVarHooks.Add(method);
} }
else if(sortedFields[i].FieldType == typeof(Vector3)) else if(sortedFields[i].FieldType == typeof(Vector3))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Vector3); syncedFieldTypes.Add(FieldType.Vector3);
syncedVarHooks.Add(method);
} }
else if(sortedFields[i].FieldType == typeof(Vector2)) else if(sortedFields[i].FieldType == typeof(Vector2))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Vector2); syncedFieldTypes.Add(FieldType.Vector2);
syncedVarHooks.Add(method);
} }
else if (sortedFields[i].FieldType == typeof(Quaternion)) else if (sortedFields[i].FieldType == typeof(Quaternion))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.Quaternion); syncedFieldTypes.Add(FieldType.Quaternion);
syncedVarHooks.Add(method);
} }
else if(sortedFields[i].FieldType == typeof(byte[])) else if(sortedFields[i].FieldType == typeof(byte[]))
{ {
syncedFields.Add(sortedFields[i]); syncedFields.Add(sortedFields[i]);
syncedFieldValues.Add(sortedFields[i].GetValue(this)); syncedFieldValues.Add(sortedFields[i].GetValue(this));
syncedFieldTypes.Add(FieldType.ByteArray); syncedFieldTypes.Add(FieldType.ByteArray);
syncedVarHooks.Add(method);
} }
else else
{ {
@ -260,6 +288,8 @@ namespace MLAPI
internal void OnSyncVarUpdate(object value, byte fieldIndex) internal void OnSyncVarUpdate(object value, byte fieldIndex)
{ {
syncedFields[fieldIndex].SetValue(this, value); syncedFields[fieldIndex].SetValue(this, value);
if (syncedVarHooks[fieldIndex] != null)
syncedVarHooks[fieldIndex].Invoke(this, null);
} }
internal void FlushToClient(int clientId) internal void FlushToClient(int clientId)