Hello, this is a request from narko, you can see it here -> http://otland.net/f132/request-npc-account-maker-acc-player-ideas-make-107556/
Update Log:
Features:
Create a new npc file on data/npcs and paste this (Default):
Now create a file on data/npcs/scripts called accmaker.lua and paste this:
- Updated At: Wednesday December 08th, 2010 at 21:36 P.M (GMT -4:30)
- Last Tested At: Wednesday December 08th, 2010 at 21:34 P.M (GMT -4:30)
- Tested On: The Forgotten Server 0.3.6pl1
Update Log:
Code:
[B]V0.1.1: [08 / 12 / 2010][/B]
- Now the plauer name cannot be too long.
[B]V0.1: [08 / 12 / 2010][/B]
- Release of the new script
Features:
Code:
* Player can create a new account.
* Player can change the/him account password. (If you say "change" before creating a new account, you'll change the created account's password)
* Player can create a new character on the/him account. (If you create a new character before creating a new account, you'll create a character on the new account)
* All npc messages almost the account manager.
* You can't type character/account/password with invalid characters.
* You can't create a character with the first letter on lower case.
* You can't create a new character if your account has reached the character's limit (15)
* You can't create a new character if the name contains "gm", "cm" or "god".
* You can't create account/password/character if the text is too short.
* You can't create an account name if is the same as the password.
-- Same restriction as account manager.
--- Coming features (Delete character, new recovery key)
Create a new npc file on data/npcs and paste this (Default):
XML:
<?xml version="1.0"?>
<npc name="Account Manager" script="data/npc/scripts/accmaker.lua" access="3" walkinterval="2000" lookdir="2">
<mana now="800" max="800"/>
<health now="200" max="200"/>
<look type="110" head="1" body="1" legs="1" feet="1" addons="0"/>
</npc>
Now create a file on data/npcs/scripts called accmaker.lua and paste this:
Lua:
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
npcHandler:setMessage(MESSAGE_GREET, "Hello, type {account} to create a new account, {character} to add a new character or {manage} to see all available features.")
local config =
{
newPlayerChooseVoc = getConfigValue("newPlayerChooseVoc"),
newPlayerSpawnPosX = getConfigValue("newPlayerSpawnPosX"),
newPlayerSpawnPosY = getConfigValue("newPlayerSpawnPosY"),
newPlayerSpawnPosZ = getConfigValue("newPlayerSpawnPosZ"),
newPlayerTownId = getConfigValue("newPlayerTownId"),
newPlayerLevel = getConfigValue("newPlayerLevel"),
newPlayerMagicLevel = getConfigValue("newPlayerMagicLevel"),
generateAccountNumber = getConfigValue("generateAccountNumber")
}
local account =
{
name = {},
pass = {}
}
local character =
{
name = {},
voc = {},
sex = {}
}
local toBe = 0
local capMax = 400
local voc =
{
["sorcerer"] = 1,
["druid"] = 2,
["paladin"] = 3,
["knight"] = 4
}
function creatureSayCallback(cid, type, msg)
if(not npcHandler:isFocused(cid)) then
return false
end
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE and 0 or cid
if msgcontains(msg, "account") then
npcHandler:say("What would you like your password to be?", cid)
talkState[talkUser] = 1
elseif talkState[talkUser] == 1 then
if msg ~= "" or msg ~= nil then
toBe = string.gsub(msg, "[!'·#$%&/()=?¿¡.*\|;:,><{}]", "")
npcHandler:say(toBe .. " is it {yes} or {no}?", cid)
talkState[talkUser] = 2
else
npcHandler:say("What would you like your password to be?", cid)
end
elseif talkState[talkUser] == 2 and msgcontains(msg, "no") then
npcHandler:say("What would you like your password to be?", cid)
talkState[talkUser] = 1
elseif talkState[talkUser] == 2 and msgcontains(msg, "yes") then
account.pass[cid] = toBe
if config.generateAccountNumber then
toBe = string.format("%s%s%s%s%s%s%s", math.random(1, 9), math.random(1, 9), math.random(1, 9), math.random(1, 9), math.random(1, 9), math.random(1, 9), math.random(1, 9))
local query = db.getResult("select id from accounts where name = " .. toBe .. ";")
if query:getID() == -1 then
account.name[cid] = toBe
local query_ = db.executeQuery("insert into accounts (name, password) values (" .. db.escapeString(account.name[cid]) .. ", " .. db.escapeString(account.pass[cid]) .. ");")
if query_ then
npcHandler:say("Your account has been created, you may {manage} it now, but remember your account name: {" .. account.name[cid] .. "} and password: {" .. account.pass[cid] .. "}!", cid)
talkState[talkUser] = 0
else
npcHandler:say("Your account cannot be created.", cid)
talkState[talkUser] = 0
end
end
else
npcHandler:say("What would you like your account name to be?", cid)
talkState[talkUser] = 3
end
elseif talkState[talkUser] == 3 then
if msg ~= "" or msg ~= nil then
toBe = string.gsub(msg, "[!·#$%&¬/()=?'¿¡.*\|;:,><{}]", "")
if toBe == account.pass[cid] then
npcHandler:say("Your account name cannot be the same as your password.", cid)
talkState[talkUser] = 3
else
npcHandler:say(toBe .. " is it {yes} or {no}?", cid)
talkState[talkUser] = 4
end
else
npcHandler:say("What would you like your account name to be?", cid)
end
elseif talkState[talkUser] == 4 and msgcontains(msg, "no") then
npcHandler:say("Od... then what would you like your account name to be?", cid)
talkState[talkUser] = 3
elseif talkState[talkUser] == 4 and msgcontains(msg, "yes") then
local query = db.getResult("select id from accounts where name = " .. db.escapeString(toBe) .. ";")
local deny = false
if query:getID() ~= -1 then
deny = true
query:free()
end
if deny then
npcHandler:say("An account with that name already exists, please try another account name.", cid)
talkState[talkUser] = 3
else
account.name[cid] = toBe
local query = db.executeQuery("insert into accounts (name, password) values (" .. db.escapeString(account.name[cid]) .. ", " .. db.escapeString(account.pass[cid]) .. ");")
if query then
npcHandler:say("Your account has been created, you may {manage} it now, but remember your account name: {" .. account.name[cid] .. "} and password: {" .. account.pass[cid] .. "}!", cid)
talkState[talkUser] = 0
else
npcHandler:say("Your account cannot be created.", cid)
talkState[talkUser] = 0
end
end
elseif msgcontains(msg, "manage") then
account.name[cid] = (account.name[cid] or getPlayerAccount(cid))
local query = db.getResult("select password from accounts where name = " .. db.escapeString(account.name[cid]) .. ";")
if query:getID() ~= -1 then
account.pass[cid] = (account.pass[cid] or query:getDataString("password"))
query:free()
end
npcHandler:say("You can {change} your pass or create a new {character}.", cid)
talkState[talkUser] = 5
elseif msgcontains(msg, "change") then
npcHandler:say("Tell me your new password please.", cid)
talkState[talkUser] = 6
elseif talkState[talkUser] == 6 then
if msg ~= "" or msg ~= nil then
toBe = string.gsub(msg, "[!'·#$%&/()=?¿¡.*\|;:,><{}]", "")
if string.len(toBe) < 6 then
npcHandler:say("That password is too short, at least 6 digits are required. Please select a longer password.", cid)
else
npcHandler:say("Should {" .. toBe .. "} be your new password?", cid)
talkState[talkUser] = 7
end
else
npcHandler:say("What would you like your new password to be?", cid)
end
elseif talkState[talkUser] == 7 and msgcontains(msg, "no") then
npcHandler:say("Then not.", cid)
talkState[talkUser] = 0
elseif talkState[talkUser] == 7 and msgcontains(msg, "yes") then
local query = db.executeQuery("update accounts set password = " .. db.escapeString(toBe) .. " where name = " .. db.escapeString(getPlayerAccount(cid)).. ";")
if query then
npcHandler:say("Your password has been changed.", cid)
talkState[talkUser] = 0
else
npcHandler:say("Your password cannot be changed.", cid)
talkState[talkUser] = 0
end
elseif msgcontains(msg, "character") then
local query = db.getResult("select count(id) as count from players where account_id = " .. getPlayerAccountId(cid) .. ";")
if query:getID() ~= -1 then
local t = query:getDataInt("count")
if t >= 15 then
npcHandler:say("Your account reach the limit of 15 players, you need delete a character if you want to create a new one.", cid)
talkState[talkUser] = 0
else
npcHandler:say("What would you like as your character name?", cid)
talkState[talkUser] = 8
end
query:free()
end
elseif talkState[talkUser] == 8 then
if msg ~= "" or msg ~= nil then
toBe = string.gsub(msg, "[!'·#$%&/()=?¿¡.*\|;:,><{}]", "")
if string.len(toBe) < 4 then
npcHandler:say("Your name you want is too short, please select a longer name.", cid)
elseif string.len(toBe) > 20 then
npcHandler:say("Your name you want is too long, please select a longer name.", cid)
elseif string.sub(toBe, 0, 4) == "god " or isInArray({"gm ", "cm "}, string.sub(toBe, 0, 3)) then
npcHandler:say("Your character is not a staff member, please tell me another name!", cid)
elseif string.sub(toBe, 0, 1) == string.sub(toBe, 0, 1):lower() then
npcHandler:say("Your name can not be the first letter in lower case.", cid)
else
local query = db.getResult("select id from players where name = " .. db.escapeString(toBe) .. ";")
if query:getID() ~= - 1 then
npcHandler:say("A player with that name already exists, please choose another name.", cid)
query:free()
else
npcHandler:say(toBe .. " is it {yes} or {no}?", cid)
talkState[talkUser] = 9
end
end
else
npcHandler:say("What would you like as your character name?", cid)
end
elseif talkState[talkUser] == 9 and msgcontains(msg, "no") then
npcHandler:say("What else would you like to name your character?", cid)
talkState[talkUser] = 8
elseif talkState[talkUser] == 9 and msgcontains(msg, "yes") then
character.name[cid] = toBe
npcHandler:say("Should your character be a {male} or a {female}.", cid)
talkState[talkUser] = 10
elseif talkState[talkUser] == 10 and msgcontains(msg, "male") or msgcontains(msg, "female") then
toBe = (msg == "male" and 1 or 0)
npcHandler:say("A " .. msg .. ", are you sure?", cid)
talkState[talkUser] = 11
elseif talkState[talkUser] == 11 and msgcontains(msg, "no") then
npcHandler:say("Tell me... would you like to be a {male} or a {female}?", cid)
talkState[talkUser] = 10
elseif talkState[talkUser] == 11 and msgcontains(msg, "yes") then
character.sex[cid] = toBe
if config.newPlayerChooseVoc then
npcHandler:say("What do you want to be... {sorcerer}, {druid}, {paladin} or {knight}.", cid)
talkState[talkUser] = 12
else
character.voc[cid] = 0
local query = db.executeQuery("insert into players (id, name, world_id, group_id, account_id, level, vocation, health, healthmax, experience, lookbody, lookfeet, lookhead, looklegs, looktype, lookaddons, maglevel, mana, manamax, manaspent, soul, town_id, posx, posy, posz, conditions, cap, sex, lastlogin, lastip, skull, skulltime, save, rank_id, guildnick, lastlogout, blessings, online) VALUES (NULL, " .. db.escapeString(character.name[cid]) .. ", " .. getConfigValue("worldId") .. ", 1, " .. getAccountIdByAccount(account.name[cid]) .. ", " .. config.newPlayerLevel .. ", " .. character.voc[cid] .. ", " .. getVocationInfo(character.voc[cid]).healthGain * config.newPlayerLevel .. ", " .. getVocationInfo(character.voc[cid]).healthGain * config.newPlayerLevel .. ", " .. (config.newPlayerLevel < 2 and 0 or getExperienceForLevel(config.newPlayerLevel)) .. ", 68, 76, 78, 39, " .. (character.sex[cid] == 1 and 136 or 128) .. ", 0, " .. config.newPlayerMagicLevel .. ", 0, 0, 0, 100, " .. config.newPlayerTownId .. ", " .. config.newPlayerSpawnPosX .. ", " .. config.newPlayerSpawnPosY .. ", " .. config.newPlayerSpawnPosZ .. ", 0, " .. capMax + getVocationInfo(character.voc[cid]).capacity * config.newPlayerLevel .. ", " .. character.sex[cid] .. ", 0, 0, 0, 0, 1, 0, '', 0, 0, 0);")
if query then
npcHandler:say("Your character has been created.", cid)
talkState[talkUser] = 0
else
npcHandler:say("Your character couldn't be created, please try again.", cid)
talkState[talkUser] = 5
end
end
elseif talkState[talkUser] == 12 then
if voc[msg] then
npcHandler:say("So you would like to be " .. msg .. "... are you sure?", cid)
toBe = voc[msg]
talkState[talkUser] = 13
else
npcHandler:say("I don't understand what vocation you would like to be... could you please repeat it?", cid)
end
elseif talkState[talkUser] == 13 and msgcontains(msg, "no") then
npcHandler:say("No? Then what would you like to be?", cid)
talkState[talkUser] = 12
elseif talkState[talkUser] == 13 and msgcontains(msg, "yes") then
character.voc[cid] = toBe
local query = db.executeQuery("insert into players (id, name, world_id, group_id, account_id, level, vocation, health, healthmax, experience, lookbody, lookfeet, lookhead, looklegs, looktype, lookaddons, maglevel, mana, manamax, manaspent, soul, town_id, posx, posy, posz, conditions, cap, sex, lastlogin, lastip, skull, skulltime, save, rank_id, guildnick, lastlogout, blessings, online) VALUES (NULL, " .. db.escapeString(character.name[cid]) .. ", " .. getConfigValue("worldId") .. ", 1, " .. getAccountIdByAccount(account.name[cid]) .. ", " .. config.newPlayerLevel .. ", " .. character.voc[cid] .. ", " .. getVocationInfo(character.voc[cid]).healthGain * config.newPlayerLevel .. ", " .. getVocationInfo(character.voc[cid]).healthGain * config.newPlayerLevel .. ", " .. (config.newPlayerLevel < 2 and 0 or getExperienceForLevel(config.newPlayerLevel)) .. ", 68, 76, 78, 39, " .. (character.sex[cid] == 1 and 136 or 128) .. ", 0, " .. config.newPlayerMagicLevel .. ", 0, 0, 0, 100, " .. config.newPlayerTownId .. ", " .. config.newPlayerSpawnPosX .. ", " .. config.newPlayerSpawnPosY .. ", " .. config.newPlayerSpawnPosZ .. ", 0, " .. capMax + getVocationInfo(character.voc[cid]).capacity * config.newPlayerLevel .. ", " .. character.sex[cid] .. ", 0, 0, 0, 0, 1, 0, '', 0, 0, 0);")
if query then
npcHandler:say("Your character has been created.", cid)
talkState[talkUser] = 0
else
npcHandler:say("Your character couldn't be created, please try again.", cid)
talkState[talkUser] = 5
end
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Last edited: