Modification : Vol

Modification : Vol

Post by Phydias Shaytan, CP - June 8, 2008 at 12:13 AM

Quelques petites suggestions et corrections pour le vol.

Corrections :

Modifications :
Pour les deux modifications apportées (Vol caché et vol d'objet équipé), les paramètres sont en début de fichier avec possibilité de désactiver ou d'activer ces changements ^^

Pour le plaisir des scripteurs, j'ai pensé à commenter tout ça. Par contre, j'ai aps pu compiler, donc il devrait y avoir deux trois fautes de frappes peut-être...

Stealing.cs

using System;
using Server;
using Server.Mobiles;
using Server.Targeting;
using Server.Items;
using Server.Network;

namespace Server.SkillHandlers
{
\tpublic class Stealing
\t{
\t // -------------------------------------------------------------------------
\t // Paramètres - Système de vol caché
\t // -------------------------------------------------------------------------
\t // stayHidden :
\t // @Description
\t // Activation du système
\t // @Valeur
\t // - true = actif
\t // - false = inactif
\t private bool stayHidden = true;
\t // stayHiddenMaxChance :
\t // @Description
\t // Chance maximum de rester cacher (Hiding & Stealth à 100%)
\t private double stayHiddenMaxChance = 90.0;
\t // stayHiddenMinChance :
\t // @Description
\t // Chance minimum de rester cacher (Hiding & Stealth à StayHiddenSkill)
\t private double stayHiddenMinChance = 20.0;
\t // stayHiddenSkill :
\t // @Description
\t // Compétence minimum requise pour rester caché lors d'un vol
\t private double stayHiddenSkill = 50.0;
\t // -------------------------------------------------------------------------
\t // Paramètres - Vol d'objet équipé
\t // -------------------------------------------------------------------------
\t // layerSteal :
\t // @Description
\t // Activation du vol d'objet équipé
\t // @Valeur
\t // - true = actif
\t // - false = inactif
\t private bool layerSteal = true;
\t // layerStealIncrease :
\t // @Description
\t // Augmentation en % des chances de se faire prendre lorsque l'on vole un
\t // objet équipé.
\t private double layerStealIncrease = 50;
\t // -------------------------------------------------------------------------
\t\tpublic static void Initialize()
\t\t{
\t\t\tSkillInfo.Table[33].Callback = new SkillUseCallback( OnUse );
\t\t}

\t\tpublic static readonly bool ClassicMode = false;

\t\tpublic static readonly bool SuspendOnMurder = false;

\t\tpublic static bool IsInGuild( Mobile m )
\t\t{
\t\t\treturn ( m is PlayerMobile && ((PlayerMobile)m).NpcGuild == NpcGuild.ThievesGuild );
\t\t}

\t\tpublic static bool IsInnocentTo( Mobile from, Mobile to )
\t\t{
\t\t\treturn ( Notoriety.Compute( from, (Mobile)to ) == Notoriety.Innocent );
\t\t}

\t\tprivate class StealingTarget : Target
\t\t{
\t\t\tprivate Mobile m_Thief;

\t\t\tpublic StealingTarget( Mobile thief ) : base ( 1, false, TargetFlags.None )
\t\t\t{
\t\t\t\tm_Thief = thief;
\t\t\t\tAllowNonlocal = true;
\t\t\t}
\t\t\tprivate Item TryStealItem( Item toSteal, ref bool caught )
\t\t\t{
\t\t\t\tItem stolen = null;

\t\t\t\t// ---------------------------------------------------------------------
\t\t\t\t// Paramètres internes supplémentaires
\t\t\t\t// ---------------------------------------------------------------------
\t\t\t\t// caughtChance
\t\t\t\t// @Description
\t\t\t\t// Chance de base de se faire attrapper en %
\t\t\t\tdouble caughChance = 100;
\t\t\t\t// ---------------------------------------------------------------------

\t\t\t\tobject root = toSteal.RootParent;

\t\t\t\tif ( !IsEmptyHanded( m_Thief ) )
\t\t\t\t{
\t\t\t\t\tm_Thief.SendLocalizedMessage( 1005584 ); // Both hands must be free to steal.
\t\t\t\t}

\t\t\t\telse if ( SuspendOnMurder && root is Mobile && ((Mobile)root).Player && IsInGuild( m_Thief ) && m_Thief.Kills > 0 )
\t\t\t\t{
\t\t\t\t\tm_Thief.SendLocalizedMessage( 502706 ); // You are currently suspended from the thieves guild.
\t\t\t\t}

\t\t\t\telse if ( root is BaseVendor && ((BaseVendor)root).IsInvulnerable )
\t\t\t\t{
\t\t\t\t\tm_Thief.SendLocalizedMessage( 1005598 ); // You can't steal from shopkeepers.
\t\t\t\t}

\t\t\t\telse if ( root is PlayerVendor )
\t\t\t\t{
\t\t\t\t\tm_Thief.SendLocalizedMessage( 502709 ); // You can't steal from vendors.
\t\t\t\t}

\t\t\t\telse if ( !m_Thief.CanSee( toSteal ) )

\t\t\t\t{

\t\t\t\t\tm_Thief.SendLocalizedMessage( 500237 ); // Target can not be seen.

\t\t\t\t}

\t\t\t\telse if ( toSteal.Parent == null || !toSteal.Movable || toSteal.LootType == LootType.Newbied || toSteal.CheckBlessed( root ) )

\t\t\t\t{

\t\t\t\t\tm_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!

\t\t\t\t}

\t\t\t\telse if ( !m_Thief.InRange( toSteal.GetWorldLocation(), 1 ) )

\t\t\t\t{

\t\t\t\t\tm_Thief.SendLocalizedMessage( 502703 ); // You must be standing next to an item to steal it.

\t\t\t\t}

\t\t\t\telse if ( toSteal.Parent is Mobile )

\t\t\t\t{
\t\t\t\t// ---------------------------------------------------------------------
\t\t\t\t// Système de vol d'objet équipé
\t\t\t\t// ---------------------------------------------------------------------
\t\t\t\t// On vérifie si le système est actif
\t\t\t\t if ( layerSteal )
\t\t\t\t {
\t\t\t\t// On vérifie que c'est bien un joueur et non un PNJ
\t\t\t\t if ( toSteal.Parent is PlayerMobile )
\t\t\t\t {
\t\t\t\t// On vérifie que l'objet correspond aux critères :
\t\t\t\t// - Layer = Neck ou Helm ou Earrings ou Cloak ou Waist ou Ring ou Bracelet
\t\t\t\t// - Est un vêtement ou un bijoux
\t\t\t\t// Si validé, on augmente les chances de se faire prendre
\t\t\t\t if ( ( toSteal is BaseClothing || toSteal is BaseJewel ) &&
\t\t\t\t ( toSteal.Layer == Layer.Neck ||
\t\t\t\t toSteal.Layer == Layer.Helm ||
\t\t\t\t toSteal.Layer == Layer.Earrings ||
\t\t\t\t toSteal.Layer == Layer.Cloak ||
\t\t\t\t toSteal.Layer == Layer.Waist ||
\t\t\t\t toSteal.Layer == Layer.Ring ||
\t\t\t\t toSteal.Layer == Layer.Bracelet ) )
\t\t\t\t caughtChance += layerStealIncrease;
\t\t\t\t// Autrement, on notifie le voleur\t
\t\t\t\t else
\t\t\t\t m_Thief.SendMessage( "C'est trop dangereux de voler cet objet sur cette personne !" );\t\t\t
\t\t\t\t }
\t\t\t\t// Autrement, on notifie le voleur
\t\t\t\t else
\t\t\t\t m_Thief.SendMessage( "Cette personne a l'air bien trop vigilante !" );
\t\t\t\t }
\t\t\t\t// Autrement, on empêche le vol et on notifie le voleur
\t\t\t\t else

\t\t\t\t\t m_Thief.SendLocalizedMessage( 1005585 ); // You cannot steal items which are equiped.
\t\t\t\t// ---------------------------------------------------------------------

\t\t\t\t}

\t\t\t\telse if ( root == m_Thief )

\t\t\t\t{

\t\t\t\t\tm_Thief.SendLocalizedMessage( 502704 ); // You catch yourself red-handed.

\t\t\t\t}

\t\t\t\telse if ( root is Mobile && ((Mobile)root).AccessLevel > AccessLevel.Player )

\t\t\t\t{

\t\t\t\t\tm_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!

\t\t\t\t}

\t\t\t\telse if ( root is Mobile && !m_Thief.CanBeHarmful( (Mobile)root ) )

\t\t\t\t{

\t\t\t\t}

\t\t\t\telse

\t\t\t\t{

\t\t\t\t\tdouble w = toSteal.Weight + toSteal.TotalWeight;

\t\t\t\t\tif ( w > 10 )

\t\t\t\t\t{

\t\t\t\t\t\tm_Thief.SendMessage( "That is too heavy to steal." );

\t\t\t\t\t}

\t\t\t\t\telse

\t\t\t\t\t{

\t\t\t\t\t\tif ( toSteal.Stackable && toSteal.Amount > 1 )

\t\t\t\t\t\t{

\t\t\t\t\t\t\tint maxAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 10.0) / toSteal.Weight);

\t\t\t\t\t\t\tif ( maxAmount < 1 )

\t\t\t\t\t\t\t\tmaxAmount = 1;

\t\t\t\t\t\t\telse if ( maxAmount > toSteal.Amount )

\t\t\t\t\t\t\t\tmaxAmount = toSteal.Amount;

\t\t\t\t\t\t\tint amount = Utility.RandomMinMax( 1, maxAmount );

\t\t\t\t\t\t\tif ( amount >= toSteal.Amount )

\t\t\t\t\t\t\t{

\t\t\t\t\t\t\t\tint pileWeight = (int)Math.Ceiling( toSteal.Weight * toSteal.Amount );

\t\t\t\t\t\t\t\tpileWeight *= 10;

\t\t\t\t\t\t\t\tif ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5 ) )

\t\t\t\t\t\t\t\t\tstolen = toSteal;

\t\t\t\t\t\t\t}

\t\t\t\t\t\t\telse

\t\t\t\t\t\t\t{

\t\t\t\t\t\t\t\tint pileWeight = (int)Math.Ceiling( toSteal.Weight * amount );

\t\t\t\t\t\t\t\tpileWeight *= 10;

\t\t\t\t\t\t\t\tif ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5 ) )

\t\t\t\t\t\t\t\t{

\t\t\t\t\t\t\t\t\tstolen = toSteal.Dupe( amount );

\t\t\t\t\t\t\t\t\ttoSteal.Amount -= amount;

\t\t\t\t\t\t\t\t}

\t\t\t\t\t\t\t}

\t\t\t\t\t\t}

\t\t\t\t\t\telse

\t\t\t\t\t\t{

\t\t\t\t\t\t\tint iw = (int)Math.Ceiling( w );

\t\t\t\t\t\t\tiw *= 10;

\t\t\t\t\t\t\tif ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, iw - 22.5, iw + 27.5 ) )

\t\t\t\t\t\t\t\tstolen = toSteal;

\t\t\t\t\t\t}

\t\t\t\t\t\tif ( stolen != null )

\t\t\t\t\t\t\tm_Thief.SendLocalizedMessage( 502724 ); // You succesfully steal the item.

\t\t\t\t\t\telse

\t\t\t\t\t\t\tm_Thief.SendLocalizedMessage( 502723 ); // You fail to steal the item.

        // -----------------------------------------------------------------  
        // Correction des chances de se faire prendre  
        // -----------------------------------------------------------------  
        // Intervention de la dextérité  
        caughChance -= m_Thief&#46;RawDex/10;  
        // Intervention de la skill  
        caughChance -= m_Thief&#46;Skills&#91;SkillName&#46;Hiding&#93;&#46;Value*80/100;  
        // Bonus si on est caché  
        if &#40; m_Thief&#46;Hidden &#41;  
          caughChance -= 5  

\t\t\t\t\t\tcaught = ( caughChance > Utility.Random( 100 ) );
\t\t\t\t\t\t// -----------------------------------------------------------------

\t\t\t\t\t}

\t\t\t\t}

\t\t\t\treturn stolen;

\t\t\t}

\t\t\tprotected override void OnTarget( Mobile from, object target )

\t\t\t{

\t\t\t\tItem stolen = null;

\t\t\t\tobject root = null;

\t\t\t\tbool caught = false;

\t\t\t\tif ( target is Item )

\t\t\t\t{

\t\t\t\t\troot = ((Item)target).RootParent;

\t\t\t\t\tstolen = TryStealItem( (Item)target, ref caught );

\t\t\t\t}

\t\t\t\telse if ( target is Mobile )

\t\t\t\t{

\t\t\t\t\tContainer pack = ((Mobile)target).Backpack;

\t\t\t\t\tif ( pack != null && pack.Items.Count > 0 )

\t\t\t\t\t{

\t\t\t\t\t\tint randomIndex = Utility.Random( pack.Items.Count );

\t\t\t\t\t\troot = target;

\t\t\t\t\t\tstolen = TryStealItem( (Item) pack.Items[randomIndex], ref caught );

\t\t\t\t\t}

\t\t\t\t}

\t\t\t\telse

\t\t\t\t{

\t\t\t\t\tm_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!

\t\t\t\t}

\t\t\t\tif ( stolen != null )

\t\t\t\t\tfrom.AddToBackpack( stolen );
\t\t\t\t
\t\t\t\t// ---------------------------------------------------------------------
\t\t\t\t// Gestion du vol caché
\t\t\t\t// ---------------------------------------------------------------------
\t\t\t\t// On vérifie :
\t\t\t\t// - que le système est actif
\t\t\t\t// - que le voleur ne s'est pas fait attrappé
\t\t\t\t// - qu'il a le niveau requis en Hiding et Stealth
\t\t\t\t// Sinon, on révèle le voleur
\t\t\t\tif ( !stayHidden || caught ||
\t\t\t\t m_Thief.Skills[SkillName.Hiding].Value < stayHiddenSkill ||
\t\t\t\t m_Thief.Skills[SkillName.Stealth].Value < stayHiddenSkill )
\t\t\t\t from.RevealingAction();
\t\t\t\t// Autrement on calcule ses chances de passer inaperçu
\t\t\t\telse
\t\t\t\t{
\t\t\t\t// On calcule ses chances de rester cacher en fonction de :
\t\t\t\t// - Son niveau en Hiding
\t\t\t\t// - Son niveau en Stealth
\t\t\t\t// - stayHiddenMinChance
\t\t\t\t// - stayHiddenMaxChance
\t\t\t\t// - stayHiddenSkill
\t\t\t\t double hSkill = ((m_Thief.Skills[SkillName.Hiding].Value
\t\t\t\t +m_Thief.Skills[SkillName.Hiding].Value)/2
\t\t\t\t -stayHiddenSkill)/(100-stayHiddenSkill)
\t\t\t\t *(stayHiddenMaxChance-stayHiddenMinChance)
\t\t\t\t +stayHiddenMinChance;
\t\t\t\t// Si ses chances sont inférieur à un chiffre au hasard entre 0 et 100
\t\t\t\t// Alors il est révélé, autrement on ne fait rien
\t\t\t\t if ( hSkill < Utility.Random( 100 ) )
\t\t\t\t from.RevealingAction();
\t\t\t\t}
\t\t\t\t// ---------------------------------------------------------------------

\t\t\t\tif ( caught )

\t\t\t\t{

\t\t\t\t\tif ( root == null )

\t\t\t\t\t{

\t\t\t\t\t\tm_Thief.CriminalAction( false );

\t\t\t\t\t}

\t\t\t\t\telse if ( root is Corpse && ((Corpse)root).IsCriminalAction( m_Thief ) )

\t\t\t\t\t{

\t\t\t\t\t\tm_Thief.CriminalAction( false );

\t\t\t\t\t}

\t\t\t\t\telse if ( root is Mobile )

\t\t\t\t\t{

\t\t\t\t\t\tMobile mobRoot = (Mobile)root;

\t\t\t\t\t\tif ( !IsInGuild( mobRoot ) && IsInnocentTo( m_Thief, mobRoot ) )

\t\t\t\t\t\t\tm_Thief.CriminalAction( false );

        // -----------------------------------------------------------------  
        // Correction du message aux témoins  
        // -----------------------------------------------------------------  
        // Traduction du message en français

\t\t\t\t\t\tstring message = String.Format( "Vous remarquez {0} en train d'essayer de voler {1}.", m_Thief.Name, mobRoot.Name );

\t\t\t\t\t\tforeach ( NetState ns in m_Thief.GetClientsInRange( 8 ) )

\t\t\t\t\t\t{
\t\t\t\t\t\t// On vérifie en plus que le témoin voit vraiment le voleur

\t\t\t\t\t\t\tif ( ns != m_Thief.NetState && ns.Mobile.CanSee( m_Thief ) )

\t\t\t\t\t\t\t\tns.Mobile.SendMessage( message );

\t\t\t\t\t\t}
\t\t\t\t\t\t// -----------------------------------------------------------------

\t\t\t\t\t}

\t\t\t\t}

\t\t\t\telse if ( root is Corpse && ((Corpse)root).IsCriminalAction( m_Thief ) )

\t\t\t\t{

\t\t\t\t\tm_Thief.CriminalAction( false );

\t\t\t\t}

\t\t\t\tif ( root is Mobile && ((Mobile)root).Player && m_Thief is PlayerMobile && IsInnocentTo( m_Thief, (Mobile)root ) && !IsInGuild( (Mobile)root ) )

\t\t\t\t{

\t\t\t\t\tPlayerMobile pm = (PlayerMobile)m_Thief;

\t\t\t\t\tpm.PermaFlags.Add( (Mobile)root );

\t\t\t\t\tpm.Delta( MobileDelta.Noto );

\t\t\t\t}

\t\t\t}

\t\t}

\t\tpublic static bool IsEmptyHanded( Mobile from )

\t\t{

\t\t\tif ( from.FindItemOnLayer( Layer.OneHanded ) != null )

\t\t\t\treturn false;

\t\t\tif ( from.FindItemOnLayer( Layer.TwoHanded ) != null )

\t\t\t\treturn false;

\t\t\treturn true;

\t\t}

\t\tpublic static TimeSpan OnUse( Mobile m )

\t\t{

\t\t\tif ( !IsEmptyHanded( m ) )

\t\t\t{

\t\t\t\tm.SendLocalizedMessage( 1005584 ); // Both hands must be free to steal.

\t\t\t}

\t\t\telse

\t\t\t{

\t\t\t\tm.Target = new Stealing.StealingTarget( m );

\t\t\t\tm.RevealingAction();

\t\t\t\tm.SendLocalizedMessage( 502698 ); // Which item do you want to steal?

\t\t\t}

\t\t\treturn TimeSpan.FromSeconds( 10.0 );

\t\t}

\t}

}


Post by Wilhelm VonBrochert, CP - June 8, 2008 at 12:21 AM

Il est evident que le stealing doit être revu.
Ce que tu as fait me parrait bien.


Post by Yriel Asuryan - June 8, 2008 at 12:52 AM

GNIAH

Ho oui ho oui.
Il était temps.


Post by Lidenbrock, AdC - June 8, 2008 at 12:57 AM

À quand le loot sur les joueurs à nouveau possible ?
Ben quoi, on peut toujours revé

Sinon, c'est une bonne idée je crois et je me demande quand on va voir ca


Post by Giancarlo, AdC - June 8, 2008 at 1:10 AM

Il faudrait aussi revoir le loot dans les maisons, ya certaine maison tu as juste à regarder s'il n'y a pas de Gm et tu peux volé tous ce qui t'intéresse et repartir, ni vue ni connue.


Post by Yriel Asuryan - June 8, 2008 at 1:17 AM

"Zarthax, Emp" wrote: Il faudrait aussi revoir le loot dans les maisons, ya certaine maison tu as juste à regarder s'il n'y a pas de Gm et tu peux volé tous ce qui t'intéresse et repartir, ni vue ni connue.

Ben c'est une grosse avert si tu te fais choper ça...


Post by Giancarlo, AdC - June 8, 2008 at 1:21 AM

Pourtant, ya un petit mec se matin qui a volé des pièces d'armures de spined que je venais juste d'acheter, il y a à peine quelques heures.


Post by Phydias Shaytan, CP - June 9, 2008 at 3:19 AM

Le staff a-t-il déjà débattu d'un avis sur la question ?

Des retouches à faire ?


Post by Yriel Asuryan - June 9, 2008 at 3:28 AM

Tu t'étais pas déja fait ouned sur le forum parce que tu étais pas scripteur faisant partie du staff ? Ou alors c'était un autre ?
Rien de méchant dans ce que je dis, je serais très heureux que ton système soit accepté et j'attends cette modification depuis longtemps.
Pour ce qui est de la régularité j'en touche pas une en script mais la réponse du staff risque d'être la même que pour le dernier scripteur sauvage de bonne foi qui à proposé un script.


Post by Fëanáro, Ind - June 9, 2008 at 3:33 AM

C'étais moi et sincèrement il est meilleur que moi^^


Post by Anonymous - June 9, 2008 at 4:51 AM

Vos suggestions sont toujours lues et écoutés. Ne vous inquiétez pas.


Post by Dante - June 9, 2008 at 1:08 PM

Vole carrément un torse ou une chemise que je porte

éventuellement modifier également un chouillat la formule ? Un voleur ne vole pas un garde aussi facilement qu'un autre voleur ?


Post by Phydias Shaytan, CP - June 9, 2008 at 3:54 PM

Pour cibler la bague, il faudra cliquer dessus. C'est déjà chaud de le faire quand elle est portée, mais si en plus y'a un gants (donc on ne la voit), ça me semble impossible. De toute façon, je pense que dans ce cas, c'est plus un intervention GM vis-à-vis du RP dont nous aurons besoin.

Pour les torses : ils ne font pas parti des layers autorisés pour le vol.

Les PNJ ne seront pas volable (justement pour éviter les abus).

En gros, pour le vol sur layer, j'ai mis que les objets pouvant s'arracher à la tire et avec un contact très rapproché (les bijoux).


Post by Phydias Shaytan, CP - June 11, 2008 at 4:04 AM

Quelques corrections :
Celles coté script trouvées avec Kel.
Une erreur de conception : j'ai mal géré le vol sur layer, il ne fait qu'afficher des messages Donc j'ai corrigé :x

J'en ai profité pour tout remettre à un format élégant.

using System;
using Server;
using Server.Mobiles;
using Server.Targeting;
using Server.Items;
using Server.Network;

namespace Server.SkillHandlers
{
public class Stealing
{
// ---------------------------------------------------------------------------
// Paramètres - Système de vol caché
// -------------------------------------------------------------------------
// stayHidden :
// @Description
// Activation du système
// @Valeur
// - true = actif
// - false = inactif
private static bool stayHidden = true;
// stayHiddenMaxChance :
// @Description
// Chance maximum de rester cacher (Hiding & Stealth à 100%)
private static double stayHiddenMaxChance = 90.0;
// stayHiddenMinChance :
// @Description
// Chance minimum de rester cacher (Hiding & Stealth à StayHiddenSkill)
private static double stayHiddenMinChance = 20.0;
// stayHiddenSkill :
// @Description
// Compétence minimum requise pour rester caché lors d'un vol
private static double stayHiddenSkill = 50.0;
// -------------------------------------------------------------------------
// Paramètres - Vol d'objet équipé
// -------------------------------------------------------------------------
// layerSteal :
// @Description
// Activation du vol d'objet équipé
// @Valeur
// - true = actif
// - false = inactif
private static bool layerSteal = true;
// layerStealIncrease :
// @Description
// Augmentation en % des chances de se faire prendre lorsque l'on vole un
// objet équipé.
private static double layerStealIncrease = 50;
// -------------------------------------------------------------------------

public static void Initialize&#40;&#41;  
&#123;  
  SkillInfo&#46;Table&#91;33&#93;&#46;Callback = new SkillUseCallback&#40;OnUse&#41;;  
&#125;

public static readonly bool ClassicMode = false;

public static readonly bool SuspendOnMurder = false;

public static bool IsInGuild&#40;Mobile m&#41;  
&#123;  
  return &#40;m is PlayerMobile && &#40;&#40;PlayerMobile&#41;m&#41;&#46;NpcGuild == NpcGuild&#46;ThievesGuild&#41;;  
&#125;

public static bool IsInnocentTo&#40;Mobile from, Mobile to&#41;  
&#123;  
  return &#40;Notoriety&#46;Compute&#40;from, &#40;Mobile&#41;to&#41; == Notoriety&#46;Innocent&#41;;  
&#125;

private class StealingTarget &#58; Target  
&#123;  
  private Mobile m_Thief;

  public StealingTarget&#40;Mobile thief&#41; &#58; base&#40;1, false, TargetFlags&#46;None&#41;  
  &#123;  
    m_Thief = thief;  
    AllowNonlocal = true;  
  &#125;  
    
  private Item TryStealItem&#40;Item toSteal, ref bool caught&#41;  
  &#123;  
    Item stolen = null;  
    // ---------------------------------------------------------------------  
    // Paramètres internes supplémentaires  
    // ---------------------------------------------------------------------  
    // caughtChance  
    // @Description  
    //   Chance de base de se faire attrapper en %  
    double caughtChance = 100;  
    // ---------------------------------------------------------------------  
    object root = toSteal&#46;RootParent;

    if &#40; !IsEmptyHanded&#40; m_Thief &#41; &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 1005584 &#41;; // Both hands must be free to steal&#46;  
    &#125;  
    else if &#40; SuspendOnMurder && root is Mobile && &#40;&#40;Mobile&#41;root&#41;&#46;Player && IsInGuild&#40; m_Thief &#41; && m_Thief&#46;Kills > 0 &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 502706 &#41;; // You are currently suspended from the thieves guild&#46;  
    &#125;  
    else if &#40; root is BaseVendor && &#40;&#40;BaseVendor&#41;root&#41;&#46;IsInvulnerable &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 1005598 &#41;; // You can't steal from shopkeepers&#46;  
    &#125;  
    else if &#40; root is PlayerVendor &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 502709 &#41;; // You can't steal from vendors&#46;  
    &#125;  
    else if &#40; !m_Thief&#46;CanSee&#40; toSteal &#41; &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 500237 &#41;; // Target can not be seen&#46;  
    &#125;  
    else if &#40; toSteal&#46;Parent == null || !toSteal&#46;Movable || toSteal&#46;LootType == LootType&#46;Newbied || toSteal&#46;CheckBlessed&#40; root &#41; &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 502710 &#41;; // You can't steal that!  
    &#125;  
    else if &#40; !m_Thief&#46;InRange&#40; toSteal&#46;GetWorldLocation&#40;&#41;, 1 &#41; &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 502703 &#41;; // You must be standing next to an item to steal it&#46;  
    &#125;    
    // ---------------------------------------------------------------------  
    // Système de vol d'objet équipé  
    // ---------------------------------------------------------------------  
    // Système inactif  
    else if &#40; toSteal&#46;Parent is Mobile && !layerSteal &#41;  
    &#123;  
      m_Thief&#46;SendMessage&#40; "Vous ne pouvez aps voler les objets qui sont équipés" &#41;;  
    &#125;  
    // La cible est un PNJ  
    else if &#40; toSteal&#46;Parent is Mobile &&   
              !&#40;toSteal&#46;Parent is PlayerMobile&#41; &#41;  
    &#123;  
      m_Thief&#46;SendMessage&#40; "Cette personne a l'air bien trop vigilante&#46;" &#41;;  
    &#125;  
    // L'objet à voler ne répond pas aux critères &#58;  
    // - Être un bijoux ou un vêtement  
    // - Être porté sur un des layers suivants &#58; Neck, Helm, Earrings,  
    //   Cloak, Waist, Ring, Bracelet  
    else if &#40; toSteal&#46;Parent is PlayerMobile && &#40;   
              !&#40;toSteal is BaseClothing&#41; ||   
              !&#40;toSteal is BaseJewel &#41; ||   
              toSteal&#46;Layer != Layer&#46;Neck ||  
              toSteal&#46;Layer != Layer&#46;Helm ||  
              toSteal&#46;Layer != Layer&#46;Earrings ||  
              toSteal&#46;Layer != Layer&#46;Cloak ||  
              toSteal&#46;Layer != Layer&#46;Waist ||  
              toSteal&#46;Layer != Layer&#46;Ring ||  
              toSteal&#46;Layer != Layer&#46;Bracelet &#41; &#41;  
    &#123;  
      m_Thief&#46;SendMessage&#40; "C'est trop dangereux de voler cet objet sur cette personne !" &#41;;  
    &#125;  
    // ---------------------------------------------------------------------  
    else if &#40; root == m_Thief &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 502704 &#41;; // You catch yourself red-handed&#46;  
    &#125;  
    else if &#40; root is Mobile && &#40;&#40;Mobile&#41;root&#41;&#46;AccessLevel > AccessLevel&#46;Player &#41;  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40; 502710 &#41;; // You can't steal that!  
    &#125;  
    else if &#40; root is Mobile && !m_Thief&#46;CanBeHarmful&#40; &#40;Mobile&#41;root &#41; &#41;  
    &#123;  
    &#125;  
    else  
    &#123;  
      // -------------------------------------------------------------------  
      // Système de vol d'objet  
      // -------------------------------------------------------------------  
      // Prise de risque du vol d'un objet équipé  
      if &#40; toSteal&#46;Parent is PlayerMobile &#41;  
        caughtChance += layerStealIncrease;  
      // -----------------------------------------------------------------                  
      double w = toSteal&#46;Weight + toSteal&#46;TotalWeight;

      if &#40; w > 10 &#41;  
      &#123;  
        m_Thief&#46;SendMessage&#40; "That is too heavy to steal&#46;" &#41;;  
      &#125;  
      else  
      &#123;  
        if &#40; toSteal&#46;Stackable && toSteal&#46;Amount > 1 &#41;  
        &#123;  
          int maxAmount = &#40;int&#41;&#40;&#40;m_Thief&#46;Skills&#91;SkillName&#46;Stealing&#93;&#46;Value / 10&#46;0&#41; / toSteal&#46;Weight&#41;;  
            
          if &#40; maxAmount < 1 &#41;  
            maxAmount = 1;  
          else if &#40; maxAmount > toSteal&#46;Amount &#41;  
            maxAmount = toSteal&#46;Amount;  
            
          int amount = Utility&#46;RandomMinMax&#40; 1, maxAmount &#41;;

          if &#40; amount >= toSteal&#46;Amount &#41;  
          &#123;  
            int pileWeight = &#40;int&#41;Math&#46;Ceiling&#40; toSteal&#46;Weight * toSteal&#46;Amount &#41;;  
            pileWeight *= 10;

            if &#40; m_Thief&#46;CheckTargetSkill&#40; SkillName&#46;Stealing, toSteal, pileWeight - 22&#46;5, pileWeight + 27&#46;5 &#41; &#41;  
              stolen = toSteal;  
          &#125;  
          else  
          &#123;  
            int pileWeight = &#40;int&#41;Math&#46;Ceiling&#40; toSteal&#46;Weight * amount &#41;;  
            pileWeight *= 10;

            if &#40; m_Thief&#46;CheckTargetSkill&#40; SkillName&#46;Stealing, toSteal, pileWeight - 22&#46;5, pileWeight + 27&#46;5 &#41; &#41;  
            &#123;  
              stolen = toSteal&#46;Dupe&#40; amount &#41;;  
              toSteal&#46;Amount -= amount;  
            &#125;  
          &#125;  
        &#125;  
        else  
        &#123;  
          int iw = &#40;int&#41;Math&#46;Ceiling&#40; w &#41;;  
          iw *= 10;

          if &#40; m_Thief&#46;CheckTargetSkill&#40; SkillName&#46;Stealing, toSteal, iw - 22&#46;5, iw + 27&#46;5 &#41; &#41;  
            stolen = toSteal;  
        &#125;

        if &#40; stolen != null &#41;  
          m_Thief&#46;SendLocalizedMessage&#40; 502724 &#41;; // You succesfully steal the item&#46;  
        else  
          m_Thief&#46;SendLocalizedMessage&#40; 502723 &#41;; // You fail to steal the item&#46;  
        // -----------------------------------------------------------------  
        // Correction des chances de se faire prendre  
        // -----------------------------------------------------------------  
        // Intervention de la dextérité  
        caughChance -= m_Thief&#46;RawDex/10;  
        // Intervention de la skill  
        caughChance -= m_Thief&#46;Skills&#91;SkillName&#46;Hiding&#93;&#46;Value*80/100;  
        // Bonus si on est caché  
        if &#40;m_Thief&#46;Hidden&#41;  
            caughChance -= 5;  
        caught = &#40; caughChance > Utility&#46;Random&#40; 100 &#41; &#41;;  
        // -----------------------------------------------------------------  
      &#125;  
    &#125;  
    return stolen;  
  &#125;

  protected override void OnTarget&#40;Mobile from, object target&#41;  
  &#123;  
    Item stolen = null;  
    object root = null;  
    bool caught = false;

    if &#40;target is Item&#41;  
    &#123;  
      root = &#40;&#40;Item&#41;target&#41;&#46;RootParent;  
      stolen = TryStealItem&#40;&#40;Item&#41;target, ref caught&#41;;  
    &#125;  
    else if &#40;target is Mobile&#41;  
    &#123;  
      Container pack = &#40;&#40;Mobile&#41;target&#41;&#46;Backpack;

      if &#40;pack != null && pack&#46;Items&#46;Count > 0&#41;  
      &#123;  
        int randomIndex = Utility&#46;Random&#40;pack&#46;Items&#46;Count&#41;;  
        root = target;  
        stolen = TryStealItem&#40;&#40;Item&#41;pack&#46;Items&#91;randomIndex&#93;, ref caught&#41;;  
      &#125;  
    &#125;  
    else  
    &#123;  
      m_Thief&#46;SendLocalizedMessage&#40;502710&#41;; // You can't steal that!  
    &#125;

    if &#40;stolen != null&#41;  
      from&#46;AddToBackpack&#40;stolen&#41;;  
    // ---------------------------------------------------------------------  
    // Gestion du vol caché  
    // ---------------------------------------------------------------------  
    // On vérifie &#58;  
    // - que le système est actif  
    // - que le voleur ne s'est pas fait attrappé  
    // - qu'il a le niveau requis en Hiding et Stealth  
    // Sinon, on révèle le voleur  
    if &#40;!stayHidden || caught ||  
      m_Thief&#46;Skills&#91;SkillName&#46;Hiding&#93;&#46;Value < stayHiddenSkill ||  
      m_Thief&#46;Skills&#91;SkillName&#46;Stealth&#93;&#46;Value < stayHiddenSkill&#41;  
    from&#46;RevealingAction&#40;&#41;;  
    // Autrement on calcule ses chances de passer inaperçu  
    else  
    &#123;  
    // On calcule ses chances de rester cacher en fonction de &#58;  
    // - Son niveau en Hiding  
    // - Son niveau en Stealth  
    // - stayHiddenMinChance  
    // - stayHiddenMaxChance  
    // - stayHiddenSkill  
      double hSkill = &#40;&#40;m_Thief&#46;Skills&#91;SkillName&#46;Hiding&#93;&#46;Value  
                      + m_Thief&#46;Skills&#91;SkillName&#46;Hiding&#93;&#46;Value&#41; / 2  
                      - stayHiddenSkill&#41; / &#40;100 - stayHiddenSkill&#41;  
                      * &#40;stayHiddenMaxChance - stayHiddenMinChance&#41;  
                      + stayHiddenMinChance;  
    // Si ses chances sont inférieur à un chiffre au hasard entre 0 et 100  
    // Alors il est révélé, autrement on ne fait rien  
      if &#40;hSkill < Utility&#46;Random&#40;100&#41;&#41;  
        from&#46;RevealingAction&#40;&#41;;  
    &#125;  
    // ---------------------------------------------------------------------  
    if &#40;caught&#41;  
    &#123;  
      if &#40;root == null&#41;  
      &#123;  
        m_Thief&#46;CriminalAction&#40;false&#41;;  
      &#125;  
      else if &#40;root is Corpse && &#40;&#40;Corpse&#41;root&#41;&#46;IsCriminalAction&#40;m_Thief&#41;&#41;  
      &#123;  
        m_Thief&#46;CriminalAction&#40;false&#41;;  
      &#125;  
      else if &#40;root is Mobile&#41;  
      &#123;  
        Mobile mobRoot = &#40;Mobile&#41;root;

        if &#40;!IsInGuild&#40;mobRoot&#41; && IsInnocentTo&#40;m_Thief, mobRoot&#41;&#41;  
          m_Thief&#46;CriminalAction&#40;false&#41;;  
    // ---------------------------------------------------------------------  
    // Correction du message aux témoins  
    // -----------------------------------------------------------------  
    // Vérification que le témoin voit le voleur  
        string message = String&#46;Format&#40;"Vous remarquez &#123;0&#125; en train d'essayer de voler &#123;1&#125;&#46;", m_Thief&#46;Name, mobRoot&#46;Name&#41;;  
        foreach &#40;NetState ns in m_Thief&#46;GetClientsInRange&#40;8&#41;&#41;  
        &#123;  
        if &#40;ns != m_Thief&#46;NetState && ns&#46;Mobile&#46;CanSee&#40;m_Thief&#41;&#41;  
          ns&#46;Mobile&#46;SendMessage&#40;message&#41;;  
        &#125;  
      &#125;  
    &#125;  
    // -----------------------------------------------------------------  
    else if &#40;root is Corpse && &#40;&#40;Corpse&#41;root&#41;&#46;IsCriminalAction&#40;m_Thief&#41;&#41;  
    &#123;  
      m_Thief&#46;CriminalAction&#40;false&#41;;  
    &#125;  
      
    if &#40;root is Mobile && &#40;&#40;Mobile&#41;root&#41;&#46;Player && m_Thief is PlayerMobile && IsInnocentTo&#40;m_Thief, &#40;Mobile&#41;root&#41; && !IsInGuild&#40;&#40;Mobile&#41;root&#41;&#41;  
    &#123;  
      PlayerMobile pm = &#40;PlayerMobile&#41;m_Thief;  
      pm&#46;PermaFlags&#46;Add&#40;&#40;Mobile&#41;root&#41;;  
      pm&#46;Delta&#40;MobileDelta&#46;Noto&#41;;  
    &#125;  
  &#125;  
&#125;

public static bool IsEmptyHanded&#40;Mobile from&#41;  
&#123;  
  if &#40;from&#46;FindItemOnLayer&#40;Layer&#46;OneHanded&#41; != null&#41;  
    return false;  
  if &#40;from&#46;FindItemOnLayer&#40;Layer&#46;TwoHanded&#41; != null&#41;  
    return false;      return true;  
&#125;

public static TimeSpan OnUse&#40;Mobile m&#41;  
&#123;  
  if &#40;!IsEmptyHanded&#40;m&#41;&#41;  
    m&#46;SendLocalizedMessage&#40;1005584&#41;; // Both hands must be free to steal&#46;  
  else  
  &#123;  
    m&#46;Target = new Stealing&#46;StealingTarget&#40;m&#41;;  
    m&#46;SendLocalizedMessage&#40;502698&#41;; // Which item do you want to steal?  
  &#125;  
  return TimeSpan&#46;FromSeconds&#40;10&#46;0&#41;;  
&#125;  

}
}


Post by Gannd Auréalis , OdS - June 11, 2008 at 6:56 AM

J'espère que celui qui se fait voler aura au moin la chance de ''détecter', que ont le vol....J'ai 100% dans tout les skills de combat et je ne touche pas a tout les coups.....Sa devrai être semblable pour le vol non?


Post by Wilhelm VonBrochert, CP - June 11, 2008 at 9:52 AM

Non, parce que dans un skill de combat, quand tu foire, tu tappe 3secondes apres.
Dans le vol, quand tu foire, t'es mort.


Post by Chien Méchant - June 11, 2008 at 12:34 PM

non quand tu rates , tu cours !


Post by Phydias Shaytan, CP - June 11, 2008 at 4:13 PM

Il faut 100% en stealing, 150 de dext et être caché pour avoir 100% de chance de ne pas se faire prendre (mass msg aux gens présents).

Derrière il y a encore les chances d'être déhide qu'il est impossible d'avoir à 100%

Je ne parle même pas du vol sur layer ou le maximum de chance de ne pas se faire repérer est 50% et à bas niveau à plus de 100%.

Voler est et reste dangereux. C'est juste plus "fair" que les 33% de chance de se faire repérer au maximum qui sont descendue aux alentour de 10%.