[מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

כאן יפורסמו מדריכים למתקדמים בשפה מירק סקריפטינג.

[מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי MiniMe ב 20 יולי 2008, 19:58

במדריך הבא נעסוק בקבלת פרטי שרת משרת משחק (שרת של משחקים שקיימים ב STEAM).
הנושאים עליהם אדבר:

א. הפקודה שצריך לשלוח
ב. המידע שמקבלים (כולל איך להשתמש ביעילות במשתנה בינארי בקבלת המידע)

א. הפקודה ששולחים לשרת.

את הפקודה כמובן שולחים בסוקט שנקרא UDP, זהו סוקט שנסגר לאחר שליחת הפקודה וקבלת המידע חזרה.
בעבר הפקודה לקבלת המידע מהשרתים הייתה אחרת (infostring), כיום לאחר שינוי המנוע והפרוטוקול בשרתים, הפקודה היא אחרת לגמרי.
כמו תמיד זיהוי הפקודה על ידי השרת מתבצע ע"י התחלת הפקודה בתו מספר 255, כפול 4:
קוד: בחר הכל
ÿÿÿÿ

(התו לא מוצג כמו שהוא אמור להיות מוצג, כיוון שהאתר לא תומך בהצגתו, בשביל לקבל את התו האמיתי אתם מוזמנים לבצע את הפקודה הבאה: /echo -a $chr(255), בהצלחה.)
כמובן שאני מעדיף לא להדביק אותו כל פעם אלא להשתמש בו בצורת מזהה:
קוד: בחר הכל
$str($chr(255),4)

הפקודה היא TSource Engine Query , ותחבירה הוא:
קוד: בחר הכל
/sockudp -kn <NAME> <IP> <PORT> &yuml;&yuml;&yuml;&yuml;TSource Engine Query


<NAME> - שם הסוקט, לבחירתכם.
<IP> - כתובת השרת (לפני הנקודותיים, כלומר, ללא הפורט).
<PORT> - פורט של השרת, בד"כ 27015.
גם פה, שמתי את &yuml;&yuml;&yuml;&yuml; כהדגמה אבל אני משתמש במזהה שהזכרתי קודם.

בשביל לקבל פינג ביחד עם המידע שחוזר, תצטרכו להציב משתנה בשם כלשהו עם ערך של ticks$, ובעת קבלת המידע לחסר את הticks באותו רגע בזה ששמור במשתנה, דוגמא:
קוד: בחר הכל
set %ticks $ticks


אם תרצו להשתמש באליאס מסויים, למשל בשביל לקצר תהליכים ולכתוב רק HL IP:PORT/, תוכלו להשתמש בדבר כזה:
קוד: בחר הכל
alias HL {
  /sockudp -kn HL $replace($1,:,$chr(32)) &yuml;&yuml;&yuml;&yuml;TSource Engine Query
  set %ticks $ticks
}


רצוי שתקבעו טיימר של כמה שניות שיודיע שהשרת לא מגיב אם הוא באמת לא מגיב בזמן שהקצבתם לו. למשל:

קוד: בחר הכל
alias HL {
  /sockudp -kn HL $replace($1,:,$chr(32)) &yuml;&yuml;&yuml;&yuml;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.
MiniMe
משתמש חדש
משתמש חדש
 
הודעות: 8
הצטרף: 20 יולי 2008, 19:32

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי TheOldWolf ב 20 יולי 2008, 20:04

מקסים :)

תודה.
סמל אישי של המשתמש
TheOldWolf
משתמש מתמיד
משתמש מתמיד
 
הודעות: 551
הצטרף: 05 יוני 2008, 00:16

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי Chief ב 20 יולי 2008, 20:14

Thats what im talking about baby :)
תמונה
תמונה
מנהל האתר והשרת בקהילת mIRC-iL.com (לשעבר mIRCx) - כל מה שרצית לדעת על מירק/mIRC ולא העזת לשאול.
לשליחת סקריפטים; תוספות; בוטים; תוכנות; עזרים; ולכל דבר אחר - ניתן לפנות אליי במייל chief@mirc-il.com
סמל אישי של המשתמש
Chief
מנהל האתר
מנהל האתר
 
הודעות: 916
הצטרף: 05 יוני 2008, 19:22
מיקום: http://www.mIRC-iL.com

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי uns ב 21 יולי 2008, 10:01

תודה כבר הרבה זמן שאני צריך ליצור חיבור לשרת משחק אבל אני לא יכול לעשות את זה בגלל שכל המדריכים נעלמו.
סמל אישי של המשתמש
uns
משתמש פעיל
משתמש פעיל
 
הודעות: 493
הצטרף: 12 יוני 2008, 19:30

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי Dor ב 24 יולי 2008, 20:52

הועבר למדריכים - מתקדמים.
סמל אישי של המשתמש
Dor
חבר של כבוד
חבר של כבוד
 
הודעות: 412
הצטרף: 05 יוני 2008, 00:25
מיקום: בויקי

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי unSeen ב 19 אוגוסט 2008, 01:01

תאמת הסקריפט שהכנת לא עובד.
כל שרת ושרת רושם Ping time out , גם אם זה לא מראה כך דרך המשחק.

בלי קשר , מדריך מצויין! תודה רבה.
unSeen
משתמש חדש
משתמש חדש
 
הודעות: 64
הצטרף: 16 אוגוסט 2008, 02:18

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי Newb ב 06 ספטמבר 2008, 02:06

unSeen כתב:תאמת הסקריפט שהכנת לא עובד.
כל שרת ושרת רושם Ping time out , גם אם זה לא מראה כך דרך המשחק.

בלי קשר , מדריך מצויין! תודה רבה.

קוד: בחר הכל
alias HL {
  sockudp -k 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
}

כדאי לערוך.. אנשים זקוקים למדריכים שלכם וחבל אם הם יהיו שגויים.
Newb
משתמש חדש
משתמש חדש
 
הודעות: 52
הצטרף: 19 יוני 2008, 16:02

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי oriel ב 08 ספטמבר 2008, 07:51

שאני עושה HL/ שהסקריפט עלי זה רושם לי : /sockudp: invalid parameters (line 2, remote.ini) זה כאילו אומר שהt- לא מתאים לא ?
oriel
משתמש חדש
משתמש חדש
 
הודעות: 139
הצטרף: 04 אוגוסט 2008, 13:16

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי Newb ב 08 ספטמבר 2008, 18:00

oriel כתב:שאני עושה HL/ שהסקריפט עלי זה רושם לי : /sockudp: invalid parameters (line 2, remote.ini) זה כאילו אומר שהt- לא מתאים לא ?

תנסה את:
קוד: בחר הכל
alias HL {
  sockudp -k 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
  echo -a Hostname: $gettok($HLVAR,2,254)
  echo -a Map: $gettok($HLVAR,3,254)
  echo -a Game: $gettok($HLVAR,5,254)
  echo -a Password: $iif(!%Pass,Not) Needed
  if ($asc($mid($gettok($HLVAR,6,254),2,1)) > 32) {
    echo -a Players: 0/ $+ $asc($mid($gettok($HLVAR,6,254),1,1))
  }
  else {
    echo -a Players: $asc($mid($gettok($HLVAR,6,254),1,1)) $+ / $+ $asc($mid($gettok($HLVAR,6,254),2,1))
  }
  echo -a Ping: $calc($ticks - %ticks) $+ ms
  unset %ticks
  .timertimeout off
}
Newb
משתמש חדש
משתמש חדש
 
הודעות: 52
הצטרף: 19 יוני 2008, 16:02

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי oriel ב 10 ספטמבר 2008, 22:36

Newb כתב:
oriel כתב:שאני עושה HL/ שהסקריפט עלי זה רושם לי : /sockudp: invalid parameters (line 2, remote.ini) זה כאילו אומר שהt- לא מתאים לא ?

תנסה את:
קוד: בחר הכל
alias HL {
  sockudp -k 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
  echo -a Hostname: $gettok($HLVAR,2,254)
  echo -a Map: $gettok($HLVAR,3,254)
  echo -a Game: $gettok($HLVAR,5,254)
  echo -a Password: $iif(!%Pass,Not) Needed
  if ($asc($mid($gettok($HLVAR,6,254),2,1)) > 32) {
    echo -a Players: 0/ $+ $asc($mid($gettok($HLVAR,6,254),1,1))
  }
  else {
    echo -a Players: $asc($mid($gettok($HLVAR,6,254),1,1)) $+ / $+ $asc($mid($gettok($HLVAR,6,254),2,1))
  }
  echo -a Ping: $calc($ticks - %ticks) $+ ms
  unset %ticks
  .timertimeout off
}

עכשיו זה כותב * /sockudp: invalid parameters (line 2, remote.ini) \:
oriel
משתמש חדש
משתמש חדש
 
הודעות: 139
הצטרף: 04 אוגוסט 2008, 13:16

Re: [מדריך] - קבלת מידע על מצב שרתי משחק במנוע STEAM (משחקי HL)

הודעהעל ידי unSeen ב 06 נובמבר 2008, 22:23

לדעתי המדריך הזה כבר לא רלוונטי כיוון שהיה אפדייט ששינה את כל צורת הקבלה של הלוגים.
unSeen
משתמש חדש
משתמש חדש
 
הודעות: 64
הצטרף: 16 אוגוסט 2008, 02:18


חזור אל מדריכים - מתקדמים

מי מחובר

משתמשים הגולשים בפורום זה: אין משתמשים רשומים ו 0 אורחים