Ir para conteúdo

churupetinha

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    churupetinha deu reputação a Kemmlly em Mensagem Para o Player   
    creaturescripts/scripts
    function onAdvance(cid, skill, oldlevel, newlevel) local tab = { msg = {"Mensagem aqui", 50, 6000}, -- Mensagem, level, storage msg1 = {"Mensagem aqui", 100, 6001}, msg2 = {"Mensagem aqui", 150, 6002} } if getPlayerLevel(cid) == tab.msg[2] and getPlayerStorageValue(cid, tab.msg[3]) < 1 then doPlayerPopupFYI(cid, ""..tab.msg[1].."") doSendMagicEffect(getCreaturePosition(cid), 10) setPlayerStorageValue(cid, tab.msg[3], 1) end if getPlayerLevel(cid) == tab.msg1[2] and getPlayerStorageValue(cid, tab.msg1[3]) < 1 then doPlayerPopupFYI(cid, ""..tab.msg1[1].."") doSendMagicEffect(getCreaturePosition(cid), 10) setPlayerStorageValue(cid, tab.msg1[3], 1) end if getPlayerLevel(cid) == tab.msg2[2] and getPlayerStorageValue(cid, tab.msg2[3]) < 1 then doPlayerPopupFYI(cid, ""..tab.msg2[1].."") doSendMagicEffect(getCreaturePosition(cid), 10) setPlayerStorageValue(cid, tab.msg2[3], 1) end return true end  
    creaturescripts.xml
    <event type="advance" name="msglevel" event="script" value="msglevel.lua"/> login.lua
    registerCreatureEvent(cid, "msglevel")  
  2. Gostei
    churupetinha deu reputação a Kemmlly em Arrumar scripts [Npc]   
    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 local tab = { item = {2157, 10}, -- ID do item, quantidade item2 = {2157, 10}, -- ID do item, quantidade item3 = {2157, 10}, -- ID do item, quantidade item4 = {2157, 10}, -- ID do item, quantidade item5 = {2157, 10} -- ID do item, quantidade } if(msgcontains(msg, 'quest')) then selfSay('To start this quest tell {mission}', cid) --This is just an example, In this script added 4 mission for you end if(msgcontains(msg, 'mission')) then if(getPlayerStorageValue(cid,700) < 1) then selfSay('Sua primeira missão será a de obter 100 Penas ,120 Sushi ,150 Largatixa ,100 Coraçao ,115 Marijuana Para Ganhar um {Demonhunter Doll}.', cid) talkState[talkUser] = 1 elseif (getPlayerStorageValue(cid,701) < 1) then selfSay('Your next mission will be to get 150 {strands of medusa hair}.', cid) talkState[talkUser] = 1 elseif (getPlayerStorageValue(cid,702) < 0) then selfSay('Your next mission will be to get 300 {red dragon scales}.', cid) talkState[talkUser] = 1 elseif (getPlayerStorageValue(cid,703) < 0) then selfSay('Your next mission will be to get 300 {red dragon scales}.', cid) talkState[talkUser] = 1 elseif (getPlayerStorageValue(cid,704) < 0) then selfSay('Your next mission will be to get 400 {green dragon scales}.', cid) talkState[talkUser] = 1 elseif (getPlayerStorageValue(cid,703) == 1) then --zmieniac w zaleznosci od ostatniego storage!! selfSay('You have done all missions.', cid) talkState[talkUser] = 1 end --------------------------------------- elseif(msgcontains(msg, 'Demonhunter Doll') and talkState[talkUser] == 1 and (getPlayerStorageValue(cid,700) < 1)) then if (getPlayerItemCount(cid, tab.item[1]) >= tab.item[2] and getPlayerItemCount(cid, tab.item2[1]) >= tab.item2[2] and getPlayerItemCount(cid, tab.item3[1]) >= tab.item3[2] and getPlayerItemCount(cid, tab.item4[1]) >= tab.item4[2] and getPlayerItemCount(cid, tab.item5[1]) >= tab.item5[2]) then doPlayerRemoveItem(cid, tab.item[1], tab.item[2]) doPlayerRemoveItem(cid, tab.item2[1], tab.item2[2]) doPlayerRemoveItem(cid, tab.item3[1], tab.item3[2]) doPlayerRemoveItem(cid, tab.item4[1], tab.item4[2]) doPlayerRemoveItem(cid, tab.item5[1], tab.item5[2]) setPlayerStorageValue(cid,700,1) doPlayerAddItem(cid,8821, 1) -- Recompensa selfSay('Thank you.', cid) talkState[talkUser] = 0 else selfSay('Voçe nao tem todos os itens para ganhar um {Demonhunter Doll}.', cid) end --------------------------------------- elseif(msgcontains(msg, 'strands of medusa hair') and talkState[talkUser] == 1 and (getPlayerStorageValue(cid,701) < 1) and (getPlayerStorageValue(cid,700) == 1)) then if(doPlayerRemoveItem(cid, 12597, 150) == TRUE) then setPlayerStorageValue(cid,701,1) doPlayerAddItem(cid,8821, 1) -- Recompensa selfSay('Thank you.', cid) talkState[talkUser] = 0 else selfSay('To end mission you need have 150 {strands of medusa hair}.', cid) end --------------------------------------- elseif(msgcontains(msg, 'red dragon scales') and talkState[talkUser] == 1 and (getPlayerStorageValue(cid,702) < 1) and (getPlayerStorageValue(cid,701) == 1)) then if(doPlayerRemoveItem(cid, 5882, 300) == TRUE) then setPlayerStorageValue(cid,702,1) doPlayerAddPercentLevel(cid, 6) selfSay('Thank you.', cid) talkState[talkUser] = 0 else selfSay('To end mission you need have 300 {red dragon scales}.', cid) end --------------------------------------- elseif(msgcontains(msg, 'green dragon scales') and talkState[talkUser] == 1 and (getPlayerStorageValue(cid,703) < 1) and (getPlayerStorageValue(cid,702) == 1)) then if(doPlayerRemoveItem(cid, 5920, 400) == TRUE) then setPlayerStorageValue(cid,703,1) doPlayerAddPercentLevel(cid, 5) selfSay('Thank you.', cid) talkState[talkUser] = 0 else selfSay('To end mission you need have 400 {green dragon scales}.', cid) end ------------------------------------------ end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) @churupetinha
     
    Assim?
  3. Gostei
    churupetinha deu reputação a xWhiteWolf em Magnus Challenger   
    Fala 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.
  4. Gostei
    churupetinha deu reputação a Adriano SwaTT em Anél de Experiência' [Exp Ring]   
    Eu tentei achar aqui no TibiaKing o Anél de Experiência (Ring of Experience ou Exp Ring), e só achei um tutorial, mas está meio imcompleto e confuso...
    No entanto decidi postar este que criei há alguns meses.

    Como o nome diz, é um anél que aumenta a experiência de sua caçada' (configurável)
    \o/
    Vamos lá...

    1º Passo


    Se quer um Anel de Experiencia Recarregável (como soft boots), clique no Spoiler abaixo.
    Configurações do NPC:
    Recolhe: "broken experience ring"
    Custo: "50k"
    Devolte: "Brand-New Experience Ring"

    5º Passo






    É, acho que é isso...
    Qualquer coisa postem aqui para resolvermos juntos.

    Eu editei o Script, criei o NPC e criei o Tutorial.
    Créditos pelo tutorial: AdrianoSwaTT
    Créditos pelo Exp Ring Stages: Vodkart
    Créditos pelo Script: OTLand

    Abraços, espero que seja útil'
  5. Gostei
    churupetinha recebeu reputação de Vodkart em Npc events coins   
    #up
    #up
  6. Gostei
    churupetinha deu reputação a augustomeneghetti em [PEDIDO] Como editar um monster   
    Bom.. vamos começar por partes.
     
    Vou dar um ctrl c + ctrl v em algumas partes e vou explicando passo a passo, vale lembrar que eu não manjo 100% pois nunca me preocupei com algumas coisas.. então o que eu tiver certeza vou deixar explicito, o que for uma hipotese para mim vou falar EU ACHO.
     
    Vamos lá.
     
    <monster name="Demon" nameDescription="a demon" race="fire" experience="6000" speed="275" manacost="10000">
    Auto-explicativo. Utilize para mudar o nome do monstro.
     
    <monster name="Demon" nameDescription="a demon" race="fire" experience="6000" speed="275" manacost="10000">
    Serve para você escolher o que vai apareçer quanto você der look num monstro.. por exemplo você da look num demon.. vai apareçer "You se a demon".. ai se você quiser alterar isso, a vontade
     
    <monster name="Demon" nameDescription="a demon" race="fire" experience="6000" speed="275" manacost="10000">
    Raça propriamente dita, essa parte é simples de entender porém eu nunca parie para prestar atenção no que isso influencia, mas provavelmente deve influenciar em algo.
     
    <monster name="Demon" nameDescription="a demon" race="fire" experience="6000" speed="275" manacost="10000">
    Altere a experiencia do monstro aqui.. por exemplo, seu ot server é exp de 10x
     
    Nesse caso um demon irá lhe dar 6000 de exp * 10, ficando então 60,000 de exp, se você alterar para 7000 a exp, irá dar 70,000 de exp o demon, você tem que levar em conta a exp como 1x elevado a rate do seu server, se você quer que um monstro de 10k de exp, você vai lá e põe 10k, e por seu server ser 10x ele vai dar 100k, algo que você não quer.. nesse caso utilize 1k de exp
     
    <monster name="Demon" nameDescription="a demon" race="fire" experience="6000" speed="275" manacost="10000">
    Velocidade propriamente dita do monstro, altere isso para faze-lo andar mais rapido/devagar, ou deixe em zero para o monstro ficar parado
     
    <monster name="Demon" nameDescription="a demon" race="fire" experience="6000" speed="275" manacost="10000">
    Provavelmente deve ser a mana necessária para sumonar o demon, mas calma lá.. ja vamos chegar num ponto onde definimos se o monstro é sumonavel ou não.
    -----------------------------
      <health now="8200" max="8200"/>
    Aqui você define a health do monstro.. por exemplo
     
      <health now="500" max="8200"/>
    Se você fizer isso, o monstro vai ter um TOTAL de 8200 de HP, mas quando ele nascer, ele vai nascer com 500 de HP, ou seja, a barrinha de life dele vai estar no vermelho praticamente
    -----------------------------
      <look type="35" corpse="5995"/>
    Aqui você define o sprite do seu monstro
     
    Não lembro de cabeça.. mas vamos fingir que o citizen outfit é look type 100, você tem o looktype 35, e quer fazer um demon com outfit de citizen, você muda para 100, ou qualquer outro valor referente ao outfit que você procura.
     
      <look type="35" corpse="5995"/>
    Aqui você define qual será o sprite do seu monstro quando ele morrer.
     
    Agora, vamos fazer algo mais divertido?
     
    Vamos alterar o seguinte código:
    " <look type="35" corpse="5995"/>"
     
    Suponha-se que você quer utilizar o outfit citizen, mas dessa maneira você não pode definir as cores, e nem fazer um monstro com addon, então agora vou te ensinar como fazer isso
     
    Insira no código as seguintes informações destacadas:
        <look type="35" head="114" body="114" legs="0" feet="0" addons="3" corpse="5995"/>
     
    Agora vamos as explicações:
        <look type="35" head="114" body="114" legs="0" feet="0" addons="3" corpse="5995"/>
    Define a cor do cabelo do seu monstro, porém você tem que definir com numeros, ja te ensino o macete para descobrir como conseguir esses valores
     
    No caso, 114 representa o preto, então seu monsto terá cabelo preto, se você definir como 0, será cabelo branco.
     
     
        <look type="35" head="114" body="114" legs="0" feet="0" addons="3" corpse="5995"/>
     
    Mesma coisa do caso acima, porém para o peitoral do corpo.. e assim por diante
     
    Basta você imaginar na ordem do Set outfit do próprio Tibia, quando você vai em ser outfit, temos as seguintes coisas:
     
    Head = Head
    Primary = Body
    Secondary = Legs
    Detail = feet
     
    Entendeu?
     
    Para definir os addons do seu monstro você editará a seguinte parte:
     
        <look type="35" head="114" body="114" legs="0" feet="0" addons="3" corpse="5995"/>
     
    Se você quiser que ele tenha APENAS o addon 1, deixe dessa maneira:
    addons="1"
     
    Para o addon 2:
    addons="2"
     
    Agora, você quer saber a melhor maneira de deixar o monstro como você quer? Simples, coloque seu ot server online, e pegue um char de teste, selecione nele o outfit com as cores e addons que você quer, e depois deslogue do char, feito isso abra o MYSQL (a versão que você utilizar), lá vá em editar players, se você utilizar o SQLite Studio assim como eu, logo a frente do nome do seu char de teste, vai ter as informações com o numero da cor e outfit que você selecionou
     
      <targetchange interval="5000" chance="8"/>
    Nessa parte você coloca um valor para definir a cada QUANTO TEMPO ele irá sorteiar baseado no valor ao lado (chance) se o monstro irá mudar seu alvo de um jogador para outro.
     
    Na parte a seguir vamos definir algumas coisas utilizando o padrão Binário, mas ai você me pergunta o que é binário?
    Simples, definição de verdadeiro e falso a partir de 0 e 1.
     
    Para verdadeiro utilizaremos 1, para falso 0.
     
    <flag summonable="0"/>
    Define se é possivel um player normal sumonar o monstro através da magia "utevo res".. no caso está definido como não, não é possivel.
    <flag attackable="1"/>
    Define se é possivel UM JOGADOR atacar o monstro, por exemplo, se você definir como 0, ao tentar atacar o monstro vai ser impossivel.
     
    <flag hostile="1"/>
    Define se é um monstro hostil, ou simplificando, se estiver como 1 ele te ataca, mas se estiver como 0 ele seria um rabbit da vida, pode ser atacado mas não ataca de volta.
    <flag illusionable="0"/>
    Define se é possivel utilizar a magia "utevo res ina" no monstro.. ou seja, um player comum (mage) se transformar no monstro por um determinado tempo
    <flag convinceable="0"/>
    Mesma coisa do summonable PRATICAMENTE, porém é através de uma runa que existe no jogo, se você utilizar ela num monstro ele irá virar seu summon.
    <flag pushable="0"/>
    No caso, demons não são possiveis de arrastar, mas se você alterar para 1, será possivel arrastar seu demon.
     
    <flag canpushitems="1"/>
    Define se o monstro em si irá arrastar itens, no caso você tacou uma parcel na frente do bixo e saiu correndo, ele arrasta ela tirando-a do seu caminho.
    <flag canpushcreatures="1"/>
    Mesma coisa do item anterior, porém com criaturas, se uma criatura entrar na frente do seu monstro, ele irá arrasta-lá para chegar até você.
    <flag targetdistance="1"/>
    A distancia que você quer que o monstro fique do jogador, exemplo: Você quer que o demon ataque o jogador a 2 sqm's de distancia, basta alterar para 2 o valor.
    <flag staticattack="90"/>
    Não sei dizer o que fazer, se alguem souber, peço que poste.
    <flag runonhealth="0"/>
    Define a vida em que o monstro irá fugir de você (porém não sei dizer se funciona como a vida mesmo ou em % da vida, se alguem puder deixar mais claro isso)
    ---------------------------
    </flags>
    <attacks>
    <attack name="melee" interval="2000" skill="100" attack="110"/>
    <attack name="manadrain" interval="2000" chance="13" range="7" min="0" max="-120"/>
    <attack name="fire" interval="2000" chance="30" range="7" radius="7" target="1" min="-150" max="-250">
    <attribute key="shootEffect" value="fire"/>
    <attribute key="areaEffect" value="firearea"/>
    </attack>
     
    Nessa parte iremos trabalhar as spells do monstro.
    A parte destacada em negrito, é onde você coloca os ataques, ou seja, todo ataque novo que você quiser fazer OU TIRAR, terá que ser assim, e sempre terá de ser dentro do padrão, no caso eu retirar todos os ataques e deixar apenas um novo.
     
    <attacks>
    <attack name="melee" interval="2000" skill="100" attack="110"/>
    </attack>
     
    Dessa maneira o demon irá utilizar APENAS o melee skill, com um intervalo de 2000 milésimos, a parte e skill e attack basta pensar que ele é um player, vamos utilizar um exemplo.
    <attack name="melee" interval="2000" skill="100" attack="25"/>
     
    Isso equivale a um jogador com skill 100 utilizando uma arma com attack 25. (Por exemplo um paladino com spear)
     
     
    <defenses armor="55" defense="55">
    <defense name="healing" interval="2000" chance="15" min="130" max="240">
    <attribute key="areaEffect" value="blueshimmer"/>
    </defense>
    <defense name="speed" interval="1000" chance="8" speedchange="290" duration="5000">
    <attribute key="areaEffect" value="redshimmer"/>
    </defense>
    </defenses>
     
    O critério utilizado acima nos ataques, também servem para buffs do monstro, por exemplo aqui em defense, você pode ver que ele tem uma chamada speed, que é um haste que o monstro usa para correr mais rapido. Mas esse não é o foco que irei abordar aqui.
     
    A parte em negrito aborda a defesa do monstro, mesmo criterio utilizado acima no ataque, porém para defesa.
     
    Agora, você queria adicionar uma spell de healing, correto?
     
    então vamos lá
     
    Peguei como exemplo a linha de código de um monstro do meu servidor, basta você inserir isso no seu código que estará tudo perfeito.
     
    <defense name="healing" interval="1000" chance="25" min="500000" max="50000000">
    Interval define o intervalo do chance, ou seja, a cada 1000 milésimos será sortiado com uma chance de 25 de o monstro healar (detalhe, se não for sortiado dentro da chance o monsto não irá healar) entre o valor min e max, e a próposito, estou falando sortiar, mas o mais correto seria dizer:
    "Sortear um valor random", pois não há como definir o valor a ser sortiado (se não nem sequer seria um sorteio né?"
    -------------------------------------
    <elements>
    <element physicalPercent="30"/>
    <element energyPercent="50"/>
    <element earthPercent="20"/>
    <element icePercent="-15"/>
    <element holyPercent="-15"/>
    <element deathPercent="20"/>
    </elements>
     
    Essa parte é BEM SIMPLES, é a % de defesa do monstro contra danos magicos/fisicos:
     
    Levando em conta os dados acima vamos lá:
     
    <element physicalPercent="30"/>
    O monstro tem uma defesa de 30% contra physical, ou seja, se você iria hitar 100 nele, o valor 100 será diminuido para 70, que será o seu hit final
     
    <element icePercent="-15"/>
    Aqui ja fica diferente.. DESTAQUE para o sinal de -, isso significa que o monstro É FRACO ao elemento ice, ou seja, você iria hitar 100?
     
    Seu hit final vai ser 100 + 15% = 115 de dano
     
    É essa formula para qualquer valor, por exemplo:
    300 de dano (15% do valor é igual a 45), ou seja, 345 de dano de ice
    -----------------------------
     
    <immunities>
    <immunity fire="1"/>
    <immunity drown="1"/>
    <immunity paralyze="1"/>
    <immunity invisible="1"/>
    </immunities>
     
    Aqui são as imunidades do monstro, vamos lá, 1 por 1:
     
    <immunity fire="1"/>
    Significa que o monsto tem 100% de proteção a fogo, então não importa o que ele não toma dano de fogo.
     
    <immunity drown="1"/>
    Não me lembro o que é drown, se não me engano é andar embaixo da água, se for 0 o monstro iria perder vida (SE NÃO ME ENGANO)
     
    <immunity paralyze="1"/>
    Ao utilizar a paralise rune no monstro, isso define se ele será afetado ou não
     
    <immunity invisible="1"/>
    Define se o monstro irá ver invisbilidade (utana vid ou stealth ring)
     
    Caso essa opção esteja marcado como 0, se você utilizar utana vid, o demon não irá lhe atacar por não te ver.
     
    -----------------------
     
    <summons maxSummons="1">
    <summon name="fire elemental" interval="1000" chance="12"/>
    </summons>
     
    O demon é um monsto que sumona bixos, no caso aqui você define em MAXSUMMONS qual o limite de bixos que ele poderá sumonar, e em baixo qual o bixo propriamente dito que será sumonado, no caso você pode alterar o fire elemental para um rat se quiser.
     
    ------------------------
     
    <voices interval="5000" chance="10">
    <voice sentence="MUHAHAHAHA!" yell="1"/>
    <voice sentence="Your soul will be mine!" yell="0"/>
    </voices>
     
    Deixei apenas as 2 opções para uma explicação mais objetiva, o primeiro em negrito é uma fala do monstro, porém está como yell=1, isso significa que quando ele falar, ele irá gritar na verdade, então será possivel ver essa fala dele de fora da tela.
     
    A fala de baixo no caso, ja representa uma simples fala qualquer que só se pode ser vista estando na mesma tela do monstro em si.
     
    -----------
     
     
    ~
    Enfim..
     
    Só restou explicar a ultima parte de loot, mas com tudo que ja expliquei acima, creio que você pegou uma base e isso não será necessário né?
     
    hehe, espero que esse post tenha lhe ajudado, qualquer dúvida, basta perguntar, ajudarei no que for possivel.
  7. Gostei
    churupetinha recebeu reputação de davidvietro em [pedido] hp/mana/reset   
  8. Gostei
    Obrigatoriamente leia tudo!
    Atualizado 01/07/2014
     
    Opa galera mais uma vez eu trazendo o melhor para todos.
    Hoje vou postar o sistema de Guild de Points que eu utilizo em meu OTserver, acredito que dificilmente será encontrado por ae um tão completo e sem bugs igual o que será postado logo abaixo, é um sistema completo que é utilizado pelo líder da guild executando um comando que, se tiver de acordo com as regras que seram feitas por você, todos os membros da guild iram receber os pontos uma unica vez, lembrando que quando os pontos são adicionados a um player ele não receberá entrando em outra guild e não receberá criando outro personagem na conta, resumindo ele só receberá uma unica vez na conta e com um player só. E um dos detalhes que me causava dor de cabeça era que quando um líder executava o comando, quem estava online recebia os pontos, mais quem estava offline não recebia, isso acontecia normalmente porque tem guilds que contém 50, 70, 100 players, portanto nem sempre todos estavam online. O comando só pode ser executado uma vez por dia cada guild, para não gerar processamentos desnecessários e assim um mal funcionamento do servidor.

    Cada administrador pode configurar seu sistema da forma que quiser, por ser um sistema muito simples, você pode bota que todos os players estejam no minimo level x, que a guild só possa executar o comando quando estiver quantidade x de players online, isso é bom porque traz um certa dificuldade para fraudes de pontos, e o sistema só vira bagunça dependendo do que você vai oferecer no seu shop guild, eu particularmente só utilizei esse comando porque muitas guilds grandes pediam pontos, eles me cobravam uma quantidade x de pontos e eu cobrava uma quantidade x de player então pra automatizar o processo e não ter dor de cabeça foi feito todo esse sistema. Se você analisar bem vai ver que tudo isso só gera mais crescimento ao seu servidor.
    Bom, vamos ao sistema:

    Em talkactions.xml, adicione a tag abaixo:
          <talkaction words="!guildpoints" event="script" value="guildpoints.lua"/> Na pasta talkactions/scripts faça um .lua com o nome guildpoints e dentro dele adicione os coder abaixo: GuildPointsConfigs = {         ExecuteIntervalHours = 24,         NeedPlayersOnline = 10,         NeedDiferentIps = 6,         MinLevel = 80,         AddPointsForAcc = 9 } function getGuildPlayersValidAccIDS(GuildID, MinLevel)         local RanksIDS = {}         local AccsID = {}         local ValidAccsID = {}         Query1 = db.getResult("SELECT `id` FROM `guild_ranks` WHERE guild_id = '".. GuildID .."'")         if(Query1:getID() == -1) then                 return ValidAccsID         end         for i = 1, Query1:getRows() do                 table.insert(RanksIDS, Query1:getDataInt("id"))                 Query1:next()         end         Query2 = db.getResult("SELECT `account_id` FROM `players` WHERE `rank_id` IN (".. table.concat(RanksIDS, ', ') ..") AND `level` >= ".. MinLevel .."")         if(Query2:getID() == -1) then                 return ValidAccsID         end         for i = 1, Query2:getRows() do                 local AccID = Query2:getDataInt("account_id")                 if #AccsID > 0 then                         for k = 1, #AccsID do                                 if AccID == AccsID[k] then                                         AddAccList = false                                         break                                 end                                 AddAccList = true                         end                         if AddAccList then                                 table.insert(AccsID, AccID)                         end                 else                         table.insert(AccsID, AccID)                 end                 Query2:next()         end         Query3 = db.getResult("SELECT `id` FROM `accounts` WHERE `guild_points_stats` = 0 AND `id` IN (".. table.concat(AccsID, ', ') ..")")         if(Query3:getID() == -1) then                 return ValidAccsID         end         for i = 1, Query3:getRows() do                 local AccID = Query3:getDataInt("id")                 if #ValidAccsID > 0 then                         for k = 1, #ValidAccsID do                                 if AccID == ValidAccsID[k] then                                         AddAccList = false                                         break                                 end                                 AddAccList = true                         end                         if AddAccList then                                 table.insert(ValidAccsID, AccID)                         end                 else                         table.insert(ValidAccsID, AccID)                 end                 Query3:next()         end         return ValidAccsID end function onSay(cid, words, param, channel)         if(getPlayerGuildLevel(cid) == 3) then                 local GuildID = getPlayerGuildId(cid)                 Query = db.getResult("SELECT `last_execute_points` FROM `guilds` WHERE id = '".. GuildID .."'")                 if(Query:getID() == -1) then                         return true                 end                 if Query:getDataInt("last_execute_points") < os.time() then                         local GuildMembers = {}                         local GuildMembersOnline = {}                         local PlayersOnline = getPlayersOnline()                         for i, pid in ipairs(PlayersOnline) do                                 if getPlayerGuildId(pid) == GuildID then                                         if getPlayerLevel(pid) >= GuildPointsConfigs.MinLevel then                                                 table.insert(GuildMembersOnline, pid)                                         end                                 end                         end                         if #GuildMembersOnline >= GuildPointsConfigs.NeedPlayersOnline then                                 local IPS = {}                                 for i, pid in ipairs(GuildMembersOnline) do                                         local PlayerIP = getPlayerIp(pid)                                         if #IPS > 0 then                                                 for k = 1, #IPS do                                                         if PlayerIP == IPS[k] then                                                                 AddIPList = false                                                                 break                                                         end                                                         AddIPList = true                                                 end                                                 if AddIPList then                                                         table.insert(IPS, PlayerIP)                                                 end                                         else                                                 table.insert(IPS, PlayerIP)                                         end                                 end                                 if #IPS >= GuildPointsConfigs.NeedDiferentIps then                                         local ValidAccounts = getGuildPlayersValidAccIDS(GuildID, GuildPointsConfigs.MinLevel)                                         db.executeQuery("UPDATE `guilds` SET `last_execute_points` = ".. os.time() +(GuildPointsConfigs.ExecuteIntervalHours * 3600) .." WHERE `guilds`.`id` = ".. GuildID ..";")                                         doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "".. #ValidAccounts .." Players received points")                                         if #ValidAccounts > 0 then                                                 db.executeQuery("UPDATE `accounts` SET `guild_points` = `guild_points` + " ..GuildPointsConfigs.AddPointsForAcc .. ", `guild_points_stats` = ".. os.time() .." WHERE `id` IN (" .. table.concat(ValidAccounts, ',') ..");")                                                 for i, pid in ipairs(GuildMembersOnline) do                                                         local PlayerMSGAccID = getPlayerAccountId(pid)                                                         for k = 1, #ValidAccounts do                                                                 if PlayerMSGAccID == ValidAccounts[k] then                                                                         doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "You received "..GuildPointsConfigs.AddPointsForAcc .." guild points.")                                                                         break                                                                 end                                                         end                                                 end                                         end                                 else                                         doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Only ".. #IPS .." players are valid, you need ".. GuildPointsConfigs.NeedDiferentIps .." players with different ips.")                                 end                         else                                 doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Has only ".. #GuildMembersOnline .." players online you need ".. GuildPointsConfigs.NeedPlayersOnline .." players online at least from level ".. GuildPointsConfigs.MinLevel ..".")                         end                 else                         doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "The command can only be run once every "..GuildPointsConfigs.ExecuteIntervalHours .." hours.")                 end         else                 doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Only guild leader can request points.")         end         return true end No coder acima bem no inicio tem as linhas seguintes para configurar:

    ExecuteIntervalHours = 24, ( Intervalo para execução do comando, ae está de 24 em 24hrs)
    NeedPlayersOnline = 10, (Quantos players é preciso está online para poder executar o comando.)
    NeedDiferentIps = 6, (Quantos IPS diferentes são necessários para executar o comando no exemplo ae tem 6.)
    MinLevel = 80, (Aqui adicione o level minimo, é necessário que todos os player da guild tenha o level pedido para o lider executar o comando.)
    AddPointsForAcc = 9, (Aqui é a quantidade de pontos para adicionar em cada player da guild.)
     
    Em data/globalevents/scripts crie um arquivo chamado shopguild.lua e adicione o code a seguir:
    local SHOP_MSG_TYPE = MESSAGE_EVENT_ORANGE local SQL_interval = 30 function onThink(interval, lastExecution)         local result_plr = db.getResult("SELECT * FROM z_ots_guildcomunication WHERE `type` = 'login';")         if(result_plr:getID() ~= -1) then                 while(true) do                         local id = tonumber(result_plr:getDataInt("id"))                         local action = tostring(result_plr:getDataString("action"))                         local delete = tonumber(result_plr:getDataInt("delete_it"))                         local cid = getCreatureByName(tostring(result_plr:getDataString("name")))                         if isPlayer(cid) then                                 local itemtogive_id = tonumber(result_plr:getDataInt("param1"))                                 local itemtogive_count = tonumber(result_plr:getDataInt("param2"))                                 local container_id = tonumber(result_plr:getDataInt("param3"))                                 local container_count = tonumber(result_plr:getDataInt("param4"))                                 local add_item_type = tostring(result_plr:getDataString("param5"))                                 local add_item_name = tostring(result_plr:getDataString("param6"))                                 local received_item = 0                                 local full_weight = 0                                 if add_item_type == 'container' then                                         container_weight = getItemWeightById(container_id, 1)                                         if isItemRune(itemtogive_id) == TRUE then                                                 items_weight = container_count * getItemWeightById(itemtogive_id, 1)                                         else                                                 items_weight = container_count * getItemWeightById(itemtogive_id, itemtogive_count)                                         end                                         full_weight = items_weight + container_weight                                 else                                         full_weight = getItemWeightById(itemtogive_id, itemtogive_count)                                         if isItemRune(itemtogive_id) == TRUE then                                                 full_weight = getItemWeightById(itemtogive_id, 1)                                         else                                                 full_weight = getItemWeightById(itemtogive_id, itemtogive_count)                                         end                                 end                                 local free_cap = getPlayerFreeCap(cid)                                 if full_weight <= free_cap then                                         if add_item_type == 'container' then                                                 local new_container = doCreateItemEx(container_id, 1)                                                 local iter = 0                                                 while iter ~= container_count do                                                         doAddContainerItem(new_container, itemtogive_id, itemtogive_count)                                                         iter = iter + 1                                                 end                                                 received_item = doPlayerAddItemEx(cid, new_container)                                         else                                                 local new_item = doCreateItemEx(itemtogive_id, itemtogive_count)                                                 doItemSetAttribute(new_item, "description", "This item can only be used by the player ".. getPlayerName(cid) .."!")                                                 doItemSetAttribute(new_item, "aid", getPlayerGUID(cid)+10000)                                                 received_item = doPlayerAddItemEx(cid, new_item)                                         end                                         if received_item == RETURNVALUE_NOERROR then                                                 doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, 'You received >> '.. add_item_name ..' << from OTS GuildShop.')                                                 db.executeQuery("DELETE FROM `z_ots_guildcomunication` WHERE `id` = " .. id .. ";")                                                 db.executeQuery("UPDATE `z_shopguild_history_item` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE id = " .. id .. ";")                                         else                                                 doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, '>> '.. add_item_name ..' << from OTS GuildShop is waiting for you. Please make place for this item in your backpack/hands and wait about '.. SQL_interval ..' seconds to get it.')                                         end                                 else                                         doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, '>> '.. add_item_name ..' << from OTS GuildShop is waiting for you. It weight is '.. full_weight ..' oz., you have only '.. free_cap ..' oz. free capacity. Put some items in depot and wait about '.. SQL_interval ..' seconds to get it.')                                 end                         end                         if not(result_plr:next()) then                                 break                         end                 end                 result_plr:free()         end         return true end Em data/globalevents/globalevents.xml adicione a seguinte tag:
    <globalevent name="shopguild" interval="300" event="script" value="shopguild.lua"/> Certo, a parte do servidor é esta, ta feita, vamos adicionar a database o coder a seguir:
                      ALTER TABLE `accounts` ADD `guild_points` INTEGER(11) NOT NULL DEFAULT 0;                   ALTER TABLE `accounts` ADD `guild_points_stats` INT NOT NULL DEFAULT '0';                   ALTER TABLE `guilds` ADD `last_execute_points` INT NOT NULL DEFAULT '0';                   CREATE TABLE `z_shopguild_offer` (                         `id` int(11) NOT NULL auto_increment,                         `points` int(11) NOT NULL default '0',                         `itemid1` int(11) NOT NULL default '0',                         `count1` int(11) NOT NULL default '0',                         `itemid2` int(11) NOT NULL default '0',                         `count2` int(11) NOT NULL default '0',                         `offer_type` varchar(255) default NULL,                         `offer_description` text NOT NULL,                         `offer_name` varchar(255) NOT NULL,                         `pid` INT(11) NOT NULL DEFAULT '0',                   PRIMARY KEY (`id`))                   CREATE TABLE `z_shopguild_history_item` (                         `id` int(11) NOT NULL auto_increment,                         `to_name` varchar(255) NOT NULL default '0',                         `to_account` int(11) NOT NULL default '0',                         `from_nick` varchar(255) NOT NULL,                         `from_account` int(11) NOT NULL default '0',                         `price` int(11) NOT NULL default '0',                         `offer_id` int(11) NOT NULL default '0',                         `trans_state` varchar(255) NOT NULL,                         `trans_start` int(11) NOT NULL default '0',                         `trans_real` int(11) NOT NULL default '0',                   PRIMARY KEY (`id`))                   CREATE TABLE `z_shopguild_history_pacc` (                         `id` int(11) NOT NULL auto_increment,                         `to_name` varchar(255) NOT NULL default '0',                         `to_account` int(11) NOT NULL default '0',                         `from_nick` varchar(255) NOT NULL,                         `from_account` int(11) NOT NULL default '0',                         `price` int(11) NOT NULL default '0',                         `pacc_days` int(11) NOT NULL default '0',                         `trans_state` varchar(255) NOT NULL,                         `trans_start` int(11) NOT NULL default '0',                         `trans_real` int(11) NOT NULL default '0',                   PRIMARY KEY (`id`)) CREATE TABLE IF NOT EXISTS `z_ots_guildcomunication` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(255) NOT NULL,   `type` varchar(255) NOT NULL,   `action` varchar(255) NOT NULL,   `param1` varchar(255) NOT NULL,   `param2` varchar(255) NOT NULL,   `param3` varchar(255) NOT NULL,   `param4` varchar(255) NOT NULL,   `param5` varchar(255) NOT NULL,   `param6` varchar(255) NOT NULL,   `param7` varchar(255) NOT NULL,   `delete_it` int(2) NOT NULL DEFAULT '1',   PRIMARY KEY (`id`) ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13107; Olha estamos quase finalizando tudo, só precisamos terminar a parte de web.
    O meu GuildShop eu copiei meu shopsystem.php e fiz umas modificações, simples você pode fazer o mesmo é menos trabalhoso.
    Copie o shopsystem.php renomeie para shopguild.php, após abra-o e modifique como manda a seguir:

    shop_system para shopguild_system
    premium_points para guild_points
    premium points para guild points
    z_shop_offer para z_shopguild_offer
    shopsystem para shopguild
    z_shop_history_pacc para z_shopguild_history_pacc
    z_shop_history_item para z_shopguild_history_item
    z_ots_comunication para z_ots_guildcomunication
     
    Ou utilize este já pronto:
    shopguild.php
     
    O shopguildadmin.php está no link abaixo, basta fazer o mesmo procedimento:
    shopguildadmin.php
     
    Em index.php add:
    case "shopguild";    $topic = "Shop Guild";    $subtopic = "shopguild";    include("shopguild.php"); break; case "shopguildadmin";    $topic = "ShopGuild Admin";    $subtopic = "shopguildadmin";    include("shopguildadmin.php"); break; Vá em config.php adicione:
    $config['site']['shopguild_system'] = 1; $config['site']['access_adminguild_panel'] = 9; Vá em layouts.php adicione abaixo de buypoints:
                                    <a href='?subtopic=shopguild'>                                         <div id='submenu_shopguild' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)'onMouseOut='MouseOutSubmenuItem(this)'>                                                 <div class='LeftChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div>                                                 <div id='ActiveSubmenuItemIcon_shopguild' class='ActiveSubmenuItemIcon'style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div>                                                 <div class='SubmenuitemLabel'>Shop Guild</div>                                                 <div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div>                                         </div>                                 </a> Em layouts.php add depois do shopadmin:
    if($group_id_of_acc_logged >= $config['site']['access_adminguild_panel'])   echo "<a href='?subtopic=shopadmin'>                                    <div id='submenu_shopguildadmin' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)'onMouseOut='MouseOutSubmenuItem(this)'>                                           <div class='LeftChain' style='background-image:url(".$layout_name."/images/general/chain.gif);'></div>                                           <div id='ActiveSubmenuItemIcon_shopguildadmin' class='ActiveSubmenuItemIcon'style='background-image:url(".$layout_name."/images/menu/icon-activesubmenu.gif);'></div>                                           <div class='SubmenuitemLabel'><font color=red>! ShopGuild Admin !</font></div>                                          <div class='RightChain' style='background-image:url(".$layout_name."/images/general/chain.gif);'></div>                                    </div>                             </a>"; Em shopsystem.php procure por:
            elseif($action == 'show_history') {                 if(!$logged) {                         $main_content .= 'Please login first.';                 } else{                         $items_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($items_history_received)) {                                 foreach($items_history_received as $item_received) {                                         if($account_logged->getId() == $item_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $items_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$item_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $item_received['from_account'])                                                 $items_received_text .= '<i>Your account</i>';                                         else                                                 $items_received_text .= $item_received['from_nick'];                                                                                                 $items_received_text .= '</td><td>'.$item_received['offer_id'].'</td><td>'.$item_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $item_received['trans_start']).'</td>';                                                                                                                                                                                                         if($item_received['trans_real'] > 0)                                                 $items_received_text .= '<td>'.date("j F Y, H:i:s",$item_received['trans_real']).'</td>';                                         else                                                 $items_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>';                                                 $items_received_text .= '</tr>';                                 }                         }                         $paccs_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($paccs_history_received)) {                                 foreach($paccs_history_received as $pacc_received) {                                         if($account_logged->getId() == $pacc_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $paccs_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$pacc_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $pacc_received['from_account'])                                                 $paccs_received_text .= '<i>Your account</i>';                                         else                                                 $paccs_received_text .= $pacc_received['from_nick'];                                                 $paccs_received_text .= '</td><td>'.$pacc_received['pacc_days'].' days</td><td>'.$pacc_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $pacc_received['trans_real']).'</td></tr>';                                 }                         }                         $main_content .= '<center><h1>Transactions History</h1></center>';                         if(!empty($items_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$items_received_text.'</table><br />';                         if(!empty($paccs_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;Pacc Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccs_received_text.'</table><br />';                         if(empty($paccs_received_text) && empty($items_received_text))                                 $main_content .= 'You did not buy/receive any items or PACC.';                 }         } Troque por:
            elseif($action == 'show_history') {                 if(!$logged) {                         $main_content .= 'Please login first.';                 } else{                         $items_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($items_history_received)) {                                 foreach($items_history_received as $item_received) {                                         if($account_logged->getId() == $item_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $items_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$item_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $item_received['from_account'])                                                 $items_received_text .= '<i>Your account</i>';                                         else                                                 $items_received_text .= $item_received['from_nick'];                                                                                                 $items_received_text .= '</td><td>'.$item_received['offer_id'].'</td><td>'.$item_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $item_received['trans_start']).'</td>';                                                                                                                                                                                                         if($item_received['trans_real'] > 0)                                                 $items_received_text .= '<td>'.date("j F Y, H:i:s",$item_received['trans_real']).'</td>';                                         else                                                 $items_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>';                                                 $items_received_text .= '</tr>';                                 }                         }                         $itemsguild_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shopguild_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($itemsguild_history_received)) {                                 foreach($itemsguild_history_received as $itemguild_received) {                                         if($account_logged->getId() == $itemguild_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $itemsguild_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$itemguild_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $itemguild_received['from_account'])                                                 $itemsguild_received_text .= '<i>Your account</i>';                                         else                                                 $itemsguild_received_text .= $itemguild_received['from_nick'];                                                                                                 $itemsguild_received_text .= '</td><td>'.$itemguild_received['offer_id'].'</td><td>'.$itemguild_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $itemguild_received['trans_start']).'</td>';                                                                                                                                                                                                         if($itemguild_received['trans_real'] > 0)                                                 $itemsguild_received_text .= '<td>'.date("j F Y, H:i:s",$itemguild_received['trans_real']).'</td>';                                         else                                                 $itemsguild_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>';                                                 $itemsguild_received_text .= '</tr>';                                 }                         }                         $paccs_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($paccs_history_received)) {                                 foreach($paccs_history_received as $pacc_received) {                                         if($account_logged->getId() == $pacc_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $paccs_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$pacc_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $pacc_received['from_account'])                                                 $paccs_received_text .= '<i>Your account</i>';                                         else                                                 $paccs_received_text .= $pacc_received['from_nick'];                                                 $paccs_received_text .= '</td><td>'.$pacc_received['pacc_days'].' days</td><td>'.$pacc_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $pacc_received['trans_real']).'</td></tr>';                                 }                         }                         $paccsguild_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shopguild_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($paccsguild_history_received)) {                                 foreach($paccsguild_history_received as $paccguild_received) {                                         if($account_logged->getId() == $paccguild_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $paccsguild_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$paccguild_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $paccguild_received['from_account'])                                                 $paccsguild_received_text .= '<i>Your account</i>';                                         else                                                 $paccsguild_received_text .= $paccguild_received['from_nick'];                                                 $paccsguild_received_text .= '</td><td>'.$paccguild_received['pacc_days'].' days</td><td>'.$paccguild_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $paccguild_received['trans_real']).'</td></tr>';                                 }                         }                         $main_content .= '<center><h1>Transactions History</h1></center>';                         if(!empty($items_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;ShopServer Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$items_received_text.'</table><br />';                         if(!empty($itemsguild_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;ShopGuild Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$itemsguild_received_text.'</table><br />';                         if(!empty($paccs_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;ShopServer VIP Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccs_received_text.'</table><br />';                         if(!empty($paccsguild_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;ShopGuild VIP Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccsguild_received_text.'</table><br />';                         if(empty($paccs_received_text) && empty($items_received_text))                                 $main_content .= 'You did not buy/receive any items or PACC.';                         if(empty($paccsguild_received_text) && empty($itemsguild_received_text))                                 $main_content .= 'You did not buy/receive any items or PACC.';                 }         } Finalmente terminamos!
    Bom todo esse processo é feito só para facilitar tudo pra você e o player e pra diferenciar o Shop System do Shop Guild, porque um sustenta as despesas do server e o outro atrai player, porque pra conseguir player é preciso ter player.

    Galera acredito que não esteja faltando nada, espero que gostem e tudo que eu poder fazer para nossas melhoras estarei postando, me desculpem meus erros de português mais o que importa aqui é o script está correto, abraços!


    Créditos:
    Natanael Beckman
    LukeSkywalker (Raphael Luiz) .lua 100%
    Não proíbo ninguém de copia o tópico só peço que onde você adicione inclua os créditos mencionados.
  9. Gostei
    churupetinha deu reputação a Ryzor em [LUA] Conhecendo o os.date   
    Este tutorial abaixo foi inteiramente criado por shoeei.

    Introdução
    Vou tentar ajudar vocês com um tutorial de os.date. Sendo sincero, eu aprendi a pouco tempo como usar o os.date, em um exemplar de programação lua. Estou fazendo este tutorial para esclarecer a maioria das duvidas que vocês possam ter, então, por favor, prestem muita atenção se forem ler, e não leiam a menos, que estejam com tempo, paciência e vontade de aprender, pois eu creio que mesmo sendo novato com o os.date, eu vou conseguir fazer um bom tutorial.

    Publico Alvo
    Este tutorial foi feito para ensinar programadores lua, do nível iniciante/intermediário, ou seja, aqueles que já tem algum conhecimento quanto a os.time, variáveis, loopings, e etc...

    Tutorial
    Em OtServers, os.date é pouco explorado, já que sua funcionalidade, é, por muitos, desconhecida. Então vou explicar como você poderia usa-lo em um script para o seu ot. Vamos ver, digamos que você queira que um script funcione a partir das oito da manhã, e pare de funcionar a partir das duas da tarde; para isso, você poderia usar o os.date. O os.date, assim como o os.time, serve para controlar valores de tempo, e retornam os mesmos de acordo com os valores da cpu, a partir de quando o script entra em funcionamento, então, o exemplo acima ficaria assim:
    function onSay(cid, words, param) if os.date("%X") >= "08:00:00" and os.date("%X") <= "14:00:00" then doPlayerSendTextMessage(cid, 22, "Teste") end end No exemplo acima, a talkaction só ira funcionar se for depois das oito da manhã, e antes das duas da tarde, então, dentro deste intervalo de tempo, o script funcionará normalmente, e irá mandar a mensagem "Teste" para o jogador. Já se o script for executado fora deste intervalo, no caso, nada acontecerá.
    Deve-se notar, também, que no script acima, dentro dos parênteses esta isto:
    "%X" Certo, eu acho que eu poderia chamar isto de Pattern; existem vários destes parâmetros que podem ser utilizados, neste caso, eu usei o "%X", pois ele retorna valores do horário na seguinte forma:
    Onde, azul são as horas, vermelho são os minutos, e verde são os segundos; neste caso, você deveria usar os números como um relógio digital de 24 horas.

    Acho que a lógica do os.date já deu para entender, mas vamos recapitular:

    O os.date é usado para retornar algum valor de tempo;
    Você pode usa-lo como uma condição para executar um outro comando;
    Dentro dos parênteses do os.date, você deve usar parâmetros.

    Uma coisa muito importante do os.date, é que você deve igualar ele, com valores entre aspas, mesmo que sejam números, por exemplo:
    if os.date("%X") >= "08:00:00" and os.date("%X") <= "20:00:00"Perceba que os números estão entre aspas. Certo, depois de termos recapitulado a lógica do os.date, vamos aos mais importantes parâmetros que podem ser usados e os valores que são retornados por eles; segue a lista:
     
    Pattern - Explicação:
    %a - dia da semana abreviado (Wed) %A - dia da semana completo (Sunday) %b - nome do mês abreviado (Sep) %B - nome do mês completo (April) %c - data e hora (09/16/98 23:48:10) %d - dia do mês [01-31] %H - hora de um relógio de 24 horas [00-23] %I - hora de um relógio de 12 horas [01-12] %M - minutos [00-59] %m - mês [01-12] %S - segundos [00-60] %w - dia da semana por números [0-6 = Domigo-Sabado] %x - data (09/16/98) %X - hora (23:48:10) %Y - ano (1998) Vocês podem perceber que todas as palavras que forem usadas, tanto abreviações, como palavras inteiras, devem ser em ingles, é claro.
     
    Certo, dito os mais usados parâmetros e a lógica do os.date, acho que isso pode encerrar o nosso tutorial, mas antes, uma ultima dica; se você tem duvida de que valor o parâmetro vai retornar, faça o seguinte:
    function onSay(cid, words, param) local par = os.date("Parâmetro") doPlayerSendTextMessage(cid, 22, "O valor é "..par.."!") end E por ultimo, mas não menos importante, para se criar uma tabela usando o os.date, deve-se usá-lo da seguinte maneira:
    os.date("*t", Valor_da_Tabela) Finalização
    Isso deve funcionar e encerrar o nosso tutorial; é claro que o os.date pode ter mais alguma utilidade que eu desconheça, mas eu acho que isso pode ser uma boa introdução dele. Espero que tenham gostado, ate mais.
  10. Gostei
    churupetinha deu reputação a Caronte em [ACTION] Piggy Bank: Cassino   
    Olá pessoal, hoje venho lhes trazer um script de Cassino, para funcionar 100% independente.
    Testado em TFS 0.4
     
     
     
    para os desconhecedores do script, favor, só leia o spoiler:
     



     
     
    Vamos ao que interessa:
     
     

    Versão 1:

     
    Script (actions/scripts/other/piggybank.lua)
    "VALE LEMBRAR, ESSE PIGGY BANK JÁ EXISTE NO TIBIA, MAS DESEMPENHANDO OUTRA FUNÇÃO, ENTÃO É MELHOR CRIAR OUTRO ARQUIVO OU SÓ SUBSTITUIR."
    --[[ Esse é o script do piggy bank, SCRIPT BY CARONTE, visite: tibiaking.com ]]-- local qtdd = 10 -- quantidade minima para jogar local lost, winner = CONST_ANI_SUDDENDEATH, CONST_ANI_HOLY -- Efeitos: Ao perder, Ao ganhar function onUse(cid, item, frompos, item2, topos) local chance = math.random(0,100) local pos = getPlayerPosition(cid) local pos_ef = { {x= pos.x-1,y= pos.y-1,z= pos.z}, {x= pos.x,y= pos.y-1,z= pos.z}, {x= pos.x+1,y= pos.y-1,z= pos.z}, {x= pos.x+1,y= pos.y,z= pos.z}, {x= pos.x+1,y= pos.y+1,z= pos.z}, {x= pos.x,y= pos.y+1,z= pos.z}, {x= pos.x-1,y= pos.y+1,z= pos.z}, {x= pos.x-1,y= pos.y,z= pos.z} } --Verificar se tem crystals no slot -- if getPlayerSlotItem(cid, CONST_SLOT_AMMO).itemid ~= 2160 then doCreatureSay(cid, 'You need crystal coins in your ammunition slot to play ! ', TALKTYPE_ORANGE_1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) --Verificar quantidade de cystals no ammo slot elseif getPlayerSlotItem(cid, CONST_SLOT_AMMO).itemid == 2160 and getPlayerSlotItem(cid, CONST_SLOT_AMMO).type < qtdd then doCreatureSay(cid, "You don't have "..qtdd.." crystal coins in the arrows slot to play", TALKTYPE_ORANGE_1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) end if getPlayerSlotItem(cid, CONST_SLOT_AMMO).itemid == 2160 and getPlayerSlotItem(cid, CONST_SLOT_AMMO).type >= qtdd then doCreatureSay(cid, "Let's see your lucky", TALKTYPE_ORANGE_1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_CRAPS) if chance <= 50 then -- GANHOU doPlayerAddItem(cid,2160,getPlayerSlotItem(cid, CONST_SLOT_AMMO).type) for i = 1, 8 do doSendDistanceShoot(pos_ef[i], pos, winner) end -- FECHA FOR elseif chance >= 50 then -- PERDEU doPlayerRemoveItem(cid,2160,getPlayerSlotItem(cid, CONST_SLOT_AMMO).type) doSendMagicEffect(pos, CONST_ME_BLOCKHIT) for i = 1, 8 do doSendDistanceShoot(pos_ef[i], pos, lost) end -- FECHA FOR end -- FECHA IF (CHANCE) end -- FECHA IF QUANTIDADE return true end    
     
    TAG (actions.xml)
    <action itemid="2114" event="script" value="other/piggybank.lua"/>  
    Como editar:



     


    Demonstração:

     
    Caso não tenha dinheiro no slot de munições:

     
    Caso tenha dinheiro no slot de munições, mas não o suficiente:

     
    Caso ganhe:

     
    Caso perca:

     
     
     
    PS: Lembrando, que para apostar, é só colocar grana no slot que se coloca arrows...
    e a quantidade de crystal coins é configurável, no início do script, alterando lá, já vai alterar a fala, que falará sempre a quantidade configurada.
     
    Detalhe: quem quer que o local/item de aposta seja fixo, mude a TAG que coloca em actions.xml, só mude o ID do item.

    Créditos: Caronte & Adriano SwaTT
     
     

    Versão 2:

     
    Bom, essa versão não tem haver com o Cassino Script, mas foi feita por mim, para derivar dele...
     
     
    Como funciona:


     
    Script (actions/scripts/other/piggybank.lua)
    --[[ Esse é o script do piggy bank, SCRIPT BY CARONTE, visite: tibiaking.com ]] function onUse(cid, item, frompos, item2, topos) rand1 = math.random(1,100) rand2 = math.random(1,70) rand3 = math.random(1,15) local coins = 5 -- Quantide de crystal coins que irá consumir local chancedequebrar = 0 -- porcentagem da chance de se quebrar, use 0 para não quebrar dinheiro = coins * 10000 if getPlayerMoney(cid) >= dinheiro then doPlayerRemoveMoney(cid, dinheiro) else doCreatureSay(cid, '~You need '..coins..' crystals to break it !!!~', TALKTYPE_ORANGE_1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false end if rand1 <= 50 then doPlayerAddItem(cid,2148,rand1) doCreatureSay(cid, '~Holy Shit !!! only '..rand1..' golds, my mom will kill me~', TALKTYPE_ORANGE_1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_FIREWORK_YELLOW) end if rand1 >= 51 and rand1 <= 70 then doPlayerAddItem(cid,2152,rand3) doCreatureSay(cid, '~Oh-oh '..rand3..' Platinum coins!, would i try again ?~', TALKTYPE_ORANGE_1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_FIREWORK_BLUE) end if rand1 >= 90 then doPlayerAddItem(cid,2160,rand2) doCreatureSay(cid, '~Oh My God! '..rand2..' Crystal coins !!!', TALKTYPE_ORANGE_1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_WATERSPLASH) end if rand1 <= chancedequebrar then doPlayerAddMoney(cid, dinheiro) doTransformItem(item.uid,item.itemid+1) end return 1 end   
     Como editar:



     
     

    Demonstração:

     
    Caso não tenha dinheiro na Bag:

     
    Caso caia em gold: 

     
    Caso caia em platinum:

     
    Caso caia em crystal:

     
     
    Créditos:
    Caronte
     
     
     

     
     
    Fim
     
    Caso goste, comente,
    sugestões, comente,
    dificuldades, comente,
    erros, comente.
     
     
    Fui é só isso pessoal
    fiquem com God
  11. Gostei
    churupetinha deu reputação a Caronte em Lib 000-Const   
    Olá 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+
  12. Gostei
    churupetinha deu reputação a Jeff Owns em [Elfbot NG] Lita De Hotkeys Elfbot 8.60   
    Bom Galera , Nao Sei Se Já tem algum Topico Com Lista de Hotkeys Aki no Tk , Mais Eu Vou postar msm assim.. Entao vamos Lá





    Hotkeys Simples:




    Hotkeys Grandes:



    Hotkeys OtEditados:




    Espero Que Gostem, Se Gostarem Reputem Rep+ , Nao Cai o Dedo '-'
  13. Gostei
    churupetinha deu reputação a Qwizer em [PEDIDO] AO DAR USE EM ITEM, RECEBER ADDON! TFS 1.O   
    function onUse(cid, item, fromPosition, itemEx, toPosition) local storage = 90001 -- storage pra usa so 1x local item = 22715 --id do item q vai clica if getPlayerStorageValue(cid, storage) == -1 and doPlayerRemoveItem(cid, item, 1) then doPlayerAddOutfit(cid, 156, 3) doPlayerAddOutfit(cid, 152, 3) setPlayerStorageValue(cid,storage,1) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE,"Voce obteve o addon full do Assassin, nossa equipe agradece sua doaçao.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_SOUND_PURPLE) end return true end uso esse no meu e funciona. tenta ai
  14. Gostei
    churupetinha deu reputação a xWhiteWolf em Mostrar o tempo da Magic Wall   
    Eae galera, hoje vou fazer uma pequena demonstração de como usar a função doShowTimeByPos, uma das mais novas funções adicionadas na New Lib, que agora está em versão 1.2.

    A função:



    Se seu server for 0.3.6/0.4 você só vai precisar adicionar essa linha marcada:




    do contrário, se ele for das revs mais novas como 1.0 você irá adicionar essa linha:




    Esses valores são a duração (20 segundos que é o tempo de duração da magic wall) e 20/35 é o TALKTYPE do tipo monster (cor laranja), seguindo a tabela do data\lib\constant.lua:
    TALKTYPE_FIRST = 1 TALKTYPE_WHISPER = 2 TALKTYPE_YELL = 3 TALKTYPE_PRIVATE_PN = 4 TALKTYPE_PRIVATE_NP = 5 TALKTYPE_PRIVATE = 6 TALKTYPE_CHANNEL_Y = 7 TALKTYPE_CHANNEL_W = 8 TALKTYPE_RVR_CHANNEL = 9 TALKTYPE_RVR_ANSWER = 10 TALKTYPE_RVR_CONTINUE = 11 TALKTYPE_BROADCAST = 12 TALKTYPE_CHANNEL_RN = 13 TALKTYPE_PRIVATE_RED = 14 TALKTYPE_CHANNEL_O = 15 TALKTYPE_CHANNEL_RA = 17 TALKTYPE_MONSTER = 19 TALKTYPE_MONSTER_YELL = 20 Aqui tem uma imagem de como fica no server.




    Note que eu fiz pra magic wall mas vale pra qualquer item que tenha duration, pra quests, pra contar tempo de invencibilidade de alguma spell ou oque você quiser, use a criatividade e explore o máximo dessa função. Abraços.
  15. Gostei
    churupetinha deu reputação a Emersonssss em [MultipleExp System]   
    Fala Galerinha nessa madrugada eu modifiquei meu script e resolvi posta-lo para ajudar os OT-Admin iniciantes e ter algo diferente no server.
     
    O Sistem Funciona assim, sabe quando vem um noob e fala " ADM Ponhe Double XP!!", com esse sistema vc resolve esse problema, ele se resumi quanto mais Players Online + XP é Adc para quem estiver online, simples, simples, sem mais delongas.
     
    Em /data/creaturescripts/
    Adicione a seguinte tag:
    <event type="login" name="MultipleExp" event="script" value="MultipleExpLogin.lua"/> Em /data/creaturescripts/scripts/
    Crie um arquivo.lua chamado MultipleExpLogin.lua e adicione :
    local config = getBooleanFromString(getConfigInfo('experienceStages')) function onLogin(cid) registerCreatureEvent(cid, "MultipleExp") if(config) then exp = getExperienceStage(getPlayerLevel(cid), getVocationInfo(getPlayerVocation(cid)).experienceMultiplier) end local players = getPlayersOnline() if(#players >= 1 and #players <= 49) then for _, pid in ipairs(players) do if isPremium(pid) then doPlayerSetRate(pid, SKILL__LEVEL, 1.5) else doPlayerSetRate(pid, SKILL__LEVEL, 1.0) end end if isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.5x)") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x)") end elseif(#players >= 50 and #players <= 99) then for _, pid in ipairs(players) do if isPremium(pid) then doPlayerSetRate(pid, SKILL__LEVEL, 1.6) else doPlayerSetRate(pid, SKILL__LEVEL, 1.1) end end if isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.5x + 0.1x)") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.1x)") end elseif(#players >= 100 and #players <= 149) then for _, pid in ipairs(players) do if isPremium(pid) then doPlayerSetRate(pid, SKILL__LEVEL, 1.7) else doPlayerSetRate(pid, SKILL__LEVEL, 1.2) end end if isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.5x + 0.2x)") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.2x)") end elseif(#players >= 150 and #players <= 199) then for _, pid in ipairs(players) do if isPremium(pid) then doPlayerSetRate(pid, SKILL__LEVEL, 1.8) else doPlayerSetRate(pid, SKILL__LEVEL, 1.3) end end if isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.5x + 0.3x)") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.3x)") end elseif(#players >= 200 and #players <= 249) then for _, pid in ipairs(players) do if isPremium(pid) then doPlayerSetRate(pid, SKILL__LEVEL, 1.9) else doPlayerSetRate(pid, SKILL__LEVEL, 1.4) end end if isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.5x + 0.4x)") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.4x)") end elseif(#players >= 250) then for _, pid in ipairs(players) do if isPremium(pid) then doPlayerSetRate(pid, SKILL__LEVEL, 2.0) else doPlayerSetRate(pid, SKILL__LEVEL, 1.5) end end if isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.5x + 0.5x)") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "--[MultipleExp System]--\nPlayers Online : "..#players.."\nSeu Exp Foi Atualizado Para : ("..exp.."x + 0.5x)") end end return true end Creditos?
    Emerson Henrique 
    E quero ver algum filho de uma pessoa vim falar que eu copie esse script -.-"
  16. Gostei
    churupetinha deu reputação a Absolute em [Trocar Sexo do Personagem] - !trocarsexo ~ por dias vip   
    Olá TK TK TK!
    Venho hoje trazer um sisteminha de troca de sexo, exemplo: o player é male quer virar female ou vice-versa.
    Muitos não gostam de usar o GP para troca de sexo para que evite player ficar trocando toda hora. Então nesse script a troca de sexo é por dias vip!

     
     
    Vamos ao que interessa:
     
     
    Em talkactions/scripts crie um arquivo com o nome de trocarsexo.lua e adicione o seguinte dentro:
    function onSay(cid, words, param, channel) local config = {costPremiumDays = 0} if(getPlayerSex(cid) >= 2) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce nao pode mudar para o mesmo sexo.") return TRUE end if(getPlayerPremiumDays(cid) < config.costPremiumDays) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Desculpe, mas voce nao tem dias vip- change sex custa " .. config.costPremiumDays .. " days.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return TRUE end if(getPlayerPremiumDays(cid) < 65535) then doPlayerAddPremiumDays(cid, -config.costPremiumDays) end if(getPlayerSex(cid) == PLAYERSEX_FEMALE) then doPlayerSetSex(cid, PLAYERSEX_MALE) else doPlayerSetSex(cid, PLAYERSEX_FEMALE) end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce trocou seu sexo e perdeu " .. config.costPremiumDays .. " days of premium time.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_RED) return TRUE end Em data/talkctions/talkactions.xml adicione a seguinte linha:
    <talkaction words="!trocarsexo" script="trocarsexo.lua" /> FIM!

     
     
     
     
    Qualquer dúvida não deixe de perguntar aqui no tópico, não tenha vergonha ninguém nasceu sabendo.
     
     
     
    Créditos:
    Doidin
    Absolute
     
     
     
     
    Até a próxima babyes!
     
  17. Gostei
    churupetinha deu reputação a Hadggar em [TalkAction] Sistema de Jail !   
    Opa galera blz? hoje vou trazer um sistema para vocês de jail, então vamos la !
     
    Algumas Funções !
     
    Funções:
     
    *Exemplo, GM quer prender um player que ta fazeno algu de errado, ai ele fala !jail ,4(no exemplo ele ficara 4 minutos preso), éo nome do fulano, !jail 4,fulano ,!jail 15,fulano ou !jail 30,fulano.
     
    * Verificação jogador o tempo de prisão (mostra data unjail) 
    * auto unjail jogadores 
    * Kick todos os jogadores da prisão depois de acidente / restart [teletransporte para jogador templo] 
     
    Primeiramente vá em \data\talkactions e abra o talkactions.xml é lá adicione:
    <talkaction words="!jail" script="jailsystem.lua"/> <talkaction words="!unjail" script="jailsystem.lua"/> <talkaction words="/jail" script="jailsystem.lua"/> <talkaction words="/unjail" script="jailsystem.lua"/> Agora vá em \data\talkactions\scripts é crie um arquivo chamado jailsystem.lua é la adicione :
    -- Default jail time in seconds -- default_jail = 30 -- The permission you need to jail someone -- grouprequired = 4 -- StorageValue that the player gets -- jailedstoragevalue_time = 1338 jailedstoragevalue_bool = 1339 -- Set the position of the jail: -- jailpos = { x = 1037, y = 1004, z =7 } -- Set the position once unjailed: -- unjailpos = { x = 1029, y = 1005, z =7 } -- auto kicker, dont edit jail_list = {} jail_list_work = 0 function checkJailList(param) addEvent(checkJailList, 1000, {}) for targetID,player in ipairs(jail_list) do if isPlayer(player) == TRUE then if getPlayerStorageValue(player, jailedstoragevalue_time) < os.time() then doTeleportThing(player, unjailpos, TRUE) setPlayerStorageValue(player, jailedstoragevalue_time, 0) setPlayerStorageValue(player, jailedstoragevalue_bool, 0) table.remove(jail_list,targetID) doPlayerSendTextMessage(player,MESSAGE_STATUS_CONSOLE_ORANGE,'You were kicked from jail! See you later :)') end else table.remove(jail_list,targetID) end end end function onSay(cid, words, param) if jail_list_work == 0 then jail_list_work = addEvent(checkJailList, 1000, {}) end if param == '' and (words == '!unjail' or words == '/unjail') then if getPlayerStorageValue(cid, jailedstoragevalue_time) > os.time() then doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You are jailed until ' .. os.date("%H:%M:%S", getPlayerStorageValue(cid, jailedstoragevalue_time)) .. ' (now is: ' .. os.date("%H:%M:%S", os.time()) .. ').') else if getPlayerStorageValue(cid, jailedstoragevalue_bool) == 1 then table.insert(jail_list,cid) doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You will be kicked from jail in one second.') else doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You are not jailed.') end end return TRUE end local jail_time = -1 for word in string.gmatch(tostring(param), "(%w+)") do if tostring(tonumber(word)) == word then jail_time = tonumber(word) end end local isplayer = getPlayerByName(param) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(param, string.len(jail_time)+1)) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(param, string.len(jail_time)+2)) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(param, string.len(jail_time)+3)) end end end if jail_time ~= -1 then jail_time = jail_time * 60 else jail_time = default_jail end if words == '!jail' or words == '/jail' then if getPlayerGroupId ( cid ) >= grouprequired then if isPlayer(isplayer) == TRUE then doTeleportThing(isplayer, jailpos, TRUE) setPlayerStorageValue(isplayer, jailedstoragevalue_time, os.time()+jail_time) setPlayerStorageValue(isplayer, jailedstoragevalue_bool, 1) table.insert(jail_list,isplayer) doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You jailed '.. getCreatureName(isplayer) ..' until ' .. os.date("%H:%M:%S", getPlayerStorageValue(isplayer, jailedstoragevalue_time)) .. ' (now is: ' .. os.date("%H:%M:%S", os.time()) .. ').') doPlayerSendTextMessage ( isplayer, MESSAGE_INFO_DESCR, 'You have been jailed by '.. getCreatureName(cid) ..' until ' .. os.date("%H:%M:%S", getPlayerStorageValue(isplayer, jailedstoragevalue_time)) .. ' (now is: ' .. os.date("%H:%M:%S", os.time()) .. ').') return TRUE else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Player with this name doesn\'t exist or is offline.") return FALSE end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don't have access to unjail other players.") return FALSE end elseif words == '!unjail' or words == '/unjail' then if getPlayerGroupId ( cid ) >= grouprequired then if isPlayer(isplayer) == TRUE then doTeleportThing(isplayer, unjailpos, TRUE) setPlayerStorageValue(isplayer, jailedstoragevalue_time, 0) setPlayerStorageValue(isplayer, jailedstoragevalue_bool, 0) table.remove(jail_list,targetID) doPlayerSendTextMessage(isplayer,MESSAGE_STATUS_CONSOLE_ORANGE,getCreatureName(cid) .. ' let you go out from jail! See you later :)') doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You unjailed '.. getCreatureName(isplayer) ..'.') else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Player with this name doesn\'t exist or is offline.") return FALSE end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don't have access to unjail other players.") return FALSE end end return FALSE end Algumas configurações
     
    grouprequired = 4 -- aki séra até o grupo que poderar usar no caso group 4 pra baixo.
    jailpos = { x = 1037, y = 1004, z =7 } -- aki séra a posição para aonde o player irar quando for preso.
    unjailpos = { x = 1029, y = 1005, z =7 }- -aki séra para aonde ele for quando ele n tiver mais preso, no caso unjail.
    Creditos: Gesior.pl EU.   Lembre-se eu testei em tibia 8.54 é 8.60 é funcionou perfeitamente !
     
     
     
     
     
     
     
  18. Gostei
    churupetinha deu reputação a Rusherzin em Comando "Spy" Players   
    Olá pessoal do TK, venho aqui trazer um script que não fui eu quem o criou, somente coloquei-o em português (e daí?).. Achei em um fórum e no final do tópico estarei disponibilizando o nome do criador.
     
    Utilidade do Script:
     
    Bom, o script serve para você com um character com acesso de GOD (configurável) possa ver quais itens um certo player está utilizando no momento. PS: Inclusive os itens presentes dentro da backpack do Player.
     
    Como funciona:
     
    Você digita a talkaction /spy seguida do nome do player a ser "espionado".
    Por Exemplo: /spy Rusherzin
    /spy Tibia King
     
    Testado em:
     
    Versão 8.54
     
    Imagem:



     
    Agora vamos ao script:
    Vá em data/talkactions/scripts/ copie e cole um arquivo .lua qualquer, renomeie para spy e cole isso dentro:



     
    E adicione essa tag no talkactions.xml:



     
     
     
    Créditos:  Azi
  19. Gostei
    churupetinha deu reputação a PsyMcKenzie em Armadilhas de Teleport   
    Bom galera, esse script eu fiz ano passado, quando estava aprendendo lua, mas infelizmente fiz a cagada de parar de estudar. 
    Enfim, vamos lá!
     
     
    Como funciona?
    Você da use em um item e depois clica no chão e irá abrir um teleport, que leva a lugares aleatórios.
     
    Crie um arquivo em data/actions com o nome de telearmadilha e cole isso dentro:
     
    local time = 10 -- Segundos local positionstp = { {x=100,y=40,z=7}, {x=150, y=60, z=7}, {x=225, y=80, z=7}, {x=300, y=100, z=7} } local function alert(tempo, interval, pos) if os.time() - tempo <= interval then doSendAnimatedText(pos, interval - (os.time() - tempo), math.random(180)) addEvent(alert, 1000, tempo, interval, pos, "a") end end local function remover(pos) doRemoveItem(getTileItemById(pos, 1387).uid, 1) end function onUse(cid, item, frompos, item2, topos) local topostp = positionstp[math.random(1, #positionstp)] if item.itemid == 2382 then doCreateTeleport(1387, topostp, topos) doPlayerSendTextMessage(cid, 28 , "Você criou uma armadilha em teleport.") addEvent(remover, time * 1000, topos) alert(os.time(), time , topos) end return true end Em actions.xml cole esta tag:
     
    <action itemid="2382" event="script" value="telearmadilha.lua"/> Configuração:
     
    2382 é o item usado para criar os teleports, altere na tag do actions.xml.
     
    local time = 10 -- Tempo em segundos que o teleport ficará aberto.
     
    E aqui são os possíveis lugares que o teleport leva.
    local positionstp = {
    {x=100,y=40,z=7},
    {x=150, y=60, z=7},
    {x=225, y=80, z=7},
    {x=300, y=100, z=7}
    }
     
    E é isso, espero que seja útil pra alguém!
    Abraços!
  20. Gostei
    churupetinha deu reputação a TsplayerT em Afk System!   
    ALO, COM QUEM EU FALO?
    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
    INTRODUÇÃO
     
        Galera, nesse topico estarei ensinando um projeto meu de Afk System, que foi esqueçido.
    Esse sistema é bem basico e simples, porém é legal, util e interresante...
    Só avisando... Ele é totalmente configuravel xD
    Então vamos la...
    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
    COMO FUNCIONA
     
      
       O jogador digitará um comando e fica saindo automaticamente umas mensagens em cima dele, também apareçerá uma mensagem de o jogador estará ausente, e apareçerá tambem uma janela dissendo que se o jogador se mover será cancelado o  sistema.
        NÃO INTENDEU? VEJA COM SEUS PROPRIOS OLHOS.

    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
    ENSINANDO
     
       Crie um arquivo chamado "Afk" em tipo ".lua" em: data\talkactions\scripts
     
    e coloca essas configurações dentro do arquivo criado:


     
    Após fazer isso abra o arquivo "TalkActions" do tipo ".xml". Localizado em: data\talkactions
     
    E coloque essa linha no aquivo:



     
    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
    CONFIGURANDO
     
    ESSAS CONFIGURAÇÕES SÃO PARA TROCAR AS MENSAGENS.
     
         Onde está escrito em VERMELHO, é onde fica as mensagem que fica em cima do Jogador.
    Obs¹: Caso queira mensagem diferentes, digite-as entre aspas e separadas por virgula
    Obs²: Essas mensagens ficam repetindo sequencialmente.
     
         O número escrito em AZUL, é o tempo em segundos que a mensagem apareçerá (Intervalo)
     
         Em AMARELO, é a mensagem que apareçerá em vermelho, essa mensagem é como se fosse porque o jogador está ausente(Configurado somente no arquivo, não pelo jogador)
     
         O CINZA ESCURO, é a mensagem que apereçerá na janela, para alertar o jogador que se ele se mover ele para de mandar essas mensagens.
    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
    AJUDEI? GOSTOU? FOI BOM? ESTÁ EXPLICATIVO? ESTÁ ORGANIZADO? DA REP+ afinal, não explode o Dedo..
    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
  21. Gostei
    churupetinha deu reputação a GiovaniRodrigo em [ACTION] Change Vocação   
    Olá King Tibianos,
     
    A pedido da usuária TathiiCarvalho criei um script que troca de vocação, mas ele apenas não troca de vocação como também adiciona health e mana de acordo com o level e reseta skills.
    Eu já havia feito o script de trocar de vocação, mas quando um Sorcerer ou Druid com ML 80 trocava para vocação Knight ele ficava com ML 80. Imagina um Knight ML 80, não da né.
    Tinha outro problema, um Sorcerer ou Druid Level 150 com HP 895 e MP 4225, ele muda para vocação Knight e fica com o mesmo HP e MP, como seria um Knight Level 150 com HP 895 e MP 4225? Também não da né.
     
    Então modifiquei o script para fixar esses "erros".
     
    Crie um arquivo chamado changevoc.lua na pasta data/actions/scripts e cole isso
    function onUse(cid, item, frompos, item2, topos)           level = getPlayerLevel(cid)-8           pid = getPlayerGUID(cid)             magehealth = level*5 -- Quantidade de vida que o Sorcerer e Druid ganha a cada level(mude apenas os numeros)           magemana = level*30 -- Quantidade de mana que o Sorcerer e Druid ganha a cada level(mude apenas os numeros)             paladinhealth = level*10 -- Quantidade de vida que o Paladin ganha a cada level(mude apenas os numeros)           paladinmana = level*15 -- Quantidade de mana que o Paladin ganha a cada level(mude apenas os numeros)             knighthealth = level*15 -- Quantidade de vida que o Knight ganha a cada level(mude apenas os numeros)           knightmana = level*5 -- Quantidade de mana que o Knight ganha a cada level(mude apenas os numeros)             if item.uid == 30000 then                     doSendMagicEffect(topos, 14)                     doPlayerPopupFYI(cid, 'You changed his vocation to sorcerer.')                     doPlayerSetVocation(cid, 1)                     setCreatureMaxHealth(cid, magehealth)                     setCreatureMaxMana(cid, magemana)                     doRemoveCreature(cid)                     db.executeQuery("UPDATE `player_skills` SET `value` = ".. 10 ..", count = ".. 0 .." WHERE `player_id` = ".. pid ..";")                     db.executeQuery("UPDATE `players` SET `maglevel` = ".. 0 ..", `manaspent` = ".. 0 .." WHERE `id` = ".. pid ..";")           end             if item.uid == 30001 then                     doPlayerSetVocation(cid, 2)                     setCreatureMaxHealth(cid, magehealth)                     setCreatureMaxMana(cid, magemana)                     doSendMagicEffect(topos, 14)                     doPlayerPopupFYI(cid, 'You changed his vocation to druid.')                     doRemoveCreature(cid)                     db.executeQuery("UPDATE `player_skills` SET `value` = ".. 10 ..", count = ".. 0 .." WHERE `player_id` = ".. pid ..";")                     db.executeQuery("UPDATE `players` SET `maglevel` = ".. 0 ..", `manaspent` = ".. 0 .." WHERE `id` = ".. pid ..";")           end             if item.uid == 30002 then                     doPlayerSetVocation(cid, 3)                     setCreatureMaxHealth(cid, paladinhealth)                     setCreatureMaxMana(cid, paladinmana)                     doSendMagicEffect(topos, 14)                     doPlayerPopupFYI(cid, 'You changed his vocation to paladin.')                     doRemoveCreature(cid)                     db.executeQuery("UPDATE `player_skills` SET `value` = ".. 10 ..", count = ".. 0 .." WHERE `player_id` = ".. pid ..";")                     db.executeQuery("UPDATE `players` SET `maglevel` = ".. 0 ..", `manaspent` = ".. 0 .." WHERE `id` = ".. pid ..";")           end             if item.uid == 30003 then                     doPlayerSetVocation(cid, 4)                     setCreatureMaxHealth(cid, knighthealth)                     setCreatureMaxMana(cid, knightmana)                     doSendMagicEffect(topos, 14)                     doPlayerPopupFYI(cid, 'You changed his vocation to knight.')                     doRemoveCreature(cid)                     db.executeQuery("UPDATE `player_skills` SET `value` = ".. 10 ..", count = ".. 0 .." WHERE `player_id` = ".. pid ..";")                     db.executeQuery("UPDATE `players` SET `maglevel` = ".. 0 ..", `manaspent` = ".. 0 .." WHERE `id` = ".. pid ..";")           end end  
    Adicione as seguintes linhas no arquivo actions.xml que se encontra na pasta data/actions
     
    <action uniqueid="30000" event="script" value="changevoc.lua" /> <action uniqueid="30001" event="script" value="changevoc.lua" /> <action uniqueid="30002" event="script" value="changevoc.lua" /> <action uniqueid="30003" event="script" value="changevoc.lua" />  
    Testado e está 100% funcional.
    Dúvidas? Me avise.
     
    Att.
    Giovani Rodrigo
  22. Gostei
    churupetinha deu reputação a Absolute em [Proibir Palavras] Anti Divulgação   
    Fala galerinha do TK, hoje trago a vocês um sistema de bloquear algumas palavras no servidor!
     
     
    Sabe aqueles players chatos que entram em seu otserver divulgando o servidor dele dias e dias, leva ban, volta e tudo mais? Poisé, chega disso né.
     
    Primeiro vai o script depois explicação/config:
     

     
     
    Em data/talkactions/scripts crie um arquivo com o nome de tibiakingproibiu.lua
    function getFixedText(cid, text, replace) local wrongWords = {"#####", "ots-list.pl", "google.br", ".ddns.net", "hopto.org", "no-ip.org", "servegame.com"} local lowerText = string.lower(text) local noSpaceText = string.gsub(string.gsub(string.gsub(lowerText, "%s", ""), "%p", ""),"-", "") for w = 1, #wrongWords do wordLen = string.len(wrongWords[w]) for p = 1, string.len(text) do if(string.sub(lowerText, p, p+wordLen-1) == wrongWords[w]) then text = string.sub(text, 1, p-1) .. string.rep(replace, wordLen) .. string.sub(text, p+wordLen) end end end if(string.lower(text) == lowerText) then for c = 1, #wrongWords do if(string.find(noSpaceText, string.gsub(string.gsub(wrongWords[c], "%p", ""),"-", "")) ~= nil) then return "I want to post forbidden links.." end end end return text end --[[Channels which are not added to block: 1 - Party Channel 2 - Channel for Staff members 3 - Rule Violation Channel 4 - Channel for Counselors/Tutors 65536 - Private Chat Channel <-- Private Chat cannot be blocked with this script ]]-- local blocked_channels = {5,8,9} --Game-Chat, Real Chat, Help Channel local trade_channels = {6,7} --All trade channels <- These are also blocked local replace = "°" --Symbols which are shown instead of forbidden links -> ° local delay = {16246,10} -- {empty_storage, lenght of muted} function onSay(cid, words, param, channel) local fixedWords = getFixedText(cid, words, replace) if words ~= fixedWords and getPlayerAccess(cid) == 0 then if getPlayerStorageValue(cid,delay[1]) > os.time() then return doPlayerSendCancel(cid,"Voce foi mutado por ".. getPlayerStorageValue(cid,delay[1])-os.time() .." segundos, aqui e proibido divulgar.") end setPlayerStorageValue(cid,delay[1],os.time()+delay[2]) if channel == CHANNEL_DEFAULT then doCreatureSay(cid, fixedWords, TALKTYPE_SAY) doPlayerPopupFYI(cid, "Link: "..words.." e proibido, mal educado!.") return true elseif isInArray(trade_channels, channel) then doPlayerPopupFYI(cid, "Link: "..words.." e proibido neste canal.") return true elseif isInArray(blocked_channels, channel) then doPlayerPopupFYI(cid, "Link: "..words.." e proibido, mal educado!.") doPlayerSendChannelMessage(cid, getCreatureName(cid), fixedWords, TALKTYPE_CHANNEL_Y, channel) return true end end return false end Logo em seguida em em talkactions.xml adicione a seguinte linha:
    <talkaction words="illegalWords" event="script" value="tibiakingproibiu.lua"/> Fim da instalação.

     
    Explicação/Config:
     
    local wrongWords = {"#####", "ots-list.pl", "google.br", ".ddns.net", "hopto.org", "no-ip.org", "servegame.com"} = Nas aspas ".." você colocará as palavras que deseja proibir, palavrões, divulgações e companhia...
     
    local noSpaceText = string.gsub(string.gsub(string.gsub(lowerText, "%s", ""), "%p", ""),"-", "") = Aqui aconselho não mexer. É para evitar divulgações acompanhadas das Words (palavras) ou seja lá está proibido .servegame.com, então quando o player falar baiakfulunao.servegame.com irá proibir.
    local delay = {16246,10} -- {empty_storage, lenght of muted} = no 16246 é a storage que irá salvar, não mexa. em 10 é o tempo em segundos que o player será mutado ao falar as palavras proibidas.
    doPlayerPopupFYI(cid, "Link: "..words.." e proibido, mal educado!.") = Este doPlayerPopup é que vai aparecer naquelas janelas que aparece para clicar em ok (caixa de mensagens) caso queira alterar para mensagem de console substitua: 
    doPlayerPopupFYI(cid, "Link: "..words.." e proibido, mal educado!.")
    por  
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Link: "..words.." e proibido, mal educado!.") 
     
     

     
     
    É isso ae lindões do TK, caso haja alguma dúvida peço que perguntem!
     
     
    Créditos:
    Absolute
    OTLAND
     
     
    Até o próximo!
     
     
    Absolute
     
  23. Gostei
    churupetinha deu reputação a ViitinG em [talkaction] Mandar mensagem para pasta do servidor   
    Tem sim,só mudar o script para esse :
    function onSay(cid, words, param, channel) if os.time() > getPlayerStorageValue(cid, 14001) then setPlayerStorageValue(cid, 14001, os.time()+3600) local file = io.open('data/logs/log.txt','a') file:write(getCreatureName(cid)..": "..tostring(param).."\n") file:close() doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING,'Mensagem enviada com sucesso.') else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING,'Você não pode mandar outra mensagem ainda. Falta(m) '..(math.ceil((getPlayerStorageValue(cid, 14001)-os.time())/60)+1)..' minuto(s) para você poder mandar uma nova mensagem.') end return TRUE end
  24. Gostei
    churupetinha deu reputação a ViitinG em [talkaction] Mandar mensagem para pasta do servidor   
    Para quem não sabe como funciona o script : É um comando que o player poderá usar para reportar bug's direto para o ADM do servidor com um intervalo de 60 minutos(configurável)
    O bug será enviado para um log(bloco de notas) que será criado na pasta do servidor !
     
    • Adicionando o script •
     
    Em "data/talkactions/scripts/reportbugs.lua" :
    function onSay(cid, words, param, channel) if os.time() > getPlayerStorageValue(cid, 14001) then setPlayerStorageValue(cid, 14001, os.time()+3600) local file = io.open('log.txt','a') file:write(getCreatureName(cid)..": "..tostring(param).."\n") file:close() doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING,'Mensagem enviada com sucesso.') else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING,'Você não pode mandar outra mensagem ainda. Falta(m) '..(math.ceil((getPlayerStorageValue(cid, 14001)-os.time())/60)+1)..' minuto(s) para você poder mandar uma nova mensagem.') end return TRUE end Em "data/talkactions/talkactions.xml" :
    <talkaction words="/reportbug" event="script" value="reportbugs.lua"/> • Imagens •
    Quando utilizar o comando :


    Quando utilizar o comando sem esperar o tempo :

    Dentro da pasta do servidor é criado um txt chamado "log" e dentro dele ficará as mensagens :

     
     
     
    • Configurando •
     
  25. Gostei
    churupetinha deu reputação a rodrigodias12 em BOSS INQ + TP ABERTO + PROXIMA SALA   
    Eai turma tudo beleza? sou novato na area de script mais esse eu consegui resolver e testei no TFS 1.0 10.37, acredito que alguém esteja precisando pois ele estava dando alguns erros no console e o tp nao aparecia apos a morte do boss, então ai vai:

    O script funciona da seguinte maneira -

    Você mata o boss da inq e o tp aparece levando para a proxima sala
    segue o script:
    local config = { timeToRemove = 160, message = "You now have 2 minutes to exit this room through the teleporter. It will bring you to the next room only during his time or the teleporter will disappear", teleportId = 9773, bosses = { ["Ushuriel"] = { pos={ x=33157, y=31725, z=11, stackpos=1 }, aid=1001 }, ["Zugurosh"] = { pos={ x=33123, y=31689, z=11, stackpos=1 }, aid=1002}, ["Madareth"] = { pos={ x=33194, y=31768, z=11, stackpos=1 }, aid=1003}, ["Annihilon"] = { pos={ x=33200, y=31704, z=11, stackpos=1 }, aid=1005}, ["Hellgorak"] = { pos={ x=33107, y=31735, z=11, stackpos=1 }, aid=1006} }, brothers ={ ["Golgordan"] = {pos={ x=33235, y=31734, z=11, stackpos=1 },aid=1004, brother = "Latrivan"}, ["Latrivan"] = {pos={ x=33235, y=31734, z=11, stackpos=1 },aid=1004, brother = "Golgordan"}, brothersArea ={ fromPos = {x = 33224, y = 31722, z = 11}, toPos = {x = 33240, y = 31734, z = 11} } } } local function removal(position) doRemoveItem(getTileItemById(position, config.teleportId).uid, 1) return TRUE end function onKill(cid, target, lastHit) if(config.bosses[getCreatureName(target)]) then local t = config.bosses[getCreatureName(target)] local teleport = doCreateItem(config.teleportId, t.pos) local position = t.pos doSetItemActionId(teleport, t.aid) doCreatureSay(cid, config.message, TALKTYPE_ORANGE_1) addEvent(removal, config.timeToRemove * 1000, position) elseif(config.brothers[getCreatureName(target)]) then local t = config.brothers[getCreatureName(target)] local brother = getCreatureByName(t.brother) if(isMonster(brother) == true) then if(isInRange(getCreaturePosition(brother), config.brothers.brothersArea.fromPos, config.brothers.brothersArea.toPos) == true) then return TRUE end else local teleport = doCreateItem(config.teleportId, t.pos) local position = t.pos doSetItemActionId(teleport, t.aid) doCreatureSay(cid, config.message, TALKTYPE_ORANGE_1) addEvent(removal, config.timeToRemove * 1000, position) end end return TRUE end Faça a copia de algum arquivo.lua da pasta creaturescript e cole isso dentro salve/feche renomeie para Inquisition.
     
     
     
    em creaturescript.xml
    adicione:
     
    <event type="kill" name="inquisitionPortals" script="Inquisition.lua"/> Adicione também em cada um dos bosses da inq a seguinte tag
    <script> <event name="inquisitionPortals"/> </script> Favor adicionar os possíveis créditos caso houver! Agradeço

Informação Importante

Confirmação de Termo