-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
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.
-
Carnavotu, Há um modo simples de fazer isso funcionar, mas vou precisar da sua ajuda na edição de seu banco de dados com uma simples query. ALTER TABLE `accounts` ADD `gift_interval` INTEGER NOT NULL DEFAULT 0 Isso vai adicionar um campo de nome gift_interval que iremos usar. local config = { days = 1, interval = 3 * 24 * 60 * 60 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 os.time() >= getLastGiftTime(cid) then db.executeQuery("UPDATE `accounts` SET `gift_interval` = ".. os.time() + config.interval .." 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 Pronto, mudei o tipo do creaturescript para login, assim a cada três dias quando o jogador entrar ele receberá uma quantidade configurável de dias VIP. Então peço que você mude também lá no creaturescripts.xml. Onde estiver advance na chave que diz respeito a esse script, mude para login.
-
Pois é, fiz por isso mesmo. =P
-
Como eu não tinha nada pra fazer, fiz essa inútil função abaixo: function putkks(value) local e = 0 for _ in tostring(value):gmatch("000") do e = e + 1 end local n = value / 1000^e for i = 1, e do n = n .."k" end return n end Creio que não tem nenhuma utilidade, ela simplesmente faz isso: 1000000 -> 1kk Ela abrevia um grande número na gíria de jogos de RPG.
-
[ Resolvido ][Pedido] Se Matar Mc Perder 1 Lvl...
pergunta respondeu ao JumentoCuzaum de Oneshot em Scripts
Acho que não, andei testando essa query aqui e ao entrar no jogo, o campo experience é atualizado para o valor da experiência ao ter atingido o level. Ao criador do tópico, isso é um creaturescript, siga o mesmo procedimento de instalação passado acima. -
Nesse caso aí, Vilden, parece que é ainda pior. Um jogador com uma conta só cria vários personagens e ganha 1 (um) dia de VIP para cada.
-
[ Resolvido ][Pedido] Se Matar Mc Perder 1 Lvl...
pergunta respondeu ao JumentoCuzaum de Oneshot em Scripts
Acho que essa tentativa de adicionar pontos de experiência negativos foi uma teoria que não deu certo. Ou seja só com query. function onKill(cid, target) if isPlayer(cid) and isPlayer(target) then if getPlayerIp(cid) == getPlayerIp(target) then local pid, level = getPlayerGUID(cid), getPlayerLevel(cid) doRemoveCreature(cid) db.executeQuery("UPDATE `players` SET `level` = ".. level - 1 .." WHERE `id` = ".. pid ..";") end end return true end O jogador que matou o multiclient então será kickado e quando voltar a entrar no jogo, terá um level a menos. -
Não entendi. Você quer que a cada três dias, o código faça jogadores ganharem um dia de VIP ou que o código apresenta esse 'problema'?
-
Bom, acho que o modo mais fácil, seria, bem, usar essa função: setPromotionLevel(cid, 1) Abraços.
-
[ Resolvido ]Function Onstepin! (Dano E Slow)
pergunta respondeu ao othereality de Oneshot em Scripts
local condition = createConditionObject(CONDITION_PARALYZE) setConditionParam(condition, CONDITION_PARAM_TICKS, 1 * 1000) setConditionFormula(condition, -0.9, 0, -0.9, 0) function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) doAddCondition(cid, condition) return doAreaCombatHealth(0, COMBAT_ICEDAMAGE, getThingPosition(cid), 0, -150, -150, CONST_ME_ICEATTACK) end Pedi prum amg meu fazer proc abçs. -
ah n sabia disso kra ta aprovado então abçs
-
Só não é fake com plaquinha agora. Fazer o quê se a Silvana lançou a moda. ps: Quem sou eu para citar a mina do Pesszeroa, né?
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.