Новичок
Регистрация: 11.05.2010
Сообщений: 19
Сказал Спасибо: 0
Имеет 10 спасибок в 6 сообщенях
|
А насчет движения я делаю так
cpp Код:
void GotoXY(DWORD id, int ToX, int ToY, int Pawn) {
FINDID(id) {
ctable *p=&table[i];
double Speed;
double dX=ToX-p->X;
double dY=ToY-p->Y;
double d = sqrt(dX*dX+dY*dY);
if ((d>Pawn) && (d>20)) {
if (p->RunSpd<=0) Speed=10; else Speed=p->MoveMul*p->RunSpd/12;
p->dX=(Speed*dX)/d; p->dY=(Speed*dY)/d;
p->MoveTicks=(d-Pawn)/Speed;
p->PawnX=ToX-(Pawn/d)*dX; p->PawnY=ToY-(Pawn/d)*dY;
p->ToX=ToX; p->ToY=ToY;
p->Visible=1;
}
}
}
......................
void Tick() {
LOOPI {
if (table[i].PickTicks) table[i].PickTicks--;
if (table[i].Visible && table[i].MoveTicks-->0) {
table[i].X=table[i].X+table[i].dX;
table[i].Y=table[i].Y+table[i].dY;
}
}
}
........................
case WM_TIMER:
Chars.Tick();
InvalidateRect(hWnd,0,TRUE);
...
break;
case WM_CREATE:
...
SetTimer(hWnd,0,100,0);
break;
.........................
} else if (Cmd==0x72) { //72=MoveToPawn:d(CreatureObjId)d(TargetObjID)d(Distance)d(CreatureX)d(CreatureY)d(CreatureZ)d(TargetX)d(TargetY)d(TargetZ)
ParseMasked(SavedArg4, d(ObjectID)d(TargetID)d(Distance)d(X)d(Y)d(Z)d(ToX)d(ToY)d(ToZ) 0);
Chars.SetXY(ObjectID, X, Y);
Chars.GotoXY(ObjectID, ToX, ToY, Distance);
swprintf(wstr,100,L"%s %i> %s", Chars.GetName(ObjectID), Distance, Chars.GetName(TargetID));
if (TargetID==UserID) WriteUsrW(wstr);
else if (ObjectID!=UserID) WriteLogW(wstr);
fprintf(LogFile,"MoveToPawn %s %i> %s %i,%i,%i -> %i,%i,%i\n", NAME(ObjectID), Distance, NAME(TargetID), X, Y, Z, ToX, ToY, ToZ);
//-----------------------------------------
} else if (Cmd==0x2f) { //2F=MoveToLocation:d(CharID)d(ToX)d(ToY)d(ToZ)d(OriginX)d(OriginY)d(OriginZ)
ParseMasked(SavedArg4, d(CharID)d(ToX)d(ToY)d(ToZ)d(X)d(Y)d(Z) 0);
Chars.SetXY(CharID, X, Y);
Chars.GotoXY(CharID, ToX, ToY, 0);
fprintf(LogFile,"MoveToLocation %s %i,%i,%i -> %i,%i,%i\n", NAME(CharID), X, Y, Z, ToX, ToY, ToZ);
......................
} else if (Cmd==0x0C) {//0C=NpcInfo:
//0C=NpcInfo:d(ObjectID)d(NpcTypeId:Get.NpcId)d(IsAttackable)d(X)d(Y)d(Z)d(Heading)d(0)
ParseMasked(SavedArg4, d(ObjectID)d(ClassID)b(4)d(X)d(Y)d(Z)d(Heading)b(4)
//d(MatkSpd)d(PatkSpd)d(RunSpd)d(WalkSpd)d(SwimRunSpd)d(SwimWalkSpd)d(FlRunSpd)d(FlWalkSpd)d(FlyRunSpd)d(FlyWalkSpd)
d(MatkSpd)d(PatkSpd)d(RunSpd)d(WalkSpd) 3,6*4,
//f(MoveMultiplier)f(AtkSpdMultiplier)f(CollisionRadius)f(CollisionHeight)
8,&MoveMul, 3,8+8+8+4+4+4+5, 5,name, 5,name, 0);
//d(IDRhand:Get.ItemID)d(0)d(IDLhand:Get.ClassID)c(1)c(isRunning)c(isInCombat)c(isALikeDead)c(Invisible:0,1)
//s(VisibleName)s(VisibleTitle)d(0)d(0)d(0)d(AbnormalEffect)d(ClanID)d(CrestID)d(0)d(0)c(0)c(Team:1-blue,2-Red)
//f(CollisionRadius)f(CollisionHeight)d(0)d(0)d(0)d(0)c(01)c(01)d(0)
//swprintf(wstr,100,L"%s %i %i %i %i %f", GetNpcName(ClassID), MatkSpd, PatkSpd, RunSpd, WalkSpd, MoveMul);
//WriteUsrW(wstr);
Chars.SetChar(ObjectID, GetNpcName(ClassID), X, Y, RunSpd, MoveMul, 0xffffff);
fprintf(LogFile,"NpcInfo %s %i %g\n", NAME(ObjectID), RunSpd, MoveMul);
Понятно, что через анус, и что где-то в клиенте все данные есть...
Последний раз редактировалось xkor, 09.09.2010 в 00:45.
|