View Full Version: un pnj

RunUO.FR Support > comment on fait ... > un pnj


Title: un pnj


OuRoBoRos83 - July 10, 2003 06:08 PM (GMT)


Comment fair pour crée un pnj qui selon une quette me donne une recompence si je lui ramene un objet.

Si quelqun avais un tuto qui pourais m'aider?

Sna - July 11, 2003 06:49 AM (GMT)
comme toujours l'apprentissage est le meilleur par l'exemple, voici donc un exemple que j'ai commente pour toi d'un pnj d'une quete bon amusement

CODE
/* ce pnj est fait pour recevoir 10 "shards" qui sont un objet composant d'une quete
la difference par rapport a un pnj normal c'est qu'il aura une prorpiete en plus (nombre de shards recus)
il aura aussi une methode OnSpeech qui va permettre le dialogue avec les joueurs
et une methode OnDragDrop qui permettra de traiter les objets recus
*/

using System;
using System.Collections;
using Server;
using Server.Network;
using Server.Items;

namespace Server.Mobiles
{
public class Tristal : BaseCreature
{
 private int m_Shards = 0;   //Propriete pour les "shards" recus

 [CommandProperty( AccessLevel.GameMaster )] //Acces a la propriete
 public int Shards
 {
  get { return m_Shards; }
  set { m_Shards = value; InvalidateProperties(); }
 }

 [Constructable]     //constructeur de pnj basique
 public Tristal() : base( AIType.AI_Mage, FightMode.Agressor, 22, 1, 0.2, 1.0 )
 {
  InitStats( 100, 100, 25 );   //stats et initialisations, vetements

  Name = "Tristal";   //couleur des paroles etc
  Title = "the mage";
  Hue = 1010;
  Blessed = true;
  CantWalk = true;
  NameHue = 0x35;
  SpeechHue = Utility.RandomList( 0x57, 0x67, 0x77, 0x87, 0x117 );
  Body = 0x190;
    AddItem( new FancyShirt() );
  AddItem( new WizardsHat( 1172 ) );
      AddItem( new Sandals( 1 ) );
  AddItem( new Robe( 1172 ) );
  AddItem( new PonyTail( 88 ) );
  AddItem( new GnarledStaff() );
       }

 public override bool ClickTitle{ get{ return false; } }

      public Tristal( Serial serial ) : base( serial )
       {
       }

       public override void Serialize( GenericWriter writer )   //la seule serialisation est bien sur le nombre de shards
       {
          base.Serialize( writer );

          writer.Write( (int) 0 ); // version
  writer.Write( (int) m_Shards );
       }

       public override void Deserialize( GenericReader reader )
       {
          base.Deserialize( reader );

          int version = reader.ReadInt();
  int m_Shards = reader.ReadInt();
       }

       public override void OnSpeech( SpeechEventArgs args )   //gestion de la parole
       {
        base.OnSpeech( args );

  Mobile from = args.Mobile;

          if( args.Mobile.InRange( this, 4 ) && !args.Handled )  //verification si a portee
             {
   if ( args.HasKeyword( 0xE ) ) // *quest* //si il parle de *quest*
   {
    args.Handled = true;   //Reponse du pnj a la question

    base.SayTo( from, true, "I am greatly interested in strange rock that fell near Yew.");
    base.SayTo( from, true, "Bring me any kind of research you can gather.");
   }
             }
       }

 public override bool OnDragDrop( Mobile from, Item dropped ) //reception d'objets
 {
  if ( dropped is MeteorCrystalShard )   //si l'objet est MeteorCrystalShard on repond et on fait des choses (recompenses...)
  {
   Shards++;

   if ( Shards < 5 )
   {
    Say( true, "Good work. This will help some but I will need more to finish my research." );
   }
   else
   {
    Say( true, "Excellent! All I need now is a Ice Diamond to cut it with." );
    Say( true, "The only place I know where those come from is a wyrm's nest." );
   }

   BankCheck check = new BankCheck( 10000 );
   from.BankBox.DropItem( check );
   from.SendLocalizedMessage( 1042764, "10000" );

   return true;
  }
  else  //si l'objet n'est pas ce qu on attends, on envoie au diable :)
  {
   SayTo( from, true, "That will not aid my research." );
   return false;
  }
 }
}    
}


la seule chose qu il me manque c'est des certitudes concernant la gestion des questions des joueurs en francais parce que c pas sur un shard francais qu on va dire quest :) donc si qqn peut completer...

j'espere que ca t'aidera

OuRoBoRos83 - July 11, 2003 02:25 PM (GMT)


Merci Sna :)
Seulement j'ai remplacer MeteorCrystalShard par un item qui existe deja (ex:IronOre)et la l'objets ne repond pas,pas de recompence...

OuRoBoRos83 - July 11, 2003 02:36 PM (GMT)


En fais c'est bon

OuRoBoRos83 - July 29, 2003 03:42 PM (GMT)

Encore un p'tit truc..
Comment je fais pour rendre la variable m_Shards indépendante pour
chaque joueurs.
Il me semble qu'il faut modifier le PlayerMobile.sc mais j'y arrive pas.

Merci pour votre aide :)

Shariz - July 29, 2003 06:50 PM (GMT)
Pour mettre un mot particulier.
CODE

 if ( !args.Handled && Insensitive.Equals( args.Speech, "Quete" ) ) //remplacer le mot quete  
{
 base.SayTo( from, true, "Je recherche 10 shard" );
 base.SayTo( from, true, "J'ai {0} shard en ma possession.", Convert.ToString(m_Shards));
 args.Handled = true;   //Reponse du pnj a la question
  }


Signé : Shariz l'ami des plus petits.

éditer parce qu'il y avait une petite erreur. (Shariz)

Sna - July 30, 2003 06:15 AM (GMT)
merci shariz :)

pour le PlayerMobile c'est effectivement ca, et c'est un brin plus complexe mais bon comme tjs pas insurmontable ;)

tu va devoir ajouter une propriete m_Shard, pour cela ce petit code va te permettre de le faire
CODE

 private int   m_Shard;    //Bounty
 [CommandProperty( AccessLevel.GameMaster )]    //Bounty
 public int Shards       //Bounty
 {        //Bounty
  get{ return m_Shard; }      //Bounty
  set{ m_Shard = value; }     //Bounty
 }        //Bounty


voila comme tu vois c'est pas tres dur comme code, ce qu'il faut surtout remarquer c'est que tu crees une variable privee que tu alimentes grace a une propriete, l'interet est que tu pourra faire eventuellement une verification sur la valeur donnee ou une conversion sur la valeur recue, mais tu comprendra mieux ca qd tu en aura besoin :)
et sinon a part ca, eh bien que toutes les lignes sont commentees (eeh oui le playermobile changeant a chaque version il est important de localiser vite ses lignes pour une update rapide)
pour l'emplacement, personellement je place ca juste avant le Deserialize, comme ca tout ce que je dois modifier est groupe dans le script

maintenant que tu as ajoute une propriete tu dois en sauvegarder la valeur, sinon a chaque restart du serveur elle sera reinitialisee a 0 ce qui n'est en general pas le but :)
pour ceci, je te montre un exemple, si tu as des question concernant les erreurs au demarrage (delete du playermobile) je te renvoie au tutorial en francais sur le serialize/deserialize sur ce forum ou on explique ca en detail :)

Deserialize :
CODE

   case 6:
   {
    m_Shard = reader.ReadInt();    //Bounty
    NextTailorBulkOrder = reader.ReadTimeSpan();
    goto case 5;
   }


Serialize :
CODE

  writer.Write( (int) m_Shard );     //Bounty
  writer.Write( NextTailorBulkOrder );


Bonne chance :)

OuRoBoRos83 - July 30, 2003 01:15 PM (GMT)

Merci mais le probleme et toujours le meme ,pour etre plus claire je donne
4 meteorecrystal a tristal ,si un autre joueur lui donne le 5eme il a la
recompence...

CODE

  m_Shard = reader.ReadInt();                        //Bounty
  NextSmithBulkOrder = reader.ReadTimeSpan();
  goto case 4;


Je l'ai deplacer,avec NextTailorBulkOrder sa me fais une ereure dans
le chargement du monde.

Maintenant que la variable m_Shard et dans le playermobile il faut pas modifier
le scripte de tristal a se niveau la? :

CODE

private int m_Shards = 0;   //Propriete pour les "shards" recus

[CommandProperty( AccessLevel.GameMaster )] //Acces a la propriete
public int Shards
{
 get { return m_Shards; }
 set { m_Shards = value; InvalidateProperties(); }
}

Sna - July 30, 2003 05:31 PM (GMT)
tu as ete lire le post sur le serialize dans le forum tutorial? tu trouvera tes reponses concernant ton erreur au chargement du monde :)

pour le reste ben on va modifier le code de tristal comme ceci
CODE

public override bool OnDragDrop( Mobile from, Item dropped ) //reception d'objets
{
if ( dropped is MeteorCrystalShard )  //si l'objet est MeteorCrystalShard on repond et on fait des choses (recompenses...)
{
 if (from != null)                             //Modification
 PlayerMobile player = (PlayerMobile) from;     //Modification
 player.Shards++;                          //Modification

 if ( player.Shards < 5 )                   //Modification
 {
 Say( true, "Good work. This will help some but I will need more to finish my research." );
 }
 else
 {
 Say( true, "Excellent! All I need now is a Ice Diamond to cut it with." );
 Say( true, "The only place I know where those come from is a wyrm's nest." );
 }

 BankCheck check = new BankCheck( 10000 );
 from.BankBox.DropItem( check );
 from.SendLocalizedMessage( 1042764, "10000" );
 player.Shards = 0;                //Modification

 return true;
}
else  //si l'objet n'est pas ce qu on attends, on envoie au diable :)
{
 SayTo( from, true, "That will not aid my research." );
 return false;
}
}          //Modification
}        


voila avec ca ca devrait marcher :)

Shariz - August 1, 2003 01:15 AM (GMT)
Pour faire réagir un pnj à un mot particulier, j'ai trouvé ça.

CODE

     public override void OnSpeech( SpeechEventArgs e )
     {
     
         
        if ((e.Speech == "heal") || (e.Speech =="Heal"))
        {
           m_RessurectTimer.Stop();
           m_RessurectTimer.Delay = TimeSpan.FromSeconds( Utility.Random(1, 5) );
           m_RessurectTimer.Start();
               
               
        }          
     }


Signé : Shariz l'ami des plus petits.




* Hosted for free by InvisionFree