• Advertisement
Sign in to follow this  

[SOLVED] [Unrealscript] Why is my NPC controller never appearing?

This topic is 1781 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hey guys, got a problem in Unrealscript I need help understanding.


So I'm trying to create an NPC, and I've got a MagpiePawn and MagpieController. But the problem is, the controller isn't appearing although the pawn is!

 

I can't say I understand why. All that happens instead is that the traditional UT bot appears within the static mesh I've made and it starts shooting at me (even though I don't want any shooting or violence whatsoever in my game!).

For the sake of understanding, here's my code in full, but I think the parts I've highlighted are the relevant ones.

 

 

class MagpiePawn extends UTPawn placeable;

var StaticMeshComponent MyMesh;
//var(NPC) SkeletalMeshComponent NPCMesh;

var class<AIController> NPCController;

simulated function PostBeginPlay()
{
    super.PostBeginPlay();
    SetMeshVisibility(true);
    `log("The magpie pawn has spawned!"); //this appears fine, and I believe the pawn works okay
        `log(self);
}

defaultproperties
{
  bBlockActors=True
  bCollideActors=True
  NPCController=class'MagpieController'

  Begin Object Class=DynamicLightEnvironmentComponent Name=MagpieLightEnvironment
  bEnabled=TRUE
  End Object
  Components.Add(MagpieLightEnvironment)

  Begin Object Class=StaticMeshComponent Name=MagpieMesh
        StaticMesh=StaticMesh'UN_SimpleMeshes.TexPropCube_Dup'
        Materials(0)=Material'EditorMaterials.WidgetMaterial_X'
        LightEnvironment=MagpieLightEnvironment
        Scale3D=(X=0.25,Y=0.25,Z=0.5)
  End Object
  Components.Add(MagpieMesh)
  MyMesh=MagpieMesh
}

 

And here's the MagpieController, which I need instead of whatever controller is at work right now:
 

 

class MagpieController extends AIController;

var Pawn Crow;

var float AttackDistance;
var float ChaseDistance;
var float MovementSpeed;

simulated function PostBeginPlay()
{
  `log("A magpie CONTROLLER has appeared on the map!"); //This message never appears!
  if (Crow == none)
  {
    TargetCrow();
  }
}

auto state Searching
{
  function Tick (float DeltaTime)
  {
    if (Crow == none)
    {
      TargetCrow();
    }
    if (VSize(Location - Crow.Location) < ChaseDistance)
    {
      GoToState('ChasingPlayer');
    }
  }

}

state ChasingPlayer
{
  function Tick(float DeltaTime)
  {
    local vector NewLocation;

    if(Crow == none)
    {
        TargetCrow();
    }

    while (Crow != none && VSize(NewLocation - Crow.Location) < AttackDistance)
    {
        NewLocation = Location;
        NewLocation += normal(Crow.Location - Location) * MovementSpeed * DeltaTime;
        SetLocation(NewLocation);
    }
  }

}

function TargetCrow()
{
  local CrowPlayerController PC;
  foreach LocalPlayerControllers(class'CrowPlayerController', PC)
  {
    if (PC.Pawn != none)
    {
        Crow = PC.Pawn;
        `log("My enemy is:" @ Crow);
    }
  }
}

function bool CanFireWeapon( Weapon Wpn, byte FireModeNum ) { return FALSE; }

defaultproperties
{
  AttackDistance=96
  MovementSpeed=256
  ChaseDistance=512
}


This is part of my final year project that's due in little more than two weeks, so believe me, the slightest bit of help you could give would make a big difference. Any thoughts?

Share this post


Link to post
Share on other sites
Advertisement

Back again tongue.png

In the MagpiePawn code, get rid of the NPCController variable and simply use ControllerClass (the var defined in the Pawn class). If you want your current code to work, you'll have to add in the MagpiePawn's PostBeginPlay(), the line:

ControllerClass = NPCController;

BUT, the only reason you'd have the NPCController variable in the first place is if you wanted it to be editable from in-editor, by declaring it like

var() class<AIController> NPCController;

 

Also, just a little tip, instead of using 'log("string"), you can use WorldInfo.Game.Broadcast( self, "String"), which will display the string in-game (usually more convenient).

 

So code should look something like this:

class MagpiePawn extends UTPawn placeable;

var StaticMeshComponent MyMesh;
//var(NPC) SkeletalMeshComponent NPCMesh;

simulated function PostBeginPlay()
{
    super.PostBeginPlay();
    SetMeshVisibility(true);
    WorldInfo.Game.Broadcast( self, "The magpie pawn has spawned!" ); //this appears fine, and I believe the pawn works okay
    WorldInfo.Game.Broadcast( self, self );
}

defaultproperties
{
  bBlockActors=True
  bCollideActors=True
  ControllerClass=class'MagpieController'    //<- Notice we're using ControllerClass

  Begin Object Class=DynamicLightEnvironmentComponent Name=MagpieLightEnvironment
  bEnabled=TRUE
  End Object
  Components.Add(MagpieLightEnvironment)

  Begin Object Class=StaticMeshComponent Name=MagpieMesh
        StaticMesh=StaticMesh'UN_SimpleMeshes.TexPropCube_Dup'
        Materials(0)=Material'EditorMaterials.WidgetMaterial_X'
        LightEnvironment=MagpieLightEnvironment
        Scale3D=(X=0.25,Y=0.25,Z=0.5)
  End Object
  Components.Add(MagpieMesh)
  MyMesh=MagpieMesh
}
Edited by ratrace135

Share this post


Link to post
Share on other sites

I just tried it now, Ratrace, and it works like a charm! The WorldInfo broadcast didn't pop up although I put it precisely as you wrote, which was a bummer, but the log message came out all the same. Thanks again! :)

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement