-
Posts
702 -
Joined
-
Last visited
-
Days Won
5
Reputation Activity
-
BananaFight got a reaction from dalvorsn in [TFS 1.2] Navegar pelo Mapa - Map Scroll
Foi exatamente isso que eu disse, tem que criar um mapa de background para o atual, assim ele não revela coisas que o player não deveria ter visão, mas arrastando a câmera, mostraria oq tem ali.
E sobre a parte dos blocos pretos, acho que só nas versões mais novas que ele atualiza por blocos, nas versões mais antigas ( Que eu lembre 8.6 ) ele só carrega e deixa na memoria oque foi carregado, ai no caso o preto fica com o mapa em si, só que não da de ver oque esta acontecendo.
-
BananaFight reacted to dalvorsn in [TFS 1.2] Navegar pelo Mapa - Map Scroll
Isso da pra ser feito enviando o map descriptions e spectators, o problema é a demanda de banda que isso vai gastar
quanto ao mapa livre, na minha opnião o melhor a ser feito é um conversor de otbm para otmm, dai teria uma preview leve e de facil acesso do mapa, configurava pra dar load nos dois maps no minimap, o 'base' por baixo e o descoberto por cima
Só tem um dificuldade nisso, e que o otclient salva por blocos, entao dependendo de como for tu nao visualizou uma parte do bloco, dai ele salvaria o preto em cima do base '-'
edit:
Isso é pro minimap, pro mapa do jogo é so enviando mesmo os packets
-
BananaFight reacted to Administrador in Que viadagem é essa?
Tópico movido para lixeira, qualquer dúvida entre em contato com qualquer membro da equipe.
-
BananaFight got a reaction from Administrador in Lula Game - Ajude Lula a fugir do Sergio Moro!
Detectei que algumas vezes o spawn dos enemys estão saindo no lugar errado, vou resolver isso o mais rápido possível.
-
BananaFight got a reaction from Administrador in Lula Game - Ajude Lula a fugir do Sergio Moro!
Melhorei um pouco a Engine do jogo, suavizei o pulo, e arrumei algumas coisas nele, agora você consegue pular sobre o Sérgio Mouro com apenas um pulo, fiz uma atualização nos gráficos também para deixar mais parecido com o jogo do Mario.
http://lulagame.esy.es/
Gostei das Idéias sugeridas, e vou trabalhar para implementar algumas assim que possível.
Atualização
- Adicionado sistema de vidas
- Adicionado aumento na velocidade do boneco, e no spawn de monstros a cada 10 pontos marcados.
-
BananaFight got a reaction from SamueLGuedes in Lula Game - Ajude Lula a fugir do Sergio Moro!
Fala pessoal, hoje eu vim trazer um joguinho que montei em homenagem ao nosso amado Lulinha.
Versão 2.0
Agora tem o japonês da federal, sons, compatibilidade com mais navegadores, sistemas de medalha
http://lulagame2.esy.es/
Versão 1.0
- Adicionado sistema de vidas
- Adicionado aumento na velocidade do boneco, e no spawn de monstros a cada 10 pontos marcados.
http://lulagame.esy.es/
Versões Anteriores
Quem quiser jogar e deixar o feedback, fiquem a vontade.
-
BananaFight got a reaction from Skulls in [OTC]Callbacks dos Modules
Se você tem a source do OTC e Server, é só usar o código que ja existe hoje ( EXTENDED Opcode ), uma cosia que causa muita confusão quando se vai usar o opcode para passar informações adicionais no server / client, é enviar um extended opcode, e tentar receber um opcode normal, você precisa ver se não esta fazendo isso. enviando 1 tipo e recebendo outro...
Se você instalou o extended opcode no servidor certo ele vai funcionar sem problemas.
Minha primeira sugestão é essa, tentar usar os extendeds opcodes, caso isso não resolva seu problema, ai precisaria buscar uma pessoa com conhecimentos sólidos em C++ para criar uma ponte usando os protocolos que existem no server / client para passar informações.
Agora caso você não tem a source do servidor, o jeito mais simples seria usar as mensagens de sendCancel concatenadas com um identificador que faz o client esconder elas, como o dalvorsn mostrou no exemplo.
Por exemplo, você cria uma chave de identificação "%inf%" e usa ela para executar suas ações especificas para cara key, e ao invés de mostrar ela para o player, você esconde.
-
BananaFight got a reaction from Administrador in [Arquivado]Quem é você, player? Ganhe 05 REP + Conquista!
Eu respondi as perguntas mas não vi campo para botar nick...
-
BananaFight got a reaction from Luga03 in [c++] Mudando as cores
Hoje vou ensinar como mudar a cor do nome dos npc.
Instalação
Vá no diretório
\src\client\game.cpp
e procure por
if(version >= 840) {enableFeature(Otc::GameProtocolChecksum);enableFeature(Otc::GameChallengeOnLogin);enableFeature(Otc::GameAccountNames);}
e deixe assim:
if(version >= 840) {enableFeature(Otc::GameProtocolChecksum);enableFeature(Otc::GameChallengeOnLogin);enableFeature(Otc::GameAccountNames);enableFeature(Otc::GameBlueNpcNameColor);}
Agora só compilar o OtClient e pronto
-
BananaFight got a reaction from VanderleyJun in [C++] Color Name [DigiWo]
Creature.cpp procure por:
if(healthPercent > 92)
Embaixo você muda para:
if (m_name == "Banana Fight"){ m_informationColor = Color(0xB2, 0x22, 0x22); }else{ m_informationColor = Color(0x00, 0xBC, 0x00); }
Adicionando Nomes:
Isto representa o nome do monstro/player que terá a cor do nome alterada. (Sim, vai ter que cadastrar nome por nome nesse sistema.)
if (m_name == "Banana Fight")
Para adicionar mais nomes é só seguindo a logica:
if (m_name == "Banana Fight"){ m_informationColor = Color(0xB2, 0x22, 0x22); }else if (m_name == "Demon"){ m_informationColor = Color(0xFF, 0xFF, 0xFF); }else{ m_informationColor = Color(0x00, 0xBC, 0x00); }
E para colorir o resto das porcentagens a mesma coisa:
else if(healthPercent > 60) if (m_name == "Banana Fight"){ m_informationColor = Color(0xB2, 0x22, 0x22); }else{ m_informationColor = Color(0x50, 0xA1, 0x50);}
Só recomendo que não mecha no ultimo, pois se não souber mexer pode dar erro.
else m_informationColor = Color(0x85, 0x0C, 0x0C);
Adicionando Cores:
Isto representa a porcentagem de hp que o player ou monstro vai estar
m_informationColor = Color(0x00, 0xBC, 0x00);
Para mudar a cor você edita aqui :
Color(0x00, 0xBC, 0x00)
As cores funcionam da seguinte maneira (RGB), tabela: http://shibolete.tripod.com/RGB.html
Você tem que pegar a cor hexadecimal e dividir em 3 partes (#FFFF00 > FF FF 00), ai é só você preencher, Color(0xFF, 0xFF, 0x00) com cada letra/numero.
Exemplo Final:
void Creature::setHealthPercent(uint8 healthPercent){ if(healthPercent > 92) if (m_name == "Banana Fight"){ m_informationColor = Color(0xB2, 0x22, 0x22); }else{ m_informationColor = Color(0x00, 0xBC, 0x00); } else if(healthPercent > 60) if (m_name == "Banana Fight"){ m_informationColor = Color(0xB2, 0x22, 0x22); }else{ m_informationColor = Color(0x50, 0xA1, 0x50); } else if(healthPercent > 30) if (m_name == "Banana Fight"){ m_informationColor = Color(0xB2, 0x22, 0x22); }else{ m_informationColor = Color(0xA1, 0xA1, 0x00); } else if(healthPercent > 8) if (m_name == "Banana Fight"){ m_informationColor = Color(0xB2, 0x22, 0x22); }else{ m_informationColor = Color(0xBF, 0x0A, 0x0A); } else if(healthPercent > 3) if (m_name == "Banana Fight"){ m_informationColor = Color(0xB2, 0x22, 0x22); }else{ m_informationColor = Color(0x91, 0x0F, 0x0F); } else m_informationColor = Color(0x85, 0x0C, 0x0C); m_healthPercent = healthPercent; callLuaField("onHealthPercentChange", healthPercent); if(healthPercent <= 0) onDeath();}
Tópico corrigido por: Stigal.
-
BananaFight got a reaction from Luga03 in Function onGainExp(cid, value)
Function onGainExp(cid, value)
Criador: knightxd Descrição:
Esta função é ativada quando uma criatura ganha EXP.
E você pode retornar falso (return false) para que está criatura não ganhe EXP.
Instalação:
Creatureevent.h
procure por :
CREATURE_EVENT_OUTFIT, e adicione embaixo :
CREATURE_EVENT_GAINEXP, Novamente, Procure por
uint32_t executeOutfit(Creature* creature, const Outfit_t& old, const Outfit_t& current); e adicione embaixo:
uint32_t executeGainExp(Player* player, int32_t value); Agora, Abra creatureevent.cpp e Procure por :
else if(tmpStr == "outfit") m_type = CREATURE_EVENT_OUTFIT; e adicione embaixo:
else if(tmpStr == "gainexp") m_type = CREATURE_EVENT_GAINEXP; Procure por:
case CREATURE_EVENT_OUTFIT: return "onOutfit"; e adicione embaixo:
case CREATURE_EVENT_GAINEXP: return "onGainExp"; Agora, Procure por:
case CREATURE_EVENT_OUTFIT: return "cid, old, current";~ e adicione embaixo:
case CREATURE_EVENT_GAINEXP: return "cid, value"; Agora, Procure por:
std::cout << "[Error - CreatureEvent::executeStatsChange] Call stack overflow." << std::endl; return 0; } } embaixo adicione:
uint32_t CreatureEvent::executeGainExp(Player* player, int32_t value) { //onGainExp(cid, value) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local value = " << value << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEvent(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushnumber(L, value); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeGainExp] Call stack overflow." << std::endl; return 0; } } Agora em Player.cpp procure por
bool Player::gainExperience(double& gainExp
e embaixo adicione:
if(gainExp >= 1) { bool deny = false; CreatureEventList gainExpEvents = this->getCreatureEvents(CREATURE_EVENT_GAINEXP); for(CreatureEventList::iterator it = gainExpEvents.begin(); it != gainExpEvents.end(); ++it) { if(!(*it)->executeGainExp(this, gainExp)) deny = true; } if(deny) return false; }
Exemplo de uso:
function onGainExp(cid, value) print(value) end Não esqueça de registrar o evento no onlogin
Considerações finais: Sim eu sei que já existe um sistema igual no xtibia, porem ele esta errado, este funciona em qualquer source.
Desculpem pessoal, mais o xtibia tinha cortado um pedaço do tutorial, e ele estava incompleto, Agora ja foi corrigido.
-
-
BananaFight got a reaction from Aberos in LoL - Skins Misteriosas
Comprei uns presentes e mandei pra minha outra conta:
Sorte ? 2 Skin Limitadas xD
-
BananaFight got a reaction from Night Wolf in Desafio do mês. #02
Pelo que entendi é um script que adiciona o player em uma posição + monstros baseada na quantidade de "salas" disponíveis,
Ou seja, seria como um teleportador de players para trainers, ele vai pegar a quantidade total de salas disponíveis, e vai tentar 1 a 1 usando os cálculos do código, vai contar o tempo configurado no sistema, e depois vai adicionar os monstros.
- Posição da primeira sala
local position = {x = 160, y = 154, z = 7} -- posição do que?
- Começa a verificar cada sala a partir da quantidade de vezes que executou a recursividade, caso encontre uma sala disponível, teleporta o player para ela, e inicia a contagem de tempo e criar os monstros
function fazQualquerCoisa(cid, pos, i, j) -- recursao caudal
j = j or 0
p = i or 0
if p >= config.rX then
p = 0
j = j < config.rY -1 and j + 1 or false
end
if j then
posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
if check_disponivel(posi) then
doTeleportThing(cid, posi)
countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} )
else
fazQualquerCoisa(cid, pos, p + 1, j)
end
end
end
Verifica a disponibilidade da sala em questão, para saber se já esta ocupada ou não.
function check_disponivel(npos)
if disponivel(npos) then
return true
end
return false
end
Começa a contagem regressiva de ( 5 até 0 ), quando chegar no numero ( 0 Visual no jogo, e 5 no código ), ele cria o monstro verificando se a sala esta ocupada ( para saber se o player ainda esta nela provavelmente )
-
BananaFight got a reaction from Gokussj5 in (Duvida) OtClient
pra tirar port ip é aqui
> otclient\modules\client_entergame\entergame.lua
embaixo de :
if g_app.isRunning() and not g_game.isOnline() then enterGame:show() end
Adc isso:
EnterGame.setUniqueServer(hostName, port, protocolVersion, windowWidth, windowHeight) EnterGame.setUniqueServer('127.0.0.1', 7171, 862, 270, 210)
-
BananaFight got a reaction from TkZeCo in OtClient - Tutorial Básico #1
OtClient - Tutorial Básico #1
Aula 1 : Editando mod/Modules
Bom galera, hoje eu vou ensinar vocês a como editar mod/Modules, e também como posiciona-los na janela.
OBS: Quando eu falar Janela, estou me referindo aos objetos: MainWindow, Botton etc
Passo 1 entendendo os arquivos
Dentro da maioria das pasta no OtClient existirão 3 arquivos com as seguintes extensões:
.lua.otmod.otui
Cada uma dessas extensões executam um papel EXTREMAMENTE importante dentro do mod/module que você pretende criar, Mais será explicado mais para a frente, Nessa aula vamos mexer apenas no arquivo ".otui".
Passo 2 Indentação
Uma das coisas mais importante dentro dos arquivos ".otui" é a indentação, pois se você errar um espaçamento qualquer você pode estar 'bugando' todo o funcionamento da sua mod/module.
Vou ensinar a vocês o modo certo de indentar seus códigos para que não tenham erros.
MainWindowid: tutorialWindowsize: 80 80&save: true
Dentro dos arquivos '.otui' só é permitido a indentação com a tecla "Espaço", Caso você tente usar "Tab" para indentar seu código ele vai dar erro e não irá funcionar. A indentação deve ser feita com apenas 2 espaços, e sempre seguindo a ordem do item que você ta criando.
Exemplo:
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Como o Botão 'Button1' vai ficar dentro da janela ' tutorialWindow', ele tem que ficar a uma distancia de 2 espaços da janela 'MainWindow', Caso eu quebre esse espaçamento provavelmente poderei ter bugs na hora de abrir esse mod/module dentro do client. Outra coisa para tomar cuidado é quando for dar linha para adicionar outra janela, nessa linha em que separa uma janela não pode conter nem um espaço e nenhum comando.
Exemplo:
Certo
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Errado
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Vocês não conseguem ver a diferença, mais tente selecionar os dois códigos que vão entender melhor, o que eu falei.
Agora a organização e edição de cada janela dentro do arquivo '.otui' deve seguir o mesmo principio de 2 espaços de distancia.
Exemplo:
Certo
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Errado
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
E também esta Errado desta forma
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Como o botão vai aparecer dentro da janela 'MainWindow' ele tem que ficar a 2 espaçamento dela pois se eu deixar os 2 na mesma posição é como se eu estivesse dizendo ao script que são duas janelas separadas e o botton vai aparecer por conta própria quando eu executar o mod/module.
Passo 3 conhecendo as janelas
Existem diversos modos de se criar uma janela onde vai aparecer vários botoes textos e etc, Mais sempre vai ter uma janela que será a matriz de todos, onde todos deverão aparecer, que no nosso exemplo é :
MainWindowid: tutorialWindowsize: 80 80&save: true
Esse código é nossa janela principal, É nela que vai aparecer tudo que queremos mostrar com no script, Agora vou mostrar o que cada função que tem dentro de MainWindow faz.
MainWindowid: esse é o ID do MainWindow, Supondo que tenham 2 MainWindow, é com esse id que vamos diferencia-lassize: aqui é onde configuramos a largura e altura da janela, nessesariamente nessa ordem&save: isso fica para as próximas aulas
Não precisamos usar necessariamente size para mostrar o tamanho ou largura da janela, podemos utilizar por exemplo :
width: 80height: 80
Esses 2 códigos podem ser utilizados no lugar de size e farão exatamente a mesma coisa.
Caso você tenha editado ou criado algum mod/modules para testar esses códigos que mostrei acima, percebeu que na janela não aparece nome e nem nada do gênero e é isso que irei mostrar agora.
!text: tr('Texto') - Essa função adiciona o texto na janela em que você adicionar esta linhaicon: img.png - Esta função pega a sua imagem e usa ela de icone para a janela ( neste caso a imagem tem que estar na mesma pasta que o arquivo '.otui', e isso só irá funcionar dependendo do tipo da janela matriz, veremos em outros tutoriais.)
Com esses dois Código você consegue personalizar a janela onde irão aparecer os botoes, textos etc que você pretende fazer.
Exemplo:
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: true
Agora vamos começar a criar botoes, escrever textos e etc.
Vamos começar adicionando uma Label que vai mostrar o texto 'Olá Xtibia'.
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftmargin-top: 5margin-left: 5
Como vocês podem ver apareceram algumas funções novas, que são elas :
anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightanchors.bottom: parent.bottomanchors.top: prev.topanchors.left: prev.leftanchors.right: prev.rightanchors.bottom: prev.bottommargin-top: 5margin-left: 5margin-right: 5margin-bottom: 5
Com essas funões nós determinamos onde cada item da nossa janela vai ficar.
Entendendo as novas funções
anchors.top: parent.top
Com a linha 'anchors.top:' estamos dizendo que a posição do meu item vai ser definida para cima, agora adicionando 'parent.top' estamos dizendo que a posição do meu item deve se Colada com começo da Janela, e isso segue para left, right, bottom também.
agora se no lugar de 'parent.top' eu usar 'prev.top' eu estou dizendo que meu item vai ficar colado com a parte de cima do item que tem encima, Confuso eu sei mais vou dar um exemplo:
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.left
Ali no script acima eu estou mandando a Label1 ficar colada com a borda de cima da janela principal, e a esquerda, Já na Label2, eu estou mando ela ficar colada com a Label1 ( pois a label1 que esta encima ) e também ficar colada com a borda da janela principal.
Isso se aplica a todos os lados, se eu usar prev.left, eu vou estar dizendo que a label2 tem que ficar exatamente do lado esquerdo da label1.
As funções 'margin-top: 5' vão fazer com que meu item fique com a distancia de 5 pixel ( Não tenho certeza se são pixels ) do item que esta acima
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5
Nesse Exemplo eu fiz a label2 ficar a 5 pixel abaixo da Label1, e isso é a mesma coisa se eu ultilizar left, right, bottom eu vou pegar uma distancia do que estiver do lado do meu item ou embaixo etc.
Mais agora nós não precisamos nos prender a ficar somente com parent, e prev na hora de criar um item. podemos utilizar o id de um item como referencia de onde deve ficar meu item, como no exemplo :
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: parent.topanchors.left: Label1.left
Nesse Exemplo eu fiz com que a Label3 ficasse a esquerda da Label1, e grudada a margem da janela principal, mais eu também poderia fazer ela ficar embaixo da Label1, e grudada ao lado direito da margem da janela principal.
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.topanchors.right: parent.right
Mais caso você for testar isso vai perceber que o Label2 vai ficar encima do Label1 e ao invés do Label3 ficar embaixo do Label1 ele vai ficar do lado, Para corrigir esses pequenos erros você pode juntar códigos como no exemplo :
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.bottomanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.bottomanchors.right: parent.right
Pelo Simples fato de eu ter trocado top por bottom agora o script sabe que a Label2 tem que ficar no fim da Label1 e o mesmo para a Label3, e por isso usamos margin, para deixa uma distancia entre cada item, e para ficar mais organizado.
Bom acho que é isso, Caso eu lembre de algo relevante estarei editando e adicionando mais coisas, Espero que gostem e quais quer DUVIDAS relacionadas AO TÓPICO é só fazer um comentário aqui embaixo que estarei respondendo.
@Edit, Infelizmente o Xtibia Quebrou a indentação, mais lembre-se é sempre 2 espaços.
-
BananaFight got a reaction from Ryukiimaru in OtClient - Tutorial Básico #1
OtClient - Tutorial Básico #1
Aula 1 : Editando mod/Modules
Bom galera, hoje eu vou ensinar vocês a como editar mod/Modules, e também como posiciona-los na janela.
OBS: Quando eu falar Janela, estou me referindo aos objetos: MainWindow, Botton etc
Passo 1 entendendo os arquivos
Dentro da maioria das pasta no OtClient existirão 3 arquivos com as seguintes extensões:
.lua.otmod.otui
Cada uma dessas extensões executam um papel EXTREMAMENTE importante dentro do mod/module que você pretende criar, Mais será explicado mais para a frente, Nessa aula vamos mexer apenas no arquivo ".otui".
Passo 2 Indentação
Uma das coisas mais importante dentro dos arquivos ".otui" é a indentação, pois se você errar um espaçamento qualquer você pode estar 'bugando' todo o funcionamento da sua mod/module.
Vou ensinar a vocês o modo certo de indentar seus códigos para que não tenham erros.
MainWindowid: tutorialWindowsize: 80 80&save: true
Dentro dos arquivos '.otui' só é permitido a indentação com a tecla "Espaço", Caso você tente usar "Tab" para indentar seu código ele vai dar erro e não irá funcionar. A indentação deve ser feita com apenas 2 espaços, e sempre seguindo a ordem do item que você ta criando.
Exemplo:
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Como o Botão 'Button1' vai ficar dentro da janela ' tutorialWindow', ele tem que ficar a uma distancia de 2 espaços da janela 'MainWindow', Caso eu quebre esse espaçamento provavelmente poderei ter bugs na hora de abrir esse mod/module dentro do client. Outra coisa para tomar cuidado é quando for dar linha para adicionar outra janela, nessa linha em que separa uma janela não pode conter nem um espaço e nenhum comando.
Exemplo:
Certo
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Errado
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Vocês não conseguem ver a diferença, mais tente selecionar os dois códigos que vão entender melhor, o que eu falei.
Agora a organização e edição de cada janela dentro do arquivo '.otui' deve seguir o mesmo principio de 2 espaços de distancia.
Exemplo:
Certo
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Errado
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
E também esta Errado desta forma
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Como o botão vai aparecer dentro da janela 'MainWindow' ele tem que ficar a 2 espaçamento dela pois se eu deixar os 2 na mesma posição é como se eu estivesse dizendo ao script que são duas janelas separadas e o botton vai aparecer por conta própria quando eu executar o mod/module.
Passo 3 conhecendo as janelas
Existem diversos modos de se criar uma janela onde vai aparecer vários botoes textos e etc, Mais sempre vai ter uma janela que será a matriz de todos, onde todos deverão aparecer, que no nosso exemplo é :
MainWindowid: tutorialWindowsize: 80 80&save: true
Esse código é nossa janela principal, É nela que vai aparecer tudo que queremos mostrar com no script, Agora vou mostrar o que cada função que tem dentro de MainWindow faz.
MainWindowid: esse é o ID do MainWindow, Supondo que tenham 2 MainWindow, é com esse id que vamos diferencia-lassize: aqui é onde configuramos a largura e altura da janela, nessesariamente nessa ordem&save: isso fica para as próximas aulas
Não precisamos usar necessariamente size para mostrar o tamanho ou largura da janela, podemos utilizar por exemplo :
width: 80height: 80
Esses 2 códigos podem ser utilizados no lugar de size e farão exatamente a mesma coisa.
Caso você tenha editado ou criado algum mod/modules para testar esses códigos que mostrei acima, percebeu que na janela não aparece nome e nem nada do gênero e é isso que irei mostrar agora.
!text: tr('Texto') - Essa função adiciona o texto na janela em que você adicionar esta linhaicon: img.png - Esta função pega a sua imagem e usa ela de icone para a janela ( neste caso a imagem tem que estar na mesma pasta que o arquivo '.otui', e isso só irá funcionar dependendo do tipo da janela matriz, veremos em outros tutoriais.)
Com esses dois Código você consegue personalizar a janela onde irão aparecer os botoes, textos etc que você pretende fazer.
Exemplo:
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: true
Agora vamos começar a criar botoes, escrever textos e etc.
Vamos começar adicionando uma Label que vai mostrar o texto 'Olá Xtibia'.
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftmargin-top: 5margin-left: 5
Como vocês podem ver apareceram algumas funções novas, que são elas :
anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightanchors.bottom: parent.bottomanchors.top: prev.topanchors.left: prev.leftanchors.right: prev.rightanchors.bottom: prev.bottommargin-top: 5margin-left: 5margin-right: 5margin-bottom: 5
Com essas funões nós determinamos onde cada item da nossa janela vai ficar.
Entendendo as novas funções
anchors.top: parent.top
Com a linha 'anchors.top:' estamos dizendo que a posição do meu item vai ser definida para cima, agora adicionando 'parent.top' estamos dizendo que a posição do meu item deve se Colada com começo da Janela, e isso segue para left, right, bottom também.
agora se no lugar de 'parent.top' eu usar 'prev.top' eu estou dizendo que meu item vai ficar colado com a parte de cima do item que tem encima, Confuso eu sei mais vou dar um exemplo:
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.left
Ali no script acima eu estou mandando a Label1 ficar colada com a borda de cima da janela principal, e a esquerda, Já na Label2, eu estou mando ela ficar colada com a Label1 ( pois a label1 que esta encima ) e também ficar colada com a borda da janela principal.
Isso se aplica a todos os lados, se eu usar prev.left, eu vou estar dizendo que a label2 tem que ficar exatamente do lado esquerdo da label1.
As funções 'margin-top: 5' vão fazer com que meu item fique com a distancia de 5 pixel ( Não tenho certeza se são pixels ) do item que esta acima
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5
Nesse Exemplo eu fiz a label2 ficar a 5 pixel abaixo da Label1, e isso é a mesma coisa se eu ultilizar left, right, bottom eu vou pegar uma distancia do que estiver do lado do meu item ou embaixo etc.
Mais agora nós não precisamos nos prender a ficar somente com parent, e prev na hora de criar um item. podemos utilizar o id de um item como referencia de onde deve ficar meu item, como no exemplo :
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: parent.topanchors.left: Label1.left
Nesse Exemplo eu fiz com que a Label3 ficasse a esquerda da Label1, e grudada a margem da janela principal, mais eu também poderia fazer ela ficar embaixo da Label1, e grudada ao lado direito da margem da janela principal.
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.topanchors.right: parent.right
Mais caso você for testar isso vai perceber que o Label2 vai ficar encima do Label1 e ao invés do Label3 ficar embaixo do Label1 ele vai ficar do lado, Para corrigir esses pequenos erros você pode juntar códigos como no exemplo :
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.bottomanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.bottomanchors.right: parent.right
Pelo Simples fato de eu ter trocado top por bottom agora o script sabe que a Label2 tem que ficar no fim da Label1 e o mesmo para a Label3, e por isso usamos margin, para deixa uma distancia entre cada item, e para ficar mais organizado.
Bom acho que é isso, Caso eu lembre de algo relevante estarei editando e adicionando mais coisas, Espero que gostem e quais quer DUVIDAS relacionadas AO TÓPICO é só fazer um comentário aqui embaixo que estarei respondendo.
@Edit, Infelizmente o Xtibia Quebrou a indentação, mais lembre-se é sempre 2 espaços.
-
BananaFight got a reaction from Ryukiimaru in OtClient - Tutorial Básico #2
OtClient - Tutorial Básico #2
Aula 2: Editando mod/Modules Parte 2
Hoje estarei me especificando mais com as janelas matrizes ou raízes como preferirem.
Passo 1: Conhecendo as matrizes
Irei mostrar 2 matrizes para vocês que são as únicas que vi até agora dentro dos códigos do OtClient (Isso não quer dizer que não possam existir novos modelos)
Modelo 1 : MainWindowModelo 2: MiniWindow
Cada um desses 2 modelos tem um jeito diferente para ler o código.
No Modelo 1, ele é mais simples, Pois você só precisa mostrar a janela que irá ser criada dentro dele, como no exemplo:
MainWindowid: tutorialWindow!text: tr('Tutorial')size: 150 150Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right
Como podem ver é um jeito mais simples e pratico de fazer os códigos, Porem, esse tipo de janela não "Gruda" nos painéis direitos e nem esquerdos.
Já no Modelo 2, as coisas ficam um pouco mais complicadas como por exemplo, o código tem que ser escrito de uma maneira diferente para que funcione corretamente, Mais também tem as suas vantagens, como, botão de fechar e minimizar automático icones ao lado do titulo entre outros, agora vamos ver alguns exemplos:
1° vou dar um exemplo de codigo '.lua', para se usar com a matriz MiniWindow
E agora 1 exemplo de código .otui usando MiniWindow de forma errada
MiniWindowid: tutorialWindow!text: tr('Tutorial')size: 150 120@onClose: onMiniWindowClose()&save: trueButtonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right
E agora 1 exemplo de cósigo .otui usando MiniWindow escrito certo
TutorialButton < Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightMiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150@onClose: onMiniWindowClose()&save: trueMiniWindowContentsTutorialButton
Agora vamos intender o porque dessa forma mais complicada.
1° para que o MiniWindow funcione corretamente ele precisa da função 'MiniWindowContents' dentro dele, dentro dessa função existem duas formas de adicionarmos itens, que são elas:
1°
TutorialButton < Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightMiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150@onClose: onMiniWindowClose()&save: trueMiniWindowContentsTutorialButton
2°
MiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150@onClose: onMiniWindowClose()&save: trueMiniWindowContentsButtonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right
Dos dois modos estão certos, mais é importante lembrar que você também pode usar as duas maneiras juntas como no exemplo:
TutorialButton < Buttonid: tutorialbutton!text: tr('xD')anchors.top: prev.bottomanchors.left: parent.leftanchors.right: parent.rightMiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150@onClose: onMiniWindowClose()&save: trueMiniWindowContentsButtonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightTutorialButton
Você também pode adicionar um icone na MiniWindow, como exemplo:
MiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150icon: /images/topbuttons/skills@onClose: onMiniWindowClose()&save: true
Lembre-se que '/images/topbuttons/' é o diretório onde o ícone tá, e 'skills' é a imagem.
Bom, esse é um tutorial mais básico só para apresentar as 2 Janelas matrizes ( Eu só conheço esses 2 modelos "Main, Mini" e não sei se existem outros.) e ensinar um pouco da diferença e das vantagens entre usar uma e outra.
Passo 2: Adicionando funções aos botoes
Bom até agora eu só mostrei os botoes mais ainda não ensinei a fazer eles executarem outra funções, e é isso que eu estarei ensinando agora.
Existem diversas formas de um botão executar uma função, Você pode criar essa função no arquivo.lua caso ela seja mais complexa ou pode fazer elas direto no arquivo.otui.
Tenha em mente, que não irei ensinar a criar funções, só estarei ensinando a como fazer um botão executar ela.
Vamos pegar nosso botão
Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right
Aqui nesse exemplo, o botão é criado mais não tem nem uma função pre definida, ou seja, mesmo que clicando nele nada irá acontecer.
Agora vamos fazer uma função dento do arquivo.lua para que o botão execute
function sendBottom()return g_game.talk('Nossa Funcionou')end
Quando a função sendBottom for executada o jogador vai falar "Nossa Funcionou"
Agora vamos fazer o botão executar ela usando esta função
@onClick:
a função onClick vai ser executada quando alguém clicar no nosso botão, Agora vamos adicionar ela no nosso botão e adicionar o parâmetro que ela deve executar.
Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right@onClick: sendBottom()
Pronto agora nosso botão vai executar o que lhe foi programado, Porem por ele executar uma função simples podemos simplificar ainda mais o que nosso botão deve fazer deixando assim:
Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right@onClick: g_game.talk('Nossa Funcionou')
Ele irá fazer a mesma coisa que a função sendBottom() porem não precisamos criar nada dentro do arquivo.lua
-
BananaFight got a reaction from Arbams02 in OtClient - Tutorial Básico #3
Chegamos a parte 3 do tutorial, essa parte aprenderemos a como usar algumas ferramentar que o otclient nos oferece.
Combo Box
Combo Box pode ser muito útil quando bem usado.
ComboBox id: tutoriial anchors.left: parent.left anchors.top: parent.top margin-top: 5 width: 75 options: - Option1 - Option2
Combo Box, são simples de manusear, você pode adicionar diversas opções facilmente, e pode checar qual foi selecionada facilmente.
Adicionando novas opções
ComboBox id: tutoriial anchors.left: parent.left anchors.top: parent.top margin-top: 5 width: 75
Para adicionar novas opções é bem simples, basta você criar um novo parametro dentro da combobox
options:
E dentro dele adicionar as opções
options: - Option1 - Option2
E assim consecutivamente com todas as opções que quiser.
Checando a opção escolhida
Existe dois modos de pegar a opção que foi selecionada pelo usuário
1° - .Lua
Você pode facilmente pegar a opção selecionada com 1 linha de código em lua
:getChildById('id'):getText()
com esse código você consegue retornar qual opção foi selecionada pelo usuário.
2º - .Otui
Você adiciona o novo parâmetro "@onCheckChange" no ComboBox, e adiciona a função que ele vai executar.
@onCheckChange: self:isChecked()
Claro que você vai ter que criar uma função em lua para que o parâmetro criado saiba pra onde ele deve enviar o que foi programado
Exemplo:
Função .lua
function getComboBoxText(param) return param end
Função .otui
@onCheckChange: getComboBoxText(self:isChecked())
TextEdit
Text Edit é muito fácil de manusear, e pode ser bastante útil para alguns sistemas.
Exemplo de uso:
TextEdit id: Tutorial anchors.left: parent.left anchors.right: parent.right anchors.top: parent.bottom margin-top: 5
E agora a função em .lua, para retornar o que esta escrito é
:getChildById('id'):getText()
Sim, é simplesmente isso.
-
BananaFight got a reaction from Arbams02 in OtClient - Tutorial Básico #1
OtClient - Tutorial Básico #1
Aula 1 : Editando mod/Modules
Bom galera, hoje eu vou ensinar vocês a como editar mod/Modules, e também como posiciona-los na janela.
OBS: Quando eu falar Janela, estou me referindo aos objetos: MainWindow, Botton etc
Passo 1 entendendo os arquivos
Dentro da maioria das pasta no OtClient existirão 3 arquivos com as seguintes extensões:
.lua.otmod.otui
Cada uma dessas extensões executam um papel EXTREMAMENTE importante dentro do mod/module que você pretende criar, Mais será explicado mais para a frente, Nessa aula vamos mexer apenas no arquivo ".otui".
Passo 2 Indentação
Uma das coisas mais importante dentro dos arquivos ".otui" é a indentação, pois se você errar um espaçamento qualquer você pode estar 'bugando' todo o funcionamento da sua mod/module.
Vou ensinar a vocês o modo certo de indentar seus códigos para que não tenham erros.
MainWindowid: tutorialWindowsize: 80 80&save: true
Dentro dos arquivos '.otui' só é permitido a indentação com a tecla "Espaço", Caso você tente usar "Tab" para indentar seu código ele vai dar erro e não irá funcionar. A indentação deve ser feita com apenas 2 espaços, e sempre seguindo a ordem do item que você ta criando.
Exemplo:
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Como o Botão 'Button1' vai ficar dentro da janela ' tutorialWindow', ele tem que ficar a uma distancia de 2 espaços da janela 'MainWindow', Caso eu quebre esse espaçamento provavelmente poderei ter bugs na hora de abrir esse mod/module dentro do client. Outra coisa para tomar cuidado é quando for dar linha para adicionar outra janela, nessa linha em que separa uma janela não pode conter nem um espaço e nenhum comando.
Exemplo:
Certo
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Errado
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Vocês não conseguem ver a diferença, mais tente selecionar os dois códigos que vão entender melhor, o que eu falei.
Agora a organização e edição de cada janela dentro do arquivo '.otui' deve seguir o mesmo principio de 2 espaços de distancia.
Exemplo:
Certo
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Errado
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
E também esta Errado desta forma
MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5
Como o botão vai aparecer dentro da janela 'MainWindow' ele tem que ficar a 2 espaçamento dela pois se eu deixar os 2 na mesma posição é como se eu estivesse dizendo ao script que são duas janelas separadas e o botton vai aparecer por conta própria quando eu executar o mod/module.
Passo 3 conhecendo as janelas
Existem diversos modos de se criar uma janela onde vai aparecer vários botoes textos e etc, Mais sempre vai ter uma janela que será a matriz de todos, onde todos deverão aparecer, que no nosso exemplo é :
MainWindowid: tutorialWindowsize: 80 80&save: true
Esse código é nossa janela principal, É nela que vai aparecer tudo que queremos mostrar com no script, Agora vou mostrar o que cada função que tem dentro de MainWindow faz.
MainWindowid: esse é o ID do MainWindow, Supondo que tenham 2 MainWindow, é com esse id que vamos diferencia-lassize: aqui é onde configuramos a largura e altura da janela, nessesariamente nessa ordem&save: isso fica para as próximas aulas
Não precisamos usar necessariamente size para mostrar o tamanho ou largura da janela, podemos utilizar por exemplo :
width: 80height: 80
Esses 2 códigos podem ser utilizados no lugar de size e farão exatamente a mesma coisa.
Caso você tenha editado ou criado algum mod/modules para testar esses códigos que mostrei acima, percebeu que na janela não aparece nome e nem nada do gênero e é isso que irei mostrar agora.
!text: tr('Texto') - Essa função adiciona o texto na janela em que você adicionar esta linhaicon: img.png - Esta função pega a sua imagem e usa ela de icone para a janela ( neste caso a imagem tem que estar na mesma pasta que o arquivo '.otui', e isso só irá funcionar dependendo do tipo da janela matriz, veremos em outros tutoriais.)
Com esses dois Código você consegue personalizar a janela onde irão aparecer os botoes, textos etc que você pretende fazer.
Exemplo:
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: true
Agora vamos começar a criar botoes, escrever textos e etc.
Vamos começar adicionando uma Label que vai mostrar o texto 'Olá Xtibia'.
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftmargin-top: 5margin-left: 5
Como vocês podem ver apareceram algumas funções novas, que são elas :
anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightanchors.bottom: parent.bottomanchors.top: prev.topanchors.left: prev.leftanchors.right: prev.rightanchors.bottom: prev.bottommargin-top: 5margin-left: 5margin-right: 5margin-bottom: 5
Com essas funões nós determinamos onde cada item da nossa janela vai ficar.
Entendendo as novas funções
anchors.top: parent.top
Com a linha 'anchors.top:' estamos dizendo que a posição do meu item vai ser definida para cima, agora adicionando 'parent.top' estamos dizendo que a posição do meu item deve se Colada com começo da Janela, e isso segue para left, right, bottom também.
agora se no lugar de 'parent.top' eu usar 'prev.top' eu estou dizendo que meu item vai ficar colado com a parte de cima do item que tem encima, Confuso eu sei mais vou dar um exemplo:
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.left
Ali no script acima eu estou mandando a Label1 ficar colada com a borda de cima da janela principal, e a esquerda, Já na Label2, eu estou mando ela ficar colada com a Label1 ( pois a label1 que esta encima ) e também ficar colada com a borda da janela principal.
Isso se aplica a todos os lados, se eu usar prev.left, eu vou estar dizendo que a label2 tem que ficar exatamente do lado esquerdo da label1.
As funções 'margin-top: 5' vão fazer com que meu item fique com a distancia de 5 pixel ( Não tenho certeza se são pixels ) do item que esta acima
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5
Nesse Exemplo eu fiz a label2 ficar a 5 pixel abaixo da Label1, e isso é a mesma coisa se eu ultilizar left, right, bottom eu vou pegar uma distancia do que estiver do lado do meu item ou embaixo etc.
Mais agora nós não precisamos nos prender a ficar somente com parent, e prev na hora de criar um item. podemos utilizar o id de um item como referencia de onde deve ficar meu item, como no exemplo :
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: parent.topanchors.left: Label1.left
Nesse Exemplo eu fiz com que a Label3 ficasse a esquerda da Label1, e grudada a margem da janela principal, mais eu também poderia fazer ela ficar embaixo da Label1, e grudada ao lado direito da margem da janela principal.
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.topanchors.right: parent.right
Mais caso você for testar isso vai perceber que o Label2 vai ficar encima do Label1 e ao invés do Label3 ficar embaixo do Label1 ele vai ficar do lado, Para corrigir esses pequenos erros você pode juntar códigos como no exemplo :
MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.bottomanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.bottomanchors.right: parent.right
Pelo Simples fato de eu ter trocado top por bottom agora o script sabe que a Label2 tem que ficar no fim da Label1 e o mesmo para a Label3, e por isso usamos margin, para deixa uma distancia entre cada item, e para ficar mais organizado.
Bom acho que é isso, Caso eu lembre de algo relevante estarei editando e adicionando mais coisas, Espero que gostem e quais quer DUVIDAS relacionadas AO TÓPICO é só fazer um comentário aqui embaixo que estarei respondendo.
@Edit, Infelizmente o Xtibia Quebrou a indentação, mais lembre-se é sempre 2 espaços.
-
BananaFight reacted to Insaend in Spriting Insaend
--- Apagado pelo Usuário ---
---------------------------------
Não tenho Muito ritimo Mais Faço UMAs Coisinhas AINDA UHASUASu.
-
BananaFight got a reaction from dyego2008 in Como criar uma barra de spell [Poketibia]
Praticidade vs pong. Evitem esse tipo de coisa no otclient. Passe apenas o necessário por opcode e send cancel, é burrice e coisa de porco fazer isso que vocês sugeriram.
Muito mais pratico fazer do meu modo pelo simples fato de que se alguém quiser mudar algo, não influencia nada no servidor, apenas vai bugar seu próprio client.
NÃO ENTENDAM ERRADO, Não estou chamando vocês de porcos e nem de mandriões, só estou dizendo que vocês estão optando pelo pior modo de fazer isso.
-
BananaFight got a reaction from dyego2008 in Como criar uma barra de spell [Poketibia]
Um pouco mais chato porem nada de muito dificil Slicer.
table = { ["Bulbasaur"] = { m1 = {imagem = "x", time = 100, nome = "Attack"}, } } name = "Bulbasaur" for i = 1, 12 do if i == 1 then if table[name].m1 then print( table[name].m1.nome ) else break end end end -
BananaFight got a reaction from Eskylo in [C++] Opcode versão 8.54+
Adaptação pra source 8.54+
LEMBRE-SE, ISSO É NA SOURCE DO SERVIDOR
Vamos ao código.
protocolgame.h
Embaixo de
void AddShopItem(NetworkMessage_ptr msg, const ShopInfo item);
Adicione
void parseExtendedOpcode(NetworkMessage& msg);void sendExtendedOpcode(uint8_t opcode, const std::string& buffer);
protocolgame.cpp
Embaixo de
uint32_t key[4] = {msg.GetU32(), msg.GetU32(), msg.GetU32(), msg.GetU32()};enableXTEAEncryption();setXTEAKey(key);
Adicione
// notifies to otclient that this server can receive extended game protocol opcodesif(operatingSystem >= CLIENTOS_OTCLIENT_LINUX)sendExtendedOpcode(0x00, std::string());
Embaixo de
void ProtocolGame::AddShopItem(NetworkMessage_ptr msg, const ShopInfo item){const ItemType& it = Item::items[item.itemId];msg->AddU16(it.clientId);if(it.isSplash() || it.isFluidContainer())msg->AddByte(fluidMap[item.subType % 8]);else if(it.stackable || it.charges)msg->AddByte(item.subType);elsemsg->AddByte(0x01);msg->AddString(item.itemName);msg->AddU32(uint32_t(it.weight * 100));msg->AddU32(item.buyPrice);msg->AddU32(item.sellPrice);}
Adicione
void ProtocolGame::parseExtendedOpcode(NetworkMessage& msg){uint8_t opcode = msg.GetByte();std::string buffer = msg.GetString();// process additional opcodes via lua script eventaddGameTask(&Game::parsePlayerExtendedOpcode, player->getID(), opcode, buffer);}void ProtocolGame::sendExtendedOpcode(uint8_t opcode, const std::string& buffer){// extended opcodes can only be send to players using otclient, cipsoft's tibia can't understand themNetworkMessage_ptr msg = getOutputBuffer();if(msg){TRACK_MESSAGE(msg);msg->AddByte(0x32);msg->AddByte(opcode);msg->AddString(buffer);}}
Embaixo de
case 0x1E: // keep alive / ping responseparseReceivePing(msg);break;
Adicione
case 0x32: // otclient extended opcodeparseExtendedOpcode(msg);break;
enums.h
Embaixo de
enum GuildLevel_t{GUILDLEVEL_NONE = 0,GUILDLEVEL_MEMBER,GUILDLEVEL_VICE,GUILDLEVEL_LEADER};
Substitua o OperatingSystem por este
enum OperatingSystem_t{CLIENTOS_LINUX = 0x01,CLIENTOS_WINDOWS = 0x02,CLIENTOS_OTCLIENT_LINUX = 0x0A,CLIENTOS_OTCLIENT_WINDOWS = 0x0B,CLIENTOS_OTCLIENT_MAC = 0x0C,};/
player.h
Embaixo de
void sendCreatureShield(const Creature* creature)
Adicione
void sendExtendedOpcode(uint8_t opcode, const std::string& buffer){if(client) client->sendExtendedOpcode(opcode, buffer);}
luascript.cpp
Embaixo de
void LuaScriptInterface::registerFunctions(){
Adicione
//doSendPlayerExtendedOpcode(cid, opcode, buffer)lua_register(m_luaState, "doSendPlayerExtendedOpcode", LuaScriptInterface::luaDoSendPlayerExtendedOpcode);
Embaixo de
SHIFT_OPERATOR(int32_t, LeftShift, <<)SHIFT_OPERATOR(int32_t, RightShift, >>)SHIFT_OPERATOR(uint32_t, ULeftShift, <<)SHIFT_OPERATOR(uint32_t, URightShift, >>)#undef SHIFT_OPERATOR
Adicione
int32_t LuaScriptInterface::luaDoSendPlayerExtendedOpcode(lua_State* L){//doSendPlayerExtendedOpcode(cid, opcode, buffer)std::string buffer = popString(L);int opcode = popNumber(L);ScriptEnviroment* env = getEnv();if(Player* player = env->getPlayerByUID(popNumber(L))) {player->sendExtendedOpcode(opcode, buffer);lua_pushboolean(L, true);}lua_pushboolean(L, false);return 1;}
luascript.h
Embaixo de
virtual void registerFunctions();
Adicione
static int32_t luaDoSendPlayerExtendedOpcode(lua_State* L);
creatureevent.h
.
Substitua
CREATURE_EVENT_PREPAREDEATH
Por isso
CREATURE_EVENT_PREPAREDEATH,CREATURE_EVENT_EXTENDED_OPCODE // otclient additional network opcodes
Embaixo de
uint32_t executePrepareDeath(Creature* creature, DeathList deathList);
Adicione
uint32_t executeExtendedOpcode(Creature* creature, uint8_t opcode, const std::string& buffer);
creatureevent.cpp
Embaixo de
else if(tmpStr == "death")m_type = CREATURE_EVENT_DEATH;
Adicione
else if(tmpStr == "extendedopcode")m_type = CREATURE_EVENT_EXTENDED_OPCODE;
Embaixo de
case CREATURE_EVENT_DEATH:return "onDeath";
Adicione
case CREATURE_EVENT_EXTENDED_OPCODE:return "onExtendedOpcode";
Embaixo de
case CREATURE_EVENT_DEATH:return "cid, corpse, deathList";
Adicione
case CREATURE_EVENT_EXTENDED_OPCODE:return "cid, opcode, buffer";
Embaixo de
std::cout << "[Error - CreatureEvent::executeFollow] Call stack overflow." << std::endl;return 0;}}
Adicione
uint32_t CreatureEvent::executeExtendedOpcode(Creature* creature, uint8_t opcode, const std::string& buffer){//onExtendedOpcode(cid, opcode, buffer)if(m_interface->reserveEnv()){ScriptEnviroment* env = m_interface->getEnv();if(m_scripted == EVENT_SCRIPT_BUFFER){env->setRealPos(creature->getPosition());std::stringstream scriptstream;scriptstream << "local cid = " << env->addThing(creature) << std::endl;scriptstream << "local opcode = " << (int)opcode << std::endl;scriptstream << "local buffer = " << buffer.c_str() << std::endl;scriptstream << m_scriptData;bool result = true;if(m_interface->loadBuffer(scriptstream.str())){lua_State* L = m_interface->getState();result = m_interface->getGlobalBool(L, "_result", true);}m_interface->releaseEnv();return result;}else{#ifdef __DEBUG_LUASCRIPTS__char desc[35];sprintf(desc, "%s", player->getName().c_str());env->setEvent(desc);#endifenv->setScriptId(m_scriptId, m_interface);env->setRealPos(creature->getPosition());lua_State* L = m_interface->getState();m_interface->pushFunction(m_scriptId);lua_pushnumber(L, env->addThing(creature));lua_pushnumber(L, opcode);lua_pushlstring(L, buffer.c_str(), buffer.length());bool result = m_interface->callFunction(3);m_interface->releaseEnv();return result;}}else{std::cout << "[Error - CreatureEvent::executeRemoved] Call stack overflow." << std::endl;return 0;}}
game.h
Embaixo de
int32_t getLightHour() {return lightHour;}void startDecay(Item* item);
Adicione
void parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer);
game.cpp
Embaixo de
player->sendTextMessage(MSG_INFO_DESCR, buffer);}
Adicione
void Game::parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer){Player* player = getPlayerByID(playerId);if(!player || player->isRemoved())return;CreatureEventList extendedOpcodeEvents = player->getCreatureEvents(CREATURE_EVENT_EXTENDED_OPCODE);for(CreatureEventList::iterator it = extendedOpcodeEvents.begin(); it != extendedOpcodeEvents.end(); ++it)(*it)->executeExtendedOpcode(player, opcode, buffer);}
/creaturescripts/creaturescrips.xml
<event type="extendedopcode" name="ExtendedOpcode" event="script" value="extendedopcode.lua"/>
/creaturescripts/extendedopcode.lua
OPCODE_LANGUAGE = 1function onExtendedOpcode(cid, opcode, buffer)if opcode == OPCODE_LANGUAGE then-- otclient languageif buffer == 'en' or buffer == 'pt' then-- example, setting player language, because otclient is multi-language...--doCreatureSetStorage(cid, CREATURE_STORAGE_LANGUAGE, buffer)endelse-- other opcodes can be ignored, and the server will just work fine...endend
Créditos : MaXwEllDeN 100% por adaptar o código
-
BananaFight got a reaction from homersapiens in Como criar uma barra de spell [Poketibia]
Bom pessoal, como muito me pedem vou dar um exemplo de como criar uma barra de skill, porem vou ensinar apenas a logica.
local pokemons = {
["Bulbasaur"] = {1, 2, 3, 4},
["Ivisaursaur"] = {1, 2, 3, 4, 5},
}
local name = "Bulbasaur"
for k, v in pairs(pokemons) do
if name == k then
for i = 1, 12 do
if i == v[i] then
print("m"..v[i])
else
break;
end
end
end
end
Precisamos enviar o nome do nosso pokemon por um OpCode ou SendCancel para nosso script.
Com o nome do nosso pokemon dentro do script vamos fazer ele ser comparado dentro da tabela para verificar a existência do pokemon, e retornar a quantidade de ataques que ele tem.
Feito isso, dentro do for que verifica quantos ataques o nosso pokemon tem
for i = 1, 12 do
if i == v[i] then
print("m"..v[i])
else
break;
end
end
Vamos criar a parte que adiciona os botões e nesses botões vamos por dentro da função onPress, a função g.gameTalk para executar o m1, m2...
Por enquanto é isso pessoal, espero ter sido bem claro e objetivo, e postem prints de seus resultados, Ainda faltam algumas coisas a serem criadas, mais to no trabalho e não posso explicar agora.
Boa sorte a todos, E NÃO, não vou criar uma base para vocês.
-
Recently Browsing 0 members
- No registered users viewing this page.
