public LeaveVision Type; // 12 a 15 = 4 // Construtores public static P_165 New(int ClientID, LeaveVision Type) { P_165 tmp = new P_165 { Header = SHeader.New(0x165, Marshal.SizeOf <P_165> ( ), ClientID), Type = Type }; return(tmp); }
// Controlador public static void Controller(Client Client, P_36C Rcv, bool Is36C) { // Guarda a posição original do personagem Coord cur = Client.Map.GetCoord(Client.Character.Mob.LastPosition); // Guarda a posição de destino Coord dst = Client.Map.GetCoord(Rcv.Dst); // Verifica se as posições de origem e destino são a mesma if (Client.Character.Mob.LastPosition == Rcv.Dst) { return; } // Verifica se o caminho de destino está vaziu else if (!dst.CanWalk) { // Manda cliente de volta pra posição inicial Log.Error(0); Sendback( ); return; } // Verifica se a posição de origem está na lista de posições do personagem else if (!Client.Character.Positions.Contains(Rcv.Src)) { // Manda cliente de volta pra posição inicial Log.Error(1); Sendback( ); return; } // Valida o caminho pelo HeightMap SPosition position = Rcv.Src; List <SPosition> positions = new List <SPosition> ( ) { position }; int cHeight = Config.HeightMap(position), oHeight = cHeight; // Verifica qual pacote foi enviado if (Is36C) { foreach (byte direction in Rcv.Directions) { switch (direction) { case 0: continue; // Chegou ao fim case 49: position.X--; position.Y--; break; // -X -Y case 50: position.Y--; break; // -Y case 51: position.X++; position.Y--; break; // +X -Y case 52: position.X--; break; // -X case 54: position.X++; break; // +X case 55: position.X--; position.Y++; break; // -X +Y case 56: position.Y++; break; // +Y case 57: position.X++; position.Y++; break; // +X +Y default: Client.Close($"Unk direction: {direction}"); break; // Coordenada inválida } // Guarda a altura do mapa de destino oHeight = Config.HeightMap(position); // Verifica se a mudança de altura é maior que 9 if (Math.Abs(cHeight - oHeight) > 9) { // Manda cliente de volta pra posição inicial Log.Error(2); Sendback( ); return; } // Atualiza a altura do mapa atual cHeight = oHeight; // Adiciona a posição a lista positions.Add(position); } } else { // Adiciona a posição a lista positions.Add(Rcv.Dst); // INCOMPLETO, NADA FEITO AQUI AINDA!!! } // Atualiza a lista de posições do personagem Client.Character.Positions.Clear( ); Client.Character.Positions.AddRange(positions); // Atualiza a posição do personagem Client.Character.Mob.LastPosition = Rcv.Dst; // Atualiza a posição no mapa cur.Client = null; dst.Client = Client; // Pacote do andar P_36C p36C = New(Client.ClientId, Rcv.Src, Rcv.Dst, Rcv.Type, Rcv.Speed, Rcv.Directions); // Atualiza os arredores Client.Surround.UpdateSurrounds(same => { // Varre a lista foreach (object o in same) { switch (o) { case Client client2: { client2.Send(p36C); break; } } } }, entered => { // Visão do cliente P_364 p364 = P_364.New(Client.Character, EnterVision.Normal); p364.Position = SPosition.New(cur); // Varre a lista foreach (object o in entered) { switch (o) { case Client client2: { client2.Send(p364); client2.Send(p36C); Client.Send(P_364.New(client2.Character, EnterVision.Normal)); break; } } } }, left => { // Visão do cliente P_165 p165 = P_165.New(Client.ClientId, LeaveVision.Normal); // Varre a lista foreach (object o in left) { switch (o) { case Client client2: { client2.Send(p36C); client2.Send(p165); Client.Send(P_165.New(client2.ClientId, LeaveVision.Normal)); break; } } } }); // Funções ajudantes void Sendback( ) { Client.Send(New(Client.ClientId, SPosition.New(cur), SPosition.New(cur), 1, 0, null)); } }