#[ Thread to not flood this chat ]
1 messages · Page 1 of 1 (latest)
public void ApplyDamage(IReceiveDamage hit, IBlock block = null, IParry parry = null)
{
if (!_playerManager.IsOwner) return;
_playerManager.InputReader.RequireNewPressForAll();
if (block == null)
{
HitCancel = true;
_playerManager.PlayerMovement.PushForward(-0.5f);
_playerManager.PlayerAnimation.TriggerPause(ExtensionMethods.GetTimeFromFrames(0.5f));
hit.ReceiveDamageServerRpc(CalculateDamage());
}
else
{
if (block.IsBlockingRpc()) // Attack Blocked | DEVOUR [ Add direction detection ]
{
// If hit is facing to player (half circle angle)
_playerManager.PlayerMovement.PushForward(-4f);
_playerManager.PlayerAnimation.TriggerPause(ExtensionMethods.GetTimeFromFrames(6f));
hit.ReceiveDamageServerRpc(CalculateDamage());
}
else if (parry.IsParrying()) // Attack Parried
{
_playerManager.PlayerMovement.PushForward(-4f);
// Change state to ParryStun
parry.Parry();
}
else // Attack Went Through
{
HitCancel = true;
_playerManager.PlayerMovement.PushForward(-2f);
_playerManager.PlayerAnimation.TriggerPause(ExtensionMethods.GetTimeFromFrames(1f));
hit.ReceiveDamageServerRpc(CalculateDamage());
}
}
}```
[Rpc(SendTo.Everyone, RequireOwnership = false)]
public void ReceiveDamageServerRpc(float damage)
{
float hitStunTime = ExtensionMethods.GetTimeFromFrames(6f); // DEVOUR (Make the hitstun related to the enemy's attack)
float knockback = 4f; // DEVOUR (Make this related to the attack received)
if (IsBlockingRpc())
{
// Rotate to attacker
_playerManager.PlayerMovement.PushForward(-knockback / 2);
_playerManager.PlayerAnimation.TriggerPause(hitStunTime / 3);
FloatingTextManager.Instance.CastFloatingTextRpc(transform.position, "Block", Color.blue);
}
else if (IsParrying())
{
}
else
{
FloatingTextManager.Instance.CastFloatingTextRpc(transform.position, Mathf.Round(damage).ToString(), Color.red);
HitstunTime = hitStunTime;
_playerManager.PlayerMovement.PushForward(-knockback);
_playerManager.PlayerAnimation.PlayAnimation(RandomHurtAnimation());
_playerManager.StateMachine.ChangeState(CharacterState.Hurt);
}
}```
these are my two functions right now, which I am more than willing to fix/change if needed
I'm assuming the _playerManager is the local player. Movement and animation should be fine gf these functions are on the player.
RPCs don't return any value so if(IsBlockingRpc()) is not going to work.
public NetworkVariable<bool> IsPlayerBlocking = new(false, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Owner);```
yes, I changed that to a network variable rather
and player manager
is just like a... reference master
it doesn't really do much
using UnityEngine;
using Unity.Netcode;
public class PlayerManager : NetworkBehaviour
{
public bool CurrentPlayer = false;
public InputReader InputReader { get; private set; }
public PlayerMovement PlayerMovement { get; private set; }
public PlayerAnimation PlayerAnimation { get; private set; }
public PlayerEquipment PlayerEquipment { get; private set; }
public PlayerCombatManager PlayerCombatManager { get; private set; }
public PlayerStateMachine StateMachine { get; private set; }
// Temp Values
[field: SerializeField] public float FallTime { get; private set; } = ExtensionMethods.GetTimeFromFrames(3f);
void Start()
{
GetReferences();
if (IsOwner)
{
CurrentPlayer = true;
CameraControl.Instance.AssignFollowCameraTarget(transform);
gameObject.layer = LayerMask.NameToLayer("Player");
name = "Me";
}
else
{
name = "Other Player";
}
}
void Update()
{
if (IsOwner)
SetAnimatorFloat();
}
void SetAnimatorFloat()
{
var input = InputReader.CurrentMovementInput;
Vector3 moveDirection = new Vector3(input.x, 0, input.y);
Vector3 relativeInput = transform.InverseTransformDirection(moveDirection);
PlayerAnimation.SetFloat(relativeInput.x, relativeInput.z);
}
void GetReferences()
{
InputReader = GetComponent<InputReader>();
StateMachine = GetComponent<PlayerStateMachine>();
PlayerMovement = GetComponent<PlayerMovement>();
PlayerAnimation = GetComponent<PlayerAnimation>();
PlayerEquipment = GetComponent<PlayerEquipment>();
PlayerCombatManager = GetComponent<PlayerCombatManager>();
StateMachine.ChangeState(CharacterState.Idle);
}
}```
but like
what should be Rpc(SendTo.Everyone)
or ServerRpc
🤔
pvp damage and also enemies will deal damage