luks7n 12 Posted July 2, 2016 Hi folks, I'm trying to create a trigger that activates when 50% of the enemies are killed. I'm using this, but doesn't seems to work properly: ({alive _x && side _x == east} count thisList) <= ((({alive _x && side _x == east} count thisList))*0.5); What is wrong with this? Thanks! Share this post Link to post Share on other sites
POLPOX 778 Posted July 2, 2016 Two brackets are totally same! So, solution: ({not alive _x && side _x == east} count thisList) <= ((({alive _x && side _x == east} count thisList))*0.5); Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 2, 2016 Hi folks, I'm trying to create a trigger that activates when 50% of the enemies are killed. I'm using this, but doesn't seems to work properly: ({alive _x && side _x == east} count thisList) ) <= ((({alive _x && side _x == east} count thisList))*0.5); What is wrong with this? Thanks! if that is ur triggers condition then its nearly the same as if u would say (1 <= 0.5) can that condition be fullfilled? No. What u ve to know is how much enemies were in triggers area at start of the battle and then u could do something like this: {alive _x && side _x == east} count thisList < 0.5 * initial_enemy_count Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 2, 2016 Two brackets are totally same! So, solution: ({not alive _x && side _x == east} count thisList) <= ((({alive _x && side _x == east} count thisList))*0.5); thats not the solution. it is true if 10 enemies r dead and 100 are alive 10 <= 50 is true just to say this could be the solution: count (thisList select{not alive _x && side _x == east}) >= count (thisList select {side _x == east}) * 0.5 but u ve a problem if u ve a running cleaning script which deletes dead bodies. thats the reason why i would count enemies at start of battle. 1 Share this post Link to post Share on other sites
luks7n 12 Posted July 2, 2016 if that is ur triggers condition then its nearly the same as if u would say (1 <= 0.5) can that condition be fullfilled? No. What u ve to know is how much enemies were in triggers area at start of the battle and then u could do something like this: {alive _x && side _x == east} count thisList < 0.5 * initial_enemy_count Thanks for your help sarogahtyp That makes sense, I didn't think the way triggers keep checking condition. Also, I don't want to count all enemies every time I create a trigger like this, even to keep the mission funny to me. I thought on creating a little code that stores the initial enemy count inside some trigger and then, the same trigger uses this value to compare with the actual condition, but I don't know if that is possible. Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 2, 2016 do u have a running clean script which deletes dead bodies? if not use the solution of my last post. if u use such clean script just say and someone will think about :-) Share this post Link to post Share on other sites
luks7n 12 Posted July 2, 2016 (edited) thats not the solution. it is true if 10 enemies r dead and 100 are alive 10 <= 50 is true just to say this could be the solution: count (thisList select{not alive _x && side _x == east}) >= count (thisList select {side _x == east}) * 0.5 but u ve a problem if u ve a running cleaning script which deletes dead bodies. thats the reason why i would count enemies at start of battle. Tested and didn't work either, the condition is met only when I kill everyone. About the cleaning script, I think I can disable it without any further issues if the purpose is to make this work. EDIT: A very innocent code idea that I had before 1)Code: count_mytrigger = count (thisList select{not alive _x && side _x == east}) <- Stores the initial enemy count 2)Trigger ({not alive _x && side _x == east} count thisList) >= count_mytrigger Edited July 2, 2016 by luks7n Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 2, 2016 (edited) yeah correct. I tested it and now i think I know why.... deads r changing side to civilian... if u ve no other civilian there, use this: count (thisList select{side _x == civilian}) >= count (thisList select {side _x == east}) * 0.5 hmm ... not working. :unsure: this is tested and working: count (thisList select{side _x == civilian}) >= count (thisList select {side _x == east}) but as I said u should not have a clean up script working and there shouldnt be civilians in the trigger area!lol thats not working ... all dead bluefor will be counted as well... its harder to solve as thought at first. that leads me to a post of grumpy. it could be done with looking at configfile for the side... Edited July 2, 2016 by sarogahtyp 1 Share this post Link to post Share on other sites
luks7n 12 Posted July 2, 2016 (edited) yeah correct. I tested it and now i think I know why.... deads r changing side to civilian... if u ve no other civilian there, use this: count (thisList select{side _x == civilian}) >= count (thisList select {side _x == east}) * 0.5 hmm ... not working. :unsure: this is tested and working: count (thisList select{side _x == civilian}) >= count (thisList select {side _x == east}) but as I said u should not have a clean up script working and there shouldnt be civilians in the trigger area! What is the problem with * 0.5 then? Would be nice to be able to use this with another percentage, like 90% of dead enemies. I must count them, unfortunately :( Edited July 2, 2016 by luks7n Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 2, 2016 if 50 % r dead then the numer of deads is equal with the number of the alives. therfore no 50%. but as I described there is a bigger problem... Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 2, 2016 (edited) I thought it could be solved with this (led by grumpy) but it doesnt work and idk why actually: 0.5 * count (thisList select{[getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideType == east}) >= count (thisList select {side _x == east}) EDIT: condition is true if all easts r dead... idk why Edited July 2, 2016 by sarogahtyp Share this post Link to post Share on other sites
luks7n 12 Posted July 2, 2016 I thought it could be solved with this (led by grumpy) but it doesnt work and idk why actually: 0.5 * count (thisList select{[getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideType == east}) >= count (thisList select {side _x == east}) EDIT: condition is true if all easts r dead... idk why Looks like the count value is being overwritten when it goes to the second part: "count (thisList select {side _x == east})" And so, the trigger compare the same values...it's not being stored in one side and compared to the other side value. That's why I think this could only be solved by a script, where some variable sotres the first value and the trigger compares to it's own count. Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 2, 2016 Looks like the count value is being overwritten when it goes to the second part: "count (thisList select {side _x == east})" And so, the trigger compare the same values...it's not being stored in one side and compared to the other side value. That's why I think this could only be solved by a script, where some variable sotres the first value and the trigger compares to it's own count. sorry but thats nonsense. count is not a value but a functtion and yes its returning a value but what is a condition? a condition compares 2 values and my latest condition has a value on the left and a value on the right side. both r compared by the ">=". nothing is overwritten. but there is a logical error which can be solved. it is possible to do it tzhat way without storing the initial enemy count. Share this post Link to post Share on other sites
Larrow 2821 Posted July 2, 2016 Triggers do not report dead units in thisList. count ( allDeadMen select { _x inArea thisTrigger && !alive _x && ( [ _x ] call BIS_fnc_objectSide isEqualTo east ) } ) >= count ( thisList select { side _x isEqualTo east } ) 3 Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 2, 2016 Triggers do not report dead units in thisList. count ( allDeadMen select { _x inArea thisTrigger && !alive _x && ( [ _x ] call BIS_fnc_objectSide isEqualTo east ) } ) >= count ( thisList select { side _x isEqualTo east } ) thx for clarifying that and for BIS_fnc_objectSide :-) Share this post Link to post Share on other sites
luks7n 12 Posted July 2, 2016 Triggers do not report dead units in thisList. count ( allDeadMen select { _x inArea thisTrigger && !alive _x && ( [ _x ] call BIS_fnc_objectSide isEqualTo east ) } )>=count ( thisList select { side _x isEqualTo east } ) Didn't tested but thanks for the help larrow.This works for 50% right? If I want like 90% of dead enemies this gets a little bit more complicated I think... Do you think that is possible? Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 3, 2016 Finally this is tested and working: 0.8 * ( count ( allDeadMen select { _x inArea thisTrigger && ( [getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideType == east ) } ) + count ( thisList select { side _x == east })) >= count ( thisList select { side _x == east }) or this is the same: 0.8 * count ((allDeadMen select { _x inArea thisTrigger && ( [getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideType == east ) } ) + (thisList select { side _x == east })) >= count ( thisList select { side _x == east }) 0.8 is the the part of living enemies means 80 % r living and 20% have to be dead.for activating the trigger when 90% r killed u ve to choose 0.1 as factor. @larrow: I didnt get it work with BIS_fnc_objectSide. count always returned 1 while counting dead enemies.and here is the solution with saving the enemy count at mission start. this will work with an enabled cleanup script as well: your_global_init_count = count (allUnits select {side _x == east && _x inArea your_trigger_name}); count ( thisList select { side _x == east } <= 0.1 * your_global_init_count 1 Share this post Link to post Share on other sites
Larrow 2821 Posted July 3, 2016 @larrow: I didnt get it work with BIS_fnc_objectSide. count always returned 1 while counting dead enemies.I've just done some tests with BIS_fnc_objectSide, although the function is setup properly, to return a units proper side(side of the group it belongs to) if param 1 is false/not supplied, it seems as though dead units are decoupled from their group very quickly, making them grpNull which will make objectSide return side unit which as we know a dead unit is CIV. So objectSide is ok for use in things like killed EH but checking a unit that has been dead for a few seconds will return CIV. As a note this.. getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideTypeand [_unit,true] call BIS_fnc_objectSidedo the same thing, by getting a units config side, and the latter can make code shorter and easier to read. Share this post Link to post Share on other sites
luks7n 12 Posted July 4, 2016 Finally this is tested and working: 0.8 * ( count ( allDeadMen select { _x inArea thisTrigger && ( [getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideType == east ) } ) + count ( thisList select { side _x == east })) >= count ( thisList select { side _x == east }) or this is the same: 0.8 * count ((allDeadMen select { _x inArea thisTrigger && ( [getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideType == east ) } ) + (thisList select { side _x == east })) >= count ( thisList select { side _x == east }) 0.8 is the the part of living enemies means 80 % r living and 20% have to be dead. for activating the trigger when 90% r killed u ve to choose 0.1 as factor. @larrow: I didnt get it work with BIS_fnc_objectSide. count always returned 1 while counting dead enemies. and here is the solution with saving the enemy count at mission start. this will work with an enabled cleanup script as well: your_global_init_count = count (allUnits select {side _x == east && _x inArea your_trigger_name}); count ( thisList select { side _x == east } <= 0.1 * your_global_init_count Hi, I've tested the first two codes but they didn't work. Just to clarify, I put them on the condition box of a trigger activated by none but the trigger activated every time :/ My trigger pic: http://imgur.com/Df1K0Md EDIT: *WORKING*, the problem was with the NONE activation, thank you!!!!! :218: :ok: About the third code, I tried to put this on my init.sqf: counting_var = count (allUnits select {side _x == east && _x inArea trigger01}); and this on my trigger condition box: count ( thisList select { side _x == east } <= 0.1 * counting_var but no success. :( :( Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 4, 2016 sorry but im on holliday in greek now. cant test anything here. maybe larrow does. Share this post Link to post Share on other sites
sarogahtyp 1108 Posted July 4, 2016 Hi, I've tested the first two codes but they didn't work. Just to clarify, I put them on the condition box of a trigger activated by none but the trigger activated every time :/ My trigger pic: http://imgur.com/Df1K0Md EDIT: *WORKING*, the problem was with the NONE activation, thank you!!!!! :218: :ok: About the third code, I tried to put this on my init.sqf: counting_var = count (allUnits select {side _x == east && _x inArea trigger01});and this on my trigger condition box: count ( thisList select { side _x == east } <= 0.1 * counting_varbut no success. :( :( try this from debug console after mission start to check ur variable content:systemChat str counting_var; edit: missed a brace. this should work count ( thisList select { side _x == east } )<= 0.1 * your_global_init_count 1 Share this post Link to post Share on other sites
LifeSnatcher 2 Posted January 4, 2018 (edited) is this really solved?? if so, does it work for all Enemy Infantry? If it does why am i getting this error message "Error missing ]" when using this code. params ["_missionabrev", "_taskid"]; _v_taskname = _missionabrev + "EndTask"; _v_markername = _missionabrev + "Marker_1"; //create task SMEndTask = [west,[_v_taskname],["SideMission Update: Kill remaining Hostiles!", "SideMission Update: Kill remaining Hostiles!", "SideMission Update: Kill remaining Hostiles!"],getMarkerPos _v_markername,true,5,true,"attack",True] call BIS_fnc_taskCreate; your_global_init_count = count (allUnits select {side _x == east && _x inArea your_trigger_name}); count ( thisList select { side _x == east } )<= 0.1 * your_global_init_count; SMTrg_alldead = createTrigger ["EmptyDetector", getMarkerPos _v_markername]; SMTrg_alldead setTriggerArea [500, 500, 0, false]; SMTrg_alldead setTriggerStatements ["0.1 * ( count ( allDeadMen select { _x inArea thisTrigger && ( [getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideType == east ) } ) + count ( thisList select { side _x == east })) >= count ( thisList select { side _x == east });" , "SMEndTask = ['" + _v_taskname + "', 'SUCCEEDED',true] spawn BIS_fnc_taskSetState; ['" + _missionabrev + "', '" + _taskid + "'] call TLS_fnc_spawnEndSMFunc; ", ""]; SMTrg_alldead setTriggerTimeout [1, 1, 1, false] Edited January 4, 2018 by LifeSnatcher spelling and grammer Share this post Link to post Share on other sites
luks7n 12 Posted September 30, 2019 Hey! Yes. It was solved at the time. You can check my trigger picture to see how I used the code: https://imgur.com/Df1K0Md If I remember correctly I putted the condition code inside a trigger activated by None. I don't remeber right now if I set up some countdown (You can try it if it doesn't work) Quote 0.8 * ( count ( allDeadMen select { _x inArea thisTrigger && ( [getNumber (configfile >> "CfgVehicles" >> typeOf _x >> "side")] call BIS_fnc_sideType == east ) } ) + count ( thisList select { side _x == east })) >= count ( thisList select { side _x == east }) To work with all enemy infrantry just make sure that the trigger is encircling all of them. Sorry for the late response. 1 Share this post Link to post Share on other sites
zagor64bz 1225 Posted September 30, 2019 33 minutes ago, luks7n said: Sorry for the late response. Nah man...22 months is about right..average I would say. 🤣🤣🤣🤣 PS: I've had a similar issue, HERE, and was solved slightly differently: Just to recap... I had this working with a trigger: -variable name: trig01 -activation OPFOR -not present -condition: this or { (count thisList) <= (thisTrigger getVariable ["minAliveUnitsNumber", 0]) } On Act:- whatever you need to exec. In the init.sqf: _unitsNumber = { !(isPlayer _x) and { (side _x) == opfor } and { _x inArea trg01 } } count allUnits; trg01 setVariable ["minAliveUnitsNumber", ceil (0.2 * _unitsNumber)]; 4 1 Share this post Link to post Share on other sites