Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

worki z piaskiem


  • Zamknięty Temat jest zamknięty
1 odpowiedź w tym temacie

#1 Dead Gamer

    Zaawansowany

  • Użytkownik

Reputacja: 0
Nowy

  • Postów:89
Offline

Napisano 06.08.2009 02:04

Pisze w sprawie tego pluginu: ...
w tym temacie do którego podałem linka wyżej, ktoś podał wersje na której zapisuje sie worki na stale na mapach ale nie potrafię edytować tak, żeby odnawiały sie po każdej rundzie, tzn np jeżeli rozwali sie je w 1 rundzie to już nie pojawia sie do końca mapy tylko po ponownym jej włączeniu. na kilkunastu serwerach, miedzy innymi serwerze zm steru widziałem ze worki pojawiają sie po nowej rundzie. Prosił bym o przerobienie tego pluginu. Zamieszczam kod:

/* AMXX PLUGIN

    Pallets with Bags  
     Version : 0.3c
     Author : SAMURAI

Have a nice day now
*/

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <xs>

#define PLUGIN_NAME     "Pallets with Bags"
#define PLUGIN_VERSION  "0.3c"
#define PLUGIN_AUTHOR   "SAMURAI"

// The sizes of models
#define PALLET_MINS Float:{ -27.260000, -22.280001, -22.290001 }
#define PALLET_MAXS Float:{  27.340000,  26.629999,  29.020000 }


// from fakemeta util by VEN
#define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2)
#define fm_remove_entity(%1) engfunc(EngFunc_RemoveEntity, %1)
// this is mine
#define fm_drop_to_floor(%1) engfunc(EngFunc_DropToFloor,%1)

// cvars
new pnumplugin, remove_nrnd, maxpallets, phealth;

// num of pallets with bags
new palletscout = 0;

/* Models for pallets with bags .
  Are available 2 models, will be set a random of them  */
new g_models[][] =
{
    "models/pallet_with_bags.mdl",
    "models/pallet_with_bags2.mdl"
}

new g_class[] = "amxx_pallets";

/*************************************************************
************************* AMXX PLUGIN *************************
**************************************************************/

public plugin_init()
{
    /* Register the plugin */
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
    
    /* Register the cvars */
    pnumplugin = register_cvar("pallets_wbags","1"); // 1 = ON; 0 = OFF
    remove_nrnd = register_cvar("pallets_wbags_nroundrem","0");
    maxpallets = register_cvar("pallets_wbags_max","64"); // max number of pallets with bags
    phealth = register_cvar("pallets_wbags_health","0"); // set the health to a pallet with bags
    
    /* Game Events */
    register_event("HLTV","event_newround", "a","1=0", "2=0"); // it's called every on new round
    
    /* This is for menuz: */
    register_menucmd(register_menuid("yPallets with Bags:"), 1023, "menu_command" );
    register_clcmd("say pallets_menu","show_the_menu",ADMIN_RCON,"Open the Pallets with Bags menu");
}


public plugin_precache()
{
    for(new i;i < sizeof g_models;i++)
        engfunc(EngFunc_PrecacheModel,g_models[i]);
}

public show_the_menu(id,level,cid)
{
    // check if user doesen't have admin
    if( ! cmd_access( id,level, cid , 0 ))
        return PLUGIN_HANDLED;
        
    // check if the plugin cvar is turned off
    if( ! get_pcvar_num( pnumplugin ) )
        return PLUGIN_HANDLED;
        
        
    // check if user isn't alive
    if( ! is_user_alive( id ) )
    {
        client_print( id, print_chat, "[AMXX] You can't place a pallet with bags because you are dead" );
        return PLUGIN_HANDLED;
    }
            
            
    new szMenuBody[256];
    new keys;
    
    new nLen = format( szMenuBody, 255, "yPallets with Bags:^n" );
    nLen += format( szMenuBody[nLen], 255-nLen, "^nw1. Place a pallet with bags" );
    nLen += format( szMenuBody[nLen], 255-nLen, "^nw2. Remove a pallet with bags" );
    nLen += format( szMenuBody[nLen], 255-nLen, "^nw3. Remove all pallets with bags" );
    nLen += format( szMenuBody[nLen], 255-nLen, "^nw4. Save Pallets with Bags origins" );
    nLen += format( szMenuBody[nLen], 255-nLen, "^n^nw0. Exit" );

    keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<9)

    show_menu( id, keys, szMenuBody, -1 );

    // depends what you want, if is continue will appear on chat what the admin sayd
    return PLUGIN_HANDLED;
}

public plugin_cfg()
{
    static sConfigsDir[256], sFile[256], PalletDir[256];
    
    get_configsdir(sConfigsDir, sizeof sConfigsDir - 1);
    
    static sMapName[32];
    get_mapname(sMapName, sizeof sMapName - 1);
    
    formatex(PalletDir, sizeof PalletDir - 1,"%s/Pallets with Bags",sConfigsDir);
    formatex(sFile, sizeof sFile - 1, "%s/%s_pallets_with_bags.cfg",PalletDir,sMapName);
    
    //formatex(sFile, sizeof sFile - 1, "%s/%s_pallets_with_bags.cfg", sConfigsDir, sMapName);
    
    
    if(!dir_exists(PalletDir))
    {
        mkdir(PalletDir);
    }
    
    if(!file_exists(sFile))
    {
        write_file(sFile,"");
    }
    
    static sFileOrigin[3][32], sFileAngles[3][32], iLine, iLength, sBuffer[256];
    static sTemp1[128], sTemp2[128];
    static Float:fOrigin[3], Float:fAngles[3];
    
    while(read_file(sFile, iLine++, sBuffer, sizeof sBuffer - 1, iLength))
    {
        if((sBuffer[0]==';') || !iLength)
            continue;
        
        strtok(sBuffer, sTemp1, sizeof sTemp1 - 1, sTemp2, sizeof sTemp2 - 1, '|', 0);
        
        parse(sTemp1, sFileOrigin[0], sizeof sFileOrigin[] - 1, sFileOrigin[1], sizeof sFileOrigin[] - 1, sFileOrigin[2], sizeof sFileOrigin[] - 1);
        
        fOrigin[0] = str_to_float(sFileOrigin[0]);
        fOrigin[1] = str_to_float(sFileOrigin[1]);
        fOrigin[2] = str_to_float(sFileOrigin[2]);
        
        parse(sTemp2, sFileAngles[0], sizeof sFileAngles[] - 1, sFileAngles[1], sizeof sFileAngles[] - 1, sFileAngles[2], sizeof sFileAngles[] - 1);
        
        fAngles[0] = str_to_float(sFileAngles[0]);
        fAngles[1] = str_to_float(sFileAngles[1]);
        fAngles[2] = str_to_float(sFileAngles[2]);
        
        
        /////////////////////////////////////////////////////////////////////
        
        if( palletscout == get_pcvar_num(maxpallets) )
        {
            server_print("Can't be placed more than %d pallets with bags",get_pcvar_num(maxpallets));
            return 0;
        }
        
        new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall"));
        
        engfunc(EngFunc_SetOrigin, ent, fOrigin);
        
        if(!ent)
            return 0;
        
        engfunc(EngFunc_SetModel,ent,g_models[random(sizeof g_models)]);
        
        set_pev(ent,pev_classname,g_class);
        
        dllfunc(DLLFunc_Spawn, ent);
        
        set_pev(ent,pev_solid,SOLID_BBOX);
        
        // set the movetype
        set_pev(ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff
        
        // set sizes
        static Float:p_mins[3], Float:p_maxs[3];
        p_mins = PALLET_MINS;
        p_maxs = PALLET_MAXS;
        engfunc(EngFunc_SetSize, ent, p_mins, p_maxs);
        set_pev(ent, pev_mins, p_mins);
        set_pev(ent, pev_maxs, p_maxs );
        set_pev(ent, pev_absmin, p_mins);
        set_pev(ent, pev_absmax, p_maxs );
    
        // now the damage stuff, to set to take it or no
        // if you set the cvar "pallets_wbags_health" 0, you can't destroy a pallet with bags
        // else, if you want to make it destroyable, just set the health > 0 and will be
        // destroyable.
        new Float:p_cvar_health = get_pcvar_float(phealth);
        
        switch(p_cvar_health)
        {
            case 0.0 :
            {
                set_pev(ent,pev_takedamage,DAMAGE_NO);
            }
        
            default :
            {
                set_pev(ent,pev_health,p_cvar_health);
                set_pev(ent,pev_takedamage,DAMAGE_YES);
            }
        }
    
        set_pev(ent,pev_angles,fAngles);
        
        // drop entity to floor
        fm_drop_to_floor(ent);
    
        // num ..
        palletscout++;
        
        
    }
    
    return 1;
    
}


public menu_command(id,key,level,cid)
{
    switch( key )
    {
        // place a pallet with bags
        case 0:
        {
                place_palletwbags(id);
                show_the_menu(id,level,cid);
        }
        
        // remove a pallet with bags
        case 1:
        {
            new ent, body, class[32];
            get_user_aiming(id, ent, body);
            
            if (pev_valid(ent))
            {
                pev(ent, pev_classname, class, 31);
                
                if (equal(class, g_class))
                {
                    fm_remove_entity(ent);
                    palletscout--;
                }
                
                else
                    client_print(id, print_chat, "[AMXX] You are not aiming at a pallet with bags");
            }
            else
                client_print(id, print_chat, "[AMXX] You are not aiming at a valid entity !");
                
            show_the_menu(id,level,cid);
        }
        
        // remove all pallets with bags
        case 2:
        {
            remove_allpalletswbags();
            client_print(id,print_chat,"[AMXX] You removed all pallets with bags !");
            show_the_menu(id,level,cid);
        }
        
        
        // save origins
        case 3:
        {
            static sConfigsDir[256], sFile[256], PalletDir[256];
    
            get_configsdir(sConfigsDir, sizeof sConfigsDir - 1);
    
            static sMapName[32];
            get_mapname(sMapName, sizeof sMapName - 1);
    
            formatex(PalletDir, sizeof PalletDir - 1,"%s/Pallets with Bags",sConfigsDir);
            formatex(sFile, sizeof sFile - 1, "%s/%s_pallets_with_bags.cfg",PalletDir,sMapName);
        
            if(file_exists(sFile))
                delete_file(sFile);
    
            new iEnt = -1, Float:fEntOrigin[3], Float:fEntAngles[3], iCount;
            static sBuffer[256];
    
            while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_class)))
            {
                pev(iEnt, pev_origin, fEntOrigin);
                pev(iEnt, pev_angles, fEntAngles);
        
                formatex(sBuffer, sizeof sBuffer - 1, "%f %f %f | %f %f %f", fEntOrigin[0], fEntOrigin[1], fEntOrigin[2], fEntAngles[0], fEntAngles[1], fEntAngles[2]);
        
                write_file(sFile, sBuffer, -1);
        
                iCount++;
            }
        
            client_print(id, print_chat, "[AMXX] Successfuly saved all pallets with bags origins (%d) for map %s!", iCount,sMapName);
            
            show_the_menu(id,level,cid);
            
        }
    }
    
    return PLUGIN_HANDLED;
}



public place_palletwbags(id)
{
    
    if( palletscout == get_pcvar_num(maxpallets) )
    {
        client_print(id,print_chat,"You can't place more than %d pallets with bags",get_pcvar_num(maxpallets));
        return PLUGIN_HANDLED;
    }
    
    // create a new entity
    new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall"));
    
    
    // set a name to the entity
    set_pev(ent,pev_classname,g_class);
    
    // set model        
    engfunc(EngFunc_SetModel,ent,g_models[random(sizeof g_models)]);
    
    // register a new var. for origin
    static Float:xorigin[3];
    get_user_hitpoint(id,xorigin);
    
    
    // check if user is aiming at the air
    if(engfunc(EngFunc_PointContents,xorigin) == CONTENTS_SKY)
    {
        client_print(id,print_chat,"[AMXX] You can't place a pallet with bags on the air");
        return PLUGIN_HANDLED;
    }
    
    
    // set sizes
    static Float:p_mins[3], Float:p_maxs[3];
    p_mins = PALLET_MINS;
    p_maxs = PALLET_MAXS;
    engfunc(EngFunc_SetSize, ent, p_mins, p_maxs);
    set_pev(ent, pev_mins, p_mins);
    set_pev(ent, pev_maxs, p_maxs );
    set_pev(ent, pev_absmin, p_mins);
    set_pev(ent, pev_absmax, p_maxs );

    
    // set the rock of origin where is user placed
    engfunc(EngFunc_SetOrigin, ent, xorigin);
    
    
    // make the rock solid
    set_pev(ent,pev_solid,SOLID_BBOX); // touch on edge, block
    
    // set the movetype
    set_pev(ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff
    
    // now the damage stuff, to set to take it or no
    // if you set the cvar "pallets_wbags_health" 0, you can't destroy a pallet with bags
    // else, if you want to make it destroyable, just set the health > 0 and will be
    // destroyable.
    new Float:p_cvar_health = get_pcvar_float(phealth);
    switch(p_cvar_health)
    {
        case 0.0 :
        {
            set_pev(ent,pev_takedamage,DAMAGE_NO);
        }
        
        default :
        {
            set_pev(ent,pev_health,p_cvar_health);
            set_pev(ent,pev_takedamage,DAMAGE_YES);
        }
    }
    
            
    static Float:rvec[3];
    pev(id,pev_v_angle,rvec);
    
    rvec[0] = 0.0;
    
    set_pev(ent,pev_angles,rvec);
    
    // drop entity to floor
    fm_drop_to_floor(ent);
    
    // num ..
    palletscout++;
    
    // confirm message
    client_print(id,print_chat,"[AMXX] You placed a Pallet with Bags !");
    
    return PLUGIN_HANDLED;
}
    
/* ====================================================
get_user_hitpoin stock . Was maked by P34nut, and is
like get_user_aiming but is with floats and better <img src='https://amxx.pl/public/style_emoticons/<#EMO_DIR#>/ohmy.gif' class='bbc_emoticon' alt=':o' />
====================================================*/    
stock get_user_hitpoint(id, Float:hOrigin[3])
{
    if ( ! is_user_alive( id ))
        return 0;
    
    new Float:fOrigin[3], Float:fvAngle[3], Float:fvOffset[3], Float:fvOrigin[3], Float:feOrigin[3];
    new Float:fTemp[3];
    
    pev(id, pev_origin, fOrigin);
    pev(id, pev_v_angle, fvAngle);
    pev(id, pev_view_ofs, fvOffset);
    
    xs_vec_add(fOrigin, fvOffset, fvOrigin);
    
    engfunc(EngFunc_AngleVectors, fvAngle, feOrigin, fTemp, fTemp);
    
    xs_vec_mul_scalar(feOrigin, 9999.9, feOrigin);
    xs_vec_add(fvOrigin, feOrigin, feOrigin);
    
    engfunc(EngFunc_TraceLine, fvOrigin, feOrigin, 0, id);
    global_get(glb_trace_endpos, hOrigin);
    
    return 1;
}


/* ====================================================
This is called on every round, at start up,
with HLTV logevent. So if the "pallets_wbags_nroundrem"
cvar is set to 1, all placed pallets with bags will be
removed.
====================================================*/
public event_newround()
{
    if( get_pcvar_num ( remove_nrnd ) == 1)
        remove_allpalletswbags();
        
}


/* ====================================================
This is a stock to help for remove all pallets with
bags placed . Is called on new round if the cvar
"pallets_wbags_nroundrem" is set 1.
====================================================*/
stock remove_allpalletswbags()
{
    new pallets = -1;
    while((pallets = fm_find_ent_by_class(pallets, g_class)))
        fm_remove_entity(pallets);
        
    palletscout = 0;
}

  • +
  • -
  • 0

#2 Miczu

    Godlike

  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 08.08.2009 22:08

Na szybkiego (ma pewna wade) mozna zrobic to tak:

public event_newround() 
{ 
    if( get_pcvar_num ( remove_nrnd ) == 1) 
        remove_allpalletswbags(); 
    plugin_cfg()        
}

  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych