SM
dúvida

2 dúvidas o.O

Por SmiX, 04 de jan. de 2013 em Scripts

resolvido
script
10
1k
SmiXS
04 de janeiro de 2013 às 01:16

Olá pessoal, to tentando me aprimorar em lua(e em outras linguages) e estou tentando fazer um script assim:

 

1 Script: Se tiver alguma coisa ao redor do player quande ele usar este item, mandar uma MSG para ele. Funcionaria desta maneira?

 

 

 

function onUse(cid)

for i = 1, 1 do

x = getThingPos(cid)

x = {x = x, y = x, z = x.z}

x.stackpos = 253

if getThingFromPos(x).uid > 0 then

doPlayerSendTextMessage(cid, 27, "SDD")

end

end

end

 

 

 

2 Script: Queria saber, bem explicadinho(se não for pedir muito), como usar as funções de db e cada um de seus parametros. tipo, quero setar tal nome do player na database, como eu faço.

 

 

Se não intenderam, imagine eu. kkk Tento explicar melhor.

OneshotO
04 de janeiro de 2013 às 10:18

1. Não, não funcionaria.

 

Você precisa pensar em um algoritmo usando for para checar todas as posições ao redor do jogador, para isso, dê uma olhada na imagem abaixo:

 

E4ayJ.jpg

 

Veja que marquei dois pontos, um na ponto superior-esquerdo que tem as coordenadas [-1; -1] e o outro no ponto inferior-direito que tem as coordenadas [1; 1] em relação a posição do jogador.

 

Levando em consideração que posições são tabelas que possuem três variáveis dentro - x; y; z - e que essas variáveis são valores numéricos, basta então fazer um for entre -1 e 1 somando a variável do for a posição base, que no caso, seria a posição do jogador.

 

Mas no caso teríamos que usar dois for indenpendentes um do outro, um para a variável x e outro para a variável y, uma vez que se usarmos apenas um for, ele iteraria entre -1, 0 e 1, somaria esses valores a posição base simultaneamente e acabaríamos verificando apenas as posições diagonais.

 

Logo nosso rascunho fica mais ou menos assim:

 

function onUse(cid, item, fromPosition, itemEx, toPosition)
local position = getThingPosition(cid)
for x = -1, 1 do
	for y = -1, 1 do
		local tmp = {x = position.x + x, y = position.y + y, z = position.z}
		if getTileItemById(tmp, 2160).uid > 0 or getTopCreature(tmp).uid > 0 then
			doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "SSD")
			break
		end
	end
end
return true
end

 

Por exemplo, no caso acima, fiz para verificar se tinha o item crystal coin ao redor do jogador ou uma criatura.

 

2. Querys são algo bem simples mesmo, vou só falar o básico delas.

 

Divida elas em dois tipos, alterar e obter. Ou seja uma estrutura de query serve para alterar os campos do banco de dados e a outra serve para obter algo do banco de dados.

 

UPDATE table SET column = value

 

SELECT column FROM table

 

Claro que fazer algo assim vai selecionar todas as linhas de uma certa coluna. É aí que entra o WHERE que serve como um filtro para o que você quer.

 

UPDATE table SET x = y WHERE a = b

 

SELECT x FROM table WHERE a = b

 

Você pode intercalar vários "filtros" do WHERE com AND

 

 

UPDATE table SET x = y WHERE a = b AND c = d

 

SELECT x FROM table WHERE a = b AND c = d

 

Bem simples mesmo.

 

Claro que tem algumas coisas extras como IN, ORDER BY, dentre outros.

Editado Janeiro 4 por Oneshot

SmiXS
04 de janeiro de 2013 às 10:37

Vlw oneshot, aproveitando sua boa vontade, pode me mandar, por PM, uns exercícios de nível "Hard core"?

SlicerS
04 de janeiro de 2013 às 10:45

da pra usar assim tb, eu achu..

local pos = getThingPos(cid)
for i = 0, 7 do
  local posi = getPosByDir(pos, i)
  if getTileItemById(posi, 2160).uid > 0 or getTopCreature(posi).uid > 0 then                 
  doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "SSD")                 
  break             
  end 
end

no caso esse codigo vai checar todas as posiçoes emvolta do player... ;p

OneshotO
04 de janeiro de 2013 às 10:47

da pra usar assim tb, eu achu..

local pos = getThingPos(cid)
for i = 0, 7 do
  local posi = getPosByDir(pos, i)
  if getTileItemById(posi, 2160).uid > 0 or getTopCreature(posi).uid > 0 then				
  doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "SSD")				
  break			
  end
end

no caso esse codigo vai checar todas as posiçoes emvolta do player... ;p

 

Agora usando essa função aí, faça para checar uma área quadrada 2X2 em volta do jogador.

 

Vai lá, você consegue, espertão!

 

:D

Editado Janeiro 4 por Oneshot

SlicerS
04 de janeiro de 2013 às 11:01

/\

ele n pediu isso uahuah

e alias tu sabe daonde vem essa funçao? tentei achar no arquivo luascript.cpp e n achei o.O

 

oia como o brun123 uso ela..

getPosByDir(centerPos, direction, _range)

por isso queria ver o codigo dela kk

Editado Janeiro 4 por Slicer

SmiXS
04 de janeiro de 2013 às 11:04

local pos = getThingPos(cid)
for i = 0, 15 do
  local posi = getPosByDir(pos, i)
  if getTileItemById(posi, 2160).uid > 0 or getTopCreature(posi).uid > 0 then                 
         doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "SSD")                 
         break             
  end 
end

¬¬' Sem entregar o ouro né veih

OneshotO
04 de janeiro de 2013 às 12:03

/\

ele n pediu isso uahuah

e alias tu sabe daonde vem essa funçao? tentei achar no arquivo luascript.cpp e n achei o.O

 

oia como o brun123 uso ela..

getPosByDir(centerPos, direction, _range)

por isso queria ver o codigo dela kk

 

Ela não é uma função ambientada nas sources, ela é uma função Lua.

 

function getPositionByDirection(position, direction, size)
   local n = size or 1
   if(direction == NORTH) then
    position.y = position.y - n
   elseif(direction == SOUTH) then
    position.y = position.y + n
   elseif(direction == WEST) then
    position.x = position.x - n
   elseif(direction == EAST) then
    position.x = position.x + n
   elseif(direction == NORTHWEST) then
    position.y = position.y - n
    position.x = position.x - n
   elseif(direction == NORTHEAST) then
    position.y = position.y - n
    position.x = position.x + n
   elseif(direction == SOUTHWEST) then
    position.y = position.y + n
    position.x = position.x - n
   elseif(direction == SOUTHEAST) then
    position.y = position.y + n
    position.x = position.x + n
   end
   return position
end

SlicerS
04 de janeiro de 2013 às 12:29

/\

hum por isso n achei, ta com o nome maior ae kk vlw.. e testei aki.. e botando size 2 fica os buracos neh kkk mas pra uma funçao mais simples soh emvolta achu q ela eh valia '--'

OneshotO
04 de janeiro de 2013 às 12:49

Levando em consideração que a dúvida principal do tópico foi sanada;

 

Tópico movido para a seção de dúvidas e pedidos resolvidos.

Editado Janeiro 4 por Oneshot