Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- resource.AddFile( "materials/ventix_add.png" );
- resource.AddFile( "materials/ventix_arrow.png" );
- resource.AddFile( "resource/fonts/DidactGothic-Regular.ttf" );
- util.AddNetworkString( "VC::SendCharacterData" );
- util.AddNetworkString( "VC::SelectCharacter" );
- util.AddNetworkString( "VC::CreateCharacter" );
- util.AddNetworkString( "VC::DeleteCharacter" );
- VC.Characters = VC.Characters or {};
- VC.Ranks = VC.Ranks or {};
- /*
- VC.Characters[ steamid64 ] = {
- { character data }
- }
- */
- function VC:Initiate( _p )
- if( VC.Broken ) then
- VC:Log( "Addon broken!", 2 );
- return;
- end
- VC.Ranks[ _p:SteamID64() ] = {};
- VC:Log( _p:Nick() .. "(" .. _p:SteamID64() .. ") joined, checking for characters.", 1 );
- if( file.Exists( "characters/" .. _p:SteamID64() .. ".txt", "DATA" ) ) then
- local data = util.JSONToTable( file.Read( "characters/" .. _p:SteamID64() .. ".txt" ) );
- if( file.Exists( "characters/" .. _p:SteamID64() .. "_ranks.txt", "DATA" ) ) then
- VC.Ranks[ _p:SteamID64() ] = util.JSONToTable( file.Read( "characters/" .. _p:SteamID64() .. "_ranks.txt", "DATA" ) );
- end
- if( table.Count( data ) == 3 ) then
- VC:Log( _p:Nick() .. " has characters." );
- VC.Characters[ _p:SteamID64() ] = data;
- else
- VC:Log( _p:Nick() .. " has no characters." );
- end
- else
- VC:Log( _p:Nick() .. " joined for the first time." );
- end
- if( !VC.Characters[_p:SteamID64() ] ) then
- VC.Characters[ _p:SteamID64() ] = { charOne = false, charTwo = false, charThree = false };
- end
- _p.save = 0;
- VC:SendCharacterData( _p );
- end
- hook.Add( "PlayerInitialSpawn", "VC::PlayerInitialSpawn", function( _p )
- if( _p:IsPlayer() ) then
- timer.Simple( 2, function()
- if( IsValid( _p ) ) then
- _p:Freeze( true );
- _p:StripWeapons();
- VC:Initiate( _p );
- end
- end );
- end
- end );
- function VC:PromoteCharacter( _p )
- if( IsValid( _p ) && _p.character && VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ] ) then
- VC:Log( "Attempting to promote " .. _p:Nick(), 1 );
- if( !_p.character.rank ) then
- _p.character.rank = 1;
- end
- local ref = VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ];
- if( ref[ _p.character.rank + 1 ] ) then
- _p.character.rank = _p.character.rank + 1;
- ref = VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ][ _p.character.rank ];
- _p.character.salary = ref.salary;
- _p:SetHealth( ref.health );
- _p:SetArmor( ref.armor );
- if( ref.model ) then
- _p:SetModel( ref.model );
- _p.character.model = ref.model;
- end
- local name = _p.character.name;
- if( VC.Settings.RankJobs[ team.GetName( _p.character.job ) ]
- && VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ]
- && VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ].rank ) then
- name = "[" .. VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ].rank .."] " .. name;
- end
- _p:setDarkRPVar( "rpname", name );
- VC:Log( _p:Nick() .. " was promoted!" );
- VC:SendCharacterData( _p );
- VC:SaveCharacters( _p );
- end
- end
- end
- function VC:SelectCharacter( _p, id, changes )
- if( id == 1 ) then
- id = "charOne";
- elseif( id == 2 ) then
- id = "charTwo";
- else
- id = "charThree";
- end
- local sel = VC.Characters[ _p:SteamID64() ][ id ];
- if( !_p:Alive() ) then
- _p:ChatPrint( "Respawn first!" );
- return;
- end
- if( _p.character == sel && ( !changes.job || changes.job == sel.job ) ) then
- return;
- end
- if( type( id ) == "number" || !sel ) then
- VC:Log( "User somehow selected non existing character!", 2 );
- _p:ChatPrint( "Fatal error in SelectCharacter!" );
- return;
- end
- _p:Freeze( false );
- if( _p.character ) then
- _p.character.health = _p:Health();
- _p.character.armor = _p:Armor();
- _p.character.wallet = _p:getDarkRPVar( "money" );
- VC:Log( _p:Nick() .. " changed characters, saving old.." );
- VC:SendCharacterData( _p );
- VC:SaveCharacters( _p );
- end
- sel.job = changes.job;
- sel.model = changes.model;
- sel.name = changes.name;
- if( VC.Ranks[ _p:SteamID64() ][ sel.job ] ) then
- sel.rank = VC.Ranks[ _p:SteamID64() ][ sel.job ];
- end
- if( VC.Settings.RankJobs[ team.GetName( sel.job ) ]
- && VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ]
- && VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].model ) then
- sel.model = VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].model;
- sel.health = VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].health;
- sel.armor = VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].armor;
- end
- _p.save = 0;
- _p:changeTeam( sel.job, true );
- _p:SetTeam( sel.job );
- _p:SetModel( sel.model );
- _p:setDarkRPVar( "money", sel.wallet );
- _p:setDarkRPVar( "salary", sel.salary );
- _p:SetHealth( sel.health or 100 );
- _p:SetArmor( sel.armor or 0 );
- local name = sel.name;
- if( VC.Settings.RankJobs[ team.GetName( sel.job ) ]
- && VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ]
- && VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].rank ) then
- name = "[" .. VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].rank .."] " .. name;
- end
- _p:setDarkRPVar( "rpname", name );
- _p:Spawn();
- _p.character = sel;
- end
- net.Receive( "VC::SelectCharacter", function( _, _p )
- local id = net.ReadFloat();
- local changes = net.ReadTable();
- if( type( id ) == "number" && id <= 3 && id >= 1 ) then
- VC:SelectCharacter( _p, id, changes );
- end
- end );
- hook.Add( "PlayerSpawn", "VC::SpawnWithRank", function( _p )
- if( _p.character && VC.Settings.RankJobs[ team.GetName( _p.character.job ) ]
- && VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ] ) then
- timer.Simple( 2, function()
- local ref = VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ];
- if( ref.health ) then
- _p:SetHealth( ref.health );
- end
- if( ref.armor ) then
- _p:SetArmor( ref.armor );
- end
- if( _p.character.model ) then
- _p:SetModel( _p.character.model );
- end
- end );
- end
- end );
- function VC:SendCharacterData( _p, force )
- local data = VC.Characters[ _p:SteamID64() ];
- if( !data ) then
- VC:Log( "Attempting to send character data that doesn't exist!", 2 );
- return;
- end
- if( !force ) then
- force = false;
- end
- VC:Log( "Sending character data to " .. _p:Nick() .. ".", 1 );
- net.Start( "VC::SendCharacterData" );
- net.WriteTable( VC.Characters[ _p:SteamID64() ] );
- net.WriteBool( force );
- net.Send( _p );
- end
- net.Receive( "VC::DeleteCharacter", function( _, _p )
- local char = net.ReadFloat();
- if( type( char ) != "number" ) then
- return;
- end
- if( char == 1 ) then
- char = "charOne";
- elseif( char == 2 ) then
- char = "charTwo";
- else
- char = "charThree";
- end
- if( VC.Characters[ _p:SteamID64() ][ char ] ) then
- if( VC.Characters[ _p:SteamID64() ][ char ] == _p.character ) then
- _p:ChatPrint( "You can't delete your active character!" );
- return;
- end
- VC:Log( _p:Nick() .. " deleting character " .. char );
- VC.Characters[ _p:SteamID64() ][ char ] = false;
- VC:SaveCharacters( _p );
- VC:SendCharacterData( _p );
- end
- end );
- function VC:CreateCharacter( _p, data )
- /* data:
- data.job = RPExtraTeams[ data.job ]
- data.model = ^.model
- data.name = string
- \later added/
- data.rank = 1
- data.salary = ^.salary
- data.wallet = 0;
- data.health = 100;
- data.armor = 0;
- */
- VC:Log( "Character data passed all tests, creating character.." );
- data.prefix = false;
- data.salary = RPExtraTeams[ data.job ].salary;
- data.wallet = VC.Settings.StartMoney;
- if( VC.Settings.RankJobs[ RPExtraTeams[ data.job ].name ] ) then
- data.rank = 1;
- end
- if( !VC.Characters[ _p:SteamID64() ].charOne ) then
- VC.Characters[ _p:SteamID64() ].charOne = data;
- elseif( !VC.Characters[ _p:SteamID64() ].charTwo ) then
- VC.Characters[ _p:SteamID64() ].charTwo = data;
- else
- VC.Characters[ _p:SteamID64() ].charThree = data;
- end
- VC:Log( "Character created!" );
- VC:SendCharacterData( _p );
- VC:SaveCharacters( _p );
- end
- hook.Add( "ShowSpare2", "VC::Open", function( _p )
- VC:SendCharacterData( _p, true );
- end );
- net.Receive( "VC::CreateCharacter", function( _, _p )
- VC:Log( "Received character creation requested from " .. _p:Nick() .. "(" .. _p:SteamID64() .. ")", 1 );
- local data = net.ReadTable();
- local errors = {};
- // verifications
- if( !data.job || type( data.job ) != "number" || !RPExtraTeams[ data.job ] ) then
- return;
- end
- if( VC:IsWhitelistJob( data.job ) && !VC:IsWhitelisted( _p, data.job ) ) then
- table.insert( errors, "Job " .. data.job .. " requires whitelisting." );
- end
- if( !VC:IsValidName( data.name ) ) then
- table.insert( errors, "Invalid character name." );
- end
- if( !VC:CanCreateNew( _p ) ) then
- table.insert( errors, "Can't create more characters, delete one first." );
- end
- if( table.Count( errors ) > 0 ) then
- VC:Log( "Errors for " .. _p:Nick() .. "'s character creation:", 2 );
- for i, v in pairs( errors ) do
- VC:Log( "Error " .. i .. ": " .. v );
- _p:ChatPrint( "Error! " .. v );
- end
- return;
- end
- VC:CreateCharacter( _p, data );
- end );
- function VC:SaveCharacters( id64 )
- if( type( id64 ) == "Player" ) then
- if( id64.character ) then
- if( id64:Health() > 0 ) then
- id64.character.health = id64:Health();
- end
- id64.character.armor = id64:Armor() or 0;
- id64.character.wallet = id64:getDarkRPVar( "money" );
- end
- id64 = id64:SteamID64();
- end
- local characters = VC.Characters[ id64 ];
- VC:Log( "Attempting to save id " .. id64, 1 );
- if( !VC.Characters[ id64 ] ) then
- VC:Log( "No data for " .. id64 .. "!", 2 );
- return false;
- else
- for i, v in pairs( VC.Characters[ id64 ] ) do
- if( v && v.rank ) then
- VC.Ranks[ id64 ][ v.job ] = v.rank;
- end
- end
- if( VC.Ranks[ id64 ] ) then
- file.Write( "characters/" .. id64 .. "_ranks.txt", util.TableToJSON( VC.Ranks[ id64 ] ) );
- end
- file.Write( "characters/" .. id64 .. ".txt", util.TableToJSON( VC.Characters[ id64 ] ) );
- VC:Log( "Data saved for id " .. id64 );
- end
- return true;
- end
- hook.Add( "playerGetSalary", "VC::ReplaceSalary", function( _p, _ )
- if( _p.character && RPExtraTeams[ _p.character.job ] && VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ]
- && VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ][ _p.character.rank ] ) then
- _p.save = _p.save + 1;
- return false, false, VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ][ _p.character.rank ].salary;
- end
- end );
- hook.Add( "DarkRPVarChanged", "VC::VarChange", function( _p, var, _, _ )
- if( var == "money" ) then
- if( !_p.save ) then
- _p.save = 0;
- end
- _p.save = _p.save + 1;
- if( _p.character && _p.save && _p.save > 3 ) then
- _p.character.wallet = _p:getDarkRPVar( "money" );
- VC:SaveCharacters( _p );
- _p.save = 0;
- end
- end
- end );
- hook.Add( "ShutDown", "VC::ShutDown", function()
- for i, v in pairs( player.GetAll() ) do
- VC:SaveCharacters( v );
- end
- end );
- hook.Add( "PlayerDisconnected", "VC::Disconnect", function( _p )
- if( _p.character ) then
- if( VC:SaveCharacters( _p ) ) then
- VC:Log( "Successfully saved characters for disconnected player, unsetting data." );
- VC.Characters[ _p:SteamID64() ] = nil;
- VC.Ranks[ _p:SteamID64() ] = nil;
- else
- VC:Log( "Could not save characters for disconnected player " .. id64 .. "!", 2 );
- end
- end
- end );
- hook.Add( "InitPostEntity", "VC::Setup", function()
- if( !file.Exists( "characters", "DATA" ) ) then
- VC:Log( "Attempting to create characters data folder..", 1 );
- file.CreateDir( "characters" );
- if( !file.Exists( "characters", "DATA" ) ) then
- VC:Log( "Could not create characters data folder!", 2 ) ;
- VC.Broken = true;
- else
- VC:Log( "characters data folder created." );
- end
- end
- end );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement