1202 lines
36 KiB
C#
1202 lines
36 KiB
C#
using System.Collections.Generic;
|
|
using GameNetcodeStuff;
|
|
using Unity.Netcode;
|
|
using UnityEngine;
|
|
using UnityEngine.Animations.Rigging;
|
|
|
|
public class HoarderBugAI : EnemyAI
|
|
{
|
|
public AISearchRoutine searchForItems;
|
|
|
|
public AISearchRoutine searchForPlayer;
|
|
|
|
[Header("Tracking/Memory")]
|
|
[Space(3f)]
|
|
public Vector3 nestPosition;
|
|
|
|
private bool choseNestPosition;
|
|
|
|
[Space(3f)]
|
|
public static List<HoarderBugItem> HoarderBugItems = new List<HoarderBugItem>();
|
|
|
|
public static List<GameObject> grabbableObjectsInMap = new List<GameObject>();
|
|
|
|
public float angryTimer;
|
|
|
|
public GrabbableObject targetItem;
|
|
|
|
public HoarderBugItem heldItem;
|
|
|
|
[Header("Animations")]
|
|
[Space(5f)]
|
|
private Vector3 agentLocalVelocity;
|
|
|
|
private Vector3 previousPosition;
|
|
|
|
private float velX;
|
|
|
|
private float velZ;
|
|
|
|
public Transform turnCompass;
|
|
|
|
private float armsHoldLayerWeight;
|
|
|
|
[Space(5f)]
|
|
public Transform animationContainer;
|
|
|
|
public Transform grabTarget;
|
|
|
|
public MultiAimConstraint headLookRig;
|
|
|
|
public Transform headLookTarget;
|
|
|
|
[Header("Special behaviour states")]
|
|
private float annoyanceMeter;
|
|
|
|
public bool watchingPlayerNearPosition;
|
|
|
|
public PlayerControllerB watchingPlayer;
|
|
|
|
public Transform lookTarget;
|
|
|
|
public bool lookingAtPositionOfInterest;
|
|
|
|
private Vector3 positionOfInterest;
|
|
|
|
private bool isAngry;
|
|
|
|
[Header("Misc logic")]
|
|
private bool sendingGrabOrDropRPC;
|
|
|
|
private float waitingAtNestTimer;
|
|
|
|
private bool waitingAtNest;
|
|
|
|
private float timeSinceSeeingAPlayer;
|
|
|
|
[Header("Chase logic")]
|
|
private bool lostPlayerInChase;
|
|
|
|
private float noticePlayerTimer;
|
|
|
|
public PlayerControllerB angryAtPlayer;
|
|
|
|
private bool inChase;
|
|
|
|
[Header("Audios")]
|
|
public AudioClip[] chitterSFX;
|
|
|
|
[Header("Audios")]
|
|
public AudioClip[] angryScreechSFX;
|
|
|
|
public AudioClip angryVoiceSFX;
|
|
|
|
public AudioClip bugFlySFX;
|
|
|
|
public AudioClip hitPlayerSFX;
|
|
|
|
private float timeSinceHittingPlayer;
|
|
|
|
private float timeSinceLookingTowardsNoise;
|
|
|
|
private float detectPlayersInterval;
|
|
|
|
private bool inReturnToNestMode;
|
|
|
|
public override void Start()
|
|
{
|
|
base.Start();
|
|
heldItem = null;
|
|
RefreshGrabbableObjectsInMapList();
|
|
}
|
|
|
|
public static void RefreshGrabbableObjectsInMapList()
|
|
{
|
|
grabbableObjectsInMap.Clear();
|
|
GrabbableObject[] array = Object.FindObjectsOfType<GrabbableObject>();
|
|
Debug.Log($"gobjectsin scnee!! : {array.Length}");
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
if (array[i].grabbableToEnemies)
|
|
{
|
|
grabbableObjectsInMap.Add(array[i].gameObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool GrabTargetItemIfClose()
|
|
{
|
|
if (targetItem != null && heldItem == null && Vector3.Distance(base.transform.position, targetItem.transform.position) < 0.75f)
|
|
{
|
|
if (!SetDestinationToPosition(nestPosition, checkForPath: true))
|
|
{
|
|
nestPosition = ChooseClosestNodeToPosition(base.transform.position).position;
|
|
SetDestinationToPosition(nestPosition);
|
|
}
|
|
NetworkObject component = targetItem.GetComponent<NetworkObject>();
|
|
SwitchToBehaviourStateOnLocalClient(1);
|
|
GrabItem(component);
|
|
sendingGrabOrDropRPC = true;
|
|
GrabItemServerRpc(component);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void ChooseNestPosition()
|
|
{
|
|
HoarderBugAI[] array = Object.FindObjectsOfType<HoarderBugAI>();
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
if (array[i] != this && !PathIsIntersectedByLineOfSight(array[i].nestPosition, calculatePathDistance: false, avoidLineOfSight: false))
|
|
{
|
|
nestPosition = array[i].nestPosition;
|
|
SyncNestPositionServerRpc(nestPosition);
|
|
return;
|
|
}
|
|
}
|
|
nestPosition = ChooseClosestNodeToPosition(base.transform.position).position;
|
|
SyncNestPositionServerRpc(nestPosition);
|
|
}
|
|
|
|
[ServerRpc]
|
|
private void SyncNestPositionServerRpc(Vector3 newNestPosition)
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Server && (networkManager.IsClient || networkManager.IsHost))
|
|
{
|
|
if (base.OwnerClientId != networkManager.LocalClientId)
|
|
{
|
|
if (networkManager.LogLevel <= LogLevel.Normal)
|
|
{
|
|
Debug.LogError("Only the owner can invoke a ServerRpc that requires ownership!");
|
|
}
|
|
return;
|
|
}
|
|
ServerRpcParams serverRpcParams = default(ServerRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendServerRpc(3689917697u, serverRpcParams, RpcDelivery.Reliable);
|
|
bufferWriter.WriteValueSafe(in newNestPosition);
|
|
__endSendServerRpc(ref bufferWriter, 3689917697u, serverRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
SyncNestPositionClientRpc(newNestPosition);
|
|
}
|
|
}
|
|
|
|
[ClientRpc]
|
|
private void SyncNestPositionClientRpc(Vector3 newNestPosition)
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
if (__rpc_exec_stage != __RpcExecStage.Client && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
ClientRpcParams clientRpcParams = default(ClientRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendClientRpc(1841413947u, clientRpcParams, RpcDelivery.Reliable);
|
|
bufferWriter.WriteValueSafe(in newNestPosition);
|
|
__endSendClientRpc(ref bufferWriter, 1841413947u, clientRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost))
|
|
{
|
|
nestPosition = newNestPosition;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void DoAIInterval()
|
|
{
|
|
base.DoAIInterval();
|
|
if (isEnemyDead || StartOfRound.Instance.allPlayersDead)
|
|
{
|
|
return;
|
|
}
|
|
if (!choseNestPosition)
|
|
{
|
|
choseNestPosition = true;
|
|
ChooseNestPosition();
|
|
return;
|
|
}
|
|
if (HasLineOfSightToPosition(nestPosition, 60f, 40, 0.5f))
|
|
{
|
|
for (int i = 0; i < HoarderBugItems.Count; i++)
|
|
{
|
|
if (HoarderBugItems[i].itemGrabbableObject.isHeld && HoarderBugItems[i].itemNestPosition == nestPosition)
|
|
{
|
|
HoarderBugItems[i].status = HoarderBugItemStatus.Stolen;
|
|
}
|
|
}
|
|
}
|
|
HoarderBugItem hoarderBugItem = CheckLineOfSightForItem(HoarderBugItemStatus.Stolen, 60f, 30, 3f);
|
|
if (hoarderBugItem != null && !hoarderBugItem.itemGrabbableObject.isHeld)
|
|
{
|
|
hoarderBugItem.status = HoarderBugItemStatus.Returned;
|
|
if (!grabbableObjectsInMap.Contains(hoarderBugItem.itemGrabbableObject.gameObject))
|
|
{
|
|
grabbableObjectsInMap.Add(hoarderBugItem.itemGrabbableObject.gameObject);
|
|
}
|
|
}
|
|
switch (currentBehaviourStateIndex)
|
|
{
|
|
case 0:
|
|
{
|
|
inReturnToNestMode = false;
|
|
ExitChaseMode();
|
|
if (GrabTargetItemIfClose())
|
|
{
|
|
break;
|
|
}
|
|
if (targetItem == null && !searchForItems.inProgress)
|
|
{
|
|
StartSearch(nestPosition, searchForItems);
|
|
break;
|
|
}
|
|
if (targetItem != null)
|
|
{
|
|
SetGoTowardsTargetObject(targetItem.gameObject);
|
|
break;
|
|
}
|
|
GameObject gameObject2 = CheckLineOfSight(grabbableObjectsInMap, 60f, 40, 5f);
|
|
if ((bool)gameObject2)
|
|
{
|
|
GrabbableObject component = gameObject2.GetComponent<GrabbableObject>();
|
|
if ((bool)component && (!component.isHeld || (Random.Range(0, 100) < 4 && !component.isPocketed)))
|
|
{
|
|
SetGoTowardsTargetObject(gameObject2);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
ExitChaseMode();
|
|
if (!inReturnToNestMode)
|
|
{
|
|
inReturnToNestMode = true;
|
|
SetReturningToNest();
|
|
Debug.Log(base.gameObject.name + ": Abandoned current search and returning to nest empty-handed");
|
|
}
|
|
GrabTargetItemIfClose();
|
|
if (waitingAtNest)
|
|
{
|
|
if (heldItem != null)
|
|
{
|
|
Debug.Log(base.gameObject.name + ": Dropping item");
|
|
DropItemAndCallDropRPC(heldItem.itemGrabbableObject.GetComponent<NetworkObject>());
|
|
}
|
|
else
|
|
{
|
|
GameObject gameObject = CheckLineOfSight(grabbableObjectsInMap, 60f, 40, 5f);
|
|
if ((bool)gameObject && Vector3.Distance(eye.position, gameObject.transform.position) < 6f)
|
|
{
|
|
targetItem = gameObject.GetComponent<GrabbableObject>();
|
|
if (targetItem != null && !targetItem.isHeld)
|
|
{
|
|
waitingAtNest = false;
|
|
SwitchToBehaviourState(0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (waitingAtNestTimer <= 0f && !watchingPlayerNearPosition)
|
|
{
|
|
waitingAtNest = false;
|
|
SwitchToBehaviourStateOnLocalClient(0);
|
|
}
|
|
}
|
|
else if (Vector3.Distance(base.transform.position, nestPosition) < 0.75f)
|
|
{
|
|
waitingAtNest = true;
|
|
waitingAtNestTimer = 15f;
|
|
}
|
|
break;
|
|
case 2:
|
|
inReturnToNestMode = false;
|
|
if (heldItem != null)
|
|
{
|
|
DropItemAndCallDropRPC(heldItem.itemGrabbableObject.GetComponent<NetworkObject>(), droppedInNest: false);
|
|
}
|
|
if (lostPlayerInChase)
|
|
{
|
|
if (!searchForPlayer.inProgress)
|
|
{
|
|
searchForPlayer.searchWidth = 30f;
|
|
StartSearch(targetPlayer.transform.position, searchForPlayer);
|
|
Debug.Log(base.gameObject.name + ": Lost player in chase; beginning search where the player was last seen");
|
|
}
|
|
break;
|
|
}
|
|
if (targetPlayer == null)
|
|
{
|
|
Debug.LogError("TargetPlayer is null even though bug is in chase; setting targetPlayer to watchingPlayer");
|
|
if (watchingPlayer != null)
|
|
{
|
|
targetPlayer = watchingPlayer;
|
|
}
|
|
}
|
|
if (searchForPlayer.inProgress)
|
|
{
|
|
StopSearch(searchForPlayer);
|
|
Debug.Log(base.gameObject.name + ": Found player during chase; stopping search coroutine and moving after target player");
|
|
}
|
|
movingTowardsTargetPlayer = true;
|
|
break;
|
|
case 3:
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void SetGoTowardsTargetObject(GameObject foundObject)
|
|
{
|
|
if (SetDestinationToPosition(foundObject.transform.position, checkForPath: true) && grabbableObjectsInMap.Contains(foundObject))
|
|
{
|
|
Debug.Log(base.gameObject.name + ": Setting target object and going towards it.");
|
|
targetItem = foundObject.GetComponent<GrabbableObject>();
|
|
StopSearch(searchForItems, clear: false);
|
|
}
|
|
else
|
|
{
|
|
targetItem = null;
|
|
Debug.Log(base.gameObject.name + ": i found an object but cannot reach it (or it has been taken by another bug): " + foundObject.name);
|
|
}
|
|
}
|
|
|
|
private void ExitChaseMode()
|
|
{
|
|
if (inChase)
|
|
{
|
|
inChase = false;
|
|
Debug.Log(base.gameObject.name + ": Exiting chase mode");
|
|
if (searchForPlayer.inProgress)
|
|
{
|
|
StopSearch(searchForPlayer);
|
|
}
|
|
movingTowardsTargetPlayer = false;
|
|
creatureAnimator.SetBool("Chase", value: false);
|
|
creatureSFX.Stop();
|
|
}
|
|
}
|
|
|
|
private void SetReturningToNest()
|
|
{
|
|
if (SetDestinationToPosition(nestPosition, checkForPath: true))
|
|
{
|
|
targetItem = null;
|
|
StopSearch(searchForItems, clear: false);
|
|
}
|
|
else
|
|
{
|
|
Debug.Log(base.gameObject.name + ": Return to nest was called, but nest is not accessible! Abandoning and choosing a new nest position.");
|
|
ChooseNestPosition();
|
|
}
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
if (!inSpecialAnimation && !isEnemyDead && !StartOfRound.Instance.allPlayersDead)
|
|
{
|
|
if (detectPlayersInterval <= 0f)
|
|
{
|
|
detectPlayersInterval = 0.2f;
|
|
DetectAndLookAtPlayers();
|
|
}
|
|
else
|
|
{
|
|
detectPlayersInterval -= Time.deltaTime;
|
|
}
|
|
AnimateLooking();
|
|
CalculateAnimationDirection();
|
|
SetArmLayerWeight();
|
|
}
|
|
}
|
|
|
|
private void SetArmLayerWeight()
|
|
{
|
|
if (heldItem != null)
|
|
{
|
|
armsHoldLayerWeight = Mathf.Lerp(armsHoldLayerWeight, 0.85f, 8f * Time.deltaTime);
|
|
}
|
|
else
|
|
{
|
|
armsHoldLayerWeight = Mathf.Lerp(armsHoldLayerWeight, 0f, 8f * Time.deltaTime);
|
|
}
|
|
creatureAnimator.SetLayerWeight(1, armsHoldLayerWeight);
|
|
}
|
|
|
|
private void CalculateAnimationDirection(float maxSpeed = 1f)
|
|
{
|
|
agentLocalVelocity = animationContainer.InverseTransformDirection(Vector3.ClampMagnitude(base.transform.position - previousPosition, 1f) / (Time.deltaTime * 2f));
|
|
velX = Mathf.Lerp(velX, agentLocalVelocity.x, 10f * Time.deltaTime);
|
|
creatureAnimator.SetFloat("VelocityX", Mathf.Clamp(velX, 0f - maxSpeed, maxSpeed));
|
|
velZ = Mathf.Lerp(velZ, agentLocalVelocity.z, 10f * Time.deltaTime);
|
|
creatureAnimator.SetFloat("VelocityZ", Mathf.Clamp(velZ, 0f - maxSpeed, maxSpeed));
|
|
previousPosition = base.transform.position;
|
|
}
|
|
|
|
private void AnimateLooking()
|
|
{
|
|
if (watchingPlayer != null)
|
|
{
|
|
lookTarget.position = watchingPlayer.gameplayCamera.transform.position;
|
|
}
|
|
else
|
|
{
|
|
if (!lookingAtPositionOfInterest)
|
|
{
|
|
agent.angularSpeed = 220f;
|
|
headLookRig.weight = Mathf.Lerp(headLookRig.weight, 0f, 10f);
|
|
return;
|
|
}
|
|
lookTarget.position = positionOfInterest;
|
|
}
|
|
if (base.IsOwner)
|
|
{
|
|
agent.angularSpeed = 0f;
|
|
turnCompass.LookAt(lookTarget);
|
|
base.transform.rotation = Quaternion.Lerp(base.transform.rotation, turnCompass.rotation, 6f * Time.deltaTime);
|
|
base.transform.localEulerAngles = new Vector3(0f, base.transform.localEulerAngles.y, 0f);
|
|
}
|
|
float num = Vector3.Angle(base.transform.forward, lookTarget.position - base.transform.position);
|
|
if (num > 22f)
|
|
{
|
|
headLookRig.weight = Mathf.Lerp(headLookRig.weight, 1f * (Mathf.Abs(num - 180f) / 180f), 7f);
|
|
}
|
|
else
|
|
{
|
|
headLookRig.weight = Mathf.Lerp(headLookRig.weight, 1f, 7f);
|
|
}
|
|
headLookTarget.position = Vector3.Lerp(headLookTarget.position, lookTarget.position, 8f * Time.deltaTime);
|
|
}
|
|
|
|
private void DetectAndLookAtPlayers()
|
|
{
|
|
Vector3 b = ((currentBehaviourStateIndex != 1) ? base.transform.position : nestPosition);
|
|
PlayerControllerB[] allPlayersInLineOfSight = GetAllPlayersInLineOfSight(70f, 30, eye, 1.2f);
|
|
if (allPlayersInLineOfSight != null)
|
|
{
|
|
PlayerControllerB playerControllerB = watchingPlayer;
|
|
timeSinceSeeingAPlayer = 0f;
|
|
float num = 500f;
|
|
bool flag = false;
|
|
if (stunnedByPlayer != null)
|
|
{
|
|
flag = true;
|
|
angryAtPlayer = stunnedByPlayer;
|
|
}
|
|
for (int i = 0; i < allPlayersInLineOfSight.Length; i++)
|
|
{
|
|
if (!flag && allPlayersInLineOfSight[i].currentlyHeldObjectServer != null)
|
|
{
|
|
for (int j = 0; j < HoarderBugItems.Count; j++)
|
|
{
|
|
if (HoarderBugItems[j].itemGrabbableObject == allPlayersInLineOfSight[i].currentlyHeldObjectServer)
|
|
{
|
|
HoarderBugItems[j].status = HoarderBugItemStatus.Stolen;
|
|
angryAtPlayer = allPlayersInLineOfSight[i];
|
|
flag = true;
|
|
}
|
|
}
|
|
}
|
|
if (IsHoarderBugAngry() && allPlayersInLineOfSight[i] == angryAtPlayer)
|
|
{
|
|
watchingPlayer = angryAtPlayer;
|
|
}
|
|
else
|
|
{
|
|
float num2 = Vector3.Distance(allPlayersInLineOfSight[i].transform.position, b);
|
|
if (num2 < num)
|
|
{
|
|
num = num2;
|
|
watchingPlayer = allPlayersInLineOfSight[i];
|
|
}
|
|
}
|
|
float num3 = Vector3.Distance(allPlayersInLineOfSight[i].transform.position, nestPosition);
|
|
if (HoarderBugItems.Count > 0)
|
|
{
|
|
if ((num3 < 4f || (inChase && num3 < 8f)) && angryTimer < 3.25f)
|
|
{
|
|
angryAtPlayer = allPlayersInLineOfSight[i];
|
|
watchingPlayer = allPlayersInLineOfSight[i];
|
|
angryTimer = 3.25f;
|
|
break;
|
|
}
|
|
if (!isAngry && currentBehaviourStateIndex == 0 && num3 < 8f && (targetItem == null || Vector3.Distance(targetItem.transform.position, base.transform.position) > 7.5f) && base.IsOwner)
|
|
{
|
|
SwitchToBehaviourState(1);
|
|
}
|
|
}
|
|
if (currentBehaviourStateIndex != 2 && Vector3.Distance(base.transform.position, allPlayersInLineOfSight[i].transform.position) < 2.5f)
|
|
{
|
|
annoyanceMeter += 0.2f;
|
|
if (annoyanceMeter > 2.5f)
|
|
{
|
|
angryAtPlayer = allPlayersInLineOfSight[i];
|
|
watchingPlayer = allPlayersInLineOfSight[i];
|
|
angryTimer = 3.25f;
|
|
}
|
|
}
|
|
}
|
|
watchingPlayerNearPosition = num < 6f;
|
|
if (watchingPlayer != playerControllerB)
|
|
{
|
|
RoundManager.PlayRandomClip(creatureVoice, chitterSFX);
|
|
}
|
|
if (!base.IsOwner)
|
|
{
|
|
return;
|
|
}
|
|
if (currentBehaviourStateIndex != 2)
|
|
{
|
|
if (IsHoarderBugAngry())
|
|
{
|
|
lostPlayerInChase = false;
|
|
targetPlayer = watchingPlayer;
|
|
SwitchToBehaviourState(2);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
targetPlayer = watchingPlayer;
|
|
if (lostPlayerInChase)
|
|
{
|
|
lostPlayerInChase = false;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
timeSinceSeeingAPlayer += 0.2f;
|
|
watchingPlayerNearPosition = false;
|
|
if (currentBehaviourStateIndex != 2)
|
|
{
|
|
if (timeSinceSeeingAPlayer > 1.5f)
|
|
{
|
|
watchingPlayer = null;
|
|
}
|
|
return;
|
|
}
|
|
if (timeSinceSeeingAPlayer > 1.25f)
|
|
{
|
|
watchingPlayer = null;
|
|
}
|
|
if (base.IsOwner)
|
|
{
|
|
if (timeSinceSeeingAPlayer > 15f)
|
|
{
|
|
SwitchToBehaviourState(1);
|
|
}
|
|
else if (timeSinceSeeingAPlayer > 2.5f)
|
|
{
|
|
lostPlayerInChase = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool IsHoarderBugAngry()
|
|
{
|
|
if (stunNormalizedTimer > 0f)
|
|
{
|
|
angryTimer = 4f;
|
|
if ((bool)stunnedByPlayer)
|
|
{
|
|
angryAtPlayer = stunnedByPlayer;
|
|
}
|
|
return true;
|
|
}
|
|
int num = 0;
|
|
int num2 = 0;
|
|
for (int i = 0; i < HoarderBugItems.Count; i++)
|
|
{
|
|
if (HoarderBugItems[i].status == HoarderBugItemStatus.Stolen)
|
|
{
|
|
num2++;
|
|
}
|
|
else if (HoarderBugItems[i].status == HoarderBugItemStatus.Returned)
|
|
{
|
|
num++;
|
|
}
|
|
}
|
|
if (!(angryTimer > 0f))
|
|
{
|
|
return num2 > 0;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public override void Update()
|
|
{
|
|
base.Update();
|
|
timeSinceHittingPlayer += Time.deltaTime;
|
|
timeSinceLookingTowardsNoise += Time.deltaTime;
|
|
if (timeSinceLookingTowardsNoise > 0.6f)
|
|
{
|
|
lookingAtPositionOfInterest = false;
|
|
}
|
|
if (inSpecialAnimation || isEnemyDead || StartOfRound.Instance.allPlayersDead)
|
|
{
|
|
return;
|
|
}
|
|
if (angryTimer >= 0f)
|
|
{
|
|
angryTimer -= Time.deltaTime;
|
|
}
|
|
creatureAnimator.SetBool("stunned", stunNormalizedTimer > 0f);
|
|
bool flag = IsHoarderBugAngry();
|
|
if (!isAngry && flag)
|
|
{
|
|
isAngry = true;
|
|
creatureVoice.clip = angryVoiceSFX;
|
|
creatureVoice.Play();
|
|
}
|
|
else if (isAngry && !flag)
|
|
{
|
|
isAngry = false;
|
|
angryAtPlayer = null;
|
|
creatureVoice.Stop();
|
|
}
|
|
switch (currentBehaviourStateIndex)
|
|
{
|
|
case 0:
|
|
ExitChaseMode();
|
|
if (stunNormalizedTimer > 0f)
|
|
{
|
|
agent.speed = 0f;
|
|
}
|
|
else
|
|
{
|
|
agent.speed = 6f;
|
|
}
|
|
waitingAtNest = false;
|
|
break;
|
|
case 1:
|
|
ExitChaseMode();
|
|
if (stunNormalizedTimer > 0f)
|
|
{
|
|
agent.speed = 0f;
|
|
}
|
|
else
|
|
{
|
|
agent.speed = 6f;
|
|
}
|
|
agent.acceleration = 30f;
|
|
if (waitingAtNest && waitingAtNestTimer > 0f)
|
|
{
|
|
waitingAtNestTimer -= Time.deltaTime;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!inChase)
|
|
{
|
|
inChase = true;
|
|
creatureSFX.clip = bugFlySFX;
|
|
creatureSFX.Play();
|
|
RoundManager.PlayRandomClip(creatureVoice, angryScreechSFX);
|
|
creatureAnimator.SetBool("Chase", value: true);
|
|
waitingAtNest = false;
|
|
if (Vector3.Distance(base.transform.position, GameNetworkManager.Instance.localPlayerController.transform.position) < 10f)
|
|
{
|
|
GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.5f);
|
|
}
|
|
}
|
|
if (!base.IsOwner)
|
|
{
|
|
break;
|
|
}
|
|
if (!IsHoarderBugAngry())
|
|
{
|
|
HoarderBugItem hoarderBugItem = CheckLineOfSightForItem(HoarderBugItemStatus.Returned, 60f, 12, 3f);
|
|
if (hoarderBugItem != null && !hoarderBugItem.itemGrabbableObject.isHeld)
|
|
{
|
|
SwitchToBehaviourState(0);
|
|
SetGoTowardsTargetObject(hoarderBugItem.itemGrabbableObject.gameObject);
|
|
}
|
|
else
|
|
{
|
|
SwitchToBehaviourState(1);
|
|
}
|
|
ExitChaseMode();
|
|
break;
|
|
}
|
|
if (stunNormalizedTimer > 0f)
|
|
{
|
|
agent.speed = 0f;
|
|
}
|
|
else
|
|
{
|
|
agent.speed = 18f;
|
|
}
|
|
agent.acceleration = 16f;
|
|
if (GameNetworkManager.Instance.localPlayerController.HasLineOfSightToPosition(base.transform.position + Vector3.up * 0.75f, 60f, 15))
|
|
{
|
|
GameNetworkManager.Instance.localPlayerController.IncreaseFearLevelOverTime(0.4f);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
public override void DetectNoise(Vector3 noisePosition, float noiseLoudness, int timesPlayedInOneSpot = 0, int noiseID = 0)
|
|
{
|
|
base.DetectNoise(noisePosition, noiseLoudness, timesPlayedInOneSpot, noiseID);
|
|
if (timesPlayedInOneSpot <= 10 && !(timeSinceLookingTowardsNoise < 0.6f))
|
|
{
|
|
timeSinceLookingTowardsNoise = 0f;
|
|
float num = Vector3.Distance(noisePosition, nestPosition);
|
|
if (base.IsOwner && HoarderBugItems.Count > 0 && !isAngry && currentBehaviourStateIndex == 0 && num < 15f && (targetItem == null || Vector3.Distance(targetItem.transform.position, base.transform.position) > 4.5f))
|
|
{
|
|
SwitchToBehaviourState(1);
|
|
}
|
|
positionOfInterest = noisePosition;
|
|
lookingAtPositionOfInterest = true;
|
|
}
|
|
}
|
|
|
|
private void DropItemAndCallDropRPC(NetworkObject dropItemNetworkObject, bool droppedInNest = true)
|
|
{
|
|
Vector3 targetFloorPosition = RoundManager.Instance.RandomlyOffsetPosition(heldItem.itemGrabbableObject.GetItemFloorPosition(), 1.2f, 0.4f);
|
|
DropItem(dropItemNetworkObject, targetFloorPosition);
|
|
sendingGrabOrDropRPC = true;
|
|
DropItemServerRpc(dropItemNetworkObject, targetFloorPosition, droppedInNest);
|
|
}
|
|
|
|
[ServerRpc]
|
|
public void DropItemServerRpc(NetworkObjectReference objectRef, Vector3 targetFloorPosition, bool droppedInNest)
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Server && (networkManager.IsClient || networkManager.IsHost))
|
|
{
|
|
if (base.OwnerClientId != networkManager.LocalClientId)
|
|
{
|
|
if (networkManager.LogLevel <= LogLevel.Normal)
|
|
{
|
|
Debug.LogError("Only the owner can invoke a ServerRpc that requires ownership!");
|
|
}
|
|
return;
|
|
}
|
|
ServerRpcParams serverRpcParams = default(ServerRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendServerRpc(3510928244u, serverRpcParams, RpcDelivery.Reliable);
|
|
bufferWriter.WriteValueSafe(in objectRef, default(FastBufferWriter.ForNetworkSerializable));
|
|
bufferWriter.WriteValueSafe(in targetFloorPosition);
|
|
bufferWriter.WriteValueSafe(in droppedInNest, default(FastBufferWriter.ForPrimitives));
|
|
__endSendServerRpc(ref bufferWriter, 3510928244u, serverRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
DropItemClientRpc(objectRef, targetFloorPosition, droppedInNest);
|
|
}
|
|
}
|
|
|
|
[ClientRpc]
|
|
public void DropItemClientRpc(NetworkObjectReference objectRef, Vector3 targetFloorPosition, bool droppedInNest)
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Client && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
ClientRpcParams clientRpcParams = default(ClientRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendClientRpc(847487221u, clientRpcParams, RpcDelivery.Reliable);
|
|
bufferWriter.WriteValueSafe(in objectRef, default(FastBufferWriter.ForNetworkSerializable));
|
|
bufferWriter.WriteValueSafe(in targetFloorPosition);
|
|
bufferWriter.WriteValueSafe(in droppedInNest, default(FastBufferWriter.ForPrimitives));
|
|
__endSendClientRpc(ref bufferWriter, 847487221u, clientRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost))
|
|
{
|
|
if (objectRef.TryGet(out var networkObject))
|
|
{
|
|
DropItem(networkObject, targetFloorPosition, droppedInNest);
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError(base.gameObject.name + ": Failed to get network object from network object reference (Drop item RPC)");
|
|
}
|
|
}
|
|
}
|
|
|
|
[ServerRpc]
|
|
public void GrabItemServerRpc(NetworkObjectReference objectRef)
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Server && (networkManager.IsClient || networkManager.IsHost))
|
|
{
|
|
if (base.OwnerClientId != networkManager.LocalClientId)
|
|
{
|
|
if (networkManager.LogLevel <= LogLevel.Normal)
|
|
{
|
|
Debug.LogError("Only the owner can invoke a ServerRpc that requires ownership!");
|
|
}
|
|
return;
|
|
}
|
|
ServerRpcParams serverRpcParams = default(ServerRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendServerRpc(2358561451u, serverRpcParams, RpcDelivery.Reliable);
|
|
bufferWriter.WriteValueSafe(in objectRef, default(FastBufferWriter.ForNetworkSerializable));
|
|
__endSendServerRpc(ref bufferWriter, 2358561451u, serverRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
GrabItemClientRpc(objectRef);
|
|
}
|
|
}
|
|
|
|
[ClientRpc]
|
|
public void GrabItemClientRpc(NetworkObjectReference objectRef)
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Client && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
ClientRpcParams clientRpcParams = default(ClientRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendClientRpc(1536760829u, clientRpcParams, RpcDelivery.Reliable);
|
|
bufferWriter.WriteValueSafe(in objectRef, default(FastBufferWriter.ForNetworkSerializable));
|
|
__endSendClientRpc(ref bufferWriter, 1536760829u, clientRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost))
|
|
{
|
|
SwitchToBehaviourStateOnLocalClient(1);
|
|
if (objectRef.TryGet(out var networkObject))
|
|
{
|
|
GrabItem(networkObject);
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError(base.gameObject.name + ": Failed to get network object from network object reference (Grab item RPC)");
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DropItem(NetworkObject item, Vector3 targetFloorPosition, bool droppingInNest = true)
|
|
{
|
|
if (sendingGrabOrDropRPC)
|
|
{
|
|
sendingGrabOrDropRPC = false;
|
|
return;
|
|
}
|
|
Debug.Log("Running drop item function");
|
|
if (heldItem == null)
|
|
{
|
|
Debug.LogError("Hoarder bug: my held item is null when attempting to drop it!!");
|
|
return;
|
|
}
|
|
GrabbableObject itemGrabbableObject = heldItem.itemGrabbableObject;
|
|
itemGrabbableObject.parentObject = null;
|
|
itemGrabbableObject.transform.SetParent(StartOfRound.Instance.propsContainer, worldPositionStays: true);
|
|
itemGrabbableObject.EnablePhysics(enable: true);
|
|
itemGrabbableObject.fallTime = 0f;
|
|
Debug.Log($"target floor position before: {itemGrabbableObject.targetFloorPosition}");
|
|
itemGrabbableObject.startFallingPosition = itemGrabbableObject.transform.parent.InverseTransformPoint(itemGrabbableObject.transform.position);
|
|
itemGrabbableObject.targetFloorPosition = itemGrabbableObject.transform.parent.InverseTransformPoint(targetFloorPosition);
|
|
itemGrabbableObject.floorYRot = -1;
|
|
itemGrabbableObject.DiscardItemFromEnemy();
|
|
Debug.Log($"target floor position after: {itemGrabbableObject.targetFloorPosition}");
|
|
heldItem = null;
|
|
if (!droppingInNest)
|
|
{
|
|
grabbableObjectsInMap.Add(itemGrabbableObject.gameObject);
|
|
}
|
|
Debug.Log("Dropped item");
|
|
}
|
|
|
|
private void GrabItem(NetworkObject item)
|
|
{
|
|
if (sendingGrabOrDropRPC)
|
|
{
|
|
sendingGrabOrDropRPC = false;
|
|
return;
|
|
}
|
|
Debug.Log($"held item null: {heldItem == null}");
|
|
if (heldItem != null)
|
|
{
|
|
Debug.Log(base.gameObject.name + ": Trying to grab another item (" + item.gameObject.name + ") while hands are already full with item (" + item.gameObject.name + "). Dropping the currently held one.");
|
|
DropItem(heldItem.itemGrabbableObject.GetComponent<NetworkObject>(), heldItem.itemGrabbableObject.GetItemFloorPosition());
|
|
}
|
|
targetItem = null;
|
|
GrabbableObject component = item.gameObject.GetComponent<GrabbableObject>();
|
|
HoarderBugItems.Add(new HoarderBugItem(component, HoarderBugItemStatus.Owned, nestPosition));
|
|
heldItem = HoarderBugItems[HoarderBugItems.Count - 1];
|
|
component.parentObject = grabTarget;
|
|
component.hasHitGround = false;
|
|
component.GrabItemFromEnemy();
|
|
component.EnablePhysics(enable: false);
|
|
grabbableObjectsInMap.Remove(component.gameObject);
|
|
Debug.Log(base.gameObject.name + ": Grabbing item!!! " + heldItem.itemGrabbableObject.gameObject.name);
|
|
}
|
|
|
|
public override void OnCollideWithPlayer(Collider other)
|
|
{
|
|
base.OnCollideWithPlayer(other);
|
|
Debug.Log("HA1");
|
|
if (!inChase)
|
|
{
|
|
return;
|
|
}
|
|
Debug.Log("HA2");
|
|
if (!(timeSinceHittingPlayer < 0.5f))
|
|
{
|
|
Debug.Log("HA3");
|
|
PlayerControllerB playerControllerB = MeetsStandardPlayerCollisionConditions(other);
|
|
if (playerControllerB != null)
|
|
{
|
|
Debug.Log("HA4");
|
|
timeSinceHittingPlayer = 0f;
|
|
playerControllerB.DamagePlayer(30, hasDamageSFX: true, callRPC: true, CauseOfDeath.Mauling);
|
|
HitPlayerServerRpc();
|
|
}
|
|
}
|
|
}
|
|
|
|
[ServerRpc(RequireOwnership = false)]
|
|
public void HitPlayerServerRpc()
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
if (__rpc_exec_stage != __RpcExecStage.Server && (networkManager.IsClient || networkManager.IsHost))
|
|
{
|
|
ServerRpcParams serverRpcParams = default(ServerRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendServerRpc(1884379629u, serverRpcParams, RpcDelivery.Reliable);
|
|
__endSendServerRpc(ref bufferWriter, 1884379629u, serverRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
HitPlayerClientRpc();
|
|
}
|
|
}
|
|
}
|
|
|
|
[ClientRpc]
|
|
public void HitPlayerClientRpc()
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
if (__rpc_exec_stage != __RpcExecStage.Client && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
ClientRpcParams clientRpcParams = default(ClientRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendClientRpc(1031891902u, clientRpcParams, RpcDelivery.Reliable);
|
|
__endSendClientRpc(ref bufferWriter, 1031891902u, clientRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost))
|
|
{
|
|
creatureAnimator.SetTrigger("HitPlayer");
|
|
creatureSFX.PlayOneShot(hitPlayerSFX);
|
|
WalkieTalkie.TransmitOneShotAudio(creatureSFX, hitPlayerSFX);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void HitEnemy(int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false)
|
|
{
|
|
base.HitEnemy(force, playerWhoHit);
|
|
Debug.Log("HA");
|
|
if (!isEnemyDead)
|
|
{
|
|
Debug.Log("HB");
|
|
creatureAnimator.SetTrigger("damage");
|
|
angryAtPlayer = playerWhoHit;
|
|
angryTimer += 18f;
|
|
Debug.Log("HC");
|
|
enemyHP -= force;
|
|
if (enemyHP <= 0 && base.IsOwner)
|
|
{
|
|
KillEnemyOnOwnerClient();
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void KillEnemy(bool destroy = false)
|
|
{
|
|
base.KillEnemy();
|
|
agent.speed = 0f;
|
|
creatureVoice.Stop();
|
|
creatureSFX.Stop();
|
|
}
|
|
|
|
public HoarderBugItem CheckLineOfSightForItem(HoarderBugItemStatus searchForItemsOfStatus = HoarderBugItemStatus.Any, float width = 45f, int range = 60, float proximityAwareness = -1f)
|
|
{
|
|
for (int i = 0; i < HoarderBugItems.Count; i++)
|
|
{
|
|
if (!HoarderBugItems[i].itemGrabbableObject.grabbableToEnemies || HoarderBugItems[i].itemGrabbableObject.isHeld || (searchForItemsOfStatus != HoarderBugItemStatus.Any && HoarderBugItems[i].status != searchForItemsOfStatus))
|
|
{
|
|
continue;
|
|
}
|
|
Vector3 position = HoarderBugItems[i].itemGrabbableObject.transform.position;
|
|
if (!Physics.Linecast(eye.position, position, StartOfRound.Instance.collidersAndRoomMaskAndDefault))
|
|
{
|
|
Vector3 to = position - eye.position;
|
|
if (Vector3.Angle(eye.forward, to) < width || Vector3.Distance(base.transform.position, position) < proximityAwareness)
|
|
{
|
|
Debug.Log("SEEING PLAYER");
|
|
return HoarderBugItems[i];
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
protected override void __initializeVariables()
|
|
{
|
|
base.__initializeVariables();
|
|
}
|
|
|
|
[RuntimeInitializeOnLoadMethod]
|
|
internal static void InitializeRPCS_HoarderBugAI()
|
|
{
|
|
NetworkManager.__rpc_func_table.Add(3689917697u, __rpc_handler_3689917697);
|
|
NetworkManager.__rpc_func_table.Add(1841413947u, __rpc_handler_1841413947);
|
|
NetworkManager.__rpc_func_table.Add(3510928244u, __rpc_handler_3510928244);
|
|
NetworkManager.__rpc_func_table.Add(847487221u, __rpc_handler_847487221);
|
|
NetworkManager.__rpc_func_table.Add(2358561451u, __rpc_handler_2358561451);
|
|
NetworkManager.__rpc_func_table.Add(1536760829u, __rpc_handler_1536760829);
|
|
NetworkManager.__rpc_func_table.Add(1884379629u, __rpc_handler_1884379629);
|
|
NetworkManager.__rpc_func_table.Add(1031891902u, __rpc_handler_1031891902);
|
|
}
|
|
|
|
private static void __rpc_handler_3689917697(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
|
|
{
|
|
if (networkManager.LogLevel <= LogLevel.Normal)
|
|
{
|
|
Debug.LogError("Only the owner can invoke a ServerRpc that requires ownership!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
reader.ReadValueSafe(out Vector3 value);
|
|
target.__rpc_exec_stage = __RpcExecStage.Server;
|
|
((HoarderBugAI)target).SyncNestPositionServerRpc(value);
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_1841413947(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
reader.ReadValueSafe(out Vector3 value);
|
|
target.__rpc_exec_stage = __RpcExecStage.Client;
|
|
((HoarderBugAI)target).SyncNestPositionClientRpc(value);
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_3510928244(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
|
|
{
|
|
if (networkManager.LogLevel <= LogLevel.Normal)
|
|
{
|
|
Debug.LogError("Only the owner can invoke a ServerRpc that requires ownership!");
|
|
}
|
|
return;
|
|
}
|
|
reader.ReadValueSafe(out NetworkObjectReference value, default(FastBufferWriter.ForNetworkSerializable));
|
|
reader.ReadValueSafe(out Vector3 value2);
|
|
reader.ReadValueSafe(out bool value3, default(FastBufferWriter.ForPrimitives));
|
|
target.__rpc_exec_stage = __RpcExecStage.Server;
|
|
((HoarderBugAI)target).DropItemServerRpc(value, value2, value3);
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
|
|
private static void __rpc_handler_847487221(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
reader.ReadValueSafe(out NetworkObjectReference value, default(FastBufferWriter.ForNetworkSerializable));
|
|
reader.ReadValueSafe(out Vector3 value2);
|
|
reader.ReadValueSafe(out bool value3, default(FastBufferWriter.ForPrimitives));
|
|
target.__rpc_exec_stage = __RpcExecStage.Client;
|
|
((HoarderBugAI)target).DropItemClientRpc(value, value2, value3);
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_2358561451(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
|
|
{
|
|
if (networkManager.LogLevel <= LogLevel.Normal)
|
|
{
|
|
Debug.LogError("Only the owner can invoke a ServerRpc that requires ownership!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
reader.ReadValueSafe(out NetworkObjectReference value, default(FastBufferWriter.ForNetworkSerializable));
|
|
target.__rpc_exec_stage = __RpcExecStage.Server;
|
|
((HoarderBugAI)target).GrabItemServerRpc(value);
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_1536760829(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
reader.ReadValueSafe(out NetworkObjectReference value, default(FastBufferWriter.ForNetworkSerializable));
|
|
target.__rpc_exec_stage = __RpcExecStage.Client;
|
|
((HoarderBugAI)target).GrabItemClientRpc(value);
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_1884379629(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
target.__rpc_exec_stage = __RpcExecStage.Server;
|
|
((HoarderBugAI)target).HitPlayerServerRpc();
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_1031891902(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
target.__rpc_exec_stage = __RpcExecStage.Client;
|
|
((HoarderBugAI)target).HitPlayerClientRpc();
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
protected internal override string __getTypeName()
|
|
{
|
|
return "HoarderBugAI";
|
|
}
|
|
}
|