· 7 years ago · Sep 09, 2018, 08:44 AM
1---
2-- The below block needs to be parsed on the client and server.
3---
4
5FlashbackBuffer = {};
6
7-- Create a new flashback.
8function Flashback( identifier, onEnter, onExit, onRender)
9 FlashbackBuffer[identifier] = {};
10
11 FlashbackBuffer[identifier].onEnter = onEnter;
12 FlashbackBuffer[identifier].OnExit = onExit;
13 FlashbackBuffer[identifier].onRender = onRender;
14 FlashbackBuffer[identifier].cache = {};
15
16end;
17
18
19-- This is an example flashback.
20FlashBack( "OrangeOverlayFlash", function()end, function()end, function(frame,cache)
21 if ( frame == 1 ) then
22 cache.overlayAlpha = 0;
23 end;
24
25 local currentAlpha = cache.overlayAlpha;
26
27 surface.SetDrawColor( 255, 0, 0, currentAlpha );
28 surface.DrawRect( 0, 0, ScrW(), ScrH() );
29
30 if ( cache.fadeIn ) then
31 if ( currentAlpha < 255 ) then
32 cache.overlayAlpha = currentAlpha + 1;
33 else
34 cache.fadeIn = false;
35 end;
36 else
37 if ( currentAlpha > 0 ) then
38 cache.overlayAlpha = currentAlpha - 1;
39 else
40 cache.fadeIn = true;
41 end;
42 end;
43end);
44
45-- See if a flashback exists.
46function FlashbackExists( identifier )
47 if ( FlashbackBuffer[identifier] ) then
48 return true;
49 else
50 return false;
51 end;
52end;
53
54
55-- Get a flashbacks shared table.
56function GetFlashbackTable( identifier )
57 if ( FlashbackBuffer[identifier] ) then
58 return FlashbackBuffer[identifier];
59 end;
60end;
61
62
63---
64-- The below block needs to be parsed on the server.
65---
66
67local PLAYER = FindMetaTable("Player");
68
69-- Enter a player into a flashback.
70function PLAYER:EnterFlashback(identifier)
71
72 local newIdentifier = identifier or "";
73
74 if ( FlashbackBuffer[newIdentifier] ) then
75 if ( not self._bIsInFlashback ) then
76
77 self._bIsInFlashback = true;
78 self._strActiveFlashbackIdentifier = newIdentifier;
79
80 FlashbackBuffer[newIdentifier].onEnter( CurTime() );
81 FlashbackBuffer[newIdentifier].cache = {};
82
83 umsg.Start( "PlayerEnterFlashback", self );
84 umsg.String( newIdentifier );
85 umsg.End();
86 end;
87 end;
88end;
89
90
91-- Exit a flashback.
92function PLAYER:ExitFlashback()
93 if ( self._bIsInFlashback ) then
94 local ActiveFlashback = self._strActiveFlashbackIdentifier or "";
95
96 if ( FlashbackBuffer[ActiveFlashback] ) then
97 self._bIsInFlashback = false;
98 self._strActiveFlashbackIdentifier = "";
99
100 FlashbackBuffer[ActiveFlashback].onExit( CurTime() );
101
102 umsg.Start( "PlayerExitFlashback", self );
103 umsg.String( ActiveFlashback );
104 umsg.End();
105 end;
106 end;
107end;
108
109
110-- Get whether a player is in a flashback or not
111function PLAYER:IsInFlashback()
112 return self._bIsInFlashback;
113end;
114
115
116-- Get the active flashback.
117function PLAYER:GetActiveFlashback()
118 return self._strActiveFlashbackIdentifier or "";
119end;
120
121---
122-- The below block needs to be parsed on the client.
123---
124
125-- called when the bf read message is recieved on the client.
126usermessage.Hook( "PlayerEnterFlashback", function( bfr )
127 local FlashbackIdentifier = bfr:ReadString();
128
129 flashbackIsActive = true;
130 flashbackIdentifier = FlashbackIdentifier;
131 flashbackStartTime = CurTime();
132
133 FlashbackBuffer[FlashbackIdentifier].cache.frame = 1;
134end);
135
136-- called when the bf read message is recieved on the client.
137usermessage.Hook( "PlayerExitFlashback", function( bfr )
138 local FlashbackIdentifier = bfr:ReadString();
139
140 flashbackIsActive = false;
141 flashbackIdentifier = "";
142 flashbackStartTime = nil;
143 flashbackLastEndTime = CurTime();
144end);
145
146
147-- Add a hook to the gamemodse hudpaint, this needs to be moved to a openaura plugin function.
148hook.Add( "HUDPaint", "RenderFlashbacks", function()
149 if ( flashbackIsActive ) then
150 if ( FlashbackBuffer[flashbackIdentifier] ) then
151 local frame = FlashbackBuffer[flashbackIdentifier].cache.frame;
152
153 FlashbackBuffer[flashbackIdentifier].onRender( frame, FlashbackBuffer[flashbackIdentifier].cache );
154 FlashbackBuffer[flashbackIdentifier].cache.frame = frame + 1;
155 end;
156 end;
157end);