- Member variables are now declared all in one place: InitThingdef(). They
are not partially defined in thingdef_expression.cpp and further refined
in actor.txt.
- This left ParseNativeVariable() parsing only functions, so it has been
renamed to ParseNativeFunction().
- Note that their declarations in InitThingdef() are expected to be
temporary.
- Converting the wave speed back to floats, since I'm using sin() instead
of the finesine table now.
- Pre-shift the quake intensities to avoid extra shifting in GetModIntensity.
- Loading old saves will shift the intensities to fixed point but will not
convert the fixed wave speeds to floats. The chances of this
being in a savegame where the speeds are non-zero is pretty much nil,
and int and floating point 0 are bitwise identical (not counting -0.0).
- Squashed commit of the following:
commit bc45fe3263d34ef5f746f524687999c19bf7b779
Author: Randy Heit <rheit@users.noreply.github.com>
Date: Sun Mar 1 18:51:05 2015 -0600
wave scale -> wave speed
commit ff96388b128c724c1198757bfa52f1935a263356
Author: Randy Heit <rheit@users.noreply.github.com>
Date: Sun Mar 1 18:45:32 2015 -0600
More sine quake fixes
commit 2a89749a6fe6d271b9fbdc218779f680afcf4cb6
Merge: 719dfbe 5456074
Author: MajorCooke <paul.growney22@gmail.com>
Date: Sat Feb 28 20:37:22 2015 -0600
Added QF_WAVE to A_QuakeEx.
- Changes the random quakes into a sine wave (see Shadow Warrior/Rise of the Triad reboots, Hard Reset, etc.)
- Added 3 properties to control waves per second along each individual axis. Only works with QF_WAVE.
- Intensity X/Y/Z property becomes the amplitude of the wave.
- Stacks with regular quakes, allowing shaking along the camera which must be called using A_QuakeEx WITHOUT the flag, or the other quaking functions.
- Uses the youngest quake's time for positioning.
commit 54560741581e8d15cc7060e8e068cf85e9a4b432
Author: MajorCooke <paul.growney22@gmail.com>
Date: Sat Feb 28 20:21:19 2015 -0600
Recommitted recommended changes by Randi, with some modifications. Now, we should be finished!
commit 6f4473013411686d88fc185bdc1cc58b1035b0f1
Author: MajorCooke <paul.growney22@gmail.com>
Date: Sat Feb 28 12:52:57 2015 -0600
Finish this revert.
commit 467e53f9400f588a2ada9b32e7634cb1f4ad5066
Author: MajorCooke <paul.growney22@gmail.com>
Date: Sat Feb 28 12:46:02 2015 -0600
Reverted back to what was working.
commit da9de56a67efda08036e481fd5fccd5392ce6810
Author: MajorCooke <paul.growney22@gmail.com>
Date: Thu Feb 26 18:53:20 2015 -0600
Forgot this bit, for testing.
commit c5093d9bb97caf8478cefc32abc56a036feeea58
Author: MajorCooke <paul.growney22@gmail.com>
Date: Thu Feb 26 18:52:46 2015 -0600
Some more progress, but...
- This did not solve anything. In fact, it did the opposite -- completely broke wave quakes. Now they only happen whenever a random quake is in progress.
- Left in the commented code on purpose so Randi can test it.
commit 7e526405d2127cbb279f66008c8f8e55a5d497f3
Author: MajorCooke <paul.growney22@gmail.com>
Date: Wed Feb 25 17:50:42 2015 -0600
- Use newest waveform timer, not oldest.
commit 1356443609dbc6c7f46e081d0846816dc0836124
Author: MajorCooke <paul.growney22@gmail.com>
Date: Wed Feb 25 17:32:09 2015 -0600
- Got regular quakes to multiply onto sine quakes, but the vice versa needs fixing too.
commit d95796c94c70cd0229d4a6d30f69e3a7568b9588
Author: MajorCooke <paul.growney22@gmail.com>
Date: Wed Feb 25 16:46:21 2015 -0600
- Last hurdle. Now just need to figure out how to properly scale up and down.
commit 4bc3458e689155ce72c09776604d9eb4fa73d8be
Author: MajorCooke <paul.growney22@gmail.com>
Date: Tue Feb 24 23:18:03 2015 -0600
- Fixed the quakes being unstackable.
commit b51012d6d4ea065bf7f6fc9c1a0472966491f7af
Author: MajorCooke <paul.growney22@gmail.com>
Date: Mon Feb 23 23:48:34 2015 -0600
QF_WAVE renamed from SINE.
- Lots of ground covered, but still more to go.
- Still need to figure out how to make the camera properly shudder.
commit 427e4893193470bbf45415ffec70a0b69b8cccfd
Author: MajorCooke <paul.growney22@gmail.com>
Date: Sun Feb 22 16:52:30 2015 -0600
- Begin the groundworks for QF_SINE.
- Need to figure out how to rework and manipulate the sine wave to move faster, and to allow going below 0 without breaking it too much.
- This is RandomPick but for floats. Considering what RandomPick
translates into in the scripting branch, I hope I don't regret not using
type inference on RandomPick instead of creating a new keyword.
- Unlocks the full potential of using quakes, including the Z axis. Each intensity applies to X/Y/Z planes whenever a player is experiencing it.
- Flags:
- QF_RELATIVE - Adjusts the quaking of the camera to go in the direction its aiming (X: forward/backward. Y: Left/right.)
- Plans for including pitch will be implemented in the future for the Z axis with relativity.
- "If it ain't broke, don't fix it."
- Some of the changes were downright wrong and some were pointless, so undo
everything that doesn't look like an actual improvement.
This reverts commit a4c07a9ee3.
- This commit touched every line of thingdef_codeptr.cpp, which would make
merging it into the scripting branch a pain in the ass.
- So now you can do something like this for an action:
{
if (health > 1000)
{
A_Scream;
}
else
{
A_XScream;
}
}
Yes, the braces are required. Because I see too many instances where
somebody writes an if statement in ACS and doesn't understand why it
doesn't work right because they forgot braces.
- Fixed: Not actually putting an action between { and } would crash.
- You can now call several actions from one frame by grouping them between
curly braces. i.e. :
POSS G 3 { A_Pain; A_Log("Ow! That hurt!"); }
I will probably add an `if (something) { blah; blah; } else { wah; wah; }`
construct later, but that's the extent of the munging I plan for DECORATE. The
real work goes to the scripting language, not here. But if this branch is
getting merged to master sooner than later, here's an immediate benefit
from it right now.
- The error "You cannot pass parameters to..." used the most recent token,
which was always ( and not the function name. (Note that this was
already fixed in the scripting branch, so this is probably going to be a
conflict. Meh.)
- Added A_Warp flags:
- WARPF_BOB: Gets the bob offset of actor pointer with the FLOATBOB flag.
- WARPF_MOVEPTR: The function is inversed to move the pointed actor with applied flags, but only the original caller will make the success/jump.
- The definition of FxGlobalFunctionCall_CheckClass was big and scary. I
would say this is a big improvement, since now it gets to leverage the
same framework that action functions use.
- The definition of FxGlobalFunctionCall_IsPointerEqual was not so big and
scary, so this can't be called so much of an improvement as
CheckClass was. (Which is not to say that it isn't better anyway.)
- This replaces the general extensibility that had existed formerly
in thingdef_function.cpp. Parameter parsing for function calls is
shared with state parameter parsing. Functions are defined exactly in
the same way as action functions, but without the 'action' keyword.
- Rippers will rip through anything with an equivalent ripper level, or if their level is between or on the min and max ranges.
- If no min or max is defined, it simply checks if the monster's ripper level is lower than the missiles.
- Functions: A_SetRipperLevel(int level), A_SetRipMin(int min), A_SetRipMax(int max)
- Properties: RipperLevel, RipLevelMin, and RipLevelMax.
- RipperLevel: Applicable to monsters and projectiles.
- RipLevelMin and RipLevelMax are only useful on monsters.
- By default, all are 0.
- Fixed: Integer constants passed to pick() need to manually generate load
instructions, since FxConstant::Emit() will just return a constant
register with its value.
- Fixed: VMFunctionBuilder::RegAvailability::Reuse() didn't actually
calculate a proper mask. Also added another assert to this function.
Conflicts:
src/CMakeLists.txt
src/b_think.cpp
src/g_doom/a_doomweaps.cpp
src/g_hexen/a_clericstaff.cpp
src/g_hexen/a_fighterplayer.cpp
src/namedef.h
src/p_enemy.cpp
src/p_local.h
src/p_mobj.cpp
src/p_teleport.cpp
src/sc_man_tokens.h
src/thingdef/thingdef_codeptr.cpp
src/thingdef/thingdef_function.cpp
src/thingdef/thingdef_parse.cpp
wadsrc/static/actors/actor.txt
wadsrc/static/actors/constants.txt
wadsrc/static/actors/shared/inventory.txt
- Added register reuse to VMFunctionBuilder for FxPick's code emitter.
- Note to self: Need to reimplement IsPointerEqual and CheckClass, which
were added to thingdef_function.cpp over the past year, as this file no
longer exists in this branch.
- Do a filter and species check first to save time.
- Added DMSS/KILS/RMVF_EITHER, which means if the actor is of type or species, it counts.
- A_DamageTarget(20,"Normal",DMSS_EITHER,"DoomImp","CyberdemonSpecies")
- This affects actor DoomImp, and anything that's of species CyberdemonSpecies.
- Added a little more documentation via comments.
- Added two more flags for each of the functions, EXFILTER and EXSPECIES.
- Stands for "exclude filter/species" and makes the function not take them into account.
- Cleaned up the code and placed all the checking in their own subfunctions.
- The wiki said the minimum distance to teleport defaults to 0, actor.txt on the other hand said otherwise. I was wondering why it was still broken somewhat...
- Prevent stickiness from happening, a.k.a. getting stuck in ceiling or floor and letting the engine unstick the actor. This caused velocity loss.
- TF_KEEPVELOCITY: Keep the velocity after teleporting.
- TF_KEEPANGLE: Don't use the special spot's angle.
- TF_USESPOTZ: Normally, this function
- TF_NOSRCFOG: Don't leave fog at the previous location.
- TF_NODESTFOG: Don't leave fog at the arriving location.
- TF_USEACTORFOG: Use the actor's TeleFogSourceType and TeleFogDestType properties.
- TF_NOJUMP: Don't require or cause a jump. In this case, put 0 (or "") in for the jump destination when using CustomInventory items to teleport actors around.
- Instead of reverting the teleport fog back to defaults, if there wasn't a class or if the class failed to be found, set it to NULL.
- P_SpawnTeleportFog will not spawn anything if it's NULL.
- Added "" so it can be used to mean 'don't change anything' for A_SetTeleFog.
- New properties include TeleFogSourceType and TeleFogDestType.
- TeleFogSourceType is the fog left behind where the actor teleported away from.
- TeleFogDestType is the fog the actor sees when it arrives at its destination.
- Added A_SetTeleFog(<oldpos>,<newpos>) -- oldpos sets TeleFogSourceType, newpos sets TeleFogDestType.
- CLOFF_SETTARGET | CLOFF_SETMASTER | CLOFF_SETTRACER
- An actor that causes A_CheckLOF (and only an actor) to succeed will set the intercepting actor as its target, master, and/or tracer, respectively.
- HITTARGET, HITMASTER, and HITTRACER.
- A missile that dies hitting an actor will set this impacted actor as the new target/master/tracer, depending on specifications.
- Added THRUREFLECT, MIRRORREFLECT, and AIMREFLECT. All require REFLECTIVE to work.
- THRUREFLECT prevents missiles from changing course if reflected, and takes precedence over all reflective flags.
- MIRRORREFLECT causes missiles to perform a direct 180 turn-around.
- AIMREFLECT turns the missile back to the original shooter, and does not slow the missile down.
- FTF_REMOVE: Removes the actor when the alpha hits a certain level.
- - A_FadeIn - 1.0
- - A_FadeOut - 0.0
- - A_FadeTo - Alpha target level reached
- FTF_CLAMP: Automatically fixes the alpha so it won't leave the range [0.0, 1.0].
-Fixed: ALLOWPAIN should not trigger pain states if the damage is 0, but still allow for infighting to occur.
-Fixed: an unneeded logic call was processing damage modification when it was 0 to begin with.
Monsters with this flag can enter pain states, regardless of
invulnerability or damage absorption.
- Fixed: god2 cheat wasn't being considered for drowning and thrusting.
- Added: A_TakeFromChildren
- Added: A_GiveToSiblings
- Added: A_TakeFromSiblings
- Added the following flags for A_RadiusGive:
- RGF_NOSIGHT: Exclude sight check from distance.
- RGF_MISSILES: Missiles can take inventory items.
Actors will be excluded from damage/radius thrusting of all sorts by
explosions or damage of any kind. They will also never deal impact
damage to other enemies, nor will they damage themselves from being too
close to a wall.
- RMVF_MISSILES removes missiles.
- RMVF_NOMONSTERS ignores monsters.
- RMVF_MISC includes non-monsters and missiles.
- RMVF_EVERYTHING disregards all checks and remove it.
These flags now apply to the following in addition to the new function:
-A_RemoveTarget
-A_RemoveMaster
-A_RemoveTracer
-A_RemoveChildren
-A_RemoveSiblings
Decorate: IsPointerEqual(int aaptr_selector1, int aaptr_selector2)
ACS: IsPointerEqual(int aaptr_selector1, int aaptr_selector2, int tid1 = 0, int tid2 = 0)
Compare the pointers values returned by two pointer select operations. Returns true if they both resolve to the same value. Null values can be explicitly tested using IsPointerEqual(AAPTR_NULL, ...)
ACS: IsPointerEqual(int aaptr1, int aaptr2, int tid1 = 0, int tid2 = 0)
This function lets you compare pointers from other actors than the activator, using tids. Tid1 determines the actor used to resolve aaptr1, Tid2 does the same for aaptr2. If tid1 and tid2 are equal, the same actor will be used for resolving both pointers (that could always happen randomly; this way you know it will happen).
- Added A_KillTarget(damagetype, int flags).
- Added A_KillTracer(damagetype, int flags).
- Added A_RemoveTarget.
- Added A_RemoveTracer.
A_Kill (Master/Target/Tracer/Children/Siblings):
- KILS_FOILINVUL: foils invulnerability.
- KILS_KILLMISSILES: destroys projectiles. Does not work on invulnerable
projectiles without KILS_FOILINVUL, and doesn't work at all on missiles
with NODAMAGE flag.
- KILS_NOMONSTERS: actors that are monsters will not be killed.
A_Damage (Self/Target/Master/Tracer/Children/Siblings):
- DMSS_FOILINVUL: foils invulnerability.
- DMSS_AFFECTARMOR: damages the actor's armor instead of bypassing it
entirely.
- DMSS_KILL: damages the actor by its remaining health (useful for
modular DECORATE programming).
- Added A_SpawnItemEx flags:
- SXF_SETTARGET: sets the calling actor as the target.
- SXF_SETTRACER: sets the calling actor as the tracer.
Both of these functions take priority similar to SXF_SETMASTER over
SXF_TRANSFERPOINTERS.
- The global symbol table was never marked by the GC, so anything pointed
only by it was fair game to disappear.
- Don't clear the global symbol table during DECORATE parsing. Junk in
there should be considered constant after initialization.
- Added CF_INTERPVIEW flag for players. A_SetPitch/A_SetAngle and the
similar ACS APROPs set this when changing an angle. This forces the
renderer to interpolate the view angles instead of updating with the
latest mouse positions. The effect lasts one tick.
- Constants can be strings, but the existing PSymbolConst couldn't handle
them. The old PSymbolConst is now PSymbolConstNumeric, and the new
PSymbolConst is a now a baseclass for it and PSymbolConstString.
- If a player is spying through another player, CheckPlayerCamera will
return the TID of the player you are "spying", but as coopspy isn't a
net command, this wont be reflected by all nodes. So to fix this,
CheckPlayerCamera now returns -1 if a player's camera is that of any
player at all. (thanks edward850)
- The type systems used by PField and FxExpression are completely
incompatible, but I think I got the differences taken care of as far
as ParseNativeVariable(), ParseUserVariable(), and FxClassMember are
concerned.
- Support for declaring native bool variables has been removed for the time
being. It wasn't used anyway.
- Removed PSymbolVariable.
- Instead of changing three places to turn disassembly dumps on and off,
do it with just one place. As a side effect, this now handles the case
where the dump file can't be opened.
Since I remember that 'memset/memcpy' is safe in this code, it should be okay to cast to the generic pointer all the 'virtual class' arguments before calling the above functions. Shuts up Clang warnings.
- For the purposes of getting constant values from expressions, the only
class where Resolve doesn't duplicate the functionality of
EvalExpression was FxConstant. So, every other class has had its
EvalExpression taken away, and FxConstant has had it renamed to GetValue.
- Now that the VM supports degrees, use those instructions when emitting
code for cos and sin DECORATE expressions. (This looks like it also
fixed a bug where sqrt also did the degree to radian conversion.)
- After StateParams was removed in commit 4a1fbdb, the expressions for
default paramaters that ParseActionDef() created went nowhere and were
lost. Properly throw them away by deleting them as soon as they've been
parsed.
- Removed EvalExpression() implementations from some subclasses of
FxExpression that don't make any sense in the context of evaluating a
constant value.
- This all became vestigial code after the relevant information was all
moved into FStateTempCall. Now that the MBF code pointer code has been
converted, I can be sure it wasn't still used anywhere.
DECORATE). Then you can use:
* Bounce
* Bounce.Floor
* Bounce.Ceiling
* Bounce.Wall
* Bounce.Actor
* Bounce.Actor.Creature
Partial matches work just like Pain states, so if an actor bounces off a floor and you don't
have a Bounce.Floor state, but you do have a Bounce state, it will use the Bounce state.
Conversely, if you only have a Bounce.Floor state but no Bounce state, then the actor will
only enter the Bounce.Floor state when it bounces on a floor; bouncing off anything else will
not cause it to change state.
SVN r4250 (trunk)
When set, the actor will run this state during its first tick. This means Spawn
states may now run an action function if you set this flag. Note that this action function
is executed during the actor's first tick, which is not the same as when it is spawned.
SVN r4240 (trunk)
whatever spawned the random spawner already took care of this.
- Added a maxdist parameter to P_CheckMissileSpawn() to help ensure that it doesn't completely
move the spawned missile outside of its shooter (and potentially beyond a wall the shooter
might happen to be standing next to).
SVN r4194 (trunk)
can perform based on the amount of damage actually taken after all modifications are done to
it. However, if the damage is canceled away, blood will still spawn for the original damage
amount rather than the modified amount.
SVN r4012 (trunk)
something that never autoaims, such as a railgun.
- Fixed: A_JumpIfTargetInLOS should use P_AimLineAttack() instead of P_BulletSlope(), because the
latter intentionally checks to the sides of the aimed line.
SVN r4007 (trunk)
- Changed Actor's Damage property into an actual function. All access to the damage property
must now be done through GetMissileDamage. actor->GetMissileDamage(0, 1) is equivalent
to the former actor->Damage, for the case where actor->Damage was not an expression. (I
suppose I will probably need to make a thunk for DECORATE expressions that want to read it.)
- Cleaned up some decorate expression evaluation functions that are no longer used.
SVN r3919 (scripting)
actors with names that conflicted with preceding actors from being freed, even though they
can still be accessed via PClassActor::AllActorClasses, which gets iterated over in a number
of places. (e.g. Zen Dynamics defines a Grenade actor, although there is one in zdoom.pk3 now.
The Zen Dynamics' version would not go in the TypeTable, so it would be collected on map load,
leading to a crash when attempts to access it through AllActorClasses are made.)
SVN r3908 (scripting)
one name in its label. This avoids the alloca and security cookie calls.
- Consolidated lots of copy-pasted code in thingdef_expression.cpp to install helper functions
into FindDecorateBuiltinFunction().
SVN r3907 (scripting)
become ungodly slow when using mods with complex DECORATE. The GCC debug builds run just
fine, however. Hopefully this is something that can be fixed later with an assembly-optimized
version of the main VM loop, because I don't relish the thought of being stuck with GDB
for debugging.)
- Fixed: The ACS_Named* action specials were erroneously defined as taking strings instead of
names.
- Fixed: Copy-paste error caused FxMultiNameState::Emit to generate code that called
DecoNameToClass instead of DecoFindMultiNameState.
- Updated FxActionSpecialCall::Emit for named script specials.
- Fixed inverted asserts for FxMinusSign::Emit and FxUnaryNotBitwise::Emit.
SVN r3893 (scripting)
I could be clever and have the beggar chase after you some after you attack him, with a
random chance to cease pursuit. However, that didn't look much different from his normal
wandering animation, and he usually gave up before getting anywhere near you, so it was
kind of pointless. I kept the action functions around anyway, since they're simple things that
somebody else might find useful.
- Added a melee range check to A_SentinelRefire for actors without missile states. This fixes
Strife's Beggar trying to attack you when you're nowhere near him.
SVN r3863 (trunk)
and RTF_NOTMISSILE so that you can use A_Explode and A_RadiusThrust with non-missiles without
them telling P_RadiusAttack() that the target is the source.
SVN r3860 (trunk)
POSS A 10 A_Look
You can define it as:
POSS A random(10,20) A_Look
and the state will last a random duration between 10 and 20 tics, inclusive.
SVN r3847 (trunk)
* GruntSpeed: The minimum speed a player must be falling at the time of landing to play *grunt.
* FallingScreamSpeed: When a player is falling within this range of speeds, they will play *falling.
SVN r3829 (trunk)
function will pass its results directly to this function's caller. Eventually, this should
be changed to do a proper tail call for scripted functions.
SVN r3769 (scripting)
pickup an item at all. (For instance, normally players in Hexen can still pick up other players'
weapons for ammo. With this flag set, they cannot do that either.)
SVN r3751 (trunk)
using it in in any expression would automatically downcast it to an int unless â‘ its sibling in the expression tree was a float, or â‘¡ it was the only thing in the expression.
SVN r3721 (trunk)
overridden in custom player classes by changing their Obituary property to something else.
- ClientObituary() now only looks up the obituary message from the killing player's weapon if the
damage type was 'Melee' or 'Hitscan'.
- Gave P_GunShot() and A_FireBullets the new damage type 'Hitscan'.
- Switched A_Saw and A_CustomPunch to the 'Melee' damage type.
SVN r3646 (trunk)
- Removed A_KSpiritWeave since it was basically identical to the function CHolyWeave (besides the random number generator object) and was never exported as a native action anywhere.
SVN r3631 (trunk)
its tracer so that it will look for a new target the next time it is called.
- Extended P_RoughMonsterSearch() with a flag to indicate that it should only search for seekable
targets.
SVN r3572 (trunk)
without resetting the actor's sector. The 3D floor checks in P_NightmareRespawn() and
A_RestoreSpecialPosition now use this.
- Fixed: P_NightmareRespawn() did its Z clamping before checking for 3D floors.
- Fixed: Respawning actors were not clamped to the ceiling.
SVN r3542 (trunk)
The initial spawn did not, so this can prevent respawns of things that were initially
spawned if they happen to intersect a wall.
- Fixed: Don't respawn actors inside the floor.
- Fixed: The final calls to P_FindFloorCeiling() in P_NightmareRespawn() and A_RestoreSpecialPosition
also need to pass true as the second parameter. (Because this parameter is onlyspawnpos, not
onlymidtex.)
SVN r3518 (trunk)
same situation A_RestoreSpecialPosition, it now just calls that to do the moving. This also
means it is no longer limited to respawning things on the floor.
SVN r3514 (trunk)
for multiplayer: They now always check through the eyes of every player. For players whose
cameras are not players, they also check through the eyes of those cameras.
- Using spynext/spyprev to switch from a non-player to a player now writes a command to the
network stream and lets Net_DoCommand() take care of it later. The logic here is that if
a player is viewing from something that isn't another player, then every player needs to know
about it for sync purposes. Consequently, when they stop viewing from a non-player and switch
to a player, everybody needs to know about that too. But if they are viewing from a
player, it doesn't matter which player it is, so they can spynext/spyprev all they want
without letting the other players know about it (and without potentially breaking demos--due
to the above-mentioned two codepointers--while doing it during demo playback).
- Replaced the instances of checking players[consoleplayer].camera for a valid pointer to
ones that do it for every player.
- Fixed: Upon changing levels, all players but the consoleplayer would have their cameras NULLed.
- Fixed: player_t::FixPointers() needs to bypass the read barriers, or it won't be able to
do substitutions of old objects that are pending deletion.
SVN r3448 (trunk)
- added DECORATE properties for accuracy and stamina.
- Since these changes move properties from player_t to AActor all savegame compatibility code was removed and the min. savegame version bumped.
SVN r3427 (trunk)
named the same as their ACS function equivalents. e.g. From DECORATE, you can now use
ACS_NamedExecuteAlways to run a script with a name.
SVN r3364 (trunk)
be made to clamp other actors' pitches to within the range (-90,+90)
degrees with the SPF_FORCECLAMP flag.
- Transmit the local viewpitch limits to the other players.
SVN r3323 (trunk)