View Single Post
+ARUKARI-
AlliedModders Donor
Join Date: Jul 2004
Location: Japan
Old 05-14-2020 , 06:08   Re: Mines Platform (Lasermine/Tripmine/Claymore)
Reply With Quote #6

Custom Mines Tutorial
Exampble Lasermine.
0. Use this Native Functions.
PHP Code:
// These two are used to register land mines.
native register_mines                (classname[MAX_CLASS_LENGTH], langKey[MAX_NAME_LENGTH]);
native register_mines_data            (iMinesIdminesData[COMMON_MINES_DATA], minesModel[MAX_MODEL_LENGTH]);

// If you want to deploy or pick up in each mines logic, call these.
// Normally it is not used because it is processed by core.
native mines_progress_deploy        (idiMinesId);
native mines_progress_pickup        (idiMinesId);
native mines_progress_stop            (id);

// Call these if you want to make a purchase for each mine logic.
// Normally it is not used because it is processed by core.
native mines_buy                    (idiMinesId);

// Explosion.
native mines_explosion                (idiMinesIdiEnt);

// is valid take damage?
native mines_valid_takedamage        (iAttackeriTarget);

// Set Multi Language file.
native mines_register_dictionary    (path[]);
// Set Custom Resources.
native mines_resources                (iMinesIdkey[], value[], sizedef[]);

// Deployed Mines, Set Any Settings.
forward mines_entity_spawn_settings    (iEntuIDiMinesId);
// Deployed Mines, Set Position Settings.
forward mines_entity_set_position    (iEntuIDiMinesId);

// client_putinserver
forward mines_client_putinserver    (id);
// client_disconnected
forward mines_client_disconnected    (id);
// plugins_end
forward mines_plugin_end            ();
// Remove Mines.
forward mines_remove_entity            (iEnt);

// Check Logic.
// check for deploy.
forward CheckForDeploy                (idiMinesId);
// check for pickup.
forward CheckForPickup                (idiMinesId);
// check for buy.
forward CheckForBuy                    (idiMinesId);

forward MinesPickup                    (idiMinesIdtarget);
// Think Event Logic.
forward MinesThink                    (iEntiMinesId);
// Mines Breaked Logic.
// If take some action if the mine breaks?
forward MinesBreaked                (iMinesIdiEntiAttacker); 
1. Include natives.
PHP Code:
#include <mines_natives> 
2. Register Mines
PHP Code:
// Save This Mines ID
new gMinesId;

public 
plugin_precache() 
{
    
// Regstring.
    
gMinesId register_mines("lasermine""LM_LANG_KEY_LONGNAME");

    
// This under the logic if use custom resources.
    // Read mines_resources.ini [clasname section]
    
mines_resources(gMinesId"ENT_SOUND1",  gResources[SOUND1],  charsmax(gResources[SOUND1]),  ENT_SOUND1);
    
mines_resources(gMinesId"ENT_SOUND2",  gResources[SOUND2],  charsmax(gResources[SOUND2]),  ENT_SOUND2);
    
mines_resources(gMinesId"ENT_SOUND3",  gResources[SOUND3],  charsmax(gResources[SOUND3]),  ENT_SOUND3);
    
mines_resources(gMinesId"ENT_SOUND4",  gResources[SOUND4],  charsmax(gResources[SOUND4]),  ENT_SOUND4);
    
mines_resources(gMinesId"ENT_SOUND5",  gResources[SOUND5],  charsmax(gResources[SOUND5]),  ENT_SOUND5);
    
mines_resources(gMinesId"ENT_SOUND6",  gResources[SOUND6],  charsmax(gResources[SOUND6]),  ENT_SOUND6);
    
mines_resources(gMinesId"ENT_MODELS",  gResources[MODELS],  charsmax(gResources[MODELS]),  ENT_MODELS);
    
mines_resources(gMinesId"ENT_SPRITE1"gResources[SPRITE1], charsmax(gResources[SPRITE1]), ENT_SPRITE1);

    
precache_sound(gResources[SOUND1]);
    
precache_sound(gResources[SOUND2]);
    
precache_sound(gResources[SOUND3]);
    
precache_sound(gResources[SOUND4]);
    
precache_sound(gResources[SOUND5]);
    
precache_sound(gResources[SOUND6]);
    
precache_model(gResources[MODELS]);
    
gBeam precache_model(gResources[SPRITE1]);

3. Common Mines Settings
Set the values in this structure respectively.
PHP Code:
enum _:COMMON_MINES_DATA
{
    
// Round start have ammo count.
    
AMMO_HAVE_START        ,

    
// Max having ammo.
    
AMMO_HAVE_MAX        ,

    
// Max deployed in team.
    
NO_ROUND            ,

    
// Max deployed in user.
    
DEPLOY_MAX            ,

    
// Max deployed in team.
    
DEPLOY_TEAM_MAX        ,

    
// Buy mode. 0 = off, 1 = on.
    
BUY_MODE            ,

    
// Buy Price.
    
BUY_PRICE            ,

    
// Stay in buy zone can buy.
    
BUY_ZONE            ,

    
// Can buy team.
    
CsTeams:BUY_TEAM    ,

    
// Get money.
    
FRAG_MONEY            ,

    
// Can broken Mines.(0 = mines, 1 = Team, 2 = Enemy, 3 = Enemy Only.)
    
MINES_BROKEN        ,
    
// allow pickup mine. (0 = disable, 1 = it's mine, 2 = allow friendly mine, 3 = allow enemy mine!)
    
ALLOW_PICKUP        ,

    
// Dead Player remove lasermine. 0 = off, 1 = on.
    
DEATH_REMOVE        ,

    
// mines glowing. 0 = off, 1 = on.
    
GLOW_ENABLE            ,
    
// Mine glow coloer 0 = team color, 1 = green.
    
GLOW_MODE            ,
    
// Team-Color for Terrorist. (bit)
    
GLOW_COLOR_TR        ,
    
// Team-Color for Counter-Terrorist. default:blue (R,G,B)
    
GLOW_COLOR_CT        ,

    
// Waiting for deploy mines. (int:seconds. 0 = no progress bar.)
    
Float:ACTIVATE_TIME    ,

    
// mines Health.
    
Float:MINE_HEALTH    ,
    
// Explosion radius.
    
Float:EXPLODE_RADIUS,
    
// Explosion radius damage.
    
Float:EXPLODE_DAMAGE,

    
// [gboom] = precache_model(explosion sprite);
    
EXPLODE_SPRITE1        ,
    
EXPLODE_SPRITE2        ,
    
EXPLODE_SPRITE_BLAST    ,
    
EXPLODE_SPRITE_SMOKE    ,
    
EXPLODE_SPRITE_WATER    ,
    
EXPLODE_SPRITE_BUBBLE

PHP Code:
// Global Variables
new gMinesData[COMMON_MINES_DATA];
public 
plugin_init()
{
    
// cvar settings...
    //

    // Commons Data
    
bind_pcvar_num        (gCvar[CVAR_START_HAVE],         gCvarValue[VL_START_HAVE]);
    
bind_pcvar_num        (gCvar[CVAR_MAX_HAVE],             gCvarValue[VL_MAX_HAVE]);
#if defined BIOHAZARD_SUPPORT
    
bind_pcvar_num        (gCvar[CVAR_NOROUND],             gCvarValue[VL_NOROUND]);
#endif
    
bind_pcvar_num        (gCvar[CVAR_MAX_DEPLOY],        gCvarValue[VL_MAX_DEPLOY]);
    
bind_pcvar_num        (gCvar[CVAR_TEAM_MAX],            gCvarValue[VL_TEAM_MAX]);
    
bind_pcvar_num        (gCvar[CVAR_BUY_MODE],            gCvarValue[VL_BUY_MODE]);
    
bind_pcvar_num        (gCvar[CVAR_BUY_ZONE],            gCvarValue[VL_BUY_ZONE]);
    
bind_pcvar_num        (gCvar[CVAR_COST],                gCvarValue[VL_COST]);
    
bind_pcvar_num        (gCvar[CVAR_FRAG_MONEY],        gCvarValue[VL_FRAG_MONEY]);
    
bind_pcvar_num        (gCvar[CVAR_MINE_BROKEN],        gCvarValue[VL_MINE_BROKEN]);
    
bind_pcvar_num        (gCvar[CVAR_ALLOW_PICKUP],        gCvarValue[VL_ALLOW_PICKUP]);
    
bind_pcvar_num        (gCvar[CVAR_DEATH_REMOVE],        gCvarValue[VL_DEATH_REMOVE]);
    
bind_pcvar_num        (gCvar[CVAR_MINE_GLOW],            gCvarValue[VL_MINE_GLOW]);
    
bind_pcvar_num        (gCvar[CVAR_MINE_GLOW_MODE],     gCvarValue[VL_MINE_GLOW_MODE]);
    
bind_pcvar_float    (gCvar[CVAR_MINE_HEALTH],         gCvarValue[VL_MINE_HEALTH]);
    
bind_pcvar_float    (gCvar[CVAR_LASER_ACTIVATE],    gCvarValue[VL_LASER_ACTIVATE]);
    
bind_pcvar_float    (gCvar[CVAR_EXPLODE_RADIUS],    gCvarValue[VL_EXPLODE_RADIUS]);
    
bind_pcvar_float    (gCvar[CVAR_EXPLODE_DMG],        gCvarValue[VL_EXPLODE_DMG]);
    
bind_pcvar_string    (gCvar[CVAR_CBT],                 gCvarValue[VL_CBT],             charsmax(gCvarValue[VL_CBT]));
    
bind_pcvar_string    (gCvar[CVAR_MINE_GLOW_TR],        gCvarValue[VL_MINE_GLOW_TR],     charsmax(gCvarValue[VL_MINE_GLOW_TR]) - 1);// last comma - 1
    
bind_pcvar_string    (gCvar[CVAR_MINE_GLOW_CT],        gCvarValue[VL_MINE_GLOW_CT],     charsmax(gCvarValue[VL_MINE_GLOW_CT]) - 1);// last comma - 1

    // Original Data
    
bind_pcvar_num        (gCvar[CVAR_LASER_VISIBLE],         gCvarValue[VL_LASER_VISIBLE]);       // Laser line Visiblity. 0 = off, 1 = on.
    
bind_pcvar_num        (gCvar[CVAR_LASER_BRIGHT],         gCvarValue[VL_LASER_BRIGHT]);       // Laser line brightness.
    
bind_pcvar_num        (gCvar[CVAR_LASER_WIDTH],         gCvarValue[VL_LASER_WIDTH]);        // Laser line width.
    
bind_pcvar_num        (gCvar[CVAR_LASER_COLOR],         gCvarValue[VL_LASER_COLOR]);           // Laser line color. 0 = team color, 1 = green
    
bind_pcvar_num        (gCvar[CVAR_LASER_DMG_MODE],     gCvarValue[VL_LASER_DMG_MODE]);       // Laser line damage mode. 0 = frame rate dmg, 1 = once dmg, 2 = 1second dmg.
    
bind_pcvar_num        (gCvar[CVAR_DIFENCE_SHIELD],     gCvarValue[VL_DIFENCE_SHIELD]);        // Shield hit.
    
bind_pcvar_num        (gCvar[CVAR_REALISTIC_DETAIL],     gCvarValue[VL_REALISTIC_DETAIL]);    // Spark Effect.
    
bind_pcvar_float    (gCvar[CVAR_LASER_DMG],         gCvarValue[VL_LASER_DMG]);            // Laser hit Damage.
    
bind_pcvar_float    (gCvar[CVAR_LASER_DMG_DPS],     gCvarValue[VL_LASER_DMG_DPS]);       // Laser line damage mode 2 only, damage/seconds. default 1 (sec)
    
bind_pcvar_float    (gCvar[CVAR_LASER_RANGE],         gCvarValue[VL_LASER_RANGE]);        // Laserbeam range.
    
bind_pcvar_string    (gCvar[CVAR_LASER_COLOR_TR],     gCvarValue[VL_LASER_COLOR_TR],    charsmax(gCvarValue[VL_LASER_COLOR_TR]));      // Laser line color. 0 = team color, 1 = green
    
bind_pcvar_string    (gCvar[CVAR_LASER_COLOR_CT],     gCvarValue[VL_LASER_COLOR_CT],    charsmax(gCvarValue[VL_LASER_COLOR_CT]));      // Laser line color. 0 = team color, 1 = green

    // Commons Data Setting
    
gMinesData[BUY_TEAM]            =    get_team_code(gCvarValue[VL_CBT]);
    
gMinesData[GLOW_COLOR_TR]        =    get_cvar_to_color(gCvarValue[VL_MINE_GLOW_TR]);
    
gMinesData[GLOW_COLOR_CT]        =    get_cvar_to_color(gCvarValue[VL_MINE_GLOW_CT]);

    
gMinesData[AMMO_HAVE_START]        =    gCvarValue[VL_START_HAVE];
    
gMinesData[AMMO_HAVE_MAX]        =    gCvarValue[VL_MAX_HAVE];
#if defined BIOHAZARD_SUPPORT
    
gMinesData[NO_ROUND]            =    gCvarValue[VL_NOROUND];
#endif
    
gMinesData[DEPLOY_MAX]            =    gCvarValue[VL_MAX_DEPLOY];
    
gMinesData[DEPLOY_TEAM_MAX]        =    gCvarValue[VL_TEAM_MAX];
    
gMinesData[BUY_MODE]            =    gCvarValue[VL_BUY_MODE];
    
gMinesData[BUY_ZONE]            =    gCvarValue[VL_BUY_ZONE];
    
gMinesData[BUY_PRICE]            =    gCvarValue[VL_COST];
    
gMinesData[FRAG_MONEY]            =    gCvarValue[VL_FRAG_MONEY];
    
gMinesData[MINES_BROKEN]        =    gCvarValue[VL_MINE_BROKEN];
    
gMinesData[ALLOW_PICKUP]        =    gCvarValue[VL_ALLOW_PICKUP];
    
gMinesData[DEATH_REMOVE]        =    gCvarValue[VL_DEATH_REMOVE];
    
gMinesData[GLOW_ENABLE]            =    gCvarValue[VL_MINE_GLOW];
    
gMinesData[GLOW_MODE]            =    gCvarValue[VL_MINE_GLOW_MODE];
    
gMinesData[MINE_HEALTH]            =    gCvarValue[VL_MINE_HEALTH];
    
gMinesData[ACTIVATE_TIME]        =    gCvarValue[VL_LASER_ACTIVATE];
    
gMinesData[EXPLODE_RADIUS]        =    gCvarValue[VL_EXPLODE_RADIUS];
    
gMinesData[EXPLODE_DAMAGE]        =    gCvarValue[VL_EXPLODE_DMG];

    
// commons data update.
    // parameter: this mines id, common mines data, model path.
    
register_mines_data(gMinesIdgMinesDatagResources[MODELS]);

4. Check Deploying Logic.
PHP Code:
public CheckForDeploy(idiMinesId)
{
    
// Other Mines?
    
if(iMinesId != gMinesId) return false;

    new 
Float:vTraceEnd    [3];
    new 
Float:vOrigin    [3],Float:vViewOfs[3];

    
// Get potision.
    
pev(idpev_origin,     vOrigin);
    
pev(idpev_view_ofs,     vViewOfs);
    
xs_vec_add(vOriginvViewOfsvOrigin);      

    
// Get wall position.
    
velocity_by_aim(id128vTraceEnd);
    
xs_vec_add(vTraceEndvOriginvTraceEnd);

    
// create the trace handle.
    
new trace create_tr2();
    new 
Float:fFraction 0.0;
    
engfunc(EngFunc_TraceLinevOriginvTraceEndIGNORE_MONSTERSidtrace);
    {
        
get_tr2traceTR_flFractionfFraction );
    }
    
// free the trace handle.
    
free_tr2(trace);

    
// We hit something!
    
if ( fFraction 1.0 )
        return 
true;

    new 
sLongName[MAX_NAME_LENGTH];
    
formatex(sLongNamecharsmax(sLongName), "%L"idLANG_KEY_LONGNAME);
    
client_print_color(idid"%L"idLANG_KEY_PLANT_WALLCHAT_TAGsLongName);

    return 
false;

5. Deployed Mine setting.
PHP Code:
// Native Forward function.
public mines_entity_spawn_settings(iEntuIDiMinesId)
{
    
// if other mines return.
    
if (iMinesId != gMinesId) return;

    
// Entity Setting.
    // set class name.
    
set_pev(iEntpev_classnameENT_CLASS_LASER);
    
// set models.
    
engfunc(EngFunc_SetModeliEntgResources[MODELS]);
    
// set solid.
    
set_pev(iEntpev_solidSOLID_NOT);
    
// set movetype.
    
set_pev(iEntpev_movetypeMOVETYPE_FLY);

    
// set model animation.
    
set_pev(iEntpev_frame,        0);
    
set_pev(iEntpev_framerate,    0.0);
    
set_pev(iEntpev_body,         3);
    
set_pev(iEntpev_sequence,     TRIPMINE_WORLD);
    
set_pev(iEntpev_rendermode,    kRenderNormal);
    
set_pev(iEntpev_renderfx,         kRenderFxNone);
    
// .......
    // Position, sound, think etc...

6. Think Event Logic.
PHP Code:
// Native Forward function.
public MinesThink(iEntiMinesId)
{
    if (!
pev_valid(iEnt))
        return;

    
// is this lasermine? no.
    
if (iMinesId != gMinesId)
        return;

    
// Think Status/Step.

    
static Float:fCurrTime;
    static 
Float:vEnd[3];
    static 
step;

    
fCurrTime get_gametime();
    
step pev(iEntMINES_STEP);
    
// Get Laser line end potision.
    
pev(iEntLASERMINE_BEAMENDPOINT1vEnd);

    
// lasermine state.
    // Power up.
    
switch(step)
    {
        case 
POWERUP_THINK:
        {
            
mines_step_powerup(iEntfCurrTime);
        }
        case 
BEAMUP_THINK:
        {
            
mines_step_beamup(iEntvEndfCurrTime);
        }
        
// Laser line activated.
        
case BEAMBREAK_THINK:
        {
            
mines_step_beambreak(iEntvEndfCurrTime);
        }
        
// EXPLODE
        
case EXPLOSE_THINK:
        {
            
// Stopping sound.
            
lm_play_sound(iEntSOUND_STOP);

            
// effect explosion.
            
mines_explosion(pev(iEntMINES_OWNER), iMinesIdiEnt);
        }
    }

    return;

7. MinesBrakedLogic.
If take some action if the mine breaks?
PHP Code:
// Native Forward function.
public MinesBreaked(iMinesIdiEntiAttacker)
{
    if (
iMinesId != gMinesId
        return 
HAM_IGNORED;

    
// Action Code....

    
return HAM_IGNORED;

__________________
GitHub
SteamWishlist

六四天安門事件

Last edited by +ARUKARI-; 08-15-2020 at 06:01.
+ARUKARI- is offline