Schalldämpfer

Kein Durchblick im Quellcode von Ja2? Hier werden sie geholfen.

Moderator: Flashy

Antworten
Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Schalldämpfer

Beitrag von Wulfy301 » 03 Mär 2006, 13:40

Ich versuche dem Schalldämpfer die Eigenschaft zu geben, dass er die Reichweite der Waffe verringern soll.

Der Schalldämpfer wird bei der Laufverlängerung mit eingebunden, bei einem anderen Reichweiten Bonus/Malus natürlich. Aber trotz fehlerfreiem erstellen der exe verringert der Schalldämpfer die Reichweite im Spiel nicht. Was mache ich falsch?:confused:

Tactical\Weapons.h

#define SILENCER_RANGE_MALUS -10


Tactical\Weapons.c

// used to determine whether the bullet will go through someone
UINT8 BodyImpactReduction[4] = { 0, 15, 30, 23 };

UINT16 GunRange( OBJECTTYPE * pObj )
{
INT8 bAttachPos;

if ( Item[ pObj->usItem ].usItemClass & IC_WEAPON )
{

bAttachPos = FindAttachment( pObj, GUN_BARREL_EXTENDER );

if ( bAttachPos == ITEM_NOT_FOUND )
{
return( Weapon[ pObj->usItem ].usRange );
}
else
{
return( Weapon[ pObj->usItem ].usRange + (GUN_BARREL_RANGE_BONUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 ) );
}

//NEU
bAttachPos = FindAttachment( pObj, SILENCER );

if ( bAttachPos == ITEM_NOT_FOUND )
{
return( Weapon[ pObj->usItem ].usRange );
}
else
{
return( Weapon[ pObj->usItem ].usRange + (SILENCER_RANGE_MALUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 ) );
}

}
//ENDE


else
{
// return a minimal value of 1 tile
return( CELL_X_SIZE );
}
}

Mfg...
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

Realist
Alpha-Squad
Beiträge: 1573
Registriert: 24 Apr 2003, 11:00
Wohnort: Düsseldorf

Beitrag von Realist » 03 Mär 2006, 14:12

Code: Alles auswählen

if ( bAttachPos == ITEM_NOT_FOUND )
{
    return( Weapon[ pObj->usItem ].usRange );
}
else
{
    return( Weapon[ pObj->usItem ].usRange + (GUN_BARREL_RANGE_BONUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 ) );
}
Beim Code davor hast du im If UND im Else-Zweig ein Return drin.
Daher ist die Funktion schon beendet, bevor dein Code überhaupt erreicht wird.

Lösungsvorschlag:
Eine Variable einsetzen, die die Reichweite erhält, aber erst ganz am Ende der Funktion zurückgegeben wird.

Code: Alles auswählen

// used to determine whether the bullet will go through someone
UINT8 BodyImpactReduction[4] = { 0, 15, 30, 23 };

UINT16 GunRange( OBJECTTYPE * pObj )
{
    INT8 bAttachPos;
    [highlight]UINT16 usGunRange = 0;[/highlight]

    if ( Item[ pObj->usItem ].usItemClass & IC_WEAPON )
    {

        bAttachPos = FindAttachment( pObj, GUN_BARREL_EXTENDER );

        if ( bAttachPos == ITEM_NOT_FOUND )
        {
            [highlight]usGunRange += Weapon[ pObj->usItem ].usRange;[/highlight]
        }
        else
        {
            [highlight]usGunRange +=  Weapon[ pObj->usItem ].usRange + (GUN_BARREL_RANGE_BONUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 );[/highlight]
        }

        //NEU
        bAttachPos = FindAttachment( pObj, SILENCER );

        if ( bAttachPos == ITEM_NOT_FOUND )
        {
            [highlight]usGunRange += Weapon[ pObj->usItem ].usRange;[/highlight]
        }
        else
        {
            [highlight]usGunRange += Weapon[ pObj->usItem ].usRange + (SILENCER_RANGE_MALUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 );[/highlight]
        }

    [highlight]return usGunRange;[/highlight]
    }
    //ENDE


    else
    {
        // return a minimal value of 1 tile
        return( CELL_X_SIZE );
    }
}

Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Beitrag von Wulfy301 » 03 Mär 2006, 15:26

Danke Realist,

es gibt da aber ein Problem bei der Reichweitenberechnung!
Die Waffen haben auf einmal, ohne Laufverlängerung oder Schalldämpfer, eine höhere Reichweite als vorher. Eine Pistole z.b. hat jetzt eine Reichweite von 18, anstatt 9, also das doppelte.

HALT!

Hab den Fehler gefunden, die Additionszeichen müssen weg!

if ( bAttachPos == ITEM_NOT_FOUND )
{
usGunRange += Weapon[ pObj->usItem ].usRange;
}
else
{
usGunRange += Weapon[ pObj->usItem ].usRange + (GUN_BARREL_RANGE_BONUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 );
}

//NEU
bAttachPos = FindAttachment( pObj, SILENCER );

if ( bAttachPos == ITEM_NOT_FOUND )
{
usGunRange += Weapon[ pObj->usItem ].usRange;
}
else
{
usGunRange += Weapon[ pObj->usItem ].usRange + (SILENCER_RANGE_MALUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 );
}

return usGunRange;


Nein, jetzt hat die Laufverlängerung keine Funktion mehr - schei...!


Mfg...
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

Realist
Alpha-Squad
Beiträge: 1573
Registriert: 24 Apr 2003, 11:00
Wohnort: Düsseldorf

Beitrag von Realist » 03 Mär 2006, 15:40

Ich bin ja auch ein Depp. :dozey:

Code: Alles auswählen

// used to determine whether the bullet will go through someone
UINT8 BodyImpactReduction[4] = { 0, 15, 30, 23 };

UINT16 GunRange( OBJECTTYPE * pObj )
{
    INT8 bAttachPos;
    [highlight]UINT16 usGunRange = 0;[/highlight]

    if ( Item[ pObj->usItem ].usItemClass & IC_WEAPON )
    {
        [highlight]usGunRange += Weapon[ pObj->usItem ].usRange;[/highlight]

        bAttachPos = FindAttachment( pObj, GUN_BARREL_EXTENDER );

        if ( bAttachPos != ITEM_NOT_FOUND )
        {
            [highlight]usGunRange +=  Weapon[ pObj->usItem ].usRange + (GUN_BARREL_RANGE_BONUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 );[/highlight]
        }

        //NEU
        bAttachPos = FindAttachment( pObj, SILENCER );

        if ( bAttachPos != ITEM_NOT_FOUND )
        {
            [highlight]usGunRange += Weapon[ pObj->usItem ].usRange + (SILENCER_RANGE_MALUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 );[/highlight]
        }

        [highlight]return usGunRange;[/highlight]
    }
    //ENDE


    else
    {
        // return a minimal value of 1 tile
        return( CELL_X_SIZE );
    }
}
Äh, nach 5 Stunden Matheklausur war die Konzentration ein wenig weniger. :D

Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Beitrag von Wulfy301 » 03 Mär 2006, 15:58

Äh, leider immer noch nicht!:uhoh:

Ich habe zum testen den GUN_BARREL_RANGE_BONUS und SILENCER_RANGE_BONUS beide den Wert 100 gegeben.

Nun hat die Pistole (Reichweite 9) mit Laufverlängerung oder Schalldämpfer eine Reichweite von 28.
Es sollte aber, bei einem Wert von 100, nur Reichweite 19 dabei rauskommen!
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

commandant
Scharfschütze
Beiträge: 2381
Registriert: 06 Mär 2004, 18:09
Wohnort: Nähe von ...

Beitrag von commandant » 03 Mär 2006, 16:06

Kann sein, dass ich falsch liege. So gut sind meine Kenntnisse des Quellcodes nicht, aber:

Code: Alles auswählen

     usGunRange += Weapon[ pObj->usItem ].usRange; ([COLOR=MediumTurquoise]Reichweite ist jetzt bei 9 (nach Wulfys Beispiel)[/COLOR]

        bAttachPos = FindAttachment( pObj, GUN_BARREL_EXTENDER );

        if ( bAttachPos != ITEM_NOT_FOUND )
        {
            usGunRange +=  Weapon[ pObj->usItem ].usRange [COLOR=MediumTurquoise](nochmals +9)[/COLOR]+ (GUN_BARREL_RANGE_BONUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100 ) [COLOR=MediumTurquoise](und noch +10 für die Verlängerung)[/COLOR];

Macht in der Summe 9+9+10=28.
In der 1. Zeile wird die normale Waffenreichweite festgelegt. Dann wird aber die Waffenreichweite + die Laufverlängerung addiert. Also müsste die 2. Addition der Reichweite gestrichen werden?!?

Realist
Alpha-Squad
Beiträge: 1573
Registriert: 24 Apr 2003, 11:00
Wohnort: Düsseldorf

Beitrag von Realist » 03 Mär 2006, 16:15

jawoll, commandant.
schätze heute bin ich zu gar nix zu gebrauchen. :uhoh:
also nochmal:

Code: Alles auswählen

// used to determine whether the bullet will go through someone
UINT8 BodyImpactReduction[4] = { 0, 15, 30, 23 };

UINT16 GunRange( OBJECTTYPE * pObj )
{
    INT8 bAttachPos;
    [highlight]UINT16 usGunRange = 0;[/highlight]

    if ( Item[ pObj->usItem ].usItemClass & IC_WEAPON )
    {
        [highlight]usGunRange += Weapon[ pObj->usItem ].usRange;[/highlight]

        bAttachPos = FindAttachment( pObj, GUN_BARREL_EXTENDER );

        if ( bAttachPos != ITEM_NOT_FOUND )
        {
            [highlight]usGunRange += GUN_BARREL_RANGE_BONUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100;[/highlight]
        }

        //NEU
        bAttachPos = FindAttachment( pObj, SILENCER );

        if ( bAttachPos != ITEM_NOT_FOUND )
        {
            [highlight]usGunRange += SILENCER_RANGE_MALUS * WEAPON_STATUS_MOD(pObj->bAttachStatus[ bAttachPos ]) / 100;[/highlight]
        }

        [highlight]return usGunRange;[/highlight]
    }
    //ENDE


    else
    {
        // return a minimal value of 1 tile
        return( CELL_X_SIZE );
    }
}

commandant
Scharfschütze
Beiträge: 2381
Registriert: 06 Mär 2004, 18:09
Wohnort: Nähe von ...

Beitrag von commandant » 03 Mär 2006, 16:18

Nachdem das Problem jetzt gelöst ist, kann ich mich wieder beruhigt Physik zuwenden.
@Realist
Ich war auch klar im Vorteil, nur eine Stunde Mathe vorher gepaukt; aber 5h Klausur ist ja mal übelst, bei uns dauerts Abi 4h.
Dann euch viel Spaß noch.

Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Beitrag von Wulfy301 » 03 Mär 2006, 16:22

@commandant

Von wegen schlechte Kenntnisse des Quellcodes. :k:

@Realist

Trotz 5 Stunden Mathe, hast du es immer noch drauf!

Danke Realist und commandant!:hail:


[font=Verdana][font=&quot][font=Verdana]Eine kleine Änderung hätte ich da noch.[/font]
[font=Verdana] Der Schalldämpfer darf, egal wie beschädigt er ist den Reichweiten Malus nicht verändern.[/font][/font]
[/font][font=Verdana]
[/font]
Ist es so richtig?

if ( bAttachPos != ITEM_NOT_FOUND )
{
usGunRange += SILENCER_RANGE_MALUS;
}


Mfg...
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

commandant
Scharfschütze
Beiträge: 2381
Registriert: 06 Mär 2004, 18:09
Wohnort: Nähe von ...

Beitrag von commandant » 03 Mär 2006, 17:28

Ich hab mir grad nochmal den Code angeschaut und wollte dir deine Lösung vorschlagen :k:

Bad Puma
Profi-Söldner
Beiträge: 272
Registriert: 20 Mai 2002, 14:23
Kontaktdaten:

Beitrag von Bad Puma » 16 Mär 2006, 20:14

Sorry bin nicht mehr so ganz in der materie Ja2 drinne. Aber könnte das hier mal jemand nochmal in einem Tutorial zusammen bringen damit ich mein Headquarter aktuell halten kann.

DANKÖ

Puma
www.ja2-mod-headquarter.de.vu
last update: 11.12.07

:help:!!!Das Headquarter braucht Dich immernoch als Admin!!!
:help:

Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Beitrag von Wulfy301 » 16 Mär 2006, 20:47

@Bad Puma

Na Logo, Tutorial ist im Anhang!

Mfg...
Dateianhänge
Schalldämpfer verringert Reichweite.doc
(20.5 KiB) 1298-mal heruntergeladen
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

Bad Puma
Profi-Söldner
Beiträge: 272
Registriert: 20 Mai 2002, 14:23
Kontaktdaten:

Beitrag von Bad Puma » 19 Mär 2006, 14:37

Danke Wulfy

mfg

Puma
www.ja2-mod-headquarter.de.vu
last update: 11.12.07

:help:!!!Das Headquarter braucht Dich immernoch als Admin!!!
:help:

Antworten