 |
Descentforum.DE
|
View previous topic :: View next topic |
Author |
Message |
Munk Forum-Nutzer

Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 25.05.2007, 22:16 Post subject: D3 SDK: Waffenwechsel |
|
|
Hallo,
Ich suche ne Möglichkeit, wie ich in nem Mod einem Spieler ne Waffe "schenken" kann.
Und zwar so, als ob er sie gerade aufgesammelt hat.
Was ich bisher dazu geschafft habe ist, dem Spieler player->weapon_flags zu setzen, und mit
player->weapon[0].index auszuwählen.
Leider passiert das alles unmittelbar, ohne jegliches Waffenmanagement. D.h. die Autoselect-Reihenfolge wird nicht berücksichtigt, es entsteht kein Waffenselect-Sound, die Waffenbilder werden nicht ein/aus-geblendet und es gibt keine Auslöseverzögerung.
Also was ich suche wäre ne Routine, die das alles wie im Original erledigt. Vielleicht etwas, was Descent vorgaukelt, gerade ein Waffen-Powerup aufgenommen zu haben ...
Hat jemand Ideen ?
|
|
Back to top |
|
 |
D.Cent Forum-Nutzer
Joined: 05 Mar 2006 Posts: 508
Location: Stuttgart
|
Posted: 26.05.2007, 13:18 Post subject: |
|
|
Hast du Dir schon mal den InstaReap-Source angeschaut? Da wird die Waffe auch von Laser auf MD gewechselt! (Ich hoffe, ich habe ihn Dir damals geschickt).
Da finde ich auf Anhieb die Funktion "ChangeWeapon()":
Code: | int ChangeWeapon(int slot, int weap_index)
{
player *player = &(DMFCBase->GetPlayers())[slot];
ship *ship = &(DMFCBase->GetShips())[player->ship_index];
player->weapon[PRIMARY_INDEX].index = weap_index;
return 1;
} |
Und dann zum Beispiel für das Wechseln zum Massdriver folgenden Code benutzen:
Code: | ChangeWeapon(iPnum,MASSDRIVER_INDEX); |
Viel Glück!
Last edited by D.Cent on 26.05.2007, 13:19; edited 1 time in total |
|
Back to top |
|
 |
Floyd Forum-Orakel

Joined: 20 Mar 2001 Posts: 2912
Location: Dresden, Germany
|
Posted: 26.05.2007, 13:37 Post subject: |
|
|
das ist genau das, was er oben beschrieben hat
was aber ginge: die powerups so lassen wie se sind, nur die polymodels austauschen, zwar den respawn derer selbst machen, und dann halt das management bei der aufnahme übernehmen, und interne änderungen von D3 ggf. zurücksetzen ...
vielleicht reicht es auch schon, die waffe ins "inventory" hinzuzufügen (da sollte es fkt. geben), ich weiß jetzt ja nicht, wie du das bereits machst.
vielleicht können wir das nochmal im chat besprechen, ich habe aber heute keine zeit dazu wegen einer geburtstagsfeier.
Last edited by Floyd on 26.05.2007, 13:44; edited 2 times in total |
|
Back to top |
|
 |
Munk Forum-Nutzer

Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 26.05.2007, 14:56 Post subject: |
|
|
Waffe ins Inventory hinzufügen hilft nicht, denn dann setzt er sie wirklich ins Inventory.
Die Original-Powerups hab ich zu Anfang des Levels aus dem Spiel entfernt, da ich deren automatischen Respawn sowie Kollisionserkennung nicht kontrollieren konnte.
D.h. mit den Original-Powerups aus dem Level kann ich nicht verhindern, daß sie aufgenommen werden.
Ich wüsste gerne, was der Unterschied zwischen beiden ist ...
|
|
Back to top |
|
 |
Munk Forum-Nutzer

Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 10.06.2007, 22:15 Post subject: |
|
|
Quote: |
D.h. mit den Original-Powerups aus dem Level kann ich nicht verhindern, daß sie aufgenommen werden.
Ich wüsste gerne, was der Unterschied zwischen beiden ist ...
|
Okay, hab ne Lösung gefunden. Vielleicht ist sie ja für andere Zwecke auch hilfreich.
Also zuersteinmal habe ich vergessen, die erzeugten Objekte mit DLLInitObjectScripts() zu initialisieren. Damit werden wohl die Event-Handler desjenigen Objekts gesetzt, so daß es z.b. auf Kollisionen reagieren kann und entsprechende Modifikationen am Schiff vornimmt (z.B. bei Waffen, aber auch Afterburner, Quadlaser, Cloak etc.)
Um den Schiffseinbau muss man sich also nicht kümmern, das geschieht automatisch.
Nachteil ist aber nun, daß man die Kollision nun nicht mehr vollkommen unter Kontrolle hat. D.h. eine selektive Aufname des Powerups ist nicht möglich (soll heißen, daß man nicht verhindern kann, daß das Powerup durch Kollision aufgenommen wird).
Meine Lösung ist nun, daß solche Powerups, bei denen Kollisionskontrolle gewünscht ist, DLLInitObjectScripts() _nicht_ ausgeführt wird. Die Kollision kann immernoch mit OnServerCollide() erkannt werden, aber es geschieht nicht zwingend eine Aufnahme des Powerups. In OnServerCollide() kann also nun entschieden werden, ob das Powerup aufgenommen werden soll. Falls dem so ist, kann man DLLInitObjectScripts() auf dieses Objekt anwenden, und in diesem oder nächsten Frame (hab ich noch nicht untersucht) wird dann der Event-Handler vom Powerup-Code aktiv und sorgt für den Rest.
Last edited by Munk on 10.06.2007, 22:17; edited 1 time in total |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You can attach files in this forum You can download files in this forum
|
|