diff --git a/src/Marble.hx b/src/Marble.hx
index 82e9ee12..6350662e 100644
--- a/src/Marble.hx
+++ b/src/Marble.hx
@@ -1245,7 +1245,7 @@ class Marble extends GameObject {
// Marble-Marble
var nextPos = position.add(velocity.multiply(deltaT));
for (marble in this.collisionWorld.marbleEntities) {
- if (marble == this.collider)
+ if (marble == this.collider || marble.ignore)
continue;
var otherPosition = marble.transform.getPosition();
var isec = Collision.capsuleSphereNearestOverlap(position, nextPos, _radius, otherPosition, marble.radius);
@@ -1669,6 +1669,13 @@ class Marble extends GameObject {
}
return;
}
+
+ var ticks = Net.isClient ? serverTicks : timeState.ticks;
+
+ if ((ticks - this.level.serverStartTicks) < (10000 >> 5)) // 10 seconds marble collision invulnerability - competitive mode needs this
+ this.collider.ignore = true;
+ else
+ this.collider.ignore = false;
}
// if (this.controllable) {
diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx
index 7f75e6ef..8943e3e6 100644
--- a/src/MarbleWorld.hx
+++ b/src/MarbleWorld.hx
@@ -370,12 +370,12 @@ class MarbleWorld extends Scheduler {
if (this.isMultiplayer) {
// Add us
if (Net.isHost) {
- this.playGui.addPlayer(0, (Net.hostSpectate ? "[S] " : "") + Settings.highscoreName.substr(0, 15), true);
+ this.playGui.addPlayer(0, Settings.highscoreName.substr(0, 15), true);
} else {
- this.playGui.addPlayer(Net.clientId, (Net.clientSpectate ? "[S] " : "") + Settings.highscoreName.substr(0, 15), true);
+ this.playGui.addPlayer(Net.clientId, Settings.highscoreName.substr(0, 15), true);
}
for (client in Net.clientIdMap) {
- this.playGui.addPlayer(client.id, (client.spectator ? "[S] " : "") + client.name.substr(0, 15), false);
+ this.playGui.addPlayer(client.id, client.name.substr(0, 15), false);
}
}
@@ -612,7 +612,7 @@ class MarbleWorld extends Scheduler {
this.initMarble(cc, () -> {
var addedMarble = clientMarbles.get(cc);
this.restart(addedMarble); // spawn it
- this.playGui.addPlayer(cc.id, (cc.spectator ? "[S] " : "") + cc.getName(), false);
+ this.playGui.addPlayer(cc.id, cc.getName(), false);
this.playGui.redrawPlayerList();
// Sort all the marbles so that they are updated in a deterministic order
@@ -629,7 +629,7 @@ class MarbleWorld extends Scheduler {
this.initMarble(cc, () -> {
var addedMarble = clientMarbles.get(cc);
this.restart(addedMarble); // spawn it
- this.playGui.addPlayer(cc.id, (cc.spectator ? "[S] " : "") + cc.getName(), false);
+ this.playGui.addPlayer(cc.id, cc.getName(), false);
this.playGui.redrawPlayerList();
// Sort all the marbles so that they are updated in a deterministic order
@@ -913,6 +913,8 @@ class MarbleWorld extends Scheduler {
for (client => marble in this.clientMarbles)
marble.setMode(Play);
+ this.playGui.redrawPlayerList(); // Update spectators display
+
this.playGui.setCenterText('go');
var huntMode = cast(this.gameMode, HuntMode);
diff --git a/src/collision/SphereCollisionEntity.hx b/src/collision/SphereCollisionEntity.hx
index 0e7cd1ab..4a90c190 100644
--- a/src/collision/SphereCollisionEntity.hx
+++ b/src/collision/SphereCollisionEntity.hx
@@ -13,6 +13,7 @@ import src.Debug;
class SphereCollisionEntity extends CollisionEntity {
public var radius:Float;
public var marble:Marble;
+ public var ignore:Bool = false;
var _dbgEntity2:h3d.scene.Mesh;
@@ -75,6 +76,8 @@ class SphereCollisionEntity extends CollisionEntity {
}
public override function sphereIntersection(collisionEntity:SphereCollisionEntity, timeState:TimeState) {
+ if (ignore)
+ return [];
var contacts = [];
var thispos = transform.getPosition();
var position = collisionEntity.transform.getPosition();
diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx
index ad4f67a6..a217461b 100644
--- a/src/gui/PlayGui.hx
+++ b/src/gui/PlayGui.hx
@@ -683,7 +683,16 @@ class PlayGui {
default:
col3;
};
- pl.push('${i + 1}. ${Util.rightPad(item.name, 25, 3)}');
+ var isSpectating = false;
+ if (item.us) {
+ if (Net.isHost)
+ isSpectating = Net.hostSpectate;
+ if (Net.isClient)
+ isSpectating = Net.clientSpectate;
+ } else {
+ isSpectating = Net.clientIdMap[item.id].spectator;
+ }
+ pl.push('${i + 1}. ${isSpectating ? "[S] " : ""}${Util.rightPad(item.name, 25, 3)}');
var connPing = item.us ? (Net.isHost ? 0 : Net.clientConnection.pingTicks) : (item.id == 0 ? 0 : Net.clientIdMap[item.id].pingTicks);
var pingStatus = "unknown";
if (connPing <= 5)