-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
function onSay(cid, words, param, channel) if getPlayerLevel(cid) < 3500 then return doPlayerSendCancel(cid, "Você precisa de level 3500 para poder usar o comando.") end addEvent(function() if isCreature(cid) then local playerID = getPlayerGUID(cid) doPlayerAddItem(cid, 11192, 1) doRemoveCreature(cid) db.executeQuery("UPDATE `players` SET `level` = 8, `experience` = ".. getExperienceForLevel(8) .." ` WHERE `id` = ".. playerID ..";") db.executeQuery("UPDATE `players` SET `health` = 185, `healthmax` = 185, `mana` = 35, `manamax` = 35 WHERE `id` = ".. playerID ..";") end end, 3 * 1000) return true end
-
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.
-
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
-
Ótimo tutorial, embora eu não seja um adepto do Mapping. Obrigado por contribuir com este ótimo conteúdo. REP+
-
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
-
[Arquivado]VIP Em OTServers: Necessidade ou Lucro?
tópico respondeu ao dwhfms de Oneshot em Noticias - Arquivo
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 -
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.
-
action Wand Que Pode Ser Encantada !
tópico respondeu ao lukas13on de Oneshot em Actions e Talkactions
O atributo charges é bem diferente do atributo duration. Aconselho usar o segundo para o que você está tentando fazer, sendo o valor em segundos. -
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.
-
É 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.
-
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.
-
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__
-
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>
-
[Creaturescript] Onwritetochannel(Cid, Channelid, Text)
tópico respondeu ao Oneshot de Oneshot em Linguagens de Programação
Sim, deve funcionar. Creio que os nomes das classes e funções do 0.3 são iguais ao do 0.2 -
[Creaturescript] Onwritetochannel(Cid, Channelid, Text)
um tópico no fórum postou Oneshot Linguagens de Programação
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. -
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
-
Versão do servidor?
-
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
-
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.
-
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.
-
Vamos acabar com os males, em vez de apenas remediar. Poste por favor o erro que seu Zombie Event mostra no console.
-
Filho da mãe
-
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
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.
