- Автор
- Совместимость с
- Amx Mod X 1.8.2, Amx Mod X 1.9.0
- Требования
-
ReGameDLL_CS, ReAPI
- Благодарности
-
neygomon - за его бесконечное стремление к максимальной оптимизации
Плагин условного парашюта. Позволяет зажав клавишу "E" в воздухе замедлить падение и уменьшить гравитацию. Отсутствует модель, отсутствует смена анимации.
И хоть с плагина намеренно вырезано всё лишнее с целью его максимального облегчения, все равно есть альтернативное исполнение плагина, которое по идее дает меньше нагрузку - это плагин Parachute от ReHLDS Team. Но он основан на ином алгоритме и имеет свои особенности в работе.
И хоть с плагина намеренно вырезано всё лишнее с целью его максимального облегчения, все равно есть альтернативное исполнение плагина, которое по идее дает меньше нагрузку - это плагин Parachute от ReHLDS Team. Но он основан на ином алгоритме и имеет свои особенности в работе.
C++:
#include <amxmodx>
#include <reapi>
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) %1 |= (1 << (%2 & 31))
#define clr_bit(%1,%2) %1 &= ~(1 << (%2 & 31))
new g_bitAlive;
const Float:fall_speed = -100.0
public plugin_init(){
register_plugin("Parachute Lite [ReAPI]", "11.0", "Leo_[BH]");
RegisterHookChain(RG_CBasePlayer_Spawn, "RG_Spawn_Post", 1);
RegisterHookChain(RG_CBasePlayer_Killed, "RG_Player_Killed", 0);
RegisterHookChain(RG_CBasePlayer_PreThink, "RG_client_PreThink");
}
public RG_Spawn_Post(id) if(is_user_alive(id)) set_bit(g_bitAlive, id);
public RG_Player_Killed(id) clr_bit(g_bitAlive, id);
public RG_client_PreThink(id){
if(!get_bit(g_bitAlive, id)) return;
if (get_entvar(id, var_gravity) == 0.1) set_entvar(id, var_gravity, 1.0);
if (get_entvar(id, var_button) & IN_USE) {
static Float:velocity[3]
get_entvar(id, var_velocity, velocity);
if (velocity[2] < 0.0) {
set_entvar(id, var_gravity, 0.1);
velocity[2] = (velocity[2] + 40.0 < fall_speed) ? velocity[2] + 40.0 : fall_speed ;
set_entvar(id, var_velocity, velocity);
}
}
else if ((get_entvar(id, var_oldbuttons) & IN_USE)) {
set_entvar(id, var_gravity, 1.0);
}
}
#if AMXX_VERSION_NUM < 183
public client_disconnect(id) clr_bit(g_bitAlive, id);
#else
public client_disconnected(id) clr_bit(g_bitAlive, id);
#endif
C-like:
#include <amxmodx>
#include <reapi>
public plugin_init() {
register_plugin("Parachute", "1.1", "ReHLDS Team");
RegisterHookChain(RG_PM_AirMove, "PM_AirMove", .post = false);
}
public PM_AirMove(const playerIndex) {
if (!(get_entvar(playerIndex, var_button) & IN_USE) || get_entvar(playerIndex, var_waterlevel) > 0) return;
new Float:flVelocity[3];
get_entvar(playerIndex, var_velocity, flVelocity);
if (flVelocity[2] < 0.0) {
flVelocity[2] = (flVelocity[2] + 40.0 < -100.0) ? flVelocity[2] + 40.0 : -100.0;
set_entvar(playerIndex, var_sequence, ACT_WALK);
set_entvar(playerIndex, var_gaitsequence, ACT_IDLE);
set_pmove(pm_velocity, flVelocity);
set_movevar(mv_gravity, 80.0);
}
}