Tripmine

Тема в разделе "Запросы", создана пользователем POMKA, 27 июн 2011.

  1. POMKA

    POMKA

    Сообщения:
    236
    Симпатии:
    57
    Доброе время суток.Можете переписать этот плагин чтобы он не взрывался от кт и от самого себя, а действовал только на теров(Зомби) причем мину можно было бы ставить когда появился первый зомби и чтобы мины не взрывались, а зажигали зомби на 5 секунд и немного отталкивали, сделать еще чтобы мин можно было ставит тока 3 штуки и как ее поставили он начинает работать тока через 5 секунд, и лучь у этих трех мин разного цвета 1)красный 2)зеленый 3)синий.

    И еще одна беда от мин ящики начинают летать(физика ломается) поправьте.

    Заранее большое спасибо!

    #pragma semicolon 1

    #include <sourcemod>
    #include <sdktools>

    #define PLUGIN_VERSION "1.0.0.4"

    #define TRACE_START 24.0
    #define TRACE_END 64.0

    #define MDL_LASER "sprites/laser.vmt"

    #define SND_MINEPUT "npc/roller/blade_cut.wav"
    #define SND_MINEACT "npc/roller/mine/rmine_blades_in2.wav"

    #define TEAM_T 2
    #define TEAM_CT 3

    #define COLOR_T "255 0 0"
    #define COLOR_CT "0 0 255"
    #define COLOR_DEF "0 255 255"

    #define MAX_LINE_LEN 256

    // globals
    new gRemaining[MAXPLAYERS+1]; // how many tripmines player has this spawn
    new gCount = 1;
    new String:mdlMine[256];

    // convars
    new Handle:cvNumMines = INVALID_HANDLE;
    new Handle:cvActTime = INVALID_HANDLE;
    new Handle:cvModel = INVALID_HANDLE;
    new Handle:cvTeamRestricted = INVALID_HANDLE;

    public Plugin:myinfo = {
    name = "Tripmines",
    author = "L. Duke (mod by user)",
    description = "Plant a trip mine",
    version = PLUGIN_VERSION,
    url = "http://www.lduke.com/"
    };


    public OnPluginStart()
    {
    // events
    HookEvent("player_death", PlayerDeath);
    HookEvent("player_spawn",PlayerSpawn);

    // convars
    CreateConVar("sm_tripmines_version", PLUGIN_VERSION, "Tripmines", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
    cvNumMines = CreateConVar("sm_tripmines_allowed", "3");
    cvActTime = CreateConVar("sm_tripmines_activate_time", "2.0");
    cvModel = CreateConVar("sm_tripmines_model", "models/props_lab/tpplug.mdl");
    cvTeamRestricted = CreateConVar("sm_tripmines_restrictedteam", "0");

    // commands
    RegConsoleCmd("sm_tripmine", Command_TripMine);
    }

    public OnEventShutdown(){
    UnhookEvent("player_death", PlayerDeath);
    UnhookEvent("player_spawn",PlayerSpawn);
    }

    public OnMapStart()
    {
    // set model based on cvar
    GetConVarString(cvModel, mdlMine, sizeof(mdlMine));

    // precache models
    PrecacheModel(mdlMine, true);
    PrecacheModel(MDL_LASER, true);

    // precache sounds
    PrecacheSound(SND_MINEPUT, true);
    PrecacheSound(SND_MINEACT, true);
    }

    // When a new client is put in the server we reset their mines count
    public OnClientPutInServer(client){
    if(client && !IsFakeClient(client)) gRemaining[client] = 0;
    }

    public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
    {
    new client;
    client = GetClientOfUserId(GetEventInt(event, "userid"));
    gRemaining[client] = GetConVarInt(cvNumMines);
    return Plugin_Continue;
    }

    public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast){
    new client;
    client = GetClientOfUserId(GetEventInt(event, "userid"));
    gRemaining[client] = 0;
    return Plugin_Continue;
    }

    public Action:Command_TripMine(client, args)
    {
    // make sure client is not spectating
    if (!IsPlayerAlive(client))
    return Plugin_Handled;

    // check restricted team
    new team = GetClientTeam(client);
    if(team == GetConVarInt(cvTeamRestricted))
    {
    PrintHintText(client, "Your team does not have access to this equipment.");
    return Plugin_Handled;
    }

    // call SetMine if any remain in client's inventory
    if (gRemaining[client]>0) {
    SetMine(client);
    }
    else {
    PrintHintText(client, "You do not have any tripmines.");
    }
    return Plugin_Handled;
    }

    SetMine(client)
    {

    // setup unique target names for entities to be created with
    new String:beam[64];
    new String:beammdl[64];
    new String:tmp[128];
    Format(beam, sizeof(beam), "tmbeam%d", gCount);
    Format(beammdl, sizeof(beammdl), "tmbeammdl%d", gCount);
    gCount++;
    if (gCount>10000)
    {
    gCount = 1;
    }

    // trace client view to get position and angles for tripmine

    decl Float:start[3], Float:angle[3], Float:end[3], Float:normal[3], Float:beamend[3];
    GetClientEyePosition( client, start );
    GetClientEyeAngles( client, angle );
    GetAngleVectors(angle, end, NULL_VECTOR, NULL_VECTOR);
    NormalizeVector(end, end);

    start[0]=start[0]+end[0]*TRACE_START;
    start[1]=start[1]+end[1]*TRACE_START;
    start[2]=start[2]+end[2]*TRACE_START;

    end[0]=start[0]+end[0]*TRACE_END;
    end[1]=start[1]+end[1]*TRACE_END;
    end[2]=start[2]+end[2]*TRACE_END;

    TR_TraceRayFilter(start, end, CONTENTS_SOLID, RayType_EndPoint, FilterAll, 0);

    if (TR_DidHit(INVALID_HANDLE))
    {
    // update client's inventory
    gRemaining[client]-=1;

    // find angles for tripmine
    TR_GetEndPosition(end, INVALID_HANDLE);
    TR_GetPlaneNormal(INVALID_HANDLE, normal);
    GetVectorAngles(normal, normal);

    // trace laser beam
    TR_TraceRayFilter(end, normal, CONTENTS_SOLID, RayType_Infinite, FilterAll, 0);
    TR_GetEndPosition(beamend, INVALID_HANDLE);

    // create tripmine model
    new ent = CreateEntityByName("prop_physics_override");
    SetEntityModel(ent,mdlMine);
    DispatchKeyValue(ent, "StartDisabled", "false");
    DispatchSpawn(ent);
    TeleportEntity(ent, end, normal, NULL_VECTOR);
    SetEntProp(ent, Prop_Data, "m_usSolidFlags", 152);
    SetEntProp(ent, Prop_Data, "m_CollisionGroup", 1);
    SetEntityMoveType(ent, MOVETYPE_NONE);
    SetEntProp(ent, Prop_Data, "m_MoveCollide", 0);
    SetEntProp(ent, Prop_Data, "m_nSolidType", 6);
    SetEntPropEnt(ent, Prop_Data, "m_hLastAttacker", client);
    DispatchKeyValue(ent, "targetname", beammdl);
    DispatchKeyValue(ent, "ExplodeRadius", "256");
    DispatchKeyValue(ent, "ExplodeDamage", "400");
    Format(tmp, sizeof(tmp), "%s,Break,,0,-1", beammdl);
    DispatchKeyValue(ent, "OnHealthChanged", tmp);
    Format(tmp, sizeof(tmp), "%s,Kill,,0,-1", beam);
    DispatchKeyValue(ent, "OnBreak", tmp);
    SetEntProp(ent, Prop_Data, "m_takedamage", 2);
    AcceptEntityInput(ent, "Enable");
    HookSingleEntityOutput(ent, "OnBreak", mineBreak, true);


    // create laser beam
    ent = CreateEntityByName("env_beam");
    TeleportEntity(ent, beamend, NULL_VECTOR, NULL_VECTOR);
    SetEntityModel(ent, MDL_LASER);
    DispatchKeyValue(ent, "texture", MDL_LASER);
    DispatchKeyValue(ent, "targetname", beam);
    DispatchKeyValue(ent, "TouchType", "4");
    DispatchKeyValue(ent, "LightningStart", beam);
    DispatchKeyValue(ent, "BoltWidth", "4.0");
    DispatchKeyValue(ent, "life", "0");
    DispatchKeyValue(ent, "rendercolor", "0 0 0");
    DispatchKeyValue(ent, "renderamt", "0");
    DispatchKeyValue(ent, "HDRColorScale", "1.0");
    DispatchKeyValue(ent, "decalname", "Bigshot");
    DispatchKeyValue(ent, "StrikeTime", "0");
    DispatchKeyValue(ent, "TextureScroll", "35");
    Format(tmp, sizeof(tmp), "%s,Break,,0,-1", beammdl);
    DispatchKeyValue(ent, "OnTouchedByEntity", tmp);
    SetEntPropVector(ent, Prop_Data, "m_vecEndPos", end);
    SetEntPropFloat(ent, Prop_Data, "m_fWidth", 4.0);
    AcceptEntityInput(ent, "TurnOff");

    new Handle:data = CreateDataPack();
    CreateTimer(GetConVarFloat(cvActTime), TurnBeamOn, data);
    WritePackCell(data, client);
    WritePackCell(data, ent);
    WritePackFloat(data, end[0]);
    WritePackFloat(data, end[1]);
    WritePackFloat(data, end[2]);

    // play sound
    EmitSoundToAll(SND_MINEPUT, ent, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, SNDVOL_NORMAL, 100, ent, end, NULL_VECTOR, true, 0.0);

    // send message
    PrintHintText(client, "Tripmines remaining: %d", gRemaining[client]);
    }
    else
    {
    PrintHintText(client, "Invalid location for Tripmine");
    }
    }

    public Action:TurnBeamOn(Handle:timer, Handle:data)
    {
    decl String:color[26];

    ResetPack(data);
    new client = ReadPackCell(data);
    new ent = ReadPackCell(data);

    if (IsValidEntity(ent))
    {
    new team = GetClientTeam(client);
    if(team == TEAM_T) color = COLOR_T;
    else if(team == TEAM_CT) color = COLOR_CT;
    else color = COLOR_DEF;

    DispatchKeyValue(ent, "rendercolor", color);
    AcceptEntityInput(ent, "TurnOn");

    new Float:end[3];
    end[0] = ReadPackFloat(data);
    end[1] = ReadPackFloat(data);
    end[2] = ReadPackFloat(data);

    EmitSoundToAll(SND_MINEACT, ent, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, SNDVOL_NORMAL, 100, ent, end, NULL_VECTOR, true, 0.0);
    }

    CloseHandle(data);
    }

    public mineBreak (const String:output[], caller, activator, Float:delay)
    {
    UnhookSingleEntityOutput(caller, "OnBreak", mineBreak);
    AcceptEntityInput(caller,"kill");
    }

    public bool:FilterAll (entity, contentsMask)
    {
    return false;
    }
     
  2. Пихалыч

    Пихалыч ══►Game-Division.Ru◄══

    Сообщения:
    52
    Симпатии:
    0
    На офф сайте посмотри там в 1 теме аж целых 3 вида мин выложили.