Code Monkey home page Code Monkey logo

quantum-space-buddies's Introduction

logo

GitHub GitHub release (latest by date) GitHub Release Date GitHub all releases GitHub release (latest by date) GitHub last commit (branch)

Donate with PayPal Donate with PayPal

Quantum Space Buddies (QSB) is a multiplayer mod for Outer Wilds. The mod uses the OWML mod loader and Mirror for networking.

Spoilers within!

Installation

Hosting / Connecting

Connecting to a server

  • Make sure to have Steam open and logged in.
  • On the title screen, click the option CONNECT TO MULTIPLAYER.
  • Enter the Steam ID of the person you are trying to connect to.
    • If "Use KCP Transport" is enabled, enter the public IP address of the person instead.
  • Enjoy!

Hosting a server

  • Make sure to have Steam open and logged in.
  • On the title screen, click the option OPEN TO MULTIPLAYER.
  • Share your Steam ID with the people who want to connect.
    • If "Use KCP Transport" is enabled, share your public IP address instead. This can be found on websites like https://www.whatismyip.com/.
  • Enjoy!

Frequently Asked Questions

I keep timing out when trying to connect!

Check the mod settings for "Use KCP Transport". You have to forward port 7777 as TCP/UDP, or use Hamachi. All players must either be using KCP, or not using KCP.

Why does SpaceWar show up in my Steam library?

This is for players who own the game on Epic or Xbox. Steam networking only works if you own the game on Steam, so we have to pretend to be SpaceWar (which every Steam user owns) so everyone can play.

Requirements

  • Latest version of OWML.
  • Latest version of Mod Manager. (If using)
  • Latest version of Outer Wilds. We cannot guarantee QSB, or OWML, will work on cracked/pirated versions of Outer Wilds. Do not come asking us for help when using pirated versions.
  • Fast and stable internet connection, upload and download.
  • Above minimum Outer Wilds system requirements.

How complete is this mod? How far through the game can I play?

You can play the entire game, plus DLC! There still might be one or two small mechanics that aren't synced - let us know if you find an obvious one that we've missed. Also, you might encounter bugs that mean you can't progress in multiplayer. Again, let us know if you find one!

Compatibility with other mods

QSB relies on object hierarchy to sync objects, so any mod that changes that risks breaking QSB. QSB also relies on certain game events being called when things happen in-game, so any mod that makes these things happen without calling the correct events will break QSB.

Most small mods will work fine. The more complex and far reaching the mod, the less likely it will work completely. Try as many mods as you like, but don't be surprised if things break.

NomaiVr

Here are the known issues. You are welcome to add to this list by creating issues.

Most things seem to work enough. There are some visual bugs, and I believe a few softlocks, but the experience shouldn't be too bad.

We haven't done too much work to make them compatible, so the things that are broken are unlikely to be fixed.

New Horizons

Here are the known issues. You are welcome to add to this list by creating issues.

We do our best to stay mostly compatible with base New Horizons, but the compatibility of each addon is mixed. Most of them at least partially work. Most custom mechanics will not work until the addon developer explicitly adds QSB support.

Why do I keep getting thrown around the ship?

Boring boring physics stuff. The velocity of the ship is synced, as well as the angular velocity. However, this velocity is not also applied to the player. (Or it is sometimes. I don't 100% know.) This means the ship will accelerate, leaving the player "behind". Which makes you fly into the walls alot.

To fix this, whilst in the ship you can attach yourself to it. Look at the top-left of your screen when inside the ship for the buttons to press.

What's the difference between QSB and Outer Wilds Online?

TL;DR - QSB is multiplayer co-op, Outer Wilds Online is multiplayer not co-op.

QSB is a fully synced game. The other players are actually there in the world, and can affect things. The loop starts/ends at the same time for everyone, and you share ship logs / signal discoveries.

Outer Wilds Online is easier to set up, but much more basic in its features. The other players cannot affect your game, and do not contribute to anything in your save. The loop is entirely per-player.

Translating

See TRANSLATING.md

Development Setup / Contributing

See DEVELOPMENT.md

Authors and Special Thanks

Authors

Contributers

  • xen - Help with syncing particle/sound effects, fixing lantern item bugs, and syncing addon data.
  • Moonstone - Improvements to elevators and lifts.
  • Chris Yeninas - Help with project files and GitHub workflows.
  • Locochoco - Code improvements.

Translators

Special Thanks

  • Thanks to Logan Ver Hoef for help with the game code, and for helping make the damn game in the first place.
  • Thanks to all the people who helped in public tests.

Dependencies

Help / Discuss development / Whatever

Join the Outer Wilds Modding Discord, we have a nice #qsb-bugs-and-questions channel for support, and other channels to discuss modding!

License and legal stuff

Copyright (C) 2020 - 2024 :

  • Henry Pointer (_nebula or misternebula)
  • Will Corby (JohnCorby)
  • Aleksander Waage (AmazingAlek)
  • Ricardo Lopes (Raicuparta)

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.

This work is unofficial Fan Content created under permission from the Mobius Digital Fan Content Policy. It includes materials which are the property of Mobius Digital and it is neither approved nor endorsed by Mobius Digital.

quantum-space-buddies's People

Contributors

0xd3n1z avatar amazingalek avatar dertolledude avatar isrecalpear avatar johncorby avatar loco-choco avatar merlinconnected avatar misternebula avatar moonstonestudios avatar phantomgamers avatar poleshe avatar raicuparta avatar sakuradayuki avatar tllya avatar xen-42 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

quantum-space-buddies's Issues

Remove dependency on WakeUp event

Ditching the wake up event should allow us to do everything mid-game. Like starting or joining a server. Would also make it easier to maintain the connection when travelling to the eye.

Sync player ships

Two ways we can go about this.

Easy way would be just showing a dummy ship model around the player if they're currently piloting a ship. Could be easily achieved by just having an isPilotingShip flag, that is broadcast with a bool message.

Harder way is to actually sync each ship's position separately from the players. Would need to replicate the behavior already implemented with the player models, including all the sector stuff. Be cool if we could refactor it so that the same behavior is used for syncing player positions, ship positions, and any other moving objects we might want to sync. But each synced object will mean an extra load on the server...

Prevent errors on death message broadcast

Couldn't figure out what was causing it. Has only happened when tying from the nova. If all else fails, better wrap the broadcast function in a try / catch, so that the usual death stuff can still happen.

Make fast forward speed proportional to time difference between client and server

Right now the speed is a constant 10x, which can still take a while to catch up. If it's constant and too fast, the player can easily overshoot the target time, and will have to pause afterwards. So making it dynamic is better: the bigger the difference, the faster it gets. As the gap becomes smaller, the fastforward speed becomes smaller.

Prevent nova from screwing up timesync

  • If server dies first, clients will pause because they're ahead
  • If client dies first, it will sleep to catch up to server. Then, when server dies, it will pause because it's ahead.

Skip to next loop if player is too far ahead

For instance, if player is 5 minutes ahead of server, pausing for 5 minutes would be annoying. In that case, might as well skip to the next loop. Important: don't increment the loop count for this kind of loop skip!

Proper Death Functionality

Please make it so if a character dies, it resets the loop for all! Teleporting back to Timber Hearth after flying into the sun is a tad underwhelming. Otherwise, give us the option to enable this functionality.

Disable hotkeys

The NetworkManagerHUD hotkeys conflict with some game controls. Need to disable them.

Orb Sync Bug

Whenever I interact with one of the Nomai control orbs, it falls out of its track, either floating or bouncing wildly in place. This makes opening any door to a Nomai ruin impossible.

The console calls the following errors:

InvalidOperationException: Operation is not valid due to the current state of the object. Stack trace: System.Linq.Enumerable.First[NomaiOrbTransformSync] (IEnumerable1 source, System.Func2 predicate, Fallback fallback) System.Linq.Enumerable.First[NomaiOrbTransformSync] (IEnumerable1 source, System.Func2 predicate) QSB.OrbSync.Events.OrbUserEvent.HandleServer (QSB.WorldSync.Events.WorldObjectMessage message) QSB.OrbSync.Events.OrbUserEvent.OnReceiveLocal (Boolean server, QSB.WorldSync.Events.WorldObjectMessage message) QSB.Events.QSBEvent1[T].OnReceive (Boolean isServer, .T message) QSB.Events.QSBEvent1[T].<.ctor>b__5_0 (.T message) QSB.Messaging.MessageHandler`1[QSB.WorldSync.Events.WorldObjectMessage].OnClientReceiveMessageHandler (QuantumUNET.Messages.QSBNetworkMessage netMsg) QuantumUNET.QSBNetworkConnection.InvokeHandler (QuantumUNET.Messages.QSBNetworkMessage netMsg) QuantumUNET.QSBLocalClient.ProcessInternalMessages () QuantumUNET.QSBLocalClient.Update () QuantumUNET.QSBNetworkClient.UpdateClients () QuantumUNET.Components.QSBNetworkIdentity.UNetStaticUpdate () QSB.QSBCore.Update ()

InvalidOperationException: Operation is not valid due to the current state of the object. Stack trace: System.Linq.Enumerable.First<QSB.OrbSync.QSBOrbSlot> (System.Collections.Generic.IEnumerable1<QSB.OrbSync.QSBOrbSlot>,System.Func2<QSB.OrbSync.QSBOrbSlot, bool>,System.Linq.Enumerable/Fallback) <0x001a9> System.Linq.Enumerable.First<QSB.OrbSync.QSBOrbSlot> (System.Collections.Generic.IEnumerable1<QSB.OrbSync.QSBOrbSlot>,System.Func2<QSB.OrbSync.QSBOrbSlot, bool>) <0x00061> QSB.WorldSync.QSBWorldSync.HandleSlotStateChange (NomaiInterfaceSlot,NomaiInterfaceOrb,bool) <0x00133> QSB.OrbSync.OrbPatches.CheckOrbCollision (bool&,NomaiInterfaceSlot,NomaiInterfaceOrb,bool,single,single,NomaiInterfaceOrb&) <0x002ce> (wrapper dynamic-method) NomaiInterfaceSlot.CheckOrbCollision_Patch1 (object,NomaiInterfaceOrb) <0x0007a> NomaiInterfaceOrb.CheckSlotCollision (bool) <0x0023d> NomaiInterfaceOrb.FixedUpdate () <0x00645>

Eye: Fix suit sync

When arriving at the eye, suit is equipped by default. Since no "suit up" event happened, players don't see each other with suit equipped until suit state changes.

Sync current loop on connect

Each client tracks what's the current loop. So when a client connects when the server is already in loop X, we need to make sure the client gets synced to that loop too.

Synchronize player model (suit / no suit)

Right now, if the player model is wearing the space suit, all other models will reflect that. We need to keep them independent and send messages declaring the model change.

Cleanup on player disconnect

If a player disconnects, we need to remove all the trash left behind, like any objects that the current client has local authority over (player body, ship body).

Reference grid

Right now, "sectors" are used as references. Sectors exist around every planet, and a few other things. When a player enters a new sector, that sector becomes the "zero" position for that players, and all of that player's positions start being broadcast in relation to that sector.

One cool thing about this sector approach is that players will be synced to the planets they are on. This means that, if the game becomes slightly out of sync, the non-local player models will still appear to be standing correctly on the ground of whichever planet they're on.

Problems with this:

  • If a player is far from any celestial object, their position will still be visibly affected by floating point imprecision.
  • If a player is inside multiple sectors, the selected sector might not be the best one.

One solution to this is to create a bunch of references throughout the solar system. Just like sectors, they would be invisible triggers, which activate when a player is inside them. Each of these triggers would have a unique ID, so each player would communicate the reference ID, and their position relative to that reference. This way we can have precise position coverage for the entire solar system.

Potential problems:

  • Slight de-sync will likely result in floaty players, since they're no longer reporting their position based on a planet. Maybe it would be possible to have both? Planet sectors and the extra reference objects?
  • Possible performance impact of having thousands of new triggers. Outer Wilds has some code related to enabling / disabling collisions based on sectors I think, so maybe something like that could be used?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.