XML:BINA/OBJC/TRGV: Difference between revisions

From OniGalore
< XML:BINA‎ | OBJC
Jump to navigation Jump to search
m (updated picture to link to wiki instead of external source)
(string comparison bug in TVs)
Line 175: Line 175:
|}
|}


===BSL bugs and workarounds===
====String comparison bug====
Trigger volumes can call bsl functions. This function can receive a string variable which contains the character name that triggered the trigger volume.
Unfortunately seems there are a bug when comparing this string parameter with another string variable in the BSL. Even if the trigger volume string and the other string are equal when you compare them in BSL it always returns false.
To reproduce the bug you can open "warehouse_level_scripts.bsl" in "EnvWarehouse" folder and replace the '''t65''' function by this one (make a backup of the file first):
    func void t65(string ai_name)
    {
        var string testVar = "char_0";
       
        dmsg(testVar);
        dmsg("char_0");
        dmsg(ai_name);
       
        sleep(100);
       
        if(testVar eq "char_0"){
            dmsg("regular string comparison works!");
        }
        else{
            dmsg("regular string comparison failed!");
        }
       
        if(ai_name eq "char_0"){
            dmsg("trigger volume string comparison worked!");
        }
        else{
            dmsg("trigger volume string comparison failed!");
        }
       
        dprint t65
        if(d6 eq 0)
        {
            message xdoorislocked
            dprint door_is_locked
        }
    }
Load savepoint 1 in chapter 1 and move the character until the door. This function will be triggered. What is the output that you expect? "trigger volume string comparison worked!" right? Wrong it will print "trigger volume string comparison failed!" even though both string variables have the same value.
[[Image:Trigger_volume_string_comparison_bug.jpg|300px]]
=====Possible workarounds=====
If you need to detect few characters and if all of these are from different teams you can clone the trigger volume one time for each character and call different functions one for each team. This way you make sure you know which character triggered the trigger volume since each character has a unique team and a unique trigger volume function.


===Mod Tool addon===
===Mod Tool addon===

Revision as of 13:41, 29 July 2017

TRGV : Trigger Volumes (TVs)
XML modding tips
  • See HERE to start learning about XML modding.
  • See HERE if you are searching for information on how to handle object coordinates.
  • See HERE for some typical modding errors and their causes.
XML.png
XML

AKEV << Other file types >> CONS

TMBD << Other BINA >> ONIE

TRIG << Other OBJC >> SNDG

switch to OBD page

general information

  • BINACJBOTrigger Volume.oni is level specific. (It can be found in AE/AEInstaller/vanilla/levelX_Final.dat)
  • The XML code on this page is based on onisplit v0.9.61.0


BSL support

show trigger activity

debug_triggers = 1 shows tv event and what character enters, stays inside or leaves

Resetting the trigger volume

trigvolume_reset (string tv_name) resets the TV to its preset state. The primary use of this is to re-enable "entry", "inside" or "exit" calls once the TV has been triggered (only necessary if the respective trigger-only-once flags are set of course). Note that some or all the TV functions are disabled at level load, you'll have to enable them manually after resetting the TV.

Removing corpses

trigvolume_corpse (integer tv_id) removes all corpses inside the specified trigger volume.


file structure

Trigger volume.jpg

The red and blue lines were added to the screenshot in a graphics program, not by debug_triggers.

If you have an updated Oni Mac engine, the TVs can be made visible.

Used BSL commands:

  • debug_triggers = 1
  • chr_nocollision 0 1
  • chr_debug_characters = 1
  • chr_location 0 x y z
<?xml version="1.0" encoding="utf-8"?>
<Oni>
   <Objects>
       [...]
   </Objects>
</Oni>

[...] means at least one trigger volume. Paste all tv data into there (this includes <TRGV Id="..."> and </TRGV> tag).

example

       <TRGV Id="7383">
           <Header>
               <Flags>Locked</Flags>
               <Position>-651.5666 -298 -633.4166</Position>
               <Rotation>0 0 0</Rotation>
           </Header>
           <OSD>
               <Name>trigger_volume_46</Name>
               <Scripts>
                   <Entry>train_block2</Entry>
                   <Inside></Inside>
                   <Exit>block_path</Exit>
               </Scripts>
               <Teams>255</Teams>
               <Size>46 31 46</Size>
               <TriggerVolumeId>46</TriggerVolumeId>
               <ParentId>0</ParentId>
               <Notes></Notes>
               <Flags>PlayerOnly</Flags>
           </OSD>
       </TRGV>
start      + size = end
- 651.5666 + 46   = -605.5666 = x_blue_line_end
- 298      + 31   = -267      = y_blue_line_end
- 633.4166 + 46   = -587.4166 = z_blue_line_end


tags

tag type description
<?xml version="1.0" encoding="utf-8"?> float, flag Don't change this.
<Oni> - XML root node
<TRGV Id="..."> integer You can also use <TRGV> without the id parameter.
<Header> -
<Flags> flag Used in the past.
<Position> float x3 TV is spawned at this xyz-position
<Rotation> float x3 TV has this xyz-rotation (in degrees)
<OSD> -
<Name> string can have up to 63 characters
<Scripts> - BSL functions; each can have up to 32 characters
<Entry> string called up when character enters the TV
<Inside> string called while character is inside the TV

This one is triggered at every frame (60 times per second) unless the trigger-only-once flag is set. Continuous triggering is typically needed for fire or gas damage.

<Exit> string called up when character leaves the TV
<Teams> flags
1 - Konoko
2 - TCTF
4 - Syndicate
8 - Neutral
16 - SecurityGuard
32 - RogueKonoko
64 - Switzerland
128 - SyndicateAccessory

Every combination is possible. E.g.:

255 - all teams (1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255)
<Size> float x3 volume
<TriggerVolumeId> integer used by BSL command "trigvolume_corpse ID"
<ParentId> integer not used ?
<Notes> string space for 128 characters
<Flags> flags
OneTimeEnter - entry function called only once (otherwise called every time character enters the TV)
OneTimeInside - inside function called only once (otherwise called at every frame while character is in the TV)
OneTimeExit - exit function called only once (otherwise called every time character leaves the TV)
EnterDisabled - entry function disabled (can be enabled with "trigvolume_enable tv_name entry 1")
InsideDisabled - inside function disabled (can be enabled with "trigvolume_enable tv_name inside 1")
ExitDisabled - exit function disabled (can be enabled with "trigvolume_enable tv_name exit 1")
Disabled - all 3 functions disabled (master switch, can be enabled with "trigvolume_enable tv_name all 1")
PlayerOnly - only player characters can fire off the TV

BSL bugs and workarounds

String comparison bug

Trigger volumes can call bsl functions. This function can receive a string variable which contains the character name that triggered the trigger volume.

Unfortunately seems there are a bug when comparing this string parameter with another string variable in the BSL. Even if the trigger volume string and the other string are equal when you compare them in BSL it always returns false.

To reproduce the bug you can open "warehouse_level_scripts.bsl" in "EnvWarehouse" folder and replace the t65 function by this one (make a backup of the file first):

   func void t65(string ai_name)
   {
       var string testVar = "char_0";
       
       dmsg(testVar);
       dmsg("char_0");
       dmsg(ai_name);
       
       sleep(100);
       
       if(testVar eq "char_0"){
           dmsg("regular string comparison works!");
       }
       else{
           dmsg("regular string comparison failed!");
       }
       
       if(ai_name eq "char_0"){
           dmsg("trigger volume string comparison worked!");
       }
       else{
           dmsg("trigger volume string comparison failed!");
       }
       
       dprint t65
       if(d6 eq 0)
       {
           message xdoorislocked
           dprint door_is_locked
       }
   }

Load savepoint 1 in chapter 1 and move the character until the door. This function will be triggered. What is the output that you expect? "trigger volume string comparison worked!" right? Wrong it will print "trigger volume string comparison failed!" even though both string variables have the same value.

Trigger volume string comparison bug.jpg

Possible workarounds

If you need to detect few characters and if all of these are from different teams you can clone the trigger volume one time for each character and call different functions one for each team. This way you make sure you know which character triggered the trigger volume since each character has a unique team and a unique trigger volume function.

Mod Tool addon

trigger volume manager

With OniTools.xsiaddon you can drag'n'drop BINACJBOTrigger Volume.oni into the viewport.

Add or remove TVs, edit position and rotation as if they were real objects. Change size by moving the polygons.

When ready, export the data as BINACJBOTrigger Volume.xml to a folder of your choice.