Jump to content

Projeto Tutores de Scripting


Killua
 Share

Recommended Posts

Como Eu Posso por um Limite nesse Script aki (tonumber) eu nao Estou conseguindo! No caso Seria 50

 

function onUse(cid, item, frompos, item2, topos)
local boost = tonumber(boost) or 0
if (boost >= 50) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon is already the maximum allowed boost")
return true
end
local ball_id = {2222, 2220}
local pedras = {
[5468] = {names = "Typhlosion, Slugma, Quilava, Magcargo, Magcarbo, Magby, Houndour, Houndoom, Ho oh, Entei, Cyndaquil, Charmander, Charizard, Charmeleon, Arcanine, Growlithe, Flareon, Magmar, Ninetales, Rapidash, Vulpix, Ponyta, Moltres, Shiny Arcanine, Elder Charizard, Shiny Growlithe,Skarmory, Kingdra, Dragonite, Dragonair, Shiny Dragonair, Shiny Dratini, Dratini,Xatu, Unown C, Unown D, Unown E, Unown F, Unown G, Unown H, Unown I, Unown J, Unown K, Unown L, Unown M, Unown N, Unown O, Unown P, Unown Q, Unown R, Unown S, Unown T, Unown U, Unown V, Unown W, Unown X, Unown Y, Unown Z, Unown B, Unown A, Slowking, Natu, Girafarig, Espeon, Alakazam, Shiny Alakazam, Abra, Kadabra, Hypno, Drowzee, Mr Mime, Mew, Mewtwo,Qwilfish, Gligar, Crobat, Nidoking, Nidoqueen, Muk, Grimer, Weezing, Koffing, Ekans, Arbok, Golbat, Zubat, Nidoranfemale, Nidoranmale, Nidorina, Nidorino, Venonat, Venomoth, Shiny Venomoth, Shiny Zubat, Shiny Golbat, Shiny Muk, Shiny Grimer, Shiny Venonat,Raikou, Pichu, Mareep, Flaaffy, Elekid, Ampharos, Electabuzz, Raichu, Pikachu, Electrode, Voltorb, Jolteon, Magnetom, Magnemite, Zapdos, Shiny Electabuzz, Shiny Raichu, Shiny Voltorb, Shiny Electrode,Yanma, Spinarak, Scizor, Pineco, Ledian, Ledyba, Heracross, Forretress, Dunsparce, Ariados, Scyther, Parasect, Shiny Parasect, Paras, Caterpie, Weedle, Beedrill, Butterfree, Kakuna, Metapod, Pinsir, Shiny Scyther, Shiny Beedrill, Shiny Butterfree, Shiny Paras,Sunkern, Sunflora, Skiploom, Meganium, Jumpluff, Hoppip, Chikorita, Celebi, Bellossom, Bayleef, Venusaur, Bulbasaur, Ivysaur, Tangela, Exeggutor, Weepinbell, Bellsprout, Victreebel, Oddish, Vileplume, Gloom, Exeggcute, Shiny Venusaur, Shiny Oddish,Wooper, Totodile, Suicune, Remoraid, Quagsire, Politoed, Octilery, Marill, Mantine, Lugia, Lanturn, Feraligatr, Croconaw, Corsola, Chinchou, Azumarill, Magikarp, Blastoise, Squirtle, Wartortle, Vaporeon, Gyarados, Omastar, Omanyte, Lapras, Poliwrath, Poliwag, poliwhirl, Horsea, Seadra, Krabby, Kingler, Psyduck, Golduck, Tentacool, Tentacruel, Slowpoke, Slowbro, Goldeen, Seaking, Staryu, Starmie, Lapras, Shiny Blastoise, Shiny Seadra, Shiny Krabby, Shiny Kingler, Shiny Tentacool, Shiny Tentacruel, Shiny Horsea, Red Gyarados, Shiny Magikarp, Shiny Big Magikarp,Wobbuffet, Ursaring, Togetic, Togepi, Teddiursa, Stantler, Snubbull, Smeargle, Sentret, Porygon2, Noctowl, Miltank, Igglybuff, Hoothoot, Granbull, Furret, Delibird, Cleffa, Blissey, Pidgeotto, Fearow, Pidgey, Chansey, Clefable, Wiglyttuff, Kangaskhan, Porygon, Raticate, Rattata, Doduo, Dodrio, Spearow, Clefairy, Jigglypuff, Meowth, Persian, Farfetchd, Lickitung, Ditto, Eevee, Snorlax, Shiny Pidgeot, Shiny Rattata, Shiny Raticate, Elite Farfetchd, Aipom, Pidgeot,Murkrow, Misdreavus, Haunter, Gengar, Gastly, Dark Abra, Shiny Gengar,Tyrogue, Hitmontop, Hitmonchan, Hitmonlee, Machamp, Elite Hitmonlee, Elite Hitmonchan, Mankey, Primeape, Machop, Machoke,Phanpy, Dophan, Diglett, Sandslash, Dugtrio, Sandsherew, Marowak, Cubone, Shiny Marowak,Tyranitar, Sudowoodo, Steelix, Shuckle, Pupitar, Larvitar, Geodude, Golem, Rhydon, Graveler, Rhyhorn, Aerodactyl, Kabutops, Kabuto, Onix, Crystal Onix,Swinub, Sneasel, Smoochum, Piloswine, Seel, Jynx, Dewgong, Cloyster, Shellder, Articuno, Shiny Jynx"} ,

}

local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET) ;
if not(ball.uid > 0) then
return doPlayerSendTextMessage(cid, 19, "[boost] Coloca A Ball no Slot")
end
local pokename = getItemSpecialDescription(ball.uid)
local name = getItemAttribute(ball.uid, "poke"):match("This is (.+)'s pokeball.")
if(pokename:find("\+(%d+)"))then
local boost = pokename:match("\+(%d+)")
doItemSetAttribute(ball.uid, "description", tostring(pokename:gsub(boost, ((tonumber(boost)+1)))))
doPlayerSendTextMessage(cid, 19, "Seu pokemon Esta + "..boost + 1)
else
doItemSetAttribute(ball.uid, "description", "Contains a "..name.." +1.")
end
return true
end

 

 

O Script funciona , ai queria por um Limite de quando chega-se no +50 nao poderia Bostar ,eu nao sei como funciona a funçao (tonumber) se Alguem Puder me explicar Tambem AGradeço ;)

Edited by Nextbr
Link to comment
Share on other sites

@Nextbr

O erro do seu código está nessa linha:

local boost = tonumber(boost) or 0

Você está "tornando" um número [tonumber(boost)] uma variável que não foi declarada anteriormente (no caso, boost). Assim, obviamente, a variável que está sendo declarada na linha que acabo de mencionar assumirá um valor nulo.

Eu lhe recomendaria armazenar o boost do pokémon num atributo. Assim, ficaria, além de mais prático, mais fácil de fazer o quê você quer.

Ex.:

Primeiramente, declare a variável boost, que assumirá o valor que corresponde ao boost do pokémon:

local boost = getItemAttribute(ball.uid, "boost") or 0

Aumentando o boost:

doItemSetAttribute(ball.uid, "boost", boost + 1)

Verificando se o boost é maior ou igual à 50:

if boost >= 50 then
Edited by zipter98
Link to comment
Share on other sites

Bom eu tava criando um script que quando o player mata outro e pega Skull, Black ou Red , então cai um gravestone com um texo ..

queria saber porque não funciona, não conseguir imaginar outro jeito de chegar se o player pegou a skull..

creio que do jeito que eu fiz so cai se já tiver a skull , não tem como eu testar pq tenho que pegar skull, e meu ot ainda não ta online .

 

function onKill(cid, target, lastHit)

local pos = getCreaturePosition(target)
local name = getCreatureName(cid)
local name2 = getCreatureName(target)

if isPlayer(cid) and isPlayer(target) then
   if getCreatureSkullType(cid) == SKULL_BLACK then
      doItemSetAttribute(doCreateItem(1409, 1, pos), "text", "O Jogador "..name.." pegou Black Skull Aqui.")
      doBroadcastMessage("O jogador "..name.." pegou Black Skull no Jogador "..name2..".")
   elseif getCreatureSkullType(cid) == SKULL_RED then
      doItemSetAttribute(doCreateItem(1409, 1, pos), "text", "O Jogador "..name.." pegou Red Skull Aqui.")
      doBroadcastMessage("O jogador "..name.." pegou Red Skull no Jogador "..name2..".")
   end
end

return TRUE
end

e como eu faço para o corpo do jogador sumir , pq fica em cima do gravestone

Edited by DuuhCarvalho
Link to comment
Share on other sites

 

Bom eu tava criando um script que quando o player mata outro e pega Skull, Black ou Red , então cai um gravestone com um texo ..

queria saber porque não funciona, não conseguir imaginar outro jeito de chegar se o player pegou a skull..

creio que do jeito que eu fiz so cai se já tiver a skull , não tem como eu testar pq tenho que pegar skull, e meu ot ainda não ta online .

 

function onKill(cid, target, lastHit)

local pos = getCreaturePosition(target)
local name = getCreatureName(cid)
local name2 = getCreatureName(target)

if isPlayer(cid) and isPlayer(target) then
   if getCreatureSkullType(cid) == SKULL_BLACK then
      doItemSetAttribute(doCreateItem(1409, 1, pos), "text", "O Jogador "..name.." pegou Black Skull Aqui.")
      doBroadcastMessage("O jogador "..name.." pegou Black Skull no Jogador "..name2..".")
   elseif getCreatureSkullType(cid) == SKULL_RED then
      doItemSetAttribute(doCreateItem(1409, 1, pos), "text", "O Jogador "..name.." pegou Red Skull Aqui.")
      doBroadcastMessage("O jogador "..name.." pegou Red Skull no Jogador "..name2..".")
   end
end

return TRUE
end

e como eu faço para o corpo do jogador sumir , pq fica em cima do gravestone

 

 

O que você pode fazer é usar um addEvent de 10 ms (que será imperceptível pelos jogadores), mas o jogador já terá recebido ou não a skull, permitindo que você cheque.

Crie uma função que faça todas essas coisas que você quer fora da função principal (onKill). Use todos os parâmetros que você usaria normalmente na função principal, mas lembrando que o target já não existirá mais, pois terá morrido. Então, em vez de getCreaturePosition(target), utilize targetPos e passe essa posição como parâmetro para sua função secundária (a que você deve criar). Então você deve checar se a skull que ele tinha no momento de execução do script é diferente do momento em que sua função será executada. Se for diferente, então ele acabou de ganhar skull e você deverá criar a gravestone. Mas como o corpo já estará no chão, a gravestone será criada por cima.

 

Um esboço:

http://pastebin.com/9rmeUmSs

TRUE é uma variável com valor de true. Portanto, é mais fácil (e mais correto) usar true.

Link to comment
Share on other sites



function doHealOverTime(cid, div, turn, effect)
if not isCreature(cid) then return true end

if turn <= 0 or (getCreatureHealth(cid) == getCreatureMaxHealth(cid)) or getPlayerStorageValue(cid, 400) <= 0 then
setPlayerStorageValue(cid, 400, -1)
return true
end

local d = div / 10000
local amount = math.floor(getCreatureMaxHealth(cid) * d)
doCreatureAddHealth(cid, amount)
if math.floor(turn/10) == turn/10 then
doSendMagicEffect(getThingPos(cid), effect)
end
addEvent(doHealOverTime, 100, cid, div, turn - 1, effect)
end

local potions = {
[12347] = {effect = 13, div = 30}, --Meat
[12348] = {effect = 13, div = 60}, --Ham
[12346] = {effect = 12, div = 80}, --Ramem
[12345] = {effect = 14, div = 90}, --Medicine Puills
}

function onUse(cid, item, frompos, item2, topos)
local pid = getThingFromPosWithProtect(topos)

if not isPlayer(item2.uid) then
return doPlayerSendCancel(cid, "Você pode usar isto somente em sí mesmo!")
end

if getCreatureHealth(pid) == getCreatureMaxHealth(pid) then
return doPlayerSendCancel(cid, "Você já está com a vida cheia.")
end

if getPlayerStorageValue(pid, 400) >= 1 then
return doPlayerSendCancel(cid, "Você já está sob o efeito desta comida.")
end

if getPlayerStorageValue(cid, 52488) >= 1 then
return doPlayerSendCancel(cid, "Você não pode usar isto durante um duelo.")
end

doCreatureSay(cid, "Delicioso!", TALKTYPE_SAY)
doSendMagicEffect(getThingPos(pid), 300)
setPlayerStorageValue(pid, 400, 1)
doRemoveItem(item.uid, 1)

local a = potions[item.itemid]
doHealOverTime(pid, a.div, 100, a.effect)

return true
end



Minha duvida é o seguinte, esse codigo na teoria é para ir aumentando a life aos pouquinhos porem ele só dá o efeito de como cê estivesse aumentando mas não aumenta na verdade alguém pode indicar onde está o erro ?

Edited by Vills
Link to comment
Share on other sites

Amigo, aparentemente seu script está certo. Os problemas que eu encontrei nele foram:


getThingFromPosWithProtect(topos)

Vc já tem essa função instalada? Ela não é uma função padrão, ela foi feita pelo Slicer.

O outro "problema" é o seguinte, o script manda essa mensagem quando o player tenta usar o item em algo que não seja um player:

"Você pode usar isto somente em sí mesmo!"

Isso não condiz com o script, pois é possível usar esse item em outros jogadores. Para fazer com que se possa usar somente em si mesmo, vc tem que comparar o item2.uid com o cid (Vou deixar vc fazer isso).


Essa linha abaixo faz com que a função doHealOverTime seja chamada a cada 0.1 segundos, healando o player e mandando o efeito. Isso não é um problema, só estou te alertando.

addEvent(doHealOverTime, 100, cid, div, turn - 1, effect)
Link to comment
Share on other sites

  • 2 weeks later...

Ótima iniciativa, espero que me ajude muito, pra começar tenho um script que comecei fazer e esta dando um erro que faço ideia do que possa ser.

 

O script abaixo funciona, ou era pra funcionar da seguinte forma, ao jogador entrar o sistema iria checar a vocação e lhe conceder uma outfit sem addons conforme a vocação, nas versões mais simples desse script (dava uma outfit sem considerar o sexo) ele não funcionou, na verdade até funcionou, mas o char não entrava no jogo. Eu fiz um teste com o mesmo script para dar itens (mesmo esquema, mas sem considerar o sexo, apenas a vocação) e também não funcionou, o char não entrava, mas no log do servidor ele entrava e saia instantaneamente.

function onLogin(cid) 

	if getPlayerVocation(cid) == 1 then
		if getPlayerSex(cid) == 0 then
			doPlayerAddOutfit(cid,137,0) --hunter female
		else getPlayerSex(cid) == 1 then
			doPlayerAddOutfit(cid,129,0) --hunter male
	end
	
	elseif getPlayerVocation(cid) == 2 then
		if getPlayerSex(cid) == 0 then
			doPlayerAddOutfit(cid,138,0) --mage female
		else getPlayerSex(cid) == 1 then
			doPlayerAddOutfit(cid,130,0) --mage male
	end
	
	elseif getPlayerVocation(cid) == 3 then
		if getPlayerSex(cid) == 0 then
			doPlayerAddOutfit(cid,139,0) --knight female
		else getPlayerSex(cid) == 1 then
			doPlayerAddOutfit(cid,131,0) --knight male
	end

	elseif getPlayerVocation(cid) == 4 then
		if getPlayerSex(cid) == 0 then
			doPlayerAddOutfit(cid,140,0) --noblewoman female
		else getPlayerSex(cid) == 1 then
			doPlayerAddOutfit(cid,132,0) --nobleman male
	end

end
end

Nesse script ele da um erro no log do servidor dizendo: [Warning - Event::checkScript] Can not load script: scripts/outfits.lua data/creaturescript/outfits.lua:6: unexpected symbol near "=="

 

 

Servidor utilizado TFS 1.0.

Link to comment
Share on other sites

Olá amigo, finalmente mais um interessado rs. O seu erro foi confundir else com elseif. Quando se usa o else, não se pode colocar uma segunda condição (else getPlayerSex(cid) == 1). Isso só pode ser feito com o elseif, igual vc fez em elseif getPlayerVocation(cid) == 4. O else simplesmente diz oq será feito caso a condição anterior não seja aceita e também não exige um then, por exemplo:

 

Se você usar:


if getPlayerVocation(cid) == 1 then
    if getPlayerSex(cid) == 0 then
        doPlayerAddOutfit(cid, 137, 0)
    else
        doPlayerAddOutfit(cid, 129, 0)
    end
end

O script vai ser entendido da seguinte forma: Se o player tiver voc = 1, ele vai prosseguir. Em seguida, vai checar se o player tem sexo = 0, se tiver, vai adicionar o outfit 137, caso contrário, adicionará o outfit 129.

Obviamente se o player não for do sexo 0, ele será do sexo 1, já que só existem esses 2... Portanto, o script vai interpretar tudo corretamente.

 

Espero que tenha entendido, abraços.

Link to comment
Share on other sites

Killua, estou tentando fazer alguns scripts mais não sei nem por onde começar, vou dizer dois sobre itens o primeiro é um axe que deixa o player com stun e a chance é de 25% o outro é uma amor que solta um dano em sua volta com a change de 15% de fazer esse dano a cada hit recebido espero que me ajude !!!

Link to comment
Share on other sites

 Share

×
×
  • Create New...