/// <summary> /// this method 1) determines if the colliding object is a player /// that we will do something about, and 2) stores the collider and /// player event handler that will be manipulated. a dictionary is /// used to remember past players so we don't have to scan their /// hierarchy for an event handler every time /// </summary> public bool GetPlayer(Collider col) { if ((col.gameObject.layer != vp_Layer.LocalPlayer) && (col.gameObject.layer != vp_Layer.RemotePlayer)) { return(false); } // see if this is a valid player object, or auto-approve // if it has been recently validated if (!m_KnownPlayers.ContainsKey(col)) { vp_PlayerEventHandler player = col.transform.root.GetComponent <vp_PlayerEventHandler>(); if (player == null) { return(false); } m_KnownPlayers.Add(col, player); } if (!m_KnownPlayers.TryGetValue(col, out m_PlayerToPush)) { return(false); } m_PlayerCollider = col; return(true); }
public override void OnAwake() { agent = gameObject.GetComponent<vp_PlayerEventHandler>(); if (rotateWeapon.Value) { weaponHandler = gameObject.GetComponent<vp_WeaponHandler>(); } }
/// <summary> /// tries to add 'Health' to the player /// </summary> protected override bool TryGive(vp_PlayerEventHandler player) { if (player.Health.Get() < 0.0f) { return(false); } if (player.Health.Get() >= player.MaxHealth.Get()) { return(false); } // if this is singleplayer or we are a multiplayer master, update health if (vp_Gameplay.IsMaster) { player.Health.Set(Mathf.Min(player.MaxHealth.Get(), (player.Health.Get() + Health))); } // a multiplayer master transmits the health across the network if ((vp_Gameplay.IsMultiplayer) && (vp_Gameplay.IsMaster)) { vp_GlobalEvent <Transform, Transform, float> .Send("TransmitDamage", player.transform.root, transform.root, -Health); } // returning true here even if we're a multiplayer client (and health hasn't changed locally yet) // to prevent a fail sound from playing before master has allowed the health to be added return(true); }
/// <summary> /// /// </summary> protected virtual void Awake() { m_Audio = GetComponent <AudioSource>(); // store the first player event handler found in the top of our transform hierarchy m_Player = (vp_PlayerEventHandler)transform.root.GetComponentInChildren(typeof(vp_PlayerEventHandler)); }
/// <summary> /// /// </summary> protected virtual void Awake() { // store the first player event handler found in the top of our transform hierarchy m_Player = (vp_PlayerEventHandler)transform.root.GetComponentInChildren(typeof(vp_PlayerEventHandler)); }
/// <summary> /// this is triggered when an object enters the collider and /// InteractType is set to trigger /// </summary> protected virtual void OnTriggerEnter(Collider col) { // only do something if the trigger is of type Trigger if (InteractType != vp_InteractType.Trigger) { return; } // see if the colliding object was a valid recipient foreach (string s in RecipientTags) { if (col.gameObject.tag == s) { goto isRecipient; } } return; isRecipient: m_Player = col.gameObject.GetComponent <vp_PlayerEventHandler>(); if (m_Player == null) { return; } // calls the TryInteract method which is hopefully on the inherited class TryInteract(m_Player); }
/// <summary> /// this method 1) determines if the colliding object is a player /// that we will do something about, and 2) stores the collider and /// player event handler that will be manipulated. a dictionary is /// used to remember past players so we don't have to scan their /// hierarchy for an event handler every time /// </summary> public bool GetPlayer(Collider col) { if ( (col.gameObject.layer != vp_Layer.IgnoreBullets) && // typical layer for the trigger collider of local player (col.gameObject.layer != vp_Layer.LocalPlayer) && // for local players that have no collision trigger (col.gameObject.layer != vp_Layer.RemotePlayer) // multiplayer remote players ) { return(false); } // see if this is a valid player object, or auto-approve if it has been recently validated if (!m_KnownPlayers.ContainsKey(col)) { vp_PlayerEventHandler player = col.transform.root.GetComponent <vp_PlayerEventHandler>(); if (player == null) { return(false); } m_KnownPlayers.Add(col, player); } if (!m_KnownPlayers.TryGetValue(col, out m_PlayerToPush)) { return(false); } m_PlayerCollider = col; return(true); }
public override void OnAwake() { if (agent == null) { agent = gameObject.GetComponent <vp_PlayerEventHandler>(); } }
/// <summary> /// try to interact with this object /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if (Target == null) { return(false); } if (m_Player == null) { m_Player = player; } PlaySound(); if (string.IsNullOrEmpty(TargetValue)) { Target.SendMessage(TargetMethod, SendMessageOptions.DontRequireReceiver); } else { Target.SendMessage(TargetMethod, TargetValue, SendMessageOptions.DontRequireReceiver); } return(true); }
/// <summary> /// try to press this platform switch. this will have effect /// in singleplayer, but only in multiplayer if we're the /// master / server. sounds will always play and timers will /// be maintained in case of a master client handover /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if(Platform == null) return false; if(m_Player == null) m_Player = player; if(Time.time < m_Timeout) return false; PlaySound(); // only try to actually operate the platform if we're the master. // if we're just a client the master should detect the trigger enter // too, and should activate the platform remotely if (vp_Gameplay.isMaster) Platform.SendMessage("GoTo", Platform.TargetedWaypoint == 0 ? 1 : 0, SendMessageOptions.DontRequireReceiver); else if (InteractType == vp_InteractType.Normal) this.SendMessage("ClientTryInteract"); m_Timeout = Time.time + SwitchTimeout; m_IsSwitched = !m_IsSwitched; return true; }
/// <summary> /// /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if (!enabled) { return(false); } if (!(player is vp_FPPlayerEventHandler)) { return(false); } if (Time.time < m_CanClimbAgain) { return(false); } if (m_IsClimbing) { m_Player.Climb.TryStop(); return(false); } if (m_Player == null) { m_Player = player; } if (m_Player.Interactable.Get() != null) { return(false); } if (m_Controller == null) { m_Controller = m_Player.GetComponent <vp_FPController>(); } if (m_Player.Velocity.Get().magnitude > MinVelocityToClimb) { return(false); } if (m_Camera == null) { m_Camera = m_Player.GetComponentInChildren <vp_FPCamera>(); } if (Sounds.AudioSource == null) { Sounds.AudioSource = m_Player.GetComponent <AudioSource>(); } m_Player.Register(this); m_Player.Interactable.Set(this); // sets what the player is currently interacting with return(m_Player.Climb.TryStart()); }
public override void OnAwake() { agent = gameObject.GetComponent <vp_PlayerEventHandler>(); if (rotateWeapon.Value) { weaponHandler = gameObject.GetComponent <vp_WeaponHandler>(); } }
/// <summary> /// this is triggered when an object enters the collider /// </summary> protected virtual void OnTriggerEnter(Collider col) { // only do something if the trigger is still active if (m_Depleted) { return; } // see if the colliding object was a valid recipient foreach (string s in RecipientTags) { if (col.gameObject.tag == s) { goto isRecipient; } } return; isRecipient: // if collider is not the same as last time we were picked up // (or this is the first time) scan the collider gameobject for // a player event handler if (col != m_LastCollider) { m_Recipient = col.gameObject.GetComponent <vp_PlayerEventHandler>(); } if (m_Recipient == null) { return; } if (TryGive(m_Recipient)) { m_Audio.pitch = PickupSoundSlomo ? Time.timeScale : 1.0f; m_Audio.Play(); m_Renderer.enabled = false; m_Depleted = true; if (m_Recipient is vp_FPPlayerEventHandler) { (m_Recipient as vp_FPPlayerEventHandler).HUDText.Send(GiveMessage); } } else if (!m_AlreadyFailed) { if (!vp_Gameplay.IsMultiplayer || (vp_Gameplay.IsMultiplayer && (m_Recipient is vp_FPPlayerEventHandler))) { m_Audio.pitch = FailSoundSlomo ? Time.timeScale : 1.0f; m_Audio.PlayOneShot(PickupFailSound); } m_AlreadyFailed = true; if (m_Recipient is vp_FPPlayerEventHandler) { (m_Recipient as vp_FPPlayerEventHandler).HUDText.Send(FailMessage); } } }
/// <summary> /// /// </summary> protected virtual void Awake() { // store the first player event handler found in the top of our transform hierarchy m_Player = (vp_PlayerEventHandler)transform.root.GetComponentInChildren(typeof(vp_PlayerEventHandler)); if (Weapons != null) { StartWeapon = Mathf.Clamp(StartWeapon, 0, Weapons.Count); } }
/// <summary> /// tries to enable 'State' on the player /// </summary> protected override bool TryGive(vp_PlayerEventHandler player) { // prevent the player from picking up the item again until any // currently running speed timer has run its course if (m_Timer.Active) { return(false); } if (string.IsNullOrEmpty(State)) { return(false); } // --- proper way of doing speed --- // for something like this we use the State Manager and vp_Timer! // in the powerup demo folder you will find a controller preset // named 'ControllerMegaSpeed.txt' which boosts player acceleration // and increases its push force on rigidbodies. // in the demo scene this has been added as a state named 'MegaSpeed' // to the controller component player.SetState(State); // restore state after 'Duration' seconds. if that's not set, uses // the powerup's 'RespawnDuration' vp_Timer.In(((Duration <= 0.0f) ? RespawnDuration : Duration), delegate() { player.SetState(State, false); }, m_Timer); // NOTE: binding the 'm_Timer' handle above makes sure this timer // is canceled and restarted if it's already running. if you allow // players to pick up multiple powerups, this will prevent a depleted // powerup from disabling the state if the player has enabled a new one // while the previous one is active (i.e. the timer will be restarted) // --- buggy way of doing speed --- // the below would also be a way of adding speed, but it would get messed up // if player pressed or released the 'Run' modifier key. speed would multiply // in case of several powerups and we would have to store the original controller // acceleration value in a 'Start' method. messy and error-prone. use states. //Player.Controller.MotorAcceleration *= 4.0f; //vp_Timer.In(Value, delegate() //{ // Player.Controller.MotorAcceleration *= 0.25f; // ... or a stored original speed //}); return(true); }
/// <summary> /// try to interact with this object /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if(Target == null) return false; if(m_Player == null) m_Player = player; PlaySound(); Target.SendMessage(TargetMessage, SendMessageOptions.DontRequireReceiver); return true; }
/// <summary> /// /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if (ItemPickup == null) { return(false); } if (m_Player == null) { m_Player = player; } ItemPickup.TryGiveTo(m_Player.GetComponent <Collider>()); return(true); }
/// <summary> /// determines if this powerup is allowed to start slow motion. /// NOTE: actual slomo implementation occurs in Update /// </summary> protected override bool TryGive(vp_PlayerEventHandler player) { m_Player = player; // prevent the player from picking up the item again until any // currently running slomo timer has run its course if (m_Depleted || Time.timeScale != 1.0f) { return(false); } // nothing more happens here the actual slomo logic is done in // Update, since it needs to call 'vp_TimeUtility.FadeTimeScale' // every frame return(true); }
/// <summary> /// try to interact with this object /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if (Target == null) { return(false); } if (m_Player == null) { m_Player = player; } PlaySound(); Target.SendMessage(TargetMessage, SendMessageOptions.DontRequireReceiver); return(true); }
/// <summary> /// /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if(!enabled) return false; if (!(player is vp_FPPlayerEventHandler)) return false; if(Time.time < m_CanClimbAgain) return false; if(m_IsClimbing) { m_Player.Climb.TryStop(); return false; } if(m_Player == null) m_Player = player; if(m_Player.Interactable.Get() != null) return false; if(m_Controller == null) m_Controller = m_Player.GetComponent<vp_FPController>(); if (m_Player.Velocity.Get().magnitude > MinVelocityToClimb) return false; if(m_Camera == null) m_Camera = m_Player.GetComponentInChildren<vp_FPCamera>(); if(Sounds.AudioSource == null) Sounds.AudioSource = m_Player.GetComponent<AudioSource>(); m_Player.Register(this); m_Player.Interactable.Set(this); // sets what the player is currently interacting with return m_Player.Climb.TryStart(); }
/// <summary> /// try to press this platform switch. this will have effect /// in singleplayer, but only in multiplayer if we're the /// master / server. sounds will always play and timers will /// be maintained in case of a master client handover /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if (Platform == null) { return(false); } if (m_Player == null) { m_Player = player; } if (Time.time < m_Timeout) { return(false); } PlaySound(); // only try to actually operate the platform if we're the master. // if we're just a client the master should detect the trigger enter // too, and should activate the platform remotely if (vp_Gameplay.IsMaster) { Platform.SendMessage("GoTo", Platform.TargetedWaypoint == 0 ? 1 : 0, SendMessageOptions.DontRequireReceiver); } else if (InteractType == vp_InteractType.Normal) { this.SendMessage("ClientTryInteract"); } m_Timeout = Time.time + SwitchTimeout; m_IsSwitched = !m_IsSwitched; return(true); }
public override bool TryInteract(vp_PlayerEventHandler player) { return(base.TryInteract(player)); }
/// <summary> /// Checks to see if we have a player capable of interacting /// with this object, and if so starts or stops grabbing. /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if (!(player is vp_FPPlayerEventHandler)) { return(false); } if (m_Player == null) { m_Player = player; } if (player == null) { return(false); } if (m_Controller == null) { m_Controller = m_Player.GetComponent <vp_FPController>(); } if (m_Controller == null) { return(false); } if (m_Camera == null) { m_Camera = m_Player.GetComponentInChildren <vp_FPCamera>(); } if (m_Camera == null) { return(false); } if (m_WeaponHandler == null) { m_WeaponHandler = m_Player.GetComponentInChildren <vp_WeaponHandler>(); } if (m_Audio == null) { m_Audio = m_Player.GetComponent <AudioSource>(); } m_Player.Register(this); if (!m_IsGrabbed) { StartGrab(); // start the grab } else { StopGrab(); // if object grabbed, stop the grab } // set this object as the one the player is currently // interacting with m_Player.Interactable.Set(this); // if we have a grab state crosshair, set it if (GrabStateCrosshair != null) { FPPlayer.Crosshair.Set(GrabStateCrosshair); } else { FPPlayer.Crosshair.Set(new Texture2D(0, 0)); } return(true); }
public override void OnReset() { itemName = ""; agent = null; }
public override void OnReset() { weaponName = ""; agent = null; }
public override void OnAwake() { if (agent == null) { agent = gameObject.GetComponent<vp_PlayerEventHandler>(); } }
/// <summary> /// This should be overriden and starts the interaction /// </param> public virtual bool TryInteract(vp_PlayerEventHandler player) { return(false); // if not overridden, just prevent interaction }
public override void OnReset() { weaponIndex = 0; agent = null; }
/// <summary> /// /// </summary> protected virtual void Awake() { // store the first player event handler found in the top of our transform hierarchy m_Player = (vp_PlayerEventHandler)transform.root.GetComponentInChildren(typeof(vp_PlayerEventHandler)); if(Weapons != null) StartWeapon = Mathf.Clamp(StartWeapon, 0, Weapons.Count); }
/// <summary> /// This should be overriden and starts the interaction /// </param> public virtual bool TryInteract(vp_PlayerEventHandler player) { return false; // if not overridden, just prevent interaction }
/// <summary> /// this is triggered when an object enters the collider and /// InteractType is set to trigger /// </summary> protected virtual void OnTriggerEnter(Collider col) { // only do something if the trigger is of type Trigger if (InteractType != vp_InteractType.Trigger) return; // see if the colliding object was a valid recipient foreach(string s in RecipientTags) { if(col.gameObject.tag == s) goto isRecipient; } return; isRecipient: m_Player = col.gameObject.GetComponent<vp_PlayerEventHandler>(); if (m_Player == null) return; // calls the TryInteract method which is hopefully on the inherited class TryInteract(m_Player); }
public override void OnReset() { agent = null; }
/// <summary> /// creates a copy of the currently selected UFPS player gameobject /// - stripped of all its 1st person functionality. the new object /// can be used for AI or multiplayer remote players /// </summary> public static void Generate() { GameObject target = Selection.activeObject as GameObject; if ((target == null) || (!vp_Utility.IsActive(target)) || (target.GetComponentInChildren <vp_FPController>() == null) && (target.GetComponentInChildren <vp_FPCamera>() == null)) { EditorUtility.DisplayDialog("Failed to run wizard", "Please select the main gameobject of a 1st person player in the Hierarchy view (make sure it's active) and try again.", "OK"); return; } if (!EditorUtility.DisplayDialog("Generate Remote Player?", "This wizard will create a copy of the selected player object - stripped of all its 1st person functionality. This new object can be used for AI or multiplayer remote players.\n\nNOTE: Only default UFPS classes will be processed.", "OK", "Cancel")) { return; } DecideCopyStates(target); string name = target.name + "(Remote)"; // generate - and operate upon - a copy of the target target = (GameObject)GameObject.Instantiate(target); target.name = target.name.Replace("(Clone)", ""); try { // layer likely should no longer be 'LocalPlayer', so default to 'RemotePlayer' target.gameObject.layer = vp_Layer.RemotePlayer; // convert weapons ConvertWeaponsTo3rdPerson(target); // find any charactercontroller and convert it into a capsulecollider with a rigidbody CharacterController ch = target.GetComponentInChildren <CharacterController>(); if (ch != null) { if (ch.transform.GetComponent <Rigidbody>() == null) { CapsuleCollider ca = ch.gameObject.AddComponent <CapsuleCollider>(); ca.radius = ch.radius; ca.height = ch.height; ca.center = ca.center; Rigidbody r = ch.gameObject.AddComponent <Rigidbody>(); r.useGravity = false; r.isKinematic = true; r.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic; } } // convert 1st person controller vp_FPController fpController = target.GetComponent <vp_FPController>(); if (fpController != null) { vp_CapsuleController cController = target.AddComponent <vp_CapsuleController>(); vp_EditorUtility.CopyValuesFromDerivedComponent(fpController, cController, true, false, null); // TEST: fpcontroller is not derived from capsulecontroller! see note in 'GenerateStatesAndPresetsFromDerivedComponent' if (m_CopyStates && !string.IsNullOrEmpty(m_StatePath)) { vp_EditorUtility.GenerateStatesAndPresetsFromDerivedComponent(fpController, cController, m_StatePath); } } // convert weapon handler vp_FPWeaponHandler fpWHandler = target.GetComponent <vp_FPWeaponHandler>(); if (fpWHandler != null) { vp_WeaponHandler wHandler = target.AddComponent <vp_WeaponHandler>(); vp_EditorUtility.CopyValuesFromDerivedComponent(fpWHandler, wHandler, true, false, null); } // convert damage handler vp_FPPlayerDamageHandler fpDHandler = target.GetComponent <vp_FPPlayerDamageHandler>(); if (fpDHandler != null) { vp_PlayerDamageHandler dHandler = target.AddComponent <vp_PlayerDamageHandler>(); vp_EditorUtility.CopyValuesFromDerivedComponent(fpDHandler, dHandler, true, true, null); } // convert event handler vp_FPPlayerEventHandler fpEHandler = target.GetComponent <vp_FPPlayerEventHandler>(); if (fpEHandler != null) { vp_PlayerEventHandler eHandler = target.AddComponent <vp_PlayerEventHandler>(); vp_EditorUtility.CopyValuesFromDerivedComponent(fpEHandler, eHandler, true, false, null); } // convert body animator vp_FPBodyAnimator fpBAnimator = target.GetComponentInChildren <vp_FPBodyAnimator>(); if (fpBAnimator != null) { vp_BodyAnimator bAnimator = fpBAnimator.gameObject.AddComponent <vp_BodyAnimator>(); vp_EditorUtility.CopyValuesFromDerivedComponent(fpBAnimator, bAnimator, true, true, null); } // delete 'remoteplayer-illegal' components DeleteComponentsOfType(target.transform, typeof(vp_FPCamera)); // these first due to dependencies DeleteComponentsOfType(target.transform, typeof(vp_FPController)); // these first due to dependencies DeleteComponentsOfTypes(target.transform, new System.Type[] { typeof(Camera), typeof(AudioListener), typeof(vp_FPInput), typeof(vp_SimpleCrosshair), typeof(vp_FootstepManager), typeof(vp_FPInteractManager), typeof(vp_SimpleHUD), typeof(vp_PainHUD), typeof(vp_FPEarthquake), typeof(CharacterController), typeof(vp_FPWeaponHandler), typeof(vp_FPPlayerDamageHandler), typeof(vp_FPPlayerEventHandler), typeof(vp_FPBodyAnimator) }); Transform weaponCamera = vp_Utility.GetTransformByNameInChildren(target.transform, "WeaponCamera", true); if (weaponCamera != null) { GameObject.DestroyImmediate(weaponCamera.gameObject); } target.name = name; } catch (System.Exception e) { Debug.Log(e); target.name = target.name + " (CONVERSION FAILED - see error log)"; } }
/// <summary> /// Checks to see if we have a player capable of interacting /// with this object, and if so starts or stops grabbing. /// </summary> public override bool TryInteract(vp_PlayerEventHandler player) { if (!(player is vp_FPPlayerEventHandler)) return false; if (m_Player == null) m_Player = player; if (player == null) return false; if (m_Controller == null) m_Controller = m_Player.GetComponent<vp_FPController>(); if (m_Controller == null) return false; if (m_Camera == null) m_Camera = m_Player.GetComponentInChildren<vp_FPCamera>(); if (m_Camera == null) return false; if (m_WeaponHandler == null) m_WeaponHandler = m_Player.GetComponentInChildren<vp_WeaponHandler>(); if (m_Audio == null) m_Audio = m_Player.GetComponent<AudioSource>(); m_Player.Register(this); if (!m_IsGrabbed) StartGrab(); // start the grab else StopGrab(); // if object grabbed, stop the grab // set this object as the one the player is currently // interacting with m_Player.Interactable.Set(this); // if we have a grab state crosshair, set it if (GrabStateCrosshair != null) FPPlayer.Crosshair.Set(GrabStateCrosshair); else FPPlayer.Crosshair.Set(new Texture2D(0, 0)); return true; }
/// <summary> /// IMPORTANT: this method must be overridden by the implementing powerup class. /// see 'vp_HealthPowerup', 'vp_SpeedPowerup' and 'vp_SlomoPowerup' for examples /// </summary> protected virtual bool TryGive(vp_PlayerEventHandler player) { return(true); }