************************ MENSAJES DE RESET EN MOBS ************************* Cuando un área se resetea se vuelven a cargar los mobs que han pasado a mejor vida o que han desaparecido del área, pero cuando esto ocurre tu no te das cuenta de que el mob ha 'vuelto'. Con este snippet se puede añadir un campo extra a la sección MOBILES de un área para que se mande un mensaje concreto a la habitación donde se carga ese mob específico. He dividido el snippet en 3 partes dependiendo de tus necesidades o de la versión de Smaug que utilices: la primera (COMUN) es la única que necesitas si no piensas modificar las areas online. La segunda (ONLINE) implementa los cambios necesarios en los comandos de inmortales 'mset', 'mstat' y 'foldarea'; y el tercero (COLORIZE 1.4a) se necesita si dispones de la versión 1.4a de Smaug y quieres utilizar las nuevas características de colores en comandos. La ultima sección (USO) es tambien común y explica como usar este snippet. ***************************************************************** * COMUN * ***************************************************************** En MUD.H: - Busca en la estructura mob_index_data el siguiente campo: char * description; y añade despues: char * load_msg; - El la sección dedicada a las declaraciones de funciones: /* act_wiz.c */ añade esta: void echo_to_room args( ( sh_int AT_COLOR, ROOM_INDEX_DATA *room, char *argument ) ); En DB.C: - Busca dentro de la función load_mobiles estas líneas: letter = fread_letter( fp ); if ( letter == '>' ) y añade justo ANTES: letter = fread_letter( fp ); if (letter == '&') pMobIndex->load_msg = fread_string (fp); else ungetc( letter, fp); En HANDLER.C: - Buscar en la función clean_mob : STRFREE(mob->description); y añadir después: STRFREE(mob->load_msg); En RESET.C: - Busca en la función reset_area lo siguiente: char_to_room(mob, pRoomIndex); y añade DESPUES: if (pMobIndex->load_msg && (pArea->nplayer > 0)) echo_to_room(AT_RESET, pRoomIndex, pMobIndex->load_msg ); - Si no vas a modificar areas online, puedes ir directamente a la última sección (USO), o a la sección COLORIZE 1.4a si vas a utilizar el comando de colorear que aparece en la versión 1.4a de Smaug. *************************************************************** * ONLINE * *************************************************************** En BUILD.C - Busca esta línea dentro de la función do_mset: send_to_char( " name short long description title spec clan\n\r", ch ); Debes cambiarla por esta: send_to_char( " name short long description title loadmsg spec clan\n\r",ch); - En la misma función busca esta línea: if ( !str_cmp( arg2, "spec" ) ) y añade justo ANTES: if ( !str_cmp( arg2, "loadmsg" ) ) { if( !can_mmodify (ch, victim)) return; if(!IS_NPC(victim)) { send_to_char ("Not on PC's.\n\r", ch) return; } if(victim->pIndexData->load_msg) STRFREE( victim->pIndexData->load_msg ); victim->pIndexData->load_msg = STRALLOC( arg3 ); return; } - En la función fold_area busca lo siguiente: if ( pMobIndex->mudprogs ) y añade justo ANTES: if ( pMobIndex->load_msg) fprintf( fpout, "&%s~\n", pMobIndex->load_msg ); En ACT_WIZ.C: - Dentro de la función do_mstat busca las líneas: if ( IS_NPC(victim) && victim->spec_fun ) pager_printf_color( ch, "&cMobile has spec fun: &w%s\n\r", y añade ANTES: if( IS_NPC(victim) && victim->pIndexData->load_msg ) pager_printf_color ( ch, "&cLoadMsg : &w%s\n\r", victim->pIndexData->load_msg ); - Lee la sección USO. ****************************************************************** * COLORIZE 1.4a * ****************************************************************** En MUD.H: - Busca AT_TOPCOLOR y añade ANTES: AT_LOAD, - Y DESPUES de: #define AT_MORPH AT_GREY añade: #define AT_LOAD AT_DGREEN En CONST.C: - Busca esta línea: { "morph", AT_GREY }, y añade DESPUES: { "load", AT_DGREEN } En RESET.C: - Debes cambiar la línea que incluyo en la sección COMUN: echo_to_room(AT_RESET, pRoomIndex, pMobIndex->load_msg ); Ahora debe pasar a ser: echo_to_room(AT_LOAD, pRoomIndex, pMobIndex->load_msg ); En COLORS.DAT (en el directorio ../system) - Busca la línea: 1071 morph~ 7 y añade DESPUES: 1072 load~ 2 - Lee la sección USO, por favor. ********************************************************************* * USO * ********************************************************************* Despues de añadir estos cambios a tu código fuente, haz un 'make clean' y un 'make'. Si vas a modificar las areas offline, debes ir a la sección MOBILES del área y añadir al mob elegido tu nuevo mensaje de reset. Debe incluirse en la última línea, despues de todos los campos numéricos, excepto si tiene un prog, entonces se debe incluir entre la última línea numérica y el comienzo del prog. La línea debe tener la siguiente forma (comienza con un & y termina con un ~) &Aqui pondrias tu nuevo mensaje.~ Obviamente no se pueden editar areas que contengan dichos mensajes con un editor offline como el ORB o el AREA EDITOR, porque no son capaces de entender dichos campos. Al final del fichero te doy un ejemplo de mob con mensaje de reset. Si quieres modificar areas online, puedes usar mset con el nuevo campo 'loadmsg' ,ahi va un ejemplo: mset lagarto loadmsg Un enorme lagarto aparece de repente gruñendote.~ Recuerda hacer un 'foldarea' despues, para salvar los datos al área. Podras ver los nuevos mensajes con el comando mstat. Si añades la sección COLORIZE, puedes seleccionar el color del mensaje de reset,(solo version 1.4a de Smaug), por ejemplo: colorize load cyan NOTA: Mucha gente me pregunta como probar los nuevos mensajes, ya que con el comando 'reset area', estos mensajes no se mandan. El snippet está pensado para que funcione con el reset interno del mud (cuando un área llega al tiempo marcado de reset, carga los mobs inexistentes y manda los mensajes). La razón para que no aparezcan los mensajes con dicho comando IMM es la misma por la que no aparecen los mensajes de reset del área ( dentro de la función edit_area se restaura el número de jugadores en el área a 0 --> pArea->nplayer = 0 ). Yo hago esta comparación en reset.c: if (pMobIndex->load_msg && (pArea->nplayer > 0)) echo_to_room(AT_RESET, pRoomIndex, pMobIndex->load_msg ); esto es porque no quiero que se manden los mensajes cuando el mud arranca o cuando el área esá vacia. Si quieres que aparezcan cuando usas 'reset area' debes cambiar la primera linea a: if (pMobIndex->load_msg) Pero la primera forma congestiona menos el Mud. Si lo que quieres es probar los nuevos mensajes puedes ajustar, temporalmente el tiempo de reset del área a un valor más bajo, un ejemplo: aset dwarven.are resetfreq 1 *************************************************************** * EJEMPLO DE MOB * *************************************************************** #7040 dragon rojo~ un fiero dragon rojo~ Un fiero dragon de color rojo, se despereza enfadado. ~ El dragon rojo te observa enfadado, mientras se despierta con tu llegada. Dice 'Oh, humano me HAS despertado... Hsss', mientras se te acerca. 'No puede uno NUNCA dormir en paz ... Hsss'. ~ 39 520 -1000 C 33 -10 -10 500d2+2500 3d4+30 5000 450000 8 8 0 13 13 13 13 13 13 13 0 0 0 0 0 31 3 0 0 67584 2049 3 0 0 361105 112 3073 2 3 0 &Un impresionante dragon aparece de repente escupiendo fuego.~ > all_greet_prog 100~ if isnpc($n) or isimmort($n) else conjurar 'aliento acido' $n endif ~ | ************************************************************************ * Te agradecería que me escribieras si decides usar este código. * * Cualquier sugerencia o problema que tengas, mándame un email * * jose@luisso.net * * * ************** Desden, el Chamán Tibetano - Junio 1999 **************