#```[ Script here ]```

1 messages · Page 1 of 1 (latest)

velvet mason
#
public void ApplyDamage(IReceiveDamage hit, IBlock block = null, IParry parry = null)
{
    if (!_playerManager.IsOwner) return; // Ensure only the attacker processes hits locally

    _playerManager.InputReader.RequireNewPressForAll();

    bool wasBlocked = block != null && block.IsBlocking();
    bool wasParried = parry != null && parry.IsParrying();

    if (wasBlocked)
    {
        _playerManager.PlayerMovement.PushForward(-2f);
        _playerManager.PlayerAnimation.TriggerPause(ExtensionMethods.GetTimeFromFrames(8f));
    }
    else if (wasParried)
    {
        // DEVOUR | Go into StunParry state 
        _playerManager.PlayerMovement.PushForward(-1f);
    }
    else
    {
        HitCancel = true;
        _playerManager.PlayerMovement.PushForward(-1f);
        _playerManager.PlayerAnimation.TriggerPause(ExtensionMethods.GetTimeFromFrames(2f));
    }

    DamageData damageData = new() // DEVOUR | Add other Properties
    {
        DamageAmount = CalculateDamage(),
        HitStun = _currentAttackData.HitStun,
        Knockback = _currentAttackData.Knockback,

        DamageSource = transform.position
    };

    MonoBehaviour hitObject = hit as MonoBehaviour;
    if (hitObject == null) return;

    NetworkObject hitNetworkObject = hitObject.GetComponent<NetworkObject>();
    if (hitNetworkObject == null) return;

    ApplyDamageServerRpc(hitNetworkObject.NetworkObjectId, damageData, wasBlocked, wasParried);
}```
#
[ServerRpc]
private void ApplyDamageServerRpc(ulong targetNetworkObjectId, DamageData damageData, bool wasBlocked, bool wasParried)
{
    if (!NetworkManager.Singleton.IsServer) return; // Ensure this runs only on the server

    // Retrieve the target network object using its ID
    if (!NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(targetNetworkObjectId, out NetworkObject targetNetworkObject))
        return; // Exit if the target object isn't found

    // Get the damage receiver component from the target
    IReceiveDamage hit = targetNetworkObject.GetComponent<IReceiveDamage>();
    if (hit == null) return;

    // Apply damage based on block/parry conditions
    if (wasBlocked)
    {
        hit.ReceiveDamageRpc(damageData, true, false); // Reduced damage if blocked
    }
    else if (wasParried)
    {
        hit.ReceiveDamageRpc(damageData, false, true); // Parried Attack

        DamageData parryData = new()
        {
            DamageSource = (hit as MonoBehaviour).transform.position,
            HitStun = 18,
            Knockback = 1
        };

        ReceiveDamageRpc(parryData, false, false);
    }
    else
    {
        hit.ReceiveDamageRpc(damageData, false, false); // Normal hit
    }
}```