Jump to content
  • 0
DarkGuerra

[Ayuda] NPCTalk

Question

Muy buen@s amigos.

Estoy nuevamente por aquí para solicitar de su valiosa ayuda.

Tengo este NPC:

 

prontera,162,193,4   script   Sakura   MAGALETA,3,3,{      set .inUse, .inUse + 1;   .@price = 10000;   .@Buffs = 1;   .@Delay = 3;   if (@HD > gettimetick(2)) end;   if (.@price) {   if (Zeny < .@price) end;   Zeny -= .@price;   }   specialeffect2 EF_HEAL2; percentheal 100,100;   emotion   e_thx;   if (.@Buffs) {      specialeffect2 EF_INCAGILITY; sc_start SC_INC_AGI,300000,15;      specialeffect2 EF_BLESSING; sc_start SC_BLESSING,300000,15;   }   if (.@Delay) @HD = gettimetick(2)+.@Delay;   end;      set .inUse, .inUse - 1;   end;   OnInit:   set .minX,148;   set .maxX,163;   set .minY,176;   set .maxY,195;   set .minD,0;   set .maxD,10;   npcspeed 200;      initnpctimer;   end;   OnTimer5000:   if (.inUse) {   set .inUse, 0;   } else {   getmapxy .map$,.x,.y,1;   set .curX, callfunc("NPCWalk",.minX, .maxX,.minD,.maxD,.x);   set .curY, callfunc("NPCWalk",.minY, .maxY,.minD,.maxD,.y);   npcwalkto .curX, .curY;   }      stopnpctimer;   initnpctimer;   end;OnTouch:   specialeffect2 EF_HEAL2; percentheal 10,10;   }//////////////////////////////////////////////////////////////////////////////////////function   script   NPCWalk   {   set .CP, getarg(4);   set .DST, rand(getarg(2),getarg(3));   if (rand(2))   set .CP, .CP + .DST;   else   set .CP, .CP - .DST;   if (.CP < getarg(0)) set .CP, .CP + .DST;   if (.CP > getarg(1)) set .CP, .CP - .DST;   return .CP;}

 

 


El NPC camina aleatoriamente según las coordenadas queridas.
Ok hasta hay todo esta perfecto el npc camina solo todo lo que quiere dentro de cierto parámetro.
El mismo da HEAL si te acercas 3 celdas a el. y si lo tocas te da buff y heal por 10000 Zeny a nivel 15.

Aquí las Preguntas.:

1.- Como hago que al seleccionar al NPC y me de Buff no sea necesario llegar al lado de el?
Ya que el NPC es un MOB de Bio aparece la espada y obligatoriamente el Player tiene que acercarse a el para el buff como si fuera a atacarlo. hay alguna manera de quitar esto que no sea cambiar el NPC?

2.- Hay manera de colocar al npc que hable mientras camina?
osea que hable por ejemplo cada 30 minutos y diga:

 

   npctalk "Hola Forastero!";   npctalk "Si Me Das 10.000 Zeny Te Doy Agility y Blessing";   npctalk "En nivel 15 Por 5 Minutos , Te Sera De Gran Ayuda.!"; 

Sin que afecte el tiempo en que camine el NPC?

PD: este es solo un NPC ejemplo.

Muchas gracias de ante mano
Quedo atento.
Un Gran Saludo.

 

 

 

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0

1.- Creo que no sin liarla con el cliente y meter el sprite del mob entre los sprites de NPC (cosa que no sé, nunca me llevé muy bien con el cliente), o a menos que haya habido una actualización reciente de scripting que permita hacerlo y de la que no esté informado.

 

2.- Como tu NPC camina cada 5 segundos, podemos hacer algo interesante. Si quieres hacerlo hablar cada 30 minutos puedes hacer la cuenta y "abusar" de la rutina de temporización haciendo una simple cuenta. Si media hora es 1800000 milisegundos, y se pasa cada 5000 milisegundos, por lo que la cuenta de veces que ha de pasar antes de anunciar nada es de 1800000/5000 = 360.

 

El NPC quedaría más o menos así:

prontera,162,193,4	script	Sakura	MAGALETA,3,3,{      set .inUse, .inUse + 1;   .@price = 10000;   .@Buffs = 1;   .@Delay = 3;   if (@HD > gettimetick(2)) end;   if (.@price) {   if (Zeny < .@price) end;   Zeny -= .@price;   }   specialeffect2 EF_HEAL2; percentheal 100,100;   emotion   e_thx;   if (.@Buffs) {      specialeffect2 EF_INCAGILITY; sc_start SC_INC_AGI,300000,15;      specialeffect2 EF_BLESSING; sc_start SC_BLESSING,300000,15;   }   if (.@Delay) @HD = gettimetick(2)+.@Delay;   end;      set .inUse, .inUse - 1;   end;   OnInit:   set .minX,148;   set .maxX,163;   set .minY,176;   set .maxY,195;   set .minD,0;   set .maxD,10;   npcspeed 200;      initnpctimer;   end;   OnTimer5000:   if (.inUse) {   set .inUse, 0;   } else {   getmapxy .map$,.x,.y,1;   set .curX, callfunc("NPCWalk",.minX, .maxX,.minD,.maxD,.x);   set .curY, callfunc("NPCWalk",.minY, .maxY,.minD,.maxD,.y);   npcwalkto .curX, .curY;   }      .current_count++;      if(.current_count >= 360) { // Número de veces antes de anunciar	npctalk "Hola Forastero!";	npctalk "Si Me Das 10.000 Zeny Te Doy Agility y Blessing";	npctalk "En nivel 15 Por 5 Minutos , Te Sera De Gran Ayuda.!"; 	.current_count = 0;   }      stopnpctimer;   initnpctimer;   end;OnTouch:   specialeffect2 EF_HEAL2; percentheal 10,10;   }//////////////////////////////////////////////////////////////////////////////////////function	script	NPCWalk	{   set .CP, getarg(4);   set .DST, rand(getarg(2),getarg(3));   if (rand(2))   set .CP, .CP + .DST;   else   set .CP, .CP - .DST;   if (.CP < getarg(0)) set .CP, .CP + .DST;   if (.CP > getarg(1)) set .CP, .CP - .DST;   return .CP;}

Share this post


Link to post
Share on other sites
  • 0

Muchas Gracias jaBote.

 

Quedo Perfecto la verdad.

 

Pero me gustaría agregarle un Intervalo de tiempo por cada verso a decir.

 

Lo coloque así.:

 

      .current_count++;      if(.current_count >= 360) {	// Número de veces que camina antes de anunciar	npctalk "Hola Forastero!";	sleep 3000;	npctalk "Si Me Das 10.000 Zeny Te Doy Agility y Blessing";	sleep 3000;	npctalk "En nivel 15 Por 5 Minutos , Te Sera De Gran Ayuda.!"; 	.current_count = 0;	}

Pero creo que interfiere con la cuenta porque no pasa mi 2 minutos y ya lo dice.

 

Como podría acomodarlo?

 

Gracias De verdad Por Tu Ayuda.!

Un abrazo, Saludos.

Share this post


Link to post
Share on other sites
  • 0

No entiendo muy bien a lo que te refieres. Aún así la primera ocurrencia de los mensajes podría no ser a la media hora, pero para el resto de ocurrencias sí tienes que calibrar que sea más o menos media hora (será un poco más aunque no voy a entrar en el detalle ya que no se trata, ni mucho menos, de un sistema de tiempo real critico).

 

De todas formas, lo que más tergiversa la base de tiempos es la espera de 3 s entre mensaje y mensaje, que se hace aún antes de lanzar de nuevo el contador. Puedes probar a hacer esto (a sabiendas de que no termino de entenderte) a ver si mejora:

 

OnTimer5000:   if (.inUse) {   set .inUse, 0;   } else {   getmapxy .map$,.x,.y,1;   set .curX, callfunc("NPCWalk",.minX, .maxX,.minD,.maxD,.x);   set .curY, callfunc("NPCWalk",.minY, .maxY,.minD,.maxD,.y);   npcwalkto .curX, .curY;   }      .current_count++;      stopnpctimer;   initnpctimer;    if(.current_count >= 360) {	// Número de veces que camina antes de anunciar    .current_count = 0;    npctalk "Hola Forastero!";    sleep 3000;    npctalk "Si Me Das 10.000 Zeny Te Doy Agility y Blessing";    sleep 3000;    npctalk "En nivel 15 Por 5 Minutos , Te Sera De Gran Ayuda.!";	}   end;

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.