Seite 1 von 1

Schalldämpfer

Verfasst: 03 Mär 2006, 13:40
von Wulfy301
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...

Verfasst: 03 Mär 2006, 14:12
von Realist

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 );
    }
}

Verfasst: 03 Mär 2006, 15:26
von Wulfy301
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...

Verfasst: 03 Mär 2006, 15:40
von Realist
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

Verfasst: 03 Mär 2006, 15:58
von Wulfy301
Ä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!

Verfasst: 03 Mär 2006, 16:06
von commandant
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?!?

Verfasst: 03 Mär 2006, 16:15
von Realist
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 );
    }
}

Verfasst: 03 Mär 2006, 16:18
von commandant
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.

Verfasst: 03 Mär 2006, 16:22
von Wulfy301
@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...

Verfasst: 03 Mär 2006, 17:28
von commandant
Ich hab mir grad nochmal den Code angeschaut und wollte dir deine Lösung vorschlagen :k:

Verfasst: 16 Mär 2006, 20:14
von Bad Puma
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

Verfasst: 16 Mär 2006, 20:47
von Wulfy301
@Bad Puma

Na Logo, Tutorial ist im Anhang!

Mfg...

Verfasst: 19 Mär 2006, 14:37
von Bad Puma
Danke Wulfy

mfg

Puma