-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
Mude isso: CONDITION_PARAM_STAT_MAXHEALTHPERCENT Para isso: CONDITION_PARAM_STAT_MAXMANAPERCENT Att.
-
Crie um arquivo em data/movements/scripts com nome de teleporttown.lua. function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) return doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)) end <movevent type="StepIn" itemid="id do teleport" event="script" value="teleporttown.lua"/>
-
Mas esse aumento é temporário, certo? Se sim, basta fazer isso: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, 10 * 60 * 1000) setConditionParam(condition, CONDITION_PARAM_STAT_MAXHEALTHPERCENT, 150) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setCombatCondition(combat, condition) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Esse é um exemplo de magia que aumenta o HP máximo em 50% por 10 minutos. Um Knight que use a magia e possua 2000 HP, ficará com 3000 de HP por exemplo.
-
{Pedido} Quest Por Escolha Rep+ Quem Resolver
pergunta respondeu ao matheusfera de Oneshot em Scripts
Sinceramente... que sistema de quest, digamos, fraco e limitado. local quest = { [3333] = { [10511] = 1, [7409] = 1, [10073] = 1 } } function onUse(cid, item, fromPosition, itemEx, toPosition) local _quest = quest[item.actionid] if _quest then local prize = _quest[item.uid] if prize and getPlayerStorageValue(cid, item.actionid) ~= 1 then setPlayerStorageValue(cid, item.actionid, 1) doPlayerAddItem(cid, item.uid, prize) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você completou a quest do ".. getItemNameById(item.uid) ..".") else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "O baú está vazio.") end return true end end Coloque actionid 3333 nos baús e o uniqueid igual aos itens que serão dados nos baús. <action actionid="3333" event="script" value="questsys.lua"/> -
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) setCombatFormula(combat, COMBAT_FORMULA_DAMAGE, 1000, 0, 1000, 0) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Teste. Att.
-
Você deve estar, agora, estranhando um tópico meu na área de Pedidos/Dúvidas. Hoje acordei com vontade de criar sistemas em Lua, mas acontece que o velho Oneshot já não tem mais a mesma imaginação de anos atrás. Então criei este tópico com uma única finalidade, recolher ideias. Mas eu quero boas ideias e não que isto sirva como um tópico para concentrar quaisquer pedidos de script. Se você tiver uma boa ideia, basta vir aqui e descrever-la no tópico. Se você sonha, por exemplo, com um sistema que viu em outro servidor famoso, peça ele aqui também. Mas, claro, você deve descrever o sistema muito bem e, se puder, com um vídeo mostrando ele funcionando. Bom, isso é tudo. Att. Por ora, não me sinto interessado em sistemas de Pokémon.
-
Dá para fazer um Ressurrection literalmente com a função onPrepareDeath, se o jogador tiver um certo item, em vez de morrer, ganha uma segunda chance com 10% do HP por exemplo.
- 7 respostas
-
- resurrection
- creaturescripts
- (e 4 mais)
-
Eu preferi simplesmente por, em vez de quebrar e remover o item, "quebrar" e resetar o nível de refinamento.
-
local position = {x = 160, y = 50, z = 7} local control = 85214 local delay = 3 local function Sender(player) local result = getPlayerStorageValue(player.cid, control) doSendAnimatedText(getThingPosition(player.cid), result, math.random(256)) if result ~= 0 then doPlayerSendTextMessage(player.cid, MESSAGE_INFO_DESCR, "Teletransporte em ".. result .." segundos.") setPlayerStorageValue(player.cid, control, result - 1) addEvent(Sender, 1000, {cid = player.cid}) else doPlayerSendTextMessage(player.cid, MESSAGE_INFO_DESCR, "Teletransportado!") doTeleportThing(player.cid, position) doSendMagicEffect(getThingPosition(player.cid), CONST_ME_TELEPORT) end return true end function onUse(cid, item, fromPosition, itemEx, toPosition) if isPlayerPzLocked(cid) then return doPlayerSendCancel(cid, "O item só pode ser usado em Protection Zone.") end setPlayerStorageValue(cid, 85214, delay) addEvent(Sender, 0, {cid = cid}) return true end Tomei a liberdade de optimizar o código em questão. Att.
-
Certo, apresente mais informações. - Qual o sistema VIP que você utiliza?
-
Desculpe, fiz inúmeros testes antes de liberar o sistema e ele está totalmente funcional. Você pode comprovar isso assistindo o vídeo. Testei em duas revisões do TheForgottenServer 0.4.0_DEV: rev3884 e rev5639.
-
1 - ammo 2 - Sinceramente vocês acham que é só chegar aqui, criar um tópico, inventar um pedido mirabolante e esperar cair do céu.
-
Sistema disponível para uso em: http://www.xtibia.com/forum/topic/187075-perfect-refine-system-2/
-
Nome: Perfect Upgrade System Tipo: Biblioteca, Action, Sistema Autor: Oneshot Essa é a versão final do Perfect Refine System ou Perfect Upgrade System criado por mim. É um sistema construído em cima de funções em POO (orientação a objetos), o que o torna muito versátil, possibilitando a outros programadores/scripters criarem seus próprios sistemas com base na biblioteca. A função do sistema é simples. Não passa de um sistema de refino, presente em todos os servidores, onde você usa um item em um equipamento e este fica mais forte e ganha um nome caracterizando o nível de força - bem clichê - mas muito interessante. Meu sistema é um pouco diferente dos outros, pois possui algumas características exclusivas, listadas abaixo: O nível máximo configurável é praticamente ilimitado O sistema funciona com armas de combate corpo-a-corpo, bows e crossbows. O refino pode falhar, não acontecendo nada, regredindo o nível ou resetando ele. Há um sistema nativo de broadcasts, que são enviados quando um jogador consegue refinar um equipamento até um certo nível ou maior. As chances são configuradas manualmente e sua randomização é muito precisa. Há dois modos de instalar o sistema em seu servidor, o primeiro é baixar a pasta com os scripts necessários e apenas copiar as chaves nos arquivos XMLs ou então seguir o curto tutorial de instalação. Crie um arquivo chamado upgradesystem.lua na pasta data/lib e copie o conteúdo abaixo: --[[ PERFECT UPGRADE SYSTEM 2.0 Criado por Oneshot É proibido a venda ou a cópia sem os devidos créditos desse script. ]]-- UpgradeHandler = { levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true}, [11] = {10, true, true}, [12] = {5, true, true} }, broadcast = 7, attributes = { ["attack"] = 2, ["defense"] = 1, ["armor"] = 1 }, message = { console = "Trying to refine %s to level +%s with %s%% success rate.", success = "You have upgraded %s to level +%s", fail = "You have failed in upgrade of %s to level +%s", downgrade = "The upgrade level of %s has downgraded to +%s", erase = "The upgrade level of %s has been erased.", maxlevel = "The targeted %s is already on max upgrade level.", notupgradeable = "This item is not upgradeable.", broadcast = "The player %s was successful in upgrading %s to level +%s.\nCongratulations!!", invalidtool = "This is not a valid upgrade tool.", toolrange = "This upgrade tool can only be used in items with level between +%s and +%s" }, tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, }, isEquipment = function(self) local weaponType = self:getItemWeaponType() return ((weaponType > 0 and weaponType < 7) or self.item.armor ~= 0) end, setItemName = function(self, name) return doItemSetAttribute(self.item.uid, "name", name) end, chance = function(self) local chances = {} chances.upgrade = (self.levels[self.item.level + 1][1] or 100) chances.downgrade = (self.item.level * 5) chances.erase = (self.item.level * 3) return chances end } function UpgradeHandler:new(item) local obj, ret = {} obj.item = {} obj.item.level = 0 obj.item.uid = item.uid for key, value in pairs(getItemInfo(item.itemid)) do obj.item[key] = value end ret = setmetatable(obj, {__index = function(self, index) if _G[index] then return (setmetatable({callback = _G[index]}, {__call = function(self, ...) return self.callback(item.uid, ...) end})) else return UpgradeHandler[index] end end}) if ret:isEquipment() then ret:update() return ret end return false end function UpgradeHandler:update() self.item.level = (tonumber(self:getItemName():match("%+(%d+)")) or 0) end function UpgradeHandler:refine(uid, item) if not self.item then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.notupgradeable) return "miss" end local tool = self.tools[item.itemid] if(tool == nil) then doPlayerSendTextMessage(uid, MESSAGE_EVENT_DEFAULT, self.message.invalidtool) return "miss" end if(self.item.level > #self.levels) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.maxlevel:format(self.item.name)) return "miss" end if(self.item.level < tool.range[1] or self.item.level >= tool.range[2]) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.toolrange:format(unpack(tool.range))) return "miss" end local chance = (self:chance().upgrade + tool.info.chance) doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.console:format(self.item.name, (self.item.level + 1), math.min(100, chance))) if(tool.info.removeable == true) then doRemoveItem(item.uid, 1) end if chance * 100 > math.random(1, 10000) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_ORANGE, self.message.success:format(self.item.name, (self.item.level + 1))) if (self.item.level + 1) >= self.broadcast then doBroadcastMessage(self.message.broadcast:format(getCreatureName(uid), self.item.name, (self.item.level + 1))) end self:setItemName((self.item.level > 0 and self:getItemName():gsub("%+(%d+)", "+".. (self.item.level + 1)) or (self:getItemName() .." +1"))) for key, value in pairs(self.attributes) do if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then doItemSetAttribute(self.item.uid, key, (self.item.level > 0 and getItemAttribute(self.item.uid, key) or self.item[key]) + value) end end return "success" else if(self.levels[self.item.level][3] == true and (self:chance().erase * 100) > math.random(1, 10000)) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.erase:format(self.item.name)) self:setItemName(self.item.name) for key, value in pairs(self.attributes) do if self.item[key] > 0 then doItemSetAttribute(self.item.uid, key, self.item[key]) end end elseif(self.levels[self.item.level][2] == true and (self:chance().downgrade * 100) > math.random(1, 10000)) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.downgrade:format(self.item.name, (self.item.level - 1))) self:setItemName((self.item.level == 1 and self.item.name or self:getItemName():gsub("%+(%d+)", "+".. (self.item.level - 1)))) for key, value in pairs(self.attributes) do if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then doItemSetAttribute(self.item.uid, key, (self.item[key] + value * (self.item.level - 1))) end end else doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.fail:format(self.item.name, (self.item.level + 1))) end return "fail" end end Crie um arquivo chamado upgrade.lua em data/actions/scripts e cole o conteúdo abaixo: function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) end local obj = UpgradeHandler:new(itemEx) if(obj == false) then return doPlayerSendCancel(cid, UpgradeHandler.message.notupgradeable) end local status = obj:refine(cid, item) if status == "success" then --doSendAnimatedText(toPosition, "Success!", COLOR_GREEN) doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) elseif status == "fail" then --doSendAnimatedText(toPosition, "Fail!", COLOR_RED) doSendMagicEffect(toPosition, CONST_ME_POFF) else doSendMagicEffect(toPosition, CONST_ME_POFF) end return true end No arquivo actions.xml, cole a seguinte linha: <action itemid="8306" event="script" value="upgrade.lua"/> Para adicionar mais níveis de refino no sistema, edite a seguinte tabela: levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true} }, Por padrão, ela já está configurado como na maioria dos MMORPGs, 10 níveis de refino, com chances de sucesso, regressão e "quebra". Mas se você quiser, por exemplo, adicionar mais dois níveis, siga o modelo, sempre colocando uma vírgula no final com exceção da última linha da tabela: levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true}, [11] = {10, true, true}, [12] = {5, true, true} }, O primeiro valor é chance de sucesso, o segundo se o item pode regredir na tentativa e o terceiro é se o item para "quebrar" (perder todo o nível de refino). Para criar novas ferramentas (itens) de refinar, configure a tabela abaixo: tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, }, Seguindo o mesmo esquema da tabela anterior, vírgulas em todas as linhas com exceção da última, seguindo o modelo abaixo. Por exemplo, uma ferramenta de ID 8303 que refine do level +6 ao +10, que dê 10% de chance bônus e que seja finita, eu faço assim: tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, [8310] = {range = {6, 10}, info = {chance = 10, removeable = true}} }, Em breve vídeo de demonstração com sistema em funcionamento. Perfect Upgrade System.rar
-
Olá, pessoal do XTibia. Depois de fazer alguns scripts, atender alguns pedidos e sanar algumas dúvidas aqui na comunidade, não deixei de notar que a quantidade de pedidos nunca deixa de ser imensa. Eu venho da época do Open Tibia 7.8, uma época onde se você quisesse uma magia, você mesmo tinha que abrir algum script de uma magia existente e editar as coisas na sorte (Foi assim que editei uma UE com efeito de Death Strike) e entender como aquilo funcionava. Só devo a minha maldita curiosidade aos 12 anos de idade, o conhecimento que hoje possuo com Lua e C++ Venho notando que está surgindo um novo grupo de membros desde meados de 2011 que já não é mais igual aquele grupo de 2008, eles não possuem força de vontade para aprender a criar seus próprios scripts ou para criar seus próprios mapas. Eles só fazem criar tópicos em comunidades de Open Tibia e pedir, simplesmente pedir. Tudo eles querem na mão e ainda há um sub-grupo deles que acha que é obrigação alguém atender seus pedidos, mas isso deve ficar para outra discussão. Eles já não possuem aquela curiosidade essencial: "Hm, se eu pegar isso aqui e mexer nesse bagulho aqui, o que será que vai acontecer?" Eu gostaria de saber de vocês quais os motivos para a perda da força de vontade? É dificil aprender Lua? Ou é, na verdade, mal costume?
-
Certo, certo. Vou colocar disponível logo logo, só estou terminando algumas otimizações. A diferença da primeira versão (que não foi postada aqui no XTibia) são várias, enquanto o equipamento apenas falhava regredindo,nessa nova versão o equipamento pode falhar e não acontecer nada, regredir ou resetar totalmente. Estou deixando o código 100% configurável e vendo em outros RPGs o que eu posso trazer para o Open Tibia nesse quesito.
-
Bom, galera, não achei um lugar onde postar show-offs de Scripting. Segue abaixo a segunda versão que fiz do meu sistema de refino para servidores. Não achei músicas legais para colocar e é a primeira vez que mexo no Camtasia Studio, então ficou uma droga, se quiser veja sem áudio mesmo Em breve estarei postando aqui no XTibia. EDIT: Só uma pergunta, vocês preferem a interface do sistema em inglês ou português?
-
Certo, certo. Engraçado pessoas que querem cobrar VIP e ainda usam Account Manager. Mas tudo bem: local config = { days = 1, msg = "Você recebeu um presente de %s dia(s) de VIP.", msgtype = MESSAGE_INFO_DESCR } local function getLastGiftTime(cid) local result, ret = db.getResult("SELECT `gift_interval` FROM `accounts` WHERE `id` = ".. getPlayerAccountId(cid) ..";") if result:getID() == -1 then return false end ret = result:getDataInt("gift_interval") result:free() return ret end function onLogin(cid) if getCreatureName(cid) ~= "Account Manager" then if getLastGiftTime(cid) ~= 1 then db.executeQuery("UPDATE `accounts` SET `gift_interval` = 1 WHERE `id` = ".. getPlayerAccountId(cid) ..";") vip.addVipByAccount(getPlayerAccount(cid), vip.getDays(config.days)) doPlayerSendTextMessage(cid, config.msgtype, config.msg:format(config.days)) end end return true end
-
Ah entendo, você quer apenas que ganhe um dia de VIP e nunca mais. Então: local config = { days = 1, msg = "Você recebeu um presente de %s dia(s) de VIP.", msgtype = MESSAGE_INFO_DESCR } local function getLastGiftTime(cid) local result, ret = db.getResult("SELECT `gift_interval` FROM `accounts` WHERE `id` = ".. getPlayerAccountId(cid) ..";") if result:getID() == -1 then return false end ret = result:getDataInt("gift_interval") result:free() return ret end function onLogin(cid) if getLastGiftTime(cid) ~= 1 then db.executeQuery("UPDATE `accounts` SET `gift_interval` = 1 WHERE `id` = ".. getPlayerAccountId(cid) ..";") vip.addVipByAccount(getPlayerAccount(cid), vip.getDays(config.days)) doPlayerSendTextMessage(cid, config.msgtype, config.msg:format(config.days)) end return true end Me aproveitei do código passado acima.
-
Simples, No script de cada runa do servidor, você irá precisar fazer isso. local runa = 2268 local msg = "Coloque a %s na mão e então use seu encantamento." local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -60, -1, -60, 5, 5, 4, 7) function onCastSpell(cid, var) local left, right = getPlayerSlotItem(cid, CONST_SLOT_LEFT), getPlayerSlotItem(cid, CONST_SLOT_RIGHT) if isInArray({left.itemid, right.itemid}, runa) then return doCombat(cid, combat, var) else return doPlayerSendCancel(cid, msg:format(getItemNameById(runa))) end end Acima um simples exemplo de Sudden Death que só pode ser usada equipada em uma das mãos.
-
tonynamoral, Seu primeiro pedido não é possível, visto que as funções Lua que manipulam atributos de itens não possuem a capacidade de manipular os atributos de absorbPercentAll dente outros. Já seu segundo pedido, logo postarei um tópico no XTibia com um sistema de refinamento totalmente configurável. Att.
-
Auto-agrupamento de itens só com várias edições no código-fonte de um servidor. O máximo que você pode fazer são pequenas gambiarras na action de trocar o tipo de moeda. Creio que as revisões acima da rev3777 do projeto The Forgotten Server 0.4_DEV já possuem esse auto-agrupamento.
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.