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; }
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; } } }
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); }
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; }
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); }
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); } }
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}"); } }
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(); } } }
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; } }
// 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 }
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); } } } }
// 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; }
// 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; }
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 }
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; } }
private void SetupPlayerReferences() { localRigTransforms = BWUtil.GetLocalRigTransforms(); localHealth = BWUtil.RigManager.GetComponent <Player_Health>(); }
// Applies the information recieved from the Transform packet public void ApplyTransformMessage <T>(T tfMsg) where T : RigTFMsgBase { BWUtil.ApplyRigTransform(rigTransforms, tfMsg); }
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; } } }