AlliedModders Donor
Join Date: Jul 2004
Location: Japan
|
05-14-2020
, 06:08
Re: Mines Platform (Lasermine/Tripmine/Claymore)
|
#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 (iMinesId, minesData[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 (id, iMinesId);
native mines_progress_pickup (id, iMinesId);
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 (id, iMinesId);
// Explosion.
native mines_explosion (id, iMinesId, iEnt);
// is valid take damage?
native mines_valid_takedamage (iAttacker, iTarget);
// Set Multi Language file.
native mines_register_dictionary (path[]);
// Set Custom Resources.
native mines_resources (iMinesId, key[], value[], size, def[]);
// Deployed Mines, Set Any Settings.
forward mines_entity_spawn_settings (iEnt, uID, iMinesId);
// Deployed Mines, Set Position Settings.
forward mines_entity_set_position (iEnt, uID, iMinesId);
// 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 (id, iMinesId);
// check for pickup.
forward CheckForPickup (id, iMinesId);
// check for buy.
forward CheckForBuy (id, iMinesId);
forward MinesPickup (id, iMinesId, target);
// Think Event Logic.
forward MinesThink (iEnt, iMinesId);
// Mines Breaked Logic.
// If take some action if the mine breaks?
forward MinesBreaked (iMinesId, iEnt, iAttacker);
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(gMinesId, gMinesData, gResources[MODELS]);
}
4. Check Deploying Logic.
PHP Code:
public CheckForDeploy(id, iMinesId)
{
// Other Mines?
if(iMinesId != gMinesId) return false;
new Float:vTraceEnd [3];
new Float:vOrigin [3],Float:vViewOfs[3];
// Get potision.
pev(id, pev_origin, vOrigin);
pev(id, pev_view_ofs, vViewOfs);
xs_vec_add(vOrigin, vViewOfs, vOrigin);
// Get wall position.
velocity_by_aim(id, 128, vTraceEnd);
xs_vec_add(vTraceEnd, vOrigin, vTraceEnd);
// create the trace handle.
new trace = create_tr2();
new Float:fFraction = 0.0;
engfunc(EngFunc_TraceLine, vOrigin, vTraceEnd, IGNORE_MONSTERS, id, trace);
{
get_tr2( trace, TR_flFraction, fFraction );
}
// free the trace handle.
free_tr2(trace);
// We hit something!
if ( fFraction < 1.0 )
return true;
new sLongName[MAX_NAME_LENGTH];
formatex(sLongName, charsmax(sLongName), "%L", id, LANG_KEY_LONGNAME);
client_print_color(id, id, "%L", id, LANG_KEY_PLANT_WALL, CHAT_TAG, sLongName);
return false;
}
5. Deployed Mine setting.
PHP Code:
// Native Forward function.
public mines_entity_spawn_settings(iEnt, uID, iMinesId)
{
// if other mines return.
if (iMinesId != gMinesId) return;
// Entity Setting.
// set class name.
set_pev(iEnt, pev_classname, ENT_CLASS_LASER);
// set models.
engfunc(EngFunc_SetModel, iEnt, gResources[MODELS]);
// set solid.
set_pev(iEnt, pev_solid, SOLID_NOT);
// set movetype.
set_pev(iEnt, pev_movetype, MOVETYPE_FLY);
// set model animation.
set_pev(iEnt, pev_frame, 0);
set_pev(iEnt, pev_framerate, 0.0);
set_pev(iEnt, pev_body, 3);
set_pev(iEnt, pev_sequence, TRIPMINE_WORLD);
set_pev(iEnt, pev_rendermode, kRenderNormal);
set_pev(iEnt, pev_renderfx, kRenderFxNone);
// .......
// Position, sound, think etc...
}
6. Think Event Logic.
PHP Code:
// Native Forward function.
public MinesThink(iEnt, iMinesId)
{
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(iEnt, MINES_STEP);
// Get Laser line end potision.
pev(iEnt, LASERMINE_BEAMENDPOINT1, vEnd);
// lasermine state.
// Power up.
switch(step)
{
case POWERUP_THINK:
{
mines_step_powerup(iEnt, fCurrTime);
}
case BEAMUP_THINK:
{
mines_step_beamup(iEnt, vEnd, fCurrTime);
}
// Laser line activated.
case BEAMBREAK_THINK:
{
mines_step_beambreak(iEnt, vEnd, fCurrTime);
}
// EXPLODE
case EXPLOSE_THINK:
{
// Stopping sound.
lm_play_sound(iEnt, SOUND_STOP);
// effect explosion.
mines_explosion(pev(iEnt, MINES_OWNER), iMinesId, iEnt);
}
}
return;
}
7. MinesBrakedLogic.
If take some action if the mine breaks?
PHP Code:
// Native Forward function.
public MinesBreaked(iMinesId, iEnt, iAttacker)
{
if (iMinesId != gMinesId)
return HAM_IGNORED;
// Action Code....
return HAM_IGNORED;
}
__________________
Last edited by +ARUKARI-; 08-15-2020 at 06:01.
|
|