[quote name='KhayrusS' timestamp='1235865095' post='12568'] Venho aqui postar esse tuto que acho que estava faltando aqui no forúm. Sem mais bla bla vamos começar
Vou começar com o buffer por template
aqui é uma parte do HTML do buffer
Buffer
Custom Buff
Essa parte que eu destaquei é a parte que direciona o html para a tabela dos buffs
Agora vou explicar cada parte do html
1º- button -> cria um botão no html ( também pode ser substituido por ... no caso de ser um npc mais simples)
2º- value -> o nome que aparece no botão (nesse caso "wind walk")
3º- action -> aqui é a parte fundamental do html, pois ele redireciona o npc para o DB, usando esse codigo: "bypass -h npc_%objectId%_MakeBuffs WindWalkbyUsweer"
bypass -h npc_%objectId%_MakeBuffs (o comando MakeBuffs em algum servidores não funcionará pois precisa ser implementado no java)
essa parte é a que manda o npc buffar o player
WindWalkbyUsweer esse é o buff que ele vai dá pro player, ele deverá está na tabela buff_templates
4º- width e height-> aqui é a largura e altura do botão da html, respectivamente
5º- back e fore -> aqui são as imagens do botão quando for clicado e o normal, respectivamente
Aqui está a tabela buff_templates [Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]
aí vem a pergunta para que serve cada coluna dessa tabela?
1- ID -> Aqui encontrar o ID do nome do buff para direcionamento
.2- name -> Aqui é o nome do buff que usamos para direcionar (nesse caso WindWalkbyUsweer)
.3- Skill_id -> Aqui é o id da skill que o buffer usará
4- Skill_name -> nome da skill que será usada pelo buffer
5- Skill_level -> Level da skill que será usada pelo buffer
.6- skill force -> aqui é usado quando a skill tem stocktype( aconselho que deixe 1 nessa coluna)
.7- Skill order -> usado quando o buffer tem a opção full buff ou buff fight ( aquelas que dá muitos buffs de uma só vez) então so colocar a order dos buffs que queira que seja usado primeiro.
.8- char_min_level -> o level minimo que o player tem que ter para ser buffado
.9- char_max_level -> o level maximo que o player poderá ser buffado
.10- char_race -> expecifica qual a raça do char poderá se buffar ( coloque 0 para que todas as raças possam se buffar)
.11- char_class -> expecifica qual classe poderá se buffar ( coloque 0 para que todas as classes possam se buffar)
.12- char_faction -> esse ainda não testei mas creio que seja para buffar um determinado clan
.13- price_adena -> aqui é o preço do buff
.14- price_points -> aqui pode deixar 0
Então para editar só precisará do html e da tabela buff templates com isso acho que vcs já saberão como adicionar ou remover um buff do npc por template
OBS: Esse Tutorial foi baseado em l2jFree e pode não ser igual em outras REVs
NPC BUFFER POR SCRIPT
1. A HTML DO NPC Só lembrando que A HTML TEM QUE SER FEITA COM O MESMO ID DO NPC
vou só explicar uma pequena diferença desse html pro outro, que é o caminho do link
ao invés de redirecionar a html pro DB ele redirecionará para uma "quest" (9999_NPCBuffer)
2.Agora partiremos para o SCRIPT do NPC
O npc buffer por script fica na pasta Gameserver/data/script/custom ou jscript/custom ( esse no caso de IL)
Então vá até essa pasta e crie uma pasta com o nome 9999_NPCBuffer, após criar esta pasta abra o bloco de notas e crie um arquivo __init__.py e coloque esse codigo dentro:
Obs: este já ta editado
Código:
import sys from net.sf.l2j.gameserver.model.actor.instance import L2PcInstance from java.util import Iterator from net.sf.l2j.gameserver.datatables import SkillTable from net.sf.l2j import L2DatabaseFactory from net.sf.l2j.gameserver.model.quest import State from net.sf.l2j.gameserver.model.quest import QuestState from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
#Bless the Body if event == "7": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1045,6).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "2.htm" st.setState(COMPLETED)
#Bless the Soul if event == "8": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1048,6).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "2.htm" st.setState(COMPLETED)
if event == "21": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(271,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "22": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(272,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "23": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(273,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "24": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(274,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "25": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(275,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "26": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(276,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "27": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(277,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "28": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(307,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "29": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(309,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "30": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(310,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "31": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(311,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "32": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(366,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "33": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(365,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "3.htm"
if event == "34": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(264,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "35": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(265,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "36": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(266,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "37": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(267,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "38": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(268,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "39": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(269,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "40": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(270,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "41": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(304,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "42": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(305,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "43": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(306,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "44": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(308,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "45": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(363,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "46": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(364,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm"
if event == "47": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(349,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "4.htm" st.setState(COMPLETED)
#Chant of Battle if event == "48": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1007,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Shielding if event == "49": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1009,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Fire if event == "50": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1006,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Flame if event == "51": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1002,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of life if event == "52": st.takeItems(ADENA_ID,2000) SkillTable.getInstance().getInfo(1229,18).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Fury if event == "53": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1251,2).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Evasion if event == "54": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1252,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Rage if event == "55": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1253,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Revenge if event == "56": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1284,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Vampire if event == "57": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1310,4).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Eagle if event == "58": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1309,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Predator if event == "59": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1308,3).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Spirit if event == "60": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1362,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#Chant of Victory if event == "61": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1363,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
#chant of magnus if event == "62": st.takeItems(ADENA_ID,200) SkillTable.getInstance().getInfo(1413,1).getEffects(st.getPlayer(),st.getPlayer()) st.getPlayer().restoreHPMP() return "5.htm" st.setState(COMPLETED)
if htmltext != event: st.setState(COMPLETED) st.exitQuest(1) return htmltext
def onTalk (self,npc,player): st = player.getQuestState(qn) htmltext = "<html><head><body>I have nothing to say to you</body></html>" st.setState(STARTED) return InitialHtml
QUEST = Quest(9999,qn,"custom") CREATED = State('Start',QUEST) STARTED = State('Started',QUEST) COMPLETED = State('Completed',QUEST)
for npcId in NPC: QUEST.addStartNpc(npcId) QUEST.addTalkId(npcId)
Agora vou explicar algumas partes importantes deste arquivo
Código:
import sys from net.sf.l2j.gameserver.model.actor.instance import L2PcInstance from java.util import Iterator from net.sf.l2j.gameserver.datatables import SkillTable from net.sf.l2j import L2DatabaseFactory from net.sf.l2j.gameserver.model.quest import State from net.sf.l2j.gameserver.model.quest import QuestState from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
aqui ele está importando algums arquivos que já estão no servidor
Geralmente esses pachts mudam de acordo com o pack. para saber qual é o certo só abrir algum arquivo de quest (__init__.py) que já venha no server e usar o pacht (caminho)
para adicionar mais buff é só seguir o mesmo raciocionio, não esquecendo de acresentar no event
3. html da quest ( onde estará localizado os links para os buffs)
2" width=100 height=20 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df"> -> aqui a única coisa que mudou foi o 2 que diz respeito ao event do wind walk
Após ter feito va na pasta jscript/custom ou script/custom abra o arquivo __init__.py e adicione a pasta do seu buffer
Então para adicionar mais buffs só lembra de editar no arquivo __init__.py e no html.
Não esqueça seja criativo, mude, inove. vc pode fazer diversas páginas com buffs diferentes buffs separado por class e talz
Acho que é só isso que tenho para passar pra vocês, qualquer dúvida é só perguntar, e se alguém acha que está faltando alguma coisa favor posta ai ou manda mp para eu adicionar
credits: KhayrusS
Proibida a reprodução mesmo que em partes desse tutorial sem a publicação dos devidos créditos de criação [url="http://www.ufmg.br/prpq/LegPICT&IT.html"] Garantido pela Constituição da República Federativa do Brasil, de 05 de outubro de 1988 Portaria MCT n° 88, de 23/04/98 Propriedade Intelectual[/url]
[/quote] [cod][quote name='Kelvin' timestamp='1227634195' post='9'] [size=150]CRIANDO O SERVIDOR. [/size]
Nescessario: Todos os arquivos e programas necessarios estão para download no meu 4Shared.
[url="http://www.4shared.com/account/dir/8435013/440fcceb/sharing.html?rnd=62"][Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem][/url]
Download Softwares necessarios.
[url="http://www.4shared.com/file/56595503/8f0b298a/Java_JDK_6.html"]Java JDK[/url] [url="http://www.4shared.com/file/56589536/a3fa18ce/MySQL_50.html"]MySQL 5.0[/url] ou [url="http://www.4shared.com/file/79195610/22a3c2aa/MySQL_60.html"]MySQL 6.0[/url] [url="http://www.4shared.com/file/56586812/c61a3d50/Navicat_80__Crack.html"]Navicat 8.0 Trial[/url] [url="http://www.4shared.com/file/56586192/1128cd7/NO_-_IP.html"]NO-IP[/url] ou [url="http://superdownloads.uol.com.br/download/146/ddns-sistema-nomes-dominios-dinamicos/"]DDNS[/url] [url="http://www.4shared.com/file/62760531/c8aefe7d/FileEdit.html"]FileEdit[/url] ou [url="http://www.4shared.com/file/73114480/dc59de67/Editor_L2ini.html"]Editor ini[/url]
Podera escolher um servidor na zona de servidores.
---------------------- 1ª instale o JavaJDK. 2ª instale o MySQL 5.0 Server.
Instalando - MySQL 5.0 Server. -Rode o arquivo executável (DUH). -Aperte no botão Next para criar um novo exemplo.
-Selecione Detailed Configuration. [url="http://imageshack.us"][Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem][/url]
-Server Machine [url="http://imageshack.us"][Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem][/url]
-Next , Next -Escolha a primeira opção para 20 jogadores. [url="http://imageshack.us"][Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem][/url]
- NEXT , NEXT , NEXT -Security Options ... Não marque nada ! [url="http://imageshack.us"][Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem][/url] -EXECUTE [url="http://imageshack.us"][Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem][/url] ->Agora voce tem configurado seu MySQL server com Login : root, sem senha e porta 3306.
3ª Instale o NAVICAT !
4ª No NAVICAT clique em connection e coloque em Host name/IP address "localhost" , port "3306" , Username "root" e deixe em branco password e clique em OK. [url="http://imageshack.us"][Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem][/url] -Ira aparecer um novo campo de conexão chamado "localhost". Certo iremos clicar com botão direito do mause e selecionar > New Database e dar o nome de l2jdb para sua nova database e clique em OK. [url="http://imageshack.us"][Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem][/url]
5ª Pre-Configurado REV.
5.1. Extraia todos os arquivos p. uma pasta de sua escolha. C:\Server
[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem] 5.2. Abra o NAVICAT e restaure o backup da DATABASE q esta inclusa no pacote. Vc vai achar o backup (InterludeSvBAK.psc) na msm pasta onde vc extraiu o conteúdo do server.
Outra coisa …. SERVIDOR NAO MORDE ! Sinta-se livre para editar os arquivos .proprierties do seu gameserver !!! Apenas lembre de fazer um backup deles antes !
****Todos os NPCs vao estar no meiu de GIRAN. Sinta-se a vontade p. pegar o ID deles (segurar o shift e clicar no npc , usando um personagem GM) e dar um spawn onde vc desejar.
-Agora precisaremos rodar o "startloginserver.bat" (pasta login) e "startgameserver.bat" (pasta gameserver). Lembre seu servidor esta em modo de autocriação de conta, você precisarar ativa o arquivo "startaccountmanager.bat" desta vez.
[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem] Pronto o servidor esta rodando!!! Se vc usar Roteador tera q abrir as portas 7777 (game server), e 2106 (login server).
Segundo passo: Client
Eh preciso ter a versão correspondente a seu cliente.
Usaremos um programa diferente para a edição do seu L2.ini que faz a conexão de você com o servidor. Coloque o programa dentro da pasta system, abra ele, ele ira abrir um texto no bloco de notas procure pela linha em vermelho:
Depois de achado, você coloca o seu IP interno se for jogar em rede ou no mesmo PC. Exemplo para jogar Offline: ServerAddr=127.0.0.1
Para os players você coloca o NO IP (logo a baixo ensina a você criar uma conta no L2.ini. Ex: l2jbrasil.servegame.com
Depois de editado o IP salve o arquivo e feche o bloco de notas normalmente. Pronto No-Ip Editado!
[b]NO-IP
Primeiramente faça seu cadastro no site: [Tens de ter uma conta e sessão iniciada para poderes visualizar este link]
Depois de feito vc irá receber um e-mail para ativação do cadastro.
Com a account pronta :
1- Faça o Login no website 2- Vá em Hosts/Redirects e Clique em Add 3- No campo "Hostname" Digite o nome do seu servidor e logo abaixo escolha o complemento. 4- Clique em Create Host Vá na sessão donwloads , escolha a plataforma q vc está usando e faça o download do SOFTWARE do NO-IP (DUC)
Uma janela irá aparecer perguntando o Login e senha ... Ponha os mesmos q vc cadastrou no site
Feito isso o programa principal irá abrir com o link do seu redirecionamento, marque a caixinha do lado dele (caso ele não fique com a carinha igual a da figura abaixo , desmarque e marque a caixa ateh q fique igual)
[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem] Depois de feito isso , seu No-IP está configurado e pronto para uso ! Note q vc pode fechar a tela principal dele q o mesmo continua rodando (veja figura abaixo)
Agora vc soh tem q colocar no IP EXTERNO da configuraçao do seu server e no L2.ini dos clientes o REDIRECIONAMENTO Q VC CRIOU ! Nesse exemplo seria Nargenserver.servegame.com
Enjoy !!
OBS: Se vc estiver usando roteador, terá q liberar a porta 8245 !
5ª Abra o Lineage executando o arquivo L2.exe na pasta system.
OBS: Para fazer um char GM, primeiro crie um novo personagem e esteja certo q o char nao estao logado (Apenas abra o jogo e digite algum Login e Senha porque sera criado automaticamente, e crie um novo char).
- Abre o navicat , clique em localhost e entao na database l2jdb. Algumas tabelas vao aparecer no lado direito. Abra a tabela characters clicando 2x nela. Procure pela LINHA do seu personagem e depois ache a coluna ACCESS LEVEL dele. Mude o valor 0 (zero) pra 100 (cem), feche e logue o personagem ! Pronto !
Depois de criado seu servidor registre no nosso TOP
[url="http://top.l2jbrasil.com"]TOP[/url]
Creditos: Kelvin - [Tens de ter uma conta e sessão iniciada para poderes visualizar este link] Todos os direitos reservados.
~
Proibida a reprodução mesmo que em partes desse tutorial sem a publicação dos devidos créditos de criação [url="http://www.ufmg.br/prpq/LegPICT&IT.html"] Garantido pela Constituição da República Federativa do Brasil, de 05 de outubro de 1988 Portaria MCT n° 88, de 23/04/98 Propriedade Intelectual[/url]