הנושאים עליהם אדבר:
א. הפקודה שצריך לשלוח
ב. המידע שמקבלים (כולל איך להשתמש ביעילות במשתנה בינארי בקבלת המידע)
א. הפקודה ששולחים לשרת.
את הפקודה כמובן שולחים בסוקט שנקרא UDP, זהו סוקט שנסגר לאחר שליחת הפקודה וקבלת המידע חזרה.
בעבר הפקודה לקבלת המידע מהשרתים הייתה אחרת (infostring), כיום לאחר שינוי המנוע והפרוטוקול בשרתים, הפקודה היא אחרת לגמרי.
כמו תמיד זיהוי הפקודה על ידי השרת מתבצע ע"י התחלת הפקודה בתו מספר 255, כפול 4:
- קוד: בחר הכל
ÿÿÿÿ
(התו לא מוצג כמו שהוא אמור להיות מוצג, כיוון שהאתר לא תומך בהצגתו, בשביל לקבל את התו האמיתי אתם מוזמנים לבצע את הפקודה הבאה: /echo -a $chr(255), בהצלחה.)
כמובן שאני מעדיף לא להדביק אותו כל פעם אלא להשתמש בו בצורת מזהה:
- קוד: בחר הכל
$str($chr(255),4)
הפקודה היא TSource Engine Query , ותחבירה הוא:
- קוד: בחר הכל
/sockudp -kn <NAME> <IP> <PORT> ÿÿÿÿTSource Engine Query
<NAME> - שם הסוקט, לבחירתכם.
<IP> - כתובת השרת (לפני הנקודותיים, כלומר, ללא הפורט).
<PORT> - פורט של השרת, בד"כ 27015.
גם פה, שמתי את ÿÿÿÿ כהדגמה אבל אני משתמש במזהה שהזכרתי קודם.
בשביל לקבל פינג ביחד עם המידע שחוזר, תצטרכו להציב משתנה בשם כלשהו עם ערך של ticks$, ובעת קבלת המידע לחסר את הticks באותו רגע בזה ששמור במשתנה, דוגמא:
- קוד: בחר הכל
set %ticks $ticks
אם תרצו להשתמש באליאס מסויים, למשל בשביל לקצר תהליכים ולכתוב רק HL IP:PORT/, תוכלו להשתמש בדבר כזה:
- קוד: בחר הכל
alias HL {
/sockudp -kn HL $replace($1,:,$chr(32)) ÿÿÿÿTSource Engine Query
set %ticks $ticks
}
רצוי שתקבעו טיימר של כמה שניות שיודיע שהשרת לא מגיב אם הוא באמת לא מגיב בזמן שהקצבתם לו. למשל:
- קוד: בחר הכל
alias HL {
/sockudp -kn HL $replace($1,:,$chr(32)) ÿÿÿÿTSource Engine Query
set %ticks $ticks
.timertimeout 1 4 echo -a Server timed out ( $+ $1 $+ ) $(|) sockclose HL
}
ב. המידע שמקבלים
את המידע תקבלו בצורת UDP, כמובן, כי בצורה זאת שלחתם את הבקשה.
בשביל להתחיל, תצטרכו ליצור אירוע של קבלת מידע בסוקט:
- קוד: בחר הכל
on *:UDPREAD:NAME:
במקרה שהשתמשתם באליאס שנתתי קודם, הNAME יהיה HL, אם לא, הוא יהיה כמו שבחרתם בשליחה.
הדרך הכי בטוחה לקבל את המידע בשלמותו הוא לשמור אותו בתוך משתנה בינארי, דוגמא:
- קוד: בחר הכל
sockread &BVAR
לאחר מכן, החליפו את תו מספר 0, שמייצג רווחים במידע שהתקבל, בתו אחר, עדיף כזה שסביר להניח שלא יכלל בתוך המידע שקיבלתם, כמו 254.
איך עושים את זה?
- קוד: בחר הכל
breplace &BVAR 0 254
כמובן ש BVAR& הוא המשתנה שאליו הכנסתם את המידע.
עכשיו לניתוח המידע, בשביל לקבל את המידע בצורה בינארית, יש להשתמש במזהה הבא:
- קוד: בחר הכל
$bvar(&BVAR,1,$bvar(&BVAR,0))
כלומר, קבלת המידע מהתו הראשון, 1, עד לתו האחרון:
- קוד: בחר הכל
$bvar(&BVAR,0)
פה מתחיל הסינון... אם השרת ששלחתם אליו מידע הוא שרת בגרסאת Source, המילה תיכלל במידע שקיבלתם לגבי סוג המשחק, הסינון יתבצע בצורה הבאה:
- קוד: בחר הכל
if (Source !isin $gettok($bvar(&BVAR,1,$bvar(&BVAR,0)).text),5,254))
זה אומר שהוא לא בגרסא הזאת.
החלקים השונים במידע שקיבלתם:
החלקים כמובן מופרדים ע"י תו 254, כי זה מה שהגדרנו לו.
אני ממליץ להשתמש באליאס חדש שתיצרו בשביל לייצג את הטקסט שנכלל במשתנה הבינארי, כדי שלא תצטרכו לכתוב כל פעם את כל המזהה הארוך הזה.
- קוד: בחר הכל
alias HLVAR { return $bvar(&BVAR,1,$bvar(&BVAR,0)).text }
אחרי זה בשביל לקבל חלקים שונים, השתמשו ב:
- קוד: בחר הכל
$gettok($HLVAR,N,254)
כאשר את N תחליפו בחלק.
חלק 2 - שם השרת. (בסורס - 1 [להוציא ממנו את: I]]
חלק 3 - שם המפה. (בסורס - 2)
חלק 5 - סוג המשחק. (בסורס - 4)
חלק 6 - 2 התווים הראשונים בחלק זה מסמלים את מספר השחקנים בשרת + מספר השחקנים המקסימלי. התו השישי יציג אם קיימת סיסמא לשרת או לא. (אותו דבר בסורס)
בחלק זה צריך לבצע קצת ניתוח של התווים.
כלומר, מספר השחקנים המקסימלי בשרת לא יעלה על 32, לכן, אם התו השני בחלק זה במחרוזת גדול מ32, השרת ריק, כיוון שלגבי השחקנים שבפנים לא התקבל שום מידע. צורת הסינון:
- קוד: בחר הכל
if ($asc($mid($gettok($HLVAR,6,254),2,1) > 32)
במקרה זה, מספר השחקנים בשרת יהיה 0 מתוך התו הראשון בחלק זה של המחרוזת, כלומר:
- קוד: בחר הכל
$asc($mid($gettok($HLVAR,6,254),1,1)
במידה והתנאי לא יתקיים, מספר השחקנים יהיה התו הראשון מתוך התו השני, כלומר:
- קוד: בחר הכל
$asc($mid($gettok($HLVAR,6,254),1,1) / $asc($mid($gettok($HLVAR,6,254),2,1)
התו השישי בחלק הזה יראה אם קיימת סיסמא או לא, כלומר, אם הוא שווה ל1, יש סיסמא, אחרת אין.
לחישוב הפינג בא לעזרה המשתנה שקבענו קודם לכן, ticks%.
- קוד: בחר הכל
$calc($ticks - %ticks)
יציג את זמן התגובה של השרת ביחס למחשב שלכם במילי שניות [ms].
כמובן שאם האינטרנט שלכם עמוס ייקח לכם יותר זמן לקבל את התגובה, כלומר, הפינג במקרה הזה לא תלוי רק במהירות התגובה של השרת.
כמובן שפה גם תצטרכו לכבות את הטיימר שקבעתם להודיע שהשרת לא מגיב, אלא אם כן הוא כבר נגמר.
אם הטיימר כבה לבדו, זה אומר שהזמן שהקצבתם לשרת עבר, אם לא, תכבו אותו.
לסיום ,סקריפט מלא לקבל מידע על שרת רצוי:
- קוד: בחר הכל
alias HL {
sockudp -kn HL $replace($1,:,$chr(32)) $str($chr(255),4) $+ Tsource Engine Query
set %ticks $ticks
.timertimeout 1 4 echo -a Server timed out ( $+ $1 $+ ) $(|) sockclose HL
}
alias HLVAR { return $bvar(&HL,1,$bvar(&HL,0)).text }
on *:udpread:hl:{
sockread &HL
breplace &HL 0 254
var %source $iif(Source isin $gettok($HLVAR,5,254),1,0),%pass $iif($asc($mid($gettok($HLVAR,6,254),6,1)) == 1,1,0)
echo -a Hostname: $iif(!%source,$gettok($HLVAR,2,254),$remove($gettok($HLVAR,1,254),I))
echo -a Map: $iif(!%source,$gettok($HLVAR,3,254),$gettok($HLVAR,2,254))
echo -a Game: $iif(!%source,$gettok($HLVAR,5,254),$gettok($HLVAR,4,254))
echo -a Password: $iif(!%pass,Not) Needed
echo -a Ping: $calc($ticks - %ticks) $+ ms
if (%source) {
if (!$mid($gettok($HLVAR,6,254),2,1)) { echo -a 0/ $+ $asc($mid($gettok($HLVAR,6,254),1,1)) }
else { echo -a $asc($mid($gettok($HLVAR,6,254),1,1)) $+ / $+ $asc($mid($gettok($HLVAR,6,254),2,1)) }
}
else {
if ($asc($mid($gettok($HLVAR,6,254),2,1)) > 32) { echo -a 0/ $+ $asc($mid($gettok($HLVAR,6,254),1,1)) }
else { echo -a $asc($mid($gettok($HLVAR,6,254),1,1)) $+ / $+ $asc($mid($gettok($HLVAR,6,254),2,1)) }
}
unset %ticks
.timertimeout off
}
עד כאן המדריך.
כל הזכויות שמורות לMiniMe, נכתב עבור אתר mIRC-iL.








