Jump to content

BananaFight

Conde
  • Posts

    702
  • Joined

  • Last visited

  • Days Won

    5

Reputation Activity

  1. Upvote
    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.
     
  2. Upvote
    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
  3. Upvote
    BananaFight reacted to Administrador in Que viadagem é essa?   
    Tópico movido para lixeira, qualquer dúvida entre em contato com qualquer membro da equipe.
  4. Upvote
    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.

  5. Upvote
    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.


  6. Upvote
    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.
  7. Upvote
    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.

  8. Upvote
    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...

  9. Upvote
    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
     
  10. Upvote
    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.
  11. Upvote
    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.
  12. Upvote
    BananaFight reacted to dalvorsn in Lançando um desafio de criptografia   
    São metodos reversiveis?
  13. Upvote
    BananaFight got a reaction from Aberos in LoL - Skins Misteriosas   
    Comprei uns presentes e mandei pra minha outra conta:























    Sorte ? 2 Skin Limitadas xD

  14. Upvote
    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 )



  15. Upvote
    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)
  16. Upvote
    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.
  17. Upvote
    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.
  18. Upvote
    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:




    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



    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
  19. Upvote
    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.


  20. Upvote
    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.
  21. Upvote
    BananaFight reacted to Insaend in Spriting Insaend   
    --- Apagado pelo Usuário ---
    ---------------------------------
    Não tenho Muito ritimo Mais Faço UMAs Coisinhas AINDA UHASUASu.

  22. Upvote
    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.
  23. Upvote
    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
  24. Upvote
    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  
  25. Upvote
    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.
×
×
  • Create New...