Sie sind nicht angemeldet.

Impact

Super Moderator

  • »Impact« ist der Autor dieses Themas

Beiträge: 1 276

Rootserver vorhanden: Nein

  • Nachricht senden

1

Donnerstag, 3. Mai 2012, 12:42

Allgemeine Optimierungen und Logik

In diesem Thread möchte ich typische Probleme bei logischen Vergleichen aufzeigen die manchmal passieren.

Nehmen wir an wir möchten alle Bots slayen, schauen wir uns mal diesen Code an.

PHP-Quelltext

1
2
3
4
5
6
7
for(new i=1<= MaxClientsi++)
{
    if(IsClientInGame(i) && GetClientTeam(i) > && IsPlayerAlive(i) && IsFakeClient(i))
    {
        // slay
    }
}

Hier werden folgende Aufrufe gemacht

  • Ist spieler inGame?
  • Ist Spieler in einem Team das nicht Spectator ist
  • Ist der Spieler am Leben?
  • Ist der Spieler ein Bot?

Da wir uns hier auf Bots konzentrieren sollte man prüfen ob der Spieler ein Bot ist bevor man die anderen Checks macht.
Wenn der Spieler nämlich kein Bot ist interessiert uns auch sein Team oder sein Leben nicht.

So würde das Script richtig aussehen.

PHP-Quelltext

1
2
3
4
5
6
7
for(new i=1<= MaxClientsi++)
{
    if(IsClientInGame(i) && IsFakeClient(i) && IsPlayerAlive(i))
    {
        // slay
    }
}

Hier werden auf normale Spieler nur noch folgende Aufrufe gemacht
  • Ist spieler inGame?
  • Ist der Spieler ein Bot?

Den Teamcheck kann man hier im Normalfall auch weg lassen, da Bots (Außer SourceTv) nicht in den Spectatormode wechseln.

MfG
Impact

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Impact« (3. Mai 2012, 12:47)


Impact

Super Moderator

  • »Impact« ist der Autor dieses Themas

Beiträge: 1 276

Rootserver vorhanden: Nein

  • Nachricht senden

2

Donnerstag, 3. Mai 2012, 12:46

Ein anderes Beispiel aus dem Alliedmodsforum.
Der Requester wollte ein Adminlistplugin soweit anpassen dass es nur Generic Admins anzeigt, aber keine die einen Rootflag haben.
Als Beispiel wurde ihm dann etwas ähnliches wie das hier zugeschickt.

PHP-Quelltext

1
2
3
4
5
6
7
for(new i=1<= MaxClientsi++)
{
    if(IsClientInGame(i) && CheckCommandAccess(i""ADMFLAG_GENERIC) && !CheckCommandAccess(i""ADMFLAG_ROOT))
    {
        // Anzeige
    }
}

Das Problem hier ist, dass egal ob der Spieler nun einen Rootflag hat oder nicht, immer 2 Calls notwendig sind.

Richtig sähe das Beispiel so aus.

PHP-Quelltext

1
2
3
4
5
6
7
for(new i=1<= MaxClientsi++)
{
    if(IsClientInGame(i) && !CheckCommandAccess(i""ADMFLAG_ROOT) && CheckCommandAccess(i""ADMFLAG_GENERIC))
    {
        // Anzeige
    }
}

Hier wird bei Spielern mit Rootflag nur 1 Abfrage gemacht.

MfG
Impact

Ähnliche Themen