{\rtf1\ansi\deff0{\fonttbl{\f0\fswiss\fcharset0 Arial;}} {\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\lang1033\f0\fs20 /***************************************************\par This code allows IMP's to grant specific imm commands to mortals\par or lower imms. They can also be revoked with the included revoke\par command. The granted commands are saved with the player. Also in\par this snippet is the viewgrant command, which can be used by imps\par for finding a person's granted commands, or can be used by anyone\par to view their own granted commands. The maximum number of granted\par commands is defined as MAX_GRANT, so feel free to change it.\par ****************************************************/\par \par -- act_wiz.c --\par \par Place these functions anywhere:\par \par void do_grant( CHAR_DATA *ch, char *argument )\par \{\par char arg1[MAX_INPUT_LENGTH];\par char arg2[MAX_INPUT_LENGTH];\par bool found = FALSE;\par CHAR_DATA *victim;\par int cmd = 0;\par int grant = 0;\par argument = one_argument( argument, arg1 );\par argument = one_argument( argument, arg2 );\par \par if (( arg1[0] == '\\0' ) || ( arg2[0] == '\\0' ))\par \{\par send_to_char( "Syntax: grant <player> <command>\\n\\r", ch );\par return;\par \}\par \par if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )\par \{\par send_to_char( "They aren't here.\\n\\r", ch );\par return;\par \}\par if ( IS_NPC(victim))\par \{\par \tab send_to_char( "Sorry, no NPC's.\\n\\r", ch );\par \tab return;\par \}\par \par for ( cmd = 0; cmd_table[cmd].name[0] != '\\0'; cmd++ )\par \{\par \tab if ( !str_prefix( arg2, cmd_table[cmd].name ) )\par \tab\{\par \tab found = TRUE;\par \tab break;\par \tab\}\par \}\par if ( !found )\par \{\par \tab send_to_char( "That isn't a command.\\n\\r", ch );\par \tab return;\par \}\par found = FALSE;\par for ( grant = 0; grant < MAX_GRANT; grant++ ) \par \{\par \tab if (( victim->pcdata->grant[grant] == NULL ) || ( victim->pcdata->grant[grant][0] == '\\0' ))\par \tab\{\par \tab found = TRUE;\par \tab break;\par \tab\}\par \}\par if (!found)\par \{\par \tab send_to_char("They already have too many commands granted.\\n\\r", ch );\par \tab return;\par \}\par victim->pcdata->grant[grant] = str_dup( cmd_table[cmd].name );\par printf_to_char( ch, "%s has been granted the %s command.\\n\\r", victim->name, cmd_table[cmd].name);\par printf_to_char( victim, "You have been granted the %s command.\\n\\r", cmd_table[cmd].name);\par return;\par \}\par \par void do_revoke( CHAR_DATA *ch, char *argument )\par \{\par char arg1[MAX_INPUT_LENGTH];\par char arg2[MAX_INPUT_LENGTH];\par CHAR_DATA *victim;\par int grant = 0;\par argument = one_argument( argument, arg1 );\par argument = one_argument( argument, arg2 );\par \par if (( arg1[0] == '\\0' ) || ( arg2[0] == '\\0' ))\par \{\par send_to_char( "Syntax: revoke <player> <command>\\n\\r", ch );\par return;\par \}\par \par if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )\par \{\par send_to_char( "They aren't here.\\n\\r", ch );\par return;\par \}\par if ( IS_NPC(victim))\par \{\par \tab send_to_char( "Sorry, no NPC's.\\n\\r", ch );\par \tab return;\par \}\par \par for ( grant = 0; grant < MAX_GRANT; grant++ )\par \{\par \tab if ( victim->pcdata->grant[grant] == NULL)\par \tab\tab continue;\par \tab if ( !str_prefix( victim->pcdata->grant[grant], arg2))\par \tab\{\par \tab victim->pcdata->grant[grant] = str_dup( "" );\par \tab printf_to_char( ch, "%s's %s command has been revoked.\\n\\r", victim->name, arg2);\par \tab printf_to_char( victim, "Your %s command has been revoked.\\n\\r", arg2);\par \tab return;\par \tab\}\par \}\par send_to_char( "That player has not been granted that command.\\n\\r", ch );\par return;\par \}\par \par void do_viewgrant( CHAR_DATA *ch, char *argument )\par \{\par CHAR_DATA* victim;\par int i;\par bool match = FALSE;\par if ( IS_NPC(ch))\par \{\par \tab send_to_char( "Sorry, no NPC's.\\n\\r", ch );\par \tab return;\par \}\par if ( argument[0] == '\\0' )\par \{\par \tab send_to_char( "These are your specifically granted commands:\\n\\r", ch );\par \tab for ( i = 0; i < MAX_GRANT; i++ )\par \tab\{\par \tab if (( ch->pcdata->grant[i] != NULL ) && ( ch->pcdata->grant[i][0] != '\\0' ))\par \tab \{\par \tab\tab match = TRUE;\par \tab\tab printf_to_char( ch, "%s\\n\\r", ch->pcdata->grant[i] );\par \tab \}\par \tab\}\par \tab if ( !match )\par \tab send_to_char( "None.\\n\\r", ch );\par \tab return;\par \}\par \par if ( ( victim = get_char_world( ch, argument ) ) == NULL )\par \{\par send_to_char( "They aren't here.\\n\\r", ch );\par return;\par \}\par if ( IS_NPC(victim))\par \{\par \tab send_to_char( "Sorry, no NPC's.\\n\\r", ch );\par \tab return;\par \}\par \par if ( ch->trust < victim->trust )\par \{\par \tab send_to_char( "Your powers aren't strong enough to find their granted commands.\\n\\r", ch );\par \tab return;\par \}\par \par printf_to_char( ch, "These are %s's specifically granted commands:\\n\\r", victim->name );\par for ( i = 0; i < MAX_GRANT; i++ )\par \{\par \tab if (( victim->pcdata->grant[i] != NULL ) && ( victim->pcdata->grant[i][0] != '\\0' ))\par \tab\{\par \tab match = TRUE;\par \tab printf_to_char( ch, "%s\\n\\r", victim->pcdata->grant[i] );\par \}\par \}\par if ( !match )\par \tab send_to_char( "None.\\n\\r", ch );\par return;\par \}\par \par -- interp.c --\par Add this under "Immortal Commands":\par \line \{ "grant",\tab\tab do_grant,\tab POS_DEAD,\tab ML, LOG_ALWAYS, 1 \},\par \{ "revoke",\tab\tab do_revoke,\tab POS_DEAD,\tab ML, LOG_ALWAYS, 1 \},\par \line Add this under "Informational commands":\par \line \{ "viewgrant",\tab do_viewgrant, POS_DEAD,\tab 0, LOG_NORMAL, 1 \},\par \par At the top of the interpret function add, int i;\line Then scroll down alittle bit and find this:\par \par for ( cmd = 0; cmd_table[cmd].name[0] != '\\0'; cmd++ )\par \{\par \tab if ( command[0] == cmd_table[cmd].name[0]\par \tab && !str_prefix( command, cmd_table[cmd].name )\par \tab && cmd_table[cmd].level <= trust )\par \par Remove the cmd_table[cmd].level <= trust condition.\par \line Add this before the Log and Snoop comment in interpret:\par \par if ( cmd_table[cmd].level > trust )\par \{\par \tab found = FALSE;\par \tab for ( i = 0; i < MAX_GRANT; i++ )\par \tab\{\par \tab if (( ch->pcdata->grant[i] == NULL ) || ( ch->pcdata->grant[i][0] == '\\0' ))\par \tab\tab continue;\par \tab if ( !str_prefix( command, ch->pcdata->grant[i] ))\par \tab \{\par \tab\tab found = TRUE;\par \tab\tab break;\par \tab \}\par \tab\}\par \}\par \par -- interp.h --\par Add these:\par DECLARE_DO_FUN( do_grant\tab );\par DECLARE_DO_FUN( do_revoke\tab );\par DECLARE_DO_FUN( do_viewgrant\tab );\par \par -- merc.h --\par Define this somewhere in with the other MAX values:\par #define MAX_GRANT\tab\tab 10\par \par Add this to the pc_data struct:\par char *\tab\tab grant[MAX_GRANT];\par \par -- save.c --\par Add this to the top of fwrite_char:\par \tab int gr;\par \par Add after this block of code (toward the end of fwrite_char):\par \tab for ( gn = 0; gn < MAX_GROUP; gn++ )\par \{\par if ( group_table[gn].name != NULL && ch->pcdata->group_known[gn])\par \{\par fprintf( fp, "Gr '%s'\\n",group_table[gn].name);\par \}\par \}\par \par This:\par \tab for ( gr = 0; gr < MAX_GRANT; gr++ )\par \tab\{\par \tab if (( ch->pcdata->grant[gr] != NULL ) && ( ch->pcdata->grant[gr][0] != '\\0' ))\par \tab \{\par \tab\tab fprintf( fp, "Cmd %s~\\n",ch->pcdata->grant[gr] );\par \tab \}\par \tab\}\par \par Add this at the top in fread_char:\par \tab sh_int grcount;\par \par Add this in the logical position in fread_char:\par \tab if (!str_cmp(word,"Cmd"))\par \tab \{\par \tab\tab if (count >= MAX_GRANT)\par \tab\tab\{\par \tab\tab fread_to_eol(fp);\par \tab\tab fMatch = TRUE;\par \tab\tab break;\par \tab\tab\}\par \tab\tab ch->pcdata->grant[grcount] = fread_string( fp );\par \tab\tab grcount++;\par \tab\tab fMatch = TRUE;\par \tab \}\line\par \par }