summaryrefslogtreecommitdiff
path: root/gamemode/server/player_functions.lua
diff options
context:
space:
mode:
Diffstat (limited to 'gamemode/server/player_functions.lua')
-rw-r--r--gamemode/server/player_functions.lua64
1 files changed, 64 insertions, 0 deletions
diff --git a/gamemode/server/player_functions.lua b/gamemode/server/player_functions.lua
index 093b20a..b4cc7c0 100644
--- a/gamemode/server/player_functions.lua
+++ b/gamemode/server/player_functions.lua
@@ -588,3 +588,67 @@ function PlayerMeta:SaveCharacter()
file.Write( "gmstranded/saves/" .. self:UniqueID() .. ".txt", util.TableToJSON( tbl ) )
self:SendMessage( "Saved character!", 3, Color( 255, 255, 255 ) )
end
+
+function PlayerMeta:DoProcess( name, time, data )
+ if ( self.InProcess ) then self:SendMessage( "You can't do this much at once.", 3, Color( 200, 0, 0, 255 ) ) return end
+ if ( self:GetNWBool( "AFK" ) ) then self:SendMessage( "You can't do this while afk.", 3, Color( 200, 0, 0, 255 ) ) return end
+ if ( self:GetNWBool( "Sleeping" ) ) then self:SendMessage( "You can't do this while sleeping.", 3, Color( 200, 0, 0, 255 ) ) return end
+
+ self.ProcessTable = table.Merge( table.Copy( GMS.Processes.BaseProcess ), table.Copy( GMS.Processes[ name ] ) )
+ self.ProcessTable.Owner = self
+ self.ProcessTable.Time = time
+ self.ProcessTable.StartTime = CurTime()
+ self.ProcessTable.TimerID = self:UniqueID()
+ if ( data ) then self.ProcessTable.Data = data end
+
+ self.InProcess = true
+ if ( self.ProcessTable.Freeze ) then self:Freeze( true ) end
+ if ( self.ProcessTable.OnStart ) then self.ProcessTable:OnStart() end
+
+ table.insert( GAMEMODE.ProcessThinkHookTable, self.ProcessTable )
+
+ timer.Create( "GMS_ProcessTimer_" .. self:UniqueID(), time, 1, function() self:StopProcess() end )
+end
+
+function PlayerMeta:MakeProcessBar( name, time, cancel )
+ umsg.Start( "gms_MakeProcessBar", self )
+ umsg.String( name )
+ umsg.Short( time )
+ umsg.Bool( cancel )
+ umsg.End()
+end
+
+function PlayerMeta:StopProcessBar()
+ umsg.Start( "gms_StopProcessBar", self )
+ umsg.End()
+end
+
+function PlayerMeta:StopProcess()
+ if ( !IsValid( self ) or self.ProcessTable == nil ) then return end
+
+ local bool = self.ProcessTable:BaseStop()
+ if ( self.ProcessTable.Freeze ) then self:Freeze( false ) end
+ if ( self.ProcessTable.OnStop ) then self.ProcessTable:OnStop() end
+ if ( self.ProcessTable.Think ) then GAMEMODE:RemoveProcessThink( self.ProcessTable ) end
+
+ self.InProcess = false
+ self.ProcessTable = nil
+end
+
+function PlayerMeta:CancelProcess()
+ if ( !self.InProcess ) then return end
+
+ local v = self.ProcessTable
+ if ( !v.Cancel ) then return end
+
+ if ( v.Owner and v.Owner != NULL and IsValid( v.Owner ) ) then
+ v.Owner:Freeze( false )
+ v.Owner:StopProcessBar()
+ v.Owner.InProcess = false
+ v.Owner:SendMessage( "Cancelled.", 3, Color( 200, 0, 0, 255 ) )
+ end
+
+ v.IsStopped = true
+ timer.Destroy( "GMS_ProcessTimer_" .. v.TimerID )
+ GAMEMODE:RemoveProcessThink( v )
+end