2019-10-21 18:40 EDT


View Issue Details Jump to Notes ]
IDProjectCategoryView StatusLast Update
0002330FSSCPSEXPspublic2010-11-04 01:41
ReporterFUBAR-BDHR 
Assigned ToFUBAR-BDHR 
PrioritynormalSeverityminorReproducibilityalways
StatusresolvedResolutionfixed 
Product Version3.6.13 
Target VersionFixed in Version3.6.13 
Summary0002330: ship-subsytem-targetable/untargetable don't work in multi
DescriptionHeck with this I'll just post the fix :)
Additional InformationNote fix requires (and includes) other new sexp code.
TagsNo tags attached.
Attached Files
  • patch file icon 4subsys_and_untargetablefix.patch (9,556 bytes) 2010-10-22 00:27 -
    Index: parse/sexp.cpp
    ===================================================================
    --- parse/sexp.cpp	(revision 6659)
    +++ parse/sexp.cpp	(working copy)
    @@ -353,6 +353,10 @@
     	{ "ship-targetable-as-bomb",	OP_SHIP_BOMB_TARGETABLE,			1, INT_MAX	},
     	{ "ship-untargetable-as-bomb",	OP_SHIP_BOMB_UNTARGETABLE,			1, INT_MAX	},
     	{ "ship-subsys-targetable",		OP_SHIP_SUBSYS_TARGETABLE,		2, INT_MAX },	// Goober5000
    +	{ "ship-subsys-no-replace",		OP_SHIP_SUBSYS_NO_REPLACE,		3, INT_MAX },	// FUBAR
    +	{ "ship-subsys-no-live-debris",	OP_SHIP_SUBSYS_NO_LIVE_DEBRIS,	3, INT_MAX },	// FUBAR
    +	{ "ship-subsys-vanished",		OP_SHIP_SUBSYS_VANISHED,		3, INT_MAX },	// FUBAR
    +	{ "ship-subsys-ignore_if_dead",	OP_SHIP_SUBSYS_IGNORE_IF_DEAD,	3, INT_MAX },	// FUBAR
     	{ "ship-subsys-untargetable",	OP_SHIP_SUBSYS_UNTARGETABLE,	2, INT_MAX },	// Goober5000
     	{ "ship-vaporize",				OP_SHIP_VAPORIZE,				1, INT_MAX },	// Goober5000
     	{ "ship-no-vaporize",			OP_SHIP_NO_VAPORIZE,			1, INT_MAX },	// Goober5000
    @@ -11020,7 +11024,6 @@
     		}
     	}
     }
    -
     // modified by Goober5000; now it should work properly
     // function to deal with breaking/fixing the warp engines on ships/wings.
     // --repairable is true when we are breaking the warp drive (can be repaired)
    @@ -11768,13 +11771,21 @@
     {
     	char *subsys;
     	ship_subsys *ss; 
    +	ship *shipp = NULL;
     
     	// get the ship
    -	int ship_num = ship_name_lookup(CTEXT(n));
    -	if (ship_num < 0)
    +	shipp = sexp_get_ship_from_node(n); 
    +	if (shipp == NULL) {
     		return;
    -	n = CDR(n);
    +	}
     
    +	//multiplayer packet start
    +	multi_start_packet(); 
    +	multi_send_int(SSF_UNTARGETABLE); 
    +	multi_send_ship(shipp);
    +	multi_send_bool(untargetable ? true : false);
    +
    +
     	// get the subsystems
     	for (; n >= 0; n = CDR(n))
     	{
    @@ -11783,7 +11794,7 @@
     		// deal with generic subsystem names
     		int generic_type = get_generic_subsys(subsys);
     		if (generic_type) {
    -			for (ss = GET_FIRST(&Ships[ship_num].subsys_list); ss != END_OF_LIST(&Ships[ship_num].subsys_list); ss = GET_NEXT(ss)) {
    +			for (ss = GET_FIRST(&shipp->subsys_list); ss != END_OF_LIST(&shipp->subsys_list); ss = GET_NEXT(ss)) {
     				if (generic_type == ss->system_info->type) {
     					if (untargetable)
     						ss->flags |= SSF_UNTARGETABLE;
    @@ -11793,7 +11804,7 @@
     			}
     		}
     		else {
    -			ss = ship_get_subsys(&Ships[ship_num], subsys);
    +			ss = ship_get_subsys(shipp, subsys);
     			if (ss == NULL)
     				continue;
     
    @@ -11802,9 +11813,106 @@
     			else
     				ss->flags &= ~SSF_UNTARGETABLE;
     		}
    +		// multiplayer send subsystem name
    +		multi_send_string(subsys);
     	}
    +	// mulitplayer end of packet
    +	multi_end_packet();
     }
     
    +//FUBAR
    +void sexp_ship_deal_with_subsystem_flag(int node, int ss_flag, bool sendit = false)
    +{	
    +	ship *shipp = NULL;
    +	ship_subsys *ss = NULL;	
    +	
    +	// get ship
    +	shipp = sexp_get_ship_from_node(node); 
    +	if (shipp == NULL) {
    +		return;
    +	}
    +
    +	//replace or not
    +	node = CDR(node);
    +	int setit = is_sexp_true(node);
    +	
    +	//multiplayer packet start
    +	if (sendit)
    +	{
    +		multi_start_packet(); 
    +		multi_send_int(ss_flag); 
    +		multi_send_ship(shipp);
    +		multi_send_bool(setit ? true : false);
    +	}
    +
    +	//Process subsystems
    +	while(node != -1)
    +	{
    +		// get the subsystem
    +		ss = ship_get_subsys(shipp, CTEXT(node));
    +		if(ss == NULL)
    +		{
    +			node = CDR(node);
    +			continue;
    +		}
    + 
    +		// set the flag
    +		if(setit)
    +			ss->flags |= ss_flag;
    +		else
    +			ss->flags &= ~ss_flag;
    +
    +		// multiplayer send subsystem name
    +		if (sendit)
    +			multi_send_string(CTEXT(node));
    +
    +		// next
    +		node = CDR(node);
    +	}
    +
    +	// mulitplayer end of packet
    +	if (sendit)
    +		multi_end_packet();
    +}
    +void multi_sexp_deal_with_subsys_flag() 
    +{
    +	int ss_flag = 0;
    +	bool setit = false;
    +	ship_subsys *ss = NULL;
    +    ship *shipp = NULL;
    +	char ss_name[MAX_NAME_LEN];
    +
    +	multi_get_int(ss_flag);
    +	multi_get_ship(shipp);
    +	multi_get_bool(setit);
    + 
    +	while (multi_get_string(ss_name)) 
    +	{
    +		int generic_type = get_generic_subsys(ss_name);
    +		if (generic_type) {
    +			for (ss = GET_FIRST(&shipp->subsys_list); ss != END_OF_LIST(&shipp->subsys_list); ss = GET_NEXT(ss)) {
    +				if (generic_type == ss->system_info->type) {
    +					if (setit)
    +						ss->flags |= ss_flag;
    +					else
    +						ss->flags &= ~ss_flag;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			ss = ship_get_subsys(shipp, ss_name);
    +			if(ss != NULL)
    +			{	
    +				// set the flag
    +				if(setit)
    +					ss->flags |= ss_flag;
    +				else
    +					ss->flags &= ~ss_flag;
    +			}
    +		}
    +	}
    +}
     // Goober5000
     void sexp_ship_tag( int n, int tag )
     {
    @@ -18308,6 +18416,26 @@
     				sexp_val = SEXP_TRUE;
     				break;
     
    +			case OP_SHIP_SUBSYS_NO_REPLACE:
    +				sexp_ship_deal_with_subsystem_flag(node, SSF_NO_REPLACE, true);
    +				sexp_val = SEXP_TRUE;
    +				break;
    +
    +			case OP_SHIP_SUBSYS_NO_LIVE_DEBRIS:
    +				sexp_ship_deal_with_subsystem_flag(node, SSF_NO_LIVE_DEBRIS, true);
    +				sexp_val = SEXP_TRUE;
    +				break;
    +
    +			case OP_SHIP_SUBSYS_VANISHED:
    +				sexp_ship_deal_with_subsystem_flag(node, SSF_VANISHED, true);
    +				sexp_val = SEXP_TRUE;
    +				break;
    +
    +			case OP_SHIP_SUBSYS_IGNORE_IF_DEAD:
    +				sexp_ship_deal_with_subsystem_flag(node, SSF_MISSILES_IGNORE_IF_DEAD, false);
    +				sexp_val = SEXP_TRUE;
    +				break;
    +
     			case OP_SHIP_CREATE:
     				sexp_ship_create(node);
     				sexp_val = SEXP_TRUE;
    @@ -19579,6 +19707,15 @@
     				multi_sexp_change_subsystem_name();
     				break;
     
    +			case OP_SHIP_SUBSYS_NO_REPLACE:
    +			case OP_SHIP_SUBSYS_NO_LIVE_DEBRIS:
    +			case OP_SHIP_SUBSYS_VANISHED:
    +			case OP_SHIP_SUBSYS_IGNORE_IF_DEAD:
    +			case OP_SHIP_SUBSYS_TARGETABLE:
    +			case OP_SHIP_SUBSYS_UNTARGETABLE:
    +				multi_sexp_deal_with_subsys_flag();
    +				break;
    +
     			case OP_SHIP_CHANGE_CALLSIGN:
     				multi_sexp_ship_change_callsign();
     				break;
    @@ -20086,6 +20223,10 @@
     		case OP_SHIP_UNSTEALTHY:
     		case OP_FRIENDLY_STEALTH_INVISIBLE:
     		case OP_FRIENDLY_STEALTH_VISIBLE:
    +		case OP_SHIP_SUBSYS_NO_REPLACE:
    +		case OP_SHIP_SUBSYS_NO_LIVE_DEBRIS:
    +		case OP_SHIP_SUBSYS_VANISHED:
    +		case OP_SHIP_SUBSYS_IGNORE_IF_DEAD:
     		case OP_SHIP_SUBSYS_TARGETABLE:
     		case OP_SHIP_SUBSYS_UNTARGETABLE:
     		case OP_RED_ALERT:
    @@ -20481,6 +20622,17 @@
     			else
     				return OPF_SUBSYS_OR_GENERIC;
     
    +		case OP_SHIP_SUBSYS_NO_REPLACE:
    +		case OP_SHIP_SUBSYS_NO_LIVE_DEBRIS:
    +		case OP_SHIP_SUBSYS_VANISHED:
    +		case OP_SHIP_SUBSYS_IGNORE_IF_DEAD:
    +			if (argnum == 0)
    +				return OPF_SHIP;
    +			else if (argnum == 1)
    +				return OPF_BOOL;
    +			else
    +				return OPF_SUBSYSTEM;
    +
     		case OP_IS_DESTROYED:
     		case OP_HAS_ARRIVED:
     		case OP_HAS_DEPARTED:
    @@ -23045,6 +23197,10 @@
     		case OP_FRIENDLY_STEALTH_VISIBLE:
     		case OP_SHIP_SUBSYS_TARGETABLE:
     		case OP_SHIP_SUBSYS_UNTARGETABLE:
    +		case OP_SHIP_SUBSYS_NO_REPLACE:
    +		case OP_SHIP_SUBSYS_NO_LIVE_DEBRIS:
    +		case OP_SHIP_SUBSYS_VANISHED:
    +		case OP_SHIP_SUBSYS_IGNORE_IF_DEAD:
     		case OP_WARP_BROKEN:
     		case OP_WARP_NOT_BROKEN:
     		case OP_WARP_NEVER:
    @@ -24929,6 +25085,41 @@
     		"\t1:\tName of a ship\r\n"
     		"\tRest: Name of the ship's subsystem(s)" },
     
    +	// FUBAR
    +	{ OP_SHIP_SUBSYS_NO_REPLACE, "ship-subsys-no-replace\r\n"
    +		"\tCauses the -destroyed version of specified ship subsystem(s) to not render when it's destroyed.\r\n"
    +		"Takes 3 or more arguments...\r\n"
    +		"\t1:\tName of a ship\r\n"
    +		"\t2:\tTrue = Do not render or False = render if exists\r\n"
    +		"\tRest: Name of the ship's subsystem(s)" 
    +		"\tNote: If subsystem is already dead it will vanish or reappear out of thin air" },
    +
    +
    +	// FUBAR
    +	{ OP_SHIP_SUBSYS_NO_LIVE_DEBRIS, "ship-subsys-no-live-debris\r\n"
    +		"\tCauses the specified ship subsystem(s) to not render live debris when it's destroyed.\r\n"
    +		"Takes 3 or more arguments...\r\n"
    +		"\t1:\tName of a ship\r\n"
    +		"\t2:\tTrue = Do not render or False = render if exists\r\n"
    +		"\tRest: Name of the ship's subsystem(s)" },
    +
    +	// FUBAR
    +	{ OP_SHIP_SUBSYS_VANISHED, "ship-subsys-vanished\r\n"
    +		"\tCauses the subsystem to vanish without a trace it's destroyed.\r\n"
    +		"Takes 3 or more arguments...\r\n"
    +		"\t1:\tName of a ship\r\n"
    +		"\t2:\tTrue = vanish or False = don't vanish\r\n"
    +		"\tRest: Name of the ship's subsystem(s)" 
    +		"\tNote: Useful for replacing subsystems with actual docked models." },
    +
    +	// FUBAR
    +	{ OP_SHIP_SUBSYS_IGNORE_IF_DEAD, "ship-subsys-ignore-if-dead\r\n"
    +		"\tCauses secondary weapons to ignore dead ship subsystem(s)and home on hull instead.\r\n"
    +		"Takes 3 or more arguments...\r\n"
    +		"\t1:\tName of a ship\r\n"
    +		"\t2:\tTrue = Ignore dead or False = don't ignore\r\n"
    +		"\tRest: Name of the ship's subsystem(s)" },
    +
     	// Goober5000
     	{ OP_SHIP_CHANGE_ALT_NAME, "ship-change-alt-name\r\n"
     		"\tChanges the alternate ship class name displayed in the HUD target window.  Takes 2 or more arguments...\r\n"
    Index: parse/sexp.h
    ===================================================================
    --- parse/sexp.h	(revision 6659)
    +++ parse/sexp.h	(working copy)
    @@ -598,6 +598,10 @@
     #define OP_IS_FACING						(0x00db | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E
     #define OP_FORCE_GLIDE						(0x00dc	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E
     #define OP_TURRET_SET_RATE_OF_FIRE			(0x00dd | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
    +#define OP_SHIP_SUBSYS_NO_REPLACE			(0x00de	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
    +#define OP_SHIP_SUBSYS_NO_LIVE_DEBRIS		(0x00df	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
    +#define OP_SHIP_SUBSYS_VANISHED				(0x00e0	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
    +#define OP_SHIP_SUBSYS_IGNORE_IF_DEAD		(0x00e1	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
     
     /* made obsolete by Goober5000
     // debugging sexpressions
    
    patch file icon 4subsys_and_untargetablefix.patch (9,556 bytes) 2010-10-22 00:27 +

-Relationships
+Relationships

-Notes

~0012438

FUBAR-BDHR (developer)

Fixed in r6709
+Notes

-Issue History
Date Modified Username Field Change
2010-10-22 00:27 FUBAR-BDHR New Issue
2010-10-22 00:27 FUBAR-BDHR File Added: 4subsys_and_untargetablefix.patch
2010-10-22 00:27 FUBAR-BDHR Status new => assigned
2010-10-22 00:27 FUBAR-BDHR Assigned To => FUBAR-BDHR
2010-11-04 01:41 FUBAR-BDHR Note Added: 0012438
2010-11-04 01:41 FUBAR-BDHR Status assigned => resolved
2010-11-04 01:41 FUBAR-BDHR Fixed in Version => 3.6.13
2010-11-04 01:41 FUBAR-BDHR Resolution open => fixed
+Issue History