Ir para conteúdo
  • Cadastre-se

Painel Admin


Hash

Posts recomendados

Olá pessoal da L2JBrasil, estou a um tempo sem postar nada no fórum e como comecei a trabalhar em um novo projeto L2J comecei a desenvolver também a parte web que será utilizada (site, página com contagem regressiva, etc).

Levando isso em consideração, comecei a buscar pelo fórum algumas opções de painéis administrativos e vi um que eu já havia utilizado a muito tempo atrás e pensei em reaproveitar o que já foi feito e atualizá-lo em diversos aspectos.

Principais objetivos do "rework":

  • Atualização dos componentes e funções existentes no projeto;
  • Utilização de novas tecnologias no projeto para facilitar na criação/modificação das interfaces tais como o Bootstrap, Font Awesome, etc;
  • Adição de novas funcionalidades (específicas do meu projeto).

Sobre o projeto base:

O projeto que será utilizado como base para a criação da nova versão do painel foi desenvolvido por um usuário (Mr. Walker) que já está banido da L2JBrasil, porém ainda é possível baixar o projeto original através do link onde encontra-se o tópico original da postagem. A imagem da versão original contra-se no spoiler abaixo.

ndD58.jpg

 

 

Versão 2.1 (26/10)

 

 

Correções:

  • Alteração das funções php para acesso ao banco (mysql > mysqli);
  • Modificação no gerenciamento de sessão (parâmetros de acesso);
  • Modificação da tela inicial de login a partir da utilização do Bootstrap.

dedcc8079ca14332a78793f10baa79bd.png

 

 

 

Versão 2.1.1 (27/10)

 

 

  • Modificação da página de entregar doações no padrão do bootstrap (Não está funcionando a entrega);
  • Modificação da página de exibição dos players online;
  • Modificação da página de busca por ID (Padronização e busca pelas custom tables);
  • Alteração do visual da barra lateral e do menu de navegação.

762b134e68ab43ea9cd39c549e18998c.png

 

 

 

Versão 2.2 (29/10)

 

 

  • Correção do entregar_donate, agora está 100% funcional e com uma nova opção para entregar no inventário ou na warehouse;
  • Criação de um footer para manter/adicionar os direitos autorais;
  • Modificação no estilo das páginas de status vip, ban, troca de nick, troca de s***, recs, status nobles, deletar chars lv1, wipe, cadastrar notícia, cadastrar usuário, editar perfil;
  • Reformulação da função de dar status vip (utilização do campo vip da table characters);
  • Correção da tabela e SQL da listagem dos clans, pois não conseguia pegar alguns dos lideres (erro na SQL);
  • Edição do perfil do usuário e da opção para editar o perfil;
  • Perfil do usuário atualizado, parecido com um cartão de visita;
  • Página home apresenta todas as notícias do site, agora com opção de subtitulo e imagem.

5abbd53df6b94eedaa0c1ed921affc34.png

40fb14c1f05f4a80ad20e6dcadb6b47c.png

4892f77ad0fa4021a0fce3186e553edb.png

89dfb8b5f5c04f3f83356907e9aa5a85.png

d8498142e920491f8dea7f5fe510c9b7.png

d9bacad4646a429eadca7dfa5d392b21.png

7fce3acc29ea45e29e43db9dd26cebc7.png

319967378de245d5a3bf29efdac5299f.png

 

 

 

 

Versão 2.2.2 (01/11)

 

 

  • Ajustes gerais (visuais);
  • Inserção da funcionalidade de remoção de itens de um player (Inventário, warehouse, equipado);
  • Listagem das notícias (Título e subtítulo);
  • Edição do conteúdo da notícia;
  • Opção "Ler mais" de uma notícia onde abre todo o conteúdo da mesma;
  • Correção da função de entrega de vip, agora por dias (1 por default, 30, 60 e 90);

2de4ab70b4d74aeb9470e427cde35139.png

3490389b452548eca18f8aec087605f5.png

556ac401e6664038b6024f002cda0a6d.png

b4d91a6073d949368f4a171f5a9dd7ce.png

0041183abde84d73a5d078c954a6348b.png

 

 

 

Bom, resolvi postar no fórum de desenvolvimento para receber críticas construtivas de como melhorar, pois além de aprimorar o painel para utilização em meu projeto, tenho interesse em aprimorar minhas habilidades em front/back-end.

 

Créditos e agradecimentos:

Criador do painel:

Colaboradores: @MrFreedomFights e @Tayran.JavaDev à eles o meu muito obrigado.

 

ESTOU ACEITANDO SUGESTÕES DE FUNCIONALIDADES PARA O PAINEL,

BASTA POSTAR NESTE TÓPICO!

 

Abraços!

Editado por Tayran.JavaDev
Adicionando Nova versão a pedido do membro.

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites


Achei bacana, eu uso este Painel em todos os meus sites, tem que dar uma mexida também nas notícias que estão sem cores, está bem Monótonas... mas enfim, espero que poste logo. Mantenha sempre os créditos dos criadores originais! :)

pD5PSQp.png

" Você nunca sabe que resultados virão de suas ações, mas se você não fizer nada, não existirão resultados"

 

 

Link para o comentário
Compartilhar em outros sites

Achei bacana, eu uso este Painel em todos os meus sites, tem que dar uma mexida também nas notícias que estão sem cores, está bem Monótonas... mas enfim, espero que poste logo. Mantenha sempre os créditos dos criadores originais! :)

 

Essa é a intenção, melhorar principalmente a aparência :) . E pode deixar, manterei sim os créditos do criador.

Olá @MrFreedomFights, gostaria de saber se você utiliza a função de entrega de doação, pois estou com um problema sem solução até o momento.

Na hora de entregar a doação ele fala que não encontra o $_POST[id], não sei se na versão que você tem ele passa de alguma forma pelo form ou como ele faz mas na versão que eu tenho ele não passa esse parâmetro.
Se tiver alguma solução ou puder me enviar o arquivo entregar_donate.php, eu agradeceria.
Abraço!

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

 

 

Essa é a intenção, melhorar principalmente a aparência :) . E pode deixar, manterei sim os créditos do criador.

Olá @MrFreedomFights, gostaria de saber se você utiliza a função de entrega de doação, pois estou com um problema sem solução até o momento.

Na hora de entregar a doação ele fala que não encontra o $_POST[id], não sei se na versão que você tem ele passa de alguma forma pelo form ou como ele faz mas na versão que eu tenho ele não passa esse parâmetro.
Se tiver alguma solução ou puder me enviar o arquivo entregar_donate.php, eu agradeceria.
Abraço!

 

 

O meu funciona perfeitamente, talvez seja problema no servidor com o qual vc está fazendo teste..

pD5PSQp.png

" Você nunca sabe que resultados virão de suas ações, mas se você não fizer nada, não existirão resultados"

 

 

Link para o comentário
Compartilhar em outros sites

 

 

Essa é a intenção, melhorar principalmente a aparência :) . E pode deixar, manterei sim os créditos do criador.

Olá @MrFreedomFights, gostaria de saber se você utiliza a função de entrega de doação, pois estou com um problema sem solução até o momento.

Na hora de entregar a doação ele fala que não encontra o $_POST[id], não sei se na versão que você tem ele passa de alguma forma pelo form ou como ele faz mas na versão que eu tenho ele não passa esse parâmetro.
Se tiver alguma solução ou puder me enviar o arquivo entregar_donate.php, eu agradeceria.
Abraço!

 

 

Deve ser nome de campos diferente, de uma rev pra outra alguns campos mudam o nome.

"Tente ser uma pessoa de valor , não de sucesso" - Albert Einstein

 

 

Link para o comentário
Compartilhar em outros sites

 

Deve ser nome de campos diferente, de uma rev pra outra alguns campos mudam o nome.

 

Não acho que seja problema com relação a rev (até pq ele está pegando um post do form), acho que é pq está faltando alguma coisa na view, infelizmente não estou conseguindo resolver.

De qualquer forma a revisão que eu estou usando (ou pelo menos o banco) é da frozen 1118.

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

Meus conselhos é que para tirar aqueles avisos que não está achando o POST quando não se entregou uma doação ainda.

if(isset($_POST['radioss']) && $_POST['radioss'] == 'sim'){

assim ele não vai aparecer Undefined Index... o ID do post que não está achando pelo que vi antes o sistema gerava o ID por conta própria, e verificava se o objectId já não existia antes, mas parece que esquecerem trecho do código, pela breve olhada que dei vi esse problema que pode ser resolvido modificando da forma que coloquei. Abraço.


Outra coisa é modificar todas as chamadas de mysql para mysql improved.


No caso do POST 'id' ele ta servindo pra nada, ele serviria caso o objectID do item fosse passado por um form em forma de post ai fazia a verificação se o ID já existia ou não, caso contrário gerava uma nova ID, no caso ai sempre ta caindo no else que gera um novo ID e salva no banco, só remover essa parte que não ta servindo de nada.

if(isset($_POST['cad']) && $_POST['cad'] == 'oks'){
    $select = mysql_query("SELECT * FROM characters WHERE char_name = '$_POST[nome]'") or die (mysql_error());
    if(@mysql_num_rows($select) >= '1'){

    while($res = mysql_fetch_array($select)){    
        $id_owner = $res['obj_Id'];    
        $sele = mysql_query("SELECT * FROM items ORDER BY object_id DESC");
        $res_sele = mysql_fetch_object($sele);
        $geraid = $res_sele->object_id + 1000;
    }
$insert = mysql_query("INSERT INTO items VALUES ('$id_owner', '$geraid', '$_POST[iten_id]', '$_POST[count]', '$_POST[enchant]',  'INVENTORY', 0, 0, 0, NULL, 0,

"Tente ser uma pessoa de valor , não de sucesso" - Albert Einstein

 

 

Link para o comentário
Compartilhar em outros sites

@Tayran.JavaDev obrigado pela ajuda primeiramente.

 

Bom, eu já modifiquei/estou modificando todas as funções pro mysql improved, e na verdade a minha intenção futuramente é utilizar o PDO pra conexão, porém estou fazendo rodar pra testar se tudo está funcionando ok. Segundo, vou testar dessa forma que você falou e eu já havia constatado que estava caindo direto no else desse if e havia colocado outro if pra verificar se o $_POST['id'] estava setado (através do isset, exatamente como no primeiro caso, que eu já havia solucionado dessa forma). Assim que eu tiver resultados eu edito minha resposta, só conseguirei terminar isso amanhã pela manhã.

 

Obs: dá uma olhada nas versões que eu postei e tenta dar alguma sugestão, elas são sempre bem-vindas. Além disso nelas estão contidas as modificações, até na primeira eu comento que estava fazendo a modificação das chamadas de funções do mysql.

 

Abraço!

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

O Uso de PDO em uma aplicação que 99,99% dos usuários usa Mysql é quase que bobagem passar pra PDO, aquele POST do id pode ser removido, tá servindo de nada na aplicação, meu tempo é bem curto mas qualquer ajuda que precisar no PHP estou a disposição, só não tenho muitos estudos em linguagem de estilização e marcação, mas linguagem de programação minha lógica é ótima.

"Tente ser uma pessoa de valor , não de sucesso" - Albert Einstein

 

 

Link para o comentário
Compartilhar em outros sites

Bom, resolvi o problema da entrega de doações, está funcionando 100%! Inseri uma opção para entregar o item ou no inventário ou na warehouse do player, acredito que seja algo útil de ser utilizado. (Agradeço mais uma vez a ajuda do Tayran).

 

 

 

e280346d480247338defd7849b913861.png

 

 

 

Infelizmente tem um outro problema meio que sem solução até o momento, quando eu logo, e inicio a sessão através do index.php, aparece esse aviso do php no cabeçalho.

Tentei remover o session_start desse arquivo, e tentei colocar uma condição pra ver se a sessão já não estava iniciada pra dai iniciar e nos dois casos não deu certo. 1º porque quando eu removia, ele não logava no sistema, ou seja, existe algum outro session start escondido em algum lugar e eu não encontrei até o momento. 2º ele sempre caia no else como se não estivesse instanciado inicialmente.

Notice: A session had already been started - ignoring session_start() in /home/rodrigo/www/painel_admin/admin/functions/acesso_restrito.php on line 2

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

Sinceramente eu no seu lugar programava outro painel do 0, não dá pra confiar em código dos outros e o pior mexer com código dos outros é pior do que refazer o sistema do 0.

"Tente ser uma pessoa de valor , não de sucesso" - Albert Einstein

 

 

Link para o comentário
Compartilhar em outros sites

Então eu até ia fazer isso, mas preciso terminar isso pra ontem, então não posso perder tempo.

 

Obs: o sistema será interno acessado localmente, não vejo problemas referentes a segurança, etc.

Obs²: eu modifiquei grande parte dos códigos, organizei, padronizei, pois estava ilegível a maioria das funções (alguns if's com chaves perdidas, sem identação, etc).

Editado por -Hades

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

Eu prefiro reescrever assim sei 100% da interação do sistema e não fica perdido, e não tava referindo a problemas de segurança, tava me referindo a código porco sem indentação escrito de qualquer forma, o código desse painel tava muito mal feito.

"Tente ser uma pessoa de valor , não de sucesso" - Albert Einstein

 

 

Link para o comentário
Compartilhar em outros sites

Estava mesmo, mas eu dei uma melhorada/organizada no código. Pelo menos agora está legível, e adicionei algumas verificações também antes de fazer as ações (Por exemplo: na hora de dar vip, trocar de s***, não verificava a existência do char antes de dar o status ou fazer a troca).


Eu prefiro reescrever assim sei 100% da interação do sistema e não fica perdido, e não tava referindo a problemas de segurança, tava me referindo a código porco sem indentação escrito de qualquer forma, o código desse painel tava muito mal feito.

 

Tayran sabe me dizer se eu usar a sql abaixo, o delete será cascade? Digo isso porque do contrário manteria as informações desse char, mesmo ele sendo deletado.

DELETE FROM characters WHERE level = 1

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

 

Qual sua intenção com essa query ? excluir um personagem level 1 por completo ? assim não vai funcionar não...

"Tente ser uma pessoa de valor , não de sucesso" - Albert Einstein

 

 

Link para o comentário
Compartilhar em outros sites

Faltou um * antes do FROM, é remover todos os chars level 1. E na verdade a intenção é remover toda informação dele com ele, e realmente não exclui.

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

Faltou um * antes do FROM, é remover todos os chars level 1. E na verdade a intenção é remover toda informação dele com ele, e realmente não exclui.

 

Exclui apenas os "characters". Se quiser eu te passo o meu painel aqui, ele tá com as noticias modificadas, com cores e tal.

pD5PSQp.png

" Você nunca sabe que resultados virão de suas ações, mas se você não fizer nada, não existirão resultados"

 

 

Link para o comentário
Compartilhar em outros sites

Seria de grande ajuda Freedom, até porque a página Home onde ficariam as notícias não faz parte do pack postado pelo criador do painel.

 

Obs: adicionarei vocês dois como colaboradores do projeto, estão me ajudando muito. :)

Obs²: peço desculpas pelas perguntas "idiotas" e pelos erros de iniciante, estou concluindo meu curso da faculdade esse ano e apesar da experiência em programação, a parte web comecei a lidar faz menos de um mês.


// EDIT

 

Consegui solucionar o problema do notice que eu havia mencionado, só para deixar constado, precisei remover uma parte repetida de acesso a sessão que encontrava-se no index.

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

Faltou um * antes do FROM, é remover todos os chars level 1. E na verdade a intenção é remover toda informação dele com ele, e realmente não exclui.

 

Você pode fazer o delete usando o comando:

DELETE * FROM characters WHERE level < 2;

e depois adaptar o script a seguir para remover tudo que estivesse relacionado com o char

SET @dt = 60;

DELETE FROM accounts WHERE DATEDIFF( CURRENT_DATE( ) , FROM_UNIXTIME( `lastactive` /1000 ) ) > @dt;
DELETE FROM accounts WHERE login NOT IN (SELECT account_name FROM characters);
DELETE FROM account_data WHERE account_name NOT IN (SELECT login FROM accounts);
DELETE FROM characters WHERE account_name NOT IN (SELECT login FROM accounts);

DELETE FROM character_friends WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_hennas WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_macroses WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_quests WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_recipebook WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_shortcuts WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_skills WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_skills_save WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM clan_data WHERE leader_id NOT IN (SELECT charId FROM characters);
DELETE FROM clan_privs WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_skills WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM pets WHERE item_obj_id NOT IN (SELECT object_id FROM items WHERE owner_id IN (SELECT charId FROM characters));
DELETE FROM items WHERE owner_id NOT IN (SELECT charId FROM characters) AND owner_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM seven_signs WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM item_attributes WHERE itemId NOT IN (SELECT itemId FROM items);
UPDATE characters SET clanid=0,title="",clan_privs=0 where clanid NOT IN (SELECT clan_id FROM clan_data);
UPDATE clanhall SET ownerID=0,paidUntil=0 where ownerID NOT IN (SELECT clan_id FROM clan_data); 

nota: nao cheguei a testar o script no entanto o mesmo está configurado para remoção por tempo de inatividade, mas a base é essa

ele verifica as contas e depois deleta chars, dados de clan, itens. tudo que estivesse relacionado ao char.

 

aproveita e da uma estudada na sintaxe do sql.

 

ah uma observação:

 

1 - com relação a pdo e mysqli o pessoal vem afirmando que o pdo é mais seguro e talz, isso é pura ilusão tanto o mysqli quando o pdo são seguros desde que se tome todas as precauções afinal a api por si só nao faz nada.

 

2 - caso você tenha vontade de portar sua aplicação para outras sgdb ai sim vale a pena usar o pdo, como acredito nao ser o caso do l2j em que dificilmente alguem use o sqlserver ou outra db, a maioria só usa mysql entao acredito que vale mais a pena usar a api Mysqli.

 

nao desmerecendo nenhuma das apis, as duas tem seus pros e contras.

Editado por Demonwar

...O RESPEITO QUE IMPOMOS DEFINE O QUE SOMOS....

Link para o comentário
Compartilhar em outros sites

 

Você pode fazer o delete usando o comando:

DELETE * FROM characters WHERE level < 2;

e depois adaptar o script a seguir para remover tudo que estivesse relacionado com o char

SET @dt = 60;

DELETE FROM accounts WHERE DATEDIFF( CURRENT_DATE( ) , FROM_UNIXTIME( `lastactive` /1000 ) ) > @dt;
DELETE FROM accounts WHERE login NOT IN (SELECT account_name FROM characters);
DELETE FROM account_data WHERE account_name NOT IN (SELECT login FROM accounts);
DELETE FROM characters WHERE account_name NOT IN (SELECT login FROM accounts);

DELETE FROM character_friends WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_hennas WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_macroses WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_quests WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_recipebook WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_shortcuts WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_skills WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_skills_save WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM clan_data WHERE leader_id NOT IN (SELECT charId FROM characters);
DELETE FROM clan_privs WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_skills WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM pets WHERE item_obj_id NOT IN (SELECT object_id FROM items WHERE owner_id IN (SELECT charId FROM characters));
DELETE FROM items WHERE owner_id NOT IN (SELECT charId FROM characters) AND owner_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM seven_signs WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM item_attributes WHERE itemId NOT IN (SELECT itemId FROM items);
UPDATE characters SET clanid=0,title="",clan_privs=0 where clanid NOT IN (SELECT clan_id FROM clan_data);
UPDATE clanhall SET ownerID=0,paidUntil=0 where ownerID NOT IN (SELECT clan_id FROM clan_data); 

nota: nao cheguei a testar o script no entanto o mesmo está configurado para remoção por tempo de inatividade, mas a base é essa

ele verifica as contas e depois deleta chars, dados de clan, itens. tudo que estivesse relacionado ao char.

 

aproveita e da uma estudada na sintaxe do sql.

 

ah uma observação:

 

1 - com relação a pdo e mysqli o pessoal vem afirmando que o pdo é mais seguro e talz, isso é pura ilusão tanto o mysqli quando o pdo são seguros desde que se tome todas as precauções afinal a api por si só nao faz nada.

 

2 - caso você tenha vontade de portar sua aplicação para outras sgdb ai sim vale a pena usar o pdo, como acredito nao ser o caso do l2j em que dificilmente alguem use o sqlserver ou outra db, a maioria só usa mysql entao acredito que vale mais a pena usar a api Mysqli.

 

nao desmerecendo nenhuma das apis, as duas tem seus pros e contras.

 

Então, eu não queria me preocupar com proteções a ideia era rodar localmente o sistema pra utilizar as funcionalidades mas terei de pensar nessa parte de proteção, pois hoje me pediram pra disponibilizar o acesso online (não estou vendendo o sistema pra ninguém, mas faço parte de uma staff e eles estão me passando o que gostariam que tivesse no sistema, etc).

 

Sobre o script, eu vou dar uma olhada, mas acho que o caminho é esse, só preciso adaptar, pois para o meu caso é fazer a deleção dos chars que possuem level 1 e todas as informações (não pelo tempo de inatividade). De qualquer forma vou utilizá-lo em outro projeto que eu já tenho aqui :) .

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

 

Então, eu não queria me preocupar com proteções a ideia era rodar localmente o sistema pra utilizar as funcionalidades mas terei de pensar nessa parte de proteção, pois hoje me pediram pra disponibilizar o acesso online (não estou vendendo o sistema pra ninguém, mas faço parte de uma staff e eles estão me passando o que gostariam que tivesse no sistema, etc).

 

Sobre o script, eu vou dar uma olhada, mas acho que o caminho é esse, só preciso adaptar, pois para o meu caso é fazer a deleção dos chars que possuem level 1 e todas as informações (não pelo tempo de inatividade). De qualquer forma vou utilizá-lo em outro projeto que eu já tenho aqui :) .

 

 

voce pode fazer do seguinte modo:

 

deletar os char lv menor que 1:

DELETE * FROM characters WHERE level < 2;

em seguida usar apenas esse trecho do codigo: (lembrando que precisa ser ajustado as tabelas da sua db)

DELETE FROM character_friends WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_hennas WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_macroses WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_quests WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_recipebook WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_shortcuts WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_skills WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_skills_save WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM clan_data WHERE leader_id NOT IN (SELECT charId FROM characters);
DELETE FROM clan_privs WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_skills WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM pets WHERE item_obj_id NOT IN (SELECT object_id FROM items WHERE owner_id IN (SELECT charId FROM characters));
DELETE FROM items WHERE owner_id NOT IN (SELECT charId FROM characters) AND owner_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM seven_signs WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM item_attributes WHERE itemId NOT IN (SELECT itemId FROM items);
UPDATE characters SET clanid=0,title="",clan_privs=0 where clanid NOT IN (SELECT clan_id FROM clan_data);
UPDATE clanhall SET ownerID=0,paidUntil=0 where ownerID NOT IN (SELECT clan_id FROM clan_data); 

basicamente ele vai verificar os ids que constan nas demais tabelas e nao existem na tabela character e deletar o que não tiver relacionado.

 

Quanto a segurança tanto pdo como mysqli oferecem um otimo apoio. cabe a você escolher a que melhor vai lhe servir.

 

 

Abraços e boa sorte.

Editado por Demonwar

...O RESPEITO QUE IMPOMOS DEFINE O QUE SOMOS....

Link para o comentário
Compartilhar em outros sites

basicamente ele vai verificar os ids que constan nas demais tabelas e nao existem na tabela character e deletar o que não tiver relacionado.

 

Quanto a segurança tanto pdo como mysqli oferecem um otimo apoio. cabe a você escolher a que melhor vai lhe servir.

 

 

Abraços e boa sorte.

 

Cara, obrigado kk, me poupou um trabalhão. Eu optei por usar o mysql improved mesmo, consegui reutilizar o código já feito e já adaptei a maioria das coisas pra minha versão do painel.

 

A interface está quase completa, falta um banner e a parte das notícias que o Freedom ficou de me passar.

 

// EDIT

 

Versão 2.2 inserida no post, parte das notícias completada graças ao @MrFreedomFights que me forneceu um código base (fiz algumas adaptações, e acrescentei opções).

 

Agora só falta o banner e possíveis funções adicionais, estou aceitando sugestões :)

Editado por -Hades

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

@MrFreedomFights ou @Tayran.JavaDev, sabem me dizer como funciona o campo vip_end da tabela characters nas revisões Frozen? se é em segundos, minutos, etc. Pois para parte de adicionar vip vou colocar as opções de dia tbm.

Insanity is doing the same thing over and over again
and expecting different results.

- Albert Einstein.

owner of Lineage II Furya - Interlude 3000x - furya.com.br 😉

Link para o comentário
Compartilhar em outros sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Processando...
  • Registre-se

    Faça parte da maior e  mais antigas comunidades sobre Lineage2 da América Latina.





  • Patrocinadores

  • Quem Está Navegando

    • Nenhum usuário registrado visualizando esta página.
  • Posts

    • Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?     Teria como fazer do dusk shield e do zombie shield dessa maneira?    
    • muchas gracias muy lindos NPC 🙂
    • relaxa jovem gafanhoto, testa as quests. e posTa os erros indesejaveis.  
    • Se alguém pudesse me ensinar como codificar as missões, eu ficaria feliz em fazer isso sozinho ou pelo menos ajudar. Eu realmente quero jogar em um servidor onde todas as quests funcionem bem e melhor ainda se você puder fazer quests customizadas!
    • mas no interlude, nem todas as quests de class,  vai mostrar onde tem que ir, ate o reborn nao mostrava quando era interlude, só mostrou depois que eles colocaram client classic pra rodar, e ficou melhor ainda quando virou hellbound em diante, mas ha sim alguma chance de modificar isso direto no script para fazer igualmente, só basta te um pouco de paciencia e persistencia exato
    • 408_PathToElvenwizard dá Orion eu tive que mexer tbm, até modifiquei e consegui deixar ela igual do Classic, com a seta e a marcação no mapa. (não retail IL) Dá pra importar py de várias revs, o foda é que não da regular as quest py através do debug em tempo real, pelo menos eu não consegui rsrs
    • Hasta el momento todas las QUESTS son completables si te guias con un tutorial de youtube. El problema es que tienen bugs de locacion y de subquests que no avanzan o no te marcan correctamente a donde ir en el mapa, cosa que en Retail si se ve como corresponde.
    • estranho, mas pelo menos a galera nunca reclamo das quests quando tinha aberto 5x, geral fez class primeira e segunda job, poucos que compraram a class
    • en RUSaCis-3.5 data pack, las Quests estan en formato .java y son diferentes a como estan redactadas en jOrion y jFrozen 1.5 (ProyectX) package net.sf.l2j.gameserver.scripting.quest; import net.sf.l2j.commons.random.Rnd; import net.sf.l2j.gameserver.enums.Paperdoll; import net.sf.l2j.gameserver.enums.QuestStatus; import net.sf.l2j.gameserver.enums.actors.ClassId; import net.sf.l2j.gameserver.model.actor.Creature; import net.sf.l2j.gameserver.model.actor.Npc; import net.sf.l2j.gameserver.model.actor.Player; import net.sf.l2j.gameserver.network.serverpackets.SocialAction; import net.sf.l2j.gameserver.scripting.QuestState; public class Q224_TestOfSagittarius extends SecondClassQuest { private static final String QUEST_NAME = "Q224_TestOfSagittarius"; // Items private static final int BERNARD_INTRODUCTION = 3294; private static final int HAMIL_LETTER_1 = 3295; private static final int HAMIL_LETTER_2 = 3296; private static final int HAMIL_LETTER_3 = 3297; private static final int HUNTER_RUNE_1 = 3298; private static final int HUNTER_RUNE_2 = 3299; private static final int TALISMAN_OF_KADESH = 3300; private static final int TALISMAN_OF_SNAKE = 3301; private static final int MITHRIL_CLIP = 3302; private static final int STAKATO_CHITIN = 3303; private static final int REINFORCED_BOWSTRING = 3304; private static final int MANASHEN_HORN = 3305; private static final int BLOOD_OF_LIZARDMAN = 3306; private static final int CRESCENT_MOON_BOW = 3028; private static final int WOODEN_ARROW = 17; // Rewards private static final int MARK_OF_SAGITTARIUS = 3293; // NPCs private static final int BERNARD = 30702; private static final int HAMIL = 30626; private static final int SIR_ARON_TANFORD = 30653; private static final int VOKIAN = 30514; private static final int GAUEN = 30717; // Monsters private static final int ANT = 20079; private static final int ANT_CAPTAIN = 20080; private static final int ANT_OVERSEER = 20081; private static final int ANT_RECRUIT = 20082; private static final int ANT_PATROL = 20084; private static final int ANT_GUARD = 20086; private static final int NOBLE_ANT = 20089; private static final int NOBLE_ANT_LEADER = 20090; private static final int BREKA_ORC_SHAMAN = 20269; private static final int BREKA_ORC_OVERLORD = 20270; private static final int MARSH_STAKATO_WORKER = 20230; private static final int MARSH_STAKATO_SOLDIER = 20232; private static final int MARSH_STAKATO_DRONE = 20234; private static final int MARSH_SPIDER = 20233; private static final int ROAD_SCAVENGER = 20551; private static final int MANASHEN_GARGOYLE = 20563; private static final int LETO_LIZARDMAN = 20577; private static final int LETO_LIZARDMAN_ARCHER = 20578; private static final int LETO_LIZARDMAN_SOLDIER = 20579; private static final int LETO_LIZARDMAN_WARRIOR = 20580; private static final int LETO_LIZARDMAN_SHAMAN = 20581; private static final int LETO_LIZARDMAN_OVERLORD = 20582; private static final int SERPENT_DEMON_KADESH = 27090; public Q224_TestOfSagittarius() { super(224, "Test Of Sagittarius"); setItemsIds(BERNARD_INTRODUCTION, HAMIL_LETTER_1, HAMIL_LETTER_2, HAMIL_LETTER_3, HUNTER_RUNE_1, HUNTER_RUNE_2, TALISMAN_OF_KADESH, TALISMAN_OF_SNAKE, MITHRIL_CLIP, STAKATO_CHITIN, REINFORCED_BOWSTRING, MANASHEN_HORN, BLOOD_OF_LIZARDMAN, CRESCENT_MOON_BOW); addQuestStart(BERNARD); addTalkId(BERNARD, HAMIL, SIR_ARON_TANFORD, VOKIAN, GAUEN); addMyDying(ANT, ANT_CAPTAIN, ANT_OVERSEER, ANT_RECRUIT, ANT_PATROL, ANT_GUARD, NOBLE_ANT, NOBLE_ANT_LEADER, BREKA_ORC_SHAMAN, BREKA_ORC_OVERLORD, MARSH_STAKATO_WORKER, MARSH_STAKATO_SOLDIER, MARSH_STAKATO_DRONE, MARSH_SPIDER, ROAD_SCAVENGER, MANASHEN_GARGOYLE, LETO_LIZARDMAN, LETO_LIZARDMAN_ARCHER, LETO_LIZARDMAN_SOLDIER, LETO_LIZARDMAN_WARRIOR, LETO_LIZARDMAN_SHAMAN, LETO_LIZARDMAN_OVERLORD, SERPENT_DEMON_KADESH); } @Override public String onAdvEvent(String event, Npc npc, Player player) { String htmltext = event; QuestState st = player.getQuestList().getQuestState(QUEST_NAME); if (st == null) return htmltext; // BERNARD if (event.equalsIgnoreCase("30702-04.htm")) { st.setState(QuestStatus.STARTED); st.setCond(1); playSound(player, SOUND_ACCEPT); giveItems(player, BERNARD_INTRODUCTION, 1); if (giveDimensionalDiamonds39(player)) htmltext = "30702-04a.htm"; } // HAMIL else if (event.equalsIgnoreCase("30626-03.htm")) { st.setCond(2); playSound(player, SOUND_MIDDLE); takeItems(player, BERNARD_INTRODUCTION, 1); giveItems(player, HAMIL_LETTER_1, 1); } else if (event.equalsIgnoreCase("30626-07.htm")) { st.setCond(5); playSound(player, SOUND_MIDDLE); takeItems(player, HUNTER_RUNE_1, 10); giveItems(player, HAMIL_LETTER_2, 1); } // SIR_ARON_TANFORD else if (event.equalsIgnoreCase("30653-02.htm")) { st.setCond(3); playSound(player, SOUND_MIDDLE); takeItems(player, HAMIL_LETTER_1, 1); } // VOKIAN else if (event.equalsIgnoreCase("30514-02.htm")) { st.setCond(6); playSound(player, SOUND_MIDDLE); takeItems(player, HAMIL_LETTER_2, 1); } return htmltext; } @Override public String onTalk(Npc npc, Player player) { String htmltext = getNoQuestMsg(); QuestState st = player.getQuestList().getQuestState(QUEST_NAME); if (st == null) return htmltext; switch (st.getState()) { case CREATED: if (player.getClassId() != ClassId.ROGUE && player.getClassId() != ClassId.ELVEN_SCOUT && player.getClassId() != ClassId.ASSASSIN) htmltext = "30702-02.htm"; else if (player.getStatus().getLevel() < 39) htmltext = "30702-01.htm"; else htmltext = "30702-03.htm"; break; case STARTED: int cond = st.getCond(); switch (npc.getNpcId()) { case BERNARD: htmltext = "30702-05.htm"; break; case HAMIL: if (cond == 1) htmltext = "30626-01.htm"; else if (cond == 2 || cond == 3) htmltext = "30626-04.htm"; else if (cond == 4) htmltext = "30626-05.htm"; else if (cond > 4 && cond < 8) htmltext = "30626-08.htm"; else if (cond == 8) { htmltext = "30626-09.htm"; st.setCond(9); playSound(player, SOUND_MIDDLE); takeItems(player, HUNTER_RUNE_2, 10); giveItems(player, HAMIL_LETTER_3, 1); } else if (cond > 8 && cond < 12) htmltext = "30626-10.htm"; else if (cond == 12) { htmltext = "30626-11.htm"; st.setCond(13); playSound(player, SOUND_MIDDLE); } else if (cond == 13) htmltext = "30626-12.htm"; else if (cond == 14) { htmltext = "30626-13.htm"; takeItems(player, BLOOD_OF_LIZARDMAN, -1); takeItems(player, CRESCENT_MOON_BOW, 1); takeItems(player, TALISMAN_OF_KADESH, 1); giveItems(player, MARK_OF_SAGITTARIUS, 1); rewardExpAndSp(player, 54726, 20250); player.broadcastPacket(new SocialAction(player, 3)); playSound(player, SOUND_FINISH); st.exitQuest(false); } break; case SIR_ARON_TANFORD: if (cond == 2) htmltext = "30653-01.htm"; else if (cond > 2) htmltext = "30653-03.htm"; break; case VOKIAN: if (cond == 5) htmltext = "30514-01.htm"; else if (cond == 6) htmltext = "30514-03.htm"; else if (cond == 7) { htmltext = "30514-04.htm"; st.setCond(8); playSound(player, SOUND_MIDDLE); takeItems(player, TALISMAN_OF_SNAKE, 1); } else if (cond > 7) htmltext = "30514-05.htm"; break; case GAUEN: if (cond == 9) { htmltext = "30717-01.htm"; st.setCond(10); playSound(player, SOUND_MIDDLE); takeItems(player, HAMIL_LETTER_3, 1); } else if (cond == 10) htmltext = "30717-03.htm"; else if (cond == 11) { htmltext = "30717-02.htm"; st.setCond(12); playSound(player, SOUND_MIDDLE); takeItems(player, MANASHEN_HORN, 1); takeItems(player, MITHRIL_CLIP, 1); takeItems(player, REINFORCED_BOWSTRING, 1); takeItems(player, STAKATO_CHITIN, 1); giveItems(player, CRESCENT_MOON_BOW, 1); giveItems(player, WOODEN_ARROW, 10); } else if (cond > 11) htmltext = "30717-04.htm"; break; } break; case COMPLETED: htmltext = getAlreadyCompletedMsg(); break; } return htmltext; } @Override public void onMyDying(Npc npc, Creature killer) { final Player player = killer.getActingPlayer(); final QuestState st = checkPlayerState(player, npc, QuestStatus.STARTED); if (st == null) return; switch (npc.getNpcId()) { case ANT: case ANT_CAPTAIN: case ANT_OVERSEER: case ANT_RECRUIT: case ANT_PATROL: case ANT_GUARD: case NOBLE_ANT: case NOBLE_ANT_LEADER: if (st.getCond() == 3 && dropItems(player, HUNTER_RUNE_1, 1, 10, 500000)) st.setCond(4); break; case BREKA_ORC_SHAMAN: case BREKA_ORC_OVERLORD: if (st.getCond() == 6 && dropItems(player, HUNTER_RUNE_2, 1, 10, 500000)) { st.setCond(7); giveItems(player, TALISMAN_OF_SNAKE, 1); } break; case MARSH_STAKATO_WORKER: case MARSH_STAKATO_SOLDIER: case MARSH_STAKATO_DRONE: if (st.getCond() == 10 && dropItems(player, STAKATO_CHITIN, 1, 1, 100000) && player.getInventory().hasItems(MANASHEN_HORN, MITHRIL_CLIP, REINFORCED_BOWSTRING)) st.setCond(11); break; case MARSH_SPIDER: if (st.getCond() == 10 && dropItems(player, REINFORCED_BOWSTRING, 1, 1, 100000) && player.getInventory().hasItems(MANASHEN_HORN, MITHRIL_CLIP, STAKATO_CHITIN)) st.setCond(11); break; case ROAD_SCAVENGER: if (st.getCond() == 10 && dropItems(player, MITHRIL_CLIP, 1, 1, 100000) && player.getInventory().hasItems(MANASHEN_HORN, REINFORCED_BOWSTRING, STAKATO_CHITIN)) st.setCond(11); break; case MANASHEN_GARGOYLE: if (st.getCond() == 10 && dropItems(player, MANASHEN_HORN, 1, 1, 100000) && player.getInventory().hasItems(REINFORCED_BOWSTRING, MITHRIL_CLIP, STAKATO_CHITIN)) st.setCond(11); break; case LETO_LIZARDMAN: case LETO_LIZARDMAN_ARCHER: case LETO_LIZARDMAN_SOLDIER: case LETO_LIZARDMAN_WARRIOR: case LETO_LIZARDMAN_SHAMAN: case LETO_LIZARDMAN_OVERLORD: if (st.getCond() == 13) { if (((player.getInventory().getItemCount(BLOOD_OF_LIZARDMAN) - 120) * 5) > Rnd.get(100)) { playSound(player, SOUND_BEFORE_BATTLE); takeItems(player, BLOOD_OF_LIZARDMAN, -1); addSpawn(SERPENT_DEMON_KADESH, player, false, 300000, true); } else dropItemsAlways(player, BLOOD_OF_LIZARDMAN, 1, 0); } break; case SERPENT_DEMON_KADESH: if (st.getCond() == 13) { if (player.getInventory().getItemIdFrom(Paperdoll.RHAND) == CRESCENT_MOON_BOW) { st.setCond(14); playSound(player, SOUND_MIDDLE); giveItems(player, TALISMAN_OF_KADESH, 1); } else addSpawn(SERPENT_DEMON_KADESH, player, false, 300000, true); } break; } } }  
×
×
  • 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.