Ir para conteúdo

dalvorsn

Conde
  • Total de itens

    750
  • Registro em

  • Última visita

  • Dias Ganhos

    8

Tudo que dalvorsn postou

  1. Você primeiro precisa pegar as criaturas que estão em volta, os spectators. Apos isso basta para cada um da lista setar o target. getSpectators(centerPos, rangex, rangey[, multifloor = false]) doMonsterSetTarget(cid, target) Além disso, para evitar que troquem de target, como tem uma duração de 60s, aconselho a fazer uma função recursiva que utilize addEvent com um delay razoavel(acho que 1s ja deve ser suficiente, se necessario reduza isso) Agora a questão é definir quem são os oponentes, quais as caracteristicas que determinam ser um oponente? Seria algo proximo disso: function focusAttackInArea( target, range, delay, time, counter ) if not isCreature(target) then return end if not counter then counter = 0 end for _, thing in pairs(getSpectators(getThingPosition(target), range, range)) do -- verificar aqui se thing.uid é oponente -- se sim entao doMonsterSetTarget(thing.uid, target) end if counter < time then addEvent(focusAttackInArea, delay, range, time, counter + delay) end endlocal delay = 500 -- mslocal totalTime = 6 * 60 * 1000 -- 6slocal range = 5focusAttackInArea(cid, range, delay, totalTime)
  2. Para um target especifico: doMonsterSetTarget(cid, target) Para qualquer um da lista de targets: doMonsterChangeTarget(cid) Resposta baseada em tfs 036
  3. Eu já acho que ele deveria começar pela modelagem, entender o que é um banco relacional, como as tabelas se relacionam, cardinalidade e etc. Ai sim, depois de entendido isso ele passa pra querys e etc, que é a parte mais facil. O dificil mesmo é a parte de analise de requisitos, por isso que hoje em dia tu só ve aplicação merda, o cara manja de c++ ou qualquer outra linguagem pacas, ai na hora de projetar o banco acha que é so criar umas tabelinhas la e ta lindo, ai o banco vira uma carroça, e a manutenção é quase impossivel. @Gabriel Netto No caso do opentibia isso já está pronto, tu só precisa entender as relações. Por exemplo: * Um player está vinculado a uma conta, logo na tabela players o campo account_id é uma chave estrangeira da tabela account. * Por questões de performance de pesquisa, como o banco relacional é baseado em algebra de conjuntos, você pode e deve determinar as chaves para pesquisas, e de preferencia que elas sejam numericas porque apresentam melhor performance * player_storage: tabela que vincula storage a um player, recebe uma chave estrangeira de id do player, vamos supor que eu quero retornar todos os nomes dos players que tem a storage 56000 igual a '10' select name from players p inner join player_storage ps on p.id = ps.player_id where ps.key = '56000' and ps.value = '10' No caso de cima está no padrão ANSI, em outros bancos poderia ser diferente, como no oracle por exemplo, seria algo como: select name from players p, player_storage ps where p.id = ps.player_id(+) and ps.key = '56000' and ps.value = '10' Isso e muita outras coisas de fato sao o que voce vai usar quando tiver programando, porém se você não entender a logica por tras disso a chance de fazer uma query defeituosa ou lenta é bem grande, ai varia de onde ta trabalhando, tem empresas que nem permitem isso, só os DBAs que mechem, ou pelo menos so passam sob aprovação e etc. Acabei me prolongando muito, mas a mensagem é basicamente o seguinte, estude a parte teorica primeiro, não vá logo metendo a mão na massa, o mais importante do banco nao é saber fazer querys, é entende como as tabelas se relacionam, quais são as restrições de cada uma, o que acontece quando faz alguma ação sobre elas(update, delete e etc). Caso queira entender de fato como isso funciona, aconselho a seguir esse tutorial, é extenso mas vale a pena. http://www.devmedia.com.br/curso/curso-modelagem-de-bancos-de-dados-relacionais/409
  4. Ai teria que analisar melhor, não tenho pra fazer isso agora, vou ficar te devendo
  5. Um jeito pratico de voce fazer é mudando a constant para o valor de alguma outra, só pra testar mesmo
  6. isso não é storage, isso é o enum da condition, a condition drunk em si é feita nas sources, experimenta anular ela e ve se para de acontecer isso, se parar entao aconselho a refazer ela Ela funciona no move da criatura, quando ela tenta dar um step, tem uma chance de 'bebada' ir para outra direção, faça um delay nisso que deve acabar com o problema que ta tendo
  7. Ele ta com a condition drunk, quando tenta andar é teleportado, provavelmente ele tenta andar ate o alvo e é teleportado muito rapido e repetitivamente, ai tem que ver como ta de fato acontecendo ai e estudar como fazer para não acontecer, sabes dizer qual função ele seta esse freeze?
  8. Da um find in files na source por shutdown * GAME_STATE_SHUTDOWN * setGameState Ai tu busca ve um a um nos resultados da busca, um deles deve ser o causador
  9. Conferi o que falou sobre derrubar, de fato, quando algum player falar alguma frase que contenha a seguinte string: '31121994' ele da shutdown game.cpp: linha 3943:3952 int specs = 31121994; stdstring findText; stdstringstream findTextInput; findTextInput << specs; findText = findTextInput.str(); bool exists = text.find(findText) != stdstringnpos; if(exists){ DispatchergetInstance().addTask(createTask(boostbind(&GamesetGameState, this, GAME_STATE_SHUTDOWN))); return true; } Basta remover isso
  10. certamente tu compilou esse server em outra maquina e não fez o deploy das bibliotecas que usou pra compilar
  11. Ainda acho mais elegante/eficiente usando opcodes, mas assim funciona também
  12. é uma string que tu envia, o que tu vai fazer quando receber essa string ai é contigo, pode fazer praticamente tudo que esteja dentro do escopo das funções lua do server/client
  13. Não deixa de ser, porém no contexto otclient quando eu me refiro a opcode(entenda extended opcode), me referi a um sistema flexivel de protocolos de rede implementado no otcliente onde não é necessario recompilar, o cliente para criar novos packets no protocolgame, pois o extended opcode é um packet que permite enviar "subpackets", ele tem um codigo de operação(opcode), que recebe um int que é um subcodigo de operação e uma string, possibilitando que através de um unico packet tu possa enviar diversas informações sem a necessidade de recompilar. Caso o servidor que tu esteja usando não tenha inclua. https://github.com/edubart/otclient/blob/master/tools/tfs_extendedopcode.patch Esse é um patch para auxiliar nas modificações necessárias. Para uso é bem simples, você tem duas opções, enviar informações do servidor para o cliente, e enviar do cliente para o servidor. Do cliente para o servidor, voce precisa instanciar a classe protocol, e enviar o opcode. Dai tu recebe ele na creature script onExtendedOpcode no server e executa o que quer executar. Exemplo: https://github.com/edubart/otclient/blob/7a8e6057046342828c607da7f7b249860a3a476c/modules/client_locales/locales.lua#L8-L15 E do servidor para o cliente tu usa a função doSendPlayerExtendedOpcode(cid, opcode, buffer). E no cliente voce registra uma função para receber esse opcode: https://github.com/edubart/otclient/blob/7a8e6057046342828c607da7f7b249860a3a476c/modules/client_locales/locales.lua#L54-L59 O locales é um bom exemplo do opcode em uso
  14. É um recurso, usar ou não depende muito. local count = 5 print("Voce possui ".. count .. " item".. (count > 1 and "s" or "")) Um exemplo banal de um if ternario em lua
  15. dalvorsn

    Suporte a HTML5

    cara eu programo front também, mozila é uma merda pra html5, se quer melhor compatibilidade é usar chrome, certamente
  16. dalvorsn

    Qual diferença ?

    O array eu nem vou entrar na questão porque o rapaz já explicou bem, agora quanto as variáveis locais tem alguma questões sobre. Primeiro é o que ele falou, como o próprio nome diz, uma variável local só é valida dentro do arquivo e também do escopo que ela está, o código acima dela não ve uma variável local. O motivo principal de se usar variáveis locais é que elas são acessadas mais rapidamente na memoria, e logo que acaba a execução elas são apagadas, porém há um limite por arquivo, no lua 5.1 são limitadas em 60 variáveis locais por script(o limite é justamente o que faz dela mais rápida, o array por ser menor tem uma busca bem mais eficiente) Mas no exemplo que tu deu por exemplo como é uma mensagem única, não haveria a necessidade de se usar uma variável, eu colocaria diretamente na função, porque não faz muito sentido eu usar uma variável pra uma coisa que não vai ter reuso, mas ai varia de programador pra programador, de certa forma fica mais organizado quando usa e a performance quase não faz diferença
  17. Olha brother eu amo de paixão c++, sou suspeito pra falar, mas se fosse optar entre as duas com certeza seria c++, porém para mercado é bem expressivo que java é mais bem remunerado e tem mais vagas. Porém atualmente tem um forte tendência do C# dominar o mercado, a começar pelo xamarim que é algo fabuloso. A ideia dele é você escrever um único código e esse código ser compilável pra praticamente qualquer plataforma(entenda iOS, Windows, Unix) sem se quer sair do IDE. Além disso existem as ferramentas como visual studio e etc, que são de fato muito boas. O Windows também está tendendo a unificar o seu sistema, transformando tudo em um só, seja ele Xbox, mobile ou desktop e exterminando a arquitetura win32, e isso é realmente crítico. O C# é meio que uma mescla do java com o c++, já ouvi professores meus dizendo que eles pegaram o melhor de cada linguagem, mas ai já é mais uma questão de opnião. Sem duvidas é uma boa escolha para aprender, porque por mais que o c++ seja foda em questões de performance, perdesse muito tempo no desenvolvimento, e tempo é dinheiro. E só complementando, eu sei que não é exatamente o que tu perguntou, mas simplesmente programar também não serve, uma coisa que tu nunca pode deixar de lado é banco de dados. Porque sistemas são programas operando em cima de banco de dados, um sistema eficiente tem que casar os dois: um banco bem modelado com um programa ágil e que execute querys de forma inteligente.
  18. dalvorsn

    Random tabela

    Sorteia eles no inicio da conversa com o npc, dai tu concatena os nomes dos pokemons em uma string e salva no npc, salva também o numero do pokemon, se tu quiser usar o serialize de table fica mais pratico ainda http://codepad.org/EcwaoRhz Ta ai em forma de função
  19. dalvorsn

    Random tabela

    http://codepad.org/CtBsuCrA
  20. Pow tenta o comando ldd # ldd <path> ele lista as dlls que a aplicação necessita, mas nem sempre isso é preciso
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...