View Full Version: Piquet à animaux

RunUO.FR Support > Items > Piquet à animaux


Title: Piquet à animaux


Gregory - August 17, 2003 03:02 AM (GMT)
QUOTE
using System;
using Server;
using Server.Mobiles;
using Server.Network;
using Server.Spells.First;
using Server.Targeting;

namespace Server.Items
{

[FlipableAttribute(0x14E8, 0x14E7)]
public class Piquet : Item
{
Mobile from;
  static bool m_attach;
  [CommandProperty( AccessLevel.GameMaster )]
  public bool Attach
  {
  get
  {
    return m_attach;
  }
  set
  {
    m_attach = value;
  }
  }


[Constructable]
public Piquet() : base(0x14E8)
{
Name = "Piquet";
this.Movable = false;
}

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

public override void OnDoubleClick ( Mobile from )
{
from.Target = new InternalTarget () ;
from.SendMessage("Quel animal voulez-vous attacher?");

}

private class InternalTarget : Target
{

public InternalTarget() : base( 3, false, TargetFlags.None )
{
}

protected override void OnTarget( Mobile from, object targeted )
{

if ( targeted is BaseCreature )
{
Mobile m = from;
BaseCreature c = (BaseCreature)targeted;

if ( c.Body.IsAnimal || c.Body.IsMonster || c.Body.IsSea )
{
if (!c.Controled || !c.Tamable)
{
from.PrivateOverheadMessage(0, 0, false, "Cet animal ne vous appartient pas.", from.NetState) ;
}
else if ( !c.Tamable )
{
from.PrivateOverheadMessage(0, 0, false, "Cet animal ne vous appartient pas.", from.NetState) ;
}
else if ( m_attach == true )
{
c.Frozen = false;
(BaseCreature)targeted.Ridable = true;
from.PrivateOverheadMessage(0, 0, false, "Votre animal est détaché.", from.NetState) ;
m_attach = false;
}
else
{
from.PrivateOverheadMessage(0, 0, false, "Votre animal est attaché.", from.NetState) ;
(BaseCreature)targeted.Ridable = false;
c.Frozen = true;
m_attach = true;

}
}
}
  else if ( targeted is Mobile )
  {
  from.PrivateOverheadMessage(0, 0, false, "Vous ne pouvez pas attachez une personne.", from.NetState) ;
  }
else
{
from.PrivateOverheadMessage(0, 0, false, "Cet objet ne bouge pas...", from.NetState) ;
}
}
}

public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);

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

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

int version = reader.ReadInt();
}
}

}


Un simple piquet pour attacher les animaux :)

crystal - August 17, 2003 01:59 PM (GMT)
Merci pour ta contribution .

Gregory - August 17, 2003 02:33 PM (GMT)
Ça me fait plaisir :)

Et y risque d'y en avoir d'autre :P

Sna - August 18, 2003 06:34 AM (GMT)
plusieurs ti problemes :)
1) on peut attacher les animaux des autres
2) on peut les attacher n'importe ou dans le monde
3) on peut attacher des animaux non-montables (crash server?)
4) le script perds les pedales si on attache plusieurs animaux

et comme j'aime pas mettre juste le doigt sur les erreurs
pour le 1
else if ( m_attach == true )
devrait etre
else if ( m_attach == true && c.Controled && c.ControlMaster == from )
pour tester le maitre (chuis plus tres sur de ControlMaster, a verifier)

pour le 2
faut faire un test de proximite, je sais pas faire ca de tete, donc je te renvoie au code de n'importe quel pnj qui parle tu trouvera cette routine

pour le 3
ceci
if ( c.Body.IsAnimal || c.Body.IsMonster || c.Body.IsSea )
devrait plutot etre
if ( c is BaseMount)
c plus court ;)

alors pour le 4 c le plus marrant :
si tu essayes d'attacher successivement 2 chevaux, c la merde, pour regler ca il faudrait ou alors faire un test
if (c.Frozen && !c.Ridable) //est deja attache
else
attacher
et virer la variable m_attach

ou alors tu peux aussi faire migrer la variable m_attach vers BaseCreature mais je te le conseilles pas :)

bon amusement :)

Gregory - August 18, 2003 12:46 PM (GMT)
:P Merci!!!
Je savais bien qui avait quelque chose :D

Gregory - August 18, 2003 01:50 PM (GMT)
Voilà, ça à été pas mal réparé sauf 1 que je suis pas sûr!!! (bolded)

CODE
using System;
using Server;
using Server.Mobiles;
using Server.Network;
using Server.Spells.First;
using Server.Targeting;

namespace Server.Items
{

  [FlipableAttribute(0x14E8, 0x14E7)]
  public class Piquet : Item
  {
   Mobile from;

   [Constructable]
   public Piquet() : base(0x14E8)
   {
    Name = "Piquet";
    this.Movable = false;
   }

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

   public override void OnDoubleClick ( Mobile from )
   {
    from.Target = new InternalTarget ();
    from.SendMessage("Quel animal voulez-vous attacher?");
   }

   private class InternalTarget : Target
   {

    public InternalTarget() : base( 3, false, TargetFlags.None )
    {
    }

    protected override void OnTarget( Mobile from, object targeted )
    {

    if ( !from.CanSee )
    {
     from.SendLocalizedMessage( "Vous ne voyez pas votre cible." );
    }
   
    else if ( targeted is BaseMount )
    {
     Mobile m = from;
     BaseMount c = (BaseMount)targeted;

     if ( c is BaseMount)
     {
      if (!c.Controled || !c.Tamable)
      {
       from.PrivateOverheadMessage(0, 0, false, "Cet animal ne vous appartient pas.", from.NetState);
      }
     }
     else if ( !c.Tamable )
     {
      from.PrivateOverheadMessage(0, 0, false, "Cet animal ne vous appartient pas.", from.NetState);
     }
     if (c.Frozen && !c.Ridable)
     {
      if ( c.Controled && c.ControlMaster == from )
      {
       c.Frozen = false;
       (BaseCreature)targeted.Ridable = true;
       from.PrivateOverheadMessage(0, 0, false, "Votre animal est détaché.", from.NetState);
      }
     }
    else
    {
[b]     if ( !c.Range == 3 )
     {
      from.SendLocalizedMessage( "Votre animal est trop loin" );
     }
[/b]     from.PrivateOverheadMessage(0, 0, false, "Votre animal est attaché.", from.NetState);
     (BaseCreature)targeted.Ridable = false;
     c.Frozen = true;
    }
    }
   
   
    else if ( targeted is Mobile )
    {
     from.PrivateOverheadMessage(0, 0, false, "Vous ne pouvez pas attachez une personne.", from.NetState);
    }
    else
    {
     from.PrivateOverheadMessage(0, 0, false, "Cet objet ne bouge pas...", from.NetState);
    }
    }
   }

  public override void Serialize(GenericWriter writer)
  {
   base.Serialize(writer);

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

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

   int version = reader.ReadInt();
  }
  }

}

Gregory - August 18, 2003 02:43 PM (GMT)
Je crois que c'est pas clair mais je cherche à vérifier ceci :

CODE
[b]     if ( !c.Range == 3 )
    {
     from.SendLocalizedMessage( "Votre animal est trop loin" );
    }


Le range.... un range de 3!!! Mais je suis pas certain et sans uo je peu pas testé :(


Sna - August 19, 2003 06:27 AM (GMT)
hehe encore 2 ou 3 choses :)
un test inutile
CODE
  BaseMount c = (BaseMount)targeted;

  if ( c is BaseMount)      //celui ci, tu l'a teste 2 lignes plus haut
  {
  if (!c.Controled || !c.Tamable)


2e chose, a la place de tout ca
CODE

  if (!c.Controled || !c.Tamable)

et autres tests, tu peux remplacer tout ca par
CODE

if ( c.Controled && c.ControlMaster == from )

si ce test la est ok, ca veut dire que le mec est proprio et qu'il le dirige actuellement, donc tu attache/detache
si le test est pas bon, ou alors l'animal est pas tamable, ou alors il est pas a lui, peu importe, pas besoin donc de tester c.Tamable :)

il faut aussi mettre ce test plus haut, car pour le moment, un mec peut detacher le cheval d'un autre :)

pour le range, je crois pas que ca va marcher, le Range etant la distance maximale a laquelle un mob peut se deplacer de son point de spawn.
Sans aucune certitude de l'existence de la methode InRange pour un item (j'ai ete chercher ca ds un mobile) je penses qu'il faut chercher de ce cote la
CODE

this.InRange( from, 4 )

this etant l'objet duquel sort la methode en cours (l'objet du script, pour appeler le script lui meme en quelque sorte), on espere que la methode InRange existe, et on lui donne comme parametre la personne a partir de laquelle on veut mesurer, et la longeur maxi du range

pour recapituler tout ca tu devrait avoir une logique a peu pres comme ceci
CODE

if ( c is BaseMount)
       if ( c.Controled && c.ControlMaster == from )
                 if (this.InRange( from, 4 ))
                            if (c.Frozen && !c.Ridable)
                                       detacher
                            else
                                       attacher
                 else
                         trop loin
       else
                c pas a vous
else
   c pas une monture


ouf :)
bon amusement

Gregory - August 19, 2003 02:35 PM (GMT)
Merci Sna,
tu m'est d'une très grande aide :)

je crois avoir tout corriger ce qui est présentement signaler, je ne peut pas le tester avec... quelques heures donc je ne suis pas sur de toutes son intégrité!

http://membres.lycos.fr/zeldacityoot/stick.cs

:D

Gregory - August 25, 2003 03:21 PM (GMT)
Après ajustement et correction, voila mes 2 problèmes :

1 : Je ne sais pas comment dire qu'il ne peut pas être monté, car il n'y a rien du style "ridable". Y a-til un autre moyen?

2 : La bêbête perd son maitre lors d'une déconnection, comment le faire garder??

Merci d'avance :)

Gregory - September 2, 2003 01:42 AM (GMT)
z'auriez pas une idée??

Oxygene - September 2, 2003 08:18 PM (GMT)
Une idée ?
Ben.....

T'as regardé du coté de \Scripts\Mobiles\Vendors\NPC\AnimalTrainer.cs ?

Voila comment je vois la chose :
- Après double-clic sur le piquet, cibler l'animal.
- Traiter l'animal comme le fait l'AnimalTrainer ( et le faire disparaitre )
- Placer a sa place un Objet à l'image du cheval (qui ne bougeras plus )
ou bien mettre une poule avec l'aspect d'un cheval (vu que la poule est non mountable...)

Mais bon, juste une idée comme ça. Il y a ptetre mieux a faire.

crystal - September 4, 2003 01:08 AM (GMT)
QUOTE (Gregory @ Aug 25 2003, 04:21 PM)
Après ajustement et correction, voila mes 2 problèmes :

1 : Je ne sais pas comment dire qu'il ne peut pas être monté, car il n'y a rien du style "ridable". Y a-til un autre moyen?

2 : La bêbête perd son maitre lors d'une déconnection, comment le faire garder??

Merci d'avance :)

pour le ridable je vois pas , c'est le client qui gere sa si tu override le Dclic faudra faire plein de modif partout .

le principe c'est que le PJ a une variable stabled pour le retrouver .

moi j'ai fait autrement mais tu n'a pas de rendu graphique . mon piquet agit exactement comme le garçon d'écurie

CODE
 /* Hitching Post By Crystal 2003  l'item en fait agit comme un
  * Pnj Stable master sans certaine contrainte , il devra etre
  * posé dans une maison le nombre de pet en stable sera de
  * 2 + Taming / 20 cela permettra a tout le monde de stocker 2 pet
  * Cheval et Pack par exepmle , mais au tameur de stocké tout ces
  *  pet de combat a 60 sa fait 5*/
using System;
using Server;
using Server.Items;
using System.Collections;
using Server.Prompts;
using Server.Targeting;
using Server.Network;
using Server.Mobiles;
using Server.Gumps;
using Server.ContextMenus;

namespace Server.Items
{
[FlipableAttribute( 0x14E7, 0x14E8 )]
public class EtableMaison :  AddonComponent
{
 [Constructable]
 public EtableMaison() : base( 0x14E7 )
 {
  Movable = false;
  Weight = 10.0;
  Name = "Piquet Etable";
 }
 
 public override void OnDoubleClick ( Mobile from )
 {
  ArrayList list = new ArrayList();

  for ( int i = 0; i < from.Stabled.Count; ++i )
  {
   BaseCreature pet = from.Stabled[i] as BaseCreature;

   if ( pet == null || pet.Deleted )
   {
    pet.IsStabled = false;
    from.Stabled.RemoveAt( i );
    --i;
    continue;
   }
   list.Add( pet );
  }
  from.SendGump( new GumpMonEtable ( from, list ) );
 }
 
 public EtableMaison( Serial serial ) : base( serial )
 {
 }

 public override void Serialize( GenericWriter writer )
 {
  base.Serialize( writer );

  writer.Write( (int) 0 );
 }

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

  int version = reader.ReadInt();
  switch ( version )
  {
   case 0:
   {
    break;
   }
  }
 }


/* //////////////////////Stable Menu entry ///////////////////////
  bon je vais certainement en chier parce que a pparemment les menu
  entries je pige nada. donc je prefere faire un gump et refaire les
  fonctions de A a Z ( au moin c'est ma merde je nage dedans tout seul)
   
*/
//Target stable//

 private class PrivStableTarget : Target
 {
  private Mobile from;
  BaseCreature pet = null;
  public PrivStableTarget( Mobile m_from ) : base( 12, false, TargetFlags.None )
  {
   from = m_from;
  }

  protected override void OnTarget( Mobile from, object targeted )
  {
   if ( targeted is BaseCreature )
   {
    pet=(BaseCreature)targeted;
   
    if ( !pet.Controled || pet.ControlMaster != from )
    {
     from.SendLocalizedMessage( 1042562 ); // You do not own that pet!
    }
    else if ( pet.Summoned )
    {
     from.SendLocalizedMessage( 502673 ); // I can not stable summoned creatures.
    }
    else if ( pet.Body.IsHuman )
    {
     from.SendLocalizedMessage( 502672 ); // HA HA HA! Sorry, I am not an inn.
    }
    else if ( (pet is PackLlama || pet is PackHorse || pet is Beetle) && (pet.Backpack != null && pet.Backpack.Items.Count > 0) )
    {
     from.SendLocalizedMessage( 1042563 ); // You need to unload your pet.
    }
    else if ( pet.Combatant != null && pet.InRange( pet.Combatant, 12 ) && pet.Map == pet.Combatant.Map )
    {
     from.SendLocalizedMessage( 1042564 ); // I'm sorry.  Your pet seems to be busy.
    }
    else if ( from.Stabled.Count >= (2 + ((from.Skills[SkillName.AnimalTaming].Value)/10))) // Limite supérieur de l'etable .
    {
     from.SendLocalizedMessage( 1042565 ); // You have too many pets in the stables!
    }
    else
    {
     pet.ControlTarget = null;
     pet.ControlOrder = OrderType.Stay;
     pet.Internalize();
     pet.SetControlMaster( null );
     pet.SummonMaster = null;
     pet.IsStabled = true;
     from.Stabled.Add( pet );

    }
   }
   else if ( targeted == from )
    from.SendMessage( "huhu ..... " );
   else
    from.SendMessage( "Vous ne pouvez mettre cela a l'etable" );
  }
 }

// le gump //
 public class GumpMonEtable : Gump
 {
  private EtableMaison trainer;
  private Mobile m_From;
  private ArrayList m_List;

  public GumpMonEtable(Mobile from , ArrayList list ) : base(0,0)
  {
   m_From = from;
   m_List = list;
   int MyPetLimit = (2 + ((int)(from.Skills[SkillName.AnimalTaming].Value)/30));

   AddPage(0);

   AddBackground( 1, 1, 390, 272, 2600);
   AddLabel( 116, 24, 0, "L'etable : ("+ MyPetLimit +" pet maximum )");
   AddBackground( 57, 79, 271, 163, 3000);
   AddItem( 10, 100, 5351);
   AddItem( 330, 100, 5352);
   AddButton( 63, 60, 9762, 9764, 11, GumpButtonType.Reply, 0 );
   AddButton( 206, 60, 5601, 5603, 12, GumpButtonType.Reply, 0 );
   AddLabel( 82, 61, 0, "Rentrer a l'etable");
   AddLabel( 224, 60, 0, "Sortir les betes");
   AddImage( 95, 40, 96);
 
   for ( int i = 0; i < list.Count; ++i )
   {
    BaseCreature pet = list[i] as BaseCreature;

    if ( pet == null || pet.Deleted )
     continue;
    AddButton( 59, 81 + (i * 20), 5601, 5603, i + 1, GumpButtonType.Reply, 0 );
    AddHtml( 94, 83 + (i * 20), 271, 89, String.Format( "<BASEFONT COLOR=#FF0000>{0}</BASEFONT>", pet.Name ), false, false );
   }
  }

  public override void OnResponse( NetState state, RelayInfo info )
  {
    Mobile from = state.Mobile;
  //{
   int index = info.ButtonID - 1;
 
   if ( index >= 0 && index < m_List.Count )
   {
    BaseCreature pet = m_List[index] as BaseCreature;
    //{
    if ( (m_From.Followers + pet.ControlSlots) <= m_From.FollowersMax )
    {
     pet.SetControlMaster( m_From );
 
     if ( pet.Summoned )
      pet.SummonMaster = m_From;
 
     pet.ControlTarget = m_From;
     pet.ControlOrder = OrderType.Follow;
 
     pet.Location = m_From.Location;
     pet.Map = m_From.Map;
 
     pet.IsStabled = false;
     m_From.Stabled.Remove( pet );
 
     from.SendLocalizedMessage ( 1042559 ); // Here you go... and good day to you!
    }
    else
    {
     from.SendLocalizedMessage ( 1049612, pet.Name ); // ~1_NAME~ remained in the stables because you have too many followers.
    }
   }
  //}
   else if (info.ButtonID == 11 )
    from.Target = new PrivStableTarget(from);
   else if (info.ButtonID == 12 )
   {
    bool claimed = false;
    int stabled = 0;

    for ( int i = 0; i < from.Stabled.Count; ++i )
    {
     BaseCreature pet = from.Stabled[i] as BaseCreature;

     if ( pet == null || pet.Deleted )
     {
      pet.IsStabled = false;
      from.Stabled.RemoveAt( i );
      --i;
      continue;
     }

     ++stabled;

     if ( (from.Followers + pet.ControlSlots) <= from.FollowersMax )
     {
      pet.SetControlMaster( from );

      if ( pet.Summoned )
       pet.SummonMaster = from;

      pet.ControlTarget = from;
      pet.ControlOrder = OrderType.Follow;

      pet.Location = from.Location;
      pet.Map = from.Map;

      pet.IsStabled = false;
      from.Stabled.RemoveAt( i );
      --i;

      claimed = true;
     }
     else
     {
      from.SendLocalizedMessage ( 1049612, pet.Name ); // ~1_NAME~ remained in the stables because you have too many followers.
     }
    }

    if ( claimed )
     from.SendLocalizedMessage ( 1042559 ); // Here you go... and good day to you!
    else if ( stabled == 0 )
     from.SendLocalizedMessage ( 502671 ); // But I have no animals stabled with me at the moment!
   }
  }
 }
}

}
//}

namespace Server.Items
{
public class HitchingPostAddon : BaseAddon
{
 public override BaseAddonDeed Deed{ get{ return new HitchingPostDeed(); } }

 [Constructable]
 public HitchingPostAddon()
 {
  AddComponent( new EtableMaison(), 0, 0, 0 );
 }

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

 public override void Serialize( GenericWriter writer )
 {
  base.Serialize( writer );

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

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

  int version = reader.ReadInt();
 }
}



public class HitchingPostDeed : BaseAddonDeed
{
 public override BaseAddon Addon{ get{ return new HitchingPostAddon(); } }
 public override int LabelNumber{ get{ return 1025351; } } // Hitching Post

 [Constructable]
 public HitchingPostDeed()
 {
 }

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

 public override void Serialize( GenericWriter writer )
 {
  base.Serialize( writer );

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

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

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

crystal - September 4, 2003 01:09 AM (GMT)
mon piquet est dispo sur realworld et Carpe diem depuis un bail déja , aucun bug ne m'a été rapporté encore.

CoolDev - September 4, 2003 02:11 AM (GMT)
Sur Carpe c'est un fait maison. L'animal reste dehors et ne bouge pas (même après reboot). Pour ca faut mettre son IA à none. Problème, il ne se détamera jamais si vous ne gérez pas un timer avec votre poteau.

Gregory - September 8, 2003 09:10 PM (GMT)
Tout va, j'ai qu'un problème avec heu *vérifie* from.InRange( t, 3 )

from = mobile
t = static Piquet t;

le problème est sans consteste t!!
Mais je sais pas comment déclarer le piquet dans la target...... static t this????

le serveur plante là!! Bref, je veut juste voir pour pas que il soit attaché de n'importe où!
Mais j'aurais dû le tester sans ça! pas grave :D

crystal - September 9, 2003 12:48 PM (GMT)
dans la target envoie THIS pour le piquet

si THIS est a plus de 3 tile du target , le piquet est trop loin tu t'en fou de from dans ce cas en fait




Hosted for free by InvisionFree