public void Pickup(GameObject target) { currentState = CivilianState.CARRY; navMeshAgent.enabled = false; transform.position = target.transform.position; transform.SetParent(target.transform); }
private void closeState(CivilianState state, CivilianState next) { switch (state) { case CivilianState.walkAround: Message("ToStopVisitingWaypoints"); break; case CivilianState.follow: Message("ToStopFollowing"); Message("ToStopFilming"); Message("ToHidePhone"); break; case CivilianState.call: if (next != CivilianState.follow) { Message("ToHidePhone"); } break; case CivilianState.flee: Message("ToStopFleeing"); break; } }
public void Donk() { navMeshAgent.destination = transform.position; myRenderer.material = DonkedCivilianMaterial; currentState = CivilianState.DONKED; SignalManager.Inst.FireSignal(Signal.CIVILIAN_DONKED, new CivilianDonkedArgs(this)); }
// Use this for initialization void Start() { foreach (Transform t in GameObject.FindGameObjectWithTag("targetPositions").transform) { if (t.name == "GeneratorRoom") { GeneratorRoom = t; } else if (t.name == "PrisonRoom") { Prison = t; } else if (t.name == "ExitRoom") { Exit = t; } else if (t.name == "RadiationRoom") { RadiationRoom = t; } else if (t.name == "Entrance") { Entrance = t; } else if (t.name == "HospitalRoom") { MedicalRoom = t; } } switch (currentCharacter) { case CharacterType.CIVILIAN: civState = CivilianState.IDLE; break; case CharacterType.RADIATED_PRISONER: rAttack = GetComponent <RadiatorAttack>(); break; case CharacterType.RADIATED_PERSON: rAttack = GetComponent <RadiatorAttack>(); break; case CharacterType.TECHNICIAN: break; case CharacterType.GUARD: gAttack = GetComponent <GuardAttack>(); break; } }
private void openState(CivilianState state, CivilianState previous) { switch (state) { case CivilianState.idle: if (Vector3.Distance(transform.position, StartingLocation) > 0.25f) { Message("ToWalkTo", StartingLocation); Message("ToFaceWalkDirection"); } break; case CivilianState.walkAround: if (Actor.Cover != null) { Message("ToLeaveCover"); } _waypointCheck = false; Message("ToStartVisitingWaypoints"); if (!_waypointCheck) { setState(CivilianState.idle); } break; case CivilianState.follow: Message("ToStartFollowing", LastKnownThreatPosition); Message("ToTakePhone"); Message("ToStartFilming"); _wasThreatArmed = Threat.IsArmed; if (_wasThreatArmed || !OnlyAlarmedByWeapons) { alarm(); } break; case CivilianState.call: Message("ToTakePhone"); Message("ToCall"); break; case CivilianState.flee: Message("ToStartFleeing", LastKnownThreatPosition); alarm(); break; } }
private void Update() { if (Actor == null || !Actor.IsAlive) { return; } _stateTime += Time.deltaTime; if (Threat != null && CanSeeTheThreat) { SetThreat(Threat, Threat.transform.position, Threat.Cover); } if (_futureSetState != CivilianState.none) { var state = _futureSetState; _futureSetState = CivilianState.none; setState(state); } switch (_state) { case CivilianState.none: setState(CivilianState.walkAround); break; case CivilianState.walkAround: break; case CivilianState.follow: if (!_wasThreatArmed) { _wasThreatArmed = Threat.IsArmed; if (_wasThreatArmed) { alarm(); } } break; case CivilianState.flee: break; } }
void OnCollisionEnter(Collision collider) { if (aiState.Equals(CivilianState.NORMAL)) { if (collider.gameObject.GetComponent <Vehicle>() != null) { ; if (Random.Range(0, 5) == 0) { aiState = CivilianState.FRENZIED; } else { aiState = CivilianState.HALTED; } } } }
private void openState(CivilianState state, CivilianState previous) { switch (state) { case CivilianState.none: break; case CivilianState.walkAround: if (Actor.Cover != null) { Message("ToLeaveCover"); } Message("ToStartVisitingWaypoints"); break; case CivilianState.follow: Message("ToStartFollowing", LastKnownThreatPosition); Message("ToTakePhone"); Message("ToStartFilming"); _wasThreatArmed = Threat.IsArmed; if (_wasThreatArmed || !OnlyAlarmedByWeapons) { alarm(); } break; case CivilianState.call: Message("ToTakePhone"); Message("ToCall"); break; case CivilianState.flee: Message("ToStartFleeing", LastKnownThreatPosition); alarm(); break; } }
private void setState(CivilianState state, bool forceRestart = false) { if (_state == state && !forceRestart) { return; } if (_state != state) { _previousState = _state; } closeState(_state, state); _stateTime = 0; _state = state; openState(_state, _previousState); if (!_wasAlerted && IsAlerted) { _wasAlerted = true; Message("OnAlerted"); } }
// Update is called once per frame void Update() { //temp for test navMeshAgent.stoppingDistance = stopDist; //--------------------------------------- primaryTargetForRadiator = null; secondaryTargetForRadiator = null; runFromObj = null; targetForGuard = null; if (rAttack != null) { rAttack.mainTarget = null; rAttack.sideTarget = null; } if (CharacterType.RADIATED_PERSON == currentCharacter) { if (timeElapsed >= BigRadDelay && bigRadState == BigRadState.INACTIVE) { bigRadState = BigRadState.MOVING_TO_HELP_OTHERS; GetComponent <Brain>().isFree = true; target = Prison.transform.position; } else if (timeElapsed < BigRadDelay && bigRadState == BigRadState.INACTIVE) { timeElapsed += Time.deltaTime; } if (bigRadState == BigRadState.MOVING_TO_HELP_OTHERS && target != Prison.transform.position) { target = Prison.transform.position; } // Free the prisoners. if (bigRadState == BigRadState.HELPING_OTHERS) { // Get the prison free triggers in his vicinity. tempColliders = Physics.OverlapSphere(transform.position, rAttack.attackRange * 4, PrisonFreeTriggerLayer); if (tempColliders.Length > 0) { if ((target != tempColliders[0].transform.position)) { target = tempColliders[0].gameObject.transform.position; } } else { bigRadState = BigRadState.ESCAPING; } } if (bigRadState == BigRadState.ESCAPING) { target = Exit.position; } if (escaped && (bigRadState == BigRadState.HELPING_OTHERS)) { target = Exit.position; bigRadState = BigRadState.ESCAPING; } } if (CharacterType.RADIATED_PRISONER == currentCharacter && isFree) { if (bigRadState == BigRadState.ESCAPING) { target = Exit.position; } } // Logic for running away. if ((CharacterType.CIVILIAN == currentCharacter && civState == CivilianState.IDLE) || (CharacterType.TECHNICIAN == currentCharacter && techState == TechnicianState.IDLE)) { tempColliders = Physics.OverlapSphere(transform.position, CivilianRadius, RadiatedLayerMask); if (tempColliders.Length >= 1) { foreach (Collider tempCollider in tempColliders) { shootDirection = (tempCollider.transform.position - transform.position).normalized; distance = Vector3.Distance(transform.position, tempCollider.transform.position); hits = Physics.RaycastAll(transform.position, shootDirection, distance).OrderBy(h => h.distance).ToArray(); // Loop until you find a rad with no obstruction in the middle. if (hits.Length <= 0 || ((RadiatedLayerMask & 1 << hits[0].transform.gameObject.layer) == 0)) { runFromObj = null; continue; } // Target only free rads. if (tempCollider.gameObject.GetComponent <Brain>().isFree) { runFromObj = tempCollider.gameObject; break; } } if (null != runFromObj && null != runFromObj.transform) { target = transform.position + (-2 * shootDirection * distance); techState = TechnicianState.RUN; civState = CivilianState.RUN; } } } // Guard Attack if (CharacterType.GUARD == currentCharacter) { // Check for the surroundings to see any idiots radiated and running around. tempColliders = Physics.OverlapSphere(transform.position, gAttack.attackRange, RadiatedLayerMask); if (tempColliders.Length >= 1) { foreach (Collider tempCollider in tempColliders) { shootDirection = (tempCollider.transform.position - transform.position).normalized; distance = Vector3.Distance(transform.position, tempCollider.transform.position); hits = Physics.RaycastAll(transform.position, shootDirection, distance).OrderBy(h => h.distance).ToArray(); // Loop until you find a rad with no obstruction in the middle. if (hits.Length <= 0 || (hits[0].transform.gameObject != tempCollider.gameObject)) { targetForGuard = null; continue; } // Target only free rads. if (tempCollider.gameObject.GetComponent <Brain>().isFree) { targetForGuard = tempCollider.gameObject; } } if (null != targetForGuard && null != targetForGuard.GetComponent <GeneralRadiator>()) { // Check if the object still exists. if (null != targetForGuard.transform) { gAttack.target = targetForGuard.GetComponent <GeneralRadiator>(); if (gAttack.IsReadyToAttack) { gAttack.Attack(); } } } } } // Radiators Attack. if ((CharacterType.RADIATED_PERSON == currentCharacter && bigRadState != BigRadState.INACTIVE) || (CharacterType.RADIATED_PRISONER == currentCharacter && bigRadState != BigRadState.INACTIVE)) { tempColliders = Physics.OverlapSphere(transform.position, rAttack.attackRange, NormalPeopleLayerMask); if (tempColliders.Length >= 1) { foreach (Collider tempCollider in tempColliders) { shootDirection = (tempCollider.transform.position - transform.position).normalized; distance = Vector3.Distance(transform.position, tempCollider.transform.position); hits = Physics.RaycastAll(transform.position, shootDirection, distance).OrderBy(h => h.distance).ToArray(); // Loop until you find a rad with no obstruction in the middle. if (hits.Length <= 0 || (hits[0].transform.gameObject != tempCollider.gameObject)) { rayHitFirstObj = hits[0].transform.gameObject; primaryTargetForRadiator = null; continue; } rayHitFirstObj = hits[0].transform.gameObject; primaryTargetForRadiator = tempCollider.gameObject; isRadShooting = true; // Banking on the fact that this doesn't happen usually when the player is playing. break; } if (null != primaryTargetForRadiator && null != primaryTargetForRadiator.transform) { newTempColliders = Physics.OverlapSphere(primaryTargetForRadiator.transform.position, rAttack.attackRange, NormalPeopleLayerMask); if (newTempColliders.Length >= 1) { foreach (Collider newTempCollider in newTempColliders) { shootDirection = -1 * (primaryTargetForRadiator.transform.position - newTempCollider.transform.position).normalized; distance = Vector3.Distance(primaryTargetForRadiator.transform.position, newTempCollider.transform.position); hits = Physics.RaycastAll(primaryTargetForRadiator.transform.position, shootDirection, distance).OrderBy(h => h.distance).ToArray(); if (hits.Length <= 0 || (hits[0].transform.gameObject != newTempCollider.gameObject)) { continue; } secondaryTargetForRadiator = newTempCollider.gameObject; break; } } if (null != primaryTargetForRadiator && null != primaryTargetForRadiator.GetComponent <GeneralPeople>()) { rAttack.mainTarget = primaryTargetForRadiator.GetComponent <GeneralPeople>(); if (null != secondaryTargetForRadiator && null != secondaryTargetForRadiator.GetComponent <GeneralPeople>()) { rAttack.sideTarget = secondaryTargetForRadiator.GetComponent <GeneralPeople>(); } if (rAttack.IsReadyToAttack) { rAttack.Attack(); } } } } if (null == primaryTargetForRadiator || null == primaryTargetForRadiator.transform) { isRadShooting = false; } } if ((currentCharacter == CharacterType.RADIATED_PERSON || currentCharacter == CharacterType.RADIATED_PRISONER) && isRadShooting) { navMeshAgent.speed = 0; } else { navMeshAgent.speed = bigRadSpeed; } navMeshDestination = navMeshAgent.destination; distance = Vector3.Distance(target, new Vector3(0.0f, 0.0f, 0.0f)); if (target != null && (distance != 0) && (target.x != navMeshAgent.destination.x && target.z != navMeshAgent.destination.z)) { navMeshAgent.SetDestination(target); } }
public void DropOff() { currentState = CivilianState.DROPOFF; navMeshAgent.enabled = true; navMeshAgent.destination = Jail.Inst.transform.position; }
public void SetAiStateToNormal() { aiState = CivilianState.NORMAL; }
public void Halt() { aiState = CivilianState.HALTED; }