Advertisement
Guest User

Untitled

a guest
Aug 20th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.89 KB | None | 0 0
  1. resource.AddFile( "materials/ventix_add.png" );
  2. resource.AddFile( "materials/ventix_arrow.png" );
  3. resource.AddFile( "resource/fonts/DidactGothic-Regular.ttf" );
  4.  
  5. util.AddNetworkString( "VC::SendCharacterData" );
  6. util.AddNetworkString( "VC::SelectCharacter" );
  7. util.AddNetworkString( "VC::CreateCharacter" );
  8. util.AddNetworkString( "VC::DeleteCharacter" );
  9. VC.Characters = VC.Characters or {};
  10. VC.Ranks = VC.Ranks or {};
  11. /*
  12. VC.Characters[ steamid64 ] = {
  13. { character data }
  14. }
  15. */
  16. function VC:Initiate( _p )
  17.  
  18. if( VC.Broken ) then
  19. VC:Log( "Addon broken!", 2 );
  20. return;
  21. end
  22. VC.Ranks[ _p:SteamID64() ] = {};
  23. VC:Log( _p:Nick() .. "(" .. _p:SteamID64() .. ") joined, checking for characters.", 1 );
  24. if( file.Exists( "characters/" .. _p:SteamID64() .. ".txt", "DATA" ) ) then
  25. local data = util.JSONToTable( file.Read( "characters/" .. _p:SteamID64() .. ".txt" ) );
  26.  
  27. if( file.Exists( "characters/" .. _p:SteamID64() .. "_ranks.txt", "DATA" ) ) then
  28. VC.Ranks[ _p:SteamID64() ] = util.JSONToTable( file.Read( "characters/" .. _p:SteamID64() .. "_ranks.txt", "DATA" ) );
  29. end
  30.  
  31. if( table.Count( data ) == 3 ) then
  32. VC:Log( _p:Nick() .. " has characters." );
  33. VC.Characters[ _p:SteamID64() ] = data;
  34. else
  35. VC:Log( _p:Nick() .. " has no characters." );
  36. end
  37. else
  38. VC:Log( _p:Nick() .. " joined for the first time." );
  39. end
  40.  
  41. if( !VC.Characters[_p:SteamID64() ] ) then
  42. VC.Characters[ _p:SteamID64() ] = { charOne = false, charTwo = false, charThree = false };
  43. end
  44.  
  45. _p.save = 0;
  46. VC:SendCharacterData( _p );
  47. end
  48. hook.Add( "PlayerInitialSpawn", "VC::PlayerInitialSpawn", function( _p )
  49. if( _p:IsPlayer() ) then
  50. timer.Simple( 2, function()
  51. if( IsValid( _p ) ) then
  52. _p:Freeze( true );
  53. _p:StripWeapons();
  54. VC:Initiate( _p );
  55. end
  56. end );
  57. end
  58. end );
  59.  
  60. function VC:PromoteCharacter( _p )
  61. if( IsValid( _p ) && _p.character && VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ] ) then
  62. VC:Log( "Attempting to promote " .. _p:Nick(), 1 );
  63.  
  64. if( !_p.character.rank ) then
  65. _p.character.rank = 1;
  66. end
  67. local ref = VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ];
  68.  
  69. if( ref[ _p.character.rank + 1 ] ) then
  70. _p.character.rank = _p.character.rank + 1;
  71. ref = VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ][ _p.character.rank ];
  72. _p.character.salary = ref.salary;
  73. _p:SetHealth( ref.health );
  74. _p:SetArmor( ref.armor );
  75.  
  76. if( ref.model ) then
  77. _p:SetModel( ref.model );
  78. _p.character.model = ref.model;
  79. end
  80. local name = _p.character.name;
  81. if( VC.Settings.RankJobs[ team.GetName( _p.character.job ) ]
  82. && VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ]
  83. && VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ].rank ) then
  84. name = "[" .. VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ].rank .."] " .. name;
  85. end
  86. _p:setDarkRPVar( "rpname", name );
  87.  
  88. VC:Log( _p:Nick() .. " was promoted!" );
  89. VC:SendCharacterData( _p );
  90. VC:SaveCharacters( _p );
  91. end
  92. end
  93. end
  94.  
  95. function VC:SelectCharacter( _p, id, changes )
  96.  
  97. if( id == 1 ) then
  98. id = "charOne";
  99. elseif( id == 2 ) then
  100. id = "charTwo";
  101. else
  102. id = "charThree";
  103. end
  104. local sel = VC.Characters[ _p:SteamID64() ][ id ];
  105.  
  106. if( !_p:Alive() ) then
  107. _p:ChatPrint( "Respawn first!" );
  108. return;
  109. end
  110.  
  111. if( _p.character == sel && ( !changes.job || changes.job == sel.job ) ) then
  112. return;
  113. end
  114.  
  115. if( type( id ) == "number" || !sel ) then
  116. VC:Log( "User somehow selected non existing character!", 2 );
  117. _p:ChatPrint( "Fatal error in SelectCharacter!" );
  118. return;
  119. end
  120.  
  121. _p:Freeze( false );
  122. if( _p.character ) then
  123. _p.character.health = _p:Health();
  124. _p.character.armor = _p:Armor();
  125. _p.character.wallet = _p:getDarkRPVar( "money" );
  126.  
  127.  
  128. VC:Log( _p:Nick() .. " changed characters, saving old.." );
  129. VC:SendCharacterData( _p );
  130. VC:SaveCharacters( _p );
  131. end
  132.  
  133. sel.job = changes.job;
  134. sel.model = changes.model;
  135. sel.name = changes.name;
  136.  
  137. if( VC.Ranks[ _p:SteamID64() ][ sel.job ] ) then
  138. sel.rank = VC.Ranks[ _p:SteamID64() ][ sel.job ];
  139. end
  140.  
  141. if( VC.Settings.RankJobs[ team.GetName( sel.job ) ]
  142. && VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ]
  143. && VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].model ) then
  144. sel.model = VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].model;
  145. sel.health = VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].health;
  146. sel.armor = VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].armor;
  147. end
  148.  
  149. _p.save = 0;
  150. _p:changeTeam( sel.job, true );
  151. _p:SetTeam( sel.job );
  152. _p:SetModel( sel.model );
  153. _p:setDarkRPVar( "money", sel.wallet );
  154. _p:setDarkRPVar( "salary", sel.salary );
  155. _p:SetHealth( sel.health or 100 );
  156. _p:SetArmor( sel.armor or 0 );
  157. local name = sel.name;
  158. if( VC.Settings.RankJobs[ team.GetName( sel.job ) ]
  159. && VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ]
  160. && VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].rank ) then
  161. name = "[" .. VC.Settings.RankJobs[ team.GetName( sel.job ) ][ sel.rank ].rank .."] " .. name;
  162. end
  163. _p:setDarkRPVar( "rpname", name );
  164. _p:Spawn();
  165.  
  166. _p.character = sel;
  167. end
  168. net.Receive( "VC::SelectCharacter", function( _, _p )
  169.  
  170. local id = net.ReadFloat();
  171. local changes = net.ReadTable();
  172. if( type( id ) == "number" && id <= 3 && id >= 1 ) then
  173. VC:SelectCharacter( _p, id, changes );
  174. end
  175.  
  176. end );
  177.  
  178.  
  179. hook.Add( "PlayerSpawn", "VC::SpawnWithRank", function( _p )
  180. if( _p.character && VC.Settings.RankJobs[ team.GetName( _p.character.job ) ]
  181. && VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ] ) then
  182. timer.Simple( 2, function()
  183. local ref = VC.Settings.RankJobs[ team.GetName( _p.character.job ) ][ _p.character.rank ];
  184. if( ref.health ) then
  185. _p:SetHealth( ref.health );
  186. end
  187.  
  188. if( ref.armor ) then
  189. _p:SetArmor( ref.armor );
  190. end
  191.  
  192. if( _p.character.model ) then
  193. _p:SetModel( _p.character.model );
  194. end
  195. end );
  196. end
  197. end );
  198.  
  199. function VC:SendCharacterData( _p, force )
  200.  
  201. local data = VC.Characters[ _p:SteamID64() ];
  202. if( !data ) then
  203. VC:Log( "Attempting to send character data that doesn't exist!", 2 );
  204. return;
  205. end
  206.  
  207. if( !force ) then
  208. force = false;
  209. end
  210.  
  211. VC:Log( "Sending character data to " .. _p:Nick() .. ".", 1 );
  212. net.Start( "VC::SendCharacterData" );
  213. net.WriteTable( VC.Characters[ _p:SteamID64() ] );
  214. net.WriteBool( force );
  215. net.Send( _p );
  216.  
  217. end
  218.  
  219. net.Receive( "VC::DeleteCharacter", function( _, _p )
  220.  
  221. local char = net.ReadFloat();
  222. if( type( char ) != "number" ) then
  223. return;
  224. end
  225.  
  226. if( char == 1 ) then
  227. char = "charOne";
  228. elseif( char == 2 ) then
  229. char = "charTwo";
  230. else
  231. char = "charThree";
  232. end
  233.  
  234. if( VC.Characters[ _p:SteamID64() ][ char ] ) then
  235. if( VC.Characters[ _p:SteamID64() ][ char ] == _p.character ) then
  236. _p:ChatPrint( "You can't delete your active character!" );
  237. return;
  238. end
  239. VC:Log( _p:Nick() .. " deleting character " .. char );
  240. VC.Characters[ _p:SteamID64() ][ char ] = false;
  241. VC:SaveCharacters( _p );
  242. VC:SendCharacterData( _p );
  243. end
  244.  
  245. end );
  246.  
  247. function VC:CreateCharacter( _p, data )
  248.  
  249. /* data:
  250. data.job = RPExtraTeams[ data.job ]
  251. data.model = ^.model
  252. data.name = string
  253. \later added/
  254. data.rank = 1
  255. data.salary = ^.salary
  256. data.wallet = 0;
  257. data.health = 100;
  258. data.armor = 0;
  259. */
  260. VC:Log( "Character data passed all tests, creating character.." );
  261.  
  262. data.prefix = false;
  263. data.salary = RPExtraTeams[ data.job ].salary;
  264. data.wallet = VC.Settings.StartMoney;
  265.  
  266. if( VC.Settings.RankJobs[ RPExtraTeams[ data.job ].name ] ) then
  267. data.rank = 1;
  268. end
  269.  
  270. if( !VC.Characters[ _p:SteamID64() ].charOne ) then
  271. VC.Characters[ _p:SteamID64() ].charOne = data;
  272. elseif( !VC.Characters[ _p:SteamID64() ].charTwo ) then
  273. VC.Characters[ _p:SteamID64() ].charTwo = data;
  274. else
  275. VC.Characters[ _p:SteamID64() ].charThree = data;
  276. end
  277.  
  278. VC:Log( "Character created!" );
  279. VC:SendCharacterData( _p );
  280. VC:SaveCharacters( _p );
  281. end
  282.  
  283. hook.Add( "ShowSpare2", "VC::Open", function( _p )
  284. VC:SendCharacterData( _p, true );
  285. end );
  286.  
  287. net.Receive( "VC::CreateCharacter", function( _, _p )
  288.  
  289. VC:Log( "Received character creation requested from " .. _p:Nick() .. "(" .. _p:SteamID64() .. ")", 1 );
  290. local data = net.ReadTable();
  291. local errors = {};
  292.  
  293. // verifications
  294. if( !data.job || type( data.job ) != "number" || !RPExtraTeams[ data.job ] ) then
  295. return;
  296. end
  297.  
  298. if( VC:IsWhitelistJob( data.job ) && !VC:IsWhitelisted( _p, data.job ) ) then
  299. table.insert( errors, "Job " .. data.job .. " requires whitelisting." );
  300. end
  301.  
  302. if( !VC:IsValidName( data.name ) ) then
  303. table.insert( errors, "Invalid character name." );
  304. end
  305.  
  306. if( !VC:CanCreateNew( _p ) ) then
  307. table.insert( errors, "Can't create more characters, delete one first." );
  308. end
  309.  
  310. if( table.Count( errors ) > 0 ) then
  311. VC:Log( "Errors for " .. _p:Nick() .. "'s character creation:", 2 );
  312. for i, v in pairs( errors ) do
  313. VC:Log( "Error " .. i .. ": " .. v );
  314. _p:ChatPrint( "Error! " .. v );
  315. end
  316. return;
  317. end
  318.  
  319. VC:CreateCharacter( _p, data );
  320.  
  321. end );
  322.  
  323. function VC:SaveCharacters( id64 )
  324. if( type( id64 ) == "Player" ) then
  325. if( id64.character ) then
  326. if( id64:Health() > 0 ) then
  327. id64.character.health = id64:Health();
  328. end
  329.  
  330. id64.character.armor = id64:Armor() or 0;
  331. id64.character.wallet = id64:getDarkRPVar( "money" );
  332. end
  333. id64 = id64:SteamID64();
  334. end
  335.  
  336. local characters = VC.Characters[ id64 ];
  337. VC:Log( "Attempting to save id " .. id64, 1 );
  338.  
  339. if( !VC.Characters[ id64 ] ) then
  340. VC:Log( "No data for " .. id64 .. "!", 2 );
  341. return false;
  342. else
  343. for i, v in pairs( VC.Characters[ id64 ] ) do
  344. if( v && v.rank ) then
  345. VC.Ranks[ id64 ][ v.job ] = v.rank;
  346. end
  347. end
  348. if( VC.Ranks[ id64 ] ) then
  349. file.Write( "characters/" .. id64 .. "_ranks.txt", util.TableToJSON( VC.Ranks[ id64 ] ) );
  350. end
  351.  
  352. file.Write( "characters/" .. id64 .. ".txt", util.TableToJSON( VC.Characters[ id64 ] ) );
  353. VC:Log( "Data saved for id " .. id64 );
  354. end
  355. return true;
  356. end
  357.  
  358. hook.Add( "playerGetSalary", "VC::ReplaceSalary", function( _p, _ )
  359.  
  360. if( _p.character && RPExtraTeams[ _p.character.job ] && VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ]
  361. && VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ][ _p.character.rank ] ) then
  362. _p.save = _p.save + 1;
  363. return false, false, VC.Settings.RankJobs[ RPExtraTeams[ _p.character.job ].name ][ _p.character.rank ].salary;
  364. end
  365.  
  366. end );
  367.  
  368. hook.Add( "DarkRPVarChanged", "VC::VarChange", function( _p, var, _, _ )
  369.  
  370. if( var == "money" ) then
  371. if( !_p.save ) then
  372. _p.save = 0;
  373. end
  374. _p.save = _p.save + 1;
  375. if( _p.character && _p.save && _p.save > 3 ) then
  376. _p.character.wallet = _p:getDarkRPVar( "money" );
  377. VC:SaveCharacters( _p );
  378. _p.save = 0;
  379. end
  380. end
  381.  
  382. end );
  383.  
  384. hook.Add( "ShutDown", "VC::ShutDown", function()
  385.  
  386. for i, v in pairs( player.GetAll() ) do
  387. VC:SaveCharacters( v );
  388. end
  389.  
  390. end );
  391.  
  392. hook.Add( "PlayerDisconnected", "VC::Disconnect", function( _p )
  393. if( _p.character ) then
  394. if( VC:SaveCharacters( _p ) ) then
  395. VC:Log( "Successfully saved characters for disconnected player, unsetting data." );
  396. VC.Characters[ _p:SteamID64() ] = nil;
  397. VC.Ranks[ _p:SteamID64() ] = nil;
  398. else
  399. VC:Log( "Could not save characters for disconnected player " .. id64 .. "!", 2 );
  400. end
  401. end
  402. end );
  403.  
  404.  
  405. hook.Add( "InitPostEntity", "VC::Setup", function()
  406.  
  407. if( !file.Exists( "characters", "DATA" ) ) then
  408. VC:Log( "Attempting to create characters data folder..", 1 );
  409.  
  410. file.CreateDir( "characters" );
  411. if( !file.Exists( "characters", "DATA" ) ) then
  412. VC:Log( "Could not create characters data folder!", 2 ) ;
  413. VC.Broken = true;
  414. else
  415. VC:Log( "characters data folder created." );
  416. end
  417. end
  418.  
  419. end );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement