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

Подсчет регов в бэк паке.

тут можно задать вопрос по скриптингу
Post Reply
weekend
Posts: 4
Joined: 12.07.2009 12:15

Подсчет регов в бэк паке.

Post by weekend »

Что то тут не правильно поправите меня, пытаюсь что бы при команде stats подсчитывало количество регов в паке и выводило результат.



Это начало скрипта.

Code: Select all


program XXX;
const
sunduk = $0000000;
gold = $0EED;
MadrakeRoots = $0F86;
BloodMosss = $0F7B;
BlackPearls = $0F7A;
Garlick = $0F84;
Ginseng = $0F85;
NightShades = $0F88;
SulphuruosAshs = $0F8C;
SpiderSilks = $0F8D;
var
r,i,p : integer;
s : string;
MissingReg : cardinal;
Reags : array[1..8] of cardinal;  
ctime : TDateTime;
players : array[0..35] of cardinal;

эту функцию мне нужно переделать что бы он ожидал команду например stats и выводил всю информацию

Code: Select all

function CheckReags : boolean;
begin
Result := True;
Reags[1] := $0F7B // BloodMosss
Reags[2] := $0F7A // BlackPearls
Reags[3] := $0F84 // Garlick
Reags[4] := $0F85 // Ginseng
Reags[5] := $0F86 // Madrake Roots
Reags[6] := $0F88 // NightShades
Reags[7] := $0F8C // Sulphuruos Ashs
Reags[8] := $0F8D // Spider Silks
for r := 1  to 8  do
    begin
    findtypeEx(Reags[r], $FFFF, BackPack, true);
    if findcount = 0 then
        begin
        MissingReg := Reags[r];
        Result := False;
        end;
    end;
end;

procedure Waiting;
begin
if MissingReg = $0F7B then s := 'BloodMosss';
if MissingReg = $0F7A then s := 'BlackPearls';
if MissingReg = $0F84 then s := 'Garlick';
if MissingReg = $0F85 then s := 'Ginseng';
if MissingReg = $0F86 then s := 'Madrake Roots';
if MissingReg = $0F88 then s := 'NightShades';
if MissingReg = $0F8C then s := 'Sulphuruos Ashs';
if MissingReg = $0F8D then s := 'Spider Silks';
uosay('KoH4uJIucb ' + s);
while (not CheckReags) do
    begin
    ctime := now;
    wait(10000);
    if InJournalBetweenTimes('dispel!|hunt!|macro!', ctime, Now) <> -1 then uosay('KoH4uJIucb ' + s );
    uosay(' ');
    findtype(MissingReg,sunduk);
    if findcount > 0 then MoveItems(sunduk, MissingReg, $FFFF, backpack, 0, 0, 0, 500);
    end;
end;




вот что набросал но что то не стыкуется.

Code: Select all


if InJournalBetweenTimes('stats', ctime, Now) <> -1 then

begin

Reags[1] := $0F7B // BloodMosss
Reags[2] := $0F7A // BlackPearls
Reags[3] := $0F84 // Garlick
Reags[4] := $0F85 // Ginseng
Reags[5] := $0F86 // Madrake Roots
Reags[6] := $0F88 // NightShades
Reags[7] := $0F8C // Sulphuruos Ashs
Reags[8] := $0F8D // Spider Silks
for r := 1  to 8  do
    begin
    findtypeEx(Reags[r], $FFFF, BackPack, true);
    if findcount = 0 then
        begin
        MissingReg := Reags[r];        
        end;
    end;
end;

begin

if MissingReg = $0F7B then s := 'BloodMosss';
if MissingReg = $0F7A then s := 'BlackPearls';
if MissingReg = $0F84 then s := 'Garlick';
if MissingReg = $0F85 then s := 'Ginseng';
if MissingReg = $0F86 then s := 'Madrake Roots';
if MissingReg = $0F88 then s := 'NightShades';
if MissingReg = $0F8C then s := 'Sulphuruos Ashs';
if MissingReg = $0F8D then s := 'Spider Silks';

uosay ( 'Отладка: найдено ' + inttostr(GetQuantity(s)));

wait(2000);
end;


User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

вроде как все правильно, если массив Reags правильно обьявлен.
weekend
Posts: 4
Joined: 12.07.2009 12:15

Post by weekend »

Пишет что в этой строчке Compiler: [Error] (2.sc at 202:45): Type mismatch

Code: Select all

if MissingReg = $0F7B then s := 'BloodMosss';
что это может означать ?


Так я объявил

Code: Select all


var
r,i,p : integer;
s : string;
MissingReg : cardinal;
Reags : array[1..8] of cardinal;  

[/code]
alpi
Novice
Novice
Posts: 51
Joined: 02.07.2009 17:37
Contact:

Post by alpi »

Type mismatch
означает несоответствие типов.
MissingReg : cardinal
cardinal - для ID вещи, для типа используй word.
кстати, в объвлении массива ты тоже используешь cardinal, хотя там word нужен.
и еще ньюанс: в выражениях if/while и тд, особенно в составных условиях, ставь скобки. Без них тоже тоже синтаксическая ошибка может быть.
if (MissingReg = $0F7B) then s := 'BloodMosss';
Last edited by alpi on 14.07.2009 18:59, edited 3 times in total.
just student
alpi
Novice
Novice
Posts: 51
Joined: 02.07.2009 17:37
Contact:

Post by alpi »

if MissingReg = $0F7B then s := 'BloodMosss';
if MissingReg = $0F7A then s := 'BlackPearls';
if MissingReg = $0F84 then s := 'Garlick';
if MissingReg = $0F85 then s := 'Ginseng';
if MissingReg = $0F86 then s := 'Madrake Roots';
if MissingReg = $0F88 then s := 'NightShades';
if MissingReg = $0F8C then s := 'Sulphuruos Ashs';
if MissingReg = $0F8D then s := 'Spider Silks';
через case тут намного красивее можно сделать :P
just student
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

Code: Select all

case MissingReg of
$0F7B : s := 'BloodMosss'; 
$0F7A : s := 'BlackPearls'; 
$0F84 : s := 'Garlick'; 
$0F85 : s := 'Ginseng'; 
$0F86 : s := 'Madrake Roots'; 
$0F88 : s := 'NightShades'; 
$0F8C : s := 'Sulphuruos Ashs'; 
$0F8D : s := 'Spider Silks';
end;
weekend
Posts: 4
Joined: 12.07.2009 12:15

Post by weekend »

Вроде сделал как вы говорили

вот начало скрипта

Code: Select all

program cast;
const
sunduk = $4499C893;
gold = $0EED;
MadrakeRoots = $0F86;
BloodMosss = $0F7B;
BlackPearls = $0F7A;
Garlick = $0F84;
Ginseng = $0F85;
NightShades = $0F88;
SulphuruosAshs = $0F8C;
SpiderSilks = $0F8D;
var
r,i,p : integer;
s : string;
MissingReg : word;
Reags : array[1..8] of word;  
ctime : TDateTime;
players : array[0..35] of cardinal;


{$Include 'all.inc'}


function timer(var acttimer:integer;actafter:integer):boolean;
begin
   result:=false;
   acttimer:=acttimer+1;
   if acttimer>=actafter then
   begin
      acttimer:=0;
      result:=true;     
   end;
end;




procedure CheckJournal;
begin
      players[0] := $00002C50;


if  int < 270 then
        begin
        waittargetself;
        Cast('Bless');
        wait(3000);
        checksave;
        waittargetself;
        Cast('Cunning');
        wait(3000);
        checksave;
        exit;
        end; 


    for p := 0  to 35  do
    begin
      if InJournalBetweenTimes('bless', ctime, Now) <> -1 then
      begin
        if LineID =  players[p] then
        begin
          UOsay('Сейчас я тебя блесну');
          WaitTargetObject(players[p]);   
          cast('Bless');
          wait(1000);
          UOsay('Готов, следущий !!!');
        end;
      end;
   end;



нужно вставить подсчет регов в бэкпаке и выводом количества,

поправил там где вы говорили про объявления массива в тип данных word. Но все равно выдает эту ошибку (Type mismatch)

Code: Select all


if InJournalBetweenTimes('stats', ctime, Now) <> -1 then

begin

Reags[1] := $0F7B // BloodMosss
Reags[2] := $0F7A // BlackPearls
Reags[3] := $0F84 // Garlick
Reags[4] := $0F85 // Ginseng
Reags[5] := $0F86 // Madrake Roots
Reags[6] := $0F88 // NightShades
Reags[7] := $0F8C // Sulphuruos Ashs
Reags[8] := $0F8D // Spider Silks
for r := 1  to 8  do
    begin
    findtypeEx(Reags[r], $FFFF, BackPack, true);
    if findcount = 0 then
        begin
        MissingReg := Reags[r];       
        end;
    end;
end;

begin

case MissingReg of
$0F7B : s := 'BloodMosss';
$0F7A : s := 'BlackPearls';
$0F84 : s := 'Garlick';
$0F85 : s := 'Ginseng';
$0F86 : s := 'Madrake Roots';
$0F88 : s := 'NightShades';
$0F8C : s := 'Sulphuruos Ashs';
$0F8D : s := 'Spider Silks';
end;
begin
uosay ( 'Отладка: найдено ' + inttostr(GetQuantity(s)));
wait(2000);
end; 


MAKAPEBu4
Neophyte
Neophyte
Posts: 23
Joined: 16.12.2006 19:19

Post by MAKAPEBu4 »

Если

Code: Select all


if InJournalBetweenTimes('stats', ctime, Now) <> -1 then

begin

Reags[1] := $0F7B // BloodMosss
Reags[2] := $0F7A // BlackPearls
Reags[3] := $0F84 // Garlick
Reags[4] := $0F85 // Ginseng
Reags[5] := $0F86 // Madrake Roots
Reags[6] := $0F88 // NightShades
Reags[7] := $0F8C // Sulphuruos Ashs
Reags[8] := $0F8D // Spider Silks
for r := 1  to 8  do
    begin
    findtypeEx(Reags[r], $FFFF, BackPack, true);
    if findcount = 0 then
        begin
        MissingReg := Reags[r];       
        end;
    end;
end;

begin

case MissingReg of
$0F7B : s := 'BloodMosss';
$0F7A : s := 'BlackPearls';
$0F84 : s := 'Garlick';
$0F85 : s := 'Ginseng';
$0F86 : s := 'Madrake Roots';
$0F88 : s := 'NightShades';
$0F8C : s := 'Sulphuruos Ashs';
$0F8D : s := 'Spider Silks';
end;
begin
uosay ( 'Отладка: найдено ' + inttostr(GetQuantity(s)));
wait(2000);
end; 


рабочий код, а

Code: Select all


program XXX;
const
sunduk = $0000000;
gold = $0EED;
MadrakeRoots = $0F86;
BloodMosss = $0F7B;
BlackPearls = $0F7A;
Garlick = $0F84;
Ginseng = $0F85;
NightShades = $0F88;
SulphuruosAshs = $0F8C;
SpiderSilks = $0F8D;
var
r,i,p : integer;
s : string;
MissingReg : cardinal;
Reags : array[1..8] of cardinal;  
ctime : TDateTime;
players : array[0..35] of cardinal;
обявление переменных, то исходя из
uosay ( 'Отладка: найдено ' + inttostr(GetQuantity(s)));
находящемся в кода, а GetQuantity используется так: GetQuantity(ObjID : Cardinal), то могу предположить, что это кусок кода откудато, где s уже обявлена как Cardinal или Word или т.п. оттуда и Type mismatch ты присваеваеш "строку" в числовую переменную.
З.Ы. Word, Cardinal, Integer это все обявление числовых переменных, отличие лиш в диапазоне чисел и занятой области памяти.
string это строчная переменная.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

кстати, может отсутсвовать не только 1 рег, а например 2.

Code: Select all


if InJournalBetweenTimes('stats', ctime, Now) <> -1 then

begin

Reags[1] := $0F7B // BloodMosss
Reags[2] := $0F7A // BlackPearls
Reags[3] := $0F84 // Garlick
Reags[4] := $0F85 // Ginseng
Reags[5] := $0F86 // Madrake Roots
Reags[6] := $0F88 // NightShades
Reags[7] := $0F8C // Sulphuruos Ashs
Reags[8] := $0F8D // Spider Silks
for r := 1  to 8  do
    begin
    findtypeEx(Reags[r], $FFFF, BackPack, true);
    if findcount = 0 then
        begin
        uosay ( 'Отладка: НЕ найдено ' + inttostr(GetQuantity(Reags[r])));
        end;
    end;
end;
а так будет куда проще и лучше
weekend
Posts: 4
Joined: 12.07.2009 12:15

Post by weekend »

Вставил данный кусок в скрипт, скрипт запускаеться но при произношении команды ничего не происходит, пробовал меня тип, ничего не дало.



Vizit0r wrote:кстати, может отсутсвовать не только 1 рег, а например 2.

Code: Select all


if InJournalBetweenTimes('stats', ctime, Now) <> -1 then

begin

Reags[1] := $0F7B // BloodMosss
Reags[2] := $0F7A // BlackPearls
Reags[3] := $0F84 // Garlick
Reags[4] := $0F85 // Ginseng
Reags[5] := $0F86 // Madrake Roots
Reags[6] := $0F88 // NightShades
Reags[7] := $0F8C // Sulphuruos Ashs
Reags[8] := $0F8D // Spider Silks
for r := 1  to 8  do
    begin
    findtypeEx(Reags[r], $FFFF, BackPack, true);
    if findcount = 0 then
        begin
        uosay ( 'Отладка: НЕ найдено ' + inttostr(GetQuantity(Reags[r])));
        end;
    end;
end;
а так будет куда проще и лучше
Post Reply