Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 11/23/11 em todas áreas

  1. SkyDangerous

    [Npc] New Egg System [Fix]

    Olá, venho trazer o um novo tipo de egg system, que eu tive a ideia de criar e quero agradecer a mega ajuda do ONESHOT crie um arquivo na pasta scripts dos npc com nome de eggsystem.lua 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 onCreatureSayCallback(cid, type, msg) local config = { price = 50000, delay = 5 * 60, control = {10555, 10556}, eggn = 4850 } if not npcHandler:isFocused(cid) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg, "care") then local p = (config.price % 1000 == 0 and (config.price / 1000) or config.price) if getPlayerStorageValue(cid, config.control) > os.time() then selfSay("Sorry, but I am already caring one of your eggs.", cid) else selfSay("Do you want me to take care of your egg for ".. p .." ".. (p == config.price and "" or "k") .."?", cid) talkState[talkUser] = 1 end elseif msgcontains(msg, "back") then if getPlayerStorageValue(cid, config.control[2]) == 1 then selfSay("Hello, do you came to pick up your egg?", cid) talkState[talkUser] = 2 else selfSay("Sorry, but I am not caring eggs from you.", cid) end elseif msgcontains(msg, "check") then local t = getPlayerStorageValue(cid, config.control[1]) if getPlayerStorageValue(cid, config.control[2]) == -1 then selfSay("Sorry, but I am not caring eggs from you.", cid) else if t < os.time() then selfSay("Yay, your egg has started to hatch, take it.", cid) setPlayerStorageValue(cid, config.control[1], -1) setPlayerStorageValue(cid, config.control[2], -1) else selfSay("I will be caring your egg for more ".. (math.floor((t - os.time()) / 60) > 0 and "".. math.floor((t - os.time()) / 60) .." minutes and" or "") .." ".. (t - os.time()) % 60 .." seconds.", cid) end end end if talkState[talkUser] == 1 then if msgcontains(msg, "yes") then if getPlayerStorageValue(cid, config.control[2]) == -1 then if doPlayerRemoveMoney(cid, config.price) then setPlayerStorageValue(cid, config.control[2], 1) setPlayerStorageValue(cid, config.control[1], os.time()+config.delay) selfSay("Okay! Check back soon.", cid) else selfSay("Sorry, you don't have enough money. You need more ".. (config.price - getPlayerMoney(cid)) .." coins.", cid) end else selfSay("I am already taking care of a egg for you.", cid) end elseif msgcontains(msg, "no") then selfSay("Too pricey for you, heh?", cid) end elseif talkState[talkUser] == 2 then local x = getPlayerStorageValue(cid, config.control) local t = getPlayerStorageValue(cid, config.control[1]) if msgcontains(msg, "yes") then if x > os.time() then local item = doPlayerAddItem(cid, config.eggn, 1) doItemSetAttribute(item, "description", "A hatched egg.") selfSay("Take it!", cid) setPlayerStorageValue(cid, control[2], -1) setPlayerStorageValue(cid, control[1], -1) else selfSay("Sorry, but your egg need care for more ".. (math.floor((t - os.time()) / 60) > 0 and "".. math.floor((t - os.time()) / 60) .." minutes and" or "") .." ".. (t - os.time()) % 60 .." seconds.", cid) end end end return true end npcHandler:setMessage(MESSAGE_GREET, "Hello, |PLAYERNAME|. I am a pet egg carer. Do you want me to {care} your pet eggs? Also you can {check} the egg status and if you have any egg here, you can get it {back}.") npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, onCreatureSayCallback) npcHandler:addModule(FocusModule:new()) Agora crie um npc chamado mary <?xml version="1.0" encoding="UTF-8"?> <npc name="Mary" script="eggsystem.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="138" head="20" body="39" legs="45" feet="7" addons="3"/> </npc> Como Funciona: 1- Você pega um ovo qualquer. 2- Leva para o NPC 3- Ele cuidará dele 4- Depois de um tempo você pega ele de volta Função do NPC: ~> Paga 50k para cuidar do seu ovo ~>Checa o tempo necessário para ele chocar ~>Pegar o ovo chocado
    4 pontos
  2. Roksas

    Mapping - Planejamento

    ¿ Como montar um bom planejamento ? Tenho por finalidade ensiná-los, ou ao menos tentar ensiná-los a ter um bom planejamento para mapiar, que a meu ver é uma das partes mais importantes! Muitos praticantes do maping desconhecem essa parte ou a dispensam, porém, lhes garanto que os resultados obtidos são de ótimo proveito. Sei que muitos enfrentam o mal da preguiça, negando-se a ler ou pesquisar, deixem essa besteira de lado e logo tomarão gosto pela prática. O que entendo por este planejamento, é realizar uma pesquisa sobre os diversos assuntos envolventes no mapa, tudo isso antes de por em prática a atividade de maping. Exemplos destes assuntos poderiam ser o clima, a fauna, a flora, o terreno... Além da pesquisa, deve-se encaixar todos os itens em coerência, dando a tudo isso um objetivo, uma finalidade. A seguir irei mostrar um exemplo simplificado de um planejamento. Suponhamos que estamos pensando em fazer um local habitado por trolls, logo, o que entendemos por troll é que são monstros marrons que nos dão pouca experiência, mas esperem aí, garanto que coisas interessantes e muito relevantes os cercam. Primeiro passo - iniciando a pesquisa Vamos ao nosso oráculo, digo, google. Já de cara nos deparamos com a wikipédia, as vezes uma ótima fonte de iformações. Agora sei que os trolls vem do folclore escandinavo, presentes na literatura nórdica, certamente usados no grandioso universo de Tolkien. Além disso, eu pude conhecer algumas de suas características segundo estas culturas. Novamente, esperem, não vamos nos limitar a uma única fonte de pesquisa, vamos aos criadores deles no jogo, tibia.com: Trolls are a human-like race that lives in small tribes in the holes and dungeons of Tibia. There they hunt animals and seek treasures over which they keep a jealous watch. They are weak and silly fighters, but as a squad they can become quite dangerous. Tradução: Trolls são criaturas da raça humanóide, eles vivem em pequenas tribos dentro das cavernas e masmorras de Tibia. Eles praticam a caça de animais e estão sempre a procura de tesouros, e os mantém sob constante vigilância. São fracos combatentes, porém, quando em grupo podem se tornar oponentes perigosos. Ainda podemos pesquisar mais, e um ótimo lugar para isso é o Livro dos Monstros, manual básico do D&D (sistema de RPG). Lá encontramos inúmeras informações. Segundo passo - a criação Com base em toda nossa pesquisa já podemos criar os nossos próprios trolls. Poderíamos escrever desde a criação deles, mas neste caso para simplificar, pularemos a criação e manteremos os trolls dentro do padrão pesquisado. Os trolls são criaturas horrendas de pele marrom, quase como um couro, eles tem cabelos avermelhados e possuem membros longos e desajeitados. Medem em torno de 2m tendo uma postura curvada e ombros caídos. Seus olhos são esverdeados e brilham sob a escuridão, por causa de seus costumes de viver em cavernas e grutas subterrâneas eles possuem uma ótima visão noturna. Mas ainda existem os que se arriscam a montar acampamentos sob as luzes do sol e da lua. Eles vivem em grupos, são conhecidos por não terem muita capacidade cognitiva, se comunicam através de grunhidos e uma escrita rudimentar. São criaturas gananciosas e invejosas, famosos por saquear vilarejos e tribos humanóides para o acúmulo de suas riquezas. Por seu enorme apetite alguns se tornam ótimos caçadores, são carnívoros e comem desde coelhos até humanóides, eles desconhecem o medo enquanto famintos. São intimidadores e se lançam em combate sem hesitar, geralmente são acompanhados de um líder que além de curar os companheiros feridos organiza ataques e recuadas. Quando o líder é morto o bando fica desorientado e os trolls se comportam como animais selvagens. Texto criado por Melara Notaram que minha descrição é notavelmente baseada em minha pesquisa? Poderíamos ter inventado trolls totalmente diferentes do que vimos, mas já vos alerto que não é uma tarefa nada simples. Acredito que eu tenho conseguido agrupar todos as informações e expandi-las em coesão. Terceiro passo - hábitat Agora devemos pensar onde iremos colocá-los e de cara sabemos que são criaturas muito versáteis que se adaptam em diversos lugares, pois eles possuem diversas sub-raças (swamp trolls, island trolls, frost trolls...). Se forem usados os trolls comuns, podemos criar um local de clima temperado com alguns bosques, um local de fácil acomodação. Agora já podemos pesquisar sobre o clima temperado, florestas temperadas e a fauna deste local. Além disso temos de pensar que se eles não são criaturas com traços nômades, pois fixam moradia, então precisam estar perto de água potável e alguma fonte de alimentação, caso contrário não estariam vivos não é? Quarto passo - fazendo o mapa Já tendo pesquisado e estruturado todas estas informações nós podemos começar a fazer o mapa, tudo isso nos servirá como uma ótima base para iniciar o mapa. Sabemos segundo o que escrevi que são criaturas gananciosas que acumulam tesouros, vivem em pequenos grupos e normalmente possuem lideres. Logo já me vêm a mente diversas idéias, como: uma caverna com algumas galerias, nelas teriam pequenos agrupamentos em volta de fogueiras e uma grande sala cheia de tesouros vigiada por vários trolls estária encravada no fundo dessa caverna. Tenho até mesmo idéias para alguns sistemas diferenciados, mas isso não é um relato de minhas idéias, não é? Notem que estes passos foram apenas um mero exemplo, não significa que só nos planejamos para fazer algumas caves. Isso tudo pode e deve ser usado para criação do mapa todo em geral, isso só lhe auxiliará a tornar ainda mais coerente e envolvente todo o jogo. Um resumo de tudo isso, pesquise, crie, aprenda. Feito isso você terá milhares de idéias ao seu alcance e essas idéias já estarão organizadas. Leituras recomendadas Livro do Mestre 3.5 – Capítulo 5 – Criação de Mundo (Link: http://www.sendspace.com/file/rtxy4y) Artigo Oficial – Por trás dos Updates (Link: http://forums.tibiabr.com/showthread.php?t=159857) Artigo Oficial – Conceito de Área: Ice Islands (Link: http://forums.tibiabr.com/showthread.php?t=165594) Livros de D&D Rpg – Fórum (Link: http://livrosrpg.forumvila.com/livrosrpg.html) Todas as leituras citadas acima abordam de forma ainda mais aprofundanda o assunto deste tutorial, então, para um melhor entendimento do mesmo eles são de extrema ultilidade. Muito obrigado e façam bom uso do tutorial! Créditos: Melara
    2 pontos
  3. japavrb15

    Vip System

    axei ese tutorial em otro forum ... espero q funcione Creditos : -!Matheus!- link:http://forumonline.9forum.biz/t13-item-que-adiciona-vip-time Te Ajudei? REP ++
    2 pontos
  4. Vmspk

    [9.1] 4Fun Server

    4Fun Server Versão: 9.1 Distro: Crystal Server 1.5 Mapa Base: Vários Foi um edit rápido, 2 dias. Juntei algumas partes de mapas desconhecidos e algo do Azeroth. 2 amigos (ociosos =D) me ajudaram a importar algumas quests e editar o resto. Me disseram que os Ots 9.1 estavam muito ruins, talvez este possa ajudar. 4 Cidades: -> Celestia -> Theos -> Valmun -> Sandrina Mudanças/Conteúdo: Principais Quests: Imagens: Sistema de Guerras pelo Castelo [Honor Castle] Upgrade & Slot System ACC GOD: 222222/password Se acha que ter um OtServ é só baixar, abrir e largar lá, ou ainda editar chars e equipamentos para você mesmo jogar e fazer o que quiser, garanto-lhe que não vai durar 2 dias. Crie eventos, interaja com os jogadores, faça torneios Pvp, marque datas para a Honor Castle, faça updates no mapa, crie monstros, hunts e quests, dê suporte e, o mais importante, mantenha o HELP aberto, sempre. IpChanger 9.1 - Sources - Scan Download 4Fun Server Completo - [MEDIAFIRE] Créditos: Otmind/Kantera, Mistocalana, Mock, Majesty, Bruno0, Crystal Server Team, TFS Team, Coruja e Vmspk. Este tópico recebeu destaque em nosso portal!
    1 ponto
  5. Kydrai

    Vip System By Account V1.0

    Vip System by Account 1.0 By Kydrai Este é um vip system por account, ou seja, um sistema de vip válido para todos os characters de uma determinada conta. O script foi testado no TFS 0.3.6 - 8.54. E no site Gesior 0.3.4 beta4. Em caso de erros ou dúvidas é só postar. Funções do Script Função necessária para começar a usar o script: installVip() -> Cria a coluna no banco de dados para usar o sistema de vip (testei somente em sqlite, mas acredito que funcione em mysql) Funções que utilizam o account id: doTeleportPlayersByAccount(acc, topos) -> Teleporta todos os players da account getVipTimeByAccount(acc) -> Pega o tempo de vip setVipTimeByAccount(acc, time) -> Edita o tempo de vip getVipDaysByAccount(acc) -> Pega o tempo de vip em dias isVipAccount(acc) -> Verifica se é vip addVipDaysByAccount(acc, days) -> Adiciona dias de vip doRemoveVipDaysByAccount(acc, days) -> Remove dias de vip getVipDateByAccount(acc) -> Pega a data e hora que irá terminar a vip Funções que utilizam o creature id (cid): doTeleportPlayers(cid, topos) -> Teleporta todos os players da account getVipTime(cid) -> Pega o tempo de vip setVipTime(cid, time) -> Edita o tempo de vip getVipDays(cid) -> Pega o tempo de vip em dias isVip(cid) -> Verifica se é vip addVipDays(cid, days) -> Adiciona dias de vip doRemoveVipDays(cid, days) -> Remove dias de vip getVipDate(cid) -> Pega a data e hora que irá terminar a vip Inserindo as funções Abra a pasta data/lib, crie um arquivo lua e coloque: vipAccount.lua --[[ Name: Vip System by Account Version: 1.0 Author: Kydrai Forum: http://www.xtibia.com/forum/topic/136543-vip-system-by-account-v10/ [Functions] -- Install installVip() -- By Account doTeleportPlayersByAccount(acc, topos) getVipTimeByAccount(acc) setVipTimeByAccount(acc, time) getVipDaysByAccount(acc) isVipAccount(acc) addVipDaysByAccount(acc, days) doRemoveVipDaysByAccount(acc, days) getVipDateByAccount(acc) -- By Player doTeleportPlayers(cid, topos) getVipTime(cid) setVipTime(cid, time) getVipDays(cid) isVip(cid) addVipDays(cid, days) doRemoveVipDays(cid, days) getVipDate(cid) ]]-- -- Install function installVip() if db.executeQuery("ALTER TABLE `accounts` ADD viptime INT(15) NOT NULL DEFAULT 0;") then print("[Vip System] Vip System instalado com sucesso!") return TRUE end print("[Vip System] Não foi possível instalar o Vip System!") return FALSE end -- By Account function doTeleportPlayersByAccount(acc, topos) if db.executeQuery("UPDATE `players` SET `posx` = "..topos.x..", `posy` = "..topos.y..", `posz` = "..topos.z.." WHERE `account_id` = "..acc..";") then return TRUE end return FALSE end function getVipTimeByAccount(acc) local vip = db.getResult("SELECT `viptime` FROM `accounts` WHERE `id` = "..acc..";") if vip:getID() == -1 then print("[Vip System] Account not found!") return FALSE end return vip:getDataInt("viptime") end function setVipTimeByAccount(acc, time) if db.executeQuery("UPDATE `accounts` SET `viptime` = "..time.." WHERE `id` = "..acc..";") then return TRUE end return FALSE end function getVipDaysByAccount(acc) local vipTime = getVipTimeByAccount(acc) local timeNow = os.time() local days = math.ceil((vipTime - timeNow)/(24 * 60 * 60)) return days <= 0 and 0 or days end function isVipAccount(acc) return getVipDaysByAccount(acc) > 0 and TRUE or FALSE end function addVipDaysByAccount(acc, days) if days > 0 then local daysValue = days * 24 * 60 * 60 local vipTime = getVipTimeByAccount(acc) local timeNow = os.time() local time = getVipDaysByAccount(acc) == 0 and (timeNow + daysValue) or (vipTime + daysValue) setVipTimeByAccount(acc, time) return TRUE end return FALSE end function doRemoveVipDaysByAccount(acc, days) if days > 0 then local daysValue = days * 24 * 60 * 60 local vipTime = getVipTimeByAccount(acc) local time = vipTime - daysValue setVipTimeByAccount(acc, (time <= 0 and 1 or time)) return TRUE end return FALSE end function getVipDateByAccount(acc) if isVipAccount(acc) then local vipTime = getVipTimeByAccount(acc) return os.date("%d/%m/%y %X", vipTime) end return FALSE end -- By Player function doTeleportPlayers(cid, topos) doTeleportPlayersByAccount(getPlayerAccountId(cid), topos) end function getVipTime(cid) return getVipTimeByAccount(getPlayerAccountId(cid)) end function setVipTime(cid, time) return setVipTimeByAccount(getPlayerAccountId(cid), time) end function getVipDays(cid) return getVipDaysByAccount(getPlayerAccountId(cid)) end function isVip(cid) return isVipAccount(getPlayerAccountId(cid)) end function addVipDays(cid, days) return addVipDaysByAccount(getPlayerAccountId(cid), days) end function doRemoveVipDays(cid, days) return doRemoveVipDaysByAccount(getPlayerAccountId(cid), days) end function getVipDate(cid) return getVipDateByAccount(getPlayerAccountId(cid)) end Exemplos de uso Talkaction GOD: /installvip /addvip name, days /removevip name, days /checkvip name Player: /buyvip /vipdays talkactions.xml: <talkaction log="yes" access="5" words="/installvip;/addvip;/removevip;/checkvip" event="script" value="vipaccgod.lua"/> <talkaction words="/buyvip;/vipdays" event="script" value="vipaccplayer.lua"/> vipaccgod.lua: function onSay(cid, words, param, channel) local t = param:explode(",") local name, days = t[1], tonumber(t[2]) if words == "/installvip" then if installVip() then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Vip System instalado com sucesso!") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Não foi possível instalar o Vip System!") end elseif words == "/addvip" then if name then if days then local acc = getAccountIdByName(name) if acc ~= 0 then addVipDaysByAccount(acc, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você adicionou "..days.." dia(s) de vip ao "..name..", agora ele possui "..getVipDaysByAccount(acc).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar essa quantidade de dia(s) de vip.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar dia(s) de vip a este player.") end elseif words == "/removevip" then if name then if days then local acc = getAccountIdByName(name) if acc ~= 0 then doRemoveVipDaysByAccount(acc, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você retirou "..days.." dia(s) de vip do "..name..", agora ele possui "..getVipDaysByAccount(acc).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode retirar essa quantidade de dia(s) de vip.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode retirar dia(s) de vip a este player.") end elseif words == "/checkvip" then if name then local acc = getAccountIdByName(name) if acc ~= 0 then local duration = getVipDateByAccount(acc) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O "..name.." possui "..getVipDaysByAccount(acc).." dias de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode visualizar os dias de vip a este player.") end end return TRUE end vipaccplayer.lua: function onSay(cid, words, param, channel) if words == "/buyvip" then local price = 1000000 local days = 30 if doPlayerRemoveMoney(cid, price) then addVipDays(cid, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você adicionou "..days.." dia(s) de vip, agora você possui "..getVipDays(cid).." dia(s) de vip.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa de "..price.." para adicionar "..days.." dia(s) de vip.") end elseif words == "/vipdays" then local duration = getVipDate(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui "..getVipDays(cid).." dia(s) de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) end return TRUE end Movement (Tile) Coloque actionid 15000 em um tile onde somente os vips poderão passar. movements.xml: <movevent type="StepIn" actionid="15000" event="script" value="viptile.lua"/> viptile.lua: function onStepIn(cid, item, position, fromPosition) if isVip(cid) == FALSE then doTeleportThing(cid, fromPosition, false) doSendMagicEffect(position, CONST_ME_MAGIC_BLUE) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Somente players vip podem passar.") end return TRUE end Creaturescript (Login) Quando player logar irá verificar se a vip do player acabou, se sim então irá teleportar todos os players da account para o templo, se não irá mostrar o tempo da vip. creaturescripts.xml: <event type="login" name="viplogin" script="viplogin.lua"/> viplogin.lua: function onLogin(cid) local vip = isVip(cid) if getVipTime(cid) > 0 and vip == FALSE then local townid = 1 doPlayerSetTown(cid, townid) local templePos = getTownTemplePosition(getPlayerTown(cid)) doTeleportThing(cid, templePos, false) setVipTime(cid, 0) doTeleportPlayers(cid, templePos) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sua Vip acabou!") elseif vip == TRUE then local duration = getVipDate(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui "..getVipDays(cid).." dia(s) de vip."..(duration and (" Ela irá durar até "..duration..".") or "")) end return TRUE end Action (Door) Coloque actionid 15001 na door onde somente os vips poderão passar. Use a porta gate of expertise (id: 1227) actions.xml: <action actionid="15001" script="vipdoor.lua"/> vipdoor.lua: function onUse(cid, item, fromPosition, itemEx, toPosition) if isVip(cid) == FALSE then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Somente players vip podem passar.") elseif item.itemid == 1227 then doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition) end return TRUE end NPC (Vendedor de VIP) vipnpc.xml: <?xml version="1.0" encoding="UTF-8"?> <npc name="Vendedor de VIP" script="vipnpc.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="128" head="17" body="54" legs="114" feet="0" addons="2"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|, I sell {vip} days."/> </parameters> </npc> vipnpc.lua: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) 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 buyVip(cid, message, keywords, parameters, node) if(not npcHandler:isFocused(cid)) then return false end if doPlayerRemoveMoney(cid, parameters.price) then addVipDays(cid, parameters.days) npcHandler:say('Thanks, you buy '..parameters.days..' vip days. You have '..getVipDays(cid)..' vip days.', cid) else npcHandler:say('Sorry, you don\'t have enough money.', cid) end npcHandler:resetNpc() return true end local node1 = keywordHandler:addKeyword({'vip'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Do you want buy 30 vip days for 1000000 gp\'s?'}) node1:addChildKeyword({'yes'}, buyVip, {price = 1000000, days = 30}) node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Ok, then.', reset = true}) npcHandler:addModule(FocusModule:new()) Erros e Soluções Configurando o Gesior Com essa configuração irá aparecer o vip status do player no site e será possível vender vip pelo site. Se eu esqueci de alguma coisa é só avisar. accountmanagement.php Depois de: if(!$account_logged->isPremium()) $account_status = '<b><font color="red">Free Account</font></b>'; else $account_status = '<b><font color="green">Premium Account, '.$account_logged->getPremDays().' days left</font></b>'; Adicione: if(!$account_logged->isVip()) $account_vip_status = '<b><font color="red">Not Vip Account</font></b>'; else $account_vip_status = '<b><font color="green">Vip Account, '.$account_logged->getVipDays().' days left</font></b>'; Depois de: <td class="LabelV" >Account Status:</td><td>'.$account_status.'</td></tr><tr style="background-color:'.$config['site']['darkborder'].';" > Adicione: <td class="LabelV" >Account Vip Status:</td><td>'.$account_vip_status.'</td></tr><tr style="background-color:'.$config['site']['darkborder'].';" > pot/OTS_Account.php Substitua: private $data = array('email' => '', 'blocked' => false, 'rlname' => '','location' => '','page_access' => 0,'lastday' => 0,'premdays' => 0, 'created' => 0); Por: private $data = array('email' => '', 'blocked' => false, 'rlname' => '','location' => '','page_access' => 0,'lastday' => 0,'premdays' => 0, 'created' => 0, 'viptime' => 0); Substitua: $this->data = $this->db->query('SELECT ' . $this->db->fieldName('id') . ', ' . $this->db->fieldName('name') . ', ' . $this->db->fieldName('password') . ', ' . $this->db->fieldName('email') . ', ' . $this->db->fieldName('blocked') . ', ' . $this->db->fieldName('rlname') . ', ' . $this->db->fieldName('location') . ', ' . $this->db->fieldName('page_access') . ', ' . $this->db->fieldName('premdays') . ', ' . $this->db->fieldName('lastday') . ', ' . $this->db->fieldName('created') . ' FROM ' . $this->db->tableName('accounts') . ' WHERE ' . $this->db->fieldName('id') . ' = ' . (int) $id)->fetch(); Por: $this->data = $this->db->query('SELECT ' . $this->db->fieldName('id') . ', ' . $this->db->fieldName('name') . ', ' . $this->db->fieldName('password') . ', ' . $this->db->fieldName('email') . ', ' . $this->db->fieldName('blocked') . ', ' . $this->db->fieldName('rlname') . ', ' . $this->db->fieldName('location') . ', ' . $this->db->fieldName('page_access') . ', ' . $this->db->fieldName('premdays') . ', ' . $this->db->fieldName('viptime') . ', ' . $this->db->fieldName('lastday') . ', ' . $this->db->fieldName('created') . ' FROM ' . $this->db->tableName('accounts') . ' WHERE ' . $this->db->fieldName('id') . ' = ' . (int) $id)->fetch(); Substitua: $this->db->query('UPDATE ' . $this->db->tableName('accounts') . ' SET ' . $this->db->fieldName('password') . ' = ' . $this->db->quote($this->data['password']) . ', ' . $this->db->fieldName('email') . ' = ' . $this->db->quote($this->data['email']) . ', ' . $this->db->fieldName('blocked') . ' = ' . (int) $this->data['blocked'] . ', ' . $this->db->fieldName('rlname') . ' = ' . $this->db->quote($this->data['rlname']) . ', ' . $this->db->fieldName('location') . ' = ' . $this->db->quote($this->data['location']) . ', ' . $this->db->fieldName('page_access') . ' = ' . (int) $this->data['page_access'] . ', ' . $this->db->fieldName('premdays') . ' = ' . (int) $this->data['premdays'] . ', ' . $this->db->fieldName('lastday') . ' = ' . (int) $this->data['lastday'] . ' WHERE ' . $this->db->fieldName('id') . ' = ' . $this->data['id']); Por: $this->db->query('UPDATE ' . $this->db->tableName('accounts') . ' SET ' . $this->db->fieldName('password') . ' = ' . $this->db->quote($this->data['password']) . ', ' . $this->db->fieldName('email') . ' = ' . $this->db->quote($this->data['email']) . ', ' . $this->db->fieldName('blocked') . ' = ' . (int) $this->data['blocked'] . ', ' . $this->db->fieldName('rlname') . ' = ' . $this->db->quote($this->data['rlname']) . ', ' . $this->db->fieldName('location') . ' = ' . $this->db->quote($this->data['location']) . ', ' . $this->db->fieldName('page_access') . ' = ' . (int) $this->data['page_access'] . ', ' . $this->db->fieldName('premdays') . ' = ' . (int) $this->data['premdays'] . ', ' . $this->db->fieldName('viptime') . ' = ' . (int) $this->data['viptime'] . ', ' . $this->db->fieldName('lastday') . ' = ' . (int) $this->data['lastday'] . ' WHERE ' . $this->db->fieldName('id') . ' = ' . $this->data['id']); Depois de: public function getPremDays() { if( !isset($this->data['premdays']) || !isset($this->data['lastday']) ) { throw new E_OTS_NotLoaded(); } return $this->data['premdays'] - (date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->data['lastday']))) - date("z", $this->data['lastday'])); } Adicione: public function getVipDays() { if( !isset($this->data['viptime']) || !isset($this->data['lastday']) ) { throw new E_OTS_NotLoaded(); } return ceil(($this->data['viptime'] - time()) / (24*60*60)); } Depois de: public function isPremium() { return ($this->data['premdays'] - (date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->data['lastday']))) - date("z", $this->data['lastday'])) > 0); } Adicione: public function isVip() { return ceil(($this->data['viptime'] - time()) / (24*60*60)) > 0; } characters.php Substitua: if($config['site']['show_vip_status']) { $id = $player->getCustomField("id"); if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD WIDTH=10%>Vip Status:</TD>'; $vip = $SQL->query('SELECT * FROM player_storage WHERE player_id = '.$id.' AND `key` = '.$config['site']['show_vip_storage'].';')->fetch(); if($vip == false) { $main_content .= '<TD><span class="red"><B>NOT VIP</B></TD></TR>'; } else { $main_content .= '<TD><span class="green"><B>VIP</B></TD></TR>'; } $comment = $player->getComment(); $newlines = array("\r\n", "\n", "\r"); $comment_with_lines = str_replace($newlines, '<br />', $comment, $count); if($count < 50) $comment = $comment_with_lines; if(!empty($comment)) { if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD VALIGN=top>Comment:</TD><TD>'.$comment.'</TD></TR>'; } } Por: if($config['site']['show_vip_status']) { $id = $player->getCustomField("id"); if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD WIDTH=10%>Account Vip Status:</TD>'; if(!$account->isVip()) { $main_content .= '<TD><span class="red"><B>NOT VIP</B></TD></TR>'; } else { $main_content .= '<TD><span class="green"><B>VIP</B></TD></TR>'; } $comment = $player->getComment(); $newlines = array("\r\n", "\n", "\r"); $comment_with_lines = str_replace($newlines, '<br />', $comment, $count); if($count < 50) $comment = $comment_with_lines; if(!empty($comment)) { if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD VALIGN=top>Comment:</TD><TD>'.$comment.'</TD></TR>'; } } shopsystem.php (+Créditos ao GM Bekman) Substitua: if($buy_offer['type'] == 'pacc') { $player_premdays = $buy_player_account->getCustomField('premdays'); $player_lastlogin = $buy_player_account->getCustomField('lastday'); $save_transaction = 'INSERT INTO '.$SQL->tableName('z_shop_history_pacc').' (id, to_name, to_account, from_nick, from_account, price, pacc_days, trans_state, trans_start, trans_real) VALUES (NULL, '.$SQL->quote($buy_player->getName()).', '.$SQL->quote($buy_player_account->getId()).', '.$SQL->quote($buy_from).', '.$SQL->quote($account_logged->getId()).', '.$SQL->quote($buy_offer['points']).', '.$SQL->quote($buy_offer['days']).', \'realized\', '.$SQL->quote(time()).', '.$SQL->quote(time()).');'; $SQL->query($save_transaction); $buy_player_account->setCustomField('premdays', $player_premdays+$buy_offer['days']); $account_logged->setCustomField('premium_points', $user_premium_points-$buy_offer['points']); $user_premium_points = $user_premium_points - $buy_offer['points']; if($player_premdays == 0) { $buy_player_account->setCustomField('lastday', time()); } $main_content .= '<h2>PACC added!</h2><b>'.$buy_offer['days'].' days</b> of Premium Account added to account of player <b>'.$buy_player->getName().'</b> for <b>'.$buy_offer['points'].' premium points</b> from your account.<br />Now you have <b>'.$user_premium_points.' premium points</b>.<br /><a href="index.php?subtopic=shopsystem">GO TO MAIN SHOP SITE</a>'; } Por: if($buy_offer['type'] == 'pacc') { $player_viptime = $buy_player_account->getCustomField('viptime'); $player_lastlogin = $buy_player_account->getCustomField('lastday'); $save_transaction = 'INSERT INTO '.$SQL->tableName('z_shop_history_pacc').' (id, to_name, to_account, from_nick, from_account, price, pacc_days, trans_state, trans_start, trans_real) VALUES (NULL, '.$SQL->quote($buy_player->getName()).', '.$SQL->quote($buy_player_account->getId()).', '.$SQL->quote($buy_from).', '.$SQL->quote($account_logged->getId()).', '.$SQL->quote($buy_offer['points']).', '.$SQL->quote($buy_offer['days']).', \'realized\', '.$SQL->quote(time()).', '.$SQL->quote(time()).');'; $SQL->query($save_transaction); if($player_viptime > 0) $buy_player_account->setCustomField('viptime', $player_viptime + ($buy_offer['days'] * 24 * 60 * 60)); else $buy_player_account->setCustomField('viptime', time() + ($buy_offer['days'] * 24 * 60 * 60)); $account_logged->setCustomField('premium_points', $user_premium_points-$buy_offer['points']); $user_premium_points = $user_premium_points - $buy_offer['points']; if($player_viptime == 0) { $buy_player_account->setCustomField('lastday', time()); } $main_content .= '<h2>VIP Days added!</h2><b>'.$buy_offer['days'].' days</b> of Vip Account added to account of player <b>'.$buy_player->getName().'</b> for <b>'.$buy_offer['points'].' premium points</b> from your account.<br />Now you have <b>'.$user_premium_points.' premium points</b>.<br /><a href="index.php?subtopic=shopsystem">GO TO MAIN SHOP SITE</a>'; } Links Úteis 01- [Gesior Acc] Vendedo Vip Pelo Pacc Créditos: GM Bekman 02- Double Exp Para Vip Créditos: Vodkart 03- Outfits Só Para Jogadores Vips Créditos: Vodkart
    1 ponto
  6. Salve Xtibianos, Mais uma vez venho lhes mostrar um conteúdo de "Photoshop", depois de testes aprendi a fazer o logo do Pokémon, espero que curtam. Titulo: Fazendo o logo do Pokémon Autor: TonyHanks Nível: Fácil Ferramenta: Photoshop CS2 ou superior. Requisitos: Fonte do Pokémon http://www.dafont.com/pokemon.font 1- Primeiramente crie um documento 300x100 px, tamanho não obrigatório. 2- Escreva uma palavra e mude a cor dela para #ffcb05 e coloque a fonte para "Pokémon" aquela que você baixou acima. 3- Vá em "Layer>Layer Style" e abra o "Blending Options" e clique em "Drop Shadow" deixe-o assim: * O Azul que utilizei foi: #1d2c5e 4- Depois clique em "Inner Shadow" e deixe-o assim: A cor utilizada foi preta. 5- Depois clique em "Stroke" e deixe-o assim: * O Azul que utilizei foi: #306ab2 Resultado Final: Se não conseguiu fazer igual ao tutorial, CLIQUE AQUI PARA BAIXAR A PSD! Espero ter ajudado!
    1 ponto
  7. SubWin

    [8.6] Destruction Map V1.0

    FUI HACKIADO
    1 ponto
  8. E ae galera, eu estava pensando aqui pro War. E acabei fazendo por que uma magia iria dar 5 Reflect para uma pessoa. Entao o script funciona assim, ele reflete qualquer tipo de dano de acordo com a porcentagem que voce colocou, e se voce quiser colocar veses que ele vai refletir, eh muito facil colocar. Como utilizar? Primeiro precisamos de uma funçao que seta se vai refletir e quantas veses, ou nao:
    1 ponto
  9. drakylucas

    [Beta] Duel System V1.1

    bem bolado... não to mexendo + com pokemons porem irá ajudar muita gente =D rep+ [esse foi merecido, faz tempo q o xtibia nao tem scripts inovadores ;D]
    1 ponto
  10. victorvs

    [Vocation] Ajuda Por Favor {8.60}

    cara existe limite de vocations e como o seu serv tem vocations novas , entao nao á mais as vocations simples pelo q vejo exemplo sorcerer druid etc baixe outra vocation ou edite o que quiser nessas
    1 ponto
  11. yoroshigod

    Duvida Sobre Meu Client

    Cokee ,Tenta Assim 1 - Va em "Config.lua" E Aperte CTRL + F E escreva "mapName" 2 - Depois minimiza seu Config.Lua e va na pasta do seu server 8.70 , Va em data/world e olha o nome do seu mapa 8.70 3 - Substitui Nome do seu mapa 8.60 pelo o nome do mapa 8.70 Exemplo: (SO EXEMPLO NAO COPIE ISTO) (MapaName = Mapa8.60) Substitui por (MapaName =Mapa8.70) 4 - Depois de ter feito isso Feche e salve seu Config.lua 5 - Va na pasta do seu servidor 8.60 e va em data/world/ Copie o mapa do seu servidor 8.60 e cole na pasta world do seu servidor 8.70 Espero ter ajudado! Agora se nao der certo Fala aki! Para nao perder seus players Copie esses arquivos da seu servidor 8.60 - > .htaccess e forgottenserver.s3db e cole na pasta 8.70 do seu servidor! Substituindo! Espero ter ajudado novamente!
    1 ponto
  12. digo1040

    Global Drop E Premium Loot

    Tente colocar 100000 como chance de drop.
    1 ponto
  13. Quem nunca se deparou com o bendito do problema da Internet Compartilhada, onde se incluem também probleminhas como Routers, Rubs e Switchs. Essas belezinhas impedem agente de hospedar servidores tanto de Tibia como de outros jogos online também. Uma das explicações mais simples para isso é o bendito do IP gerado pelo Router/Rub/Switch, eles criam o seu próprio IP impidindo assim nós, pobres mortais, de hospedar nossos tão aclamados Open Tibia Servers! Agora trago ao XTibia em primeiríssima mão como faze-lo sem problemas. É simples e bem eficaz. Serve para todos os tipos aparelhos de compartilhamento! (de A-Z). Conceito de IP Os endereços IP são quatro conjuntos de números separados por pontos que permitem os computadores identificarem uns aos outros. Cada computador tem pelo menos um endereço IP, e dois computadores nunca devem ter o mesmo endereço IP. Se eles fizerem isso, nenhum deles será capaz de se conectar à Internet. Conceito de IP Estático e Dinâmico A maioria dos roteadores atribuem endereços IP dinâmicos por omissão. Eles fazem isto porque o endereço IP dinâmico de redes não exigem nenhuma configuração. O utilizador pode simplesmente ligar seu computador e sua rede irá funcionar. Quando os endereços IP são atribuídos de forma dinâmica, o router é que atribui um deles. Cada vez que um computador reinicializa ele pede para o router um endereço IP. O roteador então gera um endereço IP que já não tenha sido entregue a outro computador. Isto é importante para a nota. Quando você configurar seu computador para um endereço IP estático, o router não sabe que um computador está usando esse endereço IP. Portanto, o mesmo endereço IP pode ser entregue a outro computador mais tarde, e que irá impedir os computadores de se conectarem à Internet. Assim, quando você atribuir um endereço IP estático, é importante atribuir um endereço IP que não será entregue a outros computadores através do endereço IP dinâmico servidor. O endereço IP dinâmico servidor é geralmente referido como o servidor DHCP. dica: atribua à ultima casa numérica numeros de 10 à 254(máximo). PRIMEIRO PASSO (Descobrir/Criar o seu IP Estático) - Configurar um IP estático para o Windows Vista. 1.0 Abra o menu Iniciar e clique em Executar. Você deve ver agora a janela seguinte. 2.0 Digite cmd na caixa de texto, e clique em OK. 3.0 Os comandos podem aparecer de forma diferente na tela, mas isso realmente não interessa. Digite ipconfig /all na tela, em seguida, pressione a tecla Enter. Isto irá mostrar uma grande quantidade de informação. 4.0 Eu quero que você anote algumas das informações contidas nesta janela. Estabelecendo o endereço IP, Máscara, Gateway Padrão, e nomes de servidores. Certifique-se de constatar qual é qual. Vamos utilizar esta informação um pouco mais tarde. Estamos apenas preocupados com entradas IPv4, você pode ignorar as IPv6. 4.1 Digite quit nesta janela e, em seguida, pressione a tecla Enter para fechá-la. 5.0 Mais uma vez, abra o menu Iniciar. Desta vez clique em Painel de controle. 6.0 Dê Duplo clique em Centro de Rede e Compartilhamento. 7.0 Dê Único clique em Gerenciar Conexões de Rede, no lado esquerdo da tela. 8.0 Você pode ter várias ligações de rede nesta janela. Quero que dê um clique direito sobre o que você utiliza para se conectar à internet. Em seguida, clique em Propriedades. 8.1 Se você não tiver certeza de qual seja, dê um clique direito nele e clique em Desativar. Em seguida abra uma página na web. Será que ela vai abrir? Se não for possível, então você encontrou a sua ligação à Internet. Feche a janela do navegador. Vá em frente e dê um clique direito na conexão de rede novamente e clique em Ativar. Mais uma vez, abra um novo navegador. Você deverá ver uma página web. Feche a janela do navegador. (Caso não visualize a página web volte ao passo 8.1). Clique direito sobre a conexão de rede e clique em Propriedades na parte inferior. 9.0 Agora você deve ter exposto essa janela na sua tela. Clique no botão Propriedades para abrir a janela de propriedades desta ligação à Internet. 10.0 Selecione Protocolo TCP/IP Versão 4 (TCP/IPv4) e, em seguida, no botão Propriedades. Você verá a seguinte tela. 11.0 Antes de fazer quaisquer alterações, anote as configurações que você vê nesta página. Se algo der errado você pode alterar as configurações de volta para a que antes estavam! Você deverá ver um ponto no Obter um Endereço IP Automaticamente na caixa. Se não estiver marcado, sua conexão já está configurada para um IP estático. Basta fechar todas as janelas e está feito. 11.1 Escolha um endereço IP e inseria-o na caixa Endereço IP. O endereço IP que você escolher deverá ser muito semelhante ao do endereço IP do roteador. Apenas os últimos números do endereço IP devem ser diferentes. Se o endereço IP do roteador é 192.168.0.1, eu posso escolher 192.168.0.10. O endereço IP que você escolhe deve terminar com um número entre 1 e 254, e não deve ser o mesmo que o endereço IP do roteador. Cada dispositivo que conecta a sua rede precisa de ter seu próprio endereço IP. 11.2 Coloque a máscara na caixa Máscara de Sub-Rede, que já havia sido identificada no passo 4.0. O gateway padrão deve ir para a caixa Gateway Padrão, também identificado no passo 4.0. Digite os servidores de DNS encontrado na caixa Servidor DNS Preferencial/Alternativo. 11.3 Clique em OK, automaticamente saindo deste menu. Se você não conseguir abrir páginas web ou se conectar a internet, é mais provável que o problema esteja nas DNS digitadas. Você pode repara-las com seu ISP, entrando em contato com sua operadora Banda Larga. Eles serão capazes de dizer o que você deve usar imediatamente. É isso que deve ser feito! Se você não pode se conectar à internet, mude a configuração de volta ao que era originalmente. SEGUNDO PASSO (Configurando as Portas) No meu caso, tenho um D-LINK (DIR-100). Todos os modelos e fabricantes seguem o mesmo sistema, mais os passos podem variar um pouco, mais nada fora do comum. Caso tenha dificuldades em se localizar nos procedimentos a seguir, utilize o manual do fabricante juntamente com esse tutorial. 1.0 Abra um navegador da web como o Internet Explorer ou Google Chrome. Digite o endereço IP do seu router na barra de endereços do seu navegador. Por padrão o endereço IP deve ser definido como 192.168.0.1. 2.0 Você deverá ver uma caixa perguntar-lhe por seu nome de usuário e senha. Digite seu nome de usuário e senha agora. Por padrão o usuário é admin, e a senha é em branco. Clique no botão OK para efetuar login no seu router. 3.0 Clique no link Advanced perto do topo da página. 4.0 Vamos listar aqui uma série de linhas que irá mostrar-lhe exactamente como encaminhar as portas que você precisa para avançar. Open Tibia Server requer que você transmita a 7171 e 8000. Vá em frente e introduza as definições acima como demonstrado na Port Forwarding Rules menu(imagem). Em IP Adress introduza o seu IP Estático, adiquirido no PRIMEIRO PASSO. 5.0 Quando terminar, clique em Save Sttings na parte superior da tela para salvar suas alterações. Pronto, as portas estão desbloqueadas e devidamente configuradas. TERCEIRO PASSO (Liberando no Firewall a Porta 7171 e configurando o arquivo config.lua) 1.0 Desbloqueie a Porta 7171 no Firewall do Windows. 2.0 Acesse o arquivo config.lua na pasta de seu servidor e modifique o IP, substituindo pelo IP Dinâmico, que você pode identifica-lo Aqui . Pronto, agora é só esbanjar de seu servidor 100% hospedado em Internet Compartilhada. - Caso alguem queira conferir um server em Net Compartilhada segue o meu: theopera.servegame.com (8.50). ======= CREDITOS @Januska ======= Quatro horas foi o tempo que levei para reunir informações, organiza-las, transcreve-las e confeccionar as Screens, então peço sinceramente para não retirarem o Tutorial do seu lugar de Origem e muito menos retirar os créditos. Caso haja nescessidade de divulga-lo em outros forums, favor colocar os devidos créditos. Obrigado! Duvidas: Em relação as dúvidas, favor tirar no tópico! não estou mais atendendo via e-mail. Obrigado! Cya (Y). Edit Cause: Correção do nome do Tópico; Erros Ortográficos; Cores e Fontes.
    1 ponto
  14. colex

    Plastic Bomb

    PLASTIC BOMB BY COLEX Como funciona? O player faz use em uma Plastic Bomb (eu uso o item 4825), e ficará imóvel um certo tempo (default é 5 segundos) instalando a bomba, depois de a bomba estar instalada o player poderá mover-se e a bomba irá demorar um certo tempo para explodir (default 5 segundos). A explosão será causada numa área 3x3 em que o player que estiver no centro da explosão levará sempre os danos mais elevados possiveis e os outros players que estiverem à volta será aleatório entre os danos maiores e menores (os danos são definidos no inicio do script em MAX_HIT e MIN_HIT). 1º Passo: na pasta data/actions/scripts crie um novo arquivo com o nome bomb.lua e insira o seguinte texto dentro dele: ----------Plastic Bomb by Colex----------- local PLANTING_DELAY = 5 --seconds local EXPLOSION_DELAY = 5000 --milliseconds local MAX_HIT = 500 local MIN_HIT = 100 local PVP = true -- true for PVP, false for Non-PVP local PLAYERS = {} function isInArray(table, valor) for i,j in pairs(table) do if (j == valor) then return i end end return 0 end function explosion(info) area = { {0,0,0,0,0}, {0,1,1,1,0}, {0,1,1,1,0}, {0,1,1,1,0}, {0,0,0,0,0}, } hitpos = {x=info.pos.x, y=info.pos.y, z=info.pos.z, stackpos=253} center = {} center.y = math.floor(table.getn(area)/2)+1 for i in ipairs(area) do center.x = math.floor(table.getn(area[i])/2)+1 for j, v in ipairs(area[i]) do if (v == 1) then hitpos.x = info.pos.x + (j - center.x) hitpos.y = info.pos.y + (i - center.y) if (getTilePzInfo(hitpos) == 0) then victim = getThingfromPos(hitpos) effect = 4 if ((j == center.x) and (i == center.y)) then doSendAnimatedText(hitpos,"KABOOOOOM",TEXTCOLOR_RED) hitpoints = MAX_HIT effect = 5 else hitpoints = math.random(MIN_HIT,MAX_HIT) end if (isPlayer(victim.uid) == 1) then if (PVP == true) then doPlayerSendTextMessage(victim.uid,20,"You have lost "..hitpoints.." hitpoints by "..getPlayerName(info.player).."'s plastic bomb") else hitpoints = 0 end end if (isCreature(victim.uid) == 1) then doPlayerAddHealth(victim.uid,-hitpoints) end doSendMagicEffect(hitpos,effect) end end end end PLAYERS[isInArray(PLAYERS, info.player)] = 0 mayNotLogout(info.player, 0) return 1 end function planting(info) if info.num == PLANTING_DELAY then doPlayerSendTextMessage(info.player,22,"Plastic Bomb successfully planted!") mayNotMove(info.player,0) addEvent(explosion,EXPLOSION_DELAY,info) else info.num = info.num + 1 doPlayerSendTextMessage(info.player,22,info.num.."...") addEvent(planting,1000,info) end return 1 end function onUse(cid, item, frompos, item2, topos) position = getThingPos(item.uid) if (getTilePzInfo(position) == 0) then if (isInArray(PLAYERS, cid) == 0) then table.insert(PLAYERS, cid) doSendMagicEffect(frompos,3) info = {player = cid, pos = position, num = 1} doPlayerSendTextMessage(cid,22,"Planting the bomb...") doPlayerSendTextMessage(cid,22,"1...") mayNotMove(cid,1) mayNotLogout(cid, 1) doRemoveItem(item.uid,1) addEvent(planting,1000,info) else doPlayerSendCancel(cid,"You can only plant one bomb at the same time.") end else doPlayerSendCancel(cid,"You can not plant this bomb in a PZ!") end return 1 end 2º Passo: abra a pasta data/actions e adicione a seguinte linha dentro do arquivo actions.xml: <action itemid="4852" script="bomb.lua" /> Pronto! Sua plastic bomb deve estar funcional... Alguma dúvida? poste e eu tentarei ajuda-lo! (Esta action foi apenas testado em um server 8.0) Colex
    1 ponto
  15. trepados

    Temos Vagas De God 860

    <p> ola meus parceiros estou dilvugando meu server 860 subwat v:11 ip:subwat2012.servegame.com 860 ele é totalmente 24horas levei bani do otserverlisting si alguem me ajuda tira do bani eu dou god temos vagas de GOD SO APENAs 2 vagas 3 CM 3 GM 3 TUTOR para mais informacoes http://www.supertibia860.dahora.net/ msn de contato: alef_abm@hotmail.com si tiver area errada nao me da bani falou adm? "Eu estou proprociando Vida apos vida" 0
    -1 pontos
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...