Search Unity

Realistic FPS Prefab [RELEASED]

Discussion in 'Assets and Asset Store' started by Deleted User, Apr 5, 2013.

  1. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    For everybody having troubles with importing new player models and such, Azuline is currently working on a third person controller for RFPS. That should include an update to the animations system and fix most of the problems people are having.

    To fix the backwards models, flip them around 180. For some reason the way RFPS is set up the need to face the other way. At least, that is what worked for me.
     
  2. TheChairMaster64

    TheChairMaster64

    Joined:
    Aug 9, 2016
    Posts:
    59
    Does anyone know of a way to just walk over and pick up ammo and health instead of pressing F and has anyone made a rpg(rocket launcher) for their game and if so how? I have a very makeshift one but its just a box that does damage and is part of the guns animation so when you move the rocket moves to and it also goes through walls which i dont want.
     
  3. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Model your rocket launcher on the Bow. Instead of an arrow, shoot a rocket.

    To make a pickup that you walk over to pick up:

    1. Add a trigger collider (a collider whose Is Trigger checkbox is ticked).

    2. Add this script:
    PickupOnTriggerEnter.cs:
    Code (csharp):
    1. using UnityEngine;
    2.  
    3. public class PickupOnTriggerEnter : MonoBehaviour
    4. {
    5.     void OnTriggerEnter(Collider other)
    6.     {
    7.         if (other.CompareTag("Player")) SendMessage("PickUpItem");
    8.     }
    9. }
    Or, if using RFPS 1.44+:

    PickupOnTriggerEnter.cs:
    Code (csharp):
    1. using UnityEngine;
    2.  
    3. public class PickupOnTriggerEnter : MonoBehaviour
    4. {
    5.  
    6.     [Tooltip("Pickup's PickUpItem() method requires a user GameObject. Currently only HealthPickup requires it.")]
    7.     public bool sendUserGameObject = false;
    8.  
    9.     void OnTriggerEnter(Collider other)
    10.     {
    11.         if (other.CompareTag("Player"))
    12.         {
    13.             if (sendUserGameObject || GetComponent<HealthPickup>() != null)
    14.             {
    15.                 SendMessage("PickUpItem", other.gameObject);
    16.             }
    17.             else
    18.             {
    19.                 SendMessage("PickUpItem");
    20.             }
    21.         }
    22.     }
    23. }
     
    Last edited: Jan 25, 2018
    Mark_01, Felicityinc and EvilGremlin like this.
  4. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    You are so patient and helpful. :D
     
  5. Dionysos1111

    Dionysos1111

    Joined:
    Feb 14, 2016
    Posts:
    39
    I want a rocket launcher too, how do you make the rockets do damage? explosive damage?
     
  6. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    Have wierd issue:/
    Installed 5.4.1p1.exe.
    Installed TSAI (Tactical Shooter AI)- it runs well
    Installed CF2 (Control Freak2) - so far so good
    Installed RFPSP - and in TSAIdemo scenes all agents just freeze after frame or two(

    Made new project with RFPS alone in it - get ton of yellow and red error messages.
    Game mode pauses upon launch:/
    Pressing inspector`s pause button to resume demo scene brings gfameplay back for a minute and then when pressing left shift button to run game window pauses itself, inspector`s pause button becomes pressed by itself:/ and pressing it back to unpause the game mode has no effect(
    Pause button just won`t become unpressed.
    What could that be?
     
  7. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    1. Add the Arrow prefab to your scene.
    2. Add the landMine prefab to your scene.
    3. Copy the landMine's Mine Explosion component. Add it to the Arrow (Paste Component as New).
    4. Copy the landMine's Audio Source component. Add it to the Arrow.
    5. Move the landMine's child GameObject 'MineRadiusCollider' to be a child of the Arrow instead.
    6. Set the MineRadiusCollider's Transform Position and Radius to (0,0,0). Set its Sphere Collider's Radius to 1.
    7. Inspect the Arrow instance in the scene and click Apply to update the prefab. Then delete the Arrow instance from the scene.
    8. Give the player a bow and arrows: Inspect FPS Main > FPS Weapons > ... > Bow. Tick Have Weapon and set Ammo to the number of starting arrows.
    9. Have fun Dukes of Hazzard style:

    (Jump to 00:39)

    Then you can do the same thing for rockets.

    [EDIT: Added instructions below for specifying projectile prefabs.]

    To add a projectile prefab (e.g., rocket):

    There's a child of FPS Main called Object Pooling Manager. Add your projectile to Object Pooling Manager's Obj Registry list and note its index (e.g., 18).

    Then on your weapon's Weapon Behavior script, under the Damage and Firing heading, find Projectile Pool Index. Set this to the index you noted from the Obj Registry list.
     
    Last edited: Oct 23, 2016
  8. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    How do i set timescale to 1? Where do i find it? My whole game is freezed after just installing RFPS yesterday.
    Thanks.
     
  9. jons190

    jons190

    Joined:
    Sep 13, 2016
    Posts:
    260
    Hi all! has anyone used RFPS in VR? Specifically the oculus, gear or cardboard? I got the display to work in cardboard easy enough, but am trying to setup the head tracking =mouse look and am having a bugger of a time tracing it back through the code (I am a noob with C#) and have not had good luck withthe oculus tutorial. It seems to be a bit dated. Thanks in advance.
     
  10. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    I just started a new project with RFPS, procore and playmaker just to check. No abnormal issues. I would try uninstalling Unity an reinstalling it. It could be that you have overwritten something that an RFPS script calls.

    If you are still getting errors make sure to copy them to your clipboard. It is hard to help without knowing what the errors say.
     
  11. TheChairMaster64

    TheChairMaster64

    Joined:
    Aug 9, 2016
    Posts:
    59
    Thank you some much for the help I'm sorry for asking so many questions man but thanks your a load of help and a time saver :D
     
  12. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Glad to help!
     
  13. DecayGame

    DecayGame

    Joined:
    May 15, 2016
    Posts:
    86
    Someone please help me make this kit multiplayer I will pay anyone who helps me please let me know if you are interested. :)
     
  14. llJIMBOBll

    llJIMBOBll

    Joined:
    Aug 23, 2014
    Posts:
    578

    Thank you TonyLi for this! I also added a text to display health as a % too;
    Thank you again, I'm gonna be using for my game.
    Code (CSharp):
    1. private Canvas canvas;
    2.     private UnityEngine.UI.Slider slider;
    3.     private UnityEngine.UI.Text text;
    4.  
    5.     private CharacterDamage characterDamage;
    6.  
    7.     void Start()
    8.     {
    9.         if (canvas == null) canvas = GetComponentInChildren<Canvas>();
    10.         if (slider == null) slider = canvas.GetComponentInChildren<UnityEngine.UI.Slider>();
    11.         if (text == null) text = canvas.GetComponentInChildren<UnityEngine.UI.Text>();
    12.  
    13.         characterDamage = GetComponent<CharacterDamage>();
    14.         slider.maxValue = characterDamage.hitPoints;
    15.     }
    16.  
    17.     void Update()
    18.     {
    19.         float percent = (slider.value / slider.maxValue) * 100;
    20.         percent = percent / 100;
    21.  
    22.         if(text != null)
    23.         {
    24.             text.text = (percent * 100).ToString("F0") + "%";
    25.         }
    26.  
    27.         // Update health:
    28.         slider.value = characterDamage.hitPoints;
    29.  
    30.         // Keep canvas facing camera:
    31.         if ((canvas.transform == null) || (UnityEngine.Camera.main == null)) return;
    32.         canvas.transform.LookAt(UnityEngine.Camera.main.transform);
    33.     }
     
    Mark_01 likes this.
  15. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    It was RFPS set Time Scale set to 0 upon installation in Edit/Project Settings/ Time.
    I`d never figure it myself if "Tactical Shooter AI" guy wouldn`t give me a hint about this.
    ------------------------------------------------
     
    EvilGremlin likes this.
  16. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    Should orientation of my custom weapon`s origin and scale match default weapon`s origins and scale?
    I have custom weapon wich is sized to corect unity scale to mach 1.7meter human hight proportions of and has local z axis looking forward from the gun aim direction . [/url][/IMG]
    Coz after adding my weapon it`s turned around its local z axis to 180 degrees and jiters like hell.
     
  17. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    [/url][/IMG]
    This is scale and orientation of my weapon.
    And this is scale and orientation of RFPS gun
     
  18. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    Well I'm glad you found a solution. Strange that time scale was set to 0. I wonder why that is.
     
  19. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    Your image is not working.
     
  20. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    Wierd stuff:/
    I uploaded images to imgur, copied links and pasted here in picture sign icon but somthing i missed obviously.
    http://imgur.com/a/OnAEw
     
  21. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
  22. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    Does that mean that i`ll have to go through realligning origins for all my animated weapons in blender?
    Hat would be hell.
     
  23. llJIMBOBll

    llJIMBOBll

    Joined:
    Aug 23, 2014
    Posts:
    578
    @musolo It's prob best to have the anim_ scale and pos set to 0 0 0 and 1 1 1 scale, you can use the weapon behaviour to set the weapon position, for the scale you can adjust on the FSP camera and then Reconfigrue refrab you can also set for 1 or 2 camera setup default the weapons are set to 20x scale for 2 cam setup, you can manually set to 1 scale or use 1 cam setup
     
  24. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    Hopefully llJIMBOBll is right. I haven't tried setting up my own weapon models on RFPSP yet so I can't really help there, sorry. I would think that just dropping the gun onto another gun prefab and setting it to 000 would set it in the correct position though.
     
  25. llJIMBOBll

    llJIMBOBll

    Joined:
    Aug 23, 2014
    Posts:
    578
    Hi I'm wondering if anyone can help? I am trying to add Hit animations for the Ai once they get hit... I managed to make it work for legacy animations for for mecanim its like 50/50

    I thought how to add it and best way i can think of is in Weapon Behaviour in the hit.collider part... This is what I have
    Code (CSharp):
    1. case 13://hit object is an NPC
    2.             if(hit.collider.gameObject.GetComponent<CharacterDamage>() && hit.collider.gameObject.GetComponent<AI>().enabled){
    3.                 hit.collider.gameObject.GetComponent<CharacterDamage>().ApplyDamage(damageAmt, directionArg, mainCamTransform.position, myTransform, true, false);
    4.                 if (!hit.collider.gameObject.GetComponent<CharacterDamage> ().AIComponent.useMecanim) {
    5.                     hit.collider.gameObject.GetComponent<CharacterDamage> ().AIComponent.AnimationComponent.Play ("hit");
    6.                 } else {
    7.                     hit.collider.gameObject.GetComponent<CharacterDamage> ().AIComponent.AnimatorComponent.Play ("Hit");
    8.                 }
    9.                 FPSPlayerComponent.UpdateHitTime();//used for hitmarker
    10.             }
    11.             if(hit.collider.gameObject.GetComponent<LocationDamage>() && hit.collider.gameObject.GetComponent<LocationDamage>().AIComponent.enabled){
    12.                 hit.collider.gameObject.GetComponent<LocationDamage>().ApplyDamage(damageAmt, directionArg, mainCamTransform.position, myTransform, true, false);
    13.                 if (!hit.collider.gameObject.GetComponent<LocationDamage> ().AIComponent.useMecanim) {
    14.                     hit.collider.gameObject.GetComponent<LocationDamage> ().AIComponent.AnimationComponent.Play ("hit");
    15.                 } else {
    16.                     hit.collider.gameObject.GetComponent<LocationDamage> ().AIComponent.AnimatorComponent.Play ("Hit");
    17.                 }
    18.                 FPSPlayerComponent.UpdateHitTime();//used for hitmarker
    19.             }
    20.             break;
    21.         default:
    22.             break;    
    I added for mecanim a new bool called Hit and added the hit animation all i added link to and from all the other 4 bools, with the code above it will play the hit animation then it will pause but wont go back into idle or other animation.
    But if i set it like
    Code (CSharp):
    1. hit.collider.gameObject.GetComponent<LocationDamage> ().AIComponent.AnimatorComponent.SetBool("Hit",true);
    It will play the idle animation and hit animation straight after.

    Thanx if you can help Jimbob

    Or maybe adding to the ApplyDamage in CharacterDamage would be better? But not sure where to add it
     
    Last edited: Sep 22, 2016
  26. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    I'm not really sure about the code because I am relatively new to C# but I don't see anything obviously wrong with it. It could be a logic issue. But if it is working sometimes it could be an animation issue too. Do you have finish animation checked in mechanim? If you do it could cause the animation to only be played when the idle animation loop is near the tail end.
     
  27. llJIMBOBll

    llJIMBOBll

    Joined:
    Aug 23, 2014
    Posts:
    578
    I got it to work, I think i had the settings wrong on the Animator;

    I added to ApplyDamage() in CharacterDamage
    around line 183
    Code (CSharp):
    1. attackDir2 = attackDir;
    2.         attackerPos2 = attackerPos;
    3.         explosionCheck = isExplosion;
    4.        
    5.         //to expand enemy search radius if attacked to defend against sniping
    6.         AIComponent.attackedTime = Time.time;
    7.  
    8.  
    9. //NEW CODE PART
    10.         if (AIComponent.useMecanim) {          
    11.             AIComponent.AnimatorComponent.SetBool ("Hit",true);
    12.             AIComponent.AnimatorComponent.SetBool ("Idle",false);
    13.             AIComponent.AnimatorComponent.SetBool ("Walk",false);
    14.             AIComponent.AnimatorComponent.SetBool ("Run",false);
    15.             AIComponent.AnimatorComponent.SetBool ("Attacking",false);
    16.             StartCoroutine (HitNo(0.2f));
    17.         } else {
    18.             AIComponent.AnimationComponent.Play ("hit");
    19.         }
    20. //NEW CODE PART END
    21.  
    22.        
    23.         //Kill NPC
    24.         if (hitPoints <= 0.0f){
    Also add to the bottom of CharacterDamage, Not sure if needed as I set the transition duration to 0.1
    Code (CSharp):
    1. IEnumerator HitNo(float waitTime)
    2.     {
    3.         yield return new WaitForSeconds (waitTime);
    4.         AIComponent.AnimatorComponent.SetBool ("Hit",false);
    5.         AIComponent.AnimatorComponent.SetBool ("Idle",true);
    6.     }

    In Ai.cs I added this to around line 310
    Code (CSharp):
    1. AnimationComponent["hit"].wrapMode = WrapMode.Once;
    And in Animator Window added a new bool called Hit, linked it with all other 4 bools, click on the arrows and add 2 new conditions and set to true and false for the right bool, see other transitions for idea.

    and on each transition click the settings and untick has exit time and fixed duration, I set 0.1 for transition duration
     
    Franciscotx56 and EvilGremlin like this.
  28. Dionysos1111

    Dionysos1111

    Joined:
    Feb 14, 2016
    Posts:
    39
    Very Cool !! thanks.

    Got another question...
    I edited scripts so that NPC's can't hit eachother (removed layer 13), now i've created another layer (layer 22) for the goodsoldier so that NPC's can hurt the goodsoldier.

    Now the problem is i cannot command the goodsoldier anymore.

    I adjusted this code to layer 22 but that didn't work:

    if(hit.collider.gameObject.layer == 13){//switch to pickup reticle if this NPC can be interacted with
    if(hit.collider.gameObject.GetComponent<AI>()
    || hit.collider.gameObject.GetComponent<LocationDamage>()){
    if(hit.collider.gameObject.GetComponent<AI>()){
    AIComponent = hit.collider.gameObject.GetComponent<AI>();

    I can't find out how to change this in other scripts, maybe you know how to change this.

    Thx
     
  29. TheChairMaster64

    TheChairMaster64

    Joined:
    Aug 9, 2016
    Posts:
    59
    Sorry if i am becoming annoying but I tried the script and it doesnt seem to be working i added the script to the item and checked the box on the usable box collider that didnt work and then i made another box collider within the inspector were the use box collider was and set the new box collider to trigger as well still no hope i also tried to make a box itself and put the script on that box and made the box a trigger and put the item as child/parent thing that also did not work do i have your words confused? As always thanks for the massive help.
     
  30. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Instead of changing the scripts, what about ticking Ignore Friendly Fire on the NPCs' AI components?

    Here's an example scene that demonstrates PickupOnTriggerEnter (and also explosive arrows):

    RFPS_ExplosiveArrow_PickupOnTriggerEnter.unitypackage

    The sniper rifle near the beginning of the scene (almost directly in front of the player) is now set up to pick up when you walk over it.
     
  31. thegamerguynz

    thegamerguynz

    Joined:
    Apr 1, 2016
    Posts:
    20
    Does anyone know how i could make throwable light sticks?
     
  32. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    I haven't tried this myself, you could try to start with the Grenade, remove the GrenadeObject and ExplosiveObject components, and add a point light.
     
  33. thegamerguynz

    thegamerguynz

    Joined:
    Apr 1, 2016
    Posts:
    20
    I was thinking along those lines as well just trying to figure out the grenade process lol. Ive got the light stick mesh and light setup just not sure how the throwing mechanism works if they instantiate a prefab i cant find the event for it
     
  34. TheChairMaster64

    TheChairMaster64

    Joined:
    Aug 9, 2016
    Posts:
    59
    Alright there was no problem with the script or anything it works for ammo and picking up weapons the problem is that it doesnt work with picking up health items
     
  35. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    Hi guys.
    Where is the bullet prefab field in inspector for weapons?
    I want RFPSP weapons to shoot with TSAI(Tactical Shooter AI ) bullet prefabs.
    Thanks.
     
  36. QuadMan

    QuadMan

    Joined:
    Apr 9, 2014
    Posts:
    122
    RFPS is using raycast system. You need to follow integrate tutorial in TSAI package.
     
  37. jons190

    jons190

    Joined:
    Sep 13, 2016
    Posts:
    260
    Greetings all! Say does anyone have a tutorial on how to setup the NPC system? I've tried a few things but keep getting serious errors (yet I know it will run as it works perfectly with the sandbox prefab.)

    I'm getting the dreaded error :
    "Nullreferenceexception Object reference is not set to an instance of an object in AI /Wavemanager.cs "
    and when i track it back in the script its the line:
    NPCSpawner [i} NPCprefab = waves [wavenumber -1.npctype ;


    Thanks in advance ;
     
  38. musolo

    musolo

    Joined:
    Sep 12, 2014
    Posts:
    238
    Is it just me or RFPSP Ai tutorials are missing somehow? It`s wierd that there is so little info about AI use and other stuff is poorely covered in web.
    Has anybody worked with AI here?
    Do you know who are RFPSP team guys in this thread?
    Did anybody used custom weapons in 1.23 version?
    Thanks
     
  39. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    RFPSP has very basic AI. It really isn't intended to be used in a game. You will not be able to work with it unless you are well versed in C# and AI concepts because you will basically need to code it yourse;f. You should give an AI building tool like Behavior Designer a try or even a full pre-built AI. You can find tutorials on YouTube for integrating Tactical Shooter AI into RFPSP and it is a highly regarded AI.
     
  40. Lord-Eucalyptus

    Lord-Eucalyptus

    Joined:
    Mar 27, 2015
    Posts:
    1
    Im absolute noob in unity, i wonder if anyone could explain to me how i could make a flying NPC in RFPSP kit?
    Ive made waypoints for it to patrol and removed all gravitation but then the npc just stands still.
    I guess its something the navigation mesh, how do i make that in the air etc? ty for help!
     
  41. jons190

    jons190

    Joined:
    Sep 13, 2016
    Posts:
    260
    hey there Lord E. I'm doing some of the same work with the NPCS. I'm having a heck of a time figuring it all out, but. iIhave so far gotten some hacks to work. I recommend loading up the "sandbox" level. Everything seems to work there. but unfortunately I'm having a bugger of a time tracking it all back and making sense of what scripts link to what, to make it all work. I'll be really digging into it over then next few days and will post anything I glean for ya.
     
  42. txarly

    txarly

    Joined:
    Apr 27, 2016
    Posts:
    197
    I am really in interest in the same thing with RFPS.I want to do npc birds so you can shoot them and then they fall down.So if anybody can help because i am in the same point as Lord.Thank you.
     
  43. txarly

    txarly

    Joined:
    Apr 27, 2016
    Posts:
    197
    Me again

    Lord, i have made it work this way.Open the "FPS prefab sandbox demo", change the Y of an npc that patrols to 3 and the Navmesh agent Base offset to 3 too.The npc will walk and patrol in the air and follow/attack you.

    I change the Y to 10 too, it begins to walk but when arrives to a waypoint stops and doesn't move again and doesn´t attack and follow you either, don´t know why. May be somebody could help us in this point.
     
  44. antoripa

    antoripa

    Joined:
    Oct 19, 2015
    Posts:
    1,163
    Hi,
    I would know if the AI can be integrated with different system than Unity Navmesh ( Apex Path or A* Pathfinding )
    Thanks and Regards,
     
  45. Amy_Lee87

    Amy_Lee87

    Joined:
    Sep 29, 2016
    Posts:
    8
    Hey all!

    I'm simply a mapper. I just enjoy creating my own little worlds! I purchased RFPSP just so I could have a nice little character to run around with. So far I'm loving it! So fun!

    What I'm trying to do is replace the main character (Unity Pilot) with my own character, yet keep all the basic controls and first-person mode in place. I ultimately just want my own model for the 3rd-person point of view.

    I would REALLY appreciate it if someone could guide me through how to replace this character with my own character. My own character has animations that are included.

    Thanks you!
     
  46. Mario167100

    Mario167100

    Joined:
    Jul 25, 2016
    Posts:
    49
    Hey everyone. I'm not sure if I asked this in the past, but has anyone every gotten RFPS to integrate with Photon? I want to create a multiplayer mode in my game.
     
  47. kerrmedia

    kerrmedia

    Joined:
    Nov 4, 2015
    Posts:
    250
    Did the price of this just come down? Its on my to-buy-list so I always check it?
     
  48. EvilGremlin

    EvilGremlin

    Joined:
    Aug 12, 2016
    Posts:
    231
    There are many youtube videos about replacing characters in various assets. There is nothing special about doing in RFPSP except that you might have to turn your character around to face the other way. Also make sure you replace the FPS hands. That is likely to require some manual adjustments. Again though, there are already lots of tutorials on this topic.

    Did you try resetting hunger and thirst to 0 on death?
     
  49. DecayGame

    DecayGame

    Joined:
    May 15, 2016
    Posts:
    86
    I am currently using Version 1.23 and I ran into a problem on the PlayerWeapons Code I followed the instructions but I get theese errors.
    Capture.PNG


    SelectedWeapon(this, new SelectedWeaponEventArgs(index))
    my index is colored red for some reason?
    Someone please help I've been trying for almost a year now to get networking functional.
     
  50. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,692
    Sorry, I haven't tried Bolt with RFPS 1.23.

    Perhaps someone has integrated UNET and RFPS? That would probably be ideal.
     
    llJIMBOBll likes this.