2019-12-10 13:49 EST


View Issue Details Jump to Notes ]
IDProjectCategoryView StatusLast Update
0002190FSSCPgameplaypublic2010-11-21 01:44
ReporterSpoon 
Assigned ToFUBAR-BDHR 
PrioritynormalSeverityminorReproducibilityalways
StatusresolvedResolutionfixed 
Product Version3.6.12 RC2 
Target VersionFixed in Version3.6.13 
Summary0002190: Player mounted beams do not cause traitor
DescriptionBeam weapons mounted in the primary banks of the player do not cause the traitor flag to be triggered, you can shoot and kill your team mates forever with beams.
TagsNo tags attached.
Attached Files
  • patch file icon traitor_beams.patch (3,966 bytes) 2010-10-19 18:41 -
    Index: ai/aicode.cpp
    ===================================================================
    --- ai/aicode.cpp	(revision 6638)
    +++ ai/aicode.cpp	(working copy)
    @@ -14704,7 +14704,7 @@
     
     		Assert(objp_hitter->type == OBJ_SHIP);
     		Assert(objp_hit->type == OBJ_SHIP);
    -		Assert(objp_weapon->type == OBJ_WEAPON);
    +		Assert((objp_weapon->type == OBJ_WEAPON) || (objp_weapon->type == OBJ_BEAM));
     
     		ship	*shipp_hitter = &Ships[objp_hitter->instance];
     		ship	*shipp_hit = &Ships[objp_hit->instance];
    @@ -14740,7 +14740,10 @@
     
     		float	damage;		//	Damage done by weapon.  Gets scaled down based on size of ship.
     
    -		damage = Weapon_info[Weapons[objp_weapon->instance].weapon_info_index].damage;
    +		if (objp_weapon->type == OBJ_WEAPON)
    +			damage = Weapon_info[Weapons[objp_weapon->instance].weapon_info_index].damage;
    +		else
    +			damage = Weapon_info[Beams[objp_weapon->instance].weapon_info_index].damage;
     		
     		// wacky stuff here
     		ship_info *sip = &Ship_info[Ships[objp_hit->instance].ship_info_index];
    @@ -15000,7 +15003,7 @@
     	if (objp_ship->flags & OF_PLAYER_SHIP) {
     		//SUSHI: So that hitting a player ship actually resets the last_hit_target_time counter for whoever hit the player.
     		//This is all copypasted from code below
    -		if (hit_objp->type == OBJ_WEAPON) {
    +		if ((hit_objp->type == OBJ_WEAPON) || (hit_objp->type == OBJ_BEAM)) {
     			hitter_objnum = hit_objp->parent;
     			Assert((hitter_objnum >= 0) && (hitter_objnum < MAX_OBJECTS));
     			objp_hitter = &Objects[hitter_objnum];
    @@ -15030,7 +15033,7 @@
     		}
     	}
     
    -	if (hit_objp->type == OBJ_WEAPON) {
    +	if ((hit_objp->type == OBJ_WEAPON) || (hit_objp->type == OBJ_BEAM)) {
     		//	Make sure the object that fired this weapon is still alive.  If not, abort.
     		// Assert(hit_objp->parent >= 0);
     		if(hit_objp->parent < 0){
    Index: ship/shiphit.cpp
    ===================================================================
    --- ship/shiphit.cpp	(revision 6638)
    +++ ship/shiphit.cpp	(working copy)
    @@ -2294,7 +2294,7 @@
     
     	//	If got hit by a weapon, tell the AI so it can react.  Only do this line in single player,
     	// or if I am the master in a multiplayer game
    -	if ( other_obj->type == OBJ_WEAPON && ( !(Game_mode & GM_MULTIPLAYER) || MULTIPLAYER_MASTER )) {
    +	if ( ((other_obj->type == OBJ_WEAPON) || (other_obj->type == OBJ_BEAM)) && ( !(Game_mode & GM_MULTIPLAYER) || MULTIPLAYER_MASTER )) {
     		//	If weapon hits ship on same team and that ship not targeted and parent of weapon not player,
     		//	don't do damage.
     		//	Ie, player can always do damage.  AI can only damage team if that ship is targeted.
    @@ -2314,10 +2314,14 @@
     	}
     
     	// only want to check the following in single player or if I am the multiplayer game server
    -	if ( !MULTIPLAYER_CLIENT && !(Game_mode & GM_DEMO_PLAYBACK) && ((other_obj->type == OBJ_SHIP) || (other_obj->type == OBJ_WEAPON)) ){
    +	if ( !MULTIPLAYER_CLIENT && !(Game_mode & GM_DEMO_PLAYBACK) && ((other_obj->type == OBJ_SHIP) || (other_obj->type == OBJ_WEAPON) || (other_obj->type == OBJ_BEAM)) ){
     		ai_ship_hit(ship_obj, other_obj, hitpos, quadrant, hit_normal);
     	}
     
    +	// don't need to go any farther if the weapon is a beam.
    +	if ( other_obj->type == OBJ_BEAM )
    +		return;
    +
     	//	Cut damage done on the player by 4x in training missions, but do full accredidation
     	if ( The_mission.game_type & MISSION_TYPE_TRAINING ){
     		if (ship_obj == Player_obj){
    Index: weapon/beam.cpp
    ===================================================================
    --- weapon/beam.cpp	(revision 6638)
    +++ weapon/beam.cpp	(working copy)
    @@ -413,7 +413,7 @@
     	}	
     
     	// create the associated object
    -	objnum = obj_create(OBJ_BEAM, -1, new_item - Beams, &vmd_identity_matrix, &vmd_zero_vector, 1.0f, OF_COLLIDES);
    +	objnum = obj_create(OBJ_BEAM, OBJ_INDEX(fire_info->shooter), new_item - Beams, &vmd_identity_matrix, &vmd_zero_vector, 1.0f, OF_COLLIDES);
     	if(objnum < 0){
     		beam_delete(new_item);
     		nprintf(("General", "obj_create() failed for beam weapon! bah!\n"));
    
    patch file icon traitor_beams.patch (3,966 bytes) 2010-10-19 18:41 +

-Relationships
+Relationships

-Notes

~0012414

FUBAR-BDHR (developer)

I traced this issue to beams being OBJ_TYPE == BEAM which was not included in any of the ship_hit procedures that eventually call the traitor code.

I experimented and came up with a pseudo-patch. This is almost guaranteed to have issues since I'm not familiar with the weapon code. I have a feeling damage per second might factor in somewhere. I'll attach it anyway as if it doesn't work at least it will give someone a good starting spot.

~0012477

FUBAR-BDHR (developer)

Fix committed r6760
+Notes

-Issue History
Date Modified Username Field Change
2010-04-22 07:43 Spoon New Issue
2010-10-19 18:24 FUBAR-BDHR Note Added: 0012414
2010-10-19 18:24 FUBAR-BDHR Status new => confirmed
2010-10-19 18:24 FUBAR-BDHR File Added: traitor_beams.patch
2010-10-19 18:40 FUBAR-BDHR File Deleted: traitor_beams.patch
2010-10-19 18:41 FUBAR-BDHR File Added: traitor_beams.patch
2010-10-22 00:57 FUBAR-BDHR Status confirmed => assigned
2010-10-22 00:57 FUBAR-BDHR Assigned To => FUBAR-BDHR
2010-11-21 01:44 FUBAR-BDHR Note Added: 0012477
2010-11-21 01:44 FUBAR-BDHR Status assigned => resolved
2010-11-21 01:44 FUBAR-BDHR Fixed in Version => 3.6.13
2010-11-21 01:44 FUBAR-BDHR Resolution open => fixed
+Issue History