Histórico de Curtidas
-
Flavio S. Cabral recebeu reputação de
mikael rasatem Gente Pfv AjudarPara editar aquilo era só editar o arquivo latestnews.php
-
Flavio S. Cabral deu reputação a xWhiteWolf em Tibia Guitar Hero [0.3.6~0.4]Fala pessoal, hoje vim trazer pra vocês um sistema que eu desenvolvi em outro fórum e decidi trazer pra cá
Chega de falatório e vamos direto aos negócios:
Introdução: O sistema em si é uma cópia dos jogos de ritmo (GuitarFreaks, Band Hero, Rocksmith e o próprio Guitar Hero). Neste jogo pequenas notas irão cair pela tela até atingir um local especial, onde você poderá usar as teclas (Shift + 7, Shift + 8, Shift + 9, ou apenas 7, 9 e 9 [com Num Lock desativado]) para escolher as direções que as notas estão afim de "ativá-las". Uma vez ativada a nota ela será "queimada" e será considerado 1 acerto. Caso você não consiga ativar a nota e ela passar direto, um efeito de fumaça indicará o "Miss", o mesmo vale para se você tentar ativar uma região sem notas.
Sistema de pontuação: Haverão 3 classificadores estatísticos para cada música tocada, sendo eles:
Notas acertadas: O principal fator de ponto, ele que definirá seu recorde e o valor máximo q ele pode assumir será o número de notas da música.
Movimentos errados: Quantidade de movimentos que você fez para alguma região que não possuia notas, conta como pontuação punitiva.
Notas passadas/erradas: Quantidade de notas que você deixou escapar, note que as notas acertadas + notas passadas compõe o número total de notas da música.
Por enquanto o sistema não possui nenhum preço para se jogar mas também não possui nenhuma recompensa, fiz com o intuito de ser apenas um mini game divertido dentro do Tibia. Porém o código é livre e está disponibilizado aqui embaixo pra qualquer um modificar como desejar.
Video explicativo: Dificuldades: O mini game possui 3 dificuldades, porém essa quantidade é tão configurável quanto as pré definições de cada dificuldade. Além da quantidade de notas ser diferente, a velocidade com que elas descem e consequentemente o tempo que você tem pra acertá-las fica diminuido.
Diferenciais: Um forte diferencial desse sistema é que ele foi feito seguindo todas as regras possíveis pra melhorar seu desempenho, desde funções recursivas leves até separação em funções encapsuladas que carregam apenas as informações necessárias. O sistema contém também algumas seguranças que serão explicadas mais abaixo juntamente com o código para prevenir bugs e garantir diversão sem dores de cabeça!
Instalação (Map Editor): Primeiramente faça uma área parecida com essa daqui:
Não precisa ser igualzinha, apenas seguir a mesma proporção
Agora use a ferramenta de No-Logout para setar os quadradinhos que contém UID e UID2 escritos como No-Logout, isso vai impedir que players desloguem e fiquem presos dentro da sala (se eles derem exit, quando eles relogarem estarão do lado de fora da sala)
Ainda olhando a foto acima, coloque 42320 nos pisos que estão escritos UID, e 42319 no piso que contém UID2.
Nas alavancas, coloque uid 2819 em todas elas e coloque actionid 101 para a alavanca do fácil, 102 na alavanca do médio e 103 na do dificil;
A regra é sempre 100 + dificuldade, como nós estamos utilizando apenas 3 será do 101 ao 103.
Note que se você esquecer ou colocar uma dificuldade não existente o sistema adotará a dificuldade 1 como padrão para aquela alavanca.
Se chegou até aqui, meus parabéns. Muito provável que você tenha feito tudo certo. Agora vamos à parte do código.
Instalação (scripts): Em actions.xml insira essa linha
<action uniqueid="2819" event="script" value="GHtest.lua"/> Agora em data/actions/scripts crie um arquivo com extensão.lua e chameo de GHtest. Insira o seguinte bloco de instruções dentro dele:
<movevent type="StepIn" uniqueid="42320;42319" event="script" value="GHTestmov.lua"/> Por fim crie um arquivo chamado GHTestmov.lua em data/movements/scripts e preencha seu conteúdo com as linhas abaixo:
Configurando seu sistema (básico):
Para as pessoas que querem configurar apenas as coisas básicas, você pode fazê-lo nas primeiras linhas de cada script (actions/movements) ou alterando diretamente na lib, irei ensinar passo a passo aqui oque significa cada coisa.
Alterando a lib As coisas básicas que podem ser alteradas na lib são as seguintes:
dif = { -- [dificuldade] = notas que serao tocadas (nil = vazio, 0 = primeira posicao, 1 = segunda e 2 = terceira) [1] = {nil,nil,0,1,2,nil,nil,2,1,1,0,0,2,0,1}, [2] = {nil,nil,0,1,1,2,1,1,0,0,2,0,1,nil,1,2,1,1,0,0,2,0,1}, [3] = {nil,nil,0,nil,1,nil,1,1,0,0,2,0,1,1,1,nil,0,2,1,1,0,0,2,1,1,0,nil,2,2,1,1,1,1,2} } delay = { -- delay entre cada nota de acordo com a dificuldade [dificuldade] = delay [1] = 500, [2] = 400, [3] = 300 } recorde = { -- salva os recordes de cada dificuldade separadamente [1] = 12724, [2] = 12725, [3] = 12726 } dif separa como será cada música de cada dificuldade, as notas sempre serão nesse exato formato. nil significa que não estarei usando posição nenhuma naquela linha, 0 significa a primeira posição (nota verde), 1 significa segunda opção (nota vermelha) e 2 significa terceira opção (nota azul). Eu aconselho a começar todas as músicas com 2 ou mais 'nil' para dar tempo de o player entender que vai começar. A distribuição que eu usei foi meio que aleatória então sinta-se a vontade pra mudar tanto o tamanho das musicas quanto a variedade de notas.
delay é a tabela que oganiza os delays de cada dificuldade, isso significa que para a dificuldade 1(fácil) nós temos 500 milisegundos para cada mudança de nota (1000 milisegundos = 1 segundo), ou seja, a cada 2 passadas de nota temos 1 segundo dentro da sala. No modo hard a cada 300 milisegundos mudamos a nota, deixando o jogo muito mais rápido e dificil.
recorde é a tabela que possui os storages que irão salvar os recordes nas respectivas dificuldades.
Alterando actions local storage_point = 12721 -- storage que salva os pontos local storage_erradas = 12722 -- storage que salva as notas erradas local storage_passadas = 12723 -- storage que salva as notas que passaram Apenas mude os storages
Alterando movements local itemid = 1680 --- coloque o id da nota do meio local npos = {x = 141, y = 51, z = 7} -- posicao que ira nascer a primeira nota local storage_point = 12721 -- storage que salva os pontos local storage_erradas = 12722 -- storage que salva as notas erradas local storage_passadas = 12723 -- storage que salva as notas que passaram aconselho mexer somente nos storages, mantendo igual à action.
Só abra o spoiler abaixo se você estiver descontente com a forma que seu código roda e tiver certeza absoluta de que você tem o conhecimento necessário para alterar as coisas que vou explicar.
-
Flavio S. Cabral recebeu reputação de 1xeuzinho1 em Addon/Mount para Shopsystem por StorageVocê está esquecendo de mudar o offer_type pra 'mount' ou 'addon' ...
Adicione a mount ou addon por comando via mysql no phpmyadmin :
INSERT INTO `z_shop_offer` (`points`, `itemid1`, `count1`, `offer_type`, `offer_description`, `offer_name`) VALUES (10 , 87654, 1, 'mount', 'teste', 'Mount teste') points = pontos que vai custar;
itemid1 = storage do addon/mount;
count1 = 1 <-- deixe 1
offer_type = mount/addon <-- de acordo com que tu quer;
offer_description = descrição do addon/mount;
offer_name = nome da mount/addon;
Lembre-se de usar o shop.lua acima que eu postei...
-
Flavio S. Cabral recebeu reputação de subhe em (Resolvido)AJUDA NPCisso é minha assinatura se não percebeu rsrsrs
-
Flavio S. Cabral deu reputação a Summ em Addon/Mount para Shopsystem por StorageA pedido desse tópico eu fiz o sistema : http://www.tibiaking.com/forum/topic/49214-duvida-como-colocar-uma-mountaddon-especifica-a-venda/
Troque seu shopsystem.php por esse :
shopsystem.php :
Agr em data/creaturescripts/scripts crie addonmount.lua
addonmount.lua
function onLogin(cid) local player = Player(cid) local addons ={ --[storage] = {outfit_male, outfit_female}, [28416] = {143, 147}, -- barbarian [28417] = {134, 142}, -- warrior [28418] = {152, 156}, -- assassins [28419] = {465, 466}, -- Insectoid [28420] = {133, 141}, -- summoner [28421] = {472, 471}, -- Entrepreneur [28422] = {144, 148}, -- duid [28423] = {278, 279}, -- brotherhood [28424] = {577, 578}, -- Dream Warden [28425] = {610, 618}, -- Glooth Engineer [28426] = {130, 138}, -- mage [28427] = {634, 635}, -- Conjurer [28428] = {128, 136}, -- Citizen [28429] = {129, 137}, -- Hunter [28430] = {131, 139}, -- Kinghit [28431] = {132, 140}, -- Noblewoman [28432] = {145, 149}, -- Wizard [28433] = {146, 150}, -- Oriental [28434] = {151, 155}, -- Pirate [28435] = {153, 157}, -- Beggar [28436] = {154, 158}, -- Shaman [28437] = {251, 252}, -- Norsewoman [28438] = {268, 269}, -- Nightmare [28439] = {273, 270}, -- jester [28441] = {289, 288}, -- demonhunter [28442] = {325, 324}, -- yalaharian [28444] = {335, 336}, -- warnaster [28445] = {327, 366}, -- wayfarer [28446] = {430, 431}, -- afflicted [28447] = {432, 433}, -- elementalist [28448] = {463, 464}, -- deepling [28449] = {512, 513}, -- crystal warlord [28450] = {516, 514}, -- soil guardian [28451] = {541, 542}, -- demon [28452] = {574, 575}, -- cave explorer [28453] = {619, 620}, -- jersey [28454] = {637, 636}, -- beastmaster [28455] = {632, 633} -- champion } for storage, addon in pairs(addons) do if player:getStorageValue(storage) > 0 then player:getPosition():sendMagicEffect(CONST_ME_GIFT_WRAPS) player:addOutfitAddon(addon[1], 3) player:addOutfitAddon(addon[2], 3) player:sendTextMessage(MESSAGE_INFO_DESCR, "Seu Addon full foi adicionado!") player:setStorageValue(storage, 0) end end local mounts ={ --[storage] = mounts, [80000] = 1, -- Widow Queen [80001] = 2, -- Racing Bird [80002] = 3, -- War Bear [80003] = 4, -- Black Sheep [80004] = 5, -- Midnight Panther [80005] = 6, -- Draptor [80006] = 7, -- Titanica [80007] = 8, -- Tin Lizzard [80008] = 9, -- Blazebringer [80009] = 10, -- Rapid Boar [80010] = 11, -- Stampor [80011] = 12, -- Undead Cavebear [80012] = 13, -- Donkey [80013] = 14, -- Tiger Slug [80014] = 15, -- Uniwheel [80015] = 16, -- Crystal Wolf [80016] = 17, -- War Horse [80017] = 18, -- Kingly Deer [80018] = 19, -- Tamed Panda [80019] = 20, -- Dromedary [80020] = 21, -- King Scorpion [80021] = 22, -- Rented Horse [80022] = 23, -- Armoured War Horse [80023] = 24, -- Shadow Draptor" [80024] = 25, -- Rented Horse [80025] = 26, -- Nethersteed [80026] = 27, -- Ladybug [80027] = 28, -- Manta [80028] = 29, -- Ironblight [80029] = 30, -- Magma Crawler [80030] = 31, -- Dragonling [80031] = 32, -- Gnarlhound [80032] = 33, -- Crimson Ray [80033] = 34, -- Steelbeak [80034] = 35, -- Water Buffalo [80035] = 36, -- Tombstinger [80036] = 37, -- Platesaurian [80037] = 38, -- Ursagrodon [80038] = 39, -- The Hellgrip [80039] = 40, -- Jade Lion [80040] = 41, -- Golden Lion [80041] = 42, -- Shock Head [80042] = 43, -- Walker [80043] = 44, -- Azudocus [80044] = 45, -- Carpacosaurus [80045] = 46, -- Death Crawler [80046] = 47, -- Flamesteed [80047] = 48, -- Jade Pincer [80048] = 49, -- Tempest [80049] = 50 -- Winter King } for storage, mount in pairs(mounts) do if player:getStorageValue(storage) > 0 then player:getPosition():sendMagicEffect(CONST_ME_GIFT_WRAPS) player:addMount(mount) player:sendTextMessage(MESSAGE_INFO_DESCR, "Sua Mount foi adicionado!") player:setStorageValue(storage, 0) end end return true end Só adicionar a storage do arquivo no itemid do shop.
creaturescript.xml tag
<event type="login" name="ShopMountAddon" script="addonmount.lua"/> Ps : o Shop vai puxar o numero da storage pra procura pela img do addon/mount.
Créditos a Taverna de Programação por ter me ajudado
-
Flavio S. Cabral deu reputação a olokomeu em Show OFF | OlokomeuOlá pessoal do TibiaKing!. Hoje estou mostrando algumas imagens do meu mapa próprio 8.6 para vocês. Gostaria de saber suas opiniões. Aceito criticas construtivas , se possível digam o que melhorar caso haja algo irrelevante no mapa, pois, tenho - de 2 meses de pratica com mapas >.<.
Primeiramente o Mapa Geral ( Ainda está em construção, não liguem para as partes pretas rsrs ).
Cidades:
City 1:
In-Game :
City 2:
In-Game:
City 3:
In-Game:
City 4:
In-Game:
Irei colocar mais fotos conforme o avanço,pois, ainda falta duas Citys !! At+
-
Flavio S. Cabral deu reputação a Gabrieltxu em Vamos evoluir? Unity 3DEai galera beleza? entao queria respostas sem zueira no tópico pois é um assunto sério , enfim , esses dias atras estava pensando em sair da programação tibia/otserver e ir para outra área , algo mais complexo , ai lembrei de uma engine que se usa muito hoje em dia para criar jogos e vi que as linguagems que ela usa para os seus scripts nao é dificil de se aprender , que seria JavaScript == JS , e C# , e com isso me deu mais uma ideia , de juntar uma galera que quer aprender e aprender todo mundo junto, lembrando que oque eu sei de JS é muito pouco e C# é nada , então seria mesmo que todos iniciantes para aprender juntos , e com isso começar um projeto todo mundo junto de um jogo Medieval ou a criterio de conversas entre o grupo etc... , já baixei aqui o Unity 3D , ele vem com uma ferramente muito Util para ajudar em nossos scrips que é o MonoDevelop , creio que se tiver força de vontade e dedicação aprendemos rápido e claro aprendendo a programar jogos você programa qual quer coisa ... gerando renda + profissionalização , é isso galera comenta ai oque vocês acham da ideia de criar um grupo para começar a mecher com o Unity e bora criar jogos e as coisas todas ! ... é isso vlw flw
-
Flavio S. Cabral recebeu reputação de thiagobji em Windows ou LinuxLinux é 100x melhor que o ruimdowns, não preciso nem entrar em detalhes basta jogar no google e irá ver o que estou falando ... aqui no fórum existe bastante tutoriais, que ensinam compilar e instalar tudo certinho, mas se mesmo assim tu se sente inseguro de migrar pro linux, como tu pediu tem a MONEY DEDICADOS , que da suporte na instalação, confirmo isso pois trabalho/ajudo na área de suporte lá, então qualquer coisa ou dúvida só me procurar.
-
Flavio S. Cabral recebeu reputação de Alanray em ERRO AO COMPLIAR OTSERVER NO LINUX 14.10sempre rodei tfs1.0, no ubuntu 14.04 ... 14.10 ... então não tem essa de não é compatível.
falta um pouco entender inglês de sua parte Alanray ou até mesmo tentar traduzir.
root@alan-S3420GP:~/otserv# mkdir build && cd build mkdir: é impossível criar o diretório “build”: Arquivo existe root@alan-S3420GP:~/otserv# cmake .. CMake Error: The source directory "/root" does not appear to contain CMakeLists.txt. Specify --help for usage, or press the help button on the CMake GUI. é impossível criar o diretório “build”: Arquivo existe ... <-- Já tem recomendo deletar ...
The source directory "/root" does not appear to contain CMakeLists.txt. <-- o Arquivo CMakeLists.txt não está onde deveria ...
tente ler isso > http://askubuntu.com/questions/527665/undefined-reference-to-symbol-expglibc-2-2-5< pode acabar sendo a solução.
-
Flavio S. Cabral deu reputação a xBen em (Resolvido)Arma que evolui (wtf)Crie um arquivo lua em creaturescripts/scripts , coloque o nome de weaponLevelup.lua e adicione o script dentro.
depois vai em creaturescripts.xml adicione a tag, depois va no script login e adicione o registro
tag:
<event type="kill" name="weaponLevelUp" event="script" value="weaponLevelUp.lua"/> script:
function onKill(cid, target, lastHit) local monster = { --["nome do monstro minuscuolo"] = {storage = storage de contagem, reward = arma que vai ser transformar, weapon = arma necessaria, kill = quantidade de monstro que tem que matar} ["bat"] = {storage = 10376, reward = 2392, weapon = 2376, kill = 5}, ["rat"] = {storage = 10377, reward = 1255, weapon = 2376, kill = 20}, } if isPlayer(cid) then if isMonster(target) then local name = getCreatureName(target) local name_monster = monster[string.lower(name)] if name_monster then local weapon = monster[name:lower()].weapon if getPlayerSlotItem(cid, 6).itemid == weapon then local reward = monster[name:lower()].reward local storage = monster[name:lower()].storage local count = getPlayerStorageValue(cid, storage) local kill = monster[name:lower()].kill if count == -1 then count = 0 end count = count+1 setPlayerStorageValue(cid, storage, count) doSendAnimatedText(getPlayerPosition(target), " #"..count.." / #"..kill.." ", 65) if count == kill then doPlayerSendTextMessage(cid, 27, "Success! You have upgraded your weapon.") setPlayerStorageValue(cid, storage, -1) doTransformItem(getPlayerSlotItem(cid, 6).uid, reward) doSendMagicEffect(getPlayerPosition(cid), 7) doSendAnimatedText(getPlayerPosition(cid), " Done ", 32) end end end end end return true end registro:
registerCreatureEvent(cid, "weaponLevelUp") lembrando que a arma tem que estar no slot 6 que é o esquerdo, qualquer duvida só perguntar que eu respondo se ajudei REP+
EDIT - faltava uma verificação e estava causando bug, já foi concertado
-
Flavio S. Cabral deu reputação a luanluciano93 em [Projeto] New StyllerOlá pessoal, hoje venho apresentar meu projeto particular. Sou muito fã do mapa styller, sempre em horas vagas procurava joga-lo, para quem não conhece: é um servidor estilo baiakm só que mais difícil e com mais RPG, e como tenho me interessado por versões mais atuais, resolvi criar um styller (new styller) seguindo as ultimas atualizações do TFS, seria algo parecido com o projeto do Kaique e do Jamison, aqui no fórum, o KNJ.
Irei postando de pouco em pouco as atualizações, definindo o que foi feito e o que ainda pretendo fazer ...
# Informações do Servidor
→ Versão: 10.77 (seguindo as atualizações do TFS 1.2).
→ Exp: 500x (Inicial - veja aqui).
→ Skills 50
→ Magic 30
→ Loot: 4
# Sistemas do Servidor
→ Cast System (100%)
→ Vip System (100% - liberado)
→ Reward Level System (100% - liberado)
→ Addons System (100%)
→ Mounts System (100%)
→ War System (100%)
→ Market System (100%)
→ Training OFF (100%)
→ Clean Database (100%)
→ Client Próprio - Opcional (100%)
→ Arena PVP. (100%)
→ Marriage System (pendente)
→ Quest Log (pendente)
→ Forja System (pendente)
→ Refinamento System (pendente)
→ Achievements System (pendente)
→ Cassino System (pendente)
→ Task System (pendente)
# Eventos do Servidor
→ Zombi Evento. (100%)
→ War Anti-Entrosa (100%)
→ CastleWar. (100%)
→ BattleField Evento. (100%)
→ Capture The Flag. (100%)
→ Gran Tower. (100%)
→ Hour Kill. (100%)
→ War of Emperium. (100%)
→ Dota. (100%)
→ Coliseum. (100%)
→ Survival Evento. (100%)
# Quests
→ Em breve.
# Website
→ Em construção. (http://www.styller.org/)
# Equipe
→ [member=luanluciano93] (administrador/scripter/webmaster)
# Imagens
# Pesquisa / Enquetes
→ Comose prevenir de disputas no Pagseguro?
# Comentários de membros
Curta nossa página no facebook.
É isso pessoal, espero que gostem, abraços!
-
Flavio S. Cabral deu reputação a Summ em Compilando OTserver em Linux Ubuntu 14.04Com o avanço do TFS outras versões como 10.04, 12.04, 13.10... pararam de oferecer uma boa estabilidade para os otserv tfs 1.0 +, então várias pessoa estão migrando para o linux 14.04 e sentem algumas dificuldades com instalação de libs, compilamento e instalação de um banco de dados, então a pedido de um amigo meu fiz um breve tutorial, para alem de ajuda-lo ajudar outros com eventuais dúvidas.
Então vamos ao que interessa :
Downloads necessarios:
SSH Secure Shell
WinSCP
Acessando Shell SSH veja os passos a seguir :
Proxima vez que você for acessa sua maquina por Shell clique em Profile sem ter necessidade de clicar em Quick Connect:
(Comandos para copiar e colar no shell [Copia: ctrl+insert] [Colar: shift+insert]).
Para visualizar ou enviar sua source por ftp vamos usar o WinSCP acesse ele:
Certo!
Enviou a pasta do OTserver para a pasta home? renomeie ela com o f2 para o nome otserver. Feito? Vamos inciar:
Sempre espere terminar por completo o processamento de instalação após executa o comando:
Se aparecer algo (Y or N?) digita Y e da enter.
apt-get update ...
apt-get install git cmake build-essential liblua5.2-dev libgmp3-dev libmysqlclient-dev libboost-system-dev ...
escreva o diretório de onde se encontra sua sources : que no meu caso se encontra em "cd /home/otserv/"
cd /home/otserv/ ...
mkdir build && cd build ...
cmake .. ...
make Pronto só esperar terminar de compilar, quando terminar via ftp use ctrl+r (atualizar) que seu arquivo se encontra na pasta "build" nome o nome "tfs" e o mova para sua pasta "cd /home/otserv".
Agr vamos instalar apache + mysql + phpmyadmin e deixar seu site online.
Via SHELL digite :
apt-get update ...
apt-get install apache2 ...
apt-get install php5 Aqui você irá escolher um senha pro seu apache...
apt-get install mysql-server ...
apt-get install libapache2-mod-auth-mysql Aqui você vai escolher uma senha pro seu phpmyadmin :
apt-get install phpmyadmin ...
echo "include /etc/phpmyadmin/apache.conf" | sudo tee -a /etc/apache2/apache2.conf ...
/etc/init.d/apache2 restart Pronto verifique se está tudo correto, http://ip.da.maquina/phpmyadmin acesse seu phpmyadmin usando user: root e a senha é a que você botou na instalação do mysql, crie o seu banco de dados e upe a sua database.
Via FTP, vá em var/www e exclua a pasta html e mova a seu website para lá, após isso configure o seu config.php e config.lua com os dados corretos e já será possível acessar seu site via http://ipdamaquina.
Agora vamos deixar seu otserv online, via SHELL digite :
cd /home/otserv/ ...
chmod 777 -R tfs ...
./tfs "Para fecha-lo basta dar ctrl + C"
Pronto seu serve está online!!
Créditos : Natanael Beckman
Otland TEAM
Summ
-
Flavio S. Cabral recebeu reputação de Caronte em Volta das entrevistasQual foi sua maior dificuldade quando começou a empresa de hosters ? houve algum momento que você pensou em desistir, se sim qual ?
-
Flavio S. Cabral recebeu reputação de Heyron em (Resolvido)(SCRIPTING) Erro no script.function onAdvance(cid, skill, oldlevel, newlevel) local skillMsgs = { [SKILL_FIST] = "You advanced in first fighting ["..getPlayerSkill(cid, SKILL_FIST).."].", [SKILL_CLUB] = "You advanced in club fighting ["..getPlayerSkill(cid, SKILL_CLUB).."].", [SKILL_SWORD] = "You advanced in sword fighting ["..getPlayerSkill(cid, SKILL_SWORD).."].", [SKILL_AXE] = "You advanced in axe fighting ["..getPlayerSkill(cid, SKILL_AXE).."].", [SKILL_DISTANCE] = "You advanced in distance fighting ["..getPlayerSkill(cid, SKILL_DISTANCE).."].", [SKILL_SHIELD] = "You advanced in shielding ["..getPlayerSkill(cid, SKILL_SHIELD).."].", [SKILL_FISHING] = "You advanced in fishing ["..getPlayerSkill(cid, SKILL_FISHING).."].", [SKILL__MAGLEVEL] = "You advanced in magic level ["..getPlayerMagLevel(cid).."]." } if(skillMsgs[skill]) then doCreatureSay(cid, skillMsgs[skill], TALKTYPE_MONSTER) end return true end
-
Flavio S. Cabral deu reputação a Caronte em [MAGIAS] Como adicionar-las no seu servidorOlá pessoal, estou fazendo esse tutorial a pedido de admelite no meu tópico
como um tutorial é algo fácil e rápido de fazer (dependendo do tema) eu me propus a fazer:
Esse tutorial é bem simples, porém não se encontra no TibiaKing, acho que o motivo é a sua simplicidade, e ele pode ajudar a qualquer um que esteja começando agora a criar um servidor tibia OTserver. Ok chega de lorotas, vamos começar:
De nada adianta você querer adicionar uma spell, se você não sabe fazer uma, por isso, eu recomendo que veja pelo menos dois tópicos do fórum antes de ver este:
http://www.tibiaking.com/forum/topic/7448-criando-spells-para-seu-servidor/
http://www.tibiaking.com/forum/topic/48868-spell-creator/
O principal a se saber antes de eu começar é: que quase todos os scripts ou sistemas do tibia, sejam eles de creaturescripts ou actions ou qualquer coisa, precisam ser registrados em um XML, para serem carregados ao OTserver ligar ou carregados ao GOD dar o comando /reload (param), não esquecendo também que os scripts são extremamente necessários, sem uma das duas partes, seja XML ou seja SCRIPT, não será possível utilizar o script no servidor.
Nota:
XMLs:
Os XMLs, são arquivos com a extensão XML e servem para mostrar ao servidor o que carregar, como se fosse um indicador.
Vou usar o exemplo de um XML de spells...
Todos os XMLs precisam ser abertos e fechados internamente, o xml da Spells é aberto com
<spells> e é fechado com </spells>
E todas as spells, devem ser inseridas em baixo de um </instant> , exceto a primeira de uma aba, que pode ser criada assim:
<!-- Aba --> o </instante> serve para separar o começo da nova spell do final da spell anterior, ele é de extrema importância, se não você irá bugar 2 spells.
<instant name="Death Strike" words="exori mort" lvl="16" mana="20" prem="1" range="3" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" event="script" value="attack/death strike.lua"> <vocation id="1"/> <vocation id="2"/> <vocation id="5"/> <vocation id="6"/> </instant> Legenda:
Linguagem binária:
Usa-se 0 para não e 1 para sim !
instant name = Nome da magia.
words = Palavra para chamar a magia.
lvl = Level mínimo para usar a magia
mana = Mana que gastará a magia.
prem = Se precisa de premmium para usar a magia.
range = Distância (em sqm) da magia
casterTargetOrDirection = Seguir alvo ou direção.
blockwalls = Não passará paredes.
exhaustion = Tempo para repetir a magia. (em mili segundos cada 1000 é 1 segundo)
needlearn = Se precisa aprender para usar a magia
event = Sempre use script, não interessa a function agora...
value = Onde se encontra o script
vocation = Vocação para usar a magia.
Vocations:
Nos servidores normais:
Rookie = 0 (qualquer um pode usar)
Sorcerer = 1
Druid = 2
Paladin = 3
Knight = 4
Master Sorcerer = 5
Elder Druid = 6
Royal Paladin = 7
Elite Knight = 8
Agora se você quer adicionar uma nova spell no seu XML, suponhamos que seja assim o seu XML:
<?xml version="1.0" encoding="UTF-8"?> <spells> <!-- Suas spells --> <instant name="Death Strike" words="exori mort" lvl="16" mana="20" prem="1" range="3" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" event="script" value="attack/death strike.lua"> <vocation id="1"/> <vocation id="2"/> <vocation id="5"/> <vocation id="6"/> </instant> </spells> Para adicionar simplesmente fazemos isso:
<?xml version="1.0" encoding="UTF-8"?> <spells> <!-- Suas spells --> <instant name="Death Strike" words="exori mort" lvl="16" mana="20" prem="1" range="3" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" event="script" value="attack/death strike.lua"> <vocation id="1"/> <vocation id="2"/> <vocation id="5"/> <vocation id="6"/> </instant> <instant name="Death Strike" words="exori mort" lvl="16" mana="20" prem="1" range="3" casterTargetOrDirection="1" blockwalls="1" exhaustion="2000" needlearn="0" event="script" value="attack/death strike.lua"> <vocation id="1"/> <vocation id="2"/> <vocation id="5"/> <vocation id="6"/> </instant> </spells> Veja como o </instant> no final das spells, serve para dividi-las.
Aviso: De nada serve adicionar a spell ao XML se não tiver o SCRIPT a tag no XML é simplesmente para avisar ao otserver que tem um conteúdo, ou seja, de nada vai servir avisar que tem, se não tiver, só dará erro na distro e dor de cabeça.
Créditos: EU
O Tutorial acaba aqui.
se você gostou deixe o seu obrigado como post !
Espero que tenha ajudado um bocado de membros e visitantes,
se você é um visitante cadastre-se e poste no meu tópico
Qualquer dúvida ou sugestão em relação ao tutorial,
POSTE AQUI:
-
Flavio S. Cabral recebeu reputação de Drazyn1291 em (Resolvido)RESOLVIDO Npc Vocationlocal keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local stg = 57894 if getPlayerStorageValue(cid, stg) < 1 then if msgcontains(msg:lower(), 'sorcerer') then npcHandler:say('A SORCERER! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!', cid) talkState[talkUser] = 1 elseif msgcontains(msg:lower(), 'druid') then npcHandler:say('A DRUID! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!', cid) talkState[talkUser] = 2 elseif msgcontains(msg:lower(), 'paladin') then npcHandler:say('A PALADIN! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!', cid) talkState[talkUser] = 3 elseif msgcontains(msg:lower(), 'knight') then npcHandler:say('A KNIGHT! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!', cid) talkState[talkUser] = 4 elseif msgcontains(msg:lower(), 'yes') then if talkState[talkUser] == 1 then doPlayerSetVocation(cid, 1) npcHandler:say('SO BE IT!', cid) setPlayerStorageValue(cid, stg, 1) talkState[talkUser] = 0 elseif talkState[talkUser] == 2 then doPlayerSetVocation(cid, 2) npcHandler:say('SO BE IT!', cid) setPlayerStorageValue(cid, stg, 1) talkState[talkUser] = 0 elseif talkState[talkUser] == 3 then doPlayerSetVocation(cid, 3) npcHandler:say('SO BE IT!', cid) setPlayerStorageValue(cid, stg, 1) talkState[talkUser] = 0 elseif talkState[talkUser] == 4 then doPlayerSetVocation(cid, 4) setPlayerStorageValue(cid, stg, 1) npcHandler:say('SO BE IT!', cid) talkState[talkUser] = 0 end elseif msgcontains(msg:lower(), 'no') then npcHandler:say(getCreatureName(cid) .. ', WHAT KIND OF PROFESSIONAL DO YOU WANNA BE? KNIGHT, PALADIN, SORCERER, OR DRUID?', cid) talkState[talkUser] = 0 elseif msgcontains(msg:lower(), 'bye') then npcHandler:say('Good bye.', cid) talkState[talkUser] = 0 end else npcHandler:say('YOU ALREADY HAVE VOCATION!', cid) talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) <?xml version="1.0" encoding="UTF-8"?> <npc name="Mendigo" script="data/npc/scripts/mendigo.lua" walkinterval="25" floorchange="0" access="5" lookdir="1" > <health now="150" max="150"/> <look type="133" head="95" body="86" legs="86" feet="38" addons="3"/> <parameters> <parameter key="message_greet" value="|PLAYERNAME|, WHAT KIND OF PROFESSIONAL DO YOU WANNA BE? KNIGHT, PALADIN, SORCERER, OR DRUID?"/> </parameters> </npc>
-
Flavio S. Cabral deu reputação a Beeny em olá, pessoas.não faço nada no photoshop tem tempo
:c
-
Flavio S. Cabral deu reputação a Bruno Minervino em [Programando em C#] Capítulo 1 - Introdução ao C# e Visual StudioCapítulo 1 - Introdução ao C# e Visual Studio
Vou começar a escrever e gravar tutoriais sobre C# para incentivar pessoas que tenham interesse em começar a programar, e esta foi a linguagem escolhida devido à facilidade principalmente da ferramenta que é utilizada para trabalharmos. Apenas para ressaltar que estes tutoriais começaram com teoria (escrito) e em seguida com a prática (vídeo aulas).
Aos finais de semana, sempre que estiver disponível estarei ajudando com dúvidas pelo Skype (o que já faço com algumas pessoas).
Antes de começarmos, peço que ao lerem os tutoriais e encher-me de perguntas, lembre-se que eu trabalho durante a semana e quando não puder responder, não é capricho e sim indisponibilidade. Então quando possíveis erros surgirem usem outros meios de conseguirem respostas, com isso você aprende a lidar com as situações do dia-a-dia.
1.1 – Introdução
O C# é uma das linguagens disponíveis na Plataforma .NET que em conjunto com o Visual Studio que será nossa ferramenta de desenvolvimento, podemos criar várias aplicações do gênero, sejam elas para ambiente Windows ou para ambiente Web, como: biblioteca de classes (as famosas DLLs), páginas Web, aplicações para Desktop, Web Services, entre outros.
Ao fim deste capítulo você terá o fundamento básico para começar a trabalhar com a linguagem C#: a Plataforma .NET, o Visual Studio, a introdução a uma programação elementar e os conceitos básico de como compilar e executar o seu programa.
1.2 – A Linguagem C#
Com o C# podemos desenvolver diversos tipos de aplicativos, tais como: banco de dados, cliente-servidor, aplicativos tradicionais do Windows, além de componentes distribuídos, Web Services, Web Sites, entre outros. O C# é uma linguagem orientada a objetos, fortemente tipada¹, estável e versátil. Em conjunto com o Visual Studio, permite ao desenvolvedor um ganho de produtividade característico das ferramentas Microsoft.
O Visual Studio conta com um depurador integrado, um editor de códigos avançado, designers de interface de usuários altamente funcionais, entre outras ferramentas que auxiliam na criação de aplicativos que serão executados no .NET Framework.
Embora seja uma linguagem fácil de trabalhar, o C# é muito sofisticado. Pessoas que tenham conceitos básicos de C, C++ ou Java reconhecerão rapidamente detalhes de sua sintaxe e funcionamento.
¹ O termo "fortemente tipada" significa que todos os dados utilizados na programação precisam ter um tipo definido.
1.3 – Plataforma .NET
A Plataforma .NET visa unificar o desenvolvimento e a execução de diferentes aplicativos e sistemas em uma única Plataforma, sejam eles para Windows, Web, Windows Store, Windows Phone, Windows Azure, etc. Qualquer código gerado por essa plataforma poderá ser interpretado em qualquer dispositivo ou equipamento que possua o Framework compatível.
Por meio das soluções oferecidas por esta Plataforma, torna-se possível, acima de tudo, a integração de diferentes sistemas de forma fácil e ágil, gerando uma interoperabilidade entre as tecnologias existentes. As diferentes tecnologias que compõem a Plataforma .NET são chamadas, em conjunto, de .NET Framework.
Ela é composta basicamente com as linguagens C# e Visual Basic, e dois componentes fundamentais, o Common Language Runtime (CLR) e o Framework Class Library (FCL).
De forma simplificada, a plataforma .NET é composta pelos seguintes elementos:
Visual Studio: Ferramenta para desenvolvimento de aplicações. Ele contém o compilador primário que gera o executável;
Compilador primário: Transforma o programa que fizemos em linguagem de alto nível (C#, C++, VB.Net) em uma linguagem intermediária (MSIL);
Bibliotecas de classes: Conjunto de DLLs contendo milhares de recursos disponíveis para utilizarmos nas nossas aplicações;
Compilador secundário: Lê as instruções contidas no arquivo MSIL e as traduz para a linguagem do microprocessador (Assembly).
A ideia é que o desenvolvedor escreva o código uma vez, independente do sistema ou dispositivo que irá utilizá-lo.
O programa é escrito em qualquer uma das mais de trinta linguagens .NET disponíveis para a plataforma, o código fonte gerado é então compilado para um código intermediário, em uma linguagem chamada MSIL (Microsoft Intermediate Language), gerando um arquivo de extensão DLL ou EXE (outra extensão .NET), conforme o template de projeto escolhido.
Esse arquivo então, quando executado, deverá ser interpretado pela CLR compatível com o sistema operacional utilizado.
Os itens 1.4 e 1.5 seriam a introdução à Interface do Visual Studio, então decidi deixar para o Capítulo 2, pois vou fazer em vídeo aula, para facilitar o entendimento da ferramenta.
Espero que gostem deste primeiro capítulo, embora seja apenas a teoria irá ajudar em possíveis dúvidas que surgirão ou até pessoas que já conhecem a linguagem e tem dúvidas em certos detalhes.
Tomei-me como base uma apostila que tenho, porém foi tudo escrito por mim, nada copiado, apenas interpretado.
Estou aberto à dicas, sugestões e críticas. -
Flavio S. Cabral recebeu reputação de Mr. Crimson Prince em [ERRO] Script não pôde ser abertoNo such file or directory --> Nenhum arquivo ou diretório encontrado.
Verifique se o caminho e o nome do arquivo ou a extensão (.lua) esteja correta. Crie outro arquivo se necessário com um nomediferente.lua e tente.
-
Flavio S. Cabral recebeu reputação de Mr. Crimson Prince em (Resolvido)[ajuda] bug no npc de vocações supremaslocal vocations = {5, 6, 7, 8} -- Não modifique... local stg = 98749 local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg:lower(), 'voc suprem') then selfSay('Deseja virar {Voc suprem} ?', cid) talkState[talkUser] = 1 elseif msgcontains(msg:lower(), 'yes') and talkState[talkUser] == 1 then if getPlayerStorageValue(cid, stg) < 1 then if isInArray(vocations, getPlayerVocation(cid)) > 4 then if getPlayerItemCount(cid, 142) >= 1 then doPlayerRemoveItem(cid, 142, 1) doPlayerSetVocation(cid, getPlayerVocation(cid) + 4) selfSay('Parabéns você acaba de completar Asgard.', cid) setPlayerStorageValue(cid, stg, 1) talkState[talkUser] = 0 else selfSay('Você não tem {suprem vocation} suficientes.', cid) talkState[talkUser] = 0 end else selfSay('Você não tem a primeira promotion', cid) talkState[talkUser] = 0 end else selfSay('Você já tem vocation suprema', cid) talkState[talkUser] = 0 end elseif msgcontains(msg:lower(), 'no') or msgcontains(msg:lower(), 'bye') then selfSay('Bye!', cid) talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
-
Flavio S. Cabral recebeu reputação de Mr. Crimson Prince em (Resolvido)errro Script pLayer not foundfunction onStepIn(cid, item, frompos, item2, topos) if isPlayer(cid) then doSendAnimatedText(getPlayerPosition(cid), ""..getPlayerName(cid).."", TEXTCOLOR_DARKRED) doPlayerAddItem(cid, 965, 1) end return true end
-
Flavio S. Cabral deu reputação a Summ em RESOLVIDO NPCs change sex/change namelocal keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local price = xxx --Preço para trocar de sexo. if msgcontains(msg:lower(), "change") or msgcontains(msg:lower(), "sex") then selfSay("Do you wanna change your sex? It will cost {"..price.." gold}.", cid) talkState[talkUser] = 1 return true elseif msgcontains(msg:lower(), "yes") and talkState[talkUser] == 1 then if doPlayerRemoveMoney(cid, price) then doPlayerSetSex(cid, getPlayerSex(cid) == 0 and 1 or 0) selfSay("You sucefully changed your sex.", cid) doRemoveCreature(cid) talkState[talkUser] = 0 return true else selfSay("You do not have enough gold.", cid) talkState[talkUser] = 0 return true end elseif msgcontains(msg:lower(), "no") and talkState[talkUser] == 1 then selfSay("Ok, bye.", cid) talkState[talkUser] = 0 return true end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Dps da o feedback do tópico do npc mendigo se funcionou ou não ... vou dar uma olhada no de change name e já edito aqui.
-
Flavio S. Cabral deu reputação a xWhiteWolf em Resultado do CMS #01Primeiramente gostaria de agradecer aos participantes por terem se disponibilizado a fazer um script pro campeonato, só por isso todos já eram merecedores do primeiro lugar. Confesso que foi difícil escolher e as notas variaram muito pouco, inclusive pedi ajuda pra um amigo aqui da rep já que o Suicide está com uns problemas e não pôde me ajudar..
Sem mais delongas, o resultado final pode ser conferido abaixo:
1º Lugar - Frenesy
+15 REP
http://www.tibiaking.com/banners/mconcur/cms1-prêmio.png 2º Lugar - Killua
+10 REP
http://www.tibiaking.com/banners/mconcur/cms1-prêmio2.png 3º Lugar - Marcelo Druida
+5 REP
http://www.tibiaking.com/banners/mconcur/cms1-prêmio3.png Os scripts de cada um serão postados em breve, as recompensas serão dadas pelo Matheus;
As críticas foram dadas individualmente mas gostaria de acrescentar que nenhum dos participantes teve uma nota maior porque não acertou o tema corretamente. Todos fizeram puzzles e oque eu queria era uma quest. A tradução de quest é "jornada" então vocês deviam ter feito uma espécie de missão pro player completar e não simplesmente um baú que abre e dá item. Espero que vocês se atentem melhor nessas coisas pras próximas edições (caso hajam); Qualquer dúvida venham falar cmg, e parabéns novamente!
Um parabéns especial para o Killua que fez um script simulando orientação à objetos, uma forma alternativa de programação à estruturada. Com isso ele foi um dos poucos que conseguiu nota máxima em um dos critérios. Abraços.
-
Flavio S. Cabral recebeu reputação de Damarcio em (Resolvido)errro Script pLayer not foundfunction onStepIn(cid, item, frompos, item2, topos) if isPlayer(cid) then doSendAnimatedText(getPlayerPosition(cid), ""..getPlayerName(cid).."", TEXTCOLOR_DARKRED) doPlayerAddItem(cid, 965, 1) end return true end
-
Flavio S. Cabral recebeu reputação de Gabrielk em Npc de Informações<?xml version="1.0" encoding="UTF-8"?> <npc name="Luke" script="data/npc/scripts/npcinfo.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="152" head="95" body="95" legs="29" feet="56" addons="2" corpse="6080"/> <parameters> <parameter key="message_greet" value="Questions come to the right place just say whatever... {aol}, {vip}, {hunts}, {houses}, {quests}, {task} ?" /> </parameters> </npc> npcinfo.lua
local text = { aol = '', -- escreva o texto vip = '', -- escreva o texto hunts = '', -- escreva o texto houses = '', -- escreva o texto quests = '', -- escreva o texto task = '' -- escreva o texto } local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) npcHandler.topic = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end if msgcontains(msg:lower(), 'aol') then npcHandler:say(text.aol, cid) npcHandler.topic[cid] = 0 elseif msgcontains(msg:lower(), 'vip') then npcHandler:say(text.vip, cid) npcHandler.topic[cid] = 0 elseif msgcontains(msg:lower(), 'hunts') then npcHandler:say(text.hunts, cid) npcHandler.topic[cid] = 0 elseif msgcontains(msg:lower(), 'houses') then npcHandler:say(text.houses, cid) npcHandler.topic[cid] = 0 elseif msgcontains(msg:lower(), 'quests') then npcHandler:say(text.quests, cid) npcHandler.topic[cid] = 0 elseif msgcontains(msg:lower(), 'task') then npcHandler:say(text.task, cid) npcHandler.topic[cid] = 0 elseif msgcontains(msg:lower(), 'bye') or msgcontains(msg:lower(), 'ok') then npcHandler:say('Bye!', cid) npcHandler.topic[cid] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())