Jump to content

Recommended Posts

I've created a small script for lowering bollards and then raising them again but when I use the action on the bollard I receive the error that line 6 is missing a semicolon.

_type =  ["Land_Bollard_01_F"];
_playerCalling = vehicle player;
for [{_i=0},{_i < (count _bollards)},{_i=_i+1}] do
	{
		__bollards = _this nearObjects [_type select _i, 15];
		{setDamage 1;} forEach _bollards;
	};
hintSilent "Barrier Opened";
waitUntil {_playerCalling distance _type > 10};
for [{_i=0},{_i < (count _bollards)},{_i=_i+1}] do
	{
		__bollards = _this nearObjects [_type select _i, 15];
		sleep 1;
		{setDamage 0;} forEach _bollards;
	};
hintSilent "Barrier Closed";
sleep 5;
hint "";

I've tried to figure out what the problem is for an hour now but I can't work it out. Any help at all is appreciated.

  • Like 1

Share this post


Link to post
Share on other sites

In Line 6 you are missing the _x argument for setDamage.

{setDamage 1;} forEach _bollards;

{_x setDamage 1;} forEach _bollards;

The same error occurs in Line 14. 

 

Also be advised that you are defining __bollards (2 underscores) but referencing _bollards (1 underscore). 

  • Like 4

Share this post


Link to post
Share on other sites

Thankyou that seemed to have fixed the first problem but after reworking the code I realised I didn't need the loops(hopefully). I removed them and now I am getting an error with

_bollards = _this nearObjects [_type, 15];

I already removed the double underscore but now I am getting the error: "4 elements provided, 3 expected"

I tried wrapping from _this to the ned of the line with curly brackets but this cased an error with the forEach later in the code...

(I was getting this error before removing the loops)

 

Here is the edited code in case it would help:

_type =  ["Land_Bollard_01_F"];
_playerCalling = vehicle player;
		_bollards = _this nearObjects [_type, 15];
		{_x setDamage 1;} forEach _bollards;
hintSilent "Barrier Opened";
waitUntil {_playerCalling distance _type > 10};
		{_x setDamage 0;} forEach _bollards;
hintSilent "Barrier Closed";
sleep 5;
hint "";

 

Share this post


Link to post
Share on other sites

put this line above your problem code, you might find your own answer.

player sideChat format["_this = %1",_this];

use hint if you like

hint format["_this = %1",_this];

or my fav

diag_log format["_this = %1",_this];

or

player sideChat format["_type = %1 _playerCalling = %2  _bollards = %3 ", ["Land_Bollard_01_F"],vehicle player, _this nearObjects [_type, 15]];

 

Share this post


Link to post
Share on other sites

so what i've learned from that is _this doesn't actually contain the coordinates of the object that called the script... So can anyone tell me how to get the coordinates of the object calling the script?

 

Share this post


Link to post
Share on other sites

_bollards = (getPos _this) nearObjects [_type, 15];

Share this post


Link to post
Share on other sites

want to share how you are calling this script, are you passing anything to the script to use the _this variable

 

Share this post


Link to post
Share on other sites

I'm calling the script through an addaction on one of the bollards. I want to be able to just place a bollard anywhere on the map and add the addAction for it to just work. I'm not passing anything to the script for _this. It does still store info such as who called the script though.

Share this post


Link to post
Share on other sites
On 6/16/2018 at 12:52 AM, th3gingergamer said:

I then get the error "Type Array expected object,location"

 

waitUntil {_playerCalling distance _type > 10};

Most likely this line.

_type holds an array of strings, distance expects an object or location.

 

Cheers

  • Like 1

Share this post


Link to post
Share on other sites

Thanks for everyone who helped me with this. I finally fixed it. I changed _this to (_this select 0) and fixed that problem where _type was used instead of _this select 0.

Share this post


Link to post
Share on other sites

You can always use gamelogics and syncing to do stuff like this, instead of relying on any near commands. Here is a test composition.

In essence the compositions gamelogic is very similar to a module ( a gamelogic that runs code ) except it runs it from init, rather than a specified function, and of course it has no editor attributes.

Spoiler

nul = this spawn {
	params[ "_logic" ];
	
	_controller = synchronizedObjects _logic select{ _x getVariable[ "Controller", false ] } select 0;
	_table = synchronizedObjects _logic select{ _x getVariable[ "ControlTable", false ] };
	_table = ( [ _table, [ objNull ] ] select ( _table isEqualTo [] )) select 0;
	_bollards = synchronizedObjects _logic - [ _controller, _table ];
	
	if !( isNull _table ) then {
		_controller setDir getDir _table;
		_controller attachTo[ _table, [ 0, 0, ( boundingBoxReal _table select 1 select 2 ) + ( boundingBoxReal _controller select 1 select 2 ) ] ];
	};
	
	
	_controller addAction [ "Lower Bollards", {
			params [ "_target", "_caller", "_id", "_args" ];
			_args params[ "_bollards", "_logic" ];
			
			switch ( _logic getVariable [ "lowered", false ] ) do {
				case false : {
					for "_h" from 0 to 1 step 0.1 do {
						uiSleep 0.1;
						{
							_x setPosATL (( getPosATL _x ) vectorAdd [ 0, 0, -0.1 ] );
						}forEach _bollards;
					};
					_target setUserActionText[ _id, "Raise Bollards" ];
					_logic setVariable[ "lowered", true ];
				};
				case true : {
					for "_h" from 0 to 1 step 0.1 do {
						uiSleep 0.1;
						{
							_x setPosATL (( getPosATL _x ) vectorAdd [ 0, 0, 0.1 ] );
						}forEach _bollards;
					};
					_target setUserActionText[ _id, "Lower Bollards" ];
					_logic setVariable[ "lowered", false ];
				};
			};
			
		},
		[ _bollards, _logic ]
	];
};

Example code from the init of the compositions gamelogic

 

  • Like 1

Share this post


Link to post
Share on other sites

I'm using near commands for it since I'm quite new to scripting and I want it to work anywhere a group of bollards are placed. The script is just for fun mainly but also for a server I help with which is why I made it a script which is run from the addaction on one of the bollards. I've changed it from setDamage to setPos since it looks better and setDamage made them fall random directions. I'm currently going to modify the script so that it works on any object the addaction is put onto.

Share this post


Link to post
Share on other sites

Okay so i changed the script to use setPos instead. Every bollard has allowDamage false applied to it. After activating the script it seems like the bollards no longer have collisions. Anyone know what's going on? It also seems like the bollard with the addAction loses this addAction after it collides with a vehicle. This means if a car bumps into it then they become useless.

Edited by th3gingergamer
Added more info

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×