Or maybe they have the ability to make you weaker
Yep it’s not near finished. This is one of those projects that’s sat in my “keep an eye on it” bookmarks for a good while, I figured I’d post it to get some attention on it, because it does look very promising.
I found some here: https://docs.spacebar.chat/setup/server/#setup
Note that the attacker needs to already have access to your Microsoft 365 account to do any of this. Fuck copilot and all, but this isn’t something they couldn’t achieve before.
Got hit with this in the middle of work. We only have one customer using CrowdStrike, and only staff PCs, no infrastructure. But this one is REAL bad, caused by turning your PC on, and cannot be patched - each affected PC needs to be manually fixed. Would not be surprised to see Linux usage go up after this.
One attendee and the shooter are dead
It depends entirely on the company you work for. Even then, I wouldn’t exactly describe the work as “chill”
I patched together some version of this using nested dictionaries:
var abilities: Dictionary = {
AbilityData.Trigger.BEFORE_ATTACK : {},
AbilityData.Trigger.ON_ATTACK : {},
AbilityData.Trigger.ON_HIT : {},
AbilityData.Trigger.ON_KILL : {},
AbilityData.Trigger.ON_DEATH : {},
AbilityData.Trigger.ON_JUMP : {},
AbilityData.Trigger.PASSIVE : {}
}
with each value being another key:value pair of { "ability_id": <ability-node> }
so I can keep a reference to the Ability node and use dictionary functions like .has() to check if a character has a specific ability:
func has_ability(ability_data: AbilityData) -> bool:
if abilities[ability_data.trigger_type].has(ability_data.id):
return true
return false
Then when a trigger fires, it calls this (I omitted the return code):
// Activates all abilities with the specified trigger type. Returns an array containing each ability that was activated this way.
//trigger_type is an enum
//data is just a resource containing things like position, target, ability owner, etc
func trigger(trigger_type: AbilityData.Trigger, data: AbilityActivationData) -> Array[Ability]:
var abilities_to_activate: Dictionary = abilities.get(trigger_type)
// Loops through the list of Ability nodes.
for ability in abilities_to_activate.values():
ability.activate(data)
abilities_activated.append(ability)
This seems to work, but it still gives me that tickling sensation that it could be a little cleaner.
I think I understand…
Instead of the player iterating through and calling all of its abilities, the ability just connects directly to whichever signal it needs on the player?
My current setup is to add each Ability as a node to the player, so right now it follows the “call down, signal up” adage that I hear everyone say. What would be a good way to implment the other way? I assume I should rework my current setup otherwise it’d be “signal down, signal up”?
Win11 doesn’t let you past setup if you dont have an internet connection.
Epic, I generated a film summary for fun:
“Assassin Ninja Cows 2” is an action-comedy film starring Seth Green as the lead character, alongside a herd of cow-ninjas. The story revolves around a group of dairy cows who have been trained in the art of ninjitsu by their master, Sensei Moo. In this sequel, the cows face their most dangerous mission yet, as they must protect their farm from a ruthless group of assassins known as the Black Udder.
The plot follows the cow-ninjas as they work together to outsmart the Black Udder, utilizing their stealth, agility, and teamwork to create a series of elaborate and hilarious schemes. The cow-ninjas must use their unique skills to defend their home and fellow farm animals.
As the story unfolds, Seth Green’s character, a witty and resourceful city cow, takes on a leadership role, employing his intelligence and quick thinking to guide the cow-ninjas through various obstacles and challenges. Along the way, the audience is treated to a blend of action-packed fight scenes, slapstick humor, and heartwarming moments of camaraderie among the farm animals.
In the end, the cow-ninjas successfully defeat the Black Udder and save their farm from destruction, proving that teamwork and determination can overcome even the most formidable foes. “Assassin Ninja Cows 2” is a lighthearted, family-friendly film that combines humor and action to create an entertaining and engaging experience for all ages.
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.
Definitely sounds like the way to go the more I think about it. Thanks!
The longer I’m using the signal chain the more I’m wanting to rework it to just be a reference lol. Good point with checking if the instance is valid, if any other errors come up I could just patch around them in a similar fashion.
That said, you can probably simplify your signal code if you connected the bullet killed_enemy signal directly to the player’s on-hit handler. It seems like the weapon on-kill handler is redundant?
Ah I see what you mean, killed_enemy(enemy-object) signals directly to the player which can then pass that enemy to it’s abilities if needed. You’re correct that the weapon signal is mostly redundant, it was just the easiest node to connect to the bullet’s signals, as it’s responsible for spawning them.
I think I’ll change the whole system to just use a reference. Thanks for your input!
Wow that was incredibly well made, thanks for sharing!
You’re probably right, but it’s an alternative for people who don’t.
Just tried this out in one of my projects, here’s what happened:
do something
works without a problem.do something else
never goes off.foo()
again any number of times and do something
will still go off.Having it waiting in the background didn’t seem to have much of a performance impact. I started 5000+ of them and foo()
only took up ~0.6% frametime with the rest of my game running alongside it.
PlanarAlly is a pretty cool self-hosted VTT.
Requires some setting up, but zspotify can download entire playlists.
I had a similar problem, it was caused by undervoltage. Are you using the official power supply?