Sie sind nicht angemeldet.

[CS:S] Bots hängen

1

Dienstag, 13. Dezember 2011, 19:31

Bots hängen

Hi,

ich habe schon seit einiger Zeit Probleme mit Bots auf bestimmten Maps.
ZB hängen sie mal ganz gerne an Leitern.
Wenn nun Spieler joinen können sie nicht spawnen, da die Runde schon zu lange läuft.

Hat wer ne Idee wie man dieses Problem umgehen kann?
Oder gibts dafür zufällig einn Plugin?

Impact

Super Moderator

Beiträge: 1 276

Rootserver vorhanden: Nein

  • Nachricht senden

2

Dienstag, 13. Dezember 2011, 19:58

Meines Wissens nach gibt es speziell dafür kein Plugin.
Eine Idee wäre die .Nav Dateien von Hand anzupassen, allerdings kommt da ein kleines Problem auf einen zu, du weißt sicher welches ich meine.
Man könnte naürlich ein Plugin schreiben das im Prinzip so wie AntiCamp:Source funktioniert, allerdings nur Bots checkt, und nicht direkt die Position, sondern nur ob der Bot auf einer Leiter ist checkt.
Die Codes dafür findet man wie gesagt in AntiCamp Source, und in Infinite-Jumping.
Hoffe das hilft dir irgendwo.

Edit: Ich habe dir im Anhang ein Beispiel geschrieben wie du das machen könntest. Muss man halt noch justieren, und ein paar Sachen ändern.

MfG
Impact
»Impact« hat folgende Dateien angehängt:
  • laddertest.sp (741 Byte - 146 mal heruntergeladen - zuletzt: 23. April 2024, 20:43)
  • laddertest.smx (2,79 kB - 147 mal heruntergeladen - zuletzt: 23. April 2024, 20:43)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Impact« (13. Dezember 2011, 20:12)


3

Dienstag, 13. Dezember 2011, 20:48

Erstmal danke, das du dir die Mühe gemacht hast was zu coden.

Ich glaube ich werde das ganze aber ohen Timer realisieren.
Wenn ein oder mehrere Spieler auf dem Server ist/sind oder joinen und diese tot sind aber die Bots noch leben, wird die Runde einfach neu gestartet.
Das dürfte wahrscheinlich Performance schonender sein.

DeaD_EyE

Administrator

Beiträge: 3 980

Wohnort: Hagen

Beruf: Mechatroniker (didaktische Systeme)

Rootserver vorhanden: Nein

  • Nachricht senden

4

Dienstag, 13. Dezember 2011, 21:01

Ich weiß, dass man selbst als Listenserver die Navigationmeshes bearbeiten kann. Dazu gehören auch Ladder-Mount-Points. Welche Befehle dazu notwendig sein, kann ich dir leider nicht sagen. Wahrscheinlich findest du in einem Mapperforum (nicht hier) mehr Infos. Wenn du mit dem Bearbeiten fertig bist, speichert man soweit ich weiß die Änderungen mit einem Befehl. Die neu erstellte NAV-Datei muss dann auf den Server hochgeladen werden und die Bots sollten dann auch mit den Leitern klar kommen.

Dieses Problem gibt es auf allen Maps, zu denen die NAV-Dateien durch den Server berechnet worden sind. Gute Mapper berücksichtigen das und erstellen diese Dateien in mühevoller Kleinarbeit. Der wiskyjim weiß dazu wahrscheinlich mehr.

Impact

Super Moderator

Beiträge: 1 276

Rootserver vorhanden: Nein

  • Nachricht senden

5

Dienstag, 13. Dezember 2011, 21:06

@DeadEye
Das Problem was daraus resultiert ist dass viele nicht mehr joinen können "Your nav differs from the server"

@Mathmos
Das wäre natürlich auch eine Idee, und ist relativ einfach zu coden, vorallem jetzt durch die neuen CS_TerminateRound natives
Dennoch denke ich nicht dass diese kleine Funktion all zu viel Leistung frisst :)
Irgendwo im AM-Forum hatte ich eine Diskussion verfolgt, dass ähnliches etwa 3-4 mal pro Sekunde InGame passiert.
Wenn ich den Thread mal wieder finde werde ich ihn dir gerne zukommen lassen

Edit: Hier gibt es einen guten Artikel darüber wie man Navfile bearbeiten kann.
Achja, ich habe mal den Profiler mit 12 Bots durchlaufen lassen:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
Profilertime0.000002 seconds
Profilertime0.000001 seconds
Profilertime0.000002 seconds
Profilertime0.000002 seconds
Profilertime0.000001 seconds
Profilertime0.000001 seconds
Profilertime0.000001 seconds
Profilertime0.000001 seconds
Profilertime0.000001 seconds
Profilertime0.000001 seconds
Profilertime0.000001 seconds
Profilertime0.000002 seconds

Auf eine Minute hochgerechnet sind das: 0,00012 Sekunden
Auf eine Stunde hochgerechnet sind das: 0,0072 Sekunden
Auf einen Tag hochgerechnet sind das: 0,1728 Sekunden
Auf einen Monat hochgerechnet sind das: 5,25948766 Sekunden
Auf ein Jahr hochgerechnet sind das 63,113852 Sekunden

Ich übertreibe mal wieder maßlos 8o

MfG
Impact

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »Impact« (13. Dezember 2011, 21:27)


6

Dienstag, 13. Dezember 2011, 21:56

Also der ganze Rattenschwanz, der an der Bearbeitung einer nav hängt, ist mir einfach zu lang ;)
Erstrecht nachdem ich mir die Seite angesehen habe, die Impact gepostet hat.
Zumal ich das für jede Map machen müsste, bei der die Bots hängen, am besten sogar bei allen.

Da sind doch so ein paar Zeilen Code wesentlich einfacher zu realisieren.
Aber danke für die Ideen und für CS_TerminateRound. Wusste gar nicht, dass es das jetzt gibt.
Erleichtert ja so einiges =)

7

Freitag, 23. Dezember 2011, 23:16

Also ich hab da jetzt mal n kleines Script fertig gemacht.
Es wird eine neue Runde gestartet wenn nur noch Bots am leben sind.

Evtl. hat ja jemand eine Idee wie das Plugin heißen soll, zur Zeit trägt es den Namen "RoundRestarter", was ja aber irgendwie nicht so hundertprozentig zutreffend ist.
Aber mir fällt einfach nichts besseres ein.

Ideen, Anregungen, ..., gerne erwünscht =)
»Mathmos« hat folgende Dateien angehängt:
  • roundrestarter.sp (2,12 kB - 142 mal heruntergeladen - zuletzt: 23. April 2024, 20:44)
  • roundrestarter.smx (2,63 kB - 137 mal heruntergeladen - zuletzt: 23. April 2024, 20:44)

Impact

Super Moderator

Beiträge: 1 276

Rootserver vorhanden: Nein

  • Nachricht senden

8

Samstag, 24. Dezember 2011, 00:14

Da du ja Kritik erwünscht, habe ich mal kurz darüber geschaut und die Sachen die ich anders gemacht hätte mal umgeschrieben und ein bisschen kommentiert.
Ich Liste es mal hier auch noch auf.

PHP-Quelltext

1
restart_delay  GetConVarFloat(FindConVar("mp_round_restart_delay"));

Es ist zwar sehr unwahrscheinlich dass sich die ConVar ändert, aber eventuell sollte man hier einen Cvar ChangeHook draufhauen.

Auch wenn BotCheck nicht wirklich eine happige Funktion ist könnte man diesen Check vielleicht durch eine Globale Variable erledigen, je nach Bedarf.

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
public BotCheck()
{
    new playersConnected GetMaxClients();
    for (new 1playersConnectedi++)
    {
        if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i))
        {
            return true;
        }
    }
    return false;
}

Hier ist das public unnötig.
GetMaxClients sollte durch die Variable MaxClients ersetzt werden (Steht auch in der API).


MfG
Impact
»Impact« hat folgende Datei angehängt:
  • roundrestarter.sp (1,1 kB - 136 mal heruntergeladen - zuletzt: 23. April 2024, 20:44)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Impact« (24. Dezember 2011, 00:26)


9

Samstag, 24. Dezember 2011, 16:29

Erstmal danke =)

Ich habe mal versucht einen CvarChangeHook zu machen... aber bin kläglich gescheitert^^
Habs nach folgendem Beispiel gemacht:
http://wiki.alliedmods.net/ConVars_%28So…hange_Callbacks

Über der Funktion "public OnClientConnected(client)" hast du geschrieben, das man das chachen könnte.
Allerdings versteh ich nicht was du da mit meinst.

Impact

Super Moderator

Beiträge: 1 276

Rootserver vorhanden: Nein

  • Nachricht senden

10

Samstag, 24. Dezember 2011, 16:57

Ist doch ganz einfach, hier ein Beispiel:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
new Float:restart_dely;
new Handle:h_DelayConVar;



public OnPluginStart()
{
    h_DelayConVar  FindConVar("mp_round_restart_delay");
    restart_delay  GetConVarFloat(h_DelayConVar);
    HookConVarChange(h_DelayConVarOnCvarChange);
}



public OnCvarChange(Handle:cvar, const String:oldVal[], const String:newVal[])
{
    restart_delay  GetConVarFloat(h_DelayConVar);
}

Die andere Möglichkeit wäre dass du direkt in den Funktionen mit

PHP-Quelltext

1
IrgendNeFunktion(irgendeinwertGetConVarFloat(h_DelayConVar));

Arbeitest.

Mit dem cachen meinte ich dass du das per Globaler Variable a`la

PHP-Quelltext

1
new g_XyzVar[MAXPLAYERS+1];

Machst, allerdings macht das bei dem Script wohl nicht so wirklich Sinn.

MfG
impact

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Impact« (24. Dezember 2011, 17:03)


11

Samstag, 24. Dezember 2011, 18:32

Danke, ich hab was vergessen, deshalb hat das hooken nicht funktioniert ;)

Am Anfang hatte ich in den Funktionen eine ConVar Abfrage drin, allerdings hatte ich diese rausgeschmissen, da bei jedem toten Spieler eine neue Abfrage ja etwas übertrieben ist und ein ineffizienter Programmierstil ist. Aber das hooken hat ja jetzt geklappt. Ich denke mal, dass es eine gute Lösung ist.

Anbei noch die aktuellste Version
»Mathmos« hat folgende Datei angehängt:
  • roundrestarter.sp (2,34 kB - 144 mal heruntergeladen - zuletzt: 23. April 2024, 20:44)

Ähnliche Themen