Raised This Month: $51 Target: $400
 12% 

API Scripting Help [HELP]How to create a native for all modes


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Depresie
Veteran Member
Join Date: Nov 2013
Old 02-07-2015 , 05:04   [HELP]How to create a native for all modes
Reply With Quote #1

I want to add several human and zombie classes to my server, and i want the abilities of the classses to not affect on neme/surv etc.
But instead of adding all the libraries and natives in every class source, i would like to register all of them into one native, something like:

zp_class_mode_get == zp_class_assassin_get() || zp_class_nemesis_get() || zp_class_survivor_get() || zp_class_sniper_get()

but i realy dont know how to modify properly the red colored line from the code, anyone can help me?

Code:
#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <amx_settings_api>
#include <cs_maxspeed_api>
#include <cs_player_models_api>
#include <cs_weap_models_api>
#include <cs_ham_bots_api>
#include <zp50_core>
etc


#define PLAYERMODEL_MAX_LENGTH 32
#define MODEL_MAX_LENGTH 64


#define flag_get(%1,%2) (%1 & (1 << (%2 & 31)))
#define flag_get_boolean(%1,%2) (flag_get(%1,%2) ? true : false)
#define flag_set(%1,%2) %1 |= (1 << (%2 & 31))
#define flag_unset(%1,%2) %1 &= ~(1 << (%2 & 31))

new g_MaxPlayers
new g_IsMode


public plugin_init()
{
    register_plugin("[ZP] Class: Sky Terror", ZP_VERSION_STRING, "ZP Dev Team")
    
    RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
    RegisterHamBots(Ham_TakeDamage, "fw_TakeDamage")
    RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
    RegisterHamBots(Ham_Killed, "fw_PlayerKilled")
    register_forward(FM_ClientDisconnect, "fw_ClientDisconnect_Post", 1)
    
    g_MaxPlayers = get_maxplayers()
    g_IsMode = zp_class_assassin_get() || zp_class_nemesis_get() || zp_class_survivor_get() || zp_class_sniper_get() || zp_class_hive_get() || zp_class_terro_get()
    
}

public plugin_natives()
{
    register_library("zp50_class_mode")
    register_native("zp_class_mode_get", "native_class_mode_get")
    
    set_module_filter("module_filter")
    set_native_filter("native_filter")
}

public native_filter(const name[], index, trap)
{
    if (!trap)
        return PLUGIN_HANDLED;
        
    return PLUGIN_CONTINUE;
}

public fw_ClientDisconnect_Post(id)
{
    // Reset flags AFTER disconnect (to allow checking if the player was nemesis before disconnecting)
    flag_unset(g_IsMode, id)
}


public zp_fw_core_spawn_post(id)
{
    if (flag_get(g_IsMode, id))
    {
        
        // Remove nemesis flag
        flag_unset(g_IsMode, id)
    }
}

public zp_fw_core_cure(id, attacker)
{
    if (flag_get(g_IsMode, id))
    {
        
        // Remove nemesis flag
        flag_unset(g_IsMode, id)
    }
}

public zp_fw_core_infect_post(id, attacker)
{
    // Apply Nemesis attributes?
    if (!flag_get(g_IsTerror, id))
        return;
    
    // Health
    if (get_pcvar_num(cvar_terror_health) == 0)
        set_user_health(id, get_pcvar_num(cvar_terror_base_health) * GetAliveCount())
    else
        set_user_health(id, get_pcvar_num(cvar_terror_health))
    
    // Gravity
    set_user_gravity(id, get_pcvar_float(cvar_terror_gravity))
    
    // Speed
    cs_set_player_maxspeed_auto(id, get_pcvar_float(cvar_terror_speed))
    
    // Apply nemesis player model
    new player_model[PLAYERMODEL_MAX_LENGTH]
    ArrayGetString(g_models_terror_player, random_num(0, ArraySize(g_models_terror_player) - 1), player_model, charsmax(player_model))
    cs_set_player_model(id, player_model)
    
    // Apply nemesis claw model
    new model[MODEL_MAX_LENGTH]
    ArrayGetString(g_models_terror_claw, random_num(0, ArraySize(g_models_terror_claw) - 1), model, charsmax(model))
    cs_set_player_view_model(id, CSW_KNIFE, model)    
    
    // Nemesis glow
    if (get_pcvar_num(cvar_terror_glow))
        set_user_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25)
    
    // Nemesis aura task
    if (get_pcvar_num(cvar_terror_aura))
        set_task(0.1, "terror_aura", id+TASK_AURA, _, _, "b")
}

public native_class_mode_get(plugin_id, num_params)
{
    new id = get_param(1)
    
    if (!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return -1;
    }
    
    return flag_get_boolean(g_IsMode, id);
}

public native_class_mode_set(plugin_id, num_params)
{
    new id = get_param(1)
    
    if (!is_user_alive(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return false;
    }
    
    if (flag_get(g_IsTerror, id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Player already a sky terror (%d)", id)
        return false;
    }
    
    flag_set(g_IsMode, id)
    zp_core_force_infect(id)
    return true;
}


// Get Nemesis Count -returns alive nemesis number-
GetTerrorCount()
{
    new iMode, id
    
    for (id = 1; id <= g_MaxPlayers; id++)
    {
        if (is_user_alive(id) && flag_get(g_IsMode, id))
            iMode++
    }
    
    return iMode;
}

Last edited by Depresie; 02-07-2015 at 05:18.
Depresie is offline
zmd94
Veteran Member
Join Date: Nov 2013
Location: Malaysia (9w2zow).
Old 02-07-2015 , 06:07   Re: [HELP]How to create a native for all modes
Reply With Quote #2

Which ZP version do you use? ZPA?
zmd94 is offline
Depresie
Veteran Member
Join Date: Nov 2013
Old 02-07-2015 , 06:19   Re: [HELP]How to create a native for all modes
Reply With Quote #3

5.0
Depresie is offline
zmd94
Veteran Member
Join Date: Nov 2013
Location: Malaysia (9w2zow).
Old 02-07-2015 , 18:50   Re: [HELP]How to create a native for all modes
Reply With Quote #4

The red code is not needed:
Code:
public plugin_init()
{
    register_plugin("[ZP] Class: Sky Terror", ZP_VERSION_STRING, "ZP Dev Team")
    
    RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
    RegisterHamBots(Ham_TakeDamage, "fw_TakeDamage")
    RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
    RegisterHamBots(Ham_Killed, "fw_PlayerKilled")
    register_forward(FM_ClientDisconnect, "fw_ClientDisconnect_Post", 1)
    
    g_MaxPlayers = get_maxplayers()
    g_IsMode = zp_class_assassin_get() || zp_class_nemesis_get() || zp_class_survivor_get() || zp_class_sniper_get() || zp_class_hive_get() || zp_class_terro_get()
    
}

public plugin_natives()
{
    register_library("zp50_class_mode")
    register_native("zp_class_mode_get", "native_class_mode_get")
    
    set_module_filter("module_filter")
    set_native_filter("native_filter")
}

public native_filter(const name[], index, trap)
{
    if (!trap)
        return PLUGIN_HANDLED;
        
    return PLUGIN_CONTINUE;
}
If you want to check for other special classes, just do as below:
Code:
#include <zp50_class_nemesis>
#include <zp50_class_assassin>
#include <zp50_class_survivor>
#include <zp50_class_sniper>

public YourFunction(id)
{
    // If player is Nemesis or etc
    if(zp_class_assassin_get(id) || zp_class_nemesis_get(id) || zp_class_survivor_get(id) || zp_class_sniper_get(id))
    {
        // Other codes.
    }
}
zmd94 is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 12:38.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode