Ir para conteúdo
  • Cadastre-se

(Resolvido)Change Name Scroll


Ir para solução Resolvido por Anderson Sacani,

Posts Recomendados

Alguém me ajuda com um script de Mudar o nome, eu tenho um aqui, porém quando eu do use nele o meu char só desloga mas não muda o nome, não sei nem aonde coloca pra mudar o nome, pois é um item que tem que dar use.

script:

 

Spoiler
function onUse(cid, item, frompos, item2, topos)
if (getTilePzInfo(getPlayerPosition(cid)) == TRUE) then
playername = getPlayerName(cid)
 
 
local oldName, guid = getCreatureName(cid), getPlayerGUID(cid)
 
db.executeQuery("INSERT INTO `player_namelocks` (`player_id`, `name`, `new_name`, `date`) VALUES (" .. guid .. ", " .. db.escapeString(oldName) .. ", " .. os.time() .. ");")  
    doRemoveItem(item.uid, 1)
    doRemoveCreature(cid)
else
doPlayerSendTextMessage(cid, 22, "You can only use this item inside protection zone!")
end
end

 

Link para o post
Compartilhar em outros sites
1 hora atrás, Anderson Sacani disse:

Onde o jogador define qual será o novo nome? Preciso saber disso pra ajeitar esse script

Seria bacana abrir aquela caixa de texto como uma carta sabe? pra ele inserir o novo nome ali dentro e quando desse OK ele deslogasse e mudasse de nome

Link para o post
Compartilhar em outros sites

Desta maneira que pediu é bem complicado fazer. Não é impossível, mas é complicado e precisará de um Otclient, além disso precisará do sistema de ExtendedOpcode pra enviar e receber pacotes custom, mas eu tenho uma solução.

Vou criar um script de talkaction que ao usar o comando !changename, o algorítimo removerá o scroll. Caso o jogador não tenho o scroll, o algorítimo retornará que é impossível de realizar esta ação.

Link para o post
Compartilhar em outros sites
11 minutos atrás, Anderson Sacani disse:

Desta maneira que pediu é bem complicado fazer. Não é impossível, mas é complicado e precisará de um Otclient, além disso precisará do sistema de ExtendedOpcode pra enviar e receber pacotes custom, mas eu tenho uma solução.

Vou criar um script de talkaction que ao usar o comando !changename, o algorítimo removerá o scroll. Caso o jogador não tenho o scroll, o algorítimo retornará que é impossível de realizar esta ação.

entendi, agradeço pela atenção, fico no aguardo do script ?

Link para o post
Compartilhar em outros sites
  • Solução
local scrollId = 1234

function onSay(cid, words, param)
    if param == "" then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'To use the command: !changename "NEW_NAME')
        return false
    end
    if getPlayerItemCount(cid, scrollId) < 0 then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'You need a ' .. getItemNameById(scrollId))
        return false
    end
    if getTilePzInfo(getPlayerPosition(cid)) ~= true then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'You can only use this command in a protected area.')
        return false
    end

    doPlayerRemoveItem(cid, scrollId, 1)
    local guid = getPlayerGUID(cid)
    doRemoveCreature(cid)
    db.executeQuery("UPDATE `players` SET `name` = '" .. param .. "' WHERE `id` = " .. guid .. ";")
    doRemoveCreature(guid)
    return true
end

 

Achei um script bem mais completo do que esse que criei:

local config = {
	item = {Id = 1111, count = 0},
	paramBlacklist = {"account manager", "god", "tutor", "tester"},
	kick = {enabled = true, delay = 2 * 1000},
	forceLogout = false,
	namelockCheck = true,
	vowelsCheck = true,
	maxTextLenght = 29,
	minWordLenght = 2,
	maxWordLenght = 14,
	maxWords = 3
}
 
config.kick.enabled = getBooleanFromString(config.kick.enabled)
config.forceLogout = getBooleanFromString(config.forceLogout)
config.namelockCheck = getBooleanFromString(config.namelockCheck)
config.vowelsCheck = getBooleanFromString(config.vowelsCheck)
 
function onSay(cid, words, param, channel)
	local t = string.explode(param, ",")
	local len, firstWord, wordCount, textCancel, limit = string.len(tostring(t[1])), true, 0, '', ";"
	if(getConfigValue('sqlType') == 'mysql') then
		limit = db.updateLimiter()
	end
 
	if(param == '') then
		return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
	elseif(getPlayerGUIDByName(t[1], true) ~= nil) then
		textCancel = "That name is already in use."
	elseif(getPlayerItemCount(cid, config.item.Id) < config.item.count) then
		textCancel = "You do not fulfill the requirements."
	elseif(not getTilePzInfo(getCreaturePosition(cid))) then
		textCancel = "You must be inside a protection zone to use this command."
	elseif(len > config.maxTextLenght) then
		textCancel = "A name must have at least " .. config.minWordLenght .. " but no more than " .. config.maxTextLenght .. " letters!"
	elseif(config.namelockCheck and db.getResult("SELECT * FROM `player_namelocks` WHERE `name` = " .. db.escapeString(t[1]) .. "" .. limit .. ""):getID() ~= 1) then
		textCancel = "That name is namelocked."
	elseif(string.find(t[1]:lower(), "[^%l%s]") ~= nil) then
		textCancel = "This name contains invalid letters. Please use only A-Z, a-z and space!"
	else
		paramTemp = ''
		for word in string.gmatch(t[1], "%a+") do
			len, wordCount = string.len(word), wordCount + 1
			if(isInArray(config.paramBlacklist, paramTemp:lower())) then
				textCancel = "Invalid name entry."
				break
			elseif(len < config.minWordLenght) then
				textCancel = "This name contains a word with only " .. len .. " letter" .. (len > 1 and "s" or '') .. ". Please use more than " .. len .. " letter" .. (len > 2 and "s" or '') .. " for each word!"
				break
			elseif(len > config.maxWordLenght) then
				textCancel = "This name contains a word that is too long. Please use no more than " .. config.maxWordLenght .. " letters for each word!"
				break
			elseif(wordCount > config.maxWords) then
				textCancel = "This name contains more than 3 words. Please choose another name!"
				break
			elseif(config.vowelsCheck and string.find(word:lower(), "[aeiouy]") == nil) then
				textCancel = "This name contains a word without vowels. Please choose another name!"
				break
			else
				wordTemp = ''
				for i = 1, len do
					letter = string.sub(word, i, i)
					if(i == 1) then
						if(getBooleanFromString(firstWord) and string.find(letter, "%l")) then
							letter = string.upper(letter)
						end
					else
						if(string.find(letter, "%u")) then
							letter = string.lower(letter)
						end
					end
 
					firstWord = false
					wordTemp = "" .. wordTemp .. "" .. letter .. ""
				end
			end
 
			paramTemp = "" .. paramTemp .. "" .. (paramTemp ~= '' and " " or '') .. "" .. wordTemp .. ""
		end
	end
 
	if(textCancel ~= '') then
		doPlayerSendCancel(cid, textCancel)
		return true
	end
 
	local oldName, guid = getCreatureName(cid), getPlayerGUID(cid)
	t[1] = paramTemp
	doPlayerRemoveItem(cid, config.item.Id, config.item.count)
	if(pcall(doPlayerChangeName, guid, oldName, t[1]) ~= true) then
		db.executeQuery("INSERT INTO `player_namelocks` (`player_id`, `name`, `new_name`, `date`) VALUES (" .. guid .. ", " .. db.escapeString(oldName) .. ", " .. db.escapeString(t[1]) .. ", " .. os.time() .. ");")
		db.executeQuery("UPDATE `players` SET `name` = " .. db.escapeString(t[1]) .. " WHERE `id` = " .. guid .. "" .. limit .. "")
	end
 
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your name has been changed successfully." .. (config.kick.enabled and " You will be kicked in " .. config.kick.delay / 1000 .. " seconds." or " Re-enter the game to see the changes.") .. "")
	if(config.kick.enabled) then
		addEvent(function(cid, forceLogout)
			if(isPlayer(cid)) then
				doRemoveCreature(cid, forceLogout)
			end
		end, config.kick.delay, cid, config.forceLogout)
	end
 
	return true
end

 

A parte do .xml fica assim:

<talkaction log="yes" words="!changename;/changename;!namechange;/namechange" access="0" event="script" value="changename.lua"/>

 

 

Editado por Anderson Sacani
Estava oculto (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
Em 09/02/2023 em 14:45, Anderson Sacani disse:

local scrollId = 1234

function onSay(cid, words, param)
    if param == "" then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'To use the command: !changename "NEW_NAME')
        return false
    end
    if getPlayerItemCount(cid, scrollId) < 0 then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'You need a ' .. getItemNameById(scrollId))
        return false
    end
    if getTilePzInfo(getPlayerPosition(cid)) ~= true then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'You can only use this command in a protected area.')
        return false
    end

    doPlayerRemoveItem(cid, scrollId, 1)
    local guid = getPlayerGUID(cid)
    doRemoveCreature(cid)
    db.executeQuery("UPDATE `players` SET `name` = '" .. param .. "' WHERE `id` = " .. guid .. ";")
    doRemoveCreature(guid)
    return true
end

 

Achei um script bem mais completo do que esse que criei:


local config = {
	item = {Id = 1111, count = 0},
	paramBlacklist = {"account manager", "god", "tutor", "tester"},
	kick = {enabled = true, delay = 2 * 1000},
	forceLogout = false,
	namelockCheck = true,
	vowelsCheck = true,
	maxTextLenght = 29,
	minWordLenght = 2,
	maxWordLenght = 14,
	maxWords = 3
}
 
config.kick.enabled = getBooleanFromString(config.kick.enabled)
config.forceLogout = getBooleanFromString(config.forceLogout)
config.namelockCheck = getBooleanFromString(config.namelockCheck)
config.vowelsCheck = getBooleanFromString(config.vowelsCheck)
 
function onSay(cid, words, param, channel)
	local t = string.explode(param, ",")
	local len, firstWord, wordCount, textCancel, limit = string.len(tostring(t[1])), true, 0, '', ";"
	if(getConfigValue('sqlType') == 'mysql') then
		limit = db.updateLimiter()
	end
 
	if(param == '') then
		return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
	elseif(getPlayerGUIDByName(t[1], true) ~= nil) then
		textCancel = "That name is already in use."
	elseif(getPlayerItemCount(cid, config.item.Id) < config.item.count) then
		textCancel = "You do not fulfill the requirements."
	elseif(not getTilePzInfo(getCreaturePosition(cid))) then
		textCancel = "You must be inside a protection zone to use this command."
	elseif(len > config.maxTextLenght) then
		textCancel = "A name must have at least " .. config.minWordLenght .. " but no more than " .. config.maxTextLenght .. " letters!"
	elseif(config.namelockCheck and db.getResult("SELECT * FROM `player_namelocks` WHERE `name` = " .. db.escapeString(t[1]) .. "" .. limit .. ""):getID() ~= 1) then
		textCancel = "That name is namelocked."
	elseif(string.find(t[1]:lower(), "[^%l%s]") ~= nil) then
		textCancel = "This name contains invalid letters. Please use only A-Z, a-z and space!"
	else
		paramTemp = ''
		for word in string.gmatch(t[1], "%a+") do
			len, wordCount = string.len(word), wordCount + 1
			if(isInArray(config.paramBlacklist, paramTemp:lower())) then
				textCancel = "Invalid name entry."
				break
			elseif(len < config.minWordLenght) then
				textCancel = "This name contains a word with only " .. len .. " letter" .. (len > 1 and "s" or '') .. ". Please use more than " .. len .. " letter" .. (len > 2 and "s" or '') .. " for each word!"
				break
			elseif(len > config.maxWordLenght) then
				textCancel = "This name contains a word that is too long. Please use no more than " .. config.maxWordLenght .. " letters for each word!"
				break
			elseif(wordCount > config.maxWords) then
				textCancel = "This name contains more than 3 words. Please choose another name!"
				break
			elseif(config.vowelsCheck and string.find(word:lower(), "[aeiouy]") == nil) then
				textCancel = "This name contains a word without vowels. Please choose another name!"
				break
			else
				wordTemp = ''
				for i = 1, len do
					letter = string.sub(word, i, i)
					if(i == 1) then
						if(getBooleanFromString(firstWord) and string.find(letter, "%l")) then
							letter = string.upper(letter)
						end
					else
						if(string.find(letter, "%u")) then
							letter = string.lower(letter)
						end
					end
 
					firstWord = false
					wordTemp = "" .. wordTemp .. "" .. letter .. ""
				end
			end
 
			paramTemp = "" .. paramTemp .. "" .. (paramTemp ~= '' and " " or '') .. "" .. wordTemp .. ""
		end
	end
 
	if(textCancel ~= '') then
		doPlayerSendCancel(cid, textCancel)
		return true
	end
 
	local oldName, guid = getCreatureName(cid), getPlayerGUID(cid)
	t[1] = paramTemp
	doPlayerRemoveItem(cid, config.item.Id, config.item.count)
	if(pcall(doPlayerChangeName, guid, oldName, t[1]) ~= true) then
		db.executeQuery("INSERT INTO `player_namelocks` (`player_id`, `name`, `new_name`, `date`) VALUES (" .. guid .. ", " .. db.escapeString(oldName) .. ", " .. db.escapeString(t[1]) .. ", " .. os.time() .. ");")
		db.executeQuery("UPDATE `players` SET `name` = " .. db.escapeString(t[1]) .. " WHERE `id` = " .. guid .. "" .. limit .. "")
	end
 
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your name has been changed successfully." .. (config.kick.enabled and " You will be kicked in " .. config.kick.delay / 1000 .. " seconds." or " Re-enter the game to see the changes.") .. "")
	if(config.kick.enabled) then
		addEvent(function(cid, forceLogout)
			if(isPlayer(cid)) then
				doRemoveCreature(cid, forceLogout)
			end
		end, config.kick.delay, cid, config.forceLogout)
	end
 
	return true
end

 

A parte do .xml fica assim:


<talkaction log="yes" words="!changename;/changename;!namechange;/namechange" access="0" event="script" value="changename.lua"/>

 

 

Valeu mano, salvou! ?

Link para o post
Compartilhar em outros sites
  • 1 month later...
  • Sub-Admin

O problema do seu script é que ele remove o jogador do jogo antes de atualizar o nome no banco de dados, o que causa o desaparecimento do personagem. Além disso, você precisa especificar o novo nome que o jogador deseja usar. Aqui está uma versão atualizada

 

function onUse(cid, item, frompos, item2, topos)
    if (getTilePzInfo(getPlayerPosition(cid)) == TRUE) then
        local playerName = getPlayerName(cid)
        local oldName, guid = getCreatureName(cid), getPlayerGUID(cid)
        db.executeQuery("INSERT INTO `player_namelocks` (`player_id`, `name`, `new_name`, `date`) VALUES (" .. guid .. ", " .. db.escapeString(oldName) .. ", " .. os.time() .. ");")
        doRemoveItem(item.uid, 1)
        doRemoveCreature(cid)
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Your name has been changed successfully!")
    else
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can only use this item inside protection zone!")
    end
end
 

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
Em 16/03/2023 em 08:16, L3K0T disse:

O problema do seu script é que ele remove o jogador do jogo antes de atualizar o nome no banco de dados, o que causa o desaparecimento do personagem. Além disso, você precisa especificar o novo nome que o jogador deseja usar. Aqui está uma versão atualizada

 

function onUse(cid, item, frompos, item2, topos)
    if (getTilePzInfo(getPlayerPosition(cid)) == TRUE) then
        local playerName = getPlayerName(cid)
        local oldName, guid = getCreatureName(cid), getPlayerGUID(cid)
        db.executeQuery("INSERT INTO `player_namelocks` (`player_id`, `name`, `new_name`, `date`) VALUES (" .. guid .. ", " .. db.escapeString(oldName) .. ", " .. os.time() .. ");")
        doRemoveItem(item.uid, 1)
        doRemoveCreature(cid)
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Your name has been changed successfully!")
    else
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can only use this item inside protection zone!")
    end
end
 

como ficaria o comando ? esse ja e o script inteiro ?

Link para o post
Compartilhar em outros sites
Em 16/03/2023 em 08:16, L3K0T disse:

O problema do seu script é que ele remove o jogador do jogo antes de atualizar o nome no banco de dados, o que causa o desaparecimento do personagem. Além disso, você precisa especificar o novo nome que o jogador deseja usar. Aqui está uma versão atualizada

 

function onUse(cid, item, frompos, item2, topos)
    if (getTilePzInfo(getPlayerPosition(cid)) == TRUE) then
        local playerName = getPlayerName(cid)
        local oldName, guid = getCreatureName(cid), getPlayerGUID(cid)
        db.executeQuery("INSERT INTO `player_namelocks` (`player_id`, `name`, `new_name`, `date`) VALUES (" .. guid .. ", " .. db.escapeString(oldName) .. ", " .. os.time() .. ");")
        doRemoveItem(item.uid, 1)
        doRemoveCreature(cid)
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Your name has been changed successfully!")
    else
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can only use this item inside protection zone!")
    end
end
 

Com toda certeza absoluta não irá funcionar.

Já falei que o ChatGPT é apenas pra auxiliar? Tu ta pedindo pra ele gerar um script, mas não funcionará. Sabe por que?

Porque tu ta mandando uma consulta pro banco de dados antes do personagem deslogar, então o nome dele é alterado no banco de dados, porém, o nome dele ainda é o antigo na memória do servidor, então, quando ele desloga, o nome antigo que está na memória do servidor sobrescreve o nome que já foi alterado no banco de dados, voltando a ser como era antes e o script não resultando em nada.

Provavelmente esse teu script não dará erro, mas com toda a certeza não funcionará.

 

O jogador tem que ser removido antes da consulta. O ChatGPT é muito ruim ainda!

 

Vou te explicar uma coisa:

O correto é:

Primeiro: Armazena o resultado do 'getPlayerGUID(cid)' dentro de uma variável, essa variável pode ter um nome 'guid';

Segundo: Remove o jogador;

Terceiro: Executa a consulta chamando a variável 'guid' para obter o id que foi armazenado na memória do servidor;

Link para o post
Compartilhar em outros sites
  • Sub-Admin
14 horas atrás, Anderson Sacani disse:

Com toda certeza absoluta não irá funcionar.

Já falei que o ChatGPT é apenas pra auxiliar? Tu ta pedindo pra ele gerar um script, mas não funcionará. Sabe por que?

Porque tu ta mandando uma consulta pro banco de dados antes do personagem deslogar, então o nome dele é alterado no banco de dados, porém, o nome dele ainda é o antigo na memória do servidor, então, quando ele desloga, o nome antigo que está na memória do servidor sobrescreve o nome que já foi alterado no banco de dados, voltando a ser como era antes e o script não resultando em nada.

Provavelmente esse teu script não dará erro, mas com toda a certeza não funcionará.

 

O jogador tem que ser removido antes da consulta. O ChatGPT é muito ruim ainda!

 

Vou te explicar uma coisa:

O correto é:

Primeiro: Armazena o resultado do 'getPlayerGUID(cid)' dentro de uma variável, essa variável pode ter um nome 'guid';

Segundo: Remove o jogador;

Terceiro: Executa a consulta chamando a variável 'guid' para obter o id que foi armazenado na memória do servidor;

É porque estou pelo celular entao unica forma pra ajudar o pessoal do forum é usando ele e outra coisa, nao estou aqui pra competir conhecimento, também você nao tem autoridade em me dizer oque fazer ou nao fazer, estou apenas ajudando... enfim faça o seu e eu faço o meu, vamos evitar transtornos e manter o forum saudavel para todos. ;)

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

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.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo