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

[TUT] How to create a custom game mode for ZPA


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
abdul-rehman
Veteran Member
Join Date: Jan 2010
Location: Khi, Pakistan
Old 07-01-2010 , 09:30   [TUT] How to create a custom game mode for ZPA
Reply With Quote #1

I realized that many people were new to Zombie Plague Advance and it was difficult for them to create game modes on thier own so i made this tutorial
Lets begin:
1- First we will include the necessary include files
Code:
#include < amxmodx > #include < fun > #include < zombie_plague_advance >
Instead of using fake meta to set the default attributes for players, i will be using fun because it is not only efficient but is also easy for beginners to understand.

2- Now we will make a customizations section where users can customize the game modes according to there requirements
Code:
// This is the chance value according to which this game mode will be called // The higher the value the lesser the chance of calling this game mode new const g_chance = 15   // This is the access flag required to start the game mode // through the admin menu. Look in users.ini for more details new const g_access_flag[] = "a"   // This is the sound which is played when the game mode is triggered // Add as many as you want [Randomly chosen if more than one] new const g_play_sounds[][] = {     "zombie_plague/nemesis1.wav" ,     "zombie_plague/survivor1.wav" }   // Comment the following line to disable ambience sounds // Just add two slashes ( // ) #define AMBIENCE_SOUNDS   #if defined AMBIENCE_SOUNDS // Ambience Sounds (only .wav and .mp3 formats supported) // Add as many as you want [Randomly chosen if more than one] new const g_sound_ambience[][] = {     "zombie_plague/swarm.mp3" ,     "zombie_plague/plague.mp3" } // Duration in seconds of each sound new const Float:g_sound_ambience_duration[] = { 58.0 , 56.0 } #endif
Now were done with the customizations section we have added support for all necassary things which make a gamemode more enjoy able to play

3- Now we will create the plugin init and declare some variables
I have commented it well so it will be easy to understand:
Code:
// Variables new g_gameid, g_maxplayers, cvar_minplayers, cvar_ratio, cvar_sniperhp, cvar_assahp, g_msg_sync   // Ambience sounds task // This value should be different from other task values present in other plugins // Change it every time you make a new game mode #define TASK_AMB 2957   public plugin_init( ) {     // Plugin registeration.     register_plugin ( "[ZP] Example Game Mode","1.0", "@bdul!"  )       // Register some cvars     // Edit these according to your liking       // Min players required for this game mode     cvar_minplayers = register_cvar ( "zp_avsm_minplayers", "2" )       // Sniper's HP multiplier     cvar_sniperhp =   register_cvar ( "zp_avsm_sniper_hp", "1.5" )       // Assassin's HP multiplier     cvar_assahp =     register_cvar ( "zp_avsm_assassin_hp", "1.0" )       // Infection ratio i.e this number * alive players = no of assassins     cvar_ratio =      register_cvar ( "zp_avsm_inf_ratio", "0.5" )       // Get maxplayers     g_maxplayers = get_maxplayers( )       // Hud stuff needed     g_msg_sync = CreateHudSyncObj( ) }

4- Now we will precache our resources this is very necessary
Game Modes MUST be registered in plugin precache ONLY
Code:
public plugin_precache( ) {     // Read the access flags     // Convert them in to bitsums     new access_flag = read_flags( g_access_flag )     new i       // Loop through all play sounds     // Precache the play sounds     for (i = 0; i < sizeof g_play_sounds; i++)         precache_sound( g_play_sounds[i] )       // Precache the ambience sounds     #if defined AMBIENCE_SOUNDS     new sound[100]     for (i = 0; i < sizeof g_sound_ambience; i++)     {         // If mp3 sounds then precache them seperately         if (equal(g_sound_ambience[i][strlen(g_sound_ambience[i])-4], ".mp3"))         {             formatex(sound, sizeof sound - 1, "sound/%s", g_sound_ambience[i])               // mp3 sounds are generic resources to half life             precache_generic( sound )         }         else         {             // Precache the sound normally             precache_sound( g_sound_ambience[i] )         }     }     #endif       // Register our game mode     g_gameid = zp_register_game_mode( "Assassin vs Snipers Mode", access_flag, g_chance, 0, ZP_DM_BALANCE ) }
Now we have registered our game mode
zp_register_game_mode takes 5 parameters
The first parameter is its normal name
The second parameter is the access flag required to activate this game mode manually through the admin menu
The third parameter is its chance level....setting this to zero will cause the game mode to be always called by the main plugin
The fourth parameter is whether to allow infection in this round or not
set this to 1 and attacks by zombies on humans will infect them instead of killing them
The fifth parameter is the type of deathmatch you want during this game mode
I will paste the code from Zombie Plague Advance's include file regarding deathmatch modes
Code:
/* Death Match modes for zp_register_game_mode */ enum {       ZP_DM_NONE = 0, // Disable death match during the custom mode round       ZP_DM_HUMAN,    // Respawn as human only       ZP_DM_ZOMBIE,   // Respawn as zombie only       ZP_DM_RANDOM,   // Respawn randomly as humans or zombies       ZP_DM_BALANCE   // Respawn as humans or zombies to keep both team balanced }

5- In order to catch the game mode we will use the zp_round_started_pre forward instead of zp_round_started because the first one is called for custom game modes and allows them to either start or stop while informing the main plugin whether to give other game modes a chance or not.
Code:
public zp_round_started_pre( game ) {     // Check if it is our game mode     if( game == g_gameid )     {         // Check for min players         if( fn_get_alive_players() < get_pcvar_num(cvar_minplayers) )         {            /**              * Note:              * This very necessary, you should return ZP_PLUGIN_HANDLED if              * some conditions required by your game mode are not met              * This will inform the main plugin that you have rejected              * the offer and so the main plugin will allow other game modes              * to be given a chance              */             return ZP_PLUGIN_HANDLED         }         // Start our new mode         start_avs_mode( )     }     // Make the compiler happy =)     return PLUGIN_CONTINUE }
start_avs_mode is the function where our code for the game mode will be present

6- Now we will catch the round started forward from ZP to check if our game mode has started fully so we can show a hudmessage for it and start play sounds and ambience sounds.
Code:
public zp_round_started( game, id ) {     // Check if it is our game mode     if( game == g_gameid )     {         // Show HUD notice         set_hudmessage(221, 156, 21, -1.0, 0.17, 1, 0.0, 5.0, 1.0, 1.0, -1)         ShowSyncHudMsg(0, g_msg_sync, "Assassins vs Snipers Mode !!!")           // Play the starting sound         client_cmd(0, "spk ^"%s^"", g_play_sounds[ random_num(0, sizeof g_play_sounds -1) ] )           // Remove ambience task affects         remove_task( TASK_AMB )           // Set task to start ambience sounds         #if defined AMBIENCE_SOUNDS         set_task( 2.0, "start_ambience_sounds", TASK_AMB )         #endif     } }

7- Next we will check if our game mode was manually selected
if so, then start our game mode with out any checks.
Code:
// This is called when an admin selects a custom game mode public zp_game_mode_selected( gameid, id ) {     // Check if our game mode was called     if( gameid == g_gameid )         start_avs_mode( )       // Make the compiler happy again =)     return PLUGIN_CONTINUE }

8- Now lets create a function where our actual game mode is hidden
Code:
// This function contains the whole code behind this game mode start_avs_mode( ) {     // Create and initialize some important vars     static i_assassins, i_max_assassins, id, i_alive       // Get alive players     // This function will be discussed later in the tutorial     i_alive = fn_get_alive_players()     id = 0       // Get the no of players we have to turn into assassins     i_max_assassins = floatround( ( i_alive * get_pcvar_float( cvar_ratio ) ), floatround_ceil )     i_assassins = 0       // Randomly turn players into Assassins     while (i_assassins < i_max_assassins)     {         // Keep looping through all players         // As the while loop continues, 1 is added to the "id" variable so every single time the         // while loop completes a new player is selected for the task of making him into an assassin         // If the variable "id" has exceeded max players number than its value is reset 1 so we         // can loop through the players again         if ( (++id) > g_maxplayers) id = 1           // Dead         if ( !is_user_alive(id) )             continue;           // Random chance to convert players so we dont convert players with a smaller id         if (random_num(1, 5) == 1)         {             // Make user assassin             zp_make_user_assassin(id)               // Set his health             set_user_health( id, floatround(get_user_health(id) * get_pcvar_float(cvar_assahp)) )               // Increase counter             i_assassins++         }     }       // Turn the remaining players into snipers     for (id = 1; id <= g_maxplayers; id++)     {         // Only those of them who are alive and are not assassins         if ( !is_user_alive(id) || zp_get_user_assassin(id) )             continue;           // Turn into a sniper         zp_make_user_sniper(id)           // Set his health         set_user_health( id, floatround(get_user_health(id) * get_pcvar_float(cvar_sniperhp)) )     } }

9- Now i will display the code to start our ambience sound
i wont be explaning it more since i have commented it well.
Code:
#if defined AMBIENCE_SOUNDS public start_ambience_sounds( ) {     // Variables     static amb_sound[64], sound, Float:duration       // Select our ambience sound randomly     sound = random_num( 0, sizeof g_sound_ambience - 1 )       // Copy the string into the amb_sound variable     copy( amb_sound, sizeof amb_sound - 1 , g_sound_ambience[ sound ] )       // Get the duration for the ambience sound     duration = g_sound_ambience_duration[ sound ]       // Check whether it's a wav or mp3, then play it on clients     if ( equal( amb_sound[ strlen( amb_sound ) - 4 ], ".mp3" ) )         client_cmd( 0, "mp3 play ^"sound/%s^"", amb_sound )     else         client_cmd( 0, "spk ^"%s^"", sound )       // Start the ambience sounds again after the duration is completed     set_task( duration, "start_ambience_sounds", TASK_AMB ) } public zp_round_ended( winteam ) {     // Stop ambience sounds on round end     remove_task( TASK_AMB ) } #endif

10- Now we will transform a player into an assassin or a sniper after he respawns
We cant use Hamsandwich's spawn forward because it is not called for CZ bots and for CZ bots we need to register ham forwards seperately
which wil not only lengthen the tutorial but will also confuse beginners
so we will use ZPA's own spawn forward which i made specially for game modes:
Code:
// Player spawn post public zp_player_spawn_post( id, should_be_zombie ) {     // Check for current mode     if( zp_get_current_mode() == g_gameid )     {         // Check if the player was to be made a zombie         if( zp_get_user_zombie( id ))         {             // Make him an assassin instead             zp_make_user_assassin( id )               // Set his health             set_user_health( id, floatround(get_user_health(id) * get_pcvar_float(cvar_assahp)) )         }         else         {             // Make him a sniper             zp_make_user_sniper( id )               // Set his health             set_user_health( id, floatround(get_user_health(id) * get_pcvar_float(cvar_sniperhp)) )         }     } }
The first parameter of this forward is the index of the player who is spawning
if the second parameter is 1 then it means that the main plugin wanted the guy to be a zombie . If it is 0 than the player should be a human

11- The final step is to add a function to return the number of alive players
You can use this in your script to get no of alive players
Code:
// This function returns the no of alive players fn_get_alive_players( ) {     static i_alive, id     i_alive = 0       for ( id = 1; id <= g_maxplayers; id++ )     {         if ( is_user_alive ( id ) )             i_alive++     }     return i_alive; }

So finally in the end it will look like this:
PHP Code:
#include < amxmodx >
#include < fun >
#include < zombie_plague_advance >
 
/****************[ Customizations Section ]***************/
 
// This is the chance value according to which this game mode will be called
// The higher the value the lesser the chance of calling this game mode
new const g_chance 15
 
// This is the access flag required to start the game mode
// through the admin menu. Look in users.ini for more details
new const g_access_flag[] = "a"
 
// This is the sound which is played when the game mode is triggered
// Add as many as you want [Randomly chosen if more than one]
new const g_play_sounds[][] =
{
    
"zombie_plague/nemesis1.wav" ,
    
"zombie_plague/survivor1.wav"
}
 
// Comment the following line to disable ambience sounds
// Just add two slashes ( // )
#define AMBIENCE_SOUNDS
 
#if defined AMBIENCE_SOUNDS
// Ambience Sounds (only .wav and .mp3 formats supported)
// Add as many as you want [Randomly chosen if more than one]
new const g_sound_ambience[][] =

    
"zombie_plague/ambience.wav"
}
 
// Duration in seconds of each sound
new const Float:g_sound_ambience_duration[] = { 58.0 56.0 }
#endif
 
/****************[ Customizations End....!!! ]***************/
 
// Variables
new g_gameidg_maxplayerscvar_minplayerscvar_ratiocvar_sniperhpcvar_assahpg_msg_sync
 
// Ambience sounds task
#define TASK_AMB 3256
 
public plugin_init( )
{
    
// Plugin registeration.
    
register_plugin"[ZP] Example Game Mode","1.0""@bdul!" )
 
    
// Register some cvars
    // Edit these according to your liking
    
cvar_minplayers register_cvar("zp_avsm_minplayers""2")
    
cvar_sniperhp =   register_cvar("zp_avsm_sniper_hp""1.5")
    
cvar_assahp =   register_cvar("zp_avsm_assassin_hp""1.0")
    
cvar_ratio =    register_cvar("zp_avsm_inf_ratio""0.5")
 
    
// Get maxplayers
    
g_maxplayers get_maxplayers( )
 
    
// Hud stuff
    
g_msg_sync CreateHudSyncObj()
}
 
// Game modes MUST be registered in plugin precache ONLY
public plugin_precache( )
{
    
// Read the access flag
    
new access_flag read_flagsg_access_flag )
    new 
i
 
    
// Precache the play sounds
    
for (0sizeof g_play_soundsi++)
        
precache_soundg_play_sounds[i] )
 
    
// Precache the ambience sounds
    #if defined AMBIENCE_SOUNDS
    
new sound[100]
    for (
0sizeof g_sound_ambiencei++)
    {
        if (
equal(g_sound_ambience[i][strlen(g_sound_ambience[i])-4], ".mp3"))
        {
            
formatex(soundsizeof sound 1"sound/%s"g_sound_ambience[i])
            
precache_genericsound )
        }
        else
        {
            
precache_soundg_sound_ambience[i] )
        }
    }
    
#endif
 
    // Register our game mode
    
g_gameid zp_register_game_mode"Assassin vs Snipers Mode"access_flagg_chance0ZP_DM_BALANCE )
}
 
// Player spawn post
public zp_player_spawn_postidshould_be_zombie )
{
    
// Check for current mode
    
if( zp_get_current_mode() == g_gameid )
    {
        
// Check if the player was to be made a zombie
        
if( zp_get_user_zombieid ))
        {
            
// Make him an assassin instead
            
zp_make_user_assassinid )
 
            
// Set his health
            
set_user_healthidfloatround(get_user_health(id) * get_pcvar_float(cvar_assahp)) )
        }
        else
        {
            
// Make him a sniper
            
zp_make_user_sniperid )
 
            
// Set his health
            
set_user_healthidfloatround(get_user_health(id) * get_pcvar_float(cvar_sniperhp)) )
        }
    }
}
 
public 
zp_round_started_pregame )
{
    
// Check if it is our game mode
    
if( game == g_gameid )
    {
        
// Check for min players
        
if( fn_get_alive_players() < get_pcvar_num(cvar_minplayers) )
        {
            
/**
            * Note:
            * This very necessary, you should return ZP_PLUGIN_HANDLED if
            * some conditions required by your game mode are not met
            * This will inform the main plugin that you have rejected
            * the offer and so the main plugin will allow other game modes
            * to be given a chance
            */
            
return ZP_PLUGIN_HANDLED
        
}
        
// Start our new mode
        
start_avs_mode( )
    }
    
// Make the compiler happy =)
    
return PLUGIN_CONTINUE
}
 
public 
zp_round_startedgameid )
{
    
// Check if it is our game mode
    
if( game == g_gameid )
    {
        
// Show HUD notice
        
set_hudmessage(22115621, -1.00.1710.05.01.01.0, -1)
        
ShowSyncHudMsg(0g_msg_sync"Assassins vs Snipers Mode !!!")
 
        
// Play the starting sound
        
client_cmd(0"spk ^"%s^""g_play_soundsrandom_num(0sizeof g_play_sounds -1) ] )
 
        
// Remove ambience task affects
        
remove_taskTASK_AMB )
 
        
// Set task to start ambience sounds
        #if defined AMBIENCE_SOUNDS
        
set_task2.0"start_ambience_sounds"TASK_AMB )
        
#endif
    
}
}
 
public 
zp_game_mode_selectedgameidid )
{
    
// Check if our game mode was called
    
if( gameid == g_gameid )
        
start_avs_mode( )
 
    
// Make the compiler happy again =)
    
return PLUGIN_CONTINUE
}
 
// This function contains the whole code behind this game mode
start_avs_mode( )
{
    
// Create and initialize some important vars
    
static i_assassinsi_max_assassinsidi_alive
    i_alive 
fn_get_alive_players()
    
id 0
 
    
// Get the no of players we have to turn into assassins
    
i_max_assassins floatround( ( i_alive get_pcvar_floatcvar_ratio ) ), floatround_ceil )
    
i_assassins 0
 
    
// Randomly turn players into Assassins
    
while (i_assassins i_max_assassins)
    {
        
// Keep looping through all players
        
if ( (++id) > g_maxplayersid 1
 
        
// Dead
        
if ( !is_user_alive(id) )
            continue;
 
        
// Random chance
        
if (random_num(15) == 1)
        {
            
// Make user assassin
            
zp_make_user_assassin(id)
 
            
// Set his health
            
set_user_healthidfloatround(get_user_health(id) * get_pcvar_float(cvar_assahp)) )
 
            
// Increase counter
            
i_assassins++
        }
    }
 
    
// Turn the remaining players into snipers
    
for (id 1id <= g_maxplayersid++)
    {
        
// Only those of them who are alive and are not assassins
        
if ( !is_user_alive(id) || zp_get_user_assassin(id) )
            continue;
 
        
// Turn into a sniper
        
zp_make_user_sniper(id)
 
        
// Set his health
        
set_user_healthidfloatround(get_user_health(id) * get_pcvar_float(cvar_sniperhp)) )
    }
}
 
#if defined AMBIENCE_SOUNDS
public start_ambience_sounds( )
{
    
// Variables
    
static amb_sound[64], soundFloat:duration
 
    
// Select our ambience sound
    
sound random_num0sizeof g_sound_ambience )
    
copyamb_soundsizeof amb_sound g_sound_ambiencesound ] )
    
duration g_sound_ambience_durationsound ]
 
    
// Check whether it's a wav or mp3, then play it on clients
    
if ( equalamb_soundstrlenamb_sound ) - ], ".mp3" ) )
        
client_cmd0"mp3 play ^"sound/%s^""amb_sound )
    else
        
client_cmd0"spk ^"%s^""sound )
 
    
// Start the ambience sounds
    
set_taskduration"start_ambience_sounds"TASK_AMB )
}
 
public 
zp_round_endedwinteam )
{
    
// Stop ambience sounds on round end
    
remove_taskTASK_AMB )
}
#endif
 
// This function returns the no. of alive players
fn_get_alive_players( )
{
    static 
i_aliveid
    i_alive 
0
 
    
for ( id 1id <= g_maxplayersid++ )
    {
        if( 
is_user_aliveid ) )
            
i_alive++
    }
    return 
i_alive;


If you cant understand any thing or you need help with your game mode then PM me or post on this thread
__________________

My Plugins For ZP

Inactive due to College and Studies

Last edited by abdul-rehman; 09-11-2010 at 15:23.
abdul-rehman is offline
Send a message via Yahoo to abdul-rehman Send a message via Skype™ to abdul-rehman
Vechta
Veteran Member
Join Date: Jun 2010
Old 07-01-2010 , 11:04   Re: [TUT] How to create a custom game mode for ZPA
Reply With Quote #2

put this link into your zombie plague description^^

Last edited by Vechta; 07-01-2010 at 11:07. Reason: fail xD
Vechta is offline
abdul-rehman
Veteran Member
Join Date: Jan 2010
Location: Khi, Pakistan
Old 07-01-2010 , 11:04   Re: [TUT] How to create a custom game mode for ZPA
Reply With Quote #3

Quote:
Originally Posted by Vechta View Post
put this link into your zombie plague discription^^
ok..
__________________

My Plugins For ZP

Inactive due to College and Studies
abdul-rehman is offline
Send a message via Yahoo to abdul-rehman Send a message via Skype™ to abdul-rehman
Old 07-07-2010, 02:40
abdul-rehman
This message has been deleted by YamiKaitou. Reason: no bump
Old 07-07-2010, 11:20
abdul-rehman
This message has been deleted by YamiKaitou. Reason: no bump
Old 07-14-2010, 11:46
abdul-rehman
This message has been deleted by Emp`. Reason: ohai imakat
Old 07-14-2010, 15:26
Alka
This message has been deleted by Emp`. Reason: ohai imakat
Old 07-14-2010, 17:33
meTaLiCroSS
This message has been deleted by Emp`. Reason: ohai imakat
Old 07-14-2010, 18:03
abdul-rehman
This message has been deleted by Emp`. Reason: ohai imakat
Old 07-14-2010, 19:00
meTaLiCroSS
This message has been deleted by Emp`. Reason: ohai imakat
Old 07-14-2010, 19:38
vaan123
This message has been deleted by Emp`. Reason: ohai imakat
Old 07-14-2010, 19:43
DarkGod
This message has been deleted by Emp`. Reason: ohai imakat
Old 07-15-2010, 08:45
abdul-rehman
This message has been deleted by YamiKaitou. Reason: ohai imnotakat
Muhaymin
Junior Member
Join Date: Jun 2012
Old 06-03-2012 , 04:25   Re: [TUT] How to create a custom game mode for ZPA
Reply With Quote #4

I Cant Understand
Muhaymin is offline
Brian_Chino77
Senior Member
Join Date: Mar 2014
Location: dunno
Old 04-19-2014 , 01:17   Re: [TUT] How to create a custom game mode for ZPA
Reply With Quote #5

Hmmmm.. Can u tell me how to make like plague mode.. There's 1 surv and human also 1 nemesis with the zombie... I want to add the assasin and the sniper.. So the human force has sniper... And zombie force has the assasin...
Can you help me?
Brian_Chino77 is offline
Azeddine
Member
Join Date: Jul 2017
Location: ML_NOTFOUND
Old 07-27-2017 , 11:32   Re: [TUT] How to create a custom game mode for ZPA
Reply With Quote #6

Hello Dead,
Thank you, Good Job,
i want him in furien if you want!
thanks.
Azeddine is offline
kristi
Senior Member
Join Date: Nov 2016
Old 07-27-2017 , 16:01   Re: [TUT] How to create a custom game mode for ZPA
Reply With Quote #7

Quote:
Originally Posted by Azeddine View Post
Hello Dead,
Thank you, Good Job,
i want him in furien if you want!
thanks.
here
kristi is offline
Send a message via Skype™ to kristi
shehzad1234
BANNED
Join Date: Jan 2016
Location: https://t.me/pump_upp
Old 07-28-2017 , 05:57   Re: [TUT] How to create a custom game mode for ZPA
Reply With Quote #8

Nice and now MML.
shehzad1234 is offline
Send a message via ICQ to shehzad1234 Send a message via AIM to shehzad1234 Send a message via Yahoo to shehzad1234
Reply


Thread Tools
Display Modes

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 10:30.


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