PDA

Просмотр полной версии : Поиск части пакета в пакете!


Levapishe
09.02.2012, 20:02
Добрый день! Обьясните плиз как правильно пользоваться функцией Pos() - поиск подстроки в строке- в моей ситуации или может есть другое решение. Вот сама ситуация:
С сервера приходит пакет. Этот пакет имеет разную длину - она зависит от количества негативных эффектов которые висят на персонаже. я знаю айди конкретного скилла который на меня могут повесить. если на мне нету кроме него никаких негативных эффектов то айди скилла отображается в пакете в начале в определенном месте - к примеру пришел пакет CF 11 22 ВВ ВВ - ВВ ВВ нужный мне айди скилла. в этом случае путем условного оператора If и конкретного ReadD(4) в нашем примере я могу завершить выполнения скрипта - так как все известно.
Теперь проблема - приходит этот же пакет но на мне уже висят негативные ээфекты и пакет может прийти такой CF 11 22 AA BB BB или CF 11 22 ФФ ЙЙ ФФ ВВ ВВ или совсем другой - то есть айди нужного мне скилла ВВ ВВ будет всегда в разном месте и я не могу указать точный ReadD.
Вопрос - как мне определить точное начало расположения скилла? я пробу?если не через Pos то как иначе? Заранее спасибо!

J-Fobos
09.02.2012, 22:46
Можно с помощью pos(), формат функции следующий :
function Pos ( const S1, S2 : string ) : Integer;
Функция возвращает позицию строки S1 в строке S2. Если строка не найдена, возвращается 0.

Более универсальный вариант: в цикле разобрать пакет, на составные части (можно записать их в массив, для дальнейшего использования) и проверить все ид в числовом формате. Лично мне этот вариант нравится больше.

Levapishe
09.02.2012, 23:58
Хмс спасибо попробую. Я просто думал что через Pos можно узнать с какого байта в пакете начинается айди скилла

Добавлено через 47 минут
C Pos разобрался. еще раз спасибо - думаю это то что надо. теперь другая проблемка как заствить Pos читать весь пакет из переменной PCK?
A:='CC A9';
S:='A9';
if Pos(S,A)=4 then

так функция работает на ура. но как в переменную А вставить значение PCK?

alexteam
10.02.2012, 00:11
a := pck;
s := #$a9;

Добавлено через 2 минуты
либо
s := hstr('a9');

Levapishe
10.02.2012, 00:19
Сейчас попробую. совсем забыл про #$

УРАА!!! работает)))

Breadfan
15.02.2012, 00:51
pos - плохой вариант...хотя у каждого свое мнение. длина разная пакета с бафами. висеть он может и вначале и в конце строки. да говорили уже - перебрать циклом пакет

Levapishe
15.02.2012, 00:56
А какой подскажешь ?

Breadfan
15.02.2012, 01:43
конкретнее: что искать, в каком пакете.

SeregaZ
15.02.2012, 10:36
я так полагаю речь о бафах сопати? то сначала отлавливаем общее количество бафоф, а потом уже сам перебор... где-то у меня был кусочек...

Добавлено через 8 минут
if FromServer and (pck[1]=#$EE) //перебор бафоф сопати
then begin

countbaf:= readd(10); //количество бафоф
baf1:=14;
baf2:=15;
baf3:=16;
baf4:=17;
base1baf:=baf1+(10*countbaf);
idbafa:=pck[baf1]+pck[baf2]+pck[baf3]+pck[baf4];

sovpadenie:=0;

repeat

if (idbafa=HStr('92 04 00 00')) //анчор
then begin
//buf:=HStr('37 00 00'); //сброс таргета
//SendToServer;
idtela:=pck[6]+pck[7]+pck[8]+pck[9];
buf:=HStr('04 ') + idtela;
SendToServer;
rabota:='anchor';
sovpadenie:=1;
end;

if ((idbafa=HStr('2D 04 00 00')) or (idbafa=HStr('49 04 00 00'))) and (idsvitka <> '1') //сон + орковский сон
then begin

//buf:=HStr('37 00 00'); //сброс таргета
//SendToServer;
idtela:=pck[6]+pck[7]+pck[8]+pck[9];
buf:=HStr('04 ') + idtela;
SendToServer;

rabota:='svitok';
sovpadenie:=1;
end;

baf1:= baf1 + 10;
baf2:= baf2 + 10;
baf3:= baf3 + 10;
baf4:= baf4 + 10;
idbafa:=pck[baf1]+pck[baf2]+pck[baf3]+pck[baf4];

until baf1 > base1baf;

end;
с4, примитивно, и таргет например работает "палевно" всего лишь айди таргета кидает, без координат.
айди свитка - это он до этого определил свиток пробуждения и запомнил.
перебирает баф сопати и если видит сон мага или сон орка - берет в таргет этого сопати и тыкает свиток пробуждения. если увидит анчор на чаре - таргет на него, тыкает пурифай. точней не тыкает скилы, а запускает работу по тыканию. суть в том, что если сразу тыкать пурифай сработает одноразово. а например если чар стоят в отдалении? будет акшин фейл и бот встанет тупо. а тут работа - он через каждые n секунд по таймеру тыкает пурифай.

Levapishe
15.02.2012, 18:46
По началу я думал что понадобится точное расположение айдишки скилла - но в итоге мне понадобилось всего лишь его наличие в составе пакета.
Ну как мне кажется то Pos вполне справился в моем случае - вот кусок кода
if FromServer and (pck[1]=#$XX) then
begin
A:=pck;
S:=#$AA#$DD;
if Pos(S,A)<>0 then

То есть мне нужна была только проверка на наличие #$AA#$DD (айди скилла) в приходящем пакете - если она не равно 0 - значит он есть и это приводит к дальнейшей активации скрипта.
Всем еще раз спасибо за отклик, очень приятно что тут могут помочь советом и кодом)

SeregaZ
15.02.2012, 20:02
но в этом случае не исключены ложные срабатывания.

Levapishe
15.02.2012, 20:04
Хммм - ну этот пакет оценивает состояние моего перса - только моего - а айди другим стать не может. p.s. это все на Aionе делается)

SeregaZ
16.02.2012, 10:34
эм... айон незнаю, приведу пример из л2. например твой скил выглядит как B1 00 B2 00 от фанаря.
предположим сам пакет типа:
01 00 F1 00 EE 00 FF 00 B1 00 B2 00 B4 00 B5 00 B1 00
наш пакет пометил красными буквами. твой пример его увидит и запустит верно. но возможно, что твой пакет встретится в миксе двух разных бафоф. например так:
01 00 F1 00 EE 00 FF 00 B0 00 B1 00 B2 00 B5 00 B1 00
наш пакет перетекает из красного в светло зеленый. твоя функция его увидит, хотя действительно его нет. то есть дебафа вроде на персе нет, а ботинок пытается его пробудить или снять анчор, или реснуть или еще что-то... это конечно примитивный пример. там вроде части пакета разделяются не двумя, а 4 нулями, но тем не менее такое возможно. например в айди персонажа встретится случайно тоже самое число, которое является айди дебафа.

mira
16.02.2012, 11:09
индусский код -тоже код.
однако его луше танцевать чем писать.

+ к фобсу

SeregaZ
16.02.2012, 17:40
не знаю. я написал и жутко доволен :) доволен что работает, и доволен что писал сам :) а индуский или не индусский - да и хрен с ним, главное чтобы работал :)

supernewbie
16.02.2012, 18:00
хрен с ним, главное чтобы работал :)
ну дык индусы так и рассуждают)

Levapishe
16.02.2012, 18:12
SeregaZ прав - главное что скрипт делает то что от него требуется - а как написан это уже совсем другое разговор - не на конкурс же его слать)