Files
2026-06-19 23:09:49 +02:00

326 lines
25 KiB
HTML

<!DOCTYPE HTML>
<html lang="it">
<head>
<!-- Generated by javadoc (25) on Fri Jun 19 23:05:23 CEST 2026 -->
<title>ServerLauncher</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="dc.created" content="2026-06-19">
<meta name="description" content="declaration: module: it.polimi.ingsw.gc14, package: it.polimi.ingsw.gc14, class: ServerLauncher">
<meta name="generator" content="javadoc/ClassWriter">
<link rel="stylesheet" type="text/css" href="../../../../../resource-files/jquery-ui.min.css">
<link rel="stylesheet" type="text/css" href="../../../../../resource-files/stylesheet.css">
<script type="text/javascript" src="../../../../../script-files/script.js"></script>
<script type="text/javascript" src="../../../../../script-files/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="../../../../../script-files/jquery-ui.min.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">const pathtoroot = "../../../../../";
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top">
<div class="nav-content">
<div class="nav-menu-button"><button id="navbar-toggle-button" aria-controls="navbar-top" aria-expanded="false" aria-label="Toggle navigation links"><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span></button></div>
<div class="skip-nav"><a href="#skip-navbar-top" title="Skip navigation links">Skip navigation links</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="Navigation">
<li><a href="../../../../module-summary.html">Module</a></li>
<li class="nav-bar-cell1-rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../index-files/index-1.html">Index</a></li>
<li><a href="../../../../../search.html">Search</a></li>
<li><a href="../../../../../help-doc.html#class">Help</a></li>
</ul>
</div>
</div>
<div class="sub-nav">
<div class="nav-content">
<ol class="sub-nav-list">
<li><a href="../../../../module-summary.html">it.polimi.ingsw.gc14</a></li>
<li><a href="package-summary.html">it.polimi.ingsw.gc14</a></li>
<li><a href="ServerLauncher.html" class="current-selection">ServerLauncher</a></li>
</ol>
<div class="nav-list-search"><input type="text" id="search-input" disabled placeholder="Search documentation (type /)" aria-label="Search in documentation" autocomplete="off" spellcheck="false"><input type="reset" id="reset-search" disabled value="Reset"></div>
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="main-grid">
<nav role="navigation" class="toc" aria-label="Table of contents">
<div class="toc-header">Contents&nbsp;<input type="text" class="filter-input" disabled placeholder="Filter contents (type .)" aria-label="Filter table of contents" autocomplete="off" spellcheck="false"><input type="reset" class="reset-filter" disabled tabindex="-1" value="Reset"></div>
<ol class="toc-list" tabindex="-1">
<li><a href="#" tabindex="0">Description</a></li>
<li><a href="#field-summary" tabindex="0">Field Summary</a></li>
<li><a href="#constructor-summary" tabindex="0">Constructor Summary</a></li>
<li><a href="#method-summary" tabindex="0">Method Summary</a></li>
<li><a href="#field-detail" tabindex="0">Field Details</a>
<ol class="toc-list">
<li><a href="#eventProcessor" tabindex="0">eventProcessor</a></li>
</ol>
</li>
<li><a href="#constructor-detail" tabindex="0">Constructor Details</a>
<ol class="toc-list">
<li><a href="#%3Cinit%3E(java.util.concurrent.BlockingQueue,it.polimi.ingsw.gc14.Controller.GameController,it.polimi.ingsw.gc14.LimitedMap,it.polimi.ingsw.gc14.Network.CompositeClientBroadcaster,it.polimi.ingsw.gc14.SaveManager)" tabindex="0">ServerLauncher(BlockingQueue, GameController, LimitedMap, CompositeClientBroadcaster, SaveManager)</a></li>
</ol>
</li>
<li><a href="#method-detail" tabindex="0">Method Details</a>
<ol class="toc-list">
<li><a href="#main(java.lang.String%5B%5D)" tabindex="0">main(String[])</a></li>
<li><a href="#run()" tabindex="0">run()</a></li>
<li><a href="#restoreGameIfSaved(it.polimi.ingsw.gc14.Controller.GameController,it.polimi.ingsw.gc14.LimitedMap,it.polimi.ingsw.gc14.SaveManager)" tabindex="0">restoreGameIfSaved(GameController, LimitedMap, SaveManager)</a></li>
<li><a href="#chooseNetworkInterface(java.util.Scanner)" tabindex="0">chooseNetworkInterface(Scanner)</a></li>
</ol>
</li>
</ol>
<button class="hide-sidebar"><span>Hide sidebar&nbsp;</span><img src="../../../../../resource-files/left.svg" alt="Hide sidebar"></button><button class="show-sidebar"><img src="../../../../../resource-files/right.svg" alt="Show sidebar"><span>&nbsp;Show sidebar</span></button></nav>
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<h1 title="Class ServerLauncher" class="title">Class ServerLauncher</h1>
</div>
<div class="inheritance" title="Inheritance Tree"><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">java.lang.Object</a>
<div class="inheritance">it.polimi.ingsw.gc14.ServerLauncher</div>
</div>
<section class="class-description" id="class-description">
<hr>
<div class="horizontal-scroll">
<div class="type-signature"><span class="modifiers">public class </span><span class="element-name type-name-label">ServerLauncher</span>
<span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></span></div>
<div class="block">Main server entry point.
<p>Responsibilities of this class are intentionally limited to wiring:
it creates all components, connects them together, restores a previously
saved game if one exists, and starts the event-processing loop and the
network servers.
<p>All game-logic and event-routing decisions are delegated to
<a href="GameEventProcessor.html" title="class in it.polimi.ingsw.gc14"><code>GameEventProcessor</code></a>; persistence is delegated to <a href="SaveManager.html" title="class in it.polimi.ingsw.gc14"><code>SaveManager</code></a>.
<p>The original <code>ServerLauncher</code> class is preserved and untouched.
This class is a clean replacement that uses the new component structure.</div>
</div>
</section>
<section class="summary">
<ul class="summary-list">
<!-- =========== FIELD SUMMARY =========== -->
<li>
<section class="field-summary" id="field-summary">
<h2>Field Summary</h2>
<div class="caption"><span>Fields</span></div>
<div class="summary-table three-column-summary">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Field</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color"><code>private final <a href="GameEventProcessor.html" title="class in it.polimi.ingsw.gc14">GameEventProcessor</a></code></div>
<div class="col-second even-row-color"><code><a href="#eventProcessor" class="member-name-link">eventProcessor</a></code></div>
<div class="col-last even-row-color">
<div class="block">Drives the main game-event loop.</div>
</div>
</div>
</section>
</li>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<li>
<section class="constructor-summary" id="constructor-summary">
<h2>Constructor Summary</h2>
<div class="caption"><span>Constructors</span></div>
<div class="summary-table two-column-summary">
<div class="table-header col-first">Constructor</div>
<div class="table-header col-last">Description</div>
<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E(java.util.concurrent.BlockingQueue,it.polimi.ingsw.gc14.Controller.GameController,it.polimi.ingsw.gc14.LimitedMap,it.polimi.ingsw.gc14.Network.CompositeClientBroadcaster,it.polimi.ingsw.gc14.SaveManager)" class="member-name-link">ServerLauncher</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/BlockingQueue.html" title="class or interface in java.util.concurrent" class="external-link">BlockingQueue</a>&lt;<a href="Network/NetworkEvent.html" title="class in it.polimi.ingsw.gc14.Network">NetworkEvent</a>&gt;&nbsp;actionQueue,
<a href="Controller/GameController.html" title="class in it.polimi.ingsw.gc14.Controller">GameController</a>&nbsp;gameController,
<a href="LimitedMap.html" title="class in it.polimi.ingsw.gc14">LimitedMap</a>&lt;<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>,<wbr><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Boolean.html" title="class or interface in java.lang" class="external-link">Boolean</a>&gt;&nbsp;playerList,
<a href="Network/CompositeClientBroadcaster.html" title="class in it.polimi.ingsw.gc14.Network">CompositeClientBroadcaster</a>&nbsp;broadcaster,
<a href="SaveManager.html" title="class in it.polimi.ingsw.gc14">SaveManager</a>&nbsp;saveManager)</code></div>
<div class="col-last even-row-color">
<div class="block">Constructs a <code>ServerLauncherTest</code> and wires all components together.</div>
</div>
</div>
</section>
</li>
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>Method Summary</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">All Methods</button><button id="method-summary-table-tab1" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab1', 3)" class="table-tab">Static Methods</button><button id="method-summary-table-tab2" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab2', 3)" class="table-tab">Instance Methods</button><button id="method-summary-table-tab4" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab4', 3)" class="table-tab">Concrete Methods</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel" aria-labelledby="method-summary-table-tab0">
<div class="summary-table three-column-summary">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Method</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#chooseNetworkInterface(java.util.Scanner)" class="member-name-link">chooseNetworkInterface</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Scanner.html" title="class or interface in java.util" class="external-link">Scanner</a>&nbsp;scanner)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
<div class="block">Lists active non-loopback IPv4 network interfaces and prompts the operator
to choose one.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>(package private) static void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#main(java.lang.String%5B%5D)" class="member-name-link">main</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>[]&nbsp;args)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
<div class="block">Initializes all server components, wires them together, restores a saved
game if available, and starts the event-processing loop and both network
servers.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>private static void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#restoreGameIfSaved(it.polimi.ingsw.gc14.Controller.GameController,it.polimi.ingsw.gc14.LimitedMap,it.polimi.ingsw.gc14.SaveManager)" class="member-name-link">restoreGameIfSaved</a><wbr>(<a href="Controller/GameController.html" title="class in it.polimi.ingsw.gc14.Controller">GameController</a>&nbsp;gameController,
<a href="LimitedMap.html" title="class in it.polimi.ingsw.gc14">LimitedMap</a>&lt;<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>,<wbr><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Boolean.html" title="class or interface in java.lang" class="external-link">Boolean</a>&gt;&nbsp;playerList,
<a href="SaveManager.html" title="class in it.polimi.ingsw.gc14">SaveManager</a>&nbsp;saveManager)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
<div class="block">Attempts to restore a previously saved game.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#run()" class="member-name-link">run</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Runs the event-processing loop until the thread is interrupted.</div>
</div>
</div>
</div>
</div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-java.lang.Object">Methods inherited from class&nbsp;<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#method-summary" title="class or interface in java.lang" class="external-link">Object</a></h3>
<code><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#clone()" title="class or interface in java.lang" class="external-link">clone</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#finalize()" title="class or interface in java.lang" class="external-link">finalize</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#getClass()" title="class or interface in java.lang" class="external-link">getClass</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hashCode</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#notify()" title="class or interface in java.lang" class="external-link">notify</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#notifyAll()" title="class or interface in java.lang" class="external-link">notifyAll</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#toString()" title="class or interface in java.lang" class="external-link">toString</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#wait()" title="class or interface in java.lang" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#wait(long)" title="class or interface in java.lang" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#wait(long,int)" title="class or interface in java.lang" class="external-link">wait</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ============ FIELD DETAIL =========== -->
<li>
<section class="field-details" id="field-detail">
<h2>Field Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="eventProcessor">
<h3>eventProcessor</h3>
<div class="horizontal-scroll">
<div class="member-signature"><span class="modifiers">private final</span>&nbsp;<span class="return-type"><a href="GameEventProcessor.html" title="class in it.polimi.ingsw.gc14">GameEventProcessor</a></span>&nbsp;<span class="element-name">eventProcessor</span></div>
<div class="block">Drives the main game-event loop.</div>
</div>
</section>
</li>
</ul>
</section>
</li>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<li>
<section class="constructor-details" id="constructor-detail">
<h2>Constructor Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="&lt;init&gt;(java.util.concurrent.BlockingQueue,it.polimi.ingsw.gc14.Controller.GameController,it.polimi.ingsw.gc14.LimitedMap,it.polimi.ingsw.gc14.Network.CompositeClientBroadcaster,it.polimi.ingsw.gc14.SaveManager)">
<h3>ServerLauncher</h3>
<div class="horizontal-scroll">
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name">ServerLauncher</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/BlockingQueue.html" title="class or interface in java.util.concurrent" class="external-link">BlockingQueue</a>&lt;<a href="Network/NetworkEvent.html" title="class in it.polimi.ingsw.gc14.Network">NetworkEvent</a>&gt;&nbsp;actionQueue,
<a href="Controller/GameController.html" title="class in it.polimi.ingsw.gc14.Controller">GameController</a>&nbsp;gameController,
<a href="LimitedMap.html" title="class in it.polimi.ingsw.gc14">LimitedMap</a>&lt;<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>,<wbr><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Boolean.html" title="class or interface in java.lang" class="external-link">Boolean</a>&gt;&nbsp;playerList,
<a href="Network/CompositeClientBroadcaster.html" title="class in it.polimi.ingsw.gc14.Network">CompositeClientBroadcaster</a>&nbsp;broadcaster,
<a href="SaveManager.html" title="class in it.polimi.ingsw.gc14">SaveManager</a>&nbsp;saveManager)</span></div>
<div class="block">Constructs a <code>ServerLauncherTest</code> and wires all components together.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>actionQueue</code> - the shared event queue.</dd>
<dd><code>gameController</code> - the server-side game controller.</dd>
<dd><code>playerList</code> - the shared player-status map.</dd>
<dd><code>broadcaster</code> - the broadcaster used to reach all connected clients.</dd>
<dd><code>saveManager</code> - the save manager used to persist game state.</dd>
</dl>
</div>
</section>
</li>
</ul>
</section>
</li>
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>Method Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="main(java.lang.String[])">
<h3>main</h3>
<div class="horizontal-scroll">
<div class="member-signature"><span class="modifiers">static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">main</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>[]&nbsp;args)</span>
throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.rmi/java/rmi/RemoteException.html" title="class or interface in java.rmi" class="external-link">RemoteException</a></span></div>
<div class="block">Initializes all server components, wires them together, restores a saved
game if available, and starts the event-processing loop and both network
servers.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>args</code> - command-line arguments (unused).</dd>
<dt>Throws:</dt>
<dd><code><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.rmi/java/rmi/RemoteException.html" title="class or interface in java.rmi" class="external-link">RemoteException</a></code> - if the RMI server cannot be created.</dd>
</dl>
</div>
</section>
</li>
<li>
<section class="detail" id="run()">
<h3>run</h3>
<div class="horizontal-scroll">
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">run</span>()</div>
<div class="block">Runs the event-processing loop until the thread is interrupted.
<p>A <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/ConcurrentModificationException.html" title="class or interface in java.util" class="external-link"><code>ConcurrentModificationException</code></a> is caught and logged rather</div>
</div>
</section>
</li>
<li>
<section class="detail" id="restoreGameIfSaved(it.polimi.ingsw.gc14.Controller.GameController,it.polimi.ingsw.gc14.LimitedMap,it.polimi.ingsw.gc14.SaveManager)">
<h3>restoreGameIfSaved</h3>
<div class="horizontal-scroll">
<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">restoreGameIfSaved</span><wbr><span class="parameters">(<a href="Controller/GameController.html" title="class in it.polimi.ingsw.gc14.Controller">GameController</a>&nbsp;gameController,
<a href="LimitedMap.html" title="class in it.polimi.ingsw.gc14">LimitedMap</a>&lt;<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>,<wbr><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Boolean.html" title="class or interface in java.lang" class="external-link">Boolean</a>&gt;&nbsp;playerList,
<a href="SaveManager.html" title="class in it.polimi.ingsw.gc14">SaveManager</a>&nbsp;saveManager)</span></div>
<div class="block">Attempts to restore a previously saved game.
<p>The save is discarded if all but at most one player was offline at the
time of the crash, since there would be nobody to resume the game with.
Otherwise, the model is restored, the player-list limit is set, and each
player who was offline at crash time is pre-populated as offline so the
reconnection flow can handle them correctly.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>gameController</code> - the controller that will receive the restored model.</dd>
<dd><code>playerList</code> - the player-status map to populate.</dd>
<dd><code>saveManager</code> - the save manager to load from.</dd>
</dl>
</div>
</section>
</li>
<li>
<section class="detail" id="chooseNetworkInterface(java.util.Scanner)">
<h3>chooseNetworkInterface</h3>
<div class="horizontal-scroll">
<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name">chooseNetworkInterface</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Scanner.html" title="class or interface in java.util" class="external-link">Scanner</a>&nbsp;scanner)</span>
throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
<div class="block">Lists active non-loopback IPv4 network interfaces and prompts the operator
to choose one. If only one interface is available it is selected automatically.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>scanner</code> - the scanner used to read the operator's choice.</dd>
<dt>Returns:</dt>
<dd>the IPv4 address of the selected interface.</dd>
<dt>Throws:</dt>
<dd><code><a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></code> - if no valid network interface is available.</dd>
</dl>
</div>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
</div>
</body>
</html>