diff options
author | chai <215380520@qq.com> | 2023-10-27 11:05:14 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2023-10-27 11:05:14 +0800 |
commit | 766cdff5ffa72b65d7f106658d1603f47739b2ba (patch) | |
tree | 34d7799a94dfa9be182825577583c0fa6dc935f7 /GameCode/NetworkPhysicsObject.cs |
+ init
Diffstat (limited to 'GameCode/NetworkPhysicsObject.cs')
-rw-r--r-- | GameCode/NetworkPhysicsObject.cs | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/GameCode/NetworkPhysicsObject.cs b/GameCode/NetworkPhysicsObject.cs new file mode 100644 index 0000000..9ffb4d6 --- /dev/null +++ b/GameCode/NetworkPhysicsObject.cs @@ -0,0 +1,248 @@ +using System.Collections.Generic; +using Photon.Pun; +using Sonigon; +using UnityEngine; + +public class NetworkPhysicsObject : MonoBehaviour, IPunObservable +{ + [Header("Sounds")] + public SoundEvent soundBoxImpact; + + public float soundPitchSemitone; + + private SoundParameterPitchSemitone soundParameterPitchSemitone = new SoundParameterPitchSemitone(); + + private SoundParameterIntensity soundParameterIntensity = new SoundParameterIntensity(); + + [Header("Settings")] + public PhotonView photonView; + + private Rigidbody2D rig2D; + + private Collider2D col; + + public int sendFreq = 5; + + private int currentFrame; + + private float lastTime; + + private List<ObjectSyncPackage> syncPackages = new List<ObjectSyncPackage>(); + + private float sinceCol; + + public float collisionThreshold; + + public float shakeAmount; + + public float maxShake; + + public float playerColThreshold = 1f; + + public float dmgAmount = 1f; + + public float forceAmount = 1f; + + private float sinceDealDMG; + + private List<Player> hitPlayers = new List<Player>(); + + public float speed = 100f; + + private float sinceRequest; + + private float sincePushed; + + public float bulletPushMultiplier = 1f; + + private Vector2 currentForceToSend; + + private Vector2 currentForcePos; + + private float sendForceRate = 0.1f; + + private float sendForceCounter; + + public float sleepThreshold = 1f; + + public void Awake() + { + soundParameterPitchSemitone.pitchSemitone = soundPitchSemitone; + currentFrame = Random.Range(0, sendFreq); + photonView = GetComponent<PhotonView>(); + col = GetComponent<Collider2D>(); + rig2D = GetComponent<Rigidbody2D>(); + } + + private void Update() + { + if (!photonView) + { + return; + } + sinceRequest += Time.deltaTime; + sinceDealDMG += Time.deltaTime; + sendForceCounter += Time.deltaTime; + if (sendForceCounter > sendForceRate) + { + _ = photonView.IsMine; + if (currentForceToSend != Vector2.zero) + { + photonView.RPC("RPCA_SendForce", photonView.Owner, currentForceToSend, currentForcePos); + sendForceCounter = 0f; + currentForceToSend = Vector2.zero; + } + } + if (syncPackages.Count > 0) + { + if (syncPackages[0].timeDelta > 0f) + { + syncPackages[0].timeDelta -= Time.deltaTime * 1.5f * (1f + (float)syncPackages.Count * 0.5f); + } + else + { + if (syncPackages.Count > 2) + { + syncPackages.RemoveAt(0); + } + rig2D.isKinematic = false; + base.transform.position = syncPackages[0].pos; + base.transform.rotation = Quaternion.LookRotation(Vector3.forward, syncPackages[0].rot); + rig2D.velocity = syncPackages[0].vel; + rig2D.angularVelocity = syncPackages[0].angularVel; + syncPackages.RemoveAt(0); + } + } + sinceCol += Time.deltaTime; + } + + public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) + { + currentFrame++; + if (stream.IsWriting) + { + if (currentFrame >= sendFreq) + { + currentFrame = 0; + stream.SendNext((Vector2)base.transform.position); + stream.SendNext((Vector2)base.transform.up); + stream.SendNext(rig2D.velocity); + stream.SendNext(rig2D.angularVelocity); + if (lastTime == 0f) + { + lastTime = Time.time; + } + stream.SendNext(Time.time - lastTime); + lastTime = Time.time; + } + } + else + { + ObjectSyncPackage objectSyncPackage = new ObjectSyncPackage(); + objectSyncPackage.pos = (Vector2)stream.ReceiveNext(); + objectSyncPackage.rot = (Vector2)stream.ReceiveNext(); + objectSyncPackage.vel = (Vector2)stream.ReceiveNext(); + objectSyncPackage.angularVel = (float)stream.ReceiveNext(); + objectSyncPackage.timeDelta = (float)stream.ReceiveNext(); + syncPackages.Add(objectSyncPackage); + } + } + + [PunRPC] + public void RPCA_Collide(Vector2 colForce) + { + soundParameterIntensity.intensity = colForce.magnitude; + SoundManager.Instance.PlayAtPosition(soundBoxImpact, SoundManager.Instance.GetTransform(), base.transform, soundParameterIntensity, soundParameterPitchSemitone); + GamefeelManager.instance.AddGameFeel(colForce); + } + + private void OnCollisionEnter2D(Collision2D collision) + { + if (photonView.IsMine && !(collision.contacts[0].normalImpulse < collisionThreshold) && !(sinceCol < 0.1f)) + { + sinceCol = 0f; + photonView.RPC("RPCA_Collide", RpcTarget.All, Mathf.Clamp(collision.contacts[0].normalImpulse, 0f, maxShake) * collision.contacts[0].normal * shakeAmount); + } + } + + private void OnPlayerCollision(Vector2 collision, CharacterData player) + { + if (!player.view.IsMine || sinceDealDMG < 1f) + { + return; + } + Vector3 vector = collision * dmgAmount; + if (!(vector.magnitude < playerColThreshold)) + { + float num = Mathf.Pow(rig2D.mass / 20000f, 2f); + float num2 = Mathf.Pow(rig2D.mass / 20000f, 0.5f); + player.healthHandler.CallTakeDamage(vector * 0.3f * num, player.transform.position); + player.healthHandler.CallTakeForce(collision * forceAmount * num2, ForceMode2D.Impulse, forceIgnoreMass: false, ignoreBlock: false, vector.magnitude * 0.05f); + if (player.block.IsBlocking()) + { + rig2D.velocity *= -1.1f; + rig2D.angularVelocity *= -1.1f; + } + else if (rig2D.mass < 80000f) + { + rig2D.velocity *= -0.5f * (20000f / rig2D.mass); + rig2D.angularVelocity *= -0.5f * (20000f / rig2D.mass); + } + sinceDealDMG = 0f; + photonView.RPC("RPCA_PlayerCollision", RpcTarget.AllViaServer, collision, rig2D.velocity, base.transform.position, player.view.ViewID); + } + } + + [PunRPC] + public void RPCM_RequestCollide(Vector2 collision, Vector2 afterVel, Vector3 position, int playerId) + { + photonView.RPC("RPCA_PlayerCollision", RpcTarget.AllViaServer, collision, afterVel, position, playerId); + } + + [PunRPC] + private void RPCA_PlayerCollision(Vector2 collision, Vector2 velAfter, Vector3 position, int playerID) + { + CharacterData component = PhotonNetwork.GetPhotonView(playerID).GetComponent<CharacterData>(); + base.transform.position = position; + rig2D.velocity = velAfter; + sinceDealDMG = 0f; + StartCoroutine(component.GetComponent<PlayerCollision>().IDoBounce(component.playerVel.velocity)); + } + + public void BulletPush(Vector2 force, Vector2 localPoint, CharacterData asker) + { + if (photonView.IsMine) + { + rig2D.AddForceAtPosition(force * bulletPushMultiplier, base.transform.TransformPoint(localPoint), ForceMode2D.Impulse); + } + } + + [PunRPC] + public void RPCA_SendForce(Vector2 forceSent, Vector2 sentForcePos) + { + rig2D.AddForceAtPosition(forceSent, base.transform.TransformPoint(currentForcePos)); + } + + public Vector3 Push(CharacterData data) + { + if (!data.view.IsMine) + { + return Vector3.zero; + } + sincePushed = 0f; + Vector2 vector = data.input.direction * 8f; + Vector2 vector2 = col.bounds.ClosestPoint(data.transform.position); + float num = Vector2.Angle(vector, vector2 - (Vector2)data.transform.position); + float num2 = (90f - num) / 90f; + Vector2 vector3 = TimeHandler.fixedDeltaTime * vector * num2 * speed * 1000f; + currentForceToSend += vector3; + currentForcePos = base.transform.InverseTransformPoint(vector2); + float num3 = Mathf.Clamp((Vector2.Angle(rig2D.velocity, (Vector2)base.transform.position - (Vector2)data.transform.position) - 90f) / 90f, 0f, 1f); + OnPlayerCollision(rig2D.velocity * num3, data); + return -vector; + } + + public void RequestOwnership(CharacterData player) + { + } +} |