Jump to content

Recommended Posts

Posted

If you want to e.g. get the number and names of all player who are currently playing on a CS-server, you have to send a so-called "query" to this server (using UDP) and handle everything the server sends back to you. This isn't as easy as it sounds. At first, you would have to 'learn', or, at least, understand the protocol a CS-server uses (e.g. what do I have to send to the server to get a 'good' reply and what's the structure of this reply).

The following script echos the output to your active window. You will have to modify it to be able to use it as 'bot'. It's a more complex script and you don't need to understand it (completely) to be able to use it.

; HL server query snippet by Saturn
;
; 16-04-2009: update to protocol version 48 by NaNg
; 29-01-2011: update to fix UTF8 problem in mIRC 7.* and fixed name problems if last char is space by NaNg
;
; usage:
; /hlinfo <ip> <port>
; or: /hlinfo <ip>:<port>
; /hlplay <ip> <port>
; or: /hlplay <ip>:<port>

; the alias that opens a new socket if you want to get general information about a running CS-server
alias hlinfo {
 if (!$2) tokenize 58 $1

 ; using a dynamic socket name so we can use multiple instances at once
 var %sock = $+(hlinfo-,$ticks)
 ; construct the query to send to the server
 bset &t 1 255 255 255 255
 bset -t &t 5 TSource Engine Query
 bset &t 25 0
 ; actually open the socket, and send the query
 sockudp -k %sock $1-2 &t
 ; closing the socket after 60seconds if there is no response (else it will be closed by another event (see below))
 .timer $+ %sock 1 60 sockclose %sock
}

; this event will get all data sent back from the server
on *:UDPREAD:hlinfo-*:{
 ; save it in a binary variable
 sockread -f &reply

 ; set some local variables that we will use below
 var %offset, %name, %map, %game, %num, %max, %ip, %dir

 ; following the protocol, this "m" shows us that we queried a Half-Life 1 server
 if ($chr($bvar(&reply,5)) == m) {
   ; Half-Life 1 info reply

   %offset = 6

   ; save the ip
   %ip = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   ; the same
   %name = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   ; the current map
   %map = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   ; the game directory
   %dir = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   ; the name of the game
   %game = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   ; current and maximum players
   %num = $bvar(&reply,%offset)
   %max = $bvar(&reply,$calc(%offset + 1))
 }

 ; else we get data for a CS:Source game
 else {
   ; Source info reply
   ; we do the same as above
   %offset = 7

   %name = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   %map = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   %dir = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   %game = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   %num = $bvar(&reply,$calc(%offset + 2))
   %max = $bvar(&reply,$calc(%offset + 3))
 }

 ; now we echo all stored details to the active window
 echo -a Info for $sock($sockname).saddr $+ : $+ $sock($sockname).sport
 echo -a Name: %name
 echo -a Map: %map
 echo -a Game: %game
 echo -a Players: %num $+ / $+ %max

 ; and turn off the timer closing the socket
 .timer $+ $sockname off
 ; as we can close it now manually
 sockclose $sockname
}


; this is the alias that will be called from hlplay to open the socket
alias hlchal {
 ; $1 = ip, $2 = port, $3- = what to call when received
 ; use dynamic socket name as above
 var %sock = $+(hlchal-,$ticks)
 ; construct the query to send to the server
 bset &t 1 255 255 255 255 85 255 255 255 255
 ; open the socket, and ask for a player challenge number
 sockudp -k %sock $1-2 &t
 ; mark it with the ip and port (and the query we want to call when we've received something from the server)
 sockmark %sock $3- $1-2
 ; and make a new timer to close it after 60 seconds
 .timer $+ %sock 1 60 sockclose %sock
}

; read everything that comes back from the hlchal-* query
on *:UDPREAD:hlchal-*:{
 ; and save it in the binary variable called &reply
 sockread -f &reply
 ; actually call the alias saved in the sockmark (hlplay_query)
 $sock($sockname).mark $bvar(&reply,6,4)
 ; and turn the timer off because we can close it manually
 .timer $+ $sockname off
 sockclose $sockname
}

; the alias we can call to make everything easier
; it will call other aliases to open sockets etc.
alias hlplay {
 if (!$2) tokenize 58 $1
 hlchal $1-2 hlplay_query
}

; the alias that opens the _real_ socket to receive data (everything before was just to challenge the server (read the website mentioned above))
alias hlplay_query {
 ; set a binary variable
 bset &query 1 255 255 255 255 85 $3-
 ; use dynamic socket names again
 var %sock = $+(hlplay-,$ticks)
 ; open the socket
 sockudp -k %sock $1-2 &query
 ; and turn on the timer closing the socket after 60seconds
 .timer $+ %sock 1 60 sockclose %sock
}

; this event will receive all data from the server as response to our query
on *:UDPREAD:hlplay-*:{
 ; we save it in &reply
 sockread -f &reply

 ; set some local variables we will use later
 var %i = 1, %num = $bvar(&reply,6), %offset = 7
 var %count = 0, %name, %kills

 ; and echo the number of players
 echo -a Players on $sock($sockname).saddr $+ : $+ $sock($sockname).sport

 ; now we can loop through all player and save some details about them
 while (%i <= %num) {
   inc %offset

   ; the name
   %name = $bvar(&reply,%offset,128).text
   inc %offset $calc($len($bvar(&reply,%offset,128).text) + 1)

   ; the kills
   %kills = $bvar(&reply,%offset).long
   if ($isbit(%kills,32)) dec %kills $calc(2^32)
   inc %offset 8

   ; and if there was a player
   if (%name != $null) {
     ; increase the variable that shows us the number of the player
     inc %count
     ; and echo it to the active window with the kills saved above
     echo -a %count $+ . %name - %kills
   }

   ; increase %i so we go on with the next player
   inc %i
 }

 ; if there are no players online, echo it aswell
 if (%count == 0) echo -a No players found!

 ; turn off the timer
 .timer $+ $sockname off
 ; and close the socket manually
 sockclose $sockname
}

Example:

example.png

i hope i helped ya..

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • Inventory restock: Premium business accounts are now available.   ✔ Wallester Business EU 🇪🇺|💳 Unlimited virtual cards, physical cards, 🏦 multi-currency IBAN, ₿ crypto & stablecoin deposits. ✔ Stripe Business UK 🇬🇧|💳 Instant virtual cards (Visa/Mastercard), high-conversion checkout, multi-currency payouts, ₿ crypto payments, no-code payment links. ✔ Mercury Business US 🇺🇸|🏦 US checking & savings, 💳 unlimited virtual cards, domestic & International wires, native stablecoin settlement. ✔ Payset Business EU 🇪🇺|🏦 Multiple IBANs, UK sort code, SEPA Instant, 💳 unlimited virtual cards, multi-currency accounts. ✔ Novo Business US 🇺🇸|🏦 Business checking account, ACH payments & invoicing, 💳 virtual & physical cards, novo boost.
    • Let me see if I understand correctly, older gentlemen, when a newcomer shows up to create modern things with the help of AI, doing what you charge them to do, you point the finger and laugh. I believe that's why everything is stagnant. The product isn't for programming experts, it's for newcomers. Don't buy from you if they can do it themselves using this base. You're going to deliver a similar product, maybe even worse than this one, so why are you complaining? PowerShell, as you well know, started with it, then came new platforms and new apps, new creation models, all with different languages; I chose the simplest one for my taste. This is about being organized and knowing how to choose the right words for each situation. It's not 100%, but it already gives a good impression. Nothing is 100%, so a topic written by AI, and all the code that you charge an absurd amount for to prohibit and sell hacks, could be open source so that everyone can create new practices, new models, new information for passing packets, prohibiting the use of cheats that cause server owners to break so much. Let's remember that the Admin doesn't always shut down the server; it's the players who find problems and take advantage by buying and reselling items, and they say that the GM shuts down the server every week, but that's a lie. What they do is duplicate items with packages and sell them, but perhaps this could give some future developers a starting point to create their own protection following the model in the initial documentation. Because none of you answer a question from a newbie, you think you're superior because you have knowledge, but with AI, people like that can have the same knowledge as you, but with less practice. And if they practice a lot, 10,000 hours, they can be as good as all of you older developers in the L2J field.
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..