1: <?php declare(strict_types=1);
2:
3: /**
4: * Clansuite Server Query
5: *
6: * SPDX-FileCopyrightText: 2003-2025 Jens A. Koch
7: * SPDX-License-Identifier: MIT
8: *
9: * For the full copyright and license information, please view
10: * the LICENSE file that was distributed with this source code.
11: */
12:
13: namespace Clansuite\ServerQuery\ServerProtocols;
14:
15: use function is_int;
16: use function is_string;
17: use Override;
18:
19: /**
20: * Implements the query protocol for Counter-Strike 2 servers.
21: * Uses the Steam protocol to retrieve server information, player lists, and game statistics.
22: */
23: class Cs2 extends Steam
24: {
25: /**
26: * Protocol name.
27: */
28: public string $name = 'Counter-Strike 2';
29:
30: /**
31: * List of supported games.
32: *
33: * @var array<string>
34: */
35: public array $supportedGames = ['Counter-Strike 2'];
36:
37: /**
38: * Protocol identifier.
39: */
40: public string $protocol = 'A2S';
41:
42: /**
43: * Game series.
44: *
45: * @var array<string>
46: */
47: public array $game_series_list = ['Counter-Strike'];
48:
49: /**
50: * CS2 specific port adjustment if needed.
51: * Some CS2 servers use same port for game and queries (unlike traditional Valve +1 convention).
52: */
53: protected int $port_diff = 0;
54:
55: /**
56: * Constructor.
57: */
58: public function __construct(mixed $address = null, mixed $queryport = null)
59: {
60: $address = $address === null ? null : (is_string($address) ? $address : null);
61: $queryport = $queryport === null ? null : (is_int($queryport) ? $queryport : null);
62: parent::__construct($address, $queryport);
63:
64: // For CS2, query port is game port + 1
65: if ($queryport !== null) {
66: $this->queryport = $queryport + $this->port_diff;
67: }
68: }
69:
70: /**
71: * Returns a native join URI for CS2.
72: */
73: #[Override]
74: public function getNativeJoinURI(): string
75: {
76: return 'steam://connect/' . $this->address . ':' . $this->hostport;
77: }
78:
79: /**
80: * query_server method.
81: */
82: #[Override]
83: public function query_server(bool $getPlayers = true, bool $getRules = true): bool
84: {
85: // CS2 does not respond to A2S_RULES queries, so skip rules
86: return parent::query_server($getPlayers, false);
87: }
88: }
89: