Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
04.11.2000, 00:57
Ranger6



Hab da ein Problem...

Ich hab in der cl_dll.dsw den Struct "extra_player_info_t" um den float shoots erweitert. (speichert, wie oft ein Spieler geschossen hat). Jedesmal wenn die PrimaryAttack einer Waffe aufgerufen wird, soll der Wert um 1 erhöht werden, nur wie kann ich das realisieren. Die Waffen sind in der mp.dll und der Struct & ScorePanel(wo das ganze dann angezeigt werden soll) in der cl_dll. Wie kann ich von mp.dll auf extra_player_info_t der cl_dll zugreifen????

Ach ja, wenn wir schon mal dabei sind, kann mir jemand sagen, wie ich ein Geld system aufbaue?

--

-=[Ranger6]=- ist da

zum Seitenanfang zum Seitenende Profil || Suche
001
04.11.2000, 12:33




zum ersten fällt mir momentan nix ein aber ich wrd mal drüber nachdenken,

zum geldsystem, es ist einfacher als man denkt, du musst nur eine neue variable erstellen, zb "int m_iMoneyamount" in player.h , du gibt dem spieler dann das geld per pPlayer->m_iMoneyamount += 800 und ziehst es ihm beim kauf einer waffe mit pPlayer->m_iMoneyamount -= 800 wieder ab, um das ganze im hud anzuzeigen kopierst du am besten die health.cpp der cli-ent.dll und änderst alles um sowie du es braucht und schaffst das dann auch per MSG funktion zum client.

--

zum Seitenanfang zum Seitenende Profil || Suche
002
04.11.2000, 12:49
Ranger6



Das wär echt super! Ich habs gestern nochmal Probiert, bin aber kein Stück weiter gekommen. Hats vielleicht was mit der entvars_s (oder entvars_t) zu tun, da in der mp.dll so die frags erhöht werden. Aber jedesmal wenn ich die entvars_t(or _s) um den float "shoots" erweitere, dann Stürzt mir HalfLife beim createn eines SPiels ab.

Das mit dem Money-System, werde ich mal ausprobieren. Danke im vorraus für den Tipp.

--

-=[Ranger6]=- ist da

zum Seitenanfang zum Seitenende Profil || Suche
003
04.11.2000, 21:17
TheTinySteini



Ok, here we go:
Ein Problem gibt es insofern, als dass du immer dann, wenn jemand schießt, eine zusätzliche Message über's Netz schickst. Wäre vielleicht besser, wenn du das irgendwie alle 10 Schüsse oder so erst schickst, damit der Traffic halbwegs in Ordnung ist. Also, erstmal Schritt für Schritt:
In der player.cpp, änder dies hier:
gmsgScoreInfo = REG_USER_MSG( "ScoreInfo", 9 );
in
gmsgScoreInfo = REG_USER_MSG( "ScoreInfo", 11 );
Dann erweitere die extra_player_info_t nicht mit einem float, sondern mit einem short. Also so etwa:
struct extra_player_info_t
{
short frags;
short deaths;
short shoots;
short playerclass;
short teamnumber;
char teamname[MAX_TEAM_NAME];
};

Geh nun in die vgui_teamfortressviewport.cpp (client). Erweitere die Funktion so:
BEGIN_READ( pbuf, iSize );
short cl = READ_BYTE();
short frags = READ_SHORT();
short deaths = READ_SHORT();
<font color=red>short shoots = READ_SHORT();</font>
short playerclass = READ_SHORT();
short teamnumber = READ_SHORT();

if ( cl > 0 && cl <= MAX_PLAYERS )
{
g_PlayerExtraInfo[cl].frags = frags;
g_PlayerExtraInfo[cl].deaths = deaths;
<font color=red>g_PlayerExtraInfo[cl].shoots = shoots;</font>
g_PlayerExtraInfo[cl].playerclass = playerclass;
g_PlayerExtraInfo[cl].teamnumber = teamnumber;
UpdateOnPlayerInfo();
}

Nun musst du noch alle ScoreInfo-Server-Messages so umschreiben (nur ein Beispiel aus der CBasePlayer::AddPoints(), bitte unbedingt an die jeweilige Situation anpassen!):
MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
WRITE_BYTE( ENTINDEX(edict()) );
WRITE_SHORT( pev->frags );
WRITE_SHORT( m_iDeaths );
<font color=red>WRITE_SHORT( m_iShoots );</font>
WRITE_SHORT( -1 );
WRITE_SHORT( pev->team );
MESSAGE_END();

Kleine Anmerkung: Wenn bei dir die letzten beiden WRITE_SHORTs nicht stehen, dann brauchst du sie auch nicht einzufügen. Nun fügst du zur Player-Class noch die Variabel m_iShoots hinzu, die du bei jedem Schuss um einen erhöhst (einfach in der player.h dort deklarieren, wo auch m_iDeaths steht. In der CBasePlayer::Spawn unbedingt die Variable auf 0 setzen, sonst könnte es sein, dass dort einfach irgendwelche Daten drinstehen...).

Ich hoffe ich hab alles berücksichtigt. Noch fragen? Posten!

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
004
05.11.2000, 01:17
Ranger6



Hi nochmal, danke TinySteini!!!!! Hatte zwar erst Probleme, aber nach ein bischen Tüffteln, ging alles wie geschmiert.

Ein Problem habe ich dennoch, wie kann ich nach allen 10 Schuss die Score uppen? Bis jetzt gehts nur, wenn der Player gestorben ist. Wenn DU mir da kurz noch ein wenig Hilfe geben könntest. Wär echt super.

Mercy nochmal!!!!!

--

-=[Ranger6]=- ist da

zum Seitenanfang zum Seitenende Profil || Suche
005
05.11.2000, 12:58
TheTinySteini



Dazu bietet sich die CBasePlayer::PreThink() an, die vor jedem Frame geladen wird. Überprüf einfach hier, ob sich m_iShoots durch 10 restlos durch 10 teilen lässt. So:

if( (m_iShoots != 0) && (m_iShoots % 10 == 0) )
{
MESSAGE_BEGIN( blah blah blah....)
}

% bedeutet: Der Rest einer Division soll angegeben werden. Also etwa 17 % 10 ist 7.
Die Überprüfung, ob m_iShoots nicht 0 ist, ist ziemlich wichtig, sonst sendet er solange man nicht geschossen hat, jeden Frame so ne Meldung übers Netz (denn 0 % 10 ist immer 0). Schlecht...

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
006
05.11.2000, 12:59
TheTinySteini



Ups, das muss natürlich nicht heißen:
> Überprüf einfach hier, ob sich m_iShoots durch 10 restlos durch 10 teilen lässt.
Sondern
> Überprüf einfach hier, ob sich m_iShoots restlos durch 10 teilen lässt.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
007
05.11.2000, 15:55
user3427



Ich glaube die obiege Lösung hat den Nachteil ,dass jedes Frame die Variable an den Client gesendet wird, wenn sie durch 10 teilbar ist(also auch dann, wenn sie sich nicht verändert hat).
Vielleicht solltest du noch abfragen, ob sich die Schüsse geändert haben
also etwa:
if( (m_iShoots != 0) && (m_iShoots % 10 == 0) && (m_iShoots > m_iShootx))
{
MESSAGE_BEGIN( blah blah blah....)
}
m_iShootx=m_iShoots;

PS: Wenn das nicht nötig ist, wäre ich froh, wenn mit jemand erklären könnte, warum das nicht nochmal gesendet wird.

--

zum Seitenanfang zum Seitenende Profil || Suche
008
05.11.2000, 20:47
TheTinySteini



Stimmt, da hast du recht. Daran hab ich gar nicht gedacht. Mir ist übrigens aufgefallen, dass man das ganze auch in die Infos reinpacken könnte, die für jedes Entity sowieso zum Client geschickt werden (das mit dieser delta.lst-Datei und so). Aber das wird kompliziert...

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
009
05.11.2000, 21:13
Ranger6



Hi Nochmal, danke nochmal für eure Hilfe. Selber habe ich nun die CBasePlayer um die Funktion ScorePanelUpdate(void) erweitert, wo bei jedem Aufruf das:

MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
WRITE_BYTE( ENTINDEX(edict()) );
WRITE_SHORT( pev->frags );
WRITE_SHORT( m_iDeaths );
WRITE_SHORT( m_iShoots );
MESSAGE_END();

ausgeführt wird. Aber an den Modulo-Operator habe ich jetzt erlich nicht gedacht. Bis jetzt habe ich zwar keine Probleme mit der Netztraffic, aber vorsichthalber plane ich es mal mit ein.

Danke nochmals...

--

-=[Ranger6]=- ist da

zum Seitenanfang zum Seitenende Profil || Suche