Merge feature/messer-match-server in main
# Conflicts: # client/src/styles.css
This commit is contained in:
commit
148cd99856
10 files changed
+220
-20
No files matched your search
@@ -13,6 +13,7 @@ import EventLog from '../components/EventLog.jsx';
|
||||
import MapImage from '../components/MapImage.jsx';
|
||||
import SelfJoin from '../components/SelfJoin.jsx';
|
||||
import ChatBox from '../components/ChatBox.jsx';
|
||||
import CopyField from '../components/CopyField.jsx';
|
||||
|
||||
export default function MatchPage() {
|
||||
const { id } = useParams();
|
||||
@@ -172,7 +173,7 @@ function Stage(ctx) {
|
||||
{missing.map((t) => <li key={t.key}><strong className={`team-${t.key.toLowerCase()}`}>{t.name}:</strong> {readinessGap(t, state.requireFullTeams)}</li>)}
|
||||
</ul>
|
||||
)}
|
||||
{state.vetoStart === 'knife' && <KnifeRound state={state} />}
|
||||
{state.vetoStart === 'knife' && (state.server?.knife ? <OwnKnifeServer state={state} isOrg={isOrg} act={act} busy={busy} /> : <KnifeRound state={state} />)}
|
||||
{isOrg && state.vetoStart === 'knife' ? (
|
||||
<div className="knife-decide">
|
||||
<p>Wer hat die Messerrunde gewonnen? Dieses Team beginnt das Veto.</p>
|
||||
@@ -222,6 +223,50 @@ function Stage(ctx) {
|
||||
* Seitenwahl per Messerrunde: freie Messer-Server vorschlagen, passende Teamgröße zuerst.
|
||||
* Frei = niemand drauf (oder Spielerzahl unbekannt).
|
||||
*/
|
||||
/** Messerrunde auf dem eigenen Match-Server: derselbe Server wird nach dem Veto für das Match eingerichtet. */
|
||||
function OwnKnifeServer({ state, isOrg, act, busy }) {
|
||||
const { server } = state;
|
||||
const { knife, connect } = server;
|
||||
const live = knife.phase === 'live';
|
||||
return (
|
||||
<div className="knife-round">
|
||||
<h3>Seitenwahl per Messerrunde</h3>
|
||||
<p className="small">
|
||||
Für euer Match läuft ein eigener Server. Beide Teams verbinden sich, spielen dort eine Runde nur mit Messer, danach legt der
|
||||
Organisator fest, welches Team das Veto beginnt. Nach dem Veto geht es auf demselben Server weiter.
|
||||
</p>
|
||||
{!knife.ready ? (
|
||||
<p className="small tone-pending">
|
||||
<span className="status-dot tone-pending pulse" /> Der Server fährt hoch, die Verbindungsdaten erscheinen gleich hier.
|
||||
{server.message && <span className="muted"> ({server.message})</span>}
|
||||
</p>
|
||||
) : (
|
||||
<>
|
||||
<p className={`small ${live ? 'tone-ok' : 'tone-ok'}`}>
|
||||
<span className={`status-dot ${live ? 'tone-ok' : 'tone-ok'}`} />
|
||||
{live ? ' Messerrunde läuft' : ' Aufwärmphase: verbinden und warten, bis der Organisator die Runde startet'}
|
||||
{server.playerCount != null && <span className="muted"> · {server.playerCount} auf dem Server</span>}
|
||||
</p>
|
||||
{connect && (
|
||||
<div className="knife-connect">
|
||||
<CopyField label="In die CS2-Konsole einfügen" value={connect.command} secret />
|
||||
<a className="btn btn-primary" href={connect.steamUrl}>In CS2 verbinden</a>
|
||||
</div>
|
||||
)}
|
||||
{isOrg && (
|
||||
<div className="row knife-actions">
|
||||
{!live && <button className="btn btn-sm btn-primary" disabled={!!busy} onClick={() => act('server/knife-start', null, 'Messerrunde gestartet')}>Messerrunde starten</button>}
|
||||
<button className="btn btn-sm" disabled={!!busy} onClick={() => act('server/knife-reset', null, 'Zurück in der Aufwärmphase')}>
|
||||
{live ? 'Runde wiederholen (Aufwärmphase)' : 'Aufwärmphase neu starten'}
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function KnifeRound({ state }) {
|
||||
const [servers, setServers] = useState(null);
|
||||
useEffect(() => {
|
||||
|
||||
Reference in new issue
Block a user