You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

Dear visitor, welcome to Nitrado.net Prepaid Gameserver Community-Support - Archiv. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

feliTV

Unregistered

1

Friday, April 4th 2014, 10:29am

Minecraft Query

Hey,
ich arbeite gerade mit dieser MinecraftQueryClass

Spoiler Spoiler

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
<?php
class MinecraftQueryException extends Exception
{
    // Exception thrown by MinecraftQuery class
}

class MinecraftQuery
{
    /*
     * Class written by xPaw
     *
     * Website: http://xpaw.ru
     * GitHub: https://github.com/xPaw/PHP-Minecraft-Query
     */

    const STATISTIC 0x00;
    const HANDSHAKE 0x09;

    private $Socket;
    private $Players;
    private $Info;

    public function Connect$Ip$Port 25565$Timeout )
    {
        if( !is_int$Timeout ) || $Timeout )
        {
            throw new InvalidArgumentException'Timeout must be an integer.' );
        }

        $this->Socket = @FSockOpen'udp://' $Ip, (int)$Port$ErrNo$ErrStr$Timeout );

        if( $ErrNo || $this->Socket === false )
        {
            throw new MinecraftQueryException'Could not create socket: ' $ErrStr );
        }

        Stream_Set_Timeout$this->Socket$Timeout );
        Stream_Set_Blocking$this->Sockettrue );

        try
        {
            $Challenge $this->GetChallenge( );

            $this->GetStatus$Challenge );
        }
        // We catch this because we want to close the socket, not very elegant
        catch( MinecraftQueryException $e )
        {
            FClose$this->Socket );

            throw new MinecraftQueryException$e->getMessage( ) );
        }

        FClose$this->Socket );
    }

    public function GetInfo( )
    {
        return isset( $this->Info ) ? $this->Info false;
    }

    public function GetPlayers( )
    {
        return isset( $this->Players ) ? $this->Players false;
    }

    private function GetChallenge( )
    {
        $Data $this->WriteDataself :: HANDSHAKE );

        if( $Data === false )
        {
            throw new MinecraftQueryException'Failed to receive challenge.' );
        }

        return Pack'N'$Data );
    }

    private function GetStatus$Challenge )
    {
        $Data $this->WriteDataself :: STATISTIC$Challenge Pack'c*'0x000x000x000x00 ) );

        if( !$Data )
        {
            throw new MinecraftQueryException'Failed to receive status.' );
        }

        $Last '';
        $Info = Array( );

        $Data    SubStr$Data11 ); // splitnum + 2 int
        $Data    Explode"\x00\x00\x01player_\x00\x00"$Data );

        if( Count$Data ) !== )
        {
            throw new MinecraftQueryException'Failed to parse server\'s response.' );
        }

        $Players SubStr$Data], 0, -);
        $Data    Explode"\x00"$Data] );

        // Array with known keys in order to validate the result
        // It can happen that server sends custom strings containing bad things (who can know!)
        $Keys = Array(
            'hostname'   => 'HostName',
            'gametype'   => 'GameType',
            'version'    => 'Version',
            'plugins'    => 'Plugins',
            'map'        => 'Map',
            'numplayers' => 'Players',
            'maxplayers' => 'MaxPlayers',
            'hostport'   => 'HostPort',
            'hostip'     => 'HostIp'
        );

        foreach( $Data as $Key => $Value )
        {
            if( ~$Key )
            {
                if( !Array_Key_Exists$Value$Keys ) )
                {
                    $Last false;
                    continue;
                }

                $Last $Keys$Value ];
                $Info$Last ] = '';
            }
            else if( $Last != false )
            {
                $Info$Last ] = $Value;
            }
        }

        // Ints
        $Info'Players' ]    = IntVal$Info'Players' ] );
        $Info'MaxPlayers' ] = IntVal$Info'MaxPlayers' ] );
        $Info'HostPort' ]   = IntVal$Info'HostPort' ] );

        // Parse "plugins", if any
        if( $Info'Plugins' ] )
        {
            $Data Explode": "$Info'Plugins' ], );

            $Info'RawPlugins' ] = $Info'Plugins' ];
            $Info'Software' ]   = $Data];

            if( Count$Data ) == )
            {
                $Info'Plugins' ] = Explode"; "$Data] );
            }
        }
        else
        {
            $Info'Software' ] = 'Vanilla';
        }

        $this->Info $Info;

        if( $Players )
        {
            $this->Players Explode"\x00"$Players );
        }
    }

    private function WriteData$Command$Append "" )
    {
        $Command Pack'c*'0xFE0xFD$Command0x010x020x030x04 ) . $Append;
        $Length  StrLen$Command );

        if( $Length !== FWrite$this->Socket$Command$Length ) )
        {
            throw new MinecraftQueryException"Failed to write on socket." );
        }

        $Data FRead$this->Socket2048 );

        if( $Data === false )
        {
            throw new MinecraftQueryException"Failed to read from socket." );
        }

        if( StrLen$Data ) < || $Data] != $Command] )
        {
            return false;
        }

        return SubStr$Data);
    }
}


Nun wollte ich die Anzahl der OnlineSpieler auslesen. Ich denke es geht irgendwie mit

PHP Source code

1
$Query->getInfo('Players)
oder so.
(Das Beispiel funktioniert nicht!)

Danke

YourSky

User / Kunde

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

2

Friday, April 4th 2014, 2:15pm

Hier ist ein Beispiel: http://hastebin.com/ducececono.php
Mit freundlichen Grüßen,
Yonas


feliTV

Unregistered

3

Friday, April 4th 2014, 2:25pm

Sorry ich versteh nicht ganz wie komm ich jetzt an die zahl der OnlineSpieler dran?

YourSky

User / Kunde

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

4

Friday, April 4th 2014, 2:39pm

http://hastebin.com/kiriviguno.php Wenn du das immer noch nicht verstehst, kannst du ja die McAPIbenutzen.
Mit freundlichen Grüßen,
Yonas

This post has been edited 1 times, last edit by "YourSky" (Apr 4th 2014, 2:51pm)


feliTV

Unregistered

5

Friday, April 4th 2014, 3:06pm

Jaa jz hab ichs verstanden funtzt aber irgendwie nicht.

Code:

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
            require __DIR__ '/../MD/classes/MinecraftQuery.class.php';
            define('MQ_SERVER_ADDR''localhost');
            define('MQ_SERVER_PORT'25565);
            define('MQ_TIMEOUT'1);
            $Query = new MinecraftQuery();
            $info $Query->GetInfo();
            try {
                $Query -> Connect(MQ_SERVER_ADDRMQ_SERVER_PORTMQ_TIMEOUT);
            } catch(MinecraftQueryException $e) {
                $Exception $e;
            }
            if (isset($Exception)) {
                echo '<p class="text">Server Status: <font style=" z-index: 100; font-width: bolder;" color="#D42020" size="6px" face="ASL">Offline</font></p>';
                echo '<p class="text">Spieler: <font color="#FFFFFF" size="6" face="KiteOne">-</font></p>';

            } else {
                echo '<p class="text">Server Status: <font style=" z-index: 100; font-width: bolder;" color="#19C21D" size="6px" face="ASL">Online</font></p>';
                echo "Es sind" $info['Players'] . " von " $info['MaxPlayers'] . " online.";
            }   
            ?>

Es kommt raus:

PHP Source code

1
2
Server StatusOnline
Es sind von online.

YourSky

User / Kunde

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

6

Friday, April 4th 2014, 3:25pm

Du musst natürlich die Infos ($info = $Query->GetInfo();) nach dem du connectest holen ( $Query -> Connect(MQ_SERVER_ADDR, MQ_SERVER_PORT, MQ_TIMEOUT);).
Mit freundlichen Grüßen,
Yonas


feliTV

Unregistered

7

Friday, April 4th 2014, 4:45pm

Sorry für die Umstände ich bin noch nicht so weit in php ?(
Muss ich jz einfach nach dem connecten $Query->getInfo(); machen?

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net