From e28354bc99a202d862438b26b38570aa4b500e48 Mon Sep 17 00:00:00 2001 From: Marko Lindqvist Date: Thu, 6 Oct 2022 03:26:26 +0300 Subject: [PATCH 16/16] Send "unknown research" notifications to client Even when the client does not know research details, it needs to be informed about that fact to initialize values, or to clear old ones. Reported by ihnatus See osdn #45076 Signed-off-by: Marko Lindqvist --- client/packhand.c | 30 ++++++++++++++++++++++++++++++ common/networking/packets.def | 4 ++++ fc_version | 2 +- server/techtools.c | 15 ++++++++++++++- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/client/packhand.c b/client/packhand.c index f2fdcd24ba..9c6ce63f2e 100644 --- a/client/packhand.c +++ b/client/packhand.c @@ -2582,6 +2582,36 @@ void handle_research_info(const struct packet_research_info *packet) } } +/**************************************************************************** + Received a packet indicating we don't know the research details any more. +****************************************************************************/ +void handle_unknown_research(int id) +{ + struct research *presearch = research_by_number(id); + + if (presearch == NULL) { + log_error("Received unknown research for clearing: %d.", id); + return; + } + + /* Do we need to set other fields? */ + presearch->researching = A_UNKNOWN; + presearch->future_tech = 0; + presearch->tech_goal = A_UNKNOWN; + + advance_index_iterate(A_NONE, advi) { + research_invention_set(presearch, advi, TECH_UNKNOWN); + } advance_index_iterate_end; + + if (editor_is_active()) { + editgui_refresh(); + research_players_iterate(presearch, pplayer) { + editgui_notify_object_changed(OBJTYPE_PLAYER, player_number(pplayer), + FALSE); + } research_players_iterate_end; + } +} + /**************************************************************************** Packet player_diplstate handler. ****************************************************************************/ diff --git a/common/networking/packets.def b/common/networking/packets.def index 115d546298..880a8fda58 100644 --- a/common/networking/packets.def +++ b/common/networking/packets.def @@ -952,6 +952,10 @@ PACKET_RESEARCH_INFO = 60; sc, lsend, is-game-info STRING inventions[A_LAST + 1]; end +PACKET_UNKNOWN_RESEARCH = 66; sc, is-game-info, cancel(PACKET_RESEARCH_INFO) + RESEARCH id; +end + PACKET_PLAYER_RESEARCH = 55; cs, dsend TECH tech; end diff --git a/fc_version b/fc_version index 400f509557..01cdbf63d0 100755 --- a/fc_version +++ b/fc_version @@ -60,7 +60,7 @@ DEFAULT_FOLLOW_TAG=stable # as long as possible. We want to maintain network compatibility with # the stable branch for as long as possible. NETWORK_CAPSTRING_MANDATORY="+Freeciv-3.0-network" -NETWORK_CAPSTRING_OPTIONAL="year32 plrculture32 pingfix" +NETWORK_CAPSTRING_OPTIONAL="year32 plrculture32 pingfix researchclr" FREECIV_DISTRIBUTOR="" diff --git a/server/techtools.c b/server/techtools.c index 582d6a064e..cd0f00fa8a 100644 --- a/server/techtools.c +++ b/server/techtools.c @@ -16,6 +16,7 @@ /* utility */ #include "astring.h" +#include "capability.h" #include "fcintl.h" #include "log.h" #include "mem.h" @@ -274,6 +275,7 @@ void send_research_info(const struct research *presearch, const struct conn_list *dest) { struct packet_research_info full_info, restricted_info; + struct packet_unknown_research unknown_info; const struct player *pplayer; fc_assert_ret(NULL != presearch); @@ -286,6 +288,7 @@ void send_research_info(const struct research *presearch, restricted_info = full_info; restricted_info.tech_goal = A_UNSET; restricted_info.total_bulbs_prod = 0; + unknown_info.id = research_number(presearch); conn_list_iterate(dest, pconn) { pplayer = conn_get_player(pconn); @@ -295,12 +298,22 @@ void send_research_info(const struct research *presearch, send_packet_research_info(pconn, &full_info); } else { /* 'pplayer' may have an embassy for looking to 'presearch'. */ + bool embassy = FALSE; + research_players_iterate(presearch, powner) { if (team_has_embassy(pplayer->team, powner)) { - send_packet_research_info(pconn, &restricted_info); + embassy = TRUE; break; } } research_players_iterate_end; + + if (embassy) { + send_packet_research_info(pconn, &restricted_info); + } else { + if (has_capability("researchclr", pconn->capability)) { + send_packet_unknown_research(pconn, &unknown_info); + } + } } } else if (pconn->observer) { /* Case global observer. */ -- 2.35.1