logo
Main

Forums

Downloads

Unreal-Netiquette

Donate for Oldunreal:
Donate

borderline

Links to our wiki:
Wiki

Walkthrough

Links

Tutorials

Unreal Reference

Usermaps

borderline

Contact us:
Submit News
Page Index Toggle Pages: [1] 2  Send TopicPrint
Hot Topic (More than 10 Replies) Jamming doors (Read 1104 times)
Player701
New Member
*
Offline


Oldunreal member

Posts: 4
Location: Russia
Joined: Jan 31st, 2017
Gender: Male
Jamming doors
Jan 31st, 2017 at 9:48pm
Print Post  
Hello there. Just registered here to report an issue. I have no idea if it has been reported before, but I couldn't find anything using forum search or Google.

The bug in question occurs in the latest version of the 227 patch available for download on this site (227i).

Synopsis: If there is a door in the level which opens when you approach it and closes when you go away, you can make it "jam" (stay open indefinitely) by saving and reloading the game when it's open. I believe such doors are called "TriggerControl".

This is easily reproducible on every set of double sliding doors in the first level of RTNP (DuskFalls.unr), the first such doors are very close to the starting point.

Hope this can be fixed if there ever will be a new release.

Thanks in advance,
Player701
  
Back to top
 
IP Logged
 
Player701
New Member
*
Offline


Oldunreal member

Posts: 4
Location: Russia
Joined: Jan 31st, 2017
Gender: Male
Re: Jamming doors
Reply #1 - Jan 31st, 2017 at 10:07pm
Print Post  
Hyper wrote on Jan 31st, 2017 at 9:57pm:
As long as the door does not jam in the closed position, blocking the map, is this a problem?

Doors don't get stuck in the closed position, so the level doesn't become unbeatable. However, their behavior when the game is loaded from a save is unexpected. Thus, I consider it a bug. I can probably understand if it's difficult enough to fix, since it isn't a show-stopper. But it can be annoying because on maps like DuskFalls it can manifest itself very often (I like to quicksave and quickload a lot to try out various tricks on the enemies  Smiley).

upd: Eh? The post I was replying to seems to have been deleted? Whatever.
  
Back to top
 
IP Logged
 
Jaden Darchon VII
Ex Member


Re: Jamming doors
Reply #2 - Jan 31st, 2017 at 10:47pm
Print Post  
It sounds like you've stumbled upon a useful piece of research for the Blocking Requirements Lab! Good work!
  
Back to top
 
IP Logged
 
dustinechoes849
Senior Member
****
Offline


General Protection Fault!

Posts: 323
Location: /home/dustinechoes849/unreal/
Joined: Feb 28th, 2015
Gender: Male
Re: Jamming doors
Reply #3 - Feb 1st, 2017 at 2:07am
Print Post  
Quote:
It sounds like you've stumbled upon a useful piece of research for the Blocking Requirements Lab! Good work!

Better go put that on the wiki! Cheesy
  


don't bother trying to message me over AIM, I haven't used that in years lol
I have a Discord, the number thingie is #6413
Back to top
IP Logged
 
Masterkent
Developer Team
Offline



Posts: 1109
Location: Russia
Joined: Apr 5th, 2013
Gender: Male
Re: Jamming doors
Reply #4 - Feb 1st, 2017 at 9:53am
Print Post  
Player701 wrote on Jan 31st, 2017 at 9:48pm:
The bug in question occurs in the latest version of the 227 patch available for download on this site (227i).

And it's not fixed in 227j yet. The reason of such a behavior is that loading a saved game does not preserve the information about previous touches between actors. The engine assumes that the player never touched the trigger (even if their collision cylinders overlap), and when the player goes away from the trigger, the trigger's UnTouch is not called, and the corresponding movers (doors) are not untriggered via a call to UnTrigger. Those doors won't close while the number of calls to Trigger is greater than the number of calls to UnTrigger (such calls are counted because several pawns can hold the doors open, and the doors should be closed only when all of those pawns leave the trigger area), so even further pairwise triggering and untriggering won't result in door closing.
  
Back to top
 
IP Logged
 
Smirftsch
Forum Administrator
*****
Offline



Posts: 7739
Location: at home
Joined: Apr 30th, 1998
Gender: Male
Re: Jamming doors
Reply #5 - Jun 10th, 2018 at 8:50am
Print Post  
After some checking this is not so easy to resolve completely.
One thing I could do is to plain add all actors (pawns/playerpawns) which collisions cylinder overlap to the touchlist again when loading a map, assuming they must have touched each other.
This will at least resolve the issue with jammed doors, but I suppose this will not be sufficient for any situation.
  

Sometimes you have to lose a fight to win the war.
Back to top
WWWICQ  
IP Logged
 
Masterkent
Developer Team
Offline



Posts: 1109
Location: Russia
Joined: Apr 5th, 2013
Gender: Male
Re: Jamming doors
Reply #6 - Jun 10th, 2018 at 9:28am
Print Post  
Why is Actor.RealTouching declared as transient?

Code
Select All
var transient	const	array<Actor> RealTouching; // The actual touchlist in 227, can be accessed with TouchingActors iterator. 

  
Back to top
 
IP Logged
 
Smirftsch
Forum Administrator
*****
Offline



Posts: 7739
Location: at home
Joined: Apr 30th, 1998
Gender: Male
Re: Jamming doors
Reply #7 - Jun 10th, 2018 at 9:39am
Print Post  
the complete touchlist is emptied on load anyway, so it makes no sense to store it. Realtouch didn't change that. I assume they made it that way f.e. in case the same map is reloaded to avoid conflicts. Doubt changing this behavior will make any good at all.
  

Sometimes you have to lose a fight to win the war.
Back to top
WWWICQ  
IP Logged
 
Masterkent
Developer Team
Offline



Posts: 1109
Location: Russia
Joined: Apr 5th, 2013
Gender: Male
Re: Jamming doors
Reply #8 - Jun 10th, 2018 at 9:49am
Print Post  
Smirftsch wrote on Jun 10th, 2018 at 9:39am:
the complete touchlist is emptied on load anyway, so it makes no sense to store it.

Removing the transient keyword in that declaration makes my conformance test successfully passed (the touched actor can be found via the TouchingActors iterator and UnTouch is called when the actors become non-overlapping), and the behavior of doors in the game seemed to become normal too (I've checked this on DuskFalls.unr).
  
Back to top
 
IP Logged
 
Smirftsch
Forum Administrator
*****
Offline



Posts: 7739
Location: at home
Joined: Apr 30th, 1998
Gender: Male
Re: Jamming doors
Reply #9 - Jun 11th, 2018 at 5:51am
Print Post  
that's surprising me, the complete touchlist is emptied when !Info->bBegunPlay on load, meaning directly after "Bringing %s up for play (%i)..." message. I must have missed something then. Will try this here.
  

Sometimes you have to lose a fight to win the war.
Back to top
WWWICQ  
IP Logged
 
Smirftsch
Forum Administrator
*****
Offline



Posts: 7739
Location: at home
Joined: Apr 30th, 1998
Gender: Male
Re: Jamming doors
Reply #10 - Jun 13th, 2018 at 5:13am
Print Post  
I didn't find the time to check any further but it seems to do perfectly. Right now I assume that this data is inserted in one of the later steps then. Still, this most likely means that we have not to expect any issues here and even better, can't think of a better solution than keeping the previous state for triggers also.

Guess we can close this for now (will check again some time what I missed but thats of no importance here).
  

Sometimes you have to lose a fight to win the war.
Back to top
WWWICQ  
IP Logged
 
Masterkent
Developer Team
Offline



Posts: 1109
Location: Russia
Joined: Apr 5th, 2013
Gender: Male
Re: Jamming doors
Reply #11 - Jun 13th, 2018 at 2:06pm
Print Post  
Initially I thought that RealTouching is only a view of some native data structure (possibly a linked list) that is used internally for processing UnTouch events. Then we'd have two options:

1) When saving a game, serialize that native data structure directly; when the game is loaded, deserialize the native data structure and update its view (RealTouching).

2) When saving a game, use the regular UScript-level serialization of RealTouching; when the game is loaded, recreate the native data structure based on the contents of deserialized RealTouching.

But if RealTouching is the only data structure that holds the set of touching actors, then we can simply rely on the UScript-level serialization of this property (simplified version of approach #2). The only little issue is that references to actors of transient classes become None when the game is loaded, and such dead references persist until the map change. I think that RealTouching needs some cleanup right before calling PostLoadGame - all items of RealTouching that are equal to none should be removed from the array. Although transient actor classes should appear quite rarely, handling such unordinary cases doesn't look difficult, so, I guess, it's worth fixing. I updated my conformance test, now it includes checks for none.
  
Back to top
 
IP Logged
 
Smirftsch
Forum Administrator
*****
Offline



Posts: 7739
Location: at home
Joined: Apr 30th, 1998
Gender: Male
Re: Jamming doors
Reply #12 - Jun 16th, 2018 at 11:02am
Print Post  
I added a purge for these, but it's a bit odd, your test still always shows 1 none reference, although I can't see how this should be the case. But I am already sort of tired, so perhaps I see it later.
  

Sometimes you have to lose a fight to win the war.
Back to top
WWWICQ  
IP Logged
 
Masterkent
Developer Team
Offline



Posts: 1109
Location: Russia
Joined: Apr 5th, 2013
Gender: Male
Re: Jamming doors
Reply #13 - Jun 16th, 2018 at 11:43am
Print Post  
Smirftsch wrote on Jun 16th, 2018 at 11:02am:
I added a purge for these, but it's a bit odd, your test still always shows 1 none reference

Sounds like I made a good test :-) Can you show the code for removing none-refs?
  
Back to top
 
IP Logged
 
Smirftsch
Forum Administrator
*****
Offline



Posts: 7739
Location: at home
Joined: Apr 30th, 1998
Gender: Male
Re: Jamming doors
Reply #14 - Jun 16th, 2018 at 11:48am
Print Post  
Code (C++)
Select All
 for( INT i=0; i<GLevel->Actors.Num(); i++ )
        if( GLevel->Actors(i))
        {
            AActor* Actor = GLevel->Actors(i);
            if (Actor->RealTouching.Num())
            {
                INT NumRefs=Actor->RealTouching.Num();
                for (INT j=0; j<Actor->RealTouching.Num();j++)
                    if(!Actor->RealTouching(j) || Actor->RealTouching(j)->bDeleteMe)
                        Actor->RealTouching.Remove(j);

                Actor->RealTouching.Shrink();
                debugf( NAME_Log,TEXT("Purged %i invalid RealTouching references from %s"),NumRefs - Actor->RealTouching.Num(), Actor->GetName());
            }
        }

 

  

Sometimes you have to lose a fight to win the war.
Back to top
WWWICQ  
IP Logged
 
Page Index Toggle Pages: [1] 2 
Send TopicPrint
Bookmarks: del.icio.us Digg Facebook Google Google+ Linked in reddit StumbleUpon Twitter Yahoo