Ir para conteúdo
Entre para seguir isso  
Mock

Player lib v.1.0.1 - Para iniciantes

Recommended Posts

Mock    32
Mock

  • Testado em TFS 0.3.6
  • autor: bearpaw.png

 

Bom essa lib é para ajudar noobs, iniciantes, intermediarios. Pode parecer complexo mais no fundo não é. Para quem não se da bem com os nomes das funçoes do tipo:

SetPlayerHealthMaxPowerOfTeSexy(cid,10)

Essa lib vai ajudar.

Você pra começar a usar é so intalar, no final eu ensino...

 

Bom para usar em seu script basta por isso sempre que for usar:

local user = Player:new(cid)

 

Exemplo:

function onUse(cid,item,frompos)
   local user = Player:new(cid)
   --q
end

Ela vai tornar user o player, entao você pode mudar varias coisas instantaneamente como o hp assim:

function onUse(cid,item,frompos)
   local user = Player:new(cid)
   user.health = 100
end

^Vai deixar o player com 100 de hp

Tambem funciona assim se quiser:

user.health = user.health+100
user:addhealth(100)

^ nesse caso vai deixar o player com 100 de hp amais (adcionar)

 

Talvez vocês não entendam mais existe uma sintaxe

 

[OBJ]:[METHOD][VALUE](PARAMS)

 

Exemplo:

user:addhealth(10)
user:domove(0)
user:gethealth()
user:dosay('hello',TALKTYPE_YELL)

 

o metodo set é assim

[OBJ].[VALUE] = [VAR]

exemplo:

user.health = 100
user.position = {x=300,y=200,z=5}

Para setar algo que precise de mais de um valor exemplo storage value use assim:

U = Player:new(cid)
U.storage = U:pack(6544,25)
--OU
user:setPack(25)
user.storage = 6544

 

Tambem funciona com funçoes padrões do server colocando cid como arg inicial

user:doCreatureSay('hail',3)
user:doSetPlayerStorageValue(43911,100)
user:print('omg')
user:doRemoveCreature()

 

[OBJ]:[FUNC]([PARAM])

 

Se não acredita que a lib faz isso basta testar:

function health(user)
    print(user.health)
    user.health=1000
    addEvent(health,5000,user)
end
function onSay(cid, words, param, channel)
       local user = Player:new(cid)
       print(user.health)
       user.health=1000
       addEvent(health,5000,user)
return TRUE
end

 

 

Agora para instalar crie um lua qualquer no data/lib e coloque isso:

--[[
	~ * ~ Player Class v 1.0 ~ * ~
				By Mock the Bear
MTB

*Global info:
	-With this lib you create a player object
	-with this object you can change almost all
	-player status like health mana pos etc...
*Use:
	-First you have to create the class
	- 	local user = Player:new(cid)
	-And then you can use like:
	- 	print(user.health)
	-I the player got 1k of health it will
	-print 1000, and if the player lose like
	-150 health in combat and you print aigan
	-it shows 850.
	-Also you can change the health like:
	-	user.health = 100
	-Or:
	- 	user.addhealth(100)
	-	-- The same
	-   user:addhealth(100)
	-Like:
	- 	user:domove(0)
	-The syntax is:
	-	[OBJ]:[METHOD][VALUE](PARAMS)
	-	user:addhealth(10)
	-	user:domove(0)
	-	user:gethealth()
	-The method get do not need use like as function
	-you can use only user.health because method get is defaut.
	-The avaliable methods is DO ADD and GET
	-The set method is only to events like
	-	user.health = 100
	-If you need change the pos (using teleport in set method)
	-and need one more param use like:
	-	user:setPack(false)
	-	user.position = {x=300,y=200,z=5}
	-To understand better lets think in another function
	-Like setPlayerStorageValue
	-   user:setPack(100)
	- 	user.storage = 4911
	-This code will set the storage value 4911 to value 100
	-And then if you need you can just use like:
	-	user:doMoveCreature(0)
	- 	user:setPlayerStorageValue(4911,100)
	-You can use in ALL functions (works in your self made funcs),
	-the code set the ard #1 to cid and call the function.

Contact: [email][email protected][/email]


]]
Player = {debug=false,n=0,cid={},defaut='get'}
---Compat some funcions~
function doCreatureSetHealth(cid,h,...)
local now = getCreatureHealth(cid)
doCreatureAddHealth(cid,h-now)
end
function doCreatureSetMana(cid,h)
local now = doCreatureSetMana(cid)
doPlayerAddMana(cid,h-now)
end
---Get,do,add can be used as print(player.health), player.domove(1) or player.addhealth(100))
Player.get = { --
--Health
['health'] = getCreatureHealth,
['maxhealth'] = getCreatureMaxHealth,
--Mana
['mana'] = getCreatureMana,
['maxmana'] = getCreatureMaxMana,
['requiredmana'] = getPlayerRequiredMana,
['spentmana'] = getPlayerSpentMana,
--ETC
['position'] = getCreaturePosition,
['rates'] = getPlayerRates,
['stamina'] = getPlayerStamina,
['storage'] = getPlayerStorageValue,
['town'] = getPlayerTown,
['vocation'] = getPlayerVocation,
['voc'] = getPlayerVocation,
['weapon'] = getPlayerWeapon,
['target'] = getCreatureTarget,
['summons'] = getCreatureSummons,
['speed'] = getCreatureSpeed,
['skull'] = getCreatureSkull,
['outfit'] = getCreatureOutfit,
['nomove'] = getCreatureNoMove,
['name'] = getCreatureName,
['lookdir'] = getCreatureLookDirection,
['lastpos'] = getCreatureLastPosition,
['condition'] = getCreatureCondition,
['basespeed'] = getCreatureBaseSpeed,
['access'] = getPlayerAccess,
['account'] = getPlayerAccount,
['accountid'] = getPlayerAccountId,
['blessing'] = getPlayerBlessing,
['depotitems'] = getPlayerDepotItems,
['exp'] = getPlayerExperience,
['flag'] = getPlayerFlagValue,
['food'] = getPlayerFood,
['freecap'] = getPlayerFreeCap,
['guid'] = getPlayerGUID,
['groupid'] = getPlayerGroupId,
['guildid'] = getPlayerGuildId,
['guildlvl'] = getPlayerGuildLevel,
['guildname'] = getPlayerGuildName,
['guildnick'] = getPlayerGuildNick,
['guildrank'] = getPlayerGuildRank,
['guildrankid'] = getPlayerGuildRankId,
['idle'] = getPlayerIdleTime,
['ip'] = getPlayerIp,
['instantcount'] = getPlayerInstantSpellCount,
['itembyid'] = getPlayerItemById,
['itemcount'] = getPlayerItemCount,
['lastload'] = getPlayerLastLoad,
['lastlogin'] = getPlayerLastLogin,
['lastsave'] = getPlayerLastLoginSaved,
['masterpos'] = getPlayerMasterPos,
['skill'] = getPlayerSkill,
['skilllevel'] = getPlayerSkillLevel,
['skilltries'] = getPlayerSkillTries,
['skullend'] = getPlayerSkullEnd,
['skulltype'] = getPlayerSkullType,
['slotitem'] = getPlayerSlotItem,
['soul'] = getPlayerSoul,
}
Player.add = {
['health'] = doCreatureAddHealth,
['mana'] = doPlayerAddMana,
['spentmana'] = doPlayerAddSpentMana,
['addons'] = doPlayerAddAddons,
['bless'] = doPlayerAddBlessing,
['blessing'] = doPlayerAddBlessing,
['exp'] = doPlayerAddExperience,
['item'] = doPlayerAddItem,
['itemex'] = doPlayerAddItemEx,
['level'] = doPlayerAddLevel,
['maglevel'] = doPlayerAddMagLevel,
['mapmark'] = doPlayerAddMapMark,
['outfit'] = doPlayerAddOutfit,
['skill'] = doPlayerAddSkill,
['skilltry'] = doPlayerAddSkillTry,
['soul'] = doPlayerAddSoul,
['spell'] = doPlayerAddSpell,
['stamina'] = doPlayerAddStamina,
['feed'] = doPlayerFeed,
['joinparty'] = doPlayerJoinParty,
['learnspell'] = doPlayerLearnInstantSpell,
['fyi'] = doPlayerPopupFYI,
['removeoutfit'] = doPlayerRemOutfit,
['removeitem'] = doPlayerRemoveItem,
['resetidle'] = doPlayerResetIdleTime,



['money'] = function(cid,amn,...) if amn > 0 then return doPlayerAddMoney(cid,amn,...) else return doPlayerRemoveMoney(cid,amn,...) end end,
['premdays'] = function(cid,amn,...) if amn > 0 then return doPlayerAddPremiumDays(cid,amn,...) else return doPlayerRemovePremiumDays(cid,amn,...) end end,


}
Player['do'] = {
['move'] = doMoveCreature,
['summom'] = doSummonCreature,
['remove'] = doRemoveCreature,
['say'] = doCreatureSay,
['mute'] = doMutePlayer,
['broadcast'] = doPlayerBroadcastMessage,
['buyitem'] = doPlayerBuyItem,
['buyitemcontainer']= doPlayerBuyItemContainer,
['save'] = doPlayerSave,
['sendcancel'] = doPlayerSendCancel,
['cancel'] = doPlayerSendCancel,
['channelmessage'] = doPlayerSendChannelMessage,
['defautcancel'] = doPlayerSendDefaultCancel,
['outfitwindow'] = doPlayerSendOutfitWindow,
['textmessage'] = doPlayerSendTextMessage,
['message'] = doPlayerSendTextMessage,
['tutorial'] = doPlayerSendTutorial,
['removeaccban'] = doRemoveAccountBanishment,
['removecondition'] = doRemoveCondition,
['removeconditions']= doRemoveConditions,

}

---Set can be used like: player.health = 1000
Player.set = {
--Health
['health'] = doCreatureSetHealth,
['maxhealth'] = setCreatureMaxHealth,
--Mana
['mana'] = doCreatureSetHealth,
['maxmana'] = setCreatureMaxMana,
--Etc
['position'] = doTeleportThing,
['outfit'] = doSetCreatureOutfit,
['light'] = doSetCreatureLight,
['skull'] = doCreatureSetSkullType,
['nomove'] = doCreatureSetNoMove,
['lookdir'] = doCreatureSetLookDirection,
['dir'] = doCreatureSetLookDirection,
['changeoutfit'] = doCreatureChangeOutfit,
['idle'] = doPlayerSetIdleTime,
['level'] = doPlayerSetLevel,
['exprate'] = doPlayerSetExperienceRate,
['groupid'] = doPlayerSetGroupId,
['guildid'] = doPlayerSetGuildId,
['guildlevel'] = doPlayerSetGuildLevel,
['guildnick'] = doPlayerSetGuildNick,
['losspercentlevel']= doPlayerSetLossPercent,
['losspercentskill']= doPlayerSetLossSkill,
['magicrate'] = doPlayerSetMagicRate,
['maxcap'] = doPlayerSetMaxCapacity,
['rate'] = doPlayerSetRate,
['sex'] = doPlayerSetSex,
['skillrate'] = doPlayerSetSkillRate,
['skullend'] = doPlayerSetSkullEnd,
['stamina'] = doPlayerSetStamina,
['storage'] = doPlayerSetStorageValue,
['town'] = doPlayerSetTown,
['vocation'] = doPlayerSetVocation,



}
function table.skipOne(t)
local tr = {}
for i,b in pairs(t) do
	if not i ~= 1 then
		tr[i-1] = b
	end
end
return #tr ~= 0 and tr or {nil}
end
function Player:check(cid)
if not isPlayer(cid) then
	self.cid[cid] = nil
	return false
end
return true
end
function Player:new(cid)
assert(cid ,'Player not found')
if self.cid[cid] then
	return self.cid[cid]
end
self.n = self.n+1
local player={}
local t_ = {}    --- newproxy(true) Tirei a newproxy por que o Socket tava chorando por que deacordo com ele a função foi descoberta por ele.
local _t = player
player = {}
getmetatable(t_).cid = cid
getmetatable(t_).pack = {}
getmetatable(t_).mid = self.n
getmetatable(t_).setPack = function(...)
	getmetatable(t_).packet = {}
	collectgarbage()
	getmetatable(t_).packet = table.skipOne({...})
end
getmetatable(t_).getPack  = function()
	local pack = getmetatable(t_).packet
	getmetatable(t_).packet = {}
	return pack
end

getmetatable(t_).pack = function(...)
	return {pack=true,unpack(table.skipOne({...}))}
end
getmetatable(t_).unpack = function(cid,pack_)
	if pack_ and #pack_ ~= 0 then
		pack_.pack = nil
		return cid,unpack(pack_)
	else
		return cid
	end
end
getmetatable(t_).__index = function (t,k,q)
       if self.debug then
		print("[PLAYER DEBUG] Ascess value: "..tostring(t).."[" .. tostring(k)..'] on player '..getCreatureName(getmetatable(t_).cid)..' - '..getmetatable(t_).cid,q)
	end
	if self:check(getmetatable(t_).cid) then
		if k == 'unpack' then
			return getmetatable(t_).unpack
		elseif k == 'pack' then
			return function(...)
				return getmetatable(t_).pack(...)
			end
		elseif k == 'getPack' then
			return getmetatable(t_).getPack()
		elseif k == 'setPack' then
			return function(...)
				return getmetatable(t_).setPack(...)
			end
		end

		local k_ = tostring(k):lower()
		if k_:sub(1,3) == 'get' then
			if Player.get[k_:sub(4,-1)] then
				return function(...)
					local v1 = table.skipOne({...})
					local v2 = getmetatable(t_).getPack()
					local ret = #v1 ~= 0 and v1 or v2
					return Player.get[k_:sub(4,-1)](getmetatable(t_).cid,unpack(ret))
				end
			end
		elseif k_:sub(1,3) == 'add' then
			if Player.add[k_:sub(4,-1)] then
				return function(...)
					local v1 = table.skipOne({...})
					local v2 = getmetatable(t_).getPack()
					local ret = #v1 ~= 0 and v1 or v2
					return Player.add[k_:sub(4,-1)](getmetatable(t_).cid,unpack(ret))
				end
			end
		elseif _G[k] then
			return function(...)
				local cid = getmetatable(t_).cid
				local npack = {...}
				local last = 0
				for i,b in pairs(npack) do
					last = i
					if i ~= 1 then
						npack[i-1] = b
					end
				end
				npack[last] = nil
				collectgarbage()
				return _G[k](cid,unpack(npack))
			end
		elseif k_:sub(1,2) == 'do' then
			if Player['do'][k_:sub(3,-1)] then
				return function(...)
					local v1 = table.skipOne({...})
					local v2 = getmetatable(t_).getPack()
					local ret = #v1 ~= 0 and v1 or v2
					return Player['do'][k_:sub(3,-1)](getmetatable(t_).cid,unpack(ret))
				end
			end
		else
			if Player[self.defaut][k_] then
				return Player[self.defaut][k_](getmetatable(t_).cid,unpack(getmetatable(t_).getPack()))
			else
				return _t[k]
			end
		end
		return _t[k]
	else
		return false
	end
end
getmetatable(t_).__newindex = function (t,k,v,...)
	if self:check(getmetatable(t_).cid) then
		if self.debug then
			print("[PLAYER DEBUG] Change k: "..tostring(t).."[" .. tostring(k)..'] = '..tostring(v)..' on player '..getCreatureName(getmetatable(t_).cid)..' - '..getmetatable(t_).cid)
		end
		if _t[k] then
			_t[k] = v
		else
			if Player.set[k:lower()] then
				Player.set[k:lower()](getmetatable(t_).unpack(getmetatable(t_).cid,v))
			else
				_t[k] = v
			end
		end
	end
   end
   setmetatable(player, getmetatable(t_))
self.cid[cid] = player
return player,self.n
end

 

By mock :D

 

 

Action simples:

local health_per_cycle = 100
function onUse(cid,item)
   local cid = Player:new(cid)
   if cid.health > health_per_cycle then
       if cid:getstorage(16544) <= os.time() then
           cid.storage = U:pack(16544,os.time()+2) --- 2 secs of exhaust
           cid.addhealth = -100 
           cid.addmana = 100
           cid:doCreatureSay('Ahhh',1)
           doSendMagicEffect(cid.position,12)
           doRemoveItem(item.uid)
       else 
            cid:doPlayerSendCancel('You are exhausted.')
       end
   else 
       cid:doPlayerSendCancel('Sorry, no health.')
   end
end

Editado por Mock

Compartilhar este post


Link para o post
Oneshot    24
Oneshot

Mock,

 

Deveria ser criado um sistema de aprovação automática para suas contribuições em LUA para a OTServ Brasil. Desculpe pela demora e parabéns.

Aprovado

Você será remunerado por forças superiores.

Compartilhar este post


Link para o post
Mock    32
Mock

Mock,

 

Deveria ser criado um sistema de aprovação automática para suas contribuições em LUA para a OTServ Brasil. Desculpe pela demora e parabéns.

Aprovado

Você será remunerado por forças superiores.

Seria bom :P

 

AMAGAD, um lobo -q

parabens pelo cargo :P

thx

Editado por Garou

Compartilhar este post


Link para o post
Socket    0
Socket

Cadê meus créditos por criar uma maneira de usar o newproxy como objeto? Seu safadênho.

 

E até parece que POO vai ajudar iniciante, fez isso só pra se exibir mesmo, né. (se não fosse não teria usado newproxy, até porquê a única coisa que ele faz é aumentar o code, nesse caso)

Legal, pelo menos agora tu começa a usar POO.

 

Att,

Socket.

Editado por Socket

Compartilhar este post


Link para o post
Rules Violations    0
Rules Violations

pelo que vi está usando POO nessa nova action .. é atraente mais scripts padronizados chegam a ser mais simples que isso.

 

local health_per_cycle = 100

function onUse(cid,item)

local cid = Player:new(cid)

if cid.health > health_per_cycle then

if cid:getstorage(16544) <= os.time() then

cid.storage = U:pack(16544,os.time()+2) --- 2 secs of exhaust

cid.addhealth = -100

cid.addmana = 100

cid:doCreatureSay('Ahhh',1)

doSendMagicEffect(cid.position,12)

doRemoveItem(item.uid)

else

cid:doPlayerSendCancel('You are exhausted.')

end

else

cid:doPlayerSendCancel('Sorry, no health.')

end

==========================

local health_per_cycle = 100

function onUse(cid,item)

if getCreatureHealth(cid) > health_per_cycle then

if getPlayerStorageValue(cid, 16544) <= os.time() then

setPlayerStorageValue(cid, 16544,os.time()+2) --- 2 secs of exhaust

doCreatureAddHealth(cid, -100)

doCreatureAddMana(cid, 100)

doCreatureSay(cid, 'Ahhh', 1)

doSendMagicEffect(cid,12)

doRemoveItem(item.uid)

else

doPlayerSendCancel(cid, 'You are exhausted.')

end

else

doPlayerSendCancel(cid, 'Sorry, no health.')

end

 

?

Editado por Rules Violations

Compartilhar este post


Link para o post
josejunior23    2
josejunior23

o script em si, esta bom, porem nao sei se ajuda, pois nao ha uma grande diferenca.

os que nao querem decorar as outras funcoes, vao ter que decorar essas, va... tudo bem que e mais facil, para principiantes, mas e quando eles aprenderem e quiserem usar as outras? mas e na hora de publicar o script? tem de vir com essa lib toda?

 

resumindo, voce fez um GRANDE trabalho para pouca coisa.

espero que eu esteja errado e ajude quem precisar! Parabens.

Editado por josejunior23

Compartilhar este post


Link para o post
ManoloMano    0
ManoloMano

mais uma lib do mock

isso faz o uso do processador ir a 100% e memória 60%? valeu!

Compartilhar este post


Link para o post
tigerx2    1
tigerx2

Faz o fácil ficar difícil :palm:

btw, lib lecal :)

 

E até parece que POO vai ajudar iniciante, fez isso só pra se exibir mesmo, né.²

Compartilhar este post


Link para o post
iuniX    4
iuniX

E até parece que POO vai ajudar iniciante, fez isso só pra se exibir mesmo, né.³

Compartilhar este post


Link para o post
LsM    2
LsM

Nossa, na minha opinião, dificultou ainda mais para iniciantes O.O...

 

Ex.:

 

user:doRemoveCreature()

 

Porque não simplismente:

 

doRemoveCreature(cid)

 

Acho que a lib serviu apenas para alertar os iniciantes nível -10 de que CID é relacionado à criatura.

Compartilhar este post


Link para o post
Mock    32
Mock

@Rules Violations

Pra um iniciante usar player.health player.speed é mais facil do que usar a função propriamente dita, tambem como eu disse vc pode usar normalmente.

@tigerx2 & iunix & LsM

da proxima vez leiam o topico.

pra vocês realmente user:doRemoveCreature() dificulta por que vocês n tao acostumados a ver : nos codes padronizados. Mais pra quem ta começando usar : . < > == not do é a o mesmo nivel de dificuldade.

A proposito:

user:doRemoveCreature()

quem disse que é a unica maneira?

doRemoveCreature(cid)

doRemoveCreature(user.cid)

 

fora que é a unica função que precisa usar assim as outras podem ser usadas assim:

user.position = {x=~}

user.addItem = 6500,100

user.doAlgumaCoisa = true < coloquei true só como param.

 

@Socket

Eu coloquei newproxy só pra fazer se fazia diferença e vi que n fazia entao dexei la, se for pra fica xorando eu edito o topico e tiro entao. (como se a função fosse sua)

 

POO ajudar iniciante? Java é em POO pra iniciante comofas? e inicialmente n precisava ser -.-'

O players vão usar lua como java

[player][valor] = [numero]

player.health = 100

Pense que eu n fiz isso pra você n filho, eu fiz pra inciante que n sabe de nd, ele vai olha pra lib e vai passa direto n vai ta se preocupando se eu usei newproxy ou se usei 1 linha a mais ou se usei n sei oq a 4.

pra um iniciante usar o metodo padrão ou esse ai vai da na mesma só que com o meu fica mais facil.

Compartilhar este post


Link para o post
Socket    0
Socket

Mock, por quê você está irritado?

Foi apenas comentários, quem disse que só complica mais apenas comentou que aquela era a opinião deles.

 

Sobre o newproxy, é apenas uma função como essa:

static int newproxy(lua_State *L) // Socket

{

lua_newuserdata(L, 10); // Choose the size

lua_newtable(L);

lua_setmetatable(L, -2);

return 1;

}

 

O que eu disse é que quando você me mostrou o newproxy você não sabia usá-lo como um objeto, até depois que eu fiz minha função Class. Eu estou apenas brincando com você.

O problema em usar o newproxy é processo, você irá consumir muito mais processo usando o newproxy.

 

Quanto ao seu exemplo, Java e Lua são linguagens diferentes, Java é orientado a objetos por padrão, enquanto o objetivo de Lua foi ser uma linguagem interpretada leve e flexivel. Mesmo assim Lua fornece meta tabelas, para que seja possível a simulação do conhecido OOP, atráves do metamétodo __index apontado para o próprio objeto.

 

Se a linguagem de scripting adotada pelo opentibia fosse o JavaScript, todos usariam a orientação a objetos normalmente sim, pois essa seria a única maneira, a padrão e mais fácil. Enquanto pela sua biblioteca, eles iriam aprender totalmente errado (Lua).

 

Essa é apenas a MINHA opinião, o que eu acho sobre isso, não estou desmerecendo você ou sua biblioteca.

 

Atenciosamente, Socket.

Compartilhar este post


Link para o post
Conde2    0
Conde2
Mock, por quê você está irritado?

Quanto ao seu exemplo, Java e Lua são linguagens diferentes, Java é orientado a objetos por padrão, enquanto o objetivo de Lua foi ser uma linguagem interpretada leve e flexivel. Mesmo assim Lua fornece meta tabelas, para que seja possível a simulação do conhecido OOP, atráves do metamétodo __index apontado para o próprio objeto.

 

 

Na parte de comparação ele só quis dizer que não dificulta nada para os iniciantes usar POO.

Ele certamente não quis comparar as linguagens de programação em si somente o uso do POO

 

Se a linguagem de scripting adotada pelo opentibia fosse o JavaScript, todos usariam a orientação a objetos normalmente sim, pois essa seria a única maneira, a padrão e mais fácil. Enquanto pela sua biblioteca, eles iriam aprender totalmente errado (Lua).

 

Em um ponto concordamos, mas hoje em dia praticamente ninguem da comunidade quer aprender LUA PURO e OpenTibia já ensina lua de um modo errado, muitos pensam que LUA é uma linguagem própria de OT.

E se ele realmente quis se mostrar com a lib dele outros deveriam fazer o mesmo, pois mesmo se mostrando esta ajudando a comunidade.

 

@Tópico

Sobre a lib é um exelente trabalho só que caso um scripter defina Player como sendo uma variável global com qualquer valor vai dar merds

Compartilhar este post


Link para o post
J John    0
J John

Afinal, isso é como se fosse um resumo das funções?

Um atalho pra quem nao as conhece?

valeu!

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×