Init
This commit is contained in:
commit
e2db00b0ea
5
lua/autorun/cl_d3stats.lua
Normal file
5
lua/autorun/cl_d3stats.lua
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
if (SERVER) then
|
||||||
|
include("d3stats/init.lua")
|
||||||
|
else
|
||||||
|
include("d3stats/cl_init.lua")
|
||||||
|
end
|
30
lua/d3stats/cl_hud.lua
Normal file
30
lua/d3stats/cl_hud.lua
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
-- Delete HUD and redo if already existent. This will reset the values until the next update from the server
|
||||||
|
if d3stats.D3StatsOverlay then
|
||||||
|
d3stats.D3StatsOverlay:Remove()
|
||||||
|
d3stats.Overlay_Init()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- HUD on the left top of the screen
|
||||||
|
function d3stats.Overlay_Init()
|
||||||
|
local screenscale = BetterScreenScale()
|
||||||
|
|
||||||
|
d3stats.D3StatsOverlay = vgui.Create( "D3StatsOverlay" )
|
||||||
|
d3stats.D3StatsOverlay:SetPos( 0, screenscale * 80 )
|
||||||
|
d3stats.D3StatsOverlay:SetSize( 350, 100 )
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Call this function from cl_targetid.lua in the gamemode
|
||||||
|
local colTemp = Color(255, 255, 255)
|
||||||
|
function d3stats.DrawTargetID( ent, fade, x, y )
|
||||||
|
|
||||||
|
colTemp.a = fade * 255
|
||||||
|
--util.ColorCopy(COLOR_FRIENDLY, colTemp)
|
||||||
|
|
||||||
|
if ent.D3Stats_Level and d3stats.Levels[ent.D3Stats_Level] then
|
||||||
|
draw.SimpleTextBlur("Level " .. tostring(ent.D3Stats_Level) .. " \"" .. d3stats.Levels[ent.D3Stats_Level].Name .. "\"", "ZSHUDFontTiny", x, y, colTemp, TEXT_ALIGN_CENTER)
|
||||||
|
y = y + draw.GetFontHeight("ZSHUDFontTiny") + 4
|
||||||
|
end
|
||||||
|
|
||||||
|
return x, y
|
||||||
|
end
|
16
lua/d3stats/cl_init.lua
Normal file
16
lua/d3stats/cl_init.lua
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
d3stats = d3stats or {}
|
||||||
|
|
||||||
|
-- Includes
|
||||||
|
include( "sh_settings.lua" )
|
||||||
|
include( "sh_level.lua" )
|
||||||
|
include( "sh_concommand.lua" )
|
||||||
|
|
||||||
|
include( "cl_network.lua" )
|
||||||
|
include( "cl_hud.lua" )
|
||||||
|
|
||||||
|
include( "vgui/overlay.lua" )
|
||||||
|
|
||||||
|
-- Initialisation
|
||||||
|
hook.Add( "Initialize", "D3Stats_Init", function ()
|
||||||
|
d3stats.Overlay_Init()
|
||||||
|
end )
|
29
lua/d3stats/cl_network.lua
Normal file
29
lua/d3stats/cl_network.lua
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
net.Receive( "D3Stats_UpdateXP", function()
|
||||||
|
local XP = net.ReadUInt( 32 )
|
||||||
|
|
||||||
|
--print( "XP update: " .. tostring(XP))
|
||||||
|
|
||||||
|
if d3stats and d3stats.D3StatsOverlay then
|
||||||
|
d3stats.D3StatsOverlay:StatsUpdate( XP, d3stats.CalculateLevel( XP ) )
|
||||||
|
end
|
||||||
|
end )
|
||||||
|
|
||||||
|
net.Receive( "D3Stats_UpdateLevels", function()
|
||||||
|
local players = net.ReadUInt( 16 )
|
||||||
|
|
||||||
|
for i = 1, players do
|
||||||
|
local ply = net.ReadEntity()
|
||||||
|
local Level = net.ReadUInt( 16 )
|
||||||
|
ply.D3Stats_Level = Level
|
||||||
|
--print( "Level update: " .. tostring(ply) .." --> " .. tostring(Level))
|
||||||
|
end
|
||||||
|
end )
|
||||||
|
|
||||||
|
net.Receive( "D3Stats_BroadcastLevel", function()
|
||||||
|
local ply = net.ReadEntity()
|
||||||
|
local Level = net.ReadUInt( 16 )
|
||||||
|
|
||||||
|
ply.D3Stats_Level = Level
|
||||||
|
|
||||||
|
--print( "Level broadcast: " .. tostring(ply) .." --> " .. tostring(Level))
|
||||||
|
end )
|
108
lua/d3stats/init.lua
Normal file
108
lua/d3stats/init.lua
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
--[[
|
||||||
|
|
||||||
|
XP and statistics addon for the "Zombie Survival" gamemode
|
||||||
|
by David Vogel (Dadido3)
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
d3stats = d3stats or {}
|
||||||
|
|
||||||
|
AddCSLuaFile( "sh_settings.lua" )
|
||||||
|
AddCSLuaFile( "sh_level.lua" )
|
||||||
|
AddCSLuaFile( "sh_concommand.lua" )
|
||||||
|
|
||||||
|
AddCSLuaFile( "cl_init.lua" )
|
||||||
|
AddCSLuaFile( "cl_network.lua" )
|
||||||
|
AddCSLuaFile( "cl_hud.lua" )
|
||||||
|
AddCSLuaFile( "vgui/overlay.lua" )
|
||||||
|
|
||||||
|
include( "sh_settings.lua" )
|
||||||
|
include( "sh_level.lua" )
|
||||||
|
include( "sh_concommand.lua" )
|
||||||
|
|
||||||
|
include( "sv_network.lua" )
|
||||||
|
|
||||||
|
-- XP rewards for players getting points
|
||||||
|
hook.Add( "PlayerPointsAdded", "D3Stats_PlayerPointsAdded", function ( ply, points )
|
||||||
|
if points <= d3stats.PlayerPointsAdded_Limit then
|
||||||
|
ply:D3Stats_AddXP( points )
|
||||||
|
end
|
||||||
|
end )
|
||||||
|
|
||||||
|
-- XP rewards for zombies killing humans
|
||||||
|
hook.Add( "PostZombieKilledHuman", "D3Stats_PostZombieKilledHuman", function ( ply, attacker, dmginfo, headshot, wassuicide )
|
||||||
|
local reward = d3stats.ZombieKilledHuman_Static + d3stats.ZombieKilledHuman_Fraction * ply:GetPoints()
|
||||||
|
|
||||||
|
reward = math.Clamp( reward, d3stats.ZombieKilledHuman_Min, d3stats.ZombieKilledHuman_Max )
|
||||||
|
|
||||||
|
attacker:D3Stats_AddXP( reward )
|
||||||
|
end )
|
||||||
|
|
||||||
|
hook.Add( "PlayerReady", "D3Stats_PlayerReady", function ( ply ) -- TODO: Find a better method than using the PlayerReady hook
|
||||||
|
-- Send all the levels of the other players to ply
|
||||||
|
ply:D3Stats_Net_UpdateLevels()
|
||||||
|
end )
|
||||||
|
|
||||||
|
hook.Add( "PlayerSpawn", "D3Stats_PlayerSpawn", function ( ply )
|
||||||
|
-- Send its own XP
|
||||||
|
ply:D3Stats_Net_UpdateXP()
|
||||||
|
|
||||||
|
-- Broadcast the own level to others
|
||||||
|
ply.D3Stats_Level = ply:D3Stats_GetLevel()
|
||||||
|
ply:D3Stats_Net_BroadcastLevel( ply.D3Stats_Level )
|
||||||
|
end )
|
||||||
|
|
||||||
|
local meta = FindMetaTable( "Player" )
|
||||||
|
if not meta then return end
|
||||||
|
|
||||||
|
function meta:D3Stats_GetXP()
|
||||||
|
local XP = tonumber( self:GetPData( "D3Stats_XP", "0" ) )
|
||||||
|
|
||||||
|
if not XP then
|
||||||
|
XP = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
return XP
|
||||||
|
end
|
||||||
|
|
||||||
|
function meta:D3Stats_SetXP( XP )
|
||||||
|
if not XP then
|
||||||
|
XP = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
self:SetPData( "D3Stats_XP", tostring( XP ) )
|
||||||
|
|
||||||
|
self:D3Stats_Net_UpdateXP()
|
||||||
|
|
||||||
|
-- Broadcast on level change
|
||||||
|
local Level = self:D3Stats_GetLevel()
|
||||||
|
if self.D3Stats_Level and self.D3Stats_Level ~= Level then
|
||||||
|
self.D3Stats_Level = Level
|
||||||
|
self:D3Stats_Net_BroadcastLevel( Level )
|
||||||
|
self:CenterNotify( Color( 0, 255, 255 ), "You ascended to level " .. tostring( Level ) .. " \"" .. d3stats.Levels[Level].Name .. "\"")
|
||||||
|
end
|
||||||
|
self.D3Stats_Level = Level
|
||||||
|
end
|
||||||
|
|
||||||
|
function meta:D3Stats_AddXP( XP )
|
||||||
|
if not XP then
|
||||||
|
XP = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
self:D3Stats_SetXP( self:D3Stats_GetXP() + XP )
|
||||||
|
end
|
||||||
|
|
||||||
|
function meta:D3Stats_GetLevel()
|
||||||
|
return d3stats.CalculateLevel( self:D3Stats_GetXP() )
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check if the players level has the permission
|
||||||
|
function meta:D3Stats_HasPermission( Permission )
|
||||||
|
|
||||||
|
-- If no one else has this permission, allow it
|
||||||
|
if d3stats.Permissions[Permission] and d3stats.Permissions[Permission].AllowIfLessThan and d3stats.Permissions[Permission].AllowIfLessThan > d3stats.CountPermissionPlayers( Permission ) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return d3stats.LevelCheckPermission( self:D3Stats_GetLevel(), Permission )
|
||||||
|
end
|
7
lua/d3stats/sh_concommand.lua
Normal file
7
lua/d3stats/sh_concommand.lua
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
if SERVER then
|
||||||
|
|
||||||
|
concommand.Add( "d3stats_clearall", function( ply, cmd, args )
|
||||||
|
print( "Test asd asdasdasd!" )
|
||||||
|
end )
|
||||||
|
|
||||||
|
end
|
47
lua/d3stats/sh_level.lua
Normal file
47
lua/d3stats/sh_level.lua
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
-- Calculate the level from the given XP
|
||||||
|
function d3stats.CalculateLevel( XP )
|
||||||
|
local Level = 1
|
||||||
|
|
||||||
|
for key, value in pairs(d3stats.Levels) do
|
||||||
|
if value.XP_needed <= XP then
|
||||||
|
Level = key
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return Level
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check if the level has the given permission
|
||||||
|
function d3stats.LevelCheckPermission( Level, Permission )
|
||||||
|
local Granted = false
|
||||||
|
|
||||||
|
for key, value in pairs(d3stats.Levels) do
|
||||||
|
if key <= Level then
|
||||||
|
if value.Permissions and value.Permissions[Permission] then
|
||||||
|
Granted = value.Permissions[Permission]
|
||||||
|
end
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return Granted
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Count the amount of online players who have the permission
|
||||||
|
if SERVER then
|
||||||
|
function d3stats.CountPermissionPlayers( Permission )
|
||||||
|
local Counter = 0
|
||||||
|
|
||||||
|
local players = player.GetAll()
|
||||||
|
for key, ply in pairs( players ) do
|
||||||
|
if d3stats.LevelCheckPermission( ply:D3Stats_GetLevel(), Permission ) == true then
|
||||||
|
Counter = Counter + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return Counter
|
||||||
|
end
|
||||||
|
end
|
56
lua/d3stats/sh_settings.lua
Normal file
56
lua/d3stats/sh_settings.lua
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
--[[
|
||||||
|
|
||||||
|
Settings and level definitions are stored in here
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- Permissions
|
||||||
|
-- AllowIfLessThan: If the amount of players who have the permission is lower than this number, allow it anyways
|
||||||
|
d3stats.Permissions = {
|
||||||
|
["Buy_Hammer"] = { AllowIfLessThan = 2 },
|
||||||
|
["Use_Hammer"] = { AllowIfLessThan = 2 },
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Levels, please sort by XP
|
||||||
|
d3stats.Levels = {
|
||||||
|
{ XP_needed = 0, Name = "Kleiner" },
|
||||||
|
{ XP_needed = 500, Name = "Lesser Kleiner" },
|
||||||
|
{ XP_needed = 1000, Name = "Dayfly" },
|
||||||
|
{ XP_needed = 2000, Name = "Apprentice", Permissions = { ["Buy_Hammer"] = true, ["Use_Hammer"] = true } },
|
||||||
|
{ XP_needed = 3000, Name = "Adventurer" },
|
||||||
|
{ XP_needed = 4000, Name = "Scout" },
|
||||||
|
{ XP_needed = 5000, Name = "Guardian" },
|
||||||
|
{ XP_needed = 6000, Name = "Fighter" },
|
||||||
|
{ XP_needed = 7000, Name = "Brawler" },
|
||||||
|
{ XP_needed = 8000, Name = "Scrapper" },
|
||||||
|
{ XP_needed = 9000, Name = "Skirmisher" },
|
||||||
|
{ XP_needed = 10000, Name = "Battler" },
|
||||||
|
{ XP_needed = 15000, Name = "Marauder" },
|
||||||
|
{ XP_needed = 20000, Name = "Slayer" },
|
||||||
|
{ XP_needed = 25000, Name = "Mercenary" },
|
||||||
|
{ XP_needed = 30000, Name = "Swordsman" },
|
||||||
|
{ XP_needed = 35000, Name = "Freelancer" },
|
||||||
|
{ XP_needed = 40000, Name = "Swashbuckler" },
|
||||||
|
{ XP_needed = 45000, Name = "Vanquisher" },
|
||||||
|
{ XP_needed = 50000, Name = "Exemplar" },
|
||||||
|
{ XP_needed = 60000, Name = "Conqueror" },
|
||||||
|
{ XP_needed = 70000, Name = "Specialist" },
|
||||||
|
{ XP_needed = 80000, Name = "Lieutenant" },
|
||||||
|
{ XP_needed = 90000, Name = "Captain" },
|
||||||
|
{ XP_needed = 100000, Name = "Major" },
|
||||||
|
{ XP_needed = 133333, Name = "Colonel" },
|
||||||
|
{ XP_needed = 166666, Name = "General" },
|
||||||
|
{ XP_needed = 200000, Name = "Champion" },
|
||||||
|
{ XP_needed = 250000, Name = "Hero" },
|
||||||
|
{ XP_needed = 300000, Name = "Legend" },
|
||||||
|
{ XP_needed = 500000, Name = "Demigod" },
|
||||||
|
{ XP_needed = 1000000, Name = "God" },
|
||||||
|
}
|
||||||
|
|
||||||
|
d3stats.PlayerPointsAdded_Limit = 200 -- Ignore all "PlayerPointsAdded" callbacks above this XP value
|
||||||
|
|
||||||
|
-- Zombie reward is calculated as follows: Reward = math.clamp( Static + Fraction * Human_Points, Min, Max )
|
||||||
|
d3stats.ZombieKilledHuman_Fraction = 1.0 -- Amount of XP a zombie gets of the killed humans points
|
||||||
|
d3stats.ZombieKilledHuman_Static = 100 -- Amount of XP a zombie gets for killing a human
|
||||||
|
d3stats.ZombieKilledHuman_Max = 1000 -- Upper XP reward clamp
|
||||||
|
d3stats.ZombieKilledHuman_Min = 0 -- Lower XP reward clamp
|
35
lua/d3stats/sv_network.lua
Normal file
35
lua/d3stats/sv_network.lua
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
util.AddNetworkString( "D3Stats_UpdateXP" )
|
||||||
|
util.AddNetworkString( "D3Stats_UpdateLevels" )
|
||||||
|
util.AddNetworkString( "D3Stats_BroadcastLevel" )
|
||||||
|
|
||||||
|
local meta = FindMetaTable( "Player" )
|
||||||
|
if not meta then return end
|
||||||
|
|
||||||
|
-- Send the XP of this (self) player to itself
|
||||||
|
function meta:D3Stats_Net_UpdateXP()
|
||||||
|
net.Start( "D3Stats_UpdateXP" )
|
||||||
|
net.WriteUInt( self:D3Stats_GetXP(), 32 )
|
||||||
|
net.Send( self )
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Send all player levels to this (self) player
|
||||||
|
function meta:D3Stats_Net_UpdateLevels()
|
||||||
|
net.Start( "D3Stats_UpdateLevels" )
|
||||||
|
|
||||||
|
local players = player.GetAll()
|
||||||
|
|
||||||
|
net.WriteUInt( table.getn( players ), 16 )
|
||||||
|
for k, ply in pairs( players ) do
|
||||||
|
net.WriteEntity( ply )
|
||||||
|
net.WriteUInt( ply:D3Stats_GetLevel(), 16 )
|
||||||
|
end
|
||||||
|
net.Send( self )
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Send the current level of this (self) player to everyone
|
||||||
|
function meta:D3Stats_Net_BroadcastLevel( Level )
|
||||||
|
net.Start( "D3Stats_BroadcastLevel" )
|
||||||
|
net.WriteEntity( self )
|
||||||
|
net.WriteUInt( Level, 16 )
|
||||||
|
net.Broadcast()
|
||||||
|
end
|
46
lua/d3stats/vgui/overlay.lua
Normal file
46
lua/d3stats/vgui/overlay.lua
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
local PANEL = {}
|
||||||
|
|
||||||
|
function PANEL:Init()
|
||||||
|
|
||||||
|
self.Progress = vgui.Create( "DProgress", self )
|
||||||
|
self.Progress:SetPos( 10, 10 )
|
||||||
|
self.Progress:SetSize( 200, 10 )
|
||||||
|
|
||||||
|
self.Label = vgui.Create( "DLabel", self )
|
||||||
|
self.Label:SetFont("ZSHUDFontTiny")
|
||||||
|
self.Label:SetPos( 10, 25 ) -- Set the position of the label
|
||||||
|
self:StatsUpdate( 0, 1 )
|
||||||
|
--self.Label:SetDark( 1 ) -- Set the colour of the text inside the label to a darker one
|
||||||
|
|
||||||
|
--timer.Create( "D3StatsOverlay_Timer", 0.1, 0, function() self.Progress:SetFraction( math.random() ) end )
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function PANEL:Paint( aWide, aTall )
|
||||||
|
-- Nothing for now
|
||||||
|
end
|
||||||
|
|
||||||
|
function PANEL:StatsUpdate( XP, Level )
|
||||||
|
local Text
|
||||||
|
local Fraction
|
||||||
|
|
||||||
|
if d3stats.Levels[Level+1] then
|
||||||
|
Text = "XP: " .. tostring( XP ) .. " / " .. d3stats.Levels[Level+1].XP_needed .. "\nLevel: " .. tostring( Level ) .. " \"" .. d3stats.Levels[Level].Name .. "\""
|
||||||
|
Fraction = ( XP - d3stats.Levels[Level].XP_needed ) / ( d3stats.Levels[Level+1].XP_needed - d3stats.Levels[Level].XP_needed )
|
||||||
|
else
|
||||||
|
Text = "XP: " .. tostring( XP ) .. "\nLevel: " .. tostring( Level ) .. " \"" .. d3stats.Levels[Level].Name .. "\""
|
||||||
|
Fraction = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
self.Label:SetText( Text ) -- Set the text of the label
|
||||||
|
self.Label:SizeToContents() -- Size the label to fit the text in it
|
||||||
|
|
||||||
|
self.Progress:SetFraction( Fraction )
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function PANEL:SetText( aText ) self.Text = tostring( aText ) end
|
||||||
|
function PANEL:GetText() return self.Text or "" end
|
||||||
|
|
||||||
|
vgui.Register( "D3StatsOverlay", PANEL, "DPanel" )
|
Loading…
Reference in New Issue
Block a user