55#include < hamsandwich>
66#include < xs>
77
8- new g_rgpPlayerCamera[MAX_PLAYERS];
9- new Float: g_rgflPlayerCameraDistance[MAX_PLAYERS];
10- new Float: g_rgflPlayerCameraAngles[MAX_PLAYERS][3 ];
11- new Float: g_rgflPlayerCamerOffset[MAX_PLAYERS][3 ];
12- new Float: g_rgflPlayerCameraThinkDelay[MAX_PLAYERS];
13- new Float: g_rgflPlayerCameraNextThink[MAX_PLAYERS];
8+ new g_rgpPlayerCamera[MAX_PLAYERS + 1 ];
9+ new Float: g_rgflPlayerCameraDistance[MAX_PLAYERS + 1 ];
10+ new Float: g_rgflPlayerCameraAngles[MAX_PLAYERS + 1 ][3 ];
11+ new Float: g_rgflPlayerCameraOffset[MAX_PLAYERS + 1 ][3 ];
12+ new bool: g_rgbPlayerCameraAxisLock[MAX_PLAYERS + 1 ][3 ];
13+ new Float: g_rgflPlayerCameraThinkDelay[MAX_PLAYERS + 1 ];
14+ new Float: g_rgflPlayerCameraNextThink[MAX_PLAYERS + 1 ];
15+ new g_pPlayerTargetEntity[MAX_PLAYERS + 1 ];
16+
17+ new g_fwActivate;
18+ new g_fwDeactivate;
19+ new g_fwActivated;
20+ new g_fwDeactivated;
1421
1522new g_iszTriggerCameraClassname;
1623
@@ -23,10 +30,15 @@ public plugin_precache() {
2330}
2431
2532public plugin_init () {
26- register_plugin (" [API] Player Camerea " , " 1.0.0" , " Hedgehog Fog" );
33+ register_plugin (" [API] Player Camera " , " 1.0.0" , " Hedgehog Fog" );
2734
28- RegisterHamPlayer (Ham_Spawn, " HamHook_Player_Spawn_Post" , .Post = 1 );
29- RegisterHamPlayer (Ham_Player_PreThink, " HamHook_Player_PreThink_Post" , .Post = 1 );
35+ RegisterHamPlayer (Ham_Spawn, " HamHook_Player_Spawn_Post" , .Post = 1 );
36+ RegisterHamPlayer (Ham_Player_PreThink, " HamHook_Player_PreThink_Post" , .Post = 1 );
37+
38+ g_fwActivate = CreateMultiForward (" PlayerCamera_Fw_Activate" , ET_STOP, FP_CELL);
39+ g_fwDeactivate = CreateMultiForward (" PlayerCamera_Fw_Deactivate" , ET_STOP, FP_CELL);
40+ g_fwActivated = CreateMultiForward (" PlayerCamera_Fw_Activated" , ET_IGNORE, FP_CELL);
41+ g_fwDeactivated = CreateMultiForward (" PlayerCamera_Fw_Deactivated" , ET_IGNORE, FP_CELL);
3042}
3143
3244public plugin_natives () {
@@ -37,7 +49,9 @@ public plugin_natives() {
3749 register_native (" PlayerCamera_SetOffset" , " Native_SetOffset" );
3850 register_native (" PlayerCamera_SetAngles" , " Native_SetAngles" );
3951 register_native (" PlayerCamera_SetDistance" , " Native_SetDistance" );
52+ register_native (" PlayerCamera_SetAxisLock" , " Native_SetAxisLock" );
4053 register_native (" PlayerCamera_SetThinkDelay" , " Native_SetThinkDelay" );
54+ register_native (" PlayerCamera_SetTargetEntity" , " Native_SetTargetEntity" );
4155}
4256
4357public bool: Native_Activate (iPluginId, iArgc) {
@@ -83,13 +97,29 @@ public Native_SetDistance(iPluginId, iArgc) {
8397 SetCameraDistance (pPlayer, flDistance);
8498}
8599
100+ public Native_SetAxisLock (iPluginId, iArgc) {
101+ new pPlayer = get_param (1 );
102+ new bool: bLockPitch = bool: get_param (2 );
103+ new bool: bLockYaw = bool: get_param (3 );
104+ new bool: bLockRoll = bool: get_param (4 );
105+
106+ SetAxisLock (pPlayer, bLockPitch, bLockYaw, bLockRoll);
107+ }
108+
86109public Native_SetThinkDelay (iPluginId, iArgc) {
87110 new pPlayer = get_param (1 );
88111 new Float: flThinkDelay = get_param_f (2 );
89112
90113 SetCameraThinkDelay (pPlayer, flThinkDelay);
91114}
92115
116+ public Native_SetTargetEntity (iPluginId, iArgc) {
117+ new pPlayer = get_param (1 );
118+ new pTarget = get_param (2 );
119+
120+ SetCameraTarget (pPlayer, pTarget);
121+ }
122+
93123public HamHook_Player_Spawn_Post (pPlayer) {
94124 ReattachCamera (pPlayer);
95125}
@@ -100,7 +130,9 @@ public HamHook_Player_PreThink_Post(pPlayer) {
100130
101131public client_connect (pPlayer) {
102132 g_rgpPlayerCamera[pPlayer] = - 1 ;
133+ SetCameraTarget (pPlayer, pPlayer);
103134 SetCameraDistance (pPlayer, 200 .0 );
135+ SetAxisLock (pPlayer, false , false , false );
104136 SetCameraAngles (pPlayer, Float: {0 .0 , 0 .0 , 0 .0 });
105137 SetCameraOffset (pPlayer, Float: {0 .0 , 0 .0 , 0 .0 });
106138 SetCameraThinkDelay (pPlayer, 0 .01 );
@@ -115,27 +147,42 @@ ActivatePlayerCamera(pPlayer) {
115147 return ;
116148 }
117149
150+ new iResult = 0 ; ExecuteForward (g_fwActivate, iResult, pPlayer);
151+ if (iResult != PLUGIN_CONTINUE) return ;
152+
118153 g_rgpPlayerCamera[pPlayer] = CreatePlayerCamera (pPlayer);
119154 g_rgflPlayerCameraNextThink[pPlayer] = 0 .0 ;
120155
121156 engfunc (EngFunc_SetView, pPlayer, g_rgpPlayerCamera[pPlayer]);
157+
158+ static Float: vecOrigin[3 ];
159+ pev (g_pPlayerTargetEntity[pPlayer], pev_origin, vecOrigin);
160+ engfunc (EngFunc_SetOrigin, g_rgpPlayerCamera[pPlayer], vecOrigin);
161+
162+ ExecuteForward (g_fwActivated, _, pPlayer);
122163}
123164
124165DeactivatePlayerCamera (pPlayer) {
125166 if (g_rgpPlayerCamera[pPlayer] == - 1 ) {
126167 return ;
127168 }
128169
170+ new iResult = 0 ; ExecuteForward (g_fwDeactivate, iResult, pPlayer);
171+ if (iResult != PLUGIN_CONTINUE) return ;
172+
129173 engfunc (EngFunc_RemoveEntity, g_rgpPlayerCamera[pPlayer]);
130174 g_rgpPlayerCamera[pPlayer] = - 1 ;
175+ g_pPlayerTargetEntity[pPlayer] = pPlayer;
131176
132177 if (is_user_connected (pPlayer)) {
133178 engfunc (EngFunc_SetView, pPlayer, pPlayer);
134179 }
180+
181+ ExecuteForward (g_fwDeactivated, _, pPlayer);
135182}
136183
137184SetCameraOffset (pPlayer, const Float: vecOffset[3 ]) {
138- xs_vec_copy (vecOffset, g_rgflPlayerCamerOffset [pPlayer]);
185+ xs_vec_copy (vecOffset, g_rgflPlayerCameraOffset [pPlayer]);
139186}
140187
141188SetCameraAngles (pPlayer, const Float: vecAngles[3 ]) {
@@ -146,76 +193,91 @@ SetCameraDistance(pPlayer, Float:flDistance) {
146193 g_rgflPlayerCameraDistance[pPlayer] = flDistance;
147194}
148195
196+ SetAxisLock (pPlayer, bool: bLockPitch, bool: bLockYaw, bool: bLockRoll) {
197+ g_rgbPlayerCameraAxisLock[pPlayer][0 ] = bLockPitch;
198+ g_rgbPlayerCameraAxisLock[pPlayer][1 ] = bLockYaw;
199+ g_rgbPlayerCameraAxisLock[pPlayer][2 ] = bLockRoll;
200+ }
201+
149202SetCameraThinkDelay (pPlayer, Float: flThinkDelay) {
150203 g_rgflPlayerCameraThinkDelay[pPlayer] = flThinkDelay;
151204}
152205
206+ SetCameraTarget (pPlayer, pTarget) {
207+ g_pPlayerTargetEntity[pPlayer] = pTarget;
208+ }
209+
153210CreatePlayerCamera (pPlayer) {
154- new pCamera = engfunc (EngFunc_CreateNamedEntity, g_iszTriggerCameraClassname);
211+ new pCamera = engfunc (EngFunc_CreateNamedEntity, g_iszTriggerCameraClassname);
155212
156- set_pev (pCamera, pev_classname, " trigger_camera" );
157- set_pev (pCamera, pev_modelindex, g_iCameraModelIndex);
158- set_pev (pCamera, pev_owner, pPlayer);
159- set_pev (pCamera, pev_solid, SOLID_NOT);
160- set_pev (pCamera, pev_movetype, MOVETYPE_FLY);
161- set_pev (pCamera, pev_rendermode, kRenderTransTexture);
213+ set_pev (pCamera, pev_classname, " trigger_camera" );
214+ set_pev (pCamera, pev_modelindex, g_iCameraModelIndex);
215+ set_pev (pCamera, pev_owner, pPlayer);
216+ set_pev (pCamera, pev_solid, SOLID_NOT);
217+ set_pev (pCamera, pev_movetype, MOVETYPE_FLY);
218+ set_pev (pCamera, pev_rendermode, kRenderTransTexture);
162219
163- return pCamera;
220+ return pCamera;
164221}
165222
166223PlayerCameraThink (pPlayer) {
167- if (g_rgflPlayerCameraNextThink[pPlayer] > get_gametime ()) {
168- return ;
169- }
224+ if (g_rgflPlayerCameraNextThink[pPlayer] > get_gametime ()) {
225+ return ;
226+ }
170227
171- g_rgflPlayerCameraNextThink[pPlayer] = get_gametime () + g_rgflPlayerCameraThinkDelay[pPlayer];
228+ g_rgflPlayerCameraNextThink[pPlayer] = get_gametime () + g_rgflPlayerCameraThinkDelay[pPlayer];
172229
173- if (g_rgpPlayerCamera[pPlayer] == - 1 ) {
174- return ;
175- }
230+ if (g_rgpPlayerCamera[pPlayer] == - 1 ) {
231+ return ;
232+ }
176233
177- if (! is_user_alive (pPlayer)) {
178- return ;
179- }
234+ if (! is_user_alive (pPlayer)) {
235+ return ;
236+ }
180237
181- static Float: vecOrigin[3 ];
182- pev (pPlayer, pev_origin, vecOrigin);
183- xs_vec_add (vecOrigin, g_rgflPlayerCamerOffset [pPlayer], vecOrigin);
238+ static Float: vecOrigin[3 ];
239+ pev (g_pPlayerTargetEntity[ pPlayer] , pev_origin, vecOrigin);
240+ xs_vec_add (vecOrigin, g_rgflPlayerCameraOffset [pPlayer], vecOrigin);
184241
185- static Float: vecAngles[3 ];
186- pev (pPlayer, pev_angles, vecAngles);
187- vecAngles[0 ] = vecAngles[2 ] = 0 .0 ;
188- xs_vec_add (vecAngles, g_rgflPlayerCameraAngles[pPlayer], vecAngles);
242+ static Float: vecAngles[3 ];
243+ pev (g_pPlayerTargetEntity[pPlayer], pev_v_angle, vecAngles);
244+ for (new iAxis = 0 ; iAxis < 3 ; ++ iAxis) {
245+ if (g_rgbPlayerCameraAxisLock[pPlayer][iAxis]) {
246+ vecAngles[iAxis] = 0 .0 ;
247+ }
248+ }
189249
190- static Float: vecBack[3 ];
191- angle_vector (vecAngles, ANGLEVECTOR_FORWARD, vecBack);
192- xs_vec_neg (vecBack, vecBack);
250+ xs_vec_add (vecAngles, g_rgflPlayerCameraAngles[pPlayer], vecAngles);
193251
194- static Float: vecVelocity[3 ];
195- pev (pPlayer, pev_velocity, vecVelocity);
252+ static Float: vecBack[3 ];
253+ angle_vector (vecAngles, ANGLEVECTOR_FORWARD, vecBack);
254+ xs_vec_neg (vecBack, vecBack);
196255
197- static Float: vecCameraOrigin[3 ];
198- for (new i = 0 ; i < 3 ; ++ i) {
199- vecCameraOrigin[i] = vecOrigin[i] + (vecBack[i] * g_rgflPlayerCameraDistance[pPlayer]);
200- }
256+ static Float: vecVelocity[3 ];
257+ pev (g_pPlayerTargetEntity[pPlayer], pev_velocity, vecVelocity);
201258
202- new pTr = create_tr2 ();
203- engfunc (EngFunc_TraceLine, vecOrigin, vecCameraOrigin, IGNORE_MONSTERS, pPlayer, pTr);
259+ static Float: vecCameraOrigin[3 ];
260+ for (new i = 0 ; i < 3 ; ++ i) {
261+ vecCameraOrigin[i] = vecOrigin[i] + (vecBack[i] * g_rgflPlayerCameraDistance[pPlayer]);
262+ }
263+
264+ new pTr = create_tr2 ();
265+ engfunc (EngFunc_TraceLine, vecOrigin, vecCameraOrigin, IGNORE_MONSTERS, pPlayer, pTr);
204266
205- static Float: flFraction;
206- get_tr2 (pTr, TR_flFraction, flFraction);
267+ static Float: flFraction;
268+ get_tr2 (pTr, TR_flFraction, flFraction);
207269
208- free_tr2 (pTr);
270+ free_tr2 (pTr);
209271
210- if (flFraction != 1 .0 ) {
211- for (new i = 0 ; i < 3 ; ++ i) {
212- vecCameraOrigin[i] = vecOrigin[i] + (vecBack[i] * (g_rgflPlayerCameraDistance[pPlayer] * flFraction));
213- }
272+ if (flFraction != 1 .0 ) {
273+ for (new i = 0 ; i < 3 ; ++ i) {
274+ vecCameraOrigin[i] = vecOrigin[i] + (vecBack[i] * (g_rgflPlayerCameraDistance[pPlayer] * flFraction));
214275 }
276+ }
215277
216- set_pev (g_rgpPlayerCamera[pPlayer], pev_origin, vecCameraOrigin);
217- set_pev (g_rgpPlayerCamera[pPlayer], pev_angles, vecAngles);
218- set_pev (g_rgpPlayerCamera[pPlayer], pev_velocity, vecVelocity);
278+ set_pev (g_rgpPlayerCamera[pPlayer], pev_origin, vecCameraOrigin);
279+ set_pev (g_rgpPlayerCamera[pPlayer], pev_angles, vecAngles);
280+ set_pev (g_rgpPlayerCamera[pPlayer], pev_velocity, vecVelocity);
219281}
220282
221283ReattachCamera (pPlayer) {
0 commit comments