PDA

Просмотр полной версии : вызов другого скрипта


SeregaZ
16.08.2009, 04:00
читаю описание, которое выскакивает при наведении на скрипт - пишет что это типа порядок в котором скипты будут выполнятся, однако при включении двух сразу - они мешают друг другу :) так и должно быть? я думал пока не выполнится отмеченый выше - тот что ниже будет сидеть и не рыпаца. а тут...

ну и собственно вопрос - можно ли в одном скрипте вызывать другой?

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

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

alexteam
16.08.2009, 12:04
Они и выполняются по очереди.
приходит пакет (от сервера/клиента)
сначала он обрабатываеться первым скриптом в очереди, потом вторым, далее третим и т.д.
и так для каждого пакета.

SeregaZ
16.08.2009, 12:52
эм... а я думал что сперва пока exit в первом скрипте не достигнуто, 2 скрипт спит лежит.
фигова... придется все переделывать.

как тогда можно таймер выключить? пример взял с форума, я так понял что таким образом можно запустить паралельные процессы в скрипте. они и заускаются, однако если я буду все в кучу собирать, то нужно будет отключение этого таймера, а то чар будет дергаться на одном месте.
function Wait(var tick: integer;Timewait: Integer): Boolean;

var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;

alexteam
16.08.2009, 13:50
используй ttimer + case.

пример

var
timer : ttimer;
step : integer;

procedure ontimer(sender:tobject);
begin
inc(step);
case step of
1 :
begin
//отправка к примеру пакета "подойти к нпц"
timer.interval := 5000; //время дающееся на выполнение этого действия
end;
2 :
begin
//диалог с нпц, пакетный уровень.
timer.interval := 2000; //время дающееся на выполнение этого действия
end;
3 :
begin
//добежать до гк
timer.interval := 10000; //время дающееся на выполнение этого действия
end;
4 :
begin
//тпшнутся
timer.interval := 3000; //время дающееся на выполнение этого действия
end;
5 :
begin
//добежать до места где бьются квест итемки
timer.enabled := false;
huntprocedure; //задействовать функцию убивания всегоживого
//после появления в инвентаре требуемых предметов сделать timer.enabled := true;
end;
6 :
begin
//юзаем сое
timer.interval := 10000; //время дающееся на выполнение этого действия
end;
7 :
begin
//бежим, здаем квест
timer.interval := 10000; //время дающееся на выполнение этого действия
end;
8 :
begin
//бежим, в исходную точку
timer.interval := 10000; //время дающееся на выполнение этого действия
end;
9 :
begin
//начинаем все с первого шага
step := 0;
timer.interval := 1;
end;
end;
end;

procedure init;
begin
step := 0;
timer := ttimer.create(nil);
timer.ontimer := @ontimer;
timer.interval := 1000; //через секунду после включения скрипта сработает первая итерация таймера.
timer.enabled := true;
end;


procedure free;
begin
timer.free;
end;

begin
end.

SeregaZ
16.08.2009, 14:41
это общий план обьединения скриптов - а как быть с распаралелизацией процессов внутри каждого case? :) опять напорюсь на function Wait - а как она отключается? - ведь её надо будет отключить, когда один case закончится и начнется второй.
и можно ли вместо указания значения задержки таймера управлять началом и завершением case timer.enabled := false; и timer.enabled := true; - как в пятом case?

alexteam
16.08.2009, 15:01
да, пример не идеальный. но общая идея таковой и будет.
по поводу отключения таймеров.
отключение таймера есть только в 5м пункте только по тому что ты не можешь сказать точно "каких мобов и с каким обжектайди небе надо бить и как долго это будет происходить" все остальные действия вполне предсказуемы.
реализовать движение в принципе можно такими же кейсами в других таймерах, включая их по требованию и выключая в этот момент основной, и наоборот когда таймер выполняющий движение достиг своего "конца".

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