ToontownClient: Handle pattern names

This commit is contained in:
John Cote 2024-09-10 20:41:47 -04:00
parent 1f46b8684d
commit 3146cfb92e
2 changed files with 135 additions and 12 deletions

View File

@ -1,22 +1,25 @@
CLIENT_GET_AVATARS = 3
CLIENT_GET_AVATARS_RESP = 5
CLIENT_CREATE_AVATAR = 6
CLIENT_CREATE_AVATAR_RESP = 7
CLIENT_GET_AVATARS = 3
CLIENT_GET_AVATARS_RESP = 5
CLIENT_CREATE_AVATAR = 6
CLIENT_CREATE_AVATAR_RESP = 7
CLIENT_OBJECT_UPDATE_FIELD = 24
CLIENT_OBJECT_UPDATE_FIELD = 24
CLIENT_DISCONNECT = 37
CLIENT_DISCONNECT = 37
CLIENT_DELETE_AVATAR_RESP = 5
CLIENT_DELETE_AVATAR_RESP = 5
CLIENT_HEARTBEAT = 52
CLIENT_HEARTBEAT = 52
CLIENT_ADD_INTEREST = 97
CLIENT_REMOVE_INTEREST = 99
CLIENT_SET_NAME_PATTERN = 67
CLIENT_SET_NAME_PATTERN_ANSWER = 68
CLIENT_ADD_INTEREST = 97
CLIENT_REMOVE_INTEREST = 99
-- new toontown specific login message, adds last logged in, and if child account has parent acount
CLIENT_LOGIN_TOONTOWN = 125
CLIENT_LOGIN_TOONTOWN_RESP = 126
CLIENT_LOGIN_TOONTOWN = 125
CLIENT_LOGIN_TOONTOWN_RESP = 126
CLIENT_DISCONNECT_GENERIC = 1
CLIENT_DISCONNECT_RELOGIN = 100

View File

@ -1,7 +1,18 @@
package.path = package.path .. ";lua/?.lua"
local inspect = require('inspect')
local date = require('date')
-- From https://stackoverflow.com/a/22831842
function string.starts(str, start)
return string.sub(str, 1, string.len(start)) == start
end
-- From https://stackoverflow.com/a/2421746
function string.upperFirst(str)
return string.gsub(str, "^%l", string.upper)
end
function table.shallow_copy(t)
local t2 = {}
for k, v in pairs(t) do
@ -63,6 +74,41 @@ function saveAccountBridge()
assert(not err, err)
end
NAME_PATTERNS = {}
-- Read name patterns:
function readNamePatterns()
local io = require("io")
local f, err = io.open("../resources/phase_3/etc/NameMasterEnglish.txt")
assert(not err, err)
for line in f:lines() do
if string.starts(line, "#") then
goto continue
end
local parsed = {}
-- Match any character except "*"
for w in string.gmatch(line, "([^*]+)") do
table.insert(parsed, w)
end
if #parsed ~= 3 then
print(string.format("readNamePatterns: Invalid entry: %s", inspect(parsed)))
goto continue
end
table.insert(NAME_PATTERNS, parsed[3])
::continue::
end
print("ToontownClient: Name patterns successfully loaded.")
end
readNamePatterns()
-- Load message types:
dofile("lua/MsgTypes.lua")
@ -92,6 +138,8 @@ function receiveDatagram(client, dgi)
client:handleUpdateField(dgi)
elseif msgType == CLIENT_CREATE_AVATAR then
handleCreateAvatar(client, dgi)
elseif msgType == CLIENT_SET_NAME_PATTERN then
handleSetNamePattern(client, dgi)
else
client:sendDisconnect(CLIENT_DISCONNECT_GENERIC, string.format("Unknown message type: %d", msgType), true)
end
@ -410,6 +458,7 @@ function handleCreateAvatar(client, reader)
setDNAString = {dnaString},
setPosIndex = {avPosition},
setAccountName = {userTable.playToken},
WishNameState = {"OPEN"},
}
client:createDatabaseObject("DistributedToon", avatar, DATABASE_OBJECT_TYPE_TOON, function (avatarId)
@ -437,3 +486,74 @@ function handleCreateAvatar(client, reader)
client:sendDatagram(resp)
end)
end
function handleSetNamePattern(client, dgi)
local avId = dgi:readUint32()
client:getDatabaseValues(avId, "DistributedToon", {"WishNameState"}, function (doId, success, fields)
if not success then
client:sendDisconnect(CLIENT_DISCONNECT_ACCOUNT_ERROR, string.format("The DistributedToon object %d was unable to be queried.", avId), false)
return
end
if fields.WishNameState[1] ~= "OPEN" then
-- Only one name allowed!
client:sendDisconnect(CLIENT_DISCONNECT_ACCOUNT_ERROR, string.format("The DistributedToon object %d is unable to be named.", avId), true)
return
end
end)
local p1 = dgi:readInt16()
local f1 = dgi:readInt16()
local p2 = dgi:readInt16()
local f2 = dgi:readInt16()
local p3 = dgi:readInt16()
local f3 = dgi:readInt16()
local p4 = dgi:readInt16()
local f4 = dgi:readInt16()
-- Construct a pattern.
local pattern = {{p1, f1}, {p2, f2},
{p3, f3}, {p4, f4}}
local parts = {}
for _, pair in ipairs(pattern) do
local p, f = pair[1], pair[2]
local part = NAME_PATTERNS[p + 1]
if part == nil then
part = ""
end
if f then
string.upperFirst(part)
else
string.lower(part)
end
table.insert(parts, part)
end
-- Merge 3&4 (the last name) as there should be no space.
parts[3] = parts[3] .. table.remove(parts, 4)
for i = #parts, 1, -1 do
if parts[i] == "" then
table.remove(parts, i)
end
end
local name = table.concat(parts, " ")
client:setDatabaseValues(avId, "DistributedToon", {
WishNameState = {"LOCKED"},
WishName = {""},
setName = {name}
})
resp = datagram:new()
resp:addUint16(CLIENT_SET_NAME_PATTERN_ANSWER)
resp:addUint32(avId)
resp:addUint8(0)
client:sendDatagram(resp)
end