| // MorgenGrauen MUDlib |
| // |
| // shells/magier.c -- magier shell |
| // |
| // $Id: magier.c 9231 2015-05-27 21:53:32Z Zesstra $ |
| |
| // |
| // Magiershell Basisfile |
| // |
| // Ueberarbeitung abgeschlossen am 18.12.2002 |
| // |
| // Dank an Zwirch@PK, Rikus@MG, Zoran@PK, Vanion@MG |
| // und viele andere, die ich vergessen habe. |
| // |
| // Fragen und Bughinweise an Mandragon@MG oder einen |
| // Erzmagier Deiner Wahl. |
| // |
| // Zur Shell gehoeren ausser dieser Datei: |
| // admin.c: Administrative Befehle |
| // comm.c: Kommunikationsbefehle |
| // fileedit.c: Befehle zum Veraendern von Dateien |
| // fileview.c: Befehle zum Lesen von Dateien |
| // magier_ext.c: Generelle Magierbefehle |
| // moving.c: Bewegungsbefehle |
| // objects.c: Erzeugen und zerstoeren von Objekten |
| // parsing.c Auswertung von Pfadangaben und Wildcards |
| // players.c: Befehle zur Beeinflussung von Spielern |
| // todo.c: Implementation der Todoliste |
| // upd.c: Der Befehl upd |
| // magier.h Generelle Header-Datei |
| // |
| |
| #pragma strict_types,save_types |
| |
| inherit "/std/player/base"; |
| inherit "/std/shells/magier/magier_ext"; |
| |
| #include <wizlevels.h> |
| #include <moving.h> |
| #include <properties.h> |
| #include <new_skills.h> |
| #include <config.h> |
| |
| protected void create() |
| { |
| if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) { |
| set_next_reset(-1); |
| return; |
| } |
| |
| base::create(); |
| |
| Set(P_RACE, SAVE, F_MODE); |
| Set(P_ZAP_MSG, SAVE, F_MODE); |
| Set(P_TRANK_FINDEN, SAVE, F_MODE); |
| Set(P_HANDS, SAVE, F_MODE); |
| Set(P_RACESTRING, SAVE, F_MODE); |
| SetDefaultHome("/gilden/abenteurer"); |
| SetProp(P_ENEMY_DEATH_SEQUENCE, |
| ([17:"Der Tod schuettelt verstaendnislos den Kopf.\n\n", |
| 18:"Der Tod sagt: WIESO MUSSTEST DU DICH AUCH UNBEDINGT " |
| "MIT EINEM MAGIER ANLEGEN?\n\n"])); |
| SetProp(P_ATTRIBUTES_OFFSETS,([])); |
| SetProp(P_AVERAGE_SIZE,185); |
| if(!QueryProp(P_DEFAULT_GUILD)) SetProp(P_DEFAULT_GUILD,"abenteurer"); |
| } |
| |
| protected void create_super() { |
| set_next_reset(-1); |
| } |
| |
| |
| protected void heart_beat() |
| { |
| mixed *en; |
| |
| if (!QueryProp(P_WANTS_TO_LEARN)||((en=QueryEnemies())&&sizeof(en[0]))) |
| base::heart_beat(); |
| else if (!CheckTelnetKeepAlive()) { |
| // Wenn der Magier kein Telnet Keep-Alive wuenscht, kann der HB ganz |
| // abgeschaltet werden. Sonst muss er aber weiterlaufen, damit |
| // CheckTelnetKeepAlive() regelmaessig gerufen wird. |
| set_heart_beat(0); |
| } |
| } |
| |
| |
| public varargs int remove(int silent) |
| { |
| string workroom; |
| |
| if (IS_WIZARD(this_object())) |
| workroom = "/players/"+getuid()+"/workroom"; |
| else |
| workroom = "/secure/merlin"; |
| if( !environment() || object_name(environment()) != workroom ) |
| catch(move(workroom, M_GO, "nach Hause")); |
| return base::remove(silent); |
| } |
| |
| public string NotifyDestruct(object caller) { |
| |
| if (previous_object() != master() |
| || object_name(this_object()) == __FILE__[..<3]) |
| return 0; |
| |
| // Nicht-EMs sollen keine EMs zerstoeren koennen, woraufhin auch evtl. |
| // EM-Tools rumliegen koennten. |
| if ( IS_ARCH(this_object()) && caller != this_object() |
| && getuid(caller) != ROOTID |
| && (process_call() || !ARCH_SECURITY) ) |
| return "Das Zerstoeren von EMs ist ein Fehler. ;-)\n"; |
| |
| return ::NotifyDestruct(caller); |
| } |
| |
| void reset() |
| { |
| if (!interactive(this_object())) |
| { |
| quit(); |
| if (this_object()) |
| remove(); |
| if (this_object()) |
| destruct(this_object()); |
| return; |
| } |
| } |
| |
| // #################### |
| //################# Query-Funktionen ################## |
| // #################### |
| |
| varargs int id (string str) { |
| if (QueryProp(P_INVIS) && |
| (!this_interactive() ||!IS_LEARNER(this_interactive()))) |
| return 0; |
| return ::id(str); |
| } |
| |
| |
| static string *_query_racestring() |
| { |
| if (pointerp(Query(P_RACESTRING))) |
| return Query(P_RACESTRING); |
| else |
| return |
| ({QueryProp(P_RACE),QueryProp(P_RACE), |
| QueryProp(P_RACE),QueryProp(P_RACE)}); |
| } |
| |
| |
| static string _query_default_guild() |
| { |
| return (Query(P_DEFAULT_GUILD)||"abenteurer"); |
| } |
| |
| |
| static string _query_racedescr() |
| { |
| return "Magier koennen einfach alles. Aber manche Magier koennen mehr.\n"; |
| } |
| |
| |
| static string _query_race() |
| { |
| if (previous_object() && previous_object()->query_login_object()) |
| return 0; |
| |
| return Query(P_RACE) ? Query(P_RACE) : Set(P_RACE, "Magier"); |
| } |
| |
| |
| static mixed _query_localcmds() |
| { |
| return |
| base::_query_localcmds() |
| +magier_ext::_query_localcmds(); |
| } |
| |
| |
| static void upd_my_age() |
| { |
| age=_age+absolute_hb_count()-_hbstop; |
| _age=age; |
| _hbstop=absolute_hb_count(); |
| return; |
| } |
| |
| |
| static int _query_age() |
| { |
| upd_my_age(); |
| return age; |
| } |
| |
| static int _set_earmuffs(int level) |
| { |
| int maxl=1+query_wiz_level(this_object()); |
| maxl = max(maxl,99); |
| return Set(P_EARMUFFS,min(maxl,level)); |
| } |
| |
| |
| // ############################ |
| //#################### Interne Shell-Funktionen #################### |
| // ############################ |
| |
| int MayAddWeight(int w) { return 0;} |
| int MayAddObject(object ob) { return 1; } |
| |
| |
| static void initialize() |
| { |
| magier_ext::initialize(); |
| return; |
| } |
| |
| |
| static void FinalSetup() |
| { |
| SetProp(P_CURRENTDIR,"/players/"+getuid()); |
| initialize(); |
| if (IS_LEARNER(this_player())) cat("/etc/WIZNEWS"); |
| _age=age; |
| _hbstop=absolute_hb_count(); |
| return; |
| } |
| |
| |
| void save_me(int i) |
| { |
| upd_my_age(); |
| base::save_me(i); |
| return; |
| } |
| |
| |
| varargs void Reconnect(int silent,string my_ip) |
| { |
| base::Reconnect(silent,my_ip); |
| magier_ext::reconnect(); |
| return; |
| } |
| |
| |
| void notify_player_change(string who, int rein, int invis) |
| { |
| string *list,name; |
| mixed mlist; |
| int vis_change; |
| |
| if (invis) name="("+who+")"; |
| else name=who; |
| |
| if(query_verb() && (query_verb()=="vis" || query_verb()=="invis")) |
| vis_change=1; |
| |
| if (Query(P_INFORMME) && !vis_change) |
| { |
| if (rein) |
| tell_object(this_object(), |
| sprintf("%s ist gerade ins "MUDNAME" gekommen.\n",name)); |
| else |
| tell_object(this_object(), |
| sprintf("%s hat gerade das "MUDNAME" verlassen.\n",name)); |
| } |
| |
| if(Query(P_WAITFOR_FLAGS) & (0x01))return ; |
| |
| if (pointerp(list=Query(P_WAITFOR))&&sizeof(list)) |
| if (member(list,who)!=-1) |
| delayed_write( |
| ({ |
| ({sprintf("%s%s I S T J E T Z T %s !!!\n", |
| (QueryProp(P_VISUALBELL) ? "" : sprintf("%c",7)), |
| name, |
| (vis_change? |
| (rein?"S I C H T B A R":"U N S I C H T B A R"): |
| (rein?"D A":"N I C H T M E H R D A"))), |
| 0}) |
| })); |
| |
| if (rein && (sizeof(mlist=QueryProp(P_WAITFOR_REASON))) && |
| (mappingp(mlist)) && (mlist[who])) |
| Show_WaitFor_Reason(who,invis); |
| return; |
| } |
| |
| mixed modify_command(string str) { |
| if (previous_object() && |
| (previous_object()!=this_object() || process_call()) ) |
| { |
| if (IS_ARCH(this_object())) |
| tell_object(this_object(), |
| sprintf("Illegal modify_command(%s) from %O\n", |
| str, previous_object())); |
| return 0; |
| } |
| ////////////////////////////////////////////////////////////////////// |
| // Magier-Escape-Kommandos werden behandelt |
| if (str=="\\ESCAPE" && IS_LORD(this_object())) |
| { |
| __set_environment(this_object(),"/room/void"); |
| environment()->init(); |
| printf("You escaped.\n"); |
| return ""; |
| } |
| if (str[0..2]=="\\\\\\" && IS_LORD(this_object())) |
| { |
| str = _return_args(str); |
| string* input = explode(str[3..]," "); |
| string verb = input[0]; |
| if (verb && verb!="") |
| { |
| string cmd = implode(input[1..]," "); |
| if (!__auswerten(cmd,verb)) |
| SoulComm(cmd,verb); |
| } |
| return 1; |
| } |
| ////////////////////////////////////////////////////////////////////// |
| |
| return ::modify_command(str); |
| } |
| |