Veteran Member
Join Date: Jul 2006
Location: France (95)
11-16-2013
, 16:32
[Orpheu] Fly mode
#1
natives :
get_user_fly(index)
set_user_fly(index, fly=0)
Code :
Spoiler
PHP Code:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < orpheu >
#include < orpheu_stocks >
#pragma semicolon 1
#define TEST_DROP
#include "footsteps" // https://forums.alliedmods.net/showthread.php?p=2061718
#define PLUGIN "Fly"
#define VERSION "0.0.2"
#define cm(%0) ( sizeof(%0) - 1 )
new const pm_origin [] = "origin" ;
new const pm_iuser1 [] = "iuser1" ;
new const pm_flags [] = "flags" ;
new const pm_movetype [] = "movetype" ;
new const pm_player_index [] = "player_index" ;
new const pm_onground [] = "onground" ;
new OrpheuStruct : pmove ;
new g_playerIndex ;
enum _ : observerModes
{
OBS_NONE ,
OBS_CHASE_LOCKED ,
OBS_CHASE_FREE ,
OBS_ROAMING ,
OBS_IN_EYE ,
OBS_MAP_FREE ,
OBS_MAP_CHASE
}
new OrpheuFunction : g_ofnPM_SpectatorMove ;
new bool : g_bFlyMove [ 33 char ];
new g_pcvarFlySpeed ;
new g_iMaxPlayers ;
#define IsPlayer(%0) ( 1 <= (%0) <= g_iMaxPlayers )
public plugin_init ()
{
register_plugin ( PLUGIN , VERSION , "ConnorMcLeod" );
g_pcvarFlySpeed = register_cvar ( "amx_fly_speed" , "500" );
OrpheuRegisterHook ( OrpheuGetDLLFunction ( "pfnPM_Move" , "PM_Move" ) , "OnPM_Move" , OrpheuHookPre );
OrpheuRegisterHook ( OrpheuGetFunction ( "PM_Duck" ) , "OnPM_Duck_P" , OrpheuHookPost );
g_ofnPM_SpectatorMove = OrpheuGetFunction ( "PM_SpectatorMove" );
RegisterHam ( Ham_CS_Player_ResetMaxSpeed , "player" , "OnCBasePlayer_ResetMaxSpeed_P" , true );
g_iMaxPlayers = get_maxplayers ();
#if defined TEST_DROP
register_clcmd ( "drop" , "drop" );
}
public drop ( id )
{
if( is_user_alive ( id ) && get_user_weapon ( id ) == CSW_KNIFE )
{
g_bFlyMove { id } = ! g_bFlyMove { id };
if( g_bFlyMove { id } )
{
o_set_user_footsteps ( id , 1 );
OnCBasePlayer_ResetMaxSpeed_P ( id );
}
else
{
o_set_user_footsteps ( id , 0 );
ExecuteHamB ( Ham_CS_Player_ResetMaxSpeed , id );
}
return PLUGIN_HANDLED ;
}
return PLUGIN_CONTINUE ;
#endif
}
public plugin_natives ()
{
register_library ( "fly" );
register_native ( "get_user_fly" , "n_get_user_fly" );
register_native ( "set_user_fly" , "n_set_user_fly" );
}
public n_get_user_fly ( plugin , parmsNum )
{
new id = get_param ( 1 );
if( IsPlayer ( id ) )
{
return g_bFlyMove { id };
}
return - 1 ;
}
public n_set_user_fly ( plugin , parmsNum )
{
new id = get_param ( 1 );
if( IsPlayer ( id ) )
{
g_bFlyMove { id } = get_param ( 2 ) > 0 ;
o_set_user_footsteps ( id , g_bFlyMove { id });
return 1 ;
}
return 0 ;
}
public client_putinserver ( id )
{
g_bFlyMove { id } = false ;
}
public OnCBasePlayer_ResetMaxSpeed_P ( id )
{
if( g_bFlyMove { id } && is_user_alive ( id ) )
{
new Float : maxspeed ;
pev ( id , pev_maxspeed , maxspeed );
if( maxspeed > 1.0 )
{
set_pev ( id , pev_maxspeed , get_pcvar_float ( g_pcvarFlySpeed ));
}
}
}
public OrpheuHookReturn : OnPM_Move ( OrpheuStruct : ppmove , server )
{
pmove = ppmove ;
g_playerIndex = OrpheuGetStructMember ( ppmove , pm_player_index ) + 1 ;
if( ! g_bFlyMove { g_playerIndex } || ! is_user_alive ( g_playerIndex ) )
{
// OrpheuSetStructMember(ppmove, "clientmaxspeed", 0.0);
g_playerIndex = 0 ;
}
}
public OrpheuHookReturn : OnPM_Duck_P ()
{
if( g_playerIndex && OrpheuGetStructMember ( pmove , pm_onground ) == - 1 )
{
static Float : origin [ 3 ], flags ;
OrpheuGetStructMember ( pmove , pm_origin , origin );
OrpheuSetStructMember ( pmove , pm_iuser1 , OBS_ROAMING );
OrpheuCall ( g_ofnPM_SpectatorMove );
OrpheuSetStructMember ( pmove , pm_iuser1 , 0 );
OrpheuSetStructMember ( pmove , pm_origin , origin );
OrpheuSetStructMember ( pmove , pm_movetype , MOVETYPE_FLY );
flags = OrpheuGetStructMember ( pmove , pm_flags );
if( ~ flags & FL_ONTRAIN )
{
OrpheuSetStructMember ( pmove , pm_flags , flags | FL_ONTRAIN );
}
}
return OrpheuIgnored ;
}
__________________
Last edited by ConnorMcLeod; 11-16-2013 at 18:16 .