Files
jelito/Assets/jelycho/Code/Enemies/ZombieActor.cs

121 lines
3.1 KiB
C#

using System;
using RebootKit.Engine.Main;
using RebootKit.Engine.Network;
using RebootKit.Engine.Simulation;
using UnityEngine;
using Logger = RebootKit.Engine.Foundation.Logger;
namespace RebootReality.jelycho.Enemies {
public class ZombieActorData : IActorData {
public void Serialize(NetworkBufferWriter writer) {
}
public void Deserialize(NetworkBufferReader reader) {
}
public int GetMaxBytes() {
return 0;
}
}
public interface IKillable {
bool IsAlive();
float OnHit(Actor attacker, float damage);
}
public class ZombieActor : Actor, IKillable {
static readonly Logger s_Logger = new Logger(nameof(ZombieActor));
[SerializeField] Animator m_Animator;
[SerializeField] Collider[] m_RagdollColliders;
[SerializeField] Rigidbody[] m_RagdollRigidbodies;
[SerializeField] Collider[] m_Hitboxes;
//
// @MARK: Unity callbacks
//
void Awake() {
SetRagdollLocal(false);
}
//
// @MARK: Actor
//
protected override IActorData CreateActorData() {
return new ZombieActorData();
}
protected override void OnActorEventClient(ActorEvent actorEvent) {
ZombieActorEvents zombieEvent = (ZombieActorEvents) actorEvent.EventID;
switch (zombieEvent) {
case ZombieActorEvents.EnableRagdoll: {
SetRagdollLocal(true);
break;
}
}
}
//
// @MARK: Ragdoll
//
void EnableRagdoll() {
SendActorEvent((byte)ZombieActorEvents.EnableRagdoll);
}
void SetRagdollLocal(bool active) {
foreach (Collider ragdollCollider in m_RagdollColliders) {
ragdollCollider.enabled = active;
}
foreach (Rigidbody ragdollRigidbody in m_RagdollRigidbodies) {
ragdollRigidbody.isKinematic = !active;
}
m_Animator.enabled = !active;
foreach (Collider hitbox in m_Hitboxes) {
hitbox.enabled = !active;
}
}
//
// @MARK: IKillable
//
public float Health { get; private set; } = 100.0f;
public bool IsAlive() {
return Health > 0.0f;
}
public float OnHit(Actor attacker, float damage) {
if (!RR.IsServer()) {
s_Logger.Error("OnHit can only be called on the server.");
return 0.0f;
}
if (!IsAlive()) {
return 0.0f;
}
s_Logger.Info($"Hit: {damage}");
Health -= damage;
if (Health <= 0.0f) {
s_Logger.Info("Die");
EnableRagdoll();
return damage - Mathf.Abs(Health);
}
return damage;
}
}
enum ZombieActorEvents {
None = 0x00,
EnableRagdoll = 0x01
}
}