Kein Durchblick im Quellcode von Ja2? Hier werden sie geholfen.
Moderator: Flashy
-
Wulfy301
- Bravo-Squad
- Beiträge: 640
- Registriert: 18 Jun 2004, 22:58
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?
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!
-
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!
-
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.
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.

-
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!
-
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.

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.
@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?
i
f ( 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!
-
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

-
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
-
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