#```[ Script here ]```
1 messages · Page 1 of 1 (latest)
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
}
}```