PDA

Просмотр полной версии : ItemPainter по идее QaK


Fer123
01.03.2009, 14:36
Скрипт для рисования аденой и другими предметами.
Вобщем увидел в теме Рисую аденой:
никому не надо пока готовое, хотябы 60% рабочее, кто-нить не выложит.
А вообще лучше сделать так: рисуешь в любом графическом редакторе черным по белому. Сохраняешь как матрицу нулей и единиц 0 - белый, 1 - черный, потом читаешь матрицу и, соответственно выкидываешь адену по всему массиву.
З.Ы. идея интересная, реализовывать - тупо лень =)
(Это коммент QaK так что идея его)

История версий

ver 0,1
-Графический интерфейс
-Возможность выбора предмета для каждого из 5 цветов
-Загрузка картинки с помощью диалога
-Масштаб от 1:1 до 10:1

ver 0,2
-Выбор направления (теперь не рисует только на север)
-Мелкие исправления и доработки



Program ItemPainter;
//------------------------------------------------------------------
//Скрипт для рисования предметами пока только для с4 и интерлюдии
//В Name ввдите ник
//Нарисуйте картинку в любом графическом редакторе.
//В поле "Путь к фалу" введите путь к этому файлу и нажмите Load
//Черный,красный,зеленый,голубой,желтый цвета пикселей можно привязать к отдельному предмету
//Выберите цвет в боксе color, затем предмет в боксе Item (предметов должно быть>1 чтобы они появились в списке)
//scale - масштаб отступа между предметами от 1:1 до 10:1
//Самый оптимальный масштаб 5:1
//Направление - согласно компасу в игре
const
Name='Perforator';
interlude=true;
max=80;
MaxDistance=240; //Максимальное расстояние на которое можно выбросить предмет
var
bmp:TBitMap; //Картинка
ItemBase: array[1..3,1..max] of integer; //Массив предметов заполняется процедурой CreateItemBase
SelectedItems: array[1..3,1..5] of integer; //Массив Object ID предметов [i,j] i=1 - OID,2-ID,3 - Count; j - # цвета
currentx,currenty,StartX,StartY,StartZ,MyX,MyY,MyZ ,NextX,NextY,ItemOID:integer;
//Теущие координаты x и y;координаты начала отчета x,y,z; Мои координаты x y обнавляются при Validate Position
ready:boolean;
timer : TTimer;
FormMain:TForm;
Stats : TMemo;
Panel1 : TPanel;
GroupBox1,GroupBox2 : TGroupBox;
ComboBoxColor,ComboBoxScale,ComboboxItem,ComboBoxD irection:TComboBox;
Label1,Label2,Label3,Label4:TLabel;
Path:TEdit;
LoadedImage:TImage;
LoadButton,StartButton,StopButton:TButton;
ItemsName,StringList:TStringList;
//......................................
//......................................
//......................................
//ComboBoxItem
procedure ComboBoxItem_Click(Sender: TComboBox);
var i,count,index:integer;
begin
count:=0;
if SelectedItems[2,ComboBoxColor.ItemIndex+1]=ItemBase[2,ComboBoxItem.ItemIndex+1] then exit;
for i:=1 to 5 do if SelectedItems[2,i]=ItemBase[2,ComboBoxItem.ItemIndex+1] then inc(count);
if Count>0 then begin
stats.lines.add('Ошибка! Нельзя добавлять одинаковые предметы в разные цвета.');
exit;
end;
SelectedItems[1,ComboBoxColor.ItemIndex+1]:=ItemBase[1,ComboBoxItem.ItemIndex+1];
SelectedItems[2,ComboBoxColor.ItemIndex+1]:=ItemBase[2,ComboBoxItem.ItemIndex+1];
SelectedItems[3,ComboBoxColor.ItemIndex+1]:=ItemBase[3,ComboBoxItem.ItemIndex+1];
index:=ComboBoxItem.ItemIndex;
for i:=0 to StringList.Count-1 do if Pos(' - '+ComboBoxColor.Items.Strings[ComboBoxColor.ItemIndex],ComboBoxItem.Items.Strings[i])>0 then
ComboBoxItem.Items.Strings[i]:=StringList.Strings[i];
ComboBoxItem.Items.Strings[index]:=ComboBoxItem.Items.Strings[ComboBoxItem.ItemIndex]+' - '+ComboBoxColor.Items.Strings[ComboBoxColor.ItemIndex];
ComboBoxItem.ItemIndex:=index;
end;
//----------------------------------------
procedure StartButton_Click(Sender: TButton);
//Event : OnClick
begin
if bmp=NIL then stats.lines.add('Картинка не загружена!') else
begin
stats.lines.add('Старт!');
StartButton.enabled:=false;
currentx:=-1;
currenty:=0;
buf:=#$AA;
WriteD(0);
SendToServerEx(Name);
end;
end;
//......................................
//ButtonStopEnchant
procedure StopButton_Click(Sender: TButton);
//Event : OnClick
begin
StartButton.enabled:=true;
stats.lines.add('Стоп!');
timer.enabled:=false;
ready:=false;
end;
procedure bmpload;
begin
bmpfree;
bmp:=TBitMap.Create;
try
bmp.LoadFromFile(path.text);
except
bmp.Free;
stats.lines.add('Ошибка загрузки файла!');
exit;
end;
stats.lines.add('Картинка успешно загружена!');
LoadedImage.Picture.assign(bmp);
end;
procedure LoadButton_Click(Sender: TButton);
var openDialog : TOpenDialog;
begin
openDialog := TOpenDialog.Create(NIL);
openDialog.Filter := 'Bitmap files|*.bmp';
openDialog.FilterIndex := 1;
openDialog.DefaultExt:='bmp';
openDialog.Options:=ofNoChangeDir+ofFileMustExist+ ofPathMustExist;
if openDialog.Execute then path.text:=openDialog.FileName else begin
openDialog.Free;
exit;
end;
openDialog.Free;
bmpload;
end;
procedure Path_key(Sender: TEdit; Key: Char);
begin
if ord(key)=13 then begin
bmpload;
end;
end;
procedure Free_FormMain;
//Освобождаем ресурсы ...
begin
TRY
if FormMain<>NIL then begin
FormMain.Free;
FormMain:=NIL;
end;
FINALLY
END;
end;
function Create_FormMain : TForm;
//Создаем форму и соотв. компоненты на ней ...
Var
Yes : boolean;
begin
Yes := FALSE;
Result := TForm.Create(nil);

TRY
//------------------------
//Свойства формы
Result.Caption := 'Item Painter v 0.2 by ArchDevil';
Result.Left := 397;
Result.Top := 233;
Result.Width := 350;
Result.Height := 230;
Result.FormStyle := fsNormal;
Result.Position := poDesigned;
Result.BorderStyle := bsSizeable;
Result.BorderWidth := 0;
Result.WindowState := wsNormal;
Result.Color := clBtnFace;
Result.Font.Name := 'Tahoma';
Result.Font.Size := 8;
Result.Font.Color := clWindowText;
Result.Font.CharSet:= 1;
//......................................
//......................................
//Stats
Stats := TMemo.Create(Result);
Stats.Parent := Result;
Stats.Left := 0;
Stats.Top := 160;
Stats.Width := 350;
Stats.Height := 70;
Stats.Visible := TRUE;
Stats.Tag := 0;
Stats.Enabled := TRUE;
Stats.Hint := '';
Stats.ShowHint := FALSE;
Stats.Font.Name := 'Tahoma';
Stats.Font.Size := 8;
Stats.Font.Color := clWindowText;
Stats.Color := clWindow;
Stats.TabOrder := 0;
Stats.TabStop := TRUE;
Stats.Align := alBottom;
Stats.WordWrap := TRUE;
Stats.Alignment := taLeftJustify;
Stats.WantTabs := FALSE;
Stats.WantReturns := TRUE;
Stats.HideSelection := TRUE;
Stats.MaxLength := 0;
Stats.OEMConvert := FALSE;
Stats.ReadOnly := FALSE;
Stats.ScrollBars := ssNone;
//......................................
//......................................
//Panel1
Panel1 := TPanel.Create(Result);
Panel1.Parent := Result;
Panel1.Left := 0;
Panel1.Top := 0;
Panel1.Width := 350;
Panel1.Height := 160;
Panel1.Visible := TRUE;
Panel1.Tag := 0;
Panel1.Enabled := TRUE;
Panel1.Hint := '';
Panel1.ShowHint := FALSE;
Panel1.Caption := '';
Panel1.Align := alClient;
Panel1.Color := clBtnFace;
Panel1.Font.Name := 'Tahoma';
Panel1.Font.Size := 8;
Panel1.Font.Color := clWindowText;
Panel1.Font.CharSet := 1;
Panel1.BevelWidth := 1;
Panel1.BorderWidth := 0;
Panel1.BevelInner := bvNone;
Panel1.BevelOuter := bvRaised;
Panel1.TabOrder := 2;
Panel1.TabStop := FALSE;
Panel1.AutoSize := FALSE;
//......................................
//......................................
//GroupBox1
GroupBox1 := TGroupBox.Create(Result);
GroupBox1.Parent := Panel1;
GroupBox1.Left := 1;
GroupBox1.Top := 1;
GroupBox1.Width := 160;
GroupBox1.Height := 160;
GroupBox1.Visible := TRUE;
GroupBox1.Tag := 0;
GroupBox1.Enabled := TRUE;
GroupBox1.Hint := '';
GroupBox1.ShowHint := FALSE;
GroupBox1.Caption := 'Рисунок';
GroupBox1.Align := alLeft;
GroupBox1.Color := clBtnFace;
GroupBox1.Font.Name := 'Tahoma';
GroupBox1.Font.Size := 8;
GroupBox1.Font.Color := clWindowText;
GroupBox1.Font.CharSet := 1;
GroupBox1.TabOrder := 0;
GroupBox1.TabStop := FALSE;
//......................................
//......................................
//GroupBox2
GroupBox2 := TGroupBox.Create(Result);
GroupBox2.Parent := Panel1;
GroupBox2.Left := 1;
GroupBox2.Top := 1;
GroupBox2.Width := 180;
GroupBox2.Height := 160;
GroupBox2.Visible := TRUE;
GroupBox2.Tag := 0;
GroupBox2.Enabled := TRUE;
GroupBox2.Hint := '';
GroupBox2.ShowHint := FALSE;
GroupBox2.Caption := 'Настройки';
GroupBox2.Align := alLeft;
GroupBox2.Color := clBtnFace;
GroupBox2.Font.Name := 'Tahoma';
GroupBox2.Font.Size := 8;
GroupBox2.Font.Color := clWindowText;
GroupBox2.Font.CharSet := 1;
GroupBox2.TabOrder := 0;
GroupBox2.TabStop := FALSE;
//......................................
//......................................
//ComboBoxColor
ComboBoxColor := TComboBox.Create(Result);
ComboBoxColor.Parent := GroupBox2;
ComboBoxColor.Left := 38;
ComboBoxColor.Top := 19;
ComboBoxColor.Width := 70;
ComboBoxColor.Height := 21;
ComboBoxColor.Visible := TRUE;
ComboBoxColor.Tag := 0;
ComboBoxColor.Enabled := TRUE;
ComboBoxColor.Hint := 'Выбери из списка цвет соответствующий предмету ниже';
ComboBoxColor.ShowHint := TRUE;
ComboBoxColor.Text := 'ComboBoxColor';
ComboBoxColor.Font.Name := 'Tahoma';
ComboBoxColor.Font.Size := 8;
ComboBoxColor.Font.Color := clWindowText;
ComboBoxColor.Color := clWindow;
ComboBoxColor.TabOrder := 1;
ComboBoxColor.TabStop := TRUE;
ComboBoxColor.Sorted := FALSE;
ComboBoxColor.ItemHeight := 13;
ComboBoxColor.Items.ADD('Черный');
ComboBoxColor.Items.ADD('Красный');
ComboBoxColor.Items.ADD('Зеленый');
ComboBoxColor.Items.ADD('Синий');
ComboBoxColor.Items.ADD('Желтый');
ComboBoxColor.ItemIndex := 0;
//......................................
//......................................
//ComboBoxScale
ComboBoxScale := TComboBox.Create(Result);
ComboBoxScale.Parent := GroupBox2;
ComboBoxScale.Left := 128;
ComboBoxScale.Top := 19;
ComboBoxScale.Width := 45;
ComboBoxScale.Height := 21;
ComboBoxScale.Visible := TRUE;
ComboBoxScale.Tag := 0;
ComboBoxScale.Enabled := TRUE;
ComboBoxScale.Hint := 'Выбери из списка масштаб';
ComboBoxScale.ShowHint := TRUE;
ComboBoxScale.Text := 'ComboBoxScale';
ComboBoxScale.Font.Name := 'Tahoma';
ComboBoxScale.Font.Size := 8;
ComboBoxScale.Font.Color := clWindowText;
ComboBoxScale.Color := clWindow;
ComboBoxScale.TabOrder := 1;
ComboBoxScale.TabStop := TRUE;
ComboBoxScale.Sorted := FALSE;
ComboBoxScale.ItemHeight := 13;
ComboBoxScale.Items.ADD('1:1');
ComboBoxScale.Items.ADD('2:1');
ComboBoxScale.Items.ADD('3:1');
ComboBoxScale.Items.ADD('4:1');
ComboBoxScale.Items.ADD('5:1');
ComboBoxScale.Items.ADD('6:1');
ComboBoxScale.Items.ADD('7:1');
ComboBoxScale.Items.ADD('8:1');
ComboBoxScale.Items.ADD('9:1');
ComboBoxScale.Items.ADD('10:1');
ComboBoxScale.ItemIndex := 4;
//......................................
//......................................
//ComboBoxDirection
ComboBoxDirection := TComboBox.Create(Result);
ComboBoxDirection.Parent := GroupBox2;
ComboBoxDirection.Left := 38;
ComboBoxDirection.Top := 67;
ComboBoxDirection.Width := 135;
ComboBoxDirection.Height := 21;
ComboBoxDirection.Visible := TRUE;
ComboBoxDirection.Tag := 0;
ComboBoxDirection.Enabled := TRUE;
ComboBoxDirection.Text := 'ComboBoxDirection';
ComboBoxDirection.Font.Name := 'Tahoma';
ComboBoxDirection.Font.Size := 8;
ComboBoxDirection.Font.Color := clWindowText;
ComboBoxDirection.Color := clWindow;
ComboBoxDirection.TabOrder := 1;
ComboBoxDirection.TabStop := TRUE;
ComboBoxDirection.Sorted := FALSE;
ComboBoxDirection.ItemHeight := 13;
ComboBoxDirection.Items.ADD('Север');
ComboBoxDirection.Items.ADD('Северо-Восток');
ComboBoxDirection.Items.ADD('Восток');
ComboBoxDirection.Items.ADD('Юго-Восток');
ComboBoxDirection.Items.ADD('Юг');
ComboBoxDirection.Items.ADD('Юго-Запад');
ComboBoxDirection.Items.ADD('Запад');
ComboBoxDirection.Items.ADD('Северо-Запад');
ComboBoxDirection.ItemIndex := 0;
//......................................
//......................................
//ComboBoxItem
ComboBoxItem := TComboBox.Create(Result);
ComboBoxItem.Parent := GroupBox2;
ComboBoxItem.Left := 38;
ComboBoxItem.Top := 43;
ComboBoxItem.Width := 135;
ComboBoxItem.Height := 21;
ComboBoxItem.Visible := TRUE;
ComboBoxItem.Tag := 0;
ComboBoxItem.Enabled := TRUE;
ComboBoxItem.Hint := 'Выбери из списка затачиваемый предмет';
ComboBoxItem.ShowHint := TRUE;
ComboBoxItem.Text := 'ComboBoxItem';
ComboBoxItem.Font.Name := 'Tahoma';
ComboBoxItem.Font.Size := 8;
ComboBoxItem.Font.Color := clWindowText;
ComboBoxItem.Color := clWindow;
ComboBoxItem.TabOrder := 1;
ComboBoxItem.TabStop := TRUE;
ComboBoxItem.ItemIndex := -1;
ComboBoxItem.Sorted := FALSE;
ComboBoxItem.ItemHeight := 13;
ComboBoxItem.OnClick := @ComboBoxItem_Click;
//......................................
//......................................
//Label1
Label1 := TLabel.Create(Result);
Label1.Parent := GroupBox2;
Label1.Left := 6;
Label1.Top := 23;
Label1.Width := 58;
Label1.Height := 13;
Label1.Visible := TRUE;
Label1.Tag := 0;
Label1.Enabled := TRUE;
Label1.Hint := '';
Label1.ShowHint := FALSE;
Label1.Caption := 'Цвет:';
Label1.Transparent := TRUE;
Label1.WordWrap := FALSE;
Label1.Alignment := taLeftJustify;
Label1.Layout := tlTop;
Label1.AutoSize := TRUE;
Label1.Align := alNone;
Label1.Font.Name := 'Tahoma';
Label1.Font.Size := 8;
Label1.Font.Color := clWindowText;
Label1.Color := clBtnFace;
//......................................
//......................................
//Label2
Label2 := TLabel.Create(Result);
Label2.Parent := GroupBox2;
Label2.Left := 6;
Label2.Top := 47;
Label2.Width := 58;
Label2.Height := 13;
Label2.Visible := TRUE;
Label2.Tag := 0;
Label2.Enabled := TRUE;
Label2.Hint := '';
Label2.ShowHint := FALSE;
Label2.Caption := 'Итем:';
Label2.Transparent := TRUE;
Label2.WordWrap := FALSE;
Label2.Alignment := taLeftJustify;
Label2.Layout := tlTop;
Label2.AutoSize := TRUE;
Label2.Align := alNone;
Label2.Font.Name := 'Tahoma';
Label2.Font.Size := 8;
Label2.Font.Color := clWindowText;
Label2.Color := clBtnFace;
//......................................
//......................................
//Label3
Label3 := TLabel.Create(Result);
Label3.Parent := GroupBox2;
Label3.Left := 114;
Label3.Top := 23;
Label3.Width := 58;
Label3.Height := 13;
Label3.Visible := TRUE;
Label3.Tag := 0;
Label3.Enabled := TRUE;
Label3.Hint := '';
Label3.ShowHint := FALSE;
Label3.Caption := 'М:';
Label3.Transparent := TRUE;
Label3.WordWrap := FALSE;
Label3.Alignment := taLeftJustify;
Label3.Layout := tlTop;
Label3.AutoSize := TRUE;
Label3.Align := alNone;
Label3.Font.Name := 'Tahoma';
Label3.Font.Size := 8;
Label3.Font.Color := clWindowText;
Label3.Color := clBtnFace;
//......................................
//......................................
//Label4
Label4 := TLabel.Create(Result);
Label4.Parent := GroupBox2;
Label4.Left := 6;
Label4.Top := 71;
Label4.Width := 58;
Label4.Height := 13;
Label4.Visible := TRUE;
Label4.Tag := 0;
Label4.Enabled := TRUE;
Label4.Hint := '';
Label4.ShowHint := FALSE;
Label4.Caption := 'Напр.:';
Label4.Transparent := TRUE;
Label4.WordWrap := FALSE;
Label4.Alignment := taLeftJustify;
Label4.Layout := tlTop;
Label4.AutoSize := TRUE;
Label4.Align := alNone;
Label4.Font.Name := 'Tahoma';
Label4.Font.Size := 8;
Label4.Font.Color := clWindowText;
Label4.Color := clBtnFace;
//......................................
//......................................
//Path
Path := TEdit.Create(Result);
Path.Parent := GroupBox1;
Path.Left := 5;
Path.Top := 103;
Path.Width := 117;
Path.Height := 20;
Path.Visible := TRUE;
Path.Tag := 0;
Path.Enabled := TRUE;
Path.Hint := 'Введи путь к файлу BMP';
Path.ShowHint := TRUE;
Path.Text := '';
Path.Font.Name := 'Tahoma';
Path.Font.Size := 7;
Path.Font.Color := clWindowText;
Path.Color := clWindow;
Path.TabOrder := 5;
Path.TabStop := TRUE;
Path.ReadOnly := FALSE;
Path.MaxLength := 0;
Path.AutoSize := TRUE;
Path.OnKeyPress := @Path_Key;
//......................................
//......................................
//LoadImage
LoadedImage:= TImage.Create(Result);
LoadedImage.Parent:=GroupBox1;
LoadedImage.Left :=5;
LoadedImage.Top := 16;
LoadedImage.Width := 150;
LoadedImage.Height := 90;
LoadedImage.Visible := TRUE;
LoadedImage.Tag := 0;
LoadedImage.Enabled := TRUE;
LoadedImage.Hint := '';
LoadedImage.ShowHint := FALSE;
LoadedImage.Center := TRUE;
LoadedImage.Proportional := TRUE;
//......................................
//......................................
//LoadButton
LoadButton := TButton.Create(Result);
LoadButton.Parent := GroupBox1;
LoadButton.Left := 124;
LoadButton.Top := 102;
LoadButton.Width := 32;
LoadButton.Height := 21;
LoadButton.Visible := TRUE;
LoadButton.Tag := 0;
LoadButton.Enabled := TRUE;
LoadButton.Hint := '';
LoadButton.ShowHint := FALSE;
LoadButton.Caption := '...';
LoadButton.Font.Name := 'Tahoma';
LoadButton.Font.Size := 8;
LoadButton.Font.Color := clWindowText;
LoadButton.Font.CharSet := 1;
LoadButton.TabOrder := 2;
LoadButton.TabStop := TRUE;
LoadButton.Cancel := FALSE;
LoadButton.ModalResult := 0;
LoadButton.OnClick := @LoadButton_Click;
//......................................
//......................................
//StartButton
StartButton := TButton.Create(Result);
StartButton.Parent := GroupBox2;
StartButton.Left := 6;
StartButton.Top := 102;
StartButton.Width := 80;
StartButton.Height := 21;
StartButton.Visible := TRUE;
StartButton.Tag := 0;
StartButton.Enabled := TRUE;
StartButton.Hint := '';
StartButton.ShowHint := FALSE;
StartButton.Caption := 'Старт';
StartButton.Font.Name := 'Tahoma';
StartButton.Font.Size := 8;
StartButton.Font.Color := clWindowText;
StartButton.Font.CharSet := 1;
StartButton.TabOrder := 2;
StartButton.TabStop := TRUE;
StartButton.Cancel := FALSE;
StartButton.ModalResult := 0;
StartButton.OnClick := @StartButton_Click;
//......................................
//......................................
//StopButton
StopButton := TButton.Create(Result);
StopButton.Parent := GroupBox2;
StopButton.Left := 96;
StopButton.Top := 102;
StopButton.Width := 80;
StopButton.Height := 21;
StopButton.Visible := TRUE;
StopButton.Tag := 0;
StopButton.Enabled := TRUE;
StopButton.Hint := '';
StopButton.ShowHint := FALSE;
StopButton.Caption := 'Стоп';
StopButton.Font.Name := 'Tahoma';
StopButton.Font.Size := 8;
StopButton.Font.Color := clWindowText;
StopButton.Font.CharSet := 1;
StopButton.TabOrder := 3;
StopButton.TabStop := TRUE;
StopButton.Cancel := FALSE;
StopButton.ModalResult := 0;
StopButton.OnClick := @StopButton_Click;
//......................................
Yes := TRUE;
FINALLY
if not Yes then begin
//Освобождаем ресурсы, если неудачно ...
if Result<>NIL then begin
Result.Free;
Result:=NIL;
end;
end;
END;
Result.Show;
end;
procedure Init; //Вызывается при включении скрипта
begin
FormMain:=Create_FormMain;
stats.Lines.Add('Скрипт: Рисование предметами by ArchDevil!');
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=700; //время задержки
ready:=false;
StringList:=TStringList.Create;
ItemsName:=TStringList.Create;
try
ItemsName.LoadFromFile('itemsid.ini');
except
stats.Lines.Add('itemsid.ini не найден!');
exit;
end;
buf:=hstr('0F');
SendToServerEx(Name);
end;
procedure bmpfree;
begin
try
if bmp<>NIL then
begin
bmp.Free;
bmp:=NIL;
end;
finally
end;
end;
procedure Free;
var i:integer;
begin
Free_FormMain; bmpfree;
StringList.Clear; ItemsName.Clear;
timer.Free;
if LoadedImage<>NIL then LoadedImage:=NIL;
currentx:=0; currenty:=0; StartX:=0; StartY:=0;
StartZ:=0; MyX:=0; MyY:=0; ItemOID:=0;
ready:=false;
for i:=1 to 5 do begin
SelectedItems[1,i]:=0;
SelectedItems[2,i]:=0;
SelectedItems[3,i]:=0;
end;
end;
//CreateItemBase и InventoryUpdate Взял со скрипта NLObP на заточку
//---------------------------------------------
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
end;
j:=4;
ListCount:=ReadH(j);
j:=8;
for i:=1 to ListCount do begin
ItemBase[1,i]:=ReadD(j);
ItemBase[2,i]:=ReadD(j);
ItemBase[3,i]:=ReadD(j);
if interlude then inc(j,24) else inc(j,16);
end;
StringList.Clear;
try
for i:=1 to ListCount do begin
try
StringList.Add(ItemsName.Values[IntToStr(ItemBase[2,i])]); //записываем название вещей из инвентаря
except;
end
end;
except;
exit;
end;
with ComboBoxItem do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
//......................................
//************************************************** ****************************
procedure InventoryUpdate; //пакет 27, обновляет базу ObjectID по ItemID
var
i, ii, j, OID, ID, Count, ListCount, UpdType: 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); //кол-во
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;
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;
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;
end;
end;
end;
end;
if interlude then inc(j,22) else inc(j,14);
end;
end;
//------------------------------------
function GetCount(OID:integer) : integer;
var
i : integer;
begin
for i:=1 to max do begin
if ItemBase[1,i]=OID then begin
result:=ItemBase[3,i]; // count
exit;
end;
end;
result:=0;
end;
//--------------------------------------------
function delta(x1, y1, x2, y2:extended):integer; //возвращает растоянием между 2 точками
var
dx,dy,summa: extended;
begin
dx:=x2-x1;
dy:=y2-y1;
summa:=dx*dx+dy*dy;
if summa=0 then result:=0 else result:=Round(sqrt(summa));
end;
//--------------------------------------------
procedure OnTimer(Sender: TObject);
//====================
procedure GetNextCoords;
begin
case ComboBoxDirection.ItemIndex of
0: begin
NextX:=StartX+currentx*(ComboBoxScale.ItemIndex+1) ;
NextY:=StartY+currenty*(ComboBoxScale.ItemIndex+1) ;
end;
1: begin
NextX:=StartX+currentx*(ComboBoxScale.ItemIndex+1)-currenty*(ComboBoxScale.ItemIndex+1);
NextY:=StartY+currenty*(ComboBoxScale.ItemIndex+1) +currentx*(ComboBoxScale.ItemIndex+1);
end;
2: begin
NextX:=StartX-currenty*(ComboBoxScale.ItemIndex+1);
NextY:=StartY+currentx*(ComboBoxScale.ItemIndex+1) ;
end;
3: begin
NextX:=StartX-currentx*(ComboBoxScale.ItemIndex+1)-currenty*(ComboBoxScale.ItemIndex+1);
NextY:=StartY-currenty*(ComboBoxScale.ItemIndex+1)+currentx*(Com boBoxScale.ItemIndex+1);
end;
4: begin
NextX:=StartX-currentx*(ComboBoxScale.ItemIndex+1);
NextY:=StartY-currenty*(ComboBoxScale.ItemIndex+1);
end;
5: begin
NextX:=StartX-currentx*(ComboBoxScale.ItemIndex+1)+currenty*(Com boBoxScale.ItemIndex+1);
NextY:=StartY-currenty*(ComboBoxScale.ItemIndex+1)-currentx*(ComboBoxScale.ItemIndex+1);
end;
6: begin
NextX:=StartX+currenty*(ComboBoxScale.ItemIndex+1) ;
NextY:=StartY-currentx*(ComboBoxScale.ItemIndex+1);
end;
7: begin
NextX:=StartX+currentx*(ComboBoxScale.ItemIndex+1) +currenty*(ComboBoxScale.ItemIndex+1);
NextY:=StartY+currenty*(ComboBoxScale.ItemIndex+1)-currentx*(ComboBoxScale.ItemIndex+1);
end;
end;
end;
//====================
begin
ItemOID:=0;
repeat
if currentx=bmp.width-1 then
begin
inc(currenty);
currentx:=0;
end else inc(currentx);
if currenty=bmp.height then
begin
timer.enabled:=false;
stats.lines.add('Остановлено! Рисунок нарисован!');
StartButton.enabled:=true;
exit;
end;
case bmp.Canvas.pixels[currentx,currenty] of //матрица пикселей
clBlack: if (SelectedItems[1,1]>0) and (GetCount(SelectedItems[1,1])>0) then ItemOID:=SelectedItems[1,1];
clRed: if (SelectedItems[1,2]>0) and (GetCount(SelectedItems[1,2])>0) then ItemOID:=SelectedItems[1,2];
clGreen: if (SelectedItems[1,3]>0) and (GetCount(SelectedItems[1,3])>0) then ItemOID:=SelectedItems[1,3];
clBlue: if (SelectedItems[1,4]>0) and (GetCount(SelectedItems[1,4])>0) then ItemOID:=SelectedItems[1,4];
clYellow:if (SelectedItems[1,5]>0) and (GetCount(SelectedItems[1,5])>0) then ItemOID:=SelectedItems[1,5];
end;
until ItemOID<>0;
if ItemOID=0 then exit;
stats.lines.add('Текущий элемент матрицы: x='+inttostr(currentx)+', y='+inttostr(currenty)+'.');
GetNextCoords;
if delta(MyX,MyY,NextX,NextY)>MaxDistance then begin //расстояние между точками
buf:=#$01;
WriteD(NextX);
writeD(NextY);
WriteD(MyZ);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteD(1);
SendToServerEx(Name);
timer.enabled:=false; //Отключаем на время передвижения
ready:=true;
exit;
end;
buf:=#$12;
WriteD(ItemOID);
WriteD(1);
WriteD(NextX);
WriteD(NextY);
WriteD(MyZ);
SendToServerEx(Name);
end;
//--------------------------------------------
begin
if FromClient and (ConnectName=Name) then
case pck[1] of
#$48: begin
MyX:=ReadD(2); // постоянно считываем координаты чара
MyY:=ReadD(6);
if ready and (delta(Myx,Myy,NextX,NextY)<MaxDistance/2) then begin //Меньше 100 можно включать таймер
buf:=#$12; //Выкидываем предмет который не выкинули когда дельта привышала 240
WriteD(ItemOID);
WriteD(1);
WriteD(NextX);
WriteD(NextY);
WriteD(MyZ);
SendToServerEx(Name);
ready:=false;
timer.enabled:=true;
end;
end;
end;
if FromServer and (ConnectName=Name) then
case pck[1] of
#$1B: CreateItemBase; //создание базы предметов
//......................................
#$27: InventoryUpdate; //Обновление базы
#$64: if (StartButton.enabled=false) and (timer.enabled=false) and (ReadD(6)=3) then
begin
StartX:=ReadD(14); //Считываются только 1 раз
StartY:=ReadD(22);
StartZ:=ReadD(30);
MyX:=StartX;
MyY:=StartY;
MyZ:=StartZ;
timer.enabled:=true;//Вот теперь включаем таймер
end;
end;
end.

Все работает как часы, единственное что он стопориться если ему мешает препятствие или большая разница в координатах Z так что рисовать лучше на более-менее ровной поверхности.

Скрипт для Gracia ЗДЕСЬ (http://coderx.ru/showpost.php?p=28559&postcount=40)

Вот для примера эту картинку http://img17.imageshack.us/img17/5509/56668356.png
скрипт нарисовал так:
http://img237.imageshack.us/img237/1992/shot00008.th.png (http://img237.imageshack.us/my.php?image=shot00008.png)
Еще одна картинка нарисованная этим скриптом:
http://img220.imageshack.us/img220/7653/shot00013.th.jpg (http://img220.imageshack.us/my.php?image=shot00013.jpg)

safalkon
01.03.2009, 16:17
Чё-то у мну не пашет(( Вводит команду /loc и всё.

Grinch
01.03.2009, 16:21
грац но имхо запалят забанят ручками так ровно нельзя :)

Fer123
01.03.2009, 16:52
Чё-то у мну не пашет(( Вводит команду /loc и всё.
Возможно изза того что ты используешь не С4 (интерлюд)

грац но имхо запалят забанят ручками так ровно нельзя :)
Спасибо приятно :) Кстате все зависит от того как криво нарисуешь картинку, так что если захотеть не забанят и таймер интервал можно увеличить...

safalkon
01.03.2009, 17:43
Ну я вообщет на ШОКе гамаю.

Fer123
01.03.2009, 20:24
Ну я вообщет на ШОКе гамаю.

Попробуй словить пакет 64 (System Message) после /loc и прочитай в нем
64 XX XX XX XX - эти 4 байта и в этой строке замени на свое значение вместо 910
#$64: if ReadD(2)=910 then
Если не сработает отпишись, посмотрим в чем проблема...

QaK
01.03.2009, 22:21
Fer123, однозначно респект за реализацию, маладца =)

Добавлено через 13 минут
З.Ы. Кстати еще идея - расширение данного скрипта - добавь другие предметы - будут другие цвета, например: антидот - зеленый, ну и т.д. - однозначно красивее будет =)

bistriy
01.03.2009, 23:46
ковырял етот скрипт и так и не понял как он считывает чёрные пиксели и кидает адену если она у меня первая в списке. Обьясни по понятнее что к чему. Я буду переписывать етот скрипт для клиента Gracia Part 2.

Tekymse
02.03.2009, 03:20
Супер! Автору такая же огромная пятерка как там слово!
И QaK молодец, что дал такую идею и вот уже кто-то её реализовал. И, кстати, с разными цвета тоже будет мега зачетно.
От такой работы появляется желание освоить пакет хак, чтобы суметь редактировать этот скрипт и рисовать такие идеально четкие буковки)

Fer123
02.03.2009, 09:11
QaK
Спасибо
Уже реализовано, в комбобоксе color нужно выбрать цвет а за тем предмет к нему в боксе item. Всего 5 цветов черный красный зеленый голубой желтый. К каждому цвету можно отдельный предмет привязать.

bistriy
Загружается бмп файл в виде матрицы пикселей и потом слева на право считывается как обычная матрица, проверяется цвет каждого пикселя. Если находит 1 из пяти цветов и для них установлен какойто предмет то выкидывает его на землю с стартовыми координатами + координатами пикселя в матрице

bistriy
02.03.2009, 10:05
QaK
Спасибо
Уже реализовано, в комбобоксе color нужно выбрать цвет а за тем предмет к нему в боксе item. Всего 5 цветов черный красный зеленый голубой желтый. К каждому цвету можно отдельный предмет привязать.

bistriy
Загружается бмп файл в виде матрицы пикселей и потом слева на право считывается как обычная матрица, проверяется цвет каждого пикселя. Если находит 1 из пяти цветов и для них установлен какойто предмет то выкидывает его на землю с стартовыми координатами + координатами пикселя в матрице

Это ты такой умный а я просто непонимаю ! С моим мозгомизвините в 29 лет уже трудно понять у тебя Fer123 молодые мозги лет 18 тебе да ? Ты понимаешь лучше моего. ВОт если можешь обработай этот скрипт и впиши в него подробные обьяснения. Куда что вставляеться , откуда береться , что каждая переменная обозначает ?

QaK
02.03.2009, 10:40
bistriy, если не понимаешь - кури матчасть, т.е. учебник по паскалю для начинающих, или даже лучше дельфу для начинающих. Если весь код коментировать - это застрелиться проще, есть алгоритм, есть его реализация в виде программы, ну, можно, допустим, в описании переменных подписать, что какая значит, а не весь код коментить. А так - зная основы программирования - код можно понять.
З.Ы. Запятые, плз, ставь, очень сложно читать посты.

bistriy
02.03.2009, 13:07
bistriy, если не понимаешь - кури матчасть, т.е. учебник по паскалю для начинающих, или даже лучше дельфу для начинающих. Если весь код коментировать - это застрелиться проще, есть алгоритм, есть его реализация в виде программы, ну, можно, допустим, в описании переменных подписать, что какая значит, а не весь код коментить. А так - зная основы программирования - код можно понять.
З.Ы. Запятые, плз, ставь, очень сложно читать посты.

Я просил хоть немного начать обьяснять суть кода а не давать советы.
Я в советах асс. А вот в кодах нешарю. Вкурил ?

Добавлено через 4 минуты
Вот мое добавление .
Как нарисовать в окне формы картинку:
1. Добавить в функцию function Create_FormMain : TForm;
КОд:
//Image1
Image1:= TImage.Create(Result);
Image1.Parent:=Result;
Image1.Left :=10;
Image1.Top := 20;
Image1.Width := 160;
Image1.Height := 160;
Image1.Visible := TRUE;
Image1.Tag := 0;
Image1.Enabled := TRUE;
Image1.Hint := '';
Image1.ShowHint := FALSE;
Image1.AutoSize := TRUE;
2.Добавить в процедуру procedure LoadButton_Click(Sender: TButton);
Код:
Image1.Picture.LoadFromFile(path.text);
Image11; // Процедура сдвига формы рисует картинку на форме.
3. ДОбавить код:
Procedure Image11; // сдвигаю форму чтобы нарисовалась картинка.
begin
FormMain.Width := FormMain.Width + 1;
FormMain.Width := FormMain.Width - 1;
//-------------------------------------------

end;

QaK
02.03.2009, 13:23
Procedure Image11; // сдвигаю форму чтобы нарисовалась картинка.
begin
FormMain.Width := FormMain.Width + 1;
FormMain.Width := FormMain.Width - 1;
* * //-------------------------------------------

end;
это нафига? что еще за бред? с каких пор нужно двигать формочку, чтоб картинка нарисовалась?

Fer123
02.03.2009, 21:43
Скрипт обновил в первом посте.
-Исправил проверку пакета #$64 который приходит после /loc так как оказывается вторые 4 байта (тип системного сообщения) меняется взависимости от территории.
-Добавил в форму загружаемую картинку спс bistriy. Кстате форму действительно не надо двигать :)
-Переписал процедуру клика по комбобоксу Item, чтоб более понятней было.
-теперь правильно выгружаю bmp файл
И написал кое-какие коменты для переменных
safalkon
Скачай заново скрипт теперь все будет работать

bistriy
03.03.2009, 10:31
Дополнение к скрипту:

В процедуру InventoryUpdate я так думаю нужно добавить строку:
Код:
SelectedItems[1,ComboBoxColor.ItemIndex+1]:=ItemBase[1,i];
Для того чтобы первый элемент в таблице Items автоматически при заполнении присваивался цвету который стоит в таблице Color.
Чтобы можно было начинать сразу рисовать одним итемом не выбирая его в таблице. Я например рисую только аденами )

И вопрос :
Как бороться с сообщением вы не можете бросить так далеко, оно появляеться если бросаешь адену очень далеко от того места в котором находишься и рисунок получеться без этих аден . То есть если появляеться такое сообщение то он адены не кидает ((( Это при масштабе 5:1 рисую слово Lineage 2 с твоей картинки. При этом масштабе он букву L вабще не рисует только ineage 2 ((
Как поправить скрипт чтобы при масштабах больше 5:1 он рисовал всё слово с картинки Lineage 2. Может кто нибудь знает ?

QaK
03.03.2009, 11:11
bistriy,
if delta(MyX,MyY,StartX+currentx*(ComboBoxScale.ItemI ndex+1),StartY+currenty*(ComboBoxScale.ItemIndex+1 ))>240 попробуй цифру поменьше воткнуть, не 240.

bistriy
03.03.2009, 12:03
bistriy,
попробуй цифру поменьше воткнуть, не 240.

Сам себе воткни ))
Тут ненужная строчка её можно удалить вабще я думаю.
240 - это ограничение от изменения которого размер нарисованной картинки никак не зависит. Просто это ограничение на расстояние на которое будет бежать бот а когда он кидает адену происходит следующее если он не может кинуть на это расстояние адену приходит сообщение с сервера вы не можете кинуть адену так далеко ((( и бот адену не кидает а переходит к следую щей точки.
Идея такая нужно доделать скрипт так :
1. Если приходит сообщение с сервера вы не можете кинуть адену так далеко , бот не кидает адену а сначала бежит в точку куда нужно кинуть адену а потом повторяет последнее действие тоесть кидает адену в эту точку и рисует дальше по порядку точки аденой.

Кто может сделать такую поправку в скрипте ?
Это очень нужно потому что я хочу выложить слово например Lineage 2 в масштабе 10:1 а у бота неполучаеться это сделать и рисуеться только цифра 2 , бот вабще добегает до конца слова и встаёт. Рисует только цифру 2 при таком масштабе (((

QaK
03.03.2009, 12:12
bistriy, хамить заканчивай. Если совсем ничего в программировании не понимаешь и код чужой разобрать не можешь, так нефиг умничать
if delta(MyX,MyY,StartX+currentx*(ComboBoxScale.ItemI ndex+1),StartY+currenty*(ComboBoxScale.ItemIndex+1 ))>240 then begin //расстояние между точками
buf:=#$01;
WriteD(StartX+currentx*(ComboBoxScale.ItemIndex+1) );
writeD(StartY+currenty*(ComboBoxScale.ItemIndex+1) );
WriteD(StartZ);
WriteD(MyX);
WriteD(MyY);
WriteD(StartZ);
WriteD(1);
SendToServerEx(Name);
timer.enabled:=false; //Отключаем на время передвижения
ready:=true;
exit;
дословно код: если расстояние до точки выброса адены больше чем 240, тогда топаем в эту точку. Эспешиал фор ю, как говорится, а почему не срабатывает - это другая история.

Fer123
03.03.2009, 17:42
bistriy
QaK прав, проверь другое значение дельты, например 100. Возможно просто на твоем сервере другое ограничение на дальность выбрасывания предмета.
и в этой строчке if ready and (delta(Myx,Myy....)<100) попробуй 50.
А так как ты хочешь не получится потому что сообщение с сервера "вы не можете кинуть адену так далеко" приходит не сразу и бот успеет обработать еще как минимум 8-10 координат так что последние ты никак не найдешь.
И кстате у меня нормально рисует картинку Lineage 2 при 10:1. А чтоб сделать картинку по больше лучше нарисуй ее побольше в самом файле и используй масштаб 5:1 (самый подходящий для адены). А 6:1 и дальше это для предметов большего размера чем адена. Тоесть подбирать надо такой масштаб чтоб расстояния между предметами не было видно и чтоб они не налягали на друг друга.

KrazyKeNNy
03.03.2009, 18:16
На шоге скрипт тестировался?

Fer123
03.03.2009, 18:17
Нет

bistriy
03.03.2009, 18:53
Спасибо Fer123 я разобрался да QaK прав нужно уменьшить 240. У меня всё работает на Lineage 2 Gracia.

Ckopo
03.03.2009, 22:33
на шоке помоему, вапще нельзя аденой кидаца)

aBRa_144
04.03.2009, 08:44
Тестил на С4:

Name='*****';
interlude=false;

При выборе итемов каторыми будет рисовать невидно ничего кроме урожая с манора. В чем может быть проблема?

Fer123
04.03.2009, 17:31
aBRa_144, Коефициенты i и j в CreateItemBase неправильные для с4 стояли. Исправил скрипт в 1 посте пробуй
Ckopo, Необязательно аденой, скрипт может кидаться любым предметом

Ckopo
05.03.2009, 13:59
aBRa_144, Коефициенты i и j в CreateItemBase неправильные для с4 стояли. Исправил скрипт в 1 посте пробуй
Ckopo, Необязательно аденой, скрипт может кидаться любым предметом

я это понял давно, но аденой кидаца там стоит запрет

mavi
16.03.2009, 18:25
Народ кто для Gracia сделал поделитесь плз ;)

8tomat8
10.04.2009, 17:17
Люд) у меня проблема с зеленым( желтый черный красный норм находятся а вот зеленый пропускает, на картинке(рисованой в фотошопе) зеленый цвет задавал #00FF00 по идее он должен де находится

Fer123
10.04.2009, 17:20
Попробуй темно зеленый 0 128 0

8tomat8
10.04.2009, 18:25
Великолепно) все работает) еще раз спс)

ПолуГость2
10.04.2009, 20:50
Кстати, теперь аденой кидаться можно.
На шоках ХБ.

8tomat8
10.04.2009, 21:07
кстати да аденой я так и не понял как бросаться(( Её просто нету в списке

8tomat8
14.04.2009, 09:05
*Это не шок

PanAm
15.04.2009, 16:52
8tomat8, мб ItemID Адены изменен? частый античитерский прием.

8tomat8
15.04.2009, 18:41
Нет я проверил, в инвентаре были только адена и соски, соски показало а адену нет(((

Fer123
17.04.2009, 14:54
8tomat8, скачай заново скрипт с первой страницы и попробуй. Поидее должно отображать все предметы из инвентаря не в зависимости от их колличества.

Niksan
25.04.2009, 11:15
как конвертировать этот скрипт для грациИ?

Grinch
25.04.2009, 11:56
как конвертировать этот скрипт для грациИ? просто надо id пакетов поменять и кое-где подправить разбор и может быть и сборку этих пакетов для отправки на сервер. Как это сделать спросите вы, да очень просто уйти в тихое место (я пользуюсь местами недалеко от замка инадрил, там как правило если нет осады ни кого нет) и просмотреть все те пакеты которые участвуют в скрипте.

Fer123
26.04.2009, 18:23
Скрипт ItemPainter для Gracia Part2:


Program ItemPainter;
//------------------------------------------------------------------
//Скрипт для рисования предметами для Gracia part 2
//В Name ввдите ник
//Нарисуйте картинку в любом графическом редакторе.
//В поле "Путь к фалу" введите путь к этому файлу и нажмите Load
//Черный,красный,зеленый,голубой,желтый цвета пикселей можно привязать к отдельному предмету
//Выберите цвет в боксе color, затем предмет в боксе Item (предметов должно быть>1 чтобы они появились в списке)
//scale - масштаб отступа между предметами от 1:1 до 10:1
//Самый оптимальный масштаб 5:1
//Направление - согласно компасу в игре
const
Name='Perforator';
MaxDistance=150; //Максимальное расстояние на которое можно бросить итем
max=80; //Вместимость инвентаря
var
bmp:TBitMap; //Картинка
ItemBase: array[1..3,1..max] of integer; //Массив предметов заполняется процедурой CreateItemBase
SelectedItems: array[1..3,1..5] of integer; //Массив Object ID предметов [i,j] i=1 - OID,2-ID,3 - Count; j - # цвета
currentx,currenty,StartX,StartY,StartZ,MyX,MyY,MyZ ,NextX,NextY,ItemOID:integer;
//Теущие координаты x и y;координаты начала отчета x,y,z; Мои координаты x y обнавляются при Validate Position
ready:boolean;
timer : TTimer;
FormMain:TForm;
Stats : TMemo;
Panel1 : TPanel;
GroupBox1,GroupBox2 : TGroupBox;
ComboBoxColor,ComboBoxScale,ComboboxItem,ComboBoxD irection:TComboBox;
Label1,Label2,Label3,Label4:TLabel;
Path:TEdit;
LoadedImage:TImage;
LoadButton,StartButton,StopButton:TButton;
ItemsName,StringList:TStringList;
//......................................
//......................................
//......................................
//ComboBoxItem
procedure ComboBoxItem_Click(Sender: TComboBox);
var i,count,index:integer;
begin
count:=0;
if SelectedItems[2,ComboBoxColor.ItemIndex+1]=ItemBase[2,ComboBoxItem.ItemIndex+1] then exit;
for i:=1 to 5 do if SelectedItems[2,i]=ItemBase[2,ComboBoxItem.ItemIndex+1] then inc(count);
if Count>0 then begin
stats.lines.add('Ошибка! Нельзя добавлять одинаковые предметы в разные цвета.');
exit;
end;
SelectedItems[1,ComboBoxColor.ItemIndex+1]:=ItemBase[1,ComboBoxItem.ItemIndex+1];
SelectedItems[2,ComboBoxColor.ItemIndex+1]:=ItemBase[2,ComboBoxItem.ItemIndex+1];
SelectedItems[3,ComboBoxColor.ItemIndex+1]:=ItemBase[3,ComboBoxItem.ItemIndex+1];
index:=ComboBoxItem.ItemIndex;
for i:=0 to StringList.Count-1 do if Pos(' - '+ComboBoxColor.Items.Strings[ComboBoxColor.ItemIndex],ComboBoxItem.Items.Strings[i])>0 then
ComboBoxItem.Items.Strings[i]:=StringList.Strings[i];
ComboBoxItem.Items.Strings[index]:=ComboBoxItem.Items.Strings[ComboBoxItem.ItemIndex]+' - '+ComboBoxColor.Items.Strings[ComboBoxColor.ItemIndex];
ComboBoxItem.ItemIndex:=index;
end;
//----------------------------------------
procedure StartButton_Click(Sender: TButton);
//Event : OnClick
begin
if bmp=NIL then stats.lines.add('Картинка не загружена!') else
begin
stats.lines.add('Старт!');
StartButton.enabled:=false;
currentx:=-1;
currenty:=0;
buf:=#$B3;
WriteD(0);
SendToServerEx(Name);
end;
end;
//......................................
//ButtonStopEnchant
procedure StopButton_Click(Sender: TButton);
//Event : OnClick
begin
StartButton.enabled:=true;
stats.lines.add('Стоп!');
timer.enabled:=false;
ready:=false;
end;
procedure bmpload;
begin
bmpfree;
bmp:=TBitMap.Create;
try
bmp.LoadFromFile(path.text);
except
bmp.Free;
stats.lines.add('Ошибка загрузки файла!');
exit;
end;
stats.lines.add('Картинка успешно загружена!');
LoadedImage.Picture.assign(bmp);
end;
procedure LoadButton_Click(Sender: TButton);
var openDialog : TOpenDialog;
begin
openDialog := TOpenDialog.Create(NIL);
openDialog.Filter := 'Bitmap files|*.bmp';
openDialog.FilterIndex := 1;
openDialog.DefaultExt:='bmp';
openDialog.Options:=ofNoChangeDir+ofFileMustExist+ ofPathMustExist;
if openDialog.Execute then path.text:=openDialog.FileName else begin
openDialog.Free;
exit;
end;
openDialog.Free;
bmpload;
end;
procedure Path_key(Sender: TEdit; Key: Char);
begin
if ord(key)=13 then begin
bmpload;
end;
end;
procedure Free_FormMain;
//Освобождаем ресурсы ...
begin
TRY
if FormMain<>NIL then begin
FormMain.Free;
FormMain:=NIL;
end;
FINALLY
END;
end;
function Create_FormMain : TForm;
//Создаем форму и соотв. компоненты на ней ...
Var
Yes : boolean;
begin
Yes := FALSE;
Result := TForm.Create(nil);

TRY
//------------------------
//Свойства формы
Result.Caption := 'Item Painter v 0.2 by ArchDevil';
Result.Left := 397;
Result.Top := 233;
Result.Width := 350;
Result.Height := 230;
Result.FormStyle := fsNormal;
Result.Position := poDesigned;
Result.BorderStyle := bsSizeable;
Result.BorderWidth := 0;
Result.WindowState := wsNormal;
Result.Color := clBtnFace;
Result.Font.Name := 'Tahoma';
Result.Font.Size := 8;
Result.Font.Color := clWindowText;
Result.Font.CharSet:= 1;
//......................................
//......................................
//Stats
Stats := TMemo.Create(Result);
Stats.Parent := Result;
Stats.Left := 0;
Stats.Top := 160;
Stats.Width := 350;
Stats.Height := 70;
Stats.Visible := TRUE;
Stats.Tag := 0;
Stats.Enabled := TRUE;
Stats.Hint := '';
Stats.ShowHint := FALSE;
Stats.Font.Name := 'Tahoma';
Stats.Font.Size := 8;
Stats.Font.Color := clWindowText;
Stats.Color := clWindow;
Stats.TabOrder := 0;
Stats.TabStop := TRUE;
Stats.Align := alBottom;
Stats.WordWrap := TRUE;
Stats.Alignment := taLeftJustify;
Stats.WantTabs := FALSE;
Stats.WantReturns := TRUE;
Stats.HideSelection := TRUE;
Stats.MaxLength := 0;
Stats.OEMConvert := FALSE;
Stats.ReadOnly := FALSE;
Stats.ScrollBars := ssNone;
//......................................
//......................................
//Panel1
Panel1 := TPanel.Create(Result);
Panel1.Parent := Result;
Panel1.Left := 0;
Panel1.Top := 0;
Panel1.Width := 350;
Panel1.Height := 160;
Panel1.Visible := TRUE;
Panel1.Tag := 0;
Panel1.Enabled := TRUE;
Panel1.Hint := '';
Panel1.ShowHint := FALSE;
Panel1.Caption := '';
Panel1.Align := alClient;
Panel1.Color := clBtnFace;
Panel1.Font.Name := 'Tahoma';
Panel1.Font.Size := 8;
Panel1.Font.Color := clWindowText;
Panel1.Font.CharSet := 1;
Panel1.BevelWidth := 1;
Panel1.BorderWidth := 0;
Panel1.BevelInner := bvNone;
Panel1.BevelOuter := bvRaised;
Panel1.TabOrder := 2;
Panel1.TabStop := FALSE;
Panel1.AutoSize := FALSE;
//......................................
//......................................
//GroupBox1
GroupBox1 := TGroupBox.Create(Result);
GroupBox1.Parent := Panel1;
GroupBox1.Left := 1;
GroupBox1.Top := 1;
GroupBox1.Width := 160;
GroupBox1.Height := 160;
GroupBox1.Visible := TRUE;
GroupBox1.Tag := 0;
GroupBox1.Enabled := TRUE;
GroupBox1.Hint := '';
GroupBox1.ShowHint := FALSE;
GroupBox1.Caption := 'Рисунок';
GroupBox1.Align := alLeft;
GroupBox1.Color := clBtnFace;
GroupBox1.Font.Name := 'Tahoma';
GroupBox1.Font.Size := 8;
GroupBox1.Font.Color := clWindowText;
GroupBox1.Font.CharSet := 1;
GroupBox1.TabOrder := 0;
GroupBox1.TabStop := FALSE;
//......................................
//......................................
//GroupBox2
GroupBox2 := TGroupBox.Create(Result);
GroupBox2.Parent := Panel1;
GroupBox2.Left := 1;
GroupBox2.Top := 1;
GroupBox2.Width := 180;
GroupBox2.Height := 160;
GroupBox2.Visible := TRUE;
GroupBox2.Tag := 0;
GroupBox2.Enabled := TRUE;
GroupBox2.Hint := '';
GroupBox2.ShowHint := FALSE;
GroupBox2.Caption := 'Настройки';
GroupBox2.Align := alLeft;
GroupBox2.Color := clBtnFace;
GroupBox2.Font.Name := 'Tahoma';
GroupBox2.Font.Size := 8;
GroupBox2.Font.Color := clWindowText;
GroupBox2.Font.CharSet := 1;
GroupBox2.TabOrder := 0;
GroupBox2.TabStop := FALSE;
//......................................
//......................................
//ComboBoxColor
ComboBoxColor := TComboBox.Create(Result);
ComboBoxColor.Parent := GroupBox2;
ComboBoxColor.Left := 38;
ComboBoxColor.Top := 19;
ComboBoxColor.Width := 70;
ComboBoxColor.Height := 21;
ComboBoxColor.Visible := TRUE;
ComboBoxColor.Tag := 0;
ComboBoxColor.Enabled := TRUE;
ComboBoxColor.Hint := 'Выбери из списка цвет соответствующий предмету ниже';
ComboBoxColor.ShowHint := TRUE;
ComboBoxColor.Text := 'ComboBoxColor';
ComboBoxColor.Font.Name := 'Tahoma';
ComboBoxColor.Font.Size := 8;
ComboBoxColor.Font.Color := clWindowText;
ComboBoxColor.Color := clWindow;
ComboBoxColor.TabOrder := 1;
ComboBoxColor.TabStop := TRUE;
ComboBoxColor.Sorted := FALSE;
ComboBoxColor.ItemHeight := 13;
ComboBoxColor.Items.ADD('Черный');
ComboBoxColor.Items.ADD('Красный');
ComboBoxColor.Items.ADD('Зеленый');
ComboBoxColor.Items.ADD('Синий');
ComboBoxColor.Items.ADD('Желтый');
ComboBoxColor.ItemIndex := 0;
//......................................
//......................................
//ComboBoxScale
ComboBoxScale := TComboBox.Create(Result);
ComboBoxScale.Parent := GroupBox2;
ComboBoxScale.Left := 128;
ComboBoxScale.Top := 19;
ComboBoxScale.Width := 45;
ComboBoxScale.Height := 21;
ComboBoxScale.Visible := TRUE;
ComboBoxScale.Tag := 0;
ComboBoxScale.Enabled := TRUE;
ComboBoxScale.Hint := 'Выбери из списка масштаб';
ComboBoxScale.ShowHint := TRUE;
ComboBoxScale.Text := 'ComboBoxScale';
ComboBoxScale.Font.Name := 'Tahoma';
ComboBoxScale.Font.Size := 8;
ComboBoxScale.Font.Color := clWindowText;
ComboBoxScale.Color := clWindow;
ComboBoxScale.TabOrder := 1;
ComboBoxScale.TabStop := TRUE;
ComboBoxScale.Sorted := FALSE;
ComboBoxScale.ItemHeight := 13;
ComboBoxScale.Items.ADD('1:1');
ComboBoxScale.Items.ADD('2:1');
ComboBoxScale.Items.ADD('3:1');
ComboBoxScale.Items.ADD('4:1');
ComboBoxScale.Items.ADD('5:1');
ComboBoxScale.Items.ADD('6:1');
ComboBoxScale.Items.ADD('7:1');
ComboBoxScale.Items.ADD('8:1');
ComboBoxScale.Items.ADD('9:1');
ComboBoxScale.Items.ADD('10:1');
ComboBoxScale.ItemIndex := 4;
//......................................
//......................................
//ComboBoxDirection
ComboBoxDirection := TComboBox.Create(Result);
ComboBoxDirection.Parent := GroupBox2;
ComboBoxDirection.Left := 38;
ComboBoxDirection.Top := 67;
ComboBoxDirection.Width := 135;
ComboBoxDirection.Height := 21;
ComboBoxDirection.Visible := TRUE;
ComboBoxDirection.Tag := 0;
ComboBoxDirection.Enabled := TRUE;
ComboBoxDirection.Text := 'ComboBoxDirection';
ComboBoxDirection.Font.Name := 'Tahoma';
ComboBoxDirection.Font.Size := 8;
ComboBoxDirection.Font.Color := clWindowText;
ComboBoxDirection.Color := clWindow;
ComboBoxDirection.TabOrder := 1;
ComboBoxDirection.TabStop := TRUE;
ComboBoxDirection.Sorted := FALSE;
ComboBoxDirection.ItemHeight := 13;
ComboBoxDirection.Items.ADD('Север');
ComboBoxDirection.Items.ADD('Северо-Восток');
ComboBoxDirection.Items.ADD('Восток');
ComboBoxDirection.Items.ADD('Юго-Восток');
ComboBoxDirection.Items.ADD('Юг');
ComboBoxDirection.Items.ADD('Юго-Запад');
ComboBoxDirection.Items.ADD('Запад');
ComboBoxDirection.Items.ADD('Северо-Запад');
ComboBoxDirection.ItemIndex := 0;
//......................................
//......................................
//ComboBoxItem
ComboBoxItem := TComboBox.Create(Result);
ComboBoxItem.Parent := GroupBox2;
ComboBoxItem.Left := 38;
ComboBoxItem.Top := 43;
ComboBoxItem.Width := 135;
ComboBoxItem.Height := 21;
ComboBoxItem.Visible := TRUE;
ComboBoxItem.Tag := 0;
ComboBoxItem.Enabled := TRUE;
ComboBoxItem.Hint := 'Выбери из списка затачиваемый предмет';
ComboBoxItem.ShowHint := TRUE;
ComboBoxItem.Text := 'ComboBoxItem';
ComboBoxItem.Font.Name := 'Tahoma';
ComboBoxItem.Font.Size := 8;
ComboBoxItem.Font.Color := clWindowText;
ComboBoxItem.Color := clWindow;
ComboBoxItem.TabOrder := 1;
ComboBoxItem.TabStop := TRUE;
ComboBoxItem.ItemIndex := -1;
ComboBoxItem.Sorted := FALSE;
ComboBoxItem.ItemHeight := 13;
ComboBoxItem.OnClick := @ComboBoxItem_Click;
//......................................
//......................................
//Label1
Label1 := TLabel.Create(Result);
Label1.Parent := GroupBox2;
Label1.Left := 6;
Label1.Top := 23;
Label1.Width := 58;
Label1.Height := 13;
Label1.Visible := TRUE;
Label1.Tag := 0;
Label1.Enabled := TRUE;
Label1.Hint := '';
Label1.ShowHint := FALSE;
Label1.Caption := 'Цвет:';
Label1.Transparent := TRUE;
Label1.WordWrap := FALSE;
Label1.Alignment := taLeftJustify;
Label1.Layout := tlTop;
Label1.AutoSize := TRUE;
Label1.Align := alNone;
Label1.Font.Name := 'Tahoma';
Label1.Font.Size := 8;
Label1.Font.Color := clWindowText;
Label1.Color := clBtnFace;
//......................................
//......................................
//Label2
Label2 := TLabel.Create(Result);
Label2.Parent := GroupBox2;
Label2.Left := 6;
Label2.Top := 47;
Label2.Width := 58;
Label2.Height := 13;
Label2.Visible := TRUE;
Label2.Tag := 0;
Label2.Enabled := TRUE;
Label2.Hint := '';
Label2.ShowHint := FALSE;
Label2.Caption := 'Итем:';
Label2.Transparent := TRUE;
Label2.WordWrap := FALSE;
Label2.Alignment := taLeftJustify;
Label2.Layout := tlTop;
Label2.AutoSize := TRUE;
Label2.Align := alNone;
Label2.Font.Name := 'Tahoma';
Label2.Font.Size := 8;
Label2.Font.Color := clWindowText;
Label2.Color := clBtnFace;
//......................................
//......................................
//Label3
Label3 := TLabel.Create(Result);
Label3.Parent := GroupBox2;
Label3.Left := 114;
Label3.Top := 23;
Label3.Width := 58;
Label3.Height := 13;
Label3.Visible := TRUE;
Label3.Tag := 0;
Label3.Enabled := TRUE;
Label3.Hint := '';
Label3.ShowHint := FALSE;
Label3.Caption := 'М:';
Label3.Transparent := TRUE;
Label3.WordWrap := FALSE;
Label3.Alignment := taLeftJustify;
Label3.Layout := tlTop;
Label3.AutoSize := TRUE;
Label3.Align := alNone;
Label3.Font.Name := 'Tahoma';
Label3.Font.Size := 8;
Label3.Font.Color := clWindowText;
Label3.Color := clBtnFace;
//......................................
//......................................
//Label4
Label4 := TLabel.Create(Result);
Label4.Parent := GroupBox2;
Label4.Left := 6;
Label4.Top := 71;
Label4.Width := 58;
Label4.Height := 13;
Label4.Visible := TRUE;
Label4.Tag := 0;
Label4.Enabled := TRUE;
Label4.Hint := '';
Label4.ShowHint := FALSE;
Label4.Caption := 'Напр.:';
Label4.Transparent := TRUE;
Label4.WordWrap := FALSE;
Label4.Alignment := taLeftJustify;
Label4.Layout := tlTop;
Label4.AutoSize := TRUE;
Label4.Align := alNone;
Label4.Font.Name := 'Tahoma';
Label4.Font.Size := 8;
Label4.Font.Color := clWindowText;
Label4.Color := clBtnFace;
//......................................
//......................................
//Path
Path := TEdit.Create(Result);
Path.Parent := GroupBox1;
Path.Left := 5;
Path.Top := 103;
Path.Width := 117;
Path.Height := 20;
Path.Visible := TRUE;
Path.Tag := 0;
Path.Enabled := TRUE;
Path.Hint := 'Введи путь к файлу BMP';
Path.ShowHint := TRUE;
Path.Text := '';
Path.Font.Name := 'Tahoma';
Path.Font.Size := 7;
Path.Font.Color := clWindowText;
Path.Color := clWindow;
Path.TabOrder := 5;
Path.TabStop := TRUE;
Path.ReadOnly := FALSE;
Path.MaxLength := 0;
Path.AutoSize := TRUE;
Path.OnKeyPress := @Path_Key;
//......................................
//......................................
//LoadImage
LoadedImage:= TImage.Create(Result);
LoadedImage.Parent:=GroupBox1;
LoadedImage.Left :=5;
LoadedImage.Top := 16;
LoadedImage.Width := 150;
LoadedImage.Height := 90;
LoadedImage.Visible := TRUE;
LoadedImage.Tag := 0;
LoadedImage.Enabled := TRUE;
LoadedImage.Hint := '';
LoadedImage.ShowHint := FALSE;
LoadedImage.Center := TRUE;
LoadedImage.Proportional := TRUE;
//......................................
//......................................
//LoadButton
LoadButton := TButton.Create(Result);
LoadButton.Parent := GroupBox1;
LoadButton.Left := 124;
LoadButton.Top := 102;
LoadButton.Width := 32;
LoadButton.Height := 21;
LoadButton.Visible := TRUE;
LoadButton.Tag := 0;
LoadButton.Enabled := TRUE;
LoadButton.Hint := '';
LoadButton.ShowHint := FALSE;
LoadButton.Caption := '...';
LoadButton.Font.Name := 'Tahoma';
LoadButton.Font.Size := 8;
LoadButton.Font.Color := clWindowText;
LoadButton.Font.CharSet := 1;
LoadButton.TabOrder := 2;
LoadButton.TabStop := TRUE;
LoadButton.Cancel := FALSE;
LoadButton.ModalResult := 0;
LoadButton.OnClick := @LoadButton_Click;
//......................................
//......................................
//StartButton
StartButton := TButton.Create(Result);
StartButton.Parent := GroupBox2;
StartButton.Left := 6;
StartButton.Top := 102;
StartButton.Width := 80;
StartButton.Height := 21;
StartButton.Visible := TRUE;
StartButton.Tag := 0;
StartButton.Enabled := TRUE;
StartButton.Hint := '';
StartButton.ShowHint := FALSE;
StartButton.Caption := 'Старт';
StartButton.Font.Name := 'Tahoma';
StartButton.Font.Size := 8;
StartButton.Font.Color := clWindowText;
StartButton.Font.CharSet := 1;
StartButton.TabOrder := 2;
StartButton.TabStop := TRUE;
StartButton.Cancel := FALSE;
StartButton.ModalResult := 0;
StartButton.OnClick := @StartButton_Click;
//......................................
//......................................
//StopButton
StopButton := TButton.Create(Result);
StopButton.Parent := GroupBox2;
StopButton.Left := 96;
StopButton.Top := 102;
StopButton.Width := 80;
StopButton.Height := 21;
StopButton.Visible := TRUE;
StopButton.Tag := 0;
StopButton.Enabled := TRUE;
StopButton.Hint := '';
StopButton.ShowHint := FALSE;
StopButton.Caption := 'Стоп';
StopButton.Font.Name := 'Tahoma';
StopButton.Font.Size := 8;
StopButton.Font.Color := clWindowText;
StopButton.Font.CharSet := 1;
StopButton.TabOrder := 3;
StopButton.TabStop := TRUE;
StopButton.Cancel := FALSE;
StopButton.ModalResult := 0;
StopButton.OnClick := @StopButton_Click;
//......................................
Yes := TRUE;
FINALLY
if not Yes then begin
//Освобождаем ресурсы, если неудачно ...
if Result<>NIL then begin
Result.Free;
Result:=NIL;
end;
end;
END;
Result.Show;
end;
procedure Init; //Вызывается при включении скрипта
begin
FormMain:=Create_FormMain;
stats.Lines.Add('Скрипт: Рисование предметами by ArchDevil!');
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=700; //время задержки
ready:=false;
StringList:=TStringList.Create;
ItemsName:=TStringList.Create;
try
ItemsName.LoadFromFile('itemsid.ini');
except
stats.Lines.Add('itemsid.ini не найден!');
exit;
end;
buf:=hstr('14');
SendToServerEx(Name);
end;
procedure bmpfree;
begin
try
if bmp<>NIL then
begin
bmp.Free;
bmp:=NIL;
end;
finally
end;
end;
procedure Free;
var i:integer;
begin
Free_FormMain; bmpfree;
StringList.Clear; ItemsName.Clear;
timer.Free;
if LoadedImage<>NIL then LoadedImage:=NIL;
currentx:=0; currenty:=0; StartX:=0; StartY:=0;
StartZ:=0; MyX:=0; MyY:=0; ItemOID:=0;
ready:=false;
for i:=1 to 5 do begin
SelectedItems[1,i]:=0;
SelectedItems[2,i]:=0;
SelectedItems[3,i]:=0;
end;
end;
//CreateItemBase и InventoryUpdate Взял со скрипта NLObP на заточку
//---------------------------------------------
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
end;
j:=4;
ListCount:=ReadH(j);
j:=8;
for i:=1 to ListCount do begin
ItemBase[1,i]:=ReadD(j);
ItemBase[2,i]:=ReadD(j);
inc(j,4);
ItemBase[3,i]:=ReadD(j);
inc(j,60);
end;
StringList.Clear;
try
for i:=1 to ListCount do begin
try
StringList.Add(ItemsName.Values[IntToStr(ItemBase[2,i])]); //записываем название вещей из инвентаря
except;
end
end;
except;
exit;
end;
with ComboBoxItem do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
//......................................
//************************************************** ****************************
procedure InventoryUpdate; //пакет 27, обновляет базу ObjectID по ItemID
var
i, ii, j, OID, ID, Count, ListCount, UpdType: integer;
add : boolean;
begin
add:=false;
ListCount:=ReadH(2);
j:=4;
for ii:=1 to ListCount do begin
add:=false;
UpdType:=ReadH(j);
inc(j,2); //ItemType1
OID:=ReadD(j); //ObjectID
ID:=ReadD(j); //ItemID
inc(j,4);
Count:=ReadD(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;
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;
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;
end;
end;
end;
end;
inc(j,58);
end;
end;
//------------------------------------
function GetCount(OID:integer) : integer;
var
i : integer;
begin
for i:=1 to max do begin
if ItemBase[1,i]=OID then begin
result:=ItemBase[3,i]; // count
exit;
end;
end;
result:=0;
end;
//--------------------------------------------
function delta(x1, y1, x2, y2:extended):integer; //возвращает растоянием между 2 точками
var
dx,dy,summa: extended;
begin
dx:=x2-x1;
dy:=y2-y1;
summa:=dx*dx+dy*dy;
if summa=0 then result:=0 else result:=Round(sqrt(summa));
end;
//--------------------------------------------
procedure OnTimer(Sender: TObject);
//====================
procedure GetNextCoords;
begin
case ComboBoxDirection.ItemIndex of
0: begin
NextX:=StartX+currentx*(ComboBoxScale.ItemIndex+1) ;
NextY:=StartY+currenty*(ComboBoxScale.ItemIndex+1) ;
end;
1: begin
NextX:=StartX+currentx*(ComboBoxScale.ItemIndex+1)-currenty*(ComboBoxScale.ItemIndex+1);
NextY:=StartY+currenty*(ComboBoxScale.ItemIndex+1) +currentx*(ComboBoxScale.ItemIndex+1);
end;
2: begin
NextX:=StartX-currenty*(ComboBoxScale.ItemIndex+1);
NextY:=StartY+currentx*(ComboBoxScale.ItemIndex+1) ;
end;
3: begin
NextX:=StartX-currentx*(ComboBoxScale.ItemIndex+1)-currenty*(ComboBoxScale.ItemIndex+1);
NextY:=StartY-currenty*(ComboBoxScale.ItemIndex+1)+currentx*(Com boBoxScale.ItemIndex+1);
end;
4: begin
NextX:=StartX-currentx*(ComboBoxScale.ItemIndex+1);
NextY:=StartY-currenty*(ComboBoxScale.ItemIndex+1);
end;
5: begin
NextX:=StartX-currentx*(ComboBoxScale.ItemIndex+1)+currenty*(Com boBoxScale.ItemIndex+1);
NextY:=StartY-currenty*(ComboBoxScale.ItemIndex+1)-currentx*(ComboBoxScale.ItemIndex+1);
end;
6: begin
NextX:=StartX+currenty*(ComboBoxScale.ItemIndex+1) ;
NextY:=StartY-currentx*(ComboBoxScale.ItemIndex+1);
end;
7: begin
NextX:=StartX+currentx*(ComboBoxScale.ItemIndex+1) +currenty*(ComboBoxScale.ItemIndex+1);
NextY:=StartY+currenty*(ComboBoxScale.ItemIndex+1)-currentx*(ComboBoxScale.ItemIndex+1);
end;
end;
end;
//====================
begin
ItemOID:=0;
repeat
if currentx=bmp.width-1 then
begin
inc(currenty);
currentx:=0;
end else inc(currentx);
if currenty=bmp.height then
begin
timer.enabled:=false;
stats.lines.add('Остановлено! Рисунок нарисован!');
StartButton.enabled:=true;
exit;
end;
case bmp.Canvas.pixels[currentx,currenty] of //матрица пикселей
clBlack: if (SelectedItems[1,1]>0) and (GetCount(SelectedItems[1,1])>0) then ItemOID:=SelectedItems[1,1];
clRed: if (SelectedItems[1,2]>0) and (GetCount(SelectedItems[1,2])>0) then ItemOID:=SelectedItems[1,2];
clGreen: if (SelectedItems[1,3]>0) and (GetCount(SelectedItems[1,3])>0) then ItemOID:=SelectedItems[1,3];
clBlue: if (SelectedItems[1,4]>0) and (GetCount(SelectedItems[1,4])>0) then ItemOID:=SelectedItems[1,4];
clYellow:if (SelectedItems[1,5]>0) and (GetCount(SelectedItems[1,5])>0) then ItemOID:=SelectedItems[1,5];
end;
until ItemOID<>0;
if ItemOID=0 then exit;
stats.lines.add('Текущий элемент матрицы: x='+inttostr(currentx)+', y='+inttostr(currenty)+'.');
GetNextCoords;
if delta(MyX,MyY,NextX,NextY)>MaxDistance then begin //расстояние между точками
buf:=#$0F;
WriteD(NextX);
writeD(NextY);
WriteD(MyZ);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteD(1);
SendToServerEx(Name);
timer.enabled:=false; //Отключаем на время передвижения
ready:=true;
exit;
end;
buf:=#$17;
WriteD(ItemOID);
WriteD(1);
WriteD(NextX);
WriteD(NextY);
WriteD(MyZ);
SendToServerEx(Name);
end;
//--------------------------------------------
begin
if FromClient and (ConnectName=Name) then
case pck[1] of
#$59: begin
MyX:=ReadD(2); // постоянно считываем координаты чара
MyY:=ReadD(6);
MyZ:=ReadD(10);
if ready and (delta(Myx,Myy,NextX,NextY)<MaxDistance/2) then begin //Меньше половины MaxDistance можно включать таймер
buf:=#$17; //Выкидываем предмет который не выкинули когда дельта привышала MaxDistance
WriteD(ItemOID);
WriteD(1);
WriteD(NextX);
WriteD(NextY);
WriteD(MyZ);
SendToServerEx(Name);
ready:=false;
timer.enabled:=true;
end;
end;
end;
if FromServer and (ConnectName=Name) then
case pck[1] of
#$11: CreateItemBase; //создание базы предметов
//......................................
#$21: InventoryUpdate; //Обновление базы
#$62: if (StartButton.enabled=false) and (timer.enabled=false) and (ReadD(6)=3) then
begin
StartX:=ReadD(14); //Считываются только 1 раз
StartY:=ReadD(22);
StartZ:=ReadD(30);
MyX:=StartX;
MyY:=StartY;
MyZ:=StartZ;
timer.enabled:=true;//Вот теперь включаем таймер
end;
end;
end.

Fer123
28.04.2009, 14:22
ver 0,2
-Выбор направления (теперь не рисует только на север)
-Мелкие исправления и доработки

Обновил скрипты для С4/ИЛ, Грация пт2

Necrolity
29.04.2009, 02:05
а как можно добавить или изменить (если есть) задержку между отправкой пакетов. У меня на сервере если слишком часто спамить пакеты, то дисконнектит

Добавлено через 1 минуту
все, извиняюсь, уже увидел в скрипте

J-Fobos
06.05.2009, 01:00
У меня предложение. Сделать проверку на количество итемов. Просто когда заполнять StringList написать if Count>1 then begin <и тут уже добавлять строки> end. Зачем? Ну чтоб пользователь не выбрал случайно шмотку или еще что-то не стопковое.

Johnson
11.05.2009, 08:51
Извините за глупый вопрос, но... как сохрянять битмап? Paint.NET для этого годится? Или подскажите другой графический редактор...

Fer123
11.05.2009, 12:04
MS Paint сойдет

Johnson
11.05.2009, 19:31
Скрипт: Рисование предметами by ArchDevil!
itemsid.ini не найден!

пробовал ложить этот файл в корень пакетхака - то же самое.
ПХ 3.5.9

alexteam
11.05.2009, 20:05
прописать правильный путь в месте подгрузки itemsid.ini

Johnson
13.05.2009, 19:15
решил проблему... скопировал itemsid.ini в папку скриптов...

NLObP
13.05.2009, 21:09
решил проблему... скопировал itemsid.ini в папку скриптов...

Это конечно тоже решение, но надо было исправить в процедуре INIT
procedure Init; //Вызывается при включении скрипта
begin
FormMain:=Create_FormMain;
stats.Lines.Add('Скрипт: Рисование предметами by ArchDevil!');
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=700; //время задержки
ready:=false;
StringList:=TStringList.Create;
ItemsName:=TStringList.Create;
try
ItemsName.LoadFromFile('itemsid.ini');
except
stats.Lines.Add('itemsid.ini не найден!');
exit;
end;
buf:=hstr('0F');
SendToServerEx(Name);
end;

вот эти строчки

try
ItemsName.LoadFromFile('itemsid.ini');
except
stats.Lines.Add('itemsid.ini не найден!');
exit;
end;
на такую

ItemsName.LoadFromFile('.\settings\itemsid.ini');

GvozD
06.06.2009, 14:42
подскажите где поправить для gracia final, а то половину инвентаря не видит, и адену тоже

Fer123
06.06.2009, 17:36
Здесь грация парт 2 http://coderx.ru/showpost.php?p=28559&postcount=40.
Так что сначало надо понять чем отличаються пакеты в парт 2 и финал. Скорее всего это какието добавления в пакете ItemsList. Я думаю править надо процедуры CreateItemsList и InventoryUpdate. Ну и проверь другие пакеты может тоже есть какието изменения

GvozD
06.06.2009, 20:45
что то маленько ума нехватает переделать!
буду ждать))) может кто и переделает!:D

AoWpwnz
14.08.2009, 18:35
НА Ил будет работать?

TAMBIK
14.08.2009, 18:48
НА Ил будет работать?

может очки надо
//------------------------------------------------------------------
//Скрипт для рисования предметами пока только для с4 и интерлюдии

AoWpwnz
14.08.2009, 19:44
еше 1 вопросик,тут написано скрипт рисования предметами*я думаю ето не аденой а разнацветными кристалами т.п. а аденой будет?))

Grinch
14.08.2009, 21:52
AoWpwnz, для тех кто в танке адена является предметом и ничем не отличается от кристалов и т.д. как в реале деньги являются предметом точно таким же как и хлеб только их кушать нельзя, но если возьмёшь рубль бумажный то прочитаешь там билет банка россии.

AoWpwnz
14.08.2009, 23:51
всё ок ок)спасибо

Inter
15.08.2009, 04:02
Объясните плз. Не понял вот тут в описание что делать:

//Черный,красный,зеленый,голубой,желтый цвета пикселей можно привязать к отдельному предмету
//Выберите цвет в боксе color, затем предмет в боксе Item (предметов должно быть>1 чтобы они появились в списке)
//scale - масштаб отступа между предметами от 1:1 до 10:1
//Самый оптимальный масштаб 5:1
//Направление - согласно компасу в игре

TAMBIK
15.08.2009, 04:40
нарисовал так думаю желтое что то значит предмет должен быть желтым какой выбрасывать

Inter
15.08.2009, 06:34
нарисовал так думаю желтое что то значит предмет должен быть желтым какой выбрасывать

А на другие 4 пункта че делать?

//Выберите цвет в боксе color, затем предмет в боксе Item (предметов должно быть>1 чтобы они появились в списке)
//scale - масштаб отступа между предметами от 1:1 до 10:1
//Самый оптимальный масштаб 5:1
//Направление - согласно компасу в игре

Fer123
15.08.2009, 18:06
Эти цвета это цвета пикселей на твоей картинке, которую можно нарисовать например в пейнте. Всего поддерживаеться Черный,красный,зеленый,голубой,желтый цвета. Все остальные на картинке будут игнорироваться.

Так вот что надо сделать:
1. Нарисовать картинку
2. Загрузить ее.
3. К каждому цвету привязать предмет которым ты будешь рисовать (не обязатьельно ко всем цветам, если надо только 1 тогда укажи только 1)
Например в картинке ты нарисовал буквы черным цветом, значит
в боксе цвет выбираешь черный, а в боксе предмет выбираешь например адену. Если все ок то "Адена" измениться на "Адена - черный".
4. Масштаб например 5:1
5. Направления рисунка, тут я думаю понятно - согласно компаса л2
6. Нажать "Старт"

Inter
16.08.2009, 07:33
Чар тупо также стоит. Прописывает /loc в игре и все.

Fer123
17.08.2009, 18:02
А что пишет в поле внизу окна?

Inter
17.08.2009, 23:47
А что пишет в поле внизу окна?

Не чего вообще не где не пишет кроме авто /loc
Сервер ХБ, от гуардов

Sashafaq
24.08.2009, 15:38
такой вопросик что добавить чтобы можно выставлять интервал выбрасывания предметов

Добавлено через 10 минут
сори оч ступил нашел уже )

Doberman
26.08.2009, 07:26
Вопрос: где можно нарисовать норм рисунок для скрипта.
робывал в паинте ничерта не получается( т.к рисованием незанимался ),а если и нарисую пару каракуль то в игре оч большой рисунок получается хотя рисовал маленький.
Если у кого есть интерестные картинки для скрипта,скиньте плз.

Inter
28.08.2009, 18:45
Кто нибудь поможет уже?

pr0m0
28.01.2010, 22:48
Чар тупо также стоит. Прописывает /loc в игре и все.
ПРисоединяюсь к проблеме, инвентарь видит весь... авто каманда /loc и все...

Diavolic
29.01.2010, 11:26
На Грации Финал у меня при запуске чар бегал,но невыкидывал адену... при просмотре отосланных пакетов заметил некоторое отличие между пакетами которые посылаются скриптом и теми когда вручную выкидываешь адену
пакет высылаемый скриптом:
Tип: 0x17 (RequestDropItem)
Pазмер: 21+2
Время прихода: 09:06:37:109
0002 d ObjectID: 268573183 (0x100219FF)
0006 q Count: -302786604433407
000E d X: 258186 (0x0003F08A)
0012 d Y: -3115 (0xFFFFF3D5)

Ну а это когда вручную


Tип: 0x17 (RequestDropItem)
Pазмер: 25+2
Время прихода: 09:19:20:671
0002 d ObjectID: 268573183 (0x100219FF)
0006 q Count: 1
000E d X: -70538 (0xFFFEEC76)
0012 d Y: 258137 (0x0003F059)
0016 d Z: -3141 (0xFFFFF3BB)


может кто обьяснить что изменить в скрипте чтобы он отсылал правильный пакет?

alexteam
29.01.2010, 12:15
WriteD(ItemOID);
WriteQ(1);
WriteD(NextX);
WriteD(NextY);
WriteD(MyZ);

Diavolic
29.01.2010, 13:39
Всё заработало) Спасибку тыкнул)

pr0m0
29.01.2010, 17:25
Не кто не пробывал на Парт2 ?? а то вроде бы инвентарь видит, пакеты отсылает но скрипт только проверяет /loc и на этом заканчивает.

Fer123
29.01.2010, 21:25
Вообще я скрипт и писал для парт 2 и все норм работало. Скорее всего у тебя какие то различия в пакете #$62 и из-за этого не запускается таймер вот здесь
#$62: if (StartButton.enabled=false) and (timer.enabled=false) and (ReadD(6)=3) then
begin
StartX:=ReadD(14); //Считываются только 1 раз
StartY:=ReadD(22);
StartZ:=ReadD(30);
MyX:=StartX;
MyY:=StartY;
MyZ:=StartZ;
timer.enabled:=true;//Вот теперь включаем таймер
end;
Скинь свой пакет "SystemMSG" который идет после /loc я попробую тебе помочь...

pr0m0
30.01.2010, 10:29
62 8E 03 00 00 03 00 00 00 01 00 00 00 88 AB FE FF 01 00 00 00 B8 D2 03 00 01 00 00 00 E0 F1 FF FF
Tип: 0x62 (SystemMessage)
Pазмер: 33+2
Время прихода: 13:25:31:375
0002 d MsgID: Текущая локация: $s1, $s2, $s3 (возле Деревни Говорящего Острова) ID:910 (0x038E)
0006 d typesCount: 3 (0x00000003)
Вообщем в этом деле навичок но я наверно правильно тебя понял.
Скрипт как раз у меня для парт2

Fer123
30.01.2010, 12:03
Пакет нормальный таймер должен включаться...
Напиши мне по порядку как ты запускаешь скрипт и какую картинку используешь (мб в ней нет цветов который распознает скрипт) скинь лог скрипта - это там где написано "Скрипт: Рисование предметами by ArchDevil!"

pr0m0
30.01.2010, 17:38
Рисовал картинку черным по белому, скрипт запускаю обычно через Автоматизации > скрипт, там ставлю галочку на скрипте, выбираю картинку, выбираю цвет и адены на выкидывание и жму старт
скинуть весь скрипт ??

Fer123
30.01.2010, 19:37
Лог скрипта скинь...

pr0m0
30.01.2010, 22:07
Скрипт: Рисование предметами by ArchDevil!
Картинка успешно загружена!
Старт!
.больше не чего не пишит...

Fer123
31.01.2010, 09:39
Не помойму в чем проблема... Пакет /loc правильный, тоесть координаты считывает верно, а потом включает таймер. И если даже скрипт не видел бы инвентарь, или цвета на картинке или пакет неправильный отсылал на выброс вещи то он все равно в конце должен в логе написать Остановлено! Рисунок нарисован!
В общем посмотри отсылает ли скрипт пакет RequestDropItem. Если да то выложи его. И еще выкинь сам что-нибудь и выложи тоже этот пакет.

pr0m0
31.01.2010, 15:48
вообщем при старте скрипта RequestDropItem пакет не отсылает, попробывал скинуть вешь получил вот пакет :
17 6B 4E 3C 10 01 00 00 00 F8 51 FF FF FC 47 FE FF F7 FE FF FF
Tип: 0x17 (RequestDropItem)
Pазмер: 21+2
Время прихода: 18:44:23:968
0002 d ObjectID: 272387691 (0x103C4E6B)
0006 d Count: 1 (0x00000001)
000A d X: -44552 (0xFFFF51F8)
000E d Y: -112644 (0xFFFE47FC)
0012 d Z: -265 (0xFFFFFEF7
и еще проблемка раньше видел инвентарь а сейчас только ComboBoxItem

Fer123
01.02.2010, 09:40
А что за сервер, дай ссылку. Будет время разберусь, а то так гадать еще долго будем.

pr0m0
02.02.2010, 17:01
http://la2gothic.ru Gracia Part 2
Просто нашел скрипт и хотел попробывать что нибудь нарисовать через него но не чего не вышло..
Буду ждать решений, идея очень хорошая

Fer123
04.02.2010, 10:03
Не знаю что ты не так делаешь...
Я попробовал у меня все нормально работает на твоем сервере. Сначала немного картинку не дорисовывало, потом MaxDistance поставил на 130 и timer.interval на 1000 и все нормально стало..
P.S. У тебя на сервере автоудаление дропа... Так что долго картинка не остается.

pr0m0
06.02.2010, 01:09
Да ну ладно, на сайт долго не заходил, я решил попробывать чисто из за спортивного интереса. )

pr0m0
24.02.2010, 12:32
Привет всем, вернулся к тому что хотелось нарисовать что нибудь, и опять скрипт начинаеться тем что пишит команду /loc и на этом какие либо дествия скрипта заканчиваються, Уважаемый Fer123 напишите все по пунктам как запускать...

Fer123
24.02.2010, 20:43
В скрипте Name='заменить на свое'
MaxDistance на 130 и timer.interval на 1000
1 Запустить
2 Загрузить картинку (кнопка "..."), bmp файл желательно нарисованный в пейнте черный,красный,зеленый,голубой,желтый цвета
3 Выбрать цвет
4 Для этого цвета выбрать предмет (если все ок то к названию этого предмета должен добавиться цвет "предмет - цвет")
5 Выбрать направление по компасу в игре
6 Нажать Старт
Вот так должно быть
http://img140.imageshack.us/img140/1218/itempainter.th.png (http://img140.imageshack.us/img140/1218/itempainter.png)
P.S. Недавно рисовал скриптом, вот прикольные картинки получились
http://img217.imageshack.us/img217/6768/shot00032f.th.png (http://img217.imageshack.us/img217/6768/shot00032f.png)
http://img27.imageshack.us/img27/174/shot00037be.th.png (http://img27.imageshack.us/img27/174/shot00037be.png)
Черный-Steel
Красный-SoulShot B
Серый-Varnish
Коричнивый-Wooden Frame
Белый-Silver Nugget
Желтый-Adena

QaK
24.02.2010, 22:04
Блин, прикольно получилось, молодец Фер

2012
05.03.2010, 22:49
народ а под грцию финал такая программа есть?

supernewbie
26.06.2010, 21:36
у меня почему-то отказывается искать itemsid.ini :(

Fer123
27.06.2010, 12:55
попробуй прописать полный путь к нему здесь
ItemsName.LoadFromFile('itemsid.ini');

supernewbie
28.06.2010, 14:05
все заработало, когда переместил папку с пх в корневую
только вот для грации эпилог не робит он... инвентарь не сканит

QaK
28.06.2010, 19:29
supernewbie, под эпилог ничего не написано, ибо даже packets*.ini нет для эпилога, так что сам давай =)

supernewbie
28.06.2010, 23:49
пытаюсь)
//QaK: молодец =)

Добавлено через 1 час 56 минут
инвентарь заставил сканить)

Добавлено через 33 секунды
но после команды которое дает сообщение с координатами все стопарится

Добавлено через 8 минут
пишет что рисунок нарисован и все(

Добавлено через 1 час 4 минуты
*ня*

Добавлено через 48 минут
атстой) не работает и все)

QaK
29.06.2010, 18:15
supernewbie, сделай формочку с Tmemo и пиши туда лог, после каждого оператора, значение основных переменных, отследишь таким образом, где у тебя рубится ...

supernewbie
29.06.2010, 20:10
формочку гришь...

J-Fobos
29.06.2010, 20:21
формочку гришь...
А я вместо формочки пользуюсь игровым чатом, все переменные туда вывожу, мне удобней и быстрей. Ну это больше кто как привык.

supernewbie
29.06.2010, 20:30
ЫЫ получилось!!!!!1111

J-Fobos
29.06.2010, 20:40
Поздравляю) Можете выкладывать на форуме и зарабатывать спасибки :)

supernewbie
29.06.2010, 20:58
короче, че можно сказать, скрипт не умеет читать все что выше 2^32.
PS правил его криворукий наб) какашки не кидать)
PSS вроде рисует)

supernewbie
29.06.2010, 22:24
то что он пишет тип не может бросить так далеко это окей?)
блин, полный отстой, на нашем серваке исчезает все через 10 минут(

J-Fobos
29.06.2010, 23:55
то что он пишет тип не может бросить так далеко это окей?)
блин, полный отстой, на нашем серваке исчезает все через 10 минут(
Там есть проверка на расстояние чара к точке выброса, надо уменьшить это расстояние.
А то что исчезают не проблема ;) Заблокируйте пакет (к сожалению не помню id) на удаление итема с земли (всего одна строчка if FromServer and pck[1]=#$ID then pck:=''; ) и исчезновение не будет мешать рисовать, правда картинку только вы сможете видеть, но скрин выйдет как надо :)

Fer123
30.06.2010, 02:18
supernewbie, MaxDistance поставь меньше...

J-Fobos, если уж на то пошло, то можно вместо RequestDropItem сделать SpawnItem для клиента. Тогда уже и на счет расстояния не надо париться, и таймер интервал можно поставить хоть 1 мсек.

supernewbie
30.06.2010, 02:45
Там есть проверка на расстояние чара к точке выброса, надо уменьшить это расстояние.
А то что исчезают не проблема ;) Заблокируйте пакет (к сожалению не помню id) на удаление итема с земли (всего одна строчка if FromServer and pck[1]=#$ID then pck:=''; ) и исчезновение не будет мешать рисовать, правда картинку только вы сможете видеть, но скрин выйдет как надо :)
спасибо блин кэп) но как бы эт самое главное( чтобы все видели(
переделал под пакеты на клиент, лаги жуть)

Breadfan
30.06.2010, 14:09
...начали появляться индивидуумы, рисующие чегонть прям на тп, наподобие "вары - казлы", что приводит к увеличению времени прогрузки после тп того же вара, и спокойно сливают, даже танки отлетают, невзирая на кучу удов...просто не могут прогрузиться успеть...Оно, конечно, и просто так можно накидать кучу хлама, но когда хлам сложен в ровные и аккуратные буковки - вдвойне приятно (неприятно) :D

AdioS
10.11.2010, 16:27
Попробовал запустить на Gracia Final. Тот скрипт что в начале - ругается. Выкидывать не хочет. В игре в чат пишет что не может так часто что то там...
Скачал скрипт от supernewbie - ItemPainter по идее QaK.rar
Начал рисовать но в чате в игре пишет что "Невозможно так часто повторить" или как то так.
Вопрос - в какой строке скрипта надо заменить число, чтобы время между выбросами итемов увеличить?!
P.S.Заранее спс!

NLObP
11.11.2010, 01:08
Вопрос - в какой строке скрипта надо заменить число, чтобы время между выбросами итемов увеличить?!

Найди такую строку и исправь её
timer.interval:=700; //время задержки

Seque1
09.05.2011, 05:44
Спасибо за скрипт :D

Убил на это 6+ часов :o
http://i043.radikal.ru/1104/6f/8c60bf5edcb0.jpg

wimax
09.05.2011, 16:15
Seque1, Супер хД

Zooey
05.03.2012, 07:48
Добрый день\вечер,хотелось бы узнать возможно этот скрипт подогнать под high five?
p.s. поиск юзал,и эта единственная тема по "рисункам аденой"
прошу ответить мне и не удалять мой пост :cray:.Простите что поднял тему 2х летний давности,но это очень важно для меня

supernewbie
05.03.2012, 10:06
Zooey, канеш возможно, только инфа 97% что всем пох и нет времени на это, так что флаг тебе в руки