Make players assume ownership of networks when they place security stations onto unsecured ones (#4714)
* Fixes #4712: When a security station is placed onto an unsecured network, the placer assumes ownership of the entire network. Otherwise the contiguous network would not necessarily reconnect in the same way when the chunk is reloaded due to differing player-ids throughout the network. In addition, changes to the node's owner were not being persisted due to the host never being marked as dirty. * Fix formatting
This commit is contained in:
@@ -327,8 +327,9 @@ public class GridNode implements IGridNode, IPathItem {
|
||||
|
||||
@Override
|
||||
public void setPlayerID(final int playerID) {
|
||||
if (playerID >= 0) {
|
||||
if (playerID >= 0 && this.playerID != playerID) {
|
||||
this.playerID = playerID;
|
||||
gridProxy.onGridNotification(GridNotification.OWNER_CHANGED);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+14
-2
@@ -81,8 +81,16 @@ public class SecurityCache implements ISecurityGrid {
|
||||
private void updateSecurityKey() {
|
||||
final long lastCode = this.securityKey;
|
||||
|
||||
/**
|
||||
* Placing a security station will propagate the security station's owner to all
|
||||
* connected grid nodes to prevent the network from not reforming due to
|
||||
* different owners later.
|
||||
*/
|
||||
int newOwner = -1;
|
||||
if (this.securityProvider.size() == 1) {
|
||||
this.securityKey = this.securityProvider.get(0).getSecurityKey();
|
||||
ISecurityProvider securityProvider = this.securityProvider.get(0);
|
||||
this.securityKey = securityProvider.getSecurityKey();
|
||||
newOwner = securityProvider.getOwner();
|
||||
} else {
|
||||
this.securityKey = -1;
|
||||
}
|
||||
@@ -90,7 +98,11 @@ public class SecurityCache implements ISecurityGrid {
|
||||
if (lastCode != this.securityKey) {
|
||||
this.getGrid().postEvent(new MENetworkSecurityChange());
|
||||
for (final IGridNode n : this.getGrid().getNodes()) {
|
||||
((GridNode) n).setLastSecurityKey(this.securityKey);
|
||||
GridNode gridNode = (GridNode) n;
|
||||
gridNode.setLastSecurityKey(this.securityKey);
|
||||
if (gridNode.getPlayerID() != newOwner) {
|
||||
gridNode.setPlayerID(newOwner);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,7 +167,6 @@ public class AENetworkProxy implements IGridBlock {
|
||||
* short cut!
|
||||
*
|
||||
* @return grid of node
|
||||
*
|
||||
* @throws GridAccessException of node or grid is null
|
||||
*/
|
||||
public IGrid getGrid() throws GridAccessException {
|
||||
@@ -280,6 +279,11 @@ public class AENetworkProxy implements IGridBlock {
|
||||
|
||||
@Override
|
||||
public void onGridNotification(final GridNotification notification) {
|
||||
if (notification == GridNotification.OWNER_CHANGED) {
|
||||
gp.saveChanges();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.gp instanceof CablePart) {
|
||||
((CablePart) this.gp).markForUpdate();
|
||||
}
|
||||
|
||||
@@ -28,4 +28,7 @@ public interface IGridProxyable extends IGridHost {
|
||||
DimensionalCoord getLocation();
|
||||
|
||||
void gridChanged();
|
||||
|
||||
void saveChanges();
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user