#Shooting Script

1 messages Β· Page 1 of 1 (latest)

abstract zephyr
#

@robust timber could you put your code here?

#

I want to continue this in a thread, because this will take a bit more

#

Also, a rather important question, do you actually plan on learning code, or is this just a one-off and you will mainly stick to art

robust timber
#

Hey, thanks for taking the time!

robust timber
#

I know it's a rocky patth to take

abstract zephyr
#

You're the sole dev on the game you're making, correct?

robust timber
#

And it will take way long than expected

abstract zephyr
#

Yes, yes it will lol

robust timber
#

The only thing that concerns me is the time...I'm lacking it 😦

abstract zephyr
#

Coding takes a long time

#

There's a reason why usually there are separate programmers/artists ;P

abstract zephyr
robust timber
abstract zephyr
#

Only problem with that is you won't really learn to code

abstract zephyr
robust timber
#

I started making games with Playground some time ago and I learned a lot about the Unity interface and overall, but not much about coding.

abstract zephyr
#

Righty

#

Did you do other languages before?

#

(Not sure what Playground is but maybe smth like scratch or gamemaker?)

robust timber
#

Nope, no other languages atall. Just design and animation.

abstract zephyr
#

Righty

robust timber
#

Yes, playground is a app for Unity that allows you to make games with drag and drop

#

the code I'm trying to change is from there

abstract zephyr
#

So GameMaker pretty much

#

There's visual coding for Unity I think

#

Bolt? I believe

robust timber
#

Yes

#

I checked it out, but it seemed very complicated unlike gamemaker of Playground

abstract zephyr
#

No idea

#

I've never seen it before

robust timber
#

It felt like I needed to know how to code to use it...weird...🀨

abstract zephyr
#

Well, you need to know the principles of code, yes

#

Same goes for Blueprints in Unreal Engine

robust timber
#

Bolt I am speaking about in the sentence above

abstract zephyr
#

Yeah I get that

#

I'm just comparing it with Blueprints from Unreal

robust timber
#

Unreal seemed fun also. But Unity seemed more universal to me so I stayed with it

abstract zephyr
#

It is

#

Unreal can't do 2D

robust timber
#

And I mainly wanna do 2D πŸ˜†

abstract zephyr
#

GoDot is good for 2D I heard as well

#

GoDot can only do 2D

#

Anyway, I think we should get back to the problem :P

robust timber
#

I watched some videos about it, yes. never touched it tho... πŸ˜„

abstract zephyr
#

So for your problem, there are two options, option A is you learn inheritance, option B is you do it much more simply/ugly

abstract zephyr
robust timber
abstract zephyr
#

One is more work than the other and harder to explain, and I'll kinda require you to do your own research on that front too

#

Because it's kind of hard to explain inheritance all by myself

#

So your choice

#

(also the consideration if it fits with your problem properly as well or not)

#

I guess there's even another option but then you need another script that controls the behaviour

#

And then you're doing more '"Object Oriented Programming"

#

There's a lot of things you can do differently with code heh

robust timber
#

I planned to start the coding classes offered by Unity learn but I never got the time. I really hope that I will have the time to do at least this one.

abstract zephyr
#

I'd highly suggest doing that yes

#

I've never done them myself, but from what I've seen they're good

robust timber
#

Yes, after doing those I may have the foundation to even speak with a person like you hehe. I don't even know the basic terminology to answer basic questions regarding what I wanna do as you can see πŸ˜…

abstract zephyr
abstract zephyr
#

There's always a lack of time :p

robust timber
#

From the Playground app. It's free and you can install it easily in every unity project

robust timber
abstract zephyr
#

Oh you're teacher?

robust timber
#

2d animation, yes

abstract zephyr
#

Cool!

abstract zephyr
robust timber
#

it would have been cooler if I was able to code at least a bit hahaha I admit! Coding is one of the things that I regret not picking up when I had the time and chance

abstract zephyr
#

Well, you saved yourself a lot of headaches at least ;P

#

Which no doubt you'll be getting now since you want to learn it now heh

#

Anyway I think for now, we'll just go the 'easy' route with the code

robust timber
robust timber
abstract zephyr
#

Honestly I just really don't want to explain OOP or Inheritence that much rn heh

#

You'll have to explore that for yourself ;)

robust timber
#

What do you suggest I can do now?

abstract zephyr
#

I think, you want to split up the Update, you want some extra functions so you don't have repeating code

#

Also, work in one script, the original script preferably, remove the copied one

#

So, this is your Update rn:

void Update ()
    {
        if(Input.GetKey(keyToPress)
           && Time.time >= timeOfLastSpawn + creationRate)
        {
            Vector2 actualBulletDirection = (relativeToRotation) ? (Vector2)(Quaternion.Euler(0, 0, transform.eulerAngles.z) * shootDirection) : shootDirection;

            GameObject newObject = Instantiate<GameObject>(prefabToSpawn);
            newObject.transform.position = this.transform.position;
            newObject.transform.eulerAngles = new Vector3(0f, 0f, Utils.Angle(actualBulletDirection));
            newObject.tag = "Bullet";

            // push the created objects, but only if they have a Rigidbody2D
            Rigidbody2D rigidbody2D = newObject.GetComponent<Rigidbody2D>();
            if(rigidbody2D != null)
            {
                rigidbody2D.AddForce(actualBulletDirection * shootSpeed, ForceMode2D.Impulse);
            }

            // add a Bullet component if the prefab doesn't already have one, and assign the player ID
            BulletAttribute b = newObject.GetComponent<BulletAttribute>();
            if(b == null)
            {
                b = newObject.AddComponent<BulletAttribute>();
            }
            b.playerId = playerNumber;



            timeOfLastSpawn = Time.time;
        }
    }
robust timber
#

Ok, let me see how I can do that.

#

Sorry If I'm a bit slow on that

abstract zephyr
#

You should have it as:

    private void ShootBullet()
    {
        if (Time.time >= timeOfLastSpawn + creationRate)
        {
            Vector2 actualBulletDirection = (relativeToRotation) ? (Vector2)(Quaternion.Euler(0, 0, transform.eulerAngles.z) * shootDirection) : shootDirection;

            GameObject newObject = Instantiate<GameObject>(prefabToSpawn);
            newObject.transform.position = this.transform.position;
            newObject.transform.eulerAngles = new Vector3(0f, 0f, Utils.Angle(actualBulletDirection));
            newObject.tag = "Bullet";

            // push the created objects, but only if they have a Rigidbody2D
            Rigidbody2D rigidbody2D = newObject.GetComponent<Rigidbody2D>();
            if (rigidbody2D != null)
            {
                rigidbody2D.AddForce(actualBulletDirection * shootSpeed, ForceMode2D.Impulse);
            }

            // add a Bullet component if the prefab doesn't already have one, and assign the player ID
            BulletAttribute b = newObject.GetComponent<BulletAttribute>();
            if (b == null)
            {
                b = newObject.AddComponent<BulletAttribute>();
            }
            b.playerId = playerNumber;



            timeOfLastSpawn = Time.time;
        }
    }

    void Update()
    {
        if (Input.GetKey(keyToPress))
            ShootBullet();
    }
robust timber
#

Ok, I replaced you'r code

abstract zephyr
abstract zephyr
#

Also, a bit of a disclaimer, code which I provide is by no means perfect, there simply are many ways to do one thing in code

#

So I'll try to my best of abilities to provide decent code, but I can't promise perfect ;P

#

(Also since we're taking the 'quick' route it'll be less 'neat')

#

And keep in mind I can't actually test your things, so if something provides errors, you'll have to communicate it back

robust timber
abstract zephyr
#

Par example, I don't have the variables, so I've a lot of errors ;P

robust timber
#

I'm grateful you're taking the time at all.

abstract zephyr
robust timber
#

No worries if it works or not.

abstract zephyr
#

At least I hope it still is kek

#

Otherwise things are gonna get confusing if your code is suddenly different heh

#

Also, I'm assuming your current code DOES work, right?

robust timber
abstract zephyr
#

(If not we should fix that heh)

abstract zephyr
robust timber
abstract zephyr
#

Okay, that's a good start πŸ˜„

robust timber
abstract zephyr
#

Thaaaaaats unreadable

robust timber
#

click open original underneath the image

#

πŸ˜…

abstract zephyr
#

Even still it's hard read πŸ˜…

robust timber
#

sorry 😦

abstract zephyr
#

No worries

robust timber
#

I don't know how to post bits of code like you do

robust timber
#
public static void Main()
{
 Console.Writeline("Hello, World");
}
abstract zephyr
#

Yes

#

Now just, with your actual code in it :P

robust timber
#

that took me like 3 minutes to make πŸ˜„

abstract zephyr
#

I appriciated the complete copy though XD

robust timber
#

Ok, let's go πŸ˜„

abstract zephyr
#

(Also notably normally you'd put it in a pastesite with the length of your code, but this is a thread so it's fine)

robust timber
#

it tells me my text is too big πŸ™‚

abstract zephyr
#

Oh lol

#

Just put it in a pastesite then

#

Like you did before

robust timber
#

ok

abstract zephyr
#

That's still the exact same though?

robust timber
#

is it? 😫

#

oh yes

#

crap

#

πŸ˜„

abstract zephyr
#

nice

#

Please copy your current code so I don't get confused ;P

robust timber
abstract zephyr
#

Ngl it's pretty funny learning a teacher as a student heh

#

I know different subjects, but still

#

Well it's different

#

Just not exactly what I said

robust timber
#

I'm always open to learning new skills. it's just I'm a total noob and it all seems greek to me...so I easily get lots

abstract zephyr
#

Also why is this in here XD

#

Your Unity won't be happy with that XD

robust timber
#

ah lol

#

I am laughing out laud now

#

aahahha

#

geez

#

πŸ˜‚

abstract zephyr
#

Also, to reiterate, this will be your Update:

    void Update()
    {
        if (Input.GetKey(keyToPress))
            ShootBullet();
    }
robust timber
abstract zephyr
#

That's the same

robust timber
#

wait why am i having two oid updates

#

I just noticed

abstract zephyr
#

What I'm trying to do, and tell you, is that you split the whole update (which currently manages shooting the bullet) into a seperate function, so that you can call it multiple times in different if statements, so that you don't have repeating code

#

Ah

#

Yeah don't do that XD

robust timber
abstract zephyr
#

Okay

#

That looks good

robust timber
#

OK started fresh cause I got confused and I replaced the old void update

abstract zephyr
#

Does it work?

robust timber
#

I haven't tested it yet. Let me see

#

shall I keep the old script too or just replace it with the new one?

abstract zephyr
#

Do you use git?

robust timber
#

cause Im working on top of the old one

robust timber
abstract zephyr
#

It's reletively easy use

#

And if you use it, that means you can always go back to your old script

#

Like these are all seperate versions

#

If I want I can go back to whichever version I want

robust timber
#

I see what you mean. Like backup

abstract zephyr
#

You can also see what changed

robust timber
#

the's smart

abstract zephyr
#

The big difference that each version isn't a COMPLETE copy of the entire game, it's just the difference

#

So that the repository doesn't get fukin gigantic

abstract zephyr
#

It's just saved differently, it's hard to understand, but it just works okay XD

#

There are some really smart people behind whoever made the system

robust timber
#

I will make a fast prefab and test ti out

abstract zephyr
#

Uh sure

#

You can also go do git first take your time

robust timber
#

I tested it and it didn't work. No new prefab was created

abstract zephyr
#

Hm

#

I find it hard to say if that's the code (it probably isn't unless something was incorrectly copied) or if it's your own doing of using the wrong script/prefab or other shenangins

#

Do you get errors?

robust timber
#

Nope, nothing

abstract zephyr
#

Keep in mind you do have to press a button

#

I don't know which button though, you assigned that

robust timber
#

oh, I thought it will go automatically, sorry. let me test it with a button πŸ™‚

abstract zephyr
#

Heh

robust timber
#

oh yes, that worked

abstract zephyr
#

Right hah

robust timber
#

it acts like the old one

abstract zephyr
#

Yup it should

robust timber
#

cool πŸ˜†

abstract zephyr
#

It's nothing more than just putting the code in a function

#

Do you get what you did or not?

robust timber
#

not exactly

#

i was reading your code but don't really get it

abstract zephyr
#

Okay, so it's pretty simple really

#

Lemme provide you with an example

robust timber
#

That would be great

abstract zephyr
#
    private void PrintSomeText() 
    {
        print("Hey! I printed some text");
    }

    private void Start()
    {
        PrintSomeText();
        print("Hey! I printed some text");
    }
#

Here

#

These two things do the exact same thing, but one is done in a method, and that method is called within the Start, and the other is without method

#

The thing here is, say I wanted to print it twice

#

Instead of having copy the entire statement of Hey!...

#

I can just do:

#
    private void PrintSomeText() 
    {
        print("Hey! I printed some text");
    }

    private void Start()
    {
        PrintSomeText();
        PrintSomeText();
    }
#

If you want you can test it for yourself

#

The main advantage of using methods in this case, is that you only have to change the text once, instead of twice

#

Like, if I want to change what the PrintSomeText says

#

I do

#
    private void PrintSomeText() 
    {
        print("Hey! Some other text is printed");
    }
#

And that'd change the output

#

Instead of having to do

#
    private void Start()
    {
         print("Hey! Some other text is printed");
        print("Hey! Some other text is printed");
    }
#

Do you understand it so far?

robust timber
#

Yes, I think I do. How will that be helpful in my case? I'm just trying to connect the bits

#

It seems to make things easier

abstract zephyr
#

Well, lets give a bit of bigger example

#
    private void PrintSomeText() 
    {
        print("Hey! I printed some text");
        print("Hey! I print text");
        print("Hey! printed text I have");
    }

    private void Start()
    {
        PrintSomeText();
        PrintSomeText();
    }

Here you can see how this already saves a whole bunch of lines if I want to print this twice

#

Cuz if i weren't to use this method, it'd be this:

#

private void Start()
    {
       print("Hey! I printed some text");
        print("Hey! I print text");
        print("Hey! printed text I have");
       print("Hey! I printed some text");
        print("Hey! I print text");
        print("Hey! printed text I have");
    }

#

I assume you get now, why using method is better :P

#

So now, for your case, you obviously want to execute the same code for shooting and automatic shooting, however you've change when it shoots automatically or not

robust timber
#

Yes I get it now

abstract zephyr
#
   [SerializeField] bool myBool;

    private void PrintSomeText() 
    {
        print("Hey! I printed some text");
        print("Hey! I print text");
        print("Hey! printed text I have");
    }

    private void Start()
    {
        if(myBool)
        {
        PrintSomeText();
        print("printed statement 1!")
        }
        else
        {
        PrintSomeText();
        print("printed statement 2!")
        }
    }
#

So here, it only will do the top one

#

Else the bottom one

#

(Which will give the same obviously)

#

Now if you apply that, with your other bool of input, you'll have one automatic one and one non-automatic one dependant on if myBool is true or not

#

Get it?

#

Here, updated it

#

Now there's a difference depending on the myBool value

#

You can test it if you want

#

You can even check the bool on or off within the inspector

robust timber
#

OK, I don't think I understand everything but let's see

#

So you mean that it should be possible to have both functions from a single script?

abstract zephyr
#

What do you mean exactly?

abstract zephyr
#

Ah, yes

#

(Again we're simplifying here, normally you'd probably use inheritance or OOP for this)

robust timber
#

well if that's the case that would be genius! I have no clue why they didn't implement such a function in the first place.

abstract zephyr
#

:)

#

It's a good basis, that's for sure

robust timber
abstract zephyr
#

haha, don't worry about it for now ;)

robust timber
#

Ok, so how to I test it and put it in practice?

abstract zephyr
#

Uhm lemme grab your script

#
    [SerializeField] private bool shootAutomatically;
    void Update()
    {
        if (!shootAutomatically)
            if (Input.GetKey(keyToPress))
                ShootBullet();
            else ShootBullet();
    }
#

Something like that

#

Notably, the ! stand for not

#

So, if NOT shootAutmatically, get input => shoot bullet

#

And if it's true, ShootBullet();

abstract zephyr
#

(Believe, me, don't put your variables above functions, it gets messy and confusing very quickly)

#

(Definitely haven't been a victim of it because I felt like it was better at the start)

#

(Also, do you like brackets? I seem to overuse them currently ;P)

robust timber
#

OK, so I think I see where things are heading.

abstract zephyr
#

:)

robust timber
#

I like Brakeys, youtube channel, so I guess I don't mind yours πŸ˜‚

abstract zephyr
#

Haha

#

Brackeys is great

#

Too bad he stopped

robust timber
#

Use to be...now he's lost somewhere in his own worlds πŸ™‚

#

true

robust timber
#

like so?

#

it does not seem right i think

#

πŸ˜„

abstract zephyr
#

I said move the variables up top, yes

#

Not the entire Update

#

kek

robust timber
#

πŸ˜‚

abstract zephyr
#

The Update was fine on the position it was :)

#

From what I can see though, the rest is fine

#

Wait no

robust timber
#

I'm replacing the old update with this one, right?

abstract zephyr
#

You've two update again

#

kek

#

Yes

#

You can only ever have one Update

#

Otherwise Unity will try to kill you :p

robust timber
abstract zephyr
#

I like how you moved the variable with the update

#

You really want to stick those two together, don't you? XD

#

You see all of these variables?

#

Yeah keep this one there too

robust timber
#

Believe me, I'm not doing it purpusely 😫

abstract zephyr
#

Keep your variables up top, together ;P

abstract zephyr
#

I told you not to to put it along with the void and you did it twice XD

#

You just really want the Update and the Boolean to be friends, which is nice of you you

robust timber
abstract zephyr
#

But sadly, the Boolean and Update can't be friends, the Boolean can only be friends with the rest of the variables :P

robust timber
#

lol

abstract zephyr
#

It looks good I think, but I do also think you still have errors

#

I think your brackets are bit off

robust timber
#

completely possib;e

abstract zephyr
#

I think this is a stray bracket

robust timber
abstract zephyr
#

Does anything give errors?

#

OH

#

YOUR BLOODY IDE ISN'T CONFIGURED

#

That's uhm

#

Very important

#

And probably also part of the reason why you're struggling with duplicate updates and such

robust timber
#

I'm doing it now

#

OK I added it in Unity.

abstract zephyr
#

Or par example two updates

robust timber
#

Maybe I will have to update the VS some day also.

abstract zephyr
#

2019 is fine

#

(It's the one that still comes with Unity Hub)

#

I just like VS 2022 because I'm lazy

#

It has better intellisense

robust timber
#

It didn't get "angry" I think

#

hwo to I understand? underlining?

abstract zephyr
#

(It adds it in if I press tab)

#

It's auto complete for code

#

Doesn't always work well

#

But when it does it's nice

abstract zephyr
#

It should give errors

#

Like this should give a fuck ton of errors

robust timber
#

nope no errors found yet

abstract zephyr
#

Then it's not properly configured

#

I'd recommend restarting Unity and VS as well

#

If you haven't already

robust timber
#

Nope, I haven't but I should have. πŸ˜…

#

restrting

#

both

#

ok now i Have it

#

restarting fixes everything, ofcourse

#

I should have known that from the start πŸ™‚

abstract zephyr
#

Hahaha

#

awh

#

you can't even send gifs in threads

#

anyway, yeah restarting stuff helps a lot usually :p

robust timber
#

Now I have one error about that bracket

abstract zephyr
#

:D

#

See!

#

Much easier :)

robust timber
#

true!

#

that was a big heads up!

abstract zephyr
#

This'll make both the helpers life, as well as yours better :P

robust timber
#

but now it doesn't really matter what bracket I put the error stays

abstract zephyr
#

I'd have told to configure it earlier, I just didn't know it wasn't configured πŸ˜…

abstract zephyr
robust timber
#

when I remove it I have no erroers

abstract zephyr
#

Yeah that's why it's a "stray bracket"

#

It's not supposed to be there

#

So if you remove it, then the error is resolved

robust timber
abstract zephyr
robust timber
#

OK, let me test it out now.

#

the errorless test

abstract zephyr
#

Make sure you've the boolean on the correct state in the inspector!

#

For what you want to test

#

In theory you should be able to switch the modes during runtime

#

With the inspector tickbox of that boolean

robust timber
#

OK, so...

#

it works

#

but

abstract zephyr
#

But?

robust timber
#

haha

#

then I tick sooth automatically it stops and it only shoots when it's unchecked

#

it makes the opposite

abstract zephyr
#

Share your current code again?

robust timber
#

And I can't use a button to shoot

#

if the tick is unchecked

abstract zephyr
#

If it's unchecked, it just keeps shooting, no?

robust timber
#

I guess you have to check if you want the option to trigger? It's a bit moe intuitive I think.

abstract zephyr
#

What?

abstract zephyr
robust timber
#

Yes, it keeps shooting when it's unchecked

#

The script will be abe to be used as a manual shooter too, right?

#

with a press of a button

#

So if the automatic shooting is on the key is disabled and if it is off the manual key should be enabled?

abstract zephyr
#

Okay wait

robust timber
#

or is it? 🀨

abstract zephyr
#

Now I'm confused

#

If the box ISN'T ticked

#

Then it shouldn't shoot automatically

#

Right?

robust timber
#

yes, that's correct

abstract zephyr
#

Okay so when it IS ticked

#

You can use the button

#

To shoot

#

Correct?

#

Man I'm confusing myself

robust timber
#

I think no.

#

I think it should, work like so if my logic is right ofcourse πŸ˜„

abstract zephyr
#

Okay wait, let me rephrase

#

If you ticked the box, shootAutomatically, it shoots automitcallly

#

Right?

#

And if it isn't, it does not

robust timber
#

yes

#

that's correct

abstract zephyr
#

Okay, so that makes sense to me, as well as you, right?

robust timber
#

but now it does the opposite. It shoots when the box is not ticked

abstract zephyr
#

Is this what you answered, what te code currently does

#

Wait

robust timber
#

I know it's just a minor thing, but it is not intuative

abstract zephyr
#

Can't you just make like

#

A quick recording

#

So we're not both ultra confused?

#

That'd be great XD

#

In the meanwhile I'll have a quick toilet break, so brb

abstract zephyr
#

What

#

I'm so confused

#

Could you make a screenshot of update?

#

Oh boi my boss is gonna bring me some fried chicken

#

Nice

robust timber
abstract zephyr
#

Also I know that's completely off-topic but I had to mention it XD

robust timber
#

Food can bring all sorts of emotions to a person... especially if one is hungry! πŸ˜†

abstract zephyr
#

Haha

#

Also give me a bit I'm trying to figure out why it's going wrong

robust timber
#

I have to leave in about 15 to 20 minutes tho. I have to puck up my daughter from kindergarten and we will pend some time in the park after.

abstract zephyr
#

Wait lemme make a commit before I fuck my work lol

abstract zephyr
robust timber
#

Nah

#

take your time

#

i appreciate all youre time and effort

abstract zephyr
#

:)

robust timber
#

If we(you) can't make it today it can be done any other day too, if you have the time and energy ofcourse πŸ™‚

#

It is kinda working and I'm really excited, to be honest.

#

I had no expectations what will happen but I decided to give it a shot because, you can never know πŸ™‚

abstract zephyr
#

OOOOOOOOOOOOH

#

MY

#

FUCKING

#

GOD

#

I think I figured it out

#

By god I am stupid

abstract zephyr
#

That's what I get for not using body's ;-;

#

Try this:

 void Update()
    {
        if (!shootAutomatically)
        {
            if (Input.GetKey(keyToPress))
                ShootBullet();
        }
        else ShootBullet();
    }
#

(Replace your current Update with that)

robust timber
#

let's see

#

srossfingers

abstract zephyr
#

If this doesn't work then my brain really died

robust timber
#

OMG, it works flawlessly!!! 😁

abstract zephyr
#

HAHAH

#

Do you understand why works?

abstract zephyr
#

My god I am so stupid

#

God fuck me

#

XD

robust timber
#

oh that's so pretty!

#

Are you kidding

abstract zephyr
robust timber
#

I would have never been able to figure it out

abstract zephyr
#

And why it didn't work now

robust timber
#

it's like learning how to read a brand new language

abstract zephyr
abstract zephyr
#

I need to go in a bit

#

And I want you to understand

robust timber
#

I think the answer to that question is because the braket. it needed to separate the code somehow to make the difference

#

I hav no idea how exactly but that's how my basic coding brain can explain it to myself

#

I wanna understand it myself too

abstract zephyr
#

The grouping is different

#

You can also see it with the indents

#

The 2nd is on the same line as the 2nd if

#

And the 1st is on the 1st line of the if

robust timber
#

yes, I completely understand the difference

#

not technically but logically

abstract zephyr
#

So what it was doing originally, was asking if the variable was false, if so do the if, check the key else shoot

#

It's a bit hard to explain, but you can mess around with it to see why it matters SO much

#

It was just an oversight in my part heh

#

Even rather experienced people make rookie mistakes ;P

#

Anyway I gtg, I've to eat some fried chicken ;D

#

If you've more question I'll from you :p

#

So gtg for now, cya!

robust timber
#

The thing is that it actually got even better than I imagined. I never thought both functions can be stored in a single script. That makes life so much easier. Great thinking!

#

Is it OK if I add you as a friend before you go?

#

Thanks for the assistance. It was very helpful and much appreciated! I owe you a beer or two πŸ˜‰

#

And we're right on time 😎

abstract zephyr
#

But that's a bit more complex

#

Maybe I'll provide some examples when I'm home, no promises though, I've a lot to do and I need my own bit of free time as well ;P

#

(Gonna leave soon from work, but it's 2hr travel time to my house so it'll take a while before I'm home)

#

Also thanks for all the GDL pastes kek