Ir para conteúdo

Night Wolf

Herói
  • Total de itens

    341
  • Registro em

  • Última visita

  • Dias Ganhos

    18

Posts postados por Night Wolf

  1. @@Gabrieltxu, isso que você falou está tudo correto, com excessão dessa parte aqui:

    3° função = chama uma Wave , com uma dificuldade e um delay , com uma variavel alfa com o valor getDifficult setada , e um loop de +7 para aumentar a dificuldade? (0-0) e um se  for menor de 1 a diferença da dificuldade vai tirar o Objeto (UP) e vai criar o objeto (Down) e fim
     
    --- versao recursiva
     
    1° função vai chamar uma wave n = 1 , vai ter dificuldade e um delay , vai criar o Objeto Down e vai retirar o Objeto Up , se o n for menor do que a diferença do alfa +7 vai fazer com que sempre chame uma wave aumenta a dificuldade e pronto 

    Tem dois números que são muito utilizados em códigos no tibia (7 e 5). Aquele +7 tem uma razão de estar ali e não tem a ver com dificuldade de wave e sim com uma razão estética. Não é a diferença que tem que ser menor que 1 porque dif ali está se referindo à tabela dif.

    Não é diferença e a wave não aumenta a dificuldade. Uma wave não chama outra, somente a si mesma (por isso o nome recursiva).

     

  2. @@Daniel, thanks maninho. Vou tentar transformar esse tópico num desafio mensal e trazer novidades pra essa seção enquanto eu volto a scriptar *-*

    @, foi um bom palpite hahaha mas não é não.. tenta dar uma lida no código, mesmo quem não tá familiarizado com a linguagem pode achar dicas lá. Essa é a idéia do tópico

    @@Caronte, poderia ser.. mas em nenhum momento eu coloquei alguma função de criar monstros

  3. Olá pessoal, antes de tudo gostaria de me apresentar.. me chamo Anderson mas alguns de vocês devem me conhecer pelo nick de xWhiteWolf; Bom, hoje eu venho propor um desafio para a equipe do xtibia, eu vou apresentar um pseudo-código em lua de um script que desenvolvi. Eu fiz o pseudo-código bem porcamente em mais ou menos uns 20 minutos, já o script em si demorou algumas horinhas :x porém eles estão bem parecidos.

     

    local dif = {
        [1] = {0,1,1,2,1,1,0,0,2,0,1}, 
        [2] = {0,1,1,2,1,1,0,0,2,0,1},
        [3] = {0,1,1,2,1,1,0,0,2,0,1}
    }
    
    local delay = {
        [1] = 200,
        [2] = 150,
        [3] = 100
        }
    
    function isRoomEmpty()
        if getGlobalStorageValue(19281) < 1 then
            return true
        end
    end
    
    function startEvent()
        setGlobalStorageValue(19281, 1)
        callWave(difficult, delay)
        return true
    end
    
    function callWave(dif, delay) -- fazer recursão
        alfa = getDifficult()
        for i = 1, #dif[alfa] + 7 do -- fazer + 7 loops para acabar as notas
            if i <= #dif[alfa] then
                doRemoveObj(up)
                doCreateObj(down)
            end
        end
        return true
    end
    
    
    -- versao recursiva
    function callWave(n)
        n = n or 1
        alfa, delay = getDifficult(), getDelay()
        doCreateObj(down)
        doRemoveObj(up)
        if n < dif[alfa] + 7 then
            addEvent(callWave, delay, n + 1)
        end
        return true
    end
    
    
    local pos = {x = 160, y = 54, z = 7}
    
    function onUse(cid, item, itemEx, fromPos, toPos)
        if isRoomEmpty() then
            startEvent()
    		doTeleportThing(cid, pos)
    	else
    		doPlayerSendCancel(cid, "The room is busy right now, try again later.")
        end
        return true
    end
    
    
    

     



    O desafio é o seguinte: vocês tem que tentar adivinhar do que se trata esse código. Isso vale tanto para explicar partes do código quanto para explicar a idéia por trás dele.

    A cada dia irei postar uma dica para ajudá-los nesse desafio, podendo ser uma dica explicando partes do código ou dicas sobre a funcionalidade dele.

    "Mas lobo, por que eu iria tentar descobrir do que se trata seu código estúpido?" Bem meu caro, será uma tarefa legal e esse script é uma idéia bem inovadora.. só o fato de você tentar ler irá ajudá-lo a treinar seu cérebro para a linguagem Lua. E também há uma recompensa!! aquele que acertar ou chegar mais perto verá e terá acesso ao código antes de todo mundo!!111

    Espero que vocês animem pra participar disso, se postei na seção errada peço que movam para a seção correta para que tenha melhor visibilidade.

    Dicas = {
    [1] = "Trata-se de um mini game no tibia"
    }

    Toda resposta certa irá receber um ponto de reputação minha (se a equipe permitir). Boa sorte e que os jogos comecem!!

    Edit: pro sistema funcionar precisaria também de um movements, eu fiz +- um modelo de como seria pra ajudar vcs a descobrirem:

     

    local itemid = 1679
    local storage_point = 12721
    
    function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
    	if math.abs(fromPosition.x - toPosition) > 2 then
    		limpar_sala()
    	end
    	if item_in_pos then
    		removeItem(pos)
    		doSendMagicEffect(toPosition, 3)
    		setPlayerStorageValue(cid, storage_point, getPlayerStorageValue(cid, storage_point) + 1)
    	else
    		doSendMagicEffect(fromPosition, 2)
    	end
    	doTeleportThing(cid, fromPosition)
    return true
    end
    



    73QrLPZ.png

  4. pensa cmg rapaz, vc equipa o item 2649 no slot legs e aí vc ativa o callback onEquipItem.. esse callback transforma o seu item equipado para o item 1997. Ao ser transformado ele dá um conflito pois você ativa o callback onDeEquipItem no item 2649 ao mesmo tempo que ativa o callback onEquipItem no 1997. Acredito que seu movements.xml esteja errado e que o correto seja apenas 2649 onEquip e 1997 onDeEquip;

  5. desse jeito q tá ele só vai funcionar se vc der use with na wand e clicar num dos ids que tá dentro de config.sands, e aí no actions.xml vc bota o id da wand vinculado com esse script aqui

    local config = {
    	sands = {4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4665, 4666, 4820, 4821, 4822, 4823, 4824, 4825}
    	}
    
    function onUse(cid, item, fromPosition, itemEx, toPosition)
    	if(isInArray(config.sands, itemEx.itemid)) then
    		doSendMagicEffect(toPosition, CONST_ME_LOSEENERGY)
    		doItemSetAttribute(item.uid, "soul_charges", 1000)
    		doItemSetAttribute(item.uid, "description", "[Soul Charges: ".. 1000 .."]")
    		return true
    	else
    		doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE)
    	end
    end
    
  6. o zipter e eu fizemos esse daqui pra wand:

     

    local config = {
    slowpercent = 0.5, -- use values between [0-1]
    slowtime = 5, -- 5 seconds of slow after each hit
    combattype = COMBAT_ENERGYDAMAGE, -- combat type
    mindamag = 30, -- min damage
    maxdamag = 50, -- max damage
    effect = 4 -- distance effect 
    }
    
    local condition = createConditionObject(CONDITION_PARALYZE)
    setConditionParam(condition, CONDITION_PARAM_TICKS, 1000 * config.slowtime)
    setConditionFormula(condition, -(config.slowpercent), 0, -(config.slowpercent), 0)
    
            
    function onUseWeapon(cid, var)
        local w = getPlayerWeapon(cid).uid
        if not w then return true end
    	
        local charges = getItemAttribute(w, "soul_charges") or 0
        if charges < 1 then return doPlayerSendCancel(cid, "You're not attacking cause you don't have any charge.") and false end
        
        doItemSetAttribute(w, "soul_charges", charges - 1)
    	doItemSetAttribute(w, "description", "[Soul Charges: ".. charges - 1 .."]")
        doAddCondition(variantToNumber(var), condition)
    	doTargetCombatHealth(cid, variantToNumber(var), config.combattype, -(config.mindamag), -(config.maxdamag), 255)
    	doSendDistanceShoot(getCreaturePosition(cid), getCreaturePosition(variantToNumber(var)), config.effect)
        return true
    end
    
    

     



    e no weapons.xml:

    <wand id="2190" level="7" event="script" value="mace.lua"> <!-- Wand of Vortex -->
    <vocation id="1"/>
    </wand>


    Pra recarregar tem que fazer uma action que ao clicar na wand e clicar na areia (usa itemEx.itemid pra verificar se o id do segundo item que deu use With tá dentro de um array pré definido de chãos que são possiveis de recarregar sua wand)

  7. zipter, me chama no skype e vamo discutir esse código aí.. eu pensei em várias maneiras de fazer mas nenhuma que fosse eficiente :( eu tive uma ótima ideia pra fazer de forma eficiente mas rodei uns testes ontem e aparentemente não deu certo.

  8. adiciona essas 3 funções na sua lib:

    -- 14º
    function getFloorsBetweenPos(fromPos, toPos)
    return math.abs(fromPos.z - toPos.z)
    end
    
    -- 15º
    function getLowestFloor(fromPos, toPos)
    return fromPos.z > toPos.z and toPos.z or fromPos.z
    end
    
    -- 16º
    function getAllPlayersInArea(fromPos, toPos)
    local players = {}	
    local andares = getFloorsBetweenPos(fromPos, toPos)
    	for index, creature in ipairs(getPlayersOnline()) do
    		local z = getLowestFloor(fromPos, toPos)
    		local frompos = {x = fromPos.x, y = fromPos.y, z = fromPos.z}
    		local topos = {x = toPos.x, y = toPos.y, z = toPos.z}		
    		for i = 0, andares do
    			z = z or 0
    			frompos.z = z + i
    			topos.z = z + i	
    			if isInArea(getThingPos(creature), frompos, topos) then
    				table.insert(players, creature)
    			end
    		end
    	end
    return players
    end
    

    Agora vc vai fazer o seguinte, chamar essa função getAllPlayersInArea(posicao1, posicao2) e aí ele vai pegar todos os players entre a area da posicao 1 e posicao 2.
    Só que vc vai colocar o valor dessa função numa variavel:

    local totalplayers = getAllPlayersInArea(posicao1, posicao2)

    Feito isso você vai ter uma lista de todos os players que estão nessa area. Agora tudo que você precisa fazer é verificar se a condição de ter somente 1 player é verdadeira e teleportar ele caso seja:

    if #totalplayers == 1 then
       doTeleportThing(totalplayers[1], posicaofinal)
    end

    EDIT: não vi que era pra 1.2, foi mal, mas é só adaptar as funções que mudaram de nome que vai dar certo.

  9. ao mudar a vocation por script, se o server for 8.6 ou maior vc tem que alterar tb o promoteLevel.. e no XML você tem que definir fromvocation pra mostrar de qual classe aquela classe se deriva.
    Se não fizer isso, toda vez que logar vai estar a classe anterior.

  10. ele tá com chances iguais pra todos os atributos:

    local l = choose('hp','mp','ml','cas','shield','dist')

    todos tem 1/6 de chance de entrar.

    Oque dá pra fazer é escrever mais de uma vez outros atributos pra dar prioridade maior pra eles:

    local l = choose('hp','mp','ml','cas','shield','dist', 'ml','cas','shield','dist')

    Dessa forma hp e mp ficam com 10% cada e os outros com 20% cada;

  11. a melhor solução nesse caso é resetar a mana ou diminuir a quantidade de mana ganha por level, como o ot é 9999x ninguém vai perceber e vc vai extender a quantidade possível de resets sem bugar.

  • Quem Está Navegando   0 membros estão online

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