Ir para conteúdo
  • Cadastre-se

PAINEL DEFINITIVO LINEAGE: PDL (1.8)


Denky

Posts recomendados

O conteúdo está oculto, favor efetuar login ou se cadastrar!


O conteúdo está oculto, favor efetuar login ou se cadastrar!

NOVO RECURSO!!!
MINIGAME!!!

 

 

 

 

  • Gostei 3

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites


 

🚀 UPDATE DO PROJETO: PDL 1.5.1
🎮 Level Up na Experiência de Jogo!

A versão 1.5.1 chegou trazendo ainda mais elementos do universo gamer para o sistema PDL! O foco agora é personalização, progressão e recompensas de verdade para quem se aventura por aqui!

🎒 Nova BAG Ativada!
Todos os itens que você ganha nos jogos agora vão direto para sua nova Bag!
Ela funciona como uma mochila inicial — temporária e organizada — onde você pode conferir o que ganhou antes de mover pro inventário principal. Ideal para ver os resultados das caixas e roletas com mais clareza.

📦 Sistema de Box Abertura – Agora é Real!
É isso mesmo: caixas misteriosas chegaram ao PDL!
Você pode comprar e abrir boxes, com direito a animação estilo roleta, sons e itens com raridades variadas. Cada box vem com sua lista personalizada de recompensas — e tudo controlado via painel administrativo.

🏅 Conquistas 2.0 – Agora com Cadeado & Troféu!
Melhoramos o sistema de conquistas!
Agora você vê todas as conquistas existentes — incluindo as que ainda não desbloqueou (com cadeado).
As já conquistadas exibem um troféu dourado, pra mostrar o quão longe você já chegou!

 

  • Gostei 1
  • Obrigado 1

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Denky disse:

 

🚀 UPDATE DO PROJETO: PDL 1.5.1
🎮 Level Up na Experiência de Jogo!

A versão 1.5.1 chegou trazendo ainda mais elementos do universo gamer para o sistema PDL! O foco agora é personalização, progressão e recompensas de verdade para quem se aventura por aqui!

🎒 Nova BAG Ativada!
Todos os itens que você ganha nos jogos agora vão direto para sua nova Bag!
Ela funciona como uma mochila inicial — temporária e organizada — onde você pode conferir o que ganhou antes de mover pro inventário principal. Ideal para ver os resultados das caixas e roletas com mais clareza.

📦 Sistema de Box Abertura – Agora é Real!
É isso mesmo: caixas misteriosas chegaram ao PDL!
Você pode comprar e abrir boxes, com direito a animação estilo roleta, sons e itens com raridades variadas. Cada box vem com sua lista personalizada de recompensas — e tudo controlado via painel administrativo.

🏅 Conquistas 2.0 – Agora com Cadeado & Troféu!
Melhoramos o sistema de conquistas!
Agora você vê todas as conquistas existentes — incluindo as que ainda não desbloqueou (com cadeado).
As já conquistadas exibem um troféu dourado, pra mostrar o quão longe você já chegou!

 

O homi é uma máquina!

  • Gostei 2

Pagina - > Lineage 2 - Perfil L2 - > Ricardo Dv Oliveira

Link para o comentário
Compartilhar em outros sites

16 horas atrás, Denky disse:

 

🚀 UPDATE DO PROJETO: PDL 1.5.1
🎮 Level Up na Experiência de Jogo!

A versão 1.5.1 chegou trazendo ainda mais elementos do universo gamer para o sistema PDL! O foco agora é personalização, progressão e recompensas de verdade para quem se aventura por aqui!

🎒 Nova BAG Ativada!
Todos os itens que você ganha nos jogos agora vão direto para sua nova Bag!
Ela funciona como uma mochila inicial — temporária e organizada — onde você pode conferir o que ganhou antes de mover pro inventário principal. Ideal para ver os resultados das caixas e roletas com mais clareza.

📦 Sistema de Box Abertura – Agora é Real!
É isso mesmo: caixas misteriosas chegaram ao PDL!
Você pode comprar e abrir boxes, com direito a animação estilo roleta, sons e itens com raridades variadas. Cada box vem com sua lista personalizada de recompensas — e tudo controlado via painel administrativo.

🏅 Conquistas 2.0 – Agora com Cadeado & Troféu!
Melhoramos o sistema de conquistas!
Agora você vê todas as conquistas existentes — incluindo as que ainda não desbloqueou (com cadeado).
As já conquistadas exibem um troféu dourado, pra mostrar o quão longe você já chegou!

 

Uma dúvida na config .env tem a opção onde está l2dreamv2 pode mudar pra qual versão?

  • Gostei 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, FUSI0N disse:

Uma dúvida na config .env tem a opção onde está l2dreamv2 pode mudar pra qual versão?

lucerav2, l2jdreamv3, e estou tentando fazer a da acis, estou pedindo essa ajuda a algum tempo, mas ninguem ainda pra me ajudar.

  • Gostei 3

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

30 minutos atrás, Denky disse:

lucerav2, l2jdreamv3, e estou tentando fazer a da acis, estou pedindo essa ajuda a algum tempo, mas ninguem ainda pra me ajudar.

entendi fico no aguardo ,caso alguem consiga te ajuda eu mesmo nem entendo muito

  • Gostei 1
Link para o comentário
Compartilhar em outros sites

 

🚀 UPDATE DO PROJETO: PDL 1.5.2
🎮 Melhorias Visuais, Funcionais e Performance Total!

A versão 1.5.2 chega com um pacote de melhorias que vai turbinar ainda mais a experiência do PDL! Agora, seu jogo está mais responsivo, com relatórios detalhados e muito mais integração. Confira tudo o que mudou:

📊 Relatórios Detalhados com Gráficos
O relatório de fluxo de caixa agora vem com gráficos interativos, facilitando a visualização dos dados. Você pode entender de forma rápida e intuitiva como o seu caixa está se comportando!

🛠️ Fluxo de Inventários & Mais Relatórios
Agora, você tem um relatório completo para o fluxo dos inventários, além de novos relatórios para leilões e loja! Acompanhe tudo que está acontecendo no seu jogo com mais transparência e facilidade.

🌍 Sistema de Tradução Aprimorado
O sistema de tradução recebeu melhorias para oferecer uma experiência mais fluida e precisa, adaptando-se a diversas línguas e contextos do jogo.

📦 Atualização no Sistema de Caixas
O sistema de caixas foi atualizado para garantir que as aberturas de boxes sejam ainda mais dinâmicas e fáceis de controlar. Mais diversão e clareza nos seus ganhos!

🎒 Ajustes no Sistema de Bag
O sistema de Bag também foi otimizado, garantindo mais performance e organização para os itens que você conquista no jogo.

📱 Responsividade para Mobile
Com ajustes no sistema de mobile, o PDL agora é ainda mais responsivo. Jogue de qualquer lugar com a experiência otimizada para telas menores!

A evolução continua! Agora, é hora de aproveitar todas essas novidades para se aprofundar ainda mais no mundo de PDL!

 

  • Gostei 3

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

pessoal, quem for dev, e quiser e puder me ajudar a fazer as sql, para outras revisões que nao forem derivadas de lucera, como acis, l2jmobius, entre em contato comigo, estou precisando de ajuda nessa questao!

nem quero o arquivo pronto, so preciso de ajuda nas sql

  • Gostei 1

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Denky disse:

pessoal, quem for dev, e quiser e puder me ajudar a fazer as sql, para outras revisões que nao forem derivadas de lucera, como acis, l2jmobius, entre em contato comigo, estou precisando de ajuda nessa questao!

nem quero o arquivo pronto, so preciso de ajuda nas sql

O que você precisaria de ajuda na aCis brother? Derrepente consigo te ajudar se você me explicar melhor!

  • Gostei 1

GT9mxRT.png

Link para o comentário
Compartilhar em outros sites

27 minutos atrás, Marlon disse:

O que você precisaria de ajuda na aCis brother? Derrepente consigo te ajudar se você me explicar melhor!

O conteúdo está oculto, favor efetuar login ou se cadastrar!


preciso alterar essas querys aqui, para o padrao do banco da acis

  • Gostei 1

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

15 horas atrás, Denky disse:

O conteúdo está oculto, favor efetuar login ou se cadastrar!


preciso alterar essas querys aqui, para o padrao do banco da acis

Estou trabalhando nisto, passando uma vista percebi que há uma diferença com nomes de colunas e tabelas que facilmente podemos alterar, mas, a meu ver um pequeno detalhe quando a "item_type" que não existe na tabela "items", isto eu contornei com uma tabela chamada "item_icons" que foi extraída do "ICP_Panel: Ivan", mesmo problema que tive ao começar elaborar meu painel para "rev aCis 409". 

O legal é que nesta mesma tabela existe todos os nomes de icones reais que podemos facilmente ralacionar isto para o Painel ter uma cara a mais de game, quando falamos de inventario e item gostariamos de ver os icones dos items...

O conteúdo está oculto, favor efetuar login ou se cadastrar!


há uma necessidade de passar isto para django_arm posteriormente.

Para a criptografia blowfish não sei como vou lidar com isto: import bcrypt.
colocar a mente para funcionar um pouco, Café.

item_icons.sql


Ally_data não exite no padrão aCis, relacionado a ally todas estão registradas em clan_data: 

clan_data.sql


Quanto a tabela items existe um detalhe de proteção quando a coluna time: timestamps em milissegundos, dt = datetime.fromtimestamp(time / 1000)
print(f"Timestamp: {time} -> Data: {dt.strftime('%Y-%m-%d %H:%M:%S')}") = Timestamp: 1743958668193 -> Data: 2025-05-10 12:34:28
Seria improvável ter item com o mesmo time = hack 
Seria Improvável ter item com object_id (duplicados)= hack (item nem aparece no inventario)

items.sql

Agora vamos para os Registros: 

# Importar bcrypt
import bcrypt

 

O conteúdo está oculto, favor efetuar login ou se cadastrar!


O mesmo para update_password:

O conteúdo está oculto, favor efetuar login ou se cadastrar!

 

accounts.sql

Quanto aos Epic_boss no padrão aCis está assim: coluna Respawn_time

grandboss_data.sql

Editado por Dhousefe
  • Gostei 1

...

Link para o comentário
Compartilhar em outros sites

25 minutos atrás, FUSI0N disse:
O conteúdo está oculto, favor efetuar login ou se cadastrar!

tentei fazer para Acis 382 nao consigo testa por que to sem um servidor aqui , se alguem poder testar

ally_data nao existe na acis

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, FUSI0N disse:

 

from apps.lineage.server.database import LineageDB
from apps.lineage.server.utils.cache import cache_lineage_result
 
import time
import base64
import hashlib
 
class LineageStats:
 
    @staticmethod
    def _run_query(sql, params=None, use_cache=True😞
        return LineageDB().select(sql, params=params, use_cache=use_cache)
   
    @staticmethod
    @cache_lineage_result(timeout=300)
    def get_crests(ids, type='clan'😞
        # Verifique se os IDs foram fornecidos
        if not ids:
            return []
 
        # Como ally_data não existe, usaremos clan_data para ambos os tipos
        table = 'clan_data'
       
        # Defina a coluna do ID e do emblema com base no tipo (clan ou ally)
        if type == 'ally':
            id_column = 'ally_id'
            crest_column = 'ally_crest_id'  # Usando ally_crest_id da tabela clan_data
        else:
            id_column = 'clan_id'
            crest_column = 'crest_id'  # Usando crest_id para clãs
 
        # Construção da consulta SQL para obter as crests dos clãs ou alianças
        sql = f"""
            SELECT {id_column}, {crest_column}
            FROM {table}
            WHERE {id_column} IN :ids
        """
       
        # Chama a função _run_query para executar a consulta
        return LineageStats._run_query(sql, {"ids": tuple(ids)})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def players_online():
        sql = "SELECT COUNT(*) AS quant FROM characters WHERE online > 0 AND accesslevel = '0'"
        return LineageStats._run_query(sql)
   
    @staticmethod
    @cache_lineage_result(timeout=300)
    def top_pvp(limit=10😞
        sql = """
            SELECT
                C.char_name,
                C.pvpkills,
                C.pkkills,
                C.online,
                C.onlinetime,
                D.name AS clan_name,
                C.clanid AS clan_id,
                CD.ally_id AS ally_id
            FROM characters C
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clanid AND D.sub_pledge_id = 0
            LEFT JOIN clan_data CD ON CD.clan_id = C.clanid
            WHERE C.accesslevel = '0'
            ORDER BY pvpkills DESC, pkkills DESC, onlinetime DESC, char_name ASC
            LIMIT :limit
        """
        return LineageStats._run_query(sql, {"limit": limit})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def top_pk(limit=10😞
        sql = """
            SELECT
                C.char_name,
                C.pvpkills,
                C.pkkills,
                C.online,
                C.onlinetime,
                D.name AS clan_name,
                C.clanid AS clan_id,
                CD.ally_id AS ally_id
            FROM characters C
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clanid AND D.sub_pledge_id = 0
            LEFT JOIN clan_data CD ON CD.clan_id = C.clanid
            WHERE C.accesslevel = '0'
            ORDER BY pkkills DESC, pvpkills DESC, onlinetime DESC, char_name ASC
            LIMIT :limit
        """
        return LineageStats._run_query(sql, {"limit": limit})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def top_online(limit=10😞
        sql = """
            SELECT
                C.char_name,
                C.pvpkills,
                C.pkkills,
                C.online,
                C.onlinetime,
                D.name AS clan_name,
                C.clanid AS clan_id,
                CD.ally_id AS ally_id
            FROM characters C
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clanid AND D.sub_pledge_id = 0
            LEFT JOIN clan_data CD ON CD.clan_id = C.clanid
            WHERE C.accesslevel = '0'
            ORDER BY onlinetime DESC, pvpkills DESC, pkkills DESC, char_name ASC
            LIMIT :limit
        """
        return LineageStats._run_query(sql, {"limit": limit})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def top_level(limit=10😞
        sql = """
            SELECT
                C.char_name,
                C.pvpkills,
                C.pkkills,
                C.online,
                C.onlinetime,
                CS.level,
                D.name AS clan_name,
                C.clanid AS clan_id,
                CD.ally_id AS ally_id
            FROM characters C
            LEFT JOIN character_subclasses CS ON CS.char_obj_id = C.obj_Id AND CS.isBase = '1'
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clanid AND D.sub_pledge_id = 0
            LEFT JOIN clan_data CD ON CD.clan_id = C.clanid
            WHERE C.accesslevel = '0'
            ORDER BY level DESC, exp DESC, onlinetime DESC, char_name ASC
            LIMIT :limit
        """
        return LineageStats._run_query(sql, {"limit": limit})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def top_adena(limit=10, adn_billion_item=0, value_item=1000000😞
        item_bonus_sql = ""
        if adn_billion_item != 0:
            item_bonus_sql = f"""
                IFNULL((SELECT SUM(I2.amount) * :value_item
                        FROM items I2
                        WHERE I2.owner_id = C.obj_Id AND I2.item_type = :adn_billion_item
                        GROUP BY I2.owner_id), 0) +
            """
        sql = f"""
            SELECT
                C.char_name,
                C.online,
                C.onlinetime,
                CS.level,
                D.name AS clan_name,
                C.clanid AS clan_id,
                CD.ally_id AS ally_id,
                (
                    {item_bonus_sql}
                    IFNULL((SELECT SUM(I1.amount)
                            FROM items I1
                            WHERE I1.owner_id = C.obj_Id AND I1.item_type = '57'
                            GROUP BY I1.owner_id), 0)
                ) AS adenas
            FROM characters C
            LEFT JOIN character_subclasses CS ON CS.char_obj_id = C.obj_Id AND CS.isBase = '1'
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clanid AND D.sub_pledge_id = 0
            LEFT JOIN clan_data CD ON CD.clan_id = C.clanid
            WHERE C.accesslevel = '0'
            ORDER BY adenas DESC, onlinetime DESC, char_name ASC
            LIMIT :limit
        """
        return LineageStats._run_query(sql, {
            "limit": limit,
            "adn_billion_item": adn_billion_item,
            "value_item": value_item
        })
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def top_clans(limit=10😞
        sql = """
            SELECT
                C.clan_id,
                D.name AS clan_name,
                C.clan_level,
                C.reputation_score,
                C.ally_name,  -- Obtendo ally_name diretamente de clan_data
                C.ally_id,
                P.char_name,
                (SELECT COUNT(*) FROM characters WHERE clanid = C.clan_id) AS membros
            FROM clan_data C
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clan_id AND D.sub_pledge_id = 0
            LEFT JOIN characters P ON P.obj_Id = D.leader_id
            ORDER BY C.clan_level DESC, C.reputation_score DESC, membros DESC
            LIMIT :limit
        """
        return LineageStats._run_query(sql, {"limit": limit})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def olympiad_ranking():
        sql = """
            SELECT
                C.char_name,
                C.online,
                D.name AS clan_name,
                C.clanid AS clan_id,
                CD.ally_id AS ally_id,
                CS.class_id AS base,
                O.points_current AS olympiad_points
            FROM oly_nobles O
            LEFT JOIN characters C ON C.obj_Id = O.char_id
            LEFT JOIN character_subclasses CS ON CS.char_obj_id = C.obj_Id AND CS.isBase = '1'
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clanid AND D.sub_pledge_id = 0
            LEFT JOIN clan_data CD ON CD.clan_id = C.clanid
            ORDER BY olympiad_points DESC, base ASC, char_name ASC
        """
        return LineageStats._run_query(sql)
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def olympiad_all_heroes():
        sql = """
            SELECT
                C.char_name,
                C.online,
                D.name AS clan_name,
                C.clanid AS clan_id,
                CLAN.ally_id AS ally_id,
                CS.class_id AS base,
                H.count
            FROM oly_heroes H
            LEFT JOIN characters C ON C.obj_Id = H.char_id
            LEFT JOIN character_subclasses CS ON CS.char_obj_id = C.obj_Id AND CS.isBase = '1'
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clanid AND D.sub_pledge_id = 0
            LEFT JOIN clan_data CLAN ON CLAN.clan_id = C.clanid
            WHERE H.played > 0 AND H.count > 0
            ORDER BY H.count DESC, base ASC, char_name ASC
        """
        return LineageStats._run_query(sql)
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def olympiad_current_heroes():
        sql = """
            SELECT
                C.char_name,
                C.online,
                D.name AS clan_name,
                C.clanid AS clan_id,
                CLAN.ally_id AS ally_id,
                CS.class_id AS base
            FROM oly_heroes H
            LEFT JOIN characters C ON C.obj_Id = H.char_id
            LEFT JOIN character_subclasses CS ON CS.char_obj_id = C.obj_Id AND CS.isBase = '1'
            LEFT JOIN clan_subpledges D ON D.clan_id = C.clanid AND D.sub_pledge_id = 0
            LEFT JOIN clan_data CLAN ON CLAN.clan_id = C.clanid
            WHERE H.played > 0 AND H.count > 0
            ORDER BY base ASC
        """
        return LineageStats._run_query(sql)
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def grandboss_status():
        sql = """
            SELECT bossId AS boss_id, respawnDate AS respawn
            FROM epic_boss_spawn
            ORDER BY respawnDate DESC
        """
        return LineageStats._run_query(sql)
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def siege():
        sql = """
            SELECT
                W.id,
                W.name,
                W.siege_date AS sdate,
                W.treasury AS stax,
                P.char_name,
                CS.name AS clan_name,
                C.clan_id,
                C.ally_id,
                C.ally_name  -- Obtendo ally_name diretamente de clan_data
            FROM castle W
            LEFT JOIN clan_data C ON C.hasCastle = W.id
            LEFT JOIN clan_subpledges CS ON CS.clan_id = C.clan_id AND CS.sub_pledge_id = 0
            LEFT JOIN characters P ON P.obj_Id = CS.leader_id
        """
        return LineageStats._run_query(sql)
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def siege_participants(castle_id😞
        sql = """
            SELECT
                S.type,
                C.name AS clan_name,
                C.clan_id
            FROM siege_clans S
            LEFT JOIN clan_subpledges C ON C.clan_id = S.clan_id AND C.sub_pledge_id = 0
            WHERE S.residence_id = :castle_id
        """
        return LineageStats._run_query(sql, {"castle_id": castle_id})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def boss_jewel_locations(boss_jewel_ids😞
        # Gera bind dinâmico para IN
        bind_ids = [f":id{i}" for i in range(len(boss_jewel_ids))]
        placeholders = ", ".join(bind_ids)
        sql = f"""
            SELECT
                I.owner_id,
                I.item_type AS item_id,
                SUM(I.amount) AS count,
                C.char_name,
                P.name AS clan_name,
                C.clanid AS clan_id,
                CD.ally_id
            FROM items I
            INNER JOIN characters C ON C.obj_Id = I.owner_id
            LEFT JOIN clan_subpledges P ON P.clan_id = C.clanid AND P.sub_pledge_id = 0
            LEFT JOIN clan_data CD ON CD.clan_id = C.clanid
            WHERE I.item_type IN ({placeholders})
            GROUP BY I.owner_id, C.char_name, P.name, I.item_type, C.clanid, CD.ally_id
            ORDER BY count DESC, C.char_name ASC
        """
        params = {f"id{i}": item_id for i, item_id in enumerate(boss_jewel_ids)}
        return LineageStats._run_query(sql, params)
 
class LineageServices:
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def find_chars(login😞
        sql = """
            SELECT
                C.*,
                -- Base class e level
                (SELECT S0.class_id FROM character_subclasses AS S0 WHERE S0.char_obj_id = C.obj_Id AND S0.isBase = '1' LIMIT 1) AS base_class,
                (SELECT S0.level FROM character_subclasses AS S0 WHERE S0.char_obj_id = C.obj_Id AND S0.isBase = '1' LIMIT 1) AS base_level,
 
                -- Subclass 1
                (SELECT S1.class_id FROM character_subclasses AS S1 WHERE S1.char_obj_id = C.obj_Id AND S1.isBase = '0' LIMIT 0,1) AS subclass1,
                (SELECT S1.level FROM character_subclasses AS S1 WHERE S1.char_obj_id = C.obj_Id AND S1.isBase = '0' LIMIT 0,1) AS subclass1_level,
 
                -- Subclass 2
                (SELECT S2.class_id FROM character_subclasses AS S2 WHERE S2.char_obj_id = C.obj_Id AND S2.isBase = '0' LIMIT 1,1) AS subclass2,
                (SELECT S2.level FROM character_subclasses AS S2 WHERE S2.char_obj_id = C.obj_Id AND S2.isBase = '0' LIMIT 1,1) AS subclass2_level,
 
                -- Subclass 3
                (SELECT S3.class_id FROM character_subclasses AS S3 WHERE S3.char_obj_id = C.obj_Id AND S3.isBase = '0' LIMIT 2,1) AS subclass3,
                (SELECT S3.level FROM character_subclasses AS S3 WHERE S3.char_obj_id = C.obj_Id AND S3.isBase = '0' LIMIT 2,1) AS subclass3_level,
 
                -- Clan e Ally
                CS.name AS clan_name,
                CLAN.ally_name -- Obtendo ally_name diretamente de clan_data
            FROM characters AS C
            LEFT JOIN clan_data AS CLAN ON CLAN.clan_id = C.clanid
            LEFT JOIN clan_subpledges AS CS ON CS.clan_id = CLAN.clan_id AND CS.sub_pledge_id = 0
            WHERE C.account_name = :login
            LIMIT 7
        """
        try:
            return LineageDB().select(sql, {"login": login})
        except:
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def check_char(acc, cid😞
        sql = "SELECT * FROM characters WHERE obj_id = :cid AND account_name = :acc LIMIT 1"
        try:
            return LineageDB().select(sql, {"acc": acc, "cid": cid})
        except:
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def check_name_exists(name😞
        sql = "SELECT * FROM characters WHERE char_name = :name LIMIT 1"
        try:
            return LineageDB().select(sql, {"name": name})
        except:
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def change_nickname(acc, cid, name😞
        try:
            sql = """
                UPDATE characters
                SET char_name = :name
                WHERE obj_id = :cid AND account_name = :acc
                LIMIT 1
            """
            return LineageDB().update(sql, {"name": name, "cid": cid, "acc": acc})
        except Exception as e:
            print(f"Erro ao trocar nickname: {e}")
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def change_sex(acc, cid, sex😞
        try:
            sql = """
                UPDATE characters SET sex = :sex
                WHERE obj_Id = :cid AND account_name = :acc
                LIMIT 1
            """
            return LineageDB().update(sql, {"sex": sex, "cid": cid, "acc": acc})
        except Exception as e:
            print(f"Erro ao trocar s***: {e}")
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def unstuck(acc, cid, x, y, z😞
        try:
            sql = """
                UPDATE characters SET x = :x, y = :y, z = :z
                WHERE obj_id = :cid AND account_name = :acc
                LIMIT 1
            """
            return LineageDB().update(sql, {"x": x, "y": y, "z": z, "cid": cid, "acc": acc})
        except Exception as e:
            print(f"Erro ao desbugar personagem: {e}")
            return None
 
class LineageAccount:
    _checked_columns = False
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def ensure_columns():
        if LineageAccount._checked_columns:
            return
       
        lineage_db = LineageDB()
        columns = lineage_db.get_table_columns("accounts")
 
        try:
            if "email" not in columns:
                sql = """
                    ALTER TABLE accounts
                    ADD COLUMN email VARCHAR(100) NOT NULL DEFAULT '';
                """
                lineage_db.execute_raw(sql)
                print("✅ Coluna 'email' adicionada com sucesso.")
 
            if "created_time" not in columns:
                sql = """
                    ALTER TABLE accounts
                    ADD COLUMN created_time INT(11) NULL DEFAULT NULL;
                """
                lineage_db.execute_raw(sql)
                print("✅ Coluna 'created_time' adicionada com sucesso.")
 
            LineageAccount._checked_columns = True
 
        except Exception as e:
            print(f"❌ Erro ao alterar tabela 'accounts': {e}")
 
    @staticmethod
    @cache_lineage_result(timeout=300, use_cache=False)
    def check_login_exists(login😞
        sql = "SELECT * FROM accounts WHERE login = :login LIMIT 1"
        return LineageDB().select(sql, {"login": login})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def check_email_exists(email😞
        sql = "SELECT login, email FROM accounts WHERE email = :email"
        return LineageDB().select(sql, {"email": email})
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def register(login, password, access_level, email😞
        try:
            LineageAccount.ensure_columns()
            hashed = base64.b64encode(hashlib.sha1(password.encode()).digest()).decode()
            sql = """
                INSERT INTO accounts (login, password, accessLevel, email, created_time)
                VALUES (:login, :password, :access_level, :email, :created_time)
            """
            params = {
                "login": login,
                "password": hashed,
                "access_level": access_level,
                "email": email,
                "created_time": int(time.time())
            }
            LineageDB().insert(sql, params)
            return True
        except Exception as e:
            print(f"Erro ao registrar conta: {e}")
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def update_password(password, login😞
        try:
            hashed = base64.b64encode(hashlib.sha1(password.encode()).digest()).decode()
            sql = """
                UPDATE accounts SET password = :password
                WHERE login = :login LIMIT 1
            """
            params = {
                "password": hashed,
                "login": login
            }
            LineageDB().update(sql, params)
            return True
        except Exception as e:
            print(f"Erro ao atualizar senha: {e}")
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def update_password_group(password, logins_list😞
        if not logins_list:
            return None
        try:
            hashed = base64.b64encode(hashlib.sha1(password.encode()).digest()).decode()
            sql = "UPDATE accounts SET password = :password WHERE login IN :logins"
            params = {
                "password": hashed,
                "logins": logins_list
            }
            LineageDB().update(sql, params)
            return True
        except Exception as e:
            print(f"Erro ao atualizar senhas em grupo: {e}")
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300)
    def update_access_level(access, login😞
        try:
            sql = """
                UPDATE accounts SET accessLevel = :access
                WHERE login = :login LIMIT 1
            """
            params = {
                "access": access,
                "login": login
            }
            return LineageDB().update(sql, params)
        except Exception as e:
            print(f"Erro ao atualizar accessLevel: {e}")
            return None
 
class TransferFromWalletToChar:
 
    @staticmethod
    @cache_lineage_result(timeout=300, use_cache=False)
    def find_char(account: str, char_name: str😞
        query = """
            SELECT * FROM characters
            WHERE account_name = :account AND char_name = :char_name
            LIMIT 1
        """
        try:
            return LineageDB().select(query, {"account": account, "char_name": char_name})
        except:
            return None
 
    @staticmethod
    @cache_lineage_result(timeout=300, use_cache=False)
    def search_coin(char_name: str, coin_id: int😞
        query = """
            SELECT i.* FROM items i
            JOIN characters c ON i.owner_id = c.obj_Id
            WHERE c.char_name = :char_name AND i.item_id = :coin_id
        """
        return LineageDB().select(query, {"char_name": char_name, "coin_id": coin_id})
 
    @staticmethod
    @cache_lineage_result(timeout=300, use_cache=False)
    def insert_coin(char_name: str, coin_id: int, amount: int, enchant: int = 0😞
        db = LineageDB()
 
        # Buscar owner_id do personagem
        char_query = "SELECT obj_Id FROM characters WHERE char_name = :char_name"
        char_result = db.select(char_query, {"char_name": char_name})
        if not char_result:
            return None
 
        owner_id = char_result[0]["obj_Id"]
 
        # Inserir na tabela `items_delayed` como na lógica do PHP
        insert_query = """
            INSERT INTO items_delayed (
                payment_id, owner_id, item_id, count,
                enchant_level, variationId1, variationId2,
                flags, payment_status, description
            )
            SELECT
                COALESCE(MAX(payment_id), 0) + 1,
                :owner_id, :coin_id, :amount,
                :enchant, 0, 0,
                0, 0, 'DONATE WEB'
            FROM items_delayed
        """
 
        result = db.insert(insert_query, {
            "owner_id": owner_id,
            "coin_id": coin_id,
            "amount": amount,
            "enchant": enchant
        })
 
        return result is not None
 
class TransferFromCharToWallet:
 
    @staticmethod
    @cache_lineage_result(timeout=300, use_cache=False)
    def find_char(account, char_id😞
        query = """
            SELECT online, char_name FROM characters
            WHERE account_name = :account AND obj_Id = :char_id
        """
        params = {"account": account, "char_id": char_id}
        return LineageDB().select(query, params)
 
    @staticmethod
    @cache_lineage_result(timeout=300, use_cache=False)
    def list_items(char_id😞
        query = """
            SELECT item_id, item_type, amount, location, enchant
            FROM items
            WHERE owner_id = :char_id
            AND location IN ('INVENTORY', 'WAREHOUSE')
            ORDER BY location, item_type
        """
        params = {"char_id": char_id}
        results = LineageDB().select(query, params)
 
        return results
 
    @staticmethod
    @cache_lineage_result(timeout=300, use_cache=False)
    def check_ingame_coin(coin_id, char_id😞
        db = LineageDB()
 
        # Buscar no INVENTORY
        query_inve = """
            SELECT amount, enchant FROM items
            WHERE owner_id = :char_id AND item_type = :coin_id AND location = 'INVENTORY'
            LIMIT 1
        """
        result_inve = db.select(query_inve, {"char_id": char_id, "coin_id": coin_id})
        inINVE = result_inve[0]["amount"] if result_inve else 0
        enchant = result_inve[0]["enchant"] if result_inve else 0
 
        # Buscar no WAREHOUSE
        query_ware = """
            SELECT amount FROM items
            WHERE owner_id = :char_id AND item_type = :coin_id AND location = 'WAREHOUSE'
            LIMIT 1
        """
        result_ware = db.select(query_ware, {"char_id": char_id, "coin_id": coin_id})
        inWARE = result_ware[0]["amount"] if result_ware else 0
 
        total = inINVE + inWARE
        return {"total": total, "inventory": inINVE, "warehouse": inWARE, "enchant": enchant}
 
    @staticmethod
    @cache_lineage_result(timeout=300, use_cache=False)
    def remove_ingame_coin(coin_id, count, char_id😞
        try:
            db = LineageDB()
 
            # Função auxiliar para deletar itens não stackables
            def delete_non_stackable(items, amount_to_remove😞
                removed = 0
                for item in items:
                    if removed >= amount_to_remove:
                        break
                    db.update("DELETE FROM items WHERE item_id = :item_id", {"item_id": item["item_id"]})
                    removed += 1
                return removed
 
            # INVENTORY
            query_inve = """
                SELECT * FROM items
                WHERE owner_id = :char_id AND item_type = :item_type AND location = 'INVENTORY'
            """
            items_inve = db.select(query_inve, {"char_id": char_id, "item_type": coin_id})
 
            # WAREHOUSE
            query_ware = """
                SELECT * FROM items
                WHERE owner_id = :char_id AND item_type = :item_type AND location = 'WAREHOUSE'
            """
            items_ware = db.select(query_ware, {"char_id": char_id, "item_type": coin_id})
 
            total_amount = sum(item["amount"] for item in items_inve + items_ware)
            if total_amount < count:
                return False  # Não tem quantidade suficiente
 
            # Identifica se é stackable ou não
            is_stackable = len(items_inve + items_ware) == 1 and (items_inve + items_ware)[0]["amount"] > 1
 
            if is_stackable:
                # Remove do INVENTORY primeiro
                if items_inve:
                    item = items_inve[0]
                    if item["amount"] <= count:
                        db.update("DELETE FROM items WHERE item_id = :item_id", {"item_id": item["item_id"]})
                        count -= item["amount"]
                    else:
                        db.update(
                            "UPDATE items SET amount = amount - :count WHERE item_id = :item_id",
                            {"count": count, "item_id": item["item_id"]}
                        )
                        count = 0
 
                # Se ainda faltar, remove do WAREHOUSE
                if count > 0 and items_ware:
                    item = items_ware[0]
                    if item["amount"] <= count:
                        db.update("DELETE FROM items WHERE item_id = :item_id", {"item_id": item["item_id"]})
                    else:
                        db.update(
                            "UPDATE items SET amount = amount - :count WHERE item_id = :item_id",
                            {"count": count, "item_id": item["item_id"]}
                        )
 
            else:
                # Não stackável – remover 1 a 1, primeiro INVENTORY depois WAREHOUSE
                removed = delete_non_stackable(items_inve, count)
                if removed < count:
                    delete_non_stackable(items_ware, count - removed)
 
            return True
 
        except Exception as e:
            print(f"Erro ao remover coin do inventário/warehouse: {e}")
            return False

 

❌ Erro na execução: (pymysql.err.OperationalError) (1054, "Unknown column 'CS.isBase' in 'on clause'")

quer fazer isso comigo no discord ? esse debug a gente faz no off

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Denky disse:

❌ Erro na execução: (pymysql.err.OperationalError) (1054, "Unknown column 'CS.isBase' in 'on clause'")

quer fazer isso comigo no discord ? esse debug a gente faz no off

me manda o seu discord

  • Gostei 1
Link para o comentário
Compartilhar em outros sites

O conteúdo está oculto, favor efetuar login ou se cadastrar!



Não existe coluna nome em tabela castle no padrão aCis.
Estou com problemas com a .env não está lendo a query acis.
Tenho problemas com Bcrypt não está importando em requirements.txt:
hash: uSPqIeQQCjDqjB+0KlHQy5l9yZQ=  

Deveria ser:

Hash: $2a$10$OJfA93kDoZoMJbjYJAHOjOrC.HsDB5XeKJYsYDgKnM1vZejHcLKhi
  • Gostei 1

...

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, Dhousefe disse:

 

O conteúdo está oculto, favor efetuar login ou se cadastrar!

 

 


Não existe coluna nome em tabela castle no padrão aCis.
Estou com problemas com a .env não está lendo a query acis.
Tenho problemas com Bcrypt não está importando em requirements.txt:
hash: uSPqIeQQCjDqjB+0KlHQy5l9yZQ=  

Deveria ser:

Hash: $2a$10$OJfA93kDoZoMJbjYJAHOjOrC.HsDB5XeKJYsYDgKnM1vZejHcLKhi

 

O conteúdo está oculto, favor efetuar login ou se cadastrar!

entra no discord que eu te ajudo

  • Gostei 1

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

 

🚀 UPDATE DO PROJETO: PDL 1.5.3
🔐 Sistema de Vinculação de Conta L2 com Segurança Total!

A nova versão PDL 1.5.3 traz um avanço crucial para a segurança das contas e integração com o jogo. Agora, o processo de vinculação entre sua Conta Mestra (PDL) e sua Conta do Jogo (Lineage 2) está mais robusto, seguro e inteligente — pensado para proteger os jogadores e permitir migrações de servidores já existentes com total tranquilidade.


🧩 Como Funciona?

  1. Ao acessar o menu do seu avatar no PDL, clique em “Conta L2”.

  2. O sistema detecta se já existe ou não uma conta no jogo com o mesmo username da sua Conta Mestra:

    • ✅ Se não existir, será oferecida a opção de cadastrar uma nova conta Lineage 2 diretamente ligada à sua Conta Mestra.

    • 🔐 Se já existir, será iniciado o processo de vinculação segura, exigindo que você comprove ser o verdadeiro dono da conta in-game.


📨 Confirmação via Senha do Jogo ou E-mail
O sistema permite dois caminhos para confirmar a vinculação:

  • ✅ Senha da conta do jogo (para quem lembra os dados e quer agilidade)

  • 📧 Link enviado ao e-mail cadastrado (segurança extra, ideal para quem quer evitar qualquer apropriação indevida)


🎯 Problema Resolvido: Segurança e Autenticidade
Antes, qualquer pessoa com login/senha poderia vincular uma conta que não fosse sua. Agora, com o novo sistema, a Conta Mestra do PDL só consegue vincular contas que realmente pertencem ao jogador, seja por meio da senha ou da validação por e-mail.


🛡️ Pensado para migrações de servidores já ativos!
Essa funcionalidade foi feita sob medida para servidores que já estavam em operação antes da integração com o PDL, garantindo que nenhum jogador perca o acesso às suas contas por falhas de autenticação ou conflitos de usernames.


📌 Resumo das Vantagens da 1.5.3

  • Vinculação inteligente baseada no username

  • Verificação segura por senha ou e-mail

  • Proteção contra vinculações indevidas

  • Suporte completo para migração de servidores existentes

  • Experiência fluida para novos e antigos jogadores


💡 A partir da 1.5.3, o PDL não só protege suas contas — ele respeita sua identidade no jogo. Essa é mais uma etapa na construção de um sistema confiável, conectado e preparado para o futuro.

 

 

Editado por Denky
  • Gostei 1

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

 

🚀 UPDATE DO PROJETO: PDL 1.5.4
🔒 Lock System, Segurança Reativa e Notificações Evoluídas!

A versão PDL 1.5.4 marca uma nova fase de proteção, usabilidade e inteligência no sistema. Pensada para prevenir acessos indevidos e melhorar a interação dos jogadores com o sistema, esta atualização traz recursos de segurança proativos, refinamentos internos e notificações muito mais eficazes.


🛡️ Lock System: Trava Manual e Auto Inatividade

Com o novo Lock System, sua conta fica protegida mesmo se você se afastar do computador. Agora, o sistema trava automaticamente após 5 minutos de inatividade, exigindo a senha do usuário para continuar.

✅ Trava Automática: Protege sua conta caso você esqueça aberta em local público ou compartilhado.
✅ Botão de Cadeado no Menu: Você pode bloquear a sessão manualmente a qualquer momento, com um simples clique. Ideal para quem precisa sair rapidamente e quer garantir a segurança da conta.

💡 Benefícios:

  • Prevenção contra acessos não autorizados

  • Confiança total ao deixar a conta aberta

  • Integração elegante e sem fricção à experiência do usuário


📨 Notificações Inteligentes e Interativas

As notificações foram completamente retrabalhadas:

🔗 Agora com Link Direto para os Eventos
📍 Toda a área da notificação é clicável, não apenas o texto — mais fácil, mais rápido.
🧹 Limpeza automática para novos usuários: Quem entra agora não recebe notificações antigas ou irrelevantes.
📬 Visualização Detalhada na Tela de Notificações: Ao abrir o painel, você vê o conteúdo completo de cada notificação em uma visual elegante e contextual.


🔐 Whirlpoolv2: Novo Hash para Lucera

Realizamos a migração para o algoritmo Whirlpoolv2 (Lucera 2003) — uma versão customizada do Whirlpool utilizada em servidores Lineage 2 Lucera.

⚙️ Foram necessários ajustes manuais e engenharia reversa para compatibilizar nossa segurança com o padrão real usado nesses servidores.
✅ Agora, o sistema suporta o mesmo hash da Lucera, com 100% de compatibilidade para migração segura de contas e autenticação do jogo.


🎨 Tela de Login Editável com Temas

A tela de login agora pode ser personalizada diretamente no sistema de temas.
Quer um login com o clima do seu servidor? Tema sombrio? Tema futurista? Agora é possível, com integração total ao painel de administração.


🧪 E Muito Mais nos Bastidores…

Essa versão também inclui:

🔧 Diversas correções de bugs em processos internos
📊 Otimizações de performance em sessões, middleware e autenticação
📚 Melhorias em validações de segurança, timeout e templates


💬 PDL 1.5.4 não apenas protege o jogador — ela acompanha seu ritmo.
Do clique ao timeout, tudo foi feito para respeitar o seu tempo, seu jogo e sua segurança.

🛠️ Prepare-se. Evolua. Conquiste.
PDL continua sendo o elo confiável entre você e o mundo de Lineage 2.

 

 

  • Gostei 3

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

 

🎮 NOVO MINI-GAME: ECONOMIA MORTAL - A Jornada pelo Enchant +10
🔥 O sistema que mistura sorte, grind e estratégia chegou ao seu mundo Lineage!

A família PDL acaba de receber um novo mini-game dentro da experiência principal — Economia Mortal, um desafio incremental onde jogadores enfrentam monstros, coletam recursos e testam sua sorte para encantar uma arma até +10. Um verdadeiro ritual de sangue, paciência e fragmentos!


⚔️ Como Funciona?

Você começa com uma arma comum, nível +0. A cada inimigo derrotado, você ganha fragmentos. Ao acumular 10 fragmentos, você pode tentar encantar sua arma.

📈 A dificuldade aumenta progressivamente: quanto maior o enchant, menor a chance de sucesso.

  • Enchant +0 até +4: chances altas (acima de 60%)

  • Enchant +5 a +9: fica tenso! cada nível reduz a chance em 7%

  • Enchant +10: o ápice! Ao conseguir, você vence o mini-game, recebe uma recompensa especial (definida pelo administrador), e recomeça a jornada do zero.


👾 Sistema de Monstros Inteligente

Você enfrenta monstros de nível 1 a 11, cada um com:

  • Imagem (estática ou animada)

  • Requisitos mínimos de enchant para serem enfrentados

  • Recompensas variadas em fragmentos

  • Sistema de respawn por tempo (ex: 60s, 120s, etc.)

  • Atributos básicos: ataque, defesa e HP

A dificuldade real é calculada com base no seu dano vs. defesa do monstro, garantindo que monstros fracos sejam vencidos com facilidade e bosses realmente sejam épicos.


💎 Recompensas Parametrizadas

Todo o loot de vitória no enchant +10 vem de um modelo chamado RewardItem, gerenciado diretamente pelo painel de administração. O ADM define:

  • ID do item

  • Nome e enchant do item

  • Quantidade da premiação

  • Descrição opcional

📦 Ao vencer, o item é entregue diretamente na sua Bag.


🪙 Economia baseada em Fichas

Para lutar contra monstros, você precisa de fichas. Sem elas, não há combate.

✅ As fichas podem ser adquiridas dentro do próprio jogo (loja ou eventos)
✅ Sistema visual integrado com botão de compra e saldo do jogador


🎨 Visual Estilo Lineage 2

Tudo isso com estética 100% inspirada em Lineage 2, com elementos visuais dark, góticos e envolventes. A roleta, a bag, a loja, tudo conversa com a identidade visual do projeto.


🧠 Resumo:

  • 🌱 Comece com uma arma +0

  • ⚔️ Derrote monstros e colete fragmentos

  • ✨ Enchante sua arma até +10

  • 🎁 Ganhe uma recompensa real definida pelo ADM

  • 🔁 Recomece… e tente outra build ou meta!


🧙‍♂️ Esse mini-game é mais do que diversão — é uma jornada de progressão, com um ciclo viciante de tentativa e recompensa.
📢 Disponível agora dentro do painel PDL. Prepare suas fichas.

PDL: jogabilidade com propósito. Diversão com profundidade.
Que os deuses do enchant estejam com você...

 

 

  • Gostei 1

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites

 

📢 Comunicado Oficial

Fala, pessoal!

Passando aqui pra anunciar que o PDL acaba de entrar em uma fase ESTÁVEL e considerada SEGURA para uso em produção.
Depois de muitas madrugadas de código, ajustes, testes intensivos e melhorias contínuas, finalmente atingimos um ponto sólido do sistema.

✅ Todos os testes críticos foram executados com sucesso.
✅ Nenhum erro grave persistente foi identificado.
✅ O sistema está pronto pra ser usado com confiança!

A partir de agora, os updates rápidos e frequentes vão cessar, dando espaço para uma fase mais madura, onde só serão aplicadas atualizações pontuais e planejadas.

Se você já faz parte da jornada, agradeço imensamente pelo feedback e paciência durante o desenvolvimento.
Se está chegando agora: seja bem-vindo ao novo PDL, onde estabilidade e profundidade caminham juntas. 💪

Nos vemos no painel.
Denky 🧙‍♂️
Desenvolvedor do Projeto PDL

 

  • Gostei 3
  • Amei 1

Te Ajudei? Curte ai para me ajudar!
Ass.: Denkyto (discord)

banner-pdl.png.f366c9249de658e0a684c96487f0950d.png

 

Link para o comentário
Compartilhar em outros sites





×
×
  • Criar Novo...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.