get marble skins networked

This commit is contained in:
RandomityGuy 2024-04-25 23:42:20 +05:30
parent 02b89b5247
commit 060209fb42
7 changed files with 281 additions and 234 deletions

View file

@ -1,5 +1,6 @@
package src;
import gui.MarblePickerGui;
import collision.CollisionPool;
import net.NetPacket.MarbleNetFlags;
import net.BitStream.OutputBitStream;
@ -375,9 +376,19 @@ class Marble extends GameObject {
this.netCorrected = false;
var marbleDts = new DtsObject();
var marbleShader = "";
if (connection == null) { // Our marble
Console.log("Marble: " + Settings.optionsSettings.marbleModel + " (" + Settings.optionsSettings.marbleSkin + ")");
marbleDts.dtsPath = Settings.optionsSettings.marbleModel;
marbleDts.matNameOverride.set("base.marble", Settings.optionsSettings.marbleSkin + ".marble");
marbleShader = Settings.optionsSettings.marbleShader;
} else {
var marbleData = MarblePickerGui.marbleData[connection.getMarbleId()];
Console.log("Marble: " + marbleData.dts + " (" + marbleData.skin + ")");
marbleDts.dtsPath = marbleData.dts;
marbleDts.matNameOverride.set("base.marble", marbleData.skin + ".marble");
marbleShader = marbleData.shader;
}
marbleDts.showSequences = false;
marbleDts.useInstancing = false;
var dtsFile = ResourceLoader.loadDts(marbleDts.dtsPath).resource;
@ -394,10 +405,7 @@ class Marble extends GameObject {
var csky = level != null ? level.sky : (@:privateAccess MarbleGame.instance.previewWorld.sky);
this.cubemapRenderer = new CubemapRenderer(MarbleGame.instance.scene, csky, !this.controllable && level != null);
if (Settings.optionsSettings.marbleShader == null
|| Settings.optionsSettings.marbleShader == "Default"
|| Settings.optionsSettings.marbleShader == ""
|| !isUltra) { // Use this shit everywhere except ultra
if (marbleShader == null || marbleShader == "Default" || marbleShader == "" || !isUltra) { // Use this shit everywhere except ultra
mat.mainPass.addShader(new MarbleReflection(this.cubemapRenderer.cubemap));
} else {
// Generate tangents for next shaders, only for Ultra
@ -410,31 +418,31 @@ class Marble extends GameObject {
mat.mainPass.removeShader(mat.textureShader);
if (Settings.optionsSettings.marbleShader == "ClassicGlassPureSphere") {
if (marbleShader == "ClassicGlassPureSphere") {
var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/marble01.normal.png").resource;
var classicGlassShader = new ClassicGlassPureSphere(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 12,
new Vector(0.6, 0.6, 0.6, 0.6), 1);
mat.mainPass.addShader(classicGlassShader);
}
if (Settings.optionsSettings.marbleShader == "ClassicMarb") {
if (marbleShader == "ClassicMarb") {
var classicMarb = new ClassicMarb(mat.texture, this.cubemapRenderer.cubemap, 12, new Vector(0.6, 0.6, 0.6, 0.6), 1);
mat.mainPass.addShader(classicMarb);
}
if (Settings.optionsSettings.marbleShader == "ClassicMarb2") {
if (marbleShader == "ClassicMarb2") {
var classicMarb2 = new ClassicMarb2(mat.texture, this.cubemapRenderer.cubemap, 12, new Vector(0.6, 0.6, 0.6, 0.6), 1);
mat.mainPass.addShader(classicMarb2);
}
if (Settings.optionsSettings.marbleShader == "ClassicMarb3") {
if (marbleShader == "ClassicMarb3") {
var marbSpecColor = new Vector(0.6, 0.6, 0.6, 0.6);
var marbSpec = 12.0;
if (Settings.optionsSettings.marbleModel == "data/shapes/balls/marble16.dts") {
if (marbleDts.dtsPath == "data/shapes/balls/marble16.dts") {
marbSpec = 6;
marbSpecColor.set(0.2, 0.2, 0.2, 0.2);
}
if (Settings.optionsSettings.marbleModel == "data/shapes/balls/marble31.dts") {
if (marbleDts.dtsPath == "data/shapes/balls/marble31.dts") {
marbSpec = 24;
marbSpecColor.set(0.3, 0.3, 0.3, 0.3);
}
@ -442,7 +450,7 @@ class Marble extends GameObject {
mat.mainPass.addShader(classicMarb3);
}
if (Settings.optionsSettings.marbleShader == "ClassicMetal") {
if (marbleShader == "ClassicMetal") {
var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/marble18.normal.png").resource;
marbleNormal.wrap = Repeat;
var classicMetalShader = new ClassicMetal(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 12,
@ -450,7 +458,7 @@ class Marble extends GameObject {
mat.mainPass.addShader(classicMetalShader);
}
if (Settings.optionsSettings.marbleShader == "ClassicMarbGlass20") {
if (marbleShader == "ClassicMarbGlass20") {
var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/marble20.normal.png").resource;
marbleNormal.wrap = Repeat;
var classicGlassShader = new ClassicGlass(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 12,
@ -458,14 +466,14 @@ class Marble extends GameObject {
mat.mainPass.addShader(classicGlassShader);
}
if (Settings.optionsSettings.marbleShader == "ClassicMarbGlass18") {
if (marbleShader == "ClassicMarbGlass18") {
var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/marble18.normal.png").resource;
marbleNormal.wrap = Repeat;
var classicGlassShader = new ClassicGlass(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 12,
new Vector(0.6, 0.6, 0.6, 0.6), 1);
mat.mainPass.addShader(classicGlassShader);
}
if (Settings.optionsSettings.marbleShader == "CrystalMarb") {
if (marbleShader == "CrystalMarb") {
var marbleNormal = ResourceLoader.getTexture("data/shapes/balls/marble02.normal.png").resource;
marbleNormal.wrap = Repeat;
var classicGlassShader = new CrystalMarb(mat.texture, marbleNormal, this.cubemapRenderer.cubemap, 1);

View file

@ -1,5 +1,6 @@
package src;
import gui.MarblePickerGui;
import gui.MultiplayerLevelSelectGui;
import collision.CollisionPool;
import net.GemPredictionStore;
@ -481,7 +482,12 @@ class MarbleWorld extends Scheduler {
marblefiles.push("sound/use_blast.wav");
}
// Hacky
if (client == null)
marblefiles.push(StringTools.replace(Settings.optionsSettings.marbleModel, "data/", ""));
else {
var marbleDts = MarblePickerGui.marbleData[client.getMarbleId()].dts;
marblefiles.push(StringTools.replace(marbleDts, "data/", ""));
}
// if (Settings.optionsSettings.marbleCategoryIndex == 0)
// marblefiles.push("shapes/balls/" + Settings.optionsSettings.marbleSkin + ".marble.png");
// else
@ -1458,6 +1464,8 @@ class MarbleWorld extends Scheduler {
// }
this.tickSchedule(timeState.currentAttemptTime);
if (this._disposed)
return;
if (this.isWatching && this.replay.currentPlaybackFrame.marbleStateFlags.has(UsedBlast))
this.marble.useBlast(timeState);
@ -1965,6 +1973,23 @@ class MarbleWorld extends Scheduler {
}
}
function mpFinish() {
playGui.setGuiVisibility(false);
Console.log("State End");
#if js
var pointercontainer = js.Browser.document.querySelector("#pointercontainer");
pointercontainer.hidden = false;
#end
if (Util.isTouchDevice()) {
MarbleGame.instance.touchInput.setControlsEnabled(false);
}
this.setCursorLock(false);
if (Net.isHost) {
MarbleGame.instance.quitMission();
}
return 0;
}
function showFinishScreen() {
if (this.isWatching)
return 0;

View file

@ -11,8 +11,7 @@ import src.Settings;
class MarblePickerGui extends GuiImage {
var innerCtrl:GuiControl;
public function new() {
var marbleData = [
static var marbleData = [
{
name: "1",
dts: "data/shapes/balls/marble01.dts",
@ -225,6 +224,7 @@ class MarblePickerGui extends GuiImage {
}
];
public function new() {
var res = ResourceLoader.getImage("data/ui/game/CloudBG.jpg").resource.toTile();
super(res);

View file

@ -635,7 +635,7 @@ class HuntMode extends NullMode {
NetCommands.timerRanOut();
}
if (!level.isWatching) {
@:privateAccess level.schedule(level.timeState.currentAttemptTime, () -> cast level.showFinishScreen());
@:privateAccess level.schedule(level.timeState.currentAttemptTime + 5, () -> cast level.mpFinish());
}
} else {
var myScore = {

View file

@ -59,6 +59,7 @@ abstract class GameConnection {
var name:String;
var lobbyReady:Bool;
var platform:NetPlatform;
var marbleId:Int;
function new(id:Int) {
this.id = id;
@ -107,4 +108,12 @@ abstract class GameConnection {
public inline function setName(value:String) {
name = value;
}
public inline function setMarbleId(value:Int) {
marbleId = value;
}
public inline function getMarbleId() {
return marbleId;
}
}

View file

@ -303,6 +303,7 @@ class Net {
b.writeByte(c);
b.writeByte(v.lobbyReady ? 1 : 0);
b.writeByte(v.platform);
b.writeByte(v.marbleId);
var name = v.getName();
b.writeByte(name.length);
for (i in 0...name.length) {
@ -313,6 +314,7 @@ class Net {
b.writeByte(0);
b.writeByte(Net.lobbyHostReady ? 1 : 0);
b.writeByte(getPlatform());
b.writeByte(Settings.optionsSettings.marbleIndex);
var name = Settings.highscoreName;
b.writeByte(name.length);
for (i in 0...name.length) {
@ -332,7 +334,7 @@ class Net {
case ClientIdAssign:
clientId = input.readByte(); // 8 bit client id, hopefully we don't exceed this
Console.log('Client ID set to ${clientId}');
NetCommands.setPlayerName(clientId, Settings.highscoreName); // Send our player name to the server
NetCommands.setPlayerData(clientId, Settings.highscoreName, Settings.optionsSettings.marbleIndex); // Send our player name to the server
NetCommands.transmitPlatform(clientId, getPlatform()); // send our platform too
case Ping:
@ -417,6 +419,7 @@ class Net {
var id = input.readByte();
var cready = input.readByte() == 1;
var platform = input.readByte();
var marble = input.readByte();
if (id != 0 && id != Net.clientId && !clientIdMap.exists(id)) {
Console.log('Adding ghost connection ${id}');
addGhost(id);
@ -429,6 +432,7 @@ class Net {
}
if (clientIdMap.exists(id)) {
clientIdMap[id].setName(name);
clientIdMap[id].setMarbleId(marble);
clientIdMap[id].lobbyReady = cready;
clientIdMap[id].platform = platform;
}

View file

@ -124,9 +124,10 @@ class NetCommands {
}
}
@:rpc(client) public static function setPlayerName(clientId:Int, name:String) {
@:rpc(client) public static function setPlayerData(clientId:Int, name:String, marble:Int) {
if (Net.isHost) {
Net.clientIdMap[clientId].setName(name);
Net.clientIdMap[clientId].setMarbleId(marble);
if (MarbleGame.canvas.content is MultiplayerLevelSelectGui) {
cast(MarbleGame.canvas.content, MultiplayerLevelSelectGui).updateLobbyNames();
}