Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

как реализовать обмен данными из разных скриптов?

тут можно задать вопрос по скриптингу
Post Reply
uzver1234
Neophyte
Neophyte
Posts: 17
Joined: 14.09.2010 16:09

как реализовать обмен данными из разных скриптов?

Post by uzver1234 »

Есть скрипт на лесоруба. Задаешь начальную точку, с нее начинает поиск деревьев, рубит, запоминает и ищет новые. Работает 3 скрипта одновременно. Как между ними сделать обмен инфы о уже рубленых деревьях?
Из идей пока только обмен через файлы. Считаю это неправильным:)
Надо передавать массив уже рубленных деревьев (тип тайла, х, у, z)
Last edited by uzver1234 on 08.11.2011 12:02, edited 1 time in total.
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

Re: как реализовать обмен данными из разных скриптов?

Post by Alex »

Новый стелс лежит тут. Стелс это произведение искусства! :)
uzver1234
Neophyte
Neophyte
Posts: 17
Joined: 14.09.2010 16:09

Re: как реализовать обмен данными из разных скриптов?

Post by uzver1234 »

Читал.
Как ты предлагаешь передать массив из 100х4 элементов через SetGlobal?
uzver1234
Neophyte
Neophyte
Posts: 17
Joined: 14.09.2010 16:09

Re: как реализовать обмен данными из разных скриптов?

Post by uzver1234 »

uzver1234 wrote:
Читал.
Как ты предлагаешь передать массив из 100х4 элементов через SetGlobal?
Сори, поточнее, можно и так. Но как я понял SetGlobal создает переменную 1, не массив и придется обрабатывать 400 строк на скрипт. В моем случа это 1200 переменных с уникальным именем.
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

Re: как реализовать обмен данными из разных скриптов?

Post by Alex »

да, SetGlobal принемает только строку как возможное значение, что бы массив туда загонять придется присать конвертеры из массива в строку и обратно, к примеру знаком | разделять значения из массива а потом StrBreakApart что бы развернуть обратно
Новый стелс лежит тут. Стелс это произведение искусства! :)
uzver1234
Neophyte
Neophyte
Posts: 17
Joined: 14.09.2010 16:09

Re: как реализовать обмен данными из разных скриптов?

Post by uzver1234 »

Alex wrote:да, SetGlobal принемает только строку как возможное значение, что бы массив туда загонять придется присать конвертеры из массива в строку и обратно, к примеру знаком | разделять значения из массива а потом StrBreakApart что бы развернуть обратно
Тоже идея, попробую на неделе. Если получиться выложу код.
Есть ограничение на длину строки?
chobi0ne
Neophyte
Neophyte
Posts: 33
Joined: 17.01.2011 13:02
Contact:

Re: как реализовать обмен данными из разных скриптов?

Post by chobi0ne »

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

Всё-таки, сетглобал в таких объемах я бы не рискнул использовать :)
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: как реализовать обмен данными из разных скриптов?

Post by CFA »

Около 20 тысяч символов он переварит без проблем, больше не пробовал но как минимум ограничение может быть порядка 65к символов, но скорее всего и такого нет.
Проблемы могут быть при одновременном изменении глобалки несколькими скриптами - какие то изменения могут потеряться, но думаю пара потерянных тайлов это не проблема. А вот с файлами в этом плане проблем может быть больше.

Чтоб себя хоть как то обезопасить я использовал две таких процедурки:

Code: Select all

procedure lock(cs : string);
begin
	repeat
		wait(randomRange(100, 500));

		if (getGlobal('stealth', cs) = '') then
		begin
			setGlobal('stealth', cs, 'lock');
			break;
		end;
		
	until false;
end;


procedure unlock(cs : string);
begin
	setGlobal('stealth', cs, '');
end;
100% гарантии не дают, но количество коллизий уменьшают в разы, первая вызывается перед использованием глобальных переменных, вторая когда все операции с ними завершены.
uzver1234
Neophyte
Neophyte
Posts: 17
Joined: 14.09.2010 16:09

Re: как реализовать обмен данными из разных скриптов?

Post by uzver1234 »

CFA wrote:Около 20 тысяч символов он переварит без проблем, больше не пробовал но как минимум ограничение может быть порядка 65к символов, но скорее всего и такого нет.
Отлично.
CFA wrote:Проблемы могут быть при одновременном изменении глобалки несколькими скриптами - какие то изменения могут потеряться, но думаю пара потерянных тайлов это не проблема. А вот с файлами в этом плане проблем может быть больше.
Я не буду использовать 1 переменную. На каждый скрипт свою. Надо чтоб скрипт потом еще тер за собой. Именно свои записи.
Спасибо за идеи, когда напишу реализацию выложу:)
uzver1234
Neophyte
Neophyte
Posts: 17
Joined: 14.09.2010 16:09

Re: как реализовать обмен данными из разных скриптов?

Post by uzver1234 »

Code: Select all

procedure SetA;
var
SL:TStringList;
i:Integer;
begin
  SL:=TStringList.Create;
    for i:=0 to Length(TMPA)-1 do
      SL.Append(TimeToStr(TMPA[i].time)+' '+IntToStr(TMPA[i].tile )+' '+IntToStr(TMPA[i].x)+' '+IntToStr(TMPA[i].y)+' '+IntToStr(TMPA[i].z));
  SetGlobal('stealth','TestVar1',SL.Text);
  SL.free;
end;

Code: Select all

procedure GetA;
var
List : TStringList; 
i : integer;
s : string;
begin
  List := TStringList.Create;
  List.text:=GetGlobal('stealth','TestVar1');
  SetLength(TMPA,1);
  for i := 0 to List.Count-1 do begin
    s := List.strings[i] + ' ';
    TMPA[i].time := StrToTime(Copy(s,1,Pos(' ',s)-1));
    Delete(s,1,Pos(' ',s));
    TMPA[i].tile  := StrToInt(Copy(s,1,Pos(' ',s)-1));
    Delete(s,1,Pos(' ',s));
    TMPA[i].x := StrToInt(Copy(s,1,Pos(' ',s)-1));
    Delete(s,1,Pos(' ',s));
    TMPA[i].y := StrToInt(Copy(s,1,Pos(' ',s)-1));
    Delete(s,1,Pos(' ',s));
    TMPA[i].z := StrToInt(Copy(s,1,Pos(' ',s)-1));
    Delete(s,1,Pos(' ',s));
  end;
end;
Пока так:))
Post Reply