←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Czytanie map z pliku - pętla

  • +
  • -
Scorpion Flail - zdjęcie Scorpion Flail 28.08.2013

Witam. Mam taki kod:

new sniperlevel = g_PlayerBadges[id][BADGE_SNIPER];
    
    if ( sniperlevel )
    {
        if ( random_num(1, (4-sniperlevel)) == 1 )
        {
            new weaponName[32];
            new weaponID = get_user_weapon(id);
            
            new file[128];
            new map[32];
    
            get_configsdir( file, 127 )
        
            format(file,127,"%s/odznaki/scout.ini",file)
            
            new line=0,text[128],chars
            
            
            line = read_file(file,line,text,127,chars)
            trim(text);
            get_mapname(map,31);
            trim(text);
            if(equali(map,text))
            {
                ColorChat(id,RED,"Scout zablokowany na tej mapie");
                givenitem = false;            
    
                
                
            }
            
            
            else
            {
                fm_give_item(id, "weapon_scout");
                givenitem = true;
                
                
            }
            
            
            
            
            
            if ( weaponID )
            {
                get_weaponname(weaponID, weaponName, charsmax(weaponName));
                engclient_cmd(id, weaponName);
                
            }
            
            
        
            
            
        }
    }

Obecnie jest tak, że czyta tylko 1-szą mapę z pliku. Na innych robi jakby nie były dodane do pliku.

 

Próbowałem z do/while, jednak wtedy na 1 mapie wykonywało co chciałem, a na kolejnych robilo 2 rzeczy: pokazywało tekst i dawało scouta.

 

Nie wiem już w jaki sposób to zapisać, proszę o pomoc.

Odpowiedz

  • +
  • -
Scorpion Flail - zdjęcie Scorpion Flail 28.08.2013

Tak to teraz wygląda:

  if ( sniperlevel )
    {
        if ( random_num(1, (4-sniperlevel)) == 1 )
        {
            
         new weaponName[32];
        new weaponID = get_user_weapon(id);
        
        
        new g_MapName[32];
        get_mapname(g_MapName, charsmax(g_MapName));
    
        new g_Path[128];
        formatex(g_Path[ get_configsdir(g_Path, charsmax(g_Path)) ], charsmax(g_Path), "/codmod_mapy.ini");
    
        new g_Line[128],
            g_Len;
    for(new i = 0; read_file(g_Path, i, g_Line, charsmax(g_Line), g_Len); i++)
    {
        if(!g_Len || !g_Line[0] || g_Line[0] == ';')
        {
            continue;
        }
        trim(g_Line);
        
        if(equal(g_MapName, g_Line))
        {
            ColorChat(id,RED,"Scout zablokowany na tej mapie");
            givenitem = false;            
    
                
                
        }
            
            
        else
        {
            fm_give_item(id, "weapon_scout");
            givenitem = true;
                
                
        }
            
            
           }
            
            
        if ( weaponID )
        {
            get_weaponname(weaponID, weaponName, charsmax(weaponName));
            engclient_cmd(id, weaponName);
                
        }
            
            
        
            
            
        }
    }

Nie jestem pewien czy tego else miałem też objąć i gdzie dać break: po pokazaniu tekstu czy po wykonaniu else?

Odpowiedz

  • +
  • -
speedkill - zdjęcie speedkill 28.08.2013

formatex(g_Path[ get_configsdir(g_Path, charsmax(g_Path)) ], charsmax(g_Path), "/codmod_mapy.ini");
->
formatex(g_Path[ get_configsdir(g_Path, charsmax(g_Path)) ], charsmax(g_Path), "/odznaki/scout.ini");
if(equal(g_MapName, g_Line))
{
	ColorChat(id,RED,"Scout zablokowany na tej mapie");
	givenitem = false;            
}
->
if(equal(g_MapName, g_Line))
{
	ColorChat(id,RED,"Scout zablokowany na tej mapie");
	givenitem = false;      
	break;
}
Odpowiedz

  • +
  • -
Scorpion Flail - zdjęcie Scorpion Flail 28.08.2013

Kod wygląda tak:

if ( sniperlevel )
    {
        if ( random_num(1, (4-sniperlevel)) == 1 )
        {
            
        new weaponName[32];
        new weaponID = get_user_weapon(id);
        
        
        new g_MapName[32];
        get_mapname(g_MapName, charsmax(g_MapName));
    
        new g_Path[128];
        formatex(g_Path[ get_configsdir(g_Path, charsmax(g_Path)) ], charsmax(g_Path), "/odznaki/scout.ini");
    
        new g_Line[128],
            g_Len;
        for(new i = 0; read_file(g_Path, i, g_Line, charsmax(g_Line), g_Len); i++)
        {
            
            
        if(!g_Len || !g_Line[0] || g_Line[0] == ';')
        {
            continue;
        }
        trim(g_Line);
        
        if(equal(g_MapName, g_Line))
        {
            ColorChat(id,RED,"Scout zablokowany na tej mapie");
            givenitem = false;  
            break;
                
        }
            
            
        else
        {
            fm_give_item(id, "weapon_scout");
            givenitem = true;
                
                
        }
            
            
        }
            
            
        if ( weaponID )
        {
            get_weaponname(weaponID, weaponName, charsmax(weaponName));
            engclient_cmd(id, weaponName);
                
        }
            
            
        
            
            
        }
    }

Jest nadal jak było tzn:

na 1. mapie w pliku działa prawidłowo, jednak na kolejnych:

robi 2x rzeczy na raz, tj pokazuje colorchat i daje scouta jednocześnie

 

 

Plik z mapami:

 

Załączony plik  scout.ini   40 bajtów   16 Ilość pobrań

 

Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 19.09.2013

no bo rak napisales kod zeby to robil :P

 

mapa de_dust

 

a w pliku masz de_dust i inferno wiec przy pierwszym razie pisze ze zablokowany scout ale przy nastepnym juz nie bo grasz dusta a czytasz inferno zrob sobie osobna funkcje do sprawdzania czy dana mapa ma zablokowanego scouta i sprawdzaj to w plugin_init i ustawiaj jakąś zmienna globalną i na jej podstawie zrob warunek

Odpowiedz