Useful Functions
Posted: Sat Apr 07, 07 8:50 am
Ever created or found useful UnrealScript functions? (So stand-alone functions!) Post them here, so others can use them aswell!
static final function string substr(coerce string string, coerce int start , optional coerce int length)
{
local string tmpString;
local int tmpInt;
if(start >= 0)
tmpInt = len(string)-start;
else
tmpInt = start*-1;
tmpString = right(string, tmpInt);
if(length > 0)
tmpString = left(tmpString, length);
else if(length < 0)
tmpString = left(tmpString, len(tmpString)+length);
return tmpString;
}
//================================================================================
// SubStr. Made by Alex ~ http://www.dxalpha.com/
//================================================================================
class SubStr extends Actor;
function PostBeginPlay()
{
local string testString;
Super.PostBeginPlay();
testString = "abcdef";
log(substr(testString, 1)); // bcdef
log(substr(testString, 1, 3)); // bcd
log(substr(testString, 0, 4)); // abcd
log(substr(testString, 0, 8)); // abcdef
log(substr(testString, -1, 1)); // f
log(substr(testString, -1)); // f
log(substr(testString, -2)); // ef
log(substr(testString, -3, 1)); // d
log(substr(testString, 0, -1)); // abcde
log(substr(testString, 2, -1)); // cde
log(substr(testString, 4, -4)); // empty
log(substr(testString, -3, -1)); // de
}
static final function string substr(coerce string string, coerce int start , optional coerce int length)
{
local string tmpString;
local int tmpInt;
if(start >= 0)
tmpInt = len(string)-start;
else
tmpInt = start*-1;
tmpString = right(string, tmpInt);
if(length > 0)
tmpString = left(tmpString, length);
else if(length < 0)
tmpString = left(tmpString, len(tmpString)+length);
return tmpString;
}
defaultproperties
{
bHidden=true
}
native static final function string GetConfig( string ConfigSection, string ConfigKey); // DEUS_EX CAC
str = "TestArray["$testIndex$"]";
return Class'IniTest'.Static.GetConfig("PackageName.IniTest", str);
[PackageName.IniTest]
TestArray[1]=aaa
TestArray[2]=qqq
TestArray[3]=ggggg
TestArray[4]=fff
TestArray[5]=ccc
static final function int strfind(coerce string Haystack, coerce string Needle)
{
local int StringIndex;
while(instr(Haystack,Needle) != -1)
{
Haystack = Right(Haystack,(Len(Haystack)-instr(Haystack,Needle))-1);
StringIndex++;
}
return StringIndex;
}
someInt = strfind("applepie", "p");
Batchy wrote:Does UScript have a function like strlen?
ReplacementInv.SetPropertyText("SkinColor", OtherInv.GetPropertyText("SkinColor"));
// 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;
}
FBspNode& Node = XLevel->Model->Nodes(Res->Item);
FBspSurf& Surf = XLevel->Model->Surfs(Node.iSurf);
han wrote:Maybe a fixed TraceTexture() version is sth. you might like (a whole new feeling with right footstep sounds).
- 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;
}