Просмотр полной версии : Поиск части пакета в пакете!
Levapishe
09.02.2012, 20:02
Добрый день! Обьясните плиз как правильно пользоваться функцией Pos() - поиск подстроки в строке- в моей ситуации или может есть другое решение. Вот сама ситуация:
С сервера приходит пакет. Этот пакет имеет разную длину - она зависит от количества негативных эффектов которые висят на персонаже. я знаю айди конкретного скилла который на меня могут повесить. если на мне нету кроме него никаких негативных эффектов то айди скилла отображается в пакете в начале в определенном месте - к примеру пришел пакет CF 11 22 ВВ ВВ - ВВ ВВ нужный мне айди скилла. в этом случае путем условного оператора If и конкретного ReadD(4) в нашем примере я могу завершить выполнения скрипта - так как все известно.
Теперь проблема - приходит этот же пакет но на мне уже висят негативные ээфекты и пакет может прийти такой CF 11 22 AA BB BB или CF 11 22 ФФ ЙЙ ФФ ВВ ВВ или совсем другой - то есть айди нужного мне скилла ВВ ВВ будет всегда в разном месте и я не могу указать точный ReadD.
Вопрос - как мне определить точное начало расположения скилла? я пробу?если не через Pos то как иначе? Заранее спасибо!
Можно с помощью 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
конкретнее: что искать, в каком пакете.
я так полагаю речь о бафах сопати? то сначала отлавливаем общее количество бафоф, а потом уже сам перебор... где-то у меня был кусочек...
Добавлено через 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 - значит он есть и это приводит к дальнейшей активации скрипта.
Всем еще раз спасибо за отклик, очень приятно что тут могут помочь советом и кодом)
но в этом случае не исключены ложные срабатывания.
Levapishe
15.02.2012, 20:04
Хммм - ну этот пакет оценивает состояние моего перса - только моего - а айди другим стать не может. p.s. это все на Aionе делается)
эм... айон незнаю, приведу пример из л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 нулями, но тем не менее такое возможно. например в айди персонажа встретится случайно тоже самое число, которое является айди дебафа.
индусский код -тоже код.
однако его луше танцевать чем писать.
+ к фобсу
не знаю. я написал и жутко доволен :) доволен что работает, и доволен что писал сам :) а индуский или не индусский - да и хрен с ним, главное чтобы работал :)
supernewbie
16.02.2012, 18:00
хрен с ним, главное чтобы работал :)
ну дык индусы так и рассуждают)
Levapishe
16.02.2012, 18:12
SeregaZ прав - главное что скрипт делает то что от него требуется - а как написан это уже совсем другое разговор - не на конкурс же его слать)
vBulletin® v3.6.11, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot