Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
13.05.2008, 19:28
RikkuZooo



Hier ist mein Tutorial um in HL1 denn Coop zu aktivieren.

Zuerst oeffnen wir die triggers.cpp und suchen nach:

Quellcode:// Don't work in deathmatch
if ( g_pGameRules->IsDeathmatch() )
return;
und andern es in:

Quellcode:// Don't work in deathmatch
// if ( g_pGameRules->IsDeathmatch() )
// return;
etwas weiter unten:

Quellcode:CHANGE_LEVEL( st_szNextMap, st_szNextSpot ); und andern es in:

Quellcode:CHANGE_LEVEL( st_szNextMap, NULL ); Das erlaubt in Multiplayer auf Singleplayer maps denn level
uebergang zu erlauben ohne denn server aus zu schalten.

So das war der erste teil fuer denn Coop-Modus.

Jetzt oeffnen wir die Datei multiplay_gamerules.cpp und suchen nach:

Quellcode:BOOL CHalfLifeMultiplay::IsCoOp( void ) Hier andern wir denn code in True also sieht es so aus jetzt:

Quellcode:BOOL CHalfLifeMultiplay::IsCoOp( void )
{
return TRUE;
}
Nun muessen wir dafuer sorgen das auch NPC in multiplayer sind das
ist auch einfach zu andern. :) wir oeffnen die datei game.cpp und suchen nach:

Quellcode:cvar_t    allowmonsters={"mp_allowmonsters","0", FCVAR_SERVER }; und andern es in:

Quellcode:cvar_t    allowmonsters={"mp_allowmonsters","1", FCVAR_SERVER }; Zu sicherheit machen wir auch in der Server.cfg und listserver.cfg denn eintrag:

Quellcode:mp_allowmonsters "1" PS: Ich habe das SDK fuer denn Singleplayer genommen.

--

AirChina Mobile


Dieser Beitrag wurde am 13.05.2008 um 19:32 von RikkuZooo bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
13.05.2008, 20:05
Bluthund



2 kleine Anmerkungen:
1. Warum kommentierst du den Block aus. Es wäre sehr viel sinnvoller im jeweiligen Gameplay-Ruleset die Methode IsDeathmatch() zu überschreiben und false zurückzugeben. Mit dem Auskommentieren bewerkstelligst du aber, dass keine Unterscheidung zwischen einem Deathmatch-Gamemode und anderen gemacht wird. Es wird also alles eine "Suppe".

2. Wenn du den Default-Wert für mp_allowmonsters auf 1 setzt, brauchst du ihn nicht in der Config auf 1 setzen (auch nicht zur Sicherheit). Außerdem ist auch hier die globale Einstellung sicher nicht immer von Vorteil. Imho wäre ne Stelle im Code sinnvoll, die die CVar dann auf 1 setzt, wenn auch der Coop-Gamemode geladen wird (zB in der jeweiligen Init-Methode). Die cvar_t's sind ja global womit das auch kein Problem darstellen sollte, dass an passender Stelle zu realisieren.

Alles in allem also zusammengefasst:
Nicht alles so absolut festlegen und mal etwas allgemeiner rangehen. Der Ansatz hier funktioniert sicherlich ausgezeichnet wenn man vorhat, nur Coop als einzigen Spielmodus zu realisieren. Will man aber zB Deathmatch und Coop (und evtl auch noch andere wie CTF/CTO o.ä), hat man unweigerlich mit den globalen Veränderungen für den Coop-Modus zu kämpfen.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
002
13.05.2008, 20:11
RikkuZooo



Also ich hatte erst in der option in der game.cpp denn wert auf 1 bei
mp_allowmonsters aber wenn ich einen server aufgemacht habe hats
sich irgendwie auf 0 gesetzt ja klar ich könte eine if abfrage machen
an der option zb.

Quellcode:// Don't work in deathmatch
if ( g_pGameRules->IsDeathmatch() )
{
return;
}
elseif ( g_pGameRules->IsCoop() )
{
}
des weiteren funktioniert der Deathmatch ohne probleme
da ja in Deathmatch maps keine Map Change trigger gibt
oder? genauso wie in ctf usw.

--

AirChina Mobile


Dieser Beitrag wurde am 13.05.2008 um 20:14 von RikkuZooo bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
13.05.2008, 20:34
Bluthund



Wenn mp_allowmonsters auf 0 war nachdem du den Default-Wert geändert hast, muss an irgendeiner Stelle nach der Erstellung der CVar eine Belegung stattgefunden haben. Da müsste man dann nachzuforschen wo das war. Entweder im Code oder in geladenen Configdateien.
Im Code gibts nur eine einzige Stelle und das ist das Worldspawn-Entity welches den Mapper festlegen lässt ob in der Map Monster erlaubt sein sollen oder nicht.

Zitat:
ja klar ich könte eine if abfrage machen an der option zb.
Nope, da hast du mich falsch verstanden.
An der Stelle in CChangeLevel::ChangeLevelNow() sollst du gar nichts ändern. Sondern im jeweiligen Ruleset. In deinem Fall wäre das die CHalfLifeMultiplay::IsDeathmatch(). Da müsstest du entsprechend FALSE zurückgeben um auch mitzuteilen, dass es sich bei diesem Spielmodus nicht um Deathmatch handelt. Denn diese Methode wird ja auch noch an anderen Stellen aufgerufen um festzustellen, um was für eine Art Spielmodus es sich handelt. Entsprechend werden dann auch Schritte ergriffen, um bestimmte Sachen einzustellen oder auszublenden (wie es halt normalerweise beim trigger_changelevel der Fall ist).
Und nur weil gängige dm_ bzw ctf_ Maps keine trigger_changelevel enthalten, heißt das nicht, dass es nicht Leute gibt die trotzdem welche einbauen ;)

Desweiteren kann man auch Maps für mehrere Zwecke nutzen. Zum Beispiel über eine Server-CVar welche den Spielmodus bestimmt. Nennen wir sie mal sv_gamemode mit den Werten 0 für DM, 1 für CTF und 2 für Coop. Dann wird vorm Gamerules spawnen gekuckt welchen Wert die CVar hat und dann entsprechend gespawned. Oder auch wie bei CS wo das ganze über spezielle Entities reguliert wird.
Und jetzt stell dir mal vor was passiert, wenn wie oben beschrieben die Abfrage nach g_pGameRules->IsDeathmatch() wegfällt. Deathmatch/CTF läuft auf ner Map welche für alle drei Spielmodi erstellt wurde und ein Spieler kommt an ne bestimmte Stelle der Map und schon gibts nen Mapchange.

Wie gesagt für deinen speziellen Fall mag das alles unrelevant sein aber in nem Thread der mit [Tutorial] getaggt ist, sollte man schon versuchen so allgemein wie möglich zu bleiben.

edit: Wenn du aber in CChangeLevel::ChangeLevelNow() was änderst, sollte es vernünftigerweise nicht so:
Quellcode:// Don't work in deathmatch
if ( g_pGameRules->IsDeathmatch() )
{
return;
}
elseif ( g_pGameRules->IsCoop() )
{
}
sondern so oder äquivalent aussehen:
Quellcode:if ( !g_pGameRules->IsCoop() && g_pGameRules->IsDeathmatch() )
    return;
Denn das obere bringt dich nicht wirklich weiter, da du schon aus der Funktion raus bist bevor du überhaupt zum else Zweig kommst, wenn du die IsDeathmath()-Methode nicht geändert hast und dich im MultiplayRuleset bewegst.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 13.05.2008 um 20:41 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
13.05.2008, 20:45
RikkuZooo



Achso meinst du das ja klar ist auch ne möeglichkeit :) danke
nunja jetzt kann ja jeder seine eigene svencoop machen... XD

wollte nur einen code adden damit leute auch einen coop spiele
modus auch einbauen können ich arbeite grade an score system
fuer denn coop damit man punkte bekommt.

Edit:
Ich hab denn coop ja auch nur in meiner hl1 mod verwendet da man die nur als coop spielen soll.

von daher will ich ja keinen deathmatch haben achso und by the way
die funktion IsCoop muss man noch decladieren in der gamesrules
also kann man die funktion auch so andern das sie nur über eine game variable leuft.

--

AirChina Mobile


Dieser Beitrag wurde am 13.05.2008 um 21:33 von RikkuZooo bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
13.05.2008, 21:26
Krifitze



Du kannst das ja ins Wiki stellen, so im Forum bringt das noch nicht sehr viel.

--

Website

zum Seitenanfang zum Seitenende Profil || Suche
006
13.05.2008, 21:34
RikkuZooo



wenn du mir sagt wie das geht wollte schon andere tuts von mir in das thewall wiki adden...

edit:
ups du meinst die forum wiki? naja kann ja ein admin machen wenn er
so lieb wehre und das mal eben dahin verschiebt, danke :)

--

AirChina Mobile


Dieser Beitrag wurde am 13.05.2008 um 21:36 von RikkuZooo bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
13.05.2008, 22:37
Bluthund



Zitat:
RikkuZooo postete
Ich hab denn coop ja auch nur in meiner hl1 mod verwendet da man die nur als coop spielen soll.

von daher will ich ja keinen deathmatch haben

Wie schon gesagt, für deine Zwecke sicher ok, aber als Tut sollte man das schon ein bisschen allgemeiner ausführen.

Zitat:
achso und by the way die funktion IsCoop muss man noch decladieren in der gamesrules
Also den Teil hab ich jetzt ganz und garnicht verstanden.
IsCoOp() ist doch bereits in der abstrakten Basisklasse CGameRules deklariert und sowohl für CHalfLifeRules als auch CHalfLifeMultiplay definiert/implementiert. Wieso willst/musst du die nochmals deklarieren?

Und Krifitze meinte das thewall.de Wiki und nicht das WikiBoard
Klick mich

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 13.05.2008 um 22:43 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
15.06.2008, 02:10
Masterbee



Hi statt

Zitat:
CHANGE_LEVEL( st_szNextMap, st_szNextSpot );
in:
Zitat:
CHANGE_LEVEL( st_szNextMap, NULL );
zu ändern kann man es gegen dies austauschen:
Zitat:
if ( CVAR_GET_FLOAT( "coop" ) == 1 )
{
CHANGE_LEVEL( st_szNextMap, NULL );
}
else
{
CHANGE_LEVEL( st_szNextMap, st_szNextSpot );
}
Wenn man normalen sp spielt bemerkt man nichts.
Wenn man ein MP Spiel aufmacht muss man nur coop 1 eingeben um denn coop richtig zu benutzen.

--

zum Seitenanfang zum Seitenende Profil || Suche