Jump to content

Northup

Member
  • Content Count

    51
  • Joined

  • Last visited

  • Medals

Everything posted by Northup

  1. Northup

    ChatGPT is Awesome

    It certainly helps bridge the curiosity gap that would otherwise compel some to give up, but it has way too many issues to be reliable. It invents commands that don't exist, and will then gaslight you about their existence. It has trouble understanding more of the convoluted ways Arma works under the hood. Like anything, it does a lot better if you do things in very small segments with lots of logging. It will insist your defined variable lack of capitalization is the issue, especially when it isn't.
  2. Hmm. Might make use of setterrainheight and triggers. Name the triggers something like terrainTrigger_%1. Make sure trigger c - trigger area Z size is 0.002, set itz height pos to 0. Make sure it is level with ground in vr when you save it as a comp. Then, reference those triggers in your script: private _triggerNames = [terrainTrigger_01, terrainTrigger_02, terrainTrigger_03, terrainTrigger_04]; { private _triggerPos = getPosWorld _x; private _triggerSize = triggerArea _x; private _height = _triggerPos select 2; private _position = getPosWorld _x; private _triggerLength = (_triggerSize) # 0; private _triggerWidth = (_triggerSize) # 1; private _triggerAngle = (_triggerSize) # 2; private _pos = [(_position#0 + cos(_triggerAngle) * _triggerLength + sin(_triggerAngle) * _triggerWidth), (_position#1 - sin(_triggerAngle) * _triggerLength + cos(_triggerAngle) * _triggerWidth)]; private _positionsAndHeights = []; _pos pushBack _height; for "_i" from 0 to (_triggerLength * 8) do { private _pos2 = _pos; for "_j" from 0 to (_triggerWidth * 8) do { _positionsAndHeights pushBack _pos2; _pos2 = _pos2 vectorAdd [-0.25 * sin(_triggerAngle), -0.25 * cos(_triggerAngle), 0]; }; _pos = _pos vectorAdd [-0.25 * cos(_triggerAngle), 0.25 * sin(_triggerAngle), 0]; }; setTerrainHeight[_positionsAndHeights, true]; } forEach _triggerNames; The downside is I'm not near math smart enough to smooth the edges, so you'll have to find a relatively open area to minimize jarring transitions (don't place it partially on a hill.
  3. New to this stuff, but maybe changing the naming convention for markers based on what they are for might work (opforSpawn_1, independentSpawn_6, etc,) store them to arrays, then run the function separately on each array.
  4. Hi all. Starting a new mission, and I want the weather to be configurable by an authorized in game admin via the parameters menu. Since it's a multiplayer mission, I want to ensure all clients match the intended setting. In description.ext: class Params { class BR_TimeOfDay { title = "Environment: Time of Day"; values[] = {0,4,8,12,16,18,20,24}; texts[] = {"Random Time of Day", "Dawn","Mid Morning","Noon","Afternoon","Evening","Night","Midnight"}; default = 0; }; }; In initServer.sqf: // === Get the BR_daytime variable from Params in description.ext _BR_Time = ["BR_TimeOfDay"] call BIS_fnc_getParamValue; // === Check if host selected random. If so, select a random value from the options available, if not, use the value they selected, set date on server and broadcast to all clients. if (_BR_Time == 0) then { _randomTime = [4, 8, 12, 16, 18, 20, 24] call BIS_fnc_selectRandom; [_randomTime] call BIS_fnc_paramDaytime; diag_log format["_randomTime value: %1", _randomTime]; // Debug output ["setDate", [2024, 10, 10, _randomTime, 0]] call BIS_fnc_MP; } else { [_BR_Time] call BIS_fnc_paramDaytime; diag_log format["_BR_Time value: %1", _BR_Time]; // Debug output ["setDate", [2024, 10, 10, _BR_Time, 0]] call BIS_fnc_MP; }; The code "works" but I get a hint error: [BIS_fnc_MP] Error: type Array, expected string, on index 1, in ["setDate"[2024,10,10,8,0],0,false,false] In this case, the "8" in ["setDate"[2024,10,10,8,0],0,false,false] does represent the correct value being passed, so I am at a loss as to what is causing it. The same is true when "random" is selected. The time of day changes, but I still get a hint error. 8:22:15 "3den Enhanced: Debug Options initialized." 8:22:57 A null object passed as a target to RemoteExec(Call) 'bis_fnc_objectvar' 8:23:00 Starting mission: 8:23:00 Mission file: SomeName%2eAltis 8:23:00 Mission world: Stratis 8:23:00 Mission directory: C:\Users\Username\Documents\Arma 3\mpmissions\SomeName%2eAltis.Stratis\ 8:23:01 No more slot to add connection at 033057 (3386.8,5735.4) 8:23:01 d:\bis\source\stable\futura\lib\network\networkserver.cpp NetworkServer::OnClientStateChanged:NOT IMPLEMENTED - briefing! 8:23:03 "_BR_Time value: 8" 8:23:04 Mission id: 1c9cc5d519ba6c4a31aabc2dc1d86b6da522b887
  5. Subjugation Protocol [Altis] Subjugation Protocol [Malden] Also available: Subjugation [Framework] by @alpha993 Subjugation Protocol is a PVP focused, sector control game mode that is similar to King of the Hill, but with a renewed emphasis on both player and community agency. Subjugation Protocol is based on the Subjugation Framework. Subjugation features a requisition system that allows players to earn points by holding position, and giving them the ability to scan sectors, initiate artillery strikes, air-drop vehicles and more, as enabled by the host. Use the built in Arsenal and Garage to customize your player and vehicles with granularity. Subjugation features no perks, no weapon unlocks and no grinding. Play Arma the way it's meant to be played. Level the playing field. Pull out all the stops to lead your team to victory and subjugate the enemy. For the community, the most important aspect of this game mode is that it is completely open to the public to host and to make copies and/or derivative missions. The Subjugation Protocol [Altis] variant features 25+ zones. The Subjugation Protocol [Malden] variant features 15 zones. The Subjugation [Framework] is the basic sector control framework from which Subjugation Protocol is based. It is an example mission set on Altis. You can think of Subjugation Protocol missions as "fleshed out" missions.
  6. Ok. So I've got a mission I had to add icons to the player map and GPS. Depends on how you are running the mission. If it's a self hosted thing on your own PC, things that would work in that environment won't work the same way in a dedicated server environment. I'm learning this is true for a lot of stuff: Weather, Time, and.... drawing stuff on the map and GPS. Long and short of it is, anything you draw needs to be drawn on all client machines. Here's a snippet of some code I use to draw an icon on the player map and GPS. Works in a dedicated server environment. Should work regardless. //Draw on Map waitUntil {!isNull findDisplay 12}; findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", { _ALP_towers = missionNamespace getVariable "ALP_triggerTowers"; { _this select 0 drawIcon [getMissionPath format ["\images\tower%1_ca.paa", (_forEachIndex + 1)], [1,1,1,1], (getPos (_x select 0)), 24, 24, 0, "", 1, 0.03, "TahomaB", "right"]; } forEach _ALP_towers; }]; //Draw on GPS private _displays = uiNamespace getVariable ["igui_displays", []]; { private _ctrl = _x displayCtrl 101; if (!isNull _ctrl && ctrlType _ctrl == 101) then { _ctrl ctrlAddEventHandler ["Draw", { _ALP_towers = missionNamespace getVariable "ALP_triggerTowers"; { _this select 0 drawIcon [getMissionPath format ["\images\tower%1_ca.paa", (_forEachIndex + 1)], [1,1,1,1], (getPos (_x select 0)), 24, 24, 0, "", 1, 0.03, "TahomaB", "right"]; } forEach _ALP_towers; }]; }; } forEach _displays; I have this code running in initplayerlocal. This is a mission with no addons, no mods, pure vanilla.
  7. Context: I have mission that contains multiple flagpoles. Each is named (Flag_1, Flag_2) Player captures a flagpole, it should change the marker color of TowerPost%1. Marker will stay the same until another team captures the flagpole. I've tried this, and ultimately, I am unsure of what to use to determine if a flag has been captured, and returning it's name for a split string. Edit: I just modified the aftercommand to get the flagside the same way the existing code did, then use that to set the markercolor. I wasn't able to figure out how to get the name of flag1, split the string, and format towerpost%1 based on that, but this really isn't that much more work. _flag = this; params ["_winSide"]; _afterCommand = {**_get = _flag getVariable ["TER_flagSide",civilian];** _marker1 = "TowerPost1"; _mkrcolor = switch (_get) do { case west: { _marker1 setmarkerColor "ColorBLUFOR"; }; case east: { _marker1 setmarkerColor "ColorOPFOR"; }; case independent: { _marker1 setmarkerColor "ColorIndependent"; }; default { _marker1 setmarkerColor "ColorGrey"; }; }; }; _fncOwnFlag = { params ["_winSide"]; _flagPath = "\a3\data_f\flags\%1.paa"; _fileFlag = switch _winSide do { case west: {"flag_nato_co"}; case east: {"flag_csat_co"}; case independent: {"flag_aaf_co"}; default {"flag_white_co"} }; format [_flagPath,_fileFlag]; }; _actionParams = ["_flag", "_caller", "_actionId", "_arguments"]; _flag setflagAnimationPhase 1; _flag setFlagTexture (civilian call _fncOwnFlag); _flag setVariable ["TER_flagSide",civilian]; _icon = "\a3\ui_f\data\igui\cfg\holdactions\holdaction_takeoff2_ca.paa"; _duration = 10; _addID = [_flag, "Capture Post", _icon, _icon, "_target getVariable [""TER_flagSide"",civilian] != side _this", "true", { }, { params ["_flag", "_caller", "_actionId", "_arguments","_progress","_maxProgress"]; _arguments params ["_actionParams","_fncOwnFlag","_afterCommand"]; _relProgress = _progress/_maxProgress; if (_relProgress < 0.5) then { _flag setFlagAnimationPhase (1-(2*_relProgress)); } else { if (_relProgress == 0.5) then {_flag setFlagTexture (side _caller call _fncOwnFlag)}; _flag setFlagAnimationPhase ((2*_relProgress)-1); }; }, { params ["_flag", "_caller", "_actionId", "_arguments"]; _arguments params ["_actionParams","_fncOwnFlag","_afterCommand"]; _flag setVariable ["TER_flagSide",side _caller]; [] call _afterCommand; }, { params ["_flag", "_caller", "_actionId", "_arguments"]; _arguments params ["_actionParams","_fncOwnFlag","_afterCommand"]; _flag setFlagAnimationPhase 1; _side = _flag getVariable ["TER_flagSide",civilian]; _flag setFlagTexture (_side call _fncOwnFlag); }, [_actionParams,_fncOwnFlag,_afterCommand], _duration, 1.5, false] call BIS_fnc_holdActionAdd; _addID
  8. I am an idiot. Works fine. I shouldn't stay up so late.
  9. Just got around to testing it. Issue: Seems only one marker updates. In the mission I have currently, I have anywhere between 1 and 7 such "capturable" flags. Reproduce: Copy and paste the flag and marker in the 3d editor. Start the mission and capture both flags. Context: The flag (and everything else) is part of a larger mission. I was using attempting to use capturable flags to change the color of a marker, then using the markercolor to act as a switch of sorts. Each flag (will) belong to a composition that spawns in via LARs. The composition is a simple "base" with 3 cargo houses (two military and one medical) and a numbered tower. The idea is that the flag can be captured by any side at any time, and recaptured by another side, ad infinitum, until the match ends. Each cargo house has an object. In the military houses, that object is a supply crate. In the medical it is also a supply crate. The supply crate will restore the players last arsenal loadout, presumably with a timed hold object counter like the flag capture has. The (object that I haven't decided) in the medical house would restore a player's health via addaction, presumably with a hold object counter like the flag capture has. Why a marker? A, to visually ID who owns a given post on the player map and gps, and B, to retrieve who owns the flag --> so that the addactions/hold actions can be restricted to only work with the side that currently "owns" the flag/marker. The post will also contain a respawn point, llso only available to the side holding the flag, which on mission start would ideally be empty (so no spawn at towerpost), instead of a white flag (I couldn't figure out out to default an empty flagpole in my original init). Both the medical and rearm features will have a 5 minute timeout for that player, to prevent pumping and dumping. In addition, there are 3 triggers, each with a veh repair script. Those will be side restricted as well. I've gotten as far as getting my original solution to work with loadouts, but there is no timer yet. Mission File
  10. I'll work on switching to this over the next couple days. This is good stuff. Thanks @Larrow
  11. Trying to enable an addaction based on the player side and color marker matching. This is in the init of a supply box on mission start. Anyone know how I would go about updating it whenever a marker color changes? _mrkr = "TowerPost1"; _mrkrcolor = getMarkerColor _mrkr; _color = switch (side player) do { case west: { "ColorBlufor" }; case east: { "ColorOpfor" }; case independent: { "ColorIndependent" }; default { "ColorGrey" }; }; _canRearm = (_color == _mrkrcolor); if (_canRearm) then { player addAction ["Rearm", { private _customLoadout = player getVariable "enh_savedloadout"; if (isNil "_customLoadout") exitWith { player setUnitLoadout (configFile >> "CfgVehicles" >> typeOf player); systemChat "Could not find custom loadout"; systemChat "Restored default unit loadout"; }; player setUnitLoadout _customLoadout; systemChat "Rearmed and Reloaded"; }]; };
  12. In that case, what would be a better, more efficient approach?
  13. Not sure what you mean. For context, I am creating a small Outpost that will be capturable in a larger MP mission with 3 teams fighting over a single sector. The idea is that a player captures an outpost by capturing a flag (with code from here). Doing so changes the color of a named marker specific to that base, to not only show who controls it, but to act as a switch of sorts for a couple of things in the outpost.This particular one is a supply crate. The addaction by itself works splendidly, filtering it seems to be quite the chore. Beyond that there will be a healing create, three vehicle repair areas and a respawn location -- all which are only meant to work for the team matching the marker color.
  14. I have tried if (_mrkrcolor == _color) then { player addAction ["Rearm", { _mrkrcolor = getMarkerColor _mrkr; and if (_canRearm) then { player addAction ["Rearm", { private _customLoadout = player getVariable "enh_savedloadout"; if (isNil "_customLoadout") exitWith { player setUnitLoadout (configFile >> "CfgVehicles" >> typeOf player); systemChat "Could not find custom loadout"; systemChat "Restored default unit loadout"; }; player setUnitLoadout _customLoadout; systemChat "Rearmed and Reloaded"; }, [], 0, true, true, "", "_canRearm"]; }; Neither throw errors, nor appears to have any effect.
  15. Northup

    DrawLine

    I managed to get this to work in one instance but not work in another. It's confounding! In some_1.sqf the following works: private _displays = uiNameSpace getVariable ["igui_displays", []]; { private _ctrl = _x displayCtrl 101; if (!isNull _ctrl && ctrlType _ctrl == 101) then { _ctrl ctrlAddEventHandler ["Draw", { _this#0 drawIcon [getMissionPath "\images\attack.paa", [1,1,1,1], (getMarkerPos "BZMarker"), 30, 30, 0, "", 1, 0.03, "TahomaB", "right"]; }]; }; } forEach _displays; In some_2.sqf: //This works and displays an icon on the player map findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", { _ALP_towers = ALP_mainZone getVariable "ALP_triggerTowers"; { _this select 0 drawIcon [getMissionPath format ["\images\tower%1_ca.paa", (_forEachIndex + 1)], [1,1,1,1], (getPos (_x select 0)), 24, 24, 0, "", 1, 0.03, "TahomaB", "right"]; } forEach _ALP_towers; }]; //This does NOT work, but doesn't throw any errors! private _displays = uiNameSpace getVariable ["igui_displays", []]; { private _ctrl = _x displayCtrl 101; _ALP_towers = ALP_mainZone getVariable "ALP_triggerTowers"; if (!isNull _ctrl && ctrlType _ctrl == 101) then { { _ctrl ctrlAddEventHandler ["Draw", { _this#0 drawIcon [getMissionPath format ["\images\tower%1_ca.paa", (_forEachIndex + 1)], [1,1,1,1], (getPos (_x select 0)), 24, 24, 0, "", 1, 0.03, "TahomaB", "right"]; }]; } forEach _ALP_towers; }; } forEach _displays;
  16. Trying to pass a variable through to the custom function that spawns comps. The function works in other tests just fine. However, I am trying to call it on initServer. _ZoneComp = missionNamespace getVariable ["ALP_mainZone", ""]; diag_log format ["_ZoneComp value:%1", _ZoneComp]; _compReference = [_ZoneComp, [], [0,0,0], 0, true, true, false] call LARs_fnc_spawnComp; And just to verify here is my compositions.cfg: //LARs_spawnComp_debug = 1; //1 = RPT output, 2 = RPT output and ingame visual positioning info class CfgCompositions { class ALP_Area_01 { //Name that the composition is spawned by #include "ALP_Area_01.sqe" //Renamed composition.sqe }; }; Upon mission start, I get the Error >>: Type Object, expected string. In the RPT, this pops out: 11:17:13 "_ZoneComp value:ALP_Area_01" 11:17:13 Error in expression < missionConfigFile >> "CfgCompositions" >> _compName; Any ideas ? Edit: Fixed Thanks. Great Script!
  17. I am trying to write a script that reads a composition.sqe with loadconfig and then walks through the items using configClasses and spawn them one by one. So far, no luck. I have the following code: Currently this is what the error report says: For reference, here is the test composition.sqe: Any ideas?
  18. Solved. Still leaning syntax. My apologies. @Larrow thanks for the script. Works like a charm once I figured it out.
  19. @Larrow, I gave it another shot and was able to get into my mission, but I am unsure of how to spawn my comp via trigger? I tried _compReference = [ SAB ] call LARs_fnc_spawnComp; no luck. My composition is called SAB. Any suggestions?
  20. Thanks Larrow. I tried yours first, but I'm inexperienced enough that with yours I couldn't add the lines to description.ext, since the mission I have is somewhat complex and has a ton of other functions and was throwing me errors. Not comfortable enough to perform that kind of surgery on existing scripts and functions. I also couldn't figure out how to just straight up spawn in something on mission start without using addactions. Just trying to come of with a small, simple script that will do what I need.
  21. I am running a custom mission. I am trying to make a simple change that is proving to be a tad more complex than I'd thought. The simple short version is that I am simply trying to draw a (custom) 2d icon on the player map and gps with drawicon and using getmissionpath "\folder\genericimage.paa", and then update the position of that icon on a set interval. However, accessing the position of the bonuz zone is proving to be a challenge. The mission is a custom sector control mission. The mission selects either a random trigger or one chosen by name by the host. That trigger serves as the main AO. Inside, there is another trigger that acts as a moving zone. Here is how the zones are created: However, there isn't an actual position to grab there, since the bonus zone movement is handled in the sector manager: I have tried to grab the pos from _ALP_triggerBonusNewPos_X and _ALP_triggerBonusNewPos_Y,0 to no avail. I wrote a script that is executed on initplayerlocal.ini: I'm sure I am doing it all wrong. If anyone has any insight, please let me know.
  22. This is awesome. Would be nice if there was a way to plop down and resize/reshape similar to triggers, maybe use the z axis to adjust height, and still be able to retain all the same options (harshness, etc). This would make uploading base compositions super easy. Would also make loading in comps on varied terrain a lot easier as well, at least in my minds eye, since the deformation would be part of the comp. Thanks for this.
×