Minor things worth mentioning

A refuge for those migrating from the fallen DXEditing.com and a place for general discussion relating to Deus Ex editing (coding, mapping, etc).
User avatar
bjorn98009_91
Silhouette
Posts: 688
Joined: Thu May 08, 2008 8:17 am
Location: Hufvudstaden, Sweden
Contact:

Re: Minor things worth mentioning

Post by bjorn98009_91 »

Well for the TraceTexture thing I was thinking of a more global solution for all players and not just Revision only. I guess one could apply the same method as you described and collect everything in EngineFixes.dll or something. Since you are well versed in native packages, perhaps you could create such a package and collect various native fixes in there.

I'll change that resolution thing in our DeusEx.u scenarios. Thanks.
Producer and Quality Assurance Manager for Deus Ex: Revision.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

Okay code done, seems to work flawless. Things which should be checked if how the PlayFootStep() stuff reacts on movers, but i guess their Brush is part of the BSP geometry anyway, so this might not be an issue (at least it seemed to work right for elevators).
Next step would be to dig up a nice system for when you are running over a decoration, let's say a wooden table. I guess i'll probably add a property like var() Sound FootStepSound; for my HXDecorations, but i'm not quite sure how exactly to figure out whether i'm on a decoration or over bsp geometry. Maybe just using the actor which is not Pawn/PlayerPawn himself would work fine, but i'm not sure nice this is if are walking over a datacube for example. Dunno.

Anyway for GetWallMaterial() and GetFloorMaterial() i recommend just calling it on demand (is there for GetFloorMaterial() even a demand?), not on each PlayerTick() which is pointless and also wastes bandwidth, since the WallMaterial and FloorMatrial is replicated to the server which is point less anyway. So i recommend not using these variables anymore. For the footsteps the way better approach is like the ScriptedPawn does:

Code: Select all

	local name mat;
	// [..]
	mat = GetFloorMaterial();
	// [..]
		switch(mat)
	// [..]
Another cool thing for footstep sounds is to vary their volume slightly:

Code: Select all

	// HX: slightly vary playback volume
	randomPlaybackVolumeMultiplier = 0.9 + 0.2 * FRand();
	PlaySound(stepSound, SLOT_Interact, volume*randomPlaybackVolumeMultiplier, , range, pitch);
However i recommand just changing the parameter of PlaySound(), not volume directly as this is also used for the AISendEvent() unless you want that. However you should just change the first for network play, since the soundvolume for the local player is different then on the server so the pawns suddenly reacting to a sound which was more silent but on the server loader is a bit weired.

However the code for the fixed TraceTexture()

Code: Select all

// Find the FBspNode for Point.
INT FindNode( UModel* Model, INT iPlane, FVector Point )
{
	guard(FindNode);
	check(Model);

	INT Index = iPlane;

	while ( Index != INDEX_NONE )
	{
		FBspNode& Node = Model->Nodes(Index);

		if ( Node.iSurf != INDEX_NONE )
		{
			FBspSurf& Surf = Model->Surfs(Node.iSurf);

			//debugf( TEXT("FindNode: Testing: FBspNode(%i) with FBspSurf(%i).Texture %s."), Index, Node.iSurf, Surf.Texture ? Surf.Texture->GetName() : TEXT("None") );

			UBOOL Valid = 1;
			FLOAT OldPlaneDot = 0.0f;

			// Check for NumVertices == 0
			if ( Node.NumVertices )
			{
				for ( INT i = 0; i < Node.NumVertices && Valid; i++ )
				{
					// Get Points.
					FVector& A = Model->Points(Model->Verts(Node.iVertPool + i).pVertex);
					FVector& B = Model->Points(Model->Verts(Node.iVertPool + ((i+1) % Node.NumVertices)).pVertex);

					// Now build a plane.
					FPlane Plane( A, (B-A)^FVector( Node.Plane.X, Node.Plane.Y, Node.Plane.Z ) );

					// Now check Point against this plane.
					FLOAT PlaneDot = Plane.PlaneDot( Point );
					
						// Sign changed, check next FBspNode.
					if ( OldPlaneDot * PlaneDot < 0.0f )
					{
						Valid = 0;
					}
					// Sign stayed the same, everything fine.
					else
					{
						OldPlaneDot = PlaneDot;
					}
				}

				// Passed check.
				if ( Valid )
				{
					//debugf( TEXT("FindNode: Passed.") );
					return Index;
				}
				//else
				//{
					//debugf( TEXT("FindNode: Failed.") );					
				//}
			}
			//else
			//{
				//debugf( TEXT("FindNode: Skipping: Node.NumVertices == 0.") );
			//}
		}
		//else
		//{
			//debugf( TEXT("FindNode: Skipping: Node.iSurf == INDEX_NONE.") );
		//}

		Index = Node.iPlane;
	}
	
	return INDEX_NONE;
	unguard;
}

//native(3220) final iterator function TraceTextureHan( class<Actor> BaseClass, out actor Actor, out name TexName, out name TexGroup, out int Flags, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent )
void AHXPlayerPawn::execTraceTextureHan(FFrame& Stack, RESULT_DECL)
{
	guard(AHXPlayerPawn::execTraceTextureHan);
	
	P_GET_OBJECT( UClass, BaseClass );
	P_GET_OBJECT_REF( AActor, Actor );
	P_GET_NAME_REF( TexName );
	P_GET_NAME_REF( TexGroup );
	P_GET_INT_REF( Flags );
	P_GET_VECTOR_REF( HitLoc );
	P_GET_VECTOR_REF( HitNorm );
	P_GET_VECTOR( End );
	P_GET_VECTOR_OPTX( Start, Location );
	P_GET_VECTOR_OPTX( Extent, FVector( 0.0f, 0.0f, 0.0f ) );
	P_FINISH;

	FMemMark MemMark( GMem );

	if ( !BaseClass )
		BaseClass = AActor::StaticClass();

	FCheckResult* Res = XLevel->MultiLineCheck( GMem, End, Start, Extent, 1, Level, 0 );

	PRE_ITERATOR

		if ( Res )
		{
			*Actor		= Res->Actor;
			*HitLoc		= Res->Location;
			*HitNorm	= Res->Normal;

			*TexName	= NAME_None;
			*TexGroup	= NAME_None;
			*Flags		= 0;

			if ( Res->Actor == Level )
			{
				Res->Item = FindNode( XLevel->Model, Res->Item, Res->Location );

				if ( Res->Item != INDEX_NONE )
				{
					FBspNode& Node = XLevel->Model->Nodes(Res->Item);

					if ( Node.iSurf != INDEX_NONE )
					{
						FBspSurf& Surf = XLevel->Model->Surfs(Node.iSurf);

						if ( Surf.Texture )
						{
							*TexName	= Surf.Texture->GetFName();

							if ( Surf.Texture->GetOuter() )
							{
								*TexGroup	= Surf.Texture->GetOuter()->GetFName();
							}
						}

						*Flags = Surf.PolyFlags;
					}
				}
			}

			Res = (FCheckResult *)Res->Next;
		}
		else
		{
			Stack.Code = &Stack.Node->Script( wEndOffset + 1 );

			*Actor = NULL;
			break;
		}

	POST_ITERATOR

	MemMark.Pop();

	unguardexec;
}
As for changes in GetFloorMaterial() i recommend to change it this way, since the Tex* parameters are just set if the trace hit the Level. The second one is some conveniant testing exec function is used:

Code: Select all

function name GetFloorMaterial()
{
	local vector EndTrace, HitLocation, HitNormal;
	local actor TraceTarget;
	local int texFlags;
	local name texName, texGroup;

	// trace down to our feet
	EndTrace = Location - CollisionHeight * 2 * vect(0,0,1);

	foreach TraceTextureHan(class'Actor', TraceTarget, TexName, TexGroup, TexFlags, HitLocation, HitNormal, EndTrace)
	{
		if ( TraceTarget == Level )
			break;
	}

	return TexGroup;
}

exec function TT2()
{
	local vector EndTrace, HitLocation, HitNormal;
	local actor TraceTarget;
	local int texFlags;
	local name texName, texGroup;

	// trace down to our feet
	EndTrace = Location - CollisionHeight * 3 * vect(0,0,1);

	Log( "----[TraceTextureHan]-----------------------------------------------", 'TraceTexture' );

	foreach TraceTextureHan(class'Actor', TraceTarget, TexName, TexGroup, TexFlags, HitLocation, HitNormal, EndTrace)
	{
		Log( "Target =" @ TraceTarget @",TexName ="@ TexName @"TexGroup ="@TexGroup@"TexFlags ="@TexFlags, 'TraceTexture' );

		if ( (TraceTarget == Level) || TraceTarget.IsA('Mover') )
		{
			FloorMaterial = texGroup;
			PlayFootStep();
			Log( "======================================================================", 'TraceTexture' );
		}
		else
			Log( "----------------------------------------------------------------------", 'TraceTexture' );
	}
}
I guess i could do a native package, and i could throw in some other small usefull native and non native stuff in, since i have a nice collection of these things in my hx source. However i'll release the source (which might limit the things i put in, sorry for that, but some parts could easily be abused for cheating once the source is available, sorry about that), and i recommend every mod author to take the code and put it into their own projects, since i might update this package frequently, but i will try to maintain backwards compatiblity. However for netplay this sucks, and one should really put this stuff in their own mods. :)

Another suggestion for revision: Add the static keyword to ExtensionObject.StringToName() since there is absolutly no reason around to rely on an instance of an XObj for doing StringToName() conversations. Same for CarriageReturn().
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
User avatar
bjorn98009_91
Silhouette
Posts: 688
Joined: Thu May 08, 2008 8:17 am
Location: Hufvudstaden, Sweden
Contact:

Re: Minor things worth mentioning

Post by bjorn98009_91 »

Cheating in MP? Deus Ex is a single player game first and foremost, and I think that should be prioritized while developing fixes, there is like 30 guys still playing MP. And if they wanted to cheat someone would then have to do some coding based on your stuff, it's not an instant cheat to just use your fixed .dll.

Not sure why people are obsessed with MP compatibility, it's not like this is UT or Unreal. I'd say more fixes to the people since 99.9% will only play this game in SP mode.

btw, can't you check the Base value of the player to find out what he is standing on? Or does that only work for movers?
Another suggestion for revision: Add the static keyword to ExtensionObject.StringToName() since there is absolutly no reason around to rely on an instance of an XObj for doing StringToName() conversations. Same for CarriageReturn().
Well, Revision is a map mod really. We do have our own DeusEx.u versions cause we don't want the bugs from vanilla DeusEx.u and we do want some other stuff like UI scaling that unifiedDX is bringing. But that's really it, no modifications of base packages or anything like that (except for DeusEx.u). This would require editing Extension.u, wouldn't it?
Producer and Quality Assurance Manager for Deus Ex: Revision.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

Okay, didn't know you just want to change the DeusEx.u, these were just two things i found rather anoying during delopment.

Gnah, right: Base. I thought about base related stuff but totally forget about that property. But i don't know if this is set for players in a right how. However I guess the tracetexture in GetGroundMaterial() (as it just hooks a normal MultiLineCheck()) could be used when the base stuff won't work. But what i'm more concerned about is like that you are standing on a small object, that sound of the underlying surface would be better to play. You cant get your both feets on a Datacube.

As for what i don't want to give away is like the GameEngine's Browse(), Tick(), LoadMap() functions with lot of samples in hx how to change function modifiers, defaultproperties, etc, so this won't be hard to exploit and won't require much knowledge about programming. I needed them so i have a save place to save the game, do cleanup on non actor objects and change/revert the DeusExMover classes. And those function won't be off much use for most mod authors anyway. I might give source of them away when someone has a really good reason for it, but i don't want to have them public available, because they could really easily be exploited.

Anyway here is my first CoolBits release, it probably needs bug testing as i just ripped out parts of hx and modified/generalized them so they have might ended up broken.

http://coding.hanfling.de/CoolBits-20140919.zip
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
User avatar
bjorn98009_91
Silhouette
Posts: 688
Joined: Thu May 08, 2008 8:17 am
Location: Hufvudstaden, Sweden
Contact:

Re: Minor things worth mentioning

Post by bjorn98009_91 »

Well, I am considering doing some sort of patch for DX, joining DeusEx 2.0 to finish that up (by taking fixes from other projects, with permission) and then fix other packages. OldUnreal has a lot of fixes. Granted, most of them are native code fixes, but just one or two might be a pure unrealscript fix (like that GetFloorMaterial() bug). I also have plans to wrap up some textures NV didn't do.

So the things you want to omit from the package are not fixes, but instead API for modders?
Producer and Quality Assurance Manager for Deus Ex: Revision.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

No, the api is just in the GameEngine class. And for most task it's enough to put the own code at the start or end of that functions and call the parents function and you rarely need the source of those orignal deus ex functions. There are really few cases special cases when you need this.. like when you save a game in multiplayer. And again, when someone realls needs this i'll probably give it away, like i did for the ExportTravel() or Pre/PostRender() and TraceTexture(9 functions. Can you name me three deusex mods which uses an own gamengine class?
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
User avatar
bjorn98009_91
Silhouette
Posts: 688
Joined: Thu May 08, 2008 8:17 am
Location: Hufvudstaden, Sweden
Contact:

Re: Minor things worth mentioning

Post by bjorn98009_91 »

Yeah, so it's not like fixing the footstep sound. These are just things that could be convenient and useful for certain modders.
Producer and Quality Assurance Manager for Deus Ex: Revision.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

Found first bug, it misses the Actor Other parameter. Right version:

Code: Select all

native(4006) final static iterator function TraceTextureCoolBits( Actor Other, class<Actor> BaseClass, out actor Actor, out name TexName, out name TexGroup, out int Flags, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent );
So these certain modders can ask for code. I don't see the problem.
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
User avatar
bjorn98009_91
Silhouette
Posts: 688
Joined: Thu May 08, 2008 8:17 am
Location: Hufvudstaden, Sweden
Contact:

Re: Minor things worth mentioning

Post by bjorn98009_91 »

Yup, no problem. I think we are getting worked up over nothing, I'm totally fine with you leaving out such code.
Producer and Quality Assurance Manager for Deus Ex: Revision.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

bjorn98009_91 wrote:Yup, no problem. I think we are getting worked up over nothing
Right :)

Epic suggested for making paletized textures their tool bright. They state that this was even used for most textures in ut200x. So it might be worth a try.
http://udn.epicgames.com/Two/UnrealText ... 20Textures
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

If you need an extra timer in Pawn subclasses, you can use the event SpeechTimer(). Just set the variable SpeechTime, and after that time is elapsed SpeechTimer() is called.
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

AActor has these two cute virtual functions. They could be used for e.g. saving the old value of a variable and restoring it afterwards. This could be used for actors which receive location/rotation updates which you don't want. Like if you simulate floating clientside or adjust the position of a carried decoration clientside to make it less laggy (things i'm still planing to do/fix).

Code: Select all

virtual void PreNetReceive();
virtual void PostNetReceive();
Maybe exposing them as UC events might also be nice.

/edit:
Seems like these are used for much stuff and variables are saved and compared to their previous values. So i guess it's best to restore variables after the Super::PostNetReceive() call, however it might trigger strange behaviour for location, rotation, etc. since the update some physics variables, etc.
Last edited by Hanfling on Wed Sep 24, 2014 11:57 pm, edited 1 time in total.
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

Overriding *all* replication settings of base classes is probably possible with native classes, since (AActor.h)

Code: Select all

	virtual INT* GetOptimizedRepList( BYTE* InDefault, FPropertyRetirement* Retire, INT* Ptr, UPackageMap* Map );
	virtual UBOOL ShouldDoScriptReplication() {return 1;}
1. ShouldDoScriptReplication() { return 0; }; should disable all UC script replication
2. GetOptimizedRepList() seems to called parents GetOptimizedRepList(), and does the replication stuff, but probably you can replicate variables of a baseclass (unlike uc).
But i have to find out how to write these c++ replication statements. :/

/edit:
UT2004 script source. Onslaught.cpp FUCK YEAH! It has the code for native replication in it (or at least for variables). Dunno maybe i have to find out how to do this for functions (or functions are just replicated in uc?). However this would only apply to player classes, if you want to trash all previous stuff, but i like the idea of replicating the bIsSpeaking variable to clients as this would make the lipsynch code a lot nicer (no copying this from another variable, etc.) FUCK IT. what have i done the last two years.. now i know how to do things fucking awesome. XD

/edit2:
I guess the nativereplication keyword *does not say* do native replication, it just says do no uc replication.

Anyway... there is a lot of code i can now cleanup this way, and remove countless copied variables which get replicated. gnah!

/edit3:
No you can't replicate variables of a super class. The uc replication setting is needed to mark them CPF_Net so that they get an RepIndex and stuff and you can do replication stuff. This could probably be done at runtime, if you know how, tell me!
Last edited by Hanfling on Sat Sep 27, 2014 3:54 pm, edited 1 time in total.
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

Despite it seems to be disabled in UT, event WalkTexture() is actually called in deusex. But it has the same bug as TraceTexture() has, so i guess it's not of much use either. However i'm curies if this actually works right in Wheel of Time. Legend hooked the code for WalkTexture() in, so i guess it might be broken in WoT too.
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
Hanfling
MJ12
Posts: 406
Joined: Sun Oct 04, 2009 6:54 pm

Re: Minor things worth mentioning

Post by Hanfling »

Blend anim replication. However this code just works fine for head turning, not for speaking and eye blinking. (But head turning was the only part i was interessted in).

Code: Select all

// Out of ut2004scripts3369\Onslaught\Src\Onslaught.cpp
static inline UBOOL NEQ(BITFIELD A,BITFIELD B,UPackageMap* Map) {return A!=B;}
static inline UBOOL NEQ(BYTE A,BYTE B,UPackageMap* Map) {return A!=B;}
static inline UBOOL NEQ(INT A,INT B,UPackageMap* Map) {return A!=B;}
static inline UBOOL NEQ(FLOAT& A,FLOAT& B,UPackageMap* Map) {return *(INT*)&A!=*(INT*)&B;}
static inline UBOOL NEQ(FVector& A,FVector& B,UPackageMap* Map) {return ((INT*)&A)[0]!=((INT*)&B)[0] || ((INT*)&A)[1]!=((INT*)&B)[1] || ((INT*)&A)[2]!=((INT*)&B)[2];}
static inline UBOOL NEQ(FRotator& A,FRotator& B,UPackageMap* Map) {return A.Pitch!=B.Pitch || A.Yaw!=B.Yaw || A.Roll!=B.Roll;}
//static inline UBOOL NEQ(UObject* A,UObject* B,UPackageMap* Map) {if( Map->CanSerializeObject(A) )return A!=B; Channel->bActorMustStayDirty = true; /* debugf(TEXT("%s Must stay dirty because of %s"),Channel->Actor->GetName(),A->GetName()); */ return (B!=NULL);}
static inline UBOOL NEQ(FName& A,FName B,UPackageMap* Map) {return *(INT*)&A!=*(INT*)&B;}
static inline UBOOL NEQ(FColor& A,FColor& B,UPackageMap* Map) {return *(INT*)&A!=*(INT*)&B;}
static inline UBOOL NEQ(FPlane& A,FPlane& B,UPackageMap* Map) {return ((INT*)&A)[0]!=((INT*)&B)[0] || ((INT*)&A)[1]!=((INT*)&B)[1] || ((INT*)&A)[2]!=((INT*)&B)[2] || ((INT*)&A)[3]!=((INT*)&B)[3]; }
static inline UBOOL NEQ(const FString& A,const FString& B,UPackageMap* Map) {return A!=B;}

#define DOREP(c,v) \
   if( NEQ(v,((A##c*)Recent)->v,Map) ) \
   { \
      static UProperty* sp##v = FindObjectChecked<UProperty>(A##c::StaticClass(),TEXT(#v)); \
      *Ptr++ = sp##v->RepIndex; \
   }

#define DOREPARRAY(c,v) \
   {static UProperty* sp##v = FindObjectChecked<UProperty>(A##c::StaticClass(),TEXT(#v)); \
   for( INT i=0; i<ARRAY_COUNT(v); i++ ) \
      if( NEQ(v[i],((A##c*)Recent)->v[i],Map) ) \
            *Ptr++ = sp##v->RepIndex+i;}

/*-----------------------------------------------------------------------------
   GetOptimizedRepList()
-----------------------------------------------------------------------------*/

INT* AHXScriptedPawn::GetOptimizedRepList( BYTE* Recent, FPropertyRetirement* Retire, INT* Ptr, UPackageMap* Map )
{
   guard( AHXScriptedPawn::GetOptimizedRepList );

   Ptr = Super::GetOptimizedRepList( Recent, Retire, Ptr, Map );

   if( DrawType==DT_Mesh && ((RemoteRole<=ROLE_SimulatedProxy && (!bNetOwner || !bClientAnim)) || bDemoRecording) )
   {
      DOREPARRAY( Actor, BlendAnimSequence );
      DOREPARRAY( Actor, SimBlendAnim );
      DOREPARRAY( Actor, BlendAnimMinRate );
   }

   return Ptr;

   unguard;
}

/*-----------------------------------------------------------------------------
   PreNetReceive()
-----------------------------------------------------------------------------*/

FPlane PreSimBlendAnim[4];

void AHXScriptedPawn::PreNetReceive()
{
   guard( AHXScriptedPawn::PreNetReceive );

   Super::PreNetReceive();

   for ( INT i = 0; i < 4; i++ )
   {
      PreSimBlendAnim[i] = SimBlendAnim[i];
   }

   unguard;
}

/*-----------------------------------------------------------------------------
   PostNetReceive()
-----------------------------------------------------------------------------*/

void AHXScriptedPawn::PostNetReceive()
{
   guard( AHXScriptedPawn::PostNetReceive );

   Super::PostNetReceive();

   for ( INT i = 0; i < 4; i++ )
   {
      if ( SimBlendAnim[i] != PreSimBlendAnim[i] )
      {
         BlendAnimFrame[i] = SimBlendAnim[i].X * 0.0001;
         BlendAnimRate[i]  = SimBlendAnim[i].Y * 0.0001; // execPlayBlendAnim() / execTweenBlendAnim use this scaling value
         BlendTweenRate[i] = SimBlendAnim[i].Z * 0.001;
         BlendAnimLast[i]  = SimBlendAnim[i].W * 0.0001;

         if ( BlendAnimLast[i] < 0.0 )
         {
            BlendAnimLast[i] *= -1.0;

            //bAnimLoop = 1;

            if ( IsA( APawn::StaticClass() ) )
            {
               if ( BlendAnimMinRate[i] < 0.5 )
                  BlendAnimMinRate[i] = 0.5;
            }
         }
         else
         {
            //bAnimLoop = 0;
         }
      }
   }

   unguard;
}
/edit:
Small table for BlendAnim slots used (i'll just replicate the changed Head turning slot)

Code: Select all

BlendAnimIndices:


MouthA		0 (Default)	TweenBlendAnim
MouthE		0 (Default)	TweenBlendAnim
MouthF		0 (Default)	TweenBlendAnim
MouthM		0 (Default)	TweenBlendAnim
MouthO		0 (Default)	TweenBlendAnim
MouthT		0 (Default)	TweenBlendAnim
MouthU		0 (Default)	TweenBlendAnim
MouthClosed	0 (Default)	TweenBlendAnim

Eye Blinking:
Blink		1		PlayBlendAnim

Head Movement:
HeadLeft	3		PlayBlendAnim
HeadRight	3		PlayBlendAnim
HeadUp		3		PlayBlendAnim
HeadDown	3		PlayBlendAnim
Still		3		PlayBlendAnim
I demand my DXE User ID back. Launcher for DeusEx, Rune, Nerf, Unreal & Botpack. HX on Mod DB. Revision on Steam.
Post Reply