Ir para conteúdo

[npc's] Guild Master E Banker


zaitch

Posts Recomendados

Aff, procurei muuito não só no Xtibia, mas em outros sites relacionados à OT procurando estes dois NPC's: Banker e um Guild Master, ambos pra 8.4.

Aqui (xtibia) tem vários, só que nenhum deles funcionou no meu TFS 0.2! Sempre dava um erro diferente q eu não conseguia consertar --'

Quem tem, poderia me passar? ._.'

Link para o comentário
Compartilhar em outros sites

Este funciona em TFS 0.2 concerteza, estou usando ele :smile_positivo:

NPC de banco

Npc.xml

<?xml version="1.0" encoding="UTF-8"?>
<npc name="NOME LOL" script="data/npc/scripts/Banco.lua" walkinterval="25" floorchange="0" access="5" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="129" head="114" body="119" legs="114" feet="114" corpse="2212"/>
<parameters>
</parameters>
</npc>

 

Script

focus = 0
talk_start = 0
target = 0
dep = 0
wit = 0
trans = 0
following = false
attacking = false

gold_id = 2148
plat_id = 2152
crys_id = 2160

function onThingMove(creature, thing, oldpos, oldstackpos)

end

function onCreatureAppear(creature)

end

function onCreatureDisappear(cid, pos)
  if focus == cid then
	  selfSay('Good bye.')
	  focus = 0
	  talk_start = 0
	  doNpcSetCreatureFocus(0)
  end
end

function onCreatureTurn(creature)

end


function onCreatureSay(cid, type, msg)
msg_org = msg
  msg = string.lower(msg)
	nome = getCreatureName(cid)

--------------------------------------Begin----------------------------------------------

  if (msgcontains(msg, 'hi') or msgcontains(msg, 'hello')) and (focus == 0) and getDistanceToCreature(cid) < 4 then
	doNpcSetCreatureFocus(cid)
	dep = 0
	wit = 0
	trans = 0
	  selfSay('Hello ' .. nome .. '! What can I do for you? Deposit, withdraw, check balance or transfer?')
	  focus = cid
	talk_start = os.clock()		  
  elseif msgcontains(msg, 'hi') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then --NPC is talking with other player
	  selfSay('Sorry '..nome..', I am already talking to a customer. Take a seat, please..')
end

--------------------------------------Deposit----------------------------------------------


if dep == 0 then
	if (msgcontains(msg, 'deposit')) and (focus == cid) and getDistanceToCreature(cid) < 4 then
		selfSay('Please tell me how much gold it is you would like to deposit.')
		dep = 1
		wit = 0
		trans = 0
		talk_start = os.clock()
	end
end


  if dep == 1 then
	if (focus == cid) and getDistanceToCreature(cid) < 4 then
		n = getNumber(msg)
		if n ~= 0 then --player told valid number, higher than 0
			talk_start = os.clock()
			selfSay('Would you really like to deposit  '..n..' gold?')
			dep = 2
		end
	end
end	


if dep == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then
	if (msgcontains(msg, 'yes'))  then --player want deposit
		dep = 0
		talk_start = os.clock()
		if doPlayerRemoveMoney(cid, n) == TRUE then --get cash from player backpack
			setBA(nome,getBA(nome)+n)
			selfSay('Alright, we have added the amount of '..n..' gold to your balance. You can withdraw your money anytime you want to. Your account balance is '..getBA(nome)..'.')
		else --player doesn't have enought cash in backpack
			selfSay('You do not have enough gold.')
		end
	end
	if (msgcontains(msg, 'no')) then --player doesn't want deposit
		selfSay('As you wish. Is there something else I can do for you?')
		dep = 0
		talk_start = os.clock()
	end
end

-------------------------------------------Withdraw---------------------------------------

if wit == 0 then
	if (msgcontains(msg, 'withdraw')) and (focus == cid) and getDistanceToCreature(cid) < 4 then
		selfSay('Please tell me how much gold you would like to withdraw.')
		dep = 0
		trans = 0
		wit = 1
		talk_start = os.clock()
	end
end


if wit == 1 then
	if (focus == cid) and getDistanceToCreature(cid) < 4 then
		n = getNumber(msg)
		if n ~= 0 then --player told valid number, higher than 0
			talk_start = os.clock()
			selfSay('Are you sure you wish to withdraw '..n..' gold from your bank account?')
			wit = 2
		end
	end
end 


if wit == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then
	if (msgcontains(msg, 'yes'))  then --player want withdraw
		wit = 0
		talk_start = os.clock()
		if n <= getBA(nome) then --player has enought cash on account
			setBA(nome,getBA(nome)-n) --get cash from player account

			gold = n
			plat = 0
			crys = {}
			crys[1] = 0
			i = 1
			--start counting how many crystal, platinum and gold coins NPC should givve
			repeat
				if gold >= 100 then
					plat = plat + 1
					gold = gold - 100
				end
			until gold < 100

			repeat
				if plat >= 100 then
					if crys[i] == 100 then
						i = i + 1
						crys[i] = 0
					end
					crys[i] = crys[i] + 1
					plat = plat - 100
				end
			until plat < 100
			--now script give crytal, platinum and gold coins to player (BP/hands if free)
			if crys[1] > 0 then
				repeat
					doPlayerAddItem(cid, crys_id, crys[i])
					i = i-1
				until i == 0
			end

			if plat > 0 then
				doPlayerAddItem(cid, plat_id, plat)
			end

			if gold > 0 then
				doPlayerAddItem(cid, gold_id, gold)
			end

			selfSay('Here you are, '..n..' gold. Please let me know if there is something else I can do for you. Your account balance is '..getBA(nome)..'.')
		else --player doesn't have enought cash on this bank account, can't withdraw that much
			selfSay('There is not enough gold on your account.')
		end
	end
	if (msgcontains(msg, 'no')) then --player doesn't want to withdraw
		selfSay('The customer is king! Come back anytime you want to if you wish to withdraw your money.')
		wit = 0
		talk_start = os.clock()
	end
end

-------------------------------------------Balance---------------------------------------

if (msgcontains(msg, 'balance')) and (focus == cid) and getDistanceToCreature(cid) < 4 then --player who is talking with NPC want to know his account balance
	selfSay('Your account balance is '..getBA(nome)..' gold.')
	dep = 0
	wit = 0
	trans = 0
	talk_start = os.clock()
end

-------------------------------------------Transfer---------------------------------------

if trans == 3 and (focus == cid) and getDistanceToCreature(cid) < 4 then
	if (msgcontains(msg, 'yes')) then --if he want to tranfer
		playerbalance = getBA(nome) --get balance value of player
		if setBA(rec, getBA(rec)+quant) > 0 then -- if script set new balance get cash from transfering player account
			playerbalance = playerbalance - quant
			setBA(nome, playerbalance)
			selfSay('You have transferred '..quant..' gold to '..rec_org..'. Your account balance is '..playerbalance..' gold.')
			trans = 0
			talk_start = os.clock()
		else --problem with database? dont lose money..
			selfSay('Problem with transfer. Sorry.')
			trans = 0
			talk_start = os.clock()
		end
	elseif (msgcontains(msg, 'no')) then -- if he dont want to tranfer
		selfSay('Ok. What is next?')
		trans = 0
		talk_start = os.clock()  
	end
end

if trans == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then
	if getBA(msg) >= 0 then --player with this name exist
		rec = msg
		rec_org = msg_org
		selfSay('So you would like to transfer '..quant..' gold to '..rec_org..'?')
		trans = 3
		talk_start = os.clock()  
	else --player with this name doesn't exist
		selfSay('This player does not exist. Please tell me other name.')
		trans = 2
		talk_start = os.clock()  
	end
end

if trans == 1 and (focus == cid) and getDistanceToCreature(cid) < 4 then
	quant = getNumber(msg)
	if quant > 0 then -- its number and is higher than 0
		if getBA(nome) >= quant then -- player who want to transfer has enought cash on account
			selfSay('Who would you like transfer '..quant..' gold to?')
			trans = 2
			talk_start = os.clock()  
		else -- player who want to transfer has not enought cash on account
			selfSay('There is not enough gold on your account. Your account balance is '..getBA(nome)..'. Please tell me the amount of gold coins you would like to transfer.')
			trans = 1
			talk_start = os.clock()  
		end
	else --player told 0 or lower number or word like "asd" (its not a number)
		selfSay('Please tell me the amount of gold coins you would like to transfer.')
		talk_start = os.clock()  
		trans = 1
	end
end

if trans == 0 then
if (msgcontains(msg, 'transfer')) and (focus == cid) and getDistanceToCreature(cid) < 4 then 
	selfSay('Please tell me the amount of gold coins you would like to transfer.')
	dep = 0
	wit = 0
	trans = 1
	talk_start = os.clock()
end
end

-------------------------------------------End--------------------------------------------

if (msgcontains(msg, 'bye')) and (focus == cid) and getDistanceToCreature(cid) < 4 then --player say "bye" - npc answer
	doNpcSetCreatureFocus(0)
	selfSay('Good bye.')
	focus = 0
	dep = 0
	wit = 0
	trans = 0
end
end

function onCreatureChangeOutfit(creature)

end


function onThink()
  if (os.clock() - talk_start) > 30 then --if player did not say anything from 30 seconds say "next please" and wait for another customer
	  if focus > 0 then
		doNpcSetCreatureFocus(0)
		  selfSay('Next please...')
	  end
	focus = 0
	dep = 0
	wit = 0
	trans = 0
  end
	if focus ~= 0 then
		if getDistanceToCreature(focus) > 5 then --if distance to player is higher than 5 say bye
		doNpcSetCreatureFocus(0)
			selfSay('Good bye.')
			focus = 0
		dep = 0
		wit = 0
		trans = 0
		end
	end
end


function getNumber(txt) --return number if its number and is > 0, else return 0
x = string.gsub(txt,"%a","")
x = tonumber(x)
if x ~= nill and x > 0 then
return x
else
return 0
end
end

function msgcontains(txt, str)
  return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end

function setBA(name, nvalue) --save bank account value for online and offline players
local cid = getPlayerByName(name)
set_status = -1
if isPlayer(cid) == TRUE then
	--player is online 
	setPlayerStorageValue(cid,300,nvalue)
	set_status = 1
	return 1
else
	--player is offline, load DB connection info and connect
	dofile("./config.lua")
	if sqlType == "mysql" then 
		 env = assert(luasql.mysql()) 
		 con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) 
	else -- sqlite 
		 env = assert(luasql.sqlite3()) 
		 con = assert(env:connect(sqliteDatabase)) 
	end 
	--check is player exist
	local nametodb = escapeString(name)
	result_plr = assert(con:execute("SELECT `id` FROM `players` WHERE `name` = '" .. nametodb .. "';"))
	player = result_plr:fetch({}, "a")
	local players = 0
	local guid = 0
	while player do
		players = players + 1
		guid = tonumber(player.id)
		player = result_plr:fetch (player, "a")
	end
	if players > 0 then
		if guid > 0 then
		--player exist, check his account status
			storageqry = assert(con:execute("SELECT `value` FROM `player_storage` WHERE `player_id` = '" .. guid .. "' AND `key` = 300;"))
			storage = storageqry:fetch({}, "a")
			local whiles = 0
			while storage do
				whiles = whiles + 1
				storage = storageqry:fetch (storage, "a")
			end
			if whiles < 1 then
				--if player hasn't account, create account and set account balance value 'nvalue'
				assert(con:execute("INSERT INTO `player_storage` (`player_id` ,`key` ,`value`) VALUES ('" .. guid .. "', '300', '" .. nvalue .. "');"))
				set_status = 1
			else
				assert(con:execute("UPDATE `player_storage` SET `value` = '" .. nvalue .. "' WHERE `player_id` = '" .. guid .. "' AND `key` = 300;"))
				set_status = 1
			end
		end
	else
		--player with this name doesn't exist
		set_status = -1
	end
	con:close()
	env:close()
end
--if player not exist return -1
--if player exist return his bank account value
return set_status
end

function getBA(name) -- check account balance for offline and online players
local cid = getPlayerByName(name)
if isPlayer(cid) == TRUE then
	--player is online 
	local player_cash_str = getPlayerStorageValue(cid, 300)
	--create bank account if not exist
	if player_cash_str < 0 then
		setPlayerStorageValue(cid,300,0)
		player_cash = 0
	else
		player_cash = player_cash_str
	end
else
	--player is offline, load DB connection info and connect
	dofile("./config.lua")
	if sqlType == "mysql" then 
		 env = assert(luasql.mysql()) 
		 con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) 
	else -- sqlite 
		 env = assert(luasql.sqlite3()) 
		 con = assert(env:connect(sqliteDatabase)) 
	end 
	--check is player exist
	local nametodb = escapeString(name)
	result_plr = assert(con:execute("SELECT `id` FROM `players` WHERE `name` = '" .. nametodb .. "';"))
	player = result_plr:fetch({}, "a")
	local players = 0
	local guid = 0
	while player do
		players = players + 1
		guid = tonumber(player.id)
		player = result_plr:fetch (player, "a")
	end
	if players > 0 then
		if guid > 0 then
		--player exist, check his account status
			storageqry = assert(con:execute("SELECT `value` FROM `player_storage` WHERE `player_id` = '" .. guid .. "' AND `key` = 300;"))
			storage = storageqry:fetch({}, "a")
			local whiles = 0
			while storage do
				whiles = whiles + 1
				player_cash = tonumber(storage.value)
				storage = storageqry:fetch (storage, "a")
			end
			if whiles < 1 then
				--if player hasn't account, create account and set account balance value to 0
				assert(con:execute("INSERT INTO `player_storage` (`player_id` ,`key` ,`value`) VALUES ('" .. guid .. "', '300', '0');"))
				player_cash = 0
			end
		end
	else
		--player with this name doesn't exist
		player_cash = -1
	end
	con:close()
	env:close()
end
--if player not exist return -1
--if player exist return his bank account value
return player_cash
end

Link para o comentário
Compartilhar em outros sites

  • 4 weeks later...
  • 1 month later...
Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...