void Awake() { RustAI = GetComponent <NPCAI>(); RustAI.ServerDestroy(); RustMetabolism = GetComponent <NPCMetabolism>(); Base = GetComponent <BaseNPC>(); lastTick = Time.time; targetpoint = Vector3.zero; action = Act.None; hungerLose = RustMetabolism.calories.max * 2 / 12000; thristyLose = RustMetabolism.hydration.max * 3 / 12000; sleepLose = RustMetabolism.sleep.max / 12000; inventory = new ItemContainer(); inventory.ServerInitialize(null, 6); Base.enableSaving = false; BaseEntity.saveList.Remove(Base); Base.InitializeHealth(Base.health * HealthModificator, Base.MaxHealth() * HealthModificator); Base.locomotion.gallopSpeed *= SpeedModificator; Base.locomotion.trotSpeed *= SpeedModificator; Base.locomotion.acceleration *= SpeedModificator; }
void OnDestroy() { DropUtil.DropItems(inventory, transform.position); SaveNpcList.Remove(owner.owner.userID); RustAI.ServerInit(); if (Base.health <= 0) { return; } Base.enableSaving = true; BaseEntity.saveList.Add(Base); Base.InitializeHealth(Base.health / HealthModificator, Base.MaxHealth() / HealthModificator); Base.locomotion.gallopSpeed /= SpeedModificator; Base.locomotion.trotSpeed /= SpeedModificator; Base.locomotion.acceleration /= SpeedModificator; }
void FixedUpdate() { if (AI.deltaTime < ConVar.Server.TickDelta()) { return; } if (NPC.IsStunned()) { return; } NPC.Tick(); if (NPC.attack.IsActive()) { NPC.attack.gameObject.SetActive(false); Move(NextPos); return; } if (Vector3.Distance(transform.position, Home) > 100) { Move(Home); return; } if (isAttacking && Target != null) { var distance = Vector3.Distance(transform.position, Target.transform.position); if (distance >= 70) { isAttacking = false; Target = null; return; } else if (distance < targetAttackRange) { var normalized = (Target.transform.position - transform.position).XZ3D().normalized; if (NPC.diet.Eat(Target)) { NPC.Heal(NPC.MaxHealth() / 10); Metabolism.calories.Add(Metabolism.calories.max / 10); Metabolism.hydration.Add(Metabolism.hydration.max / 10); } else if (NPC.attack.Hit(Target, 1, false)) { transform.rotation = Quaternion.LookRotation(normalized); } NPC.steering.Face(normalized); } else { Move(Target.transform.position); } } else if (Vector3.Distance(transform.position, NextPos) < 20) { CalculateNextPos(); if (Metabolism.calories.value < 20f) { NPC.diet.Forage(); } else if (Metabolism.sleep.value < 20f) { Sleep(); } } else { Move(NextPos); } }
void FixedUpdate() { SetDeltaTimeMethod.Invoke(RustAI, new object[] { Time.time - lastTick }); if ((double)RustAI.deltaTime >= (double)server.NPCTickDelta()) { lastTick = Time.time; if (!Base.IsStunned()) { Base.Tick(); if (action != Act.Sleep) { RustMetabolism.sleep.MoveTowards(0.0f, RustAI.deltaTime * sleepLose); RustMetabolism.hydration.MoveTowards(0.0f, RustAI.deltaTime * thristyLose); RustMetabolism.calories.MoveTowards(0.0f, RustAI.deltaTime * hungerLose); } if (action != Act.None) { if (action == Act.Move) { if (Vector3.Distance(transform.position, targetpoint) < PointMoveDistance) { action = Act.None; } else { Move(targetpoint); } } else if (action == Act.Sleep) { Base.state = BaseNPC.State.Sleeping; Base.sleep.Recover(2f); RustMetabolism.stamina.Run(4f); Base.StartCooldown(2f, true); } else if (targetentity == null) { action = Act.None; Base.state = BaseNPC.State.Normal; } else { float distance = Vector3.Distance(transform.position, targetentity.transform.position); if (distance < IgnoreTargetDistance) { if (action != Act.Follow && distance <= attackrange) { Vector3 normalized = Vector3Ex.XZ3D(targetentity.transform.position - transform.position).normalized; if (action == Act.Eat) { if (Base.diet.Eat(targetentity)) { Base.Heal(Base.MaxHealth() * 0.01f); RustMetabolism.calories.Add(RustMetabolism.calories.max * 0.03f); RustMetabolism.hydration.Add(RustMetabolism.hydration.max * 0.03f); } } else if (Base.attack.Hit(targetentity, (targetentity is BaseNPC ? 1f : 2f) * AttackModificator, false)) { transform.rotation = Quaternion.LookRotation(normalized); } Base.steering.Face(normalized); } else if (action != Act.Follow || distance > TargetMoveDistance && distance > attackrange) { Move(targetentity.transform.position); } } else { action = Act.None; } } } } } }