PDA

Просмотр полной версии : юзеринфо


mira
24.08.2010, 12:24
возникла такая проблема.
Читаю из userinfo значения цп (исторически сложилось что оно оказалось в хвосте пакета) в результате оно не всегда читаетса корректно. Видимо кроме ника титула и кубика есть еще какаято кампанента пакета переменной длинны..
Интересна какая?

Breadfan
24.08.2010, 13:10
Почему из UserInfo а не из StatusUpdate ?

Be3geBJIa3
24.08.2010, 16:57
Читай с конца пакета, там до ЦП ничего переменного нет.

mira
24.08.2010, 17:00
потомучто если макс. Сп не изменитса его можно получить тока из юзеринфо. Статусапдейт я обрабатываю чтобы узнать изменение сп.

Breadfan
24.08.2010, 18:20
так в апдейте и макс и куррент приходит, и если бафают чтото наподобие оверсокго бафа на цп\либо в шмоте статы - это все именно в апдейте приходит, и, соответственно, то что было считано из юзеринфо - будет уже неверным.

mira
25.08.2010, 09:23
не ты непонел) статусапдейт с мах сп я тоже ловлю если изменитса. Мне нуна знать его изначально.. Не искать же овера каждый раз чтоб включить асп.))

supernewbie
25.08.2010, 09:55
епта, (length(ReadS(22)) * 2 + 2) - это длинна ника в байтах, потом также для титула, складываешь длинну ника+титула и вуаля.

mira
25.08.2010, 10:07
я так и считаю.
Говорю же не всегда попадаю в нужное смещение еще раз 1 пост прочти)

supernewbie
25.08.2010, 10:41
почему у меня всегда читается?

mira
25.08.2010, 10:57
сборка эпилог?

Fer123
26.08.2010, 17:27
Length(pck) - от общей длины пакета отнимаешь сколько надо снизу.

mira
26.08.2010, 19:25
ага подсказали уже.
тока ппц неохота оставлять "белые пятна" в пакете
если разберусь то отпишу, пока мало инфы от тестеров

J-Fobos
26.08.2010, 20:33
С этим у меня пока что проблем не возникало.
procedure UserInfo;
var
i, CubicsSize, tmpCharObjectId: integer;
tmpMyName, tmpMyTitle: string;
begin
tmpCharObjectId:=ReadD(18);
if CharObjectId=0 then CharObjectId:=tmpCharObjectId;
case tmpCharObjectId of
CharObjectId:
begin
MyCorX:=ReadD(2);
MyCorY:=ReadD(6);
MyCorZ:=ReadD(10);
i:=22;
tmpMyName:=ReadS(i);
i:=i+48;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
i:= 552 + length(tmpMyName) * 2;
tmpMyTitle:=ReadS(i);
i:= i + 31;
CubicsSize:= ReadH(i);
i:= i + 28 + (CubicsSize * 2);
MaxCP:=ReadD(i);
CurCP:=ReadD(i);
end;
end;
end;

mira
27.08.2010, 01:16
С этим у меня пока что проблем не возникало.
procedure UserInfo;
var
i, CubicsSize, tmpCharObjectId: integer;
tmpMyName, tmpMyTitle: string;
begin
tmpCharObjectId:=ReadD(18);
if CharObjectId=0 then CharObjectId:=tmpCharObjectId;
case tmpCharObjectId of
CharObjectId:
begin
MyCorX:=ReadD(2);
MyCorY:=ReadD(6);
MyCorZ:=ReadD(10);
i:=22;
tmpMyName:=ReadS(i);
i:=i+48;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
i:= 552 + length(tmpMyName) * 2;
tmpMyTitle:=ReadS(i);
i:= i + 31;
CubicsSize:= ReadH(i);
i:= i + 28 + (CubicsSize * 2);
MaxCP:=ReadD(i);
CurCP:=ReadD(i);
end;
end;
end;

в принцыпе у меня так и есть :spiteful:
тоже учитываю тока длинну титула, имени и кубика...

PUserInfoA = ^TUserInfoA;
TUserInfoA = packed record
pos:TL2Vector;
heading : integer;
ID : DWORD;
end;
// тут ИМЯ нуль-терминальная юникод строка
PUserInfoB =^TUserInfoB;
TUserInfoB = packed record
race : DWORD;
sex : DWORD;
classid : DWORD;
lvl : DWORD;
exp : int64;
STR: DWORD;
DEX: DWORD;
CON: DWORD;
INT: DWORD;
WIT: DWORD;
MEN : DWORD;
MaxHP, CurrentHP:DWORD;
MaxMP, CurrentMP:DWORD;
sp: dword;
load:dword;
maxload:dword;
weaponequip:dword;
equipsobj:array[0..25]of dword; //
equipsid:array[0..25]of dword; // тут всякие ID для экипа, ауги, итд для каждой вещи (их 25)
equipsaug:array[0..25]of dword; //
slotst:dword;
dw1 : DWORD;
dw2 : DWORD;
dw3 : DWORD;
dw4: DWORD;
dw5:dword;
dw6:dword;
stats:array[0..9]of dword; // м.аттака пдеф итд (щсновные статы)
pvpflag:dword;
karma:dword;
walkstats:array[0..7]of dword;// начиная с сего момента до конца рекорда неуверен в точности)) но по байтам так
movemul:double;
atkspdmul:double;
colw:dword;
colh:dword;
w:word;
hairstyle:dword;
haircolor:dword;
face:dword;
isgm:dword;
end;
// тут ТИТУЛ нуль-терминальная юникод строка
PUserInfoC =^TUserInfoC;
TUserInfoC = packed record
ClanID :dword;
ClanCrestID :dword;
AllyID :dword;
AllyCrestID :dword;
Relation :dword;
mounttype : byte;
privatestore: byte;
dwarwencraft: byte;
pkkills : DWORD;
pvpkills : DWORD;
cubicsize : WORD; // array of cubic ID word
end;
// тут массив WORD длинной cubicsize
PUserInfoD =^TUserInfoD;
TUserInfoD = packed record
b0 : byte;
dAbnormal : DWORD;
flymounted : byte;
clanPrivelegies : DWORD;
recomLeft : WORD;
recomHave : WORD;
mountNPCID: DWORD;
invLimit : WORD;
classID : DWORD;
dw0 : DWORD;
maxCP : DWORD;
currCP : DWORD;
isMounted : byte;
teamhilight : byte; //Team:1-blue,2-red
clanCrestLargeID : DWORD;
isNoble : byte;
isHero : byte;
isFishing : byte;
fishingX : integer;
fishingY : integer;
fishingZ : integer;
nameColor: DWORD;
isRunning:byte;
PledgeClass:DWORD;
PledgeType:DWORD;
TitleColor:DWORD;
CursedWeaponEquipID:DWORD;
TranformationID:DWORD;
AtkElementAttr:WORD;
AttackElementVal:WORD;
DefAttrFire:WORD;
DefAttrWater:WORD;
DefAttrWind :WORD;
DefAttrEarth:WORD;
DefAttrHoly :WORD;
DefAttrDark :WORD;
AgathionId :DWORD;
Fame :DWORD;
Unknown :DWORD;
VitalityPoints:DWORD;
end;