Skip to content

Commit 2d9fd85

Browse files
committed
update player camera API
1 parent 890d004 commit 2d9fd85

File tree

2 files changed

+237
-56
lines changed

2 files changed

+237
-56
lines changed

api_player_camera.sma

Lines changed: 118 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,19 @@
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

1522
new g_iszTriggerCameraClassname;
1623

@@ -23,10 +30,15 @@ public plugin_precache() {
2330
}
2431

2532
public 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

3244
public 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

4357
public 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+
86109
public 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+
93123
public HamHook_Player_Spawn_Post(pPlayer) {
94124
ReattachCamera(pPlayer);
95125
}
@@ -100,7 +130,9 @@ public HamHook_Player_PreThink_Post(pPlayer) {
100130

101131
public 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

124165
DeactivatePlayerCamera(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

137184
SetCameraOffset(pPlayer, const Float:vecOffset[3]) {
138-
xs_vec_copy(vecOffset, g_rgflPlayerCamerOffset[pPlayer]);
185+
xs_vec_copy(vecOffset, g_rgflPlayerCameraOffset[pPlayer]);
139186
}
140187

141188
SetCameraAngles(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+
149202
SetCameraThinkDelay(pPlayer, Float:flThinkDelay) {
150203
g_rgflPlayerCameraThinkDelay[pPlayer] = flThinkDelay;
151204
}
152205

206+
SetCameraTarget(pPlayer, pTarget) {
207+
g_pPlayerTargetEntity[pPlayer] = pTarget;
208+
}
209+
153210
CreatePlayerCamera(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

166223
PlayerCameraThink(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

221283
ReattachCamera(pPlayer) {

0 commit comments

Comments
 (0)