Ir para conteúdo

Vodkart

Herói
  • Total de itens

    3406
  • Registro em

  • Última visita

  • Dias Ganhos

    112

Histórico de Reputação

  1. Upvote
    Vodkart recebeu reputação de guilherme Silva em Npc Auction   
    Versões: Foi feito para servidores que não tem o market system, mas funciona desde o 8.54 até 9.6+
     
    Suporta: servidores Sqlite e MySql
     
    Sobre: O Npc basicamente funciona da seguinte maneira, você "deposita" alguns items neste npc e durante "X" dias ele vende para você, claro que o npc irá cobrar "Y" preço pelo serviço...
     
    Para mais informações acessem o link que explica com imagens: http://www.xtibia.co...mo-auction-npc/
     
     
    Basta fazer o download, executar a query que é pedida e depois disso colocar os arquivos em seus respectivas pastas.
    Npc Auction.rar
  2. Upvote
    Vodkart recebeu reputação de M i s s em Bau que venha itens aleatorios? REP+   
    faltou usar o 'return' nas mensagens
     
     
    function onUse(cid, item, fromPosition, itemEx, toPosition) local config = { s = 11128, -- storage level = 50, -- level minimo time = 60, -- tempo em minutos para voltar a abrir a chest item = {{2160, 1},{2152, 25},{2148, 50} } -- items sortiados(pode adicionar mais) } if getPlayerLevel(cid) < config.level then return doPlayerSendCancel(cid, "Você deve ter pelo menos level ".. config.level .." para abrir a Chest.") elseif getPlayerStorageValue(cid, config.s) >= os.time() then local minutos = math.floor((getPlayerStorageValue(cid, config.s) - os.time())/(60)) return doPlayerSendCancel(cid, "Você deve esperar ".. (minutos < 0 and 0 or minutos) .." minutos para voltar a abrir o Bau.") end local r = math.random(1, #config.item) doPlayerAddItem(cid, config.item[r][1], config.item[r][2]) setPlayerStorageValue(cid, config.s, os.time()+config.time*60) return true end
  3. Upvote
    Vodkart recebeu reputação de Zaruss em [Gfs] Guild Frag System   
    Antes de mais nada execute essas querys no seu banco de dados

    ALTER TABLE `guilds` ADD `frags` INT(11) NOT NULL DEFAULT 0; ALTER TABLE `guilds` ADD `acesstime` INT(15) NOT NULL DEFAULT 0;
     
    Não sabe executar a query? abra o spoiler e aprenda!
     
     
     
     
     
    Sistema
     
     
     
     
     
    Por Mod
     
     
     
     
    Npc (obs: o NPC funciona caso você use MOD tbm)
     
     
     
     
     
     
    Configuração
     
     
  4. Upvote
    Vodkart deu reputação a Omega em Caçada ao Alvo   
    A pedido de um membro, vou postar esse evento que eu fiz aqui há bastante tempo já. Dei umas boas testadas na época, mas peço que postem os erros caso os encontrem.
     
    Informações
    A cada intervalo de tempo definido, o servidor escolhe automaticamente um alvo entre os jogadores online e anuncia (broadcast). Esse jogador se manterá como alvo por um período também configurável de tempo e, quando for morto, o jogador que o matar receberá itens definidos na configuração. O level mínimo e o grupo a que pode pertencer podem ser configurados. As opções incluem desabilitar o logout do alvo e forçar a escolha de um novo alvo caso o outro morra ou dê logout.  
    Códigos
    data/lib/targetlib.lua  
     
     
    data/creaturescripts/scripts/targetcreature.lua  
     
     
    data/globalevents/scripts/targetglobal.lua  
     
     
    Tags
    creaturescripts.xml <event type="kill" name="Target_Kill" event="script" value="targetcreature.lua"/> <event type="login" name="TargetLogin" event="script" value="targetcreature.lua"/> <event type="logout" name="TargetLogout" event="script" value="targetcreature.lua"/> globalevents.xml <globalevent name="Target System" interval="3600000" event="script" value="targetglobal.lua"/> Configuração
     
    Bom, ela é feita provavelmente só no arquivo targetlib.lua, mais precisamente nessa parte:
     
     
     
    A outra parte é que você pode restringir o dia e a hora em que o evento ocorrerá no arquivo targetglobal.lua:
    local dia = false -- Número do dia que o script será ativado [0-6 = doming-sábado] deixe false se quiser desativado local hora = false -- Hora de cada dia que esse script será ativado [0-23] Novamente, caso encontrem erros, digam qual é o erro e postem o que apareceu no executável ou apontem a parte do código que está dando erro.
  5. Upvote
    Vodkart recebeu reputação de ElorienSv em NPC que vende itens por Scarab coins   
    em items.xml troque

    <item id="2159" article="a" name="scarab coin" plural="scarab coins">
    <attribute key="weight" value="100" />
    </item>

    por

    <item id="2159" article="a" name="scarab coin" plural="scarab coins">
    <attribute key="weight" value="100"/>
    <attribute key="worth" value="10000"/>
    </item>
  6. Upvote
    Vodkart recebeu reputação de jefersonzc em NPC que vende itens por Scarab coins   
    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 creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local shopWindow = {} local moeda = 9020 -- ID da moeda local t = { [2195] = {price = 15}, -- [ITEM ID PARA VENDER] = {QNTO CUSTARÁ} [2493] = {price = 25}, [2361] = {price = 30}, [8851] = {price = 20}, [8925] = {price = 30}, [2640] = {price = 50}, [2494] = {price = 100}, [9932] = {price = 50}, [2472] = {price = 70}, [8931] = {price = 100} } local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks) if t[item] and not doPlayerRemoveItem(cid, moeda, t[item].price) then selfSay("you dont have"..t[item].price.." "..getItemNameById(moeda), cid) else doPlayerAddItem(cid, item) selfSay("Here your item!", cid) end return true end if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then for var, ret in pairs(t) do table.insert(shopWindow, {id = var, subType = 0, buy = ret.price, sell = 0, name = getItemNameById(var)}) end openShopWindow(cid, shopWindow, onBuy, onSell) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
  7. Upvote
    Vodkart recebeu reputação de jefersonzc em NPC que vende itens por Scarab coins   
    em items.xml troque

    <item id="2159" article="a" name="scarab coin" plural="scarab coins">
    <attribute key="weight" value="100" />
    </item>

    por

    <item id="2159" article="a" name="scarab coin" plural="scarab coins">
    <attribute key="weight" value="100"/>
    <attribute key="worth" value="10000"/>
    </item>
  8. Upvote
    Vodkart deu reputação a LuckOake em Vocation Weapon   
    Heeeeello Ékz, estou eu aqui novamente, mas agora de Colaborador
     
    Bom, fiz um script interessante, que pode oferecer um RPG maior para os servers. Funciona assim:
     

    Tem uma pedra (id 1234) no chão. - Se um kina pegar ela e equipar, a pedra vira uma sword - Se um pally pegar ela e equipar, a pedra vira uma spear - Se um druid pegar ela e equipar, a pedra vira uma rod - Se um sorc pegar ela e equipar, a pedra vira uma wand OBS: Você configura as vocations e os items, isto é apenas um exemplo.
     
    Script:
     
    movements.xml:

    <movevent type="Equip" itemid="1234" slot="hand" script="vocweapon.lua"/> <movevent type="DeEquip" itemid="1111;2222;3333;4444;5555;6666;7777;8888" slot="hand" script="vocweapon.lua"/>
     
    Edite o itemid="1294" no primeiro, no lugar coloque o ID do item de base (no exemplo citado, seria a pedra de id 1234).
    No segundo, edite o itemid="1111;2222;3333;4444;5555;6666;7777;8888", no lugar coloque o ID dos items que o item de base poderá transformar (no exemplo citado, seria a sword, a spear, a rod e a wand)
     
    vocweapon.lua:
     
     
    Configurações:

    local armas_tb = { [1] = 1111, [2] = 2222, [3] = 3333, [4] = 4444, [5] = 5555, [6] = 6666, [7] = 7777, [8] = 8888 }
     
    1 até 8 = ID das vocations (Você pode adicionar mais, basta lembrar de adicionar uma vírgula após cada vocation adicionada)
    1111 até 8888 = ID dos items em que o item de base irá se transformar (Adicione todos na tag onDeEquip)
     
    Também edite aqui:
     

    if item.actionid == 1234 then
     
    No lugar de 1234, coloque o ID do item de base.
     
    Créditos:

    LuckOake (Script) Demonbholder (Ajudas e correções)
     
    Obrigado, c'ya.
  9. Upvote
    Vodkart deu reputação a Omega em Talkaction que checa storage   
    function getRankStorage(cid, value, max, RankName) -- by vodka local str ="" str = "--[".. (RankName == nil and "RANK STORAGE" or ""..RankName.."") .."]--\n\n" local query = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = "..value.." ORDER BY cast(value as INTEGER) DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > max then break end str = str .. "\n " .. k .. ". "..getPlayerNameByGUID(query:getDataString("player_id")).." - [" .. query:getDataInt("value") + 1 .. "]" k = k + 1 until not query:next() end return doShowTextDialog(cid, 2529, str) end function onSay(cid, words, param) local storage,name = 10200, "Rank Test" return getRankStorage(cid, storage, 10, name) end Identação pra quê, né? =P
  10. Upvote
    Vodkart recebeu reputação de roriscrave em Talkaction que checa storage   
    function getRankStorage(cid, value, max, RankName) -- by vodka local str ="" str = "--[".. (RankName == nil and "RANK STORAGE" or ""..RankName.."") .."]--\n\n" local query = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = "..value.." ORDER BY cast(value as INTEGER) DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > max then break end str = str .. "\n " .. k .. ". "..getPlayerNameByGUID(query:getDataString("player_id")).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end return doShowTextDialog(cid, 2529, str) end function onSay(cid, words, param) local storage,name = 10200, "Rank Test" return getRankStorage(cid, storage, 10, name) end
  11. Upvote
    Vodkart recebeu reputação de warriorfrog em Comando SQL trocar todos vocação x pra vocação y   
    UPDATE players SET vocation = 1 WHERE vocation = 9; UPDATE players SET vocation = 1 WHERE vocation = 17; UPDATE players SET vocation = 1 WHERE vocation = 25; UPDATE players SET vocation = 2 WHERE vocation = 10; UPDATE players SET vocation = 2 WHERE vocation = 18; UPDATE players SET vocation = 2 WHERE vocation = 26; UPDATE players SET vocation = 3 WHERE vocation = 11; UPDATE players SET vocation = 3 WHERE vocation = 19; UPDATE players SET vocation = 3 WHERE vocation = 27; UPDATE players SET vocation = 4 WHERE vocation = 12; UPDATE players SET vocation = 4 WHERE vocation = 20; UPDATE players SET vocation = 4 WHERE vocation = 28;
  12. Upvote
    Vodkart recebeu reputação de Omega em NPC que vende itens por Scarab coins   
    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 creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local shopWindow = {} local moeda = 9020 -- ID da moeda local t = { [2195] = {price = 15}, -- [ITEM ID PARA VENDER] = {QNTO CUSTARÁ} [2493] = {price = 25}, [2361] = {price = 30}, [8851] = {price = 20}, [8925] = {price = 30}, [2640] = {price = 50}, [2494] = {price = 100}, [9932] = {price = 50}, [2472] = {price = 70}, [8931] = {price = 100} } local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks) if t[item] and not doPlayerRemoveItem(cid, moeda, t[item].price) then selfSay("you dont have"..t[item].price.." "..getItemNameById(moeda), cid) else doPlayerAddItem(cid, item) selfSay("Here your item!", cid) end return true end if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then for var, ret in pairs(t) do table.insert(shopWindow, {id = var, subType = 0, buy = ret.price, sell = 0, name = getItemNameById(var)}) end openShopWindow(cid, shopWindow, onBuy, onSell) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
  13. Upvote
    Vodkart recebeu reputação de Hamachine em Guild frags system   
    data/movements/scripts
     
    guildfragtile.lua
    function onStepIn(cid, item, position, fromPosition) local MyGuild = getPlayerGuildName(cid) if not HaveGuild(cid) or not HaveAcess(MyGuild) then doPlayerSendTextMessage(cid,22,"Your guild no has access to this area.") doTeleportThing(cid, fromPosition, true) doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE) return true end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"Welcome,The access of your guild in this area ends in "..getAcessDate(getGuildWinnerName())) return true end movements.xml <movevent type="StepIn" actionid="15710" event="script" value="guildfragtile.lua"/> ai no tile coloca ACTION ID 15710
  14. Upvote
    Vodkart deu reputação a Oneshot em Oneshot Spell Lib   
    Oneshot Spell Lib

    Boa tarde, meus queridos.
     
    Como eu disse no último post do tópico do Spell Forge, sim, ele estava ficando funcional o bastante, mas uma coisa não me agradava, o nível de dificuldade de configuração do sistema estava aumentando, e uma hora, não teria como OT-admins usarem meu sistema, pois não saberiam configurar.
     
    Então resolvi parar o desenvolvimento dele por enquanto, mas segue minha biblioteca que estava usando para desenvolvimento do sistema.
     
    Uma biblioteca completa para desenvolvimento de magias, orientada a objetos, torna a coisa bem mais interessante.
     
    Para utilizar minha biblioteca, basta criar arquivo com qualquer nome na pasta data/lib do seu servidor e colar o seguinte conteúdo abaixo:
    -- This library is part of Oneshot Spell System -- Copyright (C) 2013 Oneshot -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. -- constant CONST_SPELL_AREA = 0 -- area spells, like exevo gran mas vis CONST_SPELL_DIRECTION = 1 -- wave spells, like exevo flam hur CONST_SPELL_TARGETORDIRECTION = 2 -- mix between area and wave spells WEAPON_SKILLS = { [WEAPON_SWORD] = SKILL_SWORD, [WEAPON_CLUB] = SKILL_CLUB, [WEAPON_AXE] = SKILL_AXE, } -- class for combats (spell instances) Combat = { type = 0, me = 0, ani = 0, formula = { type = 0, values = {}, }, condition = nil, delay = 0, id = 0, } function Combat:New(_type, me, ani, delay, id) local new_spellinstance = { type = _type or COMBAT_NONE, me = me or CONST_ME_NONE, ani = ani or CONST_ANI_NONE, formula = { type = COMBAT_FORMULA_UNDEFINED, values = {0, 0, 0, 0, 0, 0, 0, 0}, }, condition = nil, delay = delay or -1, id = id or 1, } return setmetatable(new_spellinstance, {__index = self}) end function Combat:SetType(_type) self.type = (tonumber(_type) and _type or COMBAT_NONE) end function Combat:SetEffect(me) self.me = (tonumber(me) and me or CONST_ME_NONE) end function Combat:SetDistanceEffect(ani) self.ani = (tonumber(ani) and ani or CONST_ANI_NONE) end function Combat:SetFormula(_type, ...) local args = select("#", ...) self.formula.type = (tonumber(_type and _type or COMBAT_FORMULA_UNDEFINED)) local minc, maxc if args > 8 then minc, maxc = select(9, ...) end local minm, maxm = getConfigValue("formulaMagic") or 1 maxm = minm local minl, maxl = getConfigValue("formulaLevel") or 5 maxl = minl if args > 6 then minm, maxm = select(7, ...) end if args > 4 then minl, maxl = select(5, ...) end local mina, minb, maxa, maxb = select(1, ...) self.formula.values = {mina, minb, maxa, maxb, minl, maxl, minm, maxm, minc, maxc} end function Combat:SetCondition(condition) -- condition needs to be a createConditionObject(), e.g -- local condition = createConditionObject(CONDITION_FIRE) -- setConditionParam(condition, CONDITION_PARAM_TICKS, 1 * 1000) self.condition = condition end function Combat:GetDelay() return self.delay end function Combat:SetDelay(delay) self.delay = (tonumber(delay) and delay or -1) end function Combat:GetId() return self.id end function Combat:SetId(id) self.id = (tonumber(id) and id or 1) end function Combat:getMinMaxValues(cid, ex) local min, max = 0, 0 local n = self.formula.values if not isCreature(cid) then return false end if not isPlayer(cid) then self.formula.type = COMBAT_FORMULA_DAMAGE end if self.formula.type == COMBAT_FORMULA_LEVELMAGIC then min = (getPlayerLevel(cid) / n[5] + getPlayerMagLevel(cid) * n[7]) * n[1] + n[2] max = (getPlayerLevel(cid) / n[6] + getPlayerMagLevel(cid) * n[8]) * n[3] + n[4] if n[9] then min = math.max(n[9], min) end if n[10] then max = math.max(n[10], max) end elseif self.formula.type == COMBAT_FORMULA_SKILL then local weapon = getPlayerWeapon(cid) if weapon.uid > 0 then max = getPlayerWeaponDamage(cid, weapon) * n[3] + n[4] else max = n[4] end if n[10] then max = math.max(n[10], max) end elseif self.formula.type == COMBAT_FORMULA_DAMAGE then min = n[2] max = n[4] end return min, max end function Combat:Callback(position, cid, ex) if not isCreature(cid) then return false end local min, max = self:getMinMaxValues(cid, ex) doCombatAreaHealth(cid, self.type, position, 0, min, max, self.me) if self.condition then doCombatAreaCondition(cid, position, 0, self.condition, CONST_ME_NONE) end return true end -- class for spells Spell = { type = 0, level = 0, maglevel = 0, mana = 0, needtarget = false, target_or_direction = false, range = 0, needweapon = false, selftarget = false, vocations = {}, combats = {}, } function Spell:New(_type, level, maglevel, mana, needtarget, range, needweapon, selftarget, ...) local new_spell = { type = _type or CONST_SPELL_AREA, level = level or 1, maglevel = maglevel or 0, mana = mana or 0, needtarget = needtarget or false, range = range or 1, needweapon = needweapon or false, selftarget = selftarget or false, vocations = {...}, combat = {}, area = {{3}}, } return setmetatable(new_spell, {__index = self}) end function Spell:SetType(_type) self.type = (tonumber(_type) and _type or CONST_SPELLarea) end function Spell:SetLevel(level) self.level = (tonumber(level) and level or 1) end function Spell:SetMagLevel(maglevel) self.maglevel = (tonumber(maglevel) and maglevel or 0) end function Spell:SetMana(mana) self.mana = (tonumber(mana) and mana or 0) end function Spell:SetNeedTarget(needtarget) self.needtarget = (type(needtarget) == "boolean" and needtarget or false) end function Spell:SetRange(range) self.range = (tonumber(range) and range or 1) end function Spell:SetNeedWeapon(needweapon) self.needweapon = (type(needweapon) == "boolean" and needweapon or false) end function Spell:SetSelfTarget(selftarget) self.selftarget = (type(selftarget) == "boolean" and selftarget or false) end function Spell:SetVocations(...) self.vocations = {...} end function Spell:Append(...) local t = {...} for i = 1, #t do self.combat[t[i]:GetId()] = t[i] end end function Spell:SetArea(area) self.area = area end function Spell:Cast(cid) if not isCreature(cid) then return false end if #self.combat == 0 then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false end if isPlayer(cid) then if not getPlayerFlagValue(cid, PLAYERFLAG_IGNORESPELLCHECK) then if getPlayerLevel(cid) < self.level then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHLEVEL) return false end if getCreatureMana(cid) < self.mana then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHMANA) return false end if getPlayerMagLevel(cid) < self.maglevel then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHMAGICLEVEL) return false end if self.needweapon and (getPlayerWeapon(cid).uid == 0) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUNEEDAWEAPONTOUSETHISSPELL) return false end local vocation = getPlayerVocation(cid) if #self.vocations > 0 and not (table.find(self.vocations, vocation) or table.find(self.vocations, getVocationInfo(vocation).fromVocation)) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOURVOCATIONCANNOTUSETHISSPELL) return false end end end local target = getCreatureTarget(cid) if self.needtarget == true then if self.type == CONST_SPELL_DIRECTION then self.type = CONST_SPELL_TARGETORDIRECTION elseif self.type == CONST_SPELL_AREA and not isCreature(target) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUCANONLYUSEITONCREATURES) return false end end if self.range and isCreature(target) then if getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(target)) > self.range then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_TOOFARAWAY) return false end end local area = self.area if self.type == CONST_SPELL_DIRECTION or (self.type == CONST_SPELL_TARGETORDIRECTION and not isCreature(target)) then area = getAreaByDir(area, getCreatureLookDirection(cid)) end local centre = getCreaturePosition(cid) local target = getCreatureTarget(cid) if self.type == CONST_SPELL_DIRECTION then centre = getPosByDir(getCreaturePosition(cid), getCreatureLookDirection(cid), 1) elseif self.type == CONST_SPELL_TARGETORDIRECTION then centre = (isCreature(target) and getCreaturePosition(target) or getPosByDir(getCreaturePosition(cid), getCreatureLookDirection(cid), 1)) elseif self.type == CONST_SPELL_AREA then if self.needtarget and isCreature(target) then centre = getCreaturePosition(target) end end local positions = getAreaPositions(area, centre) for i = 1, #area do for j = 1, #area[i] do local tmp = area[i][j] if tmp == 3 then for k = 1, #self.combat do local combat = self.combat[k] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end end elseif type(tmp) == "number" and self.combat[tmp] then local combat = self.combat[tmp] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end elseif type(tmp) == "table" then for k = 1, #tmp do local tile = tmp[k] local combat = self.combat[tile] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end end end end end if self.mana > 0 then doCreatureAddMana(cid, -self.mana, 0) end return true end function rotate(area) local ret = {} for i = 1, #area do for j = 1, #area[i] do if not ret[#area[i]-j+1] then ret[#area[i]-j+1] = {} end ret[#area[i]-j+1][i] = area[i][j] end end return ret end function getAreaByDir(area, direction) local ret = area if direction > NORTH then local n = (4 - direction) repeat ret = rotate(ret) n = n - 1 until n == 0 end return ret end function getAreaCentre(area) local x, y = 0, 0 for i = 1, #area do for j = 1, #area[i] do if area[i][j] == 3 then x = j y = i break end end end return x, y end function getAreaPositions(area, centre) local ret = {} local x, y = getAreaCentre(area) for i = 1, #area do for j = 1, #area[i] do if not ret[i] then ret[i] = {} end ret[i][j] = {x = centre.x + (j - x), y = centre.y + (i - y), z = centre.z} end end return ret end function getPlayerMeleeDamage(cid, item) local skill, attack if item.uid > 0 then local info = getItemInfo(item.itemid) skill = getPlayerSkillLevel(cid, WEAPON_SKILLS[getItemWeaponType(item.uid)]) attack = ((getItemAttribute(item.uid, "attack") or info.attack) + (getItemAttribute(item.uid, "extraAttack") or info.extraAttack) - info.abilities.elementDamage) else skill = getPlayerSkillLevel(cid, SKILL_FIST) attack = 0 end local damage = math.ceil((2 * (attack * (skill + 5.8) / 25 + (getPlayerLevel(cid) - 1) / 10.)) / getPlayerAttackFactor(cid)) return -math.random(0, damage) end function getPlayerAttackFactor(cid) local switch = { 1.0, 1.2, 2.0, } return switch[(getPlayerModes(cid).fight + 1)] end dofile(getDataDir() .."/spells/lib/spells.lua") É uma biblioteca orientada a objetos que facilita o desenvolvimento de magias. Comparando a forma dos scripts de magias, com a minha biblioteca e sem, podemos ver a diferença.
     
    Sem a biblioteca:
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4.5, 9) local area = createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Com a biblioteca:
    local combat = Combat:New(COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA, CONST_ANI_ENERGY) combat:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 4.5, 9) local spell = Spell:New(CONST_SPELL_DIRECTION) spell:Append(combat) spell:SetArea(AREA_WAVE4) function onCastSpell(cid, var) return spell:Cast(cid) end Mas o melhor mesmo é notado quando você quer desenvolver as magias com mais de uma variável combat. Aquelas magias de múltiplos hits e efeitos.
     
    Vou pegar uma magia de 3 efeitos e danos diferentes.
    local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setAttackFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4.5, 9) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE) setAttackFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 1, 2) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_SMALLPLANTS) setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EARTH) setAttackFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 3.5, 7) local area = createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5) setCombatArea(combat1, area) setCombatArea(combat2, area) setCombatArea(combat3, area) function onCastSpell1(cid, var) doCombat(cid, combat1, var) end function onCastSpell2(cid, var) doCombat(cid, combat2, var) end function onCastSpell3(cid, var) doCombat(cid, combat3, var) end function onCastSpell(cid, var) onCastSpell1(cid, var) addEvent(onCastSpell2, 300, cid, var) addEvent(onCastSpell3, 600, cid, var) return true end Com o uso da minha biblioteca, podemos notar a redução de linhas, e a limpeza do código:
    local combat1 = Combat:New(COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA, CONST_ANI_ENERGY) combat1:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 4.5, 9) local combat2 = Combat:New(COMBAT_ICEDAMAGE, CONST_ME_ICEAREA, CONST_ANI_ICE) combat2:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 1, 2) combat2:SetId(2) combat2:SetDelay(300) local combat3 = Combat:New(COMBAT_EARTHDAMAGE, CONST_ME_SMALLPLANTS, CONST_ANI_EARTH) combat3:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 3.5, 7) combat3:SetId(4) combat3:SetDelay(600) local T = {1, 2, 4} local area = { {T, T, T}, {T, T, T}, {T, T, T}, {0, T, 0}, {0, 3, 0}, } local spell = Spell:New(CONST_SPELL_DIRECTION) spell:SetArea(area) spell:Append(combat1, combat2, combat3) function onCastSpell(cid, var) return spell:Cast(cid) end Qualquer dúvida quanto ao uso da biblioteca no desenvolvimento de magias, basta postar neste tópico que estarei esclarecendo.
     
     
    Grande Abraço,
    Oneshot.
  15. Upvote
    Vodkart recebeu reputação de OriGM em Função isDruid,isSorcerer etc é source?   
    É NA LIB, USADO isInArray ainda k
     
    dá pra criar outra função colocando o id da nova voc
     
    ta ae
     
     
    function isDruid(cid) return isInArray({2,6}, getPlayerVocation(cid)) and true or false end
  16. Upvote
    Vodkart recebeu reputação de Omega em Função isDruid,isSorcerer etc é source?   
    É NA LIB, USADO isInArray ainda k
     
    dá pra criar outra função colocando o id da nova voc
     
    ta ae
     
     
    function isDruid(cid) return isInArray({2,6}, getPlayerVocation(cid)) and true or false end
  17. Upvote
    Vodkart recebeu reputação de gustavo3754 em Outfit Por Vocation   
    existe, e é isso que o script que eu te passei faz, ele adiciona storage...
     

    function onLogin(cid) -- voc e outfit local x = { [1] = 50, -- sorc [2] = 60, -- druid [3] = 70, -- paladin [4] = 80, -- kina [5] = 90, -- master sorc [6] = 100, -- elder druid [7] = 200, -- royal paladin [8] = 195 -- elite kina } if (not x[getPlayerVocation(cid)]) then return true end doSetCreatureOutfit(cid, {lookType = x[getPlayerVocation(cid)]}, -1) return TRUE end
     
    [2] = 60, -- druid
     
    [iD DA VOC] = LOOKTYPE que vai se transformar
  18. Upvote
    Vodkart recebeu reputação de AncientGhastlyD em Báu/alavanca/npc Que Troca Vip Coin Por Items   
    Alavancas e báus
     
     
     
     
     
     
    Npc's
     
     
  19. Upvote
    Vodkart recebeu reputação de davidjohson em Porta entrada event tile   
    claro amigo, era só para colocar 2 POS, você acabou colocando 3 POS quando se tem só duas variáveis....
     
    está aqui amg:
     
    function onStepIn(cid, item, position, fromPosition) if getPlayerLevel(cid) < 50 then doTeleportThing(cid, fromPosition) doPlayerSendCancel(cid, "You need level 50, your level is "..getPlayerLevel(cid)..".") return true end function checkpos(cid) local from, to = {x=152, y=47, z=6}, {x=154, y=47, z=6} -- pos começo e final dos tiles que não poderá ficar parado if not isCreature(cid) then return LUA_ERROR end if isInRange(getCreaturePosition(cid), from, to) then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) end end addEvent(checkpos, 10000, cid) return true end
  20. Upvote
    Vodkart deu reputação a Omega em Comando /ban   
    Bom, tava testando uma coisa e lembrei que não tinha mais comando /ban para players em OTs 8.6. Então resolvi tentar fazer o meu próprio. Eis o resultado:
     
    Como funciona:
     
    Opções: Você pode usar !ban playername para banir sem registrar o motivo e por tempo indeterminado Você pode usar !ban playername,dias para banir sem registrar o motivo, mas por um número determinado de dias Você pode usar !ban playername,motivo para banir por tempo indeterminado, mas registrando um motivo Você pode usar !ban playername,dias,motivo para banir por tempo e motivo determinados Quando o jogador banido tentar entrar, ele será teletransportado para o tempo, não poderá se mexer nem falar e receberá a seguinte mensagem: 'Voce esta banido e sera kickado em 5 segundos.' --> isso se não houver motivo registrado 'Voce foi banido por -motivo- e sera kickado em 5 segundos.' --> se houver motivo registrado Independente da opção, o jogador é kickado e ocorre o descrito acima quando ele tenta se conectar nas 5 primeiras vezes. Depois ele não poderá mais se conectar ao servidor com ele personagem.
    Você só pode banir players online
    Você pode desbanir qualquer jogador com !unban playername (online ou offline)
     
    Instalando:
     
    1 - Crie um arquivo na pasta lib com extensão .lua e adicione:
     


    2 - Em seguida, vá em talkactions.xml e adicione
    <talkaction log="yes" access="4" words="!ban;!unban" event="script" value="ban.lua"/> Obs.: O !ban;!unban no lugar de /ban se deve ao fato de muitos servidores apresentarem o comando /unban
     
    3 - Agora, adicione esse script na sua pasta talkactions/scripts com o nome de ban.lua
     
     
     
     
    4 - Agora adicione essa tag em creaturescripts.xml
    <event type="login" name="Ban" event="script" value="banned.lua"/> 5 - Finalmente, esse código em um arquivo dentro de creaturescripts/scripts com o nome de banned.lua
     
     
     
    Fiz vários testes aqui e me parece que está tudo certo, mas recomendo testar com um jogador de teste antes em usar em jogadores reais.
    Por mais óbvio que pareça, espero comentários/dúvidas ou sugestões sobre o código.
  21. Upvote
    Vodkart recebeu reputação de davidjohson em Porta entrada event tile   
    function onStepIn(cid, item, position, fromPosition) if getPlayerLevel(cid) < 50 then doTeleportThing(cid, fromPosition) doPlayerSendCancel(cid, "You need level 50, your level is "..getPlayerLevel(cid)..".") return true end function checkpos(cid) local from, to = {x=160, y=54, z=7}, {x=165, y=55, z=7} -- pos começo e final dos tiles que não poderá ficar parado if not isCreature(cid) then return LUA_ERROR end if isInRange(getCreaturePosition(cid), from, to) then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) end end addEvent(checkpos, 10000, cid) return true end
  22. Upvote
    Vodkart deu reputação a LuckOake em Auto Loot Money   
    Vi que muitos voltaram, principalmente meu mestre Oneshot, então voltei também. Não sei se voltei pra ficar ativo, mas de qualquer maneira, vou quebrar o gelo e postar um sistema depois de mais de um semestre inativo no fórum.
     
    Sinceramente, a qualidade da seção de scripting caiu consideravelmente. Chega a dar vergonha ver como está andando atualmente em comparação à época de novembro/dezembro do ano passado até fevereiro desse ano, em que deu aqueles problemas. São poucas as coisas que aparecem aqui que realmente são bem feitas. Bom, de qualquer maneira, fazer o quê se a maioria dos membros não consegue ver isso, deixemos rolar e tentemos restaurar o que era, né.
     
    Voltando ao tópico, trouxe pra vocês um sisteminha que funciona como um autoloot, porém, ele looteia apenas money e envia ele direto pra backpack ou direto para o banco do player (configurável), cobrando uma porcentagem do dinheiro looteado como troca pelo serviço. Exemplo, looteou 10 gold coins, cobra 10% (1 gold coin), dando pro player 9 gold coins no total.
     
    Scripts:
    Configurando:
    Para usar o sistema, use o comando /autoloot. Créditos: - Luck Oake  
  23. Upvote
    Vodkart deu reputação a Omega em Npc Auction   
    Muito maneiro o sistema. Parabéns pelo trabalho e obrigado por divulgar.
     
    Tópico destacado em 10/10/13
  24. Upvote
    Vodkart recebeu reputação de Martelix em Npc Auction   
    Versões: Foi feito para servidores que não tem o market system, mas funciona desde o 8.54 até 9.6+
     
    Suporta: servidores Sqlite e MySql
     
    Sobre: O Npc basicamente funciona da seguinte maneira, você "deposita" alguns items neste npc e durante "X" dias ele vende para você, claro que o npc irá cobrar "Y" preço pelo serviço...
     
    Para mais informações acessem o link que explica com imagens: http://www.xtibia.co...mo-auction-npc/
     
     
    Basta fazer o download, executar a query que é pedida e depois disso colocar os arquivos em seus respectivas pastas.
    Npc Auction.rar
  25. Upvote
    Vodkart deu reputação a Roksas em [ # Battle Weekly Event # ] 1.0   
    Battle Weekly 1.0



    Iaiaiaeee meus jovens, tudo suaves? Hoje criei este tópico para oferecer á vocês um evento muito legal criado por mim, chamado Battle Weekly. Ele funciona da seguinte maneira:
    1 - Batalha PVP de categorias (level 20 ao 50, 51 ao 75, etc); 2 - Ganhadores 1º e 2º lugar levam troféis; 3 - Totalmente segura, não perde level nem loot ao morrer; 4 - Fácil de configurar. 5 - Objetivo: Checar á X frags primeiro.
     
    E a configuração é mega simples, basta seguir os passos descritos no README.xml, o local da âncora é este:
     
     
     
     
    Download Battle Weekly 1.0
    Scan Battle Weekly 1.0
    Todas ScreenShoots tiradas estão numa pasta dentro do arquivo baixado.
     
    #GoodLuck.
  • Quem Está Navegando   0 membros estão online

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