Skip to content

Commit 9f16803

Browse files
committed
add player dizziness api
1 parent 1d1519f commit 9f16803

File tree

2 files changed

+246
-0
lines changed

2 files changed

+246
-0
lines changed

api_player_dizziness.sma

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
#pragma semicolon 1
2+
3+
#include <amxmodx>
4+
#include <hamsandwich>
5+
#include <fakemeta>
6+
#include <xs>
7+
8+
#define DIZZINESS_THINK_RATE 0.01
9+
#define DIZZINESS_RANDOM_PUSH_RATE 1.0
10+
#define DIZZINESS_JUMP_SPEED 200.0
11+
#define DIZZINESS_ANGLE_HANDLE_SPEED 100.0
12+
#define DIZZINESS_ANGLE_HANDLE_SPEED_MIN 50.0
13+
#define DIZZINESS_ANGLE_HANDLE_SPEED_MAX 150.0
14+
#define DIZZINESS_PUSH_SPEED 30.0
15+
#define DIZZINESS_PUSH_SPEED_MIN 0.0
16+
#define DIZZINESS_PUSH_SPEED_MAX 40.0
17+
#define DIZZINESS_PUNCH_ANGLE 45.0
18+
#define DIZZINESS_PUNCH_ANGLE_MIN 20.0
19+
#define DIZZINESS_PUNCH_ANGLE_MAX 75.0
20+
#define DIZZINESS_BLINK_DURATION 0.1
21+
#define DIZZINESS_BLINK_DURATION_MIN 0.1
22+
#define DIZZINESS_BLINK_DURATION_MAX 1.0
23+
#define DIZZINESS_BLINK_TRANSITION_DURATION 0.75
24+
#define DIZZINESS_BLINK_TRANSITION_DURATION_MIN 0.25
25+
#define DIZZINESS_BLINK_TRANSITION_DURATION_MAX 1.0
26+
#define DIZZINESS_RANDOM_BLINK_RATE 3.0
27+
#define DIZZINESS_RANDOM_BLINK_RATE_MIN 1.0
28+
#define DIZZINESS_RANDOM_BLINK_RATE_MAX 10.0
29+
#define DIZZINESS_MIN_STRENGTH_TO_BLINK 0.5
30+
31+
new gmsgScreenFade;
32+
33+
new Float:g_rgflPlayerDizzinessNextThink[MAX_PLAYERS + 1];
34+
new Float:g_rgflPlayerDizzinessStrength[MAX_PLAYERS + 1];
35+
new Float:g_rgflPlayerNextPush[MAX_PLAYERS + 1];
36+
new Float:g_rgvecPlayerPushVelocityTarget[MAX_PLAYERS + 1][3];
37+
new Float:g_rgvecPlayerPushVelocityAcc[MAX_PLAYERS + 1][3];
38+
new Float:g_rgflPlayerLastPushThink[MAX_PLAYERS + 1];
39+
new Float:g_rgflPlayerNextPushThink[MAX_PLAYERS + 1];
40+
new Float:g_rgflPlayerNextBlink[MAX_PLAYERS + 1];
41+
42+
public plugin_init() {
43+
register_plugin("[API] Player Dizziness", "1.0.0", "Hedgehog Fog");
44+
45+
RegisterHamPlayer(Ham_Player_Jump, "HamHook_Player_Jump_Post", .Post = 1);
46+
RegisterHamPlayer(Ham_Player_PreThink, "HamHook_Player_PreThink_Post", .Post = 1);
47+
48+
gmsgScreenFade = get_user_msgid("ScreenFade");
49+
}
50+
51+
public plugin_natives() {
52+
register_library("api_player_dizziness");
53+
register_native("PlayerDizziness_Set", "Native_SetPlayerDizziness");
54+
register_native("PlayerDizziness_Get", "Native_GetPlayerDizziness");
55+
}
56+
57+
public Native_SetPlayerDizziness(iPluginId, iArgc) {
58+
new pPlayer = get_param(1);
59+
new Float:flValue = get_param_f(2);
60+
61+
g_rgflPlayerDizzinessStrength[pPlayer] = floatclamp(flValue, 0.0, 10.0);
62+
}
63+
64+
public Float:Native_GetPlayerDizziness(iPluginId, iArgc) {
65+
new pPlayer = get_param(1);
66+
67+
return g_rgflPlayerDizzinessStrength[pPlayer];
68+
}
69+
70+
public client_connect(pPlayer) {
71+
g_rgflPlayerDizzinessNextThink[pPlayer] = 0.0;
72+
g_rgflPlayerDizzinessStrength[pPlayer] = 0.0;
73+
g_rgflPlayerNextPush[pPlayer] = 0.0;
74+
g_rgflPlayerLastPushThink[pPlayer] = 0.0;
75+
g_rgflPlayerNextPushThink[pPlayer] = 0.0;
76+
g_rgflPlayerNextBlink[pPlayer] = 0.0;
77+
78+
xs_vec_copy(Float:{0.0, 0.0, 0.0}, g_rgvecPlayerPushVelocityTarget[pPlayer]);
79+
xs_vec_copy(Float:{0.0, 0.0, 0.0}, g_rgvecPlayerPushVelocityAcc[pPlayer]);
80+
}
81+
82+
public HamHook_Player_PreThink_Post(pPlayer) {
83+
new Float:flGameTime = get_gametime();
84+
85+
if (flGameTime >= g_rgflPlayerDizzinessNextThink[pPlayer]) {
86+
@Player_Think(pPlayer);
87+
g_rgflPlayerDizzinessNextThink[pPlayer] = flGameTime + DIZZINESS_THINK_RATE;
88+
}
89+
}
90+
91+
public HamHook_Player_Jump_Post(pPlayer) {
92+
if (pev(pPlayer, pev_flags) & FL_ONGROUND && ~pev(pPlayer, pev_oldbuttons) & IN_JUMP) {
93+
@Player_Jump(pPlayer);
94+
}
95+
}
96+
97+
@Player_Think(this) {
98+
new Float:flDizzinessStrength = g_rgflPlayerDizzinessStrength[this];
99+
if (flDizzinessStrength <= 0.0) {
100+
return;
101+
}
102+
103+
if (pev(this, pev_flags) & FL_FROZEN) {
104+
return;
105+
}
106+
107+
new Float:flGameTime = get_gametime();
108+
109+
if (is_user_alive(this)) {
110+
static Float:vecVelocity[3];
111+
pev(this, pev_velocity, vecVelocity);
112+
113+
114+
new Float:flMaxPushForce = floatclamp(DIZZINESS_PUSH_SPEED * flDizzinessStrength, DIZZINESS_PUSH_SPEED_MIN, DIZZINESS_PUSH_SPEED_MAX);
115+
if (g_rgflPlayerNextPush[this] <= flGameTime) {
116+
@Player_Push(this, flMaxPushForce);
117+
g_rgflPlayerNextPush[this] = flGameTime + DIZZINESS_RANDOM_PUSH_RATE;
118+
}
119+
120+
if (flDizzinessStrength >= DIZZINESS_MIN_STRENGTH_TO_BLINK) {
121+
if (g_rgflPlayerNextBlink[this] <= flGameTime) {
122+
new Float:flBlinkTransitionDuration = floatclamp(DIZZINESS_BLINK_TRANSITION_DURATION * flDizzinessStrength, DIZZINESS_BLINK_TRANSITION_DURATION_MIN, DIZZINESS_BLINK_TRANSITION_DURATION_MAX);
123+
new Float:flBlinkDuration = floatclamp(DIZZINESS_BLINK_DURATION * flDizzinessStrength, DIZZINESS_BLINK_DURATION_MIN, DIZZINESS_BLINK_DURATION_MAX);
124+
new Float:flBlinkRate = floatclamp(DIZZINESS_RANDOM_BLINK_RATE / flDizzinessStrength, DIZZINESS_RANDOM_BLINK_RATE_MIN, DIZZINESS_RANDOM_BLINK_RATE_MAX);
125+
126+
@Player_Blink(this, flBlinkDuration, flBlinkTransitionDuration);
127+
g_rgflPlayerNextBlink[this] = flGameTime + flBlinkRate + flBlinkDuration;
128+
}
129+
}
130+
131+
@Player_PushThink(this);
132+
133+
new Float:flMaxPunchAngle = floatclamp(DIZZINESS_PUNCH_ANGLE * flDizzinessStrength, DIZZINESS_PUNCH_ANGLE_MIN, DIZZINESS_PUNCH_ANGLE_MAX);
134+
new Float:flAngleHandleSpeed = floatclamp(DIZZINESS_ANGLE_HANDLE_SPEED / flDizzinessStrength, DIZZINESS_ANGLE_HANDLE_SPEED_MIN, DIZZINESS_ANGLE_HANDLE_SPEED_MAX);
135+
@Player_CameraThink(this, flMaxPunchAngle, flAngleHandleSpeed);
136+
}
137+
}
138+
139+
@Player_PushThink(this) {
140+
new Float:flGameTime = get_gametime();
141+
142+
if (pev(this, pev_flags) & FL_ONGROUND) {
143+
new Float:flDelta = flGameTime - g_rgflPlayerLastPushThink[this];
144+
145+
for (new i = 0; i < 3; ++i) {
146+
g_rgvecPlayerPushVelocityAcc[this][i] += (g_rgvecPlayerPushVelocityTarget[this][i] - g_rgvecPlayerPushVelocityAcc[this][i]) * flDelta;
147+
}
148+
149+
static Float:vecVelocity[3];
150+
pev(this, pev_velocity, vecVelocity);
151+
xs_vec_add(vecVelocity, g_rgvecPlayerPushVelocityAcc[this], vecVelocity);
152+
set_pev(this, pev_velocity, vecVelocity);
153+
}
154+
155+
g_rgflPlayerLastPushThink[this] = get_gametime();
156+
}
157+
158+
@Player_CameraThink(this, Float:flMaxPunchAngle, Float:flAngleHandleSpeed) {
159+
static Float:vecAngles[3];
160+
pev(this, pev_v_angle, vecAngles);
161+
vecAngles[0] = 0.0;
162+
vecAngles[2] = 0.0;
163+
164+
static Float:vecForward[3];
165+
angle_vector(vecAngles, ANGLEVECTOR_FORWARD, vecForward);
166+
167+
static Float:vecRight[3];
168+
angle_vector(vecAngles, ANGLEVECTOR_RIGHT, vecRight);
169+
170+
static Float:vecVelocity[3];
171+
pev(this, pev_velocity, vecVelocity);
172+
173+
static Float:flMaxSpeed;
174+
pev(this, pev_maxspeed, flMaxSpeed);
175+
flMaxSpeed = floatmin(flMaxSpeed, flAngleHandleSpeed);
176+
177+
static Float:vecPunchAngle[3];
178+
pev(this, pev_punchangle, vecPunchAngle);
179+
vecPunchAngle[0] += floatclamp(xs_vec_dot(vecVelocity, vecForward), -flMaxSpeed, flMaxSpeed) / flMaxSpeed * flMaxPunchAngle * DIZZINESS_THINK_RATE;
180+
vecPunchAngle[2] += floatclamp(xs_vec_dot(vecVelocity, vecRight), -flMaxSpeed, flMaxSpeed) / flMaxSpeed * flMaxPunchAngle * DIZZINESS_THINK_RATE;
181+
182+
if (xs_vec_len(vecPunchAngle) > 0.0) {
183+
set_pev(this, pev_punchangle, vecPunchAngle);
184+
}
185+
}
186+
187+
@Player_Push(this, Float:flMaxForce) {
188+
new Float:flGameTime = get_gametime();
189+
190+
xs_vec_copy(Float:{0.0, 0.0, 0.0}, g_rgvecPlayerPushVelocityAcc[this]);
191+
192+
g_rgvecPlayerPushVelocityTarget[this][0] = random_float(-flMaxForce, flMaxForce);
193+
g_rgvecPlayerPushVelocityTarget[this][1] = random_float(-flMaxForce, flMaxForce);
194+
g_rgvecPlayerPushVelocityTarget[this][2] = 0.0;
195+
196+
g_rgflPlayerLastPushThink[this] = flGameTime;
197+
}
198+
199+
@Player_Blink(this, Float:flDuration, Float:flTransitionDuration) {
200+
static const iFlags = 0;
201+
static const rgiColor[3] = {0, 0, 0};
202+
static const iAlpha = 255;
203+
204+
new iFadeTime = FixedUnsigned16(flTransitionDuration , 1<<12);
205+
new iHoldTime = FixedUnsigned16(flDuration , 1<<12);
206+
207+
emessage_begin(MSG_ONE, gmsgScreenFade, _, this);
208+
ewrite_short(iFadeTime);
209+
ewrite_short(iHoldTime);
210+
ewrite_short(iFlags);
211+
ewrite_byte(rgiColor[0]);
212+
ewrite_byte(rgiColor[1]);
213+
ewrite_byte(rgiColor[2]);
214+
ewrite_byte(iAlpha);
215+
emessage_end();
216+
}
217+
218+
@Player_Jump(this) {
219+
if (g_rgflPlayerDizzinessStrength[this] < 1.0) {
220+
return;
221+
}
222+
223+
static Float:vecVelocity[3];
224+
vecVelocity[0] = random_float(-1.0, 1.0);
225+
vecVelocity[1] = random_float(-1.0, 1.0);
226+
vecVelocity[2] = 0.0;
227+
228+
xs_vec_normalize(vecVelocity, vecVelocity);
229+
xs_vec_mul_scalar(vecVelocity, random_float(80.0, 100.0), vecVelocity);
230+
vecVelocity[2] = DIZZINESS_JUMP_SPEED;
231+
232+
set_pev(this, pev_velocity, vecVelocity);
233+
}
234+
235+
stock FixedUnsigned16(Float:flValue, iScale) {
236+
return clamp(floatround(flValue * iScale), 0, 0xFFFF);
237+
}

include/api_player_dizziness.inc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#if defined _api_player_dizziness_included
2+
#endinput
3+
#endif
4+
#define _api_player_dizziness_included
5+
6+
#pragma reqlib api_player_dizziness
7+
8+
native PlayerDizziness_Set(pPlayer, Float:flStrength);
9+
native Float:PlayerDizziness_Get(pPlayer);

0 commit comments

Comments
 (0)