summaryrefslogtreecommitdiff
path: root/Client/Assembly-CSharp/PlayerPhysics.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Client/Assembly-CSharp/PlayerPhysics.cs')
-rw-r--r--Client/Assembly-CSharp/PlayerPhysics.cs330
1 files changed, 330 insertions, 0 deletions
diff --git a/Client/Assembly-CSharp/PlayerPhysics.cs b/Client/Assembly-CSharp/PlayerPhysics.cs
new file mode 100644
index 0000000..c35e21d
--- /dev/null
+++ b/Client/Assembly-CSharp/PlayerPhysics.cs
@@ -0,0 +1,330 @@
+using System;
+using System.Collections;
+using System.Linq;
+using Assets.CoreScripts;
+using Hazel;
+using InnerNet;
+using PowerTools;
+using UnityEngine;
+
+public class PlayerPhysics : InnerNetObject
+{
+ public float TrueSpeed
+ {
+ get
+ {
+ return this.Speed * PlayerControl.GameOptions.PlayerSpeedMod;
+ }
+ }
+
+ public float TrueGhostSpeed
+ {
+ get
+ {
+ return this.GhostSpeed * PlayerControl.GameOptions.PlayerSpeedMod;
+ }
+ }
+
+ public float Speed = 4.5f;
+
+ public float GhostSpeed = 3f;
+
+ [HideInInspector]
+ private Rigidbody2D body;
+
+ [HideInInspector]
+ private SpriteAnim Animator;
+
+ [HideInInspector]
+ private SpriteRenderer rend;
+
+ [HideInInspector]
+ private PlayerControl myPlayer;
+
+ public AnimationClip RunAnim;
+
+ public AnimationClip IdleAnim;
+
+ public AnimationClip GhostIdleAnim;
+
+ public AnimationClip EnterVentAnim;
+
+ public AnimationClip ExitVentAnim;
+
+ public AnimationClip SpawnAnim;
+
+ public SkinLayer Skin;
+
+ private enum RpcCalls
+ {
+ EnterVent,
+ ExitVent
+ }
+
+ public void Awake()
+ {
+ this.body = base.GetComponent<Rigidbody2D>();
+ this.Animator = base.GetComponent<SpriteAnim>();
+ this.rend = base.GetComponent<SpriteRenderer>();
+ this.myPlayer = base.GetComponent<PlayerControl>();
+ }
+
+ private void FixedUpdate()
+ {
+ this.HandleAnimation();
+ if (base.AmOwner && this.myPlayer.CanMove && GameData.Instance)
+ {
+ DestroyableSingleton<Telemetry>.Instance.WritePosition(this.myPlayer.PlayerId, base.transform.position);
+ GameData.PlayerInfo data = this.myPlayer.Data;
+ if (data == null)
+ {
+ return;
+ }
+ bool isDead = data.IsDead;
+ this.body.velocity = DestroyableSingleton<HudManager>.Instance.joystick.Delta * (isDead ? this.TrueGhostSpeed : this.TrueSpeed);
+ }
+ }
+
+ private void LateUpdate()
+ {
+ Vector3 position = base.transform.position;
+ position.z = position.y / 1000f;
+ base.transform.position = position;
+ }
+
+ public Vector3 Vec2ToPosition(Vector2 pos)
+ {
+ return new Vector3(pos.x, pos.y, pos.y / 1000f);
+ }
+
+ public void SetSkin(uint skinId)
+ {
+ this.Skin.SetSkin(skinId);
+ if (this.Animator.IsPlaying(this.SpawnAnim))
+ {
+ this.Skin.SetSpawn(this.Animator.Time);
+ }
+ }
+
+ public void ResetAnim(bool stopCoroutines = true)
+ {
+ if (stopCoroutines)
+ {
+ this.myPlayer.StopAllCoroutines();
+ base.StopAllCoroutines();
+ }
+ base.enabled = true;
+ this.myPlayer.inVent = false;
+ this.myPlayer.Visible = true;
+ GameData.PlayerInfo data = this.myPlayer.Data;
+ if (data == null || !data.IsDead)
+ {
+ this.Skin.SetIdle();
+ this.Animator.Play(this.IdleAnim, 1f);
+ this.myPlayer.Visible = true;
+ this.myPlayer.SetHatAlpha(1f);
+ return;
+ }
+ this.Skin.SetGhost();
+ this.Animator.Play(this.GhostIdleAnim, 1f);
+ this.myPlayer.SetHatAlpha(0.5f);
+ }
+
+ private void HandleAnimation()
+ {
+ if (this.Animator.IsPlaying(this.SpawnAnim))
+ {
+ return;
+ }
+ if (!GameData.Instance)
+ {
+ return;
+ }
+ Vector2 velocity = this.body.velocity;
+ AnimationClip currentAnimation = this.Animator.GetCurrentAnimation();
+ GameData.PlayerInfo data = this.myPlayer.Data;
+ if (data == null)
+ {
+ return;
+ }
+ if (!data.IsDead)
+ {
+ if (velocity.sqrMagnitude >= 0.05f)
+ {
+ if (currentAnimation != this.RunAnim)
+ {
+ this.Animator.Play(this.RunAnim, 1f);
+ this.Skin.SetRun();
+ }
+ if (velocity.x < -0.01f)
+ {
+ this.rend.flipX = true;
+ }
+ else if (velocity.x > 0.01f)
+ {
+ this.rend.flipX = false;
+ }
+ }
+ else if (currentAnimation == this.RunAnim || currentAnimation == this.SpawnAnim || !currentAnimation)
+ {
+ this.Skin.SetIdle();
+ this.Animator.Play(this.IdleAnim, 1f);
+ this.myPlayer.SetHatAlpha(1f);
+ }
+ }
+ else
+ {
+ this.Skin.SetGhost();
+ if (currentAnimation != this.GhostIdleAnim)
+ {
+ this.Animator.Play(this.GhostIdleAnim, 1f);
+ this.myPlayer.SetHatAlpha(0.5f);
+ }
+ if (velocity.x < -0.01f)
+ {
+ this.rend.flipX = true;
+ }
+ else if (velocity.x > 0.01f)
+ {
+ this.rend.flipX = false;
+ }
+ }
+ this.Skin.Flipped = this.rend.flipX;
+ }
+
+ public IEnumerator CoSpawnPlayer(LobbyBehaviour lobby)
+ {
+ if (!lobby)
+ {
+ yield break;
+ }
+ Vector3 spawnPos = this.Vec2ToPosition(lobby.SpawnPositions[(int)this.myPlayer.PlayerId % lobby.SpawnPositions.Length]);
+ this.myPlayer.nameText.gameObject.SetActive(false);
+ this.myPlayer.Collider.enabled = false;
+ KillAnimation.SetMovement(this.myPlayer, false);
+ bool amFlipped = this.myPlayer.PlayerId > 4;
+ this.myPlayer.GetComponent<SpriteRenderer>().flipX = amFlipped;
+ this.myPlayer.transform.position = spawnPos;
+ SoundManager.Instance.PlaySound(lobby.SpawnSound, false, 1f).volume = 0.75f;
+ this.Skin.SetSpawn(0f);
+ this.Skin.Flipped = this.rend.flipX;
+ yield return new WaitForAnimationFinish(this.Animator, this.SpawnAnim);
+ base.transform.position = spawnPos + new Vector3(amFlipped ? -0.3f : 0.3f, -0.24f);
+ this.ResetAnim(false);
+ Vector2 b = (-spawnPos).normalized;
+ yield return this.WalkPlayerTo(spawnPos + b, 0.01f);
+ this.myPlayer.Collider.enabled = true;
+ KillAnimation.SetMovement(this.myPlayer, true);
+ this.myPlayer.nameText.gameObject.SetActive(true);
+ yield break;
+ }
+
+ public void ExitAllVents()
+ {
+ this.ResetAnim(true);
+ this.myPlayer.moveable = true;
+ Vent[] allVents = ShipStatus.Instance.AllVents;
+ for (int i = 0; i < allVents.Length; i++)
+ {
+ allVents[i].SetButtons(false);
+ }
+ }
+
+ private IEnumerator CoEnterVent(int id)
+ {
+ Vent vent = ShipStatus.Instance.AllVents.First((Vent v) => v.Id == id);
+ this.myPlayer.moveable = false;
+ yield return this.WalkPlayerTo(vent.transform.position, 0.01f);
+ vent.EnterVent();
+ this.Skin.SetEnterVent();
+ yield return new WaitForAnimationFinish(this.Animator, this.EnterVentAnim);
+ this.Skin.SetIdle();
+ this.Animator.Play(this.IdleAnim, 1f);
+ this.myPlayer.Visible = false;
+ this.myPlayer.inVent = true;
+ yield break;
+ }
+
+ private IEnumerator CoExitVent(int id)
+ {
+ Vent vent = ShipStatus.Instance.AllVents.First((Vent v) => v.Id == id);
+ this.myPlayer.Visible = true;
+ this.myPlayer.inVent = false;
+ vent.ExitVent();
+ this.Skin.SetExitVent();
+ yield return new WaitForAnimationFinish(this.Animator, this.ExitVentAnim);
+ this.Skin.SetIdle();
+ this.Animator.Play(this.IdleAnim, 1f);
+ this.myPlayer.moveable = true;
+ yield break;
+ }
+
+ // 移动位置
+ public IEnumerator WalkPlayerTo(Vector2 worldPos, float tolerance = 0.01f)
+ {
+ worldPos -= base.GetComponent<CircleCollider2D>().offset;
+ Rigidbody2D body = this.body;
+ do
+ {
+ Vector2 vector2;
+ Vector2 vector = vector2 = worldPos - base.transform.position;
+ if (vector2.sqrMagnitude <= tolerance)
+ {
+ break;
+ }
+ float d = Mathf.Clamp(vector.magnitude * 2f, 0.01f, 1f);
+ body.velocity = vector.normalized * this.Speed * d;
+ yield return null;
+ }
+ while (body.velocity.magnitude >= 0.0001f);
+ body.velocity = Vector2.zero;
+ yield break;
+ }
+
+ public override bool Serialize(MessageWriter writer, bool initialState)
+ {
+ return false;
+ }
+
+ public override void Deserialize(MessageReader reader, bool initialState)
+ {
+ }
+
+ public void RpcEnterVent(int id)
+ {
+ if (AmongUsClient.Instance.AmClient)
+ {
+ base.StartCoroutine(this.CoEnterVent(id));
+ }
+ MessageWriter messageWriter = AmongUsClient.Instance.StartRpc(this.NetId, 0, SendOption.Reliable);
+ messageWriter.WritePacked(id);
+ messageWriter.EndMessage();
+ }
+
+ public void RpcExitVent(int id)
+ {
+ if (AmongUsClient.Instance.AmClient)
+ {
+ base.StartCoroutine(this.CoExitVent(id));
+ }
+ MessageWriter messageWriter = AmongUsClient.Instance.StartRpc(this.NetId, 1, SendOption.Reliable);
+ messageWriter.WritePacked(id);
+ messageWriter.EndMessage();
+ }
+
+ public override void HandleRpc(byte callId, MessageReader reader)
+ {
+ if (callId == 0)
+ {
+ int id = reader.ReadPackedInt32();
+ base.StartCoroutine(this.CoEnterVent(id));
+ return;
+ }
+ if (callId != 1)
+ {
+ return;
+ }
+ int id2 = reader.ReadPackedInt32();
+ base.StartCoroutine(this.CoExitVent(id2));
+ }
+}