ULX

Author Topic: Hey..  (Read 1544 times)

0 Members and 1 Guest are viewing this topic.

Offline Mindless

  • Newbie
  • *
  • Posts: 31
  • Karma: 1
Hey..
« on: February 08, 2013, 06:58:48 PM »
Basically i've upgraded to the sourcebans ban, but when I try to kick someone my server crashes?


Player.lua
Code: [Select]
--[[
Title: Player

Holds some helpful player functions.
]]

--[[
Table: slapSounds

These are the sounds used for slaps.
]]
local slapSounds = {
"physics/body/body_medium_impact_hard1.wav",
"physics/body/body_medium_impact_hard2.wav",
"physics/body/body_medium_impact_hard3.wav",
"physics/body/body_medium_impact_hard5.wav",
"physics/body/body_medium_impact_hard6.wav",
"physics/body/body_medium_impact_soft5.wav",
"physics/body/body_medium_impact_soft6.wav",
"physics/body/body_medium_impact_soft7.wav",
}


--[[
Function: slap

Slaps an entity, can be a user or any entity.

Parameters:

ent - The target ent.
damage - *(Optional, defaults to 0)* The amount of damage to inflict on the entity.
power - *(Optional, defaults to 30)* The power of the slap.
nosound - *(Optional, defaults to false)* If true, no sound will be played.
]]
function ULib.slap( ent, damage, power, nosound )
if ent:GetMoveType() == MOVETYPE_OBSERVER then return end -- Nothing we can do.

damage = damage or 0
power = power or 500

if ent:IsPlayer() then
if not ent:Alive() then
return -- Nothing we can do.
end

if ent:InVehicle() then
ent:ExitVehicle()
end

if ent:GetMoveType() == MOVETYPE_NOCLIP then
ent:SetMoveType( MOVETYPE_WALK )
end
end

if not nosound then -- Play a slap sound
local sound_num = math.random( #slapSounds ) -- Choose at random
ent:EmitSound( slapSounds[ sound_num ] )
end

local direction = Vector( math.random( 20 )-10, math.random( 20 )-10, math.random( 20 )-5 ) -- Make it random, slightly biased to go up.
ULib.applyAccel( ent, power, direction )

local angle_punch_pitch = math.Rand( -20, 20 )
local angle_punch_yaw = math.sqrt( 20*20 - angle_punch_pitch * angle_punch_pitch )
if math.random( 0, 1 ) == 1 then
angle_punch_yaw = angle_punch_yaw * -1
end
ent:ViewPunch( Angle( angle_punch_pitch, angle_punch_yaw, 0 ) )

local newHp = ent:Health() - damage
if newHp <= 0 then
if ent:IsPlayer() then
ent:Kill()
else
ent:Fire( "break", 1, 0 )
end
return
end
ent:SetHealth( newHp )
end

--[[
Function: kick

Kicks a user.

Parameters:

ply - The player to kick.
reason - *(Optional)* The reason to give for kicking.
]]
function ULib.kick( ply, reason, calling_ply )
if reason and calling_ply ~= nil then
local nick = calling_ply:IsValid() and string.format( "%s(%s)", calling_ply:Nick(), calling_ply:SteamID() ) or "Console"
ply:Kick( string.format( "Kicked by %s (%s)", nick, reason or "[ULX] Kicked from server" ) )
else
ply:Kick( reason or "[ULX] Kicked from server" )
end
end


--[[
Function: ban

Bans a user.

Parameters:

ply - The player to ban.
time - *(Optional)* The time in minutes to ban the person for, leave nil or 0 for permaban.
reason - *(Optional)* The reason for banning
admin - *(Optional)* Admin player enacting ban

Revisions:

v2.10 - Added support for custom ban list
]]
function ULib.ban( ply, time, reason, admin )
if not time or type( time ) ~= "number" then
time = 0
end

ULib.addBan( ply:SteamID(), time, reason, ply:Name(), admin )

-- Load our currently banned users so we don't overwrite them
if file.Exists( "cfg/banned_user.cfg", "GAME" ) then
ULib.execFile( "cfg/banned_user.cfg", "GAME" )
end
end


--[[
Function: kickban

Kicks and bans a user.

Parameters:

ply - The player to ban.
time - *(Optional)* The time in minutes to ban the person for, leave nil or 0 for permaban.
reason - *(Optional)* The reason for banning
admin - *(Optional)* Admin player enacting ban

Revisions:

v2.10 - Added support for custom ban list
]]
function ULib.kickban( ply, time, reason, admin )
if not time or type( time ) ~= "number" then
time = 0
end

ULib.addBan( ply:SteamID(), time, reason, ply:Name(), admin )

-- Load our currently banned users so we don't overwrite them
if file.Exists( "cfg/banned_user.cfg", "GAME" ) then
ULib.execFile( "cfg/banned_user.cfg", "GAME" )
end
end

--[[
Function: addBan - rewritten to use SourceBans

Helper function to store additional data about bans.

Parameters:

steamid - Banned player's steamid
time - Length of ban
reason - *(Optional)* Reason for banning
name - *(Optional)* Name of player banned
admin - *(Optional)* Admin player enacting the ban

Revisions:

2.10 - Initial
2.40 - If the steamid is connected, kicks them with the reason given
]]
function ULib.addBan( steamid, time, reason, name, admin )
        local strTime = time ~= 0 and string.format( "for %s minute(s)", time ) or "permanently"
        local showReason = string.format( "Banned %s: %s", strTime, reason )

        if ( sourcebans ) then
                sourcebans.BanPlayerBySteamID( steamid, time*60, reason, admin, name )
        else
                local players = player.GetAll()
                for i=1, #players do
                        if players[ i ]:SteamID() == steamid then
                                ULib.kick( players[ i ], showReason, admin )
                        end
                end

                -- This redundant kick code is to ensure they're kicked -- even if they're joining
                game.ConsoleCommand( string.format( "kickid %s %s\n", steamid, showReason or "" ) )
                game.ConsoleCommand( string.format( "banid %f %s kick\n", time, steamid ) )
                game.ConsoleCommand( "writeid\n" )
        end

        local admin_name
        if admin then
                admin_name = "(Console)"
                if admin:IsValid() then
                        admin_name = string.format( "%s(%s)", admin:Name(), admin:SteamID() )
                end
        end

        local t = {}
        if ULib.bans[ steamid ] then
                t = ULib.bans[ steamid ]
                t.modified_admin = admin_name
                t.modified_time = os.time()
        else
                t.admin = admin_name
        end
        t.time = t.time or os.time()
        if time > 0 then
                t.unban = ( ( time * 60 ) + os.time() )
        else
                t.unban = 0
        end
        if reason then
                t.reason = reason
        end
        if name then
                t.name = name
        end
        ULib.bans[ steamid ] = t
        file.Write( ULib.BANS_FILE, ULib.makeKeyValues( ULib.bans ) )
end


--[[
Function: unban - rewritten with SourceBans

Unbans the given steamid.

Parameters:

steamid - The steamid to unban.

Revisions:

v2.10 - Initial
]]
function ULib.unban( steamid )

        --Default banlist
        if file.Exists( "cfg/banned_user.cfg", "GAME" ) then
                ULib.execFile( "cfg/banned_user.cfg", "GAME" )
        end
        if ( sourcebans ) then
                sourcebans.UnbanPlayerBySteamID( steamid, "In game unban", nil)
        else
                ULib.queueFunctionCall( game.ConsoleCommand, "removeid " .. steamid .. ";writeid\n" ) -- Execute after done loading bans
        end

        --ULib banlist
        ULib.bans[ steamid ] = nil
        file.Write( ULib.BANS_FILE, ULib.makeKeyValues( ULib.bans ) )

end

--[[
Function: invisible

Makes a user invisible

Parameters:

ply - The player to affect.
bool - Whether they're invisible or not
visibility - *(Optional, defaults to 0)* A number from 0 to 255 for their visibility.

Revisions:

v2.40 - Removes shadow when invisible
]]
function ULib.invisible( ply, bool, visibility )
if not ply:IsValid() then return end -- This is called on a timer so we need to verify they're still connected

if bool then
visibility = visibility or 0
ply:DrawShadow( false )
ply:SetMaterial( "models/effects/vol_light001" )
ply:SetRenderMode( RENDERMODE_TRANSALPHA )
ply:Fire( "alpha", visibility, 0 )
ply:GetTable().invis = { vis=visibility, wep=ply:GetActiveWeapon() }

if ply:GetActiveWeapon():IsValid() then
ply:GetActiveWeapon():SetRenderMode( RENDERMODE_TRANSALPHA )
ply:GetActiveWeapon():Fire( "alpha", visibility, 0 )
ply:GetActiveWeapon():SetMaterial( "models/effects/vol_light001" )
if ply:GetActiveWeapon():GetClass() == "gmod_tool" then
ply:DrawWorldModel( false ) -- tool gun has problems
else
ply:DrawWorldModel( true )
end
end

hook.Add( "Think", "InvisThink", doInvis )
else
ply:DrawShadow( true )
ply:SetMaterial( "" )
ply:SetRenderMode( RENDERMODE_NORMAL )
ply:Fire( "alpha", 255, 0 )
ply:GetActiveWeapon():SetRenderMode( RENDERMODE_NORMAL )
ply:GetActiveWeapon():Fire( "alpha", 255, 0 )
ply:GetActiveWeapon():SetMaterial( "" )
ply:GetTable().invis = nil
end
end


--[[
Function: refreshBans

Refreshes the ULib bans.
]]
function ULib.refreshBans()
local err
if not file.Exists( ULib.BANS_FILE, "DATA" ) then
ULib.bans = {}
else
ULib.bans, err = ULib.parseKeyValues( file.Read( ULib.BANS_FILE, "DATA" ) )
end

if err then
Msg( "Bans file was not formatted correctly. Attempting to fix and backing up original\n" )
if err then
Msg( "Error while reading bans file was: " .. err .. "\n" )
end
Msg( "Original file was backed up to " .. ULib.backupFile( ULib.BANS_FILE ) .. "\n" )
ULib.bans = {}
end

local default_bans = ""
if file.Exists( "cfg/banned_user.cfg", "GAME" ) then
ULib.execFile( "cfg/banned_user.cfg", "GAME" )
ULib.queueFunctionCall( game.ConsoleCommand, "writeid\n" )
default_bans = file.Read( "cfg/banned_user.cfg", "GAME" )
end

--default_bans = ULib.makePatternSafe( default_bans )
default_bans = string.gsub( default_bans, "banid %d+ ", "" )
default_bans = string.Explode( "\n", default_bans:gsub( "\r", "" ) )
local ban_set = {}
for _, v in pairs( default_bans ) do
if v ~= "" then
ban_set[ v ] = true
if not ULib.bans[ v ] then
ULib.bans[ v ] = { unban = 0 }
end
end
end

for k, v in pairs( ULib.bans ) do
if type( v ) == "table" and type( k ) == "string" then
local time = ( v.unban - os.time() ) / 60
if time > 0 then
game.ConsoleCommand( string.format( "banid %f %s\n", time, k ) )
elseif math.floor( v.unban ) == 0 then -- We floor it because GM10 has floating point errors that might make it be 0.1e-20 or something dumb.
if not ban_set[ k ] then
ULib.bans[ k ] = nil
end
else
ULib.bans[ k ] = nil
end
else
Msg( "Warning: Bad ban data is being ignored, key = " .. tostring( k ) .. "\n" )
ULib.bans[ k ] = nil
end
end

-- We're queueing this because it will split the load out for VERY large ban files
ULib.queueFunctionCall( function() file.Write( ULib.BANS_FILE, ULib.makeKeyValues( ULib.bans ) ) end )
end
ULib.pcallError( ULib.refreshBans )


--[[
Function: getSpawnInfo

Grabs and returns player information that can be used to respawn player with same health/armor as before the spawn.

Parameters:

ply - The player to grab information for.


Returns:

Updates player object to store health and armor. Has no effect unless ULib.Spawn is used later.
]]
function ULib.getSpawnInfo( player )
local result = {}

local t = {}
player.ULibSpawnInfo = t
t.health = player:Health()
t.armor = player:Armor()
if player:GetActiveWeapon():IsValid() then
t.curweapon = player:GetActiveWeapon():GetClass()
end

local weapons = player:GetWeapons()
local data = {}
for _, weapon in ipairs( weapons ) do
printname = weapon:GetClass()
data[ printname ] = {}
data[ printname ].clip1 = weapon:Clip1()
data[ printname ].clip2 = weapon:Clip2()
data[ printname ].ammo1 = player:GetAmmoCount( weapon:GetPrimaryAmmoType() )
data[ printname ].ammo2 = player:GetAmmoCount( weapon:GetSecondaryAmmoType() )
end
t.data = data
end

-- Helper function for ULib.spawn()
local function doWeapons( player, t )
if not player:IsValid() then return end -- Drat, missed 'em.

player:StripAmmo()
player:StripWeapons()

for printname, data in pairs( t.data ) do
player:Give( printname )
local weapon = player:GetWeapon( printname )
weapon:SetClip1( data.clip1 )
weapon:SetClip2( data.clip2 )
player:SetAmmo( data.ammo1, weapon:GetPrimaryAmmoType() )
player:SetAmmo( data.ammo2, weapon:GetSecondaryAmmoType() )
end

if t.curweapon then
player:SelectWeapon( t.curweapon )
end
end


--[[
Function: spawn

Enhanced spawn player. Can spawn player and return health/armor to status before the spawn. (Only IF ULib.getSpawnInfo was used previously.)
Clears previously set values that were stored from ULib.getSpawnInfo.

Parameters:

ply - The player to grab information for.
bool - If true, spawn will set player information to values stored using ULib.SpawnInfo

Returns:

Spawns player. Sets health/armor to stored defaults if ULib.getSpawnInfo was used previously. Clears SpawnInfo table afterwards.
]]
function ULib.spawn( player, bool )
player:Spawn()

if bool and player.ULibSpawnInfo then
local t = player.ULibSpawnInfo
player:SetHealth( t.health )
player:SetArmor( t.armor )
timer.Simple( 0.1, function() doWeapons( player, t ) end )
player.ULibSpawnInfo = nil
end
end


Offline JamminR

  • Ulysses Team Member
  • Hero Member
  • *****
  • Posts: 8096
  • Karma: 390
  • Sertafide Ulysses Jenius
    • Team Ulysses [ULib/ULX, other fine releases]
Re: Hey..
« Reply #1 on: February 08, 2013, 07:06:19 PM »
Then please, ask in the Sourceban's ban forum or topic post area you are talking about you upgraded to.
If this is totally new code you made yourself, post in "Developers Corner".
The 'General Chat & Help and Support' area is intended for general ULib/ULX questions, we have a developers corner for various code development (Lua or otherwise)
Though occasionally we do get questions about topics not already covered, considering there are 3 or 4 "Sourcebans" discussions in Developer's corner, and one newer one in Releases that I can only guess is the one you 'upgraded' to, those would be better discussion areas.

Once you find the right forum to post in (the one you 'upgraded' to), posting what errors occur from the server log before the game crash, or while the server starts up, would be helpful to the developer that made the code.
Why post the ENTIRE file of a code piece you edited.
Quickly reviewing, I don't even see where you edited the code.
« Last Edit: February 08, 2013, 07:11:16 PM by JamminR »
"Though a program be but three lines long, someday it will have to be maintained." -- The Tao of Programming