View Issue Details

IDProjectCategoryView StatusLast Update
0002330FSSCPSEXPspublic2010-11-04 05:41
ReporterFUBAR-BDHR Assigned ToFUBAR-BDHR  
PrioritynormalSeverityminorReproducibilityalways
Status resolvedResolutionfixed 
Product Version3.6.13 
Fixed 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.

Activities

2010-10-22 04:27

 

4subsys_and_untargetablefix.patch (9,556 bytes)   
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

FUBAR-BDHR

2010-11-04 05:41

developer   ~0012438

Fixed in r6709

Issue History

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