PDA

Просмотр полной версии : Продажа вещей с уникальным ID


Hworang
13.02.2010, 17:17
Уже долго ищу этот скрипт и прошу помощи.
На многих серверах есть фишка с ГМ шопом - вещи продаются дешевле чем покупаются.

Скрипт для продаже (и покупки) вещей с уникальным ID - которые не складываются в стопку.

И было бы очень полезно узнать как сделать такой скрипт или (мечты конечно) получить готовый, куда нужно вписать имя чара.

P.S. покажите хотябы пример, как отправлять пакет на покупку и продажу через скрипт

Xa4ik
13.02.2010, 18:23
А на заточку +65к и последущийю дюп ненужно ?

Hworang
13.02.2010, 18:39
А на заточку +65к и последущийю дюп ненужно ?

Не совсем понял смысл.
Начнем с того что твоё сообщение не по теме. (собственно а твое в формате "сделайтехтотатошояхашу", кстати, в правила раздела смотрел?)
Дальше - ты меня упрекаешь за "якобы" завышенную просьбу (вот чета мне кажеццо что порывшись по форуму, и описанию функций, методом проб и ошибок мона _научицЦа_ скрипты писать, даже без создания вот таких тем.. или я неправ ?)
Если ты сравниваешь мою просьбу (скрипт на продажу) с заточкой на 65к - ты очень сильно ошибаешься (ога. объемы кода не идут ни в какое сравнение. в этом случае код в разы больше.)

Сейчас уже давно не дырявые ц3 - сейчас во всех сборках проверки есть во всех возможных местах
ни о каком дюпе и заточке (не свитками) не может быть и речи - стыдно такого не знать и приводить в пример

дальше
на каждои 3м пвп сервере админ по-ошибке указывает необъективную цену на какую-то вещь в гм-шопе (ващето это баг самой сборки. как бэ, и нежелание горе-админа проверить на наличие таких вещей, что впрочем делаеццо одним скуель запросом.)
и можно долго и нудно фармить адену, кликая мышкой на каждую вещь (продавая их) (а я когда-то шото подобное здал, и потом долго еще одминил этот сервер из под ссш. пока дедик у одмина не отобрали.)
а можно и скриптом (скрипт кстати несложный, жаль что я не знаю как его написать - ужеб давно сам сделал) (поиск по фразе "инвентаризация" - даст 80% скрипта.)

так вот - трудно переоценить важность такого скрипта, и если уж он появится - непременно станет популярным, и люди будут чаще заходить на этот портал, спрашивать и отвечать (99% из приходящих кричат "дайте", а потом уже получая недельное успокоительно тихо находят то шо надо, либо собирают с кусков. и иногда даже выкладывают.)
и конечно же администрация портала получит больше денег за рекламу (Ога, милиард. я не против.)
и конечно же автору и всем остальным будет приятно помочь неграмотным (в смысле кода) людям (афторы уже зае**сь, если честно.)
и конечно же не обойдется без флуда, наподобие твоего сообщения (и попрошайничества. вроде этого сообщения)

alexteam
13.02.2010, 20:47
чето сообщение стало похоже на мою тетрадку по русскому языку.. в пятом классе..

spoil99
13.02.2010, 21:05
чето сообщение стало похоже на мою тетрадку по русскому языку.. в пятом классе..
тебе еще повезло, а мне до сих пор это снится!:D

alexteam
13.02.2010, 21:06
ну.. да.. логично.. события прошлогодней давности не так смазаны в памяти как события 15 летней..

Breadfan
13.02.2010, 22:37
как сделать такой скрипт
P.S. покажите хотябы пример, как отправлять пакет на покупку и продажу через скрипт - ставишь галкку Запоминать пакеты от клиента - и вперед - получаешь покупку, ставишь галку на ...от сервера - вуаля - получаешь пакет итемапдейт - с оид и прочим...вроде и все. Скриптом спамишь пакет на покупку, получая итемапдейт - выясняешь оид итема, и, используя полученные данные, составляешь пакет на продажу...

Hworang
15.02.2010, 08:53
Спс QaK за инвентаризацию (http://coderx.ru/showpost.php?p=82&postcount=6)
на её основе составил скрипт

тормозит и комп и линия
помогите оптимизировать
var i:integer;
const nik = 'LooksThatKill';
procedure Init;
begin

end;

procedure Free;
begin

end;

begin
if pck='' then exit;
if FromServer and (ConnectName=nik) then
begin
if (pck[1]=#$1B) then //если получили итемлист
begin

if (ReadH(4)<10) then //если вещей у рюкзаке <10 (вместимость 200 а купить надо 190)
begin
buf:=HStr('A7 9A 5F 01 00 A0 BB 0D 00 BE 00 00 00 00 00 00 00 00 00 00 00 '); //покупаем 190 вещей
SendToServerEx(nik);
end
else
begin
buf:=HStr('0F '); //запрос на итемлист
SendToServerEx(nik);
end;

buf:=#$1E; //составляем продажу
WriteD(0);
WriteD(ReadH(4)-2); //колво на продажу = всё - 2 итема (адена и голд бары)

if (ReadD(12)=2414) then //если 1й итем у нас - один из 190 (который продавать)
for i:=1 to (ReadH(4)-2) do
begin
WriteD(ReadD(i*36-28));
WriteD(2414);
WriteD(1);
end
else
for i:=1 to (ReadH(4)-2) do //если он не первый - значит 3й
begin
WriteD(ReadD(i*36+44));
WriteD(2414);
WriteD(1);
end;
SendToServerEx(nik); //продаём
end;
end;

buf:=HStr('0F '); //запрос итемлиста
SendToServerEx(nik);

if (ReadD(16)>700000000) and (ReadD(12)=57) then //если адены больше 700кк покупаем голдбар (500кк)
begin
buf:=HStr('38 2E 00 64 00 65 00 70 00 6F 00 73 00 69 00 74 00 00 00 00 00 00 00 ');
SendToServerEx(nik);
end;
end.

Breadfan
15.02.2010, 20:26
if FromServer and (ConnectName=nik) then
begin
if (pck[1]=#$1B) then //если получили итемлист
begin

if (ReadH(4)<10) then //если вещей у рюкзаке <10 (вместимость 200 а купить надо 190)
begin
buf:=HStr('A7 9A 5F 01 00 A0 BB 0D 00 BE 00 00 00 00 00 00 00 00 00 00 00 '); //покупаем 190 вещей
SendToServerEx(nik);
end
else
begin
buf:=HStr('0F '); //запрос на итемлист
SendToServerEx(nik);
end;

скрипт тупо спамит 0F в ответ на любой пакет от серва - что явно не есть гуд.....убей эту ветку, а посылку на итемлист в начало скрипта просто вставь один раз

Hworang
15.02.2010, 20:57
скрипт тупо спамит 0F в ответ на любой пакет от серва - что явно не есть гуд.....убей эту ветку, а посылку на итемлист в начало скрипта просто вставь один раз
спс

а я то думаю - падение сервера через 10 минут после запуска скрипта связано со мной или нет )))

вот как получилось
пока работает

где почитать - как сделать окошко для скрипта (как у nlobp в скрипте заточки)?
хотябы самое простое - чтобы была кнопка старт/стоп и кол-во адены писалось

var i:integer;
const nik = 'Char';
procedure Init; //зачем это нужно - не пойму
begin

end;

procedure Free; //зачем это нужно - не пойму
begin

end;

begin
buf:=HStr('0F ');
SendToServerEx(nik);

if pck='' then exit; //зачем это нужно - не пойму

if FromServer and (ConnectName=nik) and (pck[1]=#$1B) then //упростил условный оператор
begin

if (ReadH(4)<10) then
begin
buf:=HStr('A7 9A 5F 01 00 A0 BB 0D 00 ');
WriteD(195); //купить 195
WriteH(0);
SendToServerEx(nik);
end;

buf:=#$1E;
WriteD(0);
WriteD(ReadH(4)-2);

if (ReadD(12)=2414) then
for i:=1 to (ReadH(4)-2) do
begin
WriteD(ReadD(i*36-28));
WriteD(2414);
WriteD(1);
end
else
for i:=1 to (ReadH(4)-2) do
begin
WriteD(ReadD(i*36+44));
WriteD(2414);
WriteD(1);
end;
SendToServerEx(nik);
end;

//buf:=HStr('0F ');
//SendToServerEx(nik);

if (ReadD(16)>700000000) and (ReadD(12)=57) then
begin
buf:=HStr('38 2E 00 64 00 65 00 70 00 6F 00 73 00 69 00 74 00 00 00 00 00 00 00 ');
SendToServerEx(nik);
end;
end.

Breadfan
15.02.2010, 22:26
в блок инит пихни ваще его - оно выполняется лишь при запуске скрипта

Hworang
16.02.2010, 00:33
в блок инит пихни ваще его - оно выполняется лишь при запуске скрипта

procedure Init;
begin
buf:=HStr('0F ');
SendToServerEx(nik);
end;

в остальных местах удалил

скрипт выполняется 3-4 раза и потом стоит
после закрытия и открытия рюкзака продолжает работу (еще несколько раз выполняется и опять стоит)

p.s. с прошлой версией скрипта вроде особых проблем не было
но вот иногда, особенно при загрузке канала, вылетала ошибка Last Index Out Of Bounds 4995 (4994-4999 примерно такие числа)
что неприятно (

Hworang
16.02.2010, 12:34
наконецто я могу сказать, что написал свой 1й скрипт для phx )))
жаль только кнопка 'Стоп' не работает

http://img51.imageshack.us/img51/1210/prodo.jpg


//////////////////////////////////////////////////////////////////////
// Продавалка v 1.0 от Hworang ///////////////////////////////////////
// на основе скриптов от Qak /////////////////////////////////////////
// CoderX.ru /////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Настроена для сервера l2mw.ru /////////////////////////////////////
// создайте чара и почистите рюкзак //////////////////////////////////
// стартовые условия - 100kk и 1 голд бар и болше ничего (2/200) /////
// впишите свой ник в соотв. поле (в скрипте) ////////////////////////
// подойдите к ГМшопу и возьмите его в таргет ////////////////////////
// запускайте скрипт и радуйтесь, видя как адена льётся в рюкзак))) //
// все изменения - на свой страх и риск //////////////////////////////
// за последствия работы скрипта автор ответственности не несет :D ///
//////////////////////////////////////////////////////////////////////

var i,c,g:integer;
s:string;
Main : TForm;
Timer : TTimer;
Button : TButton;
Edit,Edit1: TEdit;
Start : Boolean = False;
Pos_i : Integer;

const nik = 'Char'; // Сюда вписать имя чара
it = 195; // скрипт покупает 195 итемов - можете править этот параметр [1..198]
x = 1680; // введите разрешение вашего монитора
y = 1050; //

procedure Init;
begin
g:=1;
buf:=HStr('0F ');
SendToServerEx(nik);

Pos_i:=1;
//формочка
Main := TForm.Create(nil);
Main.Caption := 'Продавалка v 1.0';
Main.BorderStyle := bsSizeable;
Main.Position := poDesigned;
Main.Left :=x-400;
Main.Top :=y-200;
Main.Width :=300;
Main.Height :=80;

Edit := TEdit.Create(Main);
Edit.Parent := Main;
Edit.Left := 90;
Edit.Top := 10;
Edit.Width := 114;

Edit1 := TEdit.Create(Main);
Edit1.Parent := Main;
Edit1.Left := 214;
Edit1.Top := 10;
Edit1.Width := 62;

//таймер
Timer := TTimer.Create(Main);
Timer.Interval := 400; // задержка // если поставить меньше - адена пойдет быстрее, но будет лагать
Timer.Enabled := False;
Timer.onTimer := @TimerTimer;

Button := TButton.Create(Main);
Button.Parent := Main;
Button.Caption := 'Старт';
Button.Left := 10;
Button.Top := 10;
Button.onClick := @ButtonClick;

Main.Show;
end;

procedure Free;
begin
Edit.Free;
Edit1.Free;
Timer.Free;
Button.Free;
Main.Free;
end;

//обработчик таймера
procedure TimerTimer(Sender : TTimer);
var i,a:integer;
begin

if (pck[1]=#$1B) then
begin
if (ReadD(12)=57) then
begin
Edit.Text:='Adena ( '+IntToStr(ReadD(16))+' )';
Edit1.Text:='Gold ( '+IntToStr(ReadD(52))+' )';
end
else if (ReadD(48)=57) then
begin
Edit.Text:='Adena ( '+IntToStr(ReadD(52))+' )';
Edit1.Text:='Gold ( '+IntToStr(ReadD(16))+' )';
end;
end;

inc(g);
if pck='' then exit;

if (g mod 2 = 0) then // запрос на рюкзак - через раз, иначе спамим сервер
begin
buf:=HStr('0F ');
SendToServerEx(nik);
end;

if FromServer and (ConnectName=nik) and (pck[1]=#$1B) and (ReadH(4)<10) then
begin
buf:=#$A7;
WriteD(90010);
WriteD(900000);
WriteD(it);
WriteH(0);
SendToServerEx(nik);
end;


if FromServer and (ConnectName=nik) and (pck[1]=#$1B) then
begin
c:=ReadH(4)-2;
buf:=#$1E;
WriteD(0);
WriteD(c);

if (ReadD(12)=2414) then
for i:=1 to c do
begin
WriteD(ReadD(i*36-28));
WriteD(2414);
WriteD(1);
end
else if (ReadD(48)=2414) then
for i:=1 to c do
begin
WriteD(ReadD(i*36+8));
WriteD(2414);
WriteD(1);
end
else if (ReadD(84)=2414) then
for i:=1 to c do
begin
WriteD(ReadD(i*36+44));
WriteD(2414);
WriteD(1);
end;
if (c>=1) then
SendToServerEx(nik);
end;

if ((ReadD(16)>700000000) and (ReadD(12)=57)) or ((ReadD(52)>700000000) and (ReadD(48)=57)) and (pck[1]=#$1B) then
begin
buf:=#$38;
WriteS('.deposit');
WriteD(0);
SendToServerEx(nik);
end;

end;

//запуск
procedure ButtonClick(Sender : TButton);
begin
Start := Not (Start);
Timer.Enabled := Start;
If Start
then Button.Caption:='Стоп'
else Button.Caption:='Старт';
end;

begin
end.

SmertoO
16.02.2010, 12:59
алекс, ты забыл еще про не возможность дюпов написать, там ж проверки xD

Hworang
16.02.2010, 13:21
вопросы:

1)
if (g mod 2 = 0) then // запрос на рюкзак - через раз, иначе спамим сервер
begin
buf:=HStr('0F ');
SendToServerEx(nik);
end;
без этого условия скрипт всё время вылетает, но такая реализация мне самому не нравится, а как иначе?
(если потереть совсем и оставить 0F только в Init - скрипт останавливается через несколько выполнений)

2)
Окошко с информацией не привязывается к phx и исчезает куда-то при сворачивании окна phx - как исправить?

3)
почему кнопка Стоп не работает?

кто знает ответ на какой-либо вопрос - поделитесь
буду признателен

alexteam
16.02.2010, 13:26
как он у тебя вообще работает, или не на последней версии пх ?

Hworang
16.02.2010, 13:29
как он у тебя вообще работает, или не на последней версии пх ?
phx 3.4.1.82 english

последняя версия не работает на моем серваке ((

неужели у них скрипты не совместимы?

во время работы скрипта (качественной работы, больше часа без сбоев) запустил 2е окно Ла2
phx умер (

хотя комп тянет фулку
вот канал мог подкачать (1 Mb)
или всё же в скрипте или в phx дело?? интересно попробовать несколько чаров погонять скриптом

alexteam
16.02.2010, 13:37
нет, совместимы, просто на последних версиях в таком виде он точно работать не будет.
ибо в последней версии когда код между begin и end. отработал pck обнуляется.
1я ошибка. самая серьезная у тебя считывание пакета идет в таймере. а вся обработка пакетов должна быть между begin и end. иначе львиная чатсь пакетов просто пропускается.
схема:
1.приходит пакет от клиента\сервера
2.пх назначает переменную pck и вызывает скрипт (место между begin и end-с точкой, которое у тебя пустует)

у тебя чтение этого пцк по таймеру происходит, естественно он легко пропускает нужные пакеты.

Hworang
16.02.2010, 14:32
Новый дизайн окошка

http://img690.imageshack.us/img690/1210/prodo.jpg

скрипт не проходит по форумным ограничениям (5000 символов)
теперь буду прикреплять

Hworang
16.02.2010, 14:53
нет, совместимы, просто на последних версиях в таком виде он точно работать не будет.
ибо в последней версии когда код между begin и end. отработал pck обнуляется.
1я ошибка. самая серьезная у тебя считывание пакета идет в таймере. а вся обработка пакетов должна быть между begin и end. иначе львиная чатсь пакетов просто пропускается.
схема:
1.приходит пакет от клиента\сервера
2.пх назначает переменную pck и вызывает скрипт (место между begin и end-с точкой, которое у тебя пустует)

у тебя чтение этого пцк по таймеру происходит, естественно он легко пропускает нужные пакеты.

я так делал уже - поэтому и отказался от такой реализации
кроме того, попробовал еще раз

да, работает со всеми пакетами
да, быстрее фармит
но:
1) скрипт запускается сразу, а не после нажатия кнопочки Старт
решил основную программу запускать по условию if start
не работает вообще
2) если без условия - работает быстро
и очень скоро останавливается: или вылетает ошибка, или phx виснет, или, что чаще всего ГМшоп отказывается покупать - я выключаю скрипт, вручную жму диалог и кнопку Продать - и всё, диалог исчезает а селл лист не появляется

я конечно может и чего-то не понимаю
но видимо слишком большая скорость (в данном случае хотябы) хорошего не сулит
и оставлю скрипт как есть, пока не пойму почему он не работает как должен (в основной программе)

alexteam
16.02.2010, 15:00
мда...
1. между begin - end. нужно просто читать. обновлять интерфейс. устанавливать флаги и переменные и т.д.
при этом между begin-end. ни ничего не нужно отправлять на сервер.
2. в таймере ориентируясь на флаги отправлять тот или иной пакет, составленый по этим флагам и переменным.

при текущей реализации тебе нужно спамить пакетом 0F в надежде что следующее срабатывание таймера будет на пакете итемлист, что далеко не всегда так.
а если обнаружение этого пакета вынести с таймера, в основное тело пакета, составлять его там, но не слать. а просто запоминать и отсылать уже в таймере, обнулив после посылки - получиццо красивее.

Hworang
16.02.2010, 15:31
1) изменение информации на окошке выполнять в таймере?
2) завёл 4 переменные для сохранения пакета, который нужно отправить
-запрос итемлиста
-покупка
-продажа
-перевод денег

чтение и составление пакетов в основной программе
а вот отправку, как я понял, нужно делать через таймер
но если у меня 4 пакета - как их отправлять
т.е. в каком порядке чтоли?

когда и откуда посылать 0F?

---------------------
аа всё, я понял - в основной программе нужно после каждого составления пакета его сохранить и его флаг поставить true
а потом в таймере отправлять пакеты с фланом true и сбрасывать флаги на false
уже делаю

alexteam
16.02.2010, 15:48
0f - запрос итемлиста. если правильно организовать скрипт, то его нужно вызывать единожды при старте.

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

в ините:
создание интерфейса, отправка 0f на сервер.

в таймере:
по имеющимся вещам в базе и их колву - конструируется тот или иной пакет от отправляеться на сервер.


регулируя интервал срабатывания таймера мы регулируем частоту "принятия решения" ускоряя или замедляя процесс, при этом не пропускаем пакеты и не спамим сервер.
по поводу самой тяжелой части - инвентаризации я уже говорил. есть на форуме.

Hworang
16.02.2010, 17:11
сделал чтение и составление пакетов в основной программе
а посылку в таймере
0F в Init

выполняется скрипт 1 раз (ну или еще пару раз, если в игре понажимать таб)

скорее всего я не понимаю механики phx'а
а именно - какой пакет обрабатывается сйчас? - который пришел последним к моменту начала скрипта или последний пришедший вообще и т.д.
как пропустить пакет? мне вообще нужно видеть только 1B от сервера
зачем нужен инвенториапдейт - он показывает только изменение адены

//////////////////////////////////////////////////////////////////////
// Продавалка v 1.1 от Hworang ///////////////////////////////////////
// на основе скриптов от Qak /////////////////////////////////////////
// CoderX.ru /////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Настроена для сервера l2mw.ru /////////////////////////////////////
// создайте чара и почистите рюкзак //////////////////////////////////
// стартовые условия - 100kk и 1 голд бар и болше ничего (2/200) /////
// впишите свой ник в соотв. поле (в скрипте) ////////////////////////
// подойдите к ГМшопу и возьмите его в таргет ////////////////////////
// запускайте скрипт и радуйтесь, видя как адена льётся в рюкзак))) //
// все изменения - на свой страх и риск //////////////////////////////
// за последствия работы скрипта автор ответственности не несет :D ///
//////////////////////////////////////////////////////////////////////

var i,c,g:integer;
gg,incomeA,incomeG:integer = 0;
s,sendS,sendB,sendC,sendP:string;
Main : TForm;
Timer : TTimer;
Button : TButton;
Edit,Edit1,Edit2,Edit3,Edit4: TEdit;
Start,seS,seB,seC,seP: Boolean = False;
e : Boolean;
Pos_i : Integer;
myDate,work : TDateTime;
myHour, myMin, mySec, myMilli : Word;

const nik = 'LooksThatKill'; // Сюда вписать имя чара
it = 195; // скрипт покупает 195 итемов - можете править этот параметр [1..198]
x = 1680; // введите разрешение вашего монитора
y = 1050; // иначе окошко с информацией потеряется
tit = 300;// задержка // если поставить меньше - адена пойдет быстрее, но будет лагать

procedure Init;
begin
e:=true;
work:=Time;

g:=1;
buf:=HStr('0F ');
SendToServerEx(nik);

Pos_i:=1;
//формочка
Main := TForm.Create(nil);
Main.Caption := 'Продавалка v 1.1';
Main.BorderStyle := bsSizeable;
Main.Position := poDesigned;
Main.Left :=x-400;
Main.Top :=y-200;
Main.Width :=300;
Main.Height :=110;

Edit := TEdit.Create(Main);
Edit.Parent := Main;
Edit.Left := 90;
Edit.Top := 10;
Edit.Width := 114;

Edit1 := TEdit.Create(Main);
Edit1.Parent := Main;
Edit1.Left := 214;
Edit1.Top := 10;
Edit1.Width := 62;

Edit2 := TEdit.Create(Main);
Edit2.Parent := Main;
Edit2.Left := 214;
Edit2.Top := 40;
Edit2.Width := 62;

Edit3 := TEdit.Create(Main);
Edit3.Parent := Main;
Edit3.Left := 90;
Edit3.Top := 40;
Edit3.Width := 114;

Edit4 := TEdit.Create(Main);
Edit4.Parent := Main;
Edit4.Left := 10;
Edit4.Top := 40;
Edit4.Width := 74;

//таймер
Timer := TTimer.Create(Main);
Timer.Interval := tit;
Timer.Enabled := False;
Timer.onTimer := @TimerTimer;

Button := TButton.Create(Main);
Button.Parent := Main;
Button.Caption := 'Старт';
Button.Left := 10;
Button.Top := 10;
Button.onClick := @ButtonClick;

Main.Show;
end;

procedure Free;
begin
Edit.Free;
Edit1.Free;
Edit2.Free;
Edit3.Free;
Edit4.Free;
Timer.Free;
Button.Free;
Main.Free;
end;

//обработчик таймера
procedure TimerTimer(Sender : TTimer);
var i,a:integer;
begin

//inc(g);
//if (g mod 3 = 0) then // запрос на рюкзак - через раз, иначе спамим сервер и вылетает ошибка
//begin
// buf:=HStr('0F ');
// SendToServerEx(nik);
//end;

myDate := Time;
DecodeTime(myDate, myHour, myMin, mySec, myMilli);

Edit4.Text:='Time '+TimeToStr(myDate);
Edit3.Text:='Work '+(TimeToStr(myDate-work));
Edit2.Text:='Inc '+IntToStr(gg-incomeG);


if seb then
begin
buf:=sendb;
SendToServerEx(nik);
seb:=false;
end;

if ses then
begin
buf:=sends;
SendToServerEx(nik);
ses:=false;
end;

if sec then
begin
buf:=sendc;
SendToServerEx(nik);
sec:=false;
end;

if sep then
begin
buf:=sendp;
SendToServerEx(nik);
sep:=false;
end;

end;

//запуск
procedure ButtonClick(Sender : TButton);
begin
Start := Not (Start);
Timer.Enabled := Start;
If Start
then Button.Caption:='Стоп'
else Button.Caption:='Старт';
end;

Hworang
16.02.2010, 17:15
begin
if pck='' then exit;

if FromServer and (ConnectName=nik) and (pck[1]=#$1B) then
begin
if (ReadD(12)=57) then
begin
Edit.Text:='Adena ( '+IntToStr(ReadD(16))+' )';
Edit1.Text:='Gold ( '+IntToStr(ReadD(52))+' )';
gg:=ReadD(52);
if e then IncomeG:=ReadD(52);
end
else if (ReadD(48)=57) then
begin
Edit.Text:='Adena ( '+IntToStr(ReadD(52))+' )';
Edit1.Text:='Gold ( '+IntToStr(ReadD(16))+' )';
gg:=ReadD(16);
if e then IncomeG:=ReadD(16);
end;
e:=false;
end;

if FromServer and (ConnectName=nik) and (pck[1]=#$1B) and (ReadH(4)<10) then
begin
buf:=#$A7;
WriteD(90010);
WriteD(900000);
WriteD(it);
WriteH(0);
//SendToServerEx(nik);
sendB:=buf;
seB:=true;
end;

if FromServer and (ConnectName=nik) and (pck[1]=#$1B) then
begin
c:=ReadH(4)-2;
buf:=#$1E;
WriteD(0);
WriteD(c);

if (ReadD(12)=2414) then
for i:=1 to c do
begin
WriteD(ReadD(i*36-28));
WriteD(2414);
WriteD(1);
end
else if (ReadD(48)=2414) then
for i:=1 to c do
begin
WriteD(ReadD(i*36+8));
WriteD(2414);
WriteD(1);
end
else if (ReadD(84)=2414) then
for i:=1 to c do
begin
WriteD(ReadD(i*36+44));
WriteD(2414);
WriteD(1);
end;
if (c>=1) then
begin
sendS:=buf;
seS:=true;
//SendToServerEx(nik);
end;
end;

if ((ReadD(16)>700000000) and (ReadD(12)=57)) or ((ReadD(52)>700000000) and (ReadD(48)=57)) and (pck[1]=#$1B) then
begin
buf:=#$38;
WriteS('.deposit');
WriteD(0);
sendP:=buf;
seP:=true;
//SendToServerEx(nik);
end;
end.

alexteam
16.02.2010, 18:11
а именно - какой пакет обрабатывается сйчас? - который пришел последним к моменту начала скрипта или последний пришедший вообще и т.д.
когда ты ставиш галочку напротив скрипта место между begin-end. выполняеться при каждом пришедшем пакете.

как пропустить пакет? мне вообще нужно видеть только 1B от сервера
зачем нужен инвенториапдейт - он показывает только изменение адены
инвентори апдейт показывает изменение а так же удаление либо добавление.

Hworang
17.02.2010, 08:39
Всё вроде сделал правильно
но скрипт часто останавливается после запроса на покупку итемов
снифер показывает, что пакет отправили
но итемов не приходит и итемлист не приходит соответственно

приходится в игре вручную вызывать рюкзак и тогда скрипт выполняется еще раз или два

вот - я отметил вопросами места, где приходится вызывать рюкзак вручную
http://img97.imageshack.us/img97/5969/28070207.jpg

alexteam
17.02.2010, 11:27
можно поставить таймеру запрашивающему инвентарь небольшой интервал, включая его после отправки requestmultisellchoose
и выключя при приходе itemlistpacket, и в самом таймере.

Hworang
17.02.2010, 12:57
можно поставить таймеру запрашивающему инвентарь небольшой интервал, включая его после отправки requestmultisellchoose
и выключя при приходе itemlistpacket, и в самом таймере.
сделал еще 1 таймер
в него сперва положил повторную отправку пакета на покупку
и отключение самого себя после выполнения

случилось 2 неудачных пакета на покупку - скрипт стал

убрал самоотключение - скрипт заработал
глянул снифер - мультиселл пакетов по 5-6 штук в ряд

при задержке 2го таймера 600 еще терпимо - посытаются по 2 пакета покупки всего

ну и вариант с рюкзаком окончательный - работает с задержкой 100 и не посылает лишних пакетов
http://s001.radikal.ru/i193/1002/e6/2e55c386507f.jpg
вот дизайн окошка последней версии



Кнопку Стоп/Старт пофиксил - оказывается при описании глобальных переменных, если их тут же присваивать в описании - присваивание повторяется вместе со скриптом (((
понимание этого позволило решить многие проблеммы
вообще хочу заметить что язык простой, с синтаксисом проблем нет
но вот логику понять труднее - будет очень полезен мануал в стиле
"одна секунда из жизни пакета"
"путешествие через phx"
ну или серьёзно "механика phx"

p.s. скрипт готов - думаю можно все в этой теме потереть и оставить только скрипт и вопросы пользователей ко мне по его настройке для конкретного сервера (позже сделаю универсальную версию)

конечно же спасибо Breadfan и alexteam за помощь
спс QaK за инвентаризацию и смену титула - глядя в эти скрипты (и иногда дёргая из них куски) я написал свой))

alexteam
17.02.2010, 13:32
Приходит пакет от сервера либо клиента.

Если следующие условия для скрипта выполняются
1. он отмечен галочкой в списке.
2. для последних версий добавлено еще такое условие : ((useforconnectname = '') and (useforconnectid= 0)) or (useforconnectname=connectname) or (useforconnectid=connectid)

то:
переменной pck присваиваеться содержимое пакета.
устанавливаються переменны fromserver/fromclient/connectname/connectid
Скрипт запускается на исполнение.

KyM
11.03.2010, 06:18
Hworang, Доброго времени суток! Попытался протестировать вашу чудо программку на la2goldgame.com Ток вместо Голд Баров использовал Эвент-Глитинг медали, ни чего не получилось=(. Вообще такая замена возможна?

Hworang
15.03.2010, 16:28
Hworang, Доброго времени суток! Попытался протестировать вашу чудо программку на la2goldgame.com Ток вместо Голд Баров использовал Эвент-Глитинг медали, ни чего не получилось=(. Вообще такая замена возможна?
мой скрипт не делает деньги "из неоткуда"
он лишь автоматизирует использование ошибки ГМшопа
и для его работы необходимо несколько условий

1) в ГМшопе на вешем сервере должна быть вещь, которая продаётся (в ГМшопе) дешевле чем покупается (т.е. чем вы её можете продать обратно ГМшопу)
2) должен быть простой способ перевода адены в другую валюту (в моём случае - системная команда, так же может быть скилл или обменник в том же ГМшопе)
3) если первые 2 пункта у вас соблюдены - проделайте операцию купли-продажи вручную и скиньте сюда ID магазина, пакет на покупку вашего итема и продажу, пакет первода адены

тогда я переделаю скрипт под ваш сервер
заходить на него и всё это проверять самому мне некогда, а сделать всё на самом деле несложно и вы справитесь сами

KyM
15.03.2010, 18:40
К сожалению цена в ГМ не отличается на ГолдБары, там так, допустим у нас есть 10к глитинг медалей мы можем купить 1 голд бар и только на него уже какую-нибудь вещь, так-же я могу обратно продать ГБ за 10к глит, а вещь уже не смогу ни куда продать, ток другому игроку, в обычный магаз при продаже каких либо вещей цена 0.
Глиты так-же конвертируются в адену и обратно без разницы в цене.
Так что пролет=(