Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        // 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));
            }
        }