Skip to content

Commit 965d644

Browse files
committed
Added SyncVar hooks
1 parent e7372d6 commit 965d644

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

MLAPI/Attributes/SyncedVar.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ namespace MLAPI.Attributes
55
[AttributeUsage(AttributeTargets.Field)]
66
public class SyncedVar : Attribute
77
{
8+
public string hook;
89

10+
public SyncedVar()
11+
{
12+
13+
}
914
}
1015
}

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ private void OnDestroy()
133133
private List<FieldInfo> syncedFields = new List<FieldInfo>();
134134
internal List<FieldType> syncedFieldTypes = new List<FieldType>();
135135
private List<object> syncedFieldValues = new List<object>();
136+
private List<MethodInfo> syncedVarHooks = new List<MethodInfo>();
136137
//A dirty field is a field that's not synced.
137138
public bool[] dirtyFields;
138139
internal void SyncVarInit()
@@ -142,107 +143,134 @@ internal void SyncVarInit()
142143
{
143144
if(sortedFields[i].IsDefined(typeof(SyncedVar), true))
144145
{
146+
object[] syncedVarAttributes = sortedFields[i].GetCustomAttributes(typeof(SyncedVar), true);
147+
MethodInfo method = null;
148+
for (int j = 0; j < syncedVarAttributes.Length; j++)
149+
{
150+
if(!string.IsNullOrEmpty(((SyncedVar)syncedVarAttributes[j]).hook))
151+
{
152+
method = GetType().GetMethod(((SyncedVar)syncedVarAttributes[j]).hook, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
153+
break;
154+
}
155+
}
145156
if (sortedFields[i].FieldType == typeof(bool))
146157
{
147158
syncedFields.Add(sortedFields[i]);
148159
syncedFieldValues.Add(sortedFields[i].GetValue(this));
149160
syncedFieldTypes.Add(FieldType.Bool);
161+
syncedVarHooks.Add(method);
150162
}
151163
else if(sortedFields[i].FieldType == typeof(byte))
152164
{
153165
syncedFields.Add(sortedFields[i]);
154166
syncedFieldValues.Add(sortedFields[i].GetValue(this));
155167
syncedFieldTypes.Add(FieldType.Byte);
168+
syncedVarHooks.Add(method);
156169
}
157170
else if (sortedFields[i].FieldType == typeof(char))
158171
{
159172
syncedFields.Add(sortedFields[i]);
160173
syncedFieldValues.Add(sortedFields[i].GetValue(this));
161174
syncedFieldTypes.Add(FieldType.Char);
175+
syncedVarHooks.Add(method);
162176
}
163177
else if (sortedFields[i].FieldType == typeof(double))
164178
{
165179
syncedFields.Add(sortedFields[i]);
166180
syncedFieldValues.Add(sortedFields[i].GetValue(this));
167181
syncedFieldTypes.Add(FieldType.Double);
182+
syncedVarHooks.Add(method);
168183
}
169184
else if (sortedFields[i].FieldType == typeof(float))
170185
{
171186
syncedFields.Add(sortedFields[i]);
172187
syncedFieldValues.Add(sortedFields[i].GetValue(this));
173188
syncedFieldTypes.Add(FieldType.Single);
189+
syncedVarHooks.Add(method);
174190
}
175191
else if (sortedFields[i].FieldType == typeof(int))
176192
{
177193
syncedFields.Add(sortedFields[i]);
178194
syncedFieldValues.Add(sortedFields[i].GetValue(this));
179195
syncedFieldTypes.Add(FieldType.Int);
196+
syncedVarHooks.Add(method);
180197
}
181198
else if (sortedFields[i].FieldType == typeof(long))
182199
{
183200
syncedFields.Add(sortedFields[i]);
184201
syncedFieldValues.Add(sortedFields[i].GetValue(this));
185202
syncedFieldTypes.Add(FieldType.Long);
203+
syncedVarHooks.Add(method);
186204
}
187205
else if (sortedFields[i].FieldType == typeof(sbyte))
188206
{
189207
syncedFields.Add(sortedFields[i]);
190208
syncedFieldValues.Add(sortedFields[i].GetValue(this));
191209
syncedFieldTypes.Add(FieldType.SByte);
210+
syncedVarHooks.Add(method);
192211
}
193212
else if (sortedFields[i].FieldType == typeof(short))
194213
{
195214
syncedFields.Add(sortedFields[i]);
196215
syncedFieldValues.Add(sortedFields[i].GetValue(this));
197216
syncedFieldTypes.Add(FieldType.Short);
217+
syncedVarHooks.Add(method);
198218
}
199219
else if (sortedFields[i].FieldType == typeof(uint))
200220
{
201221
syncedFields.Add(sortedFields[i]);
202222
syncedFieldValues.Add(sortedFields[i].GetValue(this));
203223
syncedFieldTypes.Add(FieldType.UInt);
224+
syncedVarHooks.Add(method);
204225
}
205226
else if (sortedFields[i].FieldType == typeof(ulong))
206227
{
207228
syncedFields.Add(sortedFields[i]);
208229
syncedFieldValues.Add(sortedFields[i].GetValue(this));
209230
syncedFieldTypes.Add(FieldType.ULong);
231+
syncedVarHooks.Add(method);
210232
}
211233
else if (sortedFields[i].FieldType == typeof(ushort))
212234
{
213235
syncedFields.Add(sortedFields[i]);
214236
syncedFieldValues.Add(sortedFields[i].GetValue(this));
215237
syncedFieldTypes.Add(FieldType.UShort);
238+
syncedVarHooks.Add(method);
216239
}
217240
else if(sortedFields[i].FieldType == typeof(string))
218241
{
219242
syncedFields.Add(sortedFields[i]);
220243
syncedFieldValues.Add(sortedFields[i].GetValue(this));
221244
syncedFieldTypes.Add(FieldType.String);
245+
syncedVarHooks.Add(method);
222246
}
223247
else if(sortedFields[i].FieldType == typeof(Vector3))
224248
{
225249
syncedFields.Add(sortedFields[i]);
226250
syncedFieldValues.Add(sortedFields[i].GetValue(this));
227251
syncedFieldTypes.Add(FieldType.Vector3);
252+
syncedVarHooks.Add(method);
228253
}
229254
else if(sortedFields[i].FieldType == typeof(Vector2))
230255
{
231256
syncedFields.Add(sortedFields[i]);
232257
syncedFieldValues.Add(sortedFields[i].GetValue(this));
233258
syncedFieldTypes.Add(FieldType.Vector2);
259+
syncedVarHooks.Add(method);
234260
}
235261
else if (sortedFields[i].FieldType == typeof(Quaternion))
236262
{
237263
syncedFields.Add(sortedFields[i]);
238264
syncedFieldValues.Add(sortedFields[i].GetValue(this));
239265
syncedFieldTypes.Add(FieldType.Quaternion);
266+
syncedVarHooks.Add(method);
240267
}
241268
else if(sortedFields[i].FieldType == typeof(byte[]))
242269
{
243270
syncedFields.Add(sortedFields[i]);
244271
syncedFieldValues.Add(sortedFields[i].GetValue(this));
245272
syncedFieldTypes.Add(FieldType.ByteArray);
273+
syncedVarHooks.Add(method);
246274
}
247275
else
248276
{
@@ -260,6 +288,8 @@ internal void SyncVarInit()
260288
internal void OnSyncVarUpdate(object value, byte fieldIndex)
261289
{
262290
syncedFields[fieldIndex].SetValue(this, value);
291+
if (syncedVarHooks[fieldIndex] != null)
292+
syncedVarHooks[fieldIndex].Invoke(this, null);
263293
}
264294

265295
internal void FlushToClient(int clientId)

0 commit comments

Comments
 (0)