De/GameRules: Difference between revisions
m (Nesciuse moved page GameRules:de to De/GameRules over redirect: -Language prefixes) |
m (Using L template for links) |
||
Line 33: | Line 33: | ||
GameRules werden meist in geteiltem Code geschrieben, sodass der Client die Auswirkungen seiner Aktionen vorherbestimmten kann. Dennoch gibt es Funktionen, die nur auf dem Client oder dem Server verfügbar sind. | GameRules werden meist in geteiltem Code geschrieben, sodass der Client die Auswirkungen seiner Aktionen vorherbestimmten kann. Dennoch gibt es Funktionen, die nur auf dem Client oder dem Server verfügbar sind. | ||
{{todo:de|Beste Praxis, um dies festzustellen und zu verwalten. #ifdefs verwirren Visual Studio... (siehe | {{todo:de|Beste Praxis, um dies festzustellen und zu verwalten. #ifdefs verwirren Visual Studio... (siehe {{L|GameRules#Managing_shared_code|originale Seite}}}} | ||
== Netzwerk == | == Netzwerk == | ||
GameRules sind nicht selbstständig netzwerkfähig ({{todo:de|Warum nicht? (Siehe | GameRules sind nicht selbstständig netzwerkfähig ({{todo:de|Warum nicht? (Siehe {{L|GameRules#Networking|originale Seite}}}}). Stattdessen wird ein von <code>{{L|CGameRulesProxy}}</code> abgeleiteter Proxy erzeugt. | ||
== Erwähnenswerte Funktionen == | == Erwähnenswerte Funktionen == | ||
Line 43: | Line 43: | ||
=== Geteilt === | === Geteilt === | ||
; <code> | ; <code>{{L|Integer|int}} Damage_GetNoPhysicsForce()</code> | ||
; <code>int Damage_GetShouldGibCorpse()</code> | ; <code>int Damage_GetShouldGibCorpse()</code> | ||
; usw. | ; usw. | ||
: Verschiedene Funktionen, die einen ganzzahligen | : Verschiedene Funktionen, die einen ganzzahligen {{L|bitstring}} liefern, der den {{L|damage types|Schadenstyp}} der jeweiligen Kategorie beinhaltet. | ||
; <code> | ; <code>{{L|Boolean|bool}} ShouldCollide()</code> | ||
: Sagt aus, ob Entities in der angegebenen | : Sagt aus, ob Entities in der angegebenen {{L|Collision_Group_t|Kollisionsgruppe}} miteinander kollidieren. Da die Argumente Kollisionsgruppen und keine Entities sind, ist diese Funktion nicht so nützlich wie sie anfangs zu sein scheint. | ||
; <code>bool SwitchToNextBestWeapon()</code> | ; <code>bool SwitchToNextBestWeapon()</code> | ||
; <code> | ; <code>{{L|CBaseCombatWeapon}}* GetNextBestWeapon()</code> | ||
: 2 Funktionen, die dazu benutzt werden können, eine Waffe für den Spieler zu wählen, sollte ihm seine Munition ausgehen. <code>SwitchToNextBestWeapon()</code> liefert true, wenn der Wechsel erfolgreich war. | : 2 Funktionen, die dazu benutzt werden können, eine Waffe für den Spieler zu wählen, sollte ihm seine Munition ausgehen. <code>SwitchToNextBestWeapon()</code> liefert true, wenn der Wechsel erfolgreich war. | ||
; <code> | ; <code>{{L|float}} GetAmmoDamage()</code> | ||
: Bestimmt, wie viel Schaden angerichtet werden soll, wenn eine Entity (eine beliebige Entity) Kugeln feuert. Normalerweise werden aufrufe an <code> | : Bestimmt, wie viel Schaden angerichtet werden soll, wenn eine Entity (eine beliebige Entity) Kugeln feuert. Normalerweise werden aufrufe an <code>{{L|GetAmmoDef()}}</code> weitergeleitet. | ||
; <code> | ; <code>{{L|unsigned}} {{L|char}}* GetEncryptionKey()</code> | ||
: Der | : Der {{L|ICE}}-Schlüssel der Modifikation für Skriptverschlüsselung. | ||
; <code> | ; <code>{{L|CViewVectors}}* GetViewVectors()</code> | ||
: Getter für <code> | : Getter für <code>{{L|g_DefaultViewVectors}}</code>. | ||
=== Server === | === Server === | ||
; <code>void LevelShutdown()</code> | ; <code>void LevelShutdown()</code> | ||
: Wird aufgerufen, wenn die Spielregeln durch die | : Wird aufgerufen, wenn die Spielregeln durch die {{L|Worldspawn|Welt}} zerstört werden. | ||
; <code>void FrameUpdatePostEntityThink()</code> | ; <code>void FrameUpdatePostEntityThink()</code> | ||
: Wird jeden Frame aufgerufen. Standardmäßig werden Aufrufe an <code>Think()</code> weitergeleitet. {{todo:de|Was ist der Unterschied zwischen dieser "PostEntityThink"-Funktion und <code>EndGameFrame()</code>? (Siehe | : Wird jeden Frame aufgerufen. Standardmäßig werden Aufrufe an <code>Think()</code> weitergeleitet. {{todo:de|Was ist der Unterschied zwischen dieser "PostEntityThink"-Funktion und <code>EndGameFrame()</code>? (Siehe {{L|GameRules#Server|originale Seite}})}} | ||
; <code>void EndGameFrame()</code> | ; <code>void EndGameFrame()</code> | ||
: Wird am Ende von <code> | : Wird am Ende von <code>{{L|CServerGameDLL}}::GameFrame()</code> aufgerufen (z. B. nachdem die gesamte Spiellogik lief). | ||
; <code>CreateStandardEntities()</code> | ; <code>CreateStandardEntities()</code> | ||
: Erzeugt die externen entities, die für die GameRoles zum funktionieren benötigt werden. {{warning:de|Ein nicht nachvervolgbarer Absturz tritt auf, wenn die Funktion überschrieben wird, ohne dass <code>BaseClass::CreateStandardEntities()</code> aufgerufen wird.}} | : Erzeugt die externen entities, die für die GameRoles zum funktionieren benötigt werden. {{warning:de|Ein nicht nachvervolgbarer Absturz tritt auf, wenn die Funktion überschrieben wird, ohne dass <code>BaseClass::CreateStandardEntities()</code> aufgerufen wird.}} | ||
Line 81: | Line 81: | ||
* Waffen-/Gegenstands-/Munitionswiedergewinnung | * Waffen-/Gegenstands-/Munitionswiedergewinnung | ||
* Waffen-/Itemspawn und -respawnkontrolle | * Waffen-/Itemspawn und -respawnkontrolle | ||
* | * {{LCategory|AI|KI}}-Definitionen | ||
* Lebensregenerierer-Respawnkontrolle | * Lebensregenerierer-Respawnkontrolle | ||
* Was passiert mit der Waffe und der Munition eines toten Spielers | * Was passiert mit der Waffe und der Munition eines toten Spielers | ||
Line 87: | Line 87: | ||
* Schrittgeräusche | * Schrittgeräusche | ||
* NPCs | * NPCs | ||
* | * {{L|UTIL_TraceLine|TraceLines}} | ||
* Team- und Ortspräfixe im Chat | * Team- und Ortspräfixe im Chat | ||
* | * {{L|Achievement|Errungenschaften}} | ||
[[Category:Programming:de]] | [[Category:Programming:de]] | ||
[[Category:Modding:de]] | [[Category:Modding:de]] |
Revision as of 06:22, 11 July 2024
Das GameRules-Objekt definiert die abstrakten Spielregeln. Es handhabt konventionsbedingt alle Events, die nicht dem Spieler, NPCs, der Welt oder anderem Gewirr angeboren sind.
In einer Modifikation, die Deathmatch und Capture the Flag unterstützt, würde jeder Spielmodus sein eigenes GameRules-Objekt mit der entsprechenden Logik, wann Punkte verteilt werden, wo die Spieler zu spawnen sind usw., haben.
Minimalimplementierung
In shared\<mod>\<mod>_gamerules.cpp
:
#include "multiplay_gamerules.h"
#ifdef CLIENT_DLL
#define CSkeletonGameRules C_SkeletonGameRules
#endif
// Valves Basisklassen: CSingleplayRules, CMultiplayRules, CTeamplayRules, CTeamplayRoundBasedRules
class CSkeletonGameRules : public CMultiplayRules
{
DECLARE_CLASS( CSkeletonGameRules, CMultiplayRules );
};
REGISTER_GAMERULES_CLASS( CSkeletonGameRules );
In server\<mod>\<mod>_client.cpp
:
void InstallGameRules()
{
CreateGameRulesObject( "CSkeletonGameRules" );
}
Geteilten Code verwalten
GameRules werden meist in geteiltem Code geschrieben, sodass der Client die Auswirkungen seiner Aktionen vorherbestimmten kann. Dennoch gibt es Funktionen, die nur auf dem Client oder dem Server verfügbar sind.
Netzwerk
GameRules sind nicht selbstständig netzwerkfähig (
). Stattdessen wird ein von CGameRulesProxy
abgeleiteter Proxy erzeugt.
Erwähnenswerte Funktionen
Geteilt
int Damage_GetNoPhysicsForce()
int Damage_GetShouldGibCorpse()
- usw.
- Verschiedene Funktionen, die einen ganzzahligen bitstring liefern, der den Schadenstyp der jeweiligen Kategorie beinhaltet.
bool ShouldCollide()
- Sagt aus, ob Entities in der angegebenen Kollisionsgruppe miteinander kollidieren. Da die Argumente Kollisionsgruppen und keine Entities sind, ist diese Funktion nicht so nützlich wie sie anfangs zu sein scheint.
bool SwitchToNextBestWeapon()
CBaseCombatWeapon * GetNextBestWeapon()
- 2 Funktionen, die dazu benutzt werden können, eine Waffe für den Spieler zu wählen, sollte ihm seine Munition ausgehen.
SwitchToNextBestWeapon()
liefert true, wenn der Wechsel erfolgreich war. float GetAmmoDamage()
- Bestimmt, wie viel Schaden angerichtet werden soll, wenn eine Entity (eine beliebige Entity) Kugeln feuert. Normalerweise werden aufrufe an
GetAmmoDef()
weitergeleitet. unsigned char * GetEncryptionKey()
- Der ICE -Schlüssel der Modifikation für Skriptverschlüsselung.
CViewVectors * GetViewVectors()
- Getter für
g_DefaultViewVectors
.
Server
void LevelShutdown()
- Wird aufgerufen, wenn die Spielregeln durch die Welt zerstört werden.
void FrameUpdatePostEntityThink()
- Wird jeden Frame aufgerufen. Standardmäßig werden Aufrufe an
Think()
weitergeleitet.Zu erledigen: Was ist der Unterschied zwischen dieser "PostEntityThink"-Funktion undEndGameFrame()
? (Siehe originale Seite ) void EndGameFrame()
- Wird am Ende von
CServerGameDLL ::GameFrame()
aufgerufen (z. B. nachdem die gesamte Spiellogik lief). CreateStandardEntities()
- Erzeugt die externen entities, die für die GameRoles zum funktionieren benötigt werden.
Achtung:Ein nicht nachvervolgbarer Absturz tritt auf, wenn die Funktion überschrieben wird, ohne dass
BaseClass::CreateStandardEntities()
aufgerufen wird.
Es gibt zu viele andere wichtige Funktionen, um hier einzeln aufgezählt zu werden. Siehe game\shared\gamerules.h
Zeile 179 und folgende für eine komplette Listewelche folgendes abdeckt:
- Schwierigkeitsstufen
- Den Single-/Multiplayerstatus eines Spiels
- Clientverbindung und -verbindungstrennung
- Client-Schadensregeln
- Client-Tötungen und -Punkte
- Spawn- und Respawnkontrolle
- Waffenschaden
- Waffen-/Gegenstands-/Munitionswiedergewinnung
- Waffen-/Itemspawn und -respawnkontrolle
- KI -Definitionen
- Lebensregenerierer-Respawnkontrolle
- Was passiert mit der Waffe und der Munition eines toten Spielers
- Teamregeln
- Schrittgeräusche
- NPCs
- TraceLines
- Team- und Ortspräfixe im Chat
- Errungenschaften