In Mysteries of the Sith, any COG can analyze, define, disable, enable or otherwise manipulate the messages that are sent by the user, from peripherals like the keyboard and mouse, to the game. For example, a cog that is set up this way can determine when the player is moving, firing, when an item is used, when the camera mode is switched - even when the autosave function is used, and disable these messages or modify their outcome. This ability must be activated like so:
SetActionCog(GetSelfCog(), 0x7fffffff);
and also present in this cog must be the message:
message playeraction
All player actions are now passed to this message as a combination of parameters. Using the verb:
GetParam(flex);
in the playeraction message will return values which can be interpreted into all the possible actions the user can make from his/her control devices. Basic modification of the outcomes of these actions take place as a ReturnEx() statement, where ReturnEx(0.0) disables actions from being interpreted by the game, and ReturnEx(1.0) permits actions to be passed through to the game. To disable parameter passing to the playeraction message, one must run the following:
SetActionCog(GetSelfCog(), 0);
(GetSelfCog() can also be substituted with the integer (-1) to equivalent effect.)
In the following examples, understand that parameter(0) having a value of 0.0 is the parameter that is passed when the Jump key is pressed/activated. In all cases, assume that
has been executed, enabling parameters passing to the playeraction message.SetActionCog(GetSelfCog(),0x7fffffff)
Example 1
... Playeraction: Return; ...
Resolution: All actions will pass through unaffected.
Example 2
... Playeraction: if(GetParam(0) == 0.0) ReturnEx(0.0); else ReturnEx(1.0); Return; ...
Resolution: The if statement checks see if what the user just did was to press the jump key - because all actions are passed through this cog, this statement checks all actions that are executed. If the action that was executed IS jump, then the ReturnEx(0.0) statement DISALLOWS the jump action to be passed on to the game; the player will not jump. The else condition carrying the ReturnEx(1.0) statement ensures that any OTHER action that is executed is passed through to the game unhindered.
If the ReturnEx() statements were reversed - that is to say the first (in the if condition) was (1.0) and the and the second (in the else condition) was (0.0), then only the Jump action would be expressed and all other actions would be BLOCKED. Essentially the only thing the user could make the player do was jump and that's all.
So, we see that using if statements, we can selectively block and let pass any action sent by the user to the game. If we take this a step further, we can block the outcome of an action and re-define it so some other outcome is observed. The following are examples of this:
Example 3
... Playeraction: if(GetParam(0) == 0.0) { ; Print("The Jump key was pressed, but it makes us crouch!"); SetParam(0, 1.0); } ReturnEx(1.0); Return; ...
Resolution: Any time the jump key is pressed, the if statement kicks in and prints "The Jump key was pressed, but it makes us crouch!", then SetParam(0, 1.0) changes the jump action to a crouch action - so the player will crouch instead of jumping when the jump key is pressed.
Example 4... Playeraction: ReturnEx(0.0); print("You can't do anything till I say so!"); Return; ...
Resolution: All actions are blocked - the user can't make the player do anything, and to add insult to injury, "You can't do anything till I say so!" will be printed any time an action is attempted. :-)
The following is a list of all known actions and their parameters that can be passed to the game from the user. Keep in mind that many if not all actions have more than one parameter to describe the action.
Playeraction Parameter List with Definitions
Action Param(0) (1) (2) Jump 0.0 --- 1.0 in air 0.0 when landed Crouch 1.0 --- 2.0 in crouch 0.0 when standing Use/Nudge 2.0 --- 1.0 always Fire (Primary/Second) 3.0 --- 0.0 = primary fire 1.0 = secondary fire Strafe (left/right) 4.0 --- VALUE = VELOCITY (instant.) (unknown units) + value = right - value = left value = 0.0 when stopped maximum = 2.0 (defined in walkplayer template?) Turn (left/right) 5.0 --- VALUE = RATE (instant.) (deg/s ?) + value = left - value = right value = 0.0 when stopped keyboard maximum = about |180.37| deg/s mouse maximum = thousands :-) Forward/Backward 6.0 --- VALUE = VELOCITY (instant.) (unknown units) + value = fwd - value = bwd maximum = 4.0 (defined in walkplayer template?) minimum = -2.0 value is halved when "slow" is enabled Select Weapon 7.0 0.0 13.0 = lightsaber / fist 14.0 = bryar pistol / DL-44 15.0 = st rifle / scope rifle 16.0 = detonator / flash bomb 17.0 = bowcaster / (para bowcaster) 18.0 = repeater / (para repeater) 19.0 = rail gun / seeker rail 20.0 = sequencer / manual seq. 21.0 = concussion rifle / (para concussion) 22.0 = carbon gun / (para carbon) 1.0 1.0 = select next weapon -1.0 = select previous weapon Pitch 8.0 VALUE = RATE (deg/s ?) VALUE = DEGREE +value = up +value = up -value = down -value = down (mouse value is multiple 0.0 = straight ahead of 40) ?? 9.0 Select Inventory -bracket 10.0 1.0 = default / "on" 1.0 = store next inventory bin for activation -1.0 = store previous bin for activation Select Skill -bracket 11.0 1.0 = default / "on" 1.0 = store next skill bin for activation -1.0 = store previous skill bin for activation Use Selected Inventory 12.0 1.0 = item key pressed VALUE = BIN OF SELECTED or HOTKEY INVENTORY Use Inventory (hotkey) 2.0 = item key subsequently held 0.0 = item key released Use Selected Skill 13.0 1.0 = skill key pressed VALUE = BIN OF SELECTED or HOTKEY SKILL Use Skill (hotkey) 2.0 = skill key subsequently held 0.0 = skill key released Misc Activation 14.0 0.0 0.0 = cycle camera 1.0 = ??? 2.0 = quicksave (+/- 1.0 = big/small) ---> 3.0 = screensize 4.0 = next brightness level 5.0 = ??? 6.0 = take screenshot
On a final note, understand that only one playeraction message can be run at a time by ANY cog. Any new instances of the SetActionCog(-1, 0x7fffffff) verb will direct user actions to the new cog instance, while remaining instances are disabled or ignored.
Happy Cogging!