Added SyncVar hooks
This commit is contained in:
parent
e7372d6cc3
commit
965d644fb7
@ -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()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user