MSDP Script
Jump to navigation
Jump to search
Copy the full code below into a file, named like msdp.tin perhaps
Trigger or manually do #read msdp.tin upon starting your new session to the mud, or at the welcome screen.
This creates a nest of vars under $msdp_info. Affects and Room Exits are sub-nests:
Show all vars: #var msdp_info Show one var: #var msdp_info[HEALTH] Show affects: #var msdp_info[AFFECTS]
Use these in your code like:
#IF {"$msdp_info[CLASS]" == "Thief"} {say I'm a Thief};
#IF {!&{msdp_info[AFFECTS][sanctuary]} {q sanc basket};
#IF {$msdp_info[OPPONENT_HEALTH] < 10} {say I've got you now!}
Code
#CLASS {MSDP} {OPEN}
#NOP -- For usage: realmsofdespair.com 4000;
#NOP -- Saves MSDP data to $msdp_info;
#NOP -- Based on Mitik's plugin. I stripped out a ton of non-functional non-essential code;
#NOP -- Should 'just work' provided you read this file and then connect to the mud;
#NOP -- Alias to manually force msdp update from server: "msdp_report"
#NOP -- Bugs;
#NOP -- 1. AREA_NAME not received upon login sometimes (realms skips or maybe reports too fast for tintin to catch?);
#NOP moving one room will get it;
#NOP --Debugging;
#CONFIG {debug telnet} {off};
#FORMAT {IAC} {%a} {255};
#FORMAT {DONT} {%a} {254};
#FORMAT {DO} {%a} {253};
#FORMAT {WONT} {%a} {252};
#FORMAT {WILL} {%a} {251};
#FORMAT {SB} {%a} {250};
#FORMAT {SE} {%a} {240};
#FORMAT {MSDP} {%a} {69};
#FORMAT {VAR} {%a} {01};
#FORMAT {VAL} {%a} {02};
#VARIABLE {msdp_reportable_variables} {{CHARACTER_NAME};{RACE};{CLASS};
{PLAYER_COUNT};{ROOM_TERRAIN};{PLAYERS_PEAK};{PLUGIN_ID};{ROOM_VNUM};
{SERVER_ID};{SERVER_TIME};{SOUND};{UTF_8};{XTERM_256_COLORS};
{HEALTH_MAX};{HEALTH};{MANA_MAX};{MANA};{MOVEMENT_MAX};{MOVEMENT};
{EXPERIENCE_MIN};{EXPERIENCE_MAX};{EXPERIENCE};{BLOOD};{LEVEL};
{HITROLL};{DAMROLL};{AC};{STR};{INT};{WIS};{DEX};{CON};{CHA};{LCK};
{STR_PERM};{INT_PERM};{WIS_PERM};{DEX_PERM};{CON_PERM};{CHA_PERM};
{LCK_PERM};{ALIGNMENT};{AFFECTS};{FAVOR};{WIMPY};{WEIGHT};{WEIGHT_MAX};
{PRACTICE};{MONEY};{ROOM_EXITS};{AREA_NAME};{ROOM_NAME};{WORLD_TIME};
{AUCTION};{GEO};{AUTOSAC};{FLYING};{VIS};{COMBAT_STYLE};{OPPONENT_NAME};
{OPPONENT_HEALTH};{OPPONENT_LEVEL};{WAIT_TIME};{ANSI_COLORS};{MXP};};
#ALIAS {msdp_report} {
#VARIABLE {result} {$IAC$SB$MSDP${VAR}REPORT};
#FOREACH {*msdp_reportable_variables[]} {tmp} {
#VARIABLE {result} {$result${VAL}$tmp};
};
#SEND {$result$IAC$SE\};
#UNVARIABLE {tmp};
}
#EVENT {IAC WILL MSDP} {
#SEND {$IAC$DO$MSDP\};
msdp_report;
}
#NOP -- Parsing the reported var/val pairs is handled by the following 3 events;
#EVENT {IAC SB MSDP AFFECTS}
{
#unvariable {msdp_info[AFFECTS]};
#variable {msdp_affects_raw} {%1};
#replace {msdp_affects_raw} {\a\a} {;};
#replace {msdp_affects_raw} {\a} {;};
#foreach {$msdp_affects_raw} {tmp}
{
#regex {$tmp} {%*,%d} {#var msdp_info[AFFECTS][&1] &2} {#NOP};
};
#unvar tmp;
#unvar msdp_affects_raw
};
#EVENT {IAC SB MSDP ROOM_EXITS}
{
#UNVARIABLE msdp_info[ROOM_EXITS];
#CLASS msdp_data OPEN;
#VARIABLE {msdp_room_exits_raw} {%1};
#REPLACE {msdp_room_exits_raw} {\a} {;};
#FOREACH {$msdp_room_exits_raw} {tmp}
{
#regex {$tmp} {%w,%w} {#var msdp_info[ROOM_EXITS][&1] &2} {#NOP};
};
#UNVARIABLE tmp;
#UNVARIABLE msdp_room_exits_raw;
#CLASS msdp_data CLOSE;
};
#EVENT {IAC SB MSDP} {
#NOP {Save all variables in array at var $msdp_info};
#CLASS MSDP open;
#IF {"%0" == "AFFECTS"} {#NOP -- Handled by more specific event above};
#ELSEIF {"%0" == "ROOM_EXITS"} {#NOP -- Handled by more specific event above};
#ELSEIF {"%0" == "OPPONENT_NAME" && "%1" == ""} {
#UNVARIABLE {msdp_info[OPPONENT_NAME]};
#UNVARIABLE {msdp_info[OPPONENT_HEALTH]};
#UNVARIABLE {msdp_info[OPPONENT_LEVEL]};
};
#ELSEIF {"%0" == "OPPONENT_NAME" && "%1" != ""} {
#VARIABLE {msdp_info[OPPONENT_NAME]} {%1};
};
#ELSEIF {"%0" == "OPPONENT_LEVEL" && "%1" == "0"} {
#UNVARIABLE {msdp_info[OPPONENT_NAME]};
#UNVARIABLE {msdp_info[OPPONENT_HEALTH]};
#UNVARIABLE {msdp_info[OPPONENT_LEVEL]};
};
#ELSE {
#VARIABLE {msdp_info[%0]} {%1};
};
#class MSDP close;
}
#NOP This silences an event that is generated at the end of an MSDP sub negotiation;
#EVENT {IAC SB MSDP IAC SE} {#NOP}
#NOP This prevents the #split command sending screen resize data to the server, because realms doesn't care;
#event {CATCH IAC SB NAWS} {#NOP}
#CLASS {MSDP} {CLOSE}