private static byte[] fill_message(message_types message_id, object entity, byte[] message, int length) { if (length > MAX_MESSAGE_LENGTH) { return(null); } if (length < 0) { length = 0; } if (!_out_buffers.ContainsKey(length)) { _out_buffers.Add(length, new byte[SIGNATURE_LENGTH + 1 + 8 + length]); for (uint index = 0; index < SIGNATURE_LENGTH; ++index) { _out_buffers[length][index] = _signature[index]; } //log_sync_action("fill_message", string.Format("allocated buffer of length {0} ({1} length {2})", SIGNATURE_LENGTH + 1 + 8 + length, message_id, length)); } byte[] message_buffer = _out_buffers[length]; message_buffer[SIGNATURE_LENGTH] = (byte)message_id; if (!encode_entity_id(message_id, entity, message_buffer)) { return(null); } //log_sync_action("fill_message", string.Format("entity valid ({0})", message_id)); int buffer_index = SIGNATURE_LENGTH + 1 + 8; for (int index = 0; index < length; ++index) { message_buffer[buffer_index++] = message[index]; } return(message_buffer); }
public static void deregister_entity(message_types message_type, long entity_id) { if (_entities[(int)message_type] != null && _entities[(int)message_type].ContainsKey(entity_id)) { _entity_ids[(int)message_type].Remove(_entities[(int)message_type][entity_id]); _entities [(int)message_type].Remove(entity_id); } }
public static void register_entity(message_types message_type, object entity, long entity_id) { if (_entities[(int)message_type] == null) { _entities [(int)message_type] = new Dictionary <long, object>(); _entity_ids[(int)message_type] = new Dictionary <object, long>(); } _entities [(int)message_type].Add(entity_id, entity); _entity_ids[(int)message_type].Add(entity, entity_id); }
public static void send_message_to_server(message_types message_id, object entity, byte[] message, int length) { if (!network_handlers_registered || running_on_server) { return; } byte[] message_buffer = fill_message(message_id, entity, message, length); if (message_buffer != null) { MyAPIGateway.Multiplayer.SendMessageToServer(SYNC_MESSAGE_ID, message_buffer); } }
public static void send_message_to(ulong recipient, message_types message_id, object entity, byte[] message, int length, bool reliable = true) { if (!network_handlers_registered || !running_on_server) { return; } byte[] message_buffer = fill_message(message_id, entity, message, length); if (message_buffer != null) { MyAPIGateway.Multiplayer.SendMessageTo(SYNC_MESSAGE_ID, message_buffer, recipient, reliable); } }
private static bool encode_entity_id(message_types message_type, object entity, byte[] message) { long entity_id; if (entity == null) { entity_id = 0; } else { if (!_entity_ids[(int)message_type].ContainsKey(entity)) { return(false); } entity_id = _entity_ids[(int)message_type][entity]; } encode_signed(entity_id, 8, message, SIGNATURE_LENGTH + 1); return(true); }
private static object decode_entity_id(message_types message_type, byte[] message) { long entity_id = decode_signed(8, message, SIGNATURE_LENGTH + 1); return((entity_id != 0 && _entities[(int)message_type] != null && _entities[(int)message_type].ContainsKey(entity_id)) ? _entities[(int)message_type][entity_id] : null); }