this post was submitted on 14 Mar 2024
15 points (100.0% liked)

Godot

5840 readers
33 users here now

Welcome to the programming.dev Godot community!

This is a place where you can discuss about anything relating to the Godot game engine. Feel free to ask questions, post tutorials, show off your godot game, etc.

Make sure to follow the Godot CoC while chatting

We have a matrix room that can be used for chatting with other members of the community here

Links

Other Communities

Rules

We have a four strike system in this community where you get warned the first time you break a rule, then given a week ban, then given a year ban, then a permanent ban. Certain actions may bypass this and go straight to permanent ban if severe enough and done with malicious intent

Wormhole

[email protected]

Credits

founded 1 year ago
MODERATORS
 

Wanted some opinions on ways to set up triggering "on-kill" effects. In short: The player can have abilities that trigger effects whenever they shoot and kill an enemy. I'm also looking to extend abilities to enemies as well, so can't just hardcode a player reference.

Currently I'm doing it like this:

  • Enemy signals that it died -> the bullet receives this and signals that it killed Enemy -> the player's weapon receives this and signals that it's bullet killed Enemy -> the player receives this and triggers it's on-kill abilities.

It simultaneously feels like a good way to go about it but also a long mess. The other option I've considered is:

  • Each bullet has a reference to it's owner (eg. player). When an enemy dies to a bullet, it looks to the bullet's owner reference and tells it to trigger it's on-kill effects.

This way is a lot simpler to write, but is error prone eg. In cases where the bullet's owner is killed while their attack is mid-air.

Thank you all!

you are viewing a single comment's thread
view the rest of the comments
[โ€“] rtxn 4 points 7 months ago* (last edited 7 months ago) (1 children)

I have little experience with Godot, so I'll just write the general concept and you'll have to translate.

I'd go with #2, but also have the bullet subscribe to an event that is triggered when the shooter player dies. When that happens, set a private variable that tells the bullet that it shouldn't trigger any on-kill effects (or you could do other things like detonate or remove the bullet).

Something like that in C# (or close to C#, it's been a while):

class Bullet {
    private Player _player = null;
    private bool _enableOnDeathEffect = true;

    private void OnPlayerDeath(object sender, EventArgs e) {
        _enableOnDeathEffect = false;
    }

    public void OnKill(){
        if (_enableOnDeathEffect) {
            //trigger effect
        }
    }

    public Bullet(player) {
        _player = player;
        player.OnDeath += OnPlayerDeath;
    }
}
[โ€“] Jozzo 1 points 7 months ago

Thanks for your input! The other commenters pointed out that I can use Godot's is_instance_valid() function to check if the bullet's owner exists before attempting to call anything on it, so will be reworking the system to use #2 + that.