Stealing
-
Не в сети
- Glavnyuk
- Автор темы
- Junior Member
- Сообщений: 2
- Thanks: 0

---
Про выход из хайда прочитал, но по атаке жертвы не понятно
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Glavnyuk написал:
При попытке украсть персонаж выходит из хайда и при успешной краже атакует "жертву". Это вроде как не правильно.
---
Про выход из хайда прочитал, но по атаке жертвы не понятно
Сейчас проверил. При успешной краже персонаж не начал атаковать свою жертву. Возможно Вы что-то делаете не так или Ваш персонаж был в боевом режиме.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
-
Не в сети
- Glavnyuk
- Автор темы
- Junior Member
- Сообщений: 2
- Thanks: 0


Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Glavnyuk написал:
Персонаж не был в боевом режиме. при неудачном стилинге - не атакует. при удачном не переходит в режим атаки, но начинает бить
Спросите у других игроков, есть ли у них такая же проблема. У меня не происходит никакой автоатаки на жертву, персонаж просто становится криминалом.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Никаких косяков в этом нет, вот пара пунктов, которые нужно знать:Datalord написал:
Вот замеченные мной "косяки" воровства: Персонаж выходит из хайда при активации навыка(приготовился украсть вожу курсором по рюкзаку ни к чему не притронулся а из хайда вышел) в 100 проц случаев. При удачном воровстве у собственной лошади перс начинает ее бить не переходя в боевой режим, как и писал основатель темы, повреждения при этом небольшие 1-4 хп, что наносимые, что получаемые, но иногда, непонятно от чего лошадь начинает лягаться по 16-20 хп убивая чара с нескольких ударов, понятно что о макросе не может быть и речи. Есть сомнения что это так и было задумано разрабами, просьба исправить.
1. Чтобы успешно красть у людей, нужно быть членом гильдии воров;
2. Чем меньше на вас одето брони, при краже - тем лучше. Она усложняет процесс;
3. Кол-во веса, которое вы пытаетесь украсть - влияет на конечный исход кражи. Зависит от навыка;
4. Пробуйте экспериментировать со статусами животного (охраняет, следует и т.д.);
5. При попытке украсть - всегда будет вышибать из хайда или инвиза. Чтобы постараться этого избежать - нужно использовать стелс, и использовать его заранее;
6. При краже должны быть свободны обе руки;
7. Чем больше вокруг вас NPC и других людей - тем выше шанс быть замеченным при краже;
8. Бить лошадь он начинает потому, что это агрессия в сторону животного и животное отвечает. Животное это воспринимает так, как если бы вы его атаковали. Не важно - ваше оно или нет, оно будет отвечать;
9. Некоторые артефакты могут быть получены только при использовании навыка воровства;
10. Занимаясь этим делом, есть шанс быть убитым владельцем, который вовремя заметил пропажу.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
это не помогаетl_nigrouse написал:
5. При попытке украсть - всегда будет вышибать из хайда или инвиза. Чтобы постараться этого избежать - нужно использовать стелс, и использовать его заранее
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
-
Не в сети
- Allice [FreeZzy]
- Пророк
- United Pirates Guild
- Сообщений: 3317
- Thanks: 53

l_nigrouse написал:
Никаких косяков в этом нет, вот пара пунктов, которые нужно знать:
1. Чтобы успешно красть у людей, нужно быть членом гильдии воров;
2. Чем меньше на вас одето брони, при краже - тем лучше. Она усложняет процесс;
3. Кол-во веса, которое вы пытаетесь украсть - влияет на конечный исход кражи. Зависит от навыка;
4. Пробуйте экспериментировать со статусами животного (охраняет, следует и т.д.);
5. При попытке украсть - всегда будет вышибать из хайда или инвиза. Чтобы постараться этого избежать - нужно использовать стелс, и использовать его заранее;
6. При краже должны быть свободны обе руки;
7. Чем больше вокруг вас NPC и других людей - тем выше шанс быть замеченным при краже;
8. Бить лошадь он начинает потому, что это агрессия в сторону животного и животное отвечает. Животное это воспринимает так, как если бы вы его атаковали. Не важно - ваше оно или нет, оно будет отвечать;
9. Некоторые артефакты могут быть получены только при использовании навыка воровства;
10. Занимаясь этим делом, есть шанс быть убитым владельцем, который вовремя заметил пропажу.
Обясните пожалуста 5 пункт. Почему персонажа в стелсе (юз хидинг, юз стелс, ждем кулдовн, юз стилинг ) выбывает со стелса еще до появления курсора (прицела) ?
Как воровать тогда в стелсе?
110 стил, 100 снуп, 110 (с банданой ) хайд, 100 (с банданой стелс)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
-
Не в сети
- Allice [FreeZzy]
- Пророк
- United Pirates Guild
- Сообщений: 3317
- Thanks: 53

На сервере снуп со стелса ВСЕГДА! ревилит (а не должно, должны быть 4 варианта удачи или неудачи).
В багтрекере описано здесь , но чтобы в коментах не сорить опишу здесь:
Скрипт Stealing.sc
using System;
using System.Collections;
using Server;
using Server.Mobiles;
using Server.Targeting;
using Server.Items;
using Server.Network;
using Server.Factions;
using Server.Spells.Seventh;
using Server.Spells.Fifth;
using Server.Spells.Necromancy;
using Server.Spells;
using Server.Spells.Ninjitsu;
namespace Server.SkillHandlers
{
public class Stealing
{
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;
object root = toSteal.RootParent;
StealableArtifactsSpawner.StealableInstance si = null;
if ( toSteal.Parent == null || !toSteal.Movable )
si = StealableArtifactsSpawner.GetStealableInstance( toSteal );
if ( !IsEmptyHanded( m_Thief ) )
{
m_Thief.SendLocalizedMessage( 1005584 ); // Both hands must be free to steal.
}
else if ( root is Mobile && ((Mobile)root).Player && IsInnocentTo( m_Thief, (Mobile)root ) && !IsInGuild( m_Thief ) )
{
m_Thief.SendLocalizedMessage( 1005596 ); // You must be in the thieves guild to steal from other players.
}
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 ( m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold( m_Thief, toSteal, false, true ) )
{
m_Thief.SendLocalizedMessage( 1048147 ); // Your backpack can't hold anything else.
}
#region Sigils
else if ( toSteal is Sigil )
{
PlayerState pl = PlayerState.Find( m_Thief );
Faction faction = ( pl == null ? null : pl.Faction );
Sigil sig = (Sigil) toSteal;
if ( !m_Thief.InRange( toSteal.GetWorldLocation(), 1 ) )
{
m_Thief.SendLocalizedMessage( 502703 ); // You must be standing next to an item to steal it.
}
else if ( root != null ) // not on the ground
{
m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
}
else if ( faction != null )
{
if ( !m_Thief.CanBeginAction( typeof( IncognitoSpell ) ) )
{
m_Thief.SendLocalizedMessage( 1010581 ); // You cannot steal the sigil when you are incognito
}
else if ( DisguiseTimers.IsDisguised( m_Thief ) )
{
m_Thief.SendLocalizedMessage( 1010583 ); // You cannot steal the sigil while disguised
}
else if ( !m_Thief.CanBeginAction( typeof( PolymorphSpell ) ) )
{
m_Thief.SendLocalizedMessage( 1010582 ); // You cannot steal the sigil while polymorphed
}
else if( TransformationSpellHelper.UnderTransformation( m_Thief ) )
{
m_Thief.SendLocalizedMessage( 1061622 ); // You cannot steal the sigil while in that form.
}
else if ( AnimalForm.UnderTransformation( m_Thief ) )
{
m_Thief.SendLocalizedMessage( 1063222 ); // You cannot steal the sigil while mimicking an animal.
}
else if ( pl.IsLeaving )
{
m_Thief.SendLocalizedMessage( 1005589 ); // You are currently quitting a faction and cannot steal the town sigil
}
else if ( sig.IsBeingCorrupted && sig.LastMonolith.Faction == faction )
{
m_Thief.SendLocalizedMessage( 1005590 ); // You cannot steal your own sigil
}
else if ( sig.IsPurifying )
{
m_Thief.SendLocalizedMessage( 1005592 ); // You cannot steal this sigil until it has been purified
}
else if ( m_Thief.CheckTargetSkill( SkillName.Stealing, toSteal, 80.0, 80.0 ) )
{
if ( Sigil.ExistsOn( m_Thief ) )
{
m_Thief.SendLocalizedMessage( 1010258 ); // The sigil has gone back to its home location because you already have a sigil.
}
else if ( m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold( m_Thief, sig, false, true ) )
{
m_Thief.SendLocalizedMessage( 1010259 ); // The sigil has gone home because your backpack is full
}
else
{
if ( sig.IsBeingCorrupted )
sig.GraceStart = DateTime.Now; // begin grace period
m_Thief.SendLocalizedMessage( 1010586 ); // YOU STOLE THE SIGIL!!! (woah, calm down now)
if ( sig.LastMonolith != null && sig.LastMonolith.Sigil != null ) {
sig.LastMonolith.Sigil = null;
sig.LastStolen = DateTime.Now;
}
return sig;
}
}
else
{
m_Thief.SendLocalizedMessage( 1005594 ); // You do not have enough skill to steal the sigil
}
}
else
{
m_Thief.SendLocalizedMessage( 1005588 ); // You must join a faction to do that
}
}
#endregion
else if ( si == null && ( toSteal.Parent == null || !toSteal.Movable ) )
{
m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
}
else if ( toSteal.LootType == LootType.Newbied || toSteal.CheckBlessed( root ) )
{
m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
}
else if ( Core.AOS && si == null && toSteal is Container )
{
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.
}
else if ( si != null && m_Thief.Skills[SkillName.Stealing].Value < 100.0 )
{
m_Thief.SendLocalizedMessage( 1060025, "", 0x66D ); // You're not skilled enough to attempt the theft of this item.
}
else if ( toSteal.Parent is Mobile )
{
m_Thief.SendLocalizedMessage( 1005585 ); // You cannot steal items which are equiped.
}
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 if ( root is Corpse )
{
m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
}
else
{
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 = Mobile.LiftItemDupe( toSteal, toSteal.Amount - amount );
if ( stolen == null )
stolen = toSteal;
}
}
}
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.
if ( si != null )
{
toSteal.Movable = true;
si.Item = null;
}
}
else
{
m_Thief.SendLocalizedMessage( 502723 ); // You fail to steal the item.
}
caught = ( m_Thief.Skills[SkillName.Stealing].Value < Utility.Random( 150 ) );
}
}
return stolen;
}
protected override void OnTarget( Mobile from, object target )
{
//----------------------
//
// Вот как раз тут должна просчитиватся RevealingAction - возможность ревила и как видим по скрипту - после
// посылки таргета в клиент >> OnTarget( Mobile from, object target ) но с сервера сначала приходят пакеты на
// ревил а пакеты на запрос таргета после пакетов ревила. Эт странно как-то, по дефолтному скрипту выдно что
// должно быть с точностью до наоборот, потому как по скрипту RevealingAction() после OnTarget. То есть
// получили таргет - обработали данную часть скрипта.
//
//----------------------
from.RevealingAction();
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( pack.Items[randomIndex], ref caught );
}
}
else
{
m_Thief.SendLocalizedMessage( 502710 ); // You can't steal that!
}
if ( stolen != null )
{
from.AddToBackpack( stolen );
StolenItem.Add( stolen, m_Thief, root as Mobile );
}
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 );
string message = String.Format( "You notice {0} trying to steal from {1}.", m_Thief.Name, mobRoot.Name );
foreach ( NetState ns in m_Thief.GetClientsInRange( 8 ) )
{
if ( ns.Mobile != 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.RevealingAction();
m.SendLocalizedMessage( 502698 ); // Which item do you want to steal?
}
return TimeSpan.FromSeconds( 10.0 );
}
}
public class StolenItem
{
public static readonly TimeSpan StealTime = TimeSpan.FromMinutes( 2.0 );
private Item m_Stolen;
private Mobile m_Thief;
private Mobile m_Victim;
private DateTime m_Expires;
public Item Stolen{ get{ return m_Stolen; } }
public Mobile Thief{ get{ return m_Thief; } }
public Mobile Victim{ get{ return m_Victim; } }
public DateTime Expires{ get{ return m_Expires; } }
public bool IsExpired{ get{ return ( DateTime.Now >= m_Expires ); } }
public StolenItem( Item stolen, Mobile thief, Mobile victim )
{
m_Stolen = stolen;
m_Thief = thief;
m_Victim = victim;
m_Expires = DateTime.Now + StealTime;
}
private static Queue m_Queue = new Queue();
public static void Add( Item item, Mobile thief, Mobile victim )
{
Clean();
m_Queue.Enqueue( new StolenItem( item, thief, victim ) );
}
public static bool IsStolen( Item item )
{
Mobile victim = null;
return IsStolen( item, ref victim );
}
public static bool IsStolen( Item item, ref Mobile victim )
{
Clean();
foreach ( StolenItem si in m_Queue )
{
if ( si.m_Stolen == item && !si.IsExpired )
{
victim = si.m_Victim;
return true;
}
}
return false;
}
public static void ReturnOnDeath( Mobile killed, Container corpse )
{
Clean();
foreach ( StolenItem si in m_Queue )
{
if ( si.m_Stolen.RootParent == corpse && si.m_Victim != null && !si.IsExpired )
{
if ( si.m_Victim.AddToBackpack( si.m_Stolen ) )
si.m_Victim.SendLocalizedMessage( 1010464 ); // the item that was stolen is returned to you.
else
si.m_Victim.SendLocalizedMessage( 1010463 ); // the item that was stolen from you falls to the ground.
si.m_Expires = DateTime.Now; // such a hack
}
}
}
public static void Clean()
{
while ( m_Queue.Count > 0 )
{
StolenItem si = (StolenItem) m_Queue.Peek();
if ( si.IsExpired )
m_Queue.Dequeue();
else
break;
}
}
}
}
Можно скрипт с сервера в студию, чтобы докопатся до истины? На дефолтной рануо 4 варианта с ревилом со стелса работают при снупинге. У нас почему то нет. Причем на деф ранке все как и должно быть: появляется прицел, тыкаем на вещьили персонаж и только потом нас ревилит или не ревилит со стелса при стилинге. А еа уогейймс - сначала ревилит, только потом появляется таргет для выбота того что будим стилить. И без всяких сообщений о разревиле.
Надоело переливать с пустого в порожнее. Почините ж наконец.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
-
Не в сети
- Allice [FreeZzy]
- Пророк
- United Pirates Guild
- Сообщений: 3317
- Thanks: 53


Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
1. Использование стилинга ревилит сразу же еще до выбора предмета. Именно поэтому продвинутые воры делают специальные макросы на скиллы или действия, которые не ревилят, и тарегетят желаемый предмет, а уже потом используют макрос на стилинг + ласт таргет собственно для дела. Это из моего опыта игры на UOGamers: Demise. Это кстати здорово использовать в приеме воровства на бегу. К тому моменту, как цель сообразит, что случилось, вы скорее всего будете в экране от нее.
2. Снуп имеет шанс ревила и из хайда, и из стелса.
Whether you succeed or not, there is a chance you will be noticed, wherein nearby players will receive a message concerning your action, and if hidden, a chance of being revealed.
www.uoguide.com/Snooping
Note that performing any action that would cancel hidden state will also cancel stealth state, other than moving of course.
www.uoguide.com/Stealth
Скорее всего на это так же влияют факторы, о которых писал Old Man, поэтому есть существенный шанс ревила даже при ГМ снупинге.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.