[Orpheu] Fly mode
Posted: Mon Sep 28, 2026 12:59 pm
natives :
get_user_fly(index)
set_user_fly(index, fly=0)
get_user_fly(index)
set_user_fly(index, fly=0)
Code: Select all
#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;
}