Exemplo n.º 1
0
        public void StartServer()
        {
            ui.SetState(MultiplayerUIState.Server);
            MelonModLogger.Log("Starting server...");
            localRigTransforms = BWUtil.GetLocalRigTransforms();
            partyId            = SteamClient.SteamId + "P" + DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();

            RichPresence.SetActivity(
                new Activity()
            {
                Details = "Hosting a server",
                Secrets = new ActivitySecrets()
                {
                    Join = SteamClient.SteamId.ToString()
                },
                Party = new ActivityParty()
                {
                    Id   = partyId,
                    Size = new PartySize()
                    {
                        CurrentSize = 1,
                        MaxSize     = MultiplayerMod.MAX_PLAYERS
                    }
                }
            });
            transportLayer.OnMessageReceived  += TransportLayer_OnMessageReceived;
            transportLayer.OnConnectionClosed += TransportLayer_OnConnectionClosed;

            MultiplayerMod.OnLevelWasLoadedEvent += MultiplayerMod_OnLevelWasLoadedEvent;

            IsRunning = true;
        }
Exemplo n.º 2
0
        private void PlayerHooks_OnPlayerGrabObject(GameObject obj)
        {
            // See if it's a gun
            GunType?gt = BWUtil.GetGunType(obj.transform.root.gameObject);

            if (gt != null)
            {
                HandGunChangeMessage hgcm = new HandGunChangeMessage()
                {
                    isForOtherPlayer = true,
                    type             = gt.Value,
                    destroy          = false,
                    playerId         = 0
                };

                ServerSendToAll(hgcm, MessageSendType.Reliable);

                switch (gt)
                {
                case GunType.EDER22:
                    MelonModLogger.Log("Holding Eder22");
                    break;
                }
            }
        }
Exemplo n.º 3
0
        public void Connect(string obj)
        {
            MelonModLogger.Log("Starting client and connecting");

            ServerId = ulong.Parse(obj);
            MelonModLogger.Log("Connecting to " + obj);

            P2PMessage msg = new P2PMessage();

            msg.WriteByte((byte)MessageType.Join);
            msg.WriteByte(MultiplayerMod.PROTOCOL_VERSION);
            msg.WriteUnicodeString(SteamClient.Name);

            connection = transportLayer.ConnectTo(ServerId, msg);
            transportLayer.OnConnectionClosed += TransportLayer_OnConnectionClosed;
            transportLayer.OnMessageReceived  += TransportLayer_OnMessageReceived;
            //SteamNetworking.SendP2PPacket(ServerId, msg.GetBytes());

            isConnected = true;
            //PlayerHooks.OnPlayerGrabObject += PlayerHooks_OnPlayerGrabObject;
            //PlayerHooks.OnPlayerLetGoObject += PlayerHooks_OnPlayerLetGoObject;
            localRigTransforms = BWUtil.GetLocalRigTransforms();

            //SteamNetworking.OnP2PSessionRequest = OnP2PSessionRequest;
            //SteamNetworking.OnP2PConnectionFailed = OnP2PConnectionFailed;
            ui.SetState(MultiplayerUIState.Client);
        }
Exemplo n.º 4
0
        public void Connect(string obj)
        {
            MelonLogger.Log("Starting client and connecting");

            ServerId = ulong.Parse(obj);
            MelonLogger.Log("Connecting to " + obj);

            P2PMessage msg = new P2PMessage();

            msg.WriteByte((byte)MessageType.Join);
            msg.WriteByte(MultiplayerMod.PROTOCOL_VERSION);
            msg.WriteUnicodeString(SteamClient.Name);

            connection = transportLayer.ConnectTo(ServerId, msg);
            transportLayer.OnConnectionClosed += TransportLayer_OnConnectionClosed;
            transportLayer.OnMessageReceived  += TransportLayer_OnMessageReceived;

            isConnected        = true;
            localRigTransforms = BWUtil.GetLocalRigTransforms();

            ui.SetState(MultiplayerUIState.Client);
            GunHooks.OnGunFire                += BWUtil_OnFire;
            PlayerHooks.OnPlayerGrabObject    += PlayerHooks_OnPlayerGrabObject;
            PlayerHooks.OnPlayerReleaseObject += PlayerHooks_OnPlayerReleaseObject;

            MultiplayerMod.OnLevelWasLoadedEvent += MultiplayerMod_OnLevelWasLoadedEvent;
        }
Exemplo n.º 5
0
        public void SetupSyncFor(GameObject obj, byte initialOwner = 0)
        {
            ushort id = ObjectIDManager.AllocateID();

            ObjectIDManager.AddObject(id, obj);

            var so = obj.AddComponent <SyncedObject>();

            so.owner = initialOwner;
            so.ID    = id;
            so.rb    = obj.GetComponent <Rigidbody>();
            syncObjs.Add(so);

            var iam = new IDAllocationMessage
            {
                allocatedId  = id,
                namePath     = BWUtil.GetFullNamePath(obj),
                initialOwner = so.owner
            };

            ServerSendToAll(iam, MessageSendType.Reliable);
        }
Exemplo n.º 6
0
        private void PlayerHooks_OnPlayerGrabObject(GameObject grabObj)
        {
            var rb = grabObj.GetComponentInParent <Rigidbody>();

            if (rb == null)
            {
                return;
            }
            MelonLogger.Log($"Grabbed {rb.gameObject.name}");

            var obj = rb.gameObject;
            var so  = obj.GetComponent <SyncedObject>();

            if (!so)
            {
                MelonLogger.Log($"Requesting ID for {obj.name}");
                var req = new IDRequestMessage
                {
                    namePath     = BWUtil.GetFullNamePath(obj),
                    initialOwner = localSmallId
                };

                SendToServer(req, MessageSendType.Reliable);
            }
            else
            {
                MelonLogger.Log($"Grapped object has ID of {so.ID}");
                var coom = new ChangeObjectOwnershipMessage
                {
                    objectId = so.ID,
                    ownerId  = localSmallId
                };

                SendToServer(coom, MessageSendType.Reliable);
            }
        }
Exemplo n.º 7
0
        private void TransportLayer_OnMessageReceived(ITransportConnection arg1, P2PMessage msg)
        {
            MessageType type = (MessageType)msg.ReadByte();

            try
            {
                switch (type)
                {
                case MessageType.GunFire:
                {
                    GunFireMessageOther gfmo          = new GunFireMessageOther(msg);
                    PlayerRep           pr            = GetPlayerRep(gfmo.playerId);
                    AmmoVariables       ammoVariables = new AmmoVariables()
                    {
                        AttackDamage   = gfmo.ammoDamage,
                        AttackType     = AttackType.Piercing,
                        cartridgeType  = Cart.Cal_9mm,
                        ExitVelocity   = gfmo.exitVelocity,
                        ProjectileMass = gfmo.projectileMass,
                        Tracer         = false
                    };
                    if ((StressLevelZero.Handedness)gfmo.handedness == StressLevelZero.Handedness.RIGHT)
                    {
                        pr.rightGunScript.firePointTransform.position = gfmo.firepointPos;
                        pr.rightGunScript.firePointTransform.rotation = gfmo.firepointRotation;
                        pr.rightGunScript.muzzleVelocity   = gfmo.muzzleVelocity;
                        pr.rightBulletObject.ammoVariables = ammoVariables;
                        pr.rightGunScript.PullCartridge();
                        pr.rightGunScript.Fire();
                    }
                    if ((StressLevelZero.Handedness)gfmo.handedness == StressLevelZero.Handedness.LEFT)
                    {
                        pr.leftGunScript.firePointTransform.position = gfmo.firepointPos;
                        pr.leftGunScript.firePointTransform.rotation = gfmo.firepointRotation;
                        pr.leftGunScript.muzzleVelocity   = gfmo.muzzleVelocity;
                        pr.leftBulletObject.ammoVariables = ammoVariables;
                        pr.leftGunScript.PullCartridge();
                        pr.leftGunScript.Fire();
                    }
                    pr.faceAnimator.faceState = Source.Representations.FaceAnimator.FaceState.Angry;
                    pr.faceAnimator.faceTime  = 5;
                    break;
                }

                case MessageType.OtherPlayerPosition:
                {
                    OtherPlayerPositionMessage oppm = new OtherPlayerPositionMessage(msg);

                    if (playerObjects.ContainsKey(oppm.playerId))
                    {
                        PlayerRep pr = GetPlayerRep(oppm.playerId);

                        pr.head.transform.position   = oppm.headPos;
                        pr.handL.transform.position  = oppm.lHandPos;
                        pr.handR.transform.position  = oppm.rHandPos;
                        pr.pelvis.transform.position = oppm.pelvisPos;
                        pr.ford.transform.position   = oppm.pelvisPos - new Vector3(0.0f, 0.3f, 0.0f);
                        pr.footL.transform.position  = oppm.lFootPos;
                        pr.footR.transform.position  = oppm.rFootPos;

                        pr.head.transform.rotation   = oppm.headRot;
                        pr.handL.transform.rotation  = oppm.lHandRot;
                        pr.handR.transform.rotation  = oppm.rHandRot;
                        pr.pelvis.transform.rotation = oppm.pelvisRot;
                        pr.footL.transform.rotation  = oppm.lFootRot;
                        pr.footR.transform.rotation  = oppm.rFootRot;
                    }

                    break;
                }

                case MessageType.OtherFullRig:
                {
                    OtherFullRigTransformMessage ofrtm = new OtherFullRigTransformMessage(msg);
                    byte playerId = ofrtm.playerId;

                    if (playerObjects.ContainsKey(ofrtm.playerId))
                    {
                        PlayerRep pr = GetPlayerRep(playerId);

                        pr.ApplyTransformMessage(ofrtm);
                    }
                    break;
                }

                case MessageType.ServerShutdown:
                {
                    foreach (PlayerRep pr in playerObjects.Values)
                    {
                        pr.Delete();
                    }
                    break;
                }

                case MessageType.Disconnect:
                {
                    byte pid = msg.ReadByte();
                    playerObjects[pid].Delete();
                    playerObjects.Remove(pid);
                    largePlayerIds.Remove(pid);
                    playerNames.Remove(pid);

                    foreach (PlayerRep pr in playerObjects.Values)
                    {
                        pr.faceAnimator.faceState = Source.Representations.FaceAnimator.FaceState.Sad;
                        pr.faceAnimator.faceTime  = 10;
                    }
                    break;
                }

                case MessageType.JoinRejected:
                {
                    MelonLogger.LogError("Join rejected - you are using an incompatible version of the mod!");
                    Disconnect();
                    break;
                }

                case MessageType.SceneTransition:
                {
                    SceneTransitionMessage stm = new SceneTransitionMessage(msg);
                    if (BoneworksSceneManager.GetCurrentSceneName() != stm.sceneName)
                    {
                        BoneworksSceneManager.LoadScene(stm.sceneName);
                    }
                    break;
                }

                case MessageType.Join:
                {
                    ClientJoinMessage cjm = new ClientJoinMessage(msg);
                    largePlayerIds.Add(cjm.playerId, cjm.steamId);
                    playerNames.Add(cjm.playerId, cjm.name);
                    playerObjects.Add(cjm.playerId, new PlayerRep(cjm.name, cjm.steamId));

                    foreach (PlayerRep pr in playerObjects.Values)
                    {
                        pr.faceAnimator.faceState = Source.Representations.FaceAnimator.FaceState.Happy;
                        pr.faceAnimator.faceTime  = 15;
                    }
                    break;
                }

                case MessageType.SetPartyId:
                {
                    SetPartyIdMessage spid = new SetPartyIdMessage(msg);
                    RichPresence.SetActivity(
                        new Activity()
                        {
                            Details = "Connected to a server",
                            Secrets = new ActivitySecrets()
                            {
                                Join = ServerId.ToString()
                            },
                            Party = new ActivityParty()
                            {
                                Id   = spid.partyId,
                                Size = new PartySize()
                                {
                                    CurrentSize = 1,
                                    MaxSize     = MultiplayerMod.MAX_PLAYERS
                                }
                            }
                        });
                    break;
                }

                case MessageType.EnemyRigTransform:
                {
                    enemyPoolManager.FindMissingPools();
                    EnemyRigTransformMessage ertm = new EnemyRigTransformMessage(msg);
                    Pool pool = enemyPoolManager.GetPool(ertm.enemyType);

                    // HORRID PERFORMANCE
                    Transform              enemyTf = pool.transform.GetChild(ertm.poolChildIdx);
                    GameObject             rootObj = enemyTf.Find("enemyBrett@neutral").gameObject;
                    BoneworksRigTransforms brt     = BWUtil.GetHumanoidRigTransforms(rootObj);
                    BWUtil.ApplyRigTransform(brt, ertm);
                    break;
                }

                case MessageType.IdAllocation:
                {
                    IDAllocationMessage iam = new IDAllocationMessage(msg);
                    GameObject          obj = BWUtil.GetObjectFromFullPath(iam.namePath);
                    if (!obj)
                    {
                        MelonLogger.LogWarning("Got IdAllocation for nonexistent object???");
                    }
                    ObjectIDManager.AddObject(iam.allocatedId, obj);

                    var so = obj.AddComponent <SyncedObject>();
                    so.ID    = iam.allocatedId;
                    so.owner = iam.initialOwner;
                    so.rb    = obj.GetComponent <Rigidbody>();

                    syncedObjects.Add(so);

                    if (so.owner != localSmallId)
                    {
                        so.rb.isKinematic = true;
                    }

                    MelonLogger.Log($"ID Allocation: {iam.namePath}, {so.ID}");
                    break;
                }

                case MessageType.ObjectSync:
                {
                    ObjectSyncMessage osm = new ObjectSyncMessage(msg);
                    GameObject        obj = ObjectIDManager.GetObject(osm.id);

                    if (!obj)
                    {
                        MelonLogger.LogError($"Couldn't find object with ID {osm.id}");
                    }
                    else
                    {
                        obj.transform.position = osm.position;
                        obj.transform.rotation = osm.rotation;
                    }
                    break;
                }

                case MessageType.ChangeObjectOwnership:
                {
                    var coom = new ChangeObjectOwnershipMessage(msg);
                    var obj  = ObjectIDManager.GetObject(coom.objectId);
                    var so   = obj.GetComponent <SyncedObject>();
                    so.owner = coom.ownerId;

                    if (so.owner == localSmallId)
                    {
                        so.rb.isKinematic     = false;
                        so.rb.velocity        = coom.linVelocity;
                        so.rb.angularVelocity = coom.angVelocity;
                    }
                    else
                    {
                        so.rb.isKinematic = true;
                    }

                    MelonLogger.Log($"Object {coom.objectId} is now owned by {coom.ownerId} (kinematic: {so.rb.isKinematic})");

                    break;
                }

                case MessageType.SetLocalSmallId:
                {
                    var slsi = new SetLocalSmallIdMessage(msg);
                    localSmallId = slsi.smallId;
                    break;
                }
                }
            }
            catch (Exception e)
            {
                MelonLogger.LogError($"Caught exception in message handler for message {type}: {e}");
            }
        }
Exemplo n.º 8
0
        public void Update()
        {
            transportLayer.Update();
            if (SceneLoader.loading)
            {
                return;
            }

            if (localRigTransforms.main == null)
            {
                localRigTransforms = BWUtil.GetLocalRigTransforms();
            }

            if (localRigTransforms.main != null)
            {
                OtherFullRigTransformMessage ofrtm = new OtherFullRigTransformMessage
                {
                    playerId  = 0,
                    posMain   = localRigTransforms.main.position,
                    posRoot   = localRigTransforms.root.position,
                    posLHip   = localRigTransforms.lHip.position,
                    posRHip   = localRigTransforms.rHip.position,
                    posLKnee  = localRigTransforms.lKnee.position,
                    posRKnee  = localRigTransforms.rKnee.position,
                    posLAnkle = localRigTransforms.lAnkle.position,
                    posRAnkle = localRigTransforms.rAnkle.position,

                    posSpine1    = localRigTransforms.spine1.position,
                    posSpine2    = localRigTransforms.spine2.position,
                    posSpineTop  = localRigTransforms.spineTop.position,
                    posLClavicle = localRigTransforms.lClavicle.position,
                    posRClavicle = localRigTransforms.rClavicle.position,
                    posNeck      = localRigTransforms.neck.position,
                    posLShoulder = localRigTransforms.lShoulder.position,
                    posRShoulder = localRigTransforms.rShoulder.position,
                    posLElbow    = localRigTransforms.lElbow.position,
                    posRElbow    = localRigTransforms.rElbow.position,
                    posLWrist    = localRigTransforms.lWrist.position,
                    posRWrist    = localRigTransforms.rWrist.position,

                    rotMain      = localRigTransforms.main.rotation,
                    rotRoot      = localRigTransforms.root.rotation,
                    rotLHip      = localRigTransforms.lHip.rotation,
                    rotRHip      = localRigTransforms.rHip.rotation,
                    rotLKnee     = localRigTransforms.lKnee.rotation,
                    rotRKnee     = localRigTransforms.rKnee.rotation,
                    rotLAnkle    = localRigTransforms.lAnkle.rotation,
                    rotRAnkle    = localRigTransforms.rAnkle.rotation,
                    rotSpine1    = localRigTransforms.spine1.rotation,
                    rotSpine2    = localRigTransforms.spine2.rotation,
                    rotSpineTop  = localRigTransforms.spineTop.rotation,
                    rotLClavicle = localRigTransforms.lClavicle.rotation,
                    rotRClavicle = localRigTransforms.rClavicle.rotation,
                    rotNeck      = localRigTransforms.neck.rotation,
                    rotLShoulder = localRigTransforms.lShoulder.rotation,
                    rotRShoulder = localRigTransforms.rShoulder.rotation,
                    rotLElbow    = localRigTransforms.lElbow.rotation,
                    rotRElbow    = localRigTransforms.rElbow.rotation,
                    rotLWrist    = localRigTransforms.lWrist.rotation,
                    rotRWrist    = localRigTransforms.rWrist.rotation
                };

                ServerSendToAll(ofrtm, MessageSendType.Unreliable);
            }

            foreach (PlayerRep pr in playerObjects.Values)
            {
                pr.UpdateNameplateFacing(Camera.current.transform);
                pr.faceAnimator.Update();
            }

            foreach (var obj in syncObjs)
            {
                if (obj.owner == 0 && obj.NeedsSync())
                {
                    ServerSendToAll(obj.CreateSyncMessage(), MessageSendType.Unreliable);
                    obj.UpdateLastSync();
                }
            }
        }
Exemplo n.º 9
0
        private void TransportLayer_OnMessageReceived(ITransportConnection connection, P2PMessage msg)
        {
            MessageType type = (MessageType)msg.ReadByte();

            switch (type)
            {
            case MessageType.GunFire:
            {
                GunFireMessage gfm           = new GunFireMessage(msg);
                byte           LocalplayerId = smallPlayerIds[connection.ConnectedTo];
                if (playerObjects.ContainsKey(LocalplayerId))
                {
                    PlayerRep     pr            = playerObjects[LocalplayerId];
                    AmmoVariables ammoVariables = new AmmoVariables()
                    {
                        AttackDamage   = gfm.ammoDamage,
                        AttackType     = AttackType.Piercing,
                        cartridgeType  = Cart.Cal_9mm,
                        ExitVelocity   = gfm.exitVelocity,
                        ProjectileMass = gfm.projectileMass,
                        Tracer         = false
                    };
                    if ((StressLevelZero.Handedness)gfm.handedness == StressLevelZero.Handedness.RIGHT)
                    {
                        pr.rightGunScript.firePointTransform.position = gfm.firepointPos;
                        pr.rightGunScript.firePointTransform.rotation = gfm.firepointRotation;
                        pr.rightGunScript.muzzleVelocity   = gfm.muzzleVelocity;
                        pr.rightBulletObject.ammoVariables = ammoVariables;
                        pr.leftGunScript.PullCartridge();
                        pr.rightGunScript.Fire();
                    }
                    if ((StressLevelZero.Handedness)gfm.handedness == StressLevelZero.Handedness.LEFT)
                    {
                        pr.leftGunScript.firePointTransform.position = gfm.firepointPos;
                        pr.leftGunScript.firePointTransform.rotation = gfm.firepointRotation;
                        pr.leftGunScript.muzzleVelocity   = gfm.muzzleVelocity;
                        pr.leftBulletObject.ammoVariables = ammoVariables;
                        pr.leftGunScript.PullCartridge();
                        pr.leftGunScript.Fire();
                    }
                    GunFireMessageOther gfmo = new GunFireMessageOther()
                    {
                        playerId          = LocalplayerId,
                        handedness        = gfm.handedness,
                        firepointPos      = gfm.firepointPos,
                        firepointRotation = gfm.firepointRotation,
                        ammoDamage        = gfm.ammoDamage,
                        projectileMass    = gfm.projectileMass,
                        exitVelocity      = gfm.exitVelocity,
                        muzzleVelocity    = gfm.muzzleVelocity
                    };
                    pr.faceAnimator.faceState = Source.Representations.FaceAnimator.FaceState.Angry;
                    pr.faceAnimator.faceTime  = 5;
                    ServerSendToAllExcept(gfmo, MessageSendType.Reliable, connection.ConnectedTo);
                }
                break;
            }

            case MessageType.Join:
            {
                if (msg.ReadByte() != MultiplayerMod.PROTOCOL_VERSION)
                {
                    // Somebody tried to join with an incompatible verison
                    P2PMessage m2 = new P2PMessage();
                    m2.WriteByte((byte)MessageType.JoinRejected);
                    connection.SendMessage(m2, MessageSendType.Reliable);
                    connection.Disconnect();
                }
                else
                {
                    MelonLogger.Log("Player joined with ID: " + connection.ConnectedTo);
                    if (players.Contains(connection.ConnectedTo))
                    {
                        players.Remove(connection.ConnectedTo);
                    }

                    players.Add(connection.ConnectedTo);
                    MelonLogger.Log("Player count: " + players.Count);
                    byte newPlayerId = smallIdCounter;

                    if (smallPlayerIds.ContainsKey(newPlayerId))
                    {
                        smallPlayerIds.Remove(newPlayerId);
                    }

                    smallPlayerIds.Add(connection.ConnectedTo, newPlayerId);

                    if (largePlayerIds.ContainsKey(newPlayerId))
                    {
                        largePlayerIds.Remove(newPlayerId);
                    }

                    largePlayerIds.Add(newPlayerId, connection.ConnectedTo);
                    smallIdCounter++;

                    playerConnections.Add(connection.ConnectedTo, connection);

                    string name = msg.ReadUnicodeString();
                    MelonLogger.Log("Name: " + name);

                    foreach (var smallId in playerNames.Keys)
                    {
                        ClientJoinMessage cjm = new ClientJoinMessage
                        {
                            playerId = smallId,
                            name     = playerNames[smallId],
                            steamId  = largePlayerIds[smallId]
                        };
                        connection.SendMessage(cjm.MakeMsg(), MessageSendType.Reliable);
                    }

                    ClientJoinMessage cjm2 = new ClientJoinMessage
                    {
                        playerId = 0,
                        name     = SteamClient.Name,
                        steamId  = SteamClient.SteamId
                    };
                    connection.SendMessage(cjm2.MakeMsg(), MessageSendType.Reliable);

                    if (playerNames.ContainsKey(newPlayerId))
                    {
                        playerNames.Remove(newPlayerId);
                    }

                    playerNames.Add(newPlayerId, name);

                    ClientJoinMessage cjm3 = new ClientJoinMessage
                    {
                        playerId = newPlayerId,
                        name     = name,
                        steamId  = connection.ConnectedTo
                    };
                    ServerSendToAllExcept(cjm3, MessageSendType.Reliable, connection.ConnectedTo);

                    if (playerObjects.ContainsKey(newPlayerId))
                    {
                        playerObjects.Remove(newPlayerId);
                    }
                    playerObjects.Add(newPlayerId, new PlayerRep(name, connection.ConnectedTo));

                    RichPresence.SetActivity(
                        new Activity()
                        {
                            Details = "Hosting a server",
                            Secrets = new ActivitySecrets()
                            {
                                Join = SteamClient.SteamId.ToString()
                            },
                            Party = new ActivityParty()
                            {
                                Id   = partyId,
                                Size = new PartySize()
                                {
                                    CurrentSize = players.Count + 1,
                                    MaxSize     = MultiplayerMod.MAX_PLAYERS
                                }
                            }
                        });

                    SceneTransitionMessage stm = new SceneTransitionMessage()
                    {
                        sceneName = BoneworksSceneManager.GetCurrentSceneName()
                    };
                    connection.SendMessage(stm.MakeMsg(), MessageSendType.Reliable);

                    SetPartyIdMessage spid = new SetPartyIdMessage()
                    {
                        partyId = partyId
                    };
                    connection.SendMessage(spid.MakeMsg(), MessageSendType.Reliable);

                    SetLocalSmallIdMessage slsi = new SetLocalSmallIdMessage()
                    {
                        smallId = newPlayerId
                    };
                    connection.SendMessage(slsi.MakeMsg(), MessageSendType.Reliable);

                    foreach (var so in syncObjs)
                    {
                        var iam = new IDAllocationMessage
                        {
                            allocatedId  = so.ID,
                            namePath     = BWUtil.GetFullNamePath(so.gameObject),
                            initialOwner = so.owner
                        };
                        connection.SendMessage(iam.MakeMsg(), MessageSendType.Reliable);
                    }

                    ui.SetPlayerCount(players.Count, MultiplayerUIState.Server);

                    foreach (PlayerRep pr in playerObjects.Values)
                    {
                        pr.faceAnimator.faceState = Source.Representations.FaceAnimator.FaceState.Happy;
                        pr.faceAnimator.faceTime  = 15;
                    }
                }
                break;
            }

            case MessageType.Disconnect:
            {
                MelonLogger.Log("Player left with ID: " + connection.ConnectedTo);
                byte smallId = smallPlayerIds[connection.ConnectedTo];

                playerObjects[smallId].Delete();
                playerObjects.Remove(smallId);
                players.RemoveAll((ulong val) => val == connection.ConnectedTo);
                smallPlayerIds.Remove(connection.ConnectedTo);

                P2PMessage disconnectMsg = new P2PMessage();
                disconnectMsg.WriteByte((byte)MessageType.Disconnect);
                disconnectMsg.WriteByte(smallId);

                foreach (SteamId p in players)
                {
                    playerConnections[p].SendMessage(disconnectMsg, MessageSendType.Reliable);
                }
                foreach (PlayerRep pr in playerObjects.Values)
                {
                    pr.faceAnimator.faceState = Source.Representations.FaceAnimator.FaceState.Sad;
                    pr.faceAnimator.faceTime  = 6;
                }
                break;
            }

            case MessageType.FullRig:
            {
                FullRigTransformMessage frtm = new FullRigTransformMessage(msg);

                byte playerId = smallPlayerIds[connection.ConnectedTo];
                if (playerObjects.ContainsKey(playerId))
                {
                    PlayerRep pr = playerObjects[playerId];

                    if (pr.rigTransforms.main != null)
                    {
                        //ApplyTransformMessage(pr, frtm);
                        pr.ApplyTransformMessage(frtm);

                        OtherFullRigTransformMessage ofrtm = new OtherFullRigTransformMessage
                        {
                            playerId = playerId,

                            posMain   = frtm.posMain,
                            posRoot   = frtm.posRoot,
                            posLHip   = frtm.posLHip,
                            posRHip   = frtm.posRHip,
                            posLKnee  = frtm.posLKnee,
                            posRKnee  = frtm.posRKnee,
                            posLAnkle = frtm.posLAnkle,
                            posRAnkle = frtm.posRAnkle,

                            posSpine1    = frtm.posSpine1,
                            posSpine2    = frtm.posSpine2,
                            posSpineTop  = frtm.posSpineTop,
                            posLClavicle = frtm.posLClavicle,
                            posRClavicle = frtm.posRClavicle,
                            posNeck      = frtm.posNeck,
                            posLShoulder = frtm.posLShoulder,
                            posRShoulder = frtm.posRShoulder,
                            posLElbow    = frtm.posLElbow,
                            posRElbow    = frtm.posRElbow,
                            posLWrist    = frtm.posLWrist,
                            posRWrist    = frtm.posRWrist,

                            rotMain      = frtm.rotMain,
                            rotRoot      = frtm.rotRoot,
                            rotLHip      = frtm.rotLHip,
                            rotRHip      = frtm.rotRHip,
                            rotLKnee     = frtm.rotLKnee,
                            rotRKnee     = frtm.rotRKnee,
                            rotLAnkle    = frtm.rotLAnkle,
                            rotRAnkle    = frtm.rotRAnkle,
                            rotSpine1    = frtm.rotSpine1,
                            rotSpine2    = frtm.rotSpine2,
                            rotSpineTop  = frtm.rotSpineTop,
                            rotLClavicle = frtm.rotLClavicle,
                            rotRClavicle = frtm.rotRClavicle,
                            rotNeck      = frtm.rotNeck,
                            rotLShoulder = frtm.rotLShoulder,
                            rotRShoulder = frtm.rotRShoulder,
                            rotLElbow    = frtm.rotLElbow,
                            rotRElbow    = frtm.rotRElbow,
                            rotLWrist    = frtm.rotLWrist,
                            rotRWrist    = frtm.rotRWrist
                        };

                        ServerSendToAllExcept(ofrtm, MessageSendType.Unreliable, connection.ConnectedTo);
                    }
                }
                break;
            }

            case MessageType.IdRequest:
            {
                var idrqm = new IDRequestMessage(msg);
                MelonLogger.Log("ID request: " + idrqm.namePath);
                var obj = BWUtil.GetObjectFromFullPath(idrqm.namePath);

                SetupSyncFor(obj, idrqm.initialOwner);
                break;
            }

            case MessageType.ChangeObjectOwnership:
            {
                var coom = new ChangeObjectOwnershipMessage(msg);

                if (coom.ownerId != smallPlayerIds[connection.ConnectedTo] && coom.ownerId != 0)
                {
                    MelonLogger.LogError("Invalid object ownership change??");
                }

                if (!ObjectIDManager.objects.ContainsKey(coom.objectId))
                {
                    MelonLogger.LogError($"Got ownership change for invalid object ID {coom.objectId}");
                }

                MelonLogger.Log($"Object {coom.objectId} is now owned by {coom.ownerId}");

                var obj = ObjectIDManager.GetObject(coom.objectId);
                var so  = obj.GetComponent <SyncedObject>();
                so.owner = coom.ownerId;

                if (so.owner != 0)
                {
                    coom.linVelocity  = so.rb.velocity;
                    coom.angVelocity  = so.rb.angularVelocity;
                    so.rb.isKinematic = true;
                }
                else if (so.owner == 0)
                {
                    so.rb.isKinematic     = false;
                    so.rb.velocity        = coom.linVelocity;
                    so.rb.angularVelocity = coom.angVelocity;
                }

                ServerSendToAll(coom, MessageSendType.Reliable);
                break;
            }

            case MessageType.ObjectSync:
            {
                ObjectSyncMessage osm = new ObjectSyncMessage(msg);
                GameObject        obj = ObjectIDManager.GetObject(osm.id);

                var so = obj.GetComponent <SyncedObject>();

                if (!obj)
                {
                    MelonLogger.LogError($"Couldn't find object with ID {osm.id}");
                }
                else
                {
                    if (so.owner != smallPlayerIds[connection.ConnectedTo])
                    {
                        MelonLogger.LogError("Got object sync from client that doesn't own the object");
                    }
                    else
                    {
                        obj.transform.position = osm.position;
                        obj.transform.rotation = osm.rotation;

                        ServerSendToAllExcept(osm, MessageSendType.Reliable, connection.ConnectedTo);
                    }
                }

                break;
            }

            default:
                MelonLogger.Log("Unknown message type: " + type.ToString());
                break;
            }
        }
Exemplo n.º 10
0
        // Constructor
        public PlayerRep(string name, SteamId steamId)
        {
            this.steamId = steamId;

            // Create this player's "Ford" to represent them, known as their rep
            GameObject ford = Instantiate(fordBundle.LoadAsset("Assets/Ford.prefab").Cast <GameObject>());

            // Makes sure that the rep isn't destroyed per level change.
            DontDestroyOnLoad(ford);


            GameObject root     = ford.transform.Find("Ford/Brett@neutral").gameObject; // Get the rep's head
            Transform  realRoot = root.transform.Find("SHJntGrp/MAINSHJnt/ROOTSHJnt");  // Then get the head's root joint

            #region Unused Code
            // Networked IK code?

            //var ik = root.AddComponent<VRIK>();

            //VRIK.References bipedReferences = new VRIK.References
            //{
            //    root = root.transform.Find("SHJntGrp"),

            //    spine = realRoot.Find("Spine_01SHJnt"),
            //    pelvis = realRoot,

            //    leftThigh = realRoot.Find("l_Leg_HipSHJnt"),
            //    leftCalf = realRoot.Find("l_Leg_HipSHJnt/l_Leg_KneeSHJnt"),
            //    leftFoot = realRoot.Find("l_Leg_HipSHJnt/l_Leg_KneeSHJnt/l_Leg_AnkleSHJnt"),
            //    leftToes = realRoot.Find("l_Leg_HipSHJnt/l_Leg_KneeSHJnt/l_Leg_AnkleSHJnt/l_Leg_BallSHJnt"),

            //    rightThigh = realRoot.Find("r_Leg_HipSHJnt"),
            //    rightCalf = realRoot.Find("r_Leg_HipSHJnt/r_Leg_KneeSHJnt"),
            //    rightFoot = realRoot.Find("r_Leg_HipSHJnt/r_Leg_KneeSHJnt/r_Leg_AnkleSHJnt"),
            //    rightToes = realRoot.Find("r_Leg_HipSHJnt/r_Leg_KneeSHJnt/r_Leg_AnkleSHJnt/r_Leg_BallSHJnt"),

            //    leftUpperArm = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt"),
            //    leftForearm = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/l_Arm_Elbow_CurveSHJnt"),
            //    leftHand = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/l_Arm_Elbow_CurveSHJnt/l_WristSHJnt/l_Hand_1SHJnt"),
            //    //leftShoulder = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt"),

            //    rightUpperArm = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt"),
            //    rightForearm = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt"),
            //    rightHand = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt/r_WristSHJnt/r_Hand_1SHJnt"),
            //    //rightShoulder = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt"),

            //    head = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/Neck_01SHJnt")
            //};

            ////ik.AutoDetectReferences();
            //ik.enabled = false;
            //ik.references = bipedReferences;
            ////ik.solver.plantFeet = false;
            //ik.fixTransforms = false;

            //ik.solver.leftLeg.positionWeight = 1.0f;
            //ik.solver.leftLeg.swivelOffset = 0.0f;
            //ik.solver.leftLeg.bendToTargetWeight = 0.0f;
            //ik.solver.leftLeg.legLengthMlp = 1.0f;

            //ik.solver.rightLeg.positionWeight = 1.0f;
            //ik.solver.rightLeg.swivelOffset = 0.0f;
            //ik.solver.rightLeg.bendToTargetWeight = 0.0f;
            //ik.solver.rightLeg.legLengthMlp = 1.0f;

            //ik.solver.hasChest = false;
            //ik.solver.spine.chestGoalWeight = 0.0f;
            //ik.solver.spine.pelvisPositionWeight = 0.0f;
            //ik.solver.spine.pelvisRotationWeight = 0.0f;
            //ik.solver.spine.positionWeight = 1.0f;
            //ik.solver.spine.rotationWeight = 1.0f;
            //ik.solver.spine.minHeadHeight = 0.8f;
            //ik.solver.spine.bodyPosStiffness = 0.55f;
            //ik.solver.spine.bodyRotStiffness = 0.1f;
            //ik.solver.spine.neckStiffness = 0.3f;
            //ik.solver.spine.rotateChestByHands = 1.0f;
            //ik.solver.spine.chestClampWeight = 0.5f;
            //ik.solver.spine.headClampWeight = 0.6f;
            //ik.solver.spine.moveBodyBackWhenCrouching = 0.5f;
            //ik.solver.spine.maintainPelvisPosition = 0.2f;
            //ik.solver.spine.maxRootAngle = 25.0f;

            //ik.solver.leftArm.positionWeight = 1.0f;
            //ik.solver.leftArm.rotationWeight = 1.0f;
            //ik.solver.leftArm.shoulderRotationMode = IKSolverVR.Arm.ShoulderRotationMode.YawPitch;
            //ik.solver.leftArm.shoulderRotationWeight = 0.5f;
            //ik.solver.leftArm.shoulderTwistWeight = 1.0f;
            //ik.solver.leftArm.bendGoalWeight = 0.0f;
            //ik.solver.leftArm.swivelOffset = 20.0f;
            //ik.solver.leftArm.armLengthMlp = 1.0f;

            //ik.solver.rightArm.positionWeight = 1.0f;
            //ik.solver.rightArm.rotationWeight = 1.0f;
            //ik.solver.rightArm.shoulderRotationMode = IKSolverVR.Arm.ShoulderRotationMode.YawPitch;
            //ik.solver.rightArm.shoulderRotationWeight = 0.5f;
            //ik.solver.rightArm.shoulderTwistWeight = 1.0f;
            //ik.solver.rightArm.bendGoalWeight = 0.0f;
            //ik.solver.rightArm.swivelOffset = 20.0f;
            //ik.solver.rightArm.armLengthMlp = 1.0f;

            //IKSolverVR.Locomotion l = ik.solver.locomotion;
            //l.weight = 0.0f;
            //l.blockingEnabled = false;
            //l.blockingLayers = LayerMask.NameToLayer("Default");
            //l.footDistance = 0.3f;
            //l.stepThreshold = 0.35f;
            //l.angleThreshold = 60.0f;
            //l.comAngleMlp = 0.5f;
            //l.maxVelocity = 0.3f;
            //l.velocityFactor = 0.3f;
            //l.maxLegStretch = 0.98f;
            //l.rootSpeed = 20.0f;
            //l.stepSpeed = 2.8f;
            //l.relaxLegTwistMinAngle = 20.0f;
            //l.relaxLegTwistSpeed = 400.0f;
            //l.stepInterpolation = InterpolationMode.InOutSine;
            //l.offset = Vector3.zero;
            #endregion

            // Assign targets for the IK system
            //GameObject lHandTarget = new GameObject("LHand");
            //GameObject rHandTarget = new GameObject("RHand");
            GameObject pelvisTarget = new GameObject("Pelvis");
            //GameObject headTarget = new GameObject("HeadTarget");
            //GameObject lFootTarget = new GameObject("LFoot");
            //GameObject rFootTarget = new GameObject("RFoot");

            // Create an anchor object to hold the rep's gun
            gunParent = new GameObject("gunParent");
            gunParent.transform.parent        = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt/r_WristSHJnt/r_Hand_1SHJnt");
            gunParent.transform.localPosition = Vector3.zero;
            gunParent.transform.localRotation = Quaternion.identity;

            // If for whatever reason this is needed, show or hide the rep's body and hair
            root.transform.Find("geoGrp/brett_body").GetComponent <SkinnedMeshRenderer>().enabled = showBody;
            root.transform.Find("geoGrp/brett_hairCards").gameObject.SetActive(showHair);

            #region Unused Code
            // IK code?

            //ik.solver.leftArm.target = lHandTarget.transform;
            //ik.solver.rightArm.target = rHandTarget.transform;
            //ik.solver.spine.pelvisTarget = pelvisTarget.transform;
            //ik.solver.spine.headTarget = headTarget.transform;
            //ik.solver.leftLeg.target = lFootTarget.transform;
            //ik.solver.rightLeg.target = rFootTarget.transform;

            //footL = ik.solver.leftLeg.target.gameObject;
            //footR = ik.solver.rightLeg.target.gameObject;

            //head = headTarget;
            //handL = lHandTarget;
            //handR = rHandTarget;
            //pelvis = pelvisTarget;
            #endregion

            // Assign the transforms for the rep
            rigTransforms = BWUtil.GetHumanoidRigTransforms(root);

            // Grab these body parts from the rigTransforms
            head   = rigTransforms.neck.gameObject;
            handL  = rigTransforms.lWrist.gameObject;
            handR  = rigTransforms.rWrist.gameObject;
            pelvis = rigTransforms.spine1.gameObject;

            // Create the nameplate and assign values to the TMP's vars
            namePlate = new GameObject("Nameplate");
            TextMeshPro tm = namePlate.AddComponent <TextMeshPro>();
            tm.text      = name;
            tm.color     = UnityEngine.Color.green;
            tm.alignment = TextAlignmentOptions.Center;
            tm.fontSize  = 1.0f;

            // Prevents the nameplate from being destroyed during a level change
            DontDestroyOnLoad(namePlate);

            MelonCoroutines.Start(AsyncAvatarRoutine(steamId));

            // Gives certain users special appearances
            Extras.SpecialUsers.GiveUniqueAppearances(steamId, realRoot, tm);

            // Change the shader to the one that's already used in the game
            // Without this, the player model will only show in one eye
            foreach (SkinnedMeshRenderer smr in ford.GetComponentsInChildren <SkinnedMeshRenderer>())
            {
                foreach (Material m in smr.sharedMaterials)
                {
                    m.shader = Shader.Find("Valve/vr_standard");
                }
            }
            foreach (MeshRenderer smr in ford.GetComponentsInChildren <MeshRenderer>())
            {
                foreach (Material m in smr.sharedMaterials)
                {
                    m.shader = Shader.Find("Valve/vr_standard");
                }
            }

#if DEBUG
            zCubed.Accessories.Accessory.CreateDummies(realRoot.parent);
#endif

            this.ford = ford;

            #region Unused Code
            // More IK stuff?

            //lArm = ik.solver.leftArm;
            //rArm = ik.solver.rightArm;
            //spine = ik.solver.spine;
            #endregion
        }
Exemplo n.º 11
0
        public void Update()
        {
            if (SceneLoader.loading)
            {
                return;
            }

            //if (localHead != null)
            //{
            //    PlayerPositionMessage ppm = new PlayerPositionMessage
            //    {
            //        headPos = localHead.transform.position,
            //        lHandPos = localHandL.transform.position,
            //        rHandPos = localHandR.transform.position,
            //        pelvisPos = localPelvis.transform.position,
            //        lFootPos = localFootL.transform.position,
            //        rFootPos = localFootR.transform.position,

            //        headRot = localHead.transform.rotation,
            //        lHandRot = localHandL.transform.rotation,
            //        rHandRot = localHandR.transform.rotation,
            //        pelvisRot = localPelvis.transform.rotation,
            //        lFootRot = localFootL.transform.rotation,
            //        rFootRot = localFootR.transform.rotation
            //    };

            //    SendToServer(ppm, P2PSend.Unreliable);

            //    foreach (PlayerRep pr in playerObjects.Values)
            //    {
            //        pr.UpdateNameplateFacing(Camera.current.transform);
            //    }
            //}
            //else if (enableFullRig)
            {
                if (localRigTransforms.main == null)
                {
                    SetLocalRigTransforms(BWUtil.GetLocalRigTransforms());
                }

                if (localRigTransforms.main != null)
                {
                    FullRigTransformMessage frtm = new FullRigTransformMessage
                    {
                        posMain   = localRigTransforms.main.position,
                        posRoot   = localRigTransforms.root.position,
                        posLHip   = localRigTransforms.lHip.position,
                        posRHip   = localRigTransforms.rHip.position,
                        posLKnee  = localRigTransforms.lKnee.position,
                        posRKnee  = localRigTransforms.rKnee.position,
                        posLAnkle = localRigTransforms.lAnkle.position,
                        posRAnkle = localRigTransforms.rAnkle.position,

                        posSpine1    = localRigTransforms.spine1.position,
                        posSpine2    = localRigTransforms.spine2.position,
                        posSpineTop  = localRigTransforms.spineTop.position,
                        posLClavicle = localRigTransforms.lClavicle.position,
                        posRClavicle = localRigTransforms.rClavicle.position,
                        posNeck      = localRigTransforms.neck.position,
                        posLShoulder = localRigTransforms.lShoulder.position,
                        posRShoulder = localRigTransforms.rShoulder.position,
                        posLElbow    = localRigTransforms.lElbow.position,
                        posRElbow    = localRigTransforms.rElbow.position,
                        posLWrist    = localRigTransforms.lWrist.position,
                        posRWrist    = localRigTransforms.rWrist.position,

                        rotMain      = localRigTransforms.main.rotation,
                        rotRoot      = localRigTransforms.root.rotation,
                        rotLHip      = localRigTransforms.lHip.rotation,
                        rotRHip      = localRigTransforms.rHip.rotation,
                        rotLKnee     = localRigTransforms.lKnee.rotation,
                        rotRKnee     = localRigTransforms.rKnee.rotation,
                        rotLAnkle    = localRigTransforms.lAnkle.rotation,
                        rotRAnkle    = localRigTransforms.rAnkle.rotation,
                        rotSpine1    = localRigTransforms.spine1.rotation,
                        rotSpine2    = localRigTransforms.spine2.rotation,
                        rotSpineTop  = localRigTransforms.spineTop.rotation,
                        rotLClavicle = localRigTransforms.lClavicle.rotation,
                        rotRClavicle = localRigTransforms.rClavicle.rotation,
                        rotNeck      = localRigTransforms.neck.rotation,
                        rotLShoulder = localRigTransforms.lShoulder.rotation,
                        rotRShoulder = localRigTransforms.rShoulder.rotation,
                        rotLElbow    = localRigTransforms.lElbow.rotation,
                        rotRElbow    = localRigTransforms.rElbow.rotation,
                        rotLWrist    = localRigTransforms.lWrist.rotation,
                        rotRWrist    = localRigTransforms.rWrist.rotation
                    };

                    SendToServer(frtm, MessageSendType.Unreliable);

                    foreach (PlayerRep pr in playerObjects.Values)
                    {
                        pr.UpdateNameplateFacing(Camera.current.transform);
                    }
                }
            }
        }
Exemplo n.º 12
0
        // Constructor
        public PlayerRep(string name, SteamId steamId)
        {
            this.steamId = steamId;

            // Create this player's "Ford" to represent them, known as their rep
            GameObject ford = Instantiate(fordBundle.LoadAsset("Assets/Ford.prefab").Cast <GameObject>());

            // Makes sure that the rep isn't destroyed per level change.
            DontDestroyOnLoad(ford);

            ImpactPropertiesManager bloodManager = ford.AddComponent <ImpactPropertiesManager>();

            bloodManager.material              = ImpactPropertiesVariables.Material.Blood;
            bloodManager.modelType             = ImpactPropertiesVariables.ModelType.Skinned;
            bloodManager.MainColor             = UnityEngine.Color.red;
            bloodManager.SecondaryColor        = UnityEngine.Color.red;
            bloodManager.PenetrationResistance = 0.8f;
            bloodManager.megaPascalModifier    = 1;
            bloodManager.FireResistance        = 100;
            Collider[] colliders = ford.GetComponentsInChildren <Collider>();
            foreach (Collider c in colliders)
            {
                ImpactProperties blood = c.gameObject.AddComponent <ImpactProperties>();
                blood.material              = ImpactPropertiesVariables.Material.Blood;
                blood.modelType             = ImpactPropertiesVariables.ModelType.Skinned;
                blood.MainColor             = UnityEngine.Color.red;
                blood.SecondaryColor        = UnityEngine.Color.red;
                blood.PenetrationResistance = 0.8f;
                blood.megaPascalModifier    = 1;
                blood.FireResistance        = 100;
                blood.MyCollider            = c;
                blood.hasManager            = true;
                blood.Manager = bloodManager;
            }

            GameObject root = ford.transform.Find("Ford/Brett@neutral").gameObject; // Get the rep's head

            faceAnimator          = new FaceAnimator();
            faceAnimator.animator = root.GetComponent <Animator>();
            faceAnimator.faceTime = 10;

            Transform realRoot = root.transform.Find("SHJntGrp/MAINSHJnt/ROOTSHJnt"); // Then get the head's root joint


            // Assign targets for the IK system
            GameObject pelvisTarget = new GameObject("Pelvis");

            // Create an anchor object to hold the rep's gun
            gunRParent = new GameObject("gunRParent");
            gunRParent.transform.parent           = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt/r_WristSHJnt/r_Hand_1SHJnt");
            gunRParent.transform.localPosition    = new Vector3(0.0758f, -0.0459f, -0.0837f);
            gunRParent.transform.localEulerAngles = new Vector3(2.545f, -251.689f, 149.121f);

            GameObject              rig        = Player.FindRigManager();
            PopUpMenuView           menu       = rig.GetComponentInChildren <PopUpMenuView>();
            GameObject              spawnGun   = menu.utilityGunSpawnable.prefab;
            SpawnableMasterListData masterList = spawnGun.GetComponent <SpawnGun>().masterList;

            rightGun = Instantiate(masterList.objects[BWUtil.gunOffset].prefab.transform.Find("Physics/Root/Gun").gameObject);
            rightGun.GetComponent <Rigidbody>().isKinematic = true;
            rightGun.transform.parent        = gunRParent.transform;
            rightGun.transform.localPosition = Vector3.zero;
            rightGun.transform.localRotation = Quaternion.identity;
            rightGunScript = rightGun.GetComponent <Gun>();
            rightGunScript.proxyOverride   = null;
            rightBulletObject              = rightGunScript.overrideMagazine.AmmoSlots[0];
            rightGunScript.roundsPerMinute = 20000;
            rightGunScript.roundsPerSecond = 333;
            GameObject.Destroy(rightGun.GetComponent <ConfigurableJoint>());
            GameObject.Destroy(rightGun.GetComponent <ImpactProperties>());
            GameObject.Destroy(rightGun.transform.Find("attachment_Lazer_Omni").gameObject);

            // Create an anchor object to hold the rep's gun
            gunLParent = new GameObject("gunLParent");
            gunLParent.transform.parent           = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/l_Arm_ClavicleSHJnt/l_AC_AuxSHJnt/l_Arm_ShoulderSHJnt/l_Arm_Elbow_CurveSHJnt/l_WristSHJnt/l_Hand_1SHJnt");
            gunLParent.transform.localPosition    = new Vector3(-0.0941f, 0.0452f, 0.0945f);
            gunLParent.transform.localEulerAngles = new Vector3(3.711f, -81.86301f, -157.739f);

            leftGun = Instantiate(masterList.objects[BWUtil.gunOffset].prefab.transform.Find("Physics/Root/Gun").gameObject);
            leftGun.GetComponent <Rigidbody>().isKinematic = true;
            leftGun.transform.parent        = gunLParent.transform;
            leftGun.transform.localPosition = Vector3.zero;
            leftGun.transform.localRotation = Quaternion.identity;
            leftGunScript = leftGun.GetComponent <Gun>();
            leftGunScript.proxyOverride = null;
            leftBulletObject            = leftGunScript.overrideMagazine.AmmoSlots[0];
            GameObject.Destroy(leftGun.GetComponent <ConfigurableJoint>());
            GameObject.Destroy(leftGun.transform.Find("attachment_Lazer_Omni").gameObject);
            GameObject.Destroy(leftGun.GetComponent <ImpactProperties>());

            foreach (var renderer in gunLParent.GetComponentsInChildren <Renderer>())
            {
                renderer.enabled = false;
            }

            foreach (var renderer in gunRParent.GetComponentsInChildren <Renderer>())
            {
                renderer.enabled = false;
            }

            foreach (var col in gunLParent.GetComponentsInChildren <Collider>())
            {
                Destroy(col);
            }

            foreach (var col in gunRParent.GetComponentsInChildren <Collider>())
            {
                Destroy(col);
            }

            // If for whatever reason this is needed, show or hide the rep's body and hair
            root.transform.Find("geoGrp/brett_body").GetComponent <SkinnedMeshRenderer>().enabled = showBody;
            //root.transform.Find("geoGrp/brett_hairCards").gameObject.SetActive(showHair);

            // Assign the transforms for the rep
            rigTransforms = BWUtil.GetHumanoidRigTransforms(root);

            // Grab these body parts from the rigTransforms
            head   = rigTransforms.neck.gameObject;
            handL  = rigTransforms.lWrist.gameObject;
            handR  = rigTransforms.rWrist.gameObject;
            pelvis = rigTransforms.spine1.gameObject;

            // Create the nameplate and assign values to the TMP's vars
            namePlate = new GameObject("Nameplate");
            TextMeshPro tm = namePlate.AddComponent <TextMeshPro>();

            tm.text      = name;
            tm.color     = UnityEngine.Color.green;
            tm.alignment = TextAlignmentOptions.Center;
            tm.fontSize  = 1.0f;

            // Prevents the nameplate from being destroyed during a level change
            DontDestroyOnLoad(namePlate);

            MelonCoroutines.Start(AsyncAvatarRoutine(steamId));

            // Gives certain users special appearances
            Extras.SpecialUsers.GiveUniqueAppearances(steamId, realRoot, tm);

            this.ford = ford;
        }
Exemplo n.º 13
0
        // Constructor
        public PlayerRep(string name, SteamId steamId)
        {
            this.steamId = steamId;

            // Create this player's "Ford" to represent them, known as their rep
            GameObject ford = Instantiate(fordBundle.LoadAsset("Assets/Ford.prefab").Cast <GameObject>());

            // Makes sure that the rep isn't destroyed per level change.
            DontDestroyOnLoad(ford);


            GameObject root     = ford.transform.Find("Ford/Brett@neutral").gameObject; // Get the rep's head
            Transform  realRoot = root.transform.Find("SHJntGrp/MAINSHJnt/ROOTSHJnt");  // Then get the head's root joint


            // Assign targets for the IK system
            GameObject pelvisTarget = new GameObject("Pelvis");

            // Create an anchor object to hold the rep's gun
            gunParent = new GameObject("gunParent");
            gunParent.transform.parent        = realRoot.Find("Spine_01SHJnt/Spine_02SHJnt/Spine_TopSHJnt/r_Arm_ClavicleSHJnt/r_AC_AuxSHJnt/r_Arm_ShoulderSHJnt/r_Arm_Elbow_CurveSHJnt/r_WristSHJnt/r_Hand_1SHJnt");
            gunParent.transform.localPosition = Vector3.zero;
            gunParent.transform.localRotation = Quaternion.identity;

            // If for whatever reason this is needed, show or hide the rep's body and hair
            root.transform.Find("geoGrp/brett_body").GetComponent <SkinnedMeshRenderer>().enabled = showBody;
            root.transform.Find("geoGrp/brett_hairCards").gameObject.SetActive(showHair);

            // Assign the transforms for the rep
            rigTransforms = BWUtil.GetHumanoidRigTransforms(root);

            // Grab these body parts from the rigTransforms
            head   = rigTransforms.neck.gameObject;
            handL  = rigTransforms.lWrist.gameObject;
            handR  = rigTransforms.rWrist.gameObject;
            pelvis = rigTransforms.spine1.gameObject;

            // Create the nameplate and assign values to the TMP's vars
            namePlate = new GameObject("Nameplate");
            TextMeshPro tm = namePlate.AddComponent <TextMeshPro>();

            tm.text      = name;
            tm.color     = UnityEngine.Color.green;
            tm.alignment = TextAlignmentOptions.Center;
            tm.fontSize  = 1.0f;

            // Prevents the nameplate from being destroyed during a level change
            DontDestroyOnLoad(namePlate);

            MelonCoroutines.Start(AsyncAvatarRoutine(steamId));

            // Gives certain users special appearances
            Extras.SpecialUsers.GiveUniqueAppearances(steamId, realRoot, tm);

            // Change the shader to the one that's already used in the game
            // Without this, the player model will only show in one eye
            foreach (SkinnedMeshRenderer smr in ford.GetComponentsInChildren <SkinnedMeshRenderer>())
            {
                foreach (Material m in smr.sharedMaterials)
                {
                    m.shader = Shader.Find("Valve/vr_standard");
                }
            }
            foreach (MeshRenderer smr in ford.GetComponentsInChildren <MeshRenderer>())
            {
                foreach (Material m in smr.sharedMaterials)
                {
                    m.shader = Shader.Find("Valve/vr_standard");
                }
            }

#if DEBUG
            zCubed.Accessories.Accessory.CreateDummies(realRoot.parent);
#endif

            this.ford = ford;
        }
Exemplo n.º 14
0
        public void Update()
        {
            if (SceneLoader.loading)
            {
                return;
            }
            //ui.SetPlayerCount(players.Count);

            #region Unused Code
            //if (localHead != null && !enableFullRig)
            //{
            //    OtherPlayerPositionMessage oppm = new OtherPlayerPositionMessage
            //    {
            //        playerId = 0,
            //        headPos = localHead.transform.position,
            //        lHandPos = localHandL.transform.position,
            //        rHandPos = localHandR.transform.position,
            //        pelvisPos = localPelvis.transform.position,
            //        lFootPos = localFootL.transform.position,
            //        rFootPos = localFootR.transform.position,

            //        headRot = localHead.transform.rotation,
            //        lHandRot = localHandL.transform.rotation,
            //        rHandRot = localHandR.transform.rotation,
            //        pelvisRot = localPelvis.transform.rotation,
            //        lFootRot = localFootL.transform.rotation,
            //        rFootRot = localFootR.transform.rotation
            //    };

            //    ServerSendToAll(oppm, P2PSend.Unreliable);
            //}
            //else if(enableFullRig && localHead != null)
            #endregion

            if (localRigTransforms.main == null)
            {
                localRigTransforms = BWUtil.GetLocalRigTransforms();
            }

            if (localRigTransforms.main != null)
            {
                OtherFullRigTransformMessage ofrtm = new OtherFullRigTransformMessage
                {
                    playerId  = 0,
                    posMain   = localRigTransforms.main.position,
                    posRoot   = localRigTransforms.root.position,
                    posLHip   = localRigTransforms.lHip.position,
                    posRHip   = localRigTransforms.rHip.position,
                    posLKnee  = localRigTransforms.lKnee.position,
                    posRKnee  = localRigTransforms.rKnee.position,
                    posLAnkle = localRigTransforms.lAnkle.position,
                    posRAnkle = localRigTransforms.rAnkle.position,

                    posSpine1    = localRigTransforms.spine1.position,
                    posSpine2    = localRigTransforms.spine2.position,
                    posSpineTop  = localRigTransforms.spineTop.position,
                    posLClavicle = localRigTransforms.lClavicle.position,
                    posRClavicle = localRigTransforms.rClavicle.position,
                    posNeck      = localRigTransforms.neck.position,
                    posLShoulder = localRigTransforms.lShoulder.position,
                    posRShoulder = localRigTransforms.rShoulder.position,
                    posLElbow    = localRigTransforms.lElbow.position,
                    posRElbow    = localRigTransforms.rElbow.position,
                    posLWrist    = localRigTransforms.lWrist.position,
                    posRWrist    = localRigTransforms.rWrist.position,

                    rotMain      = localRigTransforms.main.rotation,
                    rotRoot      = localRigTransforms.root.rotation,
                    rotLHip      = localRigTransforms.lHip.rotation,
                    rotRHip      = localRigTransforms.rHip.rotation,
                    rotLKnee     = localRigTransforms.lKnee.rotation,
                    rotRKnee     = localRigTransforms.rKnee.rotation,
                    rotLAnkle    = localRigTransforms.lAnkle.rotation,
                    rotRAnkle    = localRigTransforms.rAnkle.rotation,
                    rotSpine1    = localRigTransforms.spine1.rotation,
                    rotSpine2    = localRigTransforms.spine2.rotation,
                    rotSpineTop  = localRigTransforms.spineTop.rotation,
                    rotLClavicle = localRigTransforms.lClavicle.rotation,
                    rotRClavicle = localRigTransforms.rClavicle.rotation,
                    rotNeck      = localRigTransforms.neck.rotation,
                    rotLShoulder = localRigTransforms.lShoulder.rotation,
                    rotRShoulder = localRigTransforms.rShoulder.rotation,
                    rotLElbow    = localRigTransforms.lElbow.rotation,
                    rotRElbow    = localRigTransforms.rElbow.rotation,
                    rotLWrist    = localRigTransforms.lWrist.rotation,
                    rotRWrist    = localRigTransforms.rWrist.rotation
                };

                ServerSendToAll(ofrtm, MessageSendType.Unreliable);
            }

            foreach (PlayerRep pr in playerObjects.Values)
            {
                pr.UpdateNameplateFacing(Camera.current.transform);
            }
            // Disabled temporarily
#if false
            {
                enemyPoolManager.FindMissingPools();
                Pool pool = enemyPoolManager.GetPool(EnemyType.NullBody);
                for (int i = 0; i < pool.transform.childCount; i++)
                {
                    GameObject childEnemy = pool.transform.GetChild(i).gameObject;

                    BoneworksRigTransforms brt = BWUtil.GetHumanoidRigTransforms(childEnemy.transform.Find("brettEnemy@neutral").gameObject);

                    EnemyRigTransformMessage ertf = new EnemyRigTransformMessage()
                    {
                        poolChildIdx = (byte)i,
                        enemyType    = EnemyType.NullBody,
                        posMain      = localRigTransforms.main.position,
                        posRoot      = localRigTransforms.root.position,
                        posLHip      = localRigTransforms.lHip.position,
                        posRHip      = localRigTransforms.rHip.position,
                        posLKnee     = localRigTransforms.lKnee.position,
                        posRKnee     = localRigTransforms.rKnee.position,
                        posLAnkle    = localRigTransforms.lAnkle.position,
                        posRAnkle    = localRigTransforms.rAnkle.position,

                        posSpine1    = localRigTransforms.spine1.position,
                        posSpine2    = localRigTransforms.spine2.position,
                        posSpineTop  = localRigTransforms.spineTop.position,
                        posLClavicle = localRigTransforms.lClavicle.position,
                        posRClavicle = localRigTransforms.rClavicle.position,
                        posNeck      = localRigTransforms.neck.position,
                        posLShoulder = localRigTransforms.lShoulder.position,
                        posRShoulder = localRigTransforms.rShoulder.position,
                        posLElbow    = localRigTransforms.lElbow.position,
                        posRElbow    = localRigTransforms.rElbow.position,
                        posLWrist    = localRigTransforms.lWrist.position,
                        posRWrist    = localRigTransforms.rWrist.position,

                        rotMain      = localRigTransforms.main.rotation,
                        rotRoot      = localRigTransforms.root.rotation,
                        rotLHip      = localRigTransforms.lHip.rotation,
                        rotRHip      = localRigTransforms.rHip.rotation,
                        rotLKnee     = localRigTransforms.lKnee.rotation,
                        rotRKnee     = localRigTransforms.rKnee.rotation,
                        rotLAnkle    = localRigTransforms.lAnkle.rotation,
                        rotRAnkle    = localRigTransforms.rAnkle.rotation,
                        rotSpine1    = localRigTransforms.spine1.rotation,
                        rotSpine2    = localRigTransforms.spine2.rotation,
                        rotSpineTop  = localRigTransforms.spineTop.rotation,
                        rotLClavicle = localRigTransforms.lClavicle.rotation,
                        rotRClavicle = localRigTransforms.rClavicle.rotation,
                        rotNeck      = localRigTransforms.neck.rotation,
                        rotLShoulder = localRigTransforms.lShoulder.rotation,
                        rotRShoulder = localRigTransforms.rShoulder.rotation,
                        rotLElbow    = localRigTransforms.lElbow.rotation,
                        rotRElbow    = localRigTransforms.rElbow.rotation,
                        rotLWrist    = localRigTransforms.lWrist.rotation,
                        rotRWrist    = localRigTransforms.rWrist.rotation
                    };

                    ServerSendToAll(ertf, P2PSend.UnreliableNoDelay);
                }
            }
#endif
        }
Exemplo n.º 15
0
        private void TransportLayer_OnMessageReceived(ITransportConnection connection, P2PMessage msg)
        {
            MessageType type = (MessageType)msg.ReadByte();

            switch (type)
            {
            case MessageType.Join:
            {
                if (msg.ReadByte() != MultiplayerMod.PROTOCOL_VERSION)
                {
                    // Somebody tried to join with an incompatible verison
                    P2PMessage m2 = new P2PMessage();
                    m2.WriteByte((byte)MessageType.JoinRejected);
                    connection.SendMessage(m2, MessageSendType.Reliable);
                    connection.Disconnect();
                }
                else
                {
                    MelonModLogger.Log("Player joined with ID: " + connection.ConnectedTo);
                    players.Add(connection.ConnectedTo);
                    MelonModLogger.Log("Player count: " + players.Count);
                    byte newPlayerId = smallIdCounter;
                    smallPlayerIds.Add(connection.ConnectedTo, newPlayerId);
                    largePlayerIds.Add(newPlayerId, connection.ConnectedTo);
                    smallIdCounter++;

                    playerConnections.Add(connection.ConnectedTo, connection);

                    string name = msg.ReadUnicodeString();
                    MelonModLogger.Log("Name: " + name);

                    foreach (var smallId in playerNames.Keys)
                    {
                        ClientJoinMessage cjm = new ClientJoinMessage
                        {
                            playerId = smallId,
                            name     = playerNames[smallId],
                            steamId  = largePlayerIds[smallId]
                        };
                        connection.SendMessage(cjm.MakeMsg(), MessageSendType.Reliable);
                    }

                    ClientJoinMessage cjm2 = new ClientJoinMessage
                    {
                        playerId = 0,
                        name     = SteamClient.Name,
                        steamId  = SteamClient.SteamId
                    };
                    connection.SendMessage(cjm2.MakeMsg(), MessageSendType.Reliable);

                    playerNames.Add(newPlayerId, name);

                    ClientJoinMessage cjm3 = new ClientJoinMessage
                    {
                        playerId = newPlayerId,
                        name     = name,
                        steamId  = connection.ConnectedTo
                    };
                    ServerSendToAllExcept(cjm3, MessageSendType.Reliable, connection.ConnectedTo);

                    playerObjects.Add(newPlayerId, new PlayerRep(name, connection.ConnectedTo));

                    RichPresence.SetActivity(
                        new Activity()
                        {
                            Details = "Hosting a server",
                            Secrets = new ActivitySecrets()
                            {
                                Join = SteamClient.SteamId.ToString()
                            },
                            Party = new ActivityParty()
                            {
                                Id   = partyId,
                                Size = new PartySize()
                                {
                                    CurrentSize = players.Count + 1,
                                    MaxSize     = MultiplayerMod.MAX_PLAYERS
                                }
                            }
                        });

                    SceneTransitionMessage stm = new SceneTransitionMessage()
                    {
                        sceneName = BoneworksSceneManager.GetCurrentSceneName()
                    };
                    connection.SendMessage(stm.MakeMsg(), MessageSendType.Reliable);

                    SetPartyIdMessage spid = new SetPartyIdMessage()
                    {
                        partyId = partyId
                    };
                    connection.SendMessage(spid.MakeMsg(), MessageSendType.Reliable);

                    ui.SetPlayerCount(players.Count, MultiplayerUIState.Server);
                }
                break;
            }

            case MessageType.Disconnect:
            {
                MelonModLogger.Log("Player left with ID: " + connection.ConnectedTo);
                byte smallId = smallPlayerIds[connection.ConnectedTo];

                playerObjects[smallId].Destroy();
                playerObjects.Remove(smallId);
                players.RemoveAll((ulong val) => val == connection.ConnectedTo);
                smallPlayerIds.Remove(connection.ConnectedTo);

                P2PMessage disconnectMsg = new P2PMessage();
                disconnectMsg.WriteByte((byte)MessageType.Disconnect);
                disconnectMsg.WriteByte(smallId);

                foreach (SteamId p in players)
                {
                    playerConnections[p].SendMessage(disconnectMsg, MessageSendType.Reliable);
                }
                break;
            }
            //case MessageType.PlayerPosition:
            //    {
            //        if (smallPlayerIds.ContainsKey(packet.Value.SteamId))
            //        {
            //            byte playerId = smallPlayerIds[packet.Value.SteamId];
            //            PlayerRep pr = GetPlayerRep(playerId);

            //            PlayerPositionMessage ppm = new PlayerPositionMessage(msg);
            //            pr.head.transform.position = ppm.headPos;
            //            pr.handL.transform.position = ppm.lHandPos;
            //            pr.handR.transform.position = ppm.rHandPos;
            //            pr.ford.transform.position = ppm.pelvisPos - new Vector3(0.0f, 0.3f, 0.0f);
            //            pr.pelvis.transform.position = ppm.pelvisPos;
            //            pr.footL.transform.position = ppm.lFootPos;
            //            pr.footR.transform.position = ppm.rFootPos;

            //            //pr.ford.transform.rotation = ppm.pelvisRot;
            //            pr.head.transform.rotation = ppm.headRot;
            //            pr.handL.transform.rotation = ppm.lHandRot;
            //            pr.handR.transform.rotation = ppm.rHandRot;
            //            pr.pelvis.transform.rotation = ppm.pelvisRot;
            //            pr.footL.transform.rotation = ppm.lFootRot;
            //            pr.footR.transform.rotation = ppm.rFootRot;

            //            // Send to all other players

            //            OtherPlayerPositionMessage relayOPPM = new OtherPlayerPositionMessage
            //            {
            //                headPos = ppm.headPos,
            //                lHandPos = ppm.lHandPos,
            //                rHandPos = ppm.rHandPos,
            //                pelvisPos = ppm.pelvisPos,
            //                lFootPos = ppm.lFootPos,
            //                rFootPos = ppm.rFootPos,

            //                headRot = ppm.headRot,
            //                lHandRot = ppm.lHandRot,
            //                rHandRot = ppm.rHandRot,
            //                pelvisRot = ppm.pelvisRot,
            //                lFootRot = ppm.lFootRot,
            //                rFootRot = ppm.rFootRot,
            //                playerId = smallPlayerIds[packet.Value.SteamId]
            //            };

            //            ServerSendToAllExcept(relayOPPM, P2PSend.Unreliable, packet.Value.SteamId);
            //        }
            //        break;
            //    }
            case MessageType.FullRig:
            {
                FullRigTransformMessage frtm = new FullRigTransformMessage(msg);

                byte playerId = smallPlayerIds[connection.ConnectedTo];
                if (playerObjects.ContainsKey(playerId))
                {
                    PlayerRep pr = playerObjects[playerId];

                    if (pr.rigTransforms.main != null)
                    {
                        //ApplyTransformMessage(pr, frtm);
                        pr.ApplyTransformMessage(frtm);

                        OtherFullRigTransformMessage ofrtm = new OtherFullRigTransformMessage
                        {
                            playerId = playerId,

                            posMain   = frtm.posMain,
                            posRoot   = frtm.posRoot,
                            posLHip   = frtm.posLHip,
                            posRHip   = frtm.posRHip,
                            posLKnee  = frtm.posLKnee,
                            posRKnee  = frtm.posRKnee,
                            posLAnkle = frtm.posLAnkle,
                            posRAnkle = frtm.posRAnkle,

                            posSpine1    = frtm.posSpine1,
                            posSpine2    = frtm.posSpine2,
                            posSpineTop  = frtm.posSpineTop,
                            posLClavicle = frtm.posLClavicle,
                            posRClavicle = frtm.posRClavicle,
                            posNeck      = frtm.posNeck,
                            posLShoulder = frtm.posLShoulder,
                            posRShoulder = frtm.posRShoulder,
                            posLElbow    = frtm.posLElbow,
                            posRElbow    = frtm.posRElbow,
                            posLWrist    = frtm.posLWrist,
                            posRWrist    = frtm.posRWrist,

                            rotMain      = frtm.rotMain,
                            rotRoot      = frtm.rotRoot,
                            rotLHip      = frtm.rotLHip,
                            rotRHip      = frtm.rotRHip,
                            rotLKnee     = frtm.rotLKnee,
                            rotRKnee     = frtm.rotRKnee,
                            rotLAnkle    = frtm.rotLAnkle,
                            rotRAnkle    = frtm.rotRAnkle,
                            rotSpine1    = frtm.rotSpine1,
                            rotSpine2    = frtm.rotSpine2,
                            rotSpineTop  = frtm.rotSpineTop,
                            rotLClavicle = frtm.rotLClavicle,
                            rotRClavicle = frtm.rotRClavicle,
                            rotNeck      = frtm.rotNeck,
                            rotLShoulder = frtm.rotLShoulder,
                            rotRShoulder = frtm.rotRShoulder,
                            rotLElbow    = frtm.rotLElbow,
                            rotRElbow    = frtm.rotRElbow,
                            rotLWrist    = frtm.rotLWrist,
                            rotRWrist    = frtm.rotRWrist
                        };

                        ServerSendToAllExcept(ofrtm, MessageSendType.Unreliable, connection.ConnectedTo);
                    }
                }
                break;
            }

            case MessageType.HandGunChange:
            {
                HandGunChangeMessage hgcm = new HandGunChangeMessage(msg, false)
                {
                    playerId         = smallPlayerIds[connection.ConnectedTo],
                    isForOtherPlayer = false
                };

                MelonModLogger.Log("Got HGC: " + hgcm.type.ToString() + ", destroy: " + hgcm.destroy.ToString());

                if (hgcm.destroy)
                {
                    Destroy(playerObjects[smallPlayerIds[connection.ConnectedTo]].currentGun);
                }
                else
                {
                    MelonModLogger.Log("Spawning " + hgcm.type.ToString());
                    PlayerRep pr = playerObjects[smallPlayerIds[connection.ConnectedTo]];
                    pr.currentGun = BWUtil.SpawnGun(hgcm.type);
                    if (pr.currentGun == null)
                    {
                        MelonModLogger.LogError("Failed to spawn gun");
                    }
                    pr.currentGun.transform.parent        = pr.gunParent.transform;
                    pr.currentGun.transform.localPosition = Vector3.zero;
                    pr.currentGun.transform.localRotation = Quaternion.identity;        //Quaternion.AngleAxis(90.0f, new Vector3(0.0f, 1.0f, 0.0f)) * Quaternion.AngleAxis(90.0f, new Vector3(1.0f, 0.0f, 0.0f));
                    pr.currentGun.GetComponentInChildren <Rigidbody>().isKinematic = true;
                }

                hgcm.isForOtherPlayer = true;
                ServerSendToAllExcept(hgcm, MessageSendType.Reliable, connection.ConnectedTo);
                break;
            }

            default:
                MelonModLogger.Log("Unknown message type: " + type.ToString());
                break;
            }
        }
Exemplo n.º 16
0
 private void SetupPlayerReferences()
 {
     localRigTransforms = BWUtil.GetLocalRigTransforms();
     localHealth        = BWUtil.RigManager.GetComponent <Player_Health>();
 }
Exemplo n.º 17
0
 // Applies the information recieved from the Transform packet
 public void ApplyTransformMessage <T>(T tfMsg) where T : RigTFMsgBase
 {
     BWUtil.ApplyRigTransform(rigTransforms, tfMsg);
 }
Exemplo n.º 18
0
        private void TransportLayer_OnMessageReceived(ITransportConnection arg1, P2PMessage msg)
        {
            MessageType type = (MessageType)msg.ReadByte();

            switch (type)
            {
            case MessageType.OtherPlayerPosition:
            {
                OtherPlayerPositionMessage oppm = new OtherPlayerPositionMessage(msg);

                if (playerObjects.ContainsKey(oppm.playerId))
                {
                    PlayerRep pr = GetPlayerRep(oppm.playerId);

                    pr.head.transform.position   = oppm.headPos;
                    pr.handL.transform.position  = oppm.lHandPos;
                    pr.handR.transform.position  = oppm.rHandPos;
                    pr.pelvis.transform.position = oppm.pelvisPos;
                    pr.ford.transform.position   = oppm.pelvisPos - new Vector3(0.0f, 0.3f, 0.0f);
                    pr.footL.transform.position  = oppm.lFootPos;
                    pr.footR.transform.position  = oppm.rFootPos;

                    pr.head.transform.rotation   = oppm.headRot;
                    pr.handL.transform.rotation  = oppm.lHandRot;
                    pr.handR.transform.rotation  = oppm.rHandRot;
                    pr.pelvis.transform.rotation = oppm.pelvisRot;
                    pr.footL.transform.rotation  = oppm.lFootRot;
                    pr.footR.transform.rotation  = oppm.rFootRot;
                }

                break;
            }

            case MessageType.OtherFullRig:
            {
                OtherFullRigTransformMessage ofrtm = new OtherFullRigTransformMessage(msg);
                byte playerId = ofrtm.playerId;

                if (playerObjects.ContainsKey(ofrtm.playerId))
                {
                    PlayerRep pr = GetPlayerRep(playerId);

                    pr.ApplyTransformMessage(ofrtm);
                }
                break;
            }

            case MessageType.ServerShutdown:
            {
                foreach (PlayerRep pr in playerObjects.Values)
                {
                    pr.Destroy();
                }
                break;
            }

            case MessageType.Disconnect:
            {
                byte pid = msg.ReadByte();
                playerObjects[pid].Destroy();
                playerObjects.Remove(pid);
                largePlayerIds.Remove(pid);
                playerNames.Remove(pid);
                break;
            }

            case MessageType.JoinRejected:
            {
                MelonModLogger.LogError("Join rejected - you are using an incompatible version of the mod!");
                Disconnect();
                break;
            }

            case MessageType.SceneTransition:
            {
                SceneTransitionMessage stm = new SceneTransitionMessage(msg);
                if (BoneworksSceneManager.GetCurrentSceneName() != stm.sceneName)
                {
                    BoneworksSceneManager.LoadScene(stm.sceneName);
                }
                break;
            }

            case MessageType.Join:
            {
                ClientJoinMessage cjm = new ClientJoinMessage(msg);
                largePlayerIds.Add(cjm.playerId, cjm.steamId);
                playerNames.Add(cjm.playerId, cjm.name);
                playerObjects.Add(cjm.playerId, new PlayerRep(cjm.name, cjm.steamId));
                break;
            }

            case MessageType.OtherHandGunChange:
            {
                HandGunChangeMessage hgcm = new HandGunChangeMessage(msg, true);

                if (hgcm.destroy)
                {
                    Destroy(playerObjects[hgcm.playerId].currentGun);
                }
                else
                {
                    PlayerRep pr = playerObjects[hgcm.playerId];
                    pr.currentGun = BWUtil.SpawnGun(hgcm.type);
                    pr.currentGun.transform.parent                       = pr.gunParent.transform;
                    pr.currentGun.transform.localPosition                = Vector3.zero;
                    pr.currentGun.transform.localEulerAngles             = new Vector3(0.0f, 0.0f, 90.0f);
                    pr.currentGun.GetComponent <Rigidbody>().isKinematic = true;
                }
                break;
            }

            case MessageType.SetPartyId:
            {
                SetPartyIdMessage spid = new SetPartyIdMessage(msg);
                RichPresence.SetActivity(
                    new Activity()
                    {
                        Details = "Connected to a server",
                        Secrets = new ActivitySecrets()
                        {
                            Join = ServerId.ToString()
                        },
                        Party = new ActivityParty()
                        {
                            Id   = spid.partyId,
                            Size = new PartySize()
                            {
                                CurrentSize = 1,
                                MaxSize     = MultiplayerMod.MAX_PLAYERS
                            }
                        }
                    });
                break;
            }

            case MessageType.EnemyRigTransform:
            {
                enemyPoolManager.FindMissingPools();
                EnemyRigTransformMessage ertm = new EnemyRigTransformMessage(msg);
                Pool pool = enemyPoolManager.GetPool(ertm.enemyType);
                // HORRID PERFORMANCE
                Transform              enemyTf = pool.transform.GetChild(ertm.poolChildIdx);
                GameObject             rootObj = enemyTf.Find("enemyBrett@neutral").gameObject;
                BoneworksRigTransforms brt     = BWUtil.GetHumanoidRigTransforms(rootObj);
                BWUtil.ApplyRigTransform(brt, ertm);
                break;
            }
            }
        }