Histórico de Curtidas
-
DATA Vinny deu reputação a iluargrott em [Pedido] SPRITES MAIORESVeio se discutindo ao longo do tempo várias possibilidades de aumento de sprites no OTClient, com IA, alterar os programas Remeres, OTitem, Object builder. Porém todas essas modificações necessitaria uma equipe para dar suporte aos erros futuros e presentes que vieram se apresentando a todos aqueles que realizavam todas estas modificações.
Em contato com o editor do ObjectBuilder e Remeres para 64x64, 96x96, ele mesmo disse que pela presença de erros, não valeria à pena investir num servidor com estes aumentos de sprites.
Então como brasileiro, imaginei uma possível gambiarra. Segue abaixo, o meu pedido ?
Este seria um sistema para a analise de movimento do personagem/criaturas.
Como todos sabem o tibia tem um "hitbox"/square de movimento de 32x32. Este square impede que o player suba em outro square de 32x32 que seja "sólido" ou que esteja marcado para não ser passado por cima, ex: Pedras, agua, bordas, parede, porta fechada, caule da arvore, outro square de player.
Porém qualquer imagem que ultrapasse os 32x32 na linha de baixo, corre o grande risco de sair "atropelando" em cima de objetos, player e etc.
Sendo assim, imaginei a possibilidade de algum script que averiguasse o movimento das criaturas/players, checando se nos 32x32 aos arredores do player há algum objeto que não seja passável, assim forçando-o a não "pisar" em cima deste. ex:
Como pode ser visto, a região mais escura de cada "demon" seria o limitador de movimento, como um sqm à esquerda há outro demon ,ele não poderia se mover para a esquerda, pois teria um "obstaculo".
Esse limitador seria apenas para movimentos.
Com esse sistema, o uso de sprites maiores sem o grande erro de atropelar alguém / objetos, o uso de sprites maiores para projetos alternativos sairia muito mais " limpo.
Estou utilizando TFS 1.2, mas qualquer servidor está valendo para conseguir esta benção de sistema para aumentar a qualidade dos gráficos de um projeto alternativo.
Deixo aqui este pedido para alguma alma generosa que queira auxiliar o desenvolvimento de novos jogos com sprites maiores
Obrigado pela sua atenção,
-
DATA Vinny deu reputação a MaXwEllDeN em Aulas de Scripting LuaSalve rapasiada.
Revivendo aqui pra avisar que corrigi is links das aulas que quebraram quando fizeram atualização do forum.
Não consegui encontrar no fórum a aula 4, de alguma forma ela se perdeu.
Abraços
-
DATA Vinny deu reputação a Gengo em [OTClient] Sistema de Dialogo Otpokemon[OTClient] Sistema de Dialogo Otpokemon
Venho através desse tópico contribuir para a comunidade, um simples modulo de dialogo no estilo do Otpokemon,
não é um sistema de dialogo avançado é algo simples que deixa seu servidor intuitivo.
1) Faça o download do modulo no qual se encontra no final do tópico e abrindo a pasta do seu client,, extraia e coloque o modulo na pasta modules.
2) O módulo utiliza uma função chamada switch que não é comum ter no otclient, porem podemos colocar sem muito esforço, na pasta do otclient abra o arquivo util.lua que se encontra em modules/corelib/ e no final do arquivo coloque o seguinte código:
Feito o passo 1 e 2, vamos para a parte do servidor.
1) Crie um arquivo na pasta data/lib/ podendo ter o nome de npcdialog_lib.lua e coloque o seguinte código:
2) O arquivo que acabamos de criar utiliza uma função chamada table.serialize que não é comum ter nos servidores, para que funcione sem erros vamos adicionar, abra o arquivo 012-table.lua que fica na pasta do seu servidor em data/lib/ ou você pode criar o arquivo e adicionar o seguinte código:
Feito todo esse procedimento, estarei disponibilizando um npc para que vocês possam ter uma noção de como utilizar esse sistema de dialogo.
1) Crie um arquivo na pasta do servidor em data/npc/ chamado Gengo.xml e adicione o seguinte código:
2) Crie um arquivo na pasta do servidor em data/npc/lib/ com o nome gengo.lua e adicione o seguinte código:
O npc é algo simples, porem serve para que você possa ter uma noção de como utilizar as funções do npc.
Demostrativo dentro do game:
Arquivos para download e o scan:
-
DATA Vinny deu reputação a L3K0T em New Target OTC 0.6.6 e 0.6.7 - 2020Olá galera, hoje vim trazer um tutorial bem completinho para vocês do sistema de "Target Animada pela source do OTC" renovada para otcliente 0.6.6 e 0.6.7 e espero que gostem
Imagens do Target Azul;;
Imagens do Target Vermelho;;
VIÍDEO:;;
TUTORIAL
1° Vai na pasta do seu otcliente e ache a pasta da source dele otclient-0.6.6\src\client dentro dela abre o arquivo creature.cpp e procure;;
void Creature::draw(const Point& dest, float scaleFactor, bool animate, LightView *lightView) { if(!canBeSeen()) return; Point animationOffset = animate ? m_walkOffset : Point(0,0); if(m_showTimedSquare && animate) { g_painter->setColor(m_timedSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(28, 28)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } if(m_showStaticSquare && animate) { g_painter->setColor(m_staticSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } internalDrawOutfit(dest + animationOffset * scaleFactor, scaleFactor, animate, animate, m_direction); m_footStepDrawn = true; if(lightView) { Light light = rawGetThingType()->getLight(); if(m_light.intensity != light.intensity || m_light.color != light.color) light = m_light; // local player always have a minimum light in complete darkness if(isLocalPlayer() && (g_map.getLight().intensity < 64 || m_position.z > Otc::SEA_FLOOR)) { light.intensity = std::max<uint8>(light.intensity, 3); if(light.color == 0 || light.color > 215) light.color = 215; } if(light.intensity > 0) lightView->addLightSource(dest + (animationOffset + Point(16,16)) * scaleFactor, scaleFactor, light); } } altere para;;
void Creature::draw(const Point& dest, float scaleFactor, bool animate, LightView *lightView) { if(!canBeSeen()) return; Point animationOffset = animate ? m_walkOffset : Point(0,0); /* if(m_showTimedSquare && animate) { g_painter->setColor(m_timedSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(28, 28)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } if(m_showStaticSquare && animate) { g_painter->setColor(m_staticSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } */ if(m_showTimedSquare && animate) { /*ImagePtr L3K0Tt = Image::load("data/images/target.png"); //se preferir usar por imagem TexturePtr L3K0T = TexturePtr(new Texture(L3K0Tt, false)); g_painter->drawTexturedRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(L3K0T->getHeight(), L3K0T->getWidth())*scaleFactor), L3K0T);*/ EffectPtr efeitoL3K0T = EffectPtr(new Effect()); efeitoL3K0T->setId(653); //id da sprite do efeito g_painter->setColor(m_timedSquareColor); Rect rect = Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor); g_painter->drawTexturedRect(rect, efeitoL3K0T->getThingType()->getTexture(0)); g_painter->setColor(Color::white); g_painter->setColor(Color::white); // by L3K0T g_painter->setOpacity(0.9); } if(m_showStaticSquare && animate) { /*ImagePtr L3K0Tt = Image::load("data/images/target.png"); //se preferir usar por imagem TexturePtr L3K0T = TexturePtr(new Texture(L3K0Tt, false)); g_painter->drawTexturedRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(L3K0T->getHeight(), L3K0T->getWidth())*scaleFactor), L3K0T);*/ EffectPtr efeitoL3K0T = EffectPtr(new Effect()); efeitoL3K0T->setId(653); //id da sprite do efeito g_painter->setColor(m_staticSquareColor); Rect rect = Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor); g_painter->drawTexturedRect(rect, efeitoL3K0T->getThingType()->getTexture(0)); g_painter->setColor(Color::white); //1 para não piscar e fixar no vermelho } internalDrawOutfit(dest + animationOffset * scaleFactor, scaleFactor, animate, animate, m_direction); m_footStepDrawn = true; if(lightView) { Light light = rawGetThingType()->getLight(); if(m_light.intensity != light.intensity || m_light.color != light.color) light = m_light; // local player always have a minimum light in complete darkness if(isLocalPlayer() && (g_map.getLight().intensity < 64 || m_position.z > Otc::SEA_FLOOR)) { light.intensity = std::max<uint8>(light.intensity, 3); if(light.color == 0 || light.color > 215) light.color = 215; } if(light.intensity > 0) lightView->addLightSource(dest + (animationOffset + Point(16,16)) * scaleFactor, scaleFactor, light); } } salve.
2° agora volte na pasta da source do otclient e abra o arquivo thingtype.h e procure por;;
const TexturePtr& getTexture(int animationPhase); altere para
/*const TexturePtr& getTexture(int animationPhase);*/ depois ache;;
std::vector<int> getSprites() { return m_spritesIndex; } abaixo cole;;
const TexturePtr& getTexture(int animationPhase); dps é só abrir o object guilder e importar o efeito do target;; >>>>> effect_653.obd tem outras sprite doadas por mim segue o link
Depois de recortar é só por o efeito no otc e colocar o ID da sprite ali aonde tá o numero 653 no código.
Ajudei?? REP+
Créditos:;
-Eu por alterar outras coisas que faltou.
-Jair Kevick (código base)
-
DATA Vinny deu reputação a L3K0T em Health Bar para OTC 0.6.6 e 0.6.7Tutorial Heath Bar
Oi Galera tudo bem??? hoje vou ensinar vocês como por a Health Bar como na imagem acima "dentro do circulo amarelo" no seu otcliente 0.6.6 e 0.6.7. Para começar essa alteração é pela source, caso não tenha source do seu OTC não adianta... Recomendo baixar otclientes com sources
1° vai na pasta da source do seu otcliente e abre o arquivo creature.cpp e ache;;;
if(drawFlags & Otc::DrawBars && (!isNpc() || !g_game.getFeature(Otc::GameHideNpcNames))) { g_painter->setColor(Color::black); g_painter->drawFilledRect(backgroundRect); g_painter->setColor(fillColor); g_painter->drawFilledRect(healthRect); } if(drawFlags & Otc::DrawNames) { if(g_painter->getColor() != fillColor) g_painter->setColor(fillColor); m_nameCache.draw(textRect); } altere para;;
if(drawFlags & Otc::DrawBars && (!isNpc() || !g_game.getFeature(Otc::GameHideNpcNames))) { g_painter->setColor(fillColor); g_painter->drawFilledRect(healthRect); ImagePtr backgroundLifeBar = Image::load("data/images/game/target_healbar/healtbar.png"); TexturePtr bgLifeBar = TexturePtr(new Texture(backgroundLifeBar, false)); g_painter->drawTexturedRect(backgroundRect, bgLifeBar); } if (drawFlags & Otc::DrawNames) { if (g_painter->getColor() != fillColor) g_painter->setColor(fillColor); m_nameCache.draw(textRect); } procure ainda em creature.cpp;;
#include <framework/core/clock.h> abaixo adicione;;
#include <framework/graphics/image.h> agora vá em data\images\game do OTC e cole essa pasta dentro dele;;
target_healbar.zip"ATENÇÃO REMOVA A PASTA DO WINRAR E COLOCA LÁ DENTRO"
Feito isso é só compilar o OTC pela opção Rebuilde e seja feliz
Vídeo;;
Créditos:
Ceetros (criador original)
Ajudei?? REP+
-
DATA Vinny deu reputação a Movie em [SafeZone] Evento by Movie & LuanLuciano[SafeZone 1.x]
Hellou galera, a um tempo atrás tinha postado um safezone que eu e o @luanluciano93 tinhamos feito e por algumas questões resolvi apagar o tópico.
Hoje venho postá-lo novamente porém mais otimizado e com maior número de configurações.
Qualquer bug que houver durante o decorrer do evento só me avisar nesse tópico que irei fixar (SOMENTE NESSE TÓPICO, NÃO ME PROCUREM NO DISCORD NEM VIA PM)
Na pasta lib, crie um arquivo chamado safezone.lua
--[[ Evento SafeZone escrito por LuanLuciano93 e Movie (Movie#4361) Otimizado por Movie Disponibilizado para o TibiaKing e não autorizo outras reproduções Mantenha os créditos <3 --]] SAFEZONE = { teleportTimeClose = 5, eventTimeTotal = 30, positionTeleportOpen = Position(1003, 1217, 7), -- Posição que o portal irá abrir positionEnterEvent = Position(1545, 957, 7), -- Para onde os players irão storage = 12149, -- Não mexa actionId = 6412, -- ActionID que irá no portal ao ser criado, tem que ser o mesmo do movements protectionTileId = {9562, 9563, 9564, 9565}, -- ID dos pisos que serão criados levelMin = 150, minPlayers = 5, maxPlayers = 50, reward = {9020, 5}, -- ID do Item, Quantidade players = {}, days = { ["Sunday"] = {"20:00"}, ["Monday"] = {"20:00"}, ["Tuesday"] = {"20:00"}, ["Wednesday"] = {"20:00"}, ["Thursday"] = {"20:00"}, ["Friday"] = {"20:00"}, ["Saturday"] = {"20:00"}, }, messages = { prefix = "[SafeZone] ", messageStart = "O evento irá começar agora com %d participantes! Boa sorte!", messageNoStart = "O evento não foi iniciado por falta de participantes!", messageTime = "O evento foi finalizado por ultrapassar o limite de tempo!", messageOpen = "O evento foi aberto, você tem %d minutos para entrar no portal do evento que se encontra no templo!", messageWait = "O teleporte para o evento está aberto, você tem %d minuto(s) para entrar!", messageFinish = "O evento foi finalizado e o ganhador foi o %s! Parabéns!", messageWinner = "Você ganhou %d %s como premiação pelo primeiro lugar!", }, lifeColor = { [1] = 94, -- red [2] = 77, -- orange [3] = 79 -- yellow }, positionEvent = {firstTile = {x = 1538, y = 951, z = 7}, tilesX = 15, tilesY = 11} -- No final do tópico ensino a configurar } function SAFEZONE:teleportCheck() local tile = Tile(SAFEZONE.positionTeleportOpen) if tile then local item = tile:getItemById(1387) if item then item:remove() local totalPlayers = SAFEZONE:totalPlayers() if totalPlayers >= SAFEZONE.minPlayers then Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageStart:format(totalPlayers), MESSAGE_STATUS_WARNING) SAFEZONE:createProtectionTiles() addEvent(function() if totalPlayers > 0 then Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageTime, MESSAGE_STATUS_WARNING) SAFEZONE:removePlayers() end end, SAFEZONE.eventTimeTotal * 60 * 1000) else Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageNoStart, MESSAGE_STATUS_WARNING) SAFEZONE:removePlayers() end else Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageOpen:format(SAFEZONE.teleportTimeClose), MESSAGE_STATUS_WARNING) addEvent(Game.broadcastMessage, (SAFEZONE.teleportTimeClose - 3) * 60 * 1000, SAFEZONE.messages.prefix .. (SAFEZONE.messages.messageWait):format(SAFEZONE.teleportTimeClose - 2)) addEvent(Game.broadcastMessage, (SAFEZONE.teleportTimeClose - 1) * 60 * 1000, SAFEZONE.messages.prefix .. (SAFEZONE.messages.messageWait):format(SAFEZONE.teleportTimeClose - 4)) local teleport = Game.createItem(1387, 1, SAFEZONE.positionTeleportOpen) if teleport then teleport:setActionId(SAFEZONE.actionId) end addEvent(function() SAFEZONE:teleportCheck() end, SAFEZONE.teleportTimeClose * 60000) end end end function SAFEZONE:removePlayers() for a in pairs(SAFEZONE.players) do local player = Player(a) player:setStorageValue(SAFEZONE.storage, 0) player:teleportTo(player:getTown():getTemplePosition()) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end function SAFEZONE:insertPlayer(playerId) SAFEZONE.players[playerId] = {} end function SAFEZONE:removePlayer(playerId) SAFEZONE.players[playerId] = nil end function SAFEZONE:totalPlayers() local x = 0 for a in pairs(SAFEZONE.players) do x = x + 1 end return x end function SAFEZONE:totalProtectionTile() local totalPlayers = SAFEZONE:totalPlayers() if totalPlayers >= 10 then return totalPlayers - 3 else return totalPlayers - 1 end end function SAFEZONE:createProtectionTiles() local totalPlayers = SAFEZONE:totalPlayers() if SAFEZONE:totalPlayers() == 1 then for a in pairs(SAFEZONE.players) do local player = Player(a) if player:getStorageValue(SAFEZONE.storage) > 0 then player:setStorageValue(SAFEZONE.storage, 0) SAFEZONE.players[a] = nil player:teleportTo(player:getTown():getTemplePosition()) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) local itemType = ItemType(SAFEZONE.reward[1]) if itemType:getId() ~= 0 then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, SAFEZONE.messages.prefix .. SAFEZONE.messages.messageWinner:format(SAFEZONE.reward[2],itemType:getName())) player:addItem(itemType:getId(), SAFEZONE.reward[2]) end Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageFinish:format(player:getName()), MESSAGE_STATUS_WARNING) end end elseif totalPlayers >= SAFEZONE.minPlayers then local createTiles, totalTiles = 0, SAFEZONE:totalProtectionTile() local tileX = SAFEZONE.positionEvent.firstTile.x local tileY = SAFEZONE.positionEvent.firstTile.y local tileZ = SAFEZONE.positionEvent.firstTile.z local tilesX = SAFEZONE.positionEvent.tilesX local tilesY = SAFEZONE.positionEvent.tilesY local protectionTileId = SAFEZONE.protectionTileId while createTiles < totalTiles do local randomX = math.random(tileX, tileX + tilesX) local randomY = math.random(tileY, tileY + tilesY) local newPosition = Position({x = randomX, y = randomY, z = tileZ}) local tile = Tile(newPosition) if tile then local item1 = tile:getItemById(protectionTileId[1]) local item2 = tile:getItemById(protectionTileId[2]) local item3 = tile:getItemById(protectionTileId[3]) local item4 = tile:getItemById(protectionTileId[4]) if not item1 and not item2 and not item3 and not item4 then local randomTile = math.random(protectionTileId[1], protectionTileId[4]) local tileProtection = Game.createItem(randomTile, 1, newPosition) if tileProtection then tileProtection:getPosition():sendMagicEffect(CONST_ME_ENERGYHIT) addEvent(function() SAFEZONE:deleteProtectionTiles(newPosition, randomTile) end, 5000) createTiles = createTiles + 1 end end end end addEvent(function() SAFEZONE:effectArea(SAFEZONE.positionEvent.firstTile, SAFEZONE.positionEvent.tilesX, SAFEZONE.positionEvent.tilesY) end, 5000) addEvent(function() SAFEZONE:checkPlayersinProtectionTiles() end, 4000) addEvent(function() SAFEZONE:createProtectionTiles() end, 6000) end end function SAFEZONE:deleteProtectionTiles(position, tileId) local tile = Tile(position) if tile then local item = tile:getItemById(tileId) if item then item:getPosition():sendMagicEffect(CONST_ME_POFF) item:remove() end end end function SAFEZONE:checkPlayersinProtectionTiles() local protectionTileId = SAFEZONE.protectionTileId for a in pairs(SAFEZONE.players) do local player = Player(a) if player:getStorageValue(SAFEZONE.storage) > 0 then local tile = Tile(player:getPosition()) if tile then local item1 = tile:getItemById(protectionTileId[1]) local item2 = tile:getItemById(protectionTileId[2]) local item3 = tile:getItemById(protectionTileId[3]) local item4 = tile:getItemById(protectionTileId[4]) if not item1 and not item2 and not item3 and not item4 then if player:getStorageValue(SAFEZONE.storage) > 1 then player:setStorageValue(SAFEZONE.storage, player:getStorageValue(SAFEZONE.storage) - 1) local lifes = player:getStorageValue(SAFEZONE.storage) player:setStorageValue(SAFEZONE.storage, 0) player:getPosition():sendMagicEffect(CONST_ME_FIREAREA) SAFEZONE.players[player:getId()] = nil local outfit = player:getSex() == 0 and 136 or 128 if lifes == 1 then local lifeColor = SAFEZONE.lifeColor[1] player:setOutfit({lookType = outfit, lookHead = lifeColor, lookBody = lifeColor, lookLegs = lifeColor, lookFeet = lifeColor}) elseif lifes == 2 then local lifeColor = SAFEZONE.lifeColor[2] player:setOutfit({lookType = outfit, lookHead = lifeColor, lookBody = lifeColor, lookLegs = lifeColor, lookFeet = lifeColor}) end player:setStorageValue(SAFEZONE.storage, lifes) else player:setStorageValue(SAFEZONE.storage, 0) player:getPosition():sendMagicEffect(CONST_ME_FIREAREA) player:teleportTo(player:getTown():getTemplePosition()) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end end end end end function SAFEZONE:effectArea(firstTile, tilesX, tilesY) local fromPosition = firstTile local toPositionX = fromPosition.x + tilesX local toPositionY = fromPosition.y + tilesY for x = fromPosition.x, toPositionX do for y = fromPosition.y, toPositionY do local position = Position({x = x, y = y, z = fromPosition.z}) if position then position:sendMagicEffect(CONST_ME_SMALLPLANTS) end end end end Não esqueça de registrar essa lib no lib.lua
Agora na pasta movements/scripts crie um arquivo chamado safezone.lua
--[[ Evento SafeZone escrito por LuanLuciano93 e Movie (Movie#4361) Otimizado por Movie Disponibilizado para o TibiaKing e não autorizo outras reproduções Mantenha os créditos <3 --]] function onStepIn(creature, item, position, fromPosition) local player = creature:getPlayer() if not player then return true end if player:getGroup():getAccess() then player:teleportTo(SAFEZONE.positionEnterEvent) return true end if player:getLevel() < SAFEZONE.levelMin then player:sendCancelMessage(SAFEZONE.messages.prefix .."Você precisa ser level " .. SAFEZONE.levelMin .. "ou maior para entrar no evento.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end if player:getItemCount(2165) >= 1 then player:sendCancelMessage(SAFEZONE.messages.prefix .."Você não pode entrar com um stealth ring no evento.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end local ring = player:getSlotItem(CONST_SLOT_RING) if ring then if ring:getId() == 2202 then player:sendCancelMessage(SAFEZONE.messages.prefix .." Você não pode entrar no evento com um stealth ring.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end end for a in pairs(SAFEZONE.players) do target = Player(a) if player:getIp() == target:getIp() then player:sendCancelMessage(SAFEZONE.messages.prefix .. "Você já possui um outro player dentro do evento.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end end if SAFEZONE:totalPlayers() >= SAFEZONE.maxPlayers then player:sendCancelMessage(SAFEZONE.messages.prefix .. "O evento já atingiu o número máximo de participantes.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end local outfit = player:getSex() == 0 and 136 or 128 local treeLifeColor = SAFEZONE.lifeColor[3] player:setOutfit({lookType = outfit, lookHead = treeLifeColor, lookBody = treeLifeColor, lookLegs = treeLifeColor, lookFeet = treeLifeColor}) player:sendTextMessage(MESSAGE_INFO_DESCR, SAFEZONE.messages.prefix .."Você entrou no evento. Boa sorte!") player:teleportTo(SAFEZONE.positionEnterEvent) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) player:setStorageValue(SAFEZONE.storage, 3) SAFEZONE:insertPlayer(player:getId()) return true end <movevent event="StepIn" actionid="6412" script="safezone.lua" />
Agora vá na pasta globalevents/scripts e crie o arquivo safezone.lua
function onThink(interval) if SAFEZONE.days[os.date("%A")] then local hrs = tostring(os.date("%X")):sub(1, 5) if isInArray(SAFEZONE.days[os.date("%A")], hrs) then SAFEZONE:teleportCheck() end end return true end <globalevent name="SafeZone" interval="60000" script="safezone.lua" />
No quadrado azul marinho você configura a posição do
firstTile = {x = x, y = y, z = z} Em verde, você conta quantos quadrados existem e coloque em
tilesX = quantidade Em vermelho, você conta quantos quadrados existem e coloque em
tilesY = quantidade De resto, as outras configurações estão bem explícitas.
Créditos
30% Movie
69% @luanluciano93
1% @WooX (pela divisória rs)
-
DATA Vinny recebeu reputação de Jazz em Lembram do NTO antigo sem sprites top down?o projeto continua vivo?tem discord ou youtube que esta mostrando como está ficando?
-
DATA Vinny deu reputação a Mirajane Sitri em Outfit Animada@Armes @KyureJL Aqui está o script: (Não é de minha autoria, encontrei em um derivado e modifiquei poucas coisas pro meu gosto pessoal mesmo.)
Adicionei algumas observações dentro dele, pra caso sintam dúvida do que modificar.
Ele funciona da seguinte maneira:
Uma looktype pré-definida poderá executar o comando, caso tente utilizar em uma outfit que não está configurada irá aparecer uma mensagem pro jogador, avisando que esta outfit não possui taunt.
Como expliquei anteriormente, ele apenas vai trocando as sprites (looktype) de uma para outra em uma velocidade X (que é definida no script), então é necessário que você possua as sprites no seu client. Para que possa definir a sequência delas.
O exemplo utilizado no vídeo, é o looktype 21 (eu adicionei a mesma outfit que o autor do tópico no meu client, pra ficar melhor de entender). Os valores que estão em {} que vai do 13 até o 20, cada um deles é uma sprite diferente, que no final ao serem trocadas em uma certa velocidade dá a impressão de que está "animando" (e realmente está :d). Segue o vídeo com a demonstração (perdoa a qualidade)
-
DATA Vinny deu reputação a Mirajane Sitri em Outfit AnimadaÉ uma talkaction (comando), que vai trocando de uma looktype (newtype) para outra. Ele basicamente vai trocando sua aparência uma de cada vez, formando essa animação. Eu tenho o script, qualquer coisa eu posto aqui ele com o exemplo de funcionamento ^-^
-
DATA Vinny deu reputação a Jazz em Lembram do NTO antigo sem sprites top down?@Armes
Olá, eu sou o Sphynx1. Como vai você?
Desde abril de dois mil e dezenove muita água se passou, não é mesmo? Infelizmente não trago boas notícias, em dois mil e dezenove eu tive alguns problemas de saúde e acabei tendo que me afastar da internet durante meses, estava me fazendo mal. Se me lembro bem sobre esse projeto eu havia me juntado com o Woox e tivemos juntos ótimas ideias, em época nem eu e nem ele estávamos com a mínima pressa para dar continuidade no projeto, visto que para concretizar o que nós estávamos interessados seria necessário conhecimento avançado em C++, até mesmo a compra de mais sprites. Em época eu também não me considerava um programador, atualmente eu possuo muito mais conhecimento e me garanto muito mais do que me garantia antes.
Eu acabei perdendo a senha e o e-mail da minha antiga conta @Sphynx1.
Sobre a atualidade, eu pretendo voltar a postar atualizações semanais/mensais aqui nesse tópico. Dessa vez eu estarei trabalhando com versionamento de projeto então não haverá risco do meu HD queimar do nada. Sozinho eu não tenho nenhuma condição de implementar aqueles sistemas incríveis que eu e Woox havíamos pensado, então o projeto se tornará muito mais simples de ser produzido, tendo uma jogabilidade de certa forma parecida com os antigos NTO da versão 7.81 e até da atualidade (só que sem um rolo compressor passando por cima das sprites).
Sobre o projeto nos dias de hoje,
Atualmente não estou buscando mais membros para equipe, quero fazer uma boa parte do que eu estou planejando sozinho e só quando eu tiver algo sólido e respeitável eu pense em propor a perda preciosa do tempo de algum artista ou programador em prol de algo sólido.
Para aquele que quiser me enviar críticas, sugestões, me xingar ou apenas ter meu contato me procure no Discord,
DPR#7737
Deixei um GIF com o trabalho de hoje e um pouco de ontem...
https://imgur.com/dTiT4GU
PS: Correr, andar e sentar vão ser por botões... Eu coloquei correr por spell porque eu voltei a scriptar faz pouco mais de um dia, é a famosa gambiarra. Eu queria gravar o GIF logo para fazer esse post.
-
DATA Vinny deu reputação a Kickyr em REVIVER O NOSSO TIBIA !-Reviver o Tibia!-
-Voces devem estar pensando o por que desse titulo... Eu vim aqui escrever esse texto ja que eu ainda tenho esperança no TIBIA e nos Servidores dele, Tentar dar uma dica para todos aqueles que estao desanimados com a quantidade de jogadores no seu servidor ou com comunidade do tibia , E tambem me ajudar ja que eu amo tanto esse jogo e quero que ele nao simplesmente suma..
-Como?-
-vou usar o GLA (Gland Line Adventures) como um exemplo um servidor com novas ideias unicas e um estilo de jogo unico .. Mas voce deve ta perguntando o porque merda estou usando um jogo que nao tem nada a ver com aquele nosso tibia old como exemplo se o intuito é reviver o tibia ? Simples o GLA foi um dos servidores alternativos de tibia que criaram seu proprio estilo de jogo e trouxeram mais de 1000 jogadores diariamente em um servidor alternativo.. Sendo assim uma das formas da gente reviver o tibia seria criando servidores unicos e nao imitações do tibia... Ai voce em fala "Mas Kickyr fazer servidores unicos que fujam da proposta do tibia não traz aquela velha mecanica do tibia old!" ... Sobre isso na minha opnião existem mais de 500 servidores de tibia .. A metade com menos de 10 players online ...O que a comunidade de tibia precisa é de novos estilos unicos.. Tambem tem as milhares de copias mal feitas de DBO e NTO (Nenhum que me anime .. Ja que parece mais um jogo feito para quem sabe mexer mais com bot ou uma criança de 9 anos que quer bate com a cabeça no teclado e da insta kill) .
( por favor comente sua opnião .. Assim debatemos e chegamos a uma conclusão melhor ja que eu sou um cabeça de vento)
-Servidores Unicos..-
-Eu com minha ideia estou fazendo meu proprio estilo de servidor ats que o tibia deveria ter .. Obviamente se eu vim propor isso para voces devo pelo menos ter um laço com o assunto.. O estilo que eu criei foi um servidor com rpg completo com inumeras classes(Tipo umas 40) E com o balancemento completo de todas as classes ..
(É um exemplo de servidor , Se voce tem um bote aqui na publicação como e seu estilo unico!)
-
DATA Vinny deu reputação a NelaMesmo em Em desenvolvimentoBom pessoal, nunca postei nada aqui, mas gostaria de compartilhar com voces um projeto no qual estou trabalhando. Um mapa para aqueles que gostam de uma boa quest e alguns misterios :D.
-
DATA Vinny deu reputação a Mor3nao em (Resolvido)Como por sexo predefinido para vocation TFS 1.3Entao, em dbz eu nao tenho ctz, mas no tibia normal, seria em htdocs>system>libs>CreateCharacter
Mas se vc nao conseguir, da pra vc pegar algum de change sex, que ja tem em montes aqui no forum, e colocar um creaturescript pra no 1° login ele mudar o sexo xD
**inclusive, lendo aqui agora o .php, acho q vai ser mais facil vc fazer o creaturescript pra escolher doq mexer no php kk
-
DATA Vinny deu reputação a Celulose em (Resolvido)Como por sexo predefinido para vocation TFS 1.3@Armes pelo site tu consegue definir
-
DATA Vinny deu reputação a Mor3nao em (Resolvido)Como por sexo predefinido para vocation TFS 1.3Entao, vc consegue pelo site, fazer serem male ou female, e quanto a dentro do jogo, é só vc tirar os métodos de trocar, caso tenha alguma voc q vc deseja permitir ainda, só vc por restrições na troca=]
-
DATA Vinny deu reputação a vyctor17 em [Show-Off] Vyctor17Oi Tk, faz um tempo que eu postei alguns módulos que eu fiz, para o OTclient, agora vou mostrar um pouco de como eles foram implementados em um projeto de teste. vou fazer um breve explicação sobre o o funcionamento e depois colocarei um GIF ou Video mostrando in-game.
Raridade em monstros e items.
Monstros: a raridade em monstros aumenta seu poder de ataque e vida baseado na raridade. Para monstros existem 4 Tiers de raridade, Comum, Épico, Lendário e Único um monstro com raridade acima de comum sempre protegendo um bau com recompensas.
Items: Os items tem variação de raridade baseado em um encantamento obtido via Gemas, Essas raridades são dividas em 5 Tiers de raridade, Comum, Magico, Épico, Lendário e Único.
a imagem não contem item e monstros únicos
Gemas de encantamento.
As gemas de encantamento melhoram um item e só podem ser utilizadas uma vez por item, existem duas gemas uma pode dar de um a três atributos novos ao item e outra de um a seis, a partir do numero de atributos novos gerados no item é definido sua raridade. As gemas podem ser obtidas através de mineração ou em baus de recompensa.
Baus de recompensa.
São gerados junto a monstros de raridade acima de comum dependo de qual bau o monstro protege mais forte ele é, exemplo um monstro épico protegendo um bau de ouro é mais forte que um épico protegendo um bau normal. Para abrir o bau você terá que fazer o Lockpick no bau.
Wasp lendária protegendo bau da fortuna.
Pescaria.
Nada de muito explicativo só uma pesca comum, para obter peixes para Cooking ou para Alquimia.
Lockpick.
Nada de muito novo também.
Montaria
Nada muito diferente também, só existem três pontos diferentes da montaria no meu server para o do global que são, as montarias tem vida e se ela "morrer" você é desmontado, as montarias em quanto montado te libera magias, a montaria tem um slot próprio para poder ser equipada.
Magias e inventario.
Todas classes podem usar qualquer magia mas as magias são vinculadas as items, então para ter a magia liberada a pessoa tem que estar com o item equipado para aumentar a quantidade magias criei mais dois slots no inventario um slot para montaria e mais um anel.
Vou ficar devendo falar sobre o craft e a alquimia, pois ainda estou trabalhando neles. deixar um agradecimento especial a galera do discord do TK que me ajudou com ideias e me guiando para melhorar sistemas existentes . Qualquer duvida ou sugestão para os sistemas acima ou para qualquer outro tipo de sistema que você acha que poderia ficar legal em conjunto com esses sistemas ficarei ligado nos comentários desse tópico. Obrigado pela atenção.
Bonus:
-
DATA Vinny deu reputação a Caronte em Lib 000-ConstOlá pessoal, venho mais uma vez trazer um tutorial simples, e tentar explicar tudo claramente, esse tutorial pode ficar grande dependendo do desenrolar dele, pois é um pack de tutoriais, então vou usar spoilers para ajudar na formatação do tópico.
Nota: as informações usadas abaixo, podem ser tanto usadas com o nome, quanto com o número, e podem ser encontradas na pasta lib no arquivo 000-const
https://pastebin.com/0FfPcg7y
line4
Coordenadas:
Tutorial feito e formatado por Caronte o + gato do fórum, avaliações do perfil são bem-vindas.
Explicando:
doMoveCreature(cid, direction): Serve para mover tanto o player quanto o monstro.
Combate:
Tutorial feito e formatado por Caronte o + gato do fórum, avaliações do perfil são bem-vindas.
Parâmetros de condição:
Condições:
Slots:
Tutorial feito e formatado por Caronte o + gato do fórum, avaliações do perfil são bem-vindas.
Participação: xWhiteWolf
Const_ani e Const_me:
Tutorial feito e formatado por Caronte o + gato do fórum, avaliações do perfil são bem-vindas.
Talktypes and message types:
[title][/title]
Tutoriais concluídos por ordem de formatação (podem ser alterados assim mesmo):
Coordenadas, e suas direções. Combat (ainda há coisas a serem adicionadas). Slots. CONST_ME and CONST_ANI
Os assuntos do tópico poderão se diminuídos ou aumentados de acordo com o desenrolar do tempo,
gostaria de apoio, e não me incomodaria se alguém se propusesse fazer algum tutorial, eles serão supervisionados por mim e formatados por mim, para serem postados neste tópico.
Esse tópico demorou e vai demorar muito para fazer
cada tutorial, então eu não me importo com um obrigado e REP+,
OBS.: Um obrigado vale bem mais do que um REP+
-
DATA Vinny deu reputação a WooX em DarkTheme e AutoComplete para Notepad++Atualização 05/05/2019:
Olá a todos, acredito que muitos além de mim utilizam o Notepad++ para trabalhar com códigos, é por isso que hoje venho trazer um tema que eu mesmo fiz e um AutoComplete atualizado para o Notepad++.
AutoComplete.
Para quem não está familiarizado, o AutoComplete é uma função do Notepad++ que completa funções ou palavras assim que você começa digita-las. Neste AutoComplete que estou disponibilizando, possui todas as funções existentes no TFS 0.3.7 e 0.4.
Para instalar o AutoComplete, primeiro você deve ativar a função no seu Notepad++. Para isso vá em Configurações -> Preferencias -> Autocompletar e deixa as configurações como mostra a seguir.
Em seguida, basta colocar o arquivo lua.xml no seguinte diretório do Notepad++.
Notepad++\plugins\APIs
Atualização:
Dark Theme.
Eu fiz este tema porque detesto o tema original do Notepad++, todo aquele branco chega a arder os olhos e é muito cansativo ficar olhando pra quem programa muito tempo utilizando a ferramenta. Este tema não traz consigo somente a alteração da cor do fundo, mas um destaque de cor verde a cada função existente no AutoComplete.
Um código Lua utilizando o tema, fica assim.
Além disso, o tema não dá suporte apenas para a Linguagem Lua, mas também para C++, PHP, MySQL, Javascript, XML, HTML, CSS e INI.
Para realizar a instalação do tema, basta ir em Configurações -> Importar -> Importar Tema(s) e escolher o arquivo DarkCode.xml.
Atualização:
Pronto!
Após realizado todos os procedimentos, basta reiniciar seu Notepad++ que todas as alterações terão efeito. É isso, acredito que possa ser útil no dia a dia de quem desenvolve em Lua.
Ultima atualização: 05/05/2019.
-
DATA Vinny deu reputação a Reds em Utilizando o Visual Studio Code, Notepad++ nunca maisFala galera, por muito tempo utilizei o notepad++ para desenvolver meus códigos em lua. Agora voltando a desenvolver meu servidor, utilizo o Visual Studio Code e digo que ajuda muito em relação ao notepad++.
Vantagens:
1) Você pode abrir a pasta de seu servidor, tendo uma estrutura semelhante a um projeto Java por exemplo, tudo isso de uma forma bem fácil. Se não me engano o notepad++ tem uma funcionalidade parecida, mas acredito que a maioria aqui não usa.
Para fazer isso é só utilizar o atalho CTRL + K + O, ou file > Open Folder e selecionar a pasta de seu servidor.
2) Diversos atalhos. Com o VS Code, você pode utilizar atalhos, como o CTRL + P, ao fazer isso ele abre um box no topo da IDE onde o desenvolvedor pode escrever o nome do arquivo e ele encontra dentro do projeto.
Fazia mais de ano que eu não abria meu servidor, então eu não lembrava de diversas coisas, como os monstros que dropavam o item 10566, então com o Visual Studio Code, eu consegui descobrir que eu não tinha configurado nenhum monstro para dropar aquele item. Para fazer essa pesquisa utilizei o atalho CTRL + SHIFT + F, onde ele pesquisa alguma palavra em específica entre os arquivos do seu projeto.
E muitos outros, que você pode encontrar pesquisando pela internet.
3) Diversas extensões. Com o VS Code você pode instalar diversas extensões que auxiliam no seu desenvolvimento, por enquanto adicionei a padrão de Lua. Com ela, ao escrever códigos Lua é utilizado intellisense, facilitando muito no desenvolvimento.
4) Criação de snippets para utilização das funções do Tibia.
5) Muito mais.. Utilizo há algum tempo o VS Code para desenvolvimento de front e sempre descubro coisas novas sobre ele..
O VS Code esta disponível em: https://code.visualstudio.com/download.
-
DATA Vinny deu reputação a mastof em Bot Discord Integrado com ServidorDesenvolvemos um BOT para o Discord que é integrado 100% com o servidor, tendo não só um sistema de Cadastro no Servidor para dar recompensar de eventos Pelo Discord, da para você informar quem te indicou(caso alguém tenha te indicado) e quando o player pegar level 50, ele automaticamente vai dar a recompensa para quem você indicou, o Bot pode dar itens para players, mandar mensagens no Servidor, e avisar algum evento que esteja tendo no servidor pelo discord
-
DATA Vinny deu reputação a luanluciano93 em Clean Database by luanluciano93Este script realiza limpezas na database toda vez que o servidor é iniciado, com o intuito principal de não sobrecarrega-lá.
Ele funciona conforme a configuração:
- Deletando personagens inativos há X meses.
- Deletando contas que estão vazias (que não tem personagens criados) há X meses.
- Deixando as casas livres caso o seu dono não entre no jogo por mais de X dias.
- Deletando os invites de casas feitos por ex-moradores caso a casa não tenha dono.
- Deletando guilds que foram criadas há X dias e que tem menos de Y membros.
Crédito: luanluciano93, Leu e Cjaker.
-- <globalevent type="startup" name="CleanDatabase" script="cleanDatabase.lua" /> --[[ Este script realiza limpezas na database toda vez que o servidor é iniciado, com o intuito principal de não sobrecarrega-lá. Ele funciona conforme a configuração: - Deletando personagens inativos há X meses. - Deletando contas que estão vazias (que não tem personagens criados) há X meses. - Deixando as casas livres caso o seu dono não entre no jogo por mais de X dias. - Deletando os invites de casas feitos por ex-moradores caso a casa não tenha dono. - Deletando guilds que foram criadas há X dias e que tem menos de Y membros. Crédito: luanluciano93, Leu e Cjaker. ]]-- local inactiveMonthsToDeleteCharacter = 1 -- quantos meses o player precisa ficar inativo para ser deletado. local emptyAccountMonths = 1 -- quantos meses uma conta precisa ficar sem nenhum character criado para ser deletada. local inactiveDaysToCleanHouse = 7 -- quantos dias o player precisa ficar inativo para perder a house. local inactiveDaysToCleanGuildWithFewPlayers = 10 -- quantos dias após a criação da guild irá verificar a quantidade mínima de players. local minimumGuildMembers = 5 -- quantidade minima de membros para a guild não entrar na verificação. local function executeDatabase(fromClause) local totalClear = 0 local resultId = db.storeQuery("SELECT COUNT(*) AS `count` FROM ".. fromClause) if resultId ~= false then totalClear = result.getNumber(resultId, 'count') result.free(resultId) if totalClear > 0 then db.query("DELETE FROM ".. fromClause) end end return totalClear end local function doCheckInactivePlayer() -- deleta automaticamente o dados das tabelas "houses, player_items, player_depotitems, player_deaths, guilds, player_storage" local timeStamp = os.time() - (86400 * (inactiveMonthsToDeleteCharacter * 30)) local fromClause = "`players` WHERE `group_id` = 1 AND lastlogin <= ".. timeStamp return executeDatabase(fromClause) end local function doCheckEmptyAccounts() -- deleta automaticamente o dados das tabelas "player_viplist" local timeStamp = os.time() - (86400 * (emptyAccountMonths * 30)) local fromClause = "`accounts` WHERE `accounts`.`creation` <= ".. timeStamp .." AND NOT EXISTS (SELECT `id` FROM `players` WHERE `accounts`.`id` = `players`.`account_id`)" return executeDatabase(fromClause) end local function doCheckInactiveHouses() local timeStamp = os.time() - (86400 * (inactiveDaysToCleanHouse * 24)) local totalClear = 0 local resultId = db.storeQuery("SELECT `houses`.`owner`, `houses`.`id` FROM `houses`, `players` WHERE `houses`.`owner` != 0 AND `houses`.`owner` = `players`.`id` AND `players`.`lastlogin` <= " .. timeStamp .. ";") if resultId ~= false then repeat local owner = result.getNumber(resultId, "owner") local houseId = result.getNumber(resultId, "id") local house = House(houseId) if house and (owner > 0) then house:setOwnerGuid(0) totalClear = totalClear + 1 end until not result.next(resultId) result.free(resultId) end return totalClear end local function doCheckInactiveHouseLists() -- Apagando "house_lists" do player local fromClause = "`house_lists` WHERE EXISTS (SELECT `id` FROM `houses` WHERE `house_lists`.`house_id` = `houses`.`id` AND `houses`.`owner` = 0)" return executeDatabase(fromClause) end local function doCheckInactiveGuilds() -- deleta automaticamente o dados das tabelas "guild_invites, guild_membership, guild_ranks" local timeStamp = os.time() - (86400 * (inactiveDaysToCleanGuildWithFewPlayers * 24)) local fromClause = "`guilds` WHERE `guilds`.`creationdata` <= ".. timeStamp .." AND (SELECT COUNT(*) from `guild_membership` WHERE `guild_membership`.`guild_id` = `guilds`.`id`) < " .. minimumGuildMembers .. "" return executeDatabase(fromClause) end -- Executando as funções de limpeza ao iniciar o servidor. function onStartup() print("[[ DATABASE CLEAN ]]") local inactivePlayer = doCheckInactivePlayer() if inactivePlayer > 0 then print(">> ".. inactivePlayer .. " deleted inactive players.") end local emptyAccounts = doCheckEmptyAccounts() if emptyAccounts > 0 then print(">> ".. emptyAccounts .." empty deleted accounts.") end local inactiveHouses = doCheckInactiveHouses() if inactiveHouses > 0 then print(">> ".. inactiveHouses .." houses that were expropriated.") end local inactiveHouseLists = doCheckInactiveHouseLists() if inactiveHouseLists > 0 then print(">> ".. inactiveHouseLists .." deleted inactive house lists.") end local inactiveGuilds = doCheckInactiveGuilds() if inactiveGuilds > 0 then print(">> ".. inactiveGuilds .." deleted inactive guilds.") end addEvent(saveServer, 10000) end
-
DATA Vinny deu reputação a MaXwEllDeN em [Aula 1] IntroduçãoIntrodução
Aula 1
O que é scripting?
Do modo mais simples possível: scripting é o ato de programar. O nome scripting vem do nome "script".
O que é um script?
De um modo geral, um script é um bloco de código escrito em uma linguagem de programação interpretada, ou seja, ele precisa que alguma coisa leia ele e possa "traduzir" seu conteúdo. Lembre-se de que "script" não é um termo específico de Open Tibia Servers.
O que é uma linguagem de programação interpretada?
Os brasileiros falam português, ingleses falam inglês e chineses falam mandarim, e com isso o mundo é composto por várias línguas.
No mundo da programação não é diferente. Existem várias línguas que podem ser usadas, cada uma com uma característica e modo de escrever diferente (Assim como o português é diferente do inglês).
Entre estas linguagens, existem 2 tipos: as linguagens interpretadas e as linguagens compiladas (Não-interpretadas). Podemos fazer uma comparação tosca com a vida real: o português seria uma linguagem interpretada (Nosso cérebro precisa "traduzir" a mensagem), e os desenhos seriam a língua compilada (Nosso cérebro reconhece automaticamente a "mensagem" do desenho).
As linguagens compiladas são aquelas que não precisam ser lidas por nenhum programa, pois "conversam" diretamente com o computador, enquando a linguagem interpretada não consegue se comunicar com o computador, então a linguagem compilada recebe a mensagem do codigo interpretado e traduz numa linguagem que o computador entenda, dai a linguagem interpretada pode conversar com o computador (Desde que alguém traduza suas mensagens).
Voltando para a parte de Open Tibia Servers, a linguagem compilada é a linguagem usada no seu servidor: o .exe no Windows, por exemplo, e a linguagem interpretada são os scripts .lua. O seu servidor compilado vai ler os scripts .lua e traduzir o conteúdo deles para que o computador possa executar o que o script manda.
Se os scripts são escritos em linguagens interpretadas, qual é a linguagem dos script usados nos Open Tibia Servers?
Os Open Tibia Servers usam uma linguagem de programação (Interpretada) chamada Lua, que foi feita aqui no Brasil mesmo.
Características da linguagem de programação Lua:
Linguagem de Programação Interpretada Linguagem de Programação Imperativa ou Programação Procedural Linguagem de Scripts ou Linguagem de Extensão Pequena, Fácil, Leve e Eficiente " Lua foi criada por um time de desenvolvedores do Tecgraf da PUC-Rio, a princípio, para ser usada em um projeto da Petrobras. Devido à sua eficiência, clareza e facilidade de aprendizado, passou a ser usada em diversos ramos da programação, como no desenvolvimento de jogos (a LucasArts, por exemplo, usou a linguagem no jogo Escape from Monkey Island), controle de robôs, processamento de texto, etc. Também é freqüentemente usada como uma linguagem de propósito geral. "
Wikipédia - Lua (Linguagem de Programação)
O que eu preciso para aprender Lua e começar a produzir meus scripts?
Paciência (Embora seja de fácil aprendizado, você vai levar algum tempo para aprender a linguagem)
Humildade (Nunca se sinta o melhor, nem ridicularize aqueles que tiverem um conhecimento menor que o seu)
Vontade (Não adianta fazer as coisas sem o menor interesse, você não chegará a lugar nenhum sem vontade)
Criatividade (O principal para produzir um script é ter a idéia do que você vai fazer)
Conhecer a Lógica da Programação (Não se preocupe, eu vou ensinar a Lógica da Programação nas próximas aulas.)
Interpretador Lua (Para testar seus scripts, claro. Você pode usar o seu OTServer para testar, e ainda usar um interpretador Lua para testar seus scripts simples fora do OTServer)
Editor Lua (Não é realmente necessário, uma vez que você pode usar um editor de textos qualquer, como o bloco de notas, mas ter um Editor Lua vai ajudar muito, e alguns até vêm com um Interpretador Lua junto!)
Pagar uma taxa de R$ 700,00, afinal, não estou escrevendo estas aulas de graça! (OK, não precisa pagar nada, mas no mínimo poste seus scripts aqui e ajude a seção a crescer ) Onde posso encontrar um Interpretador e/ou Editor Lua?
Como interpretador (No caso de produzir scripts para Open Tibia Servers) você deve usar um servidor próprio, pessoal somente para testar os scripts que você fez, e pode usar também um Interpretador Lua geral, para testar seus scripts fora dos OTServers.
Como Editor Lua você pode usar qualquer editor de textos, mas eu recomendo usar um editor que seja próprio para a linguagem Lua. Existem dois editores que já vem com um Interpretador Lua "embutido". São eles: OTScript Live! [Download] e SciTE (Scintilla) [Download].
Exercício-Tarefa:
Pesquise mais na internet sobre a linguagem Lua, Scripts, etc...
Somente dúvidas serão aceitas aqui! Comentários que não forem dúvidas serão apagados e os autores serão reportados!
Essa aula foi escrita por uma raposa levada Skyen Hasus, todos os créditos são dele.
Aula 2 - Lógica da programação >> Script Live By colex.rar
-
DATA Vinny deu reputação a matsantos em [AJUDA] COMO RODAR OTSEVER NO UBUNTU 20Você precisa alterar as permissões de executabilidade, questão de segurança.
$ cd ~/Desktop/glaclient
$ sudo chmod +x glaclient-linux
$ ./glaclient-linux
O $ significa comandos via terminal
-
DATA Vinny deu reputação a Carlos Dukka em Sprites Para one pieceBoa noite galera do tk apos postar sprites da pxg padventures, nada seria mais justo do que trazer oportunidades novas
a voce que deseja fazer seu servidor e ajuda a comunidade tibiana hoje trago as sprites da grandline adventures um servidor fan de piratas do anime one piece.
obs aqueles que desejam construir seus servidores sem pay to win leia abaixo\/
para não ficar tudo numa imagem tive que picotar elas.
então voces terão que juntar algumas o ponto positivo é que cabe certo no object,
coloquei algumas imagens tambem reduzidas de mapa para termos uma noção basica de alguns locais do mapa como referencia.
ah tambem alguns icones e imagens de ot client para caso alguem que saiba fazer sistema ou conheça alguem use-as
spolier abaixo scanner e bom proveito.
Link:http://www.mediafire.com/file/fjwe8oglat465fe/gla_sprites.rar/file
Scanner:https://www.virustotal.com/gui/file/55c703241ac7e9ec69daee4e0f834285ec2c0ec996697c329160031ebb5a6d9f/detection
Spollier: imagem a baixo
-
DATA Vinny deu reputação a luanluciano93 em [AJUDA] Qual linux usar?No tfs 1.3Use a mais atualizado do próprio github do TFS: https://github.com/otland/forgottenserver
Ubuntu 20.04