PDA

Просмотр полной версии : нужна небольшая помощь


akkerman
05.06.2009, 21:34
Здравствуйте. Мне нужна помощ по написанию не очень трудного скрипта: Суть его в том что когда в инвентаре остется 5 штук Blessed Scroll Enchant Weapon S ,скрипт отправит нужный мне пакет серверу
Покрайней мере я не могу понять как зделать данную проверку.

QaK
06.06.2009, 13:23
akkerman, читай топ "да будет бот"и ветку "жесткий скриптинг", туева хонна примеров, осталось только понять,что тебе надо и выдрать кускамииз наработок.

Fer123
06.06.2009, 17:40
Или топ Полезные функции ищи "Инвентаризация".

akkerman
07.06.2009, 11:04
Перерыл все топы которые вы мне дали.. нашел скрипт управления инвентарем,я так понял то что мне надо там.. но я в упор не могу найти что то подобное проверки которая нужна мне .Не могли бы вы тыкнуть пальцем на тот кусок ! Заранее спасибо

Fer123
07.06.2009, 13:39
http://coderx.ru/showpost.php?p=56&postcount=5
не знаю правда для каких хроник...
Так вот есть там функция function GetInv(obj,up,down:integer): integer;
где obj это то по чему ищем, up по какому полю ищем, down по какому полю выводим.
Тоесть для твоего случая должно быть GetInv(ID заточки,2,3).
Но это в том случае что заточки в одном слоте, а если нет то надо другую функцию писать

akkerman
07.06.2009, 14:34
к сожалению у меня interlude и заточки занимают не 1 слот ... есть какойто еще выход ?

Fer123
07.06.2009, 19:20
function GetInv2(obj:integer): integer;
var
i: integer;
begin
for i:=0 to 79 do if Inventory[i,2]=obj then Result:=Result+Inventory[i,3];
end;

Просто вставь между основными begin и end проверку
if GetInv2(ID скрола)<=5 then
begin
...
end;

akkerman
08.06.2009, 00:20
begin
if GetInv2('6577')<=5 then begin
buf:=HStr('1F 9F 6E 05 00 1C 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 ');
SendToServerEx('fuck');
pck:='';
end;
end.




скрипт ругается.. что может быть не так

Fer123
08.06.2009, 02:41
pck:=''; это лишнее
и ковычки убери в GetInv2('6577'), это тип интежер а не строка.

akkerman
08.06.2009, 08:18
begin
if GetInv2(6577)<=5 then begin
buf:=HStr('нужный мне пакет');
SendToServerEx('fuck');
end;
end.

Выделил красным на что ругается

Fer123
08.06.2009, 10:30
Запись правильная...
Куда ты саму функцию всунул? Она должна быть перед основным begin end.

akkerman
08.06.2009, 14:50
я в скриптах не силен .. даже языка не знаю зделал просто по аналогии как в других скриптах.
Если тебя не затруднит подправь мой как требуется.

Добавлено через 52 минуты
function GetInv2(obj:integer): integer;
var
i: integer;
begin
if GetInv2(6577)<=5 then begin
buf:=HStr('нужный пакет ');
SendToServerEx('fuck');
end;

Спустя пару часов надумал вот это ... если что подправте буду очень благодарен :)

APXAHGEJI
08.06.2009, 15:06
гы гы саму функцию изменил)) и внутри функции вызываешь ее же))
прям таки рекурсия гы гы))

Fer123
08.06.2009, 15:24
Вот как должен выглядеть твой скрипт

const
Name='fuck';
max=200; //Слотов в инвентаре
var
ItemBase: array[1..4,1..max] of integer;
ready:boolean;

procedure Init;
begin
ready:=false;
buf:=#$0F;
SendToServerEx(Name);
end;

//************************************************** *************
procedure CreateItemBase;
var
i, j, ListCount: integer;
begin
for i:=1 to max do begin
//очищаем масив
ItemBase[1,i]:=0; //OID
ItemBase[2,i]:=0; //ID
ItemBase[3,i]:=0; //kol-vo
ItemBase[4,i]:=0; //lvl
end;
j:=4;
ListCount:=ReadH(j);
j:=8;
for i:=1 to ListCount do begin
itemBase[1,i]:=ReadD(j); //OID
itemBase[2,i]:=ReadD(j); //ItemID
itemBase[3,i]:=ReadD(j); //кол-во
inc(j,10);
itemBase[4,i]:=ReadH(j);//EnchantLevel
inc(j,12);
end;
end;
//......................................
//************************************************** ****************************
procedure InventoryUpdate; //пакет 27, обновляет базу ObjectID по ItemID
var
i, ii, j, OID, ID, Count, ListCount, UpdType, lvl: integer;
add : boolean;
begin
add:=false;
ListCount:=ReadH(2);
j:=4;
for ii:=1 to ListCount do begin
add:=false; //Ели додумался изза чего не добавляет сразу несколько предметов в базу
UpdType:=ReadH(j);
ReadH(j); //ItemType1
OID:=ReadD(j); //ObjectID
ID:=ReadD(j); //ItemID
Count:=ReadD(j); //кол-во
inc(j,10);
lvl:=ReadH(j);
case UpdType of
1: begin
for i:=1 to max do begin
if (ItemBase[1,i]=0) and (add=false) then begin
ItemBase[1,i]:=OID;
ItemBase[2,i]:=ID;
ItemBase[3,i]:=Count;
ItemBase[4,i]:=lvl;
add:=true;
end;
end;
end;
2: begin
for i:=1 to max do begin
if ItemBase[1,i]=OID then begin
ItemBase[3,i]:=Count;
ItemBase[4,i]:=lvl;
if OID=arItemOID[arNum] then CurEnchLvl:=lvl;
end;
end;
end;
3: begin
for i:=1 to max do begin
if ItemBase[1,i]=OID then begin
ItemBase[1,i]:=0;
ItemBase[2,i]:=0;
ItemBase[3,i]:=0;
ItemBase[4,i]:=0;
end;
end;
end;
end;
inc(j,10);
end;
end;
//......................................

function SumItem(Item: integer):integer;
var
sum, i : integer;
begin
result:=0;
for i:=1 to max do begin
if (ItemBase[2,i]=item) then begin
result:=result+ItemBase[3,i];
end;
end;
end;

BEGIN
//--- INVENTORY BEGIN ---//
if FromServer and (ConnectName=Name) then case pck[1] of
#$1B: begin
CreateItemBase;
ready:=true;
end;
#$27: begin
InventoryUpdate;
ready:=true;
end;
end;
//--- INVENTORY END ---//
if (SumItem(6577)<=5) and (ready=true) then begin
buf:=HStr('1F 9F 6E 05 00 1C 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 B1 19 00 00 01 00 00 00 ');
SendToServerEx(Name);
ready:=false;
end;
END.

akkerman
08.06.2009, 15:53
Огромнейшее спасибо ! единственое этот скрипт я так понял поддержует только 80 слотов .. есди да то что мне изменить чтобы поддерживал 200 :(

QaK
08.06.2009, 15:58
akkerman, поправил скрипт в посте Fer123, там вначале SlotCount = количество слотов в инвентаре вычесть единицу.

akkerman
08.06.2009, 17:16
спасибо вам за ваш труд .. но у меня проблема когда я включаю скрипт
Он полностью игнорируя проверку начинает истерически посылать этот пакет! Забивая тем самым весь инвентарь .
Мне надо чтобы он проверял меньше ли 5 точек
и чтобы он отсылал данный пакет только 1 раз а не так много...

Fer123
08.06.2009, 19:49
Исправил скрипт в 14 посте. Теперь должно отправлять 1 раз попробуй и отпиши.

akkerman
08.06.2009, 20:07
Он скупает по одной точке .. но все так же быстр ои не останавливаясь.
Причем проверка не работает он начинает скупать даже если при мне точек 20

ЗЫ останавливается тогда когда точек 70-90 ... всегда по разному

Fer123
08.06.2009, 20:40
Примерно понял в чем проблема... Взял другую инвентаризацию со скрипта NLObP на заточку и немного подправил чтоб при inventoryupdate добавлялись все предметы в пакете 27... Пробуй отписуйся

akkerman
08.06.2009, 21:53
скрипт составлен некоректно
при включении ругается на этот кусок


BEGIN
//--- INVENTORY BEGIN ---//
if FromServer and (ConnectName=Name) then case pck[1] of
#$1B: begin
CreateItemBase;
ready:true;
end;
#$27: begin
InventoryUpdate;
ready:true;
end;
end;

pmen
08.06.2009, 22:01
ДА блин..Незаметил.. )
:spiteful:

Fer123
08.06.2009, 22:20
писал на скорую руку и без phx должно быть ready:=true; ну ты ж хоть чучуть то понимаешь паскаль мог бы и сам догадаться...

akkerman
08.06.2009, 22:40
опять ошибки .. Огромное спасибо тебе от меня лично и всего клана за уделеное тобой на меня время,и за проделаную работу, чтобы исправить их буду пытатся разобратся в языке... Если сочтеш нужным и найдеш свободное время подкоректируй свой скрипт я думаю он понадобится не только мне но и другим начинающим членам этого форума!