get more powerups networked

This commit is contained in:
RandomityGuy 2024-06-17 00:58:57 +05:30
parent a34abc2fe1
commit 55b08c4e6a
8 changed files with 232 additions and 78 deletions

View file

@ -210,6 +210,8 @@ class Marble extends GameObject {
public var _radius = 0.2; public var _radius = 0.2;
var _dtsRadius = 0.2;
var _prevRadius:Float; var _prevRadius:Float;
var _maxRollVelocity:Float = 15; var _maxRollVelocity:Float = 15;
@ -476,6 +478,7 @@ class Marble extends GameObject {
// Calculate radius according to marble model (egh) // Calculate radius according to marble model (egh)
var b = marbleDts.getBounds(); var b = marbleDts.getBounds();
var avgRadius = (b.xSize + b.ySize + b.zSize) / 6; var avgRadius = (b.xSize + b.ySize + b.zSize) / 6;
_dtsRadius = avgRadius;
if (isUltra) { if (isUltra) {
this._radius = 0.3; this._radius = 0.3;
marbleDts.scale(0.3 / avgRadius); marbleDts.scale(0.3 / avgRadius);
@ -709,7 +712,7 @@ class Marble extends GameObject {
return return true; return return true;
} }
function velocityCancel(currentTime:Float, dt:Float, surfaceSlide:Bool, noBounce:Bool, stoppedPaths:Bool, pi:Array<PathedInterior>) { function velocityCancel(timeState:TimeState, surfaceSlide:Bool, noBounce:Bool, stoppedPaths:Bool, pi:Array<PathedInterior>) {
var SurfaceDotThreshold = 0.0001; var SurfaceDotThreshold = 0.0001;
var looped = false; var looped = false;
var itersIn = 0; var itersIn = 0;
@ -727,7 +730,7 @@ class Marble extends GameObject {
if (!_bounceYet) { if (!_bounceYet) {
_bounceYet = true; _bounceYet = true;
playBoundSound(currentTime, -surfaceDot); playBoundSound(timeState.currentAttemptTime, -surfaceDot);
} }
if (noBounce) { if (noBounce) {
@ -765,10 +768,10 @@ class Marble extends GameObject {
this.velocity.load(this.velocity.sub(surfaceVel)); this.velocity.load(this.velocity.sub(surfaceVel));
} else { } else {
var restitution = this._bounceRestitution; var restitution = this._bounceRestitution;
if (currentTime - this.superBounceEnableTime < 5) { if (isSuperBounceEnabled(timeState)) {
restitution = 0.9; restitution = 0.9;
} }
if (currentTime - this.shockAbsorberEnableTime < 5) { if (isShockAbsorberEnabled(timeState)) {
restitution = 0.01; restitution = 0.01;
} }
restitution *= contacts[i].restitution; restitution *= contacts[i].restitution;
@ -1522,7 +1525,7 @@ class Marble extends GameObject {
m.d = new Vector(); m.d = new Vector();
} }
if (this.blastTicks < (30000 >> 5)) if (Net.isMP && this.blastTicks < (25000 >> 5))
this.blastTicks += 1; this.blastTicks += 1;
if (Net.isClient) if (Net.isClient)
@ -1581,7 +1584,7 @@ class Marble extends GameObject {
var desiredOmega = new Vector(); var desiredOmega = new Vector();
var isCentered = this.computeMoveForces(m, aControl, desiredOmega); var isCentered = this.computeMoveForces(m, aControl, desiredOmega);
stoppedPaths = this.velocityCancel(timeState.currentAttemptTime, timeStep, isCentered, false, stoppedPaths, pathedInteriors); stoppedPaths = this.velocityCancel(timeState, isCentered, false, stoppedPaths, pathedInteriors);
var A = this.getExternalForces(tempState, m); var A = this.getExternalForces(tempState, m);
var a = this.applyContactForces(timeStep, m, isCentered, aControl, desiredOmega, A); var a = this.applyContactForces(timeStep, m, isCentered, aControl, desiredOmega, A);
@ -1601,7 +1604,7 @@ class Marble extends GameObject {
this.velocity.y = 0; this.velocity.y = 0;
this.velocity.x = 0; this.velocity.x = 0;
} }
stoppedPaths = this.velocityCancel(timeState.currentAttemptTime, timeStep, isCentered, true, stoppedPaths, pathedInteriors); stoppedPaths = this.velocityCancel(timeState, isCentered, true, stoppedPaths, pathedInteriors);
this._totalTime += timeStep; this._totalTime += timeStep;
if (contacts.length != 0) { if (contacts.length != 0) {
this._contactTime += timeStep; this._contactTime += timeStep;
@ -1730,26 +1733,20 @@ class Marble extends GameObject {
if (this.megaMarbleUseTick > 0) { if (this.megaMarbleUseTick > 0) {
if (Net.isHost) { if (Net.isHost) {
if ((timeState.ticks - this.megaMarbleUseTick) <= 312 && this.megaMarbleUseTick > 0) { if ((timeState.ticks - this.megaMarbleUseTick) <= 312 && this.megaMarbleUseTick > 0) {
this._radius = 0.675; this._radius = 0.6666;
this.collider.radius = 0.675; this.collider.radius = 0.6666;
} else if ((timeState.ticks - this.megaMarbleUseTick) > 312) { } else if ((timeState.ticks - this.megaMarbleUseTick) > 312) {
this.collider.radius = this._radius = 0.2; this.collider.radius = this._radius = 0.2;
if (!this.isNetUpdate && this.controllable)
AudioManager.playSound(ResourceLoader.getResource("data/sound/MegaShrink.wav", ResourceLoader.getAudio, this.soundResources), null,
false);
this.megaMarbleUseTick = 0; this.megaMarbleUseTick = 0;
this.netFlags |= MarbleNetFlags.DoMega; this.netFlags |= MarbleNetFlags.DoMega;
} }
} }
if (Net.isClient) { if (Net.isClient) {
if (this.serverTicks - this.megaMarbleUseTick <= 312 && this.megaMarbleUseTick > 0) { if (this.serverTicks - this.megaMarbleUseTick <= 312 && this.megaMarbleUseTick > 0) {
this._radius = 0.675; this._radius = 0.6666;
this.collider.radius = 0.675; this.collider.radius = 0.6666;
} else { } else {
this.collider.radius = this._radius = 0.2; this.collider.radius = this._radius = 0.2;
if (!this.isNetUpdate && this.controllable)
AudioManager.playSound(ResourceLoader.getResource("data/sound/MegaShrink.wav", ResourceLoader.getAudio, this.soundResources), null,
false);
this.megaMarbleUseTick = 0; this.megaMarbleUseTick = 0;
} }
} }
@ -1786,6 +1783,8 @@ class Marble extends GameObject {
marbleUpdate.blastTick = this.blastUseTick; marbleUpdate.blastTick = this.blastUseTick;
marbleUpdate.heliTick = this.helicopterUseTick; marbleUpdate.heliTick = this.helicopterUseTick;
marbleUpdate.megaTick = this.megaMarbleUseTick; marbleUpdate.megaTick = this.megaMarbleUseTick;
marbleUpdate.superBounceTick = this.superBounceUseTick;
marbleUpdate.shockAbsorberTick = this.shockAbsorberUseTick;
marbleUpdate.oob = this.outOfBounds; marbleUpdate.oob = this.outOfBounds;
marbleUpdate.powerUpId = this.heldPowerup != null ? this.heldPowerup.netIndex : 0x1FF; marbleUpdate.powerUpId = this.heldPowerup != null ? this.heldPowerup.netIndex : 0x1FF;
marbleUpdate.netFlags = this.netFlags; marbleUpdate.netFlags = this.netFlags;
@ -1814,6 +1813,8 @@ class Marble extends GameObject {
this.blastUseTick = p.blastTick; this.blastUseTick = p.blastTick;
this.helicopterUseTick = p.heliTick; this.helicopterUseTick = p.heliTick;
this.megaMarbleUseTick = p.megaTick; this.megaMarbleUseTick = p.megaTick;
this.superBounceUseTick = p.superBounceTick;
this.shockAbsorberUseTick = p.shockAbsorberTick;
this.serverUsePowerup = p.netFlags & MarbleNetFlags.UsePowerup > 0; this.serverUsePowerup = p.netFlags & MarbleNetFlags.UsePowerup > 0;
// this.currentUp = p.gravityDirection; // this.currentUp = p.gravityDirection;
this.level.setUp(cast this, p.gravityDirection, this.level.timeState); this.level.setUp(cast this, p.gravityDirection, this.level.timeState);
@ -1971,6 +1972,14 @@ class Marble extends GameObject {
updatePowerupStates(timeState); updatePowerupStates(timeState);
var marbledts = cast(this.getChildAt(0), DtsObject);
if (isMegaMarbleEnabled(timeState)) {
marbledts.setScale(0.6666 / _dtsRadius);
} else {
marbledts.setScale(0.2 / _dtsRadius);
}
// if (isMegaMarbleEnabled(timeState)) { // if (isMegaMarbleEnabled(timeState)) {
// this._marbleScale = this._defaultScale * 2.25; // this._marbleScale = this._defaultScale * 2.25;
// } else { // } else {
@ -2146,33 +2155,39 @@ class Marble extends GameObject {
} }
public function updatePowerupStates(timeState:TimeState) { public function updatePowerupStates(timeState:TimeState) {
if (timeState.currentAttemptTime - this.shockAbsorberEnableTime < 5) { var shockEnabled = isShockAbsorberEnabled(timeState);
this.shockabsorberSound.pause = false; var bounceEnabled = isSuperBounceEnabled(timeState);
} else { var helicopterEnabled = isHelicopterEnabled(timeState);
this.shockabsorberSound.pause = true; var selfMarble = level.marble == cast this;
} if (selfMarble) {
if (timeState.currentAttemptTime - this.superBounceEnableTime < 5) { if (shockEnabled) {
this.superbounceSound.pause = false; this.shockabsorberSound.pause = false;
} else { } else {
this.superbounceSound.pause = true; this.shockabsorberSound.pause = true;
}
if (bounceEnabled) {
this.superbounceSound.pause = false;
} else {
this.superbounceSound.pause = true;
}
} }
if (timeState.currentAttemptTime - this.shockAbsorberEnableTime < 5) { if (shockEnabled || bounceEnabled) {
this.forcefield.setPosition(0, 0, 0);
} else if (timeState.currentAttemptTime - this.superBounceEnableTime < 5) {
this.forcefield.setPosition(0, 0, 0); this.forcefield.setPosition(0, 0, 0);
} else { } else {
this.forcefield.x = 1e8; this.forcefield.x = 1e8;
this.forcefield.y = 1e8; this.forcefield.y = 1e8;
this.forcefield.z = 1e8; this.forcefield.z = 1e8;
} }
if (timeState.currentAttemptTime - this.helicopterEnableTime < 5) { if (helicopterEnabled) {
this.helicopter.setPosition(x, y, z); this.helicopter.setPosition(x, y, z);
this.helicopter.setRotationQuat(this.level.getOrientationQuat(timeState.currentAttemptTime)); this.helicopter.setRotationQuat(this.level.getOrientationQuat(timeState.currentAttemptTime));
this.helicopterSound.pause = false; if (selfMarble)
this.helicopterSound.pause = false;
} else { } else {
this.helicopter.setPosition(1e8, 1e8, 1e8); this.helicopter.setPosition(1e8, 1e8, 1e8);
this.helicopterSound.pause = true; if (selfMarble)
this.helicopterSound.pause = true;
} }
} }
@ -2187,17 +2202,34 @@ class Marble extends GameObject {
} }
public function useBlast(timeState:TimeState) { public function useBlast(timeState:TimeState) {
if (this.blastAmount < 0.2 || this.level.game != "ultra") if (Net.isMP) {
return; if (this.blastTicks < 156)
var impulse = this.currentUp.multiply(Math.max(Math.sqrt(this.blastAmount), this.blastAmount) * 10); return;
this.applyImpulse(impulse); var blastAmt = this.blastTicks / (25000 >> 5);
AudioManager.playSound(ResourceLoader.getResource('data/sound/blast.wav', ResourceLoader.getAudio, this.soundResources)); var impulse = this.currentUp.multiply(Math.max(Math.sqrt(blastAmt), blastAmt) * 10);
this.level.particleManager.createEmitter(this.blastAmount > 1 ? blastMaxParticleOptions : blastParticleOptions, this.applyImpulse(impulse);
this.blastAmount > 1 ? blastMaxEmitterData : blastEmitterData, this.getAbsPos().getPosition(), () -> { if (!isNetUpdate && level.marble == cast this)
this.getAbsPos().getPosition().add(this.currentUp.multiply(-this._radius * 0.4)); AudioManager.playSound(ResourceLoader.getResource('data/sound/blast.wav', ResourceLoader.getAudio, this.soundResources));
}, if (!isNetUpdate)
new Vector(1, 1, 1).add(new Vector(Math.abs(this.currentUp.x), Math.abs(this.currentUp.y), Math.abs(this.currentUp.z)).multiply(-0.8))); this.level.particleManager.createEmitter(blastAmt > 1 ? blastMaxParticleOptions : blastParticleOptions,
this.blastAmount = 0; blastAmt > 1 ? blastMaxEmitterData : blastEmitterData, this.getAbsPos().getPosition(), () -> {
this.getAbsPos().getPosition().add(this.currentUp.multiply(-this._radius * 0.4));
},
new Vector(1, 1, 1).add(new Vector(Math.abs(this.currentUp.x), Math.abs(this.currentUp.y), Math.abs(this.currentUp.z)).multiply(-0.8)));
this.blastTicks = 0;
} else {
if (this.blastAmount < 0.2 || this.level.game != "ultra")
return;
var impulse = this.currentUp.multiply(Math.max(Math.sqrt(this.blastAmount), this.blastAmount) * 10);
this.applyImpulse(impulse);
AudioManager.playSound(ResourceLoader.getResource('data/sound/blast.wav', ResourceLoader.getAudio, this.soundResources));
this.level.particleManager.createEmitter(this.blastAmount > 1 ? blastMaxParticleOptions : blastParticleOptions,
this.blastAmount > 1 ? blastMaxEmitterData : blastEmitterData, this.getAbsPos().getPosition(), () -> {
this.getAbsPos().getPosition().add(this.currentUp.multiply(-this._radius * 0.4));
},
new Vector(1, 1, 1).add(new Vector(Math.abs(this.currentUp.x), Math.abs(this.currentUp.y), Math.abs(this.currentUp.z)).multiply(-0.8)));
this.blastAmount = 0;
}
} }
public function getForce(position:Vector, tick:Int) { public function getForce(position:Vector, tick:Int) {
@ -2232,26 +2264,95 @@ class Marble extends GameObject {
} }
public function enableSuperBounce(timeState:TimeState) { public function enableSuperBounce(timeState:TimeState) {
this.superBounceEnableTime = timeState.currentAttemptTime; if (this.level.isMultiplayer) {
this.superBounceUseTick = Net.isHost ? timeState.ticks : serverTicks;
if (!this.isNetUpdate)
this.netFlags |= MarbleNetFlags.DoSuperBounce;
} else
this.superBounceEnableTime = timeState.currentAttemptTime;
}
inline function isSuperBounceEnabled(timeState:TimeState) {
if (this.level == null)
return false;
if (!this.level.isMultiplayer) {
return timeState.currentAttemptTime - this.superBounceEnableTime < 5;
} else {
if (Net.isHost) {
return (superBounceUseTick > 0 && (this.level.timeState.ticks - superBounceUseTick) <= 156);
} else {
return (superBounceUseTick > 0 && (serverTicks - superBounceUseTick) <= 156);
}
}
} }
public function enableShockAbsorber(timeState:TimeState) { public function enableShockAbsorber(timeState:TimeState) {
this.shockAbsorberEnableTime = timeState.currentAttemptTime; if (this.level.isMultiplayer) {
this.shockAbsorberUseTick = Net.isHost ? timeState.ticks : serverTicks;
if (!this.isNetUpdate)
this.netFlags |= MarbleNetFlags.DoShockAbsorber;
} else
this.shockAbsorberEnableTime = timeState.currentAttemptTime;
}
inline function isShockAbsorberEnabled(timeState:TimeState) {
if (this.level == null)
return false;
if (!this.level.isMultiplayer) {
return timeState.currentAttemptTime - this.shockAbsorberEnableTime < 5;
} else {
if (Net.isHost) {
return (shockAbsorberUseTick > 0 && (this.level.timeState.ticks - shockAbsorberUseTick) <= 156);
} else {
return (shockAbsorberUseTick > 0 && (serverTicks - shockAbsorberUseTick) <= 156);
}
}
} }
public function enableHelicopter(timeState:TimeState) { public function enableHelicopter(timeState:TimeState) {
this.helicopterEnableTime = timeState.currentAttemptTime; if (this.level.isMultiplayer) {
this.helicopterUseTick = Net.isHost ? timeState.ticks : serverTicks;
if (!this.isNetUpdate)
this.netFlags |= MarbleNetFlags.DoHelicopter;
} else
this.helicopterEnableTime = timeState.currentAttemptTime;
} }
inline function isHelicopterEnabled(timeState:TimeState) { inline function isHelicopterEnabled(timeState:TimeState) {
if (this.level == null) if (this.level == null)
return false; return false;
if (!this.level.isMultiplayer) {
return timeState.currentAttemptTime - this.helicopterEnableTime < 5;
} else {
if (Net.isHost) {
return (helicopterUseTick > 0 && (this.level.timeState.ticks - helicopterUseTick) <= 156);
} else {
return (helicopterUseTick > 0 && (serverTicks - helicopterUseTick) <= 156);
}
}
}
return timeState.currentAttemptTime - this.helicopterEnableTime < 5; inline function isMegaMarbleEnabled(timeState:TimeState) {
if (this.level == null)
return false;
if (!this.level.isMultiplayer) {
return timeState.currentAttemptTime - this.megaMarbleEnableTime < 10;
} else {
if (Net.isHost) {
return (megaMarbleUseTick > 0 && (this.level.timeState.ticks - megaMarbleUseTick) <= 312);
} else {
return (megaMarbleUseTick > 0 && (serverTicks - megaMarbleUseTick) <= 312);
}
}
} }
public function enableMegaMarble(timeState:TimeState) { public function enableMegaMarble(timeState:TimeState) {
this.megaMarbleEnableTime = timeState.currentAttemptTime; if (this.level.isMultiplayer) {
this.megaMarbleUseTick = Net.isHost ? timeState.ticks : serverTicks;
if (!this.isNetUpdate)
this.netFlags |= MarbleNetFlags.DoMega;
} else
this.megaMarbleEnableTime = timeState.currentAttemptTime;
} }
function updateTeleporterState(time:TimeState) { function updateTeleporterState(time:TimeState) {
@ -2317,7 +2418,7 @@ class Marble extends GameObject {
this.blastTicks = 0; this.blastTicks = 0;
this.helicopterUseTick = 0; this.helicopterUseTick = 0;
this.megaMarbleUseTick = 0; this.megaMarbleUseTick = 0;
this.netFlags = MarbleNetFlags.DoBlast | MarbleNetFlags.DoMega | MarbleNetFlags.DoHelicopter | MarbleNetFlags.PickupPowerup | MarbleNetFlags.GravityChange | MarbleNetFlags.UsePowerup; this.netFlags = MarbleNetFlags.DoBlast | MarbleNetFlags.DoMega | MarbleNetFlags.DoHelicopter | MarbleNetFlags.DoShockAbsorber | MarbleNetFlags.DoSuperBounce | MarbleNetFlags.PickupPowerup | MarbleNetFlags.GravityChange | MarbleNetFlags.UsePowerup;
this.lastContactNormal = new Vector(0, 0, 1); this.lastContactNormal = new Vector(0, 0, 1);
this.contactEntities = []; this.contactEntities = [];
this.cloak = false; this.cloak = false;

View file

@ -767,8 +767,10 @@ class MarbleWorld extends Scheduler {
if (isMultiplayer) { if (isMultiplayer) {
marble.megaMarbleUseTick = 0; marble.megaMarbleUseTick = 0;
marble.helicopterUseTick = 0; marble.helicopterUseTick = 0;
// marble.collider.radius = marble._radius = 0.3; marble.shockAbsorberUseTick = 0;
@:privateAccess marble.netFlags |= MarbleNetFlags.DoHelicopter | MarbleNetFlags.DoMega | MarbleNetFlags.GravityChange; marble.superBounceUseTick = 0;
marble.collider.radius = marble._radius = 0.2;
@:privateAccess marble.netFlags |= MarbleNetFlags.DoHelicopter | MarbleNetFlags.DoMega | MarbleNetFlags.DoShockAbsorber | MarbleNetFlags.DoSuperBounce | MarbleNetFlags.GravityChange;
} else { } else {
@:privateAccess marble.helicopterEnableTime = -1e8; @:privateAccess marble.helicopterEnableTime = -1e8;
@:privateAccess marble.megaMarbleEnableTime = -1e8; @:privateAccess marble.megaMarbleEnableTime = -1e8;
@ -1861,7 +1863,7 @@ class MarbleWorld extends Scheduler {
if (timeToDisplay >= this.mission.qualifyTime) if (timeToDisplay >= this.mission.qualifyTime)
return 2; return 2;
if (this.timeState.currentAttemptTime >= 3.5) { if (this.timeState.currentAttemptTime >= 3.5 && !Net.isMP) {
// Create the flashing effect // Create the flashing effect
var alarmStart = this.mission.computeAlarmStartTime(); var alarmStart = this.mission.computeAlarmStartTime();
var elapsed = timeToDisplay - alarmStart; var elapsed = timeToDisplay - alarmStart;
@ -1949,28 +1951,30 @@ class MarbleWorld extends Scheduler {
this.timeState.timeSinceLoad += dt; this.timeState.timeSinceLoad += dt;
// Handle alarm warnings (that the user is about to exceed the par time) // Handle alarm warnings (that the user is about to exceed the par time)
if (this.timeState.currentAttemptTime >= 3.5) { if (!Net.isMP) {
var alarmStart = this.mission.computeAlarmStartTime(); if (this.timeState.currentAttemptTime >= 3.5) {
var alarmStart = this.mission.computeAlarmStartTime();
if (prevGameplayClock < alarmStart && this.timeState.gameplayClock >= alarmStart) { if (prevGameplayClock < alarmStart && this.timeState.gameplayClock >= alarmStart) {
// Start the alarm // Start the alarm
this.alarmSound = AudioManager.playSound(ResourceLoader.getResource("data/sound/alarm.wav", ResourceLoader.getAudio, this.soundResources), this.alarmSound = AudioManager.playSound(ResourceLoader.getResource("data/sound/alarm.wav", ResourceLoader.getAudio, this.soundResources),
null, true); // AudioManager.createAudioSource('alarm.wav'); null, true); // AudioManager.createAudioSource('alarm.wav');
this.displayHelp('You have ${(this.mission.qualifyTime - alarmStart)} seconds remaining.'); this.displayHelp('You have ${(this.mission.qualifyTime - alarmStart)} seconds remaining.');
} }
if (prevGameplayClock < this.mission.qualifyTime && this.timeState.gameplayClock >= this.mission.qualifyTime) { if (prevGameplayClock < this.mission.qualifyTime && this.timeState.gameplayClock >= this.mission.qualifyTime) {
// Stop the alarm // Stop the alarm
if (this.alarmSound != null) { if (this.alarmSound != null) {
this.alarmSound.stop(); this.alarmSound.stop();
this.alarmSound = null; this.alarmSound = null;
}
this.displayHelp("The clock has passed the Par Time.");
AudioManager.playSound(ResourceLoader.getResource("data/sound/alarm_timeout.wav", ResourceLoader.getAudio, this.soundResources));
} }
this.displayHelp("The clock has passed the Par Time.");
AudioManager.playSound(ResourceLoader.getResource("data/sound/alarm_timeout.wav", ResourceLoader.getAudio, this.soundResources));
} }
}
if (finishTime != null) if (finishTime != null)
this.timeState.gameplayClock = finishTime.gameplayClock; this.timeState.gameplayClock = finishTime.gameplayClock;
}
playGui.formatTimer(this.timeState.gameplayClock, determineClockColor(this.timeState.gameplayClock)); playGui.formatTimer(this.timeState.gameplayClock, determineClockColor(this.timeState.gameplayClock));
if (!this.isWatching && this.isRecording) if (!this.isWatching && this.isRecording)
@ -1978,7 +1982,11 @@ class MarbleWorld extends Scheduler {
} }
public function updateBlast(marble:Marble, timestate:TimeState) { public function updateBlast(marble:Marble, timestate:TimeState) {
if (this.game == "ultra") { if (Net.isMP) {
if (this.marble == marble) {
this.playGui.setBlastValue(marble.blastTicks / (25000 >> 5));
}
} else if (this.game == "ultra") {
if (marble.blastAmount < 1) { if (marble.blastAmount < 1) {
marble.blastAmount = Util.clamp(marble.blastAmount + (timeState.dt / 25), 0, 1); marble.blastAmount = Util.clamp(marble.blastAmount + (timeState.dt / 25), 0, 1);
} }

View file

@ -87,6 +87,7 @@ class MissionList {
multiplayerMissions.set("beginner", parseDifficulty("multiplayer", "multiplayer/hunt", "beginner")); multiplayerMissions.set("beginner", parseDifficulty("multiplayer", "multiplayer/hunt", "beginner"));
multiplayerMissions.set("intermediate", parseDifficulty("multiplayer", "multiplayer/hunt", "intermediate")); multiplayerMissions.set("intermediate", parseDifficulty("multiplayer", "multiplayer/hunt", "intermediate"));
multiplayerMissions.set("advanced", parseDifficulty("multiplayer", "multiplayer/hunt", "advanced")); multiplayerMissions.set("advanced", parseDifficulty("multiplayer", "multiplayer/hunt", "advanced"));
multiplayerMissions.set("custom", parseDifficulty("multiplayer", "multiplayer/hunt", "custom"));
customMissions = parseDifficulty("custom", "missions", "custom"); customMissions = parseDifficulty("custom", "missions", "custom");

View file

@ -1,5 +1,6 @@
package gui; package gui;
import net.Net;
import src.ProfilerUI; import src.ProfilerUI;
import hxd.App; import hxd.App;
import hxd.res.Image; import hxd.res.Image;
@ -152,7 +153,7 @@ class PlayGui {
initGemCounter(); initGemCounter();
initCenterText(); initCenterText();
initPowerupBox(); initPowerupBox();
if (game == 'ultra') if (game == 'ultra' || Net.isMP)
initBlastBar(); initBlastBar();
initTexts(); initTexts();
if (Settings.optionsSettings.frameRateVis) if (Settings.optionsSettings.frameRateVis)

View file

@ -157,6 +157,9 @@ class HuntMode extends NullMode {
this.gemSpawnPoints.push(spawn); this.gemSpawnPoints.push(spawn);
this.gemOctree.insert(spawn); this.gemOctree.insert(spawn);
gem.setHide(true); gem.setHide(true);
if (level.isMultiplayer) {
@:privateAccess level.gemPredictions.alloc();
}
} }
} }
} }

View file

@ -29,9 +29,6 @@ class MarblePrediction {
var subs = position.sub(p.position).lengthSq(); // + velocity.sub(p.velocity).lengthSq() + omega.sub(p.omega).lengthSq(); var subs = position.sub(p.position).lengthSq(); // + velocity.sub(p.velocity).lengthSq() + omega.sub(p.omega).lengthSq();
if (p.netFlags != 0) if (p.netFlags != 0)
subs += 1; subs += 1;
if (subs > 0.01) {
trace('Desync: ${position.x} ${position.y} ${position.z} != ${p.position.x} ${p.position.y} ${p.position.z}');
}
// if (p.powerUpId != powerupItemId) // if (p.powerUpId != powerupItemId)
// if (tick % 10 == 0) // if (tick % 10 == 0)
// subs += 1; // temp // subs += 1; // temp

View file

@ -11,6 +11,8 @@ class OtherMarbleUpdate {
var lastBlastTick:Int; var lastBlastTick:Int;
var lastHeliTick:Int; var lastHeliTick:Int;
var lastMegaTick:Int; var lastMegaTick:Int;
var lastSuperBounceTick:Int;
var lastShockAbsorberTick:Int;
var lastPowerUpId:Int; var lastPowerUpId:Int;
var lastGravityUp:Vector; var lastGravityUp:Vector;
@ -46,6 +48,14 @@ class MarbleUpdateQueue {
update.megaTick = otherUpdate.lastMegaTick; update.megaTick = otherUpdate.lastMegaTick;
else else
otherUpdate.lastMegaTick = update.megaTick; otherUpdate.lastMegaTick = update.megaTick;
if (update.netFlags & MarbleNetFlags.DoSuperBounce == 0)
update.superBounceTick = otherUpdate.lastSuperBounceTick;
else
otherUpdate.lastSuperBounceTick = update.superBounceTick;
if (update.netFlags & MarbleNetFlags.DoShockAbsorber == 0)
update.shockAbsorberTick = otherUpdate.lastShockAbsorberTick;
else
otherUpdate.lastShockAbsorberTick = update.shockAbsorberTick;
if (update.netFlags & MarbleNetFlags.PickupPowerup == 0) if (update.netFlags & MarbleNetFlags.PickupPowerup == 0)
update.powerUpId = otherUpdate.lastPowerUpId; update.powerUpId = otherUpdate.lastPowerUpId;
else else
@ -65,6 +75,10 @@ class MarbleUpdateQueue {
otherUpdate.lastHeliTick = update.heliTick; otherUpdate.lastHeliTick = update.heliTick;
if (update.netFlags & MarbleNetFlags.DoMega != 0) if (update.netFlags & MarbleNetFlags.DoMega != 0)
otherUpdate.lastMegaTick = update.megaTick; otherUpdate.lastMegaTick = update.megaTick;
if (update.netFlags & MarbleNetFlags.DoSuperBounce != 0)
otherUpdate.lastSuperBounceTick = update.superBounceTick;
if (update.netFlags & MarbleNetFlags.DoShockAbsorber != 0)
otherUpdate.lastShockAbsorberTick = update.shockAbsorberTick;
if (update.netFlags & MarbleNetFlags.PickupPowerup != 0) if (update.netFlags & MarbleNetFlags.PickupPowerup != 0)
otherUpdate.lastPowerUpId = update.powerUpId; otherUpdate.lastPowerUpId = update.powerUpId;
if (update.netFlags & MarbleNetFlags.GravityChange != 0) if (update.netFlags & MarbleNetFlags.GravityChange != 0)
@ -81,6 +95,10 @@ class MarbleUpdateQueue {
update.heliTick = myMarbleUpdate.heliTick; update.heliTick = myMarbleUpdate.heliTick;
if (update.netFlags & MarbleNetFlags.DoMega == 0) if (update.netFlags & MarbleNetFlags.DoMega == 0)
update.megaTick = myMarbleUpdate.megaTick; update.megaTick = myMarbleUpdate.megaTick;
if (update.netFlags & MarbleNetFlags.DoSuperBounce == 0)
update.superBounceTick = myMarbleUpdate.superBounceTick;
if (update.netFlags & MarbleNetFlags.DoShockAbsorber == 0)
update.shockAbsorberTick = myMarbleUpdate.shockAbsorberTick;
if (update.netFlags & MarbleNetFlags.PickupPowerup == 0) if (update.netFlags & MarbleNetFlags.PickupPowerup == 0)
update.powerUpId = myMarbleUpdate.powerUpId; update.powerUpId = myMarbleUpdate.powerUpId;
if (update.netFlags & MarbleNetFlags.GravityChange == 0) if (update.netFlags & MarbleNetFlags.GravityChange == 0)

View file

@ -44,9 +44,11 @@ enum abstract MarbleNetFlags(Int) from Int to Int {
var DoBlast = 1 << 0; var DoBlast = 1 << 0;
var DoHelicopter = 1 << 1; var DoHelicopter = 1 << 1;
var DoMega = 1 << 2; var DoMega = 1 << 2;
var PickupPowerup = 1 << 3; var DoSuperBounce = 1 << 3;
var GravityChange = 1 << 4; var DoShockAbsorber = 1 << 4;
var UsePowerup = 1 << 5; var PickupPowerup = 1 << 5;
var GravityChange = 1 << 6;
var UsePowerup = 1 << 7;
} }
@:publicFields @:publicFields
@ -62,6 +64,8 @@ class MarbleUpdatePacket implements NetPacket {
var blastTick:Int; var blastTick:Int;
var megaTick:Int; var megaTick:Int;
var heliTick:Int; var heliTick:Int;
var superBounceTick:Int;
var shockAbsorberTick:Int;
var gravityDirection:Vector; var gravityDirection:Vector;
var oob:Bool; var oob:Bool;
var powerUpId:Int; var powerUpId:Int;
@ -103,6 +107,19 @@ class MarbleUpdatePacket implements NetPacket {
} else { } else {
b.writeFlag(false); b.writeFlag(false);
} }
if (netFlags & MarbleNetFlags.DoSuperBounce > 0) {
b.writeFlag(true);
b.writeUInt16(superBounceTick);
} else {
b.writeFlag(false);
}
if (netFlags & MarbleNetFlags.DoShockAbsorber > 0) {
b.writeFlag(true);
b.writeUInt16(shockAbsorberTick);
} else {
b.writeFlag(false);
}
b.writeFlag(oob); b.writeFlag(oob);
if (netFlags & MarbleNetFlags.UsePowerup > 0) { if (netFlags & MarbleNetFlags.UsePowerup > 0) {
b.writeFlag(true); b.writeFlag(true);
@ -148,6 +165,14 @@ class MarbleUpdatePacket implements NetPacket {
megaTick = b.readUInt16(); megaTick = b.readUInt16();
this.netFlags |= MarbleNetFlags.DoMega; this.netFlags |= MarbleNetFlags.DoMega;
} }
if (b.readFlag()) {
superBounceTick = b.readUInt16();
this.netFlags |= MarbleNetFlags.DoSuperBounce;
}
if (b.readFlag()) {
shockAbsorberTick = b.readUInt16();
this.netFlags |= MarbleNetFlags.DoShockAbsorber;
}
oob = b.readFlag(); oob = b.readFlag();
if (b.readFlag()) if (b.readFlag())
this.netFlags |= MarbleNetFlags.UsePowerup; this.netFlags |= MarbleNetFlags.UsePowerup;