Предлагаю расширенный вариант функции "Пауза". При котором можно независимо вызывать несколько пауз в разных местах скрипта.
Код:
// пауза в секундах
function Wait(var tick: integer; Timewait: Integer): Boolean;
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;
Всем доброго времени суток.
У меня пару вопросов по скрипту "инвентаризации" от QaK. Для Gracia Part2
Код:
Код:
var
ItemCount:integer;
Inventory: array[1..75,1..22]of integer;
//процедура считывания параметров одного предмета
procedure ItemAction(var Counter:integer;CurrentSlot:integer);
var c1:integer;
begin
for c1:=1 to 22 do
begin
if (c1=1)or(c1=6)or(c1=7)or(c1=8)or(c1=11) then
begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
inc(Counter);
end;
if (c1=2)or(c1=3)or(c1=4)or(c1=5)or(c1=9)or(c1=12)or(c1=13)or(c1=14)or(c1=15)or(c1=16)or(c1=17)or(c1=18)or(c1=19)or(c1=20)or(c1=21)or(c1=22) then
begin Inventory[CurrentSlot,c1]:=ReadD(Counter);
end;
if c1=10 then
begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
Counter:=Counter+2;
end;
end;
end;
//Пакет от сервера 11 - создаем или модифицируем весь инвентарь
procedure CreateItemBase;
var
i,j: integer;
begin
ItemCount:=ReadC(4);
j:=6;
for i:=1 to ItemCount do ItemAction(j,i);
end;
//Пакет от сервера 21 - действия (доавить/изменить) над одним/несколькими предметами
procedure UpdateItemBase;
var
i,ij,ijk:integer;
j:integer;
count:integer;
Action: integer;
k:boolean;
begin
k:=false;
count:=ReadC(1);
j:=4;
for i:=1 to count do
begin Action:=ReadC(j);
inc(j);
{ADD} if Action=1 then
begin Inc(ItemCount);
ItemAction(j,ItemCount);
end;
{Update}if Action=2 then for ij:=1 to ItemCount do //Ищем изменяемый предмет по ObjectID
If Inventory[ij,2]=ReadD((j-1)*22+6) then //Если нашли
begin ItemAction(j,ij); //Изменяем данные о нем
exit; //Больше проверять не надо - выходим из цикла
end;
end;
end;
//Получить ObjectID предмета, зная его ItemID
function GetInfo(ItemID:integer):integer;
var c1:integer;
begin Result:=-1;
for c1:=1 to ItemCount do
if (ItemID=Inventory[c1,3]) then
begin Result:=Inventory[c1,2];
exit;//Если нашли - выходим из цикла
end;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
begin if (pck[1]=#$11) then
begin CreateItemBase;
exit;
end;
if (pck[1]=#$21) then
begin UpdateItemBase;
exit;
end;
end;
end.
Так вот.... мне интерессно почему:
1. В оригинале скрипта:
Код:
if (c1=1)or(c1=5)or(c1=6)or(c1=7)or(c1=9) then
begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
преобразовывается в ReadC, когда в самом описании пакета идет h.
2. Для чего введена переменная "j" в procedure CreateItemBase; и procedure UpdateItemBase; и какие значения она может принимать?
3. Где задаются значения переменных для {ADD} item-а ( все его 22 параметра) т.е Для создания нового предмета мне нужно "сказать" ObjID=XXXX, ItemID=XXX и т.д Где это делается.
Как я думаю нужно создать форму с инпут параметрами, которые будут принимать вводимые мною значения и что-то типа чекбокса для выполнения действий (Action=1 и Action=2) ну и кнопку чтоб запустить нужные продцедуры. Если мои предположения верны не могли бы вы
подкинуть заготовку такой лио похожей формы.
Спасибо.
И еще 1 вопрос. Получается этот скрипт работает с инвентарем на стороне клиента.
тоесть если мы добавим/редактируем свойство item-a то это изменение произойдет только на клиентской стороне, а при повторном запросе клиентом серверу о содержимом его инвентаря, он вернет значения из БД, так как будет "тягать" данные из своей БД. В соответсвии с этим у меня вопросс: Какой смысл использования этого скрипта? =)
Последний раз редактировалось alexPPP, 30.04.2009 в 09:27.
преобразовывается в ReadC, когда в самом описании пакета идет h.
потому, что скрипт писался очень давно, не помню под какие хроники, и там я смотрел, что второй байтик всегда = 0, поэтому читал 1 байт и усё=)
2)
Цитата:
Сообщение от alexPPP
Для чего введена переменная "j" в procedure CreateItemBase; и procedure UpdateItemBase; и какие значения она может принимать?
Переменная J в CreateItemBase введена, чтоб по пакету полностью пройтись, т.к. поцедура ItemAction модифицирует значение переменной J, аналогично для UpdateItemBase.
3)
Цитата:
Сообщение от alexPPP
Где задаются значения переменных для {ADD} item-а ( все его 22 параметра) т.е Для создания нового предмета мне нужно "сказать" ObjID=XXXX, ItemID=XXX и т.д Где это делается.
Как я думаю нужно создать форму с инпут параметрами, которые будут принимать вводимые мною значения и что-то типа чекбокса для выполнения действий (Action=1 и Action=2) ну и кнопку чтоб запустить нужные продцедуры. Если мои предположения верны не могли бы вы
подкинуть заготовку такой лио похожей формы.
Значения переменных читаются из приходящего от сервера пакета. А то, что ты хочешь подменить ИД предмета называтся читерством, что очень сильно не есть гуд, это не чит-форум.
З.Ы. Скрипт глючный, сразы говорю, я его вроде не до конца профиксил. Возьми обработку инвентаря из скрипта Бот кач by Alexus или как-то так.
З.Ы.Ы. для грации нужно еще редактировать разборку пакетов и ИД пакетов для обработки.
function EncodeDate(Year, Month, Day: Word): TDateTime
перевод года, месяца и дня в формат даты
procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word)
Перевод даты в года, месяц и день
function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime
Перевод часов, минут и секунд в формат времени
procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word)
Перевод времени в часы, минуты и секунды
function Date: TDateTime
Текущая дата
function Time: TDateTime
Текущее время
function Now: TDateTime
Текущие дата и время
function DayOfWeek(aDate: DateTime): Integer
День недели
function IsLeapYear(Year: Word): Boolean
Високосный год
function DaysInMonth(nYear, nMonth: Integer): Integer
Дней в месяце
function IntToStr(i: Integer): String
Перевод целого в строку
function FloatToStr(e: Extended): String
Перевод числа с плавающей запятой в строку
function DateToStr(e: Extended): String
Перевод даты в строку
function TimeToStr(e: Extended): String
Перевод времени в строку
function DateTimeToStr(e: Extended): String
Перевод даты и времени в строку
function VarToStr(v: Variant): String
Перевод variant в строку
function StrToInt(s: String): Integer
Перевод строки в целое
function StrToFloat(s: String): Extended
Перевод строки в число с плавающей запятой
function StrToDate(s: String): Extended
Перевод строки в дату
function StrToTime(s: String): Extended
Перевод строки во время
function StrToDateTime(s: String): Extended
Перевод строки в дату и время
function Round(e: Extended): Integer
Округление до ближайшего
function Trunc(e: Extended): Integer
Округление до меньшего
function Int(e: Extended): Integer
Возвращает целую часть
function Frac(X: Extended): Extended
Возвращает дробную часть
function Sqrt(e: Extended): Extended
Возвращает квадратный корень
function Abs(e: Extended): Extended
Возвращает модуль числа
function Sin(e: Extended): Extended
Синус
function Cos(e: Extended): Extended
Косинус
function ArcTan(X: Extended): Extended
Арктангенс
function Tan(X: Extended): Extended
Тангенс
function Exp(X: Extended): Extended
Экспонента
function Ln(X: Extended): Extended
Натуральный логарифм
function Pi: Extended
Число Пи
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
Как определить, является ли символ буквой русского алфавита, буквой английского алфавита, является ли символ цифрой?
Как определить, является ли символ буквой русского алфавита?
function isAlphaRu( c: Char ): boolean;
begin
Result := Ord( c ) in [168,184,192..223,224..255];
end;
Как определить, является ли символ буквой английского алфавита?
function isAlphaEn( c: Char ): boolean;
begin
Result := Ord( c ) in [65..90,97..122];
end;
Как определить, является ли символ цифрой?
function isDigit( c: Char ): boolean;
begin
Result := Ord( c ) in [48..57];
end;
Код:
procedure Inc(var i: Integer; incr: Integer = 1)
Инкремент
procedure Dec(var i: Integer; decr: Integer = 1)
Декремент
procedure RaiseException(Param: String)
Генерация исключения
procedure ShowMessage(Msg: Variant)
Вывод сообщения
procedure Randomize
Инициализация генератора псевдослучайных чисел
function Random: Extended
Генерация псевдослучайного числа
function ValidInt(cInt: String): Boolean
Проверка валидности целого в строке
function ValidFloat(cFlt: String): Boolean
Проверка валидности цисла с плавающей запятой в строке
function ValidDate(cDate: String): Boolean
Проверка валидности даты в строке
function CreateOleObject(ClassName: String): Variant
Создание OLE-объекта
function VarArrayCreate(Bounds: Array; Typ: Integer): Variant
Создание динамического массива
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
Последний раз редактировалось TAMBIK, 13.08.2009 в 13:19.
Решил выложить свою разработку. Может, кому пригодится. Для Hellbound'а.
Суть кода: В массиве задаётся последовательность действий, это может быть просто пакет в формате строки (например '39 2A 01 00 00 00 00 00 00 00'), либо какая-то спец команда (например 'Attack').
Далее, по таймеру считываются последовательно строки массива, и то, что там записано отправляется на выполнение. Т.к. время на выполнение скилла может быть различное в зависимости от ситуации, то для такого случая я ввёл динамически изменяющееся время у таймера. Как только от серва приходит пакет с использованием скилла, скрипт считывает время использования и задаёт его таймеру + некоторая поправка.
Код:
Const
NICK='Указываете ваш ник';
var
tmrActions: TTimer; // Таймер для последовательность действий
Actions: Array[0..10, 0..2] of String; //Массив действий.
{Записываются в ячейки массива пакеты, которые нужно послать. Далее, по таймеру посылается следующий пакет из списка.
Первый индекс массива - номер действия, второй индекс:
0 - собственно действие, 1 - Параметр действия (напр. Ид скилла), 2 - время таймера до следующего действия
}
MyID, : Integer;
NumAct: Integer; // Номер текущего действия
IsSkill: Boolean; // Показывает, используем ли мы скилл в данный момент
Procedure UseSkill(ID: Integer); // Процедура использования скилла
begin
buf:=#$39;
WriteD(ID);
WriteD(0);
WriteC(0);
SendToServerEX(NICK);
end;
Procedure OntmrAction(Sender: TObject);
begin
Case Actions[NumAct, 0] of // Сдесь мы определяем тип действия.
'Attack': begin // Атаковать текущую цель
end;
'Use': begin // Использование предмета
UseItem(StrToInt(Actions[NumAct, 1])); // Эта процедура может быть разная, потому не привожу
end;
'Skill': begin // Использование скилла
UseSkill(StrToInt(Actions[NumAct, 1]));
IsSkill:= True;
end;
'-1': begin // Останов макроса
NumAct:=0;
tmrActions.Enabled:=False;
Times:=0;
exit;
end;
else begin // Если же не приведена внутренняя команда, то просто отсылаем пакет
buf:= Hstr(Actions[NumAct, 0]);
SendToServerEX(NICK);
end;
end;
NumAct:= NumAct+1;
If (IsSkill=False) then tmrActions.Interval:= StrToInt(Actions[NumAct, 2]); // Изменяем время у таймера до следующего пункта
//В случае скилла время изменяется считыванием нужного пакета
end;
procedure Init; //Вызывается при включении скрипта
begin
tmrActions:= TTimer.Create(nil);
tmrActions.OnTimer:= @OntmrAction;
tmrActions.Enabled:= False;
tmrActions.Interval:= 200;
// 6590 - Angel Slayer
// 6602 - Demon Splinter (один из ))))
// 425 - Hawk Spirit Totem
// Макрос представляет из себя: Одеть Сплинтеры, потом юзнуть Хавка, одеть АС, начать атаку
Actions[0, 0]:='Use';
Actions[0, 1]:='6602';
Actions[0, 2]:='300'; // Задаём время до следующего пункта, в мс
Actions[1, 0]:='Skill';
Actions[1, 1]:='425';
Actions[1, 2]:='2000'; // В принципе, можно и не ставить
Actions[2, 0]:='Use';
Actions[2, 1]:='6590';
Actions[2, 2]:='300';
Actions[3, 0]:='Attack';
Actions[3, 1]:='';
Actions[3, 2]:='300';
Actions[4, 0]:='-1';
MyID:= -1;
end;
procedure Free; //Вызывается при выключении скрипта
begin
tmrActions.free;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer and (ConnectName=NICK) then case pck[1] of
#$32: Begin // User Info
If (MyID <> -1) then exit;
MyID:=ReadD(18); // запоминаем наш ИД
end;
#$11: begin; // Инвентаризация барахла в карманах
InventoryCreate; // Инвентаризацию берите, какая удобнее
end;
#$21: Begin // Обновление инвентаря
InventoryUpdate;
End;
#$48: begin // MagicSkillUse
If (ReadD(2)<>MyID) Or (IsSkill=False) then Exit; // Если не мы юзаем - не обрабатываем
tmrActions.Interval:= ReadD(18)+100; // Изменяем время у таймера с учётом времени произношения скилла, 100 - небольшая добавка, чтоб лучше работало
IsSkill:= False;
end;
end;
end.
Автобег в указанную сторону: запустить скрипт, нажать "Приветствие", ткнуть мышкой в нужную сторону - бежит не останавливаясь пока не упрется. На ходу возможно изменение направления\шага пробежки. Интерлюд. Оффтоп
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
//(c) xkor
function StrToHex(packet: string):string;
var
i:integer;
tmp:byte;
function ByteToHex(b: byte): Char;
begin
if b<10 then result:=chr(b+$30)
else result:=chr(b+$37);
end;
begin
result:='';
for i:=1 to length(packet) do begin
tmp:=ord(packet[i]) div 16;
result:=result+ByteToHex(tmp);
tmp:=ord(packet[i]) - tmp*16;
result:=result+ByteToHex(tmp)+' ';
end;
end;
пример использования
Код:
hextr2:=hextostr(pck);
SHOWMESSAGE(hextr2);
[/quote]
Подскажите пожалуйста , как правильно пользоваться этой функцией? У меня при компиляции ошибку выдает .