#include <config.h>#include <properties.h>#include <moving.h>#include "/secure/wizlevels.h"#include <telnet.h>#include <defines.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | SSL_GRRETING "REMOTE_HOST=" |
| #define | PROXIES ({"127.0.0.1","84.16.224.224"}) |
| #define | GUESTMASTER "/secure/guestmaster" |
| #define | DEBUG(x) if(find_player("tiamak")) tell_object(find_player("tiamak"),x) |
| #define | DEBUGM(x) if(find_player("muadib")) tell_object(find_player("muadib"),x) |
Funktionen | |
| static void | SendTelopts () |
| public nomask string | loginname () |
| public nomask int | logon () |
| static int | check_illegal (string str) |
| static int | valid_name (string str) |
| static int | logon2 (string str) |
| static int | new_password (string str) |
| static int | again_password (string str) |
| static int | check_password (string str) |
| static void | select_race () |
| static void | ask_race_question () |
| static void | get_race_answer (string str) |
| static int | load_player_object (int guestflag) |
| static void | load_player_ob_2 (string obname, int guestflag) |
| public void | create () |
| public string | short () |
| public string | query_real_name () |
| public nomask int | query_prevent_shadow () |
| static void | time_out () |
| public int | remove () |
| public mixed | new_logon (string str) |
| static mixed | new_load_player_object () |
| static mixed | new_load_player_ob_2 (string obname) |
| static void | reask_hc_question () |
| static void | ask_hc_question () |
| static void | get_hc_answer (string str) |
| static void | ask_mud_played_question () |
| static void | get_mud_played_answer (string str) |
| static int | check_too_many_logons () |
| static int | check_too_many_from_same_ip () |
| string | query_realip () |
Variablen | |
| inherit secure mini_telnetneg | c |
| int | level |
| int | loginfails |
| int | creation_date |
| string | password |
| string | name |
| string | shell |
| string | ep |
| string | ek |
| string | mq |
| string | ektips |
| string | fptips |
| string * | domains |
| string * | guilds |
| string * | uidstotakecare |
| static int | invis |
| static int | neu |
| static string | loginname |
| static string | cap_name |
| static object | myself |
| static string * | userentry |
| static string | banish |
| static mixed * | races |
| static int | hc_play |
| static int | newbie |
| static int | hc_confirm |
| static string | realip |
| #define DEBUG | ( | x | ) | if(find_player("tiamak")) tell_object(find_player("tiamak"),x) |
| #define DEBUGM | ( | x | ) | if(find_player("muadib")) tell_object(find_player("muadib"),x) |
| #define GUESTMASTER "/secure/guestmaster" |
Definiert in Zeile 43 der Datei login.c.
Wird benutzt von load_player_ob_2() und load_player_object().
| #define PROXIES ({"127.0.0.1","84.16.224.224"}) |
| #define SSL_GRRETING "REMOTE_HOST=" |
| static int again_password | ( | string | str | ) | [static] |
Definiert in Zeile 493 der Datei login.c.
Benutzt call_out(), destruct(), load_player_object(), loginname, master, password, save_object() und SECURESAVEPATH.
00494 { 00495 write( "\n" ); 00496 00497 if ( str != password ){ 00498 write( "Die Passwoerter stimmten nicht ueberein!\n" ); 00499 destruct( this_object() ); 00500 return 1; 00501 } 00502 00503 while ( remove_call_out( "time_out" ) != -1 ) 00504 ; 00505 call_out( "time_out", 600 ); 00506 00507 password = md5_crypt( password, 0 ); 00508 save_object( SECURESAVEPATH + loginname[0..0] + "/" + loginname ); 00509 master()->RemoveFromCache( loginname ); 00510 00511 load_player_object(0); 00512 return 1; 00513 }

| static void ask_hc_question | ( | ) | [static] |
Definiert in Zeile 630 der Datei login.c.
Benutzt break_string(), BS_LEAVE_MY_LFS, input_to() und newbie.
Wird benutzt von get_hc_answer() und get_race_answer().
00631 { 00632 write( break_string( 00633 "\nDu musst Dich nun entscheiden, ob Du dieser Welt mit den Mitteln "+ 00634 "der Wiedergeburt entgegentreten willst, oder ob Dir ein Leben "+ 00635 "ausreicht. Triff diese Wahl sorgfaeltig, es gibt keine zweite "+ 00636 "Wahl. Sollte Dir nicht klar sein, was diese Frage bedeutet, so "+ 00637 "bekommst du mit \"?\" Hilfe.\n\n",78,0,BS_LEAVE_MY_LFS)); 00638 00639 if (newbie) 00640 { 00641 write("Du solltest hier unbedingt \"nein\" eingeben.\n" 00642 "Eine andere Wahl bringt keine Vorteile!\n"); 00643 } 00644 write( "\nNun entscheide Dich, willst Du nur ein Leben?(ja,nein,?): " ); 00645 00646 input_to( "get_hc_answer" ); 00647 return; 00648 }


| static void ask_mud_played_question | ( | ) | [static] |
Definiert in Zeile 650 der Datei login.c.
Benutzt break_string(), BS_LEAVE_MY_LFS und input_to().
Wird benutzt von get_mud_played_answer().
00651 { 00652 write(break_string( 00653 "\nWenn Du ein absoluter Neuling in diesem Spiel bist moechten " 00654 "wir Dir mit einigen Tips zu Beginn beiseite stehen.\n\n" 00655 "Hast Du schon einmal in einem MUD gespielt?(ja,nein): ",78, 00656 0,BS_LEAVE_MY_LFS)); 00657 input_to( "get_mud_played_answer" ); 00658 return; 00659 }


| static void ask_race_question | ( | ) | [static] |
Definiert in Zeile 661 der Datei login.c.
Benutzt break_string(), BS_LEAVE_MY_LFS, i, input_to(), newbie und races.
Wird benutzt von get_mud_played_answer() und get_race_answer().
00662 { 00663 int i, j; 00664 00665 write( break_string( "Du musst Dich jetzt entscheiden, welcher Rasse Du " 00666 "in dieser Welt angehoeren moechtest. Alle Rassen " 00667 "haben verschiedene Vor- und Nachteile, insgesamt " 00668 "aber gleich gute Chancen. Auch das Startgebiet " 00669 "haengt von der ausgewaehlten Rasse ab. Im " 00670 "Normalfall kann die Rasse nicht mehr gewechselt " 00671 "werden, nachdem sie einmal ausgewaehlt wurde. " 00672 "Ueberlege Dir Deine Entscheidung also gut. Derzeit " 00673 "stehen folgende Rassen zur Auswahl:\n\n", 78 ) ); 00674 00675 for ( i = 0, j = sizeof(races); i < j; i++ ) 00676 printf( "% 2d. %-30s %s", i+1, capitalize(races[i][1]), 00677 (i % 2 ? "\n" : "| ") ); 00678 00679 if ( sizeof(races) % 2 ) 00680 write( "\n" ); 00681 00682 write( break_string( "\nDurch Eingabe einer Ziffer waehlst Du die Rasse " 00683 "aus, durch Eingabe eines \"\?\" gefolgt von einer " 00684 "Ziffer erhaelst Du naehere Informationen ueber " 00685 "eine Rasse. Ein \"\?\" allein wiederholt diese " 00686 "Liste.", 78, 0, 1 ) ); 00687 00688 if (newbie) 00689 { 00690 write(break_string("\nAls Neuling solltest Du Dich NICHT fuer " 00691 "die Dunkelelfen entscheiden. Diese " 00692 "Rasse hat einige Probleme im Umgang " 00693 "mit den anderen Rassen und mit dem " 00694 "Sonnenlicht.",78,0,BS_LEAVE_MY_LFS)); 00695 } 00696 write( "\nWas willst Du tun: " ); 00697 00698 input_to( "get_race_answer" ); 00699 return; 00700 }


| static int check_illegal | ( | string | str | ) | [static] |
Definiert in Zeile 221 der Datei login.c.
Benutzt ctime(), log_file, master, query_ip_name() und query_ip_number().
Wird benutzt von logon2().
00222 { 00223 string res; 00224 00225 res = (string)master()->QuerySBanished(query_ip_number(this_object())); 00226 00227 if ( res ){ 00228 write( res ); 00229 log_file( "LOGIN_DENY", sprintf( "%s: %-11s %-15s (%s)\n", 00230 ctime(time())[4..15], str, 00231 query_ip_number(this_object()), 00232 query_ip_name(this_object()) ) ); 00233 this_object()->remove(); 00234 return 1; 00235 } 00236 00237 return 0; 00238 }


| static int check_password | ( | string | str | ) | [static] |
Definiert in Zeile 515 der Datei login.c.
Benutzt crypt, ctime(), destruct(), invis, level, load_player_object(), log_file, loginfails, loginname, master, password, query_ip_name(), query_ip_number(), save_object() und SECURESAVEPATH.
00516 { 00517 write( "\n" ); 00518 00519 // Invis einloggen? 00520 if (strlen(str) > 1 && str[0] == '-') { 00521 invis = 1; 00522 str = str[1..]; 00523 } 00524 00525 // welcher Hash ists denn? 00526 if (strlen(password) > 13) { 00527 // MD5-Hash 00528 str = md5_crypt(str, password); 00529 } 00530 else if (strlen(password) > 2) { 00531 // Crypt-Hash 00532 str = crypt(str, password[0..1]); 00533 } 00534 else { 00535 // keiner von beiden Hashes -> ungueltiges PW 00536 str = 0; 00537 } 00538 00539 if ( !stringp(str) || str != password ) { 00540 // Hashes stimmen nicht ueberein -> und schluss... 00541 write( "Falsches Passwort!\n" ); 00542 00543 log_file( (level < 60 ? "LOGINFAIL" : "ARCH/LOGINFAIL"), 00544 sprintf( "PASSWORD: %-11s %s, %-15s (%s)\n", 00545 loginname, ctime(time())[4..15], 00546 query_ip_number(this_object()), 00547 query_ip_name(this_object()) ), 200000 ); 00548 00549 loginfails++; 00550 save_object( SECURESAVEPATH + loginname[0..0] + "/" + loginname ); 00551 master()->RemoveFromCache( loginname ); 00552 destruct( this_object() ); 00553 return 1; 00554 } 00555 00556 if ( loginfails ) { 00557 write( loginfails + " fehlgeschlagene" + (loginfails == 1 ? "r" : "") + 00558 " Login-Versuch" + (loginfails == 1 ? "" : "e") + 00559 " seit dem letzten erfolgreichen Login.\n" ); 00560 loginfails = 0; 00561 } 00562 00563 save_object( SECURESAVEPATH + loginname[0..0] + "/" + loginname ); 00564 master()->RemoveFromCache( loginname ); 00565 00566 load_player_object(0); 00567 return 1; 00568 }

| static int check_too_many_from_same_ip | ( | ) | [static] |
Definiert in Zeile 189 der Datei login.c.
Benutzt addr(), ctime(), destruct(), log_file, MUDNAME, ob(), P_AGE, query_ip_name() und query_ip_number().
Wird benutzt von logon2().
00190 { 00191 object *u; 00192 string ip; 00193 00194 ip = query_ip_number(this_object()); 00195 u = filter(users(), function status (object ob, string addr, int a) { 00196 return query_ip_number(ob) == addr 00197 && ob->QueryProp(P_AGE) < a; 00198 }, ip, 12*60*60); // 24h in heart_beats 00199 00200 if ( sizeof(u) > 25 ){ 00201 write( "\nDa anscheinend gerade jemand von Deiner Adresse aus " 00202 "versucht, das \n"MUDNAME" mit neuen Charakteren zu " 00203 "ueberschwemmen, werden momentan \nnur aeltere Charaktere " 00204 "von dieser Adresse zugelassen.\nWenn Du meinst, dass es " 00205 "sich um einen Fehler handelt, logg Dich bitte als \n" 00206 "Gast ein und sprich einen Erzmagier oder Gott an.\n" ); 00207 00208 log_file( "LOGIN_DENY", sprintf( "%s: >10 Spieler von %-15s (%s)\n", 00209 ctime(time())[4..15], 00210 query_ip_number(this_object()), 00211 query_ip_name(this_object()) ) ); 00212 00213 destruct(this_object()); 00214 return 1; 00215 } 00216 else 00217 return 0; 00218 }


| static int check_too_many_logons | ( | ) | [static] |
Definiert in Zeile 132 der Datei login.c.
Benutzt addr(), ctime(), log_file, ob(), query_ip_name() und query_ip_number().
Wird benutzt von logon().
00133 { 00134 object *u; 00135 string ip; 00136 00137 ip = query_ip_number(this_object()); 00138 // users() nehmen, falls nicht-interaktive Clones von login.c existieren. 00139 u = filter( users(), function status (object ob, string addr) { 00140 return object_name(ob) == "/secure/login" 00141 && query_ip_number(ob) == addr; 00142 }, ip ); 00143 00144 if ( sizeof(u) > 5 ){ 00145 write( "\nEs laufen schon zu viele Anmeldungen von Deiner Adresse " 00146 "aus.\nProbier es bitte in ein bis zwei Minuten noch " 00147 "einmal.\n" ); 00148 00149 log_file( "LOGIN_DENY", sprintf( "%s: >5 Logons von %-15s (%s)\n", 00150 ctime(time())[4..15], 00151 query_ip_number(this_object()), 00152 query_ip_name(this_object()) ) ); 00153 return 1; 00154 } 00155 else 00156 return 0; 00157 }


| public void create | ( | ) |
Definiert in Zeile 1019 der Datei login.c.
Benutzt creation_date, hc_play, loginfails, loginname, myself und realip.
01020 { 01021 if( myself ) 01022 return; 01023 01024 loginname = "logon"; 01025 hc_play=0; 01026 creation_date = -1; 01027 catch( load_object( "/secure/merlin");publish ); 01028 loginfails = 0; 01029 realip=""; 01030 }
| static void get_hc_answer | ( | string | str | ) | [static] |
Definiert in Zeile 756 der Datei login.c.
Benutzt ask_hc_question(), break_string(), BS_LEAVE_MY_LFS, hc_confirm, hc_play, load_player_ob_2(), loginname, master, reask_hc_question() und shell.
00757 { 00758 00759 if ( str == "?" ) 00760 { 00761 write( break_string( 00762 "Stirbst Du, so wirst Du normalerweise wiedergeboren und kannst "+ 00763 "mit dem Spielen fortfahren. Waehlst Du hier nur ein Leben, so ist "+ 00764 "der Tod das Ende des Spielens. Als Neuling solltest Du diese Frage "+ 00765 "mit \"nein\" beantworten!\n\n",78,0,BS_LEAVE_MY_LFS)); 00766 return ask_hc_question(); 00767 } 00768 00769 str=lower_case(str); 00770 if (str=="ja" || str=="j" ) 00771 { 00772 if(hc_confirm==0) 00773 { 00774 return reask_hc_question(); 00775 } 00776 else 00777 { 00778 hc_play=1; 00779 write( "Ok, Du hast nun nur ein Leben.\n" ); 00780 } 00781 } 00782 else if (str=="nein" || str="n" ) 00783 { 00784 hc_play=0; 00785 write( "Ok, Du erfaehrst die Gnade der Wiedergeburt.\n" ); 00786 } 00787 else 00788 { 00789 write("Was willst Du tun?\n"); 00790 return ask_hc_question(); 00791 } 00792 00793 00794 master()->set_player_object( loginname, shell ); 00795 load_player_ob_2( shell, 0 ); 00796 return; 00797 }

| static void get_mud_played_answer | ( | string | str | ) | [static] |
Definiert in Zeile 735 der Datei login.c.
Benutzt ask_mud_played_question(), ask_race_question(), MUDNAME und newbie.
00736 { 00737 if ( str == "ja" || str=="j") 00738 { 00739 newbie=0; 00740 return ask_race_question(); 00741 } 00742 if ( str != "nein" && str!="n") 00743 { 00744 write("\n\nAntworte bitte mit ja oder nein.\n\n"); 00745 00746 return ask_mud_played_question(); 00747 } 00748 newbie=1; 00749 write("\n\nEine kleine Einfuehrung in das "MUDNAME" bekommst " 00750 "Du auch hier:\n\n" 00751 "http://mg.mud.de/newweb/hilfe/tutorial/inhalt.shtml\n\n"); 00752 return ask_race_question(); 00753 00754 }

| static void get_race_answer | ( | string | str | ) | [static] |
Definiert in Zeile 703 der Datei login.c.
Benutzt ask_hc_question(), ask_race_question(), hc_confirm, input_to(), P_RACE_DESCRIPTION, races und shell.
00704 { 00705 int num; 00706 00707 if ( str == "?" ) 00708 return ask_race_question(); 00709 00710 if ( sscanf( str, "?%d", num ) ){ 00711 if ( num < 1 || num > sizeof(races) ){ 00712 write( "Das geht nicht.\n\nWas willst Du tun: " ); 00713 input_to( "get_race_answer" ); 00714 return; 00715 } 00716 00717 write( call_other( races[num - 1][0], "QueryProp", P_RACE_DESCRIPTION ) 00718 + "\nWas willst Du tun: " ); 00719 input_to( "get_race_answer" ); 00720 return; 00721 } 00722 00723 if ( sscanf( str, "%d", num ) && num >= 1 && num <= sizeof(races) ){ 00724 write( "Ok, Du bist jetzt ein " + capitalize(races[num-1][1]) + "\n" ); 00725 00726 shell = races[num-1][0]; 00727 hc_confirm=0; 00728 return ask_hc_question(); 00729 } 00730 00731 write(" Wie bitte?\n\nWas willst Du tun: " ); 00732 input_to( "get_race_answer" ); 00733 }

| static void load_player_ob_2 | ( | string | obname, | |
| int | guestflag | |||
| ) | [static] |
Definiert in Zeile 939 der Datei login.c.
Benutzt cap_name, creation_date, ctime(), destruct(), dtime(), err, F_MODE_AS, GUESTMASTER, hc_play, invis, IS_WIZARD, log_file, loginname, name, ob(), P_AGE, PROTECTED, query_ip_name(), query_ip_number(), realip, SAVE, SECURED und shell.
Wird benutzt von get_hc_answer() und load_player_object().
00940 { 00941 object blueprint; 00942 string err, ob_name; 00943 object ob, old_ob; 00944 00945 /* start player activity */ 00946 log_file( "ENTER", sprintf( "%-11s %s, %-15s (%s).\n", 00947 capitalize(name), ctime(time())[4..15], 00948 query_ip_number(this_object()), 00949 query_ip_name(this_object()) ), 200000 ); 00950 00951 seteuid(loginname); 00952 00953 /* load the "real" player object */ 00954 /* If some asshole has moved the blueprint */ 00955 if ( objectp(blueprint = find_object(obname)) && environment(blueprint) ) 00956 destruct(blueprint); 00957 00958 if ( err = catch(ob = clone_object(obname);publish) ){ 00959 log_file( "SHELLS", "Failed to load shell " + obname + ", " + 00960 dtime(time()) + ", " + loginname + "\n" + err + "\n\n" ); 00961 00962 write( "Konnte das passende Playerobjekt nicht laden. Lade " 00963 "stattdessen\ndas Objekt Mensch. BITTE ERZMAGIER " 00964 "BENACHRICHIGEN !\n" ); 00965 err = catch(ob = clone_object("std/shells/human");publish); 00966 } 00967 00968 if ( !ob || err ) { 00969 write( "Error on loading " + shell + "\nError = " + err + "\n" ); 00970 destruct( this_object() ); 00971 return; 00972 } 00973 00974 if ( guestflag ) 00975 catch( GUESTMASTER->set_guest( guestflag, ob );publish ); 00976 00977 ob_name = explode( object_name(ob), "#" )[0]; 00978 00979 if ( strlen(ob_name) > 11 && ob_name[0..11] == "/std/shells/" ) 00980 ob_name = ob_name[11..]; 00981 00982 ob_name = ob_name + ":" + lower_case(cap_name); 00983 00984 if( !guestflag ){ 00985 if ( old_ob = find_object(ob_name) ){ 00986 catch(old_ob->remove();publish); 00987 00988 if ( old_ob ) 00989 destruct( old_ob ); 00990 } 00991 00992 rename_object( ob, ob_name ); 00993 ob->__reload_explore(); 00994 } 00995 00996 if(hc_play) 00997 { 00998 ob->set_hc_play(cap_name,1); 00999 log_file("HCPLAY",dtime(time())+" "+cap_name+" ist sehr mutig!\n"); 01000 } 01001 01002 exec( ob, this_object() ); 01003 ob->set_realip(realip); 01004 ob->start_player( cap_name ); 01005 ob->SetProp( "creation_date", creation_date ); 01006 ob->Set( "creation_date", SAVE|SECURED|PROTECTED, F_MODE_AS ); 01007 01008 if ( invis && IS_WIZARD(ob) ){ 01009 ob->SetProp( P_INVIS, ob->QueryProp(P_AGE) ); 01010 tell_object( ob, "DU BIST UNSICHTBAR!\n" ); 01011 } 01012 destruct( this_object() ); 01013 }


| static int load_player_object | ( | int | guestflag | ) | [static] |
Definiert in Zeile 800 der Datei login.c.
Benutzt break_string(), BS_LEAVE_MY_LFS, BS_SINGLE_SPACE, call_out(), cap_name, ctime(), destruct(), find_netdead(), find_player(), GUESTMASTER, i, IS_ARCH, IS_WIZARD, load_player_ob_2(), log_file, loginname, master, MUDNAME, name, ob(), P_LEVEL, realip, remove_interactive(), save_object(), secure_isavefile(), SECURESAVEPATH, select_race(), shell und user.
Wird benutzt von again_password(), check_password() und logon2().
00801 { 00802 object ob; 00803 string fname; 00804 int was_interactive; 00805 00806 if ( sizeof(users()) >= 195 && !IS_WIZARD(loginname) ){ 00807 write( "Die maximale Spielerzahl wurde bereits erreicht!!!\n" 00808 "Aus technischen Gruenden duerfen sich nur noch Magier " 00809 "einloggen.\nVersuch es spaeter noch einmal ...\n" ); 00810 destruct( this_object() ); 00811 return 1; 00812 } 00813 else if ( sizeof(users()) >= 198 && !IS_ARCH(loginname) ){ 00814 write( "Die maximale Spieler- und Magierzahl wurde bereits erreicht!!!" 00815 "\nAus technischen Gruenden duerfen sich nur noch Erzmagier " 00816 "einloggen.\nVersuch es spaeter noch einmal ...\n" ); 00817 destruct( this_object() ); 00818 return 1; 00819 } 00820 00821 if ( file_size("/etc/NOLOGIN")>=0 ) 00822 { 00823 if (file_size("/etc/NOLOGIN.info")>0) { 00824 //NOLOGIN.info enthaelt evtl. weitergehende Informationen fuer 00825 //Spieler, z.B. vorrauss. Wiederverfuegbarkeit. 00826 write(break_string(read_file("/etc/NOLOGIN.info"),78,"", 00827 BS_LEAVE_MY_LFS|BS_SINGLE_SPACE)); 00828 } 00829 else { 00830 //sonst Standardmeldung ausgeben. 00831 write ("\nAufgrund von technischen Problemen ist das Einloggen ins " 00832 MUDNAME" zur \nZeit nicht moeglich. Bitte versuch es " 00833 "spaeter noch einmal.\n\n"); 00834 } 00835 if ( IS_ARCH(loginname) || 00836 member(explode(read_file("/etc/NOLOGIN")||"","\n"), 00837 loginname)!=-1 ) 00838 { 00839 write("Im Moment koennen nur Erzmagier einloggen. Um Spieler " 00840 "wieder ins Spiel zu lassen, muss die Datei '/etc/NOLOGIN' " 00841 "geloescht werden.\n\n "); 00842 } else { 00843 destruct( this_object() ); 00844 return 1; 00845 } 00846 } 00847 00848 if ( (fname = (string)master()->secure_isavefile(loginname)) != "" ) { 00849 save_object( SECURESAVEPATH + loginname[0..0] + "/" + loginname ); 00850 "/secure/master"->RemoveFromCache( loginname ); 00851 00852 // Just to be sure ... 00853 rm( fname + ".o" ); 00854 00855 log_file( "REACTIVATE", ctime(time()) + ": " + capitalize(loginname) + 00856 " reactivated\n" ); 00857 } 00858 00859 if ( guestflag ){ 00860 if ( catch(guestflag = (int)GUESTMASTER->new_guest();publish) || !guestflag ){ 00861 write( "Derzeit kein Gastlogin moeglich!\n" ); 00862 destruct( this_object() ); 00863 } 00864 00865 loginname = "gast" + guestflag; 00866 cap_name = capitalize(loginname); 00867 name = cap_name; 00868 00869 if ( !(ob = find_player(loginname) || find_netdead(loginname)) ){ 00870 object *user; 00871 int i; 00872 00873 // gegen Horden von Gast1 - wenn ein Gast noch am Prompt fuer 00874 // das Geschlecht haengt, ist er ueber find_player() noch nicht 00875 // zu finden ... 00876 for ( i = sizeof(user = users() - ({ 0, this_object() })); i--; ) 00877 if ( object_name(user[i])[0..11] == "/std/shells/" && 00878 getuid(user[i]) == loginname ){ 00879 ob = user[i]; 00880 break; 00881 } 00882 } 00883 00884 if ( ob ){ 00885 tell_object( ob, "Ein anderer Spieler moechte diesen Gastzugang " 00886 "jetzt benutzen. Wenn es Dir hier\ngefallen hat, " 00887 "ueberleg Dir doch einen Charakternamen und komm " 00888 "unter diesem\nNamen wieder!\n" ); 00889 destruct(ob); 00890 } 00891 00892 load_player_ob_2( "std/shells/human", guestflag ); 00893 00894 return 1; 00895 } 00896 else { 00897 /* Test if we are already playing */ 00898 was_interactive = 0; 00899 ob = find_player(loginname) || find_netdead(loginname); 00900 00901 if (ob) { 00902 write( "Du nimmst schon am Spiel teil!\n" ); 00903 write( "Verwende Deine alte sterbliche Huelle ...\n" ); 00904 00905 if ( interactive(ob) ) { 00906 /* The other object is still interactive; reconnect that "soul" 00907 to a dummy object and destruct that, thus disconnecting the 00908 other probably linkdead user. The real "body" is still 00909 there for reconnecting by login.c */ 00910 remove_interactive(ob); 00911 was_interactive = 1; 00912 } 00913 00914 /* Now reconnect to the old body */ 00915 exec( ob, this_object() ); 00916 /* NewbieIntroMsg? */ 00917 ob->NewbieIntroMsg(); 00918 ob->set_realip(realip); 00919 if ( ((int)ob->QueryProp(P_LEVEL)) == -1 ) 00920 ob->start_player( cap_name ); 00921 else 00922 ob->Reconnect( was_interactive ); 00923 00924 call_out( "remove", 1 ); 00925 return 1; 00926 } 00927 } 00928 00929 /* read player object from passwd file */ 00930 if ( stringp(shell) && shell != "" ) 00931 load_player_ob_2 ( shell, 0 ); 00932 else 00933 select_race(); 00934 00935 return 1; 00936 }


| public nomask string loginname | ( | ) |
| public nomask int logon | ( | ) |
Definiert in Zeile 163 der Datei login.c.
Benutzt call_out(), check_too_many_logons(), destruct(), hc_play, input_to(), loginname, newbie, realip und SendTelopts().
00164 { 00165 loginname = "logon"; 00166 hc_play=0; 00167 newbie=0; 00168 realip=""; 00169 00170 SendTelopts(); 00171 00172 if ( check_too_many_logons() ){ 00173 destruct(this_object()); 00174 return 0; 00175 } 00176 00177 // ist die Verbindung schon wieder weg? 00178 if (objectp(this_object()) && interactive(this_object())) { 00179 cat( "/etc/WELCOME" ); 00180 write( "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? " ); 00181 } 00182 00183 input_to( "logon2" ); 00184 call_out( "time_out", 120 ); 00185 return 1; 00186 }

| static int logon2 | ( | string | str | ) | [static] |
Definiert in Zeile 273 der Datei login.c.
Benutzt cap_name, check_illegal(), check_late_player(), check_too_many_from_same_ip(), creation_date, destruct(), domains, dtime(), ek, ektips, ep, fptips, guilds, i, input_to(), level, load_player_object(), log_file, loginname, master, mq, name, neu, password, PROXIES, query_ip_name(), query_ip_number(), QueryBanished(), QueryTBanished(), realip, restore_object(), secure_savefile(), shell, SSL_GRRETING, strftime(), user und valid_name().
00274 { 00275 int i, arg; 00276 mixed txt; 00277 00278 if ( !str || str == "" ){ 00279 write( "Abbruch!\n" ); 00280 destruct( this_object() ); 00281 return 0; 00282 } 00283 00284 // Unterstuetzung fuer das Mud Server Status Protocol 00285 // (http://tintin.sourceforge.net/mssp/) 00286 #ifdef MSSP_SUPPORT 00287 if (str == "MSSP-REQUEST") { 00288 "/secure/misc/mssp"->print_mssp_response(); 00289 log_file( "MSSP.log", sprintf( "%s: %-15s (%s)\n", 00290 strftime("%c"), 00291 query_ip_number(this_object()), 00292 query_ip_name(this_object()) ) ); 00293 write( "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? " ); 00294 input_to("logon2"); 00295 return 1; 00296 } 00297 #endif 00298 00299 if(strstr(str,SSL_GRRETING)==0) 00300 { 00301 if( member(PROXIES,query_ip_number(this_object()))>-1 ) 00302 { 00303 realip=str[strlen(SSL_GRRETING)..]; 00304 } // andere IPs werden einfach ignoriert. -> log/PROXY.REQ ? 00305 input_to( "logon2" ); 00306 return 1; 00307 } 00308 00309 if ( loginname != "logon" ) { 00310 log_file( "ILLEGAL", sprintf( "%s Illegal patch of login: " 00311 "loginname = %O\n", 00312 dtime(time()), loginname ) ); 00313 destruct( this_object() ); 00314 return 0; 00315 } 00316 00317 cap_name = capitalize(str); 00318 str = lower_case(str); 00319 00320 if ( str == "neu" && !neu ){ 00321 cat( "/etc/WELCOME_NEW" ); 00322 neu = 1; 00323 input_to( "logon2" ); 00324 return 1; 00325 } 00326 00327 if ( !valid_name(str) ){ 00328 if ( !neu ) 00329 write( "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? " ); 00330 else 00331 write( "Bitte gib Dir einen anderen Namen: " ); 00332 00333 input_to( "logon2" ); 00334 return 1; 00335 } 00336 00337 if ( sscanf( str, "gast%d", arg ) == 1 ){ 00338 write( "Du meinst wohl 'Gast' ...\n" ); 00339 str = "gast"; 00340 } 00341 00342 loginname = str; 00343 00344 /* read the secure save file to see if character already exists */ 00345 if ( str != "gast" && 00346 !restore_object( master()->secure_savefile(str) ) ){ 00347 object *user; 00348 00349 if ( !neu ){ 00350 write( "Es existiert kein Charakter mit diesem Namen.\n" ); 00351 write( "Falls Du einen neuen Charakter erschaffen moechtest, " 00352 "tippe bitte \"neu\" ein.\n" ); 00353 00354 write( "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? " ); 00355 loginname = "logon"; 00356 input_to( "logon2" ); 00357 return 1; 00358 } 00359 00360 for ( i = sizeof(user = users() - ({ 0, this_object() })); i--; ) 00361 if ( object_name(user[i])[0..12] == "/secure/login" && 00362 ((string)user[i]->loginname()) == loginname ){ 00363 write( "Eine Anmeldung fuer diesen Namen laeuft bereits.\n" ); 00364 destruct( this_object() ); 00365 return 1; 00366 } 00367 00368 // Site-Banish checken 00369 if ( check_illegal(str) ) 00370 return 1; 00371 00372 if ( check_too_many_from_same_ip() ) 00373 return 1; 00374 00375 /* new character */ 00376 if ( strlen(str) < 3 ){ 00377 write( "Der Name ist zu kurz.\nVersuch einen anderen: " ); 00378 loginname = "logon"; 00379 input_to( "logon2" ); 00380 return 1; 00381 } 00382 00383 00384 if ( (txt = (string)master()->QueryBanished(str)) ){ 00385 if ( txt != "Dieser Name ist gesperrt." ) 00386 txt = sprintf("Hoppla - dieser Name ist reserviert oder gesperrt " 00387 "(\"gebanisht\")!\nGrund: %s\n",txt); 00388 else 00389 txt = "Hoppla - dieser Name ist reserviert oder gesperrt " 00390 "(\"gebanisht\")!\n"; 00391 write( txt + "Bitte gib Dir einen anderen Namen: " ); 00392 loginname = "logon"; 00393 input_to( "logon2" ); 00394 return 1; 00395 } 00396 00397 /* Initialize the new secure savefile */ 00398 name = str; 00399 password = ""; 00400 level = 0; 00401 domains = ({ }); 00402 guilds = ({ }); 00403 shell = ""; 00404 ep = ""; 00405 ek = ""; 00406 mq = ""; 00407 ektips=""; 00408 fptips=""; 00409 creation_date = time(); 00410 00411 write( "Waehle ein Passwort: " ); 00412 input_to( "new_password", 1 ); 00413 return 1; 00414 } 00415 else { 00416 if ( str == "gast" ){ 00417 if ( check_illegal(str) ) 00418 return 1; 00419 00420 load_player_object(1); 00421 return 1; 00422 } 00423 00424 if ( neu ){ 00425 write( "Es existiert bereits ein Charakter dieses Namens.\n" ); 00426 write( "Gib Dir einen anderen Namen: " ); 00427 loginname = "logon"; 00428 input_to( "logon2" ); 00429 return 1; 00430 } 00431 00432 if ( (int)master()->check_late_player(str) ) 00433 { 00434 write( "Dieser Spieler hat uns leider fuer immer verlassen.\n" ); 00435 write( "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? " ); 00436 loginname = "logon"; 00437 input_to( "logon2" ); 00438 return 1; 00439 } 00440 00441 if ( txt = (string)master()->QueryTBanished(str) ){ 00442 write( txt ); 00443 write( "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? " ); 00444 loginname = "logon"; 00445 input_to( "logon2" ); 00446 return 1; 00447 } 00448 00449 if ( creation_date > (time() - 30*24*60*60) 00450 && check_too_many_from_same_ip() ) 00451 return 1; 00452 00453 write( "Schoen, dass Du wieder da bist, "+capitalize(str)+"!\n" ); 00454 00455 if ( !stringp(password) || password == "" ) { 00456 write( "Du hast KEIN PASSWORD!\n" ); 00457 write( "Benutze den \"password\"-Befehl, um das zu aendern !\n" ); 00458 load_player_object(0); 00459 return 1; 00460 } 00461 00462 write( "Passwort: " ); 00463 input_to( "check_password", 1 ); 00464 return 1; 00465 } 00466 }

| static mixed new_load_player_ob_2 | ( | string | obname | ) | [static] |
Definiert in Zeile 1119 der Datei login.c.
Benutzt cap_name, creation_date, destruct(), dtime(), err, F_MODE_AS, log_file, loginname, M_NOCHECK, ob(), PROTECTED, realip, SAVE, SECURED, set_object_heart_beat() und shell.
Wird benutzt von new_load_player_object().
01120 { 01121 object blueprint; 01122 string err, ob_name; 01123 object ob, old_ob; 01124 01125 seteuid(loginname); 01126 01127 /* load the "real" player object */ 01128 /* If some asshole has moved the blueprint */ 01129 if ( objectp(blueprint = find_object(obname)) && environment(blueprint) ) 01130 destruct( blueprint ); 01131 01132 err = catch(ob = clone_object(obname);publish); 01133 01134 if ( err ){ 01135 log_file( "SHELLS", "Failed to load shell " + obname + ", " + 01136 dtime(time()) + ", " + loginname + "\n" + err + "\n\n" ); 01137 01138 write( "Konnte das passende Playerobjekt nicht laden. " 01139 "Lade stattdessen\ndas Objekt Mensch!\n" ); 01140 01141 err = catch(ob = clone_object( "std/shells/human" );publish ); 01142 } 01143 01144 if ( !ob || err ){ 01145 write( "Error on loading " + shell + "\nError = " + err + "\n" ); 01146 destruct( this_object() ); 01147 return 0; 01148 } 01149 01150 ob_name = explode( object_name(ob), "#" )[0]; 01151 01152 if ( strlen(ob_name) > 11 && ob_name[0..11] == "/std/shells/" ) 01153 ob_name = ob_name[11..]; 01154 01155 ob_name = ob_name + ":" + lower_case(cap_name); 01156 01157 if ( old_ob = find_object(ob_name) ){ 01158 catch( old_ob->remove(); publish ); 01159 01160 if ( old_ob ) 01161 destruct( old_ob ); 01162 } 01163 01164 rename_object( ob, ob_name ); 01165 ob->__reload_explore(); 01166 ob->set_realip(realip); 01167 ob->start_player(cap_name); 01168 ob->SetProp( "creation_date", creation_date ); 01169 ob->Set( "creation_date", SAVE|SECURED|PROTECTED, F_MODE_AS ); 01170 01171 ob->move( "/room/nowhere", M_NOCHECK ); 01172 set_object_heart_beat( ob, 0 ); 01173 destruct( this_object() ); 01174 01175 return ob; 01176 }


| static mixed new_load_player_object | ( | ) | [static] |
Definiert in Zeile 1100 der Datei login.c.
Benutzt destruct(), find_netdead(), find_player(), loginname, new_load_player_ob_2() und shell.
Wird benutzt von new_logon().
01101 { 01102 if ( find_player(loginname) || find_netdead(loginname) ){ 01103 write( "Der Spieler ist bereits online oder netztot!\n" ); 01104 destruct( this_object() ); 01105 return 2; 01106 } 01107 01108 /* read player object from passwd file */ 01109 if ( stringp(shell) && shell != "" ) 01110 return new_load_player_ob_2( shell ); 01111 else { 01112 write( "Keine Shell angegeben!\n" ); 01113 destruct( this_object() ); 01114 return 0; 01115 } 01116 }


| public mixed new_logon | ( | string | str | ) |
Definiert in Zeile 1066 der Datei login.c.
Benutzt ARCH_SECURITY, cap_name, destruct(), loginname, master, new_load_player_object(), process_call(), restore_object(), ROOTID und secure_savefile().
01067 { 01068 seteuid(getuid()); // sonst funkt ARCH_SECURITY nicht 01069 01070 if ( !ARCH_SECURITY || process_call() ){ 01071 write( "Nur fuer Erzmagier erlaubt!\n" ); 01072 destruct( this_object() ); 01073 return -1; 01074 } 01075 01076 if ( !str || str == "" ){ 01077 write( "Kein Name angegeben!\n" ); 01078 destruct( this_object() ); 01079 return 0; 01080 } 01081 01082 cap_name = capitalize(str); 01083 str = lower_case(str); 01084 loginname = str; 01085 seteuid(ROOTID); 01086 01087 /* read the secure save file to see if character already exists */ 01088 if ( !restore_object( master()->secure_savefile(str) ) ){ 01089 write( "Kein solcher Spieler!\n" ); 01090 destruct( this_object() ); 01091 return 0; 01092 } 01093 else { 01094 write( "Ok, der Spieler " + capitalize(str) + " existiert!\n" ); 01095 return new_load_player_object(); 01096 } 01097 }

| static int new_password | ( | string | str | ) | [static] |
Definiert in Zeile 469 der Datei login.c.
Benutzt input_to(), loginname, master und password.
00470 { 00471 write( "\n" ); 00472 00473 if ( !str || str == "" ) 00474 return remove(); 00475 00476 password = str; 00477 00478 if ( !master()->good_password( str, loginname ) ){ 00479 write( "Bitte gib ein Passwort an: " ); 00480 input_to( "new_password", 1 ); 00481 return 1; 00482 } 00483 00484 write( "\nZur Erinnerung: Es ist v e r b o t e n, andere Spieler " 00485 "anzugreifen!\n" ); 00486 write( "Das gilt auch fuer Froesche, bei denen \"Ein Frosch namens " 00487 "XXXXX\" steht.\n\n" ); 00488 write( "Passwort bitte nochmal eingeben: " ); 00489 input_to( "again_password", 1 ); 00490 return 1; 00491 }

| public nomask int query_prevent_shadow | ( | ) |
| public string query_real_name | ( | ) |
Definiert in Zeile 1039 der Datei login.c.
Wird benutzt von _set_fraternitasdonoarchmagorum(), GiveQuest(), schreib(), udp_channel() und ww().

| string query_realip | ( | ) |
| static void reask_hc_question | ( | ) | [static] |
Definiert in Zeile 610 der Datei login.c.
Benutzt break_string(), BS_LEAVE_MY_LFS, hc_confirm, input_to() und MUDNAME.
Wird benutzt von get_hc_answer().
00611 { 00612 hc_confirm=1; 00613 write( break_string( 00614 "Du moechtest den Gefahren dieser Welt mit nur einem Leben " 00615 "entgegentreten. Doch bedenke wohl, dies ist ein schwerer Weg " 00616 "und bist Du erstmal in das Reich des Todes eingetreten, so gibt " 00617 "es kein Entrinnen.\n" 00618 "Als Neuling solltest Du Dir ueberlegen, ob Du das " 00619 MUDNAME" vielleicht nicht doch lieber mit der Moeglichkeit zur " 00620 "Wiedergeburt erkunden moechtest.\n" 00621 "Solltest Du Dir noch nicht ganz ueber die Folgen Deiner Entscheidung " 00622 "im Klaren sein, bekommst du mit \"?\" Hilfe.\n\n",78,0,BS_LEAVE_MY_LFS)); 00623 00624 write( "\nNun entscheide Dich, willst Du wirklich nur ein Leben?(ja,nein,?): " ); 00625 00626 input_to( "get_hc_answer" ); 00627 return; 00628 }


| public int remove | ( | ) |
Definiert in Zeile 1059 der Datei login.c.
Benutzt destruct().
01060 { 01061 destruct( this_object() ); 01062 return 1; 01063 }

| static void select_race | ( | ) | [static] |
Definiert in Zeile 571 der Datei login.c.
Wird benutzt von load_player_object().
00572 { 00573 int i; 00574 string s; 00575 00576 races = get_dir( "/std/shells/*.c" ); 00577 00578 // Mensch soll immer als erstes in der Auswahlliste stehen. 00579 if (member(races,"human.c")!=-1) 00580 races=({"human.c"})+(races-({"human.c"})); 00581 00582 for ( i = sizeof(races); i--; ){ 00583 races[i] = "/std/shells/" + races[i][0..<3]; 00584 s = 0; 00585 00586 if ( catch(s = (string)call_other( races[i], "QueryAllowSelect" ); publish) 00587 || !s) 00588 s = 0; 00589 else if ( catch(s = (string)call_other( races[i], "QueryProp", P_RACE );publish) ) 00590 s = 0; 00591 00592 if ( !strlen(s) ) 00593 races[i..i] = ({}); 00594 else 00595 races[i] = ({ races[i], s }); 00596 } 00597 00598 if ( sizeof(races) == 1 ){ 00599 write( "Es gibt nur eine Rasse, Du hast also keine Wahl.\n" ); 00600 00601 shell = races[0][0]; 00602 master()->set_player_object( loginname, shell ); 00603 00604 return load_player_ob_2( shell, 0 ); 00605 } 00606 00607 return ask_mud_played_question(); 00608 }

| static void SendTelopts | ( | ) | [static] |
Definiert in Zeile 101 der Datei login.c.
Benutzt DO, IAC, TELOPT_ENVIRON, TELOPT_EOR, TELOPT_LINEMODE, TELOPT_NAWS, TELOPT_NEWENV, TELOPT_TSPEED, TELOPT_TTYPE, TELOPT_XDISPLOC, TN und WILL.
Wird benutzt von logon().
00102 { 00103 efun::binary_message(({ 00104 IAC,DO,TELOPT_LINEMODE, 00105 IAC,WILL,TELOPT_EOR, 00106 IAC,DO,TELOPT_NAWS, 00107 IAC,DO,TELOPT_TTYPE, 00108 IAC,DO,TELOPT_XDISPLOC, 00109 IAC,DO,TELOPT_ENVIRON, 00110 IAC,DO,TELOPT_NEWENV, 00111 IAC,DO,TELOPT_TSPEED, 00112 }),3); 00113 00114 TN=(["sent":([ 00115 TELOPT_LINEMODE:0;DO;0, 00116 TELOPT_EOR:WILL;0;0, 00117 TELOPT_NAWS:0;DO;0, 00118 TELOPT_TTYPE:0;DO;0, 00119 TELOPT_ENVIRON:0;DO;0, 00120 TELOPT_NEWENV:0;DO;0, 00121 TELOPT_XDISPLOC:0;DO;0, 00122 TELOPT_TSPEED:0;DO;0, 00123 ])]); 00124 }

| public string short | ( | ) |
| static void time_out | ( | ) | [static] |
Definiert in Zeile 1051 der Datei login.c.
Benutzt destruct().
01052 { 01053 if (this_player()) 01054 tell_object(this_player(),"Time out!"); 01055 destruct( this_object() ); 01056 }

| static int valid_name | ( | string | str | ) | [static] |
Definiert in Zeile 245 der Datei login.c.
Benutzt i.
Wird benutzt von logon2().
00246 { 00247 int i; 00248 00249 if ( str == "logon" ){ 00250 write( "Der Name wuerde nur Verwirrung stiften.\n" ); 00251 return 0; 00252 } 00253 00254 i = strlen(str); 00255 00256 if ( i > 11 ){ 00257 write( "Dein Name ist zu lang, nimm bitte einen anderen.\n" ); 00258 return 0; 00259 } 00260 00261 for ( ; i--; ) 00262 if ( str[i] < 'a' || str[i] > 'z' ) { 00263 write( "Unerlaubtes Zeichen '" + str[i..i] + "' im Namen: " + str 00264 + "\n" ); 00265 write( "Benutze bitte nur Buchstaben ohne Umlaute.\n" ); 00266 return 0; 00267 } 00268 00269 return 1; 00270 }

| inherit secure mini_telnetneg c |
Definiert in Zeile 39 der Datei login.c.
Wird benutzt von _query_currentdir(), CAPITALIZE(), ChannelAdmin(), ChannelParser(), DoAttackChat(), DoChat(), drink_this(), DumpMapping(), eat_this(), ex(), QuerySkillAttributeModifier(), RegisterItem(), RemoveSensitiveObjectFromList(), rtell(), ShowWritten(), shut(), startup_telnet_negs(), TakeFlaw() und telnet_neg().
string cap_name [static] |
Definiert in Zeile 60 der Datei login.c.
Wird benutzt von load_player_ob_2(), load_player_object(), logon2(), new_load_player_ob_2() und new_logon().
| int creation_date |
Definiert in Zeile 52 der Datei login.c.
Wird benutzt von create(), find_userinfo(), load_player_ob_2(), logon2() und new_load_player_ob_2().
| string ek |
Definiert in Zeile 53 der Datei login.c.
Wird benutzt von ClearScoreBit(), find_userinfo(), logon2() und SetScoreBit().
| string ektips |
Definiert in Zeile 54 der Datei login.c.
Wird benutzt von check_player(), find_userinfo(), getFreeEKsForPlayer() und logon2().
| string ep |
Definiert in Zeile 53 der Datei login.c.
Wird benutzt von add_fp(), ClearFP(), find_userinfo(), GiveExplorationPoint(), GiveExplorationPointObject(), logon2(), QueryExplorationPoints(), remove_fp(), SetFP() und ShowPlayerEPs().
| string fptips |
Definiert in Zeile 55 der Datei login.c.
Wird benutzt von find_userinfo() und logon2().
| string * guilds |
Definiert in Zeile 56 der Datei login.c.
Wird benutzt von add_guild_master(), find_userinfo(), guild_master(), logon2() und remove_guild_master().
int hc_confirm [static] |
Definiert in Zeile 67 der Datei login.c.
Wird benutzt von get_hc_answer(), get_race_answer() und reask_hc_question().
| int loginfails |
Definiert in Zeile 52 der Datei login.c.
Wird benutzt von check_password() und create().
public nomask string loginname [static] |
Definiert in Zeile 59 der Datei login.c.
Wird benutzt von again_password(), check_password(), create(), get_hc_answer(), load_player_ob_2(), load_player_object(), loginname(), logon(), logon2(), new_load_player_ob_2(), new_load_player_object(), new_logon() und new_password().
| string mq |
Definiert in Zeile 53 der Datei login.c.
Wird benutzt von ClearPlayerMiniQuest(), find_userinfo(), GiveMiniQuest(), HasMiniQuest(), logon2() und SetPlayerMiniQuest().
int neu [static] |
Definiert in Zeile 58 der Datei login.c.
Wird benutzt von change(), changepath(), logon2() und NewbieIntroMsg().
int newbie [static] |
Definiert in Zeile 66 der Datei login.c.
Wird benutzt von ask_hc_question(), ask_race_question(), get_mud_played_answer() und logon().
| string password |
Definiert in Zeile 53 der Datei login.c.
Wird benutzt von again_password(), check_password(), delete_player(), find_userinfo(), logon2() und new_password().
mixed* races [static] |
Definiert in Zeile 64 der Datei login.c.
Wird benutzt von ask_race_question(), get_race_answer() und select_race().
string realip [static] |
Definiert in Zeile 68 der Datei login.c.
Wird benutzt von create(), load_player_ob_2(), load_player_object(), logon(), logon2(), new_load_player_ob_2() und query_realip().
| string shell |
Definiert in Zeile 53 der Datei login.c.
Wird benutzt von find_userinfo(), get_hc_answer(), get_race_answer(), load_player_ob_2(), load_player_object(), logon2(), new_load_player_ob_2() und new_load_player_object().
| string * uidstotakecare |
Definiert in Zeile 56 der Datei login.c.
Wird benutzt von find_userinfo().
string* userentry [static] |
Definiert in Zeile 62 der Datei login.c.
Wird benutzt von query_player_object().
1.6.3