Выкладываю скрипт продажи вещей. Как пользоваться, написано в начале скрипта. Основа из скрипта рыбалки.
delphi Код:
//Автоматизация продажи by NLObP для L2PacketHack v.3.1.8+////version 0.1program SellBot;
{
Скрипт распространяется как есть, и я не несу ответственности
за то, что ВЫ натворили у себя, его используя.
Проверялось на TheAbyss.ru (С6-interlude) и [url]www.lagam.net(c4[/url])
Перед использованием скрипта изменяем под свой сервер, один раз:
Name='NLObP'; //имя чара для которого включаем скрипт
max=80; //размер инвентаря чара
//установить константу в зависимости от типа игры (С4 или C6-Интерлюд)
IL=true; //true - IL, false - C4
//оставить один из них или поставить свой
kID=1000000; //коэфф вычитаемый из NpcID C4 [url]www.lagam.net[/url]
kID=1023000; //коэфф вычитаемый из NpcID C6 theAbyss.ru
//ID продавца
TraderID=8573; //Фишерман Monakan в Гиран-харборе
//сюда вписываем ItemID предметов для автопродажи (продается за 1 раз не более 99999 штук)
//например 1467=Soulshot: S-grade
TradeSellItem=[1467,1467,1467,1467]; //повторим 4 раза продажу Soulshot: S-grade не более 99999 за каждый раз
//количество предметов в массиве TradeSellItem (например, повторов продаж одной вещи)
TradeSellItemCount=4;
Затем для осуществления продажи, делаем каждый раз:
1)Для получения TraderOID требуется отбежать от него (например продавца TraderID=8573
Фишерман Monakan в Гиран-харборе) на причал влево к самой воде и вернуться.
2)На Абисе S>Пакет UserInfo #$04 очень тяжело дождаться, а он нужен для инициализации
скрипта. Нужно купить или продать не нужную вещицу и Пакет UserInfo #$04 прийдет от сервера.
На [url]www.lagam.net(c4[/url]) проще, открываем инвентарь, сняли/одели оружие.
3)Увидим сообщение, что скрипт готов к работе:
msg.Lines.Add('Скрипт инициализирован!');
msg.Lines.Add('Социальное действие YES - начать!');
msg.Lines.Add('Социальное действие NO - остановиться!');
На форме кнопки старт и стоп дублируют социальные действия.
Всё остальное на форме в разработке и не используется в текущее время.
}const
Name='NLObP'; //имя чара для которого включаем скриптmax=80; //размер инвентаря чара//установить константу в зависимости от типа игры (С4 или C6-Интерлюд)
IL=true; //true - IL, false - C4// kID=1000000; //коэфф вычитаемый из NpcID C4 [url]www.lagam.net[/url]
kID=1023000; //коэфф вычитаемый из NpcID C6 theAbyss.ru
TraderID=8573; //Фишерман Monakan в Гиран-харборе//C4 [url]www.lagam.net[/url] и на C6 TheAbyss.ru
getselllist='menu_select?ask=-1&reply=8';
//сюда вписываем ItemID предметов для автопродажи
TradeSellItem=[6904,6905,6906,6907,6920,6921,6922,6923,6924,6925,7686,7695,7696,7697,7698,7699,7700];
//количество предметов в массиве TradeSellItem
TradeSellItemCount=17;
//***************************************************************var
SellItemOID, SellItemID, SellItemValue, trade: integer;
TraderOID: integer;
ListID, i: integer;
Trade1: TTimer;
MaxHP, CurHP, MyID, but, MyXpos, MyYpos, MyZpos: integer;
ColvoHP, NeedBuy, ColvoItm, ColvoItm2, SocialID : integer;
ReadyToBuy, ReadyToSell, ReadyToMultiSell, add, status : boolean;
trd, TradeCount, TradeID, EndTradeID, UpdType, ItemOID, ItemID, Lvl: integer;
ItemBase: array[1..3,1..max] ofinteger; //все предметы в инвентаре
ItemBase2: array[1..3,1..max] ofinteger; //найденные по ItemID{
1 - ObjectID
2 - ItemID
3 - ItemCount
}
offs1, offs2, offs3, offs4, offs5 : integer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button1: TButton;
Button2: TButton;
msg: TMemo;
frm: TForm;
//***************************************************************//Вызывается при включении скрипта//***************************************************************procedure Init;
beginif IL thenbegin//Interlude//CreateItemBase
offs1:=24;
//InventoryUpdate
offs2:=22;
//UserInfo, основной цикл
offs3:=48;
//InventoryUpdate, основной цикл
offs4:=38;
//ItemList, основной цикл
offs5:=36;
endelsebegin//C4
offs1:=16;
offs2:=14;
offs3:=44;
offs4:=30;
offs5:=28;
end;
//ПАНЕЛЬКА
frm:=TForm.Create(nil);
with frm dobegin
Caption:='SellBot by NLObP';
BorderStyle := bsSizeable;
Position := poScreenCenter;
Left := 0;
Top := 0;
ClientHeight := 310;
ClientWidth := 418;
end;
//кнопка1
Button1:=TButton.Create(frm);
with Button1 dobegin
Name:='Button1';
Parent:=frm;
// SetBounds(112, 96, 75, 25);
Left:=112;
Top:=96;
Width:=75;
Height:=25;
Caption:='Start';
OnClick:=@Button1Click; { same as b.OnClick := 'ButtonClick' }end;
//кнопка2
Button2:=TButton.Create(frm);
with Button2 dobegin
Name:='Button2';
Parent:=frm;
// SetBounds(112, 96, 75, 25);
Left:=190;
Top:=96;
Width:=75;
Height:=25;
Caption:='Stop';
OnClick:=@Button2Click; { same as b.OnClick := 'ButtonClick' }end;
ComboBox1:=TComboBox.Create(frm);
with ComboBox1 dobegin
Name:='ComboBox1';
Parent:=frm;
Left := 8;
Top := 24;
Width := 145;
Height := 21;
ItemHeight := 13;
ItemIndex := 0;
TabOrder := 0;
Text := 'ComboBox1';
OnChange:=@ComboBox1Change;
// OnClick:=@ComboBox1Click;end;
ComboBox2:=TComboBox.Create(frm);
with ComboBox2 dobegin
Name:='ComboBox2';
Parent:=frm;
Left := 8;
Top := 72;
Width := 145;
Height := 21;
ItemHeight := 13;
TabOrder := 2;
Text := 'ComboBox2';
OnChange:=@ComboBox2Change;
// OnClick:=@ComboBox2Click;end;
Label1:=TLabel.Create(frm);
with Label1 dobegin
Name:='Label1';
Parent := frm;
Left := 8;
Top := 5;
Width := 50;
Height := 13;
Caption := 'Name NPC';
end;
Label2:=TLabel.Create(frm);
with Label2 dobegin
Name:='Label2';
Parent := frm;
Left := 159;
Top := 5;
Width := 34;
Height := 13;
Caption := 'NPC ID';
end;
Label3:=TLabel.Create(frm);
with Label3 dobegin
Name:='Label3';
Parent := frm;
Left := 8;
Top := 53;
Width := 52;
Height := 13;
Caption := 'Name Item';
end;
Label4:=TLabel.Create(frm);
with Label4 dobegin
Name:='Label4';
Parent := frm;
Left := 159;
Top := 53;
Width := 36;
Height := 13;
Caption := 'Item ID';
end;
Label5:=TLabel.Create(frm);
with Label5 dobegin
Name:='Label5';
Parent := frm;
Left := 288;
Top := 5;
Width := 34;
Height := 13;
Caption := 'ByPass';
end;
Label6:=TLabel.Create(frm);
with Label6 dobegin
Name:='Label6';
Parent := frm;
Left := 286;
Top := 53;
Width := 26;
Height := 13;
Caption := 'Value';
end;
Edit1:=TEdit.Create(frm);
with Edit1 dobegin
Name:='Edit1';
Parent := frm;
Left := 159;
Top := 24;
Width := 121;
Height := 21;
TabOrder := 1;
Text := '0';
end;
Edit2:=TEdit.Create(frm);
with Edit2 dobegin
Name:='Edit2';
Parent := frm;
Left := 159;
Top := 72;
Width := 121;
Height := 21;
TabOrder := 3;
Text := '0';
end;
Edit3:=TEdit.Create(frm);
with Edit3 dobegin
Name:='Edit3';
Parent := frm;
Left := 286;
Top := 24;
Width := 121;
Height := 21;
TabOrder := 4;
Text := 'menu_select?ask=-1&reply=8';
end;
Edit4:=TEdit.Create(frm);
with Edit4 dobegin
Name:='Edit4';
Parent := frm;
Left := 288;
Top := 72;
Width := 121;
Height := 21;
TabOrder := 5;
Text := '0';
end;
msg:=TMemo.Create(frm);
with msg dobegin
Parent := frm;
align:=alBottom;
ReadOnly:=true;
ScrollBars:=2;
Width:=418;
Height:=180;
Lines.Add('...');
end;
frm.Show;
trade1:=TTimer.Create(nil);
trade1.OnTimer:=@Ontrade1;
trade1.enabled:=false;
trade1.interval:=1000; //время задержкиend;
//***************************************************************//Вызывается при выключении скрипта//***************************************************************procedure Free;
begin
ItemBase:=nil;
ItemBase2:=nil;
label1.Free;
label2.Free;
label3.Free;
label4.Free;
label5.Free;
label6.Free;
edit1.Free;
edit2.Free;
edit3.Free;
edit4.Free;
combobox1.Free;
combobox2.Free;
button1.Free;
button2.Free;
msg.Free;
frm.Free;
trade1.OnTimer := nil;
trade1.Enabled := false;
trade1.Interval := 0;
trade1.Free;
//считываем ID// TraderID:=8572;// Edit1.Text:=inttostr(TraderID);end;
//******************************************************************************procedure Button1Click(Sender: TButton);
begin// Button1.Caption := 'Stop';// ShowMessage(Sender.Name);// frm.ModalResult:=mrOk;// if not status then exit;// TraderID:=strtoint(Edit1.Text);
msg.Lines.Add('TraderID:'+inttostr(TraderID));
{ SellItemID:=strtoint(Edit2.Text);
SellItemValue:=strtoint(Edit4.Text);
msg.Lines.Add('SellItemID:'+inttostr(SellItemID));
msg.Lines.Add('SellItemValue:'+inttostr(SellItemValue));
} Status:=true;
trade1.enabled:=true;
msg.Lines.Add('Начинаем продавать...');
end;
//******************************************************************************procedure Button2Click(Sender: TButton);
begin
Status:=false;
trade1.enabled:=false;
msg.Lines.Add('Хватит на сегодня!');
end;
//******************************************************************************procedure ComboBox1Click(Sender: TObject);
beginShowMessage(Sender.ClassName);
frm.ModalResult:=mrOk;
end;
//******************************************************************************procedure ComboBox1Change(Sender: TObject);
beginShowMessage(Sender.ClassName);
frm.ModalResult:=mrOk;
ComboBox1.Items.Add('Новая строка');
Edit1.Text:=ComboBox1.Items.Strings[ComboBox1.ItemIndex];
// Edit1.text:=ComboBox1.text;
ComboBox1.Items.Delete(ComboBox1.ItemIndex);
end;
//******************************************************************************procedure ComboBox2Click(Sender: TObject);
begin// ShowMessage(Sender.Name);// frm.ModalResult:=mrOk;end;
//******************************************************************************procedure ComboBox2Change(Sender: TObject);
begin// ShowMessage(Sender.Name);// frm.ModalResult:=mrOk;end;
//***************************************************************//21=RequestBypassToServer:s(Cmd)//посылаем, чтобы получить пакет BuyItem с ListIDprocedure RequestByPassToServer(cmd:string);
begin
buf:=#$21;
WriteS(cmd);
SendToServerEx(Name);
end;
//***************************************************************//s10=SellList:d(Money)h(ListID)w(ListCount)w(ItemType1)h(ObjectID)i(ItemID)d(Count)w(ItemType2)w(h)d(ItemBodyPart)w(EnchantLevel)w(h)w(h)d(refPrice)//c1E=RequestSellItem:h(ListID)d(SellCount)h(ObjectID)i(ItemID)d(Count)//продаем по одному типуprocedure RequestSellItem(ItemOID,ItemID,Count:integer);
beginif ReadyToSell thenbegin
msg.Lines.Add('Продадим предмет OID:'+inttostr(ItemOID)+' ID:'+inttostr(ItemID)+' в кол-ве:'+inttostr(count));
buf:=#$1E;
WriteD(ListID);
WriteD(1);
WriteD(ItemOID);
WriteD(ItemID);
if count>99999then count:=99999; //макс количество продаваемых вещей
WriteD(Count);
SendToServerEx(Name);
end;
end;
//***************************************************************//c1F=RequestBuyItem:h(ListID)d(BuyCount)i(ItemID)d(Count)//купим по одному типуprocedure RequestBuyItem(ItemID,Count:integer);
beginif ReadyToBuy thenbegin
msg.Lines.Add('Купим предмет ID:'+inttostr(ItemID)+' в кол-ве:'+inttostr(count));
buf:=#$1F;
WriteD(ListID);
WriteD(1);
WriteD(ItemID);
WriteD(Count);
SendToServerEx(Name);
end;
end;
//***************************************************************//cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Amount)//продаем по одному типуprocedure RequestMultiSellItem(ListId,EntryID,Count:integer);
begin
msg.Lines.Add('Обменяем предмет ListID:'+inttostr(ListID)+' EntryID:'+inttostr(EntryID)+' в кол-ве:'+inttostr(count));
if ReadyToMultiSell thenbegin
buf:=#$A7;
WriteD(ListID);
WriteD(EntryId);
WriteD(Count);
SendToServerEx(Name);
end;
end;
//***************************************************************//04=Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b(ShiftFlag)procedure Target(Attacker: Integer);
begin
buf:=#$04;
WriteD(Attacker);
WriteD(MyXpos);
WriteD(MyYpos);
WriteD(MyZpos);
WriteC(00);
SendToServerEx(Name);
end;
//***************************************************************procedure TargetAttacker(Attacker: Integer);
begin
msg.Lines.Add('Attacker='+IntToStr(Attacker)+' Player='+IntToStr(MyID));
Target(Attacker);
delay(1000);
Target(Attacker);
end;
//***************************************************************// Вся торговля здесь!!!//***************************************************************procedure OnTrade1(Sender: TObject);
begin//-------------------------------------------------//продаем фишерману из массива TradeSellItem//-------------------------------------------------if ReadyToSell thenexit; //если еще не продали предыдущую вещь, то выходим сразу//мы у фишермана, продаем всё ненужноеif TraderOID=0thenbegin
Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Не готовы к торговле, нет OID продавца! Требуется отбежать подальше и вернуться.');
exit; //выходимend;
if(TradeCount=TradeSellItemCount)thenbegin//проверка на выход из массива
Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Всё продали!');
endelsebeginif FindItem(TradeSellItem[TradeCount])<>0thenbegin//проверка, что предмет есть в инвентаре и его можно продать
TargetAttacker(TraderOID); //фишермана в таргет
msg.Lines.Add('Готовы продать:'+inttostr(TradeSellItem[TradeCount]));
ReadyToSell:=true; //готовы продаватьendelse msg.Lines.Add('Нет такого предмета:'+inttostr(TradeSellItem[TradeCount]));
inc(TradeCount); //выбираем следующий предмет
msg.Lines.Add('TradeCount/TradeSellItemCount:'+inttostr(TradeCount)+'/'+inttostr(TradeSellItemCount-1));
end;
end;
//******************************************************************************procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemIDvar
i, j, ListCount: integer;
beginfor i:=1tomaxdobegin//очищаем масив
ItemBase[1,i]:=0;
ItemBase[2,i]:=0;
ItemBase[3,i]:=0;
end;
ColvoItm:=0;
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!if ListCount>max then ListCount:=max;
j:=8; //смещение для ObjectID//Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemIDfor i:=1to ListCount dobegin
itemBase[1,i]:=ReadD(j); //OID
itemBase[2,i]:=ReadD(j); //ItemID
itemBase[3,i]:=ReadD(j); //ItemCount//Say('i='+inttostr(i)+' ItemBase[1,i]='+IntToStr(ItemBase[1,i])+' ItemBase[2,i]='+IntToStr(ItemBase[2,i])+' ItemBase[3,i]='+IntToStr(ItemBase[3,i]));//1B=ItemListPacket:w(window)w(ListCount)w(itemType1)h(ObjectID)i(ItemID)d(count)w(itemType2)w(CustType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(CustType2)
j:=j+offs1; //16 для С4, 24 для интерлюдииend;
ColvoItm:=ListCount;
msg.Lines.Add('>ColvoItm='+IntToStr(Colvoitm));
end;
//******************************************************************************//27=InventoryUpdate:w(count)w(1add2mod3remove)w(itemType1)d(ObjectID)i(ItemId)d(Count)w(itemType2)w(cusType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(cusType2)procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemIDvar
i, ii, j, ObjID, ItemID, ItemCount, ListCount, UpdType: integer;
add : boolean;
begin
add:=false;
ListCount:=ReadH(2); //количество итемов//Пробегаем по Инвентарю и сохраняем пары ObjectID - Lvl
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален// Say('Апдейт базы!');for i:=1to ListCount dobegin
UpdType:=ReadH(j);
j:=j+2;
ObjID:=ReadD(j); //ObjectID
ItemID:=ReadD(j); //ItemID
ItemCount:=ReadD(j); //Count// Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));case UpdType of1: beginfor ii:=1tomaxdoif(ItemBase[1,ii]=0)and(add=false)thenbegin
ItemBase[1,ii]:=ObjID;
ItemBase[2,ii]:=ItemID;
ItemBase[3,ii]:=ItemCount;
msg.Lines.Add('Добавили предмет!');
msg.Lines.Add('i='+inttostr(ii)+' ItemBase[1,ii]='+IntToStr(ItemBase[1,ii])+' ItemBase[2,ii]='+IntToStr(ItemBase[2,ii])+' ItemBase[3,ii]='+IntToStr(ItemBase[3,ii]));
ColvoItm:=ColvoItm+ItemCount;
add:=true;
end;
end;
2: beginfor ii:=1tomaxdoif ItemBase[1,ii]=ObjID thenbegin
ItemBase[3,ii]:=ItemCount;
msg.Lines.Add('Изменяем параметры предмета!');
msg.Lines.Add('i='+inttostr(ii)+' ItemBase[1,ii]='+IntToStr(ItemBase[1,ii])+' ItemBase[2,ii]='+IntToStr(ItemBase[2,ii])+' ItemBase[3,ii]='+IntToStr(ItemBase[3,ii]));
end;
end;
//удален3: beginfor ii:=1tomaxdoif ItemBase[1,ii]=ObjID thenbegin
msg.Lines.Add('Удаляем предмет!');
msg.Lines.Add('i='+inttostr(ii)+' ItemBase[1,ii]='+IntToStr(ItemBase[1,ii])+' ItemBase[2,ii]='+IntToStr(ItemBase[2,ii])+' ItemBase[3,ii]='+IntToStr(ItemBase[3,ii]));
ItemBase[1,ii]:=0;
ItemBase[2,ii]:=0;
ItemBase[3,ii]:=0;
ColvoItm:=ColvoItm-ItemCount;
end;
end;
end;
j:=j+offs2; //14 для С4, 22 для интерлюдииend;
msg.Lines.Add('>>ColvoItm='+IntToStr(Colvoitm));
end;
//******************************************************************************function FindItem(item:integer) : integer; //находим в инвентаре все предметы с ItemIDvar
i, j : integer;
beginfor i:=1tomaxdobegin//очищаем масив
ItemBase2[1,i]:=0;
ItemBase2[2,i]:=0;
ItemBase2[3,i]:=0;
end;
ColvoItm2:=0;
j:=1;
for i:=1tomaxdobegin//находим подходящий предметif(ItemBase[2,i]=item)thenbegin
msg.Lines.Add('i='+inttostr(i)+' ItemBase[1,i]='+IntToStr(ItemBase[1,i])+' ItemBase[2,i]='+IntToStr(ItemBase[2,i])+' ItemBase[3,i]='+IntToStr(ItemBase[3,i]));
ItemBase2[1,j]:=ItemBase[1,i];
ItemBase2[2,j]:=ItemBase[2,i];
ItemBase2[3,j]:=ItemBase[3,i];
ColvoItm2:=ColvoItm2+ItemBase[3,i];
inc(j);
end;
end;
result:=colvoitm2;
msg.Lines.Add('ColvoItm2='+IntToStr(Colvoitm2));
end;
//******************************************************************************// вызывается при приходе каждого пакета, если скрипт включен//******************************************************************************begin//**************************************************************************//не обрабатываем пустые пакетыif pck=''thenexit;
//**************************************************************************//продажа состоит из следующих шагов://1. таргет на продавце, пауза, снова таргет c04=Action, c04=Action//2. приходит s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)//3. шлем выбранный пункт из меню c21=RequestBypassToServer:s(Cmd)//4. приходит s10=SellList:d(Money)h(ListID)w(ListCount)w(ItemType1)h(ObjectID)i(ItemID)d(Count)w(ItemType2)w(h)d(ItemBodyPart)w(EnchantLevel)w(h)w(h)d(refPrice)//5. FindItem(ID) найдем OID, Count нужной вещи по ID//6. шлем c1E=RequestSellItem:h(ListID)d(SellCount)h(ObjectID)i(ItemID)d(Count)//**************************************************************************if ReadyToSell and(TraderOID<>0)thenbeginif(ConnectName=Name)and FromServer thenbegincase pck[1] of//после того, как мы взяли в таргет продавца приходит этот пакет (#$0F)//s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)
#$0F: begin
msg.Lines.Add('S>Пакет NpcHtmlMessage #$0F');
if ReadD(2)=TraderOID thenbegin
delay(1000); //делаем небольшую паузу, чтобы пакеты шли в правильном порядке//шлем запрос выбора пункта - продажа//c21=RequestBypassToServer:s(Cmd)
RequestByPassToServer(GetSellList);
msg.Lines.Add('C>Пакет RequestBypassToServer #$21 (sell)');
end;
end;
//после выбора пункта - продажа, приходит этот пакет (#$10)//s10=SellList:d(Money)h(ListID)w(ListCount)w(ItemType1)h(ObjectID)i(ItemID)d(Count)w(ItemType2)w(h)d(ItemBodyPart)w(EnchantLevel)w(h)w(h)d(refPrice)
#$10: begin
delay(1000); //делаем небольшую паузу, чтобы пакеты шли в правильном порядке
msg.Lines.Add('S>Пакет SellList #$10');
ListID:=ReadD(6); //запоминаем, он все время разный
msg.Lines.Add('ListID='+inttostr(ListID));
//шлем запрос на продажу//c1E=RequestSellItem:h(ListID)d(SellCount)h(ObjectID)i(ItemID)d(Count)
msg.Lines.Add('C>Пакет RequestSellItem #$1E');
//продадим первый из списка
msg.Lines.Add('FindItem: OID:'+IntToStr(ItemBase2[1,1])+' ID:'+IntToStr(ItemBase2[2,1])+' Count:'+IntToStr(ItemBase2[3,1]));
RequestSellItem(ItemBase2[1,1],ItemBase2[2,1],ItemBase2[3,1]);
ReadyToSell:=false; //закончили с предметомend;
end;
end;
end;
//****************************************************************************if(ConnectName=Name)and FromServer thenbegincase pck[1] of
#$04: begin//msg.Lines.Add('S>Пакет UserInfo #$04');//пакет с инфой о моём чаре
i:=2;
MyXpos:=ReadD(i); //получаю координату х моего чара
MyYpos:=ReadD(i); //получаю координату у моего чара
MyZpos:=ReadD(i); //получаю координату z моего чара//Запоминаем ИД
i:=18;
MyID:=ReadD(i); //получаю ид моего чара//смещение переменное, зависит от имени (LenName*2+2)
i:=i+(Length(Name)*2+2)+offs3; //44 для С4, 48 для IL
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
//********************************************************************//проверка на готовность скриптаif(MyID<>0)and(TraderOID<>0)and(TraderID<>0)thenbegin// and (TraderOID<>0) and (TraderID<>0) and (SellItemOID<>0) and (SellItemID<>0) and (SellItemValue<>0) and not status
msg.Lines.Add('Скрипт инициализирован!');
msg.Lines.Add('Социальное действие YES - начать!');
msg.Lines.Add('Социальное действие NO - остановиться!');
end;
end;
//***************************************************************//16=NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X)d(Y)d(Z)d(Heading)d(d)d(Maspd)d(Paspd)d(runSpd)d(walkSpd)d(swimRSpd)d(swimWSpd)d(flRSpd)d(flWSpd)d(FlyRSpd)d(FlyWSpd)f(ProperMul)f(Paspd)f(CollisRadius)f(CollisHeight)d(RHand)d(d)d(LHand)b(nameabove)b(isRun)b(isInFight)b(isAlikeDead)b(isSummoned)s(Name)s(Title)d(d)d(d)d(karma?)d(abnEffect)d(d)d(d)d(d)d(d)b(c)b(Team)f(collisRadius)f(collisHeight)d(d)
#$16: begin
msg.Lines.Add('S>Пакет NpcInfo #$16');
//считываем ID// TraderID:=strtoint(Edit1.Text);if ReadD(6)=(kID+TraderID)thenbegin
TraderOID:=ReadD(2);
msg.Lines.Add('TraderOID='+inttostr(TraderOID));
end;
end;
//***************************************************************//1B=ItemListPacket:w(window)w(ListCount)w(itemType1)h(ObjectID)i(ItemID)d(count)w(itemType2)w(CustType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(CustType2)d(Augment)d(--)//ItemList - 28 для C4, 36 - IL
#$1B: begin
msg.Lines.Add('S>Пакет ItemListPacket #$1B');
CreateItemBase; //создание базы предметовend;
//***************************************************************//27=InventoryUpdate:w(count)w(1add2mod3remove)w(itemType1)d(ObjectID)i(ItemId)d(Count)w(itemType2)w(cusType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(cusType2)-(8)//необходимо уточнить ItemID для своего сервера!!!//запоминаем ObjectID Lure и ColvoLure
#$27: begin// 41(42) для IL, 32(34) для С4
msg.Lines.Add('S>Пакет InventoryUpdate #$27');
UpdateItemBase; //Обновление базы, если принят пакет на удаление предметаend;
end;
end;
//****************************************************************************if(ConnectName=Name)and FromClient thenbegincase pck[1] of//Социальные действия
#$1B: begin//msg.Lines.Add('C>Пакет RequestSicialAction #$1B');case ReadD(2)of//социальное действие Yes для начала ловли6: begin// if not status then exit;
Status:=true;
trade1.enabled:=true;
msg.Lines.Add('Начинаем продавать...');
//не передаем серверу
pck:='';
end;
//социальное действие No для окончания5: begin
Status:=false;
trade1.enabled:=false;
msg.Lines.Add('Хватит на сегодня!');
//не передаем серверу
pck:='';
end;
end;
end;
//ValidatePosition пакет от клиента с моими кординатами
#$48: begin//msg.Lines.Add('C>Пакет ValidatePosition #$48');
MyXpos:=ReadD(2); //получаю координату х моего чара
MyYpos:=ReadD(6); //получаю координату у моего чара
MyZpos:=ReadD(10); //получаю координату z моего чараend;
end;
end;
end.
ЗЫЖ что-то отзывов нет, не работает что ли?
Последний раз редактировалось NLObP, 25.04.2008 в 13:34.
народ!, скрипты просьба выделять с помощью BBCode - [ HIGHLIGHT="delphi" ]ваш скрипт[ /HIGHLIGHT ]
а не с помощью [ PHP ][ /PHP ]
для этого просто выделяете скрипт и жмёте в редакторе сообщения самую правую кнопочку на панеле инструментов на которой нарисовано # и указываете в качестве параметра delphi
__________________
Я здесь практически не появляюсь!, Skype - ikskor
можно усовершенствовать скрипт чтобы не было такой ерунды типа
прописывания в переменной кол-ва вещей в инвентаре. кол-во вещей передаётся сразу после входа в игру. приходит пакет с полным описанием предметов в инвентарей.
можно усовершенствовать скрипт чтобы не было такой ерунды типа прописывания в переменной кол-ва вещей в инвентаре. кол-во вещей передаётся сразу после входа в игру. приходит пакет с полным описанием предметов в инвентарей.
По моему ты не там спросил. Это скрипт на движение.
По вопросу. Ты про это?
Код:
max=80; //размер инвентаря чара
Скрипт обычно при входе в игру отключен. На версии 3.1.8 при включении без входа в игру выдает ошибку, так как завязан на имя подключения. Так что надо доработывать, чтобы была возможность включения скрипта до подключения чара.
По моему ты не там спросил. Это скрипт на движение.
По вопросу. Ты про это?
Код:
max=80; //размер инвентаря чара
Скрипт обычно при входе в игру отключен. На версии 3.1.8 при включении без входа в игру выдает ошибку, так как завязан на имя подключения. Так что надо доработывать, чтобы была возможность включения скрипта до подключения чара.
зачем??.. инвентарь стабильно вызывается в произвольный момент при отправке пакета 0F
смотреть ответ и узнавать размер пакета можно... а следовательно из размера пакета можно и кол-во предметов там узнать..
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
зачем??.. инвентарь стабильно вызывается в произвольный момент при отправке пакета 0F
смотреть ответ и узнавать размер пакета можно... а следовательно из размера пакета можно и кол-во предметов там узнать..
Да, я просто глянул что у чара размер инвентаря 80 и прописал в переменной. Можно и по количеству вещей в инвентаре делать массив.
Последний раз редактировалось NLObP, 29.04.2008 в 23:23.
Вот мой скрипт был такой баг у GMSHOP, что покупка-продажа меча берсек давала прибыль примерно 115к
скрипт что и делает автоматом может не совсем по вашей теме ну автопродажа..
delphi Код:
//// Script auto buy-sell v.4.0 (c)2007-2008 by Alxabay// For home use only:)// ()// 2.1 работает на одну вещь// 3.8 покупка стопки вещей// +устранил косяк с буфером// 4.0 все сделал как нада :)// (выделить GMSHOP и Yes) проверял только на локальном сервере Interlude ява, на других может нету этого бгconst
Name='qqq'; //svoi nick
IDveshi=5286; //bersek prostoimax=250;
maxBG=500; //maximalno skolko xotim bagov nadelat' maxBG*maxBUY*115k
maxBUY=30; //skolko pokupaem za 1 razvar
status: boolean; //status pokupki - prodaji
SocialID,countBG:integer;
Timer1:TTimer;
VM: integer;
procedure Init;
begin
Timer1:=TTimer.Create(nil);
Timer1.OnTimer:=@OnTimer1;
Timer1.enabled:=false;
Timer1.interval:=400; //интервал таймера в милисекундах //bistree mojet kicknut' za flood
status:=false;
countBG:=0;
VM:=0;
end;
procedure Free;
begin
Timer1.Free;
end;
procedure Say(msg:string); //pisat' v igrubegin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
function listaem: integer; //nujen paket s inventaremvar
i, j, ObjID, ItemID, ListCount: integer;
begin
Result:=0;
VM:=0;
j:=4; //смещение для ListCount
ListCount:=ReadH(j);
if ListCount>max then ListCount:=max;
j:=8; //смещение для ObjectID
buf:=hstr('1E 00 00 00 00');
writed(VM);
for i:=1to ListCount dobegin
ObjID:=ReadD(j); //ObjectID
ItemID:=ReadD(j); //ItemID
j:=j+14;
ReadD(j); //lvl propuskaemcase ItemID of
IDveshi: begin
WriteD(ObjID);
writed(IDveshi);
WriteD(1);
VM:=VM+1;
end;
end;
j:=j+10;
end;
if(VM=0)thenbeginexit;
end;
writed(VM,6);
status:=true;
sendtoserverex(Name);
end;
procedure Buy;
begin
buf:=hstr('A7 96 02 00 00 A0 BB 0D 00'); //pokupka v GMSHOP (тут номер списка и итема в нем, может быть по разному зависит от GMSHOPa)
writed(maxBUY);
writed(0);
SendToServerex(Name);
end;
procedure stopit;
begin
Timer1.Enabled:=false;//закончили :)
status:=false; //**********************************************
Say('bagernuli deneg: ~'+floattostr(maxBUY*115*countBG/1000)+'kk za '+floattostr(countBG*Timer1.interval/10/60)+'sec');
VM:=0;
countBG:=0;
end;
procedure OnTimer1(Sender: TObject);
beginif status thenexit; //uje kupili exitif(countBG=maxBG)then stopit; //maxBG zakon4ili bagerit'
status:=true;
Buy;
inc(countBG);
end;
beginif pck=''thenexit;
if FromClient and(pck[1]=#$1B)thenbegin
SocialID:=ReadD(2);
case SocialID of6:beginif status thenbegin
Say('uje rabotaet ili xz ERROR!');
exit;
end;
Say('Bagerim: '+inttostr(maxBG)+' raz po '+inttostr(maxBUY)+' pushek');
countBG:=0;
VM:=0;
Timer1.Enabled:=true;//началиend;
5:begin
stopit;
end;
end;
end;
if FromServer and(pck[1]=#$1B)and status thenbegin//paket o tom 4to v sumku upalo
status:=false;
listaem; //ishim i prodaemend;
end.
Последний раз редактировалось alxabay, 29.04.2008 в 13:52.
1E=RequestSellItem:h(ListID)d(SellCount)h(ObjectID )i(ItemID)d(Count)
A7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Amo unt)w(ench)
В реале, на ПТС, ListID всегда разный и ИМХО с нулем не будет работать.
тот сервер снесли ну скрипт работал дай боже)
почему ListID(в 1E продажа) не может быть 0 вроде он и есть 0
а на счет h(ListID)d(EntryID) в А7 то согласен они различатся будут ну их и посмотреть нет проблем.
Последний раз редактировалось alxabay, 29.04.2008 в 22:11.