Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. Isso sim dá para fazer. local damage = COMBAT_LIFEDRAIN local rounds = 15 local delay = 3 * 1000 local function doCombatCondition(cid, target, type, area, min, max, effect, rounds) if isCreature(target) then doAreaCombatHealth(cid, 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 return true end function onCastSpell(cid, var) local formula_min = getPlayerLevel(cid) local formula_max = getPlayerLevel(cid) * 2.5 + 32 local target = variantToNumber(var) addEvent(doCombatCondition, delay, cid, target, damage, 0, -formula_min, -formula_max, CONST_ME_DRAWBLOOD, rounds) return true end Tá aí algo que simula mais ou menos uma condição de dano com atraso em segundos e que você pode manipular o dano mínimo e máximo com fórmulas.
  2. Oneshot

    Guard

    Nome: Guard Tipo: NPC Autor: Oneshot Muitos devem conhecer o NPC Guard, que possui inteligência artificial e ataca jogadores que possuem skulls de servidores que baixam. Acontece que o script desse NPC foi programado apenas para um NPC só, então quando você tenta, por exemplo, ter dois Guards no servidor, se um está na cidade A e outro na cidade B e, por exemplo, o NPC da cidade A começa atacar um jogador, o NPC da cidade B se teleporta "magicamente" para a cidade A. Pensando nisso, resolvi otimizar todo o código, orientando ele a objetos. Isso faz com que cada NPC (objeto) tenha suas próprias variáveis e não compartilhem mais elas entre si. Em data/npc/lib, crie um arquivo chamado guard.lua e adicione o conteúdo abaixo: Guard = { config = { attackspeed = 1000, }, combat = {type = COMBAT_PHYSICALDAMAGE, min = 100, max = 200} } function Guard:new() local ret = {} setmetatable({}, {__index = self.combat}) setmetatable(ret, {__index = self}) return ret end function Guard:reset() self.config = Guard.config self.target = 0 selfFollow(0) doTeleportThing(self.id, self.position) end function Guard:updateTarget() if self.target ~= 0 then return end local creatures = getSpectators(getThingPosition(self.id), self.range, self.range, false) for i = 1, #creatures do local target = creatures[i] if isCreature(target) and not isNpc(target) and getCreatureSkull(target) >= 3 then if not getTilePzInfo(getThingPosition(target)) then if selfFollow(target) then selfSay("I don't tolerate people like you, ".. getCreatureName(target)) self.target = target self:attack() break end end else self:reset() end end end function Guard:attack() if self.target == 0 then self:reset() return end self.time = self.time or os.clock() if self.time < os.clock() then if getDistanceBetween(getThingPosition(self.id), getThingPosition(self.target)) == 1 then doTargetCombatHealth(self.id, self.target, self.combat.type, -self.combat.min, -self.combat.max, CONST_ME_DRAWBLOOD) end self.time = self.time + (self.config.attackspeed/1000) end end Agora em data/npc/scripts, crie um arquivo chamado guard.lua e adicione o conteúdo abaixo: local guard = Guard:new() function onCreatureAppear(cid) if cid == getNpcId() then guard.id = getNpcId() guard.target = 0 guard.position = getNpcPos() end end function onCreatureDisappear(cid) if cid == guard.target then guard:reset() end end function onCreatureSay(cid, type, msg) return false end function onThink() guard:updateTarget() if guard.target ~= 0 then if isCreature(guard.target) then guard:attack() else guard:reset() end else guard:reset() end end E em data/npc/ crie um arquivo chamado guard.xml e adicione o conteúdo abaixo: <?xml version="1.0" encoding="UTF-8"?> <npc name="Guard" script="guard.lua" walkinterval="0" speed="200" floorchange="0"> <health now="100" max="100"/> <look type="134" head="57" body="59" legs="40" feet="76" addons="0"/> <parameters/> </npc> Abraços \o
  3. Ótimo tutorial, embora eu não seja um adepto do Mapping. Obrigado por contribuir com este ótimo conteúdo. REP+
  4. local position = {x = 180, y = 90, z = 7} local stone = 1285 function onSay(cid, words, param, channel) local item = getTileItemById(position, stone) if(words == "/openmewtwo") then if(item.uid == 0) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "The Mewtwo's cave is already opened.") return true end doRemoveItem(item.uid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have opened the Mewtwo's cave.") elseif(words == "/closemewtwo") then if(item.uid > 0) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "The Mewtwo's cave is already closed.") return true end doCreateItem(stone, position) doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have closed the Mewtwo's cave.") end return true end
  5. Vou falar uma coisa que até foge um pouco do tema da discussão, acho que a maioria dos servidores cobra VIP mais pelo lucro sim. Mas notei que tem crescido uma massa de donos de servidores que só pensam nisso e não procuram nem saber como fazer o sistema VIP pro servidor deles, além de querer lucrar, querem tudo de mão beijada e se possível de graça. Sério, eu me recuso a programar scripts na seção de Pedidos e Dúvidas quando vejo coisas parecidas com: "é pra colocar no shop do meu servidor", "é um item que dá 30 dias vip pra colocar no shop". E tem muitos que ainda, na cara-de-pau, pedem: "Se possível manda por PM". Além de querer um script de graça, quer exclusividade? É por isso que acho que essa geração do Open Tibia brasileiro só pensa em lucro, é gananciosa, vegetativa e acomodada
  6. Não há como amigo, a função addDamageCondition é meio limitada e não existem callbacks para usar com conditions. Abraços.
  7. Oneshot

    Npc Complexo!

    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 onCreatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end if(msgcontains(msg, "skulls") or msgcontains(msg, "yes")) then if(doPlayerRemoveItem(cid, 2320, 2)) then npcHandler:say("Now that I have my precious skulls, I can tell you... The last time I heard of Kenam, he was living as a hidden fortress' emperor in Thais.", cid) doCreatureSetStorage(cid, 2304, 1) else npcHandler:say("You do not have any skulls! I need two of them.", cid) npcHandler:releaseFocus(cid) end end return true end npcHandler:setMessage(MESSAGE_GREET, "Hello |PLAYERNAME|, I liked your head's format. I really like {skulls}, if you bring me some of them, I can help you. Do you have any with you?") npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, onCreatureSayCallback) npcHandler:addModule(FocusModule:new()) 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 onGreetCallback(cid) if getPlayerStorageValue(cid, 2304) == 1 then npcHandler:setMessage(MESSAGE_GREET, "Hello, |PLAYERNAME|. I can {remove} your skull or battle.") talkState[cid] = 1 else npcHandler:setMessage(MESSAGE_GREET, "You do not have permission to talk with me.") npcHandler:releaseFocus(cid) end return true end function onCreatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end if(msgcontains(msg, "remove") and talkState[cid] == 1) then (...) -- INSERIR CÓDIGO MACARRÔNICO AQUI end return true end npcHandler:setCallback(CALLBACK_GREET, onGreetCallback) npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, onCreatureSayCallback) npcHandler:addModule(FocusModule:new()) Esta não é a seção de Pedidos e Dúvidas. Abraços.
  8. O atributo charges é bem diferente do atributo duration. Aconselho usar o segundo para o que você está tentando fazer, sendo o valor em segundos.
  9. Não, você é que está errado em não saber o que está falando. Os servidores giram em três tipos de banco de dados: SQLite, MySQL e PgSQL, embora eu nunca tenha visto o terceiro sendo usado. Não existe um que seja só SQL, então o criador do tópico ao pedir algo SQL provavelmente está pedindo um SQLite (aquele do arquivo .s3db) que é mais fácil de usar.
  10. Essa geração atual do Open Tibia é ao mesmo tempo acomodada, vegetativa e gananciosa.
  11. Oneshot

    Pedido Talkaction

    É uma bela sugestão, amigo. Se você quer exclusividade, aconselho pagar algum scripter para fazer isso. Talvez eu esteja desenvolvendo ela para toda a comunidade e postarei aqui no XTibia Um grande abraço.
  12. No arquivo XML do seu monstro, por exemplo, quero adicionar um Teddy Bear com ActionID 1000 <loot> <item id="2112" actionid="1000" chance="100000"/> </loot> Abraços.
  13. Fico pensando se pesquisar dói. [Gesior Acc] Guild War System Com Escudos Pule os passos sobre o site. E o executável que você estiver usando tem que ter sido compilado com o parâmetro abaixo. -D__WAR_SYSTEM__
  14. Olá, data/spells/scripts/wisdom growth.lua local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, 60 * 1000) setConditionParam(condition, CONDITION_PARAM_STAT_MAGICLEVELPERCENT, 110) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setCombatCondition(combat, condition) function onCastSpell(cid, var) return doCombat(cid, combat, var) end <instant name="Wisdom Growth" words="utito tempo vita" lvl="60" mana="600" prem="0" aggressive="0" selftarget="1" exhaustion="1000" needlearn="0" event="script" value="wisdom growth.lua"> <vocation id="5"/> <vocation id="6"/> </instant> data/spells/scripts/ethereal burst arrow.lua local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, true) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BURSTARROW) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 0, -25, 1.8, -50) local area = createCombatArea(AREA_SQUARE1X1) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end <instant name="Ethereal Burst Arrow" words="exori con flam" lvl="40" mana="55" prem="0" range="5" needtarget="1" exhaustion="2000" blockwalls="1" needlearn="0" event="script" value="ethereal burst arrow.lua"> <vocation id="3"/> <vocation id="7"/> </instant> data/spells/scripts/wall demolish.lua function onCastSpell(cid, var) local position = getCreatureLookPosition(cid) local item = getTileItemByType(position, ITEM_TYPE_MAGICFIELD) if item.uid > 0 and item.itemid == 1497 then doRemoveItem(item.uid) doSendMagicEffect(position, CONST_ME_PURPLEENERGY) return true else doPlayerSendCancel(cid, "There is not a magic wall in your path.") return false end end <instant name="Magic Demolish" words="exori vita hur" aggressive="0" lvl="34" mana="28" prem="0" exhaustion="2000" needlearn="0" event="script" value="wall demolish.lua"> <vocation id="4"/> <vocation id="8"/> </instant> data/spells/scripts/death wave.lua local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 5.4, 10.8) local area = createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end <instant name="Death Wave" words="exevo mort hur" lvl="38" mana="170" direction="1" exhaustion="2000" needlearn="0" event="script" value="death wave.lua"> <vocation id="1"/> <vocation id="5"/> </instant>
  15. Sim, deve funcionar. Creio que os nomes das classes e funções do 0.3 são iguais ao do 0.2
  16. Nome: onWriteToChannel(cid, channelId, text) Tipo: Código C++ Autor: Colandus, Oneshot (Adaptação 0.4 + Default Channel) Fala, galera. Esse é um código C++ que serve como add-on para o seu servidor, ele adiciona um novo tipo de função para os creaturescripts, que é executado toda vez que um jogador envia uma mensagem ao servidor. Foi criado por Colandus e estou trazendo ao XTibia por ser um código muito útil e interessante de se usar nos servidores. Lembrando que os passos abaixo devem ser seguidos em um IDE de sua preferência para posterior compilação. Em creatureevent.h, procure por: CREATURE_EVENT_CHANNEL_LEAVE, Adicione logo abaixo: CREATURE_EVENT_CHANNEL_WRITE, Ainda em creatureevent.h, procure por: uint32_t executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap); Adicione abaixo: uint32_t executeChannelWrite(Player* player, uint16_t channelId, std::string text); Agora em creaturescripts.cpp, logo abaixo de: else if(tmpStr == "joinchannel") m_type = CREATURE_EVENT_CHANNEL_JOIN; Adicione: else if(tmpStr == "writechannel") m_type = CREATURE_EVENT_CHANNEL_WRITE; Abaixo de: case CREATURE_EVENT_CHANNEL_LEAVE: return "onLeaveChannel"; Adicione: case CREATURE_EVENT_CHANNEL_WRITE: return "onWriteToChannel"; Abaixo de: case CREATURE_EVENT_CHANNEL_LEAVE: return "cid, channel, users"; Adicione: case CREATURE_EVENT_CHANNEL_WRITE: return "cid, channel, text"; Logo após o fim da função: uint32_t CreatureEvent::executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap) Adicione: uint32_t CreatureEvent::executeChannelWrite(Player* player, uint16_t channelId, std::string text) { //onWriteToChannel(cid, channel, text) if(m_scriptInterface->reserveScriptEnv()) { ScriptEnviroment* env = m_scriptInterface->getScriptEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local channel = " << channelId << std::endl; scriptstream << "local text = " << text << std::endl; scriptstream << m_scriptData; bool result = true; if(m_scriptInterface->loadBuffer(scriptstream.str()) != -1) { lua_State* L = m_scriptInterface->getLuaState(); result = m_scriptInterface->getGlobalBool(L, "_result", true); } m_scriptInterface->releaseScriptEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_scriptInterface); env->setRealPos(player->getPosition()); lua_State* L = m_scriptInterface->getLuaState(); m_scriptInterface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushnumber(L, channelId); lua_pushstring(L, text.c_str()); bool result = m_scriptInterface->callFunction(3); m_scriptInterface->releaseScriptEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeChannelWrite] Call stack overflow." << std::endl; return 0; } } 0.4 Em game.cpp, procure pela função: Game::playerSay Acima de: if(player->isAccountManager()) { if(mute) player->removeMessageBuffer(); return internalCreatureSay(player, SPEAK_SAY, text, false); } Adicione: CreatureEventList writeEvents = player->getCreatureEvents(CREATURE_EVENT_CHANNEL_WRITE); for(CreatureEventList::iterator it = writeEvents.begin(); it != writeEvents.end(); ++it) if(!(*it)->executeChannelWrite(player, channelId, text)) return true; Finalmente no chat.cpp, procure pela função: Chat::talkToChannel Acima de: if(channelId != CHANNEL_GUILD || !g_config.getBool(ConfigManager::INGAME_GUILD_MANAGEMENT) || (text[0] != '!' && text[0] != '/')) Adicione: CreatureEventList writeEvents = player->getCreatureEvents(CREATURE_EVENT_CHANNEL_WRITE); for(CreatureEventList::iterator it = writeEvents.begin(); it != writeEvents.end(); ++it) if(!(*it)->executeChannelWrite(player, channelId, text)) return true; Exemplo de Uso: function onWriteToChannel(cid, channelId, text) if text:lower():find(".servegame.com") then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "É proibido divulgar servidores aqui.") return false end return true end <event type="writechannel" name="WriteToChannel" event="script" value="writetochannel.lua"/> São várias as possibilidades de uso. Abraços.
  17. Fiz de cabeça, veja se funciona. local DOOR_LEVER = { [1945] = 1211 [1946] = 1212 } local DOOR_POSITION = {x = 0, y = 0, z = 7} function onUse(cid, item, fromPosition, itemEx, toPosition) if not DOOR_LEVER[item.itemid] then return false end local door = getTileItemById(DOOR_POSITION, DOOR_LEVER[item.itemid]) if door.uid > 0 then doTransformItem(door.uid, DOOR_LEVER[item.itemid]) end doTransformItem(item.uid, (item.itemid == 1945 and 1946 or 1945)) return true end <action uniqueid="28286" event="script" value="NOME_DO_SCRIPT.lua"/> Coloque uniqueid 28286 na alavanca. E MAIS ATENÇÃO DE PRÓXIMA VEZ, DÚVIDAS E PEDIDOS DESSE TIPO SÃO FEITOS AQUI: Pedidos e Dúvidas
  18. Oneshot

    Spell De Pular

    Versão do servidor?
  19. Oneshot

    Vip Por Item

    Em actions.xml <action itemid="ID_DO_ITEM" event="script" value="buyvipitem.lua"/> E o script você coloca na pasta data/actions/scripts em uma arquivo chamado buyvipitem.lua
  20. local config = { rewards = { {"money", 500}, {2157, 10} } } function onDeath(cid, corpse, lastHitKiller, mostDamageKiller) if isPlayer(lastHitKiller) then local reward = config.rewards[math.random(1, #config.rewards)] if type(reward[1]) == "number" then local item = doCreateItemEx(reward[1], reward[2]) if not item then return true end return doPlayerAddItemEx(lastHitKiller, item) end doPlayerAddMoney(lastHitKiller, reward[2]) doPlayerSendTextMessage(lastHitKiller, MESSAGE_STATUS_CONSOLE_ORANGE, "Você matou ".. getCreatureName(cid) .." e recebeu ".. (reward[1] == "money" and (reward[2] .." GPs") or (reward[2] .." ".. getItemNameById(reward[1]))) ..".") end return true end Você pode configurar recompensas em dinheiro ou itens. Deixei por padrão uma recompensa de 500 gps ou 10 gold nuggets. Abraços.
  21. Oneshot

    Vip Por Item

    Se seu sistema VIP é esse: Vip System By Account, então: local function getPlayerPremiumPoints(cid) local result, ret = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `id` = ".. getPlayerAccountId(cid) ..";") if(result:getID() == -1 then return false end ret = result:getDataInt("premium_points") result:free() return ret end local VIP_PRICE = 10 -- Quantidade de pontos. local VIP_DAYS = 30 -- Quantidade de dias a ser adicionada. function onUse(cid, item, fromPosition, itemEx, toPosition) if getPlayerPremiumPoints(cid) < VIP_PRICE then return doPlayerSendCancel(cid, "Você precisa de ".. VIP_PRICE .." premium points.") end addVipDays(cid, 30) db.executeQuery("UPDATE `accounts` SET `premium_points` = ".. getPlayerPremiumPoints(cid) - VIP_PRICE .." WHERE `id` = ".. getPlayerAccountId(cid) ..";") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você comprou ".. VIP_DAYS .." dias de VIP. Obrigado.") return true end Abraços.
  22. Vamos acabar com os males, em vez de apenas remediar. Poste por favor o erro que seu Zombie Event mostra no console.
  23. Filho da mãe
  24. Se você quiser, você pode fazer isso, disponibilizei o código justamente para ser estudado e editado a gosto. O meu sistema permanecerá assim. Um grande abraço. IRONIA
  25. Depende do seu servidor, muitos não disponibilizam sources, mas praticamente todos se baseiam nas revisões do The Forgotten Server. Deixo para você o link de download delas, você precisará ler tutoriais de compilação, pois isto não é um servidor, é apenas o código-fonte: Download Essa é a revisão 4322, versão 8.7, abraços.
  • Quem Está Navegando   0 membros estão online

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