Schalldämpfer

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

Moderator: Flashy

Schalldämpfer

Beitragvon Wulfy301 » 3. 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 );
}
}

[size=2]Mfg...

[/size]
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:
Wulfy301
Bravo-Squad
 
Beiträge: 640
Registriert: 18. Jun 2004 22:58

Beitragvon Realist » 3. 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 );
    }
}
Realist
Alpha-Squad
 
Beiträge: 1573
Registriert: 24. Apr 2003 11:00
Wohnort: Düsseldorf

Beitragvon Wulfy301 » 3. 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;


[size=2]Nein, jetzt hat die Laufverlängerung keine Funktion mehr - schei...!

[/size]

Mfg...
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:
Wulfy301
Bravo-Squad
 
Beiträge: 640
Registriert: 18. Jun 2004 22:58

Beitragvon Realist » 3. 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
Realist
Alpha-Squad
 
Beiträge: 1573
Registriert: 24. Apr 2003 11:00
Wohnort: Düsseldorf

Beitragvon Wulfy301 » 3. 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:
Wulfy301
Bravo-Squad
 
Beiträge: 640
Registriert: 18. Jun 2004 22:58

Beitragvon commandant » 3. 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?!?
commandant
Scharfschütze
 
Beiträge: 2373
Registriert: 6. Mär 2004 18:09
Wohnort: Nähe von ...

Beitragvon Realist » 3. 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 );
    }
}
Realist
Alpha-Squad
 
Beiträge: 1573
Registriert: 24. Apr 2003 11:00
Wohnort: Düsseldorf

Beitragvon commandant » 3. 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.
commandant
Scharfschütze
 
Beiträge: 2373
Registriert: 6. Mär 2004 18:09
Wohnort: Nähe von ...

Beitragvon Wulfy301 » 3. 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="][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:
Wulfy301
Bravo-Squad
 
Beiträge: 640
Registriert: 18. Jun 2004 22:58

Beitragvon commandant » 3. Mär 2006 17:28

Ich hab mir grad nochmal den Code angeschaut und wollte dir deine Lösung vorschlagen :k:
commandant
Scharfschütze
 
Beiträge: 2373
Registriert: 6. Mär 2004 18:09
Wohnort: Nähe von ...

Beitragvon 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
[CENTER]www.ja2-mod-headquarter.de.vu
last update: 11.12.07

:help:!!!Das Headquarter braucht Dich immernoch als Admin!!!
:help:
[/CENTER]
Bad Puma
Profi-Söldner
 
Beiträge: 272
Registriert: 20. Mai 2002 14:23

Beitragvon 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) 415-mal heruntergeladen
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:
Wulfy301
Bravo-Squad
 
Beiträge: 640
Registriert: 18. Jun 2004 22:58

Beitragvon Bad Puma » 19. Mär 2006 14:37

Danke Wulfy

mfg

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

:help:!!!Das Headquarter braucht Dich immernoch als Admin!!!
:help:
[/CENTER]
Bad Puma
Profi-Söldner
 
Beiträge: 272
Registriert: 20. Mai 2002 14:23


Zurück zu Source Forum

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron