@crossmr Tagging you since perhaps you’ll know, and 's busy atm…
Would you (or anyone reading this) know how to create simple destructible objects in the grid’s current version?
1-I started with a Grid Actor as per the Teletransporter video shows, and notice my Grid Actor contains no variables whereas the video’s version has quite a bunch. I assume this too has been changed? Were they moved into a BPI?
2-I saw this comment about someone wanting the same thing from 8 months ago, but I’m having trouble understanding it:
" Hey man I realy love your work and I´m trying to do a game, where I need to destroy Items, which are on the ground, I allready have a Blueprint out of the Anim_Auto BP, which can be attacked, but dont attacks back/moves etc., the problem is that the game chooses it as a “playable enemy”, so the camera switches for about a secound to that Item and then back to the player and I dont find how to change it. Maybe you could help me, or just do a small video on how to make a attackable item "
I tried looking for this “Anim_Auto” bp he speaks of, but nothing is showing up:
Ok, some super quick support now. Only the stuff I can answer immediately without doing testing or putting a lot of thought into it. Sorry about that. As mentioned, after I hand in my thesis this week I’ll return to your questions with more in-depth answers.
Check the UpdateAbilityBox function in BP_Unit. It is called by an action as part of the select actor code.
Ok, thanks for the continued reporting. Gives me a lot to go on when I get to check this. Have no suggestions off the top of my head, I’m afraid.
Hmm, well that is annoying. Those sorts of issues are always a pain. Have you tried fixing up redirects in the folders?
Thanks and noted
I changed the name of BP_Unit_Anim_Auto to BP_Unit_Anim_Debug to make it clear to people that it is just intended for debugging and not a good starting point for your own units (for that I generally recommend duplicating BP_Unit_Anim). Could you be more specific about your issue with destructible terrain? At what step are you getting stumped?
That’s okay, I’ll keep feeding you with data, and hopefully something will click for you.
I went ahead and set up a debug text box on my UI to display the coordinates on android. I’ve attached the graph, but right before the branch where do the check for touch controls, I’m casting to the UI and setting the value of the box to the clicked index, and I’m again getting very odd unexpected behaviour. I’ve attached a picture of the little bit of messy debugging code I’ve inserted, but when actually trying it on my phone it’s very strange.
This code will only run when shooting (not on movement since it has its’ own override)
When I click a unit, and it “hovers” to show me the percentage… the text box doesn’t display anything. This makes no sense to me. I assumed that code was running. Prior to inserting that that check to see if touch controls were being used and telling it to branch on the clicked index, I couldn’t do this. If I tried to “hover” a unit, I couldn’t display the to hit chance. After inserting this code, I could now hover, and then (with a couple taps) make it fire at that unit. But when I hover a unit, the clicked index is not displayed. So I’m now mystified as to why the hover works when I click on a unit once.
After a little more testing if “long press” the unit sometimes the clicked index will update in the UI, but it isn’t consistent. Regardless of it updating, further clicking on the unit will make it fire and it will generally display the clicked index on firing.
I’ve now confirmed something strange going on by connecting the update to another spot.
I’ve now connected the text display update in the same function but immediately after the check to see if the tile is valid. At this point, I’m getting strange returns on the clicked index. if I long press a unit, and it selects them, I get their tile, in this case it’s tile, 1,004,010. If I quickly tap other squares, I get strange results. It sometimes changes to 8,002 which I feel shouldn’t happen because I have multiheight on and it should always return a “level” or something right? That’s what that first “1” is in the correct index, isn’t it?
If I tap random squares (some where units aren’t) it sometimes returns a correct looking index, like x,xxx,xxx but sometimes it returns a strange index like x,xxx
I just tried taking a shot at a unit. It first returned the clicked index as 1,004,010 but when I clicked it again, it changed to 4,010. Then when I clicked again It was 1,004,010 and it flickered back and forth a couple times before it got two in a row that were the same and fired.
I feel like this strongly indicates some kind of bug either the touch controls or the the way the clicked index is returned. This might explain the “jumping” around I sometimes see when trying to swipe to pan. If it is getting odd input from the touch when panning, the camera jumping around might be a symptom of the camera not knowing where it is supposed to be.
I’m attaching a video so you can see it live. The first shot, the uzi, seems to work fine. the pistol is different. You’ll notice the index in the upper left, shifting, especially when it was time to actually shoot. It goes back and forth between the full index and the shortened index. I should mention the Uzi is not always fine. Once in awhile a gun fires on the first try, but it has nothing to do with any specific gun. It’s just random.
Is there anywhere and example of old HA_Wall or Heightmap_Actor? There the wall is changing to transparent when mouse is hovering the wall. I noticed that you have removed whole Heightmap_Example.
Well, to start with, BP_Unit_Anim uses a skeletal mesh for its unit - is this necessary even if I want to work with destructible barrels, trees, etc? Does ATBTT need interactive units on the grid to be always skeletal meshes?
Personally I don’t have a preference by the way, in fact I think I’d prefer to use the Skeleton and Animation editors to handle notifiers, etc, rather than force myself to use only blueprints to make everything with these static objects. But I’m wondering if I really need to jump to Max/Maya to create a root bone, to create export to UE4 and create a new skeleton, just to start experimenting with this asset initially, and not have a humanoid skeleton placeholder for my object.
@crossmr: I’m guessing it relates specifically to the touch controls. You had disabled the tick event in the player controller, right? And the level index starts at 0, so 4005 basically means 0004005.
I’m afraid it was removed as part of the refactoring, though I’m planning to add it back. The wall is relatively easy to implement, though. You need a blueprint that overlaps path trace and has a hover overlap event. when it is overlapped you change to a translucent mesh and then revert when it is no longer hovered. If you want to check out precisely how it was implemented before you can always download an earlier version of the toolkit from the launcher.
What blueprint to start with certainly depends on your use case. Creating a duplicate of BP_Unit_Anim is probably a good idea if you want to make a unit with a skeletal mesh. Making a new child actor of BP_Unit is a better starting point for units that do not use skeletal meshes. For barrels, trees etc. you could base them on BP_Unit, which makes it a bit easier to set up taking damage etc., as all the stuff is already set up for units. If you want even more control, using BP_GridActor as a base is a possiblity, though you will need to modify the abilities you are using so that these can be targeted as units, set up their own health functionality etc.
Yes, tick is disabled. So the question is, why are the touch controls returning two similar, but not the same indexes on the same square? The jumping camera when panning might be unrelated, but it seems right now the key to straightening out the touch controls is figuring out why it’s returning two different values like that. It explains why you need to tap 2-3 times to get it to work. It seems that when it returns 4,010 it’s not the right tile and that’s why it isn’t actually firing or doing it’s action, after tapping a couple times it then returns 1,004,010 which is a valid tile to work with, and then it executes. Can you think of any reason or give me some insight as to how/where it actually process that tap into a valid index? Need to make sure it returns the correct tile every single time and then hopefully that part of the controls will be smooth.
Hi **, **just obtained your tool kit; it was exactly what I was looking for, so thank you! That said, I’ve been following your tutorials and I am having some issues with my characters disappearing into the landscape, so I was hoping you could offer some insight. I attached a couple of screenshots to show what is happening:
For the sake of learning more about ATBTT and blueprints, I’ll try making both BP_Unit and BP_GridActor (child blueprints) versions.
Starting with the BP_Unit, I was able to put the tree on the grid and make it enter combat like any other unit. Obviously much like that YT commenter initially inquired, I’d rather have it not be in the initiative order. Following your suggestion to this guy, I created a “bInitiativeOrder” bool in BP_Unit, by default set to True. The idea would thus be to use this bool to filter elements out of the array that would go into the Sort Actors in Initiative Order, in the Turn Manager, by setting False to the “units” that should not be included. Mimicking your Get Initiative function setup in BPI_Initiative, I created the “Get bInitiativeOrder” function for this.
1-This was my first attempt in trying to filter out the unwanted elements from the array. I failed. If I hit Play, way more units than just the unwanted ones are removed from the final array, even though their bools are set correctly. I believe this isn’t working because I’m modifying the array’s length while in the midst of the ForEachLoop’s execution, which is generally a big no-no?
2-This was my second attempt. I tried making a temporal array in which to store the final version, so as to not modify the ForEachLoop array while it is working. I failed too. In fact, I cannot explain why this version, if I hit Play, makes the final array have ZERO elements!
3-I was under the impression that if I created child blueprints of BP_Unit, they would already move, and use their three default abilities? If I create one, it *does *go inside the initiative order and thus gets its turn, but it cannot move, use abilities, or be selected at to be fired upon; even though it has its public variable attributes already set like Move, Range, Damage, etc. Do you have any sort-of-updated video or post explaining how can this be done?
4-More of a blueprints-specific question if you’re willing to explain: for the BPI functions, like the mentioned Get Initiative, I don’t really grasp some of its features. I understand the concept of BPIs as an addon to any BP so that it gains all of the BPI’s functions and tools, among other benefits. But why do these functions have a “Message” version, and a “Interface Call” version?
The Message version receives Obj Refs which is ■■■■■■■ sweet, and the other one receives…BPI Initiative Interface? Itself? When the heck would I use that for? And back to the Message version: the Envelope on its pin makes me think of it as an Event Dispatcher, but is it really? It doesn’t start with “Bind Event to” like Dispatchers do normally, nor we said they were so inside BPI_Initiative. We just created an extra function. Like you explained in your Turn Manager video, I just consider these as cheaper Casting methods, but in reality I don’t know anything else about these atm.
Anyway, these are my current thoughts putting my programmer hat on haha. Feel free to ignore 4) , I suppose I can track someone down in real life or in these forums to tell me the answer. Thanks for your time !
Hello. Is there a Exit Game key set up like 'ESC". If not how and where would I add that? I am concerned about the multiplayer aspect part of exiting also, but mainly just want to be able to exit game with a Key after game is over after it is packaged.
The touch controls in the player controller call on the BP_AbilityBase functionality of whatever ability is active, designating whether there is a touch input. This touch input is used for a line trace on the PathTrace channel which returns a location that is converted to a grid index in the same way a clicked location would.
Sometimes this is just an issue with UE4’s terrain system and you’ll have to rebuild it. It might also be the settings of the grid manager. Is Heightmap set to true and MaxGridHeight set to something higher than the highest point of your terrain?
This seems like a cumbersome way to do this. Rather than removing the units after initiative is sorted, instead modify the initial function that sorts units in initiative so that units with the boolean variable unticked are not added.
Yes, they should be able to do all of those things, but maybe I’ve broken something by accident? Is the regular BP_Unit also not functional or just child actors based on it?
Blueprint interfaces are a super handy way to have “shared” functions between different blueprints, where each blueprint has a separate implementation. Say that you have an “Interact” interface. In a first person game every time you click the mouse you can do a line trace in front of you and try to run the Interact interface on whatever actor the trace hits. Doors and light switches can have different implementations of the interface function causing them to open or turn on, respectively. This way you do not have to loop through every possible object, cast to them and attempt to run their specific functions. Also, if the interface call fails, nothing bad happens, and it is more efficient than casting. They are super handy, so check out the official docs here: https://docs.unrealengine.com/en-US/Engine/Blueprints/UserGuide/Types/Interface
Hey Locoweed, this is a pretty generic question that does not just relate to the toolkit. One way to do this is to define a quit input event in the project settings, define a behavior for this event in BP_PlayerController_ATBTT and call the Quit Game function: Quit Game | Unreal Engine 5.2 Documentation
Right, I got that much. I’m wondering in a multi-level map, should it be returning a result like I’m seeing? You mentioned that 4,010 would actually be 0,004,010. When it sets up the “levels”, does it do it in reverse order? e.g. 0 is the uppermost level and going down from there?
I just did a little more testing, and I noticed something a little strange. It seems to do the level switching when targeting the robbers, not the police officers. It’s only been a few exchanges, but so far after about 5-6 attempts on each of those 4 characters, the robbers when shooting, can shoot more or less normally as I expect, but the police get the switching levels when trying to fire. The difference being that the robbers have “accessories” as far as I can recall I’ve set everything to no collision (their masks). Verifying this yes, both the hair and mask meshes are set to no collision so they shouldn’t interfere with anything. This may instead be related to the robbers starting inside the building, but the issue persists if I walk them out of the building. I’m going to rebuild with them placed outside the building and see if i get the same issue or not.
Using some slow deliberate presses (Rather than quick taps, I observe the following), and using the exact same weapon ability (pistol snap shot):
Robber attacking Police officer on the map shown in the video:
First press, the hover activates, but the index clicked does NOT update. I’m not exactly sure why here. It should, as you can see in the above code that hover gets run if the clicked indexes don’t match. Which tells me the first click is actually running hover in another place.
The next long press sets the clicked index, but that’s it (it probably reruns hover)
The third long press notes that the clicked index matches and fires.
This is pretty close to what I should see, except for that first click. I need to investigate that.
Police Attacking either robber:
First long press, nothing seems to happen at all.
next long press it seems to hover
The next long press nothing
the next long press it sets the index
The next long press it returns the wrong index and the camera jumps a little
Wrong index again and the camera jumps a little bit more
It seems to match the index and fires.
I’m attaching a screenshot of my component list for my robbers so you can see. There are only 2 additional meshes, and I’ve verified that everything involved is set no collision. The skeletal mesh, the weapon, the hair, the mask, the armor. Otherwise there is no inherent difference between the police officers and the robbers in this case.
Now the police shooting do not always produce the same sequence. Sometimes it flickers back and forth between indexes, so 7 isn’t always typical, it can fire after 4-5 taps sometimes. But it is behaving differently.
Too many mysteries with what’s going on here.
I’m uploading another video so you can see what’s going on here, but over a few exchanges, the robbers never once had an index result of x,xxx returned when firing at the police. The police had it returned every time at least once during the tap sequence. The alien robber and the police both have the same ability set.
I just got an idea to drop a police officer in there but set to the robber faction to see how that works.
Edit: Okay this is really bizarre. I made a female cop a member of the robber faction and she has no issue firing at the police officers the same way the other robbers do. The police DO have an issue targeting her and have the same index issue. Is there any way at all that the faction could play any role in this at all? Robber female cop firing on police female cop 3 taps done, reverse and it’s multitap index issue. I’m going to make an alien robber a police faction and see what happens there.
Edit2: Okay this provides more odd results. Made an alien robber a police faction unit. This unit has issues targeting robbers, and robbers have issues targeting it. That’s at least somewhat consistent. I guess. it has issues targeting the Robber Faction Female cop unit.
Edit3: I’ve just discovered the “use mouse as touch” option in the project settings and this returns the same issue as I’m seeing on the phone. but in PIE, this will hopefully make debugging and tracking down this issue easier.
Edit4: With a little luck, I’ve started to find part of the issue, in BP_Abilitybase when Find Close Valid Overlapping Grid Index is run, it’s returning false a lot of times. I’ve noticed this using the mouse as touch when I’m touching the red square around the unit, but not within the target icon that would pop up on hover. The mouse is clearly over the red square, but I added a print when that returns false, and it’s coming up constantly. As I move closer to the center of the square, it returns true. I still can’t explain why the robbers don’t seem to generate that error targeting the police like the police do targeting them, but that is one of the issues causing the attack to fail. I’m attaching an image, print screen doesn’t capture the cursor, but I drew where I was clicking, You can see the prints on the left, that “can’t find overlapping grid” prints when the above mentioned function returns false.
I may have fixed the weird x,xxx style index being returned. I’m not sure how or why but in bp_abilitybase right before “switch on eheight” there was a branch checking for touch.I skipped that and now run straight to “switch on eheight” and now the index being returned always seems correct. So that problem may be solved. The other function return false isn’t. If that function returns true it’s 2 taps to fire which is exactly what i want, now i need to figure out why that’s failing. Sometimes even if I click right on the center of the unit’s body it’s return fail over and over.
I know my posts can sometimes get long with lots of edits and a little rambling, but I hope these posts can help people understand how I debug things and look at them and might give them an avenue to solving their own issues.
Another touch related bug:
On BP_Ability you have it set to check if “released” and if it has been released, you just do nothing. But on touch, you want the person to move their finger before activating the ability. This goes back to BP_AbilityBase where there was that question about whether or not it should be hooked up after “check hovered location” for touch. I mentioned that I couldn’t seem to get it to fire without that hooked up. The reason is that BP_ability won’t work if it’s been released and the “pressed” path in abilitybase never went anywhere. So if that remains unhooked, you need to change BP_ ability per the image to account for if touch is being used. It’s just an additional bool condition and changing that branch from false to true. Then it’ll work regardless of your input method.
So currently I have the clicks working entirely as intended. The only outstanding issues is “Find Close Valid Overlapping Grid Index” returning false sometimes. It returns false a lot…like…50% of the time sometimes. I’m not sure why. There is only one way for it to return false. It’s on this “found height level” for some reason it must be returning an invalid one. Which may come back to you, because I’m not entirely sure on the intricacies of how that works. I’ll experiment, but if you can think of a reason why that might be frequently giving me a bad value that might be helpful.
A quick print right before the first branch in the attach image shows that the “Found height level” is being returned as -1 sometimes… sometimes 0 as it should be. and a print of the float above solves that issues. For some reason, the height level is being calculated as 0 - 0.5 which gives us -0.5 which rounds to 0, but sometimes the float is -0.500001 which rounds to -1 causing it to fail.
This seems to be a bug with the “corrected Z vector” node as it sometimes outputs it as -0.00001, I’m attaching a log of the full math operation. I would guess, that the correct Z vector does not have to be correct to so many decimal places, and the slight inconsistency of that function is causing the issue. All of the units and tiles in the game are set to the same Z value. I’ve temporarily solved this by truncating the value. I’m not sure if any decimal precision is required at all, I’ll wait for your feedback on that.
With this fix, it looks like ability touch controls more or less work as intended, however, there are still camera jumping issues. Sometimes while using an ability just clicking on a tile will cause the camera to jump I’ve got no idea how that is even being called in there, so I’m hoping you might have some suggestions there.
Just took a built version for a test drive and it’s about 90% better. There were still a couple of times it seemed to take more than two taps, but I think that was because the camera jumped just a tiny amount. I think it’s sometimes reading taps as pans…or something. I might accept that on the phone as the human finger isn’t very precise, but it jumped around in pie too, using the mouse.
One thing I do notice is that clicking on any of the gun abilities makes the camera jump. Like just to activate them. The camera jumps to a specific location, but i can’t see any code in the activate section of bp_ability or abilitybase that would set the camera position. All my gun abilities are duplicates of BP_laser with the variables effects, etc changed. if I click sprint, that’s fine, it overlays the squares, but if i click snapshot or aimed shot the camera jumps to a specific position (different for each ability). The same thing happens when clicking the shoot ability for the uzi. Is there some code somewhere related to BP_laser that resets the camera position when you click it?
All aboard the train to strangeville!
I stuck a print statement in the pan function on the gridcamera to print the new location it sets the camera too. First thing I noticed? When I click an ability in the ability box, somehow, pan get’s called because it prints a location when the camera snaps to a slightly new location. I’m going to have to dig through this, but I don’t recall seeing anything wired up like that. Also under the current set up, if I select any ability (including sprint) and attempt to pan the display using the mouse, it jumps 100% of the time. Just touch the screen and start to pan and the camera always jumps once before panning. After it jumps once, it pans normally. So current issues:
why is pan being called when simply clicking on an ability? - SOLVED: Any click on an ability to activate it is registering in the touch controls as “moved”. Very interesting. Greater mystery! Clicking ANYTHING on the UI makes input touch - moved fire. Clicking portraits in the bar at the top or clicking the arrows i added for the height levels also makes it go.
Why is the location jumping when you start to pan the first time, I’m guessing something in that math function that is wired up for defining the pan is off.
Getting closer though!
Okay, so for some reason, when you click anything on the UMG, moved then released fires. I have no idea why either of those are firing.
Ah-ha! I need to override On touch move and on touch end (already did start) in the UI to prevent those from firing.
I have a line of attack. When you first start to pan the camera, the touch points are the same by default. in the event graph the if they are the same from the beginning, there is no opportunity to set the camera location from the start. So the first time it goes to pan the camera location is still set to the old location. And the reason for that is because the reset for the pan never runs. When you stop moving, the moving execution path stops, and the branch which checks if you have a finger pressed, never gets called 1 time after you stop moving. I put in a print statement, and it never runs. So it needs to be run another way.
Success! I just had to run the cast to the grid camera and call to “touch controls” as part of “input touch - released” When it calls it under released, since there is no finger touching the phone that part of the touch controls can run. And no more camera jumping! Time for a shipping build.
Touch controls appear to be in working order. Main points:
the bTouch needs be run throughout the execution and passed to all down stream functions and blueprints.
You need to rewire some branches as I’ve pointed out in a few screen shots
you need to override all the touch events and return “handled” in your UI blueprint
in BP_abilitybase after check hovered location you do NOT need to connect that up to check ongoing actions if you rewire the released/touch check per my screenshot
Tick can be disabled by switching on string and getting the platform. If a mobile platform is returned, then just do nothing, otherwise leave it hooked up. This leaves your functionality for a multiplatform build.
You need to truncate that one float
There is one remaining issue in that once in a while on the second tap instead of firing it disables the hover…but then the next tap fires. Bit strange. I’m going to debug that later. I’ve accomplished a lot today. The only real outstanding issue i guess I have right now is that mesh I sent you which is causing the strange results for multilevel stuff.
One additional issue I noticed was with the “is hovered” check on “HoverAttempt”. For some reason when the touch controls are used, this will randomly return true while attempt to click on units or movement squares. This causes the next branch (since a not is used) to go false and then not properly display the hover icon (target/movement selection). I guess this is checking to make sure the mouse or pointer isn’t over the UI, but since I have all clicks “Handled” in the UI now, I think this check is unnecessary. I can’t see any ill effects from removing that check and just having that branch always return “true” so that it can properly display the hover effect for abilities. As an alternative, since “bTouch” is available there you could create an “OR” condition to maintain any needed mouse functionality .
First thank you for your awesome work on this toolkit and for your video support. I’m not english but I do my best to understand everything.
But maybe can you help me to setup things like I want or redirect me vers video or forum’sanswer if it was already explained.
I would like to know how can I setup some blueprint for not using initiative for decide what pawn is moving. Instead I want a Chess like systeme where both player decide which pawn to move 1 pawn by turn.
Alright, it’s working! Satisfaction levels are high. Addressing your comments :
Could you be wrong? I may be misinterpreting, but you say “Rather than removing the units after initiative is sorted…” even though that graph pic showed everything was before that. Notice how all my added added nodes were executed before the “Sort Actors in Initiative Order” node, not after.
In any case, the solution just needed some tweaks in BP knowledge (1) and logic (2). I didn’t know that when I made a Getter function in BPI_Initiative, I would need to go to my BP_Unit and plug into this new function my boolean variable (1). So it’s a two-part operation, Neato. In regards to the logic, instead of using a temporal array for the loop and messing with the Remove pin, I simply created the temporal array in the loop and used it for the final “Sort Actors in Initiative Order” input pin (2).
Results are as follow (green chart has legacy code; white one has the new additions):
The way things are: if I create child blueprints, they seem to be the melee type but they can hit, move, receive hits and are an existing element in the grid. Their attributes seem to be able to be adjusted correctly too. They do not have a health bar, but I suppose this is because we have to manually add it, like the BP_Unit_Anim_Adv guys have. However, as soon as I create a static mesh component inside, they stop working. They get a turn, but cannot move, attack, or be targeted by enemy fire. For testing, I simply created a child BP and added the toolkit’s SM_Tree_01 mesh.
The regular BP_Unit blueprint cannot move, attack or be attacked either, but with this one other units can walk right through or into its tile too. It just gets its turn, but isnt able to use it for anything. Not that I would use BP_Unit for anything though, since their children is what we’d be using.
I created a default new project and started from scratch in the default hexagonal map. Both regular BP_Unit and its child seem to be working fine. However, as soon as I attach a static mesh (SM_Tree_01 for example), they lose their ability to be fired at. Is this behavior okay?
Gotta try debug why the heck my project doesn’t have this very same behaviour with BP_units and childs, since I haven’t modified any of those blueprints. I bet it’s something in the GameMode/PlayerController/TurnManager. I’ll see what I can dig up. I do get these errors though so maybe that will point me to where the problem is:
Thanks for your explanation! I’m slowly getting the hang of this and being able to tackle more tasks by reading more and practicing. It’s all very mentally rewarding.
@MarsOdysseus hi Mars! I assume you only want the initiative element changed, or are you actually going for a full-on chess game with the different pieces’ behaviour like queens, bishops, etc? Because if the latter is the case, if you haven’t already I suggest you search for ‘chess’ in this thread’s search bar. Some useful info pops up instantly regarding that!
Hey everyone, quick update: I’m planning on handing in my PhD thesis today, so I’ll be back and answering all your questions tomorrow. I know my support has been lacking lately, but from tomorrow on it should be a lot better. Thanks for the patience.
Just a bug report: That fix you gave me for the ladder works fine in terms of functionality, but I noticed that the spline doesn’t display correctly using move_ex unless the ladder is rotated in it’s default orientation. If I just pull it out of the content browser and try to go up it, the spline displays nicely as intended. if I rotate the ladder 90 degrees to fit the environment it’s back to the spline cutting through the wall. I’ll dig around and see if I can figure out what’s throwing that off, but i don’t see any specific spline code in the ladder itself.