static unsafe private void _interaction(_AlloClient *_client, _AlloInteraction *inter) { string type = Marshal.PtrToStringAnsi(inter->type); string from = Marshal.PtrToStringAnsi(inter->senderEntityId); string to = Marshal.PtrToStringAnsi(inter->receiverEntityId); string cmd = Marshal.PtrToStringAnsi(inter->body); string requestId = Marshal.PtrToStringAnsi(inter->requestId); GCHandle backref = (GCHandle)_client->_backref; AlloClient self = backref.Target as AlloClient; List <object> data = Deserialize <List <object> >(cmd); if (from == "place" && data[0].ToString() == "announce") { self.avatarId = data[1].ToString(); self.placeName = data[2].ToString(); self.connected = true; self.onConnected?.Invoke(); } AlloEntity fromEntity = null; if (!string.IsNullOrEmpty(from)) { self.entities.TryGetValue(from, out fromEntity); } AlloEntity toEntity = null; if (!string.IsNullOrEmpty(to)) { self.entities.TryGetValue(to, out toEntity); } ResponseCallback callback = null; if (type == "response" && !string.IsNullOrEmpty(requestId)) { self.responseCallbacks.TryGetValue(requestId, out callback); } if (callback != null) { callback(cmd); self.responseCallbacks.Remove(requestId); } else { self.onInteraction?.Invoke(type, fromEntity, toEntity, data); } }
void _Interact(string interactionType, string senderEntityId, string receiverEntityId, string requestId, string body) { unsafe { IntPtr interactionTypePtr = Marshal.StringToHGlobalAnsi(interactionType); IntPtr senderEntityIdPtr = Marshal.StringToHGlobalAnsi(senderEntityId); IntPtr receiverEntityIdPtr = Marshal.StringToHGlobalAnsi(receiverEntityId); IntPtr requestIdPtr = Marshal.StringToHGlobalAnsi(requestId); IntPtr bodyPtr = Marshal.StringToHGlobalAnsi(body); _AlloInteraction *interaction = _AlloClient.allo_interaction_create(interactionTypePtr, senderEntityIdPtr, receiverEntityIdPtr, requestIdPtr, bodyPtr); _AlloClient.alloclient_send_interaction(client, interaction); _AlloClient.allo_interaction_free(interaction); Marshal.FreeHGlobal(interactionTypePtr); Marshal.FreeHGlobal(senderEntityIdPtr); Marshal.FreeHGlobal(receiverEntityIdPtr); Marshal.FreeHGlobal(requestIdPtr); Marshal.FreeHGlobal(bodyPtr); } }
public unsafe static extern void allo_interaction_free(_AlloInteraction *interaction);
public unsafe static extern void alloclient_send_interaction(_AlloClient *client, _AlloInteraction *interaction);