From: tchaerlach@aol.com Try using these two functions, skillstat and spellstat, I think this is what you have been talking about so you can check skills and spells of someone without having to snoop and force them... oid do_skillstat(CHAR_DATA *ch, char *argument) { BUFFER *buffer; char arg[MAX_INPUT_LENGTH]; char skill_list[LEVEL_HERO + 1][MAX_STRING_LENGTH]; char skill_columns[LEVEL_HERO + 1]; int sn, level, min_lev = 1, max_lev = LEVEL_HERO; bool found = FALSE; char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; if (IS_NPC(ch)) return; if ( arg[0] == '\0' ) { send_to_char( "List skills for whom?\n\r", ch ); return; } if ( ( victim = get_char_world( ch, argument ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (IS_NPC(victim)) { send_to_char( "Use this for skills on players.\n\r", ch ); return; } /* initialize data */ for (level = 0; level < LEVEL_HERO + 1; level++) { skill_columns[level] = 0; skill_list[level][0] = '\0'; } for (sn = 0; sn < MAX_SKILL; sn++) { if (skill_table[sn].name == NULL ) break; if ((level = skill_table[sn].skill_level[victim->class]) < LEVEL_HERO + 1 && level >= min_lev && level <= max_lev && (skill_table[sn].spell_fun == spell_null) && victim->pcdata->learned[sn] > 0) { found = TRUE; level = skill_table[sn].skill_level[victim->class]; if (victim->level < level) sprintf(buf,"%-18s n/a ", skill_table[sn].name); else sprintf(buf,"%-18s %3d%% ",skill_table[sn].name, victim->pcdata->learned[sn]); if (skill_list[level][0] == '\0') sprintf(skill_list[level],"\n\rLevel %2d: %s",level,buf); else /* append */ { if ( ++skill_columns[level] % 2 == 0) strcat(skill_list[level],"\n\r "); strcat(skill_list[level],buf); } } } /* return results */ if (!found) { send_to_char("No skills found.\n\r",ch); return; } buffer = new_buf(); for (level = 0; level < LEVEL_HERO + 1; level++) if (skill_list[level][0] != '\0') add_buf(buffer,skill_list[level]); add_buf(buffer,"\n\r"); page_to_char(buf_string(buffer),ch); free_buf(buffer); } void do_spellstat(CHAR_DATA *ch, char *argument) { BUFFER *buffer; char buff[100]; char arg[MAX_INPUT_LENGTH]; char spell_list[LEVEL_HERO + 1][MAX_STRING_LENGTH]; char spell_columns[LEVEL_HERO + 1]; int sn, gn, col, level, min_lev = 1, max_lev = LEVEL_HERO, mana; bool found = FALSE; char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; if (IS_NPC(ch)) return; if ( arg[0] == '\0' ) { send_to_char( "List spells for whom?\n\r", ch ); return; } if ( ( victim = get_char_world( ch, argument ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (IS_NPC(victim)) { send_to_char( "Use this for skills on players.\n\r", ch ); return; } /* groups */ col = 0; for (gn = 0; gn < MAX_GROUP; gn++) { if (group_table[gn].name == NULL) break; if (victim->pcdata->group_known[gn]) { sprintf(buff,"%-20s ",group_table[gn].name); send_to_char(buff,ch); if (++col % 3 == 0) send_to_char("\n\r",ch); } } if ( col % 3 != 0 ) { send_to_char( "\n\r", ch ); sprintf(buff,"Creation points: %d\n\r",victim->pcdata->points); send_to_char(buff,ch); } /* initialize data */ for (level = 0; level < LEVEL_HERO + 1; level++) { spell_columns[level] = 0; spell_list[level][0] = '\0'; } for (sn = 0; sn < MAX_SKILL; sn++) { if (skill_table[sn].name == NULL ) break; if ((level = skill_table[sn].skill_level[victim->class]) < LEVEL_HERO + 1 && level >= min_lev && level <= max_lev && skill_table[sn].spell_fun != spell_null && victim->pcdata->learned[sn] > 0) { found = TRUE; level = skill_table[sn].skill_level[victim->class]; if (victim->level < level) sprintf(buf,"%-18s n/a ", skill_table[sn].name); else { mana = UMAX(skill_table[sn].min_mana, 100/(2 + victim->level - level)); sprintf(buf,"%-18s %3d mana ",skill_table[sn].name,mana); } if (spell_list[level][0] == '\0') sprintf(spell_list[level],"\n\rLevel %2d: %s",level,buf); else /* append */ { if ( ++spell_columns[level] % 2 == 0) strcat(spell_list[level],"\n\r "); strcat(spell_list[level],buf); } } } /* return results */ if (!found) { send_to_char("No spells found.\n\r",ch); return; } buffer = new_buf(); for (level = 0; level < LEVEL_HERO + 1; level++) if (spell_list[level][0] != '\0') add_buf(buffer,spell_list[level]); add_buf(buffer,"\n\r"); page_to_char(buf_string(buffer),ch); free_buf(buffer); }