From a0dc1b4283443701b2d7cd4df08845d9655114c9 Mon Sep 17 00:00:00 2001 From: Kp Date: Sat, 23 Jul 2022 20:58:10 +0000 Subject: [PATCH] Use union of multi_command<> for multi_send_fire message Switch to a union of the possible multi_command<> types, and eliminate the explicit length parameter passed to multi_send_data. --- similar/main/multi.cpp | 50 ++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/similar/main/multi.cpp b/similar/main/multi.cpp index 3e89144be..bbe704629 100644 --- a/similar/main/multi.cpp +++ b/similar/main/multi.cpp @@ -2492,46 +2492,48 @@ void multi_send_fire(int laser_gun, const laser_level level, int laser_flags, ob last_fireup_time = timer_query(); } - uint8_t multibuf[MAX_MULTI_MESSAGE_LEN+4]; - multibuf[0] = static_cast(MULTI_FIRE); + union mb { + multi_command multibomb; + multi_command multitrack; + multi_command multifire; + mb() {} + } multibuf; if (is_bomb_objnum != object_none) - { - multibuf[0] = static_cast(MULTI_FIRE_BOMB); - } + new(&multibuf.multibomb) multi_command(); else if (laser_track != object_none) - { - multibuf[0] = static_cast(MULTI_FIRE_TRACK); - } - multibuf[1] = static_cast(Player_num); - multibuf[2] = static_cast(laser_gun); - multibuf[3] = static_cast(level); - multibuf[4] = static_cast(laser_flags); + new(&multibuf.multitrack) multi_command(); + else + new(&multibuf.multifire) multi_command(); + multibuf.multifire[1] = static_cast(Player_num); + multibuf.multifire[2] = static_cast(laser_gun); + multibuf.multifire[3] = static_cast(level); + multibuf.multifire[4] = static_cast(laser_flags); const auto &ownship = get_local_plrobj(); - PUT_INTEL_INT(&multibuf[5], ownship.orient.fvec.x); - PUT_INTEL_INT(&multibuf[9], ownship.orient.fvec.y); - PUT_INTEL_INT(&multibuf[13], ownship.orient.fvec.z); + PUT_INTEL_INT(&multibuf.multifire[5], ownship.orient.fvec.x); + PUT_INTEL_INT(&multibuf.multifire[9], ownship.orient.fvec.y); + PUT_INTEL_INT(&multibuf.multifire[13], ownship.orient.fvec.z); /* * If we fire a bomb, it's persistent. Let others know of it's objnum so host can track it's behaviour over clients (host-authority functions, D2 chaff ability). - * If we fire a tracking projectile, we should others let know abotu what we track but we have to pay attention it's mapped correctly. + * If we fire a tracking projectile, we should others let know about what we track but we have to pay attention that it is mapped correctly. * If we fire something else, we make the packet as small as possible. */ - if (multibuf[0] == MULTI_FIRE_BOMB) + if (multibuf.multifire[0] == MULTI_FIRE_BOMB) { map_objnum_local_to_local(is_bomb_objnum); - PUT_INTEL_SHORT(&multibuf[17], static_cast(is_bomb_objnum)); - multi_send_data(multibuf, 19, multiplayer_data_priority::_1); + PUT_INTEL_SHORT(&multibuf.multibomb[17], is_bomb_objnum.operator objnum_t()); + multi_send_data(multibuf.multibomb, multiplayer_data_priority::_1); } - else if (multibuf[0] == MULTI_FIRE_TRACK) + else if (multibuf.multifire[0] == MULTI_FIRE_TRACK) { const auto &&[remote_owner, remote_laser_track] = objnum_local_to_remote(laser_track); - PUT_INTEL_SHORT(&multibuf[17], remote_laser_track); - multibuf[19] = remote_owner; - multi_send_data(multibuf, 20, multiplayer_data_priority::_1); + PUT_INTEL_SHORT(&multibuf.multitrack[17], remote_laser_track); + multibuf.multitrack[19] = remote_owner; + multi_send_data(multibuf.multitrack, multiplayer_data_priority::_1); } else - multi_send_data(multibuf, 17, multiplayer_data_priority::_1); + multi_send_data(multibuf.multifire, multiplayer_data_priority::_1); } void multi_send_destroy_controlcen(const objnum_t objnum, const playernum_t player)