проще от MKS скрипт переделать
и там поднимали вопрос с теми же пакетами как у тебя
Или я тебя не понял или ты меня
В нормальном виде скрипт у меня работает, я нашел все нужные пакеты для заточки и правил их в скрипте. Проблемма в том что если я хочу использовать паралельно второе соединение(то бишь второй подключенный акк) для заточки у меня начинаются глюки. Почему это происходит, я понимаю, а именно изза того что скрипт перехватывает пакеты от клиента и сервера сразу от обоих соединений в итоге получается киш миш. Я попробывал ето исправить тем что дописал в скрипте где идет перехват Соц Действий итд.. команду (ConnectName=myname) в скрипте выделил красным цветом, Тем самым как я понимаю я перехватываю эти пакеты только с соединения myname. Но что то не пашет, ето видно из того что когда я теперь нажимаю соц действие на заточку, он у меня етот пакет не тормозит а пропусакет дальше. Надеюсь ты понимаешь о чем я? от МКС я не хочу переделывать скрипт, так как у него там два таймера для моего серва нужно 3, там переделывать короче больше нужно, да и не вижу смысла, твой мне в полне подходит)) буду рад ответу
1. поубирать все эти (ConnectName=myname)
2. SendToServerEx(myname) позаменать на SendToServer
3. в ините добавить одну строчку:
UseForConnectName := myname;
она заменит все эти ненужные на уровне скрипта проверки и "лишний текст".
4. отметить к исполнению и проверить работоспособность.
5. создать еще один такой же скрипт и сменить в нем имя на имя второго персонажа. отметить к исполнению.
6. повторят 5й пункт если нужно.
Все сделал как ты сказал, не пашет(, только сообщение клиенту отсылает что скрипт загружен, остальные действия не прокатывают, пробывал потом еще перед каждым 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 сообщения, изза ограничения колва знаков на форуме)
С пакетами все нормально, я их на своем серваке отследил, они отличаются от твоих, и скрипт у меня же работает в твоем варианте, вот только когда начинаю привязывать к опрделенному соединению ничего не делает, кроме того как отсылает сообщение, можете на своем серве со своими пакетами попробывать, я думаю ето того стоит, если скрипт под несколько соединений замастрячить)