Jump to content

Scripting [Pedido] Tempo do item vip fica bugado.


Recommended Posts

Se essa for a seção errada, desculpa.

Bom, criei uns itens vips que dão atributo para os players, mas esses itens possuem tempo, e somem quando o tempo acaba. (decayTo O).

Não usei as funções onEquipe e onDeEquipe por duas razões:

1. Não tenho IDs com sprites repetidos para esses itens e não quero mexer no meu OTB pq já deu ruim outras vezes.

2. A intenção era que o tempo continuasse contando mesmo com o item dentro da mochila, ou seja, não adianta desequipar o item que O Tempo Não Para (já dizia Cazuza, rsrs).

 

Até aí tudo bem. Mas acabei descobrindo um bug... se o player guardar o item no depot e depois deslogar, quando ele relogar e pegar o item do depot outra vez, o tempo buga e fica parado. E só volta a ser contato caso ele relogue com o item no char outra vez. Ou seja, se o cara for malando, ele fica com o item pra sempre, pq basta ficar guardando ele no dp sempre que for deslogar.

 

Preciso resolver isso de alguma forma, aceito sugestões. Alguém poderia me ajudar?

 

PS.: Uso TFS 1.3

Edited by jefersonzc (see edit history)
Link to post
Share on other sites

  • 1 month later...

Depois de muito bater cabeça eu consegui achar uma solução quase perfeita para o problema. Então vou compartilhar aqui a solução, vai que ajuda outros...

 

Bom, primeiramente em items.xml precisamos configurar as skills do item, o tempo, etc. Como a ideia é que o item desapareça depois de algum tempo, vou por um decayTo 0.

<item id="25971" article="a" name="Chopper of Corruptedheart">
	<attribute key="weight" value="5000" />
	<attribute key="defense" value="35" />
	<attribute key="attack" value="56" />
	<attribute key="skillAxe" value="3" />
	<attribute key="weaponType" value="axe" />
	<attribute key="decayTo" value="0" /> <!--faz o item sumir depois que seu tempo expira-->
	<attribute key="duration" value="360000" />
	<attribute key="showduration" value="1" />
	<attribute key="slotType" value="two-handed" />
</item>

Reparem que não configurei o transformEquipTo e o transformDeEquipTo, pois meu item não tem duas sprites (como no caso dos rings e da soft)

Agora em movements.xml eu preciso configurar quem pode ou não usar o item.

<movevent event="Equip" itemid="25971" slot="hand" level="0" function="onEquipItem">
	<vocation name="Knight" />
	<vocation name="Elite Knight" showInDescription="0" />
	</movevent>
<movevent event="DeEquip" itemid="25971" slot="hand" function="onDeEquipItem" /><

Por se tratar de uma arma, vou precisar configurar tbm o weapons.xml (se fosse um helmet, um ring ou algo do gênero, eu poderia pular essa etapa).

<melee id="25971" unproperly="1">
	<vocation name="Knight" />
	<vocation name="Elite Knight" showInDescription="0" />
</melee>

 Blz, até aqui nada de novo, tudo isso a gente já precisa fazer quando vai criar qualquer item novo, certo?

Mas é agora que vem o pulo do gato (o gato que no caso sou eu 😎, rsrs). Em data/events/scripts/events.xml vamos habilitar o onMoveItem.

<event class="Player" method="onMoveItem" enabled="1" />

E em data/events/scripts/player.lua, vamos configurar a função onMoveItens.

function Player:onMoveItem(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
	local itensVIP = {25187,25175,25185,25429,25946,25915,25971} --todos os itens que eu preciso configurar 
	for i = 1, #itensVIP do
		if item.itemid == itensVIP[i] then
			item:decay() --toda vez que um item for movido, ele checa se faz parte dos itensVIP e starta o decay.
		end
	end
	return true
end

 

Resumidamente o resultado vai ser:

1. O tempo do item não para de decair, independente dele estar no slot, na bp, na casa, no dp, etc. Ok

2. Com o char deslogado, o tempo para de contar. Ok

3. Se o player deixar o item no DP e relogar o char, o tempo do item fica pausa, mas volta cair quando ele der move no item. Ok

4. O meu site possui um sistema de compra de itens que adiciona tal item no char. Quando o player compra o item que configuramos, o tempo dele vem pausado e se tal item cair dentro do seu respectivo slot (exemplo: o char compra uma sword e ele nao tem nenhuma sword na mão, logo, o a sword vai cair direto no slot dela), o tempo permanecerá pausado até que o char mova essa sword para a bp ou relogue. Bom, não era exatamente isso que eu queria, mas acho que posso considerar esse um bug pequeno e que não trará nenhum efeito colateral negativo, posto que cedo ou tarde esse char terá que relogar, no máximo ele irá conseguir umas horas há mais com o item, então, acho que ok.

Edited by jefersonzc (see edit history)
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Similar Content

    • By raphadoidera
      .Qual servidor ou website você utiliza como base? 
      8.60
      Qual o motivo deste tópico? 
      Preciso de um SCRIPT.

      Salve TK. Então rapaziada, estou a meses tentando achar um SCRIPT que faça com que o personagem solte mais de um míssil em uma mesma skill. Me passaram um que ele solta vários mísseis, porém os mesmos não saem diretamente do personagem. Eu preciso de um script que eu possa adicionar mais de um Míssil e que eles saiam diretamente do personagem. Alguém da uma força por favor!


      Esse é o Script que eu quero adicionar os Mísseis, 3 para ser mais exato. Míssel (41)
       
      Você tem o código disponível? Se tiver publique-o aqui: 
      local combat = createCombatObject()
      setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
      setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 41)
      setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -78.2, 1, -88.2, 1)
      function onCastSpell(cid, var)

      local waittime = 2 -- Tempo de exhaustion
      local storage = 1000600
      if exhaustion.check(cid, storage) then
      return false
      end

      local position1 = {x=getThingPosition(getCreatureTarget(cid)).x+1, y=getThingPosition(getCreatureTarget(cid)).y+1, z=getThingPosition(getCreatureTarget(cid)).z}
      local position2 = {x=getCreaturePosition(cid).x+3, y=getCreaturePosition(cid).y, z=getCreaturePosition(cid).z}
      doSendMagicEffect(position1, 106)
      doSendMagicEffect(position2, 189)
      exhaustion.set(cid, storage, waittime)
      return doCombat(cid, combat, var)
      end
    • By djteteh
      Alguem Poderia Me Ajudar Com Um Script Que Mostra Rank e a Vocaçao Juntos em Uma Tabela ?

      Tipo Assim
       
      1- 140256 - Yoshiizin - Sorcerer
       
      So que ta assim no Server

       


    • By XGaduX
      local config = { jumps5 = 10, walktime = 10 } combat5 = createCombatObject() setCombatParam(combat5, COMBAT_PARAM_HITCOLOR, COLOR_PINK) setCombatParam(combat5, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat5, COMBAT_PARAM_EFFECT, 22) setCombatFormula(combat5, COMBAT_FORMULA_LEVELMAGIC, -40.0, 0, -65.0, 0) function onCastSpell(cid) if exhaustion.check(cid, 4132213952) == TRUE then doPlayerSendCancel(cid, "Podera usar novamente dentro de 5 segundos.") doSendMagicEffect(getCreaturePosition(cid), 2) return false end function move5343(cid, pos, n) local n = n or 0 if (n < config.jumps5) then if (isCreature(cid)) then local pos = pos or getCreaturePosition(cid) local target = getCreatureTarget(cid) local dir = (target ~= 0) and getDirectionTo(pos, getCreaturePosition(target)) or getCreatureLookDirection(cid) local tpos = (target ~= 0) and getCreaturePosition(target) local newPos if ((target ~= 0) and ((pos.x-0 == tpos.x) and (pos.y == tpos.y))) then newPos = tpos else newPos = getPosByDir(pos, dir) end if ((getTopCreature(newPos).uid == 1) and doTileQueryAdd(cid, newPos) ~= 0) then return false end doCombat(cid, combat5, { pos = newPos, type = 2 }) addEvent(move5343, config.walktime, cid, newPos, n + 1) end end end move5343(cid) exhaustion.set(cid, 4132213952, 3.0) return true end Olá! alguém poderia "consertar" essa spell? os "erros" são que quando se da target em algum alvo ela segue ele, queria que ela fosse apenas em linha reta. Outro é que quando o player gira de sentido (está andando sentindo para baixo \/ e vira esquerda < a habilidade acompanha). A proposta é que ela vá em linha reta "x" vezes e ao tocar em player  com 10% da vida o execute. Att!.

      2021-03-05 17-56-30.mp4
      2021-03-05 17-53-10.mp4 2021-03-05 17-56-30.mp4 2021-03-05 17-56-30.mp4 2021-03-05 17-56-30.mp4 2021-03-05 17-53-10.mp4
    • By Sun
      ~ Olá galera, fiz parte do grupo por uns anos e fiquei 3 longos anos sem dar as caras
                                                       Antes pessoas me ajudavam, hoje, consigo ajudar as pessoas, e queria compartilhar com vocês conhecimento sobre itemAttribute!
                                                            essa função do tibia é maravilhosa, porém muitos não sabem seu potencial ou até mesmo não coloca ela em seus planos,
                                                          ela é bem simples porém deixa duvida em muitos, principalmente servidores de Poketibia que utiliza isso em quase tudo.
      getItemAttribute(uid, key) -- ## oque é get? get em inglês seria algo como obter, então a função traduzida seria, obter atributo do item! ## -- getItemAttribute(uid, key) -- ## UID seria direcionado a qual item eu estaria perguntando seu attributo, lembrando que eu obtenho isso com a key ##-- --## quando se pesquisa pelo atributo do item, o mais importante seria a chave que está contido no item, a key, no caso é uma {string} doItemSetAttribute(uid, key, value) -- ## oque é set? set seria algo como "definir", usamos para "dar" algo, traduzido fica definir atributo no item doItemSetAttribute(uid, key, value) -- ## uid novamente! seria o item a ser setado o attributo, chave, será algo que iremos colocar, como "defense" ## -- -- ## oque seria value? value seria o valor, como 1, etc já que é defense podemos fazer se tiver mais, defende mais ##  
      doItemEraseAttribute(uid, key) --## oque é do? do seria como "faça", na tradução seria, faça um corte no atributo do item doItemEraseAttribute(uid, key) --## uid novamente! será o item, a chave seria aque você setou no item, essa função retira o attributo!. ##--  
      exemplo dos Attribute sendo usados
       
      -- ## exemplo de catch seria o charmander ## -- Ensino = {"Charmander", 3200, 1515, 4} -- ## fazemos de exemplo que 3200 seria vida do charmander e 1515 seria o id do item do seu portfoil e 4 o sexo item = doCreateItemEx(12664, 1) -- ## 12664 seria o id da pokebola, 1 seria a quantia doPlayerAddItemEx(cid, item, true, CONST_SLOT_BACKPACK) doItemSetAttribute(item, "poke", 3200) -- ## vida do pokemon ## -- doItemSetAttribute(item, "nome", "Charmander") -- ## nome do pokemon ## -- doItemSetAttribute(item, "portrait", 1515) -- ## portrait do pokemon ## -- doItemSetAttribute(item, "gender", 4) -- ## 4 seria o sexo dele ## -- -- ## claro que ná hora de fazer seu system de catch irá ser assim, mas isso é apenas um exemplo de como irá funcionar ## -- -- ## lembrando que o valor do doItemSetAttribute pode ser além de numero. ## --  
                                                 
                                                                       
       
       
                                                        Espero que muitos pratiquem ai, e que vocês tenham conseguido entender o tópico e se aventurem para usar a função!.
                                                                                                                                                   bye
       
    • By ADMRagnarok
      .Qual servidor ou website você utiliza como base? 
      https://github.com/mattyx14/otxserver/tree/otxserv2
      Qual o motivo deste tópico? 
      Alguem teria um script de reset preferencialmente por source para otx2 atualizado https://github.com/mattyx14/otxserver/tree/otxserv2
      se for por distro as mudanças me diga aonde mudar eu mesmo compilo
      ou script normal mesmo, porem as configuraçoes do script seriam as seguintes
      level necessario para resetar = x
      aumento de x level para reset = x
      item e quantidade de item para resetar = x,x
      aumento de x items por reset= x
      vida e mana volta ao inicio ao resetar = true or false
      skills voltao ao inicio ao resetar = true false
      hp e mp adicional ganho /lvl por reset = 1% (configurável)
      dano e heal adicionado por reset = 1% configuravel
      reset voc = {x, x, x, x, x, x, x} (quando der o 10 reset por exemplo(configuravel) , será feito uma checagem de vocation para poder resetar, por exemplo até 10 resets qualquer voc reseta nao será feito checagem, porem no reset 10 só resetará se for uma das seguintes vocações, se for mais facil deixa só 1 reset configuravel assim se for dificil pode colocar apartir de tantos resets precisa da classe, coloque oque for mais pratico pois o efeito será o mesmo.
      teleport para o templo= true or false
      pode resetar com battle= true or false
      a cada x resets ganhe tal item (configuravel) reset x recebe item x ao resetar, reset =5 {2160, 100} - exemplo.
      nao me importa se será storage, source, script. só me importo com o resultado e que nao tenha bugs, quanto mais bem feito melhor na hora de negociar o preço, se nao for permitido este tipo de post aqui alguem me avise que eu retiro ele. se tem outro local por favor movam ele, mais informações mande msg no privado responderei assim que possível.
         
  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...

Important Information

Confirmação de Termo