Raised This Month: $ Target: $400
 0% 

Lasermines pushing players ... Vectors


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Elitcky
AlliedModders Donor
Join Date: Jun 2016
Location: Antofagasta, Chile
Old 05-13-2020 , 20:48   Lasermines pushing players ... Vectors
Reply With Quote #1

The Lasermine actually starts pushing everyone when its like deploying... idk is there an action to do that or what ?


PHP Code:
#pragma semicolon 1

#include <sdktools>
#include <sdkhooks>
#include <lasermines>
#include <csgocolors>

#define PLUGIN_NAME        "[CS:GO] Lasermines"
#define PLUGIN_VERSION    "1.5.2"

#define MDL_LASER        "materials/sprites/purplelaser1.vmt"
#define MDL_MINE        "models/lasermine/lasermine.mdl"

#define SND_MINEPUT        "npc/roller/blade_cut.wav"
#define SND_MINEACT        "npc/roller/mine/rmine_blades_in2.wav"
#define SND_BUYMINE        "items/itempickup.wav"
#define SND_CANTBUY        "buttons/weapon_cant_buy.wav"

new i_enable,
    
bool:b_message,
    
i_amount,
    
i_maxamount,
    
bool:b_purge,
    
i_damage,
    
i_explode_damage,
    
i_explode_radius,
    
i_health,
    
String:s_color_t[16],
    
String:s_color_ct[16],
    
Float:f_activate_time,
    
bool:b_use_buy_mode,
    
bool:b_should_buy_zone,
    
bool:b_pickup,
    
bool:b_friendly_pickup,
    
bool:b_enemy_pickup,
    
i_price,
    
String:s_wpn_dmg[16],
    
bool:b_lm_hs,
    
bool:b_friendlyfire;

new 
Handle:h_fwdOnPlantLasermine,
    
Handle:h_fwdOnLaserminePlanted,
    
Handle:h_fwdOnPreHitByLasermine,
    
Handle:h_fwdOnPostHitByLasermine,
    
Handle:h_fwdOnPreBuyLasermine,
    
Handle:h_fwdOnPostBuyLasermine,
    
Handle:h_fwdOnPrePickupLasermine,
    
Handle:h_fwdOnPostPickupLasermine;

new 
i_clients_amount[MAXPLAYERS+1],
    
i_clients_myamount[MAXPLAYERS+1],
    
i_clients_maxlimit[MAXPLAYERS+1],
    
b_used_by_native[MAXPLAYERS+1],
    
i_buy_limit[MAXPLAYERS+1];

new 
gInBuyZone = -1,
    
gAccount = -1;

public 
Plugin:myinfo 
{
    
name        PLUGIN_NAME,
    
author        "FrozDark (rewrited by Grey83)",
    
description    "Plants a laser mines in the CS:GO",
    
version        PLUGIN_VERSION,
    
url            "https://steamcommunity.com/groups/grey83ds"
};

new 
bool:b_late;

public 
APLRes:AskPluginLoad2(Handle:myselfbool:lateString:error[], err_max)
{
    
CreateNative("AddClientLasermines"Native_AddMines);
    
CreateNative("SetClientLasermines"Native_SetMines);
    
CreateNative("SubClientLasermines"Native_SubstractMines);
    
CreateNative("GetClientLasermines"Native_GetMines);
    
CreateNative("PlantClientLasermine"Native_PlantMine);
    
CreateNative("ClearMapClientLasermines"Native_ClearMapMines);
    
CreateNative("IsEntityLasermine"Native_IsLasermine);
    
CreateNative("GetClientByLasermine"Native_GetClientByLasermine);
    
CreateNative("SetClientMaxLasermines"Native_SetClientMaxLasermines);
    
CreateNative("ResetClientMaxLasermines"Native_ResetClientMaxLasermines);
    
CreateNative("GetBeamByLasermine"Native_GetBeamByLasermine);
    
CreateNative("GetLasermineByBeam"Native_GetLasermineByBeam);

    
h_fwdOnPlantLasermine        CreateGlobalForward("OnPlantLasermine",        ET_Hook,    Param_Cell,    Param_FloatByRef,    Param_CellByRef,    Param_CellByRef,    Param_CellByRef,    Param_Array);
    
h_fwdOnLaserminePlanted        CreateGlobalForward("OnLaserminePlanted",        ET_Ignore,    Param_Cell,    Param_Cell,            Param_Float,        Param_Cell,            Param_Cell,            Param_Cell,        Param_Array);

    
h_fwdOnPreHitByLasermine    CreateGlobalForward("OnPreHitByLasermine",    ET_Hook,    Param_Cell,    Param_CellByRef,    Param_CellByRef,    Param_CellByRef,    Param_CellByRef);
    
h_fwdOnPostHitByLasermine    CreateGlobalForward("OnPostHitByLasermine",    ET_Ignore,    Param_Cell,    Param_Cell,            Param_Cell,            Param_Cell,            Param_Cell);

    
h_fwdOnPreBuyLasermine        CreateGlobalForward("OnPreBuyLasermine",        ET_Hook,    Param_Cell,    Param_CellByRef,    Param_CellByRef);
    
h_fwdOnPostBuyLasermine        CreateGlobalForward("OnPostBuyLasermine",        ET_Ignore,    Param_Cell,    Param_Cell,            Param_Cell);

    
h_fwdOnPrePickupLasermine    CreateGlobalForward("OnPrePickupLasermine",    ET_Event,    Param_Cell,    Param_Cell,            Param_Cell);
    
h_fwdOnPostPickupLasermine    CreateGlobalForward("OnPostPickupLasermine",    ET_Ignore,    Param_Cell,    Param_Cell,            Param_Cell);

    
RegPluginLibrary("lasermines");

    
b_late late;

    return 
APLRes_Success;
}

public 
OnPluginStart()
{
    if(
GetEngineVersion() != Engine_CSGO)
        
SetFailState("This plugin for the CS:GO only!");

    if((
gInBuyZone FindSendPropInfo("CCSPlayer""m_bInBuyZone")) == -1)
        
SetFailState("Could not find offset \"m_bInBuyZone\"");
    if((
gAccount FindSendPropInfo("CCSPlayer""m_iAccount")) == -1)
        
SetFailState("Could not find offset \"m_iAccount\"");

    
CreateConVar("csgo_lasermines_version"PLUGIN_VERSIONPLUGIN_NAMEFCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);

    new 
Handle:CVar;
    
HookConVarChange((CVar CreateConVar("sm_lasermines_enable""1""0 - disabled, 1 - enabled for all teams, 2 - only for Terrorists, 3 - only for Counter-terrorists"FCVAR_NOTIFYtrue_true3.0)), CVarChanged_Enable);
    
i_enable GetConVarInt(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_welcome_message""0""Show Plugin Message at the beginning of each round."_true_true1.0)), CVarChanged_Msg);
    
b_message GetConVarBool(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_amount""3""The amount to give laser mines to a player each spawn (if buy mode is disabled, -1 = Infinity)"_true, -1.0)), CVarChanged_Amt);
    
i_amount GetConVarInt(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_maxamount""3""The maximum amount of laser mines a player can carry. (0-Unlimited)"_true_true1024.0)), CVarChanged_MaxAmt);
    
i_maxamount GetConVarInt(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_death_purge""0""Remove mines after the death of their owner."_true_true1.0)), CVarChanged_Purge);
    
b_purge GetConVarBool(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_damage""500""The damage to deal to a player by the laser"_true1.0true100000.0)), CVarChanged_Dmg);
    
i_damage GetConVarInt(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_explode_damage""80""The damage to deal to a player when a laser mine breaks"_true_true100000.0)), CVarChanged_Explode);
    
i_explode_damage GetConVarInt(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_explode_radius""250""The radius of the explosion"_true1.0true100000.0)), CVarChanged_Radius);
    
i_explode_radius GetConVarInt(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_health""150""The laser mines health. 0 = never breaked"_true_true100000.0)), CVarChanged_HP);
    
i_health GetConVarInt(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_activatetime""2""The delay of laser mines' activation"_true_true10.0)), CVarChanged_Time);
    
f_activate_time GetConVarFloat(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_buymode""0""Enables buy mode. In this mode you will have to buy mines"FCVAR_NOTIFYtrue_true1.0)), CVarChanged_Mode);
    
b_use_buy_mode GetConVarBool(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_buyzone""1""Whether a player have to stay in buy zone to buy mines"FCVAR_NOTIFYtrue_true1.0)), CVarChanged_Zone);
    
b_should_buy_zone GetConVarBool(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_price""0""The price of the laser mines"FCVAR_NOTIFYtrue)), CVarChanged_Price);
    
i_price GetConVarInt(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_color_t""255 0 0""Terrorist's color. Set by RGB"FCVAR_PRINTABLEONLY)), CVarChanged_TColor);
    
GetConVarString(CVars_color_tsizeof(s_color_t));

    
HookConVarChange((CVar CreateConVar("sm_lasermines_color_ct""0 0 255""Counter-Terrorist's color. Set by RGB"FCVAR_PRINTABLEONLY)), CVarChanged_CtColor);
    
GetConVarString(CVars_color_ctsizeof(s_color_ct));

    
HookConVarChange((CVar CreateConVar("sm_lasermines_allow_pickup""1""Allow players to pickup their planted lasermines"_true0.0true1.0)), CVarChanged_PickUp);
    
b_pickup GetConVarBool(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_allow_friendly_pickup""0""Allow players to pickup allies planted lasermines"_true0.0true1.0)), CVarChanged_FPickUp);
    
b_friendly_pickup GetConVarBool(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_allow_enemy_pickup""0""Allow players to pickup enemys planted lasermines"_true0.0true1.0)), CVarChanged_EPickUp);
    
b_enemy_pickup GetConVarBool(CVar);

    
HookConVarChange((CVar CreateConVar("sm_lasermines_wpn""taser""Enemy has died from this weapon"FCVAR_PRINTABLEONLY)), CVarChanged_Wpn);
    
GetConVarString(CVars_wpn_dmgsizeof(s_wpn_dmg));

    
HookConVarChange((CVar CreateConVar("sm_lasermines_hs""1""Headshot On/Off"_true0.0true1.0)), CVarChanged_HS);
    
b_lm_hs GetConVarBool(CVar);

    
HookConVarChange((CVar FindConVar("mp_friendlyfire")), CVarChanged_FF);
    
b_friendlyfire GetConVarBool(CVar);

    
HookEvent("player_spawn"OnPlayerSpawn);
    
HookEvent("player_death"OnPlayerDeath);
    
HookEvent("player_death"OnPlayerDeath_PreEventHookMode_Pre);
    
HookEvent("round_start"RoundStart);

    
RegConsoleCmd("sm_colocar",    Cmd_PlantMine,    "Plant a laser mine");
    
RegConsoleCmd("sm_setlaser",    Cmd_PlantMine,    "Plant a laser mine");

    
RegConsoleCmd("sm_lm",    Cmd_BuyMines,    "Buy laser mines");
    
RegConsoleCmd("sm_lasermine",        Cmd_BuyMines,    "Buy laser mines");

    
RegConsoleCmd("sm_sacar",Cmd_RemoveMines"Remove all your laser mines");
    
RegConsoleCmd("sm_dellaser",        Cmd_RemoveMines"Remove all your laser mines");

    
HookEntityOutput("env_beam""OnTouchedByEntity"OnTouchedByEntity);

    
LoadTranslations("csgo_lasermines.phrases");

    
AutoExecConfig(true"plugin.csgo_lasermines");

    if(
b_late)
    {
        
b_late false;
        
OnMapStart();
    }
}

public 
CVarChanged_Enable(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
i_enable GetConVarInt(CVar);
}

public 
CVarChanged_Msg(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_message GetConVarBool(CVar);
}

public 
CVarChanged_Amt(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
i_amount GetConVarInt(CVar);
    
LookupClients();
}

public 
CVarChanged_MaxAmt(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
i_maxamount GetConVarInt(CVar);
    
LookupClients();
}

public 
CVarChanged_Purge(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_purge GetConVarBool(CVar);
}

public 
CVarChanged_Dmg(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
i_damage GetConVarInt(CVar);
}

public 
CVarChanged_Explode(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
i_explode_damage GetConVarInt(CVar);
}

public 
CVarChanged_Radius(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
i_explode_radius GetConVarInt(CVar);
}

public 
CVarChanged_HP(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
i_health GetConVarInt(CVar);
}

public 
CVarChanged_Time(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
f_activate_time GetConVarFloat(CVar);
}

public 
CVarChanged_Mode(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_use_buy_mode GetConVarBool(CVar);
}

public 
CVarChanged_Zone(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_should_buy_zone GetConVarBool(CVar);
}

public 
CVarChanged_Price(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
i_price GetConVarInt(CVar);
}

public 
CVarChanged_TColor(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
strcopy(s_color_tsizeof(s_color_t), newValue);
}

public 
CVarChanged_CtColor(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
strcopy(s_color_ctsizeof(s_color_ct), newValue);
}

public 
CVarChanged_PickUp(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_pickup GetConVarBool(CVar);
}

public 
CVarChanged_FPickUp(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_friendly_pickup GetConVarBool(CVar);
}

public 
CVarChanged_EPickUp(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_enemy_pickup GetConVarBool(CVar);
}

public 
CVarChanged_Wpn(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
strcopy(s_wpn_dmgsizeof(s_wpn_dmg), newValue);
}

public 
CVarChanged_HS(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_lm_hs GetConVarBool(CVar);
}

public 
CVarChanged_FF(Handle:CVar, const String:oldValue[], const String:newValue[])
{
    
b_friendlyfire GetConVarBool(CVar);
}

LookupClients()
{
    for(new 
1<= MaxClientsi++) OnClientConnected(i);
}

public 
OnMapStart()
{
    
PrecacheModel(MDL_MINEtrue);
    
PrecacheModel(MDL_LASERtrue);

    
PrecacheSound(SND_MINEPUTtrue);
    
PrecacheSound(SND_MINEACTtrue);
    
PrecacheSound(SND_BUYMINEtrue);
    
PrecacheSound(SND_CANTBUYtrue);

    
AddFileToDownloadsTable("models/lasermine/lasermine.dx80.vtx");
    
AddFileToDownloadsTable("models/lasermine/lasermine.dx90.vtx");
    
AddFileToDownloadsTable("models/lasermine/lasermine.mdl");
    
AddFileToDownloadsTable("models/lasermine/lasermine.phy");
    
AddFileToDownloadsTable("models/lasermine/lasermine.vvd");

    
AddFileToDownloadsTable("materials/models/lasermine/lasermine.vmt");
    
AddFileToDownloadsTable("materials/models/lasermine/lasermine.vtf");
}

public 
RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
    if(
i_enable && b_message)
        
CPrintToChatAll("%t"b_use_buy_mode "Welcome Message 2" "Welcome Message 1");
}

public 
OnClientConnected(client)
{
    if(!
b_used_by_native[client])
    {
        
i_clients_maxlimit[client] = i_maxamount;
        
i_clients_myamount[client] = i_amount;
    }
}

public 
OnClientDisconnect(client)
{
    
i_buy_limit[client] = 0;
    new 
= -1;
    while ((
FindEntityByClassname(i"prop_physics_override")) != -&& GetClientByLasermine(i) == client)
        
AcceptEntityInput(i"KillHierarchy");
}

public 
OnClientDisconnect_Post(client)
{
    
i_clients_amount[client] = 0;
    
b_used_by_native[client] = false;
}

public 
OnTouchedByEntity(const String:output[], calleractivatorFloat:delay)
{
    if(!(
<= activator <= MaxClients))
        return;
    new 
owner GetEntPropEnt(callerProp_Data"m_hOwnerEntity");
    new 
lasermine GetLasermineByBeam(caller);

    if(
owner == -|| lasermine == -|| activator == owner || (!b_friendlyfire && GetClientTeam(activator) == GetClientTeam(owner)))
        return;

    new 
dummy_caller callerdummy_owner ownerdamage i_damagedummy_lasermine lasermine;

    new 
Action:result Forward_OnPreHit(activatordummy_ownerdummy_callerdummy_laserminedamage);

    switch(
result)
    {
        case 
Plugin_HandledPlugin_Stop:
            return;
        case 
Plugin_Continue:
        {
            
dummy_caller    caller;
            
dummy_owner        owner;
            
damage            i_damage;
            
dummy_lasermine    lasermine;
        }
    }

    
SDKHooks_TakeDamage(activatordummy_callerdummy_ownerfloat(damage), DMG_ENERGYBEAM);

    
Forward_OnPostHit(activatordummy_ownerdummy_callerdummy_laserminedamage);
}

public 
OnPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    if(
b_use_buy_mode)
        return;
    new 
client GetClientOfUserId(GetEventInt(event"userid"));
    
i_clients_amount[client] = i_clients_myamount[client];
}

public 
OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    if(!
b_purge)
        return;

    new 
client GetClientOfUserId(GetEventInt(event"userid"));
    
OnClientDisconnect(client);
}

public 
Action:OnPlayerDeath_Pre(Handle:event, const String:name[], bool:dontBroadcast)
{
    new 
attacker GetClientOfUserId(GetEventInt(event"attacker"));
    if(
attacker <= MaxClients)
    {
        
decl String:g_szWeapon[32];
        
GetEventString(event"weapon"g_szWeaponsizeof(g_szWeapon));
        if(
StrEqual(g_szWeapon"env_beam"))
        {
            
SetEventString(event"weapon"s_wpn_dmg);
            if(
b_lm_hs)
                
SetEventBool(event"headshot"true);
        }
    }
    return 
Plugin_Continue;
}

public 
Action:Cmd_BuyMines(clientargc)
{
    
// client = 0    or    disabled    or    buy mode disabled    or    unlimited amount    or    client is not in game
    
if(!client || !i_enable || !b_use_buy_mode || i_clients_myamount[client] == -|| !IsClientInGame(client))
        return 
Plugin_Continue;    // Stop trigger the command

    // client is dead
    
if(!IsPlayerAlive(client))
    {
        
PrintHintText(client"%t""Can't buy, while dead");
        return 
Plugin_Handled;    // Stop trigger the command
    
}
    new 
team GetClientTeam(client);
    
// client is spectator
    
if(team 2)
    {
        
PrintHintText(client"%t""Can't use, while spec");
        return 
Plugin_Handled;    // Stop trigger the command
    
}
    
// client in restricted team
    
if(i_enable && team != i_enable)
    {
        
PrintHintText(client"%t"i_enable == "Only for Terrorists" "Only for Counter-terrorists");
        return 
Plugin_Handled;    // Stop trigger the command
    
}
    
// If  buy zone mode is enabled and player is out of buy zone range
    
if(b_should_buy_zone && !GetEntData(clientgInBuyZone1))
    {
        
PrintHintText(client"%t""Out of buy zone");
        return 
Plugin_Handled;    // Stop trigger the command
    
}

    new 
amount 1;
    if(
argc)
    {
        
decl String:txt[6];
        
GetCmdArg(1txtsizeof(txt));
        
amount StringToInt(txt);
        if(
i_clients_maxlimit[client])
        {
            if(
amount i_clients_maxlimit[client])
                
amount i_clients_maxlimit[client];
            else if(
amount 1)
                
amount 1;
        }
    }

    new 
dummy_amount amountcost i_priceboughtamount;
    new 
Action:result Forward_OnPreBuy(clientdummy_amountcost);

    switch(
result)
    {
        case 
Plugin_HandledPlugin_Stop:
            return 
result;
        case 
Plugin_Continue:
        {
            
dummy_amount    amount;
            
cost            i_price;
        }
    }

    new 
money GetEntData(clientgAccount);
    do
    {
        if(
i_clients_maxlimit[client] && (i_clients_amount[client] >= i_clients_maxlimit[client]) || (i_buy_limit[client] >= i_clients_maxlimit[client]))
        {
            
PrintHintText(client"%t""Can't buy, max amount"i_clients_maxlimit[client]);
            return 
Plugin_Handled;
        }

        
money -= cost;

        if(
money 0)
        {
            
PrintHintText(client"%t""Can't buy, not enough money"i_clients_amount[client]);
            
EmitSoundToClient(clientSND_CANTBUY);
            return 
Plugin_Handled;
        }
        
SetEntData(clientgAccountmoney);
        
i_clients_amount[client]++;
        
i_buy_limit[client]++;
        
boughtamount++;
    } while (--
dummy_amount);

    if(
boughtamount)
    {
        
PrintHintText(client"%t""Mines"i_clients_amount[client]);
        
EmitSoundToClient(clientSND_BUYMINE);
        
Forward_OnPostBuy(clientboughtamountboughtamount*cost);
    }

    return 
Plugin_Handled;
}

public 
Action:Cmd_PlantMine(clientargc)
{
    if(!
client || !i_enable || !IsClientInGame(client))
        return 
Plugin_Continue;
    if(!
i_clients_amount[client])
    {
        
PrintHintText(client"%t""Mines"i_clients_amount[client]);
        return 
Plugin_Handled;
    }
    if(!
IsPlayerAlive(client))
    {
        
PrintHintText(client"%t""Can't plant, while dead");
        return 
Plugin_Handled;
    }
    new 
team GetClientTeam(client);
    
// client in restricted team
    
if(i_enable && team != i_enable)
    {
        
PrintHintText(client"%t"i_enable == "Only for Terrorists" "Only for Counter-terrorists");
        return 
Plugin_Handled;    // Stop trigger the command
    
}

    
decl color[3];
    switch(
team)
    {
        case 
2:    StringToColor(s_color_tcolor255);
        case 
3:    StringToColor(s_color_ctcolor255);
        default :
        {
            
PrintHintText(client"%t""Can't use, while spec");
            return 
Plugin_Handled;
        }
    }

    new 
Float:delay_time f_activate_timedummy_damage i_explode_damagedummy_radius i_explode_radiushealth i_healthdummy_color[3];
    
dummy_color color;

    new 
Action:result Forward_OnPlantMine(clientdelay_timedummy_damagedummy_radiushealthdummy_color);

    switch(
result)
    {
        case 
Plugin_HandledPlugin_Stop:
            return 
result;
        case 
Plugin_Continue:
        {
            
delay_time        f_activate_time;
            
dummy_damage    i_explode_damage;
            
dummy_radius    i_explode_radius;
            
health            i_health;
            
dummy_color        color;
        }
    }

    new 
mine;
    if((
mine PlantMine(clientdelay_timedummy_damagedummy_radiushealthdummy_color)) == -1)
        return 
Plugin_Handled;

    
Forward_OnMinePlanted(clientminedelay_timedummy_damagedummy_radiushealthdummy_color);

    switch(
i_clients_amount[client])
    {
        case -
1:    PrintHintText(client"%t""Infinity mines");
        default :
        {
            
i_clients_amount[client]--;
            
PrintHintText(client"%t""Mines"i_clients_amount[client]);
        }
    }

    return 
Plugin_Handled;
}

public 
Action:Cmd_RemoveMines(clientargc)
{
    if(!
b_pickup || IsFakeClient(client) || !IsPlayerAlive(client))
        return 
Plugin_Handled;

    new 
= -1;
    while ((
FindEntityByClassname(i"prop_physics_override")) != -&& GetClientByLasermine(i) == client)
        
PickupLasermine(clienticlient);

    return 
Plugin_Handled;
}

public 
Action:OnPlayerRunCmd(client, &buttons, &impulseFloat:vel[3], Float:angles[3], &weapon)
{
    if(!
b_pickup || IsFakeClient(client) || !IsPlayerAlive(client))
        return 
Plugin_Continue;

    static 
iPrevButtons[MAXPLAYERS+1];
    if((
buttons IN_USE) && !(iPrevButtons[client] & IN_USE))
        
OnButtonPressed(client);
    
iPrevButtons[client] = buttons;

    return 
Plugin_Continue;
}

OnButtonPressed(client)
{
    new 
Handle:trace TraceRay(client);

    new 
ent = -1;
    if(
TR_DidHit(trace) && (ent TR_GetEntityIndex(trace)) > MaxClients)
    {
        
CloseHandle(trace);
        new 
owner GetClientByLasermine(ent);
        if(
owner == -1)
            return;
        if(
owner == client)
        {
            
PickupLasermine(cliententowner);
            return;
        }
        if((
b_friendly_pickup && GetClientTeam(owner) == GetClientTeam(client)) || b_enemy_pickup)
            
PickupLasermine(cliententowner);
        else
        {
            
EmitSoundToAll(SND_CANTBUYent);
            
decl String:nick[MAX_NAME_LENGTH];
            if(
GetClientName(ownernicksizeof(nick)))
                
PrintCenterText(client,"%t""Not yours lasermine"nick);
        }
    }
    else 
CloseHandle(trace);
}

PickupLasermine(clientlasermineowner)
{
    if(
i_clients_amount[client] >= && i_clients_amount[client] == AddClientLasermines(client))
        return;

    new 
Action:result Forward_OnPrePickup(clientlasermineowner);

    switch(
result)
    {
        case 
Plugin_HandledPlugin_Stop:
            return;
    }

    
AcceptEntityInput(lasermine"KillHierarchy");
    if(
i_clients_amount[client] >= 0)
        
PrintHintText(client"%t""Mines"i_clients_amount[client]);
    else 
PrintHintText(client"%t""Infinity mines");
    
EmitSoundToClient(clientSND_BUYMINE);

    
Forward_OnPostPickup(clientlasermineowner);
}

Handle:TraceRay(client)
{
    new 
Float:startent[3], Float:angle[3], Float:end[3];
    
GetClientEyePosition(clientstartent);
    
GetClientEyeAngles(clientangle);
    
GetAngleVectors(angleendNULL_VECTORNULL_VECTOR);
    
NormalizeVector(endend);

    
startent[0] += end[0] * 10.0;
    
startent[1] += end[1] * 10.0;
    
startent[2] += end[2] * 10.0;

    
end[0] = startent[0] + end[0] * 80.0;
    
end[1] = startent[1] + end[1] * 80.0;
    
end[2] = startent[2] + end[2] * 80.0;

    return 
TR_TraceRayFilterEx(startentendCONTENTS_SOLIDRayType_EndPointFilterPlayers);
}

stock PlantMine(clientFloat:activation_delay 0.0explode_damageexplode_radius, const health 0, const color[3] = {255255255})
{
    if(
activation_delay 10.0)
        
activation_delay 10.0;
    else if(
activation_delay 0.0)
        
activation_delay 0.0;

    new 
Handle:trace TraceRay(client);

    
decl Float:end[3], Float:normal[3], Float:beamend[3];
    if(
TR_DidHit(trace) && TR_GetEntityIndex(trace) < 1)
    {
        
TR_GetEndPosition(endtrace);
        
TR_GetPlaneNormal(tracenormal);
        
CloseHandle(trace);

        
GetVectorAngles(normalnormal);

        
TR_TraceRayFilter(endnormalCONTENTS_SOLIDRayType_InfiniteFilterAll);
        
TR_GetEndPosition(beamendINVALID_HANDLE);

        new 
ent CreateEntityByName("prop_physics_override");
        if(
ent == -|| !IsValidEdict(ent))
        {
            
LogError("Could not create entity \"prop_physics_override\"");
            return -
1;
        }

        new 
beament CreateEntityByName("env_beam");
        if(
beament == -|| !IsValidEdict(beament))
        {
            
LogError("Could not create entity \"env_beam\"");
            return -
1;
        }

        
decl String:start[30], String:tmp[200];
        
Format(startsizeof(start), "Beam%i"beament);

        
SetEntityModel(entMDL_MINE);

        
decl String:buffer[16];
        
IntToString(explode_damagebuffersizeof(buffer));
        
DispatchKeyValue(ent"ExplodeDamage"buffer);
        
IntToString(explode_radiusbuffersizeof(buffer));
        
DispatchKeyValue(ent"ExplodeRadius"buffer);

        
DispatchKeyValue(ent"spawnflags""3");
        
DispatchSpawn(ent);

        
AcceptEntityInput(ent"DisableMotion");
        
SetEntityMoveType(entMOVETYPE_NONE);
        
TeleportEntity(entendnormalNULL_VECTOR);

        
SetEntProp(entProp_Data"m_nSolidType"6);
//        до своей активации мина будет выталкивать игрока со своей позиции
        
SetEntProp(entProp_Data"m_CollisionGroup"17);
        
        if(
health)
        {
            
SetEntProp(entProp_Data"m_takedamage"2);
            
SetEntProp(entProp_Data"m_iHealth"health);
        }

        
Format(tmpsizeof(tmp), "%s,Kill,,0,-1"start);
        
DispatchKeyValue(ent"OnBreak"tmp);

        
EmitSoundToAll(SND_MINEPUTent);

        
// Set keyvalues on the beam.
        
DispatchKeyValue(beament"targetname",        start);
        
DispatchKeyValue(beament"damage",            "0");
        
DispatchKeyValue(beament"framestart",        "0");
        
DispatchKeyValue(beament"BoltWidth",        "4.0");
        
DispatchKeyValue(beament"renderfx",        "0");
        
DispatchKeyValue(beament"TouchType",        "3"); // 0 = none, 1 = player only, 2 = NPC only, 3 = player or NPC, 4 = player, NPC or physprop
        
DispatchKeyValue(beament"framerate",        "0");
        
DispatchKeyValue(beament"decalname",        "Bigshot");
        
DispatchKeyValue(beament"TextureScroll",    "35");
        
DispatchKeyValue(beament"HDRColorScale",    "1.0");
        
DispatchKeyValue(beament"texture",        MDL_LASER);
        
DispatchKeyValue(beament"life",            "0"); // 0 = infinite, beam life time in seconds
        
DispatchKeyValue(beament"StrikeTime",        "1"); // If beam life time not infinite, this repeat it back
        
DispatchKeyValue(beament"LightningStart",    start);
        
DispatchKeyValue(beament"spawnflags",        "0"); // 0 disable, 1 = start on, etc etc. look from hammer editor
        
DispatchKeyValue(beament"NoiseAmplitude",    "0"); // straight beam = 0, other make noise beam
        
DispatchKeyValue(beament"Radius",            "256");
        
DispatchKeyValue(beament"renderamt",        "100");
        
DispatchKeyValue(beament"rendercolor",    "0 0 0");

        
AcceptEntityInput(beament"TurnOff");

        
SetEntityModel(beamentMDL_LASER);

        
TeleportEntity(beamentbeamendNULL_VECTORNULL_VECTOR); // Teleport the beam

        
SetEntPropVector(beament,    Prop_Data,    "m_vecEndPos",    end);
        
SetEntPropFloat(beament,    Prop_Data,    "m_fWidth",        3.0);
        
SetEntPropFloat(beament,    Prop_Data,    "m_fEndWidth",    3.0);

        
SetEntPropEnt(beament,    Prop_Data,    "m_hOwnerEntity",    client); // Sets the owner of the beam
        
SetEntPropEnt(ent,        Prop_Data,    "m_hMoveChild",        beament);
        
SetEntPropEnt(beament,    Prop_Data,    "m_hEffectEntity",    ent);

        new 
Handle:datapack CreateDataPack();
        
WritePackCell(datapackbeament);
        
WritePackCell(datapackent);
        
WritePackCell(datapackcolor[0]);
        
WritePackCell(datapackcolor[1]);
        
WritePackCell(datapackcolor[2]);
        
WritePackString(datapackstart);
        
CreateTimer(activation_delayOnActivateLaserdatapackTIMER_FLAG_NO_MAPCHANGE|TIMER_HNDL_CLOSE);

        
SDKHook(entSDKHook_OnTakeDamageOnTakeDamage);

        return 
ent;
    }
    else 
CloseHandle(trace);
    return -
1;
}

public 
Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    if(
IsEntityLasermine(victim))
    {
        if(
attacker <= MaxClients)
        {
            static 
client;
            if((
client GetClientByLasermine(victim)) != -&& client != attacker && GetClientTeam(client) == GetClientTeam(attacker))
                return 
Plugin_Handled;
        }
        else if(!
IsEntityLasermine(inflictor))
            return 
Plugin_Handled;
    }

    return 
Plugin_Continue;
}

public 
bool:FilterAll(entitycontentsMask)
{
    return 
false;
}

public 
bool:FilterPlayers(entitycontentsMask)
{
    return !(
entity <= MaxClients);
}

public 
Action:OnActivateLaser(Handle:timerany:hDataPack)
{
    
ResetPack(hDataPack);
    
decl String:start[30], String:tmp[200], color[3];
    new 
beament ReadPackCell(hDataPack);
    new 
ent ReadPackCell(hDataPack);
    
color[0] = ReadPackCell(hDataPack);
    
color[1] = ReadPackCell(hDataPack);
    
color[2] = ReadPackCell(hDataPack);
    
ReadPackString(hDataPackstartsizeof(start));

    if(!
IsValidEdict(beament) || !IsValidEdict(ent))
        return 
Plugin_Stop;
//    будем надеяться, что в этот момент мина уже вытолкнула игрока
    
SetEntProp(entProp_Data"m_CollisionGroup"5);
    
AcceptEntityInput(beament"TurnOn");

    
SetEntityRenderColor(beamentcolor[0], color[1], color[2]);

    
Format(tmpsizeof(tmp), "%s,TurnOff,,0.001,-1"start);
    
DispatchKeyValue(beament"OnTouchedByEntity"tmp);
    
Format(tmpsizeof(tmp), "%s,TurnOn,,0.002,-1"start);
    
DispatchKeyValue(beament"OnTouchedByEntity"tmp);

    
EmitSoundToAll(SND_MINEACTent);

    return 
Plugin_Stop;
}

public 
Native_AddMines(Handle:pluginnumParams)
{
    new 
client GetNativeCell(1);
    if(
client || client MaxClients)
    {
        
ThrowNativeError(SP_ERROR_INDEX"Client index %i is invalid"client);
        return 
0;
    }
    else if(!
IsClientInGame(client))
    {
        
ThrowNativeError(SP_ERROR_NOT_FOUND"Client %i is not in game"client);
        return 
0;
    }

    new 
amount GetNativeCell(2);
    new 
bool:limit bool:GetNativeCell(3);

    if(
amount 1)
        return 
i_clients_amount[client];
    if(
i_clients_amount[client] < 0)
        return -
1;

    
i_clients_amount[client] += amount;

    if(
limit && i_clients_amount[client] > i_clients_maxlimit[client])
        
i_clients_amount[client] = i_clients_maxlimit[client];

    return 
i_clients_amount[client];
}

public 
Native_SetMines(Handle:pluginnumParams)
{
    new 
client GetNativeCell(1);
    if(
client || client MaxClients)
    {
        
ThrowNativeError(SP_ERROR_INDEX"Client index %i is invalid"client);
        return 
false;
    }
    else if(!
IsClientInGame(client))
    {
        
ThrowNativeError(SP_ERROR_NOT_FOUND"Client %i is not in game"client);
        return 
false;
    }

    new 
amount GetNativeCell(2);
    new 
bool:limit bool:GetNativeCell(3);

    if(
amount < -1)
        
amount = -1;

    
i_clients_amount[client] = amount;

    if(
limit && i_clients_amount[client] > i_clients_maxlimit[client])
        
i_clients_amount[client] = i_clients_maxlimit[client];

    return 
true;
}

public 
Native_SubstractMines(Handle:pluginnumParams)
{
    new 
client GetNativeCell(1);
    if(
client || client MaxClients)
    {
        
ThrowNativeError(SP_ERROR_INDEX"Client index %i is invalid"client);
        return 
0;
    }
    else if(!
IsClientInGame(client))
    {
        
ThrowNativeError(SP_ERROR_NOT_FOUND"Client %i is not in game"client);
        return 
0;
    }

    new 
amount GetNativeCell(2);

    if(
i_clients_amount[client] == -1)
        return 
i_clients_amount[client];

    if(
amount 1)
        return 
i_clients_amount[client];

    
i_clients_amount[client] -= amount;
    if(
i_clients_amount[client] < 0)
        
i_clients_amount[client] = 0;

    return 
i_clients_amount[client];
}

public 
Native_GetMines(Handle:pluginnumParams)
{
    new 
client GetNativeCell(1);
    if(
client || client MaxClients)
    {
        
ThrowNativeError(SP_ERROR_INDEX"Client index %i is invalid"client);
        return 
0;
    }
    else if(!
IsClientInGame(client))
    {
        
ThrowNativeError(SP_ERROR_NOT_FOUND"Client %i is not in game"client);
        return 
0;
    }

    return 
i_clients_amount[client];
}

public 
Native_ClearMapMines(Handle:pluginnumParams)
{
    new 
client GetNativeCell(1);
    if(
client || client MaxClients)
    {
        
ThrowNativeError(SP_ERROR_INDEX"Client index %i is invalid"client);
        return;
    }
    else if(!
IsClientInGame(client))
    {
        
ThrowNativeError(SP_ERROR_NOT_FOUND"Client %i is not in game"client);
        return;
    }

    
OnClientDisconnect(client);
}

public 
Native_PlantMine(Handle:pluginnumParams)
{
    new 
client GetNativeCell(1);

    if(
client || client MaxClients)
    {
        
ThrowNativeError(SP_ERROR_INDEX"Client index %i is invalid"client);
        return 
false;
    }
    else if(!
IsClientInGame(client))
    {
        
ThrowNativeError(SP_ERROR_NOT_FOUND"Client %i is not in game"client);
        return 
false;
    }

    new 
Float:f_delay GetNativeCell(2);
    new 
i_exp_damage GetNativeCell(3);
    new 
i_exp_radius GetNativeCell(4);
    new 
health GetNativeCell(5);
    
decl color[3]; GetNativeArray(6colorsizeof(color));

    new 
mine;
    if((
mine PlantMine(clientf_delayi_exp_damagei_exp_radiushealthcolor)) != -1)
        
Forward_OnMinePlanted(clientminef_delayi_exp_damagei_exp_radiushealthcolor);

    return 
mine != -1;
}

public 
Native_IsLasermine(Handle:pluginnumParams)
{
    new 
entity GetNativeCell(1);
    if(
entity <= MaxClients || !IsValidEdict(entity))
        return 
false;
    
decl String:g_szModel[PLATFORM_MAX_PATH];
    
GetEntPropString(entityProp_Data"m_ModelName"g_szModelsizeof(g_szModel));

    return 
StrEqual(g_szModelMDL_MINEfalse) && GetEntPropEnt(entityProp_Data"m_hMoveChild") != -1;
}

public 
Native_GetClientByLasermine(Handle:pluginnumParams)
{
    new 
entity GetNativeCell(1);
    new 
beam;
    if((
beam GetBeamByLasermine(entity)) == -1)
        return -
1;

    return 
GetEntPropEnt(beamProp_Data"m_hOwnerEntity");
}

public 
Native_SetClientMaxLasermines(Handle:pluginnumParams)
{
    new 
client GetNativeCell(1);
    if(
client || client MaxClients)
        
ThrowNativeError(SP_ERROR_INDEX"Client index %i is invalid"client);
    else if(!
IsClientAuthorized(client))
        
ThrowNativeError(SP_ERROR_NOT_FOUND"Client %i is not authorized"client);
    new 
amount GetNativeCell(2);
    if(
amount < -1)
        
amount = -1;
    
i_clients_maxlimit[client] = amount;
    
i_clients_myamount[client] = amount;
    
b_used_by_native[client] = true;
}

public 
Native_ResetClientMaxLasermines(Handle:pluginnumParams)
{
    new 
client GetNativeCell(1);
    if(
client || client MaxClients)
        
ThrowNativeError(SP_ERROR_INDEX"Client index %i is invalid"client);
    else if(!
IsClientConnected(client))
        
ThrowNativeError(SP_ERROR_NOT_FOUND"Client %i is not connected"client);
    
OnClientConnected(client);
}

public 
Native_GetBeamByLasermine(Handle:pluginnumParams)
{
    new 
entity GetNativeCell(1);
    if(
IsEntityLasermine(entity))
        return 
GetEntPropEnt(entityProp_Data"m_hMoveChild");
    return -
1;
}

public 
Native_GetLasermineByBeam(Handle:pluginnumParams)
{
    new 
mine GetEntPropEnt(GetNativeCell(1), Prop_Data"m_hEffectEntity");
    if(
mine != -&& IsEntityLasermine(mine))
        return 
mine;
    return -
1;
}

Action:Forward_OnPlantMine(client, &Float:activate_time, &exp_damage, &exp_radius, &healthcolor[3])
{
    
decl Action:result;
    
result Plugin_Continue;

    
Call_StartForward(h_fwdOnPlantLasermine);
    
Call_PushCell(client);
    
Call_PushFloatRef(activate_time);
    
Call_PushCellRef(exp_damage);
    
Call_PushCellRef(exp_radius);
    
Call_PushCellRef(health);
    
Call_PushArrayEx(colorsizeof(color), SM_PARAM_COPYBACK);
    
Call_Finish(result);

    return 
result;
}

Forward_OnMinePlanted(clientmineFloat:activate_timeexp_damageexp_radiushealthcolor[3])
{
    
Call_StartForward(h_fwdOnLaserminePlanted);
    
Call_PushCell(client);
    
Call_PushCell(mine);
    
Call_PushFloat(activate_time);
    
Call_PushCell(exp_damage);
    
Call_PushCell(exp_radius);
    
Call_PushCell(health);
    
Call_PushArray(colorsizeof(color));
    
Call_Finish();
}

Action:Forward_OnPreHit(victim, &attacker, &beam, &lasermine, &damage)
{
    
decl Action:result;
    
result Plugin_Continue;

    
Call_StartForward(h_fwdOnPreHitByLasermine);
    
Call_PushCell(victim);
    
Call_PushCellRef(attacker);
    
Call_PushCellRef(beam);
    
Call_PushCellRef(lasermine);
    
Call_PushCellRef(damage);
    
Call_Finish(result);

    return 
result;
}

Forward_OnPostHit(victimattackerbeamlaserminedamage)
{
    
Call_StartForward(h_fwdOnPostHitByLasermine);
    
Call_PushCell(victim);
    
Call_PushCell(attacker);
    
Call_PushCell(beam);
    
Call_PushCell(lasermine);
    
Call_PushCell(damage);
    
Call_Finish();
}

Action:Forward_OnPreBuy(client, &amount, &price)
{
    
decl Action:result;
    
result Plugin_Continue;

    
Call_StartForward(h_fwdOnPreBuyLasermine);
    
Call_PushCell(client);
    
Call_PushCellRef(amount);
    
Call_PushCellRef(price);
    
Call_Finish(result);

    return 
result;
}

Forward_OnPostBuy(clientamountsum)
{
    
Call_StartForward(h_fwdOnPostBuyLasermine);
    
Call_PushCell(client);
    
Call_PushCell(amount);
    
Call_PushCell(sum);
    
Call_Finish();
}

Action:Forward_OnPrePickup(clientlasermineowner)
{
    
decl Action:result;
    
result Plugin_Continue;

    
Call_StartForward(h_fwdOnPrePickupLasermine);
    
Call_PushCell(client);
    
Call_PushCell(lasermine);
    
Call_PushCell(owner);
    
Call_Finish(result);

    return 
result;
}

Forward_OnPostPickup(clientlasermineowner)
{
    
Call_StartForward(h_fwdOnPostPickupLasermine);
    
Call_PushCell(client);
    
Call_PushCell(lasermine);
    
Call_PushCell(owner);
    
Call_Finish();
}

stock bool:StringToColor(const String:str[], color[3], const defvalue = -1)
{
    new 
bool:result false;
    
decl String:Splitter[3][64];
    if(
ExplodeString(str" "Splittersizeof(Splitter), sizeof(Splitter[])) == && String_IsNumeric(Splitter[0]) && String_IsNumeric(Splitter[1]) && String_IsNumeric(Splitter[2]))
    {
        
color[0] = StringToInt(Splitter[0]);
        
color[1] = StringToInt(Splitter[1]);
        
color[2] = StringToInt(Splitter[2]);
        
result true;
    }
    else
    {
        
color[0] = defvalue;
        
color[1] = defvalue;
        
color[2] = defvalue;
    }
    return 
result;
}

stock bool:String_IsNumeric(const String:str[])
{
    new 
xnumbersFound;

    if(
str[x] == '+' || str[x] == '-')
        
x++;

    while (
str[x])
    {
        if(
IsCharNumeric(str[x]))
            
numbersFound++;
        else return 
false;
        
x++;
    }

    return 
bool:numbersFound;

Actually Found the way reinstalling all again and just copying a code from another version there and editing some kinda little things, now im with VECTOR problems :/ when they pick up the lasers, it actually pick it up all, now i tried setting some vectors of distance, but its not picking them

PHP Code:
PickupLasermine(clientlasermineowner)
{
    new 
Float:vOriCliente[3];
    new 
Float:tOriCliente[3];
    new 
pev_origin;

    if (
i_clients_amount[client] >= && i_clients_amount[client] == AddClientLasermines(client))
    {
        return;
    }
    
    new 
Action:result Forward_OnPrePickup(clientlasermineowner);
    
    switch (
result)
    {
        case 
Plugin_HandledPlugin_Stop :
        {
            return;
        }
    }
    
GetEntDataVector(ownerpev_originvOriCliente);
    
GetEntDataVector(laserminepev_origintOriCliente);

    if(
GetVectorDistance(vOriClientetOriCliente) > 70.0)
        return;

    
AcceptEntityInput(lasermine"KillHierarchy");
    if (
i_clients_amount[client] >= 0)
        
PrintHintText(client"%t""Mines"i_clients_amount[client]);
    else
        
PrintHintText(client"%t""Infinity mines");
    
EmitSoundToClient(clientSND_BUYMINE);
    
    
Forward_OnPostPickup(clientlasermineowner);

Tried this if(GetVectorDistance(vOriCliente, tOriCliente) > 70.0) but its not taking the client position from the entity laser position
__________________

Last edited by Elitcky; 05-13-2020 at 22:57.
Elitcky 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 06:30.


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