working on charging and quick attacks
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
using RebootKit.Engine.Network;
|
||||
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 {
|
||||
@@ -15,11 +18,104 @@ namespace RebootReality.jelycho.Enemies {
|
||||
}
|
||||
}
|
||||
|
||||
public class ZombieActor : Actor {
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user