Histórico de Curtidas
-
davidvietro deu reputação a Shawii em AutoComplete e Highlight TFS para Notepad++Edit: não sei se estou na sessão certa, sou novo por aqui, se não estiver por favor me mova
E ae!
Fazia um bom tempo que não mexia com OT scripting,
então para me ajudar, fiz um autocomplete e Highlight (marca as funções com cores diferentes) das funções que achei no tópico Lista de Funções LUA
Não é uma coisa que se diga "NOOOSSA QUE FODA MALUCO DO CÉU", mas pode ajudar algumas pessoas que assim como eu não estão acostumadas com o nome das funções do TFS.
Parte 1 - Adicionar o Autocomplete:
Para adicionar o autocomplete basta pegar esse código:
- Vá até o diretório Notepad++\plugins\APIs na pasta onde foi instalado o notepad++
- Copie qualquer arquivo
- Renomeie o novo arquivo para lua
- Substitua seu conteúdo pelo código acima
Pronto, agora é só ativar o autocomplete no notepad++ (caso ainda não esteja ativado, vem off por padrão)
Com o programa aberto entre em Configurações > Preferências > Auto Completar
- Marque a opção "Habilitar Auto Completar para cada entrada"
- Marque a opção "Function and word completion"
e PRONTO autocomplete adicionado com sucesso!
Parte 2 - Adicionar o highlight (marcar as funções com cores diferentes)
- Copie o conteúdo desse spoiler
- Abra o notepad++ e entre em Configurações > Configurador de estilos
- Observe a screenshot e acompanhe os passos:
No menu Linguagem selecione a opção: LUA No menu Local do Estilo selecione a opção: FUNC1 Cole o conteúdo do spoiler no campo "Palavras chave definidas pelo usuário" que está em Branco. Altere a cor se desejar
Clique em salvar & fechar e PRONTO, você adicionou cor ao seu código tornando seu dia como scripter muito mais bonito organizado e gay.
Conforme eu for descobrindo o que cada função faz e seus parâmetros (obrigatórios e opcionais) vou ir documentando pra depois fazer um autocomplete com descrições das funções, quando tiver um bom conteudo nesse sentido volto a postar pra vcs, abraço!
-
davidvietro deu reputação a Natanael Beckman em DEV C++ Compilando TFS no WindowsDEV C++, aprenda a compila uma source TFS!
Downloads(Baixe de acordo as configurações do seu windows):
DEV C++ CONFIGURADO PARA 32BITS
DEV C++ CONFIGURADO PARA 64BITS
REV 3884 TFS 0.4
Certo, feitos os downloads, extrai DEV C++ no Disco C e REV 3884 em Documentos.
======================================
Abra o DEV C++:
======================================
======================================
Abra a Source:
======================================
======================================
Localize a pasta da Source e abra o arquivo TheForgottenServer.dev, Documentos> trunk.r3884> dev-cpp> TheForgottenServer.dev:
======================================
=============================================================
======================================
Aguarde carregar todos os arquivos:
======================================
======================================
Vamos adicionar o parâmetro -D__CONSOLE__ no teclado digita ALT + P, clique em parameters e adicione o parâmetro... Feito? clique em OK:
======================================
======================================
Vamos compilar Source, no teclado digite CTRL+F9 e aguarde finalizar o processo:
======================================
======================================
Se der tudo certo em Log vai estar como mostra a imagem abaixo:
======================================
======================================
Verifique na pasta Documentos> trunk.r3884> dev-cpp você vai encontrar o arquivo TheForgottenServer.exe e pronto meu parabéns você compilou!
======================================
===========================================
Só isso galera tutorial rápido resumido e útil!
Créditos Natanael Beckman!
===========================================
Caso você adquira uma source com apenas os arquivos .cpp e .h e não sabe como compilar o projeto, abaixo vamos explicar:
Na pasta onde está localizado os arquivos .cpp e .h crie uma pasta chamada dev-cpp, e dentro dela adicione uma imagem icone.
Abra o DEV-C++, clique em File> New> Project:
Logo em seguida selecione Empty Project, em name terá o nome Project1 altere utilize o nome quer quiser, após isso clique em OK e em seguida selecione a pasta dev-cpp que criamos:
Agora selecione a opção Win32GUI caso use source OTX ou TFS selecione Win32Console ao lado << Browse selecione a imagem do icone que está na pasta Dev-Cpp.
No mesmo menu na aba Parameters em C++ compiler adicione os seguintes parâmetros:
-D__ENABLE_SERVER_DIAGNOSTIC__ -D__ROOT_PERMISSION__ -D__GROUND_CACHE__ -D__USE_SQLITE__ -D__USE_MYSQL__ -D__CONSOLE__ -D__WAR_SYSTEM__ E em Linker adicione as seguintes libs:
-lboost_filesystem -lboost_thread -lboost_system -lboost_regex -lsqlite3 -lwsock32 -llua5.1 -lws2_32 -leay32 -lmysql -lxml2 -lgmp -lz -s No mesmo Menu na aba Build Option escreva na segunda coluna horizontal escreva Obj e dê OK. Na lateral terá o nome do seu projeto o meu no caso é The Forgotten Server, clique com o botão direito do mouse em cima do nome e clique na opção Add Project: Selecione na pasta da sua source todos os arquivos .cpp e .h após isso salva o projeto e já pode compilar CTRL+F9: OpenSSL 0.9.8 1º baixe http://devpaks.org/details.php?devpak=73 2° abra Dev-Cpp > Tools > Packager Manager > Install > Seleciona o arquivo baixado e instala, fecha abre e testa!
Clica aqui \/ -
davidvietro deu reputação a xWhiteWolf em Dodge System 8.54+Ae galera do TK, uns caras ficaram me mandando PM pedindo esse sistema aqui.. aparentemente tem em algum server e eles queriam replicar o sistema no OT deles. Não sei como funciona no outro server mas no script que eu fiz vai funcionar assim:
Serão 100 livros que você poderá comprar de um npc específico, cada livro te dá 1 ponto a mais na skill Dodge e isso acarreta em 0.3% de chance a mais de desviar de um golpe e tomar só 50% de dano. Infelizmente eu nunca joguei no servidor que foi o pioneiro desse sistema (na vdd eu nem sei qual é) então eu não fiz igual o deles, na realidade o meu só funciona ao perder vida então se o mago usar utamo vita acabou os dodge's dele. Outra coisa importante é que o player tem uma chance rara de dar Dodge no Dodge, ou seja, levando 1/4 do dano. Só vai funcionar para ataques de criaturas, tanto melee quanto spells, ou seja, se o cara passar no fogo não tem chance dele desviar do dano
Sem mais delongas, vamos ao script:
Crie um arquivo chamado dodge.lua na pasta creaturescripts\scripts e coloque isso dentro dele:
agora adicione essa linha no creaturescripts.xml:
<event type="statschange" name="dodge" event="script" value="dodge.lua"/> em creaturescripts\scripts\login.lua adicione isso antes do ultimo return true:
registerCreatureEvent(cid, "dodge") if getPlayerStorageValue(cid, 48902) == -1 then setPlayerStorageValue(cid, 48902, 0) end agora vá em actions.xml e adicione essa linha aqui:
<action itemid="1950" script="dodgebook.lua"/> note que vc pode mudar o ID do livro a hora que vc quiser.
em items.xml, procure o item com o ID que vc irá utilizar e deixe ele assim:
<item id="1950" article="a" name="Skill Book [DODGE]"> <attribute key="weight" value="1300" /> </item> agora crie um arquivo chamado dodgebook em actions\scripts e coloque isso dentro dele:
-
davidvietro deu reputação a xWhiteWolf em Dodge System 8.54+aonde está
if type == STATSCHANGE_HEALTHLOSS and isCreature(attacker) then deixa
if type == STATSCHANGE_HEALTHLOSS or (type == STATSCHANGE_MANALOSS and getCreatureCondition(cid, CONDITION_MANASHIELD)) and isCreature(attacker) then
-
davidvietro deu reputação a MickeyBlooD em [TFS 0.3.6 - 0.4] Tirando "BLACKLIST"Eae Pessoal do Tibiaking ! Vi que tinha muita gente , Com dedicado e "talz" , querendo tirar o blacklist na hora de inicializar a distro e deixar o server no autorestart (24horas) , no meu caso . uso Linux
Em otserv.cpp , procure por :
{ #if defined(WINDOWS) && !defined(__CONSOLE__) if(MessageBox(GUI::getInstance()->m_mainWindow, "Unable to fetch blacklist! Continue?", "Blacklist", MB_YESNO) == IDNO) #else std::cout << "Unable to fetch blacklist! Continue? (y/N)" << std::endl; char buffer = getchar(); if(buffer == 10 || (buffer != 121 && buffer != 89)) #endif startupErrorMessage("Unable to fetch blacklist!"); } substitua por :
/*{ #if defined(WINDOWS) && !defined(__CONSOLE__) if(MessageBox(GUI::getInstance()->m_mainWindow, "Unable to fetch blacklist! Continue?", "Blacklist", MB_YESNO) == IDNO) #else std::cout << "Unable to fetch blacklist! Continue? (y/N)" << std::endl; char buffer = getchar(); if(buffer == 10 || (buffer != 121 && buffer != 89)) #endif startupErrorMessage("Unable to fetch blacklist!"); }*/ só isso , REP + por favor
Créditos :
Eu (MickeyBlooD/Snoow) -> Só adicionei as tags de comentário
-
davidvietro deu reputação a llucas75 em (Resolvido)[BUG SCRIPT] Double xp potion socorroPoko 360 desculpe-me pela demora o script do jeito que vc queria exigia um conhecimento que eu não tinha ainda...
expo.lua
tag em actions
Obs: aconselho colocar um script assim(se o player deslogar ele perde o storage da pot assim podendo usar a pot denovo e conseguir o efeito denovo)(script totalmente configuravel olhe os comentarios deixados).
perderefeito.lua
login.lua
creaturescript.xml
Agradeço aos veteranos:
Eduardo
Max
Killua
Pela força.
-
davidvietro deu reputação a Thiago Rulexz em [MOD] Evento PaintBallEvento Paint Ball 1.1 <3
I ae galerinha Venho hoje trazer um Evento novo no TK (lembrando que esse evento já estava disponível em outro fórum estou somente trazendo e darei suporte com qualquer problema)
Estava devendo conteúdo ao fórum então decidi voltar <3
Vamos lá!!! 1 um videozinho de como Fununça o Evento
https://www.youtube.com/watch?v=9MwjN43Pyos
Download Mapa
LEMBRANDO Q VC PODE USAR O MAPA QUE QUISER
Primeiramente não se esqueça de colocar No-Pvp e No-Logout em toda a área do Evento
O Mod está aqui (PASTEBIN)
Perguntas:
P: Já testou o Mod?
R: Sim já testei o Mod em tfs 0.3.6 (evento testado com 6 Pessoas Não sei como ele se comporta além disso, qualquer problema informar)
P:Como configura o script?
R:Vamos lá
paintball_spawn_area = { top_left = {x = 970, y = 1040, z = 4}, bottom_right = {x = 975, y = 1046, z = 7} } essa parte do script se refere a área de respaw do player no evento... Da ponta superior esquerda a ponta inferior direita
tp_to_paintball = {x = 985, y = 1,052, z = 7}, event_ending_pos = {x = 985, y = 1,052, z = 7} Nessa parte é diferente
a 1 Linha é onde o tp de acesso ao Evento aparecerá
e a 2 linha é onde os player vão ser teleportados quando o evento acabar (geralmente se coloca o templo, vocês quem sabem)
messages = { event_started = "Paintball event has started! there's a teleport near Thais temple!", event_ended = "Paintball event has ended!" } Essa é a mensagem que o Servidor irá transmitir em Global quando o evento começa e quando ele se encerra
event_config = { event_duration = 0, --minutes, 0 if it's an always-open event infinite_ammo = false, winner_gets_item = true, prize_item_id = 3051, decrease_score_on_death = true, points_per_kill = 1, ammo_per_point = 100, reset_bullets_on_death = true, min_bullets_on_spawn = 100 } Bom está parte qualquer 1 q conhece um pouco o famoso PORTUGLES consegue
event _duration = o tempo do evento... se ficar 0 o evento fica open forever
Infinite_ammo = munição infinita
Winners_gets_item = se o Player vencedor ganha Item
prize_item_id = Qual item o vencedor vai ganhar
points_per_kill = quantos pontos o player ganha por kill
ammo_per_point = quanto de munição ele ganha por ponto
reset_bullets_on_death = resetar as balas quando morre
min_bullets_on_spawn = minimos de balas quando nasce
misc = { walls_id = {1115,1111,1112,5258,1385,1113}, bullets_exhaust = 500, --in ms bullet_speed = 150 }, Wall_ids = essa matriz irá conter todos os itens que podem bloquear as balas.
bullets_exhaust = tempo entre cada tiro em milissegundos
bullet_speed = a velocidade da bala viaja em milissegundos
O Script não é de minha autoria... estou somente trazendo ao TK e dando suporte a ele...
Qualquer Duvida pode falar
@LOG
Oque Foi Feito na 1.1?
Diminui o Código, Adaptei perfeitamente para 8.6 e Troquei todos os nomes que havia de paintball no código para Kienzan (só destrocar)
CRÉDITOS:
Bogart (por fazer o Código)
Eu (por traduzir e trazer ao TK e dar suporte)
-
davidvietro deu reputação a xFatality em [Tutorial] Potions InfinitaOlá Tibia King
Hoje,vou trazer a voces um tutorial de potions infinita,testei em todas as versões e nenhuma deu problema.
Eu sei que já tem varios topicos de potions infinita,mas como eu tava olhando,tem alguns com bugs e etc,e então vou ensinar um sem bug.
Primeiramente siga este caminho na pasta do seu servidor :
Data/Actions/Scripts/Liquids/Potions.lua
O Script que tem que ser inserido nessa parte é :
Após a inserção deste comando no servidor, se você não deseja reiniciar o servidor digite:
/reload action
Obrigado,
Abraços.
-
davidvietro deu reputação a Tricoder em Blind AngerPreview
Script
data/spells/spells.xml
<instant name="Sorcerer Fury" words="blind anger" lvl="200" mana="1500" prem="1" selftarget="1" exhaustion="2100" needlearn="0" script="attack/anger.lua"> <vocation id="1"/> <vocation id="5"/> </instant> data/spells/scripts/attack/anger.lua
local repeatAmount = 3 local deathFlamesArea = { createCombatArea({ {0, 1, 0}, {1, 2, 1}, {0, 1, 0} }), createCombatArea({ {0, 1, 1, 1, 0}, {1, 1, 0, 1, 1}, {1, 0, 2, 0, 1}, {1, 1, 0, 1, 1}, {0, 1, 1, 1, 0} }), createCombatArea({ {0, 0, 1, 1, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 2, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 1}, {0, 1, 0, 0, 0, 1, 0}, {0, 0, 1, 1, 1, 0, 0} }) } local bigFlamesArea = createCombatArea({ {0, 0, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 0, 0, 0, 1, 1, 0}, {1, 1, 0, 0, 0, 0, 0, 1, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 2, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 0, 0, 0, 0, 0, 1, 1}, {0, 1, 1, 0, 0, 0, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 0, 0} }) local deathFlames = {} for k, area in ipairs(deathFlamesArea) do deathFlames[k] = createCombatObject() setCombatParam(deathFlames[k], COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(deathFlames[k], COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(deathFlames[k], COMBAT_FORMULA_LEVELMAGIC, -0.593, -50, -0.929, -100) setCombatArea(deathFlames[k], area) end local bigFlames = createCombatObject() setCombatParam(bigFlames, COMBAT_PARAM_TYPE, COMBAT_ENERGYLDAMAGE) setCombatParam(bigFlames, COMBAT_PARAM_EFFECT, CONST_ME_BIGCLOUDS) setCombatFormula(bigFlames, COMBAT_FORMULA_LEVELMAGIC, -0.766, -50, -1.241, -100) setCombatArea(bigFlames, bigFlamesArea) function onTargetTile(cid, pos) doSendDistanceShoot(getCreaturePosition(cid), pos, CONST_ANI_DEATH) end setCombatCallback(bigFlames, CALLBACK_PARAM_TARGETTILE, "onTargetTile") local function castSpellDelay(p) if(isCreature(p[1]) == TRUE) then doCombat(unpack(p)) end end function onCastSpell(cid, var) for i = 0, repeatAmount - 1 do for k, combat in ipairs(deathFlames) do addEvent(castSpellDelay, (150 * k) + #deathFlames * 150 * i + 700 * i, {cid, combat, var}) end addEvent(castSpellDelay, (150 * #deathFlames) + #deathFlames * 150 * i + 700 * i, {cid, bigFlames, var}) end return LUA_NO_ERROR end Créditos: Rugged Mage
-
davidvietro deu reputação a xWhiteWolf em Novo Sistema de Trainer [0.36~0.4]Olá meus caros do Tibia King, hoje vim trazer pra vocês um sistema que bolei pra um concurso em outro fórum mas acabei ficando descontente e nunca cheguei a disponibilizar.
Eu gostaria de agradecer inicialmente à três acontecimentos que sem eles não seriam possíveis a criação desse sistema.
- A otlist obrigar que os servidores utilizem anti idle
- Os mages do meu servidor reclamarem que não dava pra treinar ml nos trainers
- Ao @Storm Night, que embora tenha me irritado muito nesse tópico aqui , botou a sementinha dessa idéia na minha cabeça.
Explicação É a combinação de dois sistemas que eu ja havia feito, o primeiro escolhe entre todas as salas de treiner aquela que está vazia pra te alocar e o segundo te mantém alimentado e rodando pra simular o anti idle. (Nota: ele não impede o anti idle de fato, se vc quiser fazer isso vc vai precisar editar o script de anti idle que vc utiliza pra ignorar players com determinado storage e adicionar o storage no player quando ele entrar na sala e tirar ao sair.. mas não sei até que ponto isso pode provocar ban da OTservlist por isso decidi não ensinar isso aqui.)
Sem mais delongas, talk is cheap, show me the code.
Idéia Basicamente dá pra reduzir toda a idéia do código nessa foto aqui:
Você tem diversas salas com trainers nesse formato (pode ser em linha reta horizontal ou vertical tb, mas assim fica melhor distribuído). Você inclusive pode criar salas no meio do void de forma que a distancia de uma vc nao consiga ver a outra e vai ser uma experiencia muito amigável para o player ver que está treinando sozinho na paz. Ao entrar no tp ele te aloca na primeira sala vazia, se não houverem salas vazias ele retorna que não tem posições livres
Instalação Você precisa criar as salinhas dos trainers equidistantemente, ou seja, tendo a mesma distância A em X e mesma distância B em Y. Sério, se vc errar nessa parte é porque vc não sabe oque significa equidistante. Vai pesquisar preguiçoso!! Já aviso que não vou dar suporte quanto à isso.
Você vai precisar criar salas parecidas com isso daqui:
Perceba que não tem como ter acesso a essa sala, não tem como ser puxado pra fora do trainer, não tem dor de cabeça nenhuma e quando o player quiser sair ele só entra no tp e volta pro templo ou pra onde vc definir.
Nesse teleport da sala vc adiciona o actionid 14877 e não bota nenhuma posição nele.
Naquele tile que o player irá ficar que inclusive tem id diferente vc bota actionid 14878.
Agora seleciona a area dessa sala no rme e vai copiando e colando percebendo sempre se vc tá criando as salas com mesma distância em X. Se o ponto inicial de uma sala é 140 e vc quer que todas tenham 12 sqm de distancia vc cria em 152, 164, 178.. por aí vai.
Quando terminar as salas que quiser e tiver montado as linhas e colunas da forma que desejou, vc vai criar um tp principal pra alocar os players nessa sala:
Lembrando que ele não deve ter posição no rme, vc só bota o actionID 14876 e deixa a toPos dele 0, 0, 0. Ele não tem q te teleportar pra nenhum lugar pois a posição será decidida por script.
Se você fez tudo certo até agora vc deve ter algo +- assim:
O importante é manter a distancia certinha entre cada sala. Aí no caso eu fiz rX = 11 e rY = 8 (é a terceira ou quarta vez q eu to falando isso, se vcs errarem pqp eu vou ficar muito irritado);
Vc não bota os trainers, e ali embaixo do spawn vc tem que botar um outro obstáculo pra impedir que o player ande pra baixo e dê a sala como livre.
Feito isso só adicionar os scripts abaixo:
movements.xml
<movevent type="StepIn" actionid="14876" event="script" value="trainertp.lua"/> <movevent type="StepIn" actionid="14877" event="script" value="trainertp2.lua"/> <movevent type="StepIn" actionid="14878" event="script" value="foodtrainer.lua"/>
movements/scripts/trainertp.lua:
movements/scripts/trainertp2.lua:
movements/scripts/foodtrainer.lua:
FIM, qualquer dúvida ou comentário ou sugestão coloquem abaixo. Se gostou REP+, se não gostou REP+ pq deu trabalho e vai ser útil pra alguém, mesmo que de estudo.
Abraços do Lobo.
E ao cara do outro fórum que ficou falando que ia dar erro e quis ficar me corrigindo e mandando scripts sem noção pra "mostrar" que sabia de lua:
-
davidvietro deu reputação a xWhiteWolf em Novo Sistema de Trainer [0.36~0.4]local position = {x = 156, y = 45, z = 6} -- posicao da primeira pos (linha 1 coluna 1) local config = { distX= 12, -- distancia em X entre cada sala (de uma mesma linha) distY= 9, -- distancia em Y entre cada sala (de uma mesma coluna) rX= 2, -- numero de colunas rY= 2 -- numero de linhas } local storage = 18481 -- storage que salva a ultima vez que o player entrou (pra evitar spams) local function isWalkable(pos, creature, proj, pz)-- by Nord -- só adicione se vc já não tiver ela if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if getTopCreature(pos).uid > 0 and creature then return false end if getTileInfo(pos).protection and pz then return false, true end local n = not proj and 3 or 2 for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if tile.itemid ~= 0 and not isCreature(tile.uid) then if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then return false end end end return true end local function check_disponivel(npos) if isWalkable(npos, true, true) then return true end return false end local function countdown(pos, Arraypos) if not check_disponivel(pos) then for lugares = 1, #Arraypos do creature = getTopCreature(Arraypos[lugares]).uid if not isCreature(creature)then doCreateMonster("Trainer", Arraypos[lugares]) doSendAnimatedText(Arraypos[lugares], "GO!!", TEXTCOLOR_ORANGE) doSendMagicEffect(Arraypos[lugares], 10) end end end end local function fazQualquerCoisa(cid, pos, i, j) -- isso é o coração do nosso script, nao mexa nisso j = j or 0 p = i or 0 if p >= config.rX then p = 0 j = j < config.rY -1 and j + 1 or false end if j then posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z} if check_disponivel(posi) then doTeleportThing(cid, posi) doSendMagicEffect(posi, 10) countdown(posi, {{x = posi.x - 1, y = posi.y + 1, z = posi.z}, {x = posi.x + 1 , y = posi.y + 1, z = posi.z}}) else fazQualquerCoisa(cid, pos, p + 1, j) end else doPlayerSendCancel(cid, "Couldn't find any position for you right now.") end end function onStepIn(cid, item, pos, lastPos, fromPos, toPos, actor) if getPlayerStorageValue(cid, storage) - os.time() <= 0 then fazQualquerCoisa(cid, position) else doTeleportThing(cid, fromPos) doPlayerSendCancel(cid, "You gotta wait a few seconds before you can enter trainning room again") end return true end usa assim, dsclpa qlqer inconveniência
-
davidvietro deu reputação a Vodkart em House CleanDescrição: É para deletar house de players inativos, ou seja, o player que não loga em "X" dias perde a sua house!
houseclean.lua
function onTimer() local days = 15*24*60*60 doSaveServer() local query = db.getResult("SELECT `owner`,`id` FROM `houses`;") if (query:getID() ~= -1) then while true do local own,houseid = query:getDataInt("owner"),query:getDataInt("id") local qry = db.getResult("SELECT `lastlogin` FROM `players` WHERE `id` = "..own) if(qry:getID() ~= -1) then last = tonumber(qry:getDataInt("lastlogin")) if last < os.time() - days then setHouseOwner(houseid, NO_OWNER_PHRASE,true) end end if not(query:next()) then break end end query:free() end return true end globalevents.xml <globalevent name="HouseClean" time="03:00" event="script" value="houseclean.lua"/> na tag está para executar o script as 3 da manhã se quiser alterar só mudar essa parte: time="03:00" para configurar os dias que o player que não logar em "X" dias É aqui: local days = 15*24*60*60
no caso está para o jogador que não logar em 15 dias perder a house.
-
davidvietro deu reputação a Lyu em Death System 2016 versão frag consecutivo!Fala rapaziada, quanto tempo sem publicar algo aqui! Bom, hoje eu venho trazer um sisteminha que é bem utilizado atualmente.
Estou falando o Death System! Porém, com algumas coisinhas a mais.
Testado em OTX Server 8.60..
Como funciona?
O Death System em alguns servidores possui um channel chamado "Mortes" ou "Death Channel",
mas há alguns servidores que preferem que seja anunciado no default mesmo e a função é informar
quem matou quem, ou quem foi morto por certo monstro.
O que há de novo?
Bom, agora quem matar x jogadores(configurável) e essa quantia for uma consecutiva, será anunciado isso :
E se algum jogador derrotá-lo dentro a consecutiva, será anunciado isso :
Vamos ao sistema :
em data/XML/channels.xml, adicione isso :
<channel id="15" name="Death Channel"/> em data/creaturescripts/creaturescripts.xml :
<event type="death" name="deathchannel" event="script" value="deathchannel.lua"/> em data/creaturescripts/login.lua, adicione isso antes do último return true :
registerCreatureEvent(cid, "deathchannel") em data/creaturescripts/scripts, crie um arquivo deathchannel.lua e cole isso dentro :
-- Coded by Zoom.. local info, win, lose = "%s [Level: %s] foi mort%s pelo %s %s%s", "%s obteve %s frags seguidos após derrotar %s.", "%s acabou de impedir que %s fizesse uma sequência de %s frags seguidos." local frags, storage = {10, 15, 20, 25, 30, 35, 40, 45, 50}, 30045 function onDeath(cid, corpse, deathList) if(not isPlayer(cid)) then return true end local target = deathList[1] doCreatureSetStorage(target, storage, getCreatureStorage(target, storage) + (getCreatureStorage(target, storage) == -1 and 2 or 1)) for _, pid in ipairs(getPlayersOnline()) do doPlayerSendChannelMessage(pid, '', info:format(getCreatureName(cid), getPlayerLevel(cid), getPlayerSex(cid) == 1 and "o" or "a", isPlayer(target) and "player" or "monstro", getCreatureName(target), isPlayer(target) and " [Level: "..getPlayerLevel(target).."]." or "."), TALKTYPE_CHANNEL_ORANGE, 0xF) for _, frag in ipairs(frags) do if(getCreatureStorage(target, storage) == frag) then doPlayerSendChannelMessage(pid, '', win:format(getCreatureName(target), frag, getCreatureName(cid)), TALKTYPE_CHANNEL_MANAGEMENT, 0xF) end if(getCreatureStorage(cid, storage) >= frag) then doPlayerSendChannelMessage(pid, '', lose:format(getCreatureName(target), getCreatureName(cid), getCreatureStorage(cid, storage)+1), TALKTYPE_GAMEMASTER_CHANNEL, 0xF) end end end doCreatureSetStorage(cid, storage, 0) return true end Há uma única configuração, que é as consecutivas :
local frags = {10, 15, 20, 25, 30, 35, 40, 45, 50}
completou 10 frags? anuncia! e assim sucessivamente..
Créditos : EU
-
davidvietro deu reputação a Jamison Collins em [Resolvido] Conversão de gold's no OT TibiaTente esse script :
local coins = { [ITEM_GOLD_COIN] = { to = ITEM_PLATINUM_COIN, effect = TEXTCOLOR_YELLOW }, [ITEM_PLATINUM_COIN] = { from = ITEM_GOLD_COIN, to = ITEM_CRYSTAL_COIN, effect = TEXTCOLOR_LIGHTBLUE }, [ITEM_CRYSTAL_COIN] = { from = ITEM_PLATINUM_COIN, to = 2159, effect = TEXTCOLOR_TEAL }, [2159] = { from = ITEM_CRYSTAL_COIN, effect = TEXTCOLOR_YELLOW } } function onUse(cid, item, fromPosition, itemEx, toPosition) if(getPlayerFlagValue(cid, PLAYERFLAG_CANNOTPICKUPITEM)) then return false end local coin = coins[item.itemid] if(not coin) then return false end if(coin.to ~= nil and item.type == ITEMCOUNT_MAX) then doChangeTypeItem(item.uid, item.type - item.type) doPlayerAddItem(cid, coin.to, 1) doSendAnimatedText(fromPosition, "$$", coins[coin.to].effect) elseif(coin.from ~= nil) then doChangeTypeItem(item.uid, item.type - 1) doPlayerAddItem(cid, coin.from, ITEMCOUNT_MAX) doSendAnimatedText(fromPosition, "$$", coins[coin.from].effect) end return true end Com essa tag :
<action itemid="2159" event="script" value="other/changegold.lua"/> Créditos: Sofft (de acordo com Daaniel)
-
davidvietro deu reputação a xWhiteWolf em Tibia está zerado + preview [GPS SYSTEM]Graças ao nosso marvilhoso colega Elwyn o tibia foi zerado hoje dia 09/03/2015 haha. Ele lançou uma função crucial pra fazer qualquer script relacionado à movimentação ao combinar o algoritmo de pathFinding da source à uma função Lua.
Sei que muita gente não frequenta a seção de programming OU não entendeu nada doque eu falei mas pqp, deem uma rápida olhada noque dá pra criar:
Isso é um GIF de um sistema que eu to tentando fazer desde novembro de 2014 e que agora eu finalmente consegui terminar graças à genialidade desse mito. Trata-se de uma talkaction que vc digita !Lugarquevcquerir e o personagem vai andando automaticamente até o local e quando chega ele manda uma msg avisando que vc chegou ao destino, semelhante a um GPS!!!!!11111
Fora que com isso podemos controlar os movimentos do NPCS!!!!111 Dá pra fazer uma fucking quest que vc tem que seguir o npc até um altar secreto e seilá, ele é um npc normal que vende backpack/rope/shovel mas qnd dá 18h de um certo dia ele visita a tumba e volta pra cidade (e vc tem que seguir ele pra descobrir isso). SUCH RPG!!!!!
Sei lá, eu animei demais com isso >.<
As possibilidades são tantas que eu não consigo nem me conter AUHIEUHIUHI dá pra fazer MUITA coisa cara, inclusive vou tentar trazer os scripts relacionados à essa função pra vocês.
Se você gostou das idéias, sério, não clica em gostei no meu tópico, vai lá no tópico do elwyn e clica... ele é o verdadeiro mito que resolveu isso.
-
davidvietro deu reputação a xWhiteWolf em Magnus ChallengerFala galera, hoje vim trazer o projeto pronto do Magnus Challenger pra vocês instalarem no servidor de vocês!
Pra quem não conhece é um sistema de Tasks baseado no Zezenia onde você pode escolher entre tasks de matar monstros ou de coletar certos items para o npc Magnus, um guerreiro famoso da cidade que está atolado de tarefas e precisa da sua ajuda!
Peguei os aspectos que eu julguei serem os principais do modelo do Zezenia e editei com algumas coisas que eu achei que ficariam melhores.
Quem quiser pode ver um vídeo comentado de como o sistema funciona:
Dito isso vou ensinar vocês como instalar isso no server:
Pra começar vá em data\creaturescripts\scripts e procure login.lua, agora vá até o final do arquivo e antes do último return true coloque essas linhas abaixo
ainda em creaturescripts procure creaturescripts.xml e adicione essa linha junto com as outras que já estão lá (seguindo o padrão)
<!-- TASK SYSTEM --> <event type="kill" name="tasksystem" script="tasksystem.lua"/> Agora crie um arquivo em creaturescripts\scripts com o nome de tasksystem.lua e adicione o seguinte à ele:
Terminada a parte da contagem de kill vamos ao NPC em si.
Crie um arquivo chamado Magnus.xml em data\npc e coloque isso dentro dele:
Agora em data\npc\scripts crie um arquivo chamado zezeniaa.lua e adicione esse conteúdo dentro do arquivo:
~~~~~~~~~~~~~~~~ FEITO ISSO ESTÁ TERMINADO ~~~~~~~~~~~~~~~~~~
Agora aprendendo a configurar:
No tasksystem vc pode editar isso daqui:
Eu fiz um sistema onde se vc estiver em party com alguém e a pessoa matar os bixos conta como se você tivesse matado; Assim incentiva o pessoal a ir numa cave de Dragon e ao invés de matar quem está lá pra ficar sozinho na cave, eles vão chamar party pra fazerem a task juntos.. assim fazer amigos fica mais fácil e com maiores laços é maior a chance do povo não abandonar o seu server.
Apenas digite "true" ou "false" pra ativar/desativar esse sistema e em baixo temos a distancia máxima pro monstro estar do cara que está fazendo a task pra contar o kill. Se a distancia entre o monstro e a pessoa for maior que 7 não vai contar pra ele a kill.
No zezeniaa.lua as coisas que dão pra configurar são maiores mas são igualmente simples:
Toda vez que vc pedir uma task short (curta) vc vai ter de 100 a 400 monstros pra matar, ele gera um número de 0 a 6 e multiplica por 5 e soma com os 100 iniciais.. o mesmo vale pra todos os outros valores.
levelcollect é o level mínimo pra fazer tasks do tipo collect.
time é o tempo em segundos que você vai ficar sem poder falar com o npc caso desista de alguma task, o padrão é 8 * 60 * 60 (8 horas)
bonus é por quanto vai multiplicar caso vc permita que o npc escolha aleatoriamente entre todas as opções.. o padrão é 20% de bonus (1.2)
multiplicador é uma coisa que eu adicionei pra ficar mais fácil mexer na fórmula sem cometer cagadas, se vc tá ganhando 10% de exp e quer ganhar 80% é só colocar 8 no multiplicador.
Isso daqui é o banco de dados principal do sistema de kill, toda vez que vc escolher uma task do tipo fácil, médio, dificil ele vai acessar essas tabelas contendo o nome das criaturas.. vc pode facilmente adicionar novos nomes, o npc já está programado pra lidar com isso, apenas siga o padrão e mantenha sempre o último sem vírgula!
Ex: adicionando Morgaroth na tabela de hard
local hard = { [1] = "Giant Spider", [2] = "Dragon Lord", [3] = "Grim Reaper", [4] = "Demon", [5] = "Crystal Spider", [6] = "Demon Skeleton", [7] = "Juggernaut", [8] = "Destroyer", [9] = "Hand of Cursed Fate", [10] = "Morgaroth" } atente-se também pra não repetir o número no index.. se o anterior era [9] use [10].
O restante das tabelas são separadas para o banco de dados das tasks de collect:
segue a mesma lógica da de kill só que aqui você tem o id dos itens que serão usados... aquela count não tem nada a ver com o item pois ele vai gerar tanto o item aleatoriamente quanto à count;
Ex:
[1] = {id = 5880, count = 20}, -- iron ore isso não significa que se cair iron ore (id 5880) irá cair sempre 20.. até porque eu poderia escolher uma task long e easy e pegar a task de trazer até 50 iron ores, apenas tente manter os padrões que são os intervalos definidos.
No easy ele varia de 10 a 20, no medium ele varia de 20 a 35 e no hard de 40 a 50.
Espero que vocês tenham curtido, é um sistema grande mas bem simples de se mexer... se tiverem quaisquer problemas podem comentar aqui. Deu trabalho fazer isso então se você gostou deixe o seu comentário aí e o seu "Gostei" que vai me incentivar a trazer mais coisas desse tipo pra cá. Abraços do lobo.
PS: Pra sumonar o npc digite com o GOD: /n Magnus ou coloque ele pelo map editor.
-
davidvietro deu reputação a Orochi Elf em [OrochiElf] New OTRestarter v1.0New OTRestarter
version: 1.0
developer: Tony Araújo (OrochiElf) pt. Gabriel Nogueira (Idéias)
Funções:
- Auto Restarter (Ele inicia o servidor assim que ele não detectar mais que o processo está ativo, ou seja, toda vez que o seu servidor fechar sozinho, o programa automaticamente irá reconhecer e irá reinicia-lo.)
- Auto Crash Timer (Uma nova função inédita foi adicionada, esta função é responsável por detectar quando o processo do servidor para de funcionar, algo que acontece frequentemente, então ele irá reconhecer e reiniciar o processo.)
- Auto Restarter Timer (Outra função nova adicionada nesta versão, esta função é responsável por programar os horários que você deseja reiniciar o seu servidor. ela é bastante usada para evitar o desperdício de memória usada no consumo do processo do servidor, ou seja, quando um servidor está ativo por muito tempo o gasto de memória aumenta, então esta função irá reiniciar o processo do seu servido de acordo com os horários que você marcar.
Para próxima versão:
- OTRestarter hosting (Esta função será uma inovação bastante bacana, ela dará o direito de você acessar o Restarter *que estará provavelmente instalado no VPS/Dedicado do servidor* sem que a pessoa precise acionar a conexão remota, ou seja, funcionará parecido com um FTP Control, você poderá controlar o Restarter e ter acesso as informações gravadas no LOG do programa através de um simples client, deixando possível ser acessado em computadores diferentes, e em breve uma versão para mobile/celular.)
Imagem do funcionamento do programa:
Download:
Programa anexado ao tópico.
OTRestarter.rar
-
davidvietro deu reputação a samlecter em (Resolvido)CONTEUDO RETIRADO.Amigo, eu não entendo muito de scripts, a sugestão que eu dei realmente é trabalhosa e muito provavelmente existem outras formas melhores/mais fáceis de fazer, se puder explicar melhor ficaria grato e te daria rep+ mesmo não utilizando
-
davidvietro deu reputação a samlecter em Retornar para ball quando sair do fly/ride/surfQue nada, pelo menos você tentou, agr que me disse isso, vou tentar olhar essas funções e ver se uma delas faz esse creatureSetSkullType sem que eu saiba, se eu conseguir resolver eu edito aqui
-
davidvietro deu reputação a samlecter em [MOD] Sistema de Auto LootO sistema que usei não teve que criar/alterar nada na pasta mods, tanto que nos 2 scripts do autoloot não tinha essa parte que vc sugeriu trocar.
No sistema que usei ( já veio na base(cyan) ) tem 2 scripts com nome aloot, um na pasta data\actions\scripts e outro na pasta data\creaturescripts\scripts
OBS: Não sei se tem algo relacionado ao sistema em outro lugar, mas acho que são só esses 2 scripts.
-
davidvietro deu reputação a thiagobji em Arrumando Erro npchandler.luaÉ o seguinte, eu já sofri com esse bug e é muito chato mesmo, creio que muitas pessoas sofrem também, eu achei esse script em um outro fórum, então venho postar aqui pros membros do TibiaKing que tem esse mesmo erro para ajudar eles a soluciona-lo.
Então você precisa ir até a pasta data\npc\lib\npcsystem
Abra o arquivo npchandler.lua e procure (control+f) por "function NpcHandler:isInRange(cid)" (sem aspas)
modifique essa linha:
function NpcHandler:isInRange(cid) local distance = getNpcDistanceTo(cid) or -1 return distance ~= -1 and distance <= self.talkRadius end Por: function NpcHandler:isInRange(cid) local distance = getDistanceBetween(getCreaturePosition(getNpcCid()), getCreaturePosition(cid)) if(distance == -1) then return false end return (distance <= self.talkRadius) end
Pronto! agora gogo deixar o servidor funcionando
Créditos:
GOD Gustavo
Pardal1406
Thiagobji
-
davidvietro deu reputação a BrunoMaia em O que seria esse erro no console?Isto é um erro de syntax, você esqueceu de digitar o "<" em algum local do código
-
davidvietro deu reputação a QuebradaZN em Double Exp Potion CompletaEu Uso Essa, Ela Mostra o Tempo que falta pra acabar, Achei ela super Completona! Gostei!
Em Mods Coloque esse Arquivo!
<?xml version="1.0" encoding="UTF-8"?> <mod name="AdvancedExpPotionSystem" enabled="yes" author="MatheusMkalo" forum="XTibia.com"> <!-- Configs and Functions --> <config name="PotionExpConfigs"><![CDATA[ ------ CONFIGURE SEU SCRIPT ------ TRUE ou FALSE configs = { time = 30, ---- TIME IN MINUTES needpa = TRUE, needlvl = {TRUE, level = 50}, costmana = {TRUE, mana = 300}, addrate = 50, -- Exp que vai adicionar em % removeonuse = TRUE } function getTime(s) local n = math.floor(s / 60) s = s - (60 * n) return n, s end CreatureEventChecker = function(event, ...) -- Colex if isCreature(arg[1]) then event(unpack(arg)) end end creatureEvent = function(event, delay, ...) -- Colex addEvent(CreatureEventChecker, delay, event, unpack(arg)) end function getPlayerExtraExpRate(cid) -- By MatheusMkalo return (getPlayerRates(cid)[8]-1)*100 end ]]></config> <!-- exppotion.lua --> <action itemid="7440" event="script"><![CDATA[ domodlib('PotionExpConfigs') if getPlayerStorageValue(cid, 62164) >= 1 then return doPlayerSendCancel(cid, "Voce ja ta Sob o Efeito da Potion.") end if configs.needpa and not isPremium(cid) then return doPlayerSendCancel(cid, "Voce Precisar ser Premium Para Usar") end if configs.needlvl[1] and getPlayerLevel(cid) < configs.needlvl.level then return doPlayerSendCancel(cid, "Voce Precisa ser " .. configs.needlvl.level .. " Para usar a Potion.") end if configs.costmana[1] then if getCreatureMana(cid) < configs.costmana.mana then return doPlayerSendCancel(cid, "Voce Precisar ter " .. configs.costmana.mana .. " de Mana Para usar a Potion") else doCreatureAddMana(cid, -configs.costmana.mana) end end if configs.removeonuse then doRemoveItem(item.uid, 1) end for i = configs.time*60, 1, -1 do local a = math.floor(i/60) .. ":" .. i - (60 * math.floor(i/60)) if #a < 4 then a = string.sub(a,1,2) .. "0" .. string.sub(a, 3) end if i == configs.time*60 then creatureEvent(doPlayerSendCancel, configs.time*60*1000, cid, "Efeito Final da Pocao de EXP.") end creatureEvent(doPlayerSendCancel, (configs.time*60-i)*1000, cid, "O Efeito da Pocao vai acabar em "..a..".") end doPlayerSetExperienceRate(cid, (1+(configs.addrate/100))+(getPlayerExtraExpRate(cid)/100)) creatureEvent(doPlayerSetExperienceRate, configs.time *60*1000, cid, 1+(getPlayerExtraExpRate(cid)/100-(configs.addrate/100))) doPlayerSendTextMessage(cid, 22, "Agora Voce Esta Recebendo mais EXP por Matar Monstros.") setPlayerStorageValue(cid, 62164, os.time()) creatureEvent(setPlayerStorageValue, configs.time *60*1000, cid, 62164, 0) return TRUE ]]></action> <creaturescript type="login" name="ExpPotion" event="script"><![CDATA[ domodlib('PotionExpConfigs') local time = configs.time if os.time()-getPlayerStorageValue(cid, 62164) < time *60 then doPlayerSetExperienceRate(cid, (1+(configs.addrate/100))+(getPlayerExtraExpRate(cid)/100)) creatureEvent(doPlayerSetExperienceRate, (time*60-(os.time()-getPlayerStorageValue(cid, 62164))) * 1000, cid, 1+(getPlayerExtraExpRate(cid)/100-(configs.addrate/100))) creatureEvent(setPlayerStorageValue, (time*60-(os.time()-getPlayerStorageValue(cid, 62164))) * 1000 , cid, 62164, 0) for i = (time*60-(os.time()-getPlayerStorageValue(cid, 62164))), 1, -1 do local a = math.floor(i/60) .. ":" .. i - (60 * math.floor(i/60)) if #a < 4 then a = string.sub(a,1,2) .. "0" .. string.sub(a, 3) end if i == (time*60-(os.time()-getPlayerStorageValue(cid, 62164))) then creatureEvent(doPlayerSendCancel, (time*60-(os.time()-getPlayerStorageValue(cid, 62164)))*1000, cid, "O Efeito da Potion Termina em.") end creatureEvent(doPlayerSendCancel, ((time*60-(os.time()-getPlayerStorageValue(cid, 62164)))-i)*1000, cid, "O Efeito da Potion Termina em "..a..".") end end return TRUE ]]></creaturescript> </mod> e nessa Parte Configure ela como desejado:
configs = { time = 30, ---- TEMPO EM MINUTOS needpa = TRUE, --- NECESSITA DE PREMIUM ACCOUNT ? FALSE OU TRUE needlvl = {TRUE, level = 50}, --- LEVEL QUE MINIMO PARA USA-LÁ! costmana = {TRUE, mana = 300}, --- CUSTO DE MANA PARA USA-LÁ! addrate = 50, -- Exp que vai adicionar em % --- EXP QUE VAI DAR, 50 ESTA METADE! removeonuse = TRUE --- REMOVE A POTION APOS USAR! Vá na Script e Cace a Linha: <action itemid="7440" event="script"> e Troque o ID Pelo item ou Potion Desejado! é Isso ae! Se Ajudei Não Custa nada dar um REP né? -
davidvietro deu reputação a Guilherme em Tibia logo templateIsso é um template pra o pessoal editar e criar sua própria logo do seu server baseado na logo do tibia.com
Feito por mim e gostaria que se possível, não fosse removido o nome do tibiaking.
Download: http://www.mediafire.com/download/25j524s9fnbrda3/tibialogoedited.psd
-
davidvietro deu reputação a vankk em (Resolvido)Idle training não está funcionando corretamente.function mudarVis(uid) look = getCreatureLookDirection(uid) look = look < 3 and look + 1 or 0 doCreatureSetLookDirection(uid, look) addEvent(mudarVis, 2000, uid) end local events1 = {} local trainerst = 456488 function onStepIn(cid) events1[getPlayerGUID(cid)] = addEvent(mudarVis, 1000, cid) doPlayerSendTextMessage(cid, 27, "Bem-vindo a sua sala de treinamento, você será movimentado automaticamente para que continue treinando!") setPlayerStorageValue(cid, trainerst, 1) return true end function onStepOut(cid) stopEvent(events1[getPlayerGUID(cid)]) stopEvent(mudarVis) setPlayerStorageValue(cid, trainerst, -1) return true end