PDA

Просмотр полной версии : вопрос: передача данных между скриптами.


nezabudkin
22.04.2008, 13:45
Вот интересно, а есть ли какой-нибудь механизм передачи данных или параметров между скриптами?

Пример: нужно передать переменную из скрипта_a в скрипт_b. как ?

В пакетхаке штатной функции или переменной такой нету...

Можно через файл, но это жесть :)
Наверное, можно через форму, но я х.з. как это сделать...
Можно дописывать данные в какой-нить пакет, например в начало пакета, или в конец, а потом убирать их, но тогда не совсем понятно, чего с длинной пакета делать? Да и не удобно так делать...

Или имеется хорошее и красивое решение проблемы?

Emocean
22.04.2008, 14:11
еще варианты - объединить скрипты или через буфер обмена наверное еще можно))

NLObP
22.04.2008, 14:32
Пока только мысль с Pck приходит. он один для всех. ну еще и Buf.

nezabudkin
22.04.2008, 15:13
Пока только мысль с Pck приходит. он один для всех. ну еще и Buf.

Ты имеешь ввиду загнать нужные данные в buf, и тогда в следующем по порядку скрипте можно будет эти данные прочитать?

Надо попробовать!

xkor
23.04.2008, 01:46
NLObP, nezabudkin, с buf непрокатит, он непередаётся между скриптами
собсно и смысл данного действия неясен

alexsl
09.05.2008, 15:13
ИМХО через Say2 замаскировав под базар, лично я так делал =)

NLObP
09.05.2008, 15:59
ИМХО через Say2 замаскировав под базар, лично я так делал =)

Покажи кучочек скрипта, плиз, можно в теме "Полезные функции".

Grinch
09.05.2008, 16:21
if FromServer and (ConnectName=PPbafer) and (pck[1]=#$4A) and (ReadD(6)=s)
then begin i:=10;
if ReadS(i)=BuffHunter then //say('iaa!!! Iieo?eeinu');
begin

if ReadS(i)='афф' then begin buf:=#$04;
WriteD(TargetID);
WriteD(tx);
WriteD(ty);
WriteD(tz);
buf:=buf+#$00;
SendToServerEx(PPbafer);
Timer1.Enabled:=True;
end;
if ReadS(i)='офф' then begin buf:=#$09;
SendToClientEx(PPbafer);
end;
end;
end;
где S константа чата :) ну тут всё понятно (с) QaK

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

VORON
10.05.2008, 03:46
NLObP, nezabudkin, с buf непрокатит, он непередаётся между скриптами собсно и смысл данного действия неясен
спорно...
сверх в низ по списку переменная PCK - проходит еще как.. в первом скрипте по списку если ее отмодерить(при определенном значении)- а в последнем убить (при определенном значении) то в можно с ее помощью передать значения какието между скриптами..
я ето тестил 2-мя скриптами.. в начале и в конце списка шмфровал и дешифровал трафик.. переменную PCK дешифрировал а потом шифровал в конце списка..
почему бы и нет?
но имхо велосипед какойто.. зачем ето надо? хотя в теории возможно..

lexayar
17.02.2009, 20:49
Тоже задавался таким вопросом.
Объясню, для чего это может быть нужно:
Если написать самый первый скрипт, который читает статы чара, мобов вокруг и т.д., все, что может понадобиться. То в другие скрипты можно просто передавать эти данные. Таким образом, уменьшается количество дублирования кода (не надо в каждом макросе писать один и тот же обработчик для сохранения нужных данных) и увеличивается производительность, т.к. обработка этих пакетов будет производиться всего один раз на пакет, а не в каждом скрипте по новой.
Если к этому еще была бы возможность подключать в скрипте другие скрипты (аналог uses в делфи), было бы вообще супер, можно было бы разбор переданных данных описать в одном макросе и вызывать там где нужно.
Так что, если бы разработчики добавили такую функциональность в движок phx, было бы супер.
З.ы. особой сложности в этом не вижу.

Grinch
17.02.2009, 21:01
lexayar, узай длл пишутся в дельфе, вызываются в скрипт хотя лично я не понимаю когда написал сбор данных в бинарнике то нах вообще скрипты. =)

lexayar
18.02.2009, 19:00
lexayar, узай длл пишутся в дельфе, вызываются в скрипт хотя лично я не понимаю когда написал сбор данных в бинарнике то нах вообще скрипты. =)
Тогда вопрос, в длл при этом будет передаваться TPluginStruct ?
К тому же ДЛЛ решит только проблему с подключением модулей (из тех, которые я описал), да и не очень это удобно, ИМХО.
Конечно круче было бы все писать в ДЛЛ (в плане возможностей), но на то скрипты и предназначены, чтобы упрощать разработку простой функциональности.

QaK
19.02.2009, 09:40
Если к этому еще была бы возможность подключать в скрипте другие скрипты (аналог uses в делфи),и так можно
К тому же ДЛЛ решит только проблему с подключением модулей (из тех, которые я описал), да и не очень это удобно, ИМХО.с фигали неудобно-то? Та же фигня, только с боку =) + функционал разширяется огого, по сравнению со скриптами.

lexayar
19.02.2009, 14:02
и так можно
с фигали неудобно-то? Та же фигня, только с боку =) + функционал разширяется огого, по сравнению со скриптами.
В том то и дело, что сбоку, а сбоку не удобно:) Про функционал я писал что прибавляется, но для мелких задач (а таких большинство), удобнее скриптом писать.
Чтоб что то в длл подправить, надо делфи запускать, компилять и т.д., особенно если несколько клиентов игры запущено, и без этого все тормозит:)
Да и еще, для полноценной работы в длл нужно как то передать объект TPluginStruct, и события, как это сделано в плагинах к пакетхаку. С событиями проще, но нужно все это ручками сейчас в макросе вызывать.
Могу ошибаться, не проверял, но сомневаюсь, что сейчас все это передается в ДЛЛ.
и так можно
Так то можно, но копи пастом в каждом скрипте заниматься задолбывает.
Почти в каждом скрипте нужна база инвентаря, статы чара, иногда мобов вокруг. Ну и функции для работы с ними. Вспомогательные Функции: пауза, сообщения и т.д.

QaK
19.02.2009, 14:31
Могу ошибаться, не проверял, но сомневаюсь, что сейчас все это передается в ДЛЛ.ты ошибаешься, все прекрасно передается в плугин =) а вообще после внедрения возможности нормального присобачивания плугинов скрипты ИМХО свое отжили ...

PanAm
19.02.2009, 14:38
неулавливаю суть проблемы - почему такие сложности при передачи переменных между скриптами? ну прочтите же fs.rtf
вот пример:
scr1.txt
var
Buffer : integer;

procedure Init;
begin
Buffer :=1;
end;

begin
end.scr2.txt
uses 'Scripts\scr1.txt';
var
res : integer;

procedure Init;
begin
res := Buffer;
end;

begin
end.
проверте - при запуске во втором скрипте res = 1;

lexayar
24.02.2009, 14:17
QaK, Мы о разных вещах сейчас говорим, речь шла не о плагине, а о вызове функций реализованных в dll из скрипта, чтоб хранить в dll данные. Про плагины я вкурсе, что туда все передается.

Добавлено через 59 секунд
PanAm, Спасибо, то что надо. Если будет работать, то супер. Реально просто запарило копировать кучу кода в скриптах, когда основная функциональность при этом малую часть занимает.

QaK
24.02.2009, 17:13
Мы о разных вещах сейчас говорим, речь шла не о плагине, а о вызове функций реализованных в dll из скрипта, чтоб хранить в dll данные. брр, экая ересь ... надо быть проще - и люди к тебе потянутся ...

lexayar
24.02.2009, 18:04
брр, экая ересь ...
Не я это предлагал, я просто написал, что это не очень удобно. Про плагины разговора не было, это отдельный вопрос.
В общем разговор уже ни о чем, вопрос решен, думаю тему стоит закрыть уже.

QaK
24.02.2009, 19:03
по просьбам трудящихся.

NLObP
24.02.2009, 23:46
Довольно давно в пакетхаке есть функция для вызова функции из другого скрипта с возвратом результата
function CallSF(ScriptName:String;FunctionName:String;Param s:array of variant):variant

пример использования

//getvars.txt
function getVar (s: string; i: integer): variant;
const x = 5;
begin
Result := 'ваш '+ s +' = '+ IntToStr (i * x);
end;

begin end.

//myscript.txt
procedure Init;
var res: variant;
begin
res := CallSF ('getVars', 'getVar', ['SP', 10]);
sendMSG(res);
end;

begin end.