Jump to content
×
×
  • Create New...

Search the Community

Showing results for tags 'otserv'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • xTibia - Notícias e Suporte
    • Regras
    • Noticias
    • Soluções
    • Projetos Patrocinados
    • Tutoriais para Iniciantes
    • Imprensa
  • OTServ
    • Notícias e Debates
    • OTServlist
    • Downloads
    • Recursos
    • Suporte
    • Pedidos
    • Cópia
    • Tutoriais
  • OFF-Topic
    • Barzinho do Éks
    • Design
    • Informática

Categories

There are no results to display.


Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Sou

  1. Servidor aberto 17/07/17 em versão beta. Host dedicado 24h • Shiny Ditto e Ditto Memory (Shiny Ditto para todos que entrarem) • Duel System • Nick System • TV System • Autoloot System • Mega Evolução Ssystem • Auto Stacking System • Held System • Icone System • Task System • Guild System E muito mais! Download Client: http://www.mediafire.com/file/r0ata4qnjjemleo/AlaskaOTP+Client.rar Grupo no Facebook: https://www.facebook.com/groups/2301963466694575/ ________________________________________________________________ Estamos recrutando Programadores, Mappers e WebDesigners! Se tiver interesse manda inbox para página ou aqui no fórum.
  2. Fala aeee galera do Xtibia aqui quem fala é o Leandro Vezu ( Soni Heria ou Sorcerer10 )..., meu primeiro poste aqui então peguem leve com as críticas.... Galera como já disse antes esse é o meu primeiro poste aqui no xtibia então peguem leve nas críticas..., bom esse mapa que estarei disponibilizando pra vocês e o mapa do tão famoso ROZINX... eu editei ele um pouco (mas como assim edito ele?) eu não modifiquei nada..., eu apenas concertei os bugs dele..., ( a então você tirou todos os bugs dele) NÃO eu não tirei todos os bugs dele, (porra então porque você postou?) por isso eu coloquei 90% sem bugs porque os bugs que foram relatados a mim eu retirei fiz novos bichos, novas caves, fiz a tão famosa village também, {mas ta sem bicho} coloquei os PZs no templo que ele tava sem, na área vip tbm, na amostra vip tbm, ainda falta bichos mas ai e com vocês, se vocês acharem algum BUG no mapa { oque eu tenho certeza que vocês vão achar } entrem em contato comigo através do meu e-mail, porque nem sempre eu posso entra no Xtibia..., { meu e-mail: vezu01@hotmail.com }... ========== Bichos Novos Adicionados ========== SuperNova Hero Icyd Dryn The Ice Boss Laptus Masterick Rabbit of Hell Devil King Of Hell Lumast Event Rudy Algumas fotos dos bichos novos... OBS: dentro da primeira pasta contem um arquivo { bloco de notas } chamado "zsd" dentro dele contem o nome dos bichos que eu fiz... OBS²: A Taxa de detecção do arquivo foi de 2 / 41 ..., segue o scan abaixo. Créditos: Davi Alvares - por fazer o mapa Leandro Vezu - por fazer os novos bichos e retirar os bugs Download Scan
  3. PokeB (Poketibia Base 9.60) Agora OpenSource!!! O que terá: Voar, Montar, Cortar, Teleportar, Quebrar rocha, Nadar, ... Captura de Pokémons - sistema de pokebolas. Nurse Joy - que cura todos os pokémons da mochila de uma só vez. Líderes de Ginásio Evoluções (Pedras evolutivas e Nível) Treinamento Pokémon (boost machine) 151 Pokémons - será a base. Sistema de Pokedex M1 à M12 - ataques dos pokémons. entre outras coisas... Como falado será a 'base' do poketibia! Download: Server: http://www.4shared.com/zip/9FZYhupj/Server_PokeB.html Source: http://www.4shared.com/zip/C3HMIt8_/Sources_PokeB.html Cliente: http://www.4shared.com/zip/Gmhv34hv/OtClient_PokeB.html [novo] Server PokeB 1.0: http://www.4shared.com/rar/PauHbetg/Server_PokeB_10.html? [novo] Cliente PokeB 1.0: http://www.4shared.com/rar/IokY3r3J/OtClient_PokeB_10.html? Conta GOD: Login: admin senha: 123456 SourceForge: SourceForge: https://sourceforge.net/projects/pokeb/ Server poketibia que pode ajudar: Poketibia Ricardo: Server: http://www.4shared.com/rar/ygFwSXUP/Server_Pokemon_Dash_by_Ricardo.html Source: http://www.4shared.com/rar/-OMFGhHg/Sources_Pokemon_Dash_by_Ricard.html PDA: http://www.4shared.com/rar/tSmomesU/Serv_PDA_pro_forum_v_10.html Erondino: http://tibiapoketibia-erondino.weebly.com/ Utilitários: RME: (Windows) http://remeresmapeditor.com/rmedl.php?file=RME-win-2.2.msi Ot Item Editor: http://www.4shared.com/rar/6Y72VWpG/ot_item_editor_960.html Sprite Editor/ Dat Editor: Spr Editor: http://www.xtibia.com/forum/topic/202369-spr-editor-854981-versao-13/ Storms Editor: http://www.xtibia.com/forum/topic/216960-986-storms-sprite-dat-editor/ Ultimate Tibia Editor: http://www.xtibia.com/forum/topic/206196-ultimate-tibia-editor/?fromsearch=1 Dev: http://www.4shared.com/zip/Ug4cmrtA/The_Forgotten_Dev-Cpp.html Outros: SprEx(extrator de sprites): http://knoxstudio.net/jo3bingham/SprEx/SprEx.rar O que foi feito: Imagens: Embreve!!!
  4. Olá pessoal! Eu venho divulgar um server com muitos sistemas interessantes -Icon System- -Cooldown Bar- PXG parecida -Unique iitem com stackable -Serial itens -TV system = PXG sem nome ou barra de health Muitos bugs, mas pelos sistemas seria bom investir. Qualquer interesse só abir um projeto. Estão autorizados, mas pesso que coloque os créditos. Esse server é para projetos para deixa-lo 100% jogavel. Pesso que o tópico seja movido para a area de downloads de server Os addresses do cliente foi muito modificado pelo criador...Já que isso foi alterado, então dificilmente algum player encontrara um bot ou algum hacker...Desistir desse server porque são muitos bugs ¬¬' e não tem source. Outra que o cara que me passou ele me roubou. Download server Clique aqui senha: warlock Não sei postar scan... ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Estou com um projeto de DLL inject para tibia. Se algum programador em C++ estiver afim só me contatar...Consegui fazer algumas coisas no tibia como por exemplo uma barra de contexto igual ao pokemonBro com um programador bom da para refazer toda barra deles ou até melhor...barra de mana ou de Xp. Dispenso curiosos.
  5. Olá, meu nome é Cristofer Martins, sou programador e gameDesigner e atualmente faço parte da equipe Digimon Adventure Online. Estou aqui para apresentar o meu Spr Editor, que desenvolvi para a equipe por que outros editores não eram funcionais/simples o suficiente. Alem disso, vi que não há sprite editores para as novas versões do Tibia, dificultando a inserção/remoção/edição/exportação de Sprites dos novos arquivos SPRs.Alem disso, um outro motivo foi que tive uma pessima experiencia com o Demonic Editor, tentei exportar as Sprites do nosso SPR para uma pasta umas 20 vezes e sempre dava algum erro no meio do caminho. Por isso desenvolvi um Editor eu mesmo. Preview: Funções( no menu ): -Add: Adiciona n sprites ao editor. Basta clicar no add que irá aparecer a janela para você seleciona todas as sprites que você quiser( multi seleção ). Essas sprites serão adicionadas no final da lista de sprites. OBS: As imagens devem ser PNG e o fundo das sprites deve ser transparente, e não rosa, como é de costume. -Replace: Substitui n sprites no editor. Selecione com Ctrl ou até com o Shift as sprites no editor que você quer substituir, depois clique no menu em Replace. Irá aparecer uma janela aonde você seleciona as imagens PNG para serem substituidas. As sprites serão substituidas na sequencia, a primeira Sprite selecionada no editor vai ser substituida com a primeira imagem selecionada na pasta. O progresso do replace pode ser visto na barra de progresso. -Delete: "Deleta" n sprites da lista.Selecione com Ctrl ou até com o Shift as sprites no editor que você quer deletar, depois clique no menu em Delete. Essas IDs das sprites que são deletadas vão aparecer "" e o ID delas, elas são sprites vazias, sem conteudo que você substiuir com novas imagens e assim aproveitar essas IDS que não estão servindo para nada. Export: Exporta n Sprites. Basta selecionar com Ctrl ou com Shift ou clicando na sprite que o editor irá exportar essa sprite com fundo transparente. Você pode facilmente exportar todas as sprites para uma pasta ou apenas aquelas que lhe interessam. O progresso da exportação pode ser visto na barra de progresso. Clear: Limpa a lista de sprites e remove as imagens da memoria. Util para criar um arquivo SPR do zero, por exemplo. Exemplo multi select( para deletar, substituir ou exportar ): Abas Extract/Compile Extract: Nessa aba você clica em SPR file para abrir o arquivo SPR, escolhe a versão dessa SPR ali no "menu" do lado daonde tá escrito "version" e clica em Extract. O programa vai começar a extrair as sprites e adiciona-las a lista( as vezes a lista fica estatica basta clicar nela que ela atualiza com as sprites novas ) e o progresso da extração pode ver na barra de progresso. Compile: Nessa aba você compila as Sprites da lista para um arquivo SPR. Para isso basta clicar em "save" e escolher o arquivo SPR que vai ser salvo, escolher a versão desse arquivo SPR como feito em Extract e clicar em "Compile!". O progresso da compilação pode ser visto na barra de progresso. Outros Search by ID: Pesquisa uma sprite pelo ID. Caso essa id exista na lista, a lista se move até a a sprite. Download: SPREditor Scan: Virus Total Caso você encontre algum bug, reporte nesse topico por favor. Aceito sugestões. Caso exista alguma versão que não seja aceita no editor e você tem a signiture(assinatura) do arquivo spr, poste aqui que eu atualizo o version.ini.
  6. Olá gente é o seguinte, to usando otclient e to colocando sons nas citys do meu server, e eu queria saber como eu poderia colocar 2 tipos de sons ( Musicas ) nas mesmas coordenadas, tipo, a pessoa vai nessa tal posição " X, Y, Z " ai quando a pessoa entra nessa tal coordenada começa a tocar uma musica, e quando a pessoa sair e entrar nessa mesma coordenada começa a tocar outro tipo de musica, sendo que na mesma coordenada da 1° musica ^^ script localizada na pasta Mudules/Rcsound SOUNDS_CONFIG = { soundChannel = SoundChannels.Music, checkInterval = 500, folder = 'music/', noSound = 'No sound file for this area.', } SOUNDS = { -- PVP {fromPos = {x=936, y=1025, z=13}, toPos = {x=952, y=1043, z=13}, priority = 1, sound="Balada.ogg"}, {fromPos = {x=953, y=1016, z=13}, toPos = {x=990, y=1047, z=13}, priority = 1, sound="Pvp.ogg"}, } ---------- -- Sound local rcSoundChannel local showPosEvent local playingSound -- Design soundWindow = nil soundButton = nil function toggle() if soundButton:isOn() then soundWindow:close() soundButton:setOn(false) else soundWindow:open() soundButton:setOn(true) end end function onMiniWindowClose() soundButton:setOn(false) end function init() for i = 1, #SOUNDS do SOUNDS[i].sound = SOUNDS_CONFIG.folder .. SOUNDS[i].sound end connect(g_game, { onGameStart = onGameStart, onGameEnd = onGameEnd }) rcSoundChannel = g_sounds.getChannel(SOUNDS_CONFIG.soundChannel) -- rcSoundChannel:setGain(value/COUNDS_CONFIG.volume) soundButton = modules.client_topmenu.addRightGameToggleButton('soundButton', tr('Sound Info') .. '', '/images/audio', toggle) soundButton:setOn(true) soundWindow = g_ui.loadUI('rcsound', modules.game_interface.getRightPanel()) soundWindow:disableResize() soundWindow:setup() if(g_game.isOnline()) then onGameStart() end end function terminate() disconnect(g_game, { onGameStart = onGameStart, onGameEnd = onGameEnd }) onGameEnd() soundWindow:destroy() soundButton:destroy() end function onGameStart() stopSound() toggleSoundEvent = addEvent(toggleSound, SOUNDS_CONFIG.checkInterval) end function onGameEnd() stopSound() removeEvent(toggleSoundEvent) end function isInPos(pos, fromPos, toPos) return pos.x>=fromPos.x and pos.y>=fromPos.y and pos.z>=fromPos.z and pos.x<=toPos.x and pos.y<=toPos.y and pos.z<=toPos.z end function toggleSound() local player = g_game.getLocalPlayer() if not player then return end local pos = player:getPosition() local toPlay = nil for i = 1, #SOUNDS do if(isInPos(pos, SOUNDS[i].fromPos, SOUNDS[i].toPos)) then if(toPlay) then toPlay.priority = toPlay.priority or 0 if((toPlay.sound~=SOUNDS[i].sound) and (SOUNDS[i].priority>toPlay.priority)) then toPlay = SOUNDS[i] end else toPlay = SOUNDS[i] end end end playingSound = playingSound or {sound='', priority=0} if(toPlay~=nil and playingSound.sound~=toPlay.sound) then g_logger.info("RC Sounds: New sound area detected:") g_logger.info(" Position: {x=" .. pos.x .. ", y=" .. pos.y .. ", z=" .. pos.z .. "}") g_logger.info(" Music: " .. toPlay.sound) stopSound() playSound(toPlay.sound) playingSound = toPlay elseif(toPlay==nil) and (playingSound.sound~='') then g_logger.info("RC Sounds: New sound area detected:") g_logger.info(" Left music area.") stopSound() end toggleSoundEvent = scheduleEvent(toggleSound, SOUNDS_CONFIG.checkInterval) end function playSound(sound) rcSoundChannel:enqueue(sound, 0) setLabel(clearName(sound)) end function clearName(soundName) local explode = string.explode(soundName, "/") soundName = explode[#explode] explode = string.explode(soundName, ".ogg") soundName = '' for i = 1, #explode-1 do soundName = soundName .. explode[i] end return soundName end function stopSound() setLabel(SOUNDS_CONFIG.noSound) rcSoundChannel:stop() playingSound = nil end function setLabel(str) soundWindow:recursiveGetChildById('currentSound'):getChildById('value'):setText(str) end
  7. -> [iP]: HeroesOT.com (ou entre pelo client próprio que pode ser baixado pelo site) -> [Versão]: 8.6 -> [site]: http://HeroesOT.com -> [Facebook]: https://www.facebook.com/TheHeroesOfTimeOT/ -> Para magias novas, diga: !spells -> Para comandos novos, diga: !commands Temos muitos monstros, magias, items, quests, sistemas, eventos (todos os dias), comandos unicos, novos, editados, e um mapa unico, inovador, editado e totalmente diferente. Caso queira entrar pelo CLIENT PROPRIO ao inves de entrar pelo Tibia, baixe no site no botao DOWNLOAD
  8. Bom já existe um Sistema de tm no forum porem o meu é diferente. Vamos lá!! Bom Funciona assim: Cada Pokemon Pode Ter 3 TMs Adicionadas, OBS: Se O Pokemon tiver 12 magias ele pode ter 15 se voce adicionar 3 TMs nele. Como Usar O Sistema: Bom Basta Seguir o Tutorial e O Comando para Usar eu Recomendo que coloquem em Hotkeys na parte Shift+f1,Shift+f2,Shift+f3 Coloque os Seguintes Comandos tm1,tm2,tm3 OBS: a TM Nao Substitui Magia e Sim Adiciona , Por isso Vai por sequencia se voce usa a primeira tm no seu pokemon, para usar ela voce vai usar o comando tm1. se voce usa a segunda tm no seu pokemon para usar ela voce vai usar o comando tm2 mesma coisa com o tm3 Lembrando que Já possui as 50 TMs funcionando perfeitamente Vamos ao Tutorial: 1°: Crie um Arquivo Em "data/action/script" Chamado tm.lua e cole este script Dentro: Agora em Data/Action/Action.xml voce vai por a seguinte tag: <action itemid="12595-12644" event="script" value="tm.lua"/> Bom Recomendo voce por esta tag no ORDER 2°: Vá em Data/Lib/Crie um Arquivo Chamado "tm lib.lua" e cole o seguinte script dentro dele: 3°: Agora vá em data/talkaction/script/ Abra seu move1.lua e apague TUDO que estiver dentro e cole isto: 4°: Agora em Talkaction/Script/ Apague Tudo que estiver dentro do Seu "cd.lua" e cole isto dentro: 5°: Agora em Data/Talkaction/Talkaction.xml Coloque estas tags: <talkaction words="tm1" case-sensitive="no" event="script" value="move1.lua"/> <talkaction words="tm2" case-sensitive="no" event="script" value="move1.lua"/> <talkaction words="tm3" case-sensitive="no" event="script" value="move1.lua"/> 6°: o item.otb e item.xml (é recomendado baixar) Apois baixar voce vai pegar o item.xml e o item.otb e vai copiar eles e depois vai em data/item/apaga o item.otb e o item.xml e cola o item.otb e o .xml que voces baixaram. neles possui as tms adicionadas ao server (as 50) e no .xml ta com o nome direitinho, das 50 tmb Link para Download: http://www.mediafire...e54ldx6gw14fo3u Bom o Sistema esta pronto Agora vamos para a Parte do Client: Eu Vou Postar o Link do Client do Meu servidor ai Voces Pega a Tibia.dat e Tibia.spr e Utiliza em seu client bom o client ja esta com sistema de taunt, novas sprites novos flys boost stone, e as 50 TMs Link Do Client: http://www.mediafire...6w2ead2c5wrwj9v Bom ai esta o sistema de TM. Caso alguem tenha duvida so perguntar aqui no topico! Creditos: Criador do Script: ZarefShirou Edito:DinoAdmin
  9. Loost

    Tutorial Java

    [Tutorial]Programação em JAVA A Linguagem de Programação Java Índice 1.Introdução 2 2.Histórico 2 3.As palavras que definem Java 3 4.Tipos primitivos 6 5.Tipos Compostos 6 6.Expressões 7 7.Variíveis 8 8.Comandos 9 9.Java e a Orientação a Objetos 10 1.Classes 10 2.Objetos - Instâncias de uma Classe 11 3.Construtores 12 4.Métodos / Mensagens 13 5.Destrutores 14 6.Herança 15 7.Polimorfismo 17 8.Controle de Acesso 18 9.Variíveis e Métodos de Classe 19 10.Classes e Métodos Abstratos 19 11.Interfaces 20 10.Concorrência (Threads) 21 11.Tratamento de Exceções 22 12.Conclusões 24 13.Bibliografia 25 Introdução Nesse trabalho estaremos falando sobre a linguagem de programação Java. É uma linguagem singular dentre todas outras jí que é a única que chamou a atenção de pessoas fora do mundo técnico, o suficiente para que existissem reportagens de mais de 10 minutos em cadeias de divulgação de massa como a CNN. Apesar de todo o alarde, Java não é uma linguagem tão revolucioníria quanto se clama. Muitos dos conceitos implementados estão presentes em linguagens orientadas a objeto modernas, como Eiffel e Modula-3. O que difere Java das outras linguagens é que ela promete portabilidade total e a possibilidade de criação de pígina WWW interativas para a Internet. Java é uma linguagem definida como simples, orientada a objetos, robusta e segura, de arquitetura neutra, portível, interpretada, de alta performance, com suporte a concorrência e dinâmica. Discutirmos o que cada uma dessas palavras querem dizer e olharemos Java como qualquer outra linguagem de programação, à luz dos conceitos e tópicos em linguagens de programação. Java parece ser uma linguagem de programação muito útil e de grande produtividade. Bjarne Stroustrup, o idealizador de C++: "C faz com que seja muito fícil atirar nos próprios pés. C++ faz com que isso se torne mais difàcil, mas quando você consegue, destrói toda a perna." Acreditamos Java que torne muito difàcil atirar na própria perna. Histórico Java originou-se como parte de um projeto de pesquisa que visava a criação de um software avançado que atendesse a uma extensa variedade de maquinírio de redes e sistemas embutidos. O objetivo inicial era desenvolver um ambiente operacional pequeno, confiível, portível, distribuàdo e que operasse em tempo real. Inicialmente, a linguagem escolhida foi C++. Porém, a com o passar do tempo, as dificuldades encontradas com C++ aumentaram até o ponto em que os problemas poderiam ser melhor endereçados se fosse criada uma linguagem completamente nova. As decisões de arquitetura e desenho da linguagem foram inspiradas em linguagens como Eiffel, SmallTalk, Objective C, e Cedar / Mesa. A sintaxe tem suas raàzes claramente definidas em C e C++. Deste modo, Java foi projetada para atender a vírios requisitos desejíveis em uma LP, como por exemplo, confiabilidade, devido ao seu gerenciamento de memória, o que resulta em um ganho de eficiência; redigibilidade, por eliminar alguns conceitos de C e C++ que dificultavam nesse sentido; reuso de código. As palavras que definem Java A documentação de Java [1] fornecida pela Sun utiliza algumas palavras para definir a linguagem, faremos uma cràtica a respeito de cada uma delas. 1) Simples Uma caracteràstica marcante de Java é a simplicidade da linguagem, que pode ser programada sem um treinamento intenso, ou larga experiência anterior. Programadores de C++ terão uma rípida compreensão de Java devido à sua semelhança com Java. Java foi criada tão unida quanto possàvel a C++ para se criar sistemas mais compreensàveis. Java omite muitos termos pouco usados e operações confusas em C++ que trazem mais complicações que benefàcios. A versão Java, é na verdade, uma versão mais limpa de C++. Nela não hí ponteiros aritméticos, estruturas, uniões, sobrecarga de operadores, classes bísicas virtuais e etc. Ao mesmo tempo que é uma linguagem simples, existem aspectos sutis na construção de programas para o mundo real, dada a atual situação da biblioteca de classes e da não muito avançada programação visual. Com o tempo os recursos tendem a aumentar mais e mais com a criação de bibliotecas e desenvolvimento de ambientes. 2) Orientada a objeto A orientação a objeto é uma técnica que enfoca o modelo do dado (Objeto) e sua interface. As facilidades de orientação objeto de Java são essencialmente as de C++. As operações de OO de Java são comparíveis com as de C++. A maior diferença entre Java e C++ estí em múltipla herança, pois Java parece ter encontrado uma solução melhor. Os programadores podem reutilizar código, utilizar bibliotecas de terceiros com proteção e encapsulamento, e adicionar funcionalidade às jí existentes. Java possui tipagem forte, o que pode ser uma vantagem para programadores vindos de uma linguagem como Smalltalk. 3) Robusta e Segura O projeto de Java visou a construção de uma linguagem para escrita de programas confiíveis. Java enfatiza em muito a checagem em tempo de compilação de possàveis problemas, e em tempo de execução realiza a checagem dinâmica, e eliminação de situações que podem gerar erros. A maior diferença entre C/C++ e Java é que Java por definição da própria linguagem elimina uma gama de erros que geralmente surgem em C/C++ quando utilizamos ponteiros. Java fornece a funcionalidade de ponteiros sem que seja necessírio criar estruturas para tal. Estas estruturas eliminam a possibilidade de sobreposição de dados na memória corrompendo dados. Java é designada para operar em ambientes onde segurança é extremamente importante, como o ambiente de rede. 4) Arquitetura Neutra Java é projetada para suportar aplicações que serão distribuàdas para os diversos ambientes de trabalho em rede. Em tais ambientes aplicações devem ser capazes de executar em uma grande variedade de míquinas. Nas vírias plataformas de hardware, aplicações devem executar sobre um universo de sistemas operacionais e operar interagindo com outras linguagens de programação. Isto é possàvel graças à arquitetura idealizada, onde o compilador Java gera um código binírio para uma JVM (míquina virtual Java) - uma arquitetura neutra e portível. Assim, qualquer míquina que possa rodar uma míquina virtual Java pode rodar programas jí compilados sem requerer a menor mudança. A natureza "interpretada" de Java resolve ambos os problemas de distribuição biníria e de versão. 5) Portível Diferente de C/C++, não hí aspectos de implementação dependentes da especificação. O tamanho dos tipos primitivos são especificados, bem como os seus comportamentos aritméticos. Um inteiro tem sempre 32 bits, em C/C++ tem o tamanho da palavra da míquina. Tendo fixado o tamanho dos tipos numéricos, é eliminada a maior causa de dores de cabeça. Os dados binírios são armazenados em formato fixo, eliminando a confusão de big endian e little endian. 6) Interpretada O interpretador Java pode executar o código binírio Java diretamente em alguma míquina para o qual ele tenha sido portado. Em um ambiente interpretado tal como o sistema Java, a fase de linkagem de um programa é simples, incremental e leve. O processo de desenvolvimento pode ser muito mais rípido. Esta é uma vantagem enquanto desenvolvemos uma aplicação, mas ela é claramente mais lenta que um código compilado. 7) Alta Performance Enquanto a performance do código binírio interpretado é geralmente adequado, hí situações onde maior performance é requerida. O código binírio pode ser traduzido em tempo de execução para outro código de míquina para ser executado em uma aplicação de uma CPU particular. Espera-se que em breve teremos compiladores de Java também para míquinas reais. 8) Dinâmica Java é mais dinâmica que C/C++. Bibliotecas podem livremente somar novos métodos e instâncias de variíveis sem nenhum efeito em seus clientes. Em Java descobrir o tipo de uma instância em tempo de execução é algo extremamente simples. 9) Concorrência (Threads) Concorrência é a habilidade para um programa fazer mais de uma coisa por vez. Os benefàcios de multiprocessamento são melhor sensibilidade interativa e comportamento em tempo real. O threads em Java têm a capacidade para pegar as vantagens de sistemas multiprocessadores se o sistema operacional faz o mesmo. Por outro lado implementações threads em plataformas diferem amplamente, e Java não faz esforço para ser uma independente de plataforma neste caso. Java suporta multiprocessamento no nàvel de linguagem com a adição de sofisticada sincronização. Tipos primitivos Os tipos inteiros em Java são: byte (8 bits); short (16 bits); int (32 bits) e long (64 bits). O tipo byte (8 bits) em Java veio a substituir o antigo tipo char (C e C++). Não hí nada em Java para especificar um tipo inteiro sem sinal como em C e C++. O tipo de ponto flutuante em Java pode ser o float (32 bits) e o double (64 bits). Os operadores aritméticos seguem o padrão IEEE 754 1. O tipo char declarado em Java define um caracter de 16 bits, seguindo o padrão Unicode (um código anílogo ao ASCII que define caracteres para todas as lànguas, como um código universal). Os tipos booleanos em Java, diferentemente dos similares em C, não podem ser convertidos para nenhum tipo numérico. Valores booleanos em Java assumem apenas true ou false. Todos os tipos primitivos têm valores default. Todos os tipos numéricos são inicializados para 0, o tipo caracter é inicializado para o Unicode 0 e variíveis do tipo booleano são inicializados para false. Tipos Compostos As uniões disjuntas, produtos cartesianos e conjuntos de potência foram eliminados em Java. Os dois primeiros foram deixados de lado pois sendo Java uma linguagem orientada a objetos, as classes substituem essas construções. Jí os conjuntos de potência são supridos como classes da API (a classe BitSet). Tipos recursivos são suportados. Todos os tipos em Java que não são primitivos são tipos de referência a objetos, incluindo arrays. Ao contrírio de C e C++, os arrays em Java são objetos de primeira classe. É possàvel ao programador declarar arrays de qualquer tipo, e ainda declarar arrays de arrays para vetores multidimensionais. Um array em Java, como qualquer outro objeto deve ser alocado dinamica e explicitamente com o operador new. Uma vez que o objeto é alocado e tem um certo tamanho, este não muda. Tais procedimentos garantem mais confiabilidade ao código escrito em Java, jí que ficam eliminados os erros por violação de memória e perda de dados durante a execução do programa. Se o programador viola os limites de um vetor, é gerada uma exceção. De acordo com as definições descritas acima, pode-se classificar os arrays em Java como semi-dinâmicos, semelhante aos arrays em Ada. O acesso aos elementos do array segue o estilo de indexação de C. Porém, no momento em que é feita qualquer referência a um desses elementos é checado o tamanho do array para se verificar se não estí sendo tentado um acesso a um àndice fora do tamanho do array. Caso isso ocorra, é gerada uma exceção. Arrays não são a única implementação de vetores existente em Java. A API fornece a classe Vector que possibilidade a construção de vetores dinâmicos. Vale lembrar que o acesso a essa classe Vector é toda feita através de métodos e não de operadores de arrays. Strings em Java são objetos, e não "pseudo-arrays" como em C. Existem duas classes na API de Java que implementam arrays: StringBuffer e String. A definição da linguagem define a sobrecarga do operador de adição para a utilização com a classe String, e de literais do tipo String. Expressões Uma expressão em Java pode produzir três resultados: um valor uma variível (uma referência a uma variível) nada (a expressão é void) As expressões literais providas são de números inteiros e de ponto flutuante, caracter, booleano e string. Não são suportados agregados, e as expressões condicionais são suportadas através do operador ternírio (o mesmo de C). Uma expressão produz nada se e somente se ela é uma chamada a um método de tipo de retorno void. Tal expressão pode ser usada somente como uma expressão comando, porque qualquer outro contexto em que uma expressão possa ser usada requer que a expressão produza um valor ou uma variível. Uma expressão que é uma chamada a um método pode ter o seu valor de retorno silenciosamente descartado. Além disso, a execução de expressões pode produzir efeitos colaterais, pois além de chamadas a funções e atribuições, expressões podem conter operadores como ++ e --. Variíveis Em Java, como foi dito anteriormente, qualquer variível que não seja de um tipo primitivo é uma variível de referência a um objeto. Daà concluàmos que somente as variíveis de tipos primitivos são realmente storables. Todas as variíveis de referência tem campos que podem ser atualizados seletivamente. Além de todas variíveis de tipos compostos (não primitivos) serem referências, estas tem ter seus objetos alocados explicita e dinamicamente através do operador new, e não é permitido o uso de variíveis não inicializadas. Isto serí discutido adiante no tópico que se refere a orientação a objetos. Vale lembrar que todos os problemas de ponteiros foram eliminados, através da ausência de ponteiros (e consequentemente aritmética de ponteiros) e com a existência do garbage collector. As variíveis de referência suprem a funcionalidade ponteiros para a criação de listas encadeadas e outras estruturas de dados que dependem da noção de ponteiro, apesar de não poderem ser de-referenciadas. As variíveis de referência a objetos têm valor default null, ou seja, não apontam para nenhum objeto. Java faz o maior esforço para fazer a checagem de tipos em tempo de compilação. Uma variível de referência a um objeto pode guardar uma referência a um objeto cujo tipo em tempo de compilação pode ser convertido sem o uso de type casting. Veremos isso adiante. Java utiliza equivalência nominal, o que era de se esperar de uma linguagem orientada a objetos, jí que permite a construção de tipos abstratos em que a implementação (estrutura interna dos dados) é ignorada. Em Java, as variíveis locais são declaradas e alocadas dentro de um bloco e são descartadas na saàda do bloco. Parâmetros de métodos também são consideradas variíveis locais. Variíveis constantes são definidas com a palavra chave final. Estas devem ser inicializadas da declaração, e não poderão ser modificadas (amarrações para valor). Podem também ser declaradas como volatile, o que quer dizer que sabe-se que elas serão modificadas assincronamente. Isso quer dizer que as variíveis que são declaradas como volatile serão carregadas e salvadas na memória a cada uso, de forma que possam estar coerentes em multiprocessadores. Comandos Os comandos de controle de fluxo são extremamente semelhantes aos de C, com exceção do goto, que apesar de ser uma palavra reservada na linguagem não é implementado. Todos os comandos são sequenciais. Os comandos de seleção são o if e o switch, sendo o if de caminho simples (com else) e o switch de múltiplos caminhos: if ( Expressão ) bloco_de_comandos else bloco_de_comandos switch ( Expressão ) { case ExpressãoConstante : bloco_de_comandos case ExpressãoConstante : bloco_de_comandos default : bloco_de_comandos } Os de iteração são while, do while e for. while ( Expressão ) bloco_de_comandos do bloco_de_comandos while ( Expressão ); for ( ExpressãoInicialização; Expressão; ExpressãoAvanço ); Os comandos de escapes englobam o return, o continue, o break e o throw. O return é utilizado para interromper a execução de um método, especificando a expressão de retorno, ou não, se o método não for void. O break transfere o controle para o final da iteração no qual estí inserido, ou encerra a execução de um switch. O continue transfere o controle para o ponto de continuação do loop de um comando de iteração. Ambos break e continue podem ser acompanhados de identificadores que especificam a qual dos loops externos estamos nos referindo, jí que existe a possibilidade de amarrar labels a comandos de iteração. O throw "dispara", "joga" uma exceção, desviando o fluxo para o bloco de tratamento de exceções ou interrompendo o programa. Além destes comandos existem os chamados guarding statements que estabelecem condições para o tratamento de exceções e multithreading. São eles o try, o synchronized, o catch e o finally (serão explicados posteriormente nas seções de tratamento de exceções e concorrência). Java e a Orientação a Objetos A orientação a objetos tem provado seu valor nos últimos quase 30 anos, e é inconcebàvel que uma linguagem de programação moderna não seja orientada a objetos. Na especificação da linguagem Java [2] ela é definida como "uma linguagem orientada a objetos baseada em classes", e portanto provê essas caracteràsticas mànimas, suficientes para possibilitar modularização, proteção e reutilização: Encapsulamento - Ocultamento de Informações (Information Hiding) e modularidade (abstrações) Polimorfismo - a mesma mensagem enviada a diferentes objetos resultam em um comportamento que depende da natureza dos objetos recebendo a mensagem. Herança - novas classes são definidas em termos de classes existentes, possibilitando o reuso de código. Amarração Dinâmica - os objetos são possivelmente amarrados em tempo de execução, o que quer dizer que um objeto pode ser até passado por uma rede. A amarração dinâmica provê flexibilidade em tempo de execução, e é a chave para o polimorfismo real. As caracteràsticas da orientação a objetos de Java são similares às de C++. A maior diferença entre elas é que Java parece ter achado uma boa solução para substituir a herança múltipla. Todos os tipos de dados, com exceção dos primitivos, são classes. Classes Uma classe é uma construção de software que define variíveis de instância e métodos de um objeto. Uma classe não é um objeto, uma classe é a "definição" de como um objeto se comportarí quando este for criado ou instanciado. A declaração bísica de uma classe em Java é a seguinte: class nome { // informações sobre a classe } Abaixo temos um exemplo de uma classe muito simples: class Pessoa { public String Nome; /* variível de instância */ public String Telefone; /* variível de instância */ } Objetos - Instâncias de uma Classe Para utilizarmos uma classe nós devemos instanciar objetos. Em Java isto quer dizer que criaremos uma referência para um objeto (não existe a idéia de um tipo expandido como em Eiffel [6] e amarrações para valores são possàveis somente para tipos primitivos) - com um fragmento de código como este: Pessoa meuAmigo; // declara uma variível que faz referência a um objeto da classe Pessoa meuAmigo = new Pessoa(); // aloca uma instância de um objeto da classe Pessoa É possàvel acessar uma variível do objeto de uma classe através do nome da variível, qualificando o mesmo com o nome do objeto, da mesma forma com que acessamos uma estrutura em C. Por exemplo: meuAmigo.Nome = "Fulano de Tal"; // atribuição à variível de instância Nome da variível de objeto meuAmigo Todo objeto deve ser alocado dinamica e explicitamente através do operador new, e deve ser inicializado antes de ser usado. Uma variível de objeto que não se refere a nenhum objeto deve ter o valor null. Um erro de tempo de execução ocorre se for utilizado um ponteiro não inicializado ou null. Um objeto em Java pode ser visto de forma aníloga a ponteiros para objetos em C++. Se você copia uma variível para outra, ambas se referem ao mesmo objeto, são "ponteiros" para o mesmo objeto. A diferença reside que, em C++, é muito fícil se criar ponteiros "ruins" (usando aritmética de ponteiros, não existente em Java) ou termos problemas de objetos e referências pendentes. O garbage collector garante que tais problemas não ocorrerão. Construtores Ao declarar uma classe em Java, opcionalmente definimos construtores. Construtores fazem a inicialização de objetos ao serem instanciados. Os construtores são métodos com o mesmo nome da classe e que não têm tipo de retorno especificado. Quando um objeto é criado (instanciado), o método construtor apropriado é automaticamente invocado, para, por exemplo, dar um estado inicial ao objeto. Se uma classe não contém declarações de construtores, então um construtor default é fornecido automatica e implicitamente. Um construtor só pode ser chamado com a palavra chave new, e não pode ser aplicado a um objeto existente. Exemplo: class Pessoa { public String Nome; /* variível de instância */ public String Telefone; /* variível de instância */ Pessoa() { /* construtor default */ Nome = ""; Telefone = ""; } Pessoa(String N, String T) { Nome = N; Telefone = T; } } Pessoa outroAmigo = new Pessoa("Fulano 2","444-4444"); // acima temos um exemplo de utilização de construtor: outroAmigo.Pessoa("XXX","222"); /* ERRO! construtores só podem ser utilizados para instanciar elementos com new */ Métodos / Mensagens Métodos são a forma com que os objetos interagem entre si. Na orientação a objetos, para se atingir encapsulamento e proteção, todas as interações entre objetos (ditas mensagens) devem ser feitas através dos métodos de uma classe. Não hí funções e procedimentos em Java, haja vista que a programação procedural foi totalmente substituàda. Mesmo assim, a forma de se invocar métodos em Java se assemelha à de funções em C e C++. Qualquer método pertence a uma classe, e deve ser definido dentro do corpo da mesma. Podemos como exemplo modificar a nossa classe Pessoa: class Pessoa { private String Nome; /* variível de instância */ private String Telefone; /* variível de instância */ Pessoa() { /* construtor default */ Nome = ""; Telefone = ""; } Pessoa(String N, String T) { Nome = N; Telefone = T; } public void mudaNome(String Nome) { this.Nome = Nome; } public String leNome() { return Nome; } public String leTelefone() { return Telefone; } } No exemplo acima as variíveis de instância Nome e Telefone foram precedidas pela palavra chave private, o que quer dizer que essas variíveis só poderão ser acessadas por métodos da classe à qual pertencem. No exemplo acima utilizamos a palavra chave this. Essa variível se refere ao objeto que estí recebendo a mensagem, ou seja, o objeto no qual o método estí sendo aplicado (Em C++ this é o ponteiro para o objeto que recebe a mensagem, e em Java é a referência para esse objeto). Invocando esses métodos qualificamos o nome do método com o nome do objeto: Pessoa meuAmigo = new Pessoa("Fulano de Tal","999-9999"); meuAmigo.mudaTelefone("222-2222"); /* invocamos o método mudaTelefone da classe Pessoa sobre o objeto meuAmigo, ou melhor, mandamos uma mensagem mudaTelefone para o objeto meuAmigo. */ Java permite a sobrecarga independente de contexto de métodos, mas não permite a sobrecarga de operadores. Para sobrecarregarmos um método basta declararmos outro método de mesmo nome com uma assinatura diferente (tipo e ordem dos parâmetros formais). Métodos podem ser declarados nativos, utilizando a palavra chave native. Isto quer dizer que eles serão implementados de forma dependente de plataforma, por exemplo em C ou assembly. Java trata um método nativo como outro qualquer. Destrutores Além de construtores, a linguagem provê a construção de métodos destrutores. Os destrutores são métodos responsíveis por liberar os recursos alocados durante a vida de um certo objeto. Eles são invocados automaticamente pelo garbage collector, imediatamente antes deste "recolher" um objeto. Esse método deve se chamar finalize. /* Fecha um arquivo aberto quando o garbage collector atua */ protected void finalize() { try { file.close(); } catch (Exception e) { } } O exemplo acima mostra um tàpico caso em que o seu objeto deve liberar os recursos alocados do sistema operacional, como por exemplo fechar descritores de arquivos, liberar contextos em ambientes gríficos, etc. Herança A herança é um mecanismo através do qual novas e mais especializadas classes podem ser definidas em termos de classes pré-existentes. Um exemplo é a criação de uma classe Funcionario, como uma subclasse de Pessoa. Em Java: class Funcionario extends Pessoa { // Novos métodos e instâncias podem ser inseridos aqui } class Secretaria extends Funcionario { ... } class Gerente extends Funcionario { ... } A palavra chave extends diz que Funcionario é uma subclasse de Pessoa, chamada de classe base. Dizemos que Funcionario herda as caracteràsticas de Pessoa, jí que este reutilizarí boa parte do código e funcionalidade descrita na classe Pessoa. class Funcionario extends Pessoa { private float salario; public Funcionario(String Nome, String Telefone, float salario) { super(Nome,Telefone); this.salario = salario; } public Funcionario aumenta_salario(float aumento) { salario = salario + aumento; } } A classe Funcionario herda as variíveis de instância Nome e Telefone, e os métodos (mudaTelefone, leTelefone, leNome) da classe Pessoa, com a exceção dos construtores. Nesse caso devemos criar novos construtores que façam, opcionalmente, na primeira linha do corpo, uso da palavra chave super para se referir ao construtor da superclasse, como no construtor do exemplo acima. Se a subclasse não tem definições de construtores, o construtor super() é invocado, ou seja, o construtor default da classe imediatamente superior. Toda classe em Java é subclasse (não necessariamente imediata) da classe Object. Quando não utilizamos a palavra chave extends numa declaração de classe, implicitamente esta se torna subclasse imediata de Object. Uma referência a um objeto da superclasse B (ou classe base) pode também ser referência de uma subclasse S de B. Jí o contrírio exige o uso de type casting, ou seja a coerção (coercion) deve ser explàcita. Object o; Pessoa fulano; Funcionario contador1 = new Funcionario("Fulano de Tal","222-2222"); Pessoa meuAmigo = new Pessoa("Amigo da Onça","555-5555"); fulano = contador1; // ok! um funcionírio é uma pessoa o = contador1; // a classe Funcionario é derivada indireta de Object contador1 = meuAmigo; // ERRO! meuAmigo é da classe pessoa, que é uma superclasse de Funcionario contador1 = (Funcionario) meuAmigo; // com a utilização de type casting esta conversão se torna possàvel Se for necessírio modificar um método da classe superior, ou especializí-lo, é possàvel declarando-se um método de mesma assinatura na subclasse. Não é possàvel sobrepor um método declarado como final. Ao contrírio de C++, no qual as funções virtuais devem ser declaradas como tal, em Java, por default, as funções são virtuais. Para acessarmos o método "sobreposto" (overrided) utilizamos o seletor super, que é, na verdade uma referência à superclasse, equivalente a ((superclasse)this). Java implementa herança simples, ao contrírio de C++ e Eiffel que implementam herança múltipla. Isso quer dizer que uma classe só pode ter uma superclasse imediata. Isso pode, a primeira vista, parecer uma caracteràstica limitante, mas em Java o conceito de Interfaces (presente também no Objective C como protocols) faz com que a linguagem não perca o seu poder expressivo. Polimorfismo O polimorfismo é uma das caracteràsticas marcantes de linguagens orientadas a objetos. Ela permite que a mesma mensagem enviada a diferentes objetos resultem em um comportamento que depende da natureza dos objetos recebendo a mensagem, ou seja, permite a construção de abstrações que operem uniformemente sob uma famàlia de tipos relacionados. Quando uma mensagem é enviada para um objeto de uma subclasse em Java: A subclasse checa se ela tem um método aquele nome e com exatamente os mesmos parâmetros. Se a resposta for positiva, ela usa esse método. Caso contrírio, Java envia a mensagem à classe imediatamente superior. Se toda a hierarquia for caminhada sem que um método apropriado seja encontrado um erro em tempo de compilação ocorre. A amarração dinâmica é a chave para o polimorfismo. O compilador não gera código em tempo de compilação para uma chamada de método, ele gera código para determinar que método chamar em tempo de execução usando a informação de tipo disponàvel para o objeto. Java não suporta abstrações genéricas, como o template de C++. Essa funcionalidade é implementada com a utilização da classe Object. Uma clara diferença dessa falta é que ele permite uma flexibilidade muito grande, que deve ser administrada corretamente pois pode ser perigosa. Vamos tomar como exemplo uma lista de Object. Essa lista pode conter Funcionarios, Retangulos, Frutas, etc. Jí em C++ ou Eiffel, na declaração do tipo genérico teràamos a criação de uma nova abstração especàfica para um certo tipo. Tomando C++ como exemplo, criaràamos uma lista<Funcionario> e teràamos um novo tipo que somente aceitaria Funcionarios. Controle de Acesso Ao declararmos uma classe em Java, indicamos o nàvel de acesso permitido para suas instâncias e métodos. Existem quatro nàveis, e três modificadores: public, protected, e private. Definimos também o nàvel de acesso da classe inteira, existindo apenas o nàvel public e o "friendly". O nàvel public permite o acesso ilimitado, o protected significa que os campos são acessàveis somente em subclasses, e o private que são acessàveis somente dentro da classe onde são declarados. O quarto nàvel não tem um nome, mas é freqüentemente chamado de "friendly". Esse é o nàvel default. Ele indica que os campos são disponàveis para todos objetos dentro daquele pacote (package). Os packages em Java são coleções de classes que têm nomes hierírquicos. Ao utilizar um pacote, o seu código deve incluir uma clíusula import, ou qualificar os métodos, variíveis e constantes utilizadas. Isso permite que você distribua adequadamente suas "bibliotecas" de classes e que essa classes sejam utilizadas em outros programas. import java.net.*; // importa todas as classes do pacote java.net import java.util.Bitset; // importa somente a classe BitSet do pacote java.util java.util.Date hoje = new java.util.Date(); /* utilizando a classe Date dentro de java.util, pacote que não foi completamente importado */Variíveis e Métodos de Classe Normalmente quando definimos variíveis em uma classe definimos variíveis de instâncias. Para cada objeto criado uma nova variível de instância é criada, e utilizada apenas para representar o estado deste objeto. Jí as variíveis de classe são compartilhadas por todos objetos de uma classe, sendo utilizadas para representar o estado de toda uma classe. Jí os métodos de classe servem para manipular as variíveis de classe, e não podem, de forma alguma manipular variíveis de instâncias, ou invocar métodos de instâncias. Para declarar variíveis ou métodos de classe, utilizamos o modificador static: class Vendedor extends Funcionario { private static float comissao = 2.5; public void static mudaComissao(float c) { comissao = c; } /* a comissão de todos os vendedores de uma loja é a mesma, logo ela deve ser declarada como uma variível de classe */ } Classes e Métodos Abstratos Classes Abstratas são construções poderosas no paradigma da orientação a objetos. Elas têm grande influência sobre a etapa de design, principalmente na concepção das relações de hierarquia entre as classes. Ao subirmos na hierarquia de herança, as classes se tornam cada vez mais gerais e provavelmente mais abstratas. Hí um ponto em que elas são tão abstratas que as vemos como uma representação para derivação de outras classes, ao invés de as observarmos como classes das quais objetos serão criados. Métodos abstratos são aqueles que não podem ser implementados em classes tão abstratas, mas que devem ser implementados em subclasses. Uma classes deve ser declarada abstrata se ela tem pelo menos um método abstrato (os métodos abstratos eqüivalem às funções virtuais puras de C++ e às deffered features de Eiffel) Para declararmos métodos e classes abstratas devemos utilizar a palavra chave abstract. Classes abstratas não têm construtores nem podem ser instanciadas. class FormaGeometrica extends Object { protected Ponto centro; // centróide da forma geométrica public void mudaCentro(Ponto centro) { this.centro = centro; } abstract void desenha(); // método abstrato }Interfaces Uma declaração de uma interface declara um tipo que consiste num conjunto de métodos e constantes sem especificar a sua implementação. Interfaces podem ser bons substitutos para classes abstratas sem nenhuma implementação, e fornecem o poder da herança múltipla de interfaces, sem a confusão causada pela herança múltipla de classes (que por sua vez contêm implementação). Uma interface pode herdar suas caracteràsticas de diversas superinterfaces. Quando uma classe é declarada ela pode opcionalmente fornecer uma lista de interfaces as quais são implementadas por ela. Assim sendo, ela se torna responsível por fazer tal implementação. Uma subclasse de uma classe que implementa alguma interface automaticamente herda a implementação dessa interface. Um exemplo claro é a implementação de uma interface Ordenavel: public interface Ordenavel { public int compara(Ordenavel a); /* compara elementos, retornando positivo para maior que, negativo para menor que, e zero para iguais */ } /* classe que implementa a interface Ordenavel, lembre-se que interfaces declaram novos tipos, logo podem ser utilzados como parâmetros formais */ class Circulo extends FormaGeometrica implements Ordenavel, ... { private float raio; public void desenha() { ... } public int compara(Ordenavel a) { Circulo ca = (Circulo) a; return raio - a.raio; } } Concorrência (Threads) A concorrência permite que vírias partes do seu software estejam rodando simultaneamente. Usuírios de computadores sofisticados tornam-se impacientes ao fazer uma coisa de cada vez em seus computadores pessoais. Infelizmente os programadores que necessitam de concorrência em linguagens como C e C++ enfrentam muitas dificuldades, jí que essas linguagens não suportam diretamente multithreading. Java o faz a nàvel da linguagem e com classes apropriadas em sua API, com multitarefa pre-emptiva. A nàvel da linguagem, métodos declarados synchronized não rodam simultaneamente. Tais métodos rodam sob o controle de monitores que se asseguram que as variíveis permanecerão em um estado consistente. Java faz o controle de locks automaticamente, sem que o usuírio precise se preocupar. Para criarmos um objeto que rode em outra thread simplesmente derivamos a nossa classe da classe Thread, ou implementamos a interface Runnable. A partir de então, sobrecarregamos o método run() com o código desejado. Quando instanciamos um objeto dessa classe e invocamos o seu método start(), este imediatamente retornarí e a aplicação ficarí sendo executada em background. Além da simplicidade de se trabalhar com threads existe a possibilidade do controle de prioridades. class PingPongThread extends Thread { String mensagem; int atraso; PingPongThread(String mensagem, int atraso) { this.mensagem = mensagem; this.atraso = atraso; start(); } public void run() { while (true) { // loop infinito System.out.println(mensagem); // imprimimos a mensagem sleep(atraso); // geramos o atraso } } } new PingPongThread("ping",500); new PingPongThread("pong",600); Esse trecho de código cria dois objetos que rodarão em diferentes threads. As mensagens de "ping" e "pong" serão intercaladas na tela. Tratamento de Exceções O tratamento de exceções permite que um erro seja tratado pelo programador, ou seja, que ele tome decisões acerca de erro ocorrido. A missão principal do tratamento de exceções é transferir o controle do ponto onde o erro ocorreu para um tratador de exceção que sabe como lidar com a situação. O modelo de tratamento de exceções de Java é similar ao de Delphi e C++. Existe uma hierarquia de exceções, implementadas como classes, pré-definidas. Isso não descarta, de forma alguma, a possibilidade do programador criar as suas próprias classes de exceções, derivando subclasses dessa hierarquia. Abaixo temos um diagrama simplificado da hierarquia de exceções em Java: A hierarquia Error descreve erros internos e escassez de recurso do sistema Java. Programadores não deve "jogar" exceções desse tipo, e sim aqueles da hierarquia Exception. Para criar um trecho de código que trate uma exceção, você deve fazer uma construção try/catch. Além disso, na declaração do método onde uma exceção vai ser possivelmente jogada é necessíria a inclusão de uma especificação de exceção. class Nome_da_Classe { ... tipo_de_retorno Método (parâmetros formais) throws Tipo_de_Exceção1, Tipo_de_Exceção2 { try { bloco de código ... } catch (TipodaExeceção e) { tratador para esse tipo de exceção } catch (OutroTipodaExeceção e) { tratador para esse tipo de exceção } finally { código que serí executado até mesmo na presença de uma exceção } } Para "jogar" uma exceção, usa-se o comando throw. Quando um comando throw é encontrado, a execução normal do programa é suspensa, enquanto um tratador adequado é procurado. A clíusula catch que melhor se adequar para o tratamento daquela exceção serí executada, respeitando a seguinte ordem: 1.O tipo de exceção da clíusula catch é exatamente da exceção jogada. 2.O tipo de exceção é uma superclasse daquela jogada. 3.O tipo de exceção é uma interface que a exceção jogada implementa. Qualquer código dentro do bloco try depois da clíusula throw não serí saltado. Uma exceção pode ser jogada novamente dentro de uma clíusula catch se houver necessidade de propagí-la. Quando um bloco catch completa sua execução, a clíusula finally é procurada. Se esta não existe, a execução continua na próxima instrução depois do bloco try. Uma clíusula finally é usada para a parte do código que deve ser executada mesmo se uma exceção ocorrer. Se uma exceção não é tratada num método, a execução deste é cancelada e a exceção é propagada para o método chamador. Se ela não for tratada em lugar algum, a aplicação é interrompida com uma mensagem (no caso de aplicações gríficas a mensagem é mostrada mais a aplicação não é encerrada). Conclusões Java parece ser uma linguagem razoavelmente simples, se, comparada a C++. Muitas das caracteràsticas de C++ indesejadas e herdadas de C foram eliminadas. Ainda assim com certeza é familiar a programadores C/C++. É uma linguagem significativamente segura, com a ausência de ponteiros e garbage collecting. Permite a programação em larga escala, através da orientação a objeto, com proteção, encapsulamento, reuso de código e outras caracteràsticas desejíveis em uma linguagem de uso geral. Concorrência e tratamento de exceções são duas caracteràsticas que se destacam na linguagem, uma preocupação de linguagens modernas, assim como a sua natureza portítil / interpretada. A linguagem não provê abstrações genéricas, o que consideramos uma falta (apesar de que é possàvel criar abstrações que possam tratar quaisquer objetos). As interfaces parecem ser uma boa idéia para a substituição de herança múltipla de classes. Apesar de suas vantagens como linguagem de programação, Java tem a desvantagem de ser uma linguagem ainda muito nova. A falta de ambientes de desenvolvimento e ferramentas estí sendo rapidamente suprida, jí que a linguagem chamou muita atenção da comunidade de programadores. Esperamos que em breve teremos muitos sistemas desenvolvidos para Java, jí que as próximas versões de sistemas operacionais para microcomputadores como o Windows e o OS/2 estarão incluindo a míquina virtual Java. Além disso, existem projetos em andamento para a construção de um processador Java que acelerarí a execução de aplicações executando o código binírio Java em hardware. Bibliografia [1] GOSLING, James e McGILTON, Henry, The Java Language Environment - A White Paper , Sun Microsystems Computer Corporation, Outubro de 1995. [2] The Java Language Specification - Version 1.0 Beta, Sun Microsystems Computer Corporation, Beta Draft of October 30, 1995. [3] RITCHEY, Tim, Programming with Java! Beta 2.0, Ed. New Riders, 1995. [4] CORNELL, Gary e HORSTMANN, Cay, Core Java, Ed. Prentice Hall. [5] Object-Oriented Languages in the Industry: A Comparison http://www.eiffel.com./doc/manuals/tech ... index.html [6] MEYER, Bertrand, An Invitation to Eiffel, http://www.eiffel.com/doc/manuals/language/intro By: Loost :XTibia_smile:
  10. Olá! Vim aqui disponibilizar este site que editei e não estou usando... Façam bom aproveito! Espero que Curtem. Print: Download: É só substituir a pasta templates do Website do OTPOKEMON Aviso: A senha para descompactar o WebSite OTPokemon 1.0 (2014).Rar é: (otpokemon!) sem os parenteses Scan: Créditos> Modern Acc; Kranzix; Eu
  11. Tipo do script: sistema de invasão Protocolo (versão do Tibia): 8.60 Servidor utilizado: TFS 0.4 SVN Nível de experiência: Não sei Adicionais/Informações: Queria um sistema de invasão com os seguintes eventos, igual ao do global. * Hora e dia; * Local para os monstros nascer; * E se ninguém matar o mostro sumir depois de 15mim ; * Enviar msg no broadcast; * De forma automática executar os raids. Tentei utilizar este sistema http://www.xtibia.com/forum/topic/156691-globalevents-invasao/ Mas não funcionou aqui.
  12. Servidor feito especialmente para jogadores que gostam do Tibia Oldstyle, mas colocado na versao 12 com novas funcionalidades, mounts, outfits e itens. Todos Outfits sao frees & Addons coletando itens PVP classico, old school times Spells adaptadas a versao 8.60 Mais de 50 quests na Teleport Room Tasks e Missions para explorar o mapa Raids automaticas com novos bosses Reward System desabilitado, loot tradicional Areas custom e inovadoras como Hogwarts e Westeros Para mais informacoes sobre as configuracoes e mapa, confira nosso server info Apesar de algumas configuracoes em 8.60, o server possui: Quickloot Bestiary Charms Prey System Loot analyser Market System Entre outras funcionalidades Site para Accs: http://baiakeiros.servegame.com/ PS: O TestServer foi aberto hoje, e ficara disponível até na madrugada de Domingo para Segunda-Feira. Todos os jogadores que participarem to TestServer, serão gratificados na inauguração... e todos que ajudarem com correções de bugs terão premiações.
  13. Dodge System por item V2 http://prntscr.com/7f2vl9 Para quem não sabe eu ja tinha feito um Dodge System ano passado, na época que eu não sabia nada, embora eu ainda não saiba nada to melhorando , eu tava sem nada para fazer ai decidir refazer, o script não tem nada de novo só foi modificado e melhorado algumas coisa. Para que não sabe dodge é um sistema que faz com que o player tenha uma certa porcentagem de esquiva de um ataque( por ele te esquivado ele não vai toma nenhum ataque e não apenas 50%) Então vamos la: Em creaturescript: Dodge System.lua function onStatsChange(cid, attacker, type, combat, value) local getStorage = getPlayerStorageValue(cid, 123455678) if (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then local chance = math.random (0,100) if chance <= getStorage then doSendAnimatedText(getCreaturePos(cid), "MISS!", 214) doSendMagicEffect(getCreaturePosition(cid), 30) return false end end return true end Creaturescript.xml <event type="StatsChange" name="DodgeSystem" event="script" value="Dodge System.lua"/> Login.lua antes do ultimo return true registerCreatureEvent(cid, "DodgeSystem") if getPlayerStorageValue(cid, 123455678) == -1 then setPlayerStorageValue(cid, 123455678, 0) end em action: dodgestone.lua function onUse(cid, item, fromPosition, itemEx, toPosition) local max = 50 -- limite de dodge local storagedodge = 123455678 -- storage do dodge if getPlayerStorageValue(cid, storagedodge) >= max then return doPlayerSendTextMessage(cid,22,"Você ja chego no limite de Dodge.") else doPlayerSetStorageValue(cid, storagedodge, (getPlayerStorageValue(cid, storagedodge)) + 1) doPlayerSendTextMessage(cid,22, "DodgeSKILL:["..getPlayerStorageValue(cid, storagedodge).."/"..max.."].") doRemoveItem(item.uid, 1) end return true end action.xml tag <action itemid="Id do item" event="script" value="dodgestone.lua"/> Se tiver algum bug ou dica de como melhorar pode comentar ai nos cometários Ps. com base nesse da para fazer Critical System, Reflect System e da para usar como magia de esquiva, se precisar é so fala
  14. Estou vendendo esse website Modern acc de poketibia, ele tem um modelo/layout diferenciado de qualquer outros servidores. Também tem o sistema de feedback, onde a pessoa da um feedback e esse comentário é aparecido na home do site, e só pode dar 1 feedback por conta! Dou todo o suporte para instalação e funcionamento do site. confira os prints abaixo: OBS:Se eu estiver no tópico errado, peço desculpa e que me avisem para eu poder corrigir.
  15. Crystal Server Olá Venho lhes trazer novamente o Crystal Server, agora que o post do TFS 0.4 foi cair na internet por um Ex-TFS Developer liberou, este server não é mais "ilegal", por tanto ninguém pode vir aqui e fechar alegando isto. Aviso Conta do GOD é 222222/password O Changelog pode ser visualizado clicando AQUI Ou se prefirir veja dentro do download em doc/CHANGELOG Downloads: Server - 0.1.5 SOURCE - 0.1.5
  16. Grande Inauguração do Arkadia Baiak Versão 8.60 Dia 5 de dezembro de 2021 ● PVP 100% BALANCEADO ● WAR CASTLE INOVADOR ● O OTSERVE CONTÉM 3 VIPS ÚNICAS. ● EVENTOS ÚNICOS E EXCLUSIVOS. ● SISTEMAS INOVADORES PARA MELHORAR A EXPERIÊNCIA DO PLAYER NO GAME ● HUNTS EXCLUSIVAS ● STAFF ATIVA ● BOSSES ÚNICOS ● MISTÉRIOS ESPALHADOS PELO MAPA E MUITO MAIS..... ? CURTEM A NOSSA PAGINA NO FACEBOOK PARA FICAR POR DENTRO DAS NOVIDADES, LA POSTAREMOS FOTOS E MUITO MAIS? CLIQUE AQUI PARA IR NO FACEBOOK
  17. Compilando OTCLient no Windows Antes de mais nada, gostaria de dizer que eu não fiz o tutorial, apenas traduzi para português. Link de post original >> https://github.com/e...ling-on-Windows Neste tutorial eu explicarei como compilar e rodar o OTClient em máquinas com o Windows. Faça o download do que você precisará Existem várias ferramentas que você precisa para compilar o projeto, cada uma delas está listada abaixo com seu link. * CMake 2.8.8 ou superior * CodeBlocks sem o MinGW, nós usaremos a versão mais nova * MinGW32 20120426 ou superior * otclient libraries for mingw32 * Código fonte do OTClient Tenha certeza que você instalou as últimas versões, caso contrário, as coisas podem não funcionar. Instale o MinGW32 Observe que o GCC que deve ser usado é o 4.6 ou superior, qualquer versão antiga do GCC que você já tenha instalado não funcionará porque o OTClient precisa de alguns recursos que só são suportados por compiladores recentes. Rode o instalador do MinGW32 e no processo de instalação quando for perguntado tenha certeza que você marcou a caixa para usar o catálogo mais atual. Instale o CMake Rode o instalador do CMake, durante o processo de instalação deverá ser perguntado se você quqer que o CMake configure suas variáveis do sistema(PATH), diga que não, isso será manualmente feito nos próximos passos. Instale o CodeBlocks Rode o instalador do CodeBlocks, Lembre-se, NÃO instale o MinGW quando ele pedir. Instale as bibliotecas do OTClient Extraia o arquivo otclient-libs_mingw32-dwarf2.zip em C:/MinGW/. Esse arquivo zip contem três pastas *lib, include e bin, que serão fundidas a C:/MinGW/lib, C:/MinGW/include e C:/MinGW/bin. Configure a variável PATH do sistema Agora que todas as ferramentas necessárias estão instaladas, você deve configurar a variável PATH do sistema, para fazer o CMake encontrar o MinGW32 e as bibliotecas instaladas, vá para: Painel de controle -> Sistema -> Avançado -> Variáveis de Ambiente Verifique se na área Variáveis de usuário, existe a variável PATH, se não, crie uma e defina ela como: C:\Program Files\CMake 2.8\bin;C:\MinGW\bin;C:\MinGW\lib;C:\MinGW\include Tenha certeza que a variável do usuário PATH existe e que refere para o diretório do CMake. Baixe o código fonte do OTClient Vá para página de download e faça o download do código fonte do OTCLient. O diretório onde você colocará esses arquivos não deve ser longo. Por exemplo: "C:\OTClient\" é um bom diretório, mas "C:\Program Files\OTClient" não é. Gere o arquivo de projeto do CodeBlocks Rode o CMake-gui.exe localizado em \Program Files\CMake 2.8\bin, e especifique o diretório onde você colocou o código fonte do OTCLient, e onde você quer que os arquivos do projeto sejam criados. Clique em configure, seleciona CodeBlocks - MinGW Makefiles, como gerador e gere os arquivos do projeto. Compilando Abra o arquivo de projeto do CodeBlocks que foi gerado (**otclient.cbp**) pelo CMake com o CodeBlocks. Para compilar você deve primeiro configurar a pasta do MinGW32, indo em Settings > Compiler And Debugger... > Toolchain Executables. Tenha certeza de copiar os arquivos Tibia.dat e Tibia.spr dentro da pasta /data/things// antes de rodar o cliente. Suporte a Dx9 Se você quiser ativar a camada de suporte do dx9 para o OTClient, você deve compilar com -DOPENGLES=2.0. Agora o OTClient.exe vai pedir pelas dll libEGL.dll e libGLESv2.dll que você pode conseguir aqui >> https://dl.dropbox.c...nt/dx9_dlls.zip, coloque essas dll na pasta do OTClient.exe Créditos: Eu por traduzir do github e trazer pra cá Edubart pelo tutorial original
  18. Black Tall

    sdfsdf

    fghfgh
  19. Este servidor é uma base cópia do projeto original "Shinobi Online", no qual foi desenvolvido por Ramza (Ricardo Ianelli) & Equipe, no qual foi adaptado por Thalia se tornando "OTNaruto". Base inovadora com um novo formato a ser aprimorado para os Narutibia, com novos sistemas e funções. + VÍDEOS & FOTOS DO SERVIDOR: + DOWNLOAD DO SERVIDOR: (ATUALIZADO 17/12/17) Servidor & Cliente: MEGA.nz (Clique Aqui) Scan: VirusTotal.com (Clique Aqui) Página do OTNaruto: https://www.facebook.com/otNarutoOnline Página do Shinobi Online: https://www.facebook.com/ShinobiOnlineGame/ Tópico atualizado e fixado por Stigal.
  20. IP: pbot.servegame.comSITE: pbot.servegame.comold pbOT está de volta!!Com toda nostalgia do 7.9 agora na versão 8.60.- Odin, Hammunaptra, kazzar, Savage e etc...Magias: (mas exori, exevo gran vis mortexevo mas mortexevo gran mort)Vocação Suprema: titan blader, force archer, high saintess, hell wizzard.- NOVAS TASKS- NOVAS QUESTS- NOVAS HUNTS- EVENTOS DIARIOS (LOTERIA/MADARETH)- VOCAÇÕES BALANCEADASentre outras novidades que trarão de novo, o pbOT antigo à sua realidade!!!!!
  21. BOM PESSOAL, ESSE TUTORIAL EH PARA VC COLOCAR O SEU IP FIXO ! MAS COMO ASSIM ?! EXEMPLO: O seu ip eh 124.0.0.1, e vc quer colocar ele assim: meuip.servegame.com EH BEM SIMPLES ...VAI NO SITE CLICANDO AQUI, SE CADASTRE.......APÓS SE CADASTRAR ..........LOGUE NO SITE COM SEU EMAIL... NO LADO ESQUERDO, TÁ ASSIM : YOUR NO-IP Hostes/Redirects - Add - Manage ETC... PARA CRIAR O SEU IP, CLIQUE EM ADD .... EM Hostname :EH O SEU IP FIXO, EXEMPLO: PLAYSSOM.NO-IP.INFO...... E AONDE TÁ "NO-IP.INFO" EH O RESTO DO IP, EXEMPLO: PLAYSSOM.NO-IP.INFO, HÁ VÁRIAS OPÇÕES, COLOQUE!! (A OPÇÃO EH SUA) EM Host Type: DEIXE COMO TÁ IP Address: EH O SEU IP ...EXEMPLO: 124.0.0.1, PARA VER SEU IP, ALI EMCIMA ESTÁ ESCRITO O SEU IP EM "Current IP" DPS DE TUDO FEITO.... PRONTO! O SEU IP TÁ PRONTIN! e não esqueça de atualizar o seu ip no confg lua xD "Mas cara , eu desconectei a internet e qnd fui voltar, ninguém consegue conectar no servidor só eu !" isso eh mole......abra o site e entre com o seu email...................vá em manege, procure o seu ip,axando, clique em modify, em IP Address vc atualiza o seu ip. Se não for isso, eh o seu firewall que tá bloqueando ou algo parecido.. "Tem atualizador de IP?" claro baixe ele clicando AQUI!!!!!!!!!!!!!!!! QLQUER DÚVIDA ME ADICIONE NO MSN aquillesnightmare@hotmail.com Boa Sorte!
  22. È hoje a inauguração do http://baiaksky.online crie agora sua conta, chame seu time, que da tempo, server será liberado as 18:00 horário de brasilia. - Roshamuul (NEW + Boss com Drop de items bom) - Todas as quests 100% - Auto Loot System - 9 Eventos - Fly System - Addons Bonus System - Mining System - Event Coin System - Itens e vocation balançeadas - Dodge System 100%: !dodge - Critical System 100%: !critical - Push Fast, para melhor PvP - Fast Attack Equilibrado - Players Donates Tem 20% a mais de experiencia - Guild que domina o Castle 24H tem 10% a mais de experiencia - Morgum City (Descubra os Segredos) - Exp 400 (STAGES) - Expulsar players inativos (5 dias offline) de suas houses: !eject - Cast System - War System
  23. Djonga

    erro Erro remeres .dat

    eu abro o remeres normal, abro o mapa do meu servidor, e coloco as dats/spr certinho, e na hora de inicializar aparece o seguinte erro: Tibia.dat: Unknown optbyte '144' after '255' Failed to load flags for sprite 101 e aparece esse erro varias vezes :c alguem pode me ajudar? :x
  24. Olá, venho convidar a todos para inauguração do nosso servidor Custom/Global, vai ser as 18h de hoje venham conferir espero todos vocês. Tibia ForFun, um novo Servidor se inicia, Global Full RL/Custom. Em nosso site vocês podem conferir todos as novidades que temos no Menu "Library", temos sistema de update de items, vários eventos automáticos, evento de boss especiais todo dia em arenas próprias, sistema de atalho para boss, e novos continente sendo um deles NO-PVP. tudo você encontra em nossos site e em nosso Discord, temos atualizações diárias, correções toda semana, melhorias constantes etc. Site: http://tibiaforfun.com/tibiaforfun/ Sobre Servidor: Stages EXP: 500x Skill: 35x Loot: 3.5x Magic: 20x Respaw: 1.5x todos os summer update 2018,2019,2020,2021. todos completos 100% Sistemas novos: Sistema de acesso mais rápido a Boss Sistema de update de itens. Sistema de camas por comando. Sistema de check Boss Sistema de arenas automáticas Sistemas de Raid automáticos/eventos 3 novos continentes 1 NO-PvP. Novos Sistemas de Boost na Store. Novos Outfits Sistema de Chuva de Gelo. Sistemas de Bags de Sorte na store Sistema de Guildpoints E muitos mais sistemas todas as Warzone 1 a 9 todas 100% cidade de Thais Custom com muitas coisas melhoradas. boss próprio do servidor. e uma Store ampla de novidades. Venham conhecer e se divertir em nosso servidor tragam seu time, amigo, ajudem divulgar nosso servidor para crescermos.