You are not logged in.

[CS:S] Bots hängen

Dear visitor, welcome to sourceserver.info. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Tuesday, December 13th 2011, 7:31pm

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

Posts: 1,276

wcf.user.option.userOption53: Nein

  • Send private message

2

Tuesday, December 13th 2011, 7:58pm

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 has attached the following files:
  • laddertest.sp (741 Byte - 146 times downloaded - latest: Apr 23rd 2024, 8:43pm)
  • laddertest.smx (2.79 kB - 147 times downloaded - latest: Apr 23rd 2024, 8:43pm)

This post has been edited 2 times, last edit by "Impact" (Dec 13th 2011, 8:12pm)


3

Tuesday, December 13th 2011, 8:48pm

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

Posts: 3,980

Location: Hagen

Occupation: Mechatroniker (didaktische Systeme)

wcf.user.option.userOption53: Nein

  • Send private message

4

Tuesday, December 13th 2011, 9:01pm

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

Posts: 1,276

wcf.user.option.userOption53: Nein

  • Send private message

5

Tuesday, December 13th 2011, 9:06pm

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

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

This post has been edited 7 times, last edit by "Impact" (Dec 13th 2011, 9:27pm)


6

Tuesday, December 13th 2011, 9:56pm

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

Friday, December 23rd 2011, 11:16pm

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 has attached the following files:

Impact

Super Moderator

Posts: 1,276

wcf.user.option.userOption53: Nein

  • Send private message

8

Saturday, December 24th 2011, 12:14am

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

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

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 has attached the following file:

This post has been edited 2 times, last edit by "Impact" (Dec 24th 2011, 12:26am)


9

Saturday, December 24th 2011, 4:29pm

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

Posts: 1,276

wcf.user.option.userOption53: Nein

  • Send private message

10

Saturday, December 24th 2011, 4:57pm

Ist doch ganz einfach, hier ein Beispiel:

PHP Source code

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

1
IrgendNeFunktion(irgendeinwertGetConVarFloat(h_DelayConVar));

Arbeitest.

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

PHP Source code

1
new g_XyzVar[MAXPLAYERS+1];

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

MfG
impact

This post has been edited 2 times, last edit by "Impact" (Dec 24th 2011, 5:03pm)


11

Saturday, December 24th 2011, 6:32pm

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 has attached the following file: