Ir para conteúdo

Projeto Tutores de Scripting


Killua

Posts Recomendados

 

 

Você quer pegar um item e ver a quantidade de stacks que tem? Ou checar vários items separados no chão e contar quantos tem?

 

Se for contar quantos stacks tem de um item no chão (por exemplo pegar um monte de gold e contar quantos tem) você pode simplesmente fazer:

item = getTileItemById({x = 209, y = 144, z = 6}, itemid)
if isItemStackable(item.id) then
   count = item.type
end

Aí você vai conseguir ter a quantidade de stacks.. Mas se você quiser pegar a quantidade de items "não-juntáveis" você vai ter que utilizar um for alterando o stackpos desde STACKPOS_GROUND até STACKPOS_TOP_MOVABLE_ITEM_OR_CREATURE e daí ir utilizando a função getThingFromPos(pos).. E além disso pode usar o .type pra ir pegando a quantidade de cada um desses items..

 

Espero ter ajudado =)

 

 

Você quer dizer para eu fazer assim:

local count = 0
for X = 0, 255 do
	item = getTileItemById({x = 209, y = 144, z = 6, stackpos = X}, itemid)
	if isItemStackable(item.id) then
		count = count + item.type
	end
end

EDIT: Usei o código que você disse e a variável count está com valor nulo (nill)

Editado por Mazynho
Link para o comentário
Compartilhar em outros sites

Cara, usa a função getThingFromPos.. Daí se quiser um item específico, teste o id do item que vc pegar e daí sim vc pega o count...

Editado por BreisPodeu
Link para o comentário
Compartilhar em outros sites

Galera poderiam tirar estas minhas três duvidas aqui:

 

1º - Quanto ao stackpos, se em um tile tiver 300 itens, por exemplo, qual será o stackpos dos itens 256 a 300?, pois até onde sei o stackpos só vai até 255.

 

2º - Como que faço para quando um player falar hi, o npc verificar se o player possui level 100, por exemplo, e caso tenha fale tal mensagem, pois colocando uma condição no inicio do script do npc ele só verifica depois que o player digitar hi teclar enter e digitar outra coisa e teclar enter.

 

Ex:

player: hi

NPC:
if getPlayerLevel(cid) == 100 then
	selfsay("E aew", cid)
else
	selfsay("Fala noob", cid)
end
...

3º - Qual a função para saber se um diretório existe?

Ex: directoryExists("C:/teste.exe") retorna true/false (directoryExists, nome utilizado para exemplificar.)

Editado por Mazynho
Link para o comentário
Compartilhar em outros sites

Galera poderiam tirar estas minhas três duvidas aqui:

 

1º - Quanto ao stackpos, se em um tile tiver 300 itens, por exemplo, qual será o stackpos dos itens 256 a 300?, pois até onde sei o stackpos só vai até 255.

 

2º - Como que faço para quando um player falar hi, o npc verificar se o player possui level 100, por exemplo, e caso tenha fale tal mensagem, pois colocando uma condição no inicio do script do npc ele só verifica depois que o player digitar hi teclar enter e digitar outra coisa e teclar enter.

 

Ex:

player: hi

NPC:
if getPlayerLevel(cid) == 100 then
	selfsay("E aew", cid)
else
	selfsay("Fala noob", cid)
end
...
3º - Qual a função para saber se um diretório existe?

Ex: directoryExists("C:/teste.exe") retorna true/false (directoryExists, nome utilizado para exemplificar.)

 

 

provavelmente quando ultrapassar o limite ou ele nao vai deixar add mais, ou vai apagar os debaixo, acho mais provavel apagar os de baixo

 

if getPlayerLevel >= 100 then

 

 

E tu quer saber de diretorio ou arquivos? são coisas diferentes

Bem, de qualquer modo, nativamente e forma limpa não tem um meio, há sim varias gambiarras, vou citar uma delas aqui:

function exists(name)
    if type(name)~="string" then return false end
    return os.rename(name,name) and true or false
end

function isFile(name)
    if type(name)~="string" then return false end
    if not exist(name) then return false end
    local f = io.open(name)
    if f then
        f:close()
        return true
    end
    return false
end

function isDir(name)
    return (exist(name) and not isFile(name))
end
Link para o comentário
Compartilhar em outros sites

provavelmente quando ultrapassar o limite ou ele nao vai deixar add mais, ou vai apagar os debaixo, acho mais provavel apagar os de baixo

 

if getPlayerLevel >= 100 then

 

 

E tu quer saber de diretorio ou arquivos? são coisas diferentes

Bem, de qualquer modo, nativamente e forma limpa não tem um meio, há sim varias gambiarras, vou citar uma delas aqui:

function exists(name)
    if type(name)~="string" then return false end
    return os.rename(name,name) and true or false
end

function isFile(name)
    if type(name)~="string" then return false end
    if not exist(name) then return false end
    local f = io.open(name)
    if f then
        f:close()
        return true
    end
    return false
end

function isDir(name)
    return (exist(name) and not isFile(name))
end

 

 

Valeu Davorsn, mechendo eu cheguei nessa gambiarra de saber se existe renomeando com o proprio nome kkkkkk, agora a 2º duvida colocando a condição no script do npc só funciona depois que o player fala hi e depois fale qualquer coisa, apenas falando hi ele só executa os comandos do .xml.

Link para o comentário
Compartilhar em outros sites

Valeu Davorsn, mechendo eu cheguei nessa gambiarra de saber se existe renomeando com o proprio nome kkkkkk, agora a 2º duvida colocando a condição no script do npc só funciona depois que o player fala hi e depois fale qualquer coisa, apenas falando hi ele só executa os comandos do .xml.

negativo, tem como tu configurar tudo em lua, é so tirar as mensagem de greeting do xml
Link para o comentário
Compartilhar em outros sites

Pode min dizer como faço então?

acabei de falar, "é só tirar as mensagens de greeting do xml", dai na callback onSay do npc tu faz normal, como os npcs mais antigos aquele msgcontains e etc
Link para o comentário
Compartilhar em outros sites

acabei de falar, "é só tirar as mensagens de greeting do xml", dai na callback onSay do npc tu faz normal, como os npcs mais antigos aquele msgcontains e etc

 

Dalvorsn olha o que fiz:

 

Dexei o .xml desta como este exemplo:

<?xml version="1.0" encoding="UTF-8"?>
<npc name="exemplo" script="exemplo.lua" walkinterval="2000" floorchange="0" access="5" level="1" maglevel="1">
	<health now="150" max="150"/>
	<look type="33" head="0" body="0" legs="0" feet="0" addons="0"/>
</npc>

e no .lua assim:

 

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

	if msgcontains(msg, 'hi') and getPlayerLevel(cid) <= 100 then
		selfSay("FALA noob", cid)
	else
		selfSay("Ola ".. getCreatureName(cid) .."! como vai?", cid)
	end

    return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

 

 

Porém não funcionou como esperado, quando falo hi o npc fala: Welcome, test! I have been expecting you. e só entra na condição se falar hi novamente. Pode min ajudar?

Editado por Mazynho
Link para o comentário
Compartilhar em outros sites

Usa somente as callbacks do npc, nao usa o jiddo system

 

 

function onCreatureAppear(cid)              

--aqui e quando player chega perto
end
function onCreatureDisappear(cid)   
-- aqui e quando o player se afasta da visao do npc
end
function onCreatureSay(cid, type, msg)      
-- aqui e quando o player fala, e aqui que tem que fazer o msg container, do jeito que tu tava 
--fazendo no primeiro hi ele nao chamava sua funcao ele tava chamando a 
--callback do jiddo
end
function onThink()                        
-- aqui e a callback que executa de tempos em tempos, nao sei dizer de quantos 
--emquantos segundos, mas deve ter configuracao pra isso no xml
end
Editado por dalvorsn
Link para o comentário
Compartilhar em outros sites

 

Usa somente as callbacks do npc, nao usa o jiddo system

function onCreatureAppear(cid)              

--aqui e quando player chega perto
end
function onCreatureDisappear(cid)   
-- aqui e quando o player se afasta da visao do npc
end
function onCreatureSay(cid, type, msg)      
-- aqui e quando o player fala, e aqui que tem que fazer o msg container, do jeito que tu tava 
--fazendo no primeiro hi ele nao chamava sua funcao ele tava chamando a 
--callback do jiddo
end
function onThink()                        
-- aqui e a callback que executa de tempos em tempos, nao sei dizer de quantos 
--emquantos segundos, mas deve ter configuracao pra isso no xml
end

 

Fiz o que você falou, porém eu perco as funcionalidades do jiddo system, por exemplo ele só continua falando com o npc se eu colocar isso dentro da onCreatureSay: npcHandler:onCreatureSay(cid, type, msg) e quando coloco isso ele fala: Welcome, test! I have been expecting you, e se eu ficar falando hi ele fica repetindo o bloco de comandos.

Link para o comentário
Compartilhar em outros sites

Fiz o que você falou, porém eu perco as funcionalidades do jiddo system, por exemplo ele só continua falando com o npc se eu colocar isso dentro da onCreatureSay: npcHandler:onCreatureSay(cid, type, msg) e quando coloco isso ele fala: Welcome, test! I have been expecting you, e se eu ficar falando hi ele fica repetindo o bloco de comandos.

Se tu quer usar a lib do jiddo system leia e aprenda como usá-la, os arquivos dela estão todos no pasta de npcs do seu servidor, va lendo aos poucos e testando, sem duvidas ela tem muita funcionalidades, mas sinceramente acho muito mais versátil e livre fazer diretamente com as callbacks, voce com uma tabela simples faz o talkstate, e as falas por ifs, não tem misterio nenhum nisso
Link para o comentário
Compartilhar em outros sites

  • 1 year later...

Pessoal, tenho uma dúvida..

To criando um script, que quando o player usa um certo item, que no meu caso é o Mead Horn (7140) em um parede congelada com um Mammoth (7294)

Ele é teletransportado 2 sqm pra trás, e nasce um Mammoth. Logo após nascer o Mammoth, a parede teria que sumir, e ficar uma parede congelada normal..

E por fim, o player recebe um storage, e nao pode mais usar o item naquela parede..

 

Meu script ta só no começo, e eu nao consegui que a creature surgisse:

function onUse(cid, item, fromPosition, itemEx, toPosition)

local pos = {x= 1087,y= 1010,z= 7}


  if itemEx.itemid == 7294 then
      doTeleportThing(cid, pos)
      doSendMagicEffect(getPlayerPosition(cid), 10)
  else

      doPlayerSendCancel(cid, "You are using item in the wrong place.")
  end


return TRUE
end

Agradeço desde já!

Link para o comentário
Compartilhar em outros sites

Oi amigo, qual é a sua dúvida?

 

Para criar um monstro vc pode usar a função doCreateMonster(name, pos)

 

E uma outra dica é não se acostumar a usar o TRUE. Ele não existe na linguagem LUA e não é reconhecido por ela já que ela é case sensitive. Ele só funciona em OTs pois é declarada a variável global TRUE em alguma lib.

Link para o comentário
Compartilhar em outros sites

Certo, eu posso retirar o TRUE então?

 

Ficou assim, mas não funcionou ainda:

function onUse(cid, item, fromPosition, itemEx, toPosition)

local pos = {x= 1087,y= 1010,z= 7}


  if itemEx.itemid == 7294 then
      doTeleportThing(cid, pos)
      doSendMagicEffect(getPlayerPosition(cid), 10)
      doCreateMonster(Mammoth, pos)
  else

      doPlayerSendCancel(cid, "You are using item in the wrong place.")
  end


return
end
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...