Все сделал как ты сказал, не пашет(, только сообщение клиенту отсылает что скрипт загружен, остальные действия не прокатывают, пробывал потом еще перед каждым SendToServer типа
begin
UseForConnectName := myname;
buf:=hstr('2F');
SendToServer;
end;
поставить все равно не идет
вот вариант который я по твоему предложнию откорректировал Оффтоп
Код:
const
myname ='MypJIo'; //<<== пишем свой НИК
max = 200;//<<== колличество ячеек в рюкзаке
chat = 3;// <<== какой ЧАТ выводить сообщения
var
BaseItems:array[1..max,1..11] of integer;
BaseID:array[1..max] of integer;
Timer01: TTimer;
Timer02: TTimer;
Timer03: TTimer;
flag,start,select,selectID,autoMsg:Boolean;
autostart:Boolean;
mytext:string;
ListSize,ItemEnch:word;
textID,itemID:integer;
enchantObjectID:integer;
enchantID,skrolObjectID:integer;
ItemOID,objectOID: integer;
sumskrol,sumitemID: integer;
t,l,d,x,y,ii:integer;
maxlvl: integer;
GetiD:integer;
skrolID,skrolObj:integer;
index:integer;
//-----------------------------------------
procedure SendMsg2(msg:string);
begin
if autoMsg then begin
buf:=#$4A;
WriteD(0);
WriteD(chat);// <<=куда выводить сообщения
WriteS('');
WriteS(msg);
SendToClient;
end;
end;
//===========================================
procedure Resultmaxlvl;
var
i:integer;
begin
i:=2;
mytext:=ReadS(i);
textID:=ReadD(i);
if (textID=3) then begin
maxlvl:=StrToInt(mytext);
SendMsg2( ' Установлен МАХ Уровень Заточки : '+IntToStr(maxlvl)+'' );
end;
end;
//..............................................................................
procedure ItemList;
var
i, j, k: integer;
count,x:integer;
begin
deleteBase;
count:=0;
x:=0;
y:=0;
j:=4;
ListSize:=ReadH(j);
for i:=1 to ListSize do
if (i<=ListSize) then begin
BaseItems[i,1]:=ReadH(j); //ItemType1
BaseItems[i,2]:=ReadD(j); //ObjectID
BaseItems[i,3]:=ReadD(j); //ItemID
BaseItems[i,4]:=ReadD(j); //LocationSlot
BaseItems[i,5]:=ReadD(j); // Amount:
BaseItems[i,6]:=ReadD(j); // Amount:
BaseItems[i,7]:=ReadH(j);//ItemType2
BaseItems[i,8]:=ReadH(j);// CustomType1
BaseItems[i,9]:=ReadH(j);//isEquipped:
BaseItems[i,10]:=ReadD(j);//BodyPart
BaseItems[i,11]:=ReadH(j);//EnchantLevel
inc(x); // счетчик
count:=round((Length(pck)-5) / ListSize);
y:=count*x-(j-6);
inc(j,y);
end else for k:=1 to 11 do BaseItems[i,k]:=0;
if start and (0 < skrolObjectID) then begin
sumskrol:=0;
sumskrol:=Getitem(skrolID,3,5);
SendMsg2 (' SKROL ... c ID : '+IntToStr(skrolID)+' = '+IntToStr(sumskrol)+' ШТ ');
if start and (0<sumskrol) then Timer01.enabled:=true;
if start and (sumskrol=0) then begin
stopEnchantItem;// остановка скрипта
SendMsg2 ('........ НЕДОСТАТОЧНО SKROL........ ');
end;
end;
end;
//=============================
procedure deleteBase;
var
i,j,k:integer;
begin
for i:=1 to max do
BaseItems[i,1]:=0;
BaseItems[i,2]:=0; //ObjectID
BaseItems[i,3]:=0; //ItemID
BaseItems[i,4]:=0;
BaseItems[i,5]:=0;
BaseItems[i,6]:=0;
BaseItems[i,7]:=0;
BaseItems[i,8]:=0;
BaseItems[i,9]:=0;
BaseItems[i,10]:=0;
BaseItems[i,11]:=0;
end;
//===========================
function Getitem(Obj,up,down:integer): integer;
var
i:integer;
begin
Result:= 0; //В начале у нас 0
for i:=1 to max do
if (BaseItems[i,up]=Obj) then begin
Result:=BaseItems[i,down];
end;
end;
//===========================
function Getsumitem(Obj,up,down:integer): integer;
var
i:integer;
begin
Result:= 0; //В начале у нас 0
for i:=1 to max do
if (BaseItems[i,up]=Obj) then begin
Result:=Result+BaseItems[i,down];
end;
end;
//добавляем в базу ID предмета
procedure addIDtoarray(ItemOID:integer);
begin
SendMsg2( '------------------------------------- ' );
SendMsg2 (' добавить в базу для заточки ID : '+IntToStr(ItemOID)+' Предмета ');
SendMsg2(' .................' );
flag:=false;
for ii:=1 to max do
if (BaseID[ii]=ItemOID) then begin // текущий ID уже есть в массиве,
flag := true;
sumitemID:=Getsumitem(ItemOID,3,5);//счет скоко предметов
SendMsg2 (' предмет в базе есть с ID : '+IntToStr(ItemOID)+' = '+IntToStr(sumitemID)+' ШТ ');
SendMsg2( '------------------------------------- ' );
Break; // прерываем дальнейший перебор массива.
end;
if (flag = false) then begin
for ii:=1 to max do
if (BaseID[ii]=0) then begin // добавим ID в массив,
BaseID[ii]:=ItemOID;
index:=ii;
sumitemID:=Getsumitem(ItemOID,3,5);//счет скоко предметов
SendMsg2 (' Добавлен Предмет с ID : '+IntToStr(ItemOID)+' = '+IntToStr(sumitemID)+' ШТ ');
SendMsg2( '------------------------------------- ' );
Break; // прерываем дальнейший перебор массива.
end;
end;
end;
Последний раз редактировалось Maxima, 08.12.2009 в 21:07.
//=============================
procedure ChooseInventory;
begin
if start and (itemID>0) then begin
objectOID:=0;
objectOID:=GetObjectID(itemID);//находим по ItemID предмет с ObjectID
if (objectOID=0) then begin
stopselectskrol;
SendMsg2 ('Больше Предметов c ID : '+IntToStr(itemID)+' для заточки НЕТ !!! ');
for ii:=1 to index do
if (BaseID[ii]=itemID) then begin
BaseID[ii]:=0;
SendMsg2 (' ..... ПОИСК ______ ПРЕДМЕТА..... ');
GetItemID ;
Break; // прерываем дальнейший перебор массива.
end;
if (itemID=0) then begin
stopEnchantItem;// остановка скрипта
SendMsg2 ('___НЕТ ПРЕДМЕТОВ ДЛЯ ЗАТОЧКИ___ ');
end;
end;
end;
end;
//=================================
//находим ItemID предмета для Заточки в базе ItemID
procedure GetItemID ;
begin
if start then begin
itemID:=0;
for ii:=1 to max do
if (BaseID[ii]<>0) then begin
itemID:=BaseID[ii];
SendMsg2 (' НАШЛИ ПРЕДМЕТ для ЗАТОЧКИ с ID = '+IntToStr(itemID)+' ');
Timer01.enabled:=true;
Break; // прерываем дальнейший перебор массива.
end;
end;
end;
//=================================
//находим enchantID предмета по ItemID для заточки
function GetObjectID(itemID:integer) : integer;
var
i:integer;
begin
enchantID:= 0;
ItemEnch:=0;
Result:= 0;
SendMsg2( '*******************************************' );
if (itemID>0) then begin
SendMsg2 (' Ищем ObjectID предмета с ID : ' +IntToStr(itemID)+' ');
SendMsg2('------------------------------' );
for i:=1 to max do
if (BaseItems[i,3]= itemID) and (BaseItems[i,11]< maxlvl) then begin
enchantID:=BaseItems[i,2];
Result:=BaseItems[i,2];
ItemEnch:=BaseItems[i,11];
SendMsg2(' ..... найден предмет для заточки ..... ');
SendMsg2(' ID : '+IntToStr( itemID)+' и ObjectID : '+IntToStr(enchantID)+' заточен до : '+IntToStr(ItemEnch)+' ');
SendMsg2('------------------------------' );
if start and (enchantID>0) then Timer02.enabled:=true;
Break; // прерываем дальнейший перебор массива.
end;
end;
end;
//==========================
procedure stopselectskrol;
begin
buf:=hstr('434E00');
SendToServer;
end;
//===================================
procedure OnTimer01(Sender: TObject);
begin
buf:=#$0C;
WriteD(skrolObjectID);
WriteD(0);
SendToServer;
Timer01.enabled:=false;
end;
//--------------------------
procedure OnTimer02(Sender: TObject);
begin
buf:=hstr('434C00');
WriteD(enchantID);
SendToServer;
Timer02.enabled:=false;
Timer03.enabled:=true;
end;
procedure OnTimer03(Sender: TObject);
begin
buf:=#$65;
WriteD(enchantID);
WriteD(0);
SendToServer;
Timer03.enabled:=false;
SendMsg2(' ..... Точим Предмет ..... ');
SendMsg2( ' ID : '+IntToStr(itemID)+' ObjectID : '+IntToStr(enchantID)+' - до : '+IntToStr(maxlvl)+' ' );
SendMsg2( '_______________________________' );
end;
//-----------------------------------------
procedure Init;
begin
UseForConnectName := myname;
t:=0;l:=0;d:=0;
autostart:=false;flag:=false;selectID:=false;
autoMsg:=true;start:=false;select:=false;
GetiD:=0;sumskrol:=0;objectOID:=0;
maxlvl:=0;itemID:=0; enchantID:=0;
ItemEnch:=0;skrolObjectID:=0;
enchantObjectID:=0;
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01;
Timer01.enabled:=false;
Timer01.interval:=200; //<<== время выбора свитка
Timer02:=TTimer.Create(nil);
Timer02.OnTimer:=@OnTimer02;
Timer02.enabled:=false;
Timer02.interval:=500; //<<== время выбора предмета
Timer03:=TTimer.Create(nil);
Timer03.OnTimer:=@OnTimer03;
Timer03.enabled:=false;
Timer03.interval:=3800; //<<== время между заточкой
SendMsg2( ' Привет от TAMBIKa' );
SendMsg2( 'в пати чат пишем уровень заточки' );
SendMsg2( ' заточить предметы один раз ! ! !' );
SendMsg2( ' СТАРТ соцдействие ДА ' );
SendMsg2( ' СТОП соцдействие НЕТ' );
SendMsg2('В К Л сообщения соцдействие-приветствие\hello ' );
SendMsg2('ВЫКЛ сообщения соцдействие-победа\victory ' );
SendMsg2( '------------------------------------- ' );
deleteBase;
OpenInventory;//открыть инвентарь.14=RequestItemList
for ii:=1 to max do
BaseID[ii]:=0;
end;
procedure Free;
begin
Timer01.free;
Timer02.free;
Timer03.free;
end;
//=========================
procedure OpenInventory;//открыть инвентарь.14=RequestItemList
begin
buf:=hstr('2F');
SendToServer;
end;
//=========================
procedure RequestActionUse;
begin
case ReadD(2) of
12:begin autoMsg:=true;end;
13:begin autoMsg:=false;end;
24:begin
if (maxlvl=0) then SendMsg2 (' Неуказан Уровень Заточки ');
if (autostart=false) then SendMsg2( 'предмет незаточен или пакеты неприняты !' );
if autostart and (maxlvl>0) then begin
SendMsg2( ' ! ! ! П О Е Х А Л И ! ! !' );
SendMsg2( '_______________________________' );
start:=true;
GetItemID ;
end;
end;
25:begin
stopEnchantItem;// остановка скрипта
SendMsg2( ' ! ! ! С Т О П ! ! ! ' );
stopselectskrol;
end;
end;
end;
//=========
procedure stopEnchantItem;// остановка скрипта
begin
autoMsg:=true;
start:=false;
deleteBase;
enchantID:=0;
ItemEnch:=0;
stopselectskrol;// отмена выбора скролл
SendMsg2 (' ___ О С Т А Н О В Л Е Н О ___ ');
Timer01.enabled:=false;
Timer02.enabled:=false;
Timer03.enabled:=false;
end;
//=========
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
if FromServer and (pck[1]=#$11) then begin ItemList;end;
if FromServer and (pck[1]=#$7C) then begin ChooseInventory;end;
if FromClient and (pck[1]=#$38) then begin Resultmaxlvl;pck:='';exit;end;
if FromClient and (pck[1]=#$15) then begin RequestActionUse;pck:='';exit;end;
begin
if (start=false) and FromClient then
case pck[1] of
#$0C:begin
t:=0;
OpenInventory;//открыть инвентарь
skrolObjectID:=0;
skrolID:=0;
skrolObjectID:=ReadD(2);
skrolID:= Getitem(skrolObjectID,2,3);//находим по ObjectID скрол с ItemID
stopselectskrol;
if (skrolID = 0) then SendMsg2(' . SKROLL ID НЕТ .' );
if (skrolID > 0) then begin
t:=1;
sumskrol:=0;
sumskrol:=Getitem(skrolID,3,5);
SendMsg2(' .................' );
SendMsg2(' активирован SKROLL ID : '+IntToStr(skrolID)+' = '+IntToStr(sumskrol)+' ШТ' );
SendMsg2(' .................' );
end;end;
#$43:if ReadH(2)=76 then begin
l:=1;
SendMsg2(' Выбор Предмета для Заточки ' );
SendMsg2(' .................' );
end;
#$65:begin
enchantObjectID:=0;
enchantObjectID:=ReadD(2);
itemOID:=0;
itemOID:=Getitem(enchantObjectID,2,3);//находим по ObjectID предмет с ItemID
if (itemOID > 0) then begin
d:=1;
if (t=1) and (l=1) and (d=1) then begin
autostart:=true;
SendMsg2 (' заточен предмет c ID : '+IntToStr(ItemOID)+' ');
SendMsg2(' .................' );
addIDtoarray(ItemOID);//добавляем в базу ID предмета
stopselectskrol;
end;
end;
end;
end;
end;
end.
Через два часика вернусь еще раз посмотрю в чем там дело
Последний раз редактировалось Maxima, 08.12.2009 в 16:27.
UseForConnectName Достаточно назначить один раз.
после назначения скрипт привязывается только к этому имени соединения. пакеты с других соединений в такой скрипт не поступают (если так можно выразиться).
+ еще одна нужная функция в моей библиотеке, за что спасибо. только вот проблема всетаки не решилась, сообщение о загрузке скрипта пашет значит я так предполагаю что эта функция внутри процедуры Инит работает. В скрипте разбираюсь, дальше. Еще вопрос если я внутри других процедур ету функцию заявлю, хуже от етого не станет?, я имею в виду не повлияет на работу скрипта? Хочу попробывать методом тыка, поискать ошибку. Я так понимаю что процедура инит глобальная и другие должды быть в ней локальны, может случиться такое какая нибуть процедура в етом скрипте независима? То есть для нее должны быть указаны экстра функции/параметры?
Последний раз редактировалось Maxima, 08.12.2009 в 19:32.
UseForConnectName устанавливается глобально. достаточно назначить один раз где угодно, естественно удобней и логичней устанавливать ее в ините.
после этого она примет указаное ей значение вплоть до завершения выполнения скрипта (снятие галочки).
Да уж, но факт остается фактом, скрипт при етом не фурычит, мож кто посмотрит код, под оффтопом который я выше запостил что там может быть не так? Он растянут в 3 сообщения, изза ограничения колва знаков на форуме)
С пакетами все нормально, я их на своем серваке отследил, они отличаются от твоих, и скрипт у меня же работает в твоем варианте, вот только когда начинаю привязывать к опрделенному соединению ничего не делает, кроме того как отсылает сообщение, можете на своем серве со своими пакетами попробывать, я думаю ето того стоит, если скрипт под несколько соединений замастрячить)
TAMBIK,обьесни плз все пашет но... када нажимаеш ДА он точит 1 раз и все приходиться о5 самому точить 1 раз и следом он о5 1 раз токо точет,почему он нехочет точить сам до скольки я ему назначел?)
Добавлено через 34 минуты
вот что пишет
Последний раз редактировалось PeageHT, 13.01.2010 в 01:59.
Причина: Добавлено сообщение