Modification : Vol
Post by Phydias Shaytan, CP - June 8, 2008 at 12:13 AM
Quelques petites suggestions et corrections pour le vol.
Corrections :
- Messages aux témoins : vérifie que les témoins voient le voleur.
- Calcul des chances de se faire prendre :
- Intervention de la dextérité (-Dex/10 %)
- Intervention de la skil (-Skill*80/100 %)
- Bonus si caché (-5%)
Il faut grosso modo 150 de dext, être caché et avoir 100% en Hiding, Stealth et Stealing pour avoir 100% sans se faire prendre. Ca ne garanti pas la réussite du vol. Celle-ci restte inchangée et conditionnée par le poids de l'objet à voler (typiquement, on ne peut aps voler les armures car trop lourdes).
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 ^^
- Vol caché : Sur base d'une moyenne de Stealth et Hiding et sous conditions le voleur reste caché après son méfait !
- Il ne doit pas se faire prendre
- Avoir plus que stayHiddenSkill (50%) en Hiding et Stealth
Les paramètres stayHiddenMinChance (20%) et satyHiddenMaxChance (90%) permettent respectivement de fixer les chances minimales et maximales de rester cacher.
- Vol d'objet équipé : La personne sur laquelle on veut voler l'objet doit être un joueur. L'objet doit répondre à certains critères :
- être un bijou ou un vêtement
- être sur un des layers suivant : Helm, Neck, Ring, Earrings, Cloack, Bracelet ou Waist
Commettre ce genre de vol augmente de layerStealIncrease (50%) les chances de se faire prendre ! Les chances de réussite ne sont pas influencées
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.RawDex/10;
// Intervention de la skill
caughChance -= m_Thief.Skills[SkillName.Hiding].Value*80/100;
// Bonus si on est caché
if ( m_Thief.Hidden )
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 une bague alors que je porte des gants par dessus *
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()
{
SkillInfo.Table[33].Callback = new SkillUseCallback(OnUse);
}
public static readonly bool ClassicMode = false;
public static readonly bool SuspendOnMurder = false;
public static bool IsInGuild(Mobile m)
{
return (m is PlayerMobile && ((PlayerMobile)m).NpcGuild == NpcGuild.ThievesGuild);
}
public static bool IsInnocentTo(Mobile from, Mobile to)
{
return (Notoriety.Compute(from, (Mobile)to) == Notoriety.Innocent);
}
private class StealingTarget : Target
{
private Mobile m_Thief;
public StealingTarget(Mobile thief) : base(1, false, TargetFlags.None)
{
m_Thief = thief;
AllowNonlocal = true;
}
private Item TryStealItem(Item toSteal, ref bool caught)
{
Item stolen = null;
// ---------------------------------------------------------------------
// Paramètres internes supplémentaires
// ---------------------------------------------------------------------
// caughtChance
// @Description
// Chance de base de se faire attrapper en %
double caughtChance = 100;
// ---------------------------------------------------------------------
object root = toSteal.RootParent;
if ( !IsEmptyHanded( m_Thief ) )
{
m_Thief.SendLocalizedMessage( 1005584 ); // Both hands must be free to steal.
}
else if ( SuspendOnMurder && root is Mobile && ((Mobile)root).Player && IsInGuild( m_Thief ) && m_Thief.Kills > 0 )
{
m_Thief.SendLocalizedMessage( 502706 ); // You are currently suspended from the thieves guild.
}
else if ( root is BaseVendor && ((BaseVendor)root).IsInvulnerable )
{
m_Thief.SendLocalizedMessage( 1005598 ); // You can't steal from shopkeepers.
}
else if ( root is PlayerVendor )
{
m_Thief.SendLocalizedMessage( 502709 ); // You can't steal from vendors.
}
else if ( !m_Thief.CanSee( toSteal ) )
{
m_Thief.SendLocalizedMessage( 500237 ); // Target can not be seen.
}
else if ( toSteal.Parent == null || !toSteal.Movable || toSteal.LootType == LootType.Newbied || toSteal.CheckBlessed( root ) )
{
m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
}
else if ( !m_Thief.InRange( toSteal.GetWorldLocation(), 1 ) )
{
m_Thief.SendLocalizedMessage( 502703 ); // You must be standing next to an item to steal it.
}
// ---------------------------------------------------------------------
// Système de vol d'objet équipé
// ---------------------------------------------------------------------
// Système inactif
else if ( toSteal.Parent is Mobile && !layerSteal )
{
m_Thief.SendMessage( "Vous ne pouvez aps voler les objets qui sont équipés" );
}
// La cible est un PNJ
else if ( toSteal.Parent is Mobile &&
!(toSteal.Parent is PlayerMobile) )
{
m_Thief.SendMessage( "Cette personne a l'air bien trop vigilante." );
}
// L'objet à voler ne répond pas aux critères :
// - Être un bijoux ou un vêtement
// - Être porté sur un des layers suivants : Neck, Helm, Earrings,
// Cloak, Waist, Ring, Bracelet
else if ( toSteal.Parent is PlayerMobile && (
!(toSteal is BaseClothing) ||
!(toSteal is BaseJewel ) ||
toSteal.Layer != Layer.Neck ||
toSteal.Layer != Layer.Helm ||
toSteal.Layer != Layer.Earrings ||
toSteal.Layer != Layer.Cloak ||
toSteal.Layer != Layer.Waist ||
toSteal.Layer != Layer.Ring ||
toSteal.Layer != Layer.Bracelet ) )
{
m_Thief.SendMessage( "C'est trop dangereux de voler cet objet sur cette personne !" );
}
// ---------------------------------------------------------------------
else if ( root == m_Thief )
{
m_Thief.SendLocalizedMessage( 502704 ); // You catch yourself red-handed.
}
else if ( root is Mobile && ((Mobile)root).AccessLevel > AccessLevel.Player )
{
m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
}
else if ( root is Mobile && !m_Thief.CanBeHarmful( (Mobile)root ) )
{
}
else
{
// -------------------------------------------------------------------
// Système de vol d'objet
// -------------------------------------------------------------------
// Prise de risque du vol d'un objet équipé
if ( toSteal.Parent is PlayerMobile )
caughtChance += layerStealIncrease;
// -----------------------------------------------------------------
double w = toSteal.Weight + toSteal.TotalWeight;
if ( w > 10 )
{
m_Thief.SendMessage( "That is too heavy to steal." );
}
else
{
if ( toSteal.Stackable && toSteal.Amount > 1 )
{
int maxAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 10.0) / toSteal.Weight);
if ( maxAmount < 1 )
maxAmount = 1;
else if ( maxAmount > toSteal.Amount )
maxAmount = toSteal.Amount;
int amount = Utility.RandomMinMax( 1, maxAmount );
if ( amount >= toSteal.Amount )
{
int pileWeight = (int)Math.Ceiling( toSteal.Weight * toSteal.Amount );
pileWeight *= 10;
if ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5 ) )
stolen = toSteal;
}
else
{
int pileWeight = (int)Math.Ceiling( toSteal.Weight * amount );
pileWeight *= 10;
if ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5 ) )
{
stolen = toSteal.Dupe( amount );
toSteal.Amount -= amount;
}
}
}
else
{
int iw = (int)Math.Ceiling( w );
iw *= 10;
if ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, iw - 22.5, iw + 27.5 ) )
stolen = toSteal;
}
if ( stolen != null )
m_Thief.SendLocalizedMessage( 502724 ); // You succesfully steal the item.
else
m_Thief.SendLocalizedMessage( 502723 ); // You fail to steal the item.
// -----------------------------------------------------------------
// Correction des chances de se faire prendre
// -----------------------------------------------------------------
// Intervention de la dextérité
caughChance -= m_Thief.RawDex/10;
// Intervention de la skill
caughChance -= m_Thief.Skills[SkillName.Hiding].Value*80/100;
// Bonus si on est caché
if (m_Thief.Hidden)
caughChance -= 5;
caught = ( caughChance > Utility.Random( 100 ) );
// -----------------------------------------------------------------
}
}
return stolen;
}
protected override void OnTarget(Mobile from, object target)
{
Item stolen = null;
object root = null;
bool caught = false;
if (target is Item)
{
root = ((Item)target).RootParent;
stolen = TryStealItem((Item)target, ref caught);
}
else if (target is Mobile)
{
Container pack = ((Mobile)target).Backpack;
if (pack != null && pack.Items.Count > 0)
{
int randomIndex = Utility.Random(pack.Items.Count);
root = target;
stolen = TryStealItem((Item)pack.Items[randomIndex], ref caught);
}
}
else
{
m_Thief.SendLocalizedMessage(502710); // You can't steal that!
}
if (stolen != null)
from.AddToBackpack(stolen);
// ---------------------------------------------------------------------
// Gestion du vol caché
// ---------------------------------------------------------------------
// On vérifie :
// - 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 (!stayHidden || caught ||
m_Thief.Skills[SkillName.Hiding].Value < stayHiddenSkill ||
m_Thief.Skills[SkillName.Stealth].Value < stayHiddenSkill)
from.RevealingAction();
// Autrement on calcule ses chances de passer inaperçu
else
{
// On calcule ses chances de rester cacher en fonction de :
// - Son niveau en Hiding
// - Son niveau en Stealth
// - stayHiddenMinChance
// - stayHiddenMaxChance
// - stayHiddenSkill
double hSkill = ((m_Thief.Skills[SkillName.Hiding].Value
+ m_Thief.Skills[SkillName.Hiding].Value) / 2
- stayHiddenSkill) / (100 - stayHiddenSkill)
* (stayHiddenMaxChance - stayHiddenMinChance)
+ 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 (hSkill < Utility.Random(100))
from.RevealingAction();
}
// ---------------------------------------------------------------------
if (caught)
{
if (root == null)
{
m_Thief.CriminalAction(false);
}
else if (root is Corpse && ((Corpse)root).IsCriminalAction(m_Thief))
{
m_Thief.CriminalAction(false);
}
else if (root is Mobile)
{
Mobile mobRoot = (Mobile)root;
if (!IsInGuild(mobRoot) && IsInnocentTo(m_Thief, mobRoot))
m_Thief.CriminalAction(false);
// ---------------------------------------------------------------------
// Correction du message aux témoins
// -----------------------------------------------------------------
// Vérification que le témoin voit le voleur
string message = String.Format("Vous remarquez {0} en train d'essayer de voler {1}.", m_Thief.Name, mobRoot.Name);
foreach (NetState ns in m_Thief.GetClientsInRange(8))
{
if (ns != m_Thief.NetState && ns.Mobile.CanSee(m_Thief))
ns.Mobile.SendMessage(message);
}
}
}
// -----------------------------------------------------------------
else if (root is Corpse && ((Corpse)root).IsCriminalAction(m_Thief))
{
m_Thief.CriminalAction(false);
}
if (root is Mobile && ((Mobile)root).Player && m_Thief is PlayerMobile && IsInnocentTo(m_Thief, (Mobile)root) && !IsInGuild((Mobile)root))
{
PlayerMobile pm = (PlayerMobile)m_Thief;
pm.PermaFlags.Add((Mobile)root);
pm.Delta(MobileDelta.Noto);
}
}
}
public static bool IsEmptyHanded(Mobile from)
{
if (from.FindItemOnLayer(Layer.OneHanded) != null)
return false;
if (from.FindItemOnLayer(Layer.TwoHanded) != null)
return false; return true;
}
public static TimeSpan OnUse(Mobile m)
{
if (!IsEmptyHanded(m))
m.SendLocalizedMessage(1005584); // Both hands must be free to steal.
else
{
m.Target = new Stealing.StealingTarget(m);
m.SendLocalizedMessage(502698); // Which item do you want to steal?
}
return TimeSpan.FromSeconds(10.0);
}
}
}
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%.