Где-то встречал идею о переносе панелей скилов из пакета ShortCutInit - у когонть наработки имеются?
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 22.07.2010 в 01:41.
Грубо говоря мысль такова:
1. есть 2 окна (1 - главное, 2 - саппорт\ассистент)
2. набор скилов с одной из панелей 2го окна - передаются в 1ое (например одна полоска с рутом\слипом и т.д.) - это приведет к отображению в 1ом клиенте панели 2го
3. вызов скилов с этой панели перехватывается и отправляется на сервер от имени 2го
Не перенос скилов между окнами) Просто вариант управления 2ым окном. Он будет более менее-универсален для разных проф, просто потребуется выставить нужные скилы (которые будут задействованы, к примеру рут\блок вв и прочее, что иногда хочется использовать) на одну из панелей, к примеру на 10ю, откуда ярлыки будут считаны и переданы в клиент 1, причем в самом скрипте править ничего не придется, все будет делаться в клиенте 2
Придется писать отдельную процедуру для распознавания пакета ShortCutInit, т.к. его структура записей в нем различна, в зависимости от ярлыков панели (ярлыки скила\макроса\банки - записываются по разному. Вот из исходников кусочек кода:Оффтоп
{
private static final String _S__57_SHORTCUTINIT = "[S] 45 ShortCutInit";
). Хотя если передавать панель с однотипными ярлыками - то все будет нормально.
Можно, конечно, все это сделать в виде массива, и вызывать по команде в чат, но в принципе большая часть скрипта будет одинаковой, а в случае с таким переносом - намного нагляднее
--------------------------------------------------------
Обновлено: не, настолько внаглую не получится, надо как-то подругому пробовать.................
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 22.07.2010 в 22:18.
Отличная идея, да и на первый взгляд не сложная в реализации.
В грации эпилог пакет с клавишами выглядит следующим образом:
Код:
45 = id
05 00 00 00 = количество используемых клавиш
................
01 00 00 00 =тип клавиши (итем)
00 00 00 00 =позиция (в данном случаи F1)
BC AF 41 10 =ObjectId итема
01 00 00 00 = хз
FF FF FF FF = хз (вроде как количество, но не уверен)
00 00 00 00 = хз
00 00 00 00 = хз
00 00 00 00 = хз
..................
02 00 00 00 =тип клавиши (скил)
01 00 00 00 =позиция (в данном случаи F2)
64 00 00 00 =id скила
0F 00 00 00 =лвл скила
00 = хз
01 00 00 00 = хз
.....................
03 00 00 00 =тип клавиши (действие)
02 00 00 00 =позиция (в данном случаи F3)
00 00 00 00 =id действия (в данном случаи сесть)
01 00 00 00 =хз что, но для всех действий всегда такой
.......................
04 00 00 00 =тип клавиши (макрос)
03 00 00 00 =позиция (в данном случаи F4)
E8 03 00 00 =id макроса
01 00 00 00 = хз что, но для всех макросов всегда такой
Рецептов у меня в сумке не было, так что их я не смотрел. Собственно исходя из выше написанной информации можно написать следующую обработку пакета (в виде массива считаю хорошим решением).
Код:
var
type1,slot,id,lvl,a1,a2,a3,a4,a5,a6,a7,a8,a9:array [0..99] of integer;
//массивы клавиш, 100 значений потому что максимум 100 клавиш.
//массивы а будут использоваться для хранения неизвестных параметров пакета.
//согласен что не оптимально объявлять 9 массивов неизвестных значений:)
procedure ShortCutInit;
var
count,i,number:integer;
begin
number:=2;//позиция "курсора" в пакете
count:=ReadD(2); //количество используемых клавиш
for i:=0 to count do
begin
type1[i]:=ReadD(number); //смотрим тип клавиши
case type1[i] of
1:begin //обрабатываем клавишу с итемом
slot[i]:=ReadD(number+4);
id[i]:=ReadD(number+8);
lvl[i]:=ReadD(number+12);
a1[i]:=ReadD(number+16);
a2[i]:=ReadD(number+20);
a3[i]:=ReadD(number+24);
a4[i]:=ReadD(number+28);
a5[i]:=ReadD(number+32);
number:=number+36; //перемещаем курсор на следующую клавишу
end;
2:begin //обрабатываем клавишу со скилом
slot[i]:=ReadD(number+4);
id[i]:=ReadD(number+8);
lvl[i]:=ReadD(number+12);
a6[i]:=ReadC(number+16);
a7[i]:=ReadD(Number+17);
number:=number+21; //перемещаем курсор на следующую клавишу
end;
3:begin //обрабатываем клавишу с действием
slot[i]:=ReadD(number+4);
id[i]:=ReadD(number+8);
lv[i]l:=ReadD(number+12)
a8[i]:=ReadD(number+16);
number:=number+20;
end;
4:begin // обрабатываем клавишу с макросом
slot[i]:=ReadD(number+4);
id[i]:=ReadD(number+8);
lvl[i]:=ReadD(number+12)
a9[i]:=ReadD(number+16);
number:=number+20;
end;
5:begin
//а тут надо рецепт дописать, но времени нету :)
number:=number+0;
end;
end;
end;
end;
Дальше надо будет изменить пакет что пойдет в главное окно (в принципе получается что вторичное окно надо будет грузить до того как загружено главное). Код примерно такой:
Код:
for i:=1 to count do
case slot[i] of
12:begin {тут изменим клавишу что предлагает сервер, значения возьмем с ранее полученных массивов}end;//если клавиша для F1 второй панельки
13:begin{тут изменим клавишу что предлагает сервер} end;//если клавиша для F2 второй панельки
14:begin{тут изменим клавишу что предлагает сервер} end;//если клавиша для F3 второй панельки
end;
Это уже будем править под себя пакет пакет с главного окна.
PS: не уверен в правильности кода, писал в блокноте
__________________
В любом из нас спит гений. И с каждым днем все крепче.
Переходим на протокол нового поколения jabber
Последний раз редактировалось J-Fobos, 22.07.2010 в 23:12.
Ну (как я думаю), в данном варианте рецепты и рассмотривать не стоит, т.к. расчитывается скрипт на использование в замесах\фарме, где лучше не переключаться меж окон, либо на использование вместе с отключенным клиентом (NoCloseServerAfterClientDisconnect; )
Поправлю: максимум - 120 клавиш (10 панелек по 12). Так же можно в любой момент вызвать пакет ShortCutInit - добавив и тут же убрав любой скил\банку\макрос на панель.
В данный момент считывает 10ю панельку у 'donor' (кнопки отвечающие условию slot>107) и в виде набора макросов передает в главное окошко. Макрос в названии и акроним имеют ИД скила (впоследствии надо изменить акронимы), внутри он же - т.е. при его нажатии перс в общий чат пишет этот ИД. Запись названия скила убрал из-за кривости руссификации серверной части - после релога русские символы в макросе превращаются в наборы вопросительных знаков, так что куски использующие работу с SkillsID.INI - можно будет смело выкинуть, или заменить файл его английский версией ...
При этом передаются лишь скилы - остальное пока не стал создавать. Напрямую передать - попытка провалилась) Ярлык скила появляется - но серый, при его нажатии пакетов годных для обработки клиент не отправляет к сожалению, так что немного изменил принцип.
Теперь необходимо добавить части обрабатывающие пакеты от 'rec' - своевременно убивать их, не давая попасть на сервер, и включать скил\прочее в клиенте 'donor', соответственно запроса, ну и часть следящую за таргетом...На пару минут копаний
Добавлено через 1 час 34 минуты
Кстати, надо будет оценить, насколько жестко он будет относиться к уже имеющимся макросам
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 23.07.2010 в 05:56.
Причина: Добавлено сообщение
Может сразу сделать работу только с макросами имеющими определенное имя (напр. cut1, cut2...cut12), и проверять наличие свободных ячеек под вновь создаваемые - что бы не переживать за сохранность ранее созданных
const
rec='Lapeno';
donor='Freya';
var
SkillsNameEng,ItemsNameEng,StringList:TStringList;
i,ii,iii,SKID,Slot:integer;
SkillID:integer;
Pskill:array[1..12] ofstring; //массив с именами скилов панельки
PskillID:array[1..12] ofinteger;//массив с ИД --//--
values:array[0..100] ofvariant;
procedure Init; //Вызывается при включении скриптаbegin
StringList:=TStringList.Create;
SkillsNameEng:=TStringList.Create;
ItemsNameEng:=TStringList.Create;
try
SkillsNameEng.LoadFromFile('skillseng.ini');
except
Sendmsg('SkillsidEng.ini не найден!');
exit;
end;
try
ItemsNameEng.LoadFromFile('itemseng.ini');
except
Sendmsg('ItemsIDEng.ini не найден!');
exit;
end;
end;
procedure Free; //Вызывается при выключении скриптаbeginend;
//основная часть скрипта//вызывается при приходе каждого пакета если скрипт включенbeginif fromserver and(connectname=donor)and(pck[1]=#$45)thenbegin//InitCut
i:=(ReadD(2)); //kol-vo Cuts
Sendmsg('Kol-vo Cuts: '+Inttostr(i));
ii:=6;
for iii:=1to i dobegincase(ReadD(ii))of1:begin//item
ReadMask('ddddddhh',2,values);
ii:=ii+28;
end;
2:begin//skill
Slot:=ReadD(ii);
SKID:=ReadD(ii);
ReadD(ii);
ReadC(ii);
ReadD(ii);
if(slot>107)thenbegin//Запись только с 10ой панельки
Pskill[(slot-107)]:=(SkillsNameEng.Values[InttoStr(SKID)]);
if(Pskill[(slot-107)]='')then Pskill[(slot-107)]:=('Unkn: '+Inttostr(skid));
PskillID[(slot-107)]:=skid;
Sendmsg(Pskill[(Slot-107)]+' ID skill: '+inttostr(PskillID[(slot-107)]));
Sendmsg('Slot '+Inttostr(slot));
Sendmsg('SKID '+Inttostr(SKID));
buf:=#$CD;
WriteMask('DSSSCCCCDCS',[(15+(slot-107)),((Pskill[(Slot-107)])),'',(Inttostr(SKID)),0,1,1,3,0,0,('Use Skill: '+inttostr(PskillID[(Slot-107)]))]);
Sendmsg(Strtohex(buf));
Sendtoserverex(rec);
end;
end;
3:begin//social action
ReadMask('ddd',2,values);
ii:=ii+12;
end;
4:begin//macro
ReadMask('ddd',2,values);
ii:=ii+12;
end;
5:begin//recipe
ReadMask('ddd',2,values);
ii:=ii+12;
end;
end;
end;
end;
if fromclient and(connectname=rec)and(pck[1]=#$49)and(Copy(ReadS(2),1,10)='Use Skill:')thenbegin
SkillID:= StrtoInt(Copy(ReadS(4),11,4)); //из команды в чат считываем ИД скила
pck:=''; //
buf:=#$39; // формируем пакет MagicSkillUse
WriteMask('ddc',[SkillID,0,0]); // и отправляем его
Sendtoserverex(donor); // в клиент 'donor'end;
end.
- Пока что оно "переносит" только скилы, не бегает за 'rec', не меняет таргет, не делает прочего, чего бы туда ни хотелось засунуть Только включает скилы со своей 10ой панели (предварительно таргет надо взять)
И все бы ничего, но только зарраза чат блокирует периодически, при спаме макроса
PS: файлы skillseng.ini и itemseng.ini - взяты от более старой версии - L2phx 3.2.1, изза этого будут недочеты...
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 23.07.2010 в 21:04.
begin
if FromServer and (ConnectName=Name1) and (pck[1]=#$45) then
begin
buf:=pck;
SendToClientEx(Name);
end;
end;
PS это если надо перенести панель с одного перса на другого. Перед этим еще придется переносить СкиллЛист и ИтемЛист, это давольно удобно при написании скрипта "Вселение", который вселяет в перса от которого есть только соединение)
Это вообще явно не такое. К чему мне полностью замененная панель? в моем варианте - добавляются макросы на панель Главного, в твоем же - произойдет полная замена. Я смысла от такого "вселения" не вижу - ты заменишь скиллист, итемлист - а к чему это все? проще без извращений сразу в окне с бафером быть
У меня так: в главном окне формируется набор макросов, повторяющих скилы выставленные на 10ую панель ведомого окна. При нажатии макрос в чат выдает текстовую команду use skill xxxx (ид скила) - команда перехватывается и отправляется на ведомый клиент. Ведомый, получив такую команду и юзает соответствующий скил на цель находящуюся в таргете у Главного. Простейший пример применения: лук в связке с пп - берет в таргет цель, жмет макрос на своей панели (пп берет в таргет ту же цель и кидает ей рут) и спокойно расстреливает...Выделяет себя - бафает ченть или может хильнутся - как угодно....
Можно то же самое сделать написав обработчик наподобие "если от клиента А в чат "используй 1" то --> в клиенте Б включить скил 1" НО: для каждого отдельного перса придется создавать свой обработчик команд, в зависимости от набора имеющихся скилов, моя же цель - создание унифицированного скрипта, минимизирующего правку и подгонку под разные профы\случаи: сегодня бегаю луком и пп, а завтра - спойлером + овер
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 25.07.2010 в 00:53.
В итоге вышло: бегает за ведущим не тыкая по нему (соответственно удерживая нужную цель в таргете), а используя координаты перемещения, юзает свитки ТП, стараясь использовать то же что и ведущий, держит в таргете ту же цель что и ведущий. Диапазон разницы координат при перемещении при старте равен 99, в процессе может меняться командой в чат "mult XX", где х - 0..99, либо нажатием Соц.Действий "Да"\"Нет" - с шагом 10. Порядок запуска - запустить скрипт, открыть сумку бота (в лог L2PHX выведет инфу о наличии сое: тип 1 - сое, 2 - соеКХ, 3 - соеЗамок), принять его в пати (будут считаны необходимые ИД персов). Макросы в главном окне - имеют имя - ИД скила, акроним - его название (необходима англ. версия файла SkillsID.ini под именем skillseng.ini !!! - от одной из старых версий подойдет переименованный) - сформировать набор скилов на 10ой панели( если это необходимо) и на какой либо другой (1-9) переместить туда-сюда любой ярлык (перемещать надо для формирования пакета ярлыков).
Если бегаете с mult не сильно маленьким - то лучше маленькими перебежками не передвигаться, иначе саппорта болтать начинает, как г... в проруби НЕ бьет с Ctrl (хотя это можно подправить при желании в блоке формирования пакета скила), не тепешится от гк одновременно с ведущим, НЕ тестировалась работа при отключенном клиенте (да и нет там пары кусков для такого).
Гонял в основном связку тх+пп, и под конец написания тх+спойл, так что замечания - только приветствуются
Файлы из архива files.rar кинуть в корень папки L2phx Хроники: Грация Финал (ну судя по тому что на моем сервере написано ) Обновлено:
mod_2: Оффтоп
добавлена возможность управления сумонами - тестировалось на ПП(ведущий)+гном с чайником
изменение дистанции разбега - соц.действием Да\Нет
включить\выключить зажатый контрол - соц.действие Bow - действует на перса и на его сумона (при наличии) Названия макросов управления сумоном - пока обезличены, имеют в названии лишь ИД скилов
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 26.07.2010 в 22:38.
За это сообщение Breadfan нажился 2 спасибками от: