Jump to content
Benny.

[SP/MP] BeCTI

Recommended Posts

Hello BECTI fans! It turns out that the clouds not loading properly is a mission side error specific to BECTI. I know this because every other mission I play that has dynamic weather does not have this issue. If someone could tackle this problem and fix it, we would sincerely appreciate it!

Here's an example of the problem:

Share this post


Link to post
Share on other sites

Good evening, I'm Spanish and the text is translated by google translator, sorry.

'm using BECTI and I like a lot but I have no real players and home game with the AI ​​of the machine, is happening to me the error that the AI ​​of the enemy is not working properly, the enemy does not move across the map and not conquest positions someone already did that happen?

Share this post


Link to post
Share on other sites

Sari, did you manage to take a look at the HC problem? It would be a huge performance boost.

Share this post


Link to post
Share on other sites

Could someone help me please. I'm trying to change the way the occupation/resistance spawns. Atm you can upgrade your towns occupation force to maximum, race to the town depot with a tank or an apc, hide there and wait till you capture the town. This way your own sides occupation will spawn and defeat the resistance/occupation for you.

Share this post


Link to post
Share on other sites
Sari, did you manage to take a look at the HC problem? It would be a huge performance boost.

I tweaked a few things myself now. I implemented the old Server_AttemptDelegation from Arma 2 WFBE 2.072 v2 into your version of BeCTI, Sari. I changed the following:

private ["_candidates", "_groups", "_positions", "_side", "_teams", "_town"];

_town = _this select 0;
_side = _this select 1;
_teams = +[_this select 2];
_groups = +[_this select 3];
_positions = +[_this select 4];

_candidates = missionNamespace getVariable "CTI_HEADLESS_CLIENTS";

_delegated = false;
if !(isNil '_candidates') then {
_candidates_count = (count _candidates)-1;
if (count _candidates > 0 && count _groups > 0) then {
	//--- Mix it so that we have different HC clients all the time
	//if (count _candidates > 1) then {_candidates = (_candidates) call CTI_CO_FNC_ArrayShuffle};

	//--- Attempt to perform a load-balanced creation
	_delegation_table = [];
	for '_i' from 0 to _candidates_count do {
		if (_i >= count _groups) exitWith {};
		_delegation_table set [_i, []];
	};

	_index_hc = 0;
	for '_i' from 0 to count(_teams)-1 do {
		_delegation_table set [_index_hc, (_delegation_table select _index_hc) + [[_teams select _i, _groups select _i, _positions select _i]]];
		_index_hc = if (_index_hc+1 > _candidates_count) then {0} else {_index_hc + 1};
	};

	//--- Delegate the creation now
	{
		_owner_id = (_candidates select _forEachIndex) select 0;
		_group_hc = (_candidates select _forEachIndex) select 1;
		_uid = (_candidates select _forEachIndex) select 2;

		//--- Recompose
		_sub_teams = [];
		_sub_groups = [];
		_sub_positions = [];
		{
			[_sub_teams, _x select 0] call CTI_CO_FNC_ArrayPush;
			[_sub_groups, _x select 1] call CTI_CO_FNC_ArrayPush;
			[_sub_positions, _x select 2] call CTI_CO_FNC_ArrayPush;
		} forEach _x;


		[["CLIENT", leader _group_hc], "Client_OnTownDelegationReceived", [_town, _side, _sub_teams, _sub_groups, _sub_positions]] call CTI_CO_FNC_NetSend;

		if (CTI_Log_Level >= CTI_Log_Debug) then {
			["DEBUG", "FILE: Server\Functions\Server_AttemptDelegation.sqf", format["Delegating unit creation to Headless Client [%1] with owner ID [%2] in [%3] for [%4] team(s) on [%5]", _uid, _owner_id, _town getVariable "cti_town_name", count _sub_teams, _side]] call CTI_CO_FNC_Log;
		};
		// diag_log format ["delegating control to %1 of %2",_owner_id,_sub_teams];
	} forEach _delegation_table;

	_delegated = true;
};
};

_delegated

Into:

private ["_candidates", "_groups", "_positions", "_side", "_teams", "_town"];

_town = _this select 0;
_side = _this select 1;
_teams = +(_this select 2);
_groups = +(_this select 3);
_positions = +(_this select 4);

_delegated = false;
_candidates = missionNamespace getVariable "CTI_HEADLESS_CLIENTS";

if !(isNil '_candidates') then {
for '_i' from 0 to count(_groups) -1 do {
	["CLIENT", "Client_OnTownDelegationReceived", [_town, _side, [_teams select _i], [_groups select _i], [_positions select _i]]] call CTI_CO_FNC_NetSend;
};			
_delegated = true;
};

_delegated

Yes, I know looks strange, but what this really does, is disabling all that fancy "load-balanced creation" into a plump "create units on the HC without checking anything".

Results are interesting: No more discrepancy between AIL and AIR and finally a perfomance boost for the server. The con is that you can only use one HC with it.

Here is a screenshot of our server running with HC and over 300 AI's active:

VSYKt3V.png

Share this post


Link to post
Share on other sites
I tweaked a few things myself now. I implemented the old Server_AttemptDelegation from Arma 2 WFBE 2.072 v2 into your version of BeCTI, Sari. I changed the following:

private ["_candidates", "_groups", "_positions", "_side", "_teams", "_town"];

_town = _this select 0;
_side = _this select 1;
_teams = +[_this select 2];
_groups = +[_this select 3];
_positions = +[_this select 4];

_candidates = missionNamespace getVariable "CTI_HEADLESS_CLIENTS";

_delegated = false;
if !(isNil '_candidates') then {
_candidates_count = (count _candidates)-1;
if (count _candidates > 0 && count _groups > 0) then {
	//--- Mix it so that we have different HC clients all the time
	//if (count _candidates > 1) then {_candidates = (_candidates) call CTI_CO_FNC_ArrayShuffle};

	//--- Attempt to perform a load-balanced creation
	_delegation_table = [];
	for '_i' from 0 to _candidates_count do {
		if (_i >= count _groups) exitWith {};
		_delegation_table set [_i, []];
	};

	_index_hc = 0;
	for '_i' from 0 to count(_teams)-1 do {
		_delegation_table set [_index_hc, (_delegation_table select _index_hc) + [[_teams select _i, _groups select _i, _positions select _i]]];
		_index_hc = if (_index_hc+1 > _candidates_count) then {0} else {_index_hc + 1};
	};

	//--- Delegate the creation now
	{
		_owner_id = (_candidates select _forEachIndex) select 0;
		_group_hc = (_candidates select _forEachIndex) select 1;
		_uid = (_candidates select _forEachIndex) select 2;

		//--- Recompose
		_sub_teams = [];
		_sub_groups = [];
		_sub_positions = [];
		{
			[_sub_teams, _x select 0] call CTI_CO_FNC_ArrayPush;
			[_sub_groups, _x select 1] call CTI_CO_FNC_ArrayPush;
			[_sub_positions, _x select 2] call CTI_CO_FNC_ArrayPush;
		} forEach _x;


		[["CLIENT", leader _group_hc], "Client_OnTownDelegationReceived", [_town, _side, _sub_teams, _sub_groups, _sub_positions]] call CTI_CO_FNC_NetSend;

		if (CTI_Log_Level >= CTI_Log_Debug) then {
			["DEBUG", "FILE: Server\Functions\Server_AttemptDelegation.sqf", format["Delegating unit creation to Headless Client [%1] with owner ID [%2] in [%3] for [%4] team(s) on [%5]", _uid, _owner_id, _town getVariable "cti_town_name", count _sub_teams, _side]] call CTI_CO_FNC_Log;
		};
		// diag_log format ["delegating control to %1 of %2",_owner_id,_sub_teams];
	} forEach _delegation_table;

	_delegated = true;
};
};

_delegated

Into:

private ["_candidates", "_groups", "_positions", "_side", "_teams", "_town"];

_town = _this select 0;
_side = _this select 1;
_teams = +(_this select 2);
_groups = +(_this select 3);
_positions = +(_this select 4);

_delegated = false;
_candidates = missionNamespace getVariable "CTI_HEADLESS_CLIENTS";

if !(isNil '_candidates') then {
for '_i' from 0 to count(_groups) -1 do {
	["CLIENT", "Client_OnTownDelegationReceived", [_town, _side, [_teams select _i], [_groups select _i], [_positions select _i]]] call CTI_CO_FNC_NetSend;
};			
_delegated = true;
};

_delegated

Yes, I know looks strange, but what this really does, is disabling all that fancy "load-balanced creation" into a plump "create units on the HC without checking anything".

Results are interesting: No more discrepancy between AIL and AIR and finally a perfomance boost for the server. The con is that you can only use one HC with it.

Here is a screenshot of our server running with HC and over 300 AI's active:

http://i.imgur.com/VSYKt3V.png

your CPS on the second graph IE the lowest graph is way way too low

its important that that the cps mirrors the fps with a deficit max of 10

Server may well run at 50fps but with a cps of 17 clients would suffer

Share this post


Link to post
Share on other sites
your CPS on the second graph IE the lowest graph is way way too low

its important that that the cps mirrors the fps with a deficit max of 10

Server may well run at 50fps but with a cps of 17 clients would suffer

That's due to an addon. It has been removed.

Share this post


Link to post
Share on other sites
That's due to an addon. It has been removed.

Ok my bad didn't notice the second graph was HC either so ignore my drunken ramblings

Share this post


Link to post
Share on other sites
Ok my bad didn't notice the second graph was HC either so ignore my drunken ramblings

Haha, no problem dude. Here's a screenshot without that nasty addon.

(Side note: HC is the top graph) ;)

rEwr89h.png

Share this post


Link to post
Share on other sites

Nice work gabber, shall have to give it a spin at some point! Haven't had much time since I posted the mission the other week, done very little to it since.

Do you have any ASM comparison shots with HC on and off?

Edited by Sari

Share this post


Link to post
Share on other sites

not bad results for 360 ish AI

Share this post


Link to post
Share on other sites
Nice work gabber, shall have to give it a spin at some point! Haven't had much time since I posted the mission the other week, done very little to it since.

Do you have any ASM comparison shots with HC on and off?

Nope because that results in an unexpected crash of both the server and the hc. I think I forgot that the HC needs to register to the server somehow, so the units get send to the server if the hc is disconnected.

Benny used this in his Server_AttemptDelegation.sqf:

_owner_id = (_candidates select _forEachIndex) select 0;

_group_hc = (_candidates select _forEachIndex) select 1;

_uid = (_candidates select _forEachIndex) select 2;

[["CLIENT", leader _group_hc], "Client_OnTownDelegationReceived", [_town, _side, _sub_teams, _sub_groups, _sub_positions]] call CTI_CO_FNC_NetSend;

I'm not sure on how to alter this to get it working again, with a maximum of one hc.

EDIT: I think I found a way to get it working. Testing now...

EDIT 2: It does work now but...

8SHyxNL.png

As you can see the performance of the server goes down with the HC

PHWHnFU.png

After triggering some more AI's the FPS get even worse

3P1lSt6.png

The HC hits 0 CPS and FPS and the server almost does the same.

s28D5YP.png

And finally disconnecting the HC does not kill the server but instead it slowly recovers its performance.

The problem imo is that the way benny implemented the HC is bad. It does report back way too much information. It constantly send's all spawned AI classnames, teams, groups and positions to the server. And if this gets interrupted, as i tried before, the town occupation and resistance do not despawn, but instead crash the hc and the server. Finally all we can do is wait for benny to take a look at this, but I personally do not think that benny will return. HC is broken and useless.

Edited by gabberxxl
UPDATE

Share this post


Link to post
Share on other sites

Quickly on the HC and drop of performances.

From my experience a remote AI is more costly in terms of server fps than a local unit, that migth be due to the netcode of A3.

From a more theoretical POV, putting AI on remote is wrong because one AI can be viewed as a pseudo synchronous thread of the server that need to be somehow resynchronised during the main cycle of the game. So, if you want a real performance boost with HC, you need to rather put asynchonous stuff in it (event based). So what would be preferable is to put all public variable handlers and all scheduled enviroment script that can be ran on global inside the HC.

The way people think of the HC is IMO wrong, and goes against every principle of concurencies that can be found in Computer Science. If something is heavily synchronised, you try not to put delays at each synchronisations.

But once again, those are only deductions, without real knowledge on how A3 deal with all that stuff, it is nearly imposible to determine what will be the best use of the HC.

Share this post


Link to post
Share on other sites

I was under the impression that the HC concept itself was essentially a hacky way of allowing the server to process ai on more cpu cores, so i guess its never going to be perfect.

I had forgotten BL1P tested the HC on a very simple server stress test mission and still got worse performance a while back (link), so it seems zerty is right in that remote AI in Arma 3 are more costly

Share this post


Link to post
Share on other sites

I see, so I was wrong for blaming benny. It's pretty disappointing that you can't get more performance by using a hc

Share this post


Link to post
Share on other sites

Did lots of tests using the AIserverBenchmark.

Ran with HC and Server on Same box using affinity to separate cores.

Ran with HC and Server on two different machines but on local connection.

Ran all tests with different settings :- 100% AI on HC or 50/50 AI spread on HC and Server.

All tests showed for me that at the time using HC gave no better results to than Server alone when putting AI on the HC.

I would agree with Zerty that using HC to run certain scripts would maybe be more beneficial than using the HC for AI.

Share this post


Link to post
Share on other sites
Did lots of tests using the AIserverBenchmark.

Ran with HC and Server on Same box using affinity to separate cores.

Ran with HC and Server on two different machines but on local connection.

Ran all tests with different settings :- 100% AI on HC or 50/50 AI spread on HC and Server.

All tests showed for me that at the time using HC gave no better results to than Server alone when putting AI on the HC.

I would agree with Zerty that using HC to run certain scripts would maybe be more beneficial than using the HC for AI.

This makes me wonder, what scripts should be run on the server in becti, to help server performance.

Share this post


Link to post
Share on other sites

Benny how do i add new vehicles to the factories? i need some kind fo step by step guide if anyone can help?

Share this post


Link to post
Share on other sites

Hi, great mod and we've been enjoying it immensely!

But I have two issues. First, after moving the HQ APC to another location, any time I try to build a structure is says "Base area limit has been reached" and won't place. I sold all other structures and disbanded distant workers, but it didn't make any difference. I drove about 800 meters away and tried again, same thing.. Now we're stuck many hours into an Altis campaign with no structures and no idea what to do.

I can see a limit to keep from spamming structures all over the place.. But now we have none, so the limit seems kind of weird? Maybe I could drive back to the area near where the first structure was built but it's so far out of the way it'll be terrible to be stuck there in a place as big as Altis and since all others structures are gone.. Is the parameter "Base Startup Limit" what I need to change? Will it make an AI army build structures all over the place or is it purely to prevent human abuse?

EDIT: I changed the parameter to 20km and it still isn't working. The default was 15km. Where I was trying to set up was about 13.1km from where the HQ spawned on the map at the beginning of the game, which is in range of both the default setting and the newly increased one??

EDIT2: I drove the HQ way back less than 7km from where it started and I still can't build structures, and I know for sure this is a good deal closer than a barracks I had previously built. When I got back within 6km or so of the starting area to be able to build again. Some kind of bug?

The next issue is every now and then, increasing in frequency and intensity the farther along the game is, even after restarts, the game will drop to extremely low FPS for anywhere from 8-30 seconds. It seems worse near the base/HQ APC. This occurs both if I am host and when I am not the host. Otherwise, I've gotten Arma3 to run quite well and my PC far exceeds the recommended specs. It gets down to single digit FPS at times and occurs even without any action for kilometers around, and only a few AI troops in the area. Seems to get better the farther from the HQ I get. Very strange. I should also report that I've been the commander each of these times.

Edited by BoogieManFL

Share this post


Link to post
Share on other sites

Does anyone know how i would go about adding a vehcile to a factory please?

Share this post


Link to post
Share on other sites

KNOWN ISSUES:

Missing Scripting Commands to load the current magazine of a weapon

I saw somewhere that if you first add the magazines before adding the gun (or just 1 mag), the gun should be loaded and ready. Not sure if this helps.

Share this post


Link to post
Share on other sites

Can anyone help me with the process of porting Becti 0.97 to another map like Takistan or Chernarus? Has it already been done? I've searched all over but haven't been able to find any version of it. I tried changing the Altis version to Takistan and moving/renaming the towns in the map editor but when I start the game I get several script errors and then the game ends saying I've won. Any help would be greatly appreciated.

Share this post


Link to post
Share on other sites
Can anyone help me with the process of porting Becti 0.97 to another map like Takistan or Chernarus? Has it already been done? I've searched all over but haven't been able to find any version of it. I tried changing the Altis version to Takistan and moving/renaming the towns in the map editor but when I start the game I get several script errors and then the game ends saying I've won. Any help would be greatly appreciated.

Just given this a quick try it worked fine for me. I did a select all > copy from altis to chernarus in the editor, ensured that everything (including the spawn/respawn markers) was within the map boundaries and not over water, saved, copied everything bar the mission.sqm from the altis mission folder to the new chernarus mission folder, reloaded the chernarus mission in the editor, selected a playable unit, hit preview and voila!

Having said that my guess is that when you were renaming the towns, you accidentally deleted a comma or something and it had a hissy fit.

Share this post


Link to post
Share on other sites
Just given this a quick try it worked fine for me. I did a select all > copy from altis to chernarus in the editor, ensured that everything (including the spawn/respawn markers) was within the map boundaries and not over water, saved, copied everything bar the mission.sqm from the altis mission folder to the new chernarus mission folder, reloaded the chernarus mission in the editor, selected a playable unit, hit preview and voila!

Having said that my guess is that when you were renaming the towns, you accidentally deleted a comma or something and it had a hissy fit.

Thank you Sari. I'm not sure what I was doing wrong but I had several different problems. At one point when I launched the game everything spawned about 20 feet up in the air and then came crashing down, killing the player before the game started.

However, following your method seems to work perfectly so thanks!

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

×