Help Desk
This is the Unreal Wiki Help Desk page. It's for people who are having problems with editing for UT2003 or other Unreal Engine games, they type their problem, and we answer them, simple, if we can't answer them, tough.
Note that the Wiki system is not ideal for long discussions. We recommend using BeyondUnreal's [Unreal Development] forums.
Rules
Before you post a question, please:
- Make sure the question hasn't already been asked on this page or in the Archive.
- STFW (Search The Friendly Wiki )
- Search in forums and other useful resources
After you have received an answer to your question, please:
- write up the information somewhere on the site. This may involve refactoring the text from this page or a complete rewrite
- remove the question & answer from this page
- delete any images you uploaded to show the problem, unless you use them elsewhere
Also, if a question or discussion is idle for over three weeks, remove it because people don't seem to care to reply.
If you don't know where to refactor the Answer and Question to please put them in the Help Desk Archive
This is so this page doesn't get long & messy, and so the information produced here is reorganised for other people to find it easily in future. It's up to whoever posted the question to do this.
(oh, and use headings to separate different threads.)
Questions
Invisible Emitters
The problem I'm having with Emitters is that their particles don't show up if the Emitter is behind the camera. This is normal behaviour, but I want the particles to be drawn anyway, because some of them are in front of the camera. Is there a way I can override this behaviour, without moving the Emitter? Obviously, I COULD move the emitter to in front of the camera and set it's offset so the emitter would still be in sight and the particles would be at the right place, but I'd rather avoid doing that because that means using SetLocation very frequently, potentially on a large number of Emitters, which takes up a lot of cycles.
Timer events (UT)
I've got an Inventory subclass which has the following structure:
function PostBeginPlay() { Super.PostBeginPlay(); SetTimer(0.5,false); log("Timer set .. tick tick tick"); } function Timer() { log("Hey - I'm a timer and I just fired."); }
There is no state code or anything else. I see the "Timer set.." message, but the timer never fires. I feel like I'm missing something really obvious but I'll be damned if I can see it.
Foxpaw: Just a shot in the dark, but possibly some other piece of code is resetting the timer or disabling it? IE, maybe something in the inventory superclass is changing the timer?
If you can't get it to work, you can always implement a timer in Tick. That way, other classes won't mess around with it, and it's just as precise.
EntropicLqd: Yup. You were spot on. I'm definately not firing on all cylinders today. Inventory.GiveTo() calls Inventory.BecomeItem() which resets the timer. I'll figure out where to put this information tomorrow. I'm too tired now
Triggering Volumes / Damage Volumes / Trigger Shoot
I have been playing around with the thought of triggering volumes and stuff like that. Does anyone knoe of a way to do this without making a custom class, or if you need to... can you post the code you need :S? Also, is there anyway to get triggers set to TT_Shoot to trigger an event from a projectile. I have a trigger hidden in a static mesh and I want the player to shoot the static mesh to trigger the event but for some odd reason, you can only trigger it with instant hit weapons.
Foxpaw: I'm not sure if you can make a "shootable" volume like that without changing any script - but what you may be able to do is to just set the drawtypes of the trigger to DT_StaticMesh, and set it's static mesh to the static mesh of the thing you want to be shot. (You may also have to set bHidden to false)
MythOpus: Well, after looking through the trigger code, I managed to get it to trigger a Message, however, you can only trigger it if you shoot a redeemer at it:s That is odd... and fro some reason, triggers cannot be ' unhidden' not even if you set bHidden to false in your code... Now, I have to get the volume to get triggered by other weapons and to make it fire off an ' Event ' (MythOpus Starts Pondering)
Tarquin: Doesn't seem right. I'm pretty sure I've made triggers visible in-game in UT2003.
MythOpus: Well, it could not work for me due to so many currupting mods on my game, but instead of using a trigger, I've decided to use a volume because I have gotten it to work pretty much the way I want it too(still needs a lot of work thought). I think I need to use the TriggerEvent function (event TriggerEvent in class Actor) but the way it is coded, it's only supposed to work with an Actual trigger (I'm using a zone) so I was wondering if you can redefine something like that in the same class that you want to use it with.Ex. Redefined TriggerEvent code in same class as Function UseNewTriggerEvent.
Tarquin: Any ideas on where to move this? Trigger, Volume or a general page on triggering stuff?
MyLevel Problem
ProjectX(the 1 and only is back!!!): In a map i made, i accidentally saved the MyLevel package, i then later moved all the textures in the MyLevel package to a seperate package, I do a full rebuild and no errors show, but whenever i playtest the map, it can't find the package pallette: mylevel.pallette0 I don't even know what mylevel.pallette0 is.
Tarquin: Looks like noone can help. This item will shortly be deleted.
Breaking Glass Problem UT
Flashpoint Black: In A map I've been working on, I have three windows right next to each other that I want to be independently breakable... and it works fine when shooting them with a weapon without splash damage, but when the weapon has splash damamge, take the Rocketlauncher (Eightball), the window that was shot breaks, but the one next to it doesn't, even when shot again.
Tarquin: Looks like noone can help. This item will shortly be deleted.
Saving Games
Soldat: i'm wondering if anyone knows of any way to save games, as in, singleplayer type games, native to the compiler. my last ditch method would be to (probably link external dll's to do this, but) write a binary file with basic properties of every dynamic actor, as well as the map you are on. however, maybe there's a better/easier way... perhaps accessing a save routine used by UED or something like that... though i'm not sure if that would exactly be effective
Mysterial: Well, the game has to save the Ladder data somehow, but I don't know if that would be any use to you (whatever functions involved in that may be natively hardcoded to store exactly the info they store)
Foxpaw: Use the savepackage function. You'll need to experiment with it to get it to save all the stuff you want it to, I haven't played around with it much. There's also another method that would work as well, but it's kind of hard to explain. Try savepackage first and see if that works.. if you can't get results out of it post here again and I'll try to explain the method that my mod is using to save the players' custom ship designs.
Mosquito:I always thought saved games in unreal based games was just a Map with a different extention?!? Couldn't you just make it save the map that would be in the RAM? Since it would be modified, then EVERYTHING would be saved, Down to even bulletholes.
Foxpaw: That's a similar idea to what I suggested. The savepackage function saves a package - which could be a package including a map, a texture package, whatever. (they're all the same type of package internally) I haven't experimented with it much, but I may eventually and I'll write a page on my findings if one hasn't been made already. You are correct that it would save almost everything. Some objects will not be saved if they are declared as transient in Unrealscript, but everything else should be. I'm not sure of the exact usage of the savepackage function but if you wanted to play around with it and find out the proper syntax I'd be interested to read what you found. Savepackage is the mechanism used to save the single player ladder, and it is also used in a couple of other classes. (I think Gameinfo is one, but I don't recall what it uses that information for.)
Skyline: I've been trying to save games, using the SavePackage function. SavePackage appears to save an object you've created with GameInfo's CreateDataObject or loaded with LoadDataObject. I've been able to write these objects to disk with SavePackage, but I don't see a way of saving an existing object in memory. So what I can do is call CreateDataObject which returns an object, copy all of the needed variables to this object then call SavePackage.
I've also noticed the AllDataObjects function that returns an Iterator. I'm not sure what this will return, but it needs specific information – such as the packagename. packagename is what's passed around between Create/LoadDataObject and SavePackage – it seems to act like a filehandler.
After playing around with SavePackage, what I'm still unsure about is what objects need to be saved, and how to load that saved data later. A GameInfo? A LevelInfo? Foxpaw, I'd appreciate any more details you can give us about this.
Foxpaw: Well, there is (in theory) a built in ability to save the current map/game. However, I'm not sure if it works in UT2003. (It worked-ish in UT, and the commands are still there, so I assumed it would.) It seems like it may have gone the way of the warp zones, but maybe it hasn't. There's a console command "SaveGame" that doesn't seem to be documented on the wiki. The usage is like so:
SaveGame 500
or, from script:
ConsoleCommand( "SaveGame "$SaveSlot );
Where 500/SaveSlot is some arbitrary number that differentiates between the different saved games. In UT, this would create a Save500.usa in the Save directory. In UT2003, this creates a zero-length Save.TMP in the Save directory, regardless of the number entered. (Though it still flashes a "saving" screen for a moment.)
In theory, you can load up that saved game by loading the level that map was saved from, with an argument. (hence why you need to associate data with the save file through the savepackage.. I guess there's a few other means. Anyways, you'll need to store what level each saved game was saved on, at the very least. Plus you'd probrably want a save game description, etc. stored with it, and anything else that doesn't save properly.) That argument takes the form ?load=500, and can be done a couple of ways.
ConsoleCommand( "Start "$LevelName$"?load="$SaveSlot ); ClientTravel( LevelName$"?load="$SaveSlot, TRAVEL_Absolute, false); // Or something like that. I don't particularly like the clienttravel method.
However, trying to load in this manner gives me a file not found in-game, coupled with the fact that I can't find the saved game anywhere, leads me to believe that Epic may have made a half-hearted attempt to implement saving and loading, then before it was finished decided to ship UT2003 and leave saving and loading functionality for U2. However, if that is the case, (and I'm pretty sure U2 has save/load ability ) then it's quite possible they will be working in UT2004.
One more thing: you will also need to make a custom gametype, because some initialization functions will still get called. Specifically, Login and PostLogin and such are going to get called every time the level is loaded, IE every time you load a saved game. These functions of course in UT2003 do various stuff like picking a pathnode for you to spawn at first and putting you in spectator and showing the "press fire to begin" stuff... so you'll need to make a gametype that stores it's state so if it's already done that initialization stuff in a "Previous" postlogin, it won't do it again. Basically something like this: (actual code will probrably be much more complicated)
function PostLogin() { if ( !bGameInitialized ) { // do whatever stuff you're gonna do here. bGameInitialized = true; } else { // Load some stuff from your savepackage stored stuff to figure out which pawn the newly "connected" player is supposed to be. } }
Skyline: I saw an error in the log when trying SaveGame –
Warning: Error deleting file '../Save\Save.tmp' (0x32)
Warning: Can't save ../Save\Save1.usa: Graph is linked to external private object Package Package
with a long list of class names before it, the list was for: Log: Referencers of Package Package:
I noticed this same error when I was playing with the SavePackage function.
Foxpaw: Inspired by this test, I tried it with the UnrealEngine2 Runtime. Saving and loading worked there. This is with the old runtime too. So, evidence suggests that save/load support does exist in the second generation unreal engine, and thus theoretically it should exist in UT2003. I'm making a guess about what that log message means, also based on the log output I generated by trying this. (I never though to check the log until you mentioned it.) Anyways. It appears that UT2003 is making a temporary package or something like that. And that it's doing something with it that's preventing saving. IE it's creating something at run-time that can't be stored normally, for whatever reason.
I did some other testing based on that hypothesis and got curious results. When I ran my TC-in-progress, which uses different menus and everything, I still got GUI bits in the list of classes when I tried to save. I found this curious because I wrote my own GUI code from scratch and the stock GUI stuff shouldn't be getting loaded at any point. Which implies to me it's getting loaded behind the scenes for some reason. Anyways, I think it's related to the way UT2003 handles packages. You know how UnrealEd 3 generates packages on the fly to hold stuff when it only partially loads a package? (Thus when you try to exit UnrealEd it says Package1 needs to be saved, etc...) I think it's related to that.
Maybe a packages is not being loaded completely, or maybe stuff is being generated in real-time.. I'm not sure which. It works on UnrealEngine2 Runtime, and I'm going to assume it works on Dues Ex 2 and Unreal 2 - so I think it's specific to UT2003.
Also, it appears you can forego the map name when loading, and it will read the map name from the save game. So, you can just send the console command:
start ?load=10
Also, here's the stuff that was in the log in the runtime when I saved:
Log: 16900068322.0ms Unloading: Package EM_Runtime Log: Save=241.938835 Log: Moving '..\Save\Save.tmp' to '..\Save\Save10.usa'
It appears to unload the map you're on, and then switch to the saved-game as if it were a new level. It also appears to write out the save to save.tmp, and then rename it. I'm not sure if any of this "research" is relevant, but I thought I'd write it here for brainstorming purposes. However, I DID notice that it does unload the level you are on when you try to save in UT2003, though it doesn't SEEM to load a saved file - so it must just be running on what's in the cache.
Interaction problem
Hello again,
I run my mod by creating a dedicated server and then connecting to it from the same computer using two .bat files. As such, the player controller that connects to the game receives a net connection rather than a viewport, and thus I cannot create interactions for it. GetLocalPlayerController returns none. I need the interaction to recognize key presses (the GUIUserKeyBinding thing didn't seem to recognize my exec function). Any suggestions about how to either work around the interaction problem or set up a new testing system? - VonStrohmen
Foxpaw: Ah, your player should actually have both a viewport and a netconnection, but at different ends. In most respects, the client and server will have somewhat the same set of actors (barring relevance, etc) but when it comes to players they are different. If the server machine checks your player, it will find you are a netconnection. If you check clientside, you will find it is a viewport. GetLocalPlayerController finds the local player controller. If a dedicated server calls it it will return none. If a client calls it it should return that client's player controller.
You should be able to spawn an interaction client-side and have it replicate stuff to the server. I'm not sure what the best way to do this is for testing purposes - but here's an idea. It's a bit hacky, but since it's only for test purposes anyway, it doesn't really matter:
- Custom Actor spawned somewhere by server or placed on map before play.
- Custom Actor's tick contains a check: if the level's netmode is NM_Client and the level.GetLocalPlayerController().Player doesn't have the interaction you want, make one. (This only happens client side because only the client has NM_Client)
- Interaction contains a reference back to the custom actor that created it.
- On keypress, call replicated function ( client→server ) on Custom Actor.
Evil lighting glitch of death
I can seem to figure this out, it just started happening:
Whenever I try to build lights in UED 3, it lights wont cast on all surfaces and some walls will light up, others will be completely black, I even reinstalled UT2003 but to no avail! it still does it! I just started resently, and I haven't mad ANY changes that could cause anything like it, it just happened out of the blue. Its not my maps, because I can load up an epic map, rebuild the lighting, and most of the BSP lighting will be completely fucked, I think its something wrong with compiling of lightmaps. :S
Wormbo: Try deleting UT2003.ini and/or UnrealEd.ini to reset UEd's configuration.
Mosquito: No help
RDGDanClark: Sounds to me like a driver issue; make sure your drivers are up to date. How does the lighting look when you're playing the game? All screwy, or is it just happening in the editor?
Mosquito: both
xPawn Editing
Well, I want slow down the movement of the players. I could make a new Pawn since I am making a mod where this will be used but I don't understand all that complicated replication stuff, so could someone tell me a way to do it without making a new Pawn or even better... make a simple " How to Make A NeW Pawn and How You GEt It INto UT2k3 "
MythOpus: Actually, I have just did this while making a new xPawn and all its components However, the next then I'll need to do is seperate my new pawn from the original pawn... I would like to set up a mod that puts in my new pawn, in this case moPawn, moBot .. etc... *EDIT* AH ! Well, i did'nt actually replace the pawn... so i'd still liek to know how I would go about replacing it ...
Spoon: From a mutator, I've done the following.
class moMutator extends Mutator; function PreBeginPlay() { Level.Game.DefaultPlayerClassName = "moPawn"; }
or something like
function ModifyPlayer(Pawn Other) { local Pawn OP; if( Other.IsA( 'xPawn') && !Other.IsA('moPawn') && ( Other.Controller.IsA('xPlayer') || Other.Controller.IsA('xBot') ) ) { OP = Other; Other.Controller.PawnClass = class'moPawn'; Level.Game.RestartPlayer( Other.Controller ); OP.UnPossessed(); OP.Destroy(); } } }
Master browser
Tarquin: Is there any way to undock stuff from the master browser without UEd crashing?
MythOpus: That's odd... Which version of UED are you talking about because I can undock stuff from the master browser in Unreal Ed 3
Making a static mesh glow
I want to put a UT Lightbox style beam in my level, but I'm having a hard time making it look good. The map is set in outer space, so the "lightbox" (it's not a true lightbox as you'll see) is pretty consistantly viewed with a starry black backdrop behind it. The static mesh I'm using is StaticMesh'JWDecember.Lighting.OutsideLightCone'. I've tried messing with all the settings I know of, but I can't seem to make the mesh any brighter... as it is, you can barely see it until you're right up next to it. I want to be able to see it from across the map!
I know that the various weapons have a glow to them, a slow pulse. I'm wondering if you can do the same thing with any static mesh to make it brighter, to make it give off a nice glow you can see from far off – I gave my "lightbox" the same lighting property settings as the Minigun, but it didn't seem to have any effect. Any ideas guys?
Mosquito: Display → ambient lighting → GO WILD!
"Path Names"
Foxpaw: I've been periodically getting this general protection fault happening but I can't see any correlation between when it occurs, and.. well, anything else really. Sometimes it happens when I'm wandering around on foot, other times when I'm using a vehicle. I'm hoping that someone else has seen this particular type of GPF and can give me some poiters as to what might be causing it.
General protection fault!
History: UObject::GetPathName <- UObject::GetPathName <- UObject::ProcessEvent <- (InteractionMaster Package.InteractionMaster, Function Engine.InteractionMaster.Process_Tick) <- UInteractionMaster::MasterProcessTick <- ULevel::Tick <- (NetMode=0) <- TickLevel <- UGameEngine::Tick <- UpdateWorld <- MainLoop
GRAF1K: Apparently
if ( (InteractionArray[Index].bRequiresTick ) && (!InteractionArray[Index].bNativeEvents) )
in InteractionMaster is the problem. GetPathName is native, and !InteractionArray[Index].bNativeEvents prevents it from getting ticked when it needs it.
I'm not 100% sure of this. It seems logical though.
Foxpaw: Hmm. I don't see the relation to pathname though.. or even any reference to getpathname in the script. I do use a couple of interactions, but one hasn't been loaded anytime that I've gotten this error, and I haven't touched either of their code in quite a while. The interaction that I have been using does use bRequiresTick, so maybe I'll see if there's a workaround and see if that works. Unfortunately the crashes are so unpredictable, it's hard to tell whether it's fixed or just hiding.
Foxpaw: Well, I turned off bRequiresTick and worked around the lack of a tick in one of my interactions. Not sure why that was causing a GPF, but it's gone now. (knock on wood) Unfortunately, I don't know how this can be refactored without knowing why that was causing a crash.
General Protection Fault!
History: UObject::ProcessEvent <- (InteractionMaster Package.InteractionMaster, Function Engine.InteractionMaster.Process_KeyEvent) <- UInteractionMaster::MasterProcessKeyEvent <- UEngine::InputEvent <- UWindowsViewport::CauseInputEvent <- UWindowsViewport::UpdateInput <- UViewport::ReadInput <- APlayerController::Tick <- TickAllActors <- ULevel::Tick <- (NetMode=0) <- TickLevel <- UGameEngine::Tick <- UpdateWorld <- MainLoop
I've been getting the above General Protection Fault a lot lately. It's repeatable and clearly related to my mod but I can't trace it because it never makes it out of the InteractionMaster.
This occurs in a variety of conditions, which do not appear to be related. The simplest to cause seems to be loading a vehicle more than 3 times per session. (Note that no information is stored in the UScript after the vehicle has finished loading, so it must be some native caching magic)
Anyways, I'm posting this here hoping that someone has encountered something like this and knows a workaround. I had a similar problem with Process_Tick before in a different interaction, and could only fix it by removing the bRequiresTick
and changing the implementation so it didn't require Tick. In this case, I do not believe that removing bActive is an option, for obvious reasons.
SetLocation
This is kind of a stab in the dark, but I'm curious to find out if anyone knows about any kind of anomalous condition that can prevent SetLocation from working. I have an actor that sets its location, and 90% of the time it works fine, but in some circumstances it doesn't move the actor, no matter how many times I call setlocation. This only seems to happen when attempting to move it to a certain location, as if I use VRand() it seems to work all right. I'm not sure what could be cause this, the actor doesn't move at all when setlocation is called, but apparently only with certain locations. However, I don't see any relationship between the locations that cause it.
GRAF1K: Foxpaw is having the same problem – Foxpaw/Developer Journal
Foxpaw: Actually, I'm the one who posted this here.
GRAF1K: Oops. It looked like it was tarquin in the diff... he apperently corrected your spelling.
New Voices/Pain Sounds
Does anyone know how to use custom pain sounds in a specific gametype? I'd like to use my own to replace screams with electrical sparking and buzzing for a laser tag gametype. I've searched around a bit in the UT2003 source and didn't find much.–GRAF1K
Foxpaw: I believe that:
var(Sounds) class<xPawnSoundGroup> SoundGroupClass;
is reference to a class who's static functions are called to get pain sounds, etc. So, you could do one of two things: (probrably there's other options, but these seem the most elegant)
- Set every pawns sound group to either a custom one, or maybe just to the robot one. However, the sound group has a couple non-death/pain related sounds, like the grunts they make when they jump and land and such, so alternatively you could:
- Set the default.Sounds, default.PainSounds, and default.DeathSounds in any soundgroup referenced by a pawn when that pawn is created. This method is a bit less elegant but preserves the grunt sounds.
GRAF1K: I've tried to do this for QUITE a long while today. I'm trying to use GameInfo's DefaultPawnClass, as well as a few other possible hooks. I'm beginning to wonder if one can actually change a SoundGroup dynamically.
Foxpaw: I wouldn't do it that way: the pawn's sound group is overwritten when the pawn is set up with it's model and such. (In UT2003, all pawns are xPawns with models, etc changed, unlike in UT where each model had it's own class.)
What I would do is put it in some kind of function that gets called when the pawn gets spawned. Like modifyplayer or something like that. (I think there's something to that tune in mutators.)
Then set those things on the new pawns sound groups default properties.
If you really wanted to optimize it you could also keep a list of sound groups you'd already modified, so you wouldn't be setting it up every time the player gets spawned, but then again, we're talking about like 3 assignment calls, so the argument for optimization is a bit moot.
I guess you might also be able to do it by cruising theough the int files for loaded models, reading their respective sound group references, using dynamicloadobject to load them, and then setting their defaults. Trickier, but then you'd only have to do it once, so in theory it would be better. Either way though, that's really just splitting hairs, I doubt there would be a measurable change in speed either way.
GRAF1K: I think it's a bit more complicated. The sound group is defined by the pawn's species. What I actually need to do is change the pawn's species to my own which in turn has a custom sound group. I think. I just have no idea how to do that. Other.default.Species?
Update: Unknown Property Species in Class Engine.Pawn.
Foxpaw: Okay then. You probrably don't want to enforce a custom species, because again, you don't want to adversely affect the other sounds. (Wouldn't make much sense for robots to make an organic grunt noise)
I went over the species code so I could know a little bit more about what I'm talking about. It's pretty messy, and for some wierd reason has a lot of redundant stuff that more or less does nothing. I guess technically preloading the voice packs might make sense, theres really no need to do it three times in the same function.
Anyways, instead of just changing the defaults for the pawns sound group, what you're going to have to do instead is change the defaults for the pawns species sound groups. IE:
function ModifyPlayer( Pawn NewPlayer ) // Or something. { if ( NewPlayer != None && NewPlayer.Species != None ) { if ( NewPlayer.Species.MaleSoundGroup != None ) NeuterSoundGroup( NewPlayer.Species.MaleSoundGroup ); if ( NewPlayer.Species.FemaleSoundGroup != None ) NeuterSoundGroup( NewPlayer.Species.FemaleSoundGroup ); } Super.ModifyPlayer( NewPlayer ); } function NeuterSoundGroup( String SoundGroup ) // Why oh why does the species code store this as a string? Why??? It's so inefficient! They should just dynamicloadobject it ONCE per session and store it in a defaultproperty! { var class<xPawnSoundGroup> PhearTehSoundGroup; PhearTehSoundGroup = class<xPawnSoundGroup>(DynamicLoadObject(SoundGroup, class'Class')); if ( PhearTehSoundGroup != None ) { if ( PhearTehSoundGroup.default.DeathSounds.length > 0 ) PhearTehSoundGroup.default.DeathSounds.Remove( 0, PhearTehSoundGroup.default.DeathSounds.length ); PhearTehSoundGroup.default.DeathSounds[0] = Sound'SomeSound'; // Better yet have a dynamic array of sounds in your mutator and iterate through that. PhearTehSoundGroup.default.DeathSounds[1] = Sound'SomeOtherSound'; PhearTehSoundGroup.default.DeathSounds[2] = Sound'SomeMoreSound'; // Do the same for pain sounds, and the drown sound and junk. } }
GRAF1K: Thanks Foxpaw . This is really a lot of stuff you wrote. I appreciate it. Trying to implement as right now.
Update: Your code doesn't work Fox. Can't find 'SomeSound'. About to replace with an existing sound.
Update: The code fails compilation here:
// Unrecognized member Species in class Pawn. if ( Other != None && Other.Species != None )
Foxpaw: Well, I just slapped it together for demonstration, so I'm not too surprised it doesn't work verbatim. Species is a variable declared in xPawn, and although in UT2003 every player is going to be an xPawn, the function still takes a pawn. So... change the line that's not compiling to something more like this:
if ( Other != None && Other.IsA( 'xPawn' ) && xPawn( Other ).Species != None )
You'll also have to cast a few things to xPawn below that too.
GRAF1K: Thanks, Foxpaw. I realize that of course any quick demo script will need heavy tweaking to compile. I'm working on it.
Ambient Sounds
Foxpaw: I don't know if anyone else has had this problem, but Ambient Sounds don't seem to work any more on my mod. (on anything.) Interestingly enough, I had the same problem with another mod for UT. (this one's for UT2003) Sounds played through UScript are still heard normally. Anyone have any experience with something like this happening?
Coordinate Rotation with Rotators
Foxpaw: I'm looking for a way to accurate do a coordinate rotation on rotators. That is, I have a rotator, that is relative to another rotator, but the roll of the first rotator is obviously going to affect the pitch, yaw, and roll of the second rotator. I don't know how I can do this though. I can do a coordinate rotation with vectors, but then I lose the roll component, and I don't know how I would go about recovering it.
I tried using quaternions to do this but using quaternion multiplication returns the combination of the two rotations on the same axis, instead of modifying one quat by the other.
Logging
Tarquin: Log("foo") seems to have no effect. Am I doing it wrong? Where should I be looking for output? Anyway, what I would really like is to output to the HUD. I knew how to do it in UT: there was a function to send to the scrolling bit of the HUD and a function Broadcast() that flashed up on the middle of the screen. How do I do those in UT2003?
Foxpaw: That should be all you need to do. The output will show up in your log file, which is UT2003.log by default. To write stuff to the scrolling bit.. well, I know one way, you can call Level.Game.Broadcast( None, "foo", 'Say' ); which will send a phony "say" message to the HUD. That's good enough for debugging, but leaves a bunch of accessed nones in the log. I don't remember how to make a message show up in the middle.
Dragonmaw: I went ahead and moved all answered questions to the archive. Try and fit them into them site where you can when you have some spare time.
Tarquin: As it says at the top of this page, answers should be refactored into an appropriate place in the rest of the wiki. It also says that it's the responsibility of the person who asked the question – are people not sticking around to do this?
Dragonmaw: Apparently not, because I moved at least 8 questions and answers to the archive. They find the answer and are so elated that they don't bother to refactor.
After you have received an answer to your question, please:
- write up the information somewhere on the site. This may involve refactoring the text from this page or a complete rewrite
- remove the question & answer from this page
- delete any images you uploaded to show the problem, unless you use them elsewhere