This is a really cool thread, I think anyway. I don’t want to post an example because I feel it won’t be exact to my style. Soo I’m just going to post this which I scripted yesterday, I notice that my style is really inconsistent but anyway what do you think? It’s not like how you do it, keeping lua all to lua, i make use of pretty much every c++ operator garry has added instead of the lua variants. Just habbit really.
[lua]
require(“glon”);
TreeSauce.characters = {};
if ( SERVER ) then
– Get a players characters, returns false if they have no characters.
function TreeSauce.characters.GetPlayerCharacters(player)
if ( !player.characters && !player:GetPData(“Characters”) ) then
return false;
end;
if ( player.characters ) then
return player.characters;
else
return glon.decode( player:GetPData("Characters") );
end;
end;
– Load the saved version of their characters.
function TreeSauce.characters.LoadSavedCharacters(player)
if ( player:GetPData(“Characters”) ) then
player.characters = glon.decode(player:GetPData(“Characters”));
for name,data in pairs( player.characters ) do
if ( data.inventory ) then
local oldInvData = data.inventory;
local oldMaxWeight = data.weight;
player.characters[name].inventory = TreeSauce.container:Create();
player.characters[name].inventory:SetMaxWeight(oldMaxWeight);
player.characters[name].inventory:OverrideInventory(oldInvData);
end;
end;
end;
end;
– Save the characters table, if an override is given
function TreeSauce.characters.SavePlayerCharacters( player, override )
if ( !player.characters ) then
if ( !override ) then return; end;
end;
local charlist;
if ( override ) then
charlist = override;
else
charlist = player.characters;
end;
for k,v in pairs( charlist ) do
if ( v.inventory ) then
v.inventory = v.inventory:GetInventoryList();
end;
end;
local charlistenc = glon.encode(charlist);
player:SetPData( "Characters", charlistenc );
end;
– Create a new character.
function TreeSauce.characters.PlayerCreateCharacter( player, sGender, sModel, sNameFirst, sNameLast, sDescription )
if ( !player ) then return; end;
if ( !sGender ) then return; end;
if ( !sModel ) then return; end;
if ( !sNameFirst ) then return; end;
if ( !sNameLast ) then return; end;
if ( !sDescription ) then return; end;
if ( !player.characters ) then
player.characters = {};
end;
local nameFull = sNameFirst .. " " .. sNameLast;
local data = {};
data.gender = sGender;
data.model = sModel;
data.description = sDescription;
--data.inventory = {};
player.characters[nameFull] = data;
TreeSauce.characters.SavePlayerCharacters(player);
end;
– Delete a character
function TreeSauce.characters.Delete( player, character )
if ( !player or !character ) then return; end;
if ( !TreeSauce.characters.GetPlayerCharacters(player) ) then return; end;
if ( !player.characters ) then
TreeSauce.characters.LoadSavedCharacters(player);
end;
if ( !player.characters[character] ) then return; end;
player.characters[character] = nil;
TreeSauce.characters.SavePlayerCharacters(player);
-- This is where we want to check if they were logged onto that character, and if they were display a notification and then the selection menu.
end;
– Set a characters model.
function TreeSauce.characters.SetCharacterModel( player, character, model )
if ( !player or !character or !model ) then return; end;
if ( !TreeSauce.characters.GetPlayerCharacters(player) ) then return; end;
if ( !player.characters ) then
TreeSauce.characters.LoadSavedCharacters(player);
end;
if ( !player.characters[character] ) then return; end;
player.characters[character].model = model;
TreeSauce.characters.SavePlayerCharacters(player);
-- this is where we check if they are logged in, and if they are set their player entities model, UNLESS THEY ARE WEARING CLOTHING( update this when we add it ).
end;
– Get a characters model.
function TreeSauce.characters.GetCharacterModel( player, character )
if ( !player or !character ) then return; end;
if ( !TreeSauce.characters.GetPlayerCharacters(player) ) then return; end;
if ( !player.characters ) then
TreeSauce.characters.LoadSavedCharacters(player);
end;
if ( !player.characters[character] ) then return; end;
return player.characters[character].model;
end;
– Set a characters description.
function TreeSauce.characters.SetCharacterDescription( player, character, description )
if ( !player or !character or !description ) then return; end;
if ( !TreeSauce.characters.GetPlayerCharacters(player) ) then return; end;
if ( !player.characters ) then
TreeSauce.characters.LoadSavedCharacters(player);
end;
if ( !player.characters[character] ) then return; end;
player.characters[character].description = description;
TreeSauce.characters.SavePlayerCharacters(player);
end;
– Get a characters description
function TreeSauce.characters.GetCharacterDescription( player, character )
if ( !player or !character ) then return; end;
if ( !TreeSauce.characters.GetPlayerCharacters(player) ) then return; end;
if ( !player.characters ) then
TreeSauce.characters.LoadSavedCharacters(player);
end;
if ( !player.characters[character] ) then return; end;
return player.characters[character].description;
end;
– Change a characters name, now this should probably be restricted to admin access.
function TreeSauce.characters.ChangeCharacterName( player, character, newfirst, newlast )
if ( !player or !character or !newfirst or !newlast) then return; end;
if ( !TreeSauce.characters.GetPlayerCharacters(player) ) then return; end;
if ( !player.characters ) then
TreeSauce.characters.LoadSavedCharacters(player);
end;
if ( !player.characters[character] ) then return; end;
local copy = player.characters[character];
local nameFull = newfirst .. " " .. newlast;
player.characters[nameFull] = copy;
player.characters[character] = nil;
TreeSauce.characters.SavePlayerCharacters(player);
TreeSauce.characters.ClientRequestLocalCopy( player, nameFull);
TreeSauce.characters.DeleteCharacterLocalCopy( player, character );
-- If they are logged in you might have to change some shit, best keep this to a hook. when i make the login make sure to call it only if they are on that char, no point otherwise.
TreeSauce.characters.OnNameChange(player,character,nameFull);
end;
– This is the hook incase we need to update a player after a name change,while they are logged in.
function TreeSauce.characters.OnNameChange( player, old, new )
if ( player.alias == old ) then
player.alias = new;
player:SetModel( player.characters[new].model );
end;
end;
– Activate a character for use.
function TreeSauce.characters.Login( player, character )
if ( !player or !character ) then return; end;
if ( !TreeSauce.characters.GetPlayerCharacters(player) ) then return; end;
if ( !player.characters ) then
TreeSauce.characters.LoadSavedCharacters(player);
end;
if ( !player.characters[character] ) then return; end;
local data = player.characters[character];
player.alias = character;
player:SetModel( data.model );
-- other data will probably be sent here, just saying for now.
TreeSauce.characters.OnCharacterLogin( player, character );
end;
– an event for when they login to their character, handle data etc. here
function TreeSauce.characters.OnCharacterLogin( player, character )
end;
– Called when a client wants his local version of his client data updated.
function TreeSauce.characters.ClientRequestLocalCopy( player, character )
if ( !player.characters ) then return; end;
if ( !player.characters[character] ) then return; end;
local charlist = glon.encode(player.characters[character]);
umsg.Start( "ClientRequestCharacterListLocalCopy", player )
umsg.String( character );
umsg.String( charlist );
umsg.End();
end;
– delete a local copy of a character table.
function TreeSauce.characters.DeleteCharacterLocalCopy( player, character )
if ( !player or !character ) then return; end;
umsg.Start( "DeleteCharacterLocalCopy", player )
umsg.String(character);
umsg.End();
end;
– so the client can request local copies by themselves
concommand.Add( “TreeSauce_RequestCharacterListLocalCopy”, function( player, command, arguments )
if ( !arguments[1] ) then return; end;
TreeSauce.characters.ClientRequestLocalCopy( player, arguments[1] );
end);
end;
if ( CLIENT ) then
TreeSauce.characters.LocalData = {};
usermessage.Hook( "DeleteCharacterLocalCopy", function( bfr )
local character = bfr:ReadString();
if ( !TreeSauce.characters.LocalData[character] ) then return; end;
TreeSauce.characters.LocalData[character] = nil;
end);
usermessage.Hook( "ClientRequestCharacterListLocalCopy", function( bfr )
local key = bfr:ReadString();
local copy = bfr:ReadString();
TreeSauce.characters.LocalData[key] = glon.decode(copy);
end);
end;
[/lua]