Ir para conteúdo
  • Cadastre-se

(Resolvido)[Erro] Script deixa você com Pontos negativo


Ir para solução Resolvido por lordzetros,

Posts Recomendados

  • Moderador

Esse script é para transferir Premium Points para outro jogador. Quando você pega o Documento para transferir os Pontos para o outro jogador, você fica com Pontos negativo na DB. Script feito pelo @Danyel Varejao.

Sem ter comprado o Documento.

image.thumb.png.533dc068751184382929251d834aa9aa.png

Quando compra o Documento.

image.thumb.png.c3dd519652557f69131e6d71a05c32b2.png

Os pontos negativos são acumulativos, tipo, se você pega um documento de 10 Premium Points você fica com -10, se você pega outro documento com o valor de 40 Premium Points, você fica com -50

Npc.lua <Script Npc>

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 greetCallback(cid)
	talkState[cid] = 0
	return true
end

function creatureSayCallback(cid, type, msg)
	if (not npcHandler:isFocused(cid)) then
		return false
	end
	if talkState[cid] == nil or talkState[cid] == 0 then
		Count_Points = tonumber(msg)
		if isInArray(Points_Trade.Points, Count_Points) then
			npcHandler:say("Do you want to buy a premium points transfer document that will transfer ".. Count_Points .." premium points, right?", cid)
			talkState[cid] = 1
		else
			npcHandler:say("Escolha um numero entre ".. table.concat(Points_Trade.Points, ', ') ..".", cid)
			talkState[cid] = 0
		end
	elseif talkState[cid] == 1 then
		if msgcontains(msg, 'yes') then
			local Document = doCreateItemEx(Points_Trade.Document_ItemID)
			doItemSetAttribute(Document, "name", "".. Count_Points .." premium points transfer document")
			doItemSetAttribute(Document, "points", Count_Points)
			doPlayerAddItemEx(cid, Document)
                        doPlayerRemovePoints(cid, Count_Points)
			npcHandler:say("Você obteve um documento que vale ".. Count_Points .." premium points, use ele no trade com alguem.", cid)
			talkState[cid] = 0
		else
			npcHandler:say("Ok, volte mais tarde.", cid)
			talkState[cid] = 0
		end
	end
	return true
end

npcHandler:setMessage(MESSAGE_GREET, "Ola |PLAYERNAME|. Eu vendo alguns utensílios e Premium Points transfers para você transferir pontos para outros jogadores, lembre-se para comprar use '10,ppt' para 10 pontos.")
npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

Points_Trade.lua <Lib>

Points_Trade = {
	Document_ItemID = 1954,
	Points = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100},
}

function DocumentPoints(Item)
	return tonumber(getItemAttribute(Item.uid, "points"))
end

function getPlayerPoints(cid)
	local AccountID = getPlayerAccountId(cid)
	local Points = 0
	local Result = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `id` = ".. AccountID .."")
	if Result:getID() ~= -1 then
		Points = Result:getDataInt("premium_points")
	end
	return tonumber(Points)
end

function doPlayerAddPoints(cid, Points)
	local AccountID = getPlayerAccountId(cid)
	local Result = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `id` = '".. AccountID .."'")
	if Result:getID() ~= -1 then
		db.executeQuery("UPDATE `accounts` SET `premium_points` = " .. getPlayerPoints(cid) + Points .. " WHERE `id` = " .. AccountID .. ";")
	end
	return true
end

function doPlayerRemovePoints(cid, Points)
	local AccountID = getPlayerAccountId(cid)
	local Result = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `id` = '".. AccountID .."'")
	if Result:getID() ~= -1 then
		db.executeQuery("UPDATE `accounts` SET `premium_points` = " .. getPlayerPoints(cid) - Points .. " WHERE `id` = " .. AccountID .. ";")
	end
	return true
end

Points_Trade.lua <CreatureScripts>

function onTradeAccept(cid, target, item, targetItem)
	if isPlayer(cid) and isPlayer(target) then
		if item.itemid == Points_Trade.Document_ItemID then
			doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "Você recebeu ".. DocumentPoints(item) .." premium points.")
			doPlayerAddPoints(target, DocumentPoints(item))
			doPlayerRemovePoints(cid, DocumentPoints(item))
			addEvent(doPlayerRemoveItem, 1, target, Points_Trade.Document_ItemID, 1)
		elseif targetItem.itemid == Points_Trade.Document_ItemID then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você recebeu ".. DocumentPoints(targetItem) .." premium points.")
			doPlayerAddPoints(cid, DocumentPoints(targetItem))
			doPlayerRemovePoints(target, DocumentPoints(targetItem))
			addEvent(doPlayerRemoveItem, 1, cid, Points_Trade.Document_ItemID, 1)
		end
	end
	return true
end 

function onTradeRequest(cid, target, item)
	if item.itemid == Points_Trade.Document_ItemID then
		if getPlayerPoints(cid) < DocumentPoints(item) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você não tem ".. DocumentPoints(item) .." para realizar uma troca.")
			return false
		end
	end
	return true
end

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites

Cara aparentemente, é só realizar a checagem pra ver se os points do cara é equivalente ou maior que o preço e se não for ele retorna false.

To terminando umas coisas aqui e já tento te ajudar.

Link para o post
Compartilhar em outros sites
  • Moderador

@Kamiz Ta certo,

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites

troca essa função:

 

function getPlayerPoints(cid)
	local AccountID = getPlayerAccountId(cid)
	local Points = 0
	local Result = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `id` = ".. AccountID .."")
	if Result:getID() ~= -1 then
		Points = Result:getDataInt("premium_points")
	end
	return tonumber(Points)
end

 

por essa:

 

 

function getPlayerPoints(cid)
	local AccountID = getPlayerAccountId(cid)
	local Result = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `id` = ".. AccountID)
	return Result:getDataInt("premium_points") <= 0 and 0 or Result:getDataInt("premium_points") -- DataInt é number.
end

 

 

e o script do npc deixa 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 greetCallback(cid)
	talkState[cid] = 0
	return true
end

function creatureSayCallback(cid, type, msg)
	if (not npcHandler:isFocused(cid)) then
		return false
	end
	if talkState[cid] == nil or talkState[cid] == 0 then
		Count_Points = tonumber(msg)
		if isInArray(Points_Trade.Points, Count_Points) then
			npcHandler:say("Do you want to buy a premium points transfer document that will transfer ".. Count_Points .." premium points, right?", cid)
			talkState[cid] = 1
		else
			npcHandler:say("Escolha um numero entre ".. table.concat(Points_Trade.Points, ', ') ..".", cid)
			talkState[cid] = 0
		end
	elseif talkState[cid] == 1 then
		if msgcontains(msg, 'yes') then
		 if getPlayerPoints(cid) >= Count_Points then
			local Document = doCreateItemEx(Points_Trade.Document_ItemID)
			doItemSetAttribute(Document, "name", "".. Count_Points .." premium points transfer document")
			doItemSetAttribute(Document, "points", Count_Points)
			doPlayerAddItemEx(cid, Document)
                        doPlayerRemovePoints(cid, Count_Points)
			npcHandler:say("Você obteve um documento que vale ".. Count_Points .." premium points, use ele no trade com alguem.", cid)
			talkState[cid] = 0
		else
			npcHandler:say("Desculpe, mas voce nao tem ".. Count_Points .." Points.", cid)
			talkState[cid] = 0
		end
		else
			npcHandler:say("Ok, volte mais tarde.", cid)
			talkState[cid] = 0
		end
	end
	return true
end

npcHandler:setMessage(MESSAGE_GREET, "Ola |PLAYERNAME|. Eu vendo alguns utensílios e Premium Points transfers para você transferir pontos para outros jogadores, lembre-se para comprar use '10,ppt' para 10 pontos.")
npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites
  • Moderador

@Vodkart Eu testei aqui e pelo que eu vi, ele remove os Premium Points do site para o Documento, mais se você tiver 10 Premium Points e pegar um Documento você não pode dar trade, o script fala que você não tem mais os Premium Points por que já foi removido e posto no Documento

Isso para qualquer valor

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites
function onTradeRequest(cid, target, item)
    if item.itemid == Points_Trade.Document_ItemID then
        if getPlayerPoints(cid) < 0 or DocumentPoints(item) < 0 then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você não tem ".. DocumentPoints(item) .." para realizar uma troca ou seus points estão com problema contate o suporte.")
            return false
        end
    end
    return true
end

 

Editado por Kamiz (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Moderador

@Kamiz @Vodkart Ainda continua removendo os Premium Points quando completa o trade. Vou tentar explicar como ele estar sendo executado.

Você tem 200 Premium Points, você vai pegar um Documento que vale 50 Premium Points, ele ira remover 50 e coloca no Documento, com isso, você vai ficar com 150 Premium Points no site, mas quando você completa o trade, é removido mais 50 Premium Points fazendo com que de 150 vá para 100 Premium Points, seria como se você tivesse pego um Documento que vale 100 pra vender 50. Não teria como colocar pra ele pegar o Documento sem ter que depositar os Premium Points no Documento? Por que tipo, o vendendo vai lá, pega o Documento com x valor e o comprador não compra, como que iria ficar o vendendo? Ele iria perder o x valor que foi depositado no Documento pois não iria ter como reverter aquela situação em que ele comprou o Documento.

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites

@Phineasz parece que esta repetindo 2x o código.

 

function onTradeAccept(cid, target, item, targetItem)
	if isPlayer(cid) and isPlayer(target) then
		if item.itemid == Points_Trade.Document_ItemID then
			local var = DocumentPoints(item)
			if doPlayerRemovePoints(cid, var) then
			doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "Você recebeu ".. var .." premium points.")
			doPlayerAddPoints(target, var)
			addEvent(doPlayerRemoveItem, 1, target, Points_Trade.Document_ItemID, 1)
			end
			return true
		end
		if targetItem.itemid == Points_Trade.Document_ItemID then
		local ret = DocumentPoints(targetItem)
			if doPlayerRemovePoints(target, ret) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você recebeu ".. DocumentPoints(targetItem) .." premium points.")
			doPlayerAddPoints(cid, ret)
			addEvent(doPlayerRemoveItem, 1, cid, Points_Trade.Document_ItemID, 1)
			end
			return true
		end
	end
	return true
end 

 

 

testa assim, se continuar duplicando eu coloco outra coisa.

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites
  • Moderador

@Vodkart image.png.cbd652f8952f5a68d2895a75e3f453a3.png

Ele não encontrou o tipo do evento, no meu Creatuscripts.xml estar assim traderequest e tradeaccept é pra deixar assim ontraderequest e ontradeaccept?

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites

@Phineasz Mano, só editei aquela parte ali, mas era pra copiar tudo ne

 

function onTradeAccept(cid, target, item, targetItem)
	if isPlayer(cid) and isPlayer(target) then
		if item.itemid == Points_Trade.Document_ItemID then
			local var = DocumentPoints(item)
			if doPlayerRemovePoints(cid, var) then
			doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "Você recebeu ".. var .." premium points.")
			doPlayerAddPoints(target, var)
			addEvent(doPlayerRemoveItem, 1, target, Points_Trade.Document_ItemID, 1)
			end
			return true
		end
		if targetItem.itemid == Points_Trade.Document_ItemID then
		local ret = DocumentPoints(targetItem)
			if doPlayerRemovePoints(target, ret) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você recebeu ".. DocumentPoints(targetItem) .." premium points.")
			doPlayerAddPoints(cid, ret)
			addEvent(doPlayerRemoveItem, 1, cid, Points_Trade.Document_ItemID, 1)
			end
			return true
		end
	end
	return true
end 

function onTradeRequest(cid, target, item)
	if item.itemid == Points_Trade.Document_ItemID then
		if getPlayerPoints(cid) < DocumentPoints(item) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você não tem ".. DocumentPoints(item) .." para realizar uma troca.")
			return false
		end
	end
	return true
end

 

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites
  • Moderador

@Vodkart Ehe, foi mal :(. Ainda continua o erro lá, vai 2x os pontos, 1 do Documento e outro quando aceita o trade

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites

@Phineasz testa assim:

 

function onTradeAccept(cid, target, item, targetItem)
	if isPlayer(cid) and isPlayer(target) then
		if getGlobalStorageValue(895413) <= os.time() then
			if item.itemid == Points_Trade.Document_ItemID then
				doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "Você recebeu ".. DocumentPoints(item) .." premium points.")
				doPlayerAddPoints(target, DocumentPoints(item))
				doPlayerRemovePoints(cid, DocumentPoints(item))
				addEvent(doPlayerRemoveItem, 1, target, Points_Trade.Document_ItemID, 1)
        	end
			if targetItem.itemid == Points_Trade.Document_ItemID then
				doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você recebeu ".. DocumentPoints(targetItem) .." premium points.")
				doPlayerAddPoints(cid, DocumentPoints(targetItem))
				doPlayerRemovePoints(target, DocumentPoints(targetItem))
				addEvent(doPlayerRemoveItem, 1, cid, Points_Trade.Document_ItemID, 1)
			end
			setGlobalStorageValue(895413, os.time()+2)
		end
	end
	return true
end 

function onTradeRequest(cid, target, item)
	if item.itemid == Points_Trade.Document_ItemID then
		if getPlayerPoints(cid) < DocumentPoints(item) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você não tem ".. DocumentPoints(item) .." para realizar uma troca.")
			return false
		end
	end
	return true
end

 

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites
  • Moderador

@Vodkart Ainda continua :(

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites
function onTradeAccept(cid, target, item, targetItem)
	if isPlayer(cid) and isPlayer(target) then
		if item.itemid == Points_Trade.Document_ItemID then
			local var = DocumentPoints(item)
			if getPlayerPoints(cid) >= var then
				doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "Você recebeu ".. var .." premium points.")
				doPlayerAddPoints(target, var)
				doPlayerRemovePoints(cid, var)
				addEvent(doPlayerRemoveItem, 1, target, Points_Trade.Document_ItemID, 1)
			end
		end
		if targetItem.itemid == Points_Trade.Document_ItemID then
			local var = DocumentPoints(targetItem)
			if getPlayerPoints(target) >= var then
				doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você recebeu ".. var .." premium points.")
				doPlayerAddPoints(cid, var)
				doPlayerRemovePoints(target, var)
				addEvent(doPlayerRemoveItem, 1, cid, Points_Trade.Document_ItemID, 1)
			end
		end
	end
	return true
end 
function onTradeRequest(cid, target, item)
	if item.itemid == Points_Trade.Document_ItemID then
		if getPlayerPoints(cid) < DocumentPoints(item) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Você não tem ".. DocumentPoints(item) .." para realizar uma troca.")
			return false
		end
	end
	return true
end

 

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites
  • Moderador

@Vodkart Ainda persiste

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites
  • Moderador

@Kamiz @Vodkart @Storm Não tem solução não né?

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites
  • 2 weeks later...
  • Moderador

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites

Tenho dúvida:
O cara tava com 0 points e conseguiu comprar o documento de x points? Se sim, o problema está aí... o npc apenas remove os pontos que o player selecionou e em seguida dá o item para o jogador. O check está sendo quando ele tenta negociar com outro player, mas daí, ele já tinha o documento que descontou dos pontos no banco de dados dele...

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Link para o post
Compartilhar em outros sites
  • Moderador

@lordzetros Sim, o jogador pode pegar o Documento mesmo sem ter os Pontos. O NPC, ele não vende o Documento, ele da o Documento com x valor solicitado pelo Jogador e assim ele pode fazer a troca se tiver com os Pontos

Meu Curso sobre Programação para OTServer

Programando OTServer

 

Peça o seu script! Entre agora mesmo no grupo

Developing

 

Conteúdos:

 

Discord: Belmont#7352

Não esqueça do REP+ :)     

Link para o post
Compartilhar em outros sites
  • Solução

@Phineasz O problema está aí, colega, kkkk. A ideia do script, acredito eu, seja em que o jogador compre o documento por x points, assim ele pode efetuar a troca com algum outro player, no qual, esse documento continuará valendo x points. Veja:

Spoiler

elseif talkState[cid] == 1 then
		if msgcontains(msg, 'yes') then
			local Document = doCreateItemEx(Points_Trade.Document_ItemID)
			doItemSetAttribute(Document, "name", "".. Count_Points .." premium points transfer document")
			doItemSetAttribute(Document, "points", Count_Points)
			doPlayerAddItemEx(cid, Document)
                        doPlayerRemovePoints(cid, Count_Points)
			npcHandler:say("Você obteve um documento que vale ".. Count_Points .." premium points, use ele no trade com alguem.", cid)
			talkState[cid] = 0
		else
			npcHandler:say("Ok, volte mais tarde.", cid)
			talkState[cid] = 0
		end
	end
	return true
end

Quando o jogador digitar 'yes', o script criará o documento e em seguida dará ao jogador, mas ao mesmo tempo, está removendo do jogador o valor dos pontos 'trocados'. 
doPlayerRemovePoints(cid, Count_Points)

Entendeu?


@Phineasz Acabei de ver o script do creaturescripts, e realmente ele tá fazendo o check dos points, então, no caso, remova a linha do código do NPC a qual citei acima... 

doPlayerRemovePoints(cid, Count_Points)

Editado por lordzetros (veja o histórico de edições)

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo