View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002950 | FSSCP | multiplayer | public | 2013-11-06 07:59 | 2014-04-22 08:56 |
| Reporter | niffiwan | Assigned To | niffiwan | ||
| Priority | normal | Severity | minor | Reproducibility | always |
| Status | resolved | Resolution | fixed | ||
| Product Version | 3.7.1 | ||||
| Summary | 0002950: shields-off & shields-on sexps don't work in multi | ||||
| Description | If you call shields-off on another player ship, the server thinks that the shields are off, but the client doesn't, so HUD displays are not correct. | ||||
| Steps To Reproduce | See attached multi mission. Use a/z to disable/enable shields. Use q to warp in Alpha3 Use 4 to set ETS of Alpha1/2/3 to the values of Alpha 1 | ||||
| Tags | No tags attached. | ||||
|
|
|
|
|
I have a patch, but I'll wait to get feedback on 0002946 prior to committing this one. |
|
|
mantis2950.patch (6,001 bytes)
commit e951ebc53d37bfa9f8845bf39aa3967eda4526bd
Author: niffiwan <niffiwan.scp@gmail.com>
Date: Wed Nov 6 19:37:05 2013 +1000
Fix mantis 2950: make shields-on/shields-off multi compatible
Fix multi player for alter-ship-flag
diff --git a/code/parse/sexp.cpp b/code/parse/sexp.cpp
index 2fcbcc0..e954c36 100644
--- a/code/parse/sexp.cpp
+++ b/code/parse/sexp.cpp
@@ -12428,7 +12428,7 @@ void multi_sexp_deal_with_ship_flag()
multi_get_int(p_object_flag);
multi_get_int(p_object_flag2);
multi_get_bool(set_it);
-
+
// if any of the above failed so will this loop
while (multi_get_bool(ship_arrived))
{
@@ -12439,7 +12439,10 @@ void multi_sexp_deal_with_ship_flag()
WarningEx(LOCATION, "Null ship pointer in multi_sexp_deal_with_ship_flag(), tell a coder.\n");
return;
}
-
+
+ // save flags for state change comparisons
+ int object_flag_orig = Objects[shipp->objnum].flags;
+
if (set_it) {
Objects[shipp->objnum].flags |= object_flag;
// Objects[shipp->objnum].flags2 |= object_flag2;
@@ -12454,6 +12457,14 @@ void multi_sexp_deal_with_ship_flag()
}
// deal with side effects of these flags
+ if (object_flag == OF_NO_SHIELDS) {
+ if (set_it) {
+ zero_one_ets(&shipp->shield_recharge_index, &shipp->weapon_recharge_index, &shipp->engine_recharge_index);
+ } else if (object_flag_orig & OF_NO_SHIELDS) {
+ set_default_recharge_rates(&Objects[shipp->objnum]);
+ }
+ }
+
if (ship_flag2 == SF2_AFTERBURNER_LOCKED) {
if (set_it) {
afterburners_stop(&Objects[shipp->objnum], 1);
@@ -12715,6 +12726,7 @@ void sexp_alter_ship_flag(int node)
// make sure the list writes to the correct list of flags!
if (Object_flag_names[i].flag_list == 1) {
object_flag = Object_flag_names[i].flag;
+ send_multi = true;
}
else if (Object_flag_names[i].flag_list == 2) {
object_flag2 = Object_flag_names[i].flag;
@@ -12803,7 +12815,9 @@ void sexp_alter_ship_flag(int node)
// no 4th argument means do this to every ship in the mission (and if the flag is set, every ship that will be too).
if (node == -1) {
// send a message to the clients saying there were no more arguments
- multi_send_bool(false);
+ if (send_multi && MULTIPLAYER_MASTER) {
+ multi_send_bool(false);
+ }
alter_flag_for_all_ships(future_ships, object_flag, object_flag2, ship_flags, ship_flags2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag);
}
@@ -12811,7 +12825,9 @@ void sexp_alter_ship_flag(int node)
else {
// send a message to the clients saying there are more arguments
- multi_send_bool(true);
+ if (send_multi && MULTIPLAYER_MASTER) {
+ multi_send_bool(true);
+ }
while (node != -1) {
sexp_get_object_ship_wing_point_team(&oswpt, CTEXT(node), future_ships);
@@ -12825,29 +12841,33 @@ void sexp_alter_ship_flag(int node)
sexp_alter_ship_flag_helper(oswpt, future_ships, object_flag, object_flag2, ship_flags, ship_flags2, parse_obj_flag, parse_obj_flag2, ai_flag, ai_flag2, set_flag);
node = CDR(node);
- multi_send_int(oswpt.type);
+ if (send_multi && MULTIPLAYER_MASTER) {
+ multi_send_int(oswpt.type);
- switch (oswpt.type) {
- case OSWPT_TYPE_SHIP:
- multi_send_ship(oswpt.shipp);
- break;
+ switch (oswpt.type) {
+ case OSWPT_TYPE_SHIP:
+ multi_send_ship(oswpt.shipp);
+ break;
- case OSWPT_TYPE_PARSE_OBJECT:
- multi_send_parse_object(oswpt.p_objp);
- break;
+ case OSWPT_TYPE_PARSE_OBJECT:
+ multi_send_parse_object(oswpt.p_objp);
+ break;
- case OSWPT_TYPE_WING_NOT_PRESENT:
- case OSWPT_TYPE_WING:
- multi_send_ushort(oswpt.wingp->net_signature);
- break;
+ case OSWPT_TYPE_WING_NOT_PRESENT:
+ case OSWPT_TYPE_WING:
+ multi_send_ushort(oswpt.wingp->net_signature);
+ break;
- case OSWPT_TYPE_WHOLE_TEAM:
- multi_send_int(oswpt.team);
- break;
+ case OSWPT_TYPE_WHOLE_TEAM:
+ multi_send_int(oswpt.team);
+ break;
+ }
}
}
}
- multi_end_callback();
+ if (send_multi && MULTIPLAYER_MASTER) {
+ multi_end_callback();
+ }
}
@@ -12897,7 +12917,12 @@ void multi_sexp_alter_ship_flag()
switch (oswpt.type) {
case OSWPT_TYPE_SHIP:
- multi_get_ship(oswpt.shipp);
+ if (multi_get_ship(oswpt.shipp)) {
+ oswpt.objp = &Objects[oswpt.shipp->objnum];
+ } else {
+ Warning(LOCATION, "OSWPT had an invalid ship in multi_sexp_alter_ship_flag(), skipping");
+ continue;
+ }
break;
case OSWPT_TYPE_PARSE_OBJECT:
@@ -12910,6 +12935,16 @@ void multi_sexp_alter_ship_flag()
for (i = 0; i < Num_wings; i++) {
if (Wings[i].net_signature == wing_sig) {
oswpt.wingp = &Wings[i];
+
+ // wing leader handling taken from sexp_get_object_ship_wing_point_team
+ if ((oswpt.wingp->special_ship >= 0) && (oswpt.wingp->ship_index[oswpt.wingp->special_ship] >= 0)) {
+ oswpt.shipp = &Ships[oswpt.wingp->ship_index[oswpt.wingp->special_ship]];
+ oswpt.objp = &Objects[oswpt.shipp->objnum];
+ } else {
+ oswpt.shipp = &Ships[oswpt.wingp->ship_index[0]];
+ oswpt.objp = &Objects[oswpt.shipp->objnum];
+ Warning(LOCATION, "Substituting ship '%s' at index 0 for nonexistent wing leader at index %d!", oswpt.shipp->ship_name, oswpt.wingp->special_ship);
+ }
break;
}
}
@@ -14283,7 +14318,7 @@ void sexp_destroy_instantly(int n)
void sexp_shields_off(int n, bool shields_off ) //-Sesquipedalian
{
- sexp_deal_with_ship_flag(n, true, OF_NO_SHIELDS, 0, 0, 0, P_OF_NO_SHIELDS, 0, shields_off);
+ sexp_deal_with_ship_flag(n, true, OF_NO_SHIELDS, 0, 0, 0, P_OF_NO_SHIELDS, 0, shields_off, true);
}
// Goober5000
@@ -24037,6 +24072,8 @@ void multi_sexp_eval()
case OP_UNLOCK_PRIMARY_WEAPON:
case OP_LOCK_SECONDARY_WEAPON:
case OP_UNLOCK_SECONDARY_WEAPON:
+ case OP_SHIELDS_ON:
+ case OP_SHIELDS_OFF:
multi_sexp_deal_with_ship_flag();
break;
|
|
|
Also noticed that alter-ship-flag was broken in multi, added some fixes for that as well |
|
|
Pull request for code review here: https://github.com/scp-fs2open/fs2open.github.com/pull/14 |
|
|
Hi - I've reviewed the Github pull request and commented there accordingly. In summary, I think this is fine to commit to SVN trunk and close the pull request and branch (given yet to move fully to Github). |
|
|
Fix committed to trunk@10587. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2013-11-06 07:59 | niffiwan | New Issue | |
| 2013-11-06 07:59 | niffiwan | Status | new => assigned |
| 2013-11-06 07:59 | niffiwan | Assigned To | => niffiwan |
| 2013-11-06 07:59 | niffiwan | Relationship added | related to 0002946 |
| 2013-11-06 08:03 | niffiwan | File Added: ets_getset_multi.fs2 | |
| 2013-11-06 08:12 | niffiwan | File Added: mantis2950.patch | |
| 2013-11-06 08:13 | niffiwan | Note Added: 0015385 | |
| 2013-11-07 08:16 | niffiwan | File Deleted: mantis2950.patch | |
| 2013-11-07 08:16 | niffiwan | File Added: mantis2950.patch | |
| 2013-11-10 02:13 | niffiwan | File Deleted: mantis2950.patch | |
| 2013-11-10 02:13 | niffiwan | File Added: mantis2950.patch | |
| 2013-11-10 02:13 | niffiwan | Note Added: 0015404 | |
| 2014-02-23 04:03 | niffiwan | Note Added: 0015630 | |
| 2014-02-23 04:03 | niffiwan | Status | assigned => code review |
| 2014-04-21 06:29 | Echelon9 | Note Added: 0015705 | |
| 2014-04-22 08:56 | niffiwan | Changeset attached | => fs2open trunk r10587 |
| 2014-04-22 08:56 | niffiwan | Note Added: 0015707 | |
| 2014-04-22 08:56 | niffiwan | Status | code review => resolved |
| 2014-04-22 08:56 | niffiwan | Resolution | open => fixed |