For direct access use https://forums.oldunreal.com
It's been quite a while since oldunreal had an overhaul, but we are moving to another server which require some updates and changes. The biggest change is the migration of our old reliable YaBB forum to phpBB. This system expects you to login with your username and old password known from YaBB.
If you experience any problems there is also the usual "password forgotten" function. Don't forget to clear your browser cache!
If you have any further concerns feel free to contact me: Smirftsch@oldunreal.com

Indicator for grab.

The section related to UnrealScript and modding. This board is for coders to discuss and exchange experiences or ask questions.
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Indicator for grab.

Post by Krull0r »

Hey there

I’m still thinking about a visual feedback to show the player when he is in the radius to grab a decoration or trigger the Grab trigger.
I’m using a toggleable Dynamic Corona as icon which shows where the the player can grab.

I have different ideas to get it work and I’m not able to code such a system by my self.

First I thought to give the dynamic corona a second Tag, so the player can enablel/disable it with the normal tag and with the second tag the grab trigger should change color of the dynamic corona to green when the player is in its radius.

I don’t know if this it is possible to give a actor two tags.


The second idea is to draw some kind of hud material when the player is in the grab radius of the grab trigger and display a message near the crosshair which give the player the visual feedback that he can use grab now.



I have no idea how to get it work or where to start.
Image
User avatar
Bleeder91[NL]
OldUnreal Member
Posts: 1062
Joined: Sun Oct 04, 2009 7:22 pm

Re: Indicator for grab.

Post by Bleeder91[NL] »

You could subclass Pawn and make use of the PostRender2D function. Heck, make the whole Grab Actor a Pawn subclass and let that handle its grab to whatever actor it needs to send it to.
Image
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

Okay I got something that works :) I modified the Hider actor from firetrucks which allows me to change the color of a specific GrabHand while touching the trigger.
Image
User avatar
Masterkent
OldUnreal Member
Posts: 1469
Joined: Fri Apr 05, 2013 12:41 pm

Re: Indicator for grab.

Post by Masterkent »

First I thought to give the dynamic corona a second Tag, so the player can enablel/disable it with the normal tag and with the second tag the grab trigger should change color of the dynamic corona to green when the player is in its radius.

I don’t know if this it is possible to give a actor two tags.
You can handle Touch/UnTouch directly from any actor of your own custom class. There is no any specific magic in Triggers that lets them detect presence of players, Triggers just handle Touch/UnTouch like any other actor could potentially do.

And, of course, matching by Tag is not the only way to establish a connection between two actors. If actor A creates actor B, then A can just store the reference to B in some variable and B can store the reference to A in some variable right after creation of B.

If actors A and B are created independently, they can find each other via AllActors by whatever sign you like.
The second idea is to draw some kind of hud material when the player is in the grab radius of the grab trigger and display a message near the crosshair which give the player the visual feedback that he can use grab now.

I have no idea how to get it work or where to start.
In case of the second approach you may consider the Bleeder's idea, or if you're already using any HUDOverlay, you can draw your images in the overlay.
Last edited by Masterkent on Tue Aug 07, 2018 10:39 pm, edited 1 time in total.
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

You can handle Touch/UnTouch directly from any actor of your own custom class. There is no any specific magic in Triggers that lets them detect presence of players, Triggers just handle Touch/UnTouch like any other actor could potentially do.
Thank you that helped a lot ;)

I made some kind of “touch” checker actor which is placed inside my grabtrigger actor. The checker actor has the ability to change the color of the grabhand actor and the texture if I want to display an other icon which shows the player that he is in the grabradius.

I also want more visual feedback!


It’s a complicated setup I’m using in my levels so I try to explain what’s still missing:

I always attach my grabhand actor to movers so the grabhand moves with every button, lever, switch or what ever.
If the whole triggersetup is set to triggeronceonly the grab hand moves with the mover and hides at the last keyframe.
So the player has the feedback there is nothing to trigger any more. I’m using the same method for everything which is set to once only.

For movers like the switches in Nyleve to controls the elevators the grabhand actors are also attached to the movers and I want to
give the player the visual feedback that if he is in the triggerradius. The grabhand actor becomes green and while the mover moves
the grabhand actor should turn back to its default color until the switch reaches the start position.

That needs to be controlled in my checkeractor.

What I have done already and what’s working:

The checker actor tells the grabhand actor to change the color while touching.
I also made a timed trigger action which should disable the color change in a defined timespan.

But here I have the problem. If the player stays in the checker radius and the checker got triggered to
Change the color of the grabhand back to default for the time while the mover is moving. It won’t update until the player moves, jump or duck.

I used turning off the collision and disable (‘trigger’) for the time while it’s disabled but it needs to be updated while the player stays in the checker radius.



Maybe I need to make a demonstration video to show what I like to do. :)
Image
User avatar
Masterkent
OldUnreal Member
Posts: 1469
Joined: Fri Apr 05, 2013 12:41 pm

Re: Indicator for grab.

Post by Masterkent »

I would check the value of (KeyNum == 0 && !bDelaying && !bInterpolating) for the implied mover in Tick function of the actor which determines what image to display. If this expression evaluates to true, then the mover is closed and inactive (at least for standard movers).

KeyNum == 0 implies that the mover is closed or going to close;
bDelaying implies that the mover is activated and waits for delayed opening;
bInterpolating implies that the mover is moving.

Additionally, it's possible to check the current state of the mover by means of GetStateName() - if it's equal to Class.Name, then the mover won't move anymore (movers whose bTriggerOnceOnly is true enter such a state when they would start closing if bTriggerOnceOnly was set to false).

So, when for a given mover M, (M.GetStateName() != M.Class.Name && M.KeyNum == 0 && !M.bDelaying && !M.bInterpolating) evaluates to true, it makes sense to indicate that the mover can be activated. Of course, if the mover can be activated only by a trigger whose bTriggerOnceOnly is true, this should be taken into account too.
Last edited by Masterkent on Wed Aug 08, 2018 10:23 am, edited 1 time in total.
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

Okay it works fine so far!

Now the GrabIndicator does show the higlighted version of the icon while the player touches the GrabIndicator.
If the GrabIndicator got triggered the hightlight is deactivated.

This works fine in singleplayer but in multiplayer the triggering of the Grabindicator has no effect while the player stand in its radius.

In multiplayer as client only If the player moves out of the radius and untouches the actor and moves again in the radius while the timer is running the triggering works as client


Do I miss something here?

Code: Select all

class UR_GrabIndicatorTrigger expands Triggers;

var() float DeactivateTime;
var() texture Icon;
var() texture InRadiusIcon; 
var() UR_GrabHand hideTarget;

simulated event Touch( Actor Other)
{
      if (PlayerPawn(Other) != none)
      {
      hiderMain1(hideTarget);
      }
}

simulated event UnTouch( actor Other )
{
      if (PlayerPawn(Other) != none)
      {
      hiderMain2(hideTarget);
      }
}

simulated function hiderMain1( UR_GrabHand a)
{
  if (a != none) 
      {
            a.scaleglow = 2;
            a.Skin=InRadiusIcon;
                  a.CloseDistanceColor.A = 0;
                  a.CloseDistanceColor.B = 0;
                  a.CloseDistanceColor.G = 255;
                  a.CloseDistanceColor.R = 0;
     }
}

simulated function hiderMain2( UR_GrabHand a)
{
  if (a != none) 
      {
            a.scaleglow = 2;
            a.Skin = Icon;
                  a.CloseDistanceColor.A = 0;
                  a.CloseDistanceColor.B = 255;
                  a.CloseDistanceColor.G = 255;
                  a.CloseDistanceColor.R = 255;
     }
}

function Trigger( actor Other, pawn EventInstigator )
{
      Disable('Trigger');
      SetCollision(false);
      SetTimer(DeactivateTime,false);
      hiderMain2(hideTarget);
      bHidden = true; // For trigger checking in multiplayer
}

function Timer ()
{
      SetCollision(True);
      Enable('Trigger');
      hiderMain1(hideTarget);
      bHidden = False; // For trigger checking in multiplayer
}

defaultproperties
{
                        bNoDelete=True
                        bAlwaysRelevant=True
                        RemoteRole=ROLE_SimulatedProxy
                        Texture=Texture'Engine.S_Camera'
                        DrawScale=0.250000
}
Image
User avatar
Masterkent
OldUnreal Member
Posts: 1469
Joined: Fri Apr 05, 2013 12:41 pm

Re: Indicator for grab.

Post by Masterkent »

I don't understand what you're trying to achieve with that Trigger function. Probably, you don't want to let other players see that hand when you're close to the mover while those players are not. If so, you should modify visibility of that hand locally and independently for each player. This is how I would implement such a thing:

Code: Select all

class UR_GrabIndicatorTrigger expands Triggers;

var() name GrabHandTag; 

var private Mover ControlledMover;
var private bool bActivatableMover;
var private UR_GrabHand GrabHand;

replication
{
      reliable if (Role == ROLE_Authority)
            GrabHandTag,
            bActivatableMover;
}

event BeginPlay()
{
      // looking up for the associated mover
      foreach AllActors(class'Mover', ControlledMover, Tag)
      {
            InitialState = 'Enabled';
            return;
      }
}

simulated event PostBeginPlay()
{
      assert(!bStatic && !bNoDelete || bAlwaysRelevant); // clients shall receive the actual value of bCollideActors
      DrawType = DT_None; // players shouldn't see this actor when bHidden is false
      SetLocation(Location); // update touchers
}

simulated event PostNetBeginPlay()
{
      UpdateGrabHand();
}

simulated event PostNetReceive()
{
      UpdateGrabHand();
}

simulated function bool FindGrabHand()
{
      if (GrabHand != none)
            return true;

      foreach AllActors(class'UR_GrabHand', GrabHand, GrabHandTag)
            return true;
      return false;
}

simulated function UpdateGrabHand()
{
      if (!FindGrabHand())
            return;
      if (!bCollideActors)
            GrabHand.SetVisible(false);
      GrabHand.SetActivatable(bActivatableMover);
}

static function bool MoverIsActivatable(Mover M)
{
      return M.KeyNum == 0 && !M.bDelaying && !M.bInterpolating && M.GetStateName() != M.Class.Name;
}

simulated event Touch(Actor A)
{
      if (A == Level.GetLocalPlayerPawn() && FindGrabHand())
            GrabHand.SetVisible(true);
}

simulated event UnTouch(Actor A)
{
      if (A == Level.GetLocalPlayerPawn() && FindGrabHand())
            GrabHand.SetVisible(false);
}

state Enabled
{
      event BeginState()
      {
            bHidden = false; // replicate this actor as if it was visible
            SetCollision(true, false, false);
      }

      event EndState()
      {
            bHidden = true; // no need to replicate this actor anymore
            SetCollision(false, false, false); // no need to handle Touch anymore
            UpdateGrabHand();
      }

      event Tick(float DeltaTime)
      {
            if (ControlledMover == none ||
                  ControlledMover.bTriggerOnceOnly && ControlledMover.KeyNum != 0)
            {
                  // can't activate the mover anymore
                  GotoState('');
                  return;
            }
            if (bActivatableMover != MoverIsActivatable(ControlledMover))
            {
                  bActivatableMover = !bActivatableMover;
                  UpdateGrabHand();
            }
      }
}

defaultproperties
{
      bNetNotify=True
      RemoteRole=ROLE_SimulatedProxy
}

Code: Select all

class UR_GrabHand expands DynamicCorona;

simulated event BeginPlay()
{
      SetVisible(false);
}

simulated function SetVisible(bool bVisible)
{
      if (bVisible)
            Skin = Texture;
      else
            Skin = none;
}

simulated function SetActivatable(bool bActivatable)
{
      if (bActivatable)
            CloseDistanceColor = MakeColor(0, 255, 0);
      else
            CloseDistanceColor = MakeColor(255, 255, 255);
}

defaultproperties
{
      bNoDelete=True
      RemoteRole=ROLE_None
      Texture=Texture'Engine.S_Trigger' // replace this with your texture of hand
}
Last edited by Masterkent on Sun Aug 12, 2018 12:27 pm, edited 1 time in total.
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

The idea behind the trigger function is that the checker becomes deactivated while the player stays in its radius and triggers a retriggerable console, switch, lever or what ever infront of the player.

If something is once only the grab indicator does disappear so the player knows there is nothing to trigger any more.



Image
User avatar
Masterkent
OldUnreal Member
Posts: 1469
Joined: Fri Apr 05, 2013 12:41 pm

Re: Indicator for grab.

Post by Masterkent »

I thought that you need something like this:


Note that the presence of another player nearby the mover doesn't affect visibility of the corona for me.

And I didn't use DeactivateTime or anything like that, the trigger just reads the current state of the mover and determines if it's grabbable or not. This method should work correctly if the mover returns after reaching an obstacle (then returning would happen sooner than usually), and if you change DelayTime, MoveTime, or StayOpenTime or your mover, there will be no need in tweaking the delay interval on the trigger.

What I don't understand is what you're trying to achieve by modifying bHidden of your trigger. The reason why server-side modification of CloseDistanceColor is not observable on clients is pretty obvious if you take a look at the definition of DynamicCorona: the class is not declared with the NativeReplication keyword and there is no any replication statement that would allow transferring the value of CloseDistanceColor from server to clients.
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

The bhidden stuff of the trigger function in my actor is useless :)
It was only for me an indicator that the Actor got triggered or not in netplay.



I will try your method and tweak it to my uses and try to combine it with the current triggerable grabhand I have.

For consoles which are not moveable I could hide a small mover in the wall for controlling the dynamic corona.


I thought it was easier to create such a system :)

If I need something I let you know big thanks for your help Masterkent.


Image
User avatar
Masterkent
OldUnreal Member
Posts: 1469
Joined: Fri Apr 05, 2013 12:41 pm

Re: Indicator for grab.

Post by Masterkent »

For consoles which are not moveable I could hide a small mover in the wall for controlling the dynamic corona.
It's not necessary to use a single trigger-like class for all grabbable objects. You can create specialized versions for different kinds of actors.

For example, the base class can be defined like this:

Code: Select all

class UR_GrabIndicatorTrigger expands Triggers;

var() name GrabHandTag;
var() bool bIsEnabled;

var UR_GrabHand GrabHand;
var bool bIsActivatable;

replication
{
      reliable if (Role == ROLE_Authority)
            GrabHandTag,
            bIsActivatable;
}

event BeginPlay()
{
      bIsActivatable = true;
      SetEnabled(bIsEnabled);
}

simulated event PostBeginPlay()
{
      assert(!bStatic && !bNoDelete || bAlwaysRelevant); // clients shall receive the actual value of bCollideActors
      DrawType = DT_None; // players shouldn't see this actor when bHidden is false
      SetLocation(Location); // update touchers
}

simulated event PostNetBeginPlay()
{
      UpdateGrabHand();
}

simulated event PostNetReceive()
{
      UpdateGrabHand();
}

simulated function bool FindGrabHand()
{
      if (GrabHand != none)
            return true;

      foreach AllActors(class'UR_GrabHand', GrabHand, GrabHandTag)
            return true;
      return false;
}

simulated function UpdateGrabHand()
{
      if (!FindGrabHand())
            return;
      if (!bCollideActors)
            GrabHand.SetVisible(false);
      GrabHand.SetActivatable(bIsActivatable);
}

simulated event Touch(Actor A)
{
      if (A == Level.GetLocalPlayerPawn() && FindGrabHand())
            GrabHand.SetVisible(true);
}

simulated event UnTouch(Actor A)
{
      if (A == Level.GetLocalPlayerPawn() && FindGrabHand())
            GrabHand.SetVisible(false);
}

function SetEnabled(bool bEnable)
{
      bIsEnabled = bEnable;
      bHidden = !bEnable; // when enabled, replicate this actor as if it was visible
      SetCollision(bEnable, false, false);
      UpdateGrabHand();
      if (bEnable)
            Enable('Tick');
      else
            Disable('Tick');
}

state() NormalTrigger
{
}

state() OtherTriggerToggles
{
      function Trigger(Actor A, Pawn EventInstigator)
      {
            SetEnabled(!bIsEnabled);
      }
}

state() OtherTriggerTurnsOn
{
      function Trigger(Actor A, Pawn EventInstigator)
      {
            SetEnabled(true);
      }
}

state() OtherTriggerTurnsOff
{
      function Trigger(Actor A, Pawn EventInstigator)
      {
            SetEnabled(false);
      }
}

defaultproperties
{
      bIsEnabled=True
      bNetNotify=True
      RemoteRole=ROLE_SimulatedProxy
}
and derived class for handling movers can be defined like this:

Code: Select all

class UR_MoverGrabIndicatorTrigger expands UR_GrabIndicatorTrigger;

var() name MoverTag;

var private Mover ControlledMover;

event BeginPlay()
{
      // looking up for the associated mover
      foreach AllActors(class'Mover', ControlledMover, MoverTag)
      {
            SetEnabled(bIsEnabled);
            return;
      }
      SetEnabled(false);
      InitialState = 'NormalTrigger';
      Log("Warning:" @ self @ "failed to find the associated mover with tag" @ MoverTag);
}

static function bool MoverIsActivatable(Mover M)
{
      return M.KeyNum == 0 && !M.bDelaying && !M.bInterpolating && M.GetStateName() != M.Class.Name;
}

event Tick(float DeltaTime)
{
      if (ControlledMover == none ||
            ControlledMover.bTriggerOnceOnly && ControlledMover.KeyNum != 0)
      {
            // can't activate the mover anymore
            SetEnabled(false);
            return;
      }
      if (bIsActivatable != MoverIsActivatable(ControlledMover))
      {
            bIsActivatable = !bIsActivatable;
            UpdateGrabHand();
      }
}
If you show your code for consoles, I could think about a specialized version for them.
Last edited by Masterkent on Tue Aug 14, 2018 8:55 am, edited 1 time in total.
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

Thank you very much Masterkent. I’m going to try this out when I’m @ home!
Is it also possible to use instead of the tag a target?


I also have a question about the replication of the dynamic corona.


In my script I was able to see the changes of the dynamic corona while touching and untouching the indicator trigger as client in multiplayer.
Only the triggering function had no effect of the corona.

I mean the trigger called the same function like untouch.
Image
User avatar
Masterkent
OldUnreal Member
Posts: 1469
Joined: Fri Apr 05, 2013 12:41 pm

Re: Indicator for grab.

Post by Masterkent »

Is it also possible to use instead of the tag a target?
If you mean the possibility to specify the reference to a particular actor in UnrealEd, then the answer is probably yes (I don't remember how reliably cross-references between actors work when they are stored right in the map). But if the referenced actor must be accessed client-side, this method imposes more requirements on the given actor or the actor which holds the reference.

If actor A contains a reference to actor B and both actors are unremovable (bStatic or bNoDelete), then the reference to B in A may remain valid for the whole period while the level is loaded.

If actor A contains a reference to actor B and only B is unremovable (bStatic or bNoDelete), then A may be automatically removed client-side (even if it's bAlwaysRelevant) and then respawned due to further replication from the server. The respawned actor is initialized with default properties and then may be updated by values replicated from the server. So, for example, if the original actor A contained a property Ref that referred to B, then Ref in respawned instance of A will first refer to None and then A.Ref may be automatically updated to refer to B only if the server replicates the server-side value of Ref. As far as I remember, such a replication can be done successfully only if B exists server-side and it's net-relevant for the given client.
In my script I was able to see the changes of the dynamic corona while touching and untouching the indicator trigger as client in multiplayer.
Only the triggering function had no effect of the corona.
That difference is easy to explain: your Touch/UnTouch are simulated events of a ROLE_SimulatedProxy-enabled actor, so both server and client may call these functions when touching/untouching takes place server-side and client-side correspondingly. In contrast, the Trigger function can be invoked server-side only. The server-side changes of the corona won't be observable client-side (as explained earlier); only client-side changes of the corona can be seen. The Trigger function can change client-side value of CloseDistanceColor only indirectly: first it should replicate some kind of signal to client, and then the client should recognize that signal and perform the corresponding value change for CloseDistanceColor.

I used bCollideActors and bIsActivatable for transferring the information about the current state of the mover from the server to clients. Clients receive the replicated values of bCollideActors and bIsActivatable and handle them in PostNetBeginPlay and PostNetReceive. The handler in PostNetBeginPlay and PostNetReceive may change the visibility and color as needed.
I mean the trigger called the same function like untouch.
The function is the same, but the sets of affected actors are not the same. Touch/UnTouch are called server-side and client-side, Trigger is called only server-side.
Last edited by Masterkent on Tue Aug 14, 2018 12:17 pm, edited 1 time in total.
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

Thank you very much for this detailed explanation. This will be helpful in future scripts :)


I was able to combine your grabhand and indicator script with dots toggleable dynamic corona :) and I added additional stuff I needed like the Icon texture and the InRadiusTexture.
I also added a timer ( stolen from the dispatcher ) which toggle the visibility of the GrabHand while the player is not able to interact with the switch, console, lever or what ever.

The timer makes it like a allrounder for everything.


I tested this evening with Startegy the system as clients on a dedicated server. I placed my version of the grabindicator into the level as well to compared the difference.

Your script made the race. Really really good work and thank you very much for your help.


But Is it possible that other players can see the changes of the GrabHand while an other player stays in the radius of the grabindicator?


This was possible in my buggy version but I liked the behavior.
Or would it be better if only the player sees that he is in the grab radius?
Last edited by Krull0r on Wed Aug 15, 2018 9:48 pm, edited 1 time in total.
Image
User avatar
Masterkent
OldUnreal Member
Posts: 1469
Joined: Fri Apr 05, 2013 12:41 pm

Re: Indicator for grab.

Post by Masterkent »

But Is it possible that other players can see the changes of the GrabHand while an other player stays in the radius of the grabindicator?
if you replace

Code: Select all

A == Level.GetLocalPlayerPawn()
with

Code: Select all

PlayerPawn(A) != none
in Touch and UnTouch.
Or would it be better if only the player sees that he is in the grab radius?
From my point of view, seeing hints for other players would look kinda weird. Personally, I'd prefer to explore maps without such hints at all (I guess, this feature is supposed to be optional, right?)
Last edited by Masterkent on Thu Aug 16, 2018 1:16 pm, edited 1 time in total.
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

Alright.

I only need the icons to show the players where he can use grab. Without that icon it would be hard for the player to figure out where he can trigger stuff because the player do need to use ‘grab’ for activating trigger sequences.

But I was also thinking about to give the player the ability to disable the icons with a mutator and maybe make the grab trigger replaceable with a common trigger.


I never did some kind of mutators for unreal.

I also never touched scrpting before Unreal Redux for me it’s extreme timeconsining to script stuff and get it work right.
But I’m learning it this way.

Last edited by Krull0r on Thu Aug 16, 2018 6:13 pm, edited 1 time in total.
Image
User avatar
BobIsUnreal
OldUnreal Member
Posts: 806
Joined: Mon Apr 12, 2010 12:34 am

Re: Indicator for grab.

Post by BobIsUnreal »

i made somthing simply and hacky a few years ago that is similar , maybe it could be of basic help.
http://bobisunreal.com/random/Forum/rtcwhud.u
its a intentory item/hudoverlay that draws icons on the hud if you are within view of decorations that are breakable, or movers that Toggle. and teleporters : think level exir indicator. one should be able to trace to grabbable classes in the same way, or adopt it for other use
User avatar
Krull0r
Global Moderator
Posts: 543
Joined: Sun Jul 01, 2007 4:07 pm

Re: Indicator for grab.

Post by Krull0r »

Thanks for sharing bob I’ll give it a try!
Image

Return to “UScript Board”