Don't blame me, I've sung it from the rafters since day 1!
Don't blame me, I've sung it from the rafters since day 1!
It's nice when the problem is that obvious and straightforward, and the solution equally so. But that rarely happens in real life (unless you work on a manufacturing line, right?).
Whaaaaaaaaaat?
I think I want to re-learn GAS and the gameplay message subsystem... it'll help me with this new plugin AND it'll help me develop that third person controller I want to build.
For ppl who aren't aware:
Old temperate forests are insanely rare nowadays and extremely important ecosystems lost forever once cut.
They're not just "old trees" but intricate networks of trees, fungi and all kinds of living creatures.
You CANNOT replant this!! Once it's gone it's lost FOREVER!!!
just became aware of this--the regime wants to clear-cut massive chunks of Oregon's old growth forests in the name of timber production.
you have until March 23rd to comment.
i know we have endless fucking things to scream at politicians about--this is an important one too.
DUDE THAT WATER STARTER IS A GEKKO?
I'm choosing the Gekko!
#PokemonWindsWaves
There are more updates I can make
* Camera shakes
* Post-processing
* Materials
* Popup text
* A parent class or interface for Actors generated by this plugin
There are now Niagara data channels now?
Finished the looping fx implementation. There are some bugs in it - no clue why the AnimNotifyState's Details window cuts off the first letter from the name.
Now I need to make a video, which means making a level with cool assets, possibly remembering how to implement Gameplay Effects.
Mike Johnson intentionally and willingly chooses not to enforce Congressional power because he doesn't have enough votes to guarantee Congress will approve Trump's actions.
It's absolute corruption.
"How can you oppose war when Khamenei was evil?"
Simple. If you killed Donald Trump by nuking Washington DC, I would not mourn Trump but I'd still say you're an evil war criminal who belongs in the Hague. It's really not hard.
I had not heard of data channels in Niagara systems before now. It's experimental yes, but still cool. Hmm.
If I can successfully get looping effects to work, that's a huge challenge over and done with.
At some point I need to write functionality so effects can be triggered in code by collisions, too. And ones that are emitted by default, like on a weapon...
God this is getting so complex. Y.Y
Otherwise, I would have done it already!
So what's the solution?
๐ก
Delegates!
When an Actor is going to be destroyed, pass a function that destroys its Registry inside the subsystem's "Looping Effects" directory.
So back to the original problem... use UStructs.
#RubberDuckCoding
To maintain encapsulation, I can't just write an AActor subclass and expect all projects to rearrange their architecture. The plugin's component could keep track of looping effects... if that didn't create a circular dependency. The Subsystem would have to send looping effects back to the Component!
I just realized something...
If an Actor - that owns components emitting looping effects spawned by my plugin - is removed from the level, I'd have to update the Subsystem to remove that Actor from the Directory, and all its references. Seems inelegant?
The alternative is...
I'm frustrated that template errors and incompatible argument lists are causing this problem. That's such a junior-level problem! The only thing that's changed is I am not using ustructs or uclasses, just normal structs. I do not understand why that would be the problem, but whatever man...
However, the *other issue* remains. I created a bunch of structs like in my original post, but every time I implement them, some template error stopped the compilation.
I was hoping I could just use plain structs, but the more I think about it the less it makes sense, especially in Unreal C++
#UnrealEngine All I had to do for the first problem was get the AssetManager to front load. It refused to load into the class's member, though. *That* caused a crash for some reason. Had to use a pointer in-scope. Maybe I should grab the Asset Manager and Stream Manager in the constructor?
"YO DAWG, I HEARD YOU LIKE TEACHING YOUR AI WITH DATA!
SO I TAUGHT MY AI
WITH THE DATA THAT CAME FROM
THE AI YOU TAUGHT WITH DATA!"
...there's a way to make this work, I swear to God! That Is the 5th draft. I can do this.
Oh, riiiiiiight!
The object referenced could also be an AActor, so I will probably need to use a different pointer type. Urgh...
Maybe I can make an ActorManagementComponent to hold reference to all these Actors the system might be generating? Wait that sounds ridiculous...
And LoopingEffectsReference would house the essential data: the pointer to the thing, maybe the owning Actor, the time that has passed since the object was fired, etc.
Honestly? This might be overdoing it, but if it works for the AnimNotifyEventReference, it can work for me!
TMap<AActor*, FLoopingEffectsOwnedByActor> LoopingEffectsDirectory;
struct FLoopingEffectsOwnedByActor
{
TMap<FName, FLoopingEffectsContext> LoopingEffectsIndex;
}
struct FLoopingEffectsContext
{
TArray<FLoopingEffectReference*> LoopingEffectsList;
}
struct FLoopingEffectsReference
{
}
The Key is the Actor's address and the Event Name, but I turn them into an FString. The intent is to make these looping effects accessible to any part of code that knows the owning actor and the event that was fired.
The best idea is probably using structs.
#UnrealEngine I did not realize that in AnimPreview my WorldSubsystem does not call OnWorldBeginPlay(UWorld&)...
Because that's what's happening. And it is one of two suspects into why my code crashes.
The other being a poorly implemented Data Structure that crashes when I lookup a key.
If you're used to using Facetime but it's a voice-only call, that can definitely happen and it's just force of habit. Not your fault.
If you still do it, it's still not your fault but just make sure nobody noticed you... ๐
2. Front-loading all effects in an AnimMontage before AnimNotifies fire, begin, tick, or end. I thought the Subsystem would handle this, but *boy was I wrong*
Why not just make the Async code into Synchronous Load Code? It'll stop this from happening...
Returning to the looping effects now. There are 2 huge problens
1. Creating a data structure that meets the criteria I have written (accessible through Subsystem, generated by owner Actor and Event Name, etc.) and DOES NOT CAUSE ANY FATAL ERRORS
(Cont'd)
Ask the OP/Author to give you a copy, directly through E-mail.
They'll probably give you a copy, free-of-charge. They want people to read it, those resources want people to pay for it.