[Orpheu] Fly mode

For scripting examples for learning how to use AMXX.
User avatar
Archive-Poster
Posts: 1367
Gender:
United States of America

[Orpheu] Fly mode

Post by Archive-Poster »

natives :
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;
} 
Attachments
fly_sigs.zip
(1.06 KiB) Downloaded 6 times
fly.inc.zip
(280 Bytes) Downloaded 5 times
fly.sma.zip
(1.47 KiB) Downloaded 7 times

Who is online

Users browsing this forum: No registered users and 1 guest