-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
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
-
dúvida Trokar Efeito Quando O Enemy É Atingido Com Weapons!
pergunta respondeu ao kanxamatheus de Oneshot em Scripts
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.