| Home Page | Recent Changes

Log Interaction

Shambler: Got fed up of using the log window to debug stuff so made this real quick....basically this code will allow you to display log info on the HUD ingame and there are a number of ways you can format it to stand out.

Posting it on the wiki for others who may find use in it.

[pgDebugLog]

How to use it

Create a mutator like this one:

Class pgPortalGunMut extends Mutator;

function ModifyPlayer(Pawn Other)
{
    local int i;

    // Debug
    if (Other.Controller != none && PlayerController(Other.Controller) != none && PlayerController(Other.Controller).Player != none
        && PlayerController(Other.Controller).Player.InteractionMaster != none)
    {
        for (i=0; i<PlayerController(Other.Controller).Player.LocalInteractions.Length; ++i)
        {
            if (MathDebugInteraction(PlayerController(Other.Controller).Player.LocalInteractions[i]) != none)
            {
                bSkip = True;
                break;
            }
        }

        if (!bSkip)
            PlayerController(Other.Controller).Player.InteractionMaster.AddInteraction(string(Class'MathDebugInteraction'), PlayerController(Other.Controller).Player);
    }

    Super.ModifyPlayer(Other);
}

function Mutate(string MutateString, PlayerController Sender)
{
    local int i;

    if (MutateString ~= "pgToggleDebug")
    {
        if (Sender.Player != none && Sender.Player.InteractionMaster != none)
        {
            for (i=0; i<Sender.Player.LocalInteractions.Length; ++i)
            {
                if (MathDebugInteraction(Sender.Player.LocalInteractions[i]) != none)
                {
                    MathDebugInteraction(Sender.Player.LocalInteractions[i]).ToggleDebug();
                    break;
                }
            }
        }
    }
    else
    {
        Super.Mutate(MutateString, Sender);
    }
}

Add some debugging code to the class you want to debug

Class SomeClass extends SomeActor;

var MathDebugInteraction ActiveDebug;
var int FireMode; // This isn't important

function SomeFunction()
{
    local float XDot, ZDot, ZAxisDiff, ClockX, ClockZ, DiffClockZ, ClockTest;


    // Do stuff with these variables
    XDot = Blah;
    ZDot = Blah;
    ZAxisDiff = Blah;
    ClockX = Blah;
    ClockZ = Blah;
    ClockTest = Blah;
    DiffClockZ = Blah;



    // Log stuff to display on screen (shown in picture)


    // Format of the LogString function: (copied here for reference)

    // function LogString(string Info, optional color StringColor, optional bool bUseColor, optional bool bUnderline, optional color HighlightColor, optional bool bDontEndLine)
    // Parameter 1: The string you want to log
    // Parameter 2: The colour of the logstring
    // Parameter 3: Pass in True if you put in a colour for parameter 2 (I should change this but cba)
    // Parameter 4: Underline the text if True is passed in
    // Parameter 5: If you pass a colour in (with an Alpha greater than 0) then the text is highlighted with that colour
    // Parameter 6: If you want the next log string to write on the same line, pass in True here




    // I want to rewrite the log info every tick, so check the timestamp on the debug object...if its 'out of date', use EmptyList to wipe the log data (specifying a new timestamp)
    if (ActiveDebug.LogTimestamp != Level.TimeSeconds)
    {
        ActiveDebug.EmptyList(Level.TimeSeconds);

        // The command to turn this off is detailed in the mutator class
        ActiveDebug.LogString("To disable this text type: ", Class'Canvas'.static.MakeColor(0,255,0,255), True,,,True);
        ActiveDebug.LogString("Mutate pgToggleDebug", Class'Canvas'.static.MakeColor(0,255,0,255), True, True);
        ActiveDebug.LogString("");
    }


    if (FireMode == 0)
        ActiveDebug.LogString("Portal"@FireMode, Class'Canvas'.static.MakeColor(255,255,255,255), True, True, Class'Canvas'.static.MakeColor(0,128,255));
    else
        ActiveDebug.LogString("Portal"@FireMode, Class'Canvas'.static.MakeColor(255,255,255,255), True, True, Class'Canvas'.static.MakeColor(255,128,0));


    ActiveDebug.LogString("XDot", Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
    ActiveDebug.LogString("(XY Axis change) is: ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(XDot),,,, Class'Canvas'.static.MakeColor(0,255,255,64), True);
    ActiveDebug.LogString(" or ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(ACos(XDot) * 57.295779)$"º",,,, Class'Canvas'.static.MakeColor(255,255,0,64));

    ActiveDebug.LogString("ZDot", Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
    ActiveDebug.LogString("(Z Axis change) is: ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(ZDot),,,, Class'Canvas'.static.MakeColor(0,255,255,64), True);
    ActiveDebug.LogString(" or ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(ACos(ZDot) * 57.295779)$"º",,,, Class'Canvas'.static.MakeColor(255,255,0,64));

    ActiveDebug.LogString("ZAxisDiff", Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
    ActiveDebug.LogString("(Portal Up-Axis offset) is: ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(ZAxisDiff),,,, Class'Canvas'.static.MakeColor(0,255,255,64), True);
    ActiveDebug.LogString(" or ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(ACos(ZAxisDiff) * 57.295779)$"º",,,, Class'Canvas'.static.MakeColor(255,255,0,64));

    ActiveDebug.LogString("ClockX", Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
    ActiveDebug.LogString("(XDot/Yaw clockwise?) is: ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(bool(ClockX)),,,, Class'Canvas'.static.MakeColor(0,255,255,64));

    ActiveDebug.LogString("ClockZ", Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
    ActiveDebug.LogString("(ZDot/Pitch clockwise?) is: ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(bool(ClockZ)),,,, Class'Canvas'.static.MakeColor(0,255,255,64));

    ActiveDebug.LogString("DiffClockZ", Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
    ActiveDebug.LogString(" is: ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(bool(DiffClockZ)),,,, Class'Canvas'.static.MakeColor(0,255,255,64));

    ActiveDebug.LogString("ClockTest", Class'Canvas'.static.MakeColor(255,255,255,255), True, True,, True);
    ActiveDebug.LogString("(ZDot/Roll clockwise?) is: ", Class'Canvas'.static.MakeColor(255,255,255,255), True,,,True);
    ActiveDebug.LogString(string(bool(ClockTest)),,,, Class'Canvas'.static.MakeColor(0,255,255,64));

    ActiveDebug.LogString("");
}

And put this in a .uc file in with your source, modify the 'foreach' loop on line 45 so you can 'attach' (i.e. put a reference to) the interaction in the class you want to debug.

// An interaction to help me debug problems with the portal gun math
Class MathDebugInteraction extends Interaction;

struct LogElement
{
    var string LogString;
    var color StringColor;
    var bool bUnderline;
    var color HighlightColor;
    var bool bDontEndLine;
};

var array<LogElement> LogList;
var int ListSpacing;
var color ListColor;
var font ListFont;
var float ListX, ListY, FontY, FontScale, LogTimestamp;
var bool bInitialSetup;

var bool bDisableDebug;


function ToggleDebug()
{
    bDisableDebug = !bDisableDebug;

    if (bDisableDebug)
        EmptyList();
}

function PostRender(canvas Canvas)
{
    local pgPortalDecal PD;
    local int i;
    local float LenX, LenY, LastX, LastY;

    /*
    EmptyList();
    LogString("Arf, testing");
    LogString("Wewt, testing2", Canvas.MakeColor(255,255,255,255), True, True,,True);
    LogString("AMG TEST",,,True,Canvas.MakeColor(0,255,0,128));
    LogString("FEYNAL TEST!!");
    */

    if (ViewportOwner != none && ViewportOwner.Actor != none && ViewportOwner.Actor.Pawn != none && xPawn(ViewportOwner.Actor.Pawn) != none)
        foreach ViewportOwner.Actor.DynamicActors(Class'pgPortalDecal', PD)
            if (PD.Owner == ViewportOwner.Actor/* && PD.FireMode == 0*/ && PD.ActiveDebug != self)
                PD.ActiveDebug = self;


    if (LogList.Length == 0)
        return;


    // ListX and ListY in default properties tell the code where to start drawing (between 0.0 and 1.0), FontScale determines the size of font with changing screen size
    if (!bInitialSetup)
    {
        ListX = Canvas.ClipX * ListX;
        ListY = Canvas.ClipY * ListY;
        FontScale = Canvas.ClipX * FontScale;

        bInitialSetup = True;
    }


    Canvas.Reset();


    // Setup stored variables
    Canvas.Font = ListFont;

    Canvas.Style = 5;

    Canvas.CurX = ListX;
    Canvas.CurY = ListY;
    Canvas.FontScaleX = FontScale;
    Canvas.FontScaleY = FontScale;

    Canvas.DrawColor = ListColor;

    if (FontY == 0)
        Canvas.StrLen("X", FontY, FontY);


    // Draw the list
    for (i=0; i<LogList.Length; ++i)
    {
        if (Canvas.CurY < Canvas.ClipY && Canvas.CurX < Canvas.ClipX && LogList[i].LogString != "")
        {
            LastX = Canvas.CurX;
            LastY = Canvas.CurY;

            Canvas.StrLen(LogList[i].LogString, LenX, LenY);

            // Manage highlighting
            if (LogList[i].HighlightColor.A != 0)
            {
                Canvas.DrawColor = LogList[i].HighlightColor;
                Canvas.DrawRect(Texture'WhiteTexture', Min(LenX, Canvas.ClipX - Canvas.CurX), FontY);
                Canvas.CurX = LastX;
                Canvas.CurY = LastY;
            }

            // Setup the color
            Canvas.DrawColor = LogList[i].StringColor;

            // Manage underlining
            if (LogList[i].bUnderline)
            {
                Canvas.CurY += FontY;
                Canvas.DrawRect(Texture'WhiteTexture', Min(LenX, Canvas.ClipX - Canvas.CurX), FontScale);
                Canvas.CurX = LastX;
                Canvas.CurY = LastY;
            }

            Canvas.DrawTextClipped(LogList[i].LogString);


            Canvas.CurX += Min(LenX, Canvas.ClipX - Canvas.CurX);
        }


        // Endline
        if (!LogList[i].bDontEndLine)
        {
            Canvas.CurX = ListX;
            Canvas.CurY += ListSpacing + FontY;
        }
    }

    Canvas.Reset();
}

function EmptyList(optional float NewTimestamp)
{
    LogList.Length = 0;

    if (NewTimestamp != 0.0)
        LogTimestamp = NewTimestamp;
}


// LogString parameters:
// Parameter 1: The string you want to log
// Parameter 2: The colour of the logstring
// Parameter 3: Pass in True if you put in a colour for parameter 2 (I should change this but cba)
// Parameter 4: Underline the text if True is passed in
// Parameter 5: If you pass a colour in (with an Alpha greater than 0) then the text is highlighted with that colour
// Parameter 6: If you want the next log string to write on the same line, pass in True here

function LogString(string Info, optional color StringColor, optional bool bUseColor, optional bool bUnderline, optional color HighlightColor, optional bool bDontEndLine)
{
    if (bDisableDebug)
        return;

    LogList.Length = LogList.Length + 1;

    LogList[LogList.Length-1].LogString = Info;


    if (bUseColor)
        LogList[LogList.Length-1].StringColor = StringColor;
    else
        LogList[LogList.Length-1].StringColor = ListColor;


    LogList[LogList.Length-1].bUnderline = bUnderline;
    LogList[LogList.Length-1].HighlightColor = HighlightColor;
    LogList[LogList.Length-1].bDontEndLine = bDontEndLine;
}

defaultproperties
{
    bVisible=True


    ListX=0.5625
    ListY=0.125
    ListSpacing=5
    ListColor=(R=255,G=0,B=0,A=255)
    ListFont=DefaultFont
    FontScale=0.00125
}

Shambler: Feel free to reformat the page, just keep all the code as it is ;) (I may update it later)

The Unreal Engine Documentation Site

Wiki Community

Topic Categories

Recent Changes

Offline Wiki

Unreal Engine

Console Commands

Terminology

FAQs

Help Desk

Mapping Topics

Mapping Lessons

UnrealEd Interface

UnrealScript Topics

UnrealScript Lessons

Making Mods

Class Tree

Modeling Topics

Chongqing Page

Log In