You are not logged in.

Impact

Super Moderator

  • "Impact" started this thread

Posts: 1,276

wcf.user.option.userOption53: Nein

  • Send private message

1

Thursday, May 3rd 2012, 12:42pm

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 Source code

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 Source code

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

This post has been edited 1 times, last edit by "Impact" (May 3rd 2012, 12:47pm)


Impact

Super Moderator

  • "Impact" started this thread

Posts: 1,276

wcf.user.option.userOption53: Nein

  • Send private message

2

Thursday, May 3rd 2012, 12:46pm

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 Source code

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 Source code

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

Similar threads