Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. Oneshot

    Outfits

    Compartilhe mais da sua sabedoria, Beeki. Se você tivesse falado antes ou feito um tutorial igual, eu não teria que ficar lendo o outfits.cpp para fazer um desse tema. Seria muito interessante que você procure fazer a lição de casa antes de vir desmerecer o trabalho dos outros.
  2. Oneshot

    Duvida/pedido

    local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} local items = {12285, 12286, 12287} local staff = 12288 local storage = 88776 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 onGreetCallback(cid) local status = getCreatureStorage(cid, storage) if status == -1 then talkState[cid] = 0 npcHandler:setMessage(MESSAGE_GREET, "What do you want, |PLAYERNAME|?") elseif os.time() < status then npcHandler:setMessage(MESSAGE_GREET, "Wait more ".. math.ceil((status - os.time())/60) .." minutes, |PLAYERNAME|!") npcHandler:releaseFocus(cid) else npcHandler:setMessage(MESSAGE_GREET, "Here it is! The great ".. getItemNameById(staff) ..".") doPlayerAddItem(cid, staff, 1) doCreatureSetStorage(cid, storage, -1) end return true end function onCreatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end if msgcontains(msg, "staff") and talkState[cid] == 0 then npcHandler:say("So do you have the three pieces to create the staff?", cid) talkState[cid] = 1 end if talkState[cid] == 1 then if msgcontains(msg, "yes") then local match = true for _, item in ipairs(items) do if getPlayerItemById(cid, true, item).uid == 0 then match = false break end end if match == true then for _, item in ipairs(items) do doPlayerRemoveItem(cid, item, 1) end npcHandler:say("Alright! Come back in ten minutes and the staff shall be made.", cid) doCreatureSetStorage(cid, storage, os.time() + 600) else npcHandler:say("Sorry, but you don't have all the items I need.", cid) end elseif msgcontains(msg, "no") then npcHandler:say("Alright then.") talkState[cid] = 0 end end return true end npcHandler:setCallback(CALLBACK_GREET, onGreetCallback) npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, onCreatureSayCallback) npcHandler:addModule(FocusModule:new()) Sinta-se a vontade para traduzir. Não curto muito NPCs em português. Fiz ele com os dez minutos para dar o item.
  3. Estou trabalhando em uma atualização massiva desse sistema, melhorando muito o código, então qualquer erro será consertado em breve Abração.
  4. Oneshot

    Outfits

    OUTFITS Atributos e Configurações Olá, pessoal. Muitas pessoas não sabem, mas você pode adicionar vários bônus às outfits diretamente pelo outfits.xml, sem precisar de nenhum creaturescript que eventualmente possa dar lag em um servidor com muitos jogadores. Com este tutorial, você aprenderá a configurar vários tipos de bônus e até especificar se são necessários addons para ativar esses bônus. Para começar, vou colar abaixo o conteúdo de um outfits.xml do The Forgotten Server trunk.r3884 (0.4.0), vamos trabalhar em cima dele: <?xml version="1.0"?> <outfits> <outfit id="1"> <list gender="0" lookType="136" name="Citizen"/> <list gender="1" lookType="128" name="Citizen"/> </outfit> <outfit id="2"> <list gender="0" lookType="137" name="Hunter"/> <list gender="1" lookType="129" name="Hunter"/> </outfit> <outfit id="3"> <list gender="0" lookType="138" name="Mage"/> <list gender="1" lookType="130" name="Mage"/> </outfit> <outfit id="4"> <list gender="0" lookType="139" name="Knight"/> <list gender="1" lookType="131" name="Knight"/> </outfit> <outfit id="5" premium="yes"> <list gender="0" lookType="140" name="Noblewoman"/> <list gender="1" lookType="132" name="Nobleman"/> </outfit> <outfit id="6" premium="yes"> <list gender="0" lookType="141" name="Summoner"/> <list gender="1" lookType="133" name="Summoner"/> </outfit> <outfit id="7" premium="yes"> <list gender="0" lookType="142" name="Warrior"/> <list gender="1" lookType="134" name="Warrior"/> </outfit> <outfit id="8" premium="yes"> <list gender="0" lookType="147" name="Barbarian"/> <list gender="1" lookType="143" name="Barbarian"/> </outfit> <outfit id="9" premium="yes"> <list gender="0" lookType="148" name="Druid"/> <list gender="1" lookType="144" name="Druid"/> </outfit> <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard"/> <list gender="1" lookType="145" name="Wizard"/> </outfit> <outfit id="11" premium="yes"> <list gender="0" lookType="150" name="Oriental"/> <list gender="1" lookType="146" name="Oriental"/> </outfit> <outfit id="12" premium="yes" default="0"> <list gender="0" lookType="155" name="Pirate"/> <list gender="1" lookType="151" name="Pirate"/> </outfit> <outfit id="13" premium="yes" default="0"> <list gender="0" lookType="156" name="Assassin"/> <list gender="1" lookType="152" name="Assassin"/> </outfit> <outfit id="14" premium="yes" default="0"> <list gender="0" lookType="157" name="Beggar"/> <list gender="1" lookType="153" name="Beggar"/> </outfit> <outfit id="15" premium="yes" default="0"> <list gender="0" lookType="158" name="Shaman"/> <list gender="1" lookType="154" name="Shaman"/> </outfit> <outfit id="16" premium="yes" default="0"> <list gender="0" lookType="252" name="Norsewoman"/> <list gender="1" lookType="251" name="Norseman"/> </outfit> <outfit id="17" premium="yes" default="0"> <list gender="0" lookType="269" name="Nightmare"/> <list gender="1" lookType="268" name="Nightmare"/> </outfit> <outfit id="18" premium="yes" default="0"> <list gender="0" lookType="270" name="Jester"/> <list gender="1" lookType="273" name="Jester"/> </outfit> <outfit id="19" premium="yes" default="0"> <list gender="0" lookType="279" name="Brotherhood"/> <list gender="1" lookType="278" name="Brotherhood"/> </outfit> <outfit id="20" premium="yes" default="0"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> <outfit id="21" premium="yes" default="0"> <list gender="0" lookType="324" name="Yalaharian"/> <list gender="1" lookType="325" name="Yalaharian"/> </outfit> <outfit id="22" default="0"> <list gender="0" lookType="336" name="Warmaster"/> <list gender="1" lookType="335" name="Warmaster"/> </outfit> <outfit id="23" premium="yes" default="0"> <list gender="0" lookType="366" name="Wayfarer"/> <list gender="1" lookType="367" name="Wayfarer"/> </outfit> <outfit id="24" premium="yes" default="0"> <list gender="0" lookType="329" name="Wedding"/> <list gender="1" lookType="328" name="Wedding"/> </outfit> </outfits> [/code] [font=verdana,geneva,sans-serif]Existem diferentes tipos de atributos que você pode colocar na sua outfit, por exemplo, você pode colocar para quando um jogador estiver usando[b] X[/b] outfit, ele receba uma certa chance de refletir danos de um certo elemento. Vamos aprender abaixo a configuração de atributos do jogador.[/font] [font=verdana,geneva,sans-serif][hr][/font] [font=verdana,geneva,sans-serif]Para configurar atributos é muito simples, destacarei a outfit [b]Citizen[/b] para esse exemplo:[/font] <outfit id="1"> <list gender="0" lookType="136" name="Citizen"/> <list gender="1" lookType="128" name="Citizen"/> </outfit> Suponhamos que eu queira que quando um jogador estiver usando a outfit Citizen, ele receba speed +10 e recupere 30 de HP a cada 5 segundos, basta adicionar isso: <outfit id="1"> <list gender="0" lookType="136" name="Citizen" healthGain="30" healthTicks="5" speed="10" /> <list gender="1" lookType="128" name="Citizen" healthGain="30" healthTicks="5" speed="10" /> </outfit> Você pode diferenciar os tipos de bônus primários pelo sexo do jogador. Os bônus primários disponíveis são estes abaixo: manaShield invisible healthGain healthTicks manaGain manaTicks speed Agora existem bônus secundários que é necessária uma pequena edição na estrutura da configuração da outfit, vejamos abaixo: <outfit id="1"> <list gender="0" lookType="136" name="Citizen"/> <list gender="1" lookType="128" name="Citizen"/> </outfit> Estes bônus secundários variam desde pontos fixos em skills até chance de refletir algo ou absorver. Só que para que eles funcionem corretamente, você precisa "abrir" a configuração da outfit. Por exemplo, a outfit Citizen nos dará +50 de HPmáx e +1 em todas as skills de combate corporal. Vejamos: <outfit id="1"> <list gender="0" lookType="136" name="Citizen"> <stats maxHealth="50"/> <skills melee="1"/> </list> <list gender="1" lookType="128" name="Citizen"> <stats maxHealth="50"/> <skills melee="1"/> </list> </outfit> Veja que literalmente eu abri a outfit Citizen em sub-listas declarando atributos diferentes para elas, segue abaixo uma pequena lista de cada atributo e em que sub-lista ele deve ser declarado: stats maxHealth maxMana soul level magLevel || magicLevel maxHealthPercent maxManaPercent soulPercent levelPercent magLevelPercent || magicLevelPercent skills fist club sword axe distance || dist shielding || shield fishing || fish melee weapon fistPercent clubPercent swordPercent axePercent distancePercent || distPercent shieldingPercent || shieldPercent fishingPercent || fishPercent meleePercent weaponPercent || weaponsPercent Lembra que no começo desse tutorial, eu disse que era possível configurar chance de reflexão e absorção para as outfits? Pois é, é possível sim. Vamos pegar um exemplo diferente agora, a outfit Wizard. <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard"/> <list gender="1" lookType="145" name="Wizard"/> </outfit> Vamos dizer que a outfit Wizard com addons completos dará a chance de 10% de refletir 25% do dano feito por elementos (Fire, Earth, Ice, Energy). Para fazer isso, é o mesmo esquema de stats e skills, só que o nome da sub-lista deve ser reflect ou absorb. Dependendo do que você quer que a outfit faça, refletir ou absorver. <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard"> <reflect percentElements="25" chanceElements="10"/> </list> <list gender="1" lookType="145" name="Wizard"> <reflect percentElements="25" chanceElements="10"/> </list> </outfit> Veja abaixo a lista dos possíveis atributos para reflect e absorb: percentAll percentElements percentMagic percentEnergy percentFire percentPoison || percentEarth percentIce percentHoly percentDeath percentLifeDrain percentManaDrain percentDrown percentPhysical percentHealing percentUndefined chanceAll chanceElements chanceMagic chanceEnergy chanceFire chancePoison || chanceEarth chanceIce chanceHoly chanceDeath chanceLifeDrain chanceManaDrain chanceDrown chancePhysical chanceHealing chanceUndefined Por último, você pode definir quando esses bônus são dados, seja quando o jogador está utilizando o primeiro addon, o segundo, qualquer um dos dois ou ambos. O atributo para isso é requirement. <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard" requirement="any"> <reflect percentElements="25" chanceElements="10"/> </list> <list gender="1" lookType="145" name="Wizard" requirement="any"> <reflect percentElements="25" chanceElements="10"/> </list> </outfit> first second any both Existem alguns atributos que manipulam se o jogador pode usar a outfit, o mais conhecido deles é o premium que só permite o uso da outfit a jogadores premium. Mas muitos não conheçam os atributos quest, storageId e storageValue que torna possível dar outfits em quests, igual acontece no Tibia. Para isso, pegaremos qualquer outfit. <outfit id="20" premium="yes" default="0"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> Quando você usa o atributo quest com o valor igual a uma storage do servidor, a outfit só poderá ser usada se a storage tiver valor igual a 1. Por exemplo: <outfit id="20" premium="yes" quest="2005" default="0"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> Se a storage 2005 tiver valor igual a 1, então eu poderei usar a outfit Demonhunter. Mas e se eu estou trabalhando com uma grande quest que o valor final da storage é 3 e não 1? Por isso que existem os atributos storageId e storageValue. <outfit id="20" premium="yes" storageId="2005" storageValue="3" default="0"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> Bom, isso é tudo. Qualquer dúvida não deixe de postar no tópico. Abração \o/
  5. Olha, amigo, aconselho você a usar as conditions com suas limitações de dano fixo. Não há como fazer uma magia dessas sem escapar de erros como esses.
  6. Eu acho que o mesmo esforço que você faz para criar um tópico, dá para Pesquisar. http://www.xtibia.com/forum/topic/136543-vip-system-by-account-v10/
  7. Tenta isso: local damage = COMBAT_PHYSICALDAMAGE local effect = CONST_ME_DRAWBLOOD local animation = CONST_ANI_REDSTAR local rounds = 15 local delay = 3 * 1000 local condition = createConditionObject(CONDITION_BLEEDING) setConditionParam(condition, CONDITION_PARAM_SUBID, 307) local function doCombatCondition(cid, target, type, area, min, max, effect, rounds) if isCreature(target) then if getCreatureCondition(target, CONDITION_BLEEDING, 307) then doAreaCombatHealth((isCreature(cid) and cid or 0), type, getThingPosition(target), area, min, max, effect) if rounds > 0 then addEvent(doCombatCondition, delay, cid, target, type, area, min, max, effect, (rounds - 1)) end end end return true end function onCastSpell(cid, var) local formula_min = getPlayerLevel(cid) * 0.27 local formula_max = getPlayerLevel(cid) * 0.30 local target = variantToNumber(var) if getCreatureCondition(target, CONDITION_BLEEDING, 307) then return doPlayerSendCancel(cid, "Seu alvo já está sob efeito de Bleeding. Você não pode usar a magia.") end if getDistanceBetween(getThingPosition(target), getThingPosition(cid)) < 6 then doSendDistanceShoot(getThingPosition(cid), getThingPosition(target), animation) end addEvent(doCombatCondition, delay, cid, target, damage, 0, -formula_min, -formula_max, CONST_ME_DRAWBLOOD, rounds) return true end
  8. Sim, claro. function onLogin(cid) local gift = db.getResult("SELECT `prem_gift` FROM `accounts` WHERE `id` = ".. getPlayerAccountId(cid) ..";") if gift:getID() ~= -1 then local status = gift:getDataInt("prem_gift") if status == 0 then doPlayerAddPremiumDays(cid, 5) addEvent(function() if isCreature(cid) then doRemoveCreature(cid) end end, 2 * 1000) db.executeQuery("UPDATE `accounts` SET `prem_gift` = 1 WHERE `id` = ".. getPlayerAccountId(cid) ..";") end end return true end
  9. Igual o do Tibia, você nunca vai conseguir, aconselho procurar tutoriais do Neoncube que é usado em servidores de Ragnarok. Abraços.
  10. Simples, não existe CONDITION_PHYSICAL. Existem essas: CONDITION_NONE = 0 CONDITION_POISON = 1 CONDITION_FIRE = 2 CONDITION_ENERGY = 4 CONDITION_BLEEDING = 8 CONDITION_HASTE = 16 CONDITION_PARALYZE = 32 CONDITION_OUTFIT = 64 CONDITION_INVISIBLE = 128 CONDITION_LIGHT = 256 CONDITION_MANASHIELD = 512 CONDITION_INFIGHT = 1024 CONDITION_DRUNK = 2048 CONDITION_EXHAUST = 4096 CONDITION_FOOD = 8192 CONDITION_REGENERATION = 8192 CONDITION_SOUL = 16384 CONDITION_DROWN = 32768 CONDITION_MUTED = 65536 CONDITION_ATTRIBUTES = 131072 CONDITION_FREEZING = 262144 CONDITION_DAZZLED = 524288 CONDITION_CURSED = 1048576 CONDITION_PACIFIED = 2097152 CONDITION_GAMEMASTER = 4194304 CONDITION_HUNTING = 8388608
  11. O que acha de condensar todas as seções de Pedidos e Dúvidas em uma única chamada Suporte OTServ? Justamente porque agora existem prefixos, então o usuário poderia escolher entre "Servidor", "Scripts", "C++", "Mapa" e por aí vai. Acho que fica melhor.
  12. Oneshot

    Vip Days Left

    <talkaction words="/vipdays" event="script" value="nome_do_arquivo.lua"/>
  13. Oneshot

    Vip Days Left

    function onSay(cid, words, param, channel) local vipdays = math.ceil((getPlayerStorageValue(cid, 13595) - os.time())/86400) return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui ".. (vipdays > 0 and vipdays or "nenhum") .." dia(s) de VIP account.") end
  14. Oneshot

    Este Sou Eu

    Então é fake mesmo
  15. Você baixa o OT Item Editor para versão do seu servidor, abre o seu items.otb nele e criar IDs de itens lá, aí é só escolher o sid do item que você quer parecido e depois salvar seu items.otb editado e usar no seu servidor.
  16. Não, você tem que entrar no PHPMyAdmin, selecionar a database do seu servidor e então exportar ela para posterior importação em outro servidor.
  17. Eu faria de um jeito sem precisar de storages para você, pois com storages, você teria que "setar" o storage do alvo e não o do jogador.
  18. local config = { pz = true, exausted = 10, storage = 5487547, tps = { ["carlin"] = {x= 32360, y= 31782, z= 7}, ["thais"] = {x= 32346, y= 32220, z= 7}, ["barco carlin"] = {x= 32386, y= 31821, z= 6}, ["barco thais"] = {x= 32310, y= 32210, z= 6}, ["farmine"] = {x= 32985, y= 31540, z= 1}, ["yalahar"] = {x= 32794, y= 31248, z= 7}, ["edron"] = {x= 33171, y= 31815, z= 7}, ["trainer"] = {x= 31920, y= 32240, z= 9} } } function onSay(cid, words, param, channel) param = string.lower(param) if config.pz == true and getTilePzInfo(getCreaturePosition(cid)) == FALSE then doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você precisa estar em protection zone para teleportar.") return true elseif not isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Desculpe, você não é premium.") elseif (getPlayerStorageValue(cid, config.storage) >= os.time()) then doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Espere " .. getPlayerStorageValue(cid, config.storage) - os.time() .. " segundos para usar o fly novamente") return true elseif not config.tps[param] then doShowTextDialog(cid, 2160, "Palavras para !fly X: \ncarlin \nthais \nbarco carlin \nbarco thais \ntrainer \nfarmine \nedron \nyalahar") return true end doTeleportThing(cid, config.tps[param]) doSendMagicEffect(getPlayerPosition(cid), 10) setPlayerStorageValue(cid, config.storage, os.time()+config.exausted) return true end
  19. Certo, abra o seu banco de dados e execute a seguinte query. ALTER TABLE `accounts` ADD prem_gift INT NOT NULL DEFAULT 0 function onLogin(cid) local gift = db.getResult("SELECT `prem_gift` FROM `accounts` WHERE `id` = ".. getPlayerAccountId(cid) ..";") if gift:getID() ~= -1 then local status = gift:getDataInt("prem_gift") if status == 0 then doPlayerAddPremiumDays(cid, 5) db.executeQuery("UPDATE `accounts` SET `prem_gift` = 1 WHERE `id` = ".. getPlayerAccountId(cid) ..";") end end return true end A coluna prem_gift funcionará como um storage para a conta toda.
  20. É, essa é a única desvantagem, ele não vai diferenciar entre PMs e Default Channel. Compilei aqui para testar e funcionou certinho mesmo: [20/7/2012 22:2:22] Ei, sabe o Mário? [20/7/2012 22:2:51] Aquele que te comeu atrás do armário!!
  21. Tudo vai ser arquivado e você não precisará configurar nada, só compilar.
  22. Achei um modo mais limpo de fazer isso, requer uma pequena edição nas sources e você não vai precisar mais do creaturescript. Abra o game.cpp, procure por: #include "group.h" Abaixo, coloque: #include "textlogger.h" Procure por: Game::playerSay Dentro da função, encontre: switch(type) { case SPEAK_SAY: return internalCreatureSay(player, SPEAK_SAY, text, false); case SPEAK_WHISPER: return playerWhisper(player, text); case SPEAK_YELL: return playerYell(player, text); (...) Adicione acima de switch(type) Logger::getInstance()->eFile("players/" + player->getName() + ".log", text, true);
  23. Sim, mas é a mesma coisa do Colandus, só adicionei para executar o creatureevent no game.cpp.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...