Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Help для Stealth Release 1.0

Часто задаваемые вопросы
Post Reply
Alexej
Novice
Novice
Posts: 79
Joined: 06.06.2008 11:55
Contact:

Help для Stealth Release 1.0

Post by Alexej »

Настройка Стелса:
Settings:
Save packets+debug logs // Запись логов packets и debug
Use Art.mul // Использовать Art.mul для отображения картинок во вкладке World
Show Cliloc text in journal // Показывать тексты клилоков
Profile_setup:
Profiles // Список чаров
Name // Отображение чара в списке
Login // Логин
Pass // Пароль
Shard // Шард
Reconnect time // Время для реконнектора

Ask for me // при подключении выбрать сервер и чара из списка
Always select // Всегда выбирать
Shard_setup:
Shards // Список серверов
Name // Имя сервера
IP // ИП адрес сервера
Port // Порт сервера
Encryption // криптование (No encryption - для изменения отображения версии клиента,
// надо править последнюю строку ("No encryption" 00000000 00000000 0 "6.0.13.0") в файле Encryption.cfg

UO mul-files path // путь к мул файлам клиента, обязательно правильно прописать для включения возможности движения и многих других

SphereServer Moving Fix // Обязательно ставьте, если играете на сфере. Иначе со стабильной периодичностью при хотьбе и беге будете получать MoveReject(и, как следствие, 5сек паузы)

KR-version shard // для версий МЛ и КР
AoP shard // для АоП
DiagonalMoveCheck // если у вас на шарде отбрасывает чара при движении по диагонали. Если же галка стоит -
// то в случае диагонального движения (1,3,5,7 направления) перед проверкой проходимости точки Y сначала
// проверяются на проходимость обе X, и если обе свободны - тогда уже проверяется Y.
Nul Targets // для шардов с измененными стандартными таргетами, на которые не реагирует стелс.
// при этом стелс даже с включенной галочкой обрабатывает эти "нулевые" таргеты ограниченным набором функций, в частности TargetToObject, TargetToXYZ, TargetToTile
// функции типа WaitTarget и проверки типа TargetPresent не поддерживают их ни в каком виде, ввиду архитектуры стелса
New Speak // включать на шардах версии ML и выше в случаях, когда обычная "говорилка" не работает для отсылки команд
// например, пишешь all release - в чат идет этот текст, а животное не реагирует совершенно, в таких и подобных случаях как раз и надо включать.


{Work with global vars}
procedure SetGlobal(GlobalRegion: String; VarName: String; VarValue: String); // Установка глобальной переменной, где
GlobalRegion - Область переменной ('stealth' - глобалка видна любому скрипту любого чара, 'char' - глобалка видна только для скриптов этого чара);
VarName - Имя переменной;
VarValue - Значение переменной.
в области глоб. пер. Stealth есть 5 заранее определенных названий переменных - от
TestVar1 до TestVar5, при задании им значений - они автоматически появляются на закладке Main стелса в разделе ScriptVars

function GetGlobal(GlobalRegion: String; VarName: String): String; // Чтение значения глобальной переменной

Пример:

Code: Select all

SetGlobal('stealth','TestVar3',IntToStr(3434)); 
s:=GetGlobal('stealth','TestVar3');
AddToSystemJournal(s);
{Connect - Disconnect}
procedure SocketReset; // ????? закрывает соединение с сервером для подвисшего чара во время login-сессии ?????

procedure Connect; // Соедениться с UO сервером
procedure Disconnect; // Отключиться от UO сервера

Пример:

Code: Select all

If not Connected Then Connect;
If Connected and Dead Then Disconnect;
{Auto Reconnector}
procedure SetARStatus(Value: Boolean); // Установить состояние реконнектора
function GetARStatus: Boolean; // Cостояние реконнектора

{Connected Status}
function Connected: Boolean; // Текущее состояние соединения с UO сервером. (True - если соеденены, иначе False)
function ConnectedTime: TDateTime; // Время подключения к серверу УО

{Char Name}
function CharName: String; // Имя Чара

Пример 1:

Code: Select all

LogName:=('D:\'+CharName+'.txt');
Пример 2:

Code: Select all

Addtosystemjournal(CharName);
Результат::
2:30:47 [KopUshKa_15]: KopUshKa

{Player Title}
function GetCharTitle: String; // Получения тайтла с папердола своего чара, возвращает приписку и весь остальной текст, длиной до 60 байт

Пример:

Code: Select all

Addtosystemjournal(GetCharTitle);
Результат::
2:27:37 [KopUshKa_15]: KopUshKa, Legendary Miner

Для любых других НПЦ, у которых есть папердол:
при коннекте берется имя неписи, пишется в свойство, которое видно через закладку World и которое можно взять через GetName.
Если нужен тайтл с папердолла - значит шлете UseObject на непись, и ставите цикл типа

Code: Select all

S:=GetName($xxxxxxxx); 
while GetName($xxxxxxxx) = S do wait(xxx)'; 
цикл для того, чтобы дождаться когда придет пакет папердолла на непись. Когда он приходит - title пишется поверх старого имени в свойства, и берете его так же через GetName.

Соответственно кусок получения папердолла будет выглядеть как-то так:

Code: Select all

S:=GetName($xxxxxxxx); 
UseObject($xxxxxxxx); 
while GetName($xxxxxxxx) = S do wait(xxx)'; 
S:=GetName($xxxxxxxx); 
{Self}
function Self: Cardinal; // ID чара
function Sex: Byte; // Пол Чара (0=male, 1=female)
function Gold: Cardinal; // Золота (ГП) в БакПаке
function Armor: Word; // Армор
function Weight: Word; // Вес Текущий
function MaxWeight: Word; // Максимальный Вес
function Race: Byte; // Раса - 0=Humman, 1=Elf (на некоторых серверах с большим кол-вом рас эти стандартные значения могут быть изменены либо расширены)

function WorldNum: Byte; // Возвращает номер мира

0 - Felucca (Britannia)
1 - Trammel (Britannia_alt)
2 - Ilshenar
3 - Malas
4 - Tokuno

function ConnectedTime: TDateTime; // Время подключения к серверу УО
function DisconnectedTime: TDateTime; // Время отключения от сервера УО

function LastContainer: Cardinal; // ID последнего открытого контейнера
function Backpack: Cardinal; // указатель на БакПак Чара - используется в поиске и пр.
function Ground: Cardinal; // указатель на землю - используется в поиске и пр.

Состояние Чара:
Флаги:
function Hidden: Boolean; // Скрытность
function Poisoned: Boolean; // Отравленность
function Dead: Boolean; // Мертвый

Боевое Состояние:
function WarMode: Boolean; // Боевой режим (0-Мир, 1-Война)
function WarTargetID: Cardinal; // ID с кем идут боевые действия, иначе = 0
procedure SetWarMode(Value: Boolean); // Переключить боевой режим (True-Вкл, False-Выкл)
procedure Attack(ObjID: Cardinal); // Атаковать Врага по ID (Боевой режим включается автоматически)

Статы:
function Str: Integer; // Сила
function Dex: Integer; // Ловкость
function Int: Integer; // Интеллект
function Life: Integer; // Жизнь
function HP: Integer; // Жизнь
function Mana: Integer; // Мана
function Stam: Integer; // Стамина
function MaxLife: Integer; // Максимум Жизни
function MaxHP: Integer; // Максимум Жизни
function MaxMana: Integer; // Максимум Маны
function MaxStam: Integer; // Максимум Стамины
function Luck: Integer; // Удача

function PetsCurrent: Byte; // Текущее Количество Слотов прирученных животных
function PetsMax: Byte; // Максимальное Возможное Количество Слотов для Прирученных животных

function FireResist: Word; // Резист к Огню
function ColdResist: Word; // Резист к Холоду
function PoisonResist: Word; // Резист к Яду
function EnergyResist: Word; // Резист к Энергии

Пример:

Code: Select all

begin
Addtosystemjournal('Str '+IntToStr(Str)+' | HP   '+IntToStr(HP)+'/'+IntToStr(MaxLife)+' | Stats '+IntToStr(Str+Dex+Int)+' | '+'Damage '+' || ');
Addtosystemjournal('Dex '+IntToStr(Dex)+' | Stam '+IntToStr(Stam)+'/'+IntToStr(MaxStam)+' | Luck   '+IntToStr(Luck)+'  | Gold '+IntToStr(Gold)+' || ');
Addtosystemjournal('Int '+IntToStr(Int)+' | Mana '+IntToStr(Mana)+'/'+IntToStr(MaxMana)+' | Weight '+IntToStr(Weight)+'/'+IntToStr(MaxWeight)+' | Pets '+IntToStr(PetsCurrent)+'/'+IntToStr(PetsMax)+' ||');
Addtosystemjournal('Armor '+IntToStr(Armor)+' | Fire '+IntToStr(FireResist)+' | Cold '+IntToStr(ColdResist)+' | Poison '+IntToStr(PoisonResist)+' | Energy '+IntToStr(EnergyResist)+' || ');
end.
Результат::
3:30:48 [KopUshKa_15]: Str 130 | HP 115/115 | Stats 285 | Damage ||
3:30:48 [KopUshKa_15]: Dex 114 | Stam 117/117 | Luck 0 | Gold 0 ||
3:30:48 [KopUshKa_15]: Int 41 | Mana 41/41 | Weight 372/0 | Pets 0/5 ||
3:30:48 [KopUshKa_15]: Armor 40 | Fire 14 | Cold 14 | Poison 14 | Energy 14 ||

{Target}
function TargetPresent: Boolean; // Состояние таргета - если есть то true, в противном случае false
function TargetID: Cardinal; // ID таргета
procedure WaitForTarget(MaxWaitTimeMS: Integer); // Ожидает появления таргета, время задается в миллисекундах
procedure CancelTarget; // Отменить таргет
procedure TargetToObject(ObjectID: Cardinal); // Кликнуть таргетом на обьект
procedure TargetToXYZ(X,Y,Z: Integer); // Кликнуть таргетом по координатам на земле
procedure TargetToTile(TileModel: Word; X,Y,Z: Integer); // Кликнуть таргетом по Тайлу с координатами

Пример 1:

Code: Select all

If TargetPresent Then CancelTarget;
UseObject(PickAxe);
WaitForTarget(3000);
If TargetPresent Then TargetToTile(Tile,X,Y,Z);
Пример 2:

Code: Select all

UseSkill('Poisoning');
WaitForTarget(3000);
If TargetPresent Then TargetToObject(FindType(PoisonBottle,BackPack));
WaitForTarget(3000);
If TargetPresent Then TargetToObject(FindType(Dagger,BackPack));
{WaitTarget Ловушки}
procedure WaitTargetObject(ObjID: Cardinal); // Ожидает появления таргета и клик им на обьект по ID
procedure WaitTargetTile(Tile: Word; X,Y,Z: Integer); // Ожидает появления таргета и клик им по Тайлу с координатами
procedure WaitTargetXYZ(X,Y,Z: Integer); // Ожидает появления таргета и клик им по координатам на земле
procedure WaitTargetSelf; // Ожидает появления таргета и клик им на себя
procedure WaitTargetType(ObjType: Word); // Ожидает появления таргета и клик им по обьекту (по типу)
procedure CancelWaitTarget; // Отменить ожидание таргета
procedure WaitTargetGround(ObjType: Word); // Ожидает появления таргета и клик им по обьекту на заемле
procedure WaitTargetLast; // Ожидает появления таргета, идентичную последнему

Пример:

Code: Select all

If TargetPresent Then CancelTarget;
UseSkill('Poisoning');
WaitTargetObject(FindType(PoisonBottle,BackPack));
WaitTargetObject(FindType(Dagger,BackPack));
{Other}
procedure AddToSystemJournal(Text: String); // Добавить строку в системниый журнал
procedure Wait(WaitTimeMS: Integer); // Ожидать, время ожидания в миллисекундах
procedure UOSay(Text: String); // Сказать фразу

procedure ConsoleEntryReply(Text: String); // для переименовки рун и прочего, что использует текст из консоли
// Это полноценная ловушка - вызывать можно и до прихода пакета запроса, и после.
Пример:

Code: Select all

 var 
Time: TDateTime; 
 begin 
   Time:=Now; 
   useobject(Id); 
   checklag; 
   if IsSystemMsg('What is the new name',Time,Now) then ConsoleEntryReply(Text); 
 end; 
procedure ConsoleEntryUnicodeReply(Text: String); //аналог вышеописанной функции, только для новых шардов. работает так же, только с другим пакетом.

procedure RuneRename(Id: Cardinal; Text: String); // Переименование руны

function UseSkill(SkillName: String): Boolean; // Использовать Скилл
function GetSkillValue(SkillName: String): Double; // Получить значения Скила

Список Скиллов:

Upd: Название скилла должно соответствовать написанию в клиенте.

Alchemy
Anatomy
Animal Lore
Animal Taming
Archery
Arms Lore
Begging
Blacksmithing
Bowcraft
Bushido
Camping
Carpentry
Cartography
Chivalry
Cooking
Detect Hidden
Enticement (Discordance)
Evaluate Intelligence
Fencing
Fishing
Focus
Forensic Evaluation
Healing
Herding
Hiding
Inscription
Item ID
Lockpicking
Lumberjacking
Mace Fighting
Magery
Magic Resistance
Meditation
Mining
Musicianship
Necromancy
Ninjitsu
Parrying
Peacemaking
Poisoning
Provocation
Remove Trap
Snooping
Spirit Speak
Stealing
Stealth
Swordsmanship
SpellWeaving
Tactics
Tailoring
Taste Identification
Tinkering
Tracking
Veterinary
Wrestling

procedure UseObject(ObjectID: Cardinal); // Использовать обьект (Двойной клик)
function UseType(ObjType: Word; Color: Word): Cardinal; // Использовать по типу из BackPack-a
function UseFromGround(ObjType: Word; Color: Word): Cardinal; // Использовать по типу с земли
procedure ClickOnObject(ObjectID: Cardinal); // Одиночный клик на обьекте
function Cast(SpellName: String): Boolean; // Кастовать заклинание

Список Заклинаний
-=magery spells=-
Clumsy
Create Food
Feeblemind
Heal
Magic Arrow
Night Sight
Reactive Armor
Weaken
Agility
Cunning
Cure
Harm
Magic Trap
Magic Untrap
Protection
Strength
Bless
Fireball
Magic Lock
Poison
Telekinesis
Teleport
Unlock
Wall of Stone
Arch Cure
Arch Protection
Curse
Fire Field
Greater Heal
Lightning
Mana Drain
Recall
Blade Spirit
Dispel Field
Incognito
Spell Reflection
Mind Blast
Paralyze
Poison Field
Summon Creature
Dispel
Energy Bolt
Explosion
Invisibility
Mark
Mass Curse
Paralyze Field
Reveal
Chain Lightning
Energy Field
Flame Strike
Gate Travel
Mana Vampire
Mass Dispel
Meteor Swarm
Polymorph
Earthquake
Energy Vortex
Resurrection
Summon Air Elemental
Summon Daemon
Summon Earth Elemental
Summon Fire Elemental
Summon Water Elemental

-=necromancer spells=-
Animate Dead
Blood Oath
Corpse Skin
Curse Weapon
Evil Omen
Horrific Beast
Lich Form
Mind Rot
Pain Spike
Poison Strike
Strangle
Summon Familiar
Vampiric Embrace
Vengeful Spirit
Wither
Wraith Form

-=paladin spells=-
Cleanse by Fire
Close Wounds
Consecrate Weapon
Dispel Evil
Divine Fury
Enemy of One
Holy Light
Noble Sacrifice
Remove Curse
Sacred Journey

-=Spellweaving=-
Arcane Circle
Gift of Renewal
Immolating Weapon
Attune Weapon
Thunderstorm
Nature’s Fury
Summon Fey
Summon Fiend
Reaper Form
Wildfire
Essence of Wind
Dryad Allure
Ethereal Voyage
Word of Death
Gift of Life
Arcane Empowerment

-=Ninjutsu=-
Focus Attack
Death Strike
Animal Form
Ki Attack
Surprise Attack
Backstab
Shadowjump
Mirror Image

-=Bushido=-
Weapon Parry
Honorable Execution
Confidence
Evasion
Counter Attack
Lightning Strike
Momentum Strike

{Ability}
function GetActiveAbility: String; // Узнать название активной абилки на оружии, возвращает '0' - если абилки нет
procedure UsePrimaryAbility; // Установить первичную абилку на оружии
procedure UseSecondaryAbility; // Установить вторичную абилку на оружии
Alexej
Novice
Novice
Posts: 79
Joined: 06.06.2008 11:55
Contact:

Post by Alexej »

{DateTime}
function TimeToStr(D: TDateTime): String; // Конвертирует "время" в строку
function DateToStr(D: TDateTime): String; // Конвертирует "дату" в строку
function DateTimeToStr(D: TDateTime): String; // Конвертирует "дату + время" в строку
function StrToTime(const S: String): TDateTime; // Конвертирует строку в формат "время"
function StrToDate(const S: String): TDateTime; // Конвертирует строку в формат "дата"
function StrToDateTime(const S: String): TDateTime; // Конвертирует строку в формат "дата + время"
function MsToDateTime(TimeMS: Word): TDateTime; // Конвертирует миллисекунды в формат "дата + время"
function Timer: Cardinal; // число, меняющееся каждую милисекунду

function FormatDateTime(const fmt: String; D: TDateTime): String; // Преобразование даты/времени D в строку формата fmt
function DateTimeToUnix(D: TDateTime): Int64; // Конвертирует "дату + время" в Unix TimeStamp
function UnixToDateTime(U: Int64): TDateTime; // Конвертирует Unix TimeStamp в "дату + время"
function TryEncodeDate(Year,Month,Day: Word; out Date: TDateTime): Boolean; // Формирует дату из года, месяца и дня, возвращает false в случае ошибки.
function TryEncodeTime(Hour,Min,Sec,MSec: Word; out Time: TDateTime): Boolean; // Формирует время из значений часа, минуты, секунды, миллисекунды, возвращает false в случае ошибки.

function DecodeDate(Date: TDateTime; var Year,Month,Day: Word); // Извлекает дату из формата TDateTime и помещает год, месяц и день соответственно в переменные Year, Month и Day
function DecodeTime(Time: TDateTime; var Hour,Min,Sec,MSec: Word); // Извлекает время из формата TDateTime и помещает часы, минуты, секунды, и миллисекунды соответственно в переменные Hour, Min, Sec и MSec

function EncodeDate(Year,Moth,Day: Word): TDateTime; // Возвращает дату в формате TDateTime, полученную из значений параметров Year, Month и Day. Year должен быть между 1 и 9999. Допустимые значения Month - от 1 до 12. Допустимые значения Day - от 1 до 28, 29, 30, или 31, в зависимости от значения Month. Например, возможные значения Day в течение второго месяца (февраля) - от 1 до 28, или от 1 до 29, в зависимости от того, определяет или нет значение Year високосный год. Если значения находятся вне диапазона, возникает исключительная ситуация EConvertError. Возникающее в результате значение - единица плюс число дней между 30/12/1899 и данной датой.
function EncodeTime(Hour,Min,Sec,MSec: Word): TDateTime; // Возвращает время в формате TDateTime, полученное из значений параметров Hour, Min, Sec и MSec. Если значение типизированной константы Time24Hour ложно (False), значения Hour лежат в пределах от 0 до 12, если истинно (True) - от 0 до 23. Допустимые значения Min и Sec - от 0 до 59. Допустимые значения MSec - от 0 до 999. Если значения находятся вне диапазона, возникает исключительная ситуация EConvertError.

function DayOfWeek(Date: TDateTime): Integer; // Возвращает день недели определенной даты как целое число между 1 и 7. Воскресенье - первый день недели, и суббота - седьмой

Now: TDateTime; // Текущая "дата + время"
Date: TDateTime; // Текущая "дата"
Time: TDateTime; // Текущее "время"

Пример:

Code: Select all

AddToSystemJournal(DateTimeToStr(BulkTime)+'  |+|  '+DateTimeToStr(BulkTime+EncodeTime(6,0,0,0))+'  |+|  '+DateTimeToStr(Now));
If (BulkTime+EncodeTime(6,0,0,0)) <= Now Then ...
{Line}
function LineID: Cardinal; // Если сообщение не системное - содержит ID чара, блягодоря которому породилось сообщение в вашем журнале
function FoundedParamID: Integer;
Описание:
Vizit0r wrote:в результате работы функций WaitJournalLine, InJournal, и им подобных функций при удачном нахождении заполняются поля типа LineID, LineType, LineTime и прочие.
к ним добавил FoundedParamID.
например в поиск дается строка типа 'create|make|destroy|already'
обнаружена строка со словом destroy.
тогда в FoundedParamID будет число 2 (счет от нуля).
нашлось бы create - было бы ноль.
function LineType: Word; // Тип адресата
function LineName: String; // Имя того, кто породил это сообщение. Если сообщение системное, то LineName = 'System'
function LineTime: TDateTime; // Дата + время, когда это сообщение было получено от сервера
function LineMsgType: Byte; // Тип сообщения
function LineTextColor: Word; // Цвет текста сообщения
function LineTextFont: Word; // Шрифт сообщения
function LineIndex: Integer; // Индекс строки
function LineCount: Integer; // Количество найденных строк во время поиска в журнале
{Journal}
function LastJournalMessage: String; // Последнее сообщение в журнале
function InJournal(Str: String): Integer; // Поиск последней строки в журнале по слову (или по словам)
function InJournalBetweenTimes(Str: String; TimeBegin,TimeEnd: TDateTime): Integer; // поиск последней строки в журнале по слову (или по словам) во временном интервале
function Journal(StringIndex: Integer): String; // Получение строки в журнале по ее индексу
procedure SetJournalLine(StringIndex: Integer; Text: String); // Изменение строки в журнале по ее индексу. Если вместо Text указать пустую строку (''), то строка в журнале будет удалена
procedure ClearJournal; // Очистка журнала
function LowJournal: Integer; // Индекс первой строки в журнале
function HighJournal: Integer; // Индекс последней строки в журнале
function WaitJournalLine(StartTime: TDateTime; Str: String; MaxWaitTimeMS: Integer): Boolean; // Ожидание появления строки в журнале
function WaitJournalLineSystem(StartTime: TDateTime; Str: String; MaxWaitTimeMS: Integer): Boolean; // Ожидание появления строки в журнале от System
procedure ClearJournalIgnore; // Снять игнор в журнале
procedure AddJournalIgnore(Str: String); // Добавить в игнор сообщения

{Objects}
function FindType(ObjType: Word; Container: Cardinal): Cardinal; // Ищет обьект указанного типа type в указанном контейнере.
Не ищет в подсумках.
Возвращает ID вещи.
Если ничего не найдено то результат нулевой!
FindType = FindTypeEx(ObjType,$FFFF,Container,false);

function FindTypeEx(ObjType: Word; Color: Word; Container: Cardinal; InSub: Boolean): Cardinal; // Ищет объект указанного типа ObjType и цвета Color в указанном контейнере
Если указать ObjType или Color = $FFFF, то ищет любого типа.
Container = Backpack - ищем в бекпаке.
Container = Ground - ищем на земле.
Container = $FFFFFFFF - ищем в бекпаке и на земле.
Если
InSub = True, то ищем в подсумках.
Возвращает ID вещи.
Если контейнер не существует, то ищем в бекпаке
Если обьект найден, то
Result = FindItem
Если ничего не найдено то результат нулевой!
Во время поиска учитываются
FindDistance и FindVertical

function FindNotoriety(ObjType: Word; Notoriety: Byte): Cardinal; // Поиск по типу обьекта и его Notoriety ("злобность")
0 = invalid/across server line
1 = innocent (blue)
2 = guilded/ally (green)
3 = attackable but not criminal (gray)
4 = criminal (gray)
5 = enemy (orange)
6 = murderer (red)
7 = unknown use (translucent (like 0x4000 hue))
procedure Ignore(ObjID: Cardinal); // Игнорировать обьект
procedure IgnoreOff(ObjID: Cardinal); // Снять игногр с обьекта
procedure IgnoreReset; // Очистить список игнора
function GetIgnoreList(var UserList: TStringList): Boolean; // Получить список игнора
function GetFindedList(var UserList: TStringList): Boolean; // Найти в скписке игнора

{Find Flags}
function FindItem: Cardinal; // ID последнего найденного объекта
function FindCount: Integer; // Количество найденных стопок
function FindQuantity: Integer; // Количество элементов в найденной стопке
function FindFullQuantity: Integer; // Количество элементов во всех найденных стопках

FindDistance: Integer; // Радиус поиска обьектов на земле
FindVertical: Integer; // Высота поиска обьектов на земле
по умолчанию: FindDistance:=2; FindVertical:=6;

Пример:

Code: Select all

FindDistance:=12;
FindVertical:=36;
{Object Gets Info}
function GetX(ObjID: Cardinal): Integer; // параметр объекта: координата Х
function GetY(ObjID: Cardinal): Integer; // параметр объекта: координата Y
function GetZ(ObjID: Cardinal): ShortInt; // параметр объекта: координата Z
function GetName(ObjID: Cardinal): String; // параметр объекта: Имя
function GetCliloc(ObjID: Cardinal): String; // параметр объекта: Полное название
function GetType(ObjID: Cardinal): Word; // параметр объекта: Тип
function GetQuantity(ObjID: Cardinal): Integer; // параметр объекта: Кол-во в стопке
function GetDirection(ObjID: Cardinal): Byte; // параметр объекта: направление
function GetDistance(ObjID: Cardinal): Integer; // параметр объекта: дистанция
// гипотенуза от двух катетов. 0 - обьект под вами. -1 - Обьект не существует. (При определении игнорирует координату Z)
function GetColor(ObjID: Cardinal): Word; // параметр объекта: цвет
function GetStr(ObjID: Cardinal): Integer; // параметр объекта: Сила
function GetInt(ObjID: Cardinal): Integer; // параметр объекта: Интелект
function GetDex(ObjID: Cardinal): Integer; // параметр объекта: Ловкость
function GetHP(ObjID: Cardinal): Integer; // параметр объекта: Жизни
function GetMaxHP(ObjID: Cardinal): Integer; // параметр объекта: Максимально Жизней
function GetMana(ObjID: Cardinal): Integer; // параметр объекта: Мана
function GetMaxMana(ObjID: Cardinal): Integer; // параметр объекта: Максимально Маны
function GetStam(ObjID: Cardinal): Integer; // параметр объекта: Стамина
function GetMaxStam(ObjID: Cardinal): Integer; // параметр объекта: Максимально Стамины
function GetNotoriety(ObjID: Cardinal): Byte; // параметр объекта: Злобность
function GetParent(ObjID: Cardinal): Cardinal; // параметр объекта: Где находится
function IsWarMode(ObjID: Cardinal): Boolean; // параметр объекта: Боевой режим
function IsNPC(ObjID: Cardinal): Boolean; // параметр объекта: НПЦ
function IsDead(ObjID: Cardinal): Boolean; // параметр объекта: Мертвый
function IsRunning(ObjID: Cardinal): Boolean; // параметр объекта: Бег
function IsContainer(ObjID: Cardinal): Boolean; // параметр объекта: Контейнер
function IsHidden(ObjID: Cardinal): Boolean; // параметр объекта: Скрытый
function IsMovable(ObjID: Cardinal): Boolean; // параметр объекта: Перемещаемый
function IsYellowHits(ObjID: Cardinal): Boolean; // параметр объекта: желтые жизни
function IsPoisoned(ObjID: Cardinal): Boolean; // параметр объекта: Отравленный
function IsFemale(ObjID: Cardinal): Boolean; // параметр объекта: Пол (Мужской/Женский)

{Move Items}
function DragItem(ItemID: Cardinal; Count: Integer): Boolean; // Взять предмет в руки (на палец)
function DropItem(MoveIntoID: Cardinal; X,Y,Z: Integer): Boolean; // Положить предмет из рук в контейнер на координаты
!!!Обе функции использовать только в паре!!!

Пример:

Code: Select all

DragItem(FindItem,1);
wait(100); 
DropItem(Box,0,0,0); 
wait(800);
function MoveItem(ItemID: Cardinal; Count: Integer; MoveIntoID: Cardinal; X,Y,Z: Integer): Boolean; // Перемещает предмет

Пример:

Code: Select all

MoveItem(Resurs,100,Box,0,0,0);
function Grab(ItemID: Cardinal; Count: Integer): Boolean; // Подобрать предмет в бакпак
function Drop(ItemID: Cardinal; Count: Integer; X,Y,Z: Integer): Boolean; // Тоже что и grab, только бросает объект на землю с указанными координатами
function DropHere(ItemID: Cardinal): Boolean; // Бросить объект на землю под ноги
function MoveItems(Container: Cardinal; ItemsType: Word; ItemsColor: Word; MoveIntoID: Cardinal; X,Y,Z: Integer; DelayMS: Integer): Boolean; //
Всех айтимы в контейнере Container, которые удовлетворяют фильтру поиска, - перемещает с одного места в другое.

ItemsType - тип айтимов. $FFFF - любой тип
ItemsColor - цвет айтимов. $FFFF - любой цвет
DelayMS - пауза между перемещением каждого айтима (Время задается в милисекундах)

Пример:

Code: Select all

MoveItems(BackPack,Resurs,$FFFF,Box,0,0,0,500);

{Context Menu}
procedure RequestContextMenu(ID: Cardinal); // Вызвать контекстное меню
procedure SetContextMenuHook(MenuID: Cardinal; EntryNumber: Byte); // Установить ловушку на контекстное меню

Пример:

Code: Select all

RequestContextMenu(people);
SetContextMenuHook(people,2);

{Secure Trade Menu}
function IsTrade: Boolean; // Состояние трейд окна
function GetTradeContainer(TradeNum,Num: Byte): Cardinal; // Получить айди для одного из двух контейнеров в окне секьюр-трейда, для поиска, перемещения туда айтема и прочего.
Num = 1 Себя
Num = 2 Оппонента
TradeNum исчесляется с 0

function TradeCheck(TradeNum,Num: Byte): Boolean; // Проверить состояние "галочек" передачи, своей и чужой.
Num = 1 Себя
Num = 2 Оппонента

procedure ConfirmTrade(TradeNum: Byte); // Подтвердить передачу (галочка в клиенте). Если галочка уже стоит - будет снята
procedure CancelTrade(TradeNum: Byte); // Отменяет трейд окно за номером TradeNum
function GetTradeOpponent(TradeNum: Byte): Cardinal; // Возвращает ID оппонента трейд окна
function GetTradeOpponentName(TradeNum: Byte): String; // Возвращает имя оппонента трейд окна
function TradeCount: Byte; // Возвращает колиечство открытых трейд окон

{Menus}
procedure WaitMenu(UP,UC: String); // Установить одноразовую ловушку на меню
procedure CloseMenu; // Закрыть Меню
procedure AutoMenu(UP,UC: String); // Установить многоразовую ловушку на меню
procedure CancelMenu; // Отменяет все установленные ловушки
function MenuHookPresent: Boolean; // Проверяет наличие ловушки на Меню
function MenuPresent: Boolean; // Проверка наличия Меню

{Gumps}
procedure WaitGump(Value: String); // Устанавливается одноразовая ловушка на Gump меню
// В Value должен быть код Button или Switch
Пример:

Code: Select all

WaitGump('21');
UseObject(SmHammer,$FFFF);
procedure GumpAutoTextEntry(TextEntryID: Integer; Value: String); // Автоввод текстов в гампы
procedure GumpAutoCheckBox(CheckBoxID,Value: Integer); // для обработки чекбоксов.
function GetGumpsCount: Integer; // Количество гампов
function IsGump: Boolean; // Проверка наличия гампа
function GetGumpSerial(GumpIndex: Integer):
Cardinal;
// Получить номер гампа, если указанного гампа нет - возвращает ноль
function GetGumpID(GumpIndex: Integer):
Cardinal;
// Получить ID гампа, если указанного гампа нет - возвращает ноль
procedure GetGumpTextLines(GumpIndex: Integer; var TL: TStringList); // получить тескт из гампа
procedure GetGumpShortLines(GumpIndex: Integer; var TL: TStringList); // аналог ,infogump в инжекте, самый минимум - кнопки, текст, название и прочая мелочь
procedure GetGumpFullLines(GumpIndex: Integer; var TL: TStringList); // аналог ,infogump в инжекте, полностью разобранный по категориям

Пример:

Code: Select all

Serial: 1A1B9F 
GumpID: 11CC34F 
X: 0000 
Y: 0000 
Pages: 13 
Gump Options: NoDispose NoClose 

GumpPics: X Y ID  Page 
GumpPic: 480  367  2443  0 

TilePics: X   Y   ID   Page 
0   TilePic: 80  94  5099  2 
1   TilePic: 230  94  5103  2 
... 
47   TilePic: 230  184  5176  12 
48   TilePic: 80  274  5181  12 

ResizePics: X   Y   ID   Width   Height   Page 
0   ResizePic: 20  20  5054  540  40  0 
1   ResizePic: 20  60  5054  360  300  0 
2   ResizePic: 380  60  5054  180  300  0 
3   ResizePic: 20  360  5054  540  70  0 


CheckBoxes: X   Y   Released_ID  Pressed_ID   Status   Return_value   Page 
0   CheckBox: 140  395  210  211  0  1537  0 


GumpTexts: X   Y   Color   Text_ID   Page 
0   GumpText: 159  30  51  0  0 
1   GumpText: 60  371  900  1  0 
... 
61   GumpText: 223  229  900  62  12 
62   GumpText: 73  319  900  63  12 

TextEntries: X   Y   Width   Height   Status   Color   Return_value   Default_text_id   Page 
0   TextEntry: 487  370  100  30  0  513  5  0 

Text Lines: 
BLACKSMITH SELECTION MENU 
Make last (ringmail gloves) 
Repair Item 
Hardening 
How Many? 
1 

... 

War Hammer 
Hammer Pick 

GumpButtons: X   Y   Released_ID  Pressed_ID   Quit   Page_ID   Return_value   Page 
0   GumpButton: 40  372  208  209  1  0  1025  0 
1   GumpButton: 40  395  208  209  1  0  1026  0 
... 
50   GumpButton: 200  164  1209  1210  1  0  5176  12 
51   GumpButton: 50  254  1209  1210  1  0  5180  12 
procedure CloseSimpleGump(GumpIndex: Integer); // закрыть гамп, если на гампе опция NoClose - то не отработает
Alexej
Novice
Novice
Posts: 79
Joined: 06.06.2008 11:55
Contact:

Post by Alexej »

{Layers Names}
function RhandLayer: Byte; // 0x01 - Правая рука (одноручное оружие) - One handed weapon
function LhandLayer: Byte; // 0x02 - Левая рука (щит, двуручное оружие) - Two handed weapon, shield, or misc
function ShoesLayer: Byte; // 0x03 - Ботинки - Shoes
function PantsLayer: Byte; // 0x04 - Штаны - Pants
function ShirtLayer: Byte; // 0x05 - Рубашка - Shirt
function HatLayer: Byte; // 0x06 - Шляпа, шлем - Helm/Hat
function GlovesLayer: Byte; // 0x07 - Перчатки - Gloves
function RingLayer: Byte; // 0x08 - Кольцо - Ring
function Talisman: Byte; // 0x09 - Амулет - Talisman
function NeckLayer: Byte; // 0x0A - Ожерелье - Neck
function HairLayer: Byte; // 0x0B - Причёска - Hair
function WaistLayer: Byte; // 0x0C - Малый передник - Waist (half apron)
function TorsoLayer: Byte; // 0x0D - Нагрудник - Torso (inner) (chest armor)
function BraceLayer: Byte; // 0x0E - Браслет - Bracelet
// 0x0F - Unused (backpack, but backpacks go to 0x15)
function BeardLayer: Byte; // 0x10 - Борода - Facial Hair
function TorsoHLayer: Byte; // 0x11 - Полный передник - Torso (middle) (sircoat, tunic, full apron, sash)
function EarLayer: Byte; // 0x12 - Серьги - Earrings
function ArmsLayer: Byte; // 0x13 - Руки (локти) - Arms
function CloakLayer: Byte; // 0x14 - Плащ - Back (cloak)
function BpackLayer: Byte; // 0x15 - Сумка персонажа - Backpack
function RobeLayer: Byte; // 0x16 - Роба - Torso (outer) (robe)
function EggsLayer: Byte; // 0x17 - Юбка, килт - Legs (outer) (skirt/kilt)
function LegsLayer: Byte; // 0x18 - Ноги (плейтовые) - Legs (inner) (leg armor)
function HorseLayer: Byte; // 0x19 - Седло (если верхом) - Mount (horse, ostard, etc)
function RstkLayer: Byte; // 0x1A - Товарный бекпак 1 у вендора - NPC Buy Restock container
function NRstkLayer: Byte; // 0x1B - Товарный бекпак 2 у вендора - NPC Buy no restock container
function SellLayer: Byte; // 0x1C - Товарный бекпак 3 у вендора - NPC Sell container
function BankLayer: Byte; // 0x1D - Банковский контейнер - PC Bank Box
Внимание!!! ВСЕ ДВУРУЧНЫЕ Итемы (топоры и тд) одеваются в левую руку (LhandLayer), несмотря на картинку папердола в клиенте!!!

{LayerInfo}
function ObjAtLayer(LayerType: Byte): Cardinal; // Возвращает ID обьекта object находящегося на указаном слое LayerType
function ObjAtLayerEx(LayerType: Byte; PlayerID: Cardinal): Cardinal; // Возвращает ID обьекта object находящегося на указаном слое LayerType у чара PlayerID
function GetLayer(Obj: Cardinal): Byte; // Возвращает слой layer в котором находится обьект Obj

{Layer dress/undress}
function WearItem(Layer: Byte; Obj: Cardinal): Boolean; // Проверка на каком слое находится обьект
function disarm: Boolean; // Разооружиться
function equip(Layer: Byte; Obj: Cardinal): Boolean; // Одеть вещь на казанный слой
function equipt(Layer: Byte; ObjType: Word): Boolean; // Одеть вещь найденную в бвкпаке на указанный слой
function unequip(Layer: Byte): Boolean; // Снять вещь с указанного слоя (вещь падает в пак)
function undress: Boolean; // Снять всю одежду
DressSpeed: Word; // пауза между снятием каждой вещи. (По умолчанию 100 мс)
function DressSavedSet: Boolean; // Одевание сохраненного набора одежды
function EquipDressSet: Boolean; // Одевание сохраненного набора одежды
procedure SetDress; // Сохранение набора одежды/екипировки

{Count/CountGround}
function Count(ObjType: Word): Integer; // количество обьектов по типу в бакпаке
function CountGround(ObjType: Word): Integer; // количество обьектов по типу на земле
function CountEx(ObjType,Color: Word; Container: Cardinal): Integer; // количество обьектов по типу и цвету в контейнере

{Reagents}
function BP: Word; // BlackPearl
function BM: Word; // BloodMoss
function GA: Word; // Garlic
function GS: Word; // Ginseng
function MR: Word; // MandtrakeRoot
function NS: Word; // NightShade
function SA: Word; // SulfurusAsh
function SS: Word; // SpiderSilk

{String functions}
function BMSearch(StartPos: Integer; const S,P: String): Integer; // Возвращает первое вхождение подстроки в строке
Пример:

Code: Select all

BMSearch(1, 'dsade', 'de')
в данном примере ф-ия возвратит число 4
1 - это позиция с которой ищем подстроку в строке
procedure StrBreakApart(const S,Delimeter: String; Parts: TStrings); // Режет строку S на подстроки, используя разделитель Delimeter. Результат запишет в Parts

{Shop}
procedure AutoBuy(ItemType: Word; ItemColor: Word; Quantity: Word); // Добавление ловушки на меню покупки. Если Quantity = 0, то ловушка снимается. ItemColor должен точно совпадать с цветом покупаемой вещи
procedure AutoBuyEx(ItemType: Word; ItemColor: Word; Quantity: Word; Price: Cardinal; Name: String); // Добавление ловушки на меню покупки с учетом цены
name - полное либо часть имени
price - максимальная цена, за которую стоит купить
// если используется имя, то тип можно вогнать в ноль

Пример:

Code: Select all

AutoBuyEx(0,$0000,50, 0, 'garli'); 
function GetShopList: TStringList; // возвращает результатом стринглист типа
// при появлении следующего меню - старый шоп-лист затирается.

// !!! Использовать ТОЛЬКО в таком виде - list.AddStrings(GetShopList);
// !!! Работает только при выключенном silentmode, смотреть procedure SetSilentMode(Value: Boolean);


Пример:

Code: Select all

Program New; 
var 
i: Integer; 
List: TStringList; 
begin 
  list:= TStringList.Create; 
  uosay('buy'); 
... 
  list.AddStrings(GetShopList); 
  for i:= 0 to List.Count-1 do 
...    
  list.free;      
end.
Результат::
16:08:47 [Ged]: l: 30 ID: $70BE01DB type $0F86 Color 0000 Name mandrake root Price 9 Cliloc mandrake root Quantity 50
16:08:47 [Ged]: l: 29 ID: $70BE01D9 type $0F85 Color 0000 Name ginseng Price 7 Cliloc ginseng Quantity 50
16:08:47 [Ged]: l: 28 ID: $70BE01D8 type $0F84 Color 0000 Name garlic Price 9 Cliloc garlic Quantity 50
16:08:47 [Ged]: l: 27 ID: $70BE01D7 type $0F7B Color 0000 Name blood moss Price 13 Cliloc blood moss Quantity 50
16:08:47 [Ged]: l: 26 ID: $70BD15B0 type $0F8C Color 0000 Name sulphurous ash Price 9 Cliloc sulphurous ash Quantity 50
... тут еще 20 строк таких же ...
16:08:47 [Ged]: l: 3 ID: $70A44457 type $1F3E Color 0000 Name Fireball scroll Price 101 Cliloc Fireball scroll Quantity 5
16:08:47 [Ged]: l: 2 ID: $70A44450 type $1F3D Color 0000 Name Bless scroll Price 166 Cliloc Bless scroll Quantity 5
16:08:47 [Ged]: l: 1 ID: $70A4444A type $0EFA Color 0000 Name spellbook Price 49 Cliloc spellbook Quantity 2
16:08:47 [Ged]: l: 0 ID: $70A44441 type $1F14 Color 0000 Name recall rune Price 16 Cliloc recall rune Quantity 5

function GetAutoBuyMode: Boolean; // УДАЛЕНО
procedure SetAutoBuyMode(Value: Boolean); // УДАЛЕНО
function GetAutoBuyDelay: Word; // Запросить текущую задержку между появлением Buy меню и покупкой вещей
procedure SetAutoBuyDelay(Value: Word); // Установить задержку на скупку. Время задается в секундах. По умолчанию - 3 (минимальное значение)
procedure AutoSell(ItemType: Word; ItemColor: Word; Quantity: Word); // Добавление ловушки на меню продажи. Если Quantity = 0, то ловушка снимается. ItemColor должен точно совпадать с цветом продаваемой вещи
function GetAutoSellDelay: Word; // Запросить текущую задержку между появлением Sell меню и продажей вещей
procedure SetAutoSellDelay(Value: Word); // Установить задержку на продажу. Время задается в секундах. По умолчанию - 3 (минимальное значение)

{TileWorking}
function GetTileFlags(Group: Byte; Tile: Word): Cardinal; // Узнать флаг тайла
function ConvertIntegerToFlags(Group: Byte; I: LongWord): TTileDataFlagSet; // Преобразование флага из числового формата в текст
function GetTileDetails(Group: Byte; Graphic: Word): TStaticTileData; // Получение информации о тайле

TStaticTileData = record
Flags : LongWord;
Weight : Byte;
Quality : Byte;
wUnknown: Word;
bUnknown: Byte;
Quantity: Byte;
AnimID : Word;
bSpacer : Byte;
Hue : Byte;
wSpacer : Word;
Height : Byte;
Name : Array[0..19] of Char;

function GetSurfaceZ(X,Y: Word; WorldNum: Byte): ShortInt; // получение Z координаты на земле. дома, статика в городах и прочее - не считаются.

function GetWorldCell(X,Y: Word; WorldNum: Byte): TWorldCell; // Получить мировую ячейку в заданных координатах
function IsWorldCellPassable(CurrX,CurrY, DestX,DestY: Word; WorldNum: Byte; Z: ShortInt): Boolean; // проверка на проходимость тайла
//
CurrX,CurrY - это координаты той точки, из которой чар будет ступать на точку назначения (DestX, DestY).
// параметр
Z - это Z точки, с которой будет шагание на точку назначения. Если поставить его нулем - то если Z на самом деле сильно отличается от нуля - можно получить неверный результат.

function GetLandTilesArray(Xmin,Ymin,Xmax,Ymax: Word; WorldNum: Byte; TileType: Word; var LandTilesArray: TFoundTilesArray): Word; // Получение массива тайлов по типу
function GetStaticTilesArray(Xmin,Ymin,Xmax,Ymax: Word; WorldNum: Byte; TileType: Word; var FoundTilesArray: TFoundTilesArray): Word; // Получение массива статик тайлов по типу

TFoundTile = record
X : SmallInt;
Y : SmallInt;
Z : ShortInt;
Tile : Word;
end;
type TFoundTilesArray = array[0..999] of TFoundTile;

Пример 1:

Code: Select all

b:= GetStaticTilesArray(1244, 1422, 1356, 1532, 1, 3296, a); 
AddToSystemJournal('Tile Count : ' + IntToStr(b)); 
AddToSystemJournal('X ' + IntToStr(a[0].X) + ' Y ' + IntToStr(a[0].Y) + ' Z ' + IntToStr(a[0].Z) + ' Tile ' + IntToStr(a[0].Tile)); 
Результат::
20:36:12 [Local Admin - Asma2]: Compiled succesfully
20:36:12 [Local Admin - Asma2]: Tile Count : 39
20:36:12 [Local Admin - Asma2]: X 1244 Y 1428 Z 0 Tile 57344

Пример 2:

Code: Select all

b:= GetLandTilesArray(1197, 1810, 1203, 1816, 9, 1, a); 
AddToSystemJournal('Tile Count : ' + IntToStr(b)); 
AddToSystemJournal('X ' + IntToStr(a[0].X) + ' Y ' + IntToStr(a[0].Y) + ' Z ' + IntToStr(a[0].Z) + ' Tile ' + IntToStr(a[0].Tile)); 
Результат::
20:52:26 [Local Admin - Asma2]: Compiled succesfully
20:52:28 [Local Admin - Asma2]: Tile Count : 48
20:52:28 [Local Admin - Asma2]: X 1197 Y 1810 Z 0 Tile 2304

function WorldNum: Byte; // Возвращает номер мира
0 - Felucca (Britannia)
1 - Trammel (Britannia_alt)
2 - Ilshenar
3 - Malas
4 - Tokuno

function GetLayerCount(X,Y: Word; WorldNum: Byte): Byte; // Возвращает количество слоев в точке

function ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell; // Возвращает тип тайла с координатами и цветом, а так же количество слоев

TStaticCell = packed record
Statics : Array of TStaticItem;
StaticCount : Byte;
end;

TStaticItem = record
Tile : Word;
X : Byte;
Y : Byte;
Z : ShortInt;
Color : Word;
end;
уточнение - X Y - это НЕ мировые XY, их НЕ надо использовать!

function GetStaticTileData(Tile: Word): TStaticTileData; // Возвращает информацию по типу тайла

TStaticTileData = record
Flags : LongWord;
Weight : Byte;
Quality : Byte;
wUnknown: Word;
bUnknown: Byte;
Quantity: Byte;
AnimID : Word;
bSpacer : Byte;
Hue : Byte;
wSpacer : Word;
Height : Byte;
Name : Array[0..19] of Char;
end;

function GetLandTileData(Tile: Word): TLandTileData; // Возвращает информацию по типу тайла

TLandTileData = record
Flags : Cardinal;
TextureID : Word;
Name : array[0..19] of Char;
end;

function GetMapCell(X,Y: Word; WorldNum: Byte): TMapCell; // Возвращает тип тайла и его высоту

TMapCell = record
Tile : Word;
Z : ShortInt;
end;

Пример:

Code: Select all

var
    X0,Y0,Z0,Tile: Word;
    Tile0: TStaticCell;
    C,W0: Byte;
begin 
  repeat
      X0:=GetX(Self);
      Y0:=GetY(Self);
      Z0:=GetZ(Self);
      W0:=WorldNum;
      Tile0:=ReadStaticsXY(X0,Y0,W0);
      C:=GetLayerCount(X0,Y0,WorldNum);
      Addtosystemjournal('GetLayerCount = '+IntToStr(c)+' | X = ' +IntToStr(X0)+' | Y = ' +IntToStr(Y0)+' | Z = '+IntToStr(Z0)+' | World = ' +IntToStr(W0));
      Addtosystemjournal('Layers = '+IntToStr(Tile0.StaticCount)+' | Tile = ' +IntToStr(Tile0.Statics[0].Tile)+
      ' | X = ' +IntToStr(Tile0.Statics[0].X)+' | Y = ' +IntToStr(Tile0.Statics[0].Y)+' | Z = ' +IntToStr(Tile0.Statics[0].Z)+' | Color = ' +IntToStr(Tile0.Statics[0].Color));
      Addtosystemjournal('Tile = ' +IntToStr(GetMapCell(X0,Y0,WorldNum).Tile)+' | Z = ' +IntToStr(GetMapCell(X0,Y0,WorldNum).Z));
      Tile:= (GetMapCell(X0,Y0,WorldNum).Tile);
      Addtosystemjournal('Flags = '+IntToHex(GetLandTileData(Tile).Flags,8)+' | TextureID = ' +IntToStr(GetLandTileData(Tile).TextureID));
      Addtosystemjournal('Flags = '+IntToHex(GetStaticTileData(Tile).Flags,8)+' | Weight = ' +IntToStr(GetStaticTileData(Tile).Weight)+' | Height = ' +IntToStr(GetStaticTileData(Tile).Height));

  until (1<>1);
end.
Результат::
20:52:27 [TeVePuzik_4]: GetLayerCount = 1 | X = 2418 | Y = 176 | Z = 0 | World = 0
20:52:27 [TeVePuzik_4]: Layers = 1 | Tile = 1340 | X = 2418 | Y = 176 | Z = 0 | Color = 0
20:52:27 [TeVePuzik_4]: Tile = 559 | Z = 53
20:52:27 [TeVePuzik_4]: Flags = 00000040 | TextureID = 559
20:52:29 [TeVePuzik_4]: Flags = 00006010 | Weight = 255 | Height = 20


{Other needed function}
procedure Beep; // Пищит спикером, Веер он и в африке Веер :)
function PlayWav(FileName: String): Boolean; // Проигрывает Wav файл, желательно указывать путь к файлу

procedure FillNewWindow(S: String); // Добавляет строку в новое окно (то самое, в которое выводится getgumpsfulltext), по типу того окна, что в инже появлятся после ,info и т.п.
procedure SetSilentMode(Value: Boolean); // по умолчанию SilentMode уже включен
// Если его выключить - то по приходу buymenu стелсу - в новое окно посыпется все содержимое buy-list'а. (подробнее - FillNewWindow)

procedure Alarm; // Мигает иконкой стелса в трее. Сбрасывается при разворачивании стелса из трея.
procedure SetEasyUO(Num: Integer; Regvalue: String); // Переменная EasyUO: получить значение, через реестр кидается из Изи
function GetEasyUO(Num: Integer): String; // Переменная EasyUO: установить значение, через реестр кидается в Изи
function EUO2Type(EUO: String): Word; // Функция перевода форматов EUO в Stealth и обратно
function EUO2ID(EUO: String): Cardinal; // Функция перевода форматов EUO в Stealth и обратно
procedure RequestStats(ObjID: Cardinal); // Запрос стат-окна
procedure HelpRequest; // Хелп через папердол
procedure RenameMobile(Mob_ID: Cardinal; NewName: String); // Переименование животного, если может быть переименован вами - тогда будет поставлено новое имя, если нет - ничего не произойдет

{Mover}
function Raw_Move(Direction: Byte; Running: Boolean): Boolean; // Сделать шаг по направлению
function Step(Direction: Byte; Running: Boolean): Byte; // тоже что и Raw_Move
Running - флаг; True = бег, False = ходьба
Direction:
7 - NW
6 - W
5 - SW
4 - S
3 - SE
2 - E
1 - NE
0 - N

procedure SetBadLocation(X,Y: Word); // Установить локации с координатами флаг "Непрходимый" на 15 мин
procedure ClearBadLocationList; // Очистить "Непроходимые" локации
procedure SetBadObject(ObjType,Color: Word; Radius: Byte); // пометить обьект "плохой", касается только динамики
// в этом списке нет временного лимита, обьект заносится сюда насовсем, пока список не обнулится ClearBadObjectList либо до дисконнекта
// Radius пока еще не работает, будет работать для поиска пути

procedure ClearBadObjectList; // Очистить список "плохих" обьектов

TTileDataFlagSet:
TTileDataFlags = (
tsfBackground,
tsfWeapon,
tsfTransparent,
tsfTranslucent,
tsfWall,
tsfDamaging,
tsfImpassable,
tsfWet,
tsfUnknown,
tsfSurface,
tsfBridge,
tsfGeneric,
tsfWindow,
tsfNoShoot,
tsfPrefixA,
tsfPrefixAn,
tsfInternal,
tsfFoliage,
tsfPartialHue,
tsfUnknown1,
tsfMap,
tsfContainer,
tsfWearable,
tsfLightSource,
tsfAnimated,
tsfNoDiagonal,
tsfUnknown2,
tsfArmor,
tsfRoof,
tsfDoor,
tsfStairBack,
tsfStairRight,


tlfTranslucent,
tlfWall,
tlfDamaging,
tlfImpassable,
tlfWet,
tlfSurface,
tlfBridge,
tlfPrefixA,
tlfPrefixAn,
tlfInternal,
tlfMap,
tlfUnknown3);
TTileDataFlagSet = set of TTileDataFlags;

// то, что отделено (нижняя часть) - это и есть те флаги, что могут вернуться, если указать первую группу.

Пример:

Code: Select all

Program New; 
var   FlagSet: TTileDataFlagSet; 
begin 
// флаги, что соответствуют 67117569 
// [tdfBackground,tdfSurface,tdfNoShoot,tdfUnknown2] 
FlagSet:= ConvertIntegerToFlags(67117569); 
IF tdfSurface in FlagSet then 
AddToSystemJournal('surface');  
IF tdfImpassable in FlagSet then 
AddToSystemJournal('impass');  
end. 
function MoveXY(Xdst,Ydst: Word; Optimized: Boolean; Accuracy: Integer; Running: Boolean): Boolean; // Поиск пути.
Accuracy - точность приближения: 0 - прямо на точку, 1 - рядом в радиусе одного тайла и т.д. длина ограничена 1000 точек(тайлов).
Optimized - включать настоятельно рекомендуется только на поиске пути длиной до 200 точек.

// Когда выключено - идет поиск просто пути, когда включен - оптимального.
function GetPathArray(DestX,DestY: Word; Optimized: Boolean; Accuracy: Integer; var PathArray: TPathArray): Integer; // возвращает кол-во точек в маршруте,
// в PathArray пишет массив шагов пути. первый - это координаты точки первой от старта и т.д. до последней. Ограничено 1000 точек.
Alexej
Novice
Novice
Posts: 79
Joined: 06.06.2008 11:55
Contact:

Post by Alexej »

Работа со строкой:

function StrGet(var S: String; I: Integer): Char; // Возвращает символ из позиции "i" строки "s"
procedure StrSet(C: Char; I: Integer; var S: String); // Устанавливает символ "c" в позиции "i" строки "s"
function Uppercase(S: String): String; // Функция UpperCase создает копию "s" со всеми символами преобразованными в верхний регистр
function Lowercase(S: String): String; // Функция LowerCase создает копию "s" со всеми символами, преобразуя их в строчные буквы
function AnsiUppercase(S: String): String; // Функция AnsiUpperCase создает копию "s" со всеми символами преобразованными в верхний регистр
// Все Ansi команды поддерживают многобайтовые символы и символы с диакритическим знаком

AnsiLowercase(S: String): String; // Функция AnsiLowerCase создает копию "s" со всеми символами, c преобразованием в строчные буквы
// Все Ansi команды поддерживают многобайтовые символы и символы с диакритическим знаком

function Trim(S: String): String; // Функция Trim удаляет пробельные и управляющие символы (такие как перевод строки) в начале и в конце строки
procedure SetLength(var S: String; L: LongInt); // Процедура SetLength изменяет размер строки, одномерного динамического массива или многомерного динамического массива
function Padl(S: String; I: LongInt): String; // Дополнение строки s пробелами слева до длины l
function Padr(S: String; I: LongInt): String; // Дополнение строки s пробелами справа до длины l
function Padz(S: String; I: LongInt): String; // Дополнение строки s символами '0' слева до длины l
function Replicate(C: Char; I: LongInt): String; // Создание строки из символов c длиной l
function StringOfChar(C: Char; I: LongInt): String; // Создает строку из одного символа, повторенного много раз, создает новую строку длиной "I", заполненную символами "c". Функция аналогичная Replicate

Функции преобразования форматов:

function Round(e: Extended): LongInt; // Округляет значение "e" - число с плавающей запятой до целого
// Если "e" - точно посередине между двумя целыми числами, возвраща-ется число с наибольшей абсолютной величиной.
// Если округленное значение "e" выходит за диапазон LongInt, генерируется ошибка времени выполнения программы, которую вы можете обработать с использованием исключительной ситуации EInvalidOp

function Trunc(e: Extended): LongInt; // Усекает значение число с плавающей запятой до целого.
// Если округленное значение "e" выходит за диапазон LongInt, генерируется ошибка времени выполнения программы, которую вы можете обработать с использованием исключительной ситуации EInvalidOp

function Int(e: Extended): Extended; // Функция Int возвращает целочисленную часть числа с плавающей точкой, как число с плавающей точкой
function StrToInt(S: String): LongInt; // Функция StrToInt конвертирует строку с целым значением в целое число Int
function IntToStr(I: Integer): String; // Функция IntToStr преобразует целое число Int в строку
function StrToInt64(S: String): Int64; // Функция StrToInt64 конвертирует строку с целым значением - "s", такую как '123', в целое Int64
// Она поддерживает положительные и отрицательные значения, шестнадцатеричные числа с префиксов $ или 0x

function Int64ToStr(I: Int64): String; // Функция Int64ToStr преобразует целое число Int64 в строку
function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision, Digits: Integer): string; //форматированный перевод чисел с плавающей запятой в строку.
//кто не знает как этим пользоваться - вперед в гугл.


function IntToHex(Value: Integer; Digits: Integer): String; // Перевод Int в Hex, где Value - значение, Digits - битность (2,4,8 )
function Random(const ARange: Integer): Integer; // Получить рандомное значение из диапазона 0 < = X < ARange.
procedure Randomize; // Инициализирует встроенный генератор случайных чисел произвольным значением (полученным из часов системы).
function RandomRange(const AFrom,ATo: Integer): Integer; // Получить рандомное значение в диапазоне AFrom <= X <= ATo

Пример:

Code: Select all

   x:= Round(Random(2));
   Addtosystemjournal('X = '+IntToStr(x));
Прочие функции и процедуры:

function GetArrayLength(var v: array): Integer; // Возвращает длину массива v
procedure SetArrayLength(var v: array; I: Integer); // Устанавливает длину i для динамического массива v
function Sin(e: Extended): Extended; // Возвращает синус аргумента, "e" - число с плавающей запятой. Sin возвращает синус угла "e" в радианах
function Cos(e: Extended): Extended; // Возвращает косинус аргумента, "e" - число с плавающей запятой. Sin возвращает косинус угла "e" в радианах.
function Sqrt(e: Extended): Extended; // Возвращает квадратный корень аргумента, "e" - число с плавающей запятой. Результат - квадратный корень "e"
function Pi: Extended; // Возвращает значение Pi, которое определено как 3.1415926535897932385
function SizeOf(c: const): LongInt; // Функция SizeOf возвращает занимаемый размер (в байтах) переменной "c"







Классы:



TStrings // наследник от TPersistent
// Абстрактный класс TStrings инкапсулирует поля и методы для работы с наборами строк, предназначен для хранения набора строк и не используется в программах непосредственно.
// Если же нам в программе нужен просто набор строк, то следует использовать экземпляр класса TStringList, который является потомком класса TStrings.

Methods:
function Add(S: String): Integer; // Добавляет строку в набор данных и возвращает ее индекс
procedure Append(S: String); // То же, что Add, но не возвращает индекс вставленной строки
procedure AddStrings(Strings: TStrings); // Добавляет к текущему набору новый набор строк
procedure Clear; // Очищает набор данных и освобождает связанную с ним память
procedure Delete(Index: Integer); // Уничтожает элемент набора с индексом Index и освобождает связанную с ним память
function IndexOf(const S: String): Integer; // Для строки S возвращает ее индекс или -1, если такой строки в наборе нет
procedure Insert(Index: Integer; S: String); // Вставляет строку в набор и присваивает ей индекс Index
procedure LoadFromFile(FileName: String); // Загружает набор из файла
procedure SaveToFile(FileName: String); // Сохраняет набор в файле
Property:
property Count: Integer; // Интерпретирует все строки списка в виде одной длинной строки
property Text: String; // Интерпретирует набор строк в виде одной длинной строки с разделителями eoln между отдельными строками набора
property CommaText: String; // Служит для установки или получения всего набора строк в виде единой строки с кавычками и запятыми (см. ниже пояснения) Текущее количество строк в наборе
property Strings[Index: Integer]: String; // Открывает доступ к строке с индексом Index
property Objects[Index: Integer]: TObject; // Открывает доступ к объекту, связанному со строкой с индексом Index

TStringList // наследник от TStrings
// Элементы в строковом списке могут быть вставлены, перемещены и отсортированы.Список может быть сформирован строка за строкой, или загружен из большой строки разделенной запятой или из текстового файла.
// Является наследником TStrings и служит для организации списков строк, которые используются отдельно от управляющих элементов. Объекты TStringList хранят строки и объекты в динамической памяти.

Methods:
function Find(S: String; var Index: Integer): Boolean; // Ищет в наборе строку S и в случае успеха в параметре index возвращает ее индекс
procedure Sort; // сортирует строки в возрастающем порядке (алфавитном)
Property:
property Duplicates: TDuplicates; // Свойство, позволяющее управлять возможностью размещения в наборе двух и более идентичных строк
property Sorted: Boolean; // Признак необходимости сортировки строк в алфавитном порядке
property OnChange: TNotifyEvent; // Определяет реакцию на изменение набора строк. Событие OnChange генерируется после того, как были сделаны изменения
property OnChanging: TNotifyEvent; // Определяет реакцию на изменение набора строк. Событие OnChanging генерируется перед тем, как будут сделаны изменения

TStream // наследник от TObject, соответственно унаследовал все его свойства и методы
// Абстрактный поток, от которого наследуются все остальные, и который является основой для работы с файлами как с объектами.
// Свойства и методы класса TStream образуют базовый интерфейс потоковых объектов.
// Обеспечивает выполнение основных операций потока безотносительно к реальному носителю информации.
// Основными из них являются чтение и запись данных.

Methods:
function Read(Buffer: String; Count: LongInt): LongInt; // читает Count байт из потока в буфер Buffer, продвигает текущую позицию на Count байт вперед и возвращает число прочитанных байт. Если значение функции меньше значения Count, то в результате чтения был достигнут конец потока
function Write(Buffer: String; Count: LongInt): LongInt; // записывает в поток Count байт из буфера Buffer, продвигает текущую позицию на Count байт вперед и возвращает реально записанное количество байт. Если значение функции отличается от значения Count, то при записи была ошибка
function Seek(Offset: LongInt; Origin: Word): LongInt; // продвигает текущую позицию в потоке на Offset байт относительно позиции, заданной параметром Origin. Параметр Origin может иметь одно из следующих значений:
// 0 - смещение задается относительно начала потока; 1 - смещение задается относительно текущей позиции в потоке; 2 - смещение задается относительно конца потока

procedure ReadBuffer(var Buffer; Count: LongInt); // читает из потока Count байт в буфер Buffer и продвигает текущую позицию на Count байт вперед. Если выполняется попытка чтения за концом потока, то генерируется ошибка
procedure WriteBuffer(const Buffer; Count: LongInt); // записывает в поток Count байт из буфера Buffer и продвигает текущую позицию на Count байт вперед. Если по какой-либо причине невозможно записать все байты буфера, то генерируется ошибка
function CopyFrom(Source: TStream; Count: LongInt): LongInt; // копирует Count байт из потока Source в свой поток
Property:
property Position: LongInt; // текущая позиция чтения-записи
property Size: LongInt; // текущий размер потока в байтах

THandleStream // наследник TStream и является родителем класса TFileStream
// Поток, который хранит свои данные в файле. Класс THandleStream инкапсулирует поток, связанный с физическим носителем данных
// через дескриптор - для чтения-записи файла используется дескриптор (handle), поэтому поток называется дескрипторным.
// Дескриптор - это номер открытого файла в операционной системе. Его возвращают низкоуровневые функции создания и открытия файла.
Для создания потока используется конструктор:

constructor Create(AHandle: Integer); // в параметре которого передается дескриптор
Впоследствии доступ к дескриптору осуществляется через свойство:

Property:
property Handle: Integer;

TFileStream // наследник THandleStream
constructor Create(FileName: String; Mode: Word); // Создать файл с правами доступа (Mode):
fmOpenRead: LongInt; = $0000; // чтение
fmOpenWrite: LongInt; = $0001; // запись
fmOpenReadWrite: LongInt; = $0002; // чтение/запись
fmShareExclusive: LongInt; = $0010; // занимает файл и пока не освободит, другие программы с ним ничего делать не могут, даже прочитать
fmShareDenyWrite: LongInt; = $0020; // занимает файл и пока не освободит, другие программы имею доступ только на чтение
fmShareDenyNone: LongInt; = $0040; // никак не блокировать файл

Пример:

Code: Select all

aStream:= TFileStream.Create(Dir + 'file.txt', fmOpenRead + fmShareDenyNone);
TCustomMemoryStream // наследник TStream
procedure SaveToStream(Stream: TStream); // Записать набор в поток
procedure SaveToFile(FileName: String); // Записать набор в файл

TMemoryStream // наследник TCustomMemoryStream
procedure Clear; // Освобождает память от набора данных, занимаемую ими
procedure LoadFromStream(Stream: TStream); // Загрузить набор из потока
procedure LoadFromFile(FileName: String); // Загрузить набор из файла
procedure SetSize(NewSize: LongInt); // Установить размер потока в байтах
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

Alexej wrote:TStringList
function Find(S: String; var Index: Integer): Boolean; // Ищет в наборе строку S и в случае успеха в параметре index возвращает ее индекс
{ Find will only work on sorted lists! } - из справки дэльфей

это к вопросу про то, почему файнд в стринглистах работает некорректно - в несортированных он или вообще не работает, или выдает некорректный результат
так что перед Find надо сделать Sort, либо выставить Sorted в True при создании строчного списка (второй вариант куда быстрее)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

procedure OpenDoor; //работает как аналогичная команда в клиенте

------------------------------------------
добавлена команда

WaitTextEntry(Value : String);
работает как нормальная классическая ловушка - можно вызывать и до, и после прихода поля ввода.

использовать с такими полями ввода:
Image
Last edited by Vizit0r on 24.08.2009 21:36, edited 1 time in total.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

пара мелких FAQ
Vizit0r wrote:К вопросу о статике:
допустим есть здание в городе. двухэтажное.
что есть точка в здании(одна точка) ? это:
1) земля под низом.
2) пол
3) например, стол на первом этаже
4) пол второго этажа
5) например, стол на втором этаже
6) крыша (иногда это не один слой, ну да пусть для простоты будет один)

итого, имеем - одну (ВСЕГДА одну) клетку земли. - берется через GetMapCell
и 5 слоев статики, стоящих поверх земли


работа со статикой:

ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell;
возвращает
TStaticCell = packed record
Statics : Array of TStaticItem;
StaticCount : Byte;
end;

TStaticItem = record
Tile : Word;
X : Byte;
Y : Byte;
Z : ShortInt;
Color : Word;
end;

где StaticCount - кол-во слоев в этой точке, а статик - это массив с кол-вом элементов, равному StaticCount.
при StaticCount = 10, можно брать от Statics[0] до Statics[9], а взятие Statics[10] выдаст либо выход за диапазон либо неправильные данные

чтобы узнать например, высоту пола второго этажа:
примем за условие, что мы знаем тип пола
a := ReadStaticsXY(X,Y, WorldNum);
for i := 0 to a.StaticCount -1 do
if a.Statics.Tile = нужный_номер_тайла then
begin
делаем что-то с a.Statics.Z
end;


----------------------------------------------------------------------------------
К вопросу о меню:
нет смысла использовать в цикле WaitMenu, постоянно его устанавливая - если в меню всегда выбираются одни и те же элементы (а именно так и происходит в 99% случаев).
Что есть WaitMenu - это как раз и есть тот же AutoMenu, только срабатываемый один раз.
Так что (на примере инскрипта) кда лучше и надежнее поставить что-то типа

Code: Select all

AutoMenu('circle','4');
AutoMenu('spell','Recall');
перед циклом, чем выстраивать конструкции вида

Code: Select all

while ... do
  begin
    WaitMenu('circle','4');
    WaitMenu('spell','Recall');
    ...вызов меню, кидание таргетов....
  end;
ведь ключевое в меню - это его заголовок, то что в этих функциях идет первым параметром. и можно сделать хоть 10 AutoMenu\WaitMenu подряд, главное чтоб заголовок был разный.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

кстати, для меню в качестве ответа можно использовать не только строку, а также и:
1) число - номер элемента.
2)'first' - первый элемент
3) 'last' - последний
4) 'random' - случайный элемент
5) 'сancel' - отмена. возможно, не работает - либо работает не везде. для гарантированной отмены - лучше использовать CloseMenu

Важная оссобеность - все эти перечисленные варианты (кроме обычной строки с частью ответа) должны идти в скобках.
например
'(2)'
'(random)'
и т.д.
Last edited by Vizit0r on 08.09.2010 13:48, edited 1 time in total.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MuDaCk
Apprentice
Apprentice
Posts: 393
Joined: 10.10.2006 0:03
Contact:

Post by MuDaCk »

В третьем стелсе(RC3) появилась возможность отправки сообщений через ICQ. Вот некоторые полезные процедурки:

Code: Select all

procedure ICQConnect(UIN,password : String); 
UIN - это ваш логин
Password - это ваш пароль
например :

Code: Select all

ICQConnect('123456','445566');
Следующая

Code: Select all

procedure ICQDisconnect; 
дисконект ICQ(что и видно из названия :roll: )
Важно:
Слишком часто жать конект-дисконект не рекомендуется, а то будет больно(Сервер ICQ таких людей не уважает и может вас наказать разными неприятными вещами : долго и безрезультатно будете конектиться и т.д.).




Следующая

Code: Select all

procedure ICQSetXStatus(Num : Byte); 
Выбор Х- статуса, список статусов ниже(сначала номер, а потом что значит):
  • 1 ---выкл---
    2 ANGRY
    3 DUCK
    4 TIRED
    5 PARTY
    6 BEER
    7 THINK
    8 EAT
    9 TV
    10 FRIENDS
    11 COFFEE
    12 MUSIC
    13 BUSINESS
    14 CINEMA
    15 FUNNY
    16 PHONE
    17 GAMES
    18 COLLEGE
    19 SHOP
    20 SICK
    21 SLEEP
    22 SURF
    23 INTERNET
    24 WORK
    25 TYPING
    26 UNK
    27 PPC
    28 MOBILE
    29 MAN
    30 WC
    31 POISK
    32 GEOMETR
    33 LOVE
    34 RuSearch
    35 RuLove
    36 RuJournal
например :

Code: Select all

If Connected  Then ICQSetXStatus(6);
Следующая

Code: Select all

procedure ICQSetStatus(Num : Byte); 
Выбор статуса, список статусов ниже(сначала номер, а потом что значит):
  • 1 Онлайн
    2 Невидимый
    3 Отошёл
    4 Недоступен
    5 Занят
    6 Не беспокоить
    7 Готов поболтать
    8 @Дома
    9 @Злой
    10 @Депрессия
    11 @На работе
    12 @Кушаю
например:

Code: Select all

If Connected  Then ICQSetStatus(12);
Следующая

Code: Select all

procedure ICQSendText(DestinationUIN, Text : String);
отправка сообщения по адресу "DestinationUIN"
Например :

Code: Select all

If Connected  Then ICQSendText(123456, 'Enemy spoted. Need Help!!!');

И напоследок одна интересная вещь: Сообщения ,приходящие на вашу подконекченную в стелсе аську, пишутся в журнал, откуда их можно достать функциями работы с журналом.
Last edited by MuDaCk on 30.09.2010 14:48, edited 1 time in total.
My name is Игорёшка Image
Пишу скрипты за едуImage
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

довесок: ошибки асевого модуля, выдрано из исходника.

Code: Select all

            $07: // Invalid account
              OnIntError(Self, ERR_LOGIN_BAD_UINORPASSW,'Connection failed. Your ICQ number or password was rejected.');
            $15: // Reservation link error
              OnIntError(nil, ERR_LOGIN,'Connection failed. The server is temporally unavailable.');
            $17: // The users num connected from this IP has reached the maximum (reserved)
              OnIntError(nil, ERR_LOGIN,'Connection failed. Server has too many connections from your IP.');
            $1D: // Rate limit exceeded
              OnIntError(nil, ERR_LOGIN,'Connection failed. You have connected too quickly, please wait and retry 10 to 20 minutes later.');
            $1B: // You are using an older version of ICQ. Upgrade required
              OnIntError(nil, ERR_LOGIN,'Connection failed. The server did not accept this client version.');
            $1C: // You are using an older version of ICQ. Upgrade recommended
              OnIntError(nil, ERR_LOGIN,'The server sent warning, this version is getting old. Try to look for a new one.');
            $1E: // Can't register on the ICQ network
              OnIntError(nil, ERR_LOGIN,'Connection failed. You were rejected by the server for an unknown reason. This can happen if the UIN is already connected.');
            $0C: // Invalid database fields, MD5 login not supported
              OnIntError(nil, ERR_LOGIN,'Connection failed. Secure (MD5) login is not supported on this account.');
            $08, // Deleted account
            $09, // Expired account
            $0A, // No access to database
            $0B, // No access to resolver
            $0D, // Bad database status
            $0E, // Bad resolver status
            $11, // Suspended account
            $19, // User too heavily warned
            $1A, // Reservation timeout
            $22, // Account suspended due to your age
            $2A: // Blocked account
              OnIntError(nil, ERR_LOGIN,'Connection failed.'+#13#10+
               'Deleted or expired account OR'+#13#10+
               'No access to database or resolver OR'+#13#10+
               'Bad database or resolver status OR'+#13#10+
               'Suspended account OR'+#13#10+
               'User to heavily warned OR'+#13#10+
               'Reservation timeout OR'+#13#10+
               'Account suspended due to your age OR'+#13#10+
               'Blocked account'
               );
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply