Jump to content

Recommended Posts

Hey guys. I have been pulling my hair out trying to get this to work for the last 2 days and decided I really need help here. 

I have a mission using JEBUS spawn scripts that spawn infantry to certain sectors depending on if the enemy is present in those sectors. I play as Zeus and have a set amount of resources to try and bleed the enemy out of tickets before they defeat me.

In init.sqf I have this in the code:  
 

[east, 600] call BIS_fnc_respawnTickets; [independent, 300] call BIS_fnc_respawnTickets;


EAST_KILLED = {private []; if (isServer) then {[east, -1] call BIS_fnc_respawnTickets;};}; {if (side _x == east) then {_x addEventHandler ["Killed", EAST_KILLED];};} forEach AllUnits;


INDEP_KILLED = {private []; if (isServer) then {[independent, -1] call BIS_fnc_respawnTickets;};}; {if (side _x == independent) then {_x addEventHandler ["Killed", INDEP_KILLED];};} forEach AllUnits;


while {true} do {

{
deleteVehicle _x;
sleep 0.01;
} forEach allDeadMen;

sleep 600;

};



In order to give 600 tickets to OpFor, 300 to Independent, subtract a ticket for each killed, and cycle to clean up the dead bodies after a set time to reduce lag. The ticket deduction works fantastic if units are not spawned in and are placed on the map prior.

I finally got it to work with spawned units by placing an opfor soldier named en1 that spawns in with the rest of the guys, placed him on a far off island away from everything, and put this in his init field 

 

0 = [this, "LIVES=", [100,101]] spawn jebus_fnc_main;

0 = [this, "INIT=", "[en1, 'agia'] execVM 'subtractTicket.sqf'"] spawn jebus_fnc_main;

So I removed the code to subtract the tickets from those killed in the init.sqf and added it in subtractTicket.sqf I have:

 

EAST_KILLED = {private []; if (hasInterface) then {[east, -1] call BIS_fnc_respawnTickets;};}; {if (side _x == east) then {_x addEventHandler ["Killed", EAST_KILLED];};} forEach allUnits; 


INDEP_KILLED = {private []; if (isServer) then {[independent, -1] call BIS_fnc_respawnTickets;};}; {if (side _x == independent) then {_x addEventHandler ["Killed", INDEP_KILLED];};} forEach AllUnits;

This works great for the first units spawned, however if I kill them, then upon respawning they no longer deduct tickets. Only the first wave spawned actually deduct tickets.

 


Lastly, I tried to loop the code via a script like this in subtractTicket.sqf:

while {true} do {

EAST_KILLED = {private []; if (hasInterface) then {[east, -1] call BIS_fnc_respawnTickets;};}; {if (side _x == east) then {_x addEventHandler ["Killed", EAST_KILLED];};} forEach allUnits; 


INDEP_KILLED = {private []; if (isServer) then {[independent, -1] call BIS_fnc_respawnTickets;};}; {if (side _x == independent) then {_x addEventHandler ["Killed", INDEP_KILLED];};} forEach AllUnits;

sleep 5;

};


The issue is that it compounds each time it's looped, so every 5 seconds the amount of tickets deducted increases and suddenly one person killed subtracts dozens of tickets after a short time. 

I went through every forum I could about spawned units deducting tickets and the closest I found to a solution was here: https://forums.bohemia.net/forums/topic/191209-problem-with-getting-ai-to-reduce-tickets-on-death-in-sector-control/


But got lost since I'm very new to scripting and I'm not using the spawn module, so I have no expression field like it does and don't know the equivalent of an expression field for what I'm trying to do with JEBUS. 

If anyone can point me in the right direction that would be greatly appreciated. I tried to use all the resources I could before having someone check this out for me that knows what they're doing. I'm sorry if the answer is pretty obvious, I'm sure there's something I'm overlooking and there's also probably redundancy in the code I have gathered and compiled off the internet, lol. Thanks!

Share this post


Link to post
Share on other sites

Every five seconds, you are adding a killed EH to every East and Independent unit. After a few minutes, you have dozens of these EHs firing when a unit is killed.

 

A better approach might be to start with the killed EH (or maybe entityKilled MEH). 

 

In initPlayerLocal.sqf:

addMissionEventHandler ["EntityKilled", { 
	params ["_unit", "_killer", "_instigator", "_useEffects"]; 
	_side = side group _unit;
	if (local _unit) then {
		[_side, -1] call BIS_fnc_respawnTickets; 
	};
}];

Or something like that. I don't use JEBUS and have never set up a scripted ticket system.

 

Depending on the mission, you might also need to run it on the server.

Share this post


Link to post
Share on other sites

Or maybe the EntityRespawned MEH would be better, since it won't fire until the ticket is actually used (on respawn).

addMissionEventHandler ["EntityRespawned", {
	params ["_newEntity", "_oldEntity"];
	_side = side group _newEntity;
	if (local _newEntity) then {
		[_side, -1] call BIS_fnc_respawnTickets; 
	};
}];

Again, just spitballing here, none of this is fully tested in any environment.

Share this post


Link to post
Share on other sites

Keep in mind that JEBUS doesn't respawn units in the same sense that players respawn. They're completely new units. 

 

So your event handler would need to be added to the new units with the "INIT=" parameter.....

  • Like 1

Share this post


Link to post
Share on other sites

Thanks for the responses everyone, after work I will give these ideas a shot. 

 

Quote

So your event handler would need to be added to the new units with the "INIT=" parameter.....


Sorry for asking you to break this down so a toddler can understand it... but what would that look like? I tried accomplishing that when I put this line in the Opfor dude that's far off. 

0 = [this, "INIT=", "[en1, 'agia'] execVM 'subtractTicket.sqf'"] spawn jebus_fnc_main;

What should I put in after the "INIT=", parameter?

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

×