Jump to content
aseliot

Do something on unit spawn

Recommended Posts

This is about changing the gear of units spawned by another script from an addon.

 

I tried using a trigger with ANY and "this" but it doesn't seem to work for units being spawned in? Or maybe the trigger was too big (about 4500,3000).

There is an Init EH but is is only for configs.

There is also the HandleIdentity EH but then you need a reference to the unit being spawned.

 

So thing is the unit is spawned by an external script that is not mine and I have no handle to the unit.

 

Share this post


Link to post
Share on other sites

Well the best strategy would be to find the script where the unit was spawned. Then execute your own script inside the addon script with

0 = _unit execVM "YOURSCRIPT.sqf";

And then refer to it in your script with

_unit = _this;

Can you share the addon script?

Share this post


Link to post
Share on other sites

What were you trying to accomplish with the trigger?

Share this post


Link to post
Share on other sites
27 minutes ago, Midnighters said:

What were you trying to accomplish with the trigger?

 

Any unit that would enter the trigger would get a small gear change, but it fired only once for some reason (reapeating was on true) but it must've been a fluke, it doesn't seem to work for units that are spawned in for some reason.

 

1 hour ago, 7erra said:

Well the best strategy would be to find the script where the unit was spawned. Then execute your own script inside the addon script with.


Huh? I don't have access to the script, I am not allowed the change it the addon belongs to someone else. (Ravage)

Share this post


Link to post
Share on other sites

I guess a while true loop has to do then:

_yourLoadout = /*Your loadout however you saved it, preferrably with getUnitLoadout */
while {true} do {
	{
		_var = _x getVariable "LoadoutSet";
		if (isNil "_var") then {
			_x setUnitLoadout _yourLoadout; // Or whatever code
        	_x setVariable ["LoadoutSet", true];
		};
	} forEach allUnits;
	_unitCount = count allUnits;
	systemChat "TEST";
	waitUntil {_unitCount != count allUnits};
};

This was written in a rush and not tested, but you should get the idea

  • Like 1

Share this post


Link to post
Share on other sites
11 hours ago, 7erra said:

I guess a while true loop has to do then:

-snip-

This was written in a rush and not tested, but you should get the idea

 

Yeah that would work, although I don't like the thought of it looping through all the units all the time. I got it work your way.

 

But I would still like to try and use a trigger but it only keeps firing once for some reason... any ideas?

 

_gmasktrg = createTrigger ["EmptyDetector", (getMarkerPos "playablemrk")];
_gmasktrg setTriggerArea [_trgx, _trgy, 0, true];
_gmasktrg setTriggerActivation ["ANY", "PRESENT", true];
_gmasktrg setTriggerStatements ["this",
//code etc..

Already checked trgx,y they are something like 4500,3250 and based on playablemrk size. So it should just overlap the marker.

It only fires once for some reason although it is set on repeatable.

Share this post


Link to post
Share on other sites

0 = [] spawn {

  while {true} do {

    _theUnits= allUnits;

   waitUntil {sleep 0.5; count (allUnits - _theUnits) > 0};

  _newbies = allunits - _theUnits;

  hint str (_newbies);

}};

 

That works because no matter if allunits decreases due to dead men. [a,b,c] - [a,b,c,d] gives []. On the other hand, if one spawns (e) [a,b,e] - [a,b,c,d] gives [e] .

Then do what you need on the array of spawned units.

 

Share this post


Link to post
Share on other sites

I am now doing it like this as all spawned units are also added to the garbage collector.

 

0 = [] spawn {
  while {true} do {
    {
      if (_x isKindOf "CAmanBase") then {
          _gasmask = _x getVariable ["_hasGasmask",false];
          if (!_gasmask) then {
            removeGoggles _x;
            _x addGoggles (selectRandom spawnmasks);
            _x setVariable ["_hasGasmask",true];
          };
      };
    } forEach rvg_garbage_collector;
    _gcount = count rvg_garbage_collector;
    waitUntil { _gcount != count rvg_garbage_collector };
  };
};

 

Share this post


Link to post
Share on other sites
0 = [] spawn {
  while {true} do {
    _theUnits= allUnits;
    waitUntil {sleep 0.5; count (allUnits - _theUnits) > 0};
    _newbies = allunits - _theUnits;
    {
      removeGoggles _x;
      sleep 0.2;
      _x addGoggles (selectRandom spawnmasks)
    } forEach _newbies
}};

 

Add a short delay between remove something and add same thing; That helps in a forEach loop.

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

×