Не воспринимай серьёзно. Было весёлое настроение, прибавлял по номеру версии за каждую мелкую правку.Leo_BH, Как так получилось, что у вас 11.0 версия "разработки" на 20 строк кода
В чем суть махинаций с гравитацией? Не улавливаю
#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]", "12.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_button) & IN_USE) {
static Float:velocity[3]
get_entvar(id, var_velocity, velocity);
if (velocity[2] < 0.0) {
velocity[2] = (velocity[2] + 40.0 < fall_speed) ? velocity[2] + 40.0 : fall_speed ;
set_entvar(id, var_velocity, velocity);
}
}
}
#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
Мое личное мнение - парашют, это какая-то дичь, совсем не уместная в геймплее кс. Но скажи это владельцам серверов, которые ставят на свои сервера парашюты. И игрокам, которые говорят:Прошу прощения, в чём смысл плагина парашюта без модели парашюта, помимо мнимой оптимизации? Это же эстетически и логически не верно...
А таких полно.Парашют на сервере - КРУТО!
Парашют без модели, он же сервер меньше грузит... (мнимая оптимизация)
Я поставлю парашют без модели, чтобы игрокам не закачивать модель себе в клиент (неумение пользоваться FastHTTPDownload)
Парашют нужен без модели, чтобы не отвлекать других игроков
Набор мнений основан на общении с владельцами серверов, игроками и случайными комментариями с сайтов.Парашют нужен без модели, потому-что его использования сильно "палит" и тебя убивают!
В смысле неумение пользоваться FastHTTPDownload? Вы чёт недооцениваете владельцев серверов) Я думаю, это все умеют хотя-бы потому, что многие мониторинги требуют наличия FastDL. На популярных хостингах быстрая загрузка вообще автоматизирована, а те, кого угораздило поместить сервер на VDS или на свой комп, тем более понимают, что к чему. Да и вообще, это очень просто организовать.Я поставлю парашют без модели, чтобы игрокам не закачивать модель себе в клиент (неумение пользоваться FastHTTPDownload)
Безусловно, большинство владельцев серверов умеют ею пользоваться.В смысле неумение пользоваться FastHTTPDownload? Вы чёт недооцениваете владельцев серверов)
Ну и отлично, можно это добавить в набор мнений, <<почему я ставлю парашют без модели>>.Я вот пользуюсь парашютом без модели потому, что у меня принцип, чистый приближённый к классике паблик, с которого не грузится ни единого файла при первом коннекте кроме карт.
#include <amxmodx>
#include <hamsandwich>
#include <engine>
#define PARACHUTE_FLAG ADMIN_ALL // ADMIN_ALL для доступа всем игрокам
new g_iAlive[33];
new bool:g_bAccess[33];
public plugin_init()
{
register_plugin("Parachute", "1.1", "maeStro | neygomon");
RegisterHam(Ham_Spawn, "player", "fwdHamPlayerSpawn", true);
RegisterHam(Ham_Killed, "player", "fwdHamPlayerKilled", true);
}
public client_putinserver(pClient)
{
g_iAlive[pClient] = 0;
g_bAccess[pClient] = (get_user_flags(pClient) & PARACHUTE_FLAG) ? true : false;
}
public fwdHamPlayerSpawn(pClient)
g_iAlive[pClient] = is_user_alive(pClient);
public fwdHamPlayerKilled(pVictim)
g_iAlive[pVictim] = 0;
public client_PreThink(id)
{
if(!g_iAlive[id] || ~get_user_button(id) & IN_USE || get_entity_flags(id) & FL_ONGROUND) return;
static Float:velocity[3]; entity_get_vector(id, EV_VEC_velocity, velocity);
if(velocity[2] < 0)
{
velocity[2] = (velocity[2] + 40.0 < -100) ? velocity[2] + 40.0 : -100.0;
entity_set_vector(id, EV_VEC_velocity, velocity);
}
}
Теоретически - этот:Leo_BH, я этим уже 2 года пользуюсь. Какой лучше?
Код:#include <amxmodx> #include <hamsandwich> #include <engine> #define PARACHUTE_FLAG ADMIN_ALL // ADMIN_ALL для доступа всем игрокам new g_iAlive[33]; new bool:g_bAccess[33]; public plugin_init() { register_plugin("Parachute", "1.1", "maeStro | neygomon"); RegisterHam(Ham_Spawn, "player", "fwdHamPlayerSpawn", true); RegisterHam(Ham_Killed, "player", "fwdHamPlayerKilled", true); } public client_putinserver(pClient) { g_iAlive[pClient] = 0; g_bAccess[pClient] = (get_user_flags(pClient) & PARACHUTE_FLAG) ? true : false; } public fwdHamPlayerSpawn(pClient) g_iAlive[pClient] = is_user_alive(pClient); public fwdHamPlayerKilled(pVictim) g_iAlive[pVictim] = 0; public client_PreThink(id) { if(!g_iAlive[id] || ~get_user_button(id) & IN_USE || get_entity_flags(id) & FL_ONGROUND) return; static Float:velocity[3]; entity_get_vector(id, EV_VEC_velocity, velocity); if(velocity[2] < 0) { velocity[2] = (velocity[2] + 40.0 < -100) ? velocity[2] + 40.0 : -100.0; entity_set_vector(id, EV_VEC_velocity, velocity); } }
#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;
public plugin_init(){
register_plugin("Parachute Lite [ReAPI]", "14.0", "Leo_[BH]");
RegisterHookChain(RG_CBasePlayer_Spawn, "RG_Spawn_Post", 1);
RegisterHookChain(RG_CBasePlayer_Killed, "RG_Player_Killed", 1);
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);
#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
public RG_client_PreThink(id){
if(!get_bit(g_bitAlive, id)) return;
if(get_entvar(id, var_button) & IN_USE){
static Float:velocity[3]; get_entvar(id, var_velocity, velocity);
if (velocity[2] < 0.0) {
velocity[2] = (velocity[2] + 40.0 < -100.0) ? velocity[2] + 40.0 : -100.0 ;
set_entvar(id, var_velocity, velocity);
}
}
}
В целом, наиболее выгодный вариант хука движения игрока в воздухе для использования под парашют является:
PM_Move() -> PM_PlayerMove()-> PM_AirMove() , который вызывается только в случае:
Код:// determine if we are not on ground if(pmove->onground == -1)
Дичь - это когда игрок парит без модели (имхо). Существуют карты, на которых без него реально неудобно играть.Мое личное мнение - парашют, это какая-то дичь, совсем не уместная в геймплее кс.
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
//#define PARACHUTE_LEVEL ADMIN_LEVEL_E
#define _PLUGIN "[ZP] Parachute"
#define _VERSION "1.0"
#define _AUTHOR "H.RED.ZONE"
#define PARACHUTE_MODEL "models/parachute.mdl"
#define MAX_PLAYERS 32
#define MarkUserHasParachute(%0) g_bitHasParachute |= (1<<(%0&31))
#define ClearUserHasParachute(%0) g_bitHasParachute &= ~(1<<(%0&31))
#define HasUserParachute(%0) g_bitHasParachute & (1<<(%0&31))
new g_bitHasParachute
new g_iUserParachute[MAX_PLAYERS+1]
new Float:g_flEntityFrame[MAX_PLAYERS+1]
new g_iModelIndex
new g_pCvarFallSpeed
new const PARACHUTE_CLASS[] = "parachute"
enum {
deploy,
idle,
detach
}
public plugin_init() {
register_plugin(_PLUGIN, _VERSION, _AUTHOR)
g_pCvarFallSpeed = register_cvar("parachute_fallspeed", "100")
register_forward( FM_CmdStart, "fw_Start" ) // *** Особенно нагрузочный форвад! ***
RegisterHam(Ham_Spawn, "player", "Ham_CBasePlayer_Spawn_Post", 1)
RegisterHam(Ham_Killed, "player", "Ham_CBasePlayer_Killed_Post", 1)
}
public plugin_precache() {
g_iModelIndex = precache_model(PARACHUTE_MODEL)
}
public client_putinserver(id) {
if( HasUserParachute(id) ) {
new iEnt = g_iUserParachute[id]
if( iEnt ) {
RemoveUserParachute(id, iEnt)
}
ClearUserHasParachute(id)
}
}
public client_disconnected(id) {
if( HasUserParachute(id) ) {
new iEnt = g_iUserParachute[id]
if( iEnt ) {
RemoveUserParachute(id, iEnt)
}
ClearUserHasParachute(id)
}
}
public Ham_CBasePlayer_Killed_Post( id ) {
if( HasUserParachute(id) ) {
new iEnt = g_iUserParachute[id]
if( iEnt ) {
RemoveUserParachute(id, iEnt)
}
ClearUserHasParachute(id)
}
}
public Ham_CBasePlayer_Spawn_Post(id) {
if( is_user_alive(id) ) {
if( HasUserParachute(id) ) {
new iEnt = g_iUserParachute[id]
if( iEnt ) {
RemoveUserParachute(id, iEnt)
}
}
MarkUserHasParachute(id)
}
}
RemoveUserParachute(id, iEnt) {
engfunc(EngFunc_RemoveEntity, iEnt)
g_iUserParachute[id] = 0
}
CreateParachute(id) {
static iszInfoTarget
if( !iszInfoTarget ) {
iszInfoTarget = engfunc(EngFunc_AllocString, "info_target")
}
new iEnt = engfunc(EngFunc_CreateNamedEntity, iszInfoTarget)
if( iEnt > 0) {
static iszClass = 0
if( !iszClass ) {
iszClass = engfunc(EngFunc_AllocString, PARACHUTE_CLASS)
}
set_pev_string(iEnt, pev_classname, iszClass)
set_pev(iEnt, pev_aiment, id)
set_pev(iEnt, pev_owner, id)
set_pev(iEnt, pev_movetype, MOVETYPE_FOLLOW)
static iszModel = 0
if( !iszModel ) {
iszModel = engfunc(EngFunc_AllocString, PARACHUTE_MODEL)
}
set_pev_string(iEnt, pev_model, iszModel)
set_pev(iEnt, pev_modelindex, g_iModelIndex)
set_pev(iEnt, pev_sequence, deploy)
set_pev(iEnt, pev_gaitsequence, 1)
set_pev(iEnt, pev_frame, 0.0)
//set_pev(iEnt, pev_rendermode, pev(id, pev_rendermode));
//set_pev(iEnt, pev_renderfx, pev(id, pev_renderfx));
//new Float:f_renderamt;
//pev(id, pev_renderamt, f_renderamt);
//set_pev(iEnt, pev_renderamt, f_renderamt);
g_flEntityFrame[id] = 0.0
g_iUserParachute[id] = iEnt
MarkUserHasParachute(id)
new Float:fVecOrigin[3]
pev(id, pev_origin, fVecOrigin)
return iEnt
}
return 0
}
public fw_Start(id) {
if( ~HasUserParachute(id) || !is_user_alive(id) ) {
return
}
//if( !(get_user_flags(id) & PARACHUTE_LEVEL) ) {
//return
//}
new Float:flFrame
new iEnt = g_iUserParachute[id]
if(iEnt > 0 && pev(id, pev_flags) & FL_ONGROUND) {
if( pev(iEnt, pev_sequence) != detach ) {
set_pev(iEnt, pev_sequence, detach)
set_pev(iEnt, pev_gaitsequence, 1)
set_pev(iEnt, pev_frame, 0.0)
g_flEntityFrame[id] = 0.0
set_pev(iEnt, pev_animtime, 0.0)
set_pev(iEnt, pev_framerate, 0.0)
return
}
pev(iEnt, pev_frame, flFrame)
if( flFrame > 252.0 ) {
RemoveUserParachute(id, iEnt)
return
}
flFrame += 2.0
g_flEntityFrame[id] = flFrame
set_pev(iEnt, pev_frame, flFrame)
return
}
if( pev(id, pev_button) & IN_USE ) {
new Float:fVecVelocity[3], Float:fVelocity_z
pev(id, pev_velocity, fVecVelocity)
fVelocity_z = fVecVelocity[2]
if( fVelocity_z < 0.0 ) {
if(iEnt <= 0) {
iEnt = CreateParachute(id)
}
fVelocity_z = floatmin(fVelocity_z + 15.0, -get_pcvar_float(g_pCvarFallSpeed))
fVecVelocity[2] = fVelocity_z
set_pev(id, pev_velocity, fVecVelocity)
if( pev(iEnt, pev_sequence) == deploy ) {
flFrame = g_flEntityFrame[id]++
if( flFrame > 100.0 ) {
set_pev(iEnt, pev_animtime, 0.0)
set_pev(iEnt, pev_framerate, 0.4)
set_pev(iEnt, pev_sequence, idle)
set_pev(iEnt, pev_gaitsequence, 1)
set_pev(iEnt, pev_frame, 0.0)
g_flEntityFrame[id] = 0.0
}
else {
set_pev(iEnt, pev_frame, flFrame)
}
}
}
else if(iEnt > 0) {
RemoveUserParachute(id, iEnt)
}
}
else if( iEnt > 0 && pev(id, pev_oldbuttons) & IN_USE ) {
RemoveUserParachute(id, iEnt)
}
}
ухудшений той же изменчивой стрельбы из игроков никто не ощущал
#include <amxmodx>
#include <engine>
#include <hamsandwich>
public plugin_init()
{
register_plugin("Parachute", "1.0", "maeStro");
RegisterHam(Ham_ObjectCaps, "player", "FwdHamObjectCaps");
}
public FwdHamObjectCaps(id)
{
if (!is_user_alive(id)||get_entity_flags(id) & FL_ONGROUND) return;
static Float:velocity[3];
entity_get_vector(id, EV_VEC_velocity, velocity);
if(velocity[2] < 0)
{
velocity[2] = (velocity[2] + 40.0 < -100) ? velocity[2] + 40.0 : -100.0;
entity_set_vector(id, EV_VEC_velocity, velocity);
}
}
Више лучшеа что насчет такого парашюта?
Нихрехлдс тим