From 2d42fd3488523abecbe6119ba68a3c238ca8dcae Mon Sep 17 00:00:00 2001 From: Freddo Date: Mon, 22 Oct 2018 21:40:15 +0200 Subject: [PATCH 01/17] v0.7.0 There may be some changes I've forgot to list ##Additions - Functions Library (Replaced all cases of ExecVM) - Simple replacement of units using DUWS_CONFIG.SQF - AIS Revive - BLUFOR Commander now has static animations ##Changed - Purchase menus have a length equal to the array found in DUWS_CONFIG.SQF (Purchasing vehicles, units, groups) - Imported mission file to 3DEN - Cleaned up mission root to some degree ##Deprecated ##Removed - Old DUWS Revive system ##Security As there are some heavy changes present, there are bound to be some bugs and issues. Some things are probably getting called when they should be spawned, and vice versa (If it could be called, it is called else it is spawned). This version can likely be seen as an Beta build. ##Todo [] Thoroughly test this [] Test on dedicated server [] Thoroughly test unit/group configs [] Cleanup codebase --- source/AIS/AIS_SETUP.sqf | 38 + source/AIS/Core/cfgFunctions.hpp | 30 + source/AIS/Core/fn_Interaction_Loop.sqf | 46 ++ source/AIS/Core/fn_addAction.sqf | 81 +++ source/AIS/Core/fn_aisInitHost.sqf | 33 + source/AIS/Core/fn_aisInitPlayer.sqf | 105 +++ source/AIS/Core/fn_bindEventHandler.sqf | 30 + source/AIS/Core/fn_createLocalMarker.sqf | 26 + source/AIS/Core/fn_dynamicText.sqf | 10 + source/AIS/Core/fn_handleDisconnect.sqf | 44 ++ source/AIS/Core/fn_inRange.sqf | 30 + source/AIS/Core/fn_initEvents.sqf | 77 ++ source/AIS/Core/fn_isPlayable.sqf | 24 + source/AIS/Core/fn_onEachFrame.sqf | 31 + source/AIS/Core/fn_onNextFrame.sqf | 31 + source/AIS/Core/fn_postinit.sqf | 73 ++ source/AIS/Core/fn_preinit.sqf | 21 + source/AIS/Core/fn_progress_ShowBar.sqf | 74 ++ source/AIS/Core/fn_progress_ShowBarText.sqf | 21 + source/AIS/Core/fn_removeOnEachFrame.sqf | 23 + source/AIS/Core/fn_resetOnTeamSwitch.sqf | 31 + source/AIS/Core/fn_setPosAGLS.sqf | 22 + source/AIS/Core/fn_setVariables.sqf | 37 + source/AIS/Core/fn_triggerEvent.sqf | 45 ++ source/AIS/Core/fn_waitUntilAndExecute.sqf | 35 + source/AIS/Damage/cfgFunctions.hpp | 12 + source/AIS/Damage/fn_exitDamageHandler.sqf | 20 + source/AIS/Damage/fn_getHitIndexValue.sqf | 39 + source/AIS/Damage/fn_goToDead.sqf | 41 ++ source/AIS/Damage/fn_handleDamage.sqf | 188 +++++ source/AIS/Damage/fn_verifyDamageType.sqf | 54 ++ source/AIS/Effects/BarDlg.hpp | 62 ++ source/AIS/Effects/cfgFunctions.hpp | 22 + source/AIS/Effects/fn_bleeding.sqf | 84 +++ source/AIS/Effects/fn_bloodSplatterScreen.sqf | 64 ++ source/AIS/Effects/fn_bulletImpact.sqf | 50 ++ .../Effects/fn_deleteBloodSplatterScreen.sqf | 26 + source/AIS/Effects/fn_draw3D.sqf | 53 ++ source/AIS/Effects/fn_garbage.sqf | 38 + source/AIS/Effects/fn_helpScream.sqf | 28 + source/AIS/Effects/fn_injuredMarker.sqf | 33 + source/AIS/Effects/fn_medEquip.sqf | 62 ++ .../AIS/Effects/fn_posUpdateInjuredMarker.sqf | 34 + source/AIS/Effects/fn_preinit.sqf | 37 + source/AIS/Effects/fn_removeinjuredMarker.sqf | 25 + source/AIS/Effects/fn_scream.sqf | 29 + source/AIS/Effects/fn_stabil.sqf | 69 ++ source/AIS/Effects/fn_toggleRadio.sqf | 34 + source/AIS/System/cfgFunctions.hpp | 56 ++ source/AIS/System/fn_AIselfCheck.sqf | 41 ++ source/AIS/System/fn_Revive.sqf | 109 +++ source/AIS/System/fn_ReviveAI.sqf | 108 +++ source/AIS/System/fn_addMedEvacObj.sqf | 31 + source/AIS/System/fn_allowCarry.sqf | 35 + source/AIS/System/fn_allowDrag.sqf | 37 + source/AIS/System/fn_allowPullIn.sqf | 18 + source/AIS/System/fn_allowPullOut.sqf | 28 + source/AIS/System/fn_allowRevive.sqf | 53 ++ source/AIS/System/fn_allowStabilize.sqf | 38 + source/AIS/System/fn_bloodloss.sqf | 37 + source/AIS/System/fn_bloodlossAI.sqf | 56 ++ source/AIS/System/fn_calculateLifeTime.sqf | 38 + source/AIS/System/fn_calculateReviveTime.sqf | 40 ++ .../AIS/System/fn_calculateStabilizeTime.sqf | 40 ++ source/AIS/System/fn_callHelp.sqf | 26 + source/AIS/System/fn_carry.sqf | 73 ++ source/AIS/System/fn_checkLauncher.sqf | 15 + source/AIS/System/fn_checkUnload.sqf | 22 + source/AIS/System/fn_diary.sqf | 77 ++ source/AIS/System/fn_disableRespawnButton.sqf | 31 + source/AIS/System/fn_drag.sqf | 39 + source/AIS/System/fn_findAIHelper.sqf | 68 ++ source/AIS/System/fn_getCargoIndex.sqf | 45 ++ source/AIS/System/fn_getOutMan.sqf | 25 + source/AIS/System/fn_handleHeal.sqf | 58 ++ source/AIS/System/fn_isMedic.sqf | 22 + source/AIS/System/fn_keyHandler.sqf | 49 ++ source/AIS/System/fn_killed.sqf | 18 + source/AIS/System/fn_loadAIS.sqf | 43 ++ source/AIS/System/fn_loadAISlocalToPlayer.sqf | 43 ++ source/AIS/System/fn_loadInjured.sqf | 28 + source/AIS/System/fn_medEvacArea.sqf | 28 + source/AIS/System/fn_moveAIHelper.sqf | 62 ++ source/AIS/System/fn_moveCargoRemote.sqf | 29 + source/AIS/System/fn_overrideHealAction.sqf | 35 + source/AIS/System/fn_postinit.sqf | 101 +++ source/AIS/System/fn_release.sqf | 34 + source/AIS/System/fn_removeFaks.sqf | 61 ++ source/AIS/System/fn_respawn.sqf | 31 + source/AIS/System/fn_restoreFaks.sqf | 33 + source/AIS/System/fn_reveal.sqf | 32 + source/AIS/System/fn_secondsToString.sqf | 23 + source/AIS/System/fn_setUnconscious.sqf | 34 + source/AIS/System/fn_stabilize.sqf | 90 +++ source/AIS/System/fn_unconcsiousRemote.sqf | 70 ++ source/AIS/System/fn_unconsciousAI.sqf | 65 ++ source/AIS/System/fn_unconsciousPlayer.sqf | 84 +++ source/AIS/System/fn_unloadInjured.sqf | 34 + source/AIS/cfgFunctions.hpp | 4 + source/DUWS_CONFIG.sqf | 219 ++++++ source/INIT.sqf | 298 +------- source/WARCOM/WARCOM_opf_qrf.sqf | 37 - source/createopfortified.sqf | 22 - source/createpatrol.sqf | 9 - source/description.ext | 39 +- source/dialog/fob/gui_edit_format.TXT | 14 - source/dialog/info/gui_editor_info.TXT | 21 - source/dialog/info/reset/gui_editor_info.TXT | 11 - source/dialog/operative/operator_init.sqf | 150 ---- source/dialog/request_vehicle.sqf | 135 ---- source/dialog/squad/dialog_editor.TXT | 13 - .../dialog/squad/rename/rename_gui_editor.TXT | 9 - source/dialog/startup/startup_closed.sqf | 2 - source/duws_revive/exitMenu.sqf | 1 - source/duws_revive/get_loadout.sqf | 265 ------- source/duws_revive/gui/duws_revive.hpp | 37 - source/duws_revive/gui/guieditorformat.TXT | 8 - source/duws_revive/onKilled.sqf | 16 - source/duws_revive/playerRevived.sqf | 6 - source/duws_revive/respawnClicked.sqf | 15 - source/duws_revive/reviveInit.sqf | 54 -- source/duws_revive/set_loadout.sqf | 359 ---------- source/fnc_test.Sqf | 39 - .../WARCOM/fn_WARCOM_blu_assault.sqf} | 8 +- .../WARCOM/fn_WARCOM_blu_patrol.sqf} | 8 +- .../WARCOM/fn_WARCOM_gps_marker.sqf} | 12 +- .../WARCOM/fn_WARCOM_init.sqf} | 35 +- .../WARCOM/fn_WARCOM_opf_assault.sqf} | 14 +- .../WARCOM/fn_WARCOM_opf_patrol.sqf} | 18 +- source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf | 39 + .../WARCOM/fn_WARCOM_wp.sqf} | 2 +- .../WARCOM/fn_WARCOM_wp_blu_patrol.sqf} | 2 +- .../WARCOM/fn_WARCOM_wp_opf.sqf} | 2 +- .../WARCOM/fn_WARCOM_wp_opf_patrol.sqf} | 2 +- .../WARCOM/fn_WARCOM_wp_opf_qrf.sqf} | 3 +- .../WARCOM/fn_random_veh_blu_patrol.sqf} | 9 +- .../WARCOM/fn_random_veh_opf_patrol.sqf} | 9 +- .../fob/fn_fast_travel.sqf} | 0 .../fob/fn_fobmanageropen.sqf} | 0 .../fob/fn_radiochatter.sqf} | 2 +- .../fob/fn_reinforce.sqf} | 0 .../generic/fn_bisArsenal.sqf} | 0 .../generic/fn_captured.sqf} | 10 +- .../generic/fn_convertCPtoAP.sqf} | 0 .../generic/fn_createopfortified.sqf | 22 + .../generic/fn_createoppatrol.sqf} | 9 +- .../generic/fn_createopteam.sqf} | 9 +- .../generic/fn_createopwpteam.sqf} | 9 +- source/functions/generic/fn_createpatrol.sqf | 8 + .../generic/fn_dyn_music_init.sqf} | 0 .../generic/fn_dynamic_menu.sqf} | 24 +- .../generic/fn_enterlocation.sqf} | 3 +- .../generic/fn_hc_init.sqf} | 0 .../generic/fn_mapsize.sqf} | 3 +- .../generic/fn_musicloop.sqf} | 0 .../generic/fn_random_name.sqf} | 2 +- .../generic/fn_random_veh.sqf} | 10 +- .../generic/fn_repetitive_cleanup.sqf} | 2 + .../generic/fn_request.sqf} | 33 +- .../generic/fn_request_squad.sqf} | 8 +- .../generic/fn_request_support.sqf} | 6 +- .../generic/fn_request_unit.sqf} | 32 +- .../functions/generic/fn_request_vehicle.sqf | 137 ++++ .../generic/fn_savegame.sqf} | 2 +- .../generic/fn_savegameClient.sqf} | 0 .../generic/fn_spawnVehicle.sqf} | 3 +- source/functions/generic/fn_zones_bonus.sqf | 7 + .../generic/fn_zonesundercontrol.sqf} | 0 .../info.sqf => functions/info/fn_info.sqf} | 0 .../initHQ/fn_BluHQinit.sqf} | 26 +- source/functions/initHQ/fn_HQaddactions.sqf | 15 + source/functions/initHQ/fn_commanderAnim.sqf | 6 + .../initHQ/fn_drawIcon.sqf} | 3 +- .../initHQ/fn_drawIconFnc.sqf} | 0 .../initHQ/fn_fobmanager.sqf} | 2 +- .../initHQ/fn_fortify.sqf} | 25 +- .../initHQ/fn_fortifyFOB.sqf} | 30 +- .../initHQ/fn_fortifyFOB2.sqf} | 24 +- .../initHQ/fn_guards.sqf} | 13 +- .../initHQ/fn_guardsFOB.sqf} | 16 +- .../initHQ/fn_guardsHQ.sqf} | 4 +- .../initHQ/fn_hq_radioloop.sqf} | 2 +- .../initHQ/fn_locatorhq.sqf} | 2 +- .../initHQ/fn_refortify.sqf} | 18 +- .../initHQ/fn_refortifyFOB.sqf} | 18 +- .../initHQ/fn_reguard.sqf} | 12 +- .../initHQ/fn_reguardFOB.sqf} | 12 +- .../initHQ/fn_teleport.sqf} | 2 +- .../functions/initMission/fn_clientInit.sqf | 289 ++++++++ .../initMission/fn_processGroupConfig.sqf | 30 + .../initMission/fn_processUnitConfig.sqf | 26 + .../initMission/fn_processVehicleConfig.sqf | 16 + .../initMission/fn_serverInit.sqf} | 474 ++++++------- source/functions/initZones/fn_createzone.sqf | 240 +++++++ .../initZones/fn_createzonebackup.sqf} | 179 +++-- .../initZones/fn_locatorzonesV1.sqf} | 10 +- .../initZones/fn_locatorzonesV1_backup.sqf} | 9 +- .../initZones/fn_locatorzonesV2.sqf} | 12 +- .../misc/fn_bottom_right_message.sqf} | 0 .../misc/fn_gps_marker.sqf} | 0 .../missions/fn_destroy_mission.sqf} | 15 +- .../missions/fn_missionTimer.sqf} | 0 .../missions/fn_pilot_mission.sqf} | 22 +- .../missions/fn_rescue_mission.sqf} | 18 +- .../missions/fn_rescue_success.sqf} | 12 +- .../missions/fn_sabotage_mission.sqf} | 16 +- .../missions/fn_sabotage_success.sqf} | 4 +- .../missions/fn_steal_mission.sqf} | 30 +- .../missions/fn_stratmap.sqf} | 24 +- .../missions/fn_target_mission.sqf} | 26 +- .../missions/fn_underwater_mission.sqf} | 14 +- .../missions/fn_underwater_success.sqf} | 2 +- .../operative/fn_lbselected.sqf} | 4 +- .../fn_operative_mission_complete.sqf} | 0 .../operative/fn_operator_add_aim.sqf | 16 + .../operative/fn_operator_add_comms.sqf | 15 + .../operative/fn_operator_add_courage.sqf | 15 + .../operative/fn_operator_add_reflexes.sqf | 15 + .../operative/fn_operator_add_reload.sqf | 15 + .../operative/fn_operator_add_spotting.sqf | 16 + .../operative/fn_operator_open.sqf} | 0 .../operative/fn_operator_recruit.sqf} | 0 .../pFLIR/fn_livefeed.sqf} | 6 +- .../pFLIR/fn_livefeed1.sqf} | 6 +- .../pFLIR/fn_livefeedexit.sqf} | 4 +- .../fn_experience_ability_check.sqf} | 18 +- .../fn_experience_ability_fieldcomm.sqf | 7 + .../fn_experience_ability_heal.sqf} | 0 .../fn_experience_ability_logistic.sqf} | 0 .../fn_experience_ability_logistic_boost.sqf} | 0 .../fn_experience_ability_refit.sqf} | 0 .../fn_experience_ability_slowtime.sqf} | 0 .../fn_experience_ability_stamina.sqf} | 0 .../fn_experience_ability_warrior.sqf} | 0 .../persistent/fn_experience_init.sqf} | 2 +- .../persistent/fn_persistent_stats_init.sqf} | 3 +- .../fn_persistent_stats_missions_total.sqf} | 0 .../persistent/fn_persistent_stats_reset.sqf} | 0 .../persistent/fn_persistent_stats_win.sqf} | 0 .../fn_persistent_stats_zones_add.sqf} | 0 .../prefabs/fn_site_Barracks.sqf} | 0 .../prefabs/fn_site_CommStation.sqf} | 0 .../prefabs/fn_site_campsite.sqf} | 4 +- .../prefabs/fn_site_commandOP.sqf} | 6 +- .../prefabs/fn_site_outpost1.sqf} | 0 .../prefabs/fn_site_outpost2.sqf} | 0 .../prefabs/fn_site_powerRelay.sqf} | 2 +- .../prefabs/fn_site_reconOutpost.sqf} | 0 .../prefabs/fn_site_researchBunker.sqf} | 0 .../prefabs/fn_site_researchStation.sqf} | 0 .../prefabs/fn_site_vehfittingstation.sqf} | 8 +- .../prefabs}/old/createzone.sqf | 37 +- .../prefabs}/old/locatorzones.sqf | 14 +- .../prefabs/regex.TXT | 0 .../squad/fn_copyloadout.sqf} | 0 .../squad/fn_dismiss.sqf} | 0 .../squad/fn_dismissHC.sqf} | 0 .../squad/fn_renamesquad.sqf} | 0 .../squad/fn_squadmng.sqf} | 0 .../startup/fn_manual.sqf} | 2 +- .../startup/fn_placement.sqf} | 0 .../startup/fn_placement_closed.sqf} | 2 +- .../startup/fn_random.sqf} | 0 .../startup/fn_startup.sqf} | 0 .../functions/startup/fn_startup_closed.sqf | 2 + .../startup/fn_startup_common.sqf} | 0 .../startup/fn_startup_manual_start.sqf} | 3 +- .../startup/fn_startup_random_start.sqf} | 3 +- .../startup/fn_weather.sqf} | 2 +- .../startup/fn_weather_broadcast.sqf} | 0 .../startup/fn_weather_client.sqf} | 0 .../support/cluster/fn_cluster.sqf} | 4 +- .../support/cluster/fn_mapclickcluster.sqf} | 6 +- source/functions/support/fn_FOBactions.sqf | 17 + .../support/fn_FOBreceiveaction.sqf} | 2 +- .../support/fn_ammobox.sqf} | 21 +- .../support/fn_arty.sqf} | 0 .../fob.sqf => functions/support/fn_fob.sqf} | 29 +- .../support/fn_fob_ammobox.sqf} | 9 +- .../support/fn_mapclickarty.sqf} | 2 +- .../support/fn_mapclickuav.sqf} | 2 +- .../support/fn_paradrop.sqf} | 18 +- source/functions/support/fn_sitrep.sqf | 18 + .../support/fn_uav_map.sqf} | 3 +- .../support/fn_veh_refit.sqf} | 0 .../support/taxi/fn_boatTaxi.sqf} | 16 +- .../support/taxi/fn_helotaxi.sqf} | 22 +- .../support/taxi/fn_mapclickboat.sqf} | 4 +- .../support/taxi/fn_mapclickhelo.sqf} | 4 +- .../support/taxi/fn_random_music.Sqf} | 0 .../{ => functions}/taw_vd/CfgFunctions.hpp | 0 source/functions/taw_vd/GUI.h | 668 ++++++++++++++++++ source/functions/taw_vd/defines.h | 44 ++ source/{ => functions}/taw_vd/fn_onChar.sqf | 0 .../taw_vd/fn_onSavePressed.sqf | 0 .../taw_vd/fn_onSaveSelectionChanged.sqf | 0 .../taw_vd/fn_onSliderChanged.sqf | 0 .../taw_vd/fn_onTerrainChanged.sqf | 0 source/{ => functions}/taw_vd/fn_openMenu.sqf | 0 .../taw_vd/fn_openSaveManager.sqf | 0 .../taw_vd/fn_stateTracker.fsm | 0 .../taw_vd/fn_updateViewDistance.sqf | 0 .../utilities/fn_autoSave.sqf} | 0 .../utilities/fn_groupReset.sqf} | 0 .../zonescap/fn_blufor_cap.sqf} | 11 +- .../zonescap/fn_opfor_cap.sqf} | 9 +- source/includes/CfgFunctions.hpp | 465 ++++++++++++ source/{ => includes}/debriefing.hpp | 0 source/{dialog => includes}/defines.hpp | 0 .../{dialog/fob => includes}/fobmanager.hpp | 4 +- source/{ => includes}/hints.hpp | 0 source/{dialog => includes}/info/info.hpp | 0 .../info/reset => includes/info}/reset.hpp | 2 +- source/{ => includes}/locations.hpp | 0 .../operative/identities.hpp | 0 .../operative/operative.hpp | 14 +- source/{ => includes}/params.hpp | 0 source/{dialog => includes}/request.hpp | 14 +- .../rename => includes/squad}/renamesquad.hpp | 2 +- .../{dialog => includes}/squad/squadmng.hpp | 4 +- .../squad_number_init.hpp | 0 .../startup}/placement.hpp | 6 +- .../{dialog => includes}/startup/startup.hpp | 6 +- source/{support => includes}/support.hpp | 26 +- source/{dialog => includes}/supports_init.hpp | 0 source/initHQ/HQaddactions.sqf | 15 - source/initZones/createzone.sqf | 311 -------- source/mission.sqm | Bin 10018 -> 19368 bytes source/mission.sqm.oldBackup | 530 ++++++++++++++ .../experience_ability_fieldcomm.sqf | 7 - source/support/FOBactions.sqf | 17 - source/support/sitrep.sqf | 18 - source/zones_bonus.sqf | 9 - 333 files changed, 8194 insertions(+), 2792 deletions(-) create mode 100644 source/AIS/AIS_SETUP.sqf create mode 100644 source/AIS/Core/cfgFunctions.hpp create mode 100644 source/AIS/Core/fn_Interaction_Loop.sqf create mode 100644 source/AIS/Core/fn_addAction.sqf create mode 100644 source/AIS/Core/fn_aisInitHost.sqf create mode 100644 source/AIS/Core/fn_aisInitPlayer.sqf create mode 100644 source/AIS/Core/fn_bindEventHandler.sqf create mode 100644 source/AIS/Core/fn_createLocalMarker.sqf create mode 100644 source/AIS/Core/fn_dynamicText.sqf create mode 100644 source/AIS/Core/fn_handleDisconnect.sqf create mode 100644 source/AIS/Core/fn_inRange.sqf create mode 100644 source/AIS/Core/fn_initEvents.sqf create mode 100644 source/AIS/Core/fn_isPlayable.sqf create mode 100644 source/AIS/Core/fn_onEachFrame.sqf create mode 100644 source/AIS/Core/fn_onNextFrame.sqf create mode 100644 source/AIS/Core/fn_postinit.sqf create mode 100644 source/AIS/Core/fn_preinit.sqf create mode 100644 source/AIS/Core/fn_progress_ShowBar.sqf create mode 100644 source/AIS/Core/fn_progress_ShowBarText.sqf create mode 100644 source/AIS/Core/fn_removeOnEachFrame.sqf create mode 100644 source/AIS/Core/fn_resetOnTeamSwitch.sqf create mode 100644 source/AIS/Core/fn_setPosAGLS.sqf create mode 100644 source/AIS/Core/fn_setVariables.sqf create mode 100644 source/AIS/Core/fn_triggerEvent.sqf create mode 100644 source/AIS/Core/fn_waitUntilAndExecute.sqf create mode 100644 source/AIS/Damage/cfgFunctions.hpp create mode 100644 source/AIS/Damage/fn_exitDamageHandler.sqf create mode 100644 source/AIS/Damage/fn_getHitIndexValue.sqf create mode 100644 source/AIS/Damage/fn_goToDead.sqf create mode 100644 source/AIS/Damage/fn_handleDamage.sqf create mode 100644 source/AIS/Damage/fn_verifyDamageType.sqf create mode 100644 source/AIS/Effects/BarDlg.hpp create mode 100644 source/AIS/Effects/cfgFunctions.hpp create mode 100644 source/AIS/Effects/fn_bleeding.sqf create mode 100644 source/AIS/Effects/fn_bloodSplatterScreen.sqf create mode 100644 source/AIS/Effects/fn_bulletImpact.sqf create mode 100644 source/AIS/Effects/fn_deleteBloodSplatterScreen.sqf create mode 100644 source/AIS/Effects/fn_draw3D.sqf create mode 100644 source/AIS/Effects/fn_garbage.sqf create mode 100644 source/AIS/Effects/fn_helpScream.sqf create mode 100644 source/AIS/Effects/fn_injuredMarker.sqf create mode 100644 source/AIS/Effects/fn_medEquip.sqf create mode 100644 source/AIS/Effects/fn_posUpdateInjuredMarker.sqf create mode 100644 source/AIS/Effects/fn_preinit.sqf create mode 100644 source/AIS/Effects/fn_removeinjuredMarker.sqf create mode 100644 source/AIS/Effects/fn_scream.sqf create mode 100644 source/AIS/Effects/fn_stabil.sqf create mode 100644 source/AIS/Effects/fn_toggleRadio.sqf create mode 100644 source/AIS/System/cfgFunctions.hpp create mode 100644 source/AIS/System/fn_AIselfCheck.sqf create mode 100644 source/AIS/System/fn_Revive.sqf create mode 100644 source/AIS/System/fn_ReviveAI.sqf create mode 100644 source/AIS/System/fn_addMedEvacObj.sqf create mode 100644 source/AIS/System/fn_allowCarry.sqf create mode 100644 source/AIS/System/fn_allowDrag.sqf create mode 100644 source/AIS/System/fn_allowPullIn.sqf create mode 100644 source/AIS/System/fn_allowPullOut.sqf create mode 100644 source/AIS/System/fn_allowRevive.sqf create mode 100644 source/AIS/System/fn_allowStabilize.sqf create mode 100644 source/AIS/System/fn_bloodloss.sqf create mode 100644 source/AIS/System/fn_bloodlossAI.sqf create mode 100644 source/AIS/System/fn_calculateLifeTime.sqf create mode 100644 source/AIS/System/fn_calculateReviveTime.sqf create mode 100644 source/AIS/System/fn_calculateStabilizeTime.sqf create mode 100644 source/AIS/System/fn_callHelp.sqf create mode 100644 source/AIS/System/fn_carry.sqf create mode 100644 source/AIS/System/fn_checkLauncher.sqf create mode 100644 source/AIS/System/fn_checkUnload.sqf create mode 100644 source/AIS/System/fn_diary.sqf create mode 100644 source/AIS/System/fn_disableRespawnButton.sqf create mode 100644 source/AIS/System/fn_drag.sqf create mode 100644 source/AIS/System/fn_findAIHelper.sqf create mode 100644 source/AIS/System/fn_getCargoIndex.sqf create mode 100644 source/AIS/System/fn_getOutMan.sqf create mode 100644 source/AIS/System/fn_handleHeal.sqf create mode 100644 source/AIS/System/fn_isMedic.sqf create mode 100644 source/AIS/System/fn_keyHandler.sqf create mode 100644 source/AIS/System/fn_killed.sqf create mode 100644 source/AIS/System/fn_loadAIS.sqf create mode 100644 source/AIS/System/fn_loadAISlocalToPlayer.sqf create mode 100644 source/AIS/System/fn_loadInjured.sqf create mode 100644 source/AIS/System/fn_medEvacArea.sqf create mode 100644 source/AIS/System/fn_moveAIHelper.sqf create mode 100644 source/AIS/System/fn_moveCargoRemote.sqf create mode 100644 source/AIS/System/fn_overrideHealAction.sqf create mode 100644 source/AIS/System/fn_postinit.sqf create mode 100644 source/AIS/System/fn_release.sqf create mode 100644 source/AIS/System/fn_removeFaks.sqf create mode 100644 source/AIS/System/fn_respawn.sqf create mode 100644 source/AIS/System/fn_restoreFaks.sqf create mode 100644 source/AIS/System/fn_reveal.sqf create mode 100644 source/AIS/System/fn_secondsToString.sqf create mode 100644 source/AIS/System/fn_setUnconscious.sqf create mode 100644 source/AIS/System/fn_stabilize.sqf create mode 100644 source/AIS/System/fn_unconcsiousRemote.sqf create mode 100644 source/AIS/System/fn_unconsciousAI.sqf create mode 100644 source/AIS/System/fn_unconsciousPlayer.sqf create mode 100644 source/AIS/System/fn_unloadInjured.sqf create mode 100644 source/AIS/cfgFunctions.hpp create mode 100644 source/DUWS_CONFIG.sqf delete mode 100644 source/WARCOM/WARCOM_opf_qrf.sqf delete mode 100644 source/createopfortified.sqf delete mode 100644 source/createpatrol.sqf delete mode 100644 source/dialog/fob/gui_edit_format.TXT delete mode 100644 source/dialog/info/gui_editor_info.TXT delete mode 100644 source/dialog/info/reset/gui_editor_info.TXT delete mode 100644 source/dialog/operative/operator_init.sqf delete mode 100644 source/dialog/request_vehicle.sqf delete mode 100644 source/dialog/squad/dialog_editor.TXT delete mode 100644 source/dialog/squad/rename/rename_gui_editor.TXT delete mode 100644 source/dialog/startup/startup_closed.sqf delete mode 100644 source/duws_revive/exitMenu.sqf delete mode 100644 source/duws_revive/get_loadout.sqf delete mode 100644 source/duws_revive/gui/duws_revive.hpp delete mode 100644 source/duws_revive/gui/guieditorformat.TXT delete mode 100644 source/duws_revive/onKilled.sqf delete mode 100644 source/duws_revive/playerRevived.sqf delete mode 100644 source/duws_revive/respawnClicked.sqf delete mode 100644 source/duws_revive/reviveInit.sqf delete mode 100644 source/duws_revive/set_loadout.sqf delete mode 100644 source/fnc_test.Sqf rename source/{WARCOM/WARCOM_blu_assault.sqf => functions/WARCOM/fn_WARCOM_blu_assault.sqf} (86%) rename source/{WARCOM/WARCOM_blu_patrol.sqf => functions/WARCOM/fn_WARCOM_blu_patrol.sqf} (87%) rename source/{WARCOM/WARCOM_gps_marker.sqf => functions/WARCOM/fn_WARCOM_gps_marker.sqf} (85%) rename source/{WARCOM/WARCOM_init.sqf => functions/WARCOM/fn_WARCOM_init.sqf} (70%) rename source/{WARCOM/WARCOM_opf_assault.sqf => functions/WARCOM/fn_WARCOM_opf_assault.sqf} (65%) rename source/{WARCOM/WARCOM_opf_patrol.sqf => functions/WARCOM/fn_WARCOM_opf_patrol.sqf} (60%) create mode 100644 source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf rename source/{WARCOM/WARCOM_wp.sqf => functions/WARCOM/fn_WARCOM_wp.sqf} (89%) rename source/{WARCOM/WARCOM_wp_blu_patrol.sqf => functions/WARCOM/fn_WARCOM_wp_blu_patrol.sqf} (94%) rename source/{WARCOM/WARCOM_wp_opf.sqf => functions/WARCOM/fn_WARCOM_wp_opf.sqf} (94%) rename source/{WARCOM/WARCOM_wp_opf_patrol.sqf => functions/WARCOM/fn_WARCOM_wp_opf_patrol.sqf} (94%) rename source/{WARCOM/WARCOM_wp_opf_qrf.sqf => functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf} (78%) rename source/{WARCOM/random_veh_opf_patrol.sqf => functions/WARCOM/fn_random_veh_blu_patrol.sqf} (88%) rename source/{WARCOM/random_veh_blu_patrol.sqf => functions/WARCOM/fn_random_veh_opf_patrol.sqf} (88%) rename source/{dialog/fob/fast_travel.sqf => functions/fob/fn_fast_travel.sqf} (100%) rename source/{dialog/fob/fobmanageropen.sqf => functions/fob/fn_fobmanageropen.sqf} (100%) rename source/{sounds/radiochatter.sqf => functions/fob/fn_radiochatter.sqf} (90%) rename source/{dialog/fob/reinforce.sqf => functions/fob/fn_reinforce.sqf} (100%) rename source/{bisArsenal.sqf => functions/generic/fn_bisArsenal.sqf} (100%) rename source/{captured.sqf => functions/generic/fn_captured.sqf} (84%) rename source/{dialog/convertCPtoAP.sqf => functions/generic/fn_convertCPtoAP.sqf} (100%) create mode 100644 source/functions/generic/fn_createopfortified.sqf rename source/{createoppatrol.sqf => functions/generic/fn_createoppatrol.sqf} (62%) rename source/{createopteam.sqf => functions/generic/fn_createopteam.sqf} (53%) rename source/{createopwpteam.sqf => functions/generic/fn_createopwpteam.sqf} (60%) create mode 100644 source/functions/generic/fn_createpatrol.sqf rename source/{dynamic_music/dyn_music_init.sqf => functions/generic/fn_dyn_music_init.sqf} (100%) rename source/{dynamic_menu.sqf => functions/generic/fn_dynamic_menu.sqf} (82%) rename source/{enterlocation.sqf => functions/generic/fn_enterlocation.sqf} (74%) rename source/{dialog/hc_init.sqf => functions/generic/fn_hc_init.sqf} (100%) rename source/{mapsize.sqf => functions/generic/fn_mapsize.sqf} (95%) rename source/{musicloop.sqf => functions/generic/fn_musicloop.sqf} (100%) rename source/{random_name.sqf => functions/generic/fn_random_name.sqf} (99%) rename source/{random_veh.sqf => functions/generic/fn_random_veh.sqf} (88%) rename source/{repetitive_cleanup.sqf => functions/generic/fn_repetitive_cleanup.sqf} (98%) rename source/{dialog/request.sqf => functions/generic/fn_request.sqf} (88%) rename source/{dialog/request_squad.sqf => functions/generic/fn_request_squad.sqf} (99%) rename source/{dialog/request_support.sqf => functions/generic/fn_request_support.sqf} (97%) rename source/{dialog/request_unit.sqf => functions/generic/fn_request_unit.sqf} (81%) create mode 100644 source/functions/generic/fn_request_vehicle.sqf rename source/{savegame.sqf => functions/generic/fn_savegame.sqf} (87%) rename source/{savegameClient.sqf => functions/generic/fn_savegameClient.sqf} (100%) rename source/{dialog/spawnVehicle.sqf => functions/generic/fn_spawnVehicle.sqf} (95%) create mode 100644 source/functions/generic/fn_zones_bonus.sqf rename source/{zonesundercontrol.sqf => functions/generic/fn_zonesundercontrol.sqf} (100%) rename source/{dialog/info/info.sqf => functions/info/fn_info.sqf} (100%) rename source/{initHQ/BluHQinit.sqf => functions/initHQ/fn_BluHQinit.sqf} (81%) create mode 100644 source/functions/initHQ/fn_HQaddactions.sqf create mode 100644 source/functions/initHQ/fn_commanderAnim.sqf rename source/{initHQ/drawIcon.sqf => functions/initHQ/fn_drawIcon.sqf} (60%) rename source/{initHQ/drawIconFnc.sqf => functions/initHQ/fn_drawIconFnc.sqf} (100%) rename source/{initHQ/fobmanager.sqf => functions/initHQ/fn_fobmanager.sqf} (97%) rename source/{initHQ/fortify.sqf => functions/initHQ/fn_fortify.sqf} (77%) rename source/{initHQ/fortifyFOB.sqf => functions/initHQ/fn_fortifyFOB.sqf} (72%) rename source/{initHQ/fortifyFOB2.sqf => functions/initHQ/fn_fortifyFOB2.sqf} (71%) rename source/{initHQ/guards.sqf => functions/initHQ/fn_guards.sqf} (81%) rename source/{initHQ/guardsFOB.sqf => functions/initHQ/fn_guardsFOB.sqf} (80%) rename source/{initHQ/guardsHQ.sqf => functions/initHQ/fn_guardsHQ.sqf} (84%) rename source/{initHQ/hq_radioloop.sqf => functions/initHQ/fn_hq_radioloop.sqf} (97%) rename source/{initHQ/locatorhq.sqf => functions/initHQ/fn_locatorhq.sqf} (86%) rename source/{initHQ/refortify.sqf => functions/initHQ/fn_refortify.sqf} (63%) rename source/{initHQ/refortifyFOB.sqf => functions/initHQ/fn_refortifyFOB.sqf} (62%) rename source/{initHQ/reguard.sqf => functions/initHQ/fn_reguard.sqf} (60%) rename source/{initHQ/reguardFOB.sqf => functions/initHQ/fn_reguardFOB.sqf} (60%) rename source/{initHQ/teleport.sqf => functions/initHQ/fn_teleport.sqf} (65%) create mode 100644 source/functions/initMission/fn_clientInit.sqf create mode 100644 source/functions/initMission/fn_processGroupConfig.sqf create mode 100644 source/functions/initMission/fn_processUnitConfig.sqf create mode 100644 source/functions/initMission/fn_processVehicleConfig.sqf rename source/{serverinit.sqf => functions/initMission/fn_serverInit.sqf} (89%) create mode 100644 source/functions/initZones/fn_createzone.sqf rename source/{initZones/createzonebackup.sqf => functions/initZones/fn_createzonebackup.sqf} (52%) rename source/{initZones/locatorzonesV1.sqf => functions/initZones/fn_locatorzonesV1.sqf} (94%) rename source/{initZones/locatorzonesV1_backup.sqf => functions/initZones/fn_locatorzonesV1_backup.sqf} (94%) rename source/{initZones/locatorzonesV2.sqf => functions/initZones/fn_locatorzonesV2.sqf} (90%) rename source/{misc/bottom_right_message.sqf => functions/misc/fn_bottom_right_message.sqf} (100%) rename source/{misc/gps_marker.sqf => functions/misc/fn_gps_marker.sqf} (100%) rename source/{missions/missions/destroy/mission.sqf => functions/missions/fn_destroy_mission.sqf} (88%) rename source/{missions/missionTimer.sqf => functions/missions/fn_missionTimer.sqf} (100%) rename source/{missions/missions/pilot/mission.sqf => functions/missions/fn_pilot_mission.sqf} (80%) rename source/{missions/missions/rescue/mission.sqf => functions/missions/fn_rescue_mission.sqf} (69%) rename source/{missions/missions/rescue/success.sqf => functions/missions/fn_rescue_success.sqf} (82%) rename source/{missions/missions/sabotage/mission.sqf => functions/missions/fn_sabotage_mission.sqf} (74%) rename source/{missions/missions/sabotage/success.sqf => functions/missions/fn_sabotage_success.sqf} (89%) rename source/{missions/missions/steal/mission.sqf => functions/missions/fn_steal_mission.sqf} (74%) rename source/{missions/stratmap.sqf => functions/missions/fn_stratmap.sqf} (85%) rename source/{missions/missions/target/mission.sqf => functions/missions/fn_target_mission.sqf} (71%) rename source/{missions/missions/underwater/mission.sqf => functions/missions/fn_underwater_mission.sqf} (83%) rename source/{missions/missions/underwater/success.sqf => functions/missions/fn_underwater_success.sqf} (94%) rename source/{dialog/operative/lbselected.sqf => functions/operative/fn_lbselected.sqf} (92%) rename source/{dialog/operative/operative_mission_complete.sqf => functions/operative/fn_operative_mission_complete.sqf} (100%) create mode 100644 source/functions/operative/fn_operator_add_aim.sqf create mode 100644 source/functions/operative/fn_operator_add_comms.sqf create mode 100644 source/functions/operative/fn_operator_add_courage.sqf create mode 100644 source/functions/operative/fn_operator_add_reflexes.sqf create mode 100644 source/functions/operative/fn_operator_add_reload.sqf create mode 100644 source/functions/operative/fn_operator_add_spotting.sqf rename source/{dialog/operative/operator_open.sqf => functions/operative/fn_operator_open.sqf} (100%) rename source/{dialog/operative/operator_recruit.sqf => functions/operative/fn_operator_recruit.sqf} (100%) rename source/{pFLIR/livefeed.sqf => functions/pFLIR/fn_livefeed.sqf} (85%) rename source/{pFLIR/livefeed1.sqf => functions/pFLIR/fn_livefeed1.sqf} (85%) rename source/{pFLIR/livefeedexit.sqf => functions/pFLIR/fn_livefeedexit.sqf} (62%) rename source/{persistent/experience/experience_ability_check.sqf => functions/persistent/fn_experience_ability_check.sqf} (85%) create mode 100644 source/functions/persistent/fn_experience_ability_fieldcomm.sqf rename source/{persistent/experience/experience_ability_heal.sqf => functions/persistent/fn_experience_ability_heal.sqf} (100%) rename source/{persistent/experience/experience_ability_logistic.sqf => functions/persistent/fn_experience_ability_logistic.sqf} (100%) rename source/{persistent/experience/experience_ability_logistic_boost.sqf => functions/persistent/fn_experience_ability_logistic_boost.sqf} (100%) rename source/{persistent/experience/experience_ability_refit.sqf => functions/persistent/fn_experience_ability_refit.sqf} (100%) rename source/{persistent/experience/experience_ability_slowtime.sqf => functions/persistent/fn_experience_ability_slowtime.sqf} (100%) rename source/{persistent/experience/experience_ability_stamina.sqf => functions/persistent/fn_experience_ability_stamina.sqf} (100%) rename source/{persistent/experience/experience_ability_warrior.sqf => functions/persistent/fn_experience_ability_warrior.sqf} (100%) rename source/{persistent/experience/experience_init.sqf => functions/persistent/fn_experience_init.sqf} (85%) rename source/{persistent/persistent_stats_init.sqf => functions/persistent/fn_persistent_stats_init.sqf} (95%) rename source/{persistent/persistent_stats_missions_total.sqf => functions/persistent/fn_persistent_stats_missions_total.sqf} (100%) rename source/{persistent/persistent_stats_reset.sqf => functions/persistent/fn_persistent_stats_reset.sqf} (100%) rename source/{persistent/persistent_stats_win.sqf => functions/persistent/fn_persistent_stats_win.sqf} (100%) rename source/{persistent/persistent_stats_zones_add.sqf => functions/persistent/fn_persistent_stats_zones_add.sqf} (100%) rename source/{initZones/prefabs/Barracks.sqf => functions/prefabs/fn_site_Barracks.sqf} (100%) rename source/{initZones/prefabs/CommStation.sqf => functions/prefabs/fn_site_CommStation.sqf} (100%) rename source/{initZones/prefabs/campsite.sqf => functions/prefabs/fn_site_campsite.sqf} (98%) rename source/{initZones/prefabs/commandOP.sqf => functions/prefabs/fn_site_commandOP.sqf} (99%) rename source/{initZones/prefabs/outpost1.sqf => functions/prefabs/fn_site_outpost1.sqf} (100%) rename source/{initZones/prefabs/outpost2.sqf => functions/prefabs/fn_site_outpost2.sqf} (100%) rename source/{initZones/prefabs/powerRelay.sqf => functions/prefabs/fn_site_powerRelay.sqf} (98%) rename source/{initZones/prefabs/reconOutpost.sqf => functions/prefabs/fn_site_reconOutpost.sqf} (100%) rename source/{initZones/prefabs/researchBunker.sqf => functions/prefabs/fn_site_researchBunker.sqf} (100%) rename source/{initZones/prefabs/researchStation.sqf => functions/prefabs/fn_site_researchStation.sqf} (100%) rename source/{initZones/prefabs/vehfittingstation.sqf => functions/prefabs/fn_site_vehfittingstation.sqf} (97%) rename source/{initZones => functions/prefabs}/old/createzone.sqf (72%) rename source/{initZones => functions/prefabs}/old/locatorzones.sqf (82%) rename source/{initZones => functions}/prefabs/regex.TXT (100%) rename source/{dialog/squad/copyloadout.sqf => functions/squad/fn_copyloadout.sqf} (100%) rename source/{dialog/squad/dismiss.sqf => functions/squad/fn_dismiss.sqf} (100%) rename source/{dialog/squad/dismissHC.sqf => functions/squad/fn_dismissHC.sqf} (100%) rename source/{dialog/squad/rename/renamesquad.sqf => functions/squad/fn_renamesquad.sqf} (100%) rename source/{dialog/squad/squadmng.sqf => functions/squad/fn_squadmng.sqf} (100%) rename source/{dialog/startup/hq_placement/manual.sqf => functions/startup/fn_manual.sqf} (92%) rename source/{dialog/startup/hq_placement/placement.sqf => functions/startup/fn_placement.sqf} (100%) rename source/{dialog/startup/hq_placement/placement_closed.sqf => functions/startup/fn_placement_closed.sqf} (51%) rename source/{dialog/startup/hq_placement/random.sqf => functions/startup/fn_random.sqf} (100%) rename source/{dialog/startup/startup.sqf => functions/startup/fn_startup.sqf} (100%) create mode 100644 source/functions/startup/fn_startup_closed.sqf rename source/{dialog/startup/startup_common.sqf => functions/startup/fn_startup_common.sqf} (100%) rename source/{dialog/startup/startup_manual_start.sqf => functions/startup/fn_startup_manual_start.sqf} (86%) rename source/{dialog/startup/startup_random_start.sqf => functions/startup/fn_startup_random_start.sqf} (84%) rename source/{dialog/startup/weather.sqf => functions/startup/fn_weather.sqf} (99%) rename source/{dialog/startup/weather_broadcast.sqf => functions/startup/fn_weather_broadcast.sqf} (100%) rename source/{dialog/startup/weather_client.sqf => functions/startup/fn_weather_client.sqf} (100%) rename source/{support/cluster/cluster.sqf => functions/support/cluster/fn_cluster.sqf} (96%) rename source/{support/cluster/mapclickcluster.sqf => functions/support/cluster/fn_mapclickcluster.sqf} (85%) create mode 100644 source/functions/support/fn_FOBactions.sqf rename source/{support/FOBreceiveaction.sqf => functions/support/fn_FOBreceiveaction.sqf} (82%) rename source/{support/ammobox.sqf => functions/support/fn_ammobox.sqf} (57%) rename source/{support/arty.sqf => functions/support/fn_arty.sqf} (100%) rename source/{support/fob.sqf => functions/support/fn_fob.sqf} (76%) rename source/{support/fob_ammobox.sqf => functions/support/fn_fob_ammobox.sqf} (84%) rename source/{support/mapclickarty.sqf => functions/support/fn_mapclickarty.sqf} (93%) rename source/{support/mapclickuav.sqf => functions/support/fn_mapclickuav.sqf} (87%) rename source/{support/paradrop.sqf => functions/support/fn_paradrop.sqf} (79%) create mode 100644 source/functions/support/fn_sitrep.sqf rename source/{support/uav_map.sqf => functions/support/fn_uav_map.sqf} (98%) rename source/{support/veh_refit.sqf => functions/support/fn_veh_refit.sqf} (100%) rename source/{support/taxi/boatTaxi.sqf => functions/support/taxi/fn_boatTaxi.sqf} (91%) rename source/{support/taxi/helotaxi.sqf => functions/support/taxi/fn_helotaxi.sqf} (91%) rename source/{support/taxi/mapclickboat.sqf => functions/support/taxi/fn_mapclickboat.sqf} (94%) rename source/{support/taxi/mapclickhelo.sqf => functions/support/taxi/fn_mapclickhelo.sqf} (94%) rename source/{support/taxi/random_music.Sqf => functions/support/taxi/fn_random_music.Sqf} (100%) rename source/{ => functions}/taw_vd/CfgFunctions.hpp (100%) create mode 100644 source/functions/taw_vd/GUI.h create mode 100644 source/functions/taw_vd/defines.h rename source/{ => functions}/taw_vd/fn_onChar.sqf (100%) rename source/{ => functions}/taw_vd/fn_onSavePressed.sqf (100%) rename source/{ => functions}/taw_vd/fn_onSaveSelectionChanged.sqf (100%) rename source/{ => functions}/taw_vd/fn_onSliderChanged.sqf (100%) rename source/{ => functions}/taw_vd/fn_onTerrainChanged.sqf (100%) rename source/{ => functions}/taw_vd/fn_openMenu.sqf (100%) rename source/{ => functions}/taw_vd/fn_openSaveManager.sqf (100%) rename source/{ => functions}/taw_vd/fn_stateTracker.fsm (100%) rename source/{ => functions}/taw_vd/fn_updateViewDistance.sqf (100%) rename source/{utilities/autoSave.sqf => functions/utilities/fn_autoSave.sqf} (100%) rename source/{utilities/groupReset.sqf => functions/utilities/fn_groupReset.sqf} (100%) rename source/{zonescap/blufor_cap.sqf => functions/zonescap/fn_blufor_cap.sqf} (83%) rename source/{zonescap/opfor_cap.sqf => functions/zonescap/fn_opfor_cap.sqf} (85%) create mode 100644 source/includes/CfgFunctions.hpp rename source/{ => includes}/debriefing.hpp (100%) rename source/{dialog => includes}/defines.hpp (100%) rename source/{dialog/fob => includes}/fobmanager.hpp (96%) rename source/{ => includes}/hints.hpp (100%) rename source/{dialog => includes}/info/info.hpp (100%) rename source/{dialog/info/reset => includes/info}/reset.hpp (95%) rename source/{ => includes}/locations.hpp (100%) rename source/{dialog => includes}/operative/identities.hpp (100%) rename source/{dialog => includes}/operative/operative.hpp (96%) rename source/{ => includes}/params.hpp (100%) rename source/{dialog => includes}/request.hpp (94%) rename source/{dialog/squad/rename => includes/squad}/renamesquad.hpp (95%) rename source/{dialog => includes}/squad/squadmng.hpp (96%) rename source/{dialog => includes}/squad_number_init.hpp (100%) rename source/{dialog/startup/hq_placement => includes/startup}/placement.hpp (86%) rename source/{dialog => includes}/startup/startup.hpp (97%) rename source/{support => includes}/support.hpp (83%) rename source/{dialog => includes}/supports_init.hpp (100%) delete mode 100644 source/initHQ/HQaddactions.sqf delete mode 100644 source/initZones/createzone.sqf create mode 100644 source/mission.sqm.oldBackup delete mode 100644 source/persistent/experience/experience_ability_fieldcomm.sqf delete mode 100644 source/support/FOBactions.sqf delete mode 100644 source/support/sitrep.sqf delete mode 100644 source/zones_bonus.sqf diff --git a/source/AIS/AIS_SETUP.sqf b/source/AIS/AIS_SETUP.sqf new file mode 100644 index 0000000..ff19485 --- /dev/null +++ b/source/AIS/AIS_SETUP.sqf @@ -0,0 +1,38 @@ +// by Psychobastard +// AIS REVIVE Setup-File + +//__________________________________________________________________________________________________________________________________________________________________ +// v v v v v v v v v v v v --- Main Settings --- v v v v v v v v v v v v + +AIS_REVIVE_INIT_UNITS = "allPlayers"; // Auto-Init a group of units: "allPlayers" , "allPlayables" , "allUnits", "allUnitsBLUFOR", "allUnitsOPFOR", "allUnitsINDFOR", "allUnitsCIVILIAN" + // Warning: I didn't recomment to use "allUnits" if you play with a lot of AI units! AIS is mainly created for players and/or their AI group. +AIS_MEDICAL_EDUCATION = 1; // Who can revive an unconscious unit? 0 == Everybody, 1 == Everybody with a First Aid Kit or Medkit, 2 == Only Medics (this affects both, AI and players!). +AIS_REVIVE_GUARANTY = false; // If true you will fall everytime in uncoscious mode, regardless how strong the impact of damage was. +AIS_MEDEVAC_STATIONS = [];// Add one or more objects and a radius to activate the medevac feature. If enabled revive is only at this place(s) possible. Empty array means feature is disabled. + // Syntax: f.e.: [ [myMedevacVehicle, 15], [myMedicTent, 10] ] --> make sure the variable name is avalible at gamestart. Otherwise call it later in a function. + + +//__________________________________________________________________________________________________________________________________________________________________ +// v v v v v v v v v v v v --- Optional Settings --- v v v v v v v v v v v v + +AIS_DAMAGE_TOLLERANCE_FACTOR = 1; // A higher value means more damage tolerance. 1 is Vanilla. 0.8 mean all damage will reduce to 80% of Vanilla. +AIS_BLEEDOUT_TIME = 300; // Basic life time in seconds until the unit bleed out and die.. The real life time depends on the real damage of the unit. (can be less or more time from the basic value) +AIS_REVIVETIME = 30; // Basic revive time in seconds. The real revive time depends on the real damage of the unit. (can be less or more time from the basic value) +AIS_STABILIZETIME = 20; // Basic stabilize time in seconds to stop the bleeding of a unconscious unit. The real revive time depends on the real damage of the unit. (can be less or more time from the basic value) +AIS_REVIVE_HEAL = false; // If set to true the injured unit get completely healed after the revive. (casual gameplay without a medic) +AIS_TOGGLE_RADIO = true; // If set to true, unconscious players cannot use his TFAR or ACRE radios. +AIS_NO_CHAT = true; // If set to true, a injured player cannot use text chat during he is uncoscious. +AIS_AI_HELP_RADIUS = 50; // Number, Radius in metres. Units in this radius will help to revive if no group member is able to revive. Max value is 200 metres. +AIS_DISABLE_RESPAWN_BUTTON = 30; // Time in seconds while the respawn button is disabled (Esc Menu). Set to 0 to enable the respawn button everytime. +AIS_DISABLE_FURTHER_DAMAGE = false; // If set to true, an unconcious unit wont become further damage til death. If set to false, an unconcious unit can also die before bleedout timer is over. (f.e. trough near explosions) + + +//__________________________________________________________________________________________________________________________________________________________________ +// v v v v v v v v v v v v --- Visual Settings --- v v v v v v v v v v v v + +AIS_SHOW_UNC_MARKERS = true; // If set to true, a marker will show injured units on the map. +AIS_SHOW_UNC_MESSAGE_TO = "Group"; // "None", "Side", "Group" --> who read the message about wounded units. +AIS_SHOW_UNC_3D_MARKERS = true; // If set to true, an in-game visible 3D-icon shows you the position of injured units (within a range of 20 metres and 35 metres for medics). +AIS_IMPACT_EFFECTS = true; // Set to true to enable impact effects. (simple simluation of supressing effects) +AIS_SHOW_COUNTDOWN = true; // If set to true, an unconscious unit will be able to see the bleed out timer. +AIS_SHOW_DIARYINFO = true; // If set to true, a diary entry with some informations about the AIS (Credits, features, How to) is added. \ No newline at end of file diff --git a/source/AIS/Core/cfgFunctions.hpp b/source/AIS/Core/cfgFunctions.hpp new file mode 100644 index 0000000..4a4fe3d --- /dev/null +++ b/source/AIS/Core/cfgFunctions.hpp @@ -0,0 +1,30 @@ +class AIS_Core +{ + class AIS_Core + { + file = "AIS\Core"; + class preInit { preInit = 1; }; + class postInit { postInit = 1; }; + class addAction; + class aisInitHost; + class aisInitPlayer; + class bindEventHandler; + class createLocalMarker; + class dynamicText; + class initEvents; + class inRange; + class interaction_Loop; + class isPlayable; + class onEachFrame; + class onNextFrame; + class progress_ShowBar; + class progress_ShowBarText; + class removeonEachFrame; + class setPosAGLS; + class setVariables; + class triggerEvent; + class waitUntilAndExecute; + class handleDisconnect; + class resetOnTeamSwitch; + }; +}; \ No newline at end of file diff --git a/source/AIS/Core/fn_Interaction_Loop.sqf b/source/AIS/Core/fn_Interaction_Loop.sqf new file mode 100644 index 0000000..89aba08 --- /dev/null +++ b/source/AIS/Core/fn_Interaction_Loop.sqf @@ -0,0 +1,46 @@ +/* + Author: NetFusion + Description: + Continuously checks whether an action should be added to the cursorTarget. + Parameter(s): + - + Remarks: + * Should only be called once per mission. + + Returns: + - + Example: + - +*/ + +AIS_Core_lastCursorTarget = objNull; + +[{ + _cursorTarget = cursorTarget; + if (_cursorTarget isEqualTo AIS_Core_lastCursorTarget || {player distance _cursorTarget > 15}) exitWith {}; // psycho: prevent cycling trough cursorTargets more than 15m away (engine limitation is 15m for every action) + AIS_Core_lastCursorTarget = _cursorTarget; + + private _objActions = _cursorTarget getVariable ["AIS_Core_actionStorage", []]; + { + _x params ["_onObject", "_text", "_distance", "_condition", "_callback", "_args", "_formated"]; + + if (!(_x in _objActions)) then { + if ((_onObject isEqualType "" && {_cursorTarget isKindOf _onObject}) || (_onObject isEqualType objNull && {_cursorTarget isEqualTo _onObject})) then { + private _action = _cursorTarget addAction [_text, _callback, _args, 1.5, true, true, "", _condition, _distance]; + _objActions pushBack _x; + + if (_formated != "") then { + _cursorTarget setUserActionText [ + _action, + _text, + format [_formated, _text], + "" + ]; + }; + }; + }; + nil + } count (missionNamespace getVariable ["AIS_Core_actionStorage", []]); + + _cursorTarget setVariable ["AIS_Core_actionStorage", _objActions]; //@todo maybe init array and remove this line - this requires module dependencies +}] call AIS_Core_fnc_onEachFrame; \ No newline at end of file diff --git a/source/AIS/Core/fn_addAction.sqf b/source/AIS/Core/fn_addAction.sqf new file mode 100644 index 0000000..9340f8f --- /dev/null +++ b/source/AIS/Core/fn_addAction.sqf @@ -0,0 +1,81 @@ +/* + Author: [C-L-F] NetFusion + Edited: Psychobastard + + Description: + Add an action to an object or type(s) of object(s). + + Parameter(s): + 0: STRING - the title of the action. + 1: OBJECT, ARRAY, STRING - the object (type) which the action should be added to. + 2: NUMBER - the distance in which the action is visible. + 3: STRING - the condition which is evaluated on every frame (if play is in range) to determine whether the action is visible. + 4: CODE - the callback which gets called when the action is activated. + 5: ARRAY - (optional) the arguments which get passed to the callback. + + Remarks: + * '_target' is the object inside the condition string. + * [object, caller, ID, arguments] is _this in the callback + + Returns: + - + + Example: + ["Hint Hello!", player, 0, "true", { hint format ["Hello %1", name player]; }] call AIS_Core_fnc_addAction; + ["Hint Hello!", "Man", 3, "true", { hint format ["Hello %1", name (_this select 0)]; }] call AIS_Core_fnc_addAction; +*/ + +params ["_text", "_onObject", "_distance", "_condition", "_callback", ["_args", []], ["_formated", "", [""]]]; + + +if (_distance > 0) then { + _condition = format ["([cursorTarget, %1] call AIS_Core_fnc_inRange) && {%2}", _distance, _condition]; +}; + + +if (_onObject isEqualType objNull && {_onObject isEqualTo AIS_Core_realPlayer}) exitWith { + private _action = _onObject addAction [_text, _callback, _args, 1.5, false, true, "", _condition, _distance]; + + if (_formated != "") then { + _onObject setUserActionText [ + _action, + _text, + format [_formated, _text], + "" + ]; + }; + + [ + "AIS_playerChanged", { + params ["_data", "_params"]; + _data params ["_currentPlayer", "_oldPlayer"]; + _params params ["_text", "_callback", "_distance", ["_args", []], "_condition", ["_formated", "", [""]]]; + + private _action = _currentPlayer addAction [_text, _callback, _args, 1.5, false, true, "", _condition, _distance]; + + if (_formated != "") then { + _currentPlayer setUserActionText [ + _action, + _text, + format [_formated, _text], + "" + ]; + }; + }, + [_text, _callback, _distance, _args, _condition, _formated] + ] call AIS_Core_fnc_bindEventHandler; + +}; + +if (!(_onObject isEqualType [])) then { + _onObject = [_onObject]; +}; + +private _actionStorage = missionNamespace getVariable ["AIS_Core_actionStorage", []]; +{ + _actionStorage pushBack [_x, _text, _distance, _condition, _callback, _args, _formated]; + nil +} count _onObject; +missionNamespace setVariable ["AIS_Core_actionStorage", _actionStorage]; //@todo maybe init array and remove this line + +_action \ No newline at end of file diff --git a/source/AIS/Core/fn_aisInitHost.sqf b/source/AIS/Core/fn_aisInitHost.sqf new file mode 100644 index 0000000..63cfaf9 --- /dev/null +++ b/source/AIS/Core/fn_aisInitHost.sqf @@ -0,0 +1,33 @@ +// this script run on the server/host for every unit which should be added to the revive system. It run's once by starting the mission. +params ["_unit"]; +if (_unit getVariable ["AIS_noReviveInit", false]) exitWith {}; + +if (!isNil {_unit getVariable "ais_aisInit"}) then { + _unit removeAllEventHandlers "Killed"; + _unit removeAllEventHandlers "Respawn"; + _unit removeAllEventHandlers "HandleHeal"; + [_unit] call AIS_Core_fnc_setVariables; +}; +_unit setVariable ["ais_aisInit", true]; + + +// set damage EH only for local and non-player units! +// last check if unit is local +if (local _unit && !(isPlayer _unit)) then { + [_unit] spawn { + _unit = _this select 0; + + waitUntil {!isNil {_unit getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; + _unit removeAllEventHandlers "handleDamage"; + ["%1 --- add damageEH to AI %2", diag_ticktime, _unit] call BIS_fnc_logFormat; + ais_hdEH = _unit addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; + + ais_hkEH = _unit addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; + + if ([_unit] call AIS_Core_fnc_isPlayable) then { + ais_hrEH = _unit addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; + }; + _unit removeAllEventHandlers "HandleHeal"; + ais_hhEH = _unit addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + }; +}; \ No newline at end of file diff --git a/source/AIS/Core/fn_aisInitPlayer.sqf b/source/AIS/Core/fn_aisInitPlayer.sqf new file mode 100644 index 0000000..934ad0f --- /dev/null +++ b/source/AIS/Core/fn_aisInitPlayer.sqf @@ -0,0 +1,105 @@ +// this script run only by the player! +private _player = _this; +if (_player != player) exitWith {["%1 --- exit aisInitPlayer cause it's not the local player itself %2", diag_ticktime, _player] call BIS_fnc_logFormat}; +if (isClass (configFile >> "CfgPatches" >> "ace_medical")) exitWith {["AIS: AIS shutdown itself cause ACE medical system is also running. ACE medical and AIS cant work at the same time."] call BIS_fnc_logFormat}; + +if (_player getVariable ["AIS_noReviveInit", false]) exitWith {}; + +// set damage EH local to the player +if (local _player) then { + [_player] call AIS_Core_fnc_setVariables; + + [_player] spawn { + _player = _this select 0; + waitUntil {!isNil {_player getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; + _player removeAllEventHandlers "handleDamage"; // make sure nothing else working byside + //["%1 --- add damageEH to player %2", diag_ticktime, _player] call BIS_fnc_logFormat; + _player addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; + + _player addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; + + _player addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; + + _player addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + + waitUntil {!isNull (findDisplay 46)}; + (findDisplay 46) displayAddEventHandler ["KeyDown", {_this call AIS_System_fnc_keyHandler}]; + }; +}; + +// AI is local to the group leader on dedicated environment +if (!isServer && (count (units group player) > 1)) then { + if (leader group _player isEqualTo _player) then { + + [_player] spawn { + _player = _this select 0; + _groupWithoutPlayers = ((units group _player) - (allUnits select {isPlayer _x})); + {[_x] call AIS_Core_fnc_setVariables; true} count _groupWithoutPlayers; + + waitUntil {!isNil {_player getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; + { + _x removeAllEventHandlers "handleDamage"; + //["%1 --- add damageEH to groupmember of %3's group: %2", diag_ticktime, _x, _player] call BIS_fnc_logFormat; + _x addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; + + _x removeAllEventHandlers "Killed"; + _x addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; + + _x removeAllEventHandlers "Respawn"; + if ([_x] call AIS_Core_fnc_isPlayable) then { + _x addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; + }; + + _x addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + + true + } count _groupWithoutPlayers; + }; + + }; +}; + + +// add handleHeal local to the player for every unit and set the correct anim-state (local) +private _allPlayers = allUnits select {isPlayer _x}; // doesn't use allPlayers at this point, cause it can be delayed in self-hosted env. +private _ais_revive_units = toLower AIS_REVIVE_INIT_UNITS; +private _init_units = call { + if (_ais_revive_units isEqualTo "allunits") exitWith {allUnits}; + if (_ais_revive_units isEqualTo "allplayers") exitWith {_allPlayers}; // at this point only as a dummy. Cause everytime every player will auto-init, regardless what the setup will say. + if (_ais_revive_units isEqualTo "allplayables") exitWith {if (isMultiplayer) then {playableUnits} else {switchableUnits}}; + if (_ais_revive_units isEqualTo "allunitsblufor") exitWith {allUnits select {(side _x) isEqualTo blufor}}; + if (_ais_revive_units isEqualTo "allunitsopfor") exitWith {allUnits select {(side _x) isEqualTo opfor}}; + if (_ais_revive_units isEqualTo "allunitsindfor") exitWith {allUnits select {(side _x) isEqualTo resistance}}; + if (_ais_revive_units isEqualTo "allunitscivilian") exitWith {allUnits select {(side _x) isEqualTo civilian}}; + diag_log "AIS ERROR: Issue in Setup-File found! Parameter AIS_REVIVE_UNITS wrong defined."; [] +}; +{ + _x removeAllEventHandlers "HandleHeal"; + _x addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + + if (_x getVariable ["ais_unconscious", false]) then { + if (!isNull(_x getVariable ["ais_DragDrop_Player", objNull])) then { + _x switchMove "AinjPpneMrunSnonWnonDb"; + } else { + _x playActionNow "agonyStart"; + }; + }; + + true +} count _init_units; + + +ais_medequip_array = []; +if (AIS_TOGGLE_RADIO) then { + [true] call AIS_Effects_fnc_toggleRadio; +}; + +// JIP in a unconscious AI... and avoid cheating by left in lobby... +if (_player getVariable ["ais_unconscious", false]) then { + [{[(_this select 0)] call AIS_System_fnc_setUnconscious}, [_player]] call AIS_Core_fnc_onNextFrame; +}; + +inGameUISetEventHandler ["Action", "_this call AIS_System_fnc_overrideHealAction"]; + + +_respawnDelay = getMissionConfigValue ["respawnDelay", 0]; \ No newline at end of file diff --git a/source/AIS/Core/fn_bindEventHandler.sqf b/source/AIS/Core/fn_bindEventHandler.sqf new file mode 100644 index 0000000..e7f97b1 --- /dev/null +++ b/source/AIS/Core/fn_bindEventHandler.sqf @@ -0,0 +1,30 @@ +/* + Arma Mission Enhancement - Core\Events\fn_bindEventHandler.sqf + + Author: NetFusion + + Description: + Bind an EH for a custom event. This EH will be called when the event is triggered. + + Parameter(s): + - 0: STRING - the name of the event + - 1: CODE - the code which get called (_this select 0 will be the data, _this select 1 will be the params) + - 2: ARRAY - the params passed to the code (optional) + + Returns: + - + Example: + + ["playerChanged", { hint "Player has changed"; }] call AIS_Core_fnc_bindEventHandler; +*/ + + +params ["_name", "_code", ["_params", []]]; + +// Form the name of the EH storage +_name = format ["AIS_Core_eventHandlersFor%1", _name]; + +// Push the data on the EH array (specific by name). +private _eventHandlers = missionNamespace getVariable [_name, []]; +_eventHandlers pushBack [_code, _params]; +missionNamespace setVariable [_name, _eventHandlers]; \ No newline at end of file diff --git a/source/AIS/Core/fn_createLocalMarker.sqf b/source/AIS/Core/fn_createLocalMarker.sqf new file mode 100644 index 0000000..7de3220 --- /dev/null +++ b/source/AIS/Core/fn_createLocalMarker.sqf @@ -0,0 +1,26 @@ +// ["my marker", position player, "ICON", "ColorRed", [0.5,0.5]] call AIS_Core_fnc_createLocalMarker; + +params [ + ["_name","",[""]], + ["_pos",[0,0],[[]]], + ["_shape","ICON",[""]], + ["_color","Default",[""]], + ["_size",[1,1],[[]]], + ["_text","",[""]], + ["_dir",0,[0]], + ["_type","mil_dot",[""]], + ["_brush","",[""]] +]; + +private _marker = createMarkerLocal [_name, _pos]; + +_marker setMarkerShapeLocal _shape; +_marker setMarkerColorLocal _color; +_marker setMarkerSizeLocal _size; +_marker setMarkerTextLocal _text; +_marker setMarkerDirLocal _dir; +_marker setMarkerTypeLocal _type; +if (_brush != "") then {_marker setMarkerBrushLocal _brush}; + + +_marker \ No newline at end of file diff --git a/source/AIS/Core/fn_dynamicText.sqf b/source/AIS/Core/fn_dynamicText.sqf new file mode 100644 index 0000000..2ed9817 --- /dev/null +++ b/source/AIS/Core/fn_dynamicText.sqf @@ -0,0 +1,10 @@ +/* + ["Mein Text"] call AIS_Core_fnc_dynamicText; +*/ + +_text = _this param [0,"",["",{}]]; + +_text = "" + _text + ""; +[_text, (safeZoneX - 0.15), (safeZoneY + 0.3), 3, 1, 0, 3] spawn BIS_fnc_dynamicText; + +true \ No newline at end of file diff --git a/source/AIS/Core/fn_handleDisconnect.sqf b/source/AIS/Core/fn_handleDisconnect.sqf new file mode 100644 index 0000000..f6aa163 --- /dev/null +++ b/source/AIS/Core/fn_handleDisconnect.sqf @@ -0,0 +1,44 @@ +/* + * Author: Psycho + + * Server side handling of disconnected players. The disconnected entity get transfered to the server and re-init the AIS. + + * Arguments: + 0: Entity (Object, old player) + + * Return value: + - + + * Attention! + Override: If this EH code returns true, the unit, previously occupied by player, gets transferred to the server, becomes AI and continues to live, even with description.ext param disabledAI = 1; +*/ + + +params ["_entity"]; + +// delete unit if mission designer have set disabledAI param set to 1 +_deleteEntity = false; +_deleteEntity = if ((getMissionConfigValue "disabledAI") isEqualType 0) then { + _back = if ((getMissionConfigValue ["disabledAI", 0]) > 0) then {true} else {false};_back +} else { + _back = if ((toUpper((getMissionConfigValue ["disabledAI", "false"]))) isEqualTo "TRUE") then {true} else {false};_back +}; + +if (_deleteEntity) exitWith { + if (local _entity) then { + if (!isNull objectParent _entity) then { + unassignVehicle _entity; + moveOut _entity; + }; + deleteVehicle _entity; + }; + false +}; + +// othrwise re-init the unit on the new owner (server) +if (!isNil {_entity getVariable "ais_unconscious"}) then { + _entity call AIS_Core_fnc_aisInitHost; +}; + + +true \ No newline at end of file diff --git a/source/AIS/Core/fn_inRange.sqf b/source/AIS/Core/fn_inRange.sqf new file mode 100644 index 0000000..0582229 --- /dev/null +++ b/source/AIS/Core/fn_inRange.sqf @@ -0,0 +1,30 @@ +/* + Author: [C-L-F] NetFusion + + Description: + Checks whether an object is in a given range to player. + + Parameter(s): + 0: OBJECT - the object which should be checked. + 1: NUMBER - the range to check. + + Returns: + - BOOL - true if the object in in range, false if not. + + Example: + [object, 10] call AIS_Core_fnc_inRange; +*/ + +params [ + ["_object", objNull, [player]], + ["_distance", 15, [0]] +]; + +_return = if (!isNull _object && {player distance2D _object < _distance}) then { + true +} else { + false +}; + + +_return \ No newline at end of file diff --git a/source/AIS/Core/fn_initEvents.sqf b/source/AIS/Core/fn_initEvents.sqf new file mode 100644 index 0000000..e15e787 --- /dev/null +++ b/source/AIS/Core/fn_initEvents.sqf @@ -0,0 +1,77 @@ +/* + Arma Mission Enhancement - Core\Events\fn_initEvents.sqf + Author: NetFusion + Changed: Psycho - expand function with "next-frame" and "waitUntil" elements + + Description: + Adds a loop which call all OEF EHs. Will be called by autoload for client and server. There is no need to call it manually. + + Parameter(s): + - + + Returns: + - + + Example: + - +*/ + +AIS_nextFrameNo = diag_frameno + 1; +// PostInit can be 2 frames after preInit, need to manually set AIS_nextFrameNo, so new items get added to buffer B while processing A for the first time: +AIS_nextFrameBufferA = [[[], {AIS_nextFrameNo = diag_frameno;}]]; +AIS_nextFrameBufferB = []; +AIS_waitUntilAndExecArray = []; + + +AIS_Core_eachFrameHandlerId = addMissionEventHandler ["EachFrame", { + + // Execute per frame handlers + // Fetch all OEF EHs from missionNamespace. + private _onEachFrameHandler = missionNamespace getVariable ["AIS_Core_onEachFrameData", []]; + { + _x params ["_code", "_delay", "_nextExecTime", "_params"]; + + // If the execution time is up call the function. + if (diag_tickTime > _nextExecTime) then { + // Set the new execution time depending on the provided delay. + _x set [2, _nextExecTime + _delay]; + + [_forEachIndex, _params] call _code; //@todo if an EH removed itself the next EH may be skipped + }; + } forEach _onEachFrameHandler; + + + // Execute the exec next frame functions (from CBA) + if (count AIS_nextFrameBufferA > 0) then { + { + (_x select 0) call (_x select 1); + false + } count AIS_nextFrameBufferA; + // Swap double-buffer: + AIS_nextFrameBufferA = AIS_nextFrameBufferB; + AIS_nextFrameBufferB = []; + AIS_nextFrameNo = diag_frameno + 1; + }; + + + // handle the waitUntil and execute function (from CBA) + if (count AIS_waitUntilAndExecArray > 0) then { + private _delete = false; + { + // if condition is satisfied call statement + if ((_x select 2) call (_x select 0)) then { + (_x select 2) call (_x select 1); + AIS_waitUntilAndExecArray set [_forEachIndex, objNull]; + _delete = true; + }; + } forEach AIS_waitUntilAndExecArray; + if (_delete) then { + AIS_waitUntilAndExecArray = AIS_waitUntilAndExecArray - [objNull]; + }; + }; + + // remove the pfh if client left the mission + if (getClientState == "GAME FINISHED") then { + removeMissionEventHandler ["EachFrame", AIS_Core_eachFrameHandlerId]; + }; +}]; \ No newline at end of file diff --git a/source/AIS/Core/fn_isPlayable.sqf b/source/AIS/Core/fn_isPlayable.sqf new file mode 100644 index 0000000..54d50d1 --- /dev/null +++ b/source/AIS/Core/fn_isPlayable.sqf @@ -0,0 +1,24 @@ +/* + * Author: Psycho + + * Check if a unit is a playable unit. + + * Arguments: + 0: Unit (Object) + + * Return value: + BOOL (true if playable) +*/ + +params ["_unit"]; +private _isplayable = false; +if (isPlayer _unit) exitWith {true}; + +_isplayable = if (isMultiplayer) then { + if (_unit in playableUnits) then {true} else {false}; +} else { + if (_unit in switchableUnits) then {true} else {false}; +}; + + +_isplayable \ No newline at end of file diff --git a/source/AIS/Core/fn_onEachFrame.sqf b/source/AIS/Core/fn_onEachFrame.sqf new file mode 100644 index 0000000..91aa399 --- /dev/null +++ b/source/AIS/Core/fn_onEachFrame.sqf @@ -0,0 +1,31 @@ +/* + Arma Mission Enhancement - Core\Events\fn_onEachFrame.sqf + + Author: NetFusion + + Description: + Adds an OEF EHs. The EH will be called on each frame with a custom delay between the calls. + + Parameter(s): + - 1: CODE - the code which is called (_this select 0 will be the EH id, _this select 1 will be the params) + - 2: SCALAR - the delay between two code calls in seconds (optional) + - 3: ARRAY - the parameters which get passed to the code on call (optional) + + Returns: + - + + Example: + [{ hint (str diagFrameNo); }] call AIS_Core_fnc_onEachFrame; +*/ + + +params [ + "_code", + ["_delay", 0], + ["_params", []] +]; + +// Push the data on the OEF EH array. +private _onEachFrameData = missionNamespace getVariable ["AIS_Core_onEachFrameData", []]; +_onEachFrameData pushBack [_code, _delay, diag_tickTime + _delay, _params]; +missionNamespace setVariable ["AIS_Core_onEachFrameData", _onEachFrameData]; \ No newline at end of file diff --git a/source/AIS/Core/fn_onNextFrame.sqf b/source/AIS/Core/fn_onNextFrame.sqf new file mode 100644 index 0000000..fff1792 --- /dev/null +++ b/source/AIS/Core/fn_onNextFrame.sqf @@ -0,0 +1,31 @@ +/* ---------------------------------------------------------------------------- +Function: AIS_Core_fnc_onNextFrame + +Description: + Executes a code once in non sched environment on the next frame. +Parameters: + + _function - The function to run. + _args - Parameters passed to the function executing. This will be the same array every execution. [optional] +Returns: + Nothing + +Examples: + (begin example) + [{player sideChat format ["This is frame %1, not %2", diag_frameno, _this select 0];}, [diag_frameno]] call AIS_Core_fnc_onNextFrame; + (end) + +Author: + esteldunedain and PabstMirror, donated from ACE3 +---------------------------------------------------------------------------- */ + +params [ + ["_function", {}, [{}]], + ["_args", []] +]; + +if (diag_frameno != AIS_nextFrameNo) then { + AIS_nextFrameBufferA pushBack [_args, _function]; +} else { + AIS_nextFrameBufferB pushBack [_args, _function]; +}; \ No newline at end of file diff --git a/source/AIS/Core/fn_postinit.sqf b/source/AIS/Core/fn_postinit.sqf new file mode 100644 index 0000000..a7d55e6 --- /dev/null +++ b/source/AIS/Core/fn_postinit.sqf @@ -0,0 +1,73 @@ +if (ais_ace_shutdown) exitWith {["AIS: AIS shutdown itself cause ACE mod was detected. ACE and AIS cant work at the same time."] call BIS_fnc_logFormat}; +#include "..\AIS_SETUP.sqf" + +if (isServer) then { + private _allPlayers = allUnits select {isPlayer _x}; // doesn't use allPlayers at this point, cause it can be delayed in self-hosted env. + + private _ais_revive_units = toLower AIS_REVIVE_INIT_UNITS; + private _init_units = call { + if (_ais_revive_units isEqualTo "allunits") exitWith {allUnits}; + if (_ais_revive_units isEqualTo "allplayers") exitWith {_allPlayers}; // at this point only as a dummy. Cause everytime every player will auto-init, regardless what the setup will say. + if (_ais_revive_units isEqualTo "allplayables") exitWith {if (isMultiplayer) then {playableUnits} else {switchableUnits}}; + if (_ais_revive_units isEqualTo "allunitsblufor") exitWith {allUnits select {(side _x) isEqualTo blufor}}; + if (_ais_revive_units isEqualTo "allunitsopfor") exitWith {allUnits select {(side _x) isEqualTo opfor}}; + if (_ais_revive_units isEqualTo "allunitsindfor") exitWith {allUnits select {(side _x) isEqualTo resistance}}; + if (_ais_revive_units isEqualTo "allunitscivilian") exitWith {allUnits select {(side _x) isEqualTo civilian}}; + diag_log "AIS ERROR: Issue in Setup-File found! Parameter AIS_REVIVE_UNITS wrong defined."; [] + }; + + // run the init for all units present by game/mission start + _init_units = _init_units - _allPlayers; + //diag_log format ["ais init units: %1", _init_units]; + if (count _init_units > 0) then { + { + [_x] call AIS_Core_fnc_aisInitHost; + true + } count _init_units; + }; + + addMissionEventHandler ["HandleDisconnect", {_this call AIS_Core_fnc_handleDisconnect}]; +}; + +if (isNil "AIS_MEDEVAC_STATIONS") then { + AIS_MEDEVAC_STATIONS = []; +} else { + if !(AIS_MEDEVAC_STATIONS isEqualType []) then { + AIS_MEDEVAC_STATIONS = []; + ["AIS: AIS_MEDEVAC_STATIONS wasnt defined in the correct way."] call BIS_fnc_logFormat; + }; +}; + +if (isDedicated || !hasInterface) exitWith {}; + +// This is needed to provide a player object for zeus controlled units. Important to ensure that player is not null here (which is done in autoload). +AIS_Core_realPlayer = player; +AIS_Core_realPlayer call AIS_Core_fnc_aisInitPlayer; +AIS_Core_realSide = getNumber (configfile >> "CfgVehicles" >> (typeOf AIS_Core_realPlayer) >> "side"); + +[{ + // There is no command to get the current player but BI has an variable in mission namespace we can use. + private _currentPlayer = missionNameSpace getVariable ["bis_fnc_moduleRemoteControl_unit", player]; // Psycho: isNull until a unit is remote controlled + + // If the player changed we trigger an event and update the global variable. + if (AIS_Core_realPlayer != _currentPlayer) then { + removeAllActions AIS_Core_realPlayer; + AIS_Core_realPlayer enableAI "TEAMSWITCH"; + + ["AIS_playerChanged", [_currentPlayer, AIS_Core_realPlayer]] call AIS_Core_fnc_triggerEvent; + + AIS_Core_realPlayer = _currentPlayer; + AIS_Core_realSide = getNumber (configfile >> "CfgVehicles" >> (typeOf AIS_Core_realPlayer) >> "side"); + }; +}] call AIS_Core_fnc_onEachFrame; + +true call AIS_Core_fnc_Interaction_loop; + +if (AIS_SHOW_DIARYINFO) then { + call AIS_System_fnc_diary; +}; + +true spawn { + waitUntil {time > 0}; + AIS_Core_3DEHId = addMissionEventHandler ["Draw3D", {_this call AIS_Effects_fnc_draw3D}]; +}; \ No newline at end of file diff --git a/source/AIS/Core/fn_preinit.sqf b/source/AIS/Core/fn_preinit.sqf new file mode 100644 index 0000000..ad668ac --- /dev/null +++ b/source/AIS/Core/fn_preinit.sqf @@ -0,0 +1,21 @@ +diag_log format ["############## %1 ############## - AIS init started", missionName]; + +if (isServer) then { + ais_ace_shutDown = false; + if (isClass (configFile >> "CfgPatches" >> "ace_medical")) then { + ais_ace_shutDown = true; + ["AIS: AIS shutdown itself cause ACE medical system is also running. ACE medical and AIS cant work at the same time."] call BIS_fnc_logFormat; + }; + publicVariable "ais_ace_shutDown"; +}; + +if (!isNil "AIS_Core_3DEHId") then { + removeMissionEventHandler ["Draw3D", AIS_Core_3DEHId]; +}; + +if (!isNil "AIS_Core_eachFrameHandlerId") then { + removeMissionEventHandler ["EachFrame", AIS_Core_eachFrameHandlerId]; +}; + +call AIS_Core_fnc_initEvents; +AIS_Core_Interaction_Actions = []; \ No newline at end of file diff --git a/source/AIS/Core/fn_progress_ShowBar.sqf b/source/AIS/Core/fn_progress_ShowBar.sqf new file mode 100644 index 0000000..776e755 --- /dev/null +++ b/source/AIS/Core/fn_progress_ShowBar.sqf @@ -0,0 +1,74 @@ +/* + * Author: NetFusion + * modified/changed by Psycho + + * Generate progress bar dialog and pass trough the code what's to do after finish or abort the progress. + + * Arguments: + 0: Title (String) + 1: duration in sec (Integer) + 2: callback (Code) + 3: arguments for callback (Object or Array) + 4: onAbort (optional) (Code) + 5: doAbort (optional) (Bool) + + * Return value: + nothing +*/ + + + + +private _title = _this select 0; +_duration = _this select 1; +_callback = _this select 2; +_arguments = _this select 3; +_onAbort = if (count _this > 4) then {_this select 4} else {{}}; +_doAbort = if (count _this > 5) then {_this select 5} else {false}; // added by Psycho +_endTime = time + _duration; +_affectingObject = if (typeName _arguments == "ARRAY") then {_arguments select 0} else {_arguments}; + +if (typeName _affectingObject == "OBJECT") then { + if (_affectingObject getVariable ["AIS_Core_Progress_inUse", false]) exitWith { + ["Object in use" call XOrangeText] call AIS_Core_fnc_dynamicText; + }; + + _affectingObject setVariable ["AIS_Core_Progress_inUse", true, true]; +}; + +closeDialog 0; +createDialog "AIS_Core_Progress_BarDlg"; + +_texts = player getVariable ["AIS_Core_displayText", []]; +_texts pushBack ("(" + _title + ")"); +player setVariable ["AIS_Core_displayText", _texts, true]; + +disableSerialization; +_progressBar = uiNamespace getVariable "AIS_Core_Progress_ProgressBar"; + +_progressBar ctrlSetPosition [safeZoneX + 0.298906 * safeZoneW, safeZoneY + 0.082 * safeZoneH, 0.407344 * safeZoneW, 0.011 * safeZoneH]; +_progressBar ctrlCommit (_duration / accTime); + +_time = time; + +//waitUntil {!dialog || time > _endTime || !alive player || _doAbort}; +while {dialog && {time < _endTime} && {alive player} && {!_doAbort}} do { + sleep 0.5; + [_title, ((time - _time) / (_duration)) min 1] spawn AIS_Core_fnc_progress_showBarText; +}; + +closeDialog 0; + +_texts = _texts - ["(" + _title + ")"]; +player setVariable ["AIS_Core_displayText", _texts, true]; + +if (time > _endTime) then { + _arguments spawn _callback; +} else { + ["Abbort..."] call AIS_Core_fnc_dynamicText; + _arguments spawn _onAbort; +}; + +if (typeName _affectingObject == "OBJECT") then { + _affectingObject setVariable ["AIS_Core_Progress_inUse", false, true]; +}; \ No newline at end of file diff --git a/source/AIS/Core/fn_progress_ShowBarText.sqf b/source/AIS/Core/fn_progress_ShowBarText.sqf new file mode 100644 index 0000000..3b5748c --- /dev/null +++ b/source/AIS/Core/fn_progress_ShowBarText.sqf @@ -0,0 +1,21 @@ +// by psycho +private _title = _this select 0; +_value = _this select 1; + +disableSerialization; +private _progressTitle = uiNamespace getVariable "AIS_Core_Progress_ProgressTitle"; + +_sitrepArray = toArray format [" ....%1", str (round (_value * 100)) + "%"]; +{_sitrepArray set [_foreachindex, toString [_x]]} foreach _sitrepArray; +_sitrep = ""; +_sitrepFormat = "" + _title + ":%1"; + +for "_i" from 0 to (count _sitrepArray - 1) do { + _letter = _sitrepArray select _i; + _delay = if (_letter == "|") then {_letter = "
"; 1} else {0.02}; + _sitrep = _sitrep + _letter; + _text = parseText format [_sitrepFormat, _sitrep + "_"]; + + _progressTitle ctrlSetText str(_text); + sleep _delay; +}; \ No newline at end of file diff --git a/source/AIS/Core/fn_removeOnEachFrame.sqf b/source/AIS/Core/fn_removeOnEachFrame.sqf new file mode 100644 index 0000000..e53f68a --- /dev/null +++ b/source/AIS/Core/fn_removeOnEachFrame.sqf @@ -0,0 +1,23 @@ +/* + Arma Mission Enhancement - Core\Events\fn_removeOnEachFrame.sqf + + Author: NetFusion + + Description: + Remove an OEF EH by its id. Ids are not persistent but unique inside one frame. + + Parameter(s): + - SCALAR - the id of the OEF EH + + Returns: + - + + Example: + _id call AIS_Core_fnc_removeOnEachFrame; +*/ + + +// Deletes the OEF EH with the given id. +private _onEachFrameData = missionNamespace getVariable ["AIS_Core_onEachFrameData", []]; +_onEachFrameData deleteAt _this; +missionNamespace setVariable ["AIS_Core_onEachFrameData", _onEachFrameData]; \ No newline at end of file diff --git a/source/AIS/Core/fn_resetOnTeamSwitch.sqf b/source/AIS/Core/fn_resetOnTeamSwitch.sqf new file mode 100644 index 0000000..144b3d8 --- /dev/null +++ b/source/AIS/Core/fn_resetOnTeamSwitch.sqf @@ -0,0 +1,31 @@ +/* + * Author: Psycho + + * Handle unit state after a teamswtich was performed. + + * Arguments: + 0: Player New (Object) + 1: Unit Old (Object) + + * Return value: + - +*/ + +params ["_new_player", "_old_player"]; + + +removeAllActions _old_player; +_old_player enableAI "TEAMSWITCH"; + +AIS_Core_realSide = getNumber (configfile >> "CfgVehicles" >> (typeOf _new_player) >> "side"); + +if (_old_player getVariable ["ais_unconscious", false]) then { + ais_character_changed = true; // reset blood splatter screen +}; + +if (_new_player getVariable ["ais_unconscious", false]) then { + [_new_player] call AIS_System_fnc_bloodloss; +}; + + +true \ No newline at end of file diff --git a/source/AIS/Core/fn_setPosAGLS.sqf b/source/AIS/Core/fn_setPosAGLS.sqf new file mode 100644 index 0000000..02a880d --- /dev/null +++ b/source/AIS/Core/fn_setPosAGLS.sqf @@ -0,0 +1,22 @@ +// from Killzone Kid + +/* + //---This will place player exactly on top deck of Cargo HQ on Stratis: + [player, [2437.18,5693.47,0]] call AIS_Core_fnc_setPosAGLS; + + //---This will place player 2m above top deck of Cargo HQ on Stratis: + [player, [2437.18,5693.47,2]] call AIS_Core_fnc_setPosAGLS; + + //---This will place player 2m below top deck of Cargo HQ on Stratis: + [player, [2437.18,5693.47,-2]] call AIS_Core_fnc_setPosAGLS; +*/ + +params ["_obj", "_pos", "_offset"]; + +_offset = _pos select 2; +if (isNil "_offset") then {_offset = 0}; +_pos set [2, worldSize]; +_obj setPosASL _pos; +_pos set [2, vectorMagnitude (_pos vectorDiff getPosVisual _obj) + _offset]; + +_obj setPosASL _pos; \ No newline at end of file diff --git a/source/AIS/Core/fn_setVariables.sqf b/source/AIS/Core/fn_setVariables.sqf new file mode 100644 index 0000000..f51b3c3 --- /dev/null +++ b/source/AIS/Core/fn_setVariables.sqf @@ -0,0 +1,37 @@ +/* + * Author: Psycho + + * Set all needed vars to the unit. + + * Arguments: + 0: Healer Unit (Object) + + * Return value: + Nothing +*/ + +params ["_unit"]; + +// local +_unit setVariable ["ais_fireDamage", 0]; +_unit setVariable ["ais_frameNo_damageCaching", diag_frameno]; +_unit setVariable ["ais_protector_delay", diag_tickTime]; +_unit setVariable ["AIS_UnitIsDead", false]; +_unit setVariable ["ais_side", side _unit]; +_unit setVariable ["ais_CarryDrop_Torso", false]; +ais_reenable_teamswitch = false; + +// global (players and AI's) +// set Vars only if it is Nil. Isnt't everytime Nil(f.e. JIP's use AI to join in - get the last state from this AI) +if (isNil {_unit getVariable "ais_unconscious"}) then { + _unit setVariable ["ais_unconscious", false, true]; + _unit setVariable ["ais_stabilized", false, true]; + _unit setVariable ["ais_hasHelper", objNull, true]; + _unit setVariable ["ais_DragDrop_Player", objNull, true]; + _unit setVariable ["ais_DragDrop_Torso", objNull];// local is enough? + _unit setVariable ["AIS_MedicalStore", [0,0,0,0], true]; + _unit setVariable ["ais_man_pullOut", false, true]; +}; + + +true \ No newline at end of file diff --git a/source/AIS/Core/fn_triggerEvent.sqf b/source/AIS/Core/fn_triggerEvent.sqf new file mode 100644 index 0000000..aa3a629 --- /dev/null +++ b/source/AIS/Core/fn_triggerEvent.sqf @@ -0,0 +1,45 @@ +/* + Arma Mission Enhancement - Core\Events\fn_triggerEvent.sqf + + Author: NetFusion + + Description: + Triggers an custom event. This should call all previously bound EH for the specific event. + + Parameter(s): + - 1: STRING - the name of the event + - 2: ARRAY - the data which gets passed to all EH (optional) + + Returns: + - + + Example: + ["myEvent", [1, 2, 3]] call AIS_Core_fnc_triggerEvent; +*/ + + +params ["_name", ["_data", []]]; + +//player sideChat ("Event: " + _name); + +// Form the name of the EH storage +_name = format ["AIS_Core_eventHandlersFor%1", _name]; +private _eventHandlers = missionNamespace getVariable [_name, []]; + +// Set the default return value to false. +AIS_Core_eventReturn = nil; + +// Cycle through all EHs and call them with the given data and their params +{ + _x params ["_code", "_params"]; + + [_data, _params] call _code; + nil +} count _eventHandlers; + +//@todo find a better way for returning stuff +if (!isNil "AIS_Core_eventReturn") then { + AIS_Core_eventReturn +} else { + nil +}; diff --git a/source/AIS/Core/fn_waitUntilAndExecute.sqf b/source/AIS/Core/fn_waitUntilAndExecute.sqf new file mode 100644 index 0000000..6be889f --- /dev/null +++ b/source/AIS/Core/fn_waitUntilAndExecute.sqf @@ -0,0 +1,35 @@ +/* ---------------------------------------------------------------------------- +Function: AIS_Core_fnc_waitUntilAndExecute + +Description: + Executes a code once in unscheduled environment after a condition is true. + +Parameters: + _condition - The function to evaluate as condition. + _statement - The function to run once the condition is true. + _args - Parameters passed to the functions (statement and condition) executing. (optional) + +Passed Arguments: + _this - Parameters passed by this function. Same as '_args' above. + +Returns: + Nothing + +Examples: + (begin example) + [{(_this select 0) == vehicle (_this select 0)}, {(_this select 0) setDamage 1;}, [player]] call AIS_Core_fnc_waitUntilAndExecute; + (end) + +Author: + joko // Jonas, donated from ACE3 +---------------------------------------------------------------------------- */ + +params [ + ["_condition", {}, [{}]], + ["_statement", {}, [{}]], + ["_args", []] +]; + +AIS_waitUntilAndExecArray pushBack [_condition, _statement, _args]; + +nil \ No newline at end of file diff --git a/source/AIS/Damage/cfgFunctions.hpp b/source/AIS/Damage/cfgFunctions.hpp new file mode 100644 index 0000000..5889581 --- /dev/null +++ b/source/AIS/Damage/cfgFunctions.hpp @@ -0,0 +1,12 @@ +class AIS_Damage +{ + class AIS_Damage + { + file = "AIS\Damage"; + class exitDamageHandler; + class getHitIndexValue; + class goToDead; + class handleDamage; + class verifyDamageType; + }; +}; \ No newline at end of file diff --git a/source/AIS/Damage/fn_exitDamageHandler.sqf b/source/AIS/Damage/fn_exitDamageHandler.sqf new file mode 100644 index 0000000..318d628 --- /dev/null +++ b/source/AIS/Damage/fn_exitDamageHandler.sqf @@ -0,0 +1,20 @@ +/* + * Author: Psycho + + * give back the last damage of the specific body part + + * Arguments: + 0: Unit (Object) + 1: hitPartIndex (Number) + + * Return value: + damage + */ + +params ["_unit", "_hitPartIndex"]; + +_return_part_damage = [damage _unit, _unit getHitIndex _hitPartIndex] select (_hitPartIndex >= 0); + + + +_return_part_damage \ No newline at end of file diff --git a/source/AIS/Damage/fn_getHitIndexValue.sqf b/source/AIS/Damage/fn_getHitIndexValue.sqf new file mode 100644 index 0000000..9f60dda --- /dev/null +++ b/source/AIS/Damage/fn_getHitIndexValue.sqf @@ -0,0 +1,39 @@ +/* + * Author: Psycho + + * Give back a wanted hitDamageIndex. Index number or correspondending Hitpart. + + * Arguments: + 0: Unit (Object) + 1: Hitindex or Hitpart (Number OR String) + + * Return value: + ["Hitpart" , IndexNumber, partDamage] + */ + +params [ + "_unit", + ["_hitValue", 0, [0,""]] +]; + + +_ret = if (_hitValue isEqualType 0) then { + + if (_hitValue > 10 || _hitValue < 0) exitWith {diag_log format ["AIS ERROR: AIS_Damage_fnc_getHitIndexValue, input number is out of range: %1", _hitValue]; ["",_hitValue, 0]}; + [((getAllHitPointsDamage _unit) select 1) select _hitValue, _hitValue, ((getAllHitPointsDamage _unit) select 2) select _hitValue] + +} else { + + _hitValue = toLower _hitValue; + private _num = ((getAllHitPointsDamage _unit) select 1) find _hitValue; + + if (_num < 0) then { + [_hitValue, -1, damage _unit] + } else { + [_hitValue, _num, ((getAllHitPointsDamage _unit) select 2) select _num] + }; + +}; + + +_ret \ No newline at end of file diff --git a/source/AIS/Damage/fn_goToDead.sqf b/source/AIS/Damage/fn_goToDead.sqf new file mode 100644 index 0000000..9932c26 --- /dev/null +++ b/source/AIS/Damage/fn_goToDead.sqf @@ -0,0 +1,41 @@ +/* + * Author: Psycho + + * Set the unit to the real dead. (overall damage == 1) + + * Arguments: + 0: Unit (Object) + + * Return value: + - + */ + +params ["_unit", ["_killer",objNull,[]]]; + +if (!alive _unit) exitWith {}; +if (_unit getVariable ["AIS_UnitIsDead", false]) exitWith {}; + +_unit setVariable ["AIS_UnitIsDead", true]; + +// unit is dragged. So the dragger have to call the release function. +if (!(isNull (_unit getVariable ["ais_DragDrop_Player", objNull]))) then { + _dragger = _unit getVariable ["ais_DragDrop_Player", objNull]; + [_unit] remoteExecCall ["AIS_System_fnc_release", _dragger, false]; +}; + +_unit call AIS_System_fnc_restoreFaks; + +// kill message and score point +if (!isNull _killer && {isPlayer _killer}) then { + [_killer, 1] remoteExec ["addScore", 2]; + if (isPlayer _unit) then { + _text = format ["%1 was killed by %2", name _unit, name _source]; + [_text] remoteExec ["systemChat", 0]; + }; +}; + +// dead... if some issues with the deadcam (shown killer) give the dead a deleay of 1 frame --> need testing +_unit setDamage 1; + + +true \ No newline at end of file diff --git a/source/AIS/Damage/fn_handleDamage.sqf b/source/AIS/Damage/fn_handleDamage.sqf new file mode 100644 index 0000000..174388a --- /dev/null +++ b/source/AIS/Damage/fn_handleDamage.sqf @@ -0,0 +1,188 @@ +/* + * by Psycho + + * Arguments: + * 0: Unit That Was Hit (Object) + * 1: Hit Selection (String) + * 2: Damage (Number) + * 3: Shooter (object) + * 4: Projectile (string) + * 5: HitPartIndex (number) + * 6: Instigator (object) + * 7: HitPoint CfgName (String) + + * Return Value: + * Damage +*/ + +/* allHitPointsDamage +[ + ["HitFace","HitNeck","HitHead","HitPelvis","HitAbdomen","HitDiaphragm","HitChest","HitBody","HitArms","HitHands","HitLegs"], + ["face_hub","neck","head","pelvis","spine1","spine2","spine3","body","arms","hands","legs"], + [0,0,0,0,0,0,0,0,0,0,0] +] +*/ + +params [ + "_unit", // Object the event handler is assigned to. + "_hitSelection", // Name of the selection where the unit was damaged. "" for over-all structural damage, "?" for unknown selections. + "_damage", // Resulting level of damage for the selection. + "_source", // The source unit (shooter) that caused the damage. + "_projectile", // Classname of the projectile that caused inflicted the damage. ("" for unknown, such as falling damage.) (String) + "_hitPartIndex", // Hit part index of the hit point, -1 otherwise. + "_instigator", // Person who pulled the trigger. (Object) + "_hitPoint" // hit point Cfg name (String) +]; + +// remote Units +if !(local _unit) exitWith {false}; +if (_damage == 0) exitWith {[_unit, _hitPartIndex] call AIS_Damage_fnc_exitDamageHandler}; +// forbite forther damage when unit is already unconcious +if (AIS_DISABLE_FURTHER_DAMAGE && {_unit getVariable ["ais_unconscious", false]}) exitWith {0.89}; +// dead unit +if (_unit getVariable ["AIS_UnitIsDead", false]) exitWith {0.89}; +// unknown part selection +if (_hitSelection == "?") exitWith {[_unit, _hitPartIndex] call AIS_Damage_fnc_exitDamageHandler}; +// new damage of the selected part +private _new_damage = if (_hitPartIndex >= 0) then {_damage - (_unit getHitIndex _hitPartIndex)} else {_damage - (damage _unit)}; + +// define where the damage come from --> possible outputs: "crash", "smallfire", "bigfire", "falling", "bullet", "grenade", "baaam" +_damageType = [_unit, _hitSelection, _new_damage, _source, _projectile, _hitPartIndex] call AIS_Damage_fnc_verifyDamageType; + +// handle the damage from a fire +if (_damageType isEqualTo "smallfire") exitWith {[_unit, _hitPartIndex] call AIS_Damage_fnc_exitDamageHandler}; +if (_damageType isEqualTo "bigfire") then { + _fire_damage = _unit getVariable ["ais_fireDamage", 0]; + // fire damage is everytime at index -1, part "" --> set the part to "body" and avoid real overall damage + _hitSelection = "body"; + _this set [1, _hitSelection]; + _new_damage = _fire_damage; // point where we can change the influence of fire + _unit setVariable ["ais_fireDamage", 0]; +}; + +// exit if the damage is only minor or we have a negative hitpart index +if (_new_damage < 0.05) exitWith {[_unit, _hitPartIndex] call AIS_Damage_fnc_exitDamageHandler}; + +// handle the damage of falling (adapted from ACE3) +if (_damageType isEqualTo "falling") then { + if !(_hitSelection in ["", "legs"]) then { + _new_damage = [ + _new_damage * 0.5, + _new_damage * abs(_unit getVariable ["ais_impactVelocity", _impactVelocity]) / 50 + ] select (_hitSelection isEqualTo "body"); + _new_damage = if (_new_damage < 0.1) then {0}; //Filter minor falling damage to non-leg hitpoints + } else { + if (_hitSelection isEqualTo "") then { + _hitSelection = "legs"; + _this set [1, _hitSelection]; + }; + _new_damage = _new_damage * 0.7; + }; +}; + +// handle the damage of a crash. Remove the overall damage and bring the damage to a random defined body part. +if (_damageType isEqualTo "crash") then { + if (_hitSelection isEqualTo "") then { + _hitSelection = selectRandom ["head", "hands", "legs"]; + _this set [1, _hitSelection]; + }; + private _min = [1, 0.89] select (_hitSelection isEqualTo "head"); + _new_damage = if (_new_damage < 0.1) then {0} else {_new_damage min _min}; +}; + + +/* +For some reason the engine won't handle the damage to the new(changed) body part. (Bug?) The damage will everytime go to the original part. +So we have to set the damage by ourself to the wanted hitPartIndex. +*/ +_hitPart = [_unit, _hitSelection] call AIS_Damage_fnc_getHitIndexValue; +_damage = (_hitPart select 2) + (_new_damage * AIS_DAMAGE_TOLLERANCE_FACTOR); + +// bullet/splitter impact post process effects +if (AIS_IMPACT_EFFECTS) then { + if (_damageType in ["grenade", "bullet"]) then { + if (isPlayer _unit) then { + [_unit, _damage] call AIS_Effects_fnc_bulletImpact; + }; + }; +}; + +// if there is no revive guarantee, handle a realistic mode. Now we have random chance to die. The risk is increasing with higer damage values and some type of damages. (explos and grenades) +if !(AIS_REVIVE_GUARANTY) then { + private _critical_hit = false; + // vehicle blow-up is everytime critical. Set to dead... + if (!(isNull objectParent _unit)) then { + if (damage (vehicle _unit) >= 1) exitWith { + [_unit,_source] call AIS_Damage_fnc_goToDead; + }; + }; + // critical hit trough explos? + if (_damageType in ["grenade", "baaam"] && {_hitSelection in ["pelvis", "head", "body"]}) then { + if (_damage > 1 && {(0.7 + ((0.05 * (_damage - 1)) * 10)) > random 2}) then { + _critical_hit = true; + }; + }; + // critical hit caused by a head shoot? + if (_damageType isEqualTo "bullet" && {_hitSelection isEqualTo "head"}) then { + if (_damage > 1.2 && {(0.6 + ((0.05 * (_damage - 1)) * 10)) > random 2}) then { + _critical_hit = true; + }; + }; + + // unit is instant death - no revive chance + if (_critical_hit) exitWith {[_unit,_source] call AIS_Damage_fnc_goToDead}; +}; + +// if a stabilized unit become new damage they won't be longer in the stbilized state +_unit setVariable ["ais_stabilized", false, true]; + +// unit can die if they get to mutch new damage in unconscious mode +if ((diag_tickTime > _unit getVariable ["ais_protector_delay", 0]) && {_unit getVariable ["ais_unconscious", false]}) exitWith { + if (_damage > 0.9) then {[_unit,_source] call AIS_Damage_fnc_goToDead}; + _damage = _damage min 0.89; + _damage +}; + + +// not dead? From this point only unconsciousness is possible +private _set_unconscious = false; +// if the unit is in a exploding vehicle... +if (!(isNull objectParent _unit)) then { + if (damage (vehicle _unit) >= 1) then { + [{_this call AIS_System_fnc_checkUnload}, { + [[_this select 0, _this select 1, 0], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"] + }, [_unit, vehicle _unit]] call AIS_Core_fnc_waitUntilAndExecute; + _set_unconscious = true; + }; +}; +if ((_damage > 0.9) && {_hitSelection in ["", "head", "body"]}) then { + _set_unconscious = true; +}; +// more attention to closer explosives +if ((_damage > 1.5) && {_hitSelection in ["pelvis", "head", "body"]} && {_damageType in ["grenade", "baaam"]}) then { + _set_unconscious = true; +}; +if (_set_unconscious && {!(_unit getVariable ["ais_unconscious", false])}) then { + [{[(_this select 0)] call AIS_System_fnc_setUnconscious}, [_unit]] call AIS_Core_fnc_onNextFrame; + // need this delay to prevent new damage for some seconds after the unit go unconscious. after the delay it is possible to kill the unit when they get to much new damage. + _unit setVariable ["ais_protector_delay", (diag_tickTime + 6)]; + + // kill message and score point + if (!isNull _source && {isPlayer _source}) then { + if (side _source != side _unit) then { + [_source, 1] remoteExec ["addScore", 2]; + } else { + [_source, -1] remoteExec ["addScore", 2]; + }; + if (isPlayer _unit) then { + _text = format ["%1 was seriously wounded by %2", name _unit, name _source]; + [_text] remoteExec ["systemChat", 0]; + }; + }; +}; + +_damage = _damage min 0.89; +//diag_log format ["Selection: %1 --- Damage1: %2 --- Damage2: %3 --- partIndex: %4 --- Projectile: %5 ----> %6", _hitSelection, _damage, (_hitPart select 2), _hitPartIndex, _projectile, diag_frameno]; + +_unit setHitIndex [_hitPart select 1, _damage]; +_damage \ No newline at end of file diff --git a/source/AIS/Damage/fn_verifyDamageType.sqf b/source/AIS/Damage/fn_verifyDamageType.sqf new file mode 100644 index 0000000..8007ae3 --- /dev/null +++ b/source/AIS/Damage/fn_verifyDamageType.sqf @@ -0,0 +1,54 @@ +params ["_unit", "_hitSelection", "_new_damage", "_source", "_projectile", "_hitPartIndex"]; +private _damageType = ""; + +// Vehicle crash? +private _vehicle = vehicle _unit; +if (!(isNull objectParent _unit) && {_projectile isEqualTo ""} && {_hitSelection isEqualTo ""} && {_source in [objNull, driver _vehicle, _vehicle]} && {!(_vehicle isKindOf "StaticWeapon")}) exitWith { + "crash" +}; + +// Fire? save the micro damages to an storage. Fire is everytime on selection == "". +if ((_projectile isEqualTo "") && {_new_damage < 0.05}) exitWith { + if ((_new_damage + (_unit getVariable ["ais_fireDamage", 0])) > 0.15) then { + "bigfire" + } else { + if !(_unit getVariable ["ais_uncoscious", false]) then { // protect from fire if unconscious + _unit setVariable ["ais_fireDamage", (_unit getVariable ["ais_fireDamage", 0]) + _new_damage]; + }; + "smallfire" + }; +}; + +// Unit is falling? Detect a falling unit and reduce their damage depending on affected body part +private _impactVelocity = (velocity _unit) select 2; +if (_impactVelocity < -5 && {isNull objectParent _unit}) then { + _unit setVariable ["ais_impactVelocity", _impactVelocity]; + _damageType = "falling"; +}; + +// Bullet? +{ + if (_projectile isKindOf _x) exitWith { + _damageType = "bullet"; + }; +} count ["BulletBase", "ShotgunBase"]; + +// Grenade? +{ + if (_projectile isKindOf _x) exitWith { + _damageType = "grenade"; + }; +} count ["Grenade", "GrenadeCore"]; + +// Explosion? +{ + if (_projectile isKindOf _x) exitWith { + _damageType = "baaam"; + }; +} count ["TimeBombCore", "BombCore", "MineCore", "FuelExplosion", "ShellBase", "RocketBase", "MissileBase", "LaserBombCore"]; + + + + + +_damageType \ No newline at end of file diff --git a/source/AIS/Effects/BarDlg.hpp b/source/AIS/Effects/BarDlg.hpp new file mode 100644 index 0000000..aa1d826 --- /dev/null +++ b/source/AIS/Effects/BarDlg.hpp @@ -0,0 +1,62 @@ +class AIS_Core_Progress_BarDlg { + idd = -1; + movingEnable = false; + onLoad = "uiNamespace setVariable ['AIS_Core_Progress_ProgressBar', (_this select 0) displayCtrl 1]; uiNamespace setVariable ['AIS_Core_Progress_ProgressTitle', (_this select 0) displayCtrl 2];"; + objects[] = {}; + + class controlsBackground { + class Background { + idc = -1; + moving = 0; + font = "PuristaMedium"; + text = ""; + sizeEx = 0; + lineSpacing = 0; + access = 0; + type = 0; + style = 0; + size = 1; + colorBackground[] = {0, 0, 0, 0.7}; + colorText[] = {0, 0, 0, 0}; + x = "0.298906 * safezoneW + safezoneX"; + y = "0.082 * safezoneH + safezoneY"; + w = "0.407344 * safezoneW"; + h = "0.011 * safezoneH"; + }; + class ProgressBar { + idc = 1; + moving = 0; + text = ""; + font = "PuristaMedium"; + sizeEx = "1 / 40 / (getResolution select 5)"; + lineSpacing = 0; + access = 0; + type = 0; + style = 2; + size = 1; + colorBackground[] = {0.6784, 0.7490, 0.5137, 0.7}; + colorText[] = {1,1,1,1}; + x = "0.298906 * safezoneW + safezoneX"; + y = "0.082 * safezoneH + safezoneY"; + w = "0.001 * safezoneW"; + h = "0.011 * safezoneH"; + }; + class TitleBar : ProgressBar { + idc = 2; + style = 0x00; + colorBackground[] = {0, 0, 0, 0}; + x = "0.298906 * safezoneW + safezoneX"; + y = "0.093 * safezoneH + safezoneY"; + w = "0.407344 * safezoneW"; + h = "0.022 * safezoneH"; + size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + sizeEx = "0.02 / (getResolution select 5)"; + font = "EtelkaMonospaceProBold"; + color = "#FFFFFF"; + align = "left"; + valign = "left"; + shadow = 1; + shadowColor = "#000000"; + }; + }; +}; \ No newline at end of file diff --git a/source/AIS/Effects/cfgFunctions.hpp b/source/AIS/Effects/cfgFunctions.hpp new file mode 100644 index 0000000..a241577 --- /dev/null +++ b/source/AIS/Effects/cfgFunctions.hpp @@ -0,0 +1,22 @@ +class AIS_Effects +{ + class AIS_Effects + { + file = "AIS\Effects"; + class preInit { preInit = 1; }; + class bleeding; + class BloodSplatterScreen; + class bulletImpact; + class deleteBloodSplatterScreen; + class draw3D; + class garbage; + class helpScream; + class injuredMarker; + class medEquip; + class removeInjuredMarker; + class scream; + class stabil; + class toggleRadio; + class posUpdateInjuredMarker; + }; +}; \ No newline at end of file diff --git a/source/AIS/Effects/fn_bleeding.sqf b/source/AIS/Effects/fn_bleeding.sqf new file mode 100644 index 0000000..ad5d963 --- /dev/null +++ b/source/AIS/Effects/fn_bleeding.sqf @@ -0,0 +1,84 @@ +/* + * Author: Psycho + + * Visual bleeding effects and counter for revive time. Will self-run in a loop till unit get revived/stabilized or died. + + * Arguments: + 0: Unit (Object) + 1: Revive Time (Number) + + * Return value: + - +*/ + +params ["_unit", "_revive_time"]; + +// breack out if unit died or revived +if (!alive _unit || {!(_unit getVariable ["ais_unconscious", false])}) exitWith { + _unit setBleedingRemaining 10; + _unit setFatigue 0.6; + resetCamShake; + titleText ["", "PLAIN DOWN", 1]; + + {_x ppEffectEnable false; true} count ais_ppEff; + ppEffectDestroy ais_ppEff; +}; + +// breack out if unit get stabilized +if (_unit getVariable ["ais_stabilized", false]) exitWith { + _unit setBleedingRemaining 10; + _unit setFatigue 0.7; + addCamShake [12, 999, 0.9]; + titleText ["You are stabilized.", "PLAIN DOWN", 1]; + + // loop + private _acc_time = diag_tickTime + 1.5; + [{diag_tickTime >= (_this select 1)}, {_this call AIS_Effects_fnc_stabil}, [_unit, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; +}; + + +// get the revive time +_revive_time = [_unit] call AIS_System_fnc_calculateLifeTime; +_unit setBleedingRemaining _revive_time; + +private _timeleft = (ais_start_unc_time + _revive_time) - diag_tickTime; + +// to late +if (_timeleft <= 0) exitWith { + _unit setBleedingRemaining 5; + resetCamShake; + titleText ["", "PLAIN DOWN", 1]; + + {_x ppEffectEnable false; true} count ais_ppEff; + ppEffectDestroy ais_ppEff; + + [_unit, objNull] call AIS_Damage_fnc_goToDead; +}; + +if (AIS_SHOW_COUNTDOWN) then { + [titleText ["It's to late for you.","PLAIN DOWN",1], titleText [format ["Bleedout in %1 Seconds", floor _timeleft],"PLAIN DOWN",0.2]] select (_timeleft > 3); +}; + +_unit setFatigue 1; + +// init pp effects +ais_ppEff = []; +ais_ppEff = ppEffectCreate [["radialBlur", 17091], ["colorCorrections", 1580]]; +{_x ppEffectEnable true; nil} count ais_ppEff; + +// set visual pp effects +_brightness = (_timeleft / _revive_time) + (random 0.1); +(ais_ppEff select 1) ppEffectAdjust [ + _brightness, // brightness, image brightness (0 - black, 1 - unchanged, 2 - white ) + 1, // contrast, image contrast (1 - normal contrast) + 0, // offset, image contrast offset (0 - unchanged ) + random 0.9 max 0.3, 0, 0.05, random 0.75, // color for blending ( R,G,B - color, A - blend factor (0 - original color, 1 - blend color )) + 0.2, 0, 0.5, 0.9, // color for colorization ( R,G,B - color, A - saturation (0 - original color, 1 - B&W multiplied by colorize color)) + 0.199, 0.587, 0.114, 1 // RGB weights for desaturation (0.299, 0.587, 0.114, NA) +]; +(ais_ppEff select 1) ppEffectCommit 0.5; + + +// loop +private _acc_time = diag_tickTime + 1; +[{diag_tickTime >= (_this select 2)}, {_this call AIS_Effects_fnc_bleeding}, [_unit, _revive_time, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/source/AIS/Effects/fn_bloodSplatterScreen.sqf b/source/AIS/Effects/fn_bloodSplatterScreen.sqf new file mode 100644 index 0000000..2898393 --- /dev/null +++ b/source/AIS/Effects/fn_bloodSplatterScreen.sqf @@ -0,0 +1,64 @@ +/* + * Author: Vladimir Hynek (BI) + Changed: Psycho + + * Posst process blood effects. (original from BIS_fnc_bloodEffect) + + * Arguments: + - + + * Return value: + - +*/ + +if (!canSuspend) exitWith {[] spawn AIS_Effects_fnc_bloodSplatterScreen;}; +disableSerialization; + +if (isnil {uinamespace getvariable "RscHealthTextures"}) then {uinamespace setvariable ["RscHealthTextures",displaynull]}; +if (isnull (uinamespace getvariable "RscHealthTextures")) then {(["HealthPP_blood"] call bis_fnc_rscLayer) cutrsc ["RscHealthTextures","plain"]}; +_display = uinamespace getvariable "RscHealthTextures"; + + +_texLower = _display displayctrl 1211; +_texLower ctrlsetfade 1; +_texLower ctrlcommit 0; + +_texMiddle = _display displayctrl 1212; +_texMiddle ctrlsetfade 1; +_texMiddle ctrlcommit 0; + +_texUpper = _display displayctrl 1213; +_texUpper ctrlsetfade 1; +_texUpper ctrlcommit 0; + +_x = ((0 * safezoneW) + safezoneX) + ((safezoneW - (2.125 * safezoneW * 3/4)) / 2); +_y = (-0.0625 * safezoneH) + safezoneY; +_w = 2.125 * safezoneW * 3/4; +_h = 1.125 * safezoneH; + +_texLower ctrlsetposition [_x, _y, _w, _h]; +_texMiddle ctrlsetposition [_x, _y, _w, _h]; +_texUpper ctrlsetposition [_x, _y, _w, _h]; + +_texLower ctrlcommit 0; +_texMiddle ctrlcommit 0; +_texUpper ctrlcommit 0; + +_texLower ctrlsetfade 0.2; +_texMiddle ctrlsetfade 0.7; +_texUpper ctrlsetfade 0.7; + +_texLower ctrlcommit 0.2; +_texMiddle ctrlcommit 0.2; +_texUpper ctrlcommit 0.2; + + +// remove effect if player get revived/stabilized or died or character changed (teamswitch or zeus f.e.) +[ + {!alive player || {!(player getVariable ["ais_unconscious", false])} || {(player getVariable ["ais_stabilized", false])}}, + {_this spawn AIS_Effects_fnc_deleteBloodSplatterScreen}, + [_texLower,_texMiddle,_texUpper] +] call AIS_Core_fnc_waitUntilAndExecute; + + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_bulletImpact.sqf b/source/AIS/Effects/fn_bulletImpact.sqf new file mode 100644 index 0000000..a68e4a8 --- /dev/null +++ b/source/AIS/Effects/fn_bulletImpact.sqf @@ -0,0 +1,50 @@ +/* + * Author: Psycho + + * Impact effect on bullet hit. + + * Arguments: + 0: Unit (Object) + 1: Strength (Number) + + * Example: + [player, 0.5] call AIS_Effects_fnc_bulletImpact; + + * Return value: + - +*/ + +params ["_unit", "_strength"]; + +if (!local player) exitWith {}; +if (_unit getVariable "ais_unconscious") exitWith {}; + + +if (isNull objectParent _unit && {cameraView in ["INTERNAL", "GUNNER"]}) then { + + _strength = if (_strength < 0.2) then {0.2 + (random 0.3)} else {_strength}; + _strength = if (_strength > 5) then {4 + (random 1)} else {_strength}; + private _power = _strength + 4; + enableCamShake true; + + addCamShake [_power, 0.4, 30]; + private _color = (1 - _strength) max 0.15; + + // set color corrections + "colorCorrections" ppEffectEnable true; + "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, _color], [1, 1, 1, 0.0]]; + "colorCorrections" ppEffectCommit 0; + "dynamicBlur" ppEffectEnable true; + "dynamicBlur" ppEffectAdjust [1.8]; + "dynamicBlur" ppEffectCommit 0; + + // set effect duration, depending on hit strength + "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, 1], [1, 1, 1, 0.0]]; + "colorCorrections" ppEffectCommit _strength; + + "dynamicBlur" ppEffectAdjust [0]; + "dynamicBlur" ppEffectCommit _strength; +}; + + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_deleteBloodSplatterScreen.sqf b/source/AIS/Effects/fn_deleteBloodSplatterScreen.sqf new file mode 100644 index 0000000..fd87489 --- /dev/null +++ b/source/AIS/Effects/fn_deleteBloodSplatterScreen.sqf @@ -0,0 +1,26 @@ +/* + * Author: Psycho + + * Remove post process blood effects. + + * Arguments: + - + + * Return value: + - +*/ +disableSerialization; +params ["_texLower", "_texMiddle", "_texUpper"]; + +_texLower ctrlsetfade 1; +_texMiddle ctrlsetfade 1; +_texUpper ctrlsetfade 1; + +_texUpper ctrlcommit 1.5; +sleep 1; +_texMiddle ctrlcommit 1; +sleep 0.5; +_texLower ctrlcommit 0.8; + + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_draw3D.sqf b/source/AIS/Effects/fn_draw3D.sqf new file mode 100644 index 0000000..a2430bb --- /dev/null +++ b/source/AIS/Effects/fn_draw3D.sqf @@ -0,0 +1,53 @@ +//if (!isNull (findDisplay 12)) exitWith {}; // Map +if (isNull (findDisplay 46)) exitWith {}; +if (!isNull (findDisplay 49)) exitWith {}; // Esc Menu + +// remove the meh if client left the mission +if (getClientStateNumber in [11,12]) exitWith { + removeMissionEventHandler ["draw3D", AIS_Core_3DEHId]; +}; + +private _targets = []; + +_recognize_distance = if (player call AIS_System_fnc_isMedic) then {35} else {20}; +_targets = player nearEntities ["CAManBase", _recognize_distance]; +if (count _targets < 1) exitWith {}; + +private _playerPos = positionCameraToWorld [0, 0, 0]; + +if (!surfaceIsWater _playerPos) then { + _playerPos = ATLtoASL _playerPos; +}; + +{ + private _target = effectiveCommander _x; + + if ( + _target getVariable ["ais_unconscious", false] && + {_target != player} && + //{isPlayer _target} && + {!(_x in allUnitsUAV)} && + {alive player} && + {AIS_Core_realSide isEqualTo (getNumber (configfile >> "CfgVehicles" >> (typeOf _target) >> "side"))} + ) then { + _targetPos = getPosASLVisual _target; + _distance = _targetPos distance2D _playerPos; + _headPosition = _target modelToWorldVisual (_target selectionPosition "spine"); + _alpha = 0.8; + //_color = [0.94,1,0,_alpha];//Yellow + //_color = [0.65,0.15,0,_alpha];//Dark Red + _color = [0.87,0.03,0,_alpha];//shiny Red + _targetPos set [2, ((_target modelToWorld [0,0,0]) select 2) + _height + _distance * 0.026]; + _text = format ["%1 (%2m)", name _target, ceil (player distance _target)]; + + _icon = if (_target getVariable ["ais_stabilized", false]) then { + "\a3\ui_f\data\IGUI\Cfg\Actions\heal_ca.paa" + } else { + "\a3\ui_f\data\IGUI\Cfg\Actions\bandage_ca.paa" + }; + + drawIcon3D [_icon, _color, _headPosition vectorAdd [0, 0, 0.4], 0.8, 0.8, 0, _text, 1, 0.04, "PuristaMedium", "center", true]; + }; + + true +} count _targets; \ No newline at end of file diff --git a/source/AIS/Effects/fn_garbage.sqf b/source/AIS/Effects/fn_garbage.sqf new file mode 100644 index 0000000..b5c9305 --- /dev/null +++ b/source/AIS/Effects/fn_garbage.sqf @@ -0,0 +1,38 @@ +/* + * Author: Alwarren + + * Remove ambient medical equimpment from the ground. If euqipment is marked as "do not delete", the loop will set it to delete list for the next time the function is called. + + * Arguments: + - + + * Example: + [player] call AIS_Effects_fnc_garbage; + + * Return value: + - +*/ + +if (!local player) exitWith {}; +private _delete = false; + +if (count ais_medequip_array > 0) then { + { + if (count _x > 1) then { + if ((_x select 0) > 0) then { + deleteVehicle (_x select 1); + ais_medequip_array set [_forEachIndex, objNull]; + } else { + _x set [0,1]; + }; + } else { + ais_medequip_array set [_forEachIndex, objNull]; + _delete = true; + }; + } forEach ais_medequip_array; +}; + +ais_medequip_array = ais_medequip_array - [objNull]; + + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_helpScream.sqf b/source/AIS/Effects/fn_helpScream.sqf new file mode 100644 index 0000000..9703aff --- /dev/null +++ b/source/AIS/Effects/fn_helpScream.sqf @@ -0,0 +1,28 @@ +/* + * Author: Psycho + + * Play a random screaming sound when a unit go unconcsious + + * Arguments: + 0: Unit (Object) + 1: audible distance (optional) + + * Return value: + - + +* Exapmle: + [player, 30] call AIS_Effects_fnc_helpScream; +*/ + +params [ + ["_injured", objNull], + ["_dist", 50, [0]] +]; + + +// playSound is global +_helpsound = format ["a3\sounds_f\characters\human-sfx\%1\%2", ais_personal_soundset select 0, selectRandom (ais_personal_soundset select 1)]; +playSound3D [_helpsound, _injured, false, getPosASL _injured, 1.5, 1, _dist]; + + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_injuredMarker.sqf b/source/AIS/Effects/fn_injuredMarker.sqf new file mode 100644 index 0000000..8b8c8ef --- /dev/null +++ b/source/AIS/Effects/fn_injuredMarker.sqf @@ -0,0 +1,33 @@ +/* + * Author: Psycho + + * Create a local marker for unconcious units + + * Arguments: + 0: Unit (Object) + + * Return value: + the marker itself + +* Exapmle: + player call AIS_Effects_fnc_injuredMarker + */ + +private _unit = _this; +private _mark = ""; + +_str = name _unit; +_marker = format ["%1_ais_marker", _str]; + +if (!isNil {_unit getVariable ["ais_unitMarker", Nil]}) then { + _unit call AIS_Effects_fnc_removeInjuredMarker; +}; + +_mark = [_marker, position _unit, "ICON", "Color1_FD_F", [0.7, 0.7], format ["%1 down", _str], 0, "loc_Hospital"] call AIS_Core_fnc_createLocalMarker; +_unit setVariable ["ais_unitMarker", _marker]; + +_acc_time = diag_tickTime + 5; +[{diag_tickTime > (_this select 1)}, {[_this select 0] call AIS_Effects_fnc_posUpdateInjuredMarker}, [_unit, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + + +_mark \ No newline at end of file diff --git a/source/AIS/Effects/fn_medEquip.sqf b/source/AIS/Effects/fn_medEquip.sqf new file mode 100644 index 0000000..7d66b5c --- /dev/null +++ b/source/AIS/Effects/fn_medEquip.sqf @@ -0,0 +1,62 @@ +/* + * Author: Alwarren + + * Spawn randomized some ambient medical equipment around the injured. + + * Arguments: + 0: Unit Helper (Object) + 1: Unit wounded (Object) + + * Example: + [player] call AIS_Effects_fnc_medEquip; + + * Return value: + - +*/ + +params [ + "_healer", + "_injured" +]; +if (!local _healer) exitWith {}; + +// spawn defi and a bloodbag +if (_healer call AIS_System_fnc_isMedic) then { + _defi_pos = _healer modelToWorld [-0.5,0.2,0]; + _defi = "Land_Defibrillator_F" createVehicle _defi_pos; + [_defi, [_defi_pos select 0, _defi_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; + _defi setDir (getDir _healer - 180); + ais_medequip_array pushBack [1,_defi]; + + if (damage _injured >= 0.5 && {(random 2) >= 1}) then { + _bb_pos = _healer modelToWorld [0.4,(0.2 - (random 0.5)),0]; + _bb = "Land_BloodBag_F" createVehicle _bb_pos; + [_bb, [_bb_pos select 0, _bb_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; + _bb setDir (random 359); + ais_medequip_array pushBack [0,_bb]; + }; +}; + +// spawn bandages +for "_i" from 1 to (1 + (round random 3)) do { + _band_pos = _healer modelToWorld [(random 1.3),(0.8 + (random 0.6)),0]; + _band = "Land_Bandage_F" createVehicle _band_pos; + [_band, [_band_pos select 0, _band_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; + _band setDir (random 359); + if (_i > 1) then { + ais_medequip_array pushBack [0,_band]; + } else { + ais_medequip_array pushBack [1,_band]; + }; +}; + +// spawn antibioticum +if (random 2 >= 1) then { + _ab_pos = _healer modelToWorld [-0.8,(0.6 - (random 0.4)),0]; + _ab = "Land_Antibiotic_F" createVehicle _ab_pos; + [_ab, [_ab_pos select 0, _ab_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; + _ab setDir (random 359); + ais_medequip_array pushBack [0,_ab]; +}; + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_posUpdateInjuredMarker.sqf b/source/AIS/Effects/fn_posUpdateInjuredMarker.sqf new file mode 100644 index 0000000..79a0c3e --- /dev/null +++ b/source/AIS/Effects/fn_posUpdateInjuredMarker.sqf @@ -0,0 +1,34 @@ +/* + * Author: Psycho + + * Update the marker position every 5 seconds until the marker is deleted. + + * Arguments: + 0: Unit (Object) + 1: Marker (String) + + * Return value: + - + +* Exapmle: + - + */ + +params ["_unit"]; +_marker = _unit getVariable ["ais_unitMarker", Nil]; + +if (!isNil "_marker") then { + if (_unit getVariable ["ais_unconscious", false]) then { + _marker setMarkerPosLocal (getPos _unit); + + _acc_time = diag_tickTime + 5; + [{diag_tickTime > (_this select 1)}, {[_this select 0] call AIS_Effects_fnc_posUpdateInjuredMarker}, [_unit, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + }; + + if (!alive _unit || {isNull _unit}) then { + _unit call AIS_Effects_fnc_removeInjuredMarker; + }; +}; + + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_preinit.sqf b/source/AIS/Effects/fn_preinit.sqf new file mode 100644 index 0000000..5645b20 --- /dev/null +++ b/source/AIS/Effects/fn_preinit.sqf @@ -0,0 +1,37 @@ +// from domination +ais_help_screaming = [ + [ + "Person0", + [ + "P0_moan_13_words.wss", "P0_moan_14_words.wss", "P0_moan_15_words.wss", "P0_moan_16_words.wss", + "P0_moan_17_words.wss", "P0_moan_18_words.wss", "P0_moan_19_words.wss", "P0_moan_20_words.wss" + ] + ], + [ + "Person1", + [ + "P1_moan_19_words.wss", "P1_moan_20_words.wss", "P1_moan_21_words.wss", "P1_moan_22_words.wss", + "P1_moan_23_words.wss", "P1_moan_24_words.wss", "P1_moan_25_words.wss", "P1_moan_26_words.wss", + "P1_moan_27_words.wss", "P1_moan_28_words.wss", "P1_moan_29_words.wss", "P1_moan_30_words.wss", + "P1_moan_31_words.wss", "P1_moan_32_words.wss", "P1_moan_33_words.wss" + ] + ], + [ + "Person2", + [ + "P2_moan_14_words.wss", "P2_moan_15_words.wss", "P2_moan_16_words.wss", "P2_moan_17_words.wss", + "P2_moan_18_words.wss", "P2_moan_19_words.wss", "P2_moan_20_words.wss", "P2_moan_21_words.wss" + ] + ], + [ + "Person3", + [ + "P3_moan_10_words.wss", "P3_moan_11_words.wss", "P3_moan_12_words.wss", "P3_moan_13_words.wss", + "P3_moan_14_words.wss", "P3_moan_15_words.wss", "P3_moan_16_words.wss", "P3_moan_17_words.wss", + "P3_moan_18_words.wss", "P3_moan_19_words.wss", "P3_moan_20_words.wss" + ] + ] +]; + +// every player set only onetime his personal voice set. +ais_personal_soundset = selectRandom ais_help_screaming; \ No newline at end of file diff --git a/source/AIS/Effects/fn_removeinjuredMarker.sqf b/source/AIS/Effects/fn_removeinjuredMarker.sqf new file mode 100644 index 0000000..4f4b187 --- /dev/null +++ b/source/AIS/Effects/fn_removeinjuredMarker.sqf @@ -0,0 +1,25 @@ +/* + * Author: Psycho + + * Delete a local unconcsious marker + + * Arguments: + 0: Unit (Object) + + * Return value: + - + +* Exapmle: + player call AIS_Effects_fnc_removeInjuredMarker; + */ + +private _unit = _this; +private _marker = _unit getVariable ["ais_unitMarker", Nil]; + +if (!isNil "_marker") then { + deleteMarkerLocal _marker; + _unit setVariable ["ais_unitMarker", Nil]; +}; + + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_scream.sqf b/source/AIS/Effects/fn_scream.sqf new file mode 100644 index 0000000..f4135d9 --- /dev/null +++ b/source/AIS/Effects/fn_scream.sqf @@ -0,0 +1,29 @@ +/* + * Author: Psycho + + * Play a random screaming sound when a unit go unconcsious + + * Arguments: + 0: Unit (Object) + 1: audible distance (optional) + + * Return value: + - + +* Exapmle: + [player, 30] call AIS_Effects_fnc_Scream; +*/ + +params [ + ["_injured", objNull], + ["_dist", 50, [0]] +]; + +// playSound is global +if (random 3 > 1.7) then { + _deathsound = format ["A3\sounds_f\characters\human-sfx\P0%1\Hit_Max_%2.wss", selectRandom [4,5,6,7,8,9], selectRandom [1,2,3,4,5]]; + playSound3D [_deathsound, _injured, false, getPosASL _injured, 1.5, 1, _dist]; +}; + + +true \ No newline at end of file diff --git a/source/AIS/Effects/fn_stabil.sqf b/source/AIS/Effects/fn_stabil.sqf new file mode 100644 index 0000000..64fd61e --- /dev/null +++ b/source/AIS/Effects/fn_stabil.sqf @@ -0,0 +1,69 @@ +/* + * Author: Psycho + + * Visual bleeding effects and counter for revive time. Will self-run in a loop till unit get revived/stabilized or died. + + * Arguments: + 0: Unit (Object) + 1: Revive Time (Number) + + * Return value: + - +*/ + +params ["_unit"]; + +// breack out if unit died or revived +if (!alive _unit || {!(_unit getVariable ["ais_unconscious", false])}) exitWith { + _unit setBleedingRemaining 10; + _unit setFatigue 0.6; + resetCamShake; + titleText ["", "PLAIN DOWN", 1]; + + {_x ppEffectEnable false; true} count ais_ppEff; + ppEffectDestroy ais_ppEff; +}; + +// breack out if unit get new damage (no longer stabilized) +if (!(_unit getVariable ["ais_stabilized", false])) exitWith { + _unit setBleedingRemaining 10; + _unit setFatigue 1; + addCamShake [15, 999, 0.7]; + + // Function use disableSerialisation and can corrupt some other functions in the same frame. So it need a delay till next frame. + [{call AIS_Effects_fnc_bloodSplatterScreen}] call AIS_Core_fnc_onNextFrame; + + // get the revive time + _revive_time = [_unit] call AIS_System_fnc_calculateLifeTime; + _unit setBleedingRemaining _revive_time; + + // loop + private _acc_time = diag_tickTime + 1; + [{diag_tickTime >= (_this select 2)}, {_this call AIS_Effects_fnc_bleeding}, [_unit, _revive_time, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; +}; + + + +titleText ["You are stabilized.", "PLAIN DOWN", 1.5]; +_unit setFatigue 0.6; + +// init pp effects +ais_ppEff = []; +ais_ppEff = ppEffectCreate [["radialBlur", 17091], ["colorCorrections", 1580]]; +{_x ppEffectEnable true; nil} count ais_ppEff; + +// set visual pp effects +(ais_ppEff select 1) ppEffectAdjust [ + 0.9 + (random 0.2), // brightness, image brightness (0 - black, 1 - unchanged, 2 - white ) + 1, // contrast, image contrast (1 - normal contrast) + 0, // offset, image contrast offset (0 - unchanged ) + random 0.7 max 0.2, 0, 0.05, random 0.6, // color for blending ( R,G,B - color, A - blend factor (0 - original color, 1 - blend color )) + 0.2, 0, 0.5, 0.9, // color for colorization ( R,G,B - color, A - saturation (0 - original color, 1 - B&W multiplied by colorize color)) + 0.199, 0.587, 0.114, 1 // RGB weights for desaturation (0.299, 0.587, 0.114, NA) +]; +(ais_ppEff select 1) ppEffectCommit 0.5; + + +// loop +private _acc_time = diag_tickTime + 1.5; +[{diag_tickTime >= (_this select 1)}, {_this call AIS_Effects_fnc_stabil}, [_unit, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/source/AIS/Effects/fn_toggleRadio.sqf b/source/AIS/Effects/fn_toggleRadio.sqf new file mode 100644 index 0000000..baddce9 --- /dev/null +++ b/source/AIS/Effects/fn_toggleRadio.sqf @@ -0,0 +1,34 @@ +/* + * Author: Psycho + + * Enable/disable the TFAR and/or ACRE radios when player is unconscious. + + * Arguments: + 0: Unit (Object) + + * Return value: + Bool + */ + + +_canUse = param [0, true, [true]]; + +if (_canUse) then { + player setVariable ["tf_globalVolume", 1]; + player setVariable ["tf_voiceVolume", 1]; + player setVariable ["tf_unable_to_use_radio", false]; + + player setVariable ["acre_sys_core_isDisabled", false, true]; + player setVariable ["acre_sys_core_globalVolume", 1]; + +} else { + + player setVariable ["tf_globalVolume", 0.4]; + player setVariable ["tf_voiceVolume", 0]; + player setVariable ["tf_unable_to_use_radio", true]; + + player setVariable ["acre_sys_core_isDisabled", true, true]; + player setVariable ["acre_sys_core_globalVolume", 0]; +}; + +true \ No newline at end of file diff --git a/source/AIS/System/cfgFunctions.hpp b/source/AIS/System/cfgFunctions.hpp new file mode 100644 index 0000000..dccd942 --- /dev/null +++ b/source/AIS/System/cfgFunctions.hpp @@ -0,0 +1,56 @@ +class AIS_System +{ + class AIS_System + { + file = "AIS\System"; + class postInit { postInit = 1; }; + class addMedEvacObj; + class AIselfCheck; + class allowCarry; + class allowDrag; + class allowPullIn; + class allowPullOut; + class allowRevive; + class allowStabilize; + class bloodloss; + class bloodlossAI; + class calculateLifeTime; + class calculateReviveTime; + class calculateStabilizeTime; + class callHelp; + class carry; + class checkLauncher; + class checkUnload; + class diary; + class disableRespawnButton; + class drag; + class findAIHelper; + class getCargoIndex; + class getOutMan; + class handleHeal; + class isMedic; + class keyHandler; + class killed; + class loadAIS; + class loadAISlocalToPlayer; + class loadInjured; + class medEvacArea; + class moveAIHelper; + class moveCargoRemote; + class overrideHealAction; + class release; + class removeFaks; + class respawn; + class restoreFaks; + class reveal; + class Revive; + class ReviveAI; + class secondsToString; + class setUnconscious; + class stabilize; + class unconcsiousRemote; + class unconsciousAI; + class unconsciousPlayer; + class unloadInjured; + }; +}; \ No newline at end of file diff --git a/source/AIS/System/fn_AIselfCheck.sqf b/source/AIS/System/fn_AIselfCheck.sqf new file mode 100644 index 0000000..3663d9b --- /dev/null +++ b/source/AIS/System/fn_AIselfCheck.sqf @@ -0,0 +1,41 @@ +/* + * Author: Psycho + + * Check if no player is in this group. (only AI's) If it is so, the AI will call for other AI's to help him. Otherwise a AI-only group cant be revive. + + * Arguments: + 0: Injured Unit (Object) + + * Return value: + Nothing +*/ + +params ["_injured_ai"]; + +// breack the self check loop if help is no longer needed or possible. +if (!alive _injured_ai) exitWith {}; +if (!(_injured_ai getVariable ["ais_unconscious", false])) exitWith {}; + +// injured is in handling. check some seconds later if handlin was interrupted. +if (!isNull (_injured_ai getVariable ["ais_hasHelper", objNull])) then { + private _acc_time = (diag_tickTime + 30); + [{diag_tickTime > (_this select 1)}, {[(_this select 0)] call AIS_System_fnc_AIselfCheck}, [_injured_ai, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; +}; + + +// searching for players in the group +private _group_with_player = false; +private _all_members = (units group _injured_ai) - [_injured_ai]; +if (count _all_members > 0) then { + {if (isPlayer _x) exitWith {_group_with_player = true};true} count _all_members; +}; + +// do nothing if players in group +if (_group_with_player) exitWith {}; + +// if no player is present call for help (with a short delay) +private _acc_time = (diag_tickTime + 40); +[{diag_tickTime > (_this select 2)}, {_this call AIS_System_fnc_findAIHelper}, [_injured_ai, objNull, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_Revive.sqf b/source/AIS/System/fn_Revive.sqf new file mode 100644 index 0000000..72218ca --- /dev/null +++ b/source/AIS/System/fn_Revive.sqf @@ -0,0 +1,109 @@ +/* + * Author: Psycho + + * Handle Revive actions from a PLAYER + + * Arguments: + 0: Healer Unit (Object) + 1: Injured Unit (Object) + + * Return value: + Nothing +*/ + +params [ + ["_healer", player, [player]], + "_injured" +]; + +_injured setVariable ["ais_hasHelper", _healer, true]; + +//_injured playMove "AinjPpneMstpSnonWrflDnon_rolltoback"; // from AIS fsm +[_injured, "AinjPpneMstpSnonWrflDnon_rolltoback"] remoteExec ["playMove", 0]; + +// switch to primary weapon if possible. Small delay for handling is needed. +if (primaryWeapon _healer != "") then { + _healer switchmove "amovpercmstpsraswrfldnon"; + _healer selectWeapon (primaryWeapon _healer); +}; + +_healer playAction "medicStart"; + +// full heal anim only with primary weapon possible. +ais_animChangeEVH = _healer addEventhandler ["AnimChanged", { + params ["_healer","_anim"]; + if (primaryWeapon _healer isEqualTo "") then { + if (_anim in ["amovpknlmstpsnonwnondnon","amovpknlmstpsraswlnrdnon"]) then { + _healer playActionNow "medicStart"; + }; + }; +}]; + +_offset = [0,0,0]; _dir = 0; +_relpos = _healer worldToModel position _injured; +if (((_healer getDir _injured) - (_injured getDir _healer)) < 0) then {_offset = [-0.2,0.7,0]; _dir = 90} else {_offset = [0.2,0.7,0]; _dir = 270}; + +_injured attachTo [_healer, _offset]; +[_injured, _dir] remoteExec ["setDir", 0, false]; + +[_healer, _injured] call AIS_Effects_fnc_medEquip; +private _duration = [_healer, _injured] call AIS_System_fnc_calculateReviveTime; +//hint format ["Revive Time Duration: %1", _duration]; // debug + +[ + "Applying First Aid", + _duration, + { + params ["_injured", "_healer"]; + + _injured setVariable ["ais_unconscious", false, true]; + + _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; + detach _healer; + detach _injured; + + _healer playAction "medicStop"; + [_healer, 1] remoteExec ["addScore", 2]; // +1 per revive + + _injured setVariable ["ais_hasHelper", ObjNull, true]; + call AIS_Effects_fnc_garbage; + + // healing if enabled + if (AIS_REVIVE_HEAL) then { + _injured setDamage 0; + _injured setVariable ["ais_fireDamage", 0]; + } else { + // make sure the unit can walk after revive + if ((_injured getHitIndex 10) > 0.49) then { + [{(_this select 0) setHitIndex [10, 0.49]}, [_injured]] call AIS_Core_fnc_onNextFrame; + }; + }; + + [_injured] remoteExecCall ["AIS_System_fnc_restoreFaks", _injured, false]; + + _injured stop false; + {_injured enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; + [_injured, false] remoteExecCall ["AIS_System_fnc_unconcsiousRemote", 0, false]; + [_injured, false] remoteExec ["setCaptive", 0, false]; + + ["GetOutMan"] remoteExec ["removeAllEventHandlers", _injured, false]; + }, + [_injured, _healer], + { + params ["_injured", "_healer"]; + + _injured setVariable ["ais_hasHelper", ObjNull, true]; + + _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; + detach _healer; + detach _injured; + + call AIS_Effects_fnc_garbage; + + if (alive _healer) then { + _healer playActionNow "medicStop"; + }; + if (!alive _injured) then {["He is not with us anymore."] call AIS_Core_fnc_dynamicText}; + }, + (!alive _injured || _healer getVariable ["ais_unconscious",false]) +] call AIS_Core_fnc_Progress_ShowBar; \ No newline at end of file diff --git a/source/AIS/System/fn_ReviveAI.sqf b/source/AIS/System/fn_ReviveAI.sqf new file mode 100644 index 0000000..2ccdd5f --- /dev/null +++ b/source/AIS/System/fn_ReviveAI.sqf @@ -0,0 +1,108 @@ +/* + * Author: Psycho + + * Handle Revive actions from a AI. + + * Arguments: + 0: Healer Unit (Object) + 1: Injured Unit (Object) + + * Return value: + Nothing +*/ + +params [ + ["_healer", player, [player]], + "_injured" +]; + +_injured setVariable ["ais_hasHelper", _healer, true]; + +_behaviour = behaviour _healer; + +// move the wounded out of the vehicle +if (!isNull objectParent _injured) exitWith { + [[_injured, vehicle _injured, 0], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"]; + _acc_time = diag_tickTime + 1.382; + [{diag_tickTime > (_this select 2)}, {[_this select 0, _this select 1] spawn AIS_System_fnc_ReviveAI}, [_healer, _injured, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; +}; + +[_injured, "AinjPpneMstpSnonWrflDnon_rolltoback"] remoteExec ['playMove', 0]; + +// switch to primary weapon if possible. Small delay for handling is needed. +if (primaryWeapon _healer != "") then { + _healer selectWeapon primaryWeapon _healer; + sleep 0.5; +}; + +_healer setPos (getPos _injured); // avoid to move the injured a few metres away +[_healer, "medicStart"] remoteExec ['playAction', 0]; + +_healer stop true; +{_healer disableAI _x; true} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; + +_offset = [0,0,0]; _dir = 0; +_relpos = _healer worldToModel position _injured; +if ((_relpos select 0) < 0) then {_offset = [-0.2,0.7,0]; _dir = 90} else {_offset = [0.2,0.7,0]; _dir = 270}; + +_injured attachTo [_healer, _offset]; +[_injured, _dir] remoteExec ["setDir", 0, false]; + +private _duration = [_healer, _injured] call AIS_System_fnc_calculateReviveTime; + + +private _startTime = diag_tickTime + _duration; +waitUntil { + diag_tickTime > _startTime || + !alive _healer || + !alive _injured || + _healer getVariable ["ais_unconscious", false] +}; + +_injured setVariable ["ais_hasHelper", ObjNull, true]; + +detach _healer; +detach _injured; + +if (!alive _healer || _healer getVariable ["ais_unconscious", false]) exitWith {}; +_healer playActionNow "medicStop"; + +_healer stop false; +{_healer enableAI _x; true} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; +_healer setBehaviour _behaviour; + + +if (alive _injured) then { + _injured setVariable ["ais_unconscious", false, true]; + + // healing if enabled + if (AIS_REVIVE_HEAL) then { + _injured setDamage 0; + _injured setVariable ["ais_fireDamage", 0]; + } else { + // make sure the unit can walk after revive + if ((_injured getHitIndex 10) > 0.49) then { + [{(_this select 0) setHitIndex [10, 0.49]}, [_injured]] call AIS_Core_fnc_onNextFrame; + }; + }; + + [_injured] remoteExecCall ["AIS_System_fnc_restoreFaks", _injured, false]; + + if (isPlayer _injured) then { + [true] remoteExec ['showHud', _injured]; + if (AIS_TOGGLE_RADIO) then { + [true] remoteExecCall ["AIS_Effects_fnc_toggleRadio", _injured, false]; + }; + } else { + _injured stop false; + {_injured enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; + }; + + [_injured, false] remoteExecCall ["AIS_System_fnc_unconcsiousRemote", 0]; + [_injured, false] remoteExec ["setCaptive", 0, false]; + + ["GetOutMan"] remoteExec ["removeAllEventHandlers", _injured, false]; +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_addMedEvacObj.sqf b/source/AIS/System/fn_addMedEvacObj.sqf new file mode 100644 index 0000000..09897ae --- /dev/null +++ b/source/AIS/System/fn_addMedEvacObj.sqf @@ -0,0 +1,31 @@ +/* + * Author: psycho + + * Set a object / Vehicle in function of a medevac point and make it public. Usable for spawned objects for example. Public function. + + * Arguments: + 0: Vehicle (Object) + 1: Distance (Number) + + * Return value: + changed AIS_MEDEVAC_STATIONS array. + Return a Bool if no new object was added. (error) + */ + +params [["_obj",objNull,[objNull]], ["_distance",0,[0]]]; +private _return = false; + +if (!isNull _obj) then { + _index = AIS_MEDEVAC_STATIONS pushBackUnique [_obj, _distance]; + if (_index != -1) then {_return = true}; +} else { + _return = false; +}; + +if (_return) exitWith { + publicVariable "AIS_MEDEVAC_STATIONS"; + AIS_MEDEVAC_STATIONS +}; + + +_return \ No newline at end of file diff --git a/source/AIS/System/fn_allowCarry.sqf b/source/AIS/System/fn_allowCarry.sqf new file mode 100644 index 0000000..bca18f2 --- /dev/null +++ b/source/AIS/System/fn_allowCarry.sqf @@ -0,0 +1,35 @@ +/* + * Author: psycho + + * Check Unit if carrying is possible/allowed. If yes, drag-action is shown up. + + * Arguments: + 0: Unit (Object) + + * Return value: + Bool + */ + +private _target = _this; + +_isUnc = _target getVariable ["ais_unconscious",false]; +_isUncHealer = player getVariable ["ais_unconscious",false]; +_Drag = !(isNull (_target getVariable ['ais_DragDrop_Player', objNull])); +_Draging = !(isNull (player getVariable ['ais_DragDrop_Torso', objNull])); + + + +_return = if ( + + _isUnc && + !_isUncHealer && + {alive _target} && + {_Drag} && + {_Draging} + +) then {true} else {false}; + + + + +_return \ No newline at end of file diff --git a/source/AIS/System/fn_allowDrag.sqf b/source/AIS/System/fn_allowDrag.sqf new file mode 100644 index 0000000..01797f0 --- /dev/null +++ b/source/AIS/System/fn_allowDrag.sqf @@ -0,0 +1,37 @@ +/* + * Author: psycho + + * Check Unit if dragging/carrying is possible/allowed. If yes, drag-action is shown up. + + * Arguments: + 0: Unit (Object) + + * Return value: + Bool + */ + +private _target = _this; + +_isUnc = _target getVariable ["ais_unconscious",false]; +_isUncHealer = player getVariable ["ais_unconscious",false]; +_noHealer = isNull (_target getVariable ['ais_hasHelper', objNull]); +_noDrag = isNull (_target getVariable ['ais_DragDrop_Player', objNull]); +_noDraging = isNull (player getVariable ['ais_DragDrop_Torso', objNull]); + + + +_return = if ( + + _isUnc && + !_isUncHealer && + {alive _target} && + {_noHealer} && + {_noDrag} && + {_noDraging} + +) then {true} else {false}; + + + + +_return \ No newline at end of file diff --git a/source/AIS/System/fn_allowPullIn.sqf b/source/AIS/System/fn_allowPullIn.sqf new file mode 100644 index 0000000..b5961a5 --- /dev/null +++ b/source/AIS/System/fn_allowPullIn.sqf @@ -0,0 +1,18 @@ +/* + * Author: Psycho + + * Check if uncoscious Unit can load in a vehicle.. + + * Arguments: + 0: Vehicle (Object) + + * Return value: + Bool + */ + +private _targetVehicle = _this; + +_canload = [false, true] select (count ([_targetVehicle] call AIS_System_fnc_getCargoIndex) > 0); + + +_canload \ No newline at end of file diff --git a/source/AIS/System/fn_allowPullOut.sqf b/source/AIS/System/fn_allowPullOut.sqf new file mode 100644 index 0000000..e8068e4 --- /dev/null +++ b/source/AIS/System/fn_allowPullOut.sqf @@ -0,0 +1,28 @@ +/* + * Author: psycho + + * Check Unit if get a unit out of a vehicle is possible + + * Arguments: + 0: Vehicle (Object) + + * Return value: + Bool + */ + +private _targetVehicle = _this; + +private _crew = crew _targetVehicle; +private _isUncInside = false; + +if (count _crew > 0) then { + { + if (_x getVariable ["ais_unconscious", false]) then { + if (_x call AIS_System_fnc_checkUnload) exitWith {_isUncInside = true}; + }; + true + } count _crew; +}; + + +_isUncInside \ No newline at end of file diff --git a/source/AIS/System/fn_allowRevive.sqf b/source/AIS/System/fn_allowRevive.sqf new file mode 100644 index 0000000..c1aa052 --- /dev/null +++ b/source/AIS/System/fn_allowRevive.sqf @@ -0,0 +1,53 @@ +/* + * Author: Psycho + + * Check Unit if Revive is possible. If yes, Revive-Action is shown up. + + * Arguments: + 0: Unit (Object) + + * Return value: + Bool + */ + +private _target = _this; + +_isUnc = _target getVariable ["ais_unconscious",false]; +_isStabil = _target getVariable ["ais_stabilized",false]; +_isUncHealer = player getVariable ["ais_unconscious",false]; +_noHealer = isNull (_target getVariable ['ais_hasHelper', objNull]); +_noDrag = isNull (_target getVariable ['ais_DragDrop_Player', objNull]); +_noDraging = isNull (player getVariable ['ais_DragDrop_Torso', objNull]); + +private _station = true; +if (count AIS_MEDEVAC_STATIONS > 0) then { + _station = [player, _target] call AIS_System_fnc_medEvacArea; +}; + + +_is_able_to_do = switch (AIS_MEDICAL_EDUCATION) do { + case (0) : {true}; + case (1) : {(items player) find "FirstAidKit" > -1 || {(items player) find "Medikit" > -1}}; + case (2) : {player call AIS_System_fnc_isMedic}; + default {true}; +}; + + +_return = if ( + + _isUnc && + {_isStabil} && + {!_isUncHealer} && + {alive _target} && + {_noHealer} && + {_noDrag} && + {_noDraging} && + {_is_able_to_do} && + {_station} + +) then {true} else {false}; + + + + +_return \ No newline at end of file diff --git a/source/AIS/System/fn_allowStabilize.sqf b/source/AIS/System/fn_allowStabilize.sqf new file mode 100644 index 0000000..68f193f --- /dev/null +++ b/source/AIS/System/fn_allowStabilize.sqf @@ -0,0 +1,38 @@ +/* + * Author: Psycho + + * Check Unit if Revive is possible. If yes, Revive-Action is shown up. + + * Arguments: + 0: Unit (Object) + + * Return value: + Bool + */ + +private _target = _this; + +_isUnc = _target getVariable ["ais_unconscious",false]; +_isStabil = _target getVariable ["ais_stabilized",false]; +_isUncHealer = player getVariable ["ais_unconscious",false]; +_noHealer = isNull (_target getVariable ['ais_hasHelper', objNull]); +_noDrag = isNull (_target getVariable ['ais_DragDrop_Player', objNull]); +_noDraging = isNull (player getVariable ['ais_DragDrop_Torso', objNull]); + + +_return = if ( + + _isUnc && + {!_isStabil} && + {!_isUncHealer} && + {alive _target} && + {_noHealer} && + {_noDrag} && + {_noDraging} + +) then {true} else {false}; + + + + +_return \ No newline at end of file diff --git a/source/AIS/System/fn_bloodloss.sqf b/source/AIS/System/fn_bloodloss.sqf new file mode 100644 index 0000000..cd71530 --- /dev/null +++ b/source/AIS/System/fn_bloodloss.sqf @@ -0,0 +1,37 @@ +/* + * Author: Psycho + + * Calculate the time till the unit will die (Revive-Time) and control the injury-effects. + + * Arguments: + 0: Unit (Object) + 1: Killer (Object) + + * Return value: + - +*/ +params ["_unit"]; +if (!local _unit) exitWith {}; + + +// Function use disableSerialisation and can corrupt some other functions in the same frame. So it need a delay till next frame. +[{call AIS_Effects_fnc_bloodSplatterScreen}] call AIS_Core_fnc_onNextFrame; + +// shacking gun +addCamShake [15, 999, 0.7]; + +//if (tcb_ais_bloodParticle) then {[_unit] call tcb_fnc_setBleeding}; // not implemented yet + +// get the revive time +_revive_time = [_unit] call AIS_System_fnc_calculateLifeTime; +_unit setBleedingRemaining _revive_time; + +// no reset of this variable until the unit fall in a completely new unconsciou state. +ais_start_unc_time = diag_tickTime; + +// start the timer and the visula effetcs +private _acc_time = diag_tickTime + 1; +[{diag_tickTime >= (_this select 2)}, {_this call AIS_Effects_fnc_bleeding}, [_unit, _revive_time, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_bloodlossAI.sqf b/source/AIS/System/fn_bloodlossAI.sqf new file mode 100644 index 0000000..ce373f7 --- /dev/null +++ b/source/AIS/System/fn_bloodlossAI.sqf @@ -0,0 +1,56 @@ +/* + * Author: Psycho + + * Calculate the time till the AI units will die (Revive-Time) and check if the get revived. + + * Arguments: + 0: Unit (Object) + + * Return value: + - +*/ + +params ["_unit"]; +if (!canSuspend) exitWith {[_unit] spawn AIS_System_fnc_bloodlossAI}; +if (!local _unit) exitWith {}; + + +// AI help AI +[_unit] call AIS_System_fnc_AIselfCheck; + +// get the revive time +_revive_time = [_unit] call AIS_System_fnc_calculateLifeTime; +_unit setBleedingRemaining _revive_time; + +// no reset of this variable until the unit fall in a completely new unconsciou state. +private _ai_time_over = diag_tickTime + _revive_time; + +// wait until something happens +waitUntil { + !alive _unit || + {!(_unit getVariable ["ais_unconscious", false])} || + {_unit getVariable ["ais_stabilized", false]} || + {diag_tickTime > _ai_time_over} +}; + + +if (diag_tickTime > _ai_time_over) exitWith {[_unit] call AIS_Damage_fnc_goToDead}; + +if (_unit getVariable ["ais_stabilized", false]) then { + waitUntil {!alive _unit || {!(_unit getVariable ["ais_unconscious", false])}}; +}; + +if (!alive _unit) exitWith {_unit call AIS_System_fnc_restoreFaks}; + +_unit stop false; +{_unit enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; + +/* + +... place to some AI stuff after revive if necessary... + + +*/ + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_calculateLifeTime.sqf b/source/AIS/System/fn_calculateLifeTime.sqf new file mode 100644 index 0000000..d03b4c4 --- /dev/null +++ b/source/AIS/System/fn_calculateLifeTime.sqf @@ -0,0 +1,38 @@ +/* + * Author: Psycho + + * Calculate the real revive time. Time depends on real summary damage of all body parts. + + * Arguments: + 0: Unit (Object) + + * Return value: + NUMBER (Life Time) +*/ + +params ["_unit"]; + +private _calculated_life_time = AIS_BLEEDOUT_TIME; + +// A bigger factor mean we have a bigger deviation in revive time depending in our real damage deviation. (recommended values between 0.5 and 2.0) +_ais_variation_factor = 1.0; +// If the unit stay at this avg damage we are near the basic revive time. If the real damage is less or stronger also the real revive time will change. (no big changes recommended!) +_ais_avg_damage_factor = 6; + +// get real damage (all body parts + overall damage) +private _summary_damage = 0; +{ + _summary_damage = _summary_damage + (((getAllHitPointsDamage _unit) select 2) select _x); + true +} count [0,1,2,3,4,5,6,7,8,9,10]; +_summary_damage = _summary_damage + (damage _unit); + +// calculate life time +_calculated_life_time = if (_unit getVariable ["AIS_noBleedOut", false]) then { + 999999999 +} else { + AIS_BLEEDOUT_TIME + ((_ais_variation_factor * (_ais_avg_damage_factor - _summary_damage)) * 10); +}; + + +_calculated_life_time \ No newline at end of file diff --git a/source/AIS/System/fn_calculateReviveTime.sqf b/source/AIS/System/fn_calculateReviveTime.sqf new file mode 100644 index 0000000..aba087f --- /dev/null +++ b/source/AIS/System/fn_calculateReviveTime.sqf @@ -0,0 +1,40 @@ +/* + * Author: Psycho + + * Calculate the needed time to revive a unit. + + * Arguments: + 0: Unit (Object) + 1: Injured (Object) + + * Return value: + NUMBER (Revive Time) +*/ + +params ["_unit", "_injured"]; + +private _calculated_revive_time = AIS_REVIVETIME; + +// A bigger factor mean we have a bigger deviation in revive time depending in our real damage deviation. (recommended values between 0.5 and 2.0) +_ais_variation_factor = 0.7; +// If the unit stay at this avg damage we are near the basic revive time. If the real damage is less or stronger also the real revive time will change. (no big changes recommended!) +_ais_avg_damage_factor = 6; + +// get real damage (all body parts + overall damage) +private _summary_damage = 0; +{ + _summary_damage = _summary_damage + (((getAllHitPointsDamage _injured) select 2) select _x); + true +} count [0,1,2,3,4,5,6,7,8,9,10]; +_summary_damage = _summary_damage + (damage _injured); + +// calculate revive time +_calculated_revive_time = (AIS_REVIVETIME + ((_ais_variation_factor * (_summary_damage - _ais_avg_damage_factor)) * 2)) max (AIS_REVIVETIME / 2); + +// rezise the time if the helper is a medic +if (_unit call AIS_System_fnc_isMedic) then { + _calculated_revive_time = _calculated_revive_time / 1.5; +}; + + +_calculated_revive_time \ No newline at end of file diff --git a/source/AIS/System/fn_calculateStabilizeTime.sqf b/source/AIS/System/fn_calculateStabilizeTime.sqf new file mode 100644 index 0000000..a0156a9 --- /dev/null +++ b/source/AIS/System/fn_calculateStabilizeTime.sqf @@ -0,0 +1,40 @@ +/* + * Author: Psycho + + * Calculate the needed time to stabilize a unit. + + * Arguments: + 0: Unit (Object) + 1: Injured (Object) + + * Return value: + NUMBER (Stabilize Time) +*/ + +params ["_unit", "_injured"]; + +private _calculated_stabilize_time = AIS_STABILIZETIME; + +// A bigger factor mean we have a bigger deviation in revive time depending in our real damage deviation. (recommended values between 0.5 and 2.0) +_ais_variation_factor = 0.7; +// If the unit stay at this avg damage we are near the basic revive time. If the real damage is less or stronger also the real revive time will change. (no big changes recommended!) +_ais_avg_damage_factor = 6; + +// get real damage (all body parts + overall damage) +private _summary_damage = 0; +{ + _summary_damage = _summary_damage + (((getAllHitPointsDamage _injured) select 2) select _x); + true +} count [0,1,2,3,4,5,6,7,8,9,10]; +_summary_damage = _summary_damage + (damage _injured); + +// calculate revive time +_calculated_stabilize_time = (AIS_STABILIZETIME + ((_ais_variation_factor * (_summary_damage - _ais_avg_damage_factor)) * 2)) max (AIS_STABILIZETIME / 2); + +// rezise the time if the helper is a medic +if (_unit call AIS_System_fnc_isMedic) then { + _calculated_stabilize_time = _calculated_stabilize_time / 1.5; +}; + + +_calculated_stabilize_time \ No newline at end of file diff --git a/source/AIS/System/fn_callHelp.sqf b/source/AIS/System/fn_callHelp.sqf new file mode 100644 index 0000000..b955fae --- /dev/null +++ b/source/AIS/System/fn_callHelp.sqf @@ -0,0 +1,26 @@ +/* + * Author: Psycho + + * Call for help and also start to check if a AI can help you. + + * Arguments: + 0: Unit (Object) + + * Return value: + BOOL (true if help is called, false if not) +*/ + +params ["_unit"]; + +if (!isNull (_unit getVariable ["ais_hasHelper", objNull])) exitWith {}; + +if ((_unit getVariable ["callHelpDelay", 0]) > diag_tickTime) exitWith {["You already have called for help!"] call AIS_Core_fnc_dynamicText; false}; +_unit setVariable ["callHelpDelay", diag_tickTime + 9]; + +[""] call AIS_Core_fnc_dynamicText; +[_unit] call AIS_Effects_fnc_helpScream; + +if (rating _unit < -1999) exitWith {false}; + +[_unit, objNull] call AIS_System_fnc_findAIHelper; +true \ No newline at end of file diff --git a/source/AIS/System/fn_carry.sqf b/source/AIS/System/fn_carry.sqf new file mode 100644 index 0000000..d3a5f94 --- /dev/null +++ b/source/AIS/System/fn_carry.sqf @@ -0,0 +1,73 @@ +/* + * Author: Psycho + + * Start to carry a unit. + + * Arguments: + 0: Unit Drager (Object) + 1: Unit wounded (Object) + + * Return value: + - +*/ + +params ["_unit"]; +private _target = _unit getVariable ["ais_DragDrop_Torso", objNull]; + +// switch to primary weapon, exit if no primary weapon is present (animation cant be played without a primary :( ) +if (primaryWeapon _unit isEqualTo "") exitWith { + ["This action is only with a primary Weapon possible."] call AIS_Core_fnc_dynamicText; +}; + +if (primaryWeapon _unit != "") then { + _unit switchmove "amovpercmstpsraswrfldnon"; + _unit selectWeapon (primaryWeapon _unit); +}; + +if (_unit call AIS_System_fnc_checkLauncher) exitWith { + ["You are not able to carry anyone else while carrying a launcher on your back."] call AIS_Core_fnc_dynamicText; +}; +_unit setVariable ["ais_CarryDrop_Torso", true]; + + +[_target,_unit] spawn { + + _target = _this select 0; + _unit = _this select 1; + detach _unit; + detach _target; + + _pos = _unit ModelToWorld [0,1.8,0]; + _target setPos _pos; + [_target, "grabCarried"] remoteExec ["playActionNow", 0, false]; + disableUserInput true; + sleep 2.5; + if (!isPlayer _target) then {_target disableAI "ANIM"}; + [_unit, "grabCarry"] remoteExec ["playActionNow", 0, false]; + _unit playActionNow "grabCarry"; + disableUserInput false; + disableUserInput true; + disableUserInput false; + + _timenow = time; + waitUntil {!alive _target || {!alive _unit} || {_unit getVariable ["ais_unconscious", false]} || {time > _timenow + 16}}; + _state = _unit getVariable ["ais_unconscious", false]; + if (!alive _target || {!alive _unit} || {_state}) then { + if (alive _target) then { + [_target, "agonyStart"] remoteExec ["playActionNow", 0, false]; + _target setVariable ["ais_DragDrop_Player", objNull, true]; + }; + if (alive _unit && {!(_state)}) then { + [_unit, "amovpknlmstpsraswrfldnon"] remoteExec ["playMoveNow", 0, false]; + }; + _unit setVariable ["ais_DragDrop_Torso", objNull]; + _unit setVariable ["ais_CarryDrop_Torso", false]; + } else { + _target attachTo [_unit, [-0.6, 0.28, -0.05]]; + [_target, 0] remoteExec ["setDir", 0, false]; + }; + +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_checkLauncher.sqf b/source/AIS/System/fn_checkLauncher.sqf new file mode 100644 index 0000000..9cf5924 --- /dev/null +++ b/source/AIS/System/fn_checkLauncher.sqf @@ -0,0 +1,15 @@ +/* + * Author: Psycho + + * Check if the unit have a launcher. + + * Arguments: + 0: Unit (Object) + + * Return value: + BOOL (true when Launcer is present) +*/ + +_ret = if (SecondaryWeapon _this isEqualTo "") then {false} else {true}; + +_ret \ No newline at end of file diff --git a/source/AIS/System/fn_checkUnload.sqf b/source/AIS/System/fn_checkUnload.sqf new file mode 100644 index 0000000..2ea175b --- /dev/null +++ b/source/AIS/System/fn_checkUnload.sqf @@ -0,0 +1,22 @@ +/* + * Author: psycho + + * Check if a unit can be unload from a vehicle at the actual situation + + * Arguments: + 0: Unit (Object) + + * Example: + [player] call AIS_System_fnc_checkUnload; + + * Return value: + Bool +*/ + +params ["_unit"]; +private _vehicle = vehicle _unit; + + +if (surfaceIsWater position _unit) exitWith {false}; + +((speed _vehicle < 2) && {((getPosATL _vehicle) select 2) < 2}) \ No newline at end of file diff --git a/source/AIS/System/fn_diary.sqf b/source/AIS/System/fn_diary.sqf new file mode 100644 index 0000000..07eb158 --- /dev/null +++ b/source/AIS/System/fn_diary.sqf @@ -0,0 +1,77 @@ +/* + * Author: psycho + + * Diary entry. + + * Arguments: + - + + * Return value: + Bool + */ + +private _who_can_revive = switch (AIS_MEDICAL_EDUCATION) do { + case (0) : {"Everyone can revive"}; + case (1) : {"Everybody with a First Aid Kit or Medkit"}; + case (2) : {"Only medics can revive"}; +}; +private _revive_guaranty = if (AIS_REVIVE_GUARANTY) then {"You are protected from insta-death"} else {"Heavy damage can end in insta-death"}; +private _revive_heal = if (AIS_REVIVE_HEAL) then {"completely healed"} else {"separately healing action needed"}; + +_subject = player createDiarySubject ["ais_settings", "AIS Settings"]; +_log_briefing = player createDiaryRecord ["ais_settings", ["Medical Education", " +Who can revive: " + _who_can_revive]]; +_log_briefing = player createDiaryRecord ["ais_settings", ["Heavy Damage Handling", " +Revive Chance: " + _revive_guaranty]]; +_log_briefing = player createDiaryRecord ["ais_settings", ["Bleedout Time", +format ["Average Bleedout Time: %1", AIS_BLEEDOUT_TIME]]]; +_log_briefing = player createDiaryRecord ["ais_settings", ["Healing Status", " +Damage status after revive: " + _revive_heal]]; + +_subject = player createDiarySubject ["ais", "First Aid System"]; +_log_briefing = player createDiaryRecord ["ais", ["About and Credits", " +Made by: Psychobastard
+Version: 3072018

+ +Credits
+- BonInf* for the first multiplayer compatible version (Arma 2)
+- BI for the design idea (Wounding module Arma 2)
+- Alwarren for his feedback and fixes
+- Lukio for his text revisions and better translations
+- NetFusion for the way of handling interactions
+- ACE3 Team for damage handling of droping units
+- CBA Team for some functions +"]]; + +_log_briefing = player createDiaryRecord ["ais", ["Instructions", " +If you are unconscious:
+- Press 'FORWARD' to go prone and fire your current weapon.

+- You can CRAWL to a safe position.

+- Press 'H' key to call friendly AI for help.



+ +How to give first aid:
+- Move close to an unconscious unit and select 'Stabilize' to stop heavy bleeding. This will prevent the injured unit from bleedout. (death)

+- Move close to an unconscious unit and select 'First Aid' to revive the unit.

+- If it is needed and you want to 'Abbort' a revive process, simply press 'ESC' Button.

+- Move close to an unconscious unit and select 'Drag' to drag the body out of the line of fire (Mousewheel menu).

+- While you are dragging a unit, you can select 'Carry' to carry the unit on your shoulders (better to cover long distances).

+- In some cases you need medical equipment (First Aid Kit or Medkit) or must be a medic to start the 'First aid' action. +"]]; + +_log_briefing = player createDiaryRecord ["ais", ["About wounding / death:", " +If a unit receives too much damage, the unit goes unconscious. This means that the unit starts to bleed out and needs help from other units.

+If someone comes to help, he can stop the bleeding to prevent the injured from bleeding out and die. After the unit is stabilized you can start the first aid process to revive the unit. After a unit is revived maybe they need a regular healing process too.

+If nobody comes to help the unit eventually bleeds out. The time depends on the amount of damage the unit received. Everyone can stabilize unconscious units. The ability to start the first aid process can depend on the medical education. (medic or not, medical equipment)

+It is possible to load/unload wounded units in vehicles to bring them out of a dangerous area or evacuate them to a field hospital. +"]]; + +_log_briefing = player createDiaryRecord ["ais", ["Description", " +Psycho's Wounding System

+This First Aid System (AIS = Alternative Injury System) is an alternative system to all the current normal revive scripts.

+The main difference to a standard revive system is that the unit does not die before going into a state of agony. If critical damage level is reached, the unit goes unconscious and does not immediately die like in most other systems. The advantage: You can use it in missions without a revive option as well!

+Another advantage of the system is that if a unit is gravely wounded and waiting for others to help, the wounded unit is not completely defenseless. A wounded unit can go prone, crawl and use a weapon as last stand (until the magazine is empty). +AIS also supports AI. AI soldiers can be unconscious or give first aid as well. +"]]; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_disableRespawnButton.sqf b/source/AIS/System/fn_disableRespawnButton.sqf new file mode 100644 index 0000000..9121939 --- /dev/null +++ b/source/AIS/System/fn_disableRespawnButton.sqf @@ -0,0 +1,31 @@ +/* + * Author: Psycho + + * Disable the respawn button for given time. + + * Arguments: + 1: Key (Number) + + * Return value: + Bool +*/ +disableSerialization; +waitUntil {!(isNull (findDisplay 49))}; + +_downTime = player getVariable ["ais_protector_delay", 0]; +private _delay = _downTime + AIS_DISABLE_RESPAWN_BUTTON - 6; +private _ctrl = (findDisplay 49) displayCtrl 1010; + +while {!isNull (findDisplay 49) && {diag_tickTime < _delay}} do { + _ctrl ctrlEnable false; + _ctrl ctrlSetText format ["Respawn Disabled (%1 sec)", [(_delay - diag_tickTime)] call AIS_System_fnc_secondsToString]; + uisleep 0.08; +}; + +if (!ctrlEnabled _ctrl) then { + _ctrl ctrlEnable true; + _ctrl ctrlSetText "Respawn"; +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_drag.sqf b/source/AIS/System/fn_drag.sqf new file mode 100644 index 0000000..d5bae50 --- /dev/null +++ b/source/AIS/System/fn_drag.sqf @@ -0,0 +1,39 @@ +/* + * Author: Psycho + + * Start to drag a unit. + + * Arguments: + 0: Unit Drager (Object) + 1: Unit wounded (Object) + + * Return value: + - +*/ + + +params ["_unit", "_target"]; + +_unit setVariable ["ais_DragDrop_Torso", _target]; +_target setVariable ["ais_DragDrop_Player", _unit, true]; + +_target setVariable ["ais_hasHelper", _unit, true]; + + +detach _unit; +detach _target; + +[_target, "AinjPpneMrunSnonWnonDb"] remoteExec ["switchMove", 0]; +[_unit, "grabDrag"] remoteExec ["playActionNow", 0, false]; +//waitUntil {animationState _unit in ["amovpercmstpslowwrfldnon_acinpknlmwlkslowwrfldb_2", "amovpercmstpsraswpstdnon_acinpknlmwlksnonwpstdb_2", "amovpercmstpsnonwnondnon_acinpknlmwlksnonwnondb_2", "acinpknlmstpsraswrfldnon", "acinpknlmstpsnonwpstdnon", "acinpknlmstpsnonwnondnon"]}; + +_attachPoint = [0, 1.1, 0.05]; +_target attachTo [_unit, _attachPoint]; +[_target, 180] remoteExec ["setDir", 0, false]; + +// release the injured if the helper getin a vehicle +[ + {isNull ((_this select 1) getVariable ["ais_DragDrop_Player", objNull]) || {!(isNull objectParent (_this select 0))}}, + {if (!(isNull objectParent (_this select 0))) then {[(_this select 0)] call AIS_System_fnc_release}}, + [_unit,_target] +] call AIS_Core_fnc_waitUntilAndExecute; diff --git a/source/AIS/System/fn_findAIHelper.sqf b/source/AIS/System/fn_findAIHelper.sqf new file mode 100644 index 0000000..7f319ed --- /dev/null +++ b/source/AIS/System/fn_findAIHelper.sqf @@ -0,0 +1,68 @@ +/* + * Author: Psycho + + * Searching for the best helper in the near of a player. + + * Arguments: + 0: Unit (Object) (Unit which called for help) + 1: Helper (Object (AI which can help) + + * Return value: + Nothing +*/ + +params [ + ["_injured", objNull, [objNull]], + ["_helper", objNull, [objNull]] +]; + +// + +// start searching for a match +if (isNull _helper) then { + + // looking for a valid AI group member. + private _all_members = (units group _injured) - [_injured]; + if (count _all_members > 0) then { + private _matching_members_array = []; + {if (!(_x getVariable ["ais_unconscious", false]) && {!isPlayer _x}) then {_matching_members_array pushBack _x};true} count _all_members; + + if (count _matching_members_array > 0) then { + {if (_x call AIS_System_fnc_isMedic) exitWith {_helper = _x};true} count _matching_members_array; + if (isNull _helper) then {_helper = selectRandom _matching_members_array}; + }; + }; + + // if no valid AI group member was found looking for close AI units of the same side + if (isNull _helper) then { + private _allMenNear = []; + if (AIS_AI_HELP_RADIUS > 200) then {AIS_AI_HELP_RADIUS = 200}; // max 200 metres + _allMenNear = (position _injured) nearEntities ["CAManBase", AIS_AI_HELP_RADIUS]; + _allMenNear = _allMenNear - [_injured]; + if (count _allMenNear > 0) then { + private _matching_side_array = []; + private _side = _injured getVariable ["ais_side", civilian]; // needed, cause the injured can be captive (captive == side civilian) + {if ((_side isEqualTo (side _x)) && {!(_x getVariable ["ais_unconscious", false])} && {!isPlayer _x}) then {_matching_side_array pushBack _x};true} count _allMenNear; + if (count _matching_side_array > 0) then { + {if (_x call AIS_System_fnc_isMedic) exitWith {_helper = _x};true} count _matching_side_array; + if (isNull _helper) then {_helper = _matching_side_array select 0}; // no random value to pick the closest one + }; + }; + }; +}; + +// if no match... +if (isNull _helper) exitWith {}; + +// ...otherwise our new helper will make his way to the injured unit. +private _acc_time = diag_tickTime + 1; +if (local _helper) then { + [{diag_tickTime > (_this select 2)}, {_this call AIS_System_fnc_moveAIHelper}, [_injured, _helper, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; +} else { + [{diag_tickTime > (_this select 2)}, { + [_this select 0, _this select 1] remoteExecCall ["AIS_System_fnc_moveAIHelper", 2]; + }, [_injured, _helper, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_getCargoIndex.sqf b/source/AIS/System/fn_getCargoIndex.sqf new file mode 100644 index 0000000..5bca74d --- /dev/null +++ b/source/AIS/System/fn_getCargoIndex.sqf @@ -0,0 +1,45 @@ +/* + * Author: Psycho + + * Get a free cargo seat position for given vehicle. + + * Arguments: + 0: Vehicle (Object) + + * Return value: + [vehicle, cargo index] (ARRAY) (empty Array if nothing found) + */ + +params ["_targetVehicle"]; +private _VehicleIndex = []; + +// check if free cargo seats are avalible +private _allCargoSeats = []; +_allCargoSeats = fullcrew [_targetVehicle, "cargo", true]; +if ( count _allCargoSeats > 0) then { + { + if (isNull (_x select 0)) exitWith { + _VehicleIndex = [_targetVehicle, _x select 2]; + }; + true + } count _allCargoSeats; +}; + +if (count _VehicleIndex > 0) exitWith {_VehicleIndex}; + + +// check if free turret seats are avalible if no cargo seats there +private _allTurretSeats = []; +_VehicleIndex = []; +_allTurretSeats = fullcrew [_targetVehicle, "Turret", true]; +if ( count _allTurretSeats > 0) then { + { + if (isNull (_x select 0)) exitWith { + _VehicleIndex = [_targetVehicle, _x select 2]; + }; + true + } count _allTurretSeats; +}; + + +_VehicleIndex \ No newline at end of file diff --git a/source/AIS/System/fn_getOutMan.sqf b/source/AIS/System/fn_getOutMan.sqf new file mode 100644 index 0000000..0cd529e --- /dev/null +++ b/source/AIS/System/fn_getOutMan.sqf @@ -0,0 +1,25 @@ +/* + * Author: Psycho + + * Check if a unconscious unit is pulled out of the vehicle by a AI order and set the correct anim-state. Is called by the getOutMan EH. + + * Arguments: + 0: Unit (Object) + + * Return value: + Nothing + +* Exapmle: + - + */ + +params ["_injured"]; + +if (_injured getVariable ["ais_unconscious", false]) then { + if (!(_injured getVariable ["ais_man_pullOut", false])) then { + [_injured, "agonyStart"] remoteExec ["playActionNow", 0, false]; + }; +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_handleHeal.sqf b/source/AIS/System/fn_handleHeal.sqf new file mode 100644 index 0000000..9b4c2b0 --- /dev/null +++ b/source/AIS/System/fn_handleHeal.sqf @@ -0,0 +1,58 @@ +/* + * Author: Psycho + + * Block the engine heal action during the unit is unconscious. Function is triggered trough the Heal-EH. + --> EH is brocken: did not react like the BI description tell it. Work around: remove all faks and give them back after the process is done. (without fak, no healing) + * Engine healing is also blocked by fn_overrideHealAction. Keep this function cause the other function isnt stackable! + + * Arguments: + 0: Unit (Object) + 1: Healer (Object) + + * Example: + [p1, player] call AIS_System_fnc_handleHeal; + + * Return value: + BOOL - true to block the engine handling, false to do the engine action +*/ + +params ["_injured", "_healer"]; +private _return = false; + +if (_injured getVariable ["ais_unconscious", false]) then { + + // remove FAKS to avoid the damage processing + if (local _healer) then { + [_healer] call AIS_System_fnc_removeFaks; + } else { + [_healer] remoteExec ["[_this select 0] call AIS_System_fnc_removeFaks", _healer, false]; + }; + + + if (isPlayer _healer) then { + _txt = if (_injured getVariable ["ais_stabilized", false]) then { + "First you have to Revive the injured." + } else { + "First you have to Stabilize the injured." + }; + [_txt] remoteExecCall ["AIS_Core_fnc_dynamicText", _healer, false]; + } else { + // we can use the AI handling at this point to start our own revive process... + if (isNull (_injured getVariable ["ais_hasHelper", objNull])) then { + [_healer, _injured] spawn AIS_System_fnc_ReviveAI; + }; + }; + + // give Faks back after healing process + private _startTime = diag_tickTime + 8; + if (local _healer) then { + [{diag_tickTime > (_this select 1)},{[(_this select 0)] call AIS_System_fnc_restoreFaks;},[_healer, _startTime]] call AIS_Core_fnc_waitUntilAndExecute; + } else { + [_healer, _startTime] remoteExec ["[{diag_tickTime > (_this select 1)},{[(_this select 0)] call AIS_System_fnc_restoreFaks;},[_this selct 0, _this selct 1]] call AIS_Core_fnc_waitUntilAndExecute", _healer, false]; + }; + + _return = true; +}; + + +_return \ No newline at end of file diff --git a/source/AIS/System/fn_isMedic.sqf b/source/AIS/System/fn_isMedic.sqf new file mode 100644 index 0000000..83982e7 --- /dev/null +++ b/source/AIS/System/fn_isMedic.sqf @@ -0,0 +1,22 @@ +/* + * Author: Psycho + + * Chck if the unit is a medic. Also units which set manually to a medic will be found. (setUnitTrait) + + * Arguments: + 0: Unit (Object) + + * Return value: + Nothing + + * Example: + player call AIS_System_fnc_isMedic; + */ + + +_healer = _this; +//_isMedic = if (getNumber (configFile >> "CfgVehicles" >> (typeOf _healer) >> "attendant") == 1) then {true} else {false}; +_isMedic = _healer getUnitTrait "Medic"; + + +_isMedic \ No newline at end of file diff --git a/source/AIS/System/fn_keyHandler.sqf b/source/AIS/System/fn_keyHandler.sqf new file mode 100644 index 0000000..530b94e --- /dev/null +++ b/source/AIS/System/fn_keyHandler.sqf @@ -0,0 +1,49 @@ +/* + * Author: Psycho + + * unbind some key functions while the player is unconcious. + --> Block the following actions: reload, inventory, weapon change, diary and map, chat, get in/out of a vehicle, throw grenades, open curator interface, eject a vehicle +* Also it handle some special key functions. + --> press "H" for calling help while unconscious + + * Arguments: + 1: Key (Number) + + * Return value: + Bool +*/ + + +private _keyDown = _this select 1; +private _return = false; + +if !(player getVariable ['ais_unconscious', false]) exitWith {false}; + +if (_keyDown isEqualTo 1) then {[] spawn AIS_System_fnc_disableRespawnButton}; // key "Esc" --> disable Respawn Button + +if (_keyDown isEqualTo 35) then {[player] call AIS_System_fnc_callHelp}; // key "H" --> call for Help + + +// vehicle actions +if (!(isNull objectParent player)) then { + //hint format ["%1", _keyDown]; + { + if (_keyDown in (actionKeys _x)) exitWith { + _return = true; + }; + Nil + } count ['CarForward','CarBack','HeliCyclicForward','HeliLeft','HeliRudderLeft','HeliRight','HeliRudderRight','AutoHover','CarFastForward','CarSlowForward','submarineForward','submarineBack','SwitchWeapon']; +}; + +{ + if (_keyDown in (actionKeys _x)) exitWith { + if (AIS_NO_CHAT && {_keyDown in (actionKeys 'Chat')}) then { + ["Chat disabled."] call AIS_Core_fnc_dynamicText; + }; + _return = true; + }; + Nil +} count ['ReloadMagazine','Gear','SwitchWeapon','Diary','DeployWeaponAuto','Chat','Throw','ShowMap','turnIn','turnOut','curatorInterface','Eject']; + + +_return \ No newline at end of file diff --git a/source/AIS/System/fn_killed.sqf b/source/AIS/System/fn_killed.sqf new file mode 100644 index 0000000..fb29504 --- /dev/null +++ b/source/AIS/System/fn_killed.sqf @@ -0,0 +1,18 @@ +/* + * Author: Psycho + + * Clean up the unit if they got killed. Is called by the killed EH. + + * Arguments: + 0: Unit (Object) + 1: Killer (Object) + + * Return value: + - +*/ + +params ["_unit", "_killer"]; + +if (!(isNull (_unit getVariable ["ais_DragDrop_Torso", objNull]))) then { + [_unit] call AIS_System_fnc_release; +}; \ No newline at end of file diff --git a/source/AIS/System/fn_loadAIS.sqf b/source/AIS/System/fn_loadAIS.sqf new file mode 100644 index 0000000..a8c80f6 --- /dev/null +++ b/source/AIS/System/fn_loadAIS.sqf @@ -0,0 +1,43 @@ +/* + * Author: Psycho + + * Start to init a unit. It's a public function. + + * Arguments: + 0: Unit (Object) + + * Return value: + Nothing + +* Exapmle: + [_unit] call AIS_System_fnc_loadAIS; + */ + +params ["_unit"]; +if (!isNil {_unit getVariable "ais_aisInit"}) exitWith {}; + +if (isServer) then { + + if (local _unit) then { + [_this select 0] call AIS_Core_fnc_aisInitHost; + } else { + _id = owner _unit; + [_unit] remoteExecCall ["AIS_System_fnc_loadAISlocalToPlayer", _id, false]; + }; + +} else { + + if (local _unit) then { + [_unit] call AIS_System_fnc_loadAISlocalToPlayer; + } else { + [[_unit], { + if (isServer) then { + [_this select 0] call AIS_Core_fnc_aisInitHost; + }; + }] remoteExec ["call"]; + }; + +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_loadAISlocalToPlayer.sqf b/source/AIS/System/fn_loadAISlocalToPlayer.sqf new file mode 100644 index 0000000..cb264b9 --- /dev/null +++ b/source/AIS/System/fn_loadAISlocalToPlayer.sqf @@ -0,0 +1,43 @@ +/* + * Author: Psycho + + * Start to init a unit which is local to a player. + + * Arguments: + 0: Unit (Object) + + * Return value: + Nothing + +* Exapmle: + [_unit] call AIS_System_fnc_loadAISlocalToPlayer; + */ + +params ["_unit"]; +if (_unit getVariable ["AIS_noReviveInit", false]) exitWith {}; + +if (!isNil {_unit getVariable "ais_aisInit"}) then { + _unit removeAllEventHandlers "Killed"; + _unit removeAllEventHandlers "Respawn"; + _unit removeAllEventHandlers "HandleHeal"; + [_unit] call AIS_Core_fnc_setVariables; +}; +_unit setVariable ["ais_aisInit", true]; + + +_unit removeAllEventHandlers "handleDamage"; +_unit addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; + +_unit removeAllEventHandlers "Killed"; +_unit addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; + +_unit removeAllEventHandlers "Respawn"; +if ([_unit] call AIS_Core_fnc_isPlayable) then { + _unit addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; +}; + +_unit removeAllEventHandlers "HandleHeal"; +_unit addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_loadInjured.sqf b/source/AIS/System/fn_loadInjured.sqf new file mode 100644 index 0000000..2a346cc --- /dev/null +++ b/source/AIS/System/fn_loadInjured.sqf @@ -0,0 +1,28 @@ +/* + * Author: Psycho + + * Load a unit into a vehicles cargo or turret seat. + + * Arguments: + 0: Unit (Object) + 1: Vehicle (Object) + + * Return value: + - +*/ + +params ["_unit", "_vehicle"]; + +_injured = _unit getVariable ['ais_DragDrop_Torso', objNull]; +[_unit] call AIS_System_fnc_release; + +_injured setVariable ["ais_man_pullOut", false, true]; + +// move the wounded in the vehicle +[[_injured, _vehicle, 1], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"]; + +// unconscious animation in cargo seat +[{[(_this select 0), 'unconscious'] remoteExec ["playActionNow", 0, false]}, [_injured]] call AIS_Core_fnc_onNextFrame; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_medEvacArea.sqf b/source/AIS/System/fn_medEvacArea.sqf new file mode 100644 index 0000000..a068d5a --- /dev/null +++ b/source/AIS/System/fn_medEvacArea.sqf @@ -0,0 +1,28 @@ +/* + * Author: Psycho + + * Check Unit if is in range of a medevac object. + + * Arguments: + 0: Unit (Object) + 1: Injured (Object) + + * Return value: + Bool + */ + +params ["_player", "_injured"]; + +private _return = false; +{ + _x params [["_obj", objNull], ["_radius", 0, [0]]]; + if (_return) exitWith {true}; + if (!isNull _obj) then { + if (_radius > 0) then { + if ([_obj, _radius] call AIS_Core_fnc_inRange) exitWith {_return = true}; + }; + }; +} count AIS_MEDEVAC_STATIONS; + + +_return \ No newline at end of file diff --git a/source/AIS/System/fn_moveAIHelper.sqf b/source/AIS/System/fn_moveAIHelper.sqf new file mode 100644 index 0000000..ae2833f --- /dev/null +++ b/source/AIS/System/fn_moveAIHelper.sqf @@ -0,0 +1,62 @@ +/* + * Author: Psycho + + * Make the AI moving to a injured unit and start the revive. + + * Arguments: + 0: Injured unit (Object) + 1: Helper AI (Object) + + * Return value: + Nothing +*/ + +params ["_injured", "_helper"]; + +// help not longer needed or possible +if ( + !alive _helper || + !alive _injured || + (!(_injured getVariable ["ais_unconscious", false])) || + (_helper getVariable ["ais_unconscious", false]) || + (!isNull (_injured getVariable ["ais_hasHelper", objNull])) +) exitWith { + if (alive _helper) then { + _helper enableAI "AUTOCOMBAT"; + } else { + if (alive _injured && {!isPlayer _injured}) then { + [_injured] call AIS_System_fnc_AIselfCheck; // check if another helper is avalible + }; + }; +}; + +// AI instructions +if (behaviour _helper != "AWARE") then {_helper setBehaviour "AWARE"}; // better "SAFE" ??? +_helper disableAI "AUTOCOMBAT"; +_helper allowFleeing 0; + +if (currentCommand _helper != "MOVE") then { + _helper stop false; + _helper doMove (position (vehicle _injured)); +}; + +// if injured is in vehicle helper wont go that close --> have to increase the shortest distance +_dist = if (!isNull objectParent _injured) then {(sizeOf (typeOf (vehicle _injured)) / 2) + 1} else {3}; + +// start revive if close enough and ready for handling. Otherwise reset and repeat searching loop. +if (_helper distance2D (vehicle _injured) < _dist) exitWith { + if (isNull (_injured getVariable ["ais_hasHelper", objNull])) then { + _helper disableAI "AUTOCOMBAT"; + [_helper, _injured] spawn AIS_System_fnc_ReviveAI; + } else { + _helper enableAI "AUTOCOMBAT"; + [_injured] call AIS_System_fnc_AIselfCheck; + }; +}; + +// if not close enough start the function in a few seconds again +private _acc_time = diag_tickTime + 5; +[{diag_tickTime > (_this select 2)}, {_this call AIS_System_fnc_moveAIHelper}, [_injured, _helper, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_moveCargoRemote.sqf b/source/AIS/System/fn_moveCargoRemote.sqf new file mode 100644 index 0000000..9166a12 --- /dev/null +++ b/source/AIS/System/fn_moveCargoRemote.sqf @@ -0,0 +1,29 @@ +/* + * Author: Psycho + + * Load a unit into a vehicles cargo or turret seat. Function is everytime called by a player. Checks if the unit is local, if not, use remoteExec. + + * Arguments: + 0: Unit (Object) + 1: Vehicle (Object) + 2: In/Out (Number) // 0 = Out / 1 = In + + * Return value: + - +*/ + +params ["_injured", "_vehicle", "_handling"]; + +private _VehicleIndex = [_vehicle] call AIS_System_fnc_getCargoIndex; + + +if (_handling > 0) then { + _injured assignAsCargoIndex [_vehicle, _VehicleIndex select 1]; + _injured moveInCargo [_vehicle, _VehicleIndex select 1]; +} else { + unassignVehicle _injured; + moveOut _injured; +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_overrideHealAction.sqf b/source/AIS/System/fn_overrideHealAction.sqf new file mode 100644 index 0000000..6124d11 --- /dev/null +++ b/source/AIS/System/fn_overrideHealAction.sqf @@ -0,0 +1,35 @@ +/* + * Author: Psycho + + * Override the heal action if the unit is unconscious. + * This is called by a inGameUISetEventHandler. This isnt a stackable EH. This mean it will maybe be overriden by a mod or some 3rd party scripts! + + * Arguments: + 0: Unit (Object) + 1: Unit (Object) + 2: Index (Number) + 3: Action (String) + + * Return value: + Bool - true to block the engine handling, false to do the engine action +*/ + + +params ["_injured", "_caller", "_index", "_action"]; + +private _back = false; +if (_action isEqualTo "HealSoldier") then { + if (_injured getVariable ["ais_unconscious", false]) then { + _txt = if (_injured getVariable ["ais_stabilized", false]) then { + "First you have to Revive the injured." + } else { + "First you have to Stabilize the injured." + }; + _txt call AIS_Core_fnc_dynamicText; + _back = true; + }; + +}; + + +_back \ No newline at end of file diff --git a/source/AIS/System/fn_postinit.sqf b/source/AIS/System/fn_postinit.sqf new file mode 100644 index 0000000..eb8ea63 --- /dev/null +++ b/source/AIS/System/fn_postinit.sqf @@ -0,0 +1,101 @@ +if (isDedicated || !hasInterface) exitWith {}; +if (ais_ace_shutdown) exitWith {diag_log ["AIS: AIS shutdown itself cause ACE mod was detected. ACE and AIS cant work at the same time."]}; +/* +// expample action +_action = [ + "Text", // action text + player, // object which the action is assigned + 2, // distance where action is shown (0 means max distance = 15m) + "true", // condition to show the action + { + my_code // code perform on action + }, + [], // Optional: custom variables run trough + "%1" // Optional: formated text for setUserActionText +] call AIS_Core_fnc_addAction; +*/ + +[ + "First Aid", + player, + 1.5, + "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowRevive}", + { + [player, cursorTarget] spawn AIS_System_fnc_Revive; + }, + [], + "%1
" +] call AIS_Core_fnc_addAction; + +[ + "Stabilize", + player, + 1.5, + "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowStabilize}", + { + [player, cursorTarget] spawn AIS_System_fnc_Stabilize; + }, + [], + "%1
" +] call AIS_Core_fnc_addAction; + +[ + "Drag", + player, + 1.8, + "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowDrag}", + { + [player, cursorTarget] call AIS_System_fnc_drag; + }, + [], + "%1
" +] call AIS_Core_fnc_addAction; + +[ + "Carry", + player, + 0, + "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull])) && {!(player getVariable ['ais_CarryDrop_Torso', false])}", + { + [player] spawn AIS_System_fnc_carry; + }, + [], + "%1
" +] call AIS_Core_fnc_addAction; + +[ + "Release", + player, + 0, + "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull]))", + { + [player] call AIS_System_fnc_release; + }, + [], + "%1
" +] call AIS_Core_fnc_addAction; + +[ + "Unload Injured", + player, + 4, + "(cursorTarget isKindOf 'LandVehicle' || cursorTarget isKindOf 'Air') && {alive cursorTarget} && {cursorTarget call AIS_System_fnc_allowPullOut}", + { + [player, cursorTarget] call AIS_System_fnc_unloadInjured; + }, + [], + "%1
" +] call AIS_Core_fnc_addAction; + + +[ + "Load Injured", + player, + 4, + "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull])) && {cursorTarget isKindOf 'LandVehicle' || cursorTarget isKindOf 'Air'} && {cursorTarget call AIS_System_fnc_allowPullIn}", + { + [player, cursorTarget] call AIS_System_fnc_loadInjured; + }, + [], + "%1
" +] call AIS_Core_fnc_addAction; \ No newline at end of file diff --git a/source/AIS/System/fn_release.sqf b/source/AIS/System/fn_release.sqf new file mode 100644 index 0000000..64fee19 --- /dev/null +++ b/source/AIS/System/fn_release.sqf @@ -0,0 +1,34 @@ +/* + * Author: Psycho + + * Stop to drag another unit. + + * Arguments: + 0: Unit (Object) + + * Return value: + - +*/ + +params ["_unit"]; +private _target = _unit getVariable "ais_DragDrop_Torso"; +private _pos = getPos _target; + +_unit setVariable ["ais_DragDrop_Torso", objNull]; +_target setVariable ["ais_DragDrop_Player", objNull, true]; +_unit setVariable ["ais_CarryDrop_Torso", false]; + +_target setVariable ["ais_hasHelper", objNull, true]; +_unit playAction "released"; + +detach _unit; +detach _target; + +if (alive _target) then { + [_target, "AinjPpneMstpSnonWrflDb_release"] remoteExec ["switchMove", 0]; + //[_target, _pos] call AIS_Core_fnc_setPosAGLS; + _target setPos _pos; +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_removeFaks.sqf b/source/AIS/System/fn_removeFaks.sqf new file mode 100644 index 0000000..0b75204 --- /dev/null +++ b/source/AIS/System/fn_removeFaks.sqf @@ -0,0 +1,61 @@ +/* + * Author: Alwarren + + * Remove first aid and Medikits + + * Arguments: + 0: Unit (Object) + + * Example: + [player] call AIS_System_fnc_removeFaks; + + * Return value: + BOOL - false if items already stored +*/ + +params ["_unit"]; + +// Count the number of FAK's and Medikits this unit has +_storage = _unit getVariable ["AIS_MedicalStore", [0,0,0,0]]; +_storage params ["_fakUni","_fakVest","_fakBackP","_medK"]; +_numFakUniform = _fakUni; +_numFaksVest = _fakVest; +_numFaksBackpack = _fakBackP; +_numMedi = _medK; + +// Faks from the uniform +{ + if (_x == "FirstAidKit") then { + _numFakUniform = _numFakUniform + 1; + _unit removeItemFromUniform "FirstAidKit"; + }; + nil +} count (uniformItems _unit); + +// Faks from the vest +{ + if (_x == "FirstAidKit") then { + _numFaksVest = _numFaksVest + 1; + _unit removeItemFromVest "FirstAidKit"; + }; + nil +} count (vestItems _unit); + +// Faks and Medikits from the backpack. Kits can only be in backpack, so we don't search for them anywhere else +{ + if (_x == "FirstAidKit") then { + _numFaksBackpack = _numFaksBackpack + 1; + _unit removeItemFromBackpack "FirstAidKit"; + }; + if (_x == "Medikit") then { + _numMedi = _numMedi + 1; + _unit removeItemFromBackpack "Medikit"; + }; + nil +} count (backpackItems _unit); + +// Store the result +_unit setVariable ["AIS_MedicalStore", [_numFakUniform, _numFaksVest, _numFaksBackpack, _numMedi], true]; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_respawn.sqf b/source/AIS/System/fn_respawn.sqf new file mode 100644 index 0000000..55ebb6b --- /dev/null +++ b/source/AIS/System/fn_respawn.sqf @@ -0,0 +1,31 @@ +/* + * Author: Psycho + + * Re-initialize a respawned unit. + + * Arguments: + 0: Unit (Object) + 1: Corpse (Object) + + * Return value: + - +*/ + +params ["_unit", "_corpse"]; + + +_unit setVariable ["ais_unconscious", false, true]; +_unit setVariable ["ais_stabilized", false, true]; +_unit setVariable ["ais_fireDamage", 0]; +_unit setVariable ["AIS_UnitIsDead", false]; +_unit setCaptive false; + +if (isPlayer _unit) then { + if (local player) then {showHud true}; + if (AIS_TOGGLE_RADIO) then { + [true] call AIS_Effects_fnc_toggleRadio; + }; +} else { + _unit stop false; + {_unit enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM"]; +}; \ No newline at end of file diff --git a/source/AIS/System/fn_restoreFaks.sqf b/source/AIS/System/fn_restoreFaks.sqf new file mode 100644 index 0000000..8ae90bc --- /dev/null +++ b/source/AIS/System/fn_restoreFaks.sqf @@ -0,0 +1,33 @@ +/* + * Author: Alwarren + Changed: Psycho + + * Re-Add first aid and Medikits. + + * Arguments: + 0: Unit (Object) + + * Example: + [player] call AIS_System_fnc_restoreFaks; + + * Return value: + - +*/ + +params ["_unit"]; +private _items = _unit getVariable ["AIS_MedicalStore", [0,0,0,0]]; + + +for "_i" from 1 to (_items select 0) do {_unit addItemToUniform "FirstAidKit"}; + +for "_i" from 1 to (_items select 1) do {_unit addItemToVest "FirstAidKit"}; + +for "_i" from 1 to (_items select 2) do {_unit addItemTobackpack "FirstAidKit"}; + +for "_i" from 1 to (_items select 3) do {_unit addItem "Medikit"}; + + +_unit setVariable ["AIS_MedicalStore", [0,0,0,0], true]; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_reveal.sqf b/source/AIS/System/fn_reveal.sqf new file mode 100644 index 0000000..a8d41ab --- /dev/null +++ b/source/AIS/System/fn_reveal.sqf @@ -0,0 +1,32 @@ +/* + * Author: Psycho + + * Reveal near units after revive. + + * Arguments: + 0: Revived Unit (Object) + 1: Range (Number) [optional] + + * Return value: + Nothing +*/ + + +params [ + ["_unit", player, [player]], + ["_range", 50, [50]] +]; + +_list = _unit nearEntities ["CAManBase", _range]; +_side = _unit getVariable ["ais_side", civilian]; + +{ + if ((side _x) isEqualTo _side) then { + _unit reveal [_x, 4]; + }; + true + +} count _list; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_secondsToString.sqf b/source/AIS/System/fn_secondsToString.sqf new file mode 100644 index 0000000..9c1432a --- /dev/null +++ b/source/AIS/System/fn_secondsToString.sqf @@ -0,0 +1,23 @@ +/* + * Author: Joris-Jan van 't Land (based on work in fn_timeToString) + * Changed: Psycho (snip out only the needed lines...) + + * Convert seconds to formatted string. + + * Arguments: + _this select 0: time in seconds + + * Return value: + String +*/ + +_sec = _this param [0, 0, [0]]; + +_sec = _sec % 60; +_sec = floor (_sec); +_sec = (if (_sec <= 9) then {"0"} else {""}) + (str _sec); + +_time = format ["%1", _sec]; + + +_time \ No newline at end of file diff --git a/source/AIS/System/fn_setUnconscious.sqf b/source/AIS/System/fn_setUnconscious.sqf new file mode 100644 index 0000000..615f784 --- /dev/null +++ b/source/AIS/System/fn_setUnconscious.sqf @@ -0,0 +1,34 @@ +/* + * Author: Psycho + + * Set the unit in unconcsious state. This is a public function. + + * Arguments: + 0: Unit (Object) + + * Return value: + Nothing + +* Exapmle: + [player] call AIS_System_fnc_setUnconscious; + */ + + +params ["_unit"]; + +if (time <= 0) exitWith { + [ + {time > 0}, + {_this call AIS_System_fnc_setUnconscious}, + [_unit] + ] call AIS_Core_fnc_waitUntilAndExecute; +}; + +if (isPlayer _unit) then { + [_unit] call AIS_System_fnc_unconsciousPlayer +} else { + [_unit] call AIS_System_fnc_unconsciousAI +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_stabilize.sqf b/source/AIS/System/fn_stabilize.sqf new file mode 100644 index 0000000..90a43c6 --- /dev/null +++ b/source/AIS/System/fn_stabilize.sqf @@ -0,0 +1,90 @@ +/* + * Author: Psycho + + * Stabilize a unit. A stabilized unit stop to bleed and cant die trough the revive timer. + + * Arguments: + 0: Unit Helper (Object) + 1: Unit wounded (Object) + + * Return value: + - +*/ + +params ["_healer", "_injured"]; + + +_injured setVariable ["ais_hasHelper", _healer, true]; + +//_injured playMove "AinjPpneMstpSnonWrflDnon_rolltoback"; // from AIS fsm +[_injured, "AinjPpneMstpSnonWrflDnon_rolltoback"] remoteExec ["playMove", 0]; + +// switch to primary weapon if possible. Small delay for handling is needed. +if (primaryWeapon _healer != "") then { + _healer switchmove "amovpercmstpsraswrfldnon"; + _healer selectWeapon (primaryWeapon _healer); +}; + +_healer playAction "medicStart"; + +// full heal anim only with primary weapon possible. +ais_animChangeEVH = _healer addEventhandler ["AnimChanged", { + params ["_healer","_anim"]; + if (primaryWeapon _healer isEqualTo "") then { + if (_anim in ["amovpknlmstpsnonwnondnon","amovpknlmstpsraswlnrdnon"]) then { + _healer playActionNow "medicStart"; + }; + }; +}]; + +_offset = [0,0,0]; _dir = 0; +_relpos = _healer worldToModel position _injured; +if (((_healer getDir _injured) - (_injured getDir _healer)) < 0) then {_offset = [-0.2,0.7,0]; _dir = 90} else {_offset = [0.2,0.7,0]; _dir = 270}; + +_injured attachTo [_healer, _offset]; +[_injured, _dir] remoteExec ["setDir", 0, false]; + +[_healer, _injured] call AIS_Effects_fnc_medEquip; +private _duration = [_healer, _injured] call AIS_System_fnc_calculateStabilizeTime; +//hint format ["Stabilize Time Duration: %1", _duration]; // debug + + +[ + "Stabilize the Injured", + _duration, + { + params ["_injured", "_healer"]; + + _injured setVariable ["ais_stabilized", true, true]; + + _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; + detach _healer; + detach _injured; + + _healer playAction "medicStop"; + + _injured setVariable ["ais_hasHelper", ObjNull, true]; + call AIS_Effects_fnc_garbage; + }, + [_injured, _healer], + { + params ["_injured", "_healer"]; + + _injured setVariable ["ais_hasHelper", ObjNull, true]; + + _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; + detach _healer; + detach _injured; + + call AIS_Effects_fnc_garbage; + + if (alive _healer) then { + _healer playActionNow "medicStop"; + }; + if (!alive _injured) then {["He is not with us anymore."] call AIS_Core_fnc_dynamicText}; + }, + (!alive _injured || _healer getVariable ["ais_unconscious", false]) +] call AIS_Core_fnc_Progress_ShowBar; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_unconcsiousRemote.sqf b/source/AIS/System/fn_unconcsiousRemote.sqf new file mode 100644 index 0000000..4a44a0b --- /dev/null +++ b/source/AIS/System/fn_unconcsiousRemote.sqf @@ -0,0 +1,70 @@ +/* + * Author: Psycho + + * Broadcast everything across the network which is needed if a unit fall in agony + + * Arguments: + 0: Unit (Object) + 1: Unconcsious state of the Unit (Bool) + + * Return value: + Nothing + */ + +params [ + ["_unit", objNull, [player]], + ["_is_unoncsious", false, [false]] +]; + +if (isNull _unit) exitWith {diag_log format ["Non existing unit or wrong data type passed. AIS_System_fnc_unconcsiousRemote.sqf"];}; + + +if (_is_unoncsious) then { + [_unit, "agonyStart"] remoteExec ["playActionNow", 0, false]; + //_unit playActionNow "agonyStart"; + + if (local player) then { + _condition = false; + _condition = switch (AIS_SHOW_UNC_MESSAGE_TO) do { + case ("Group") : {_unit in units group player}; + case ("Side") : {side _unit isEqualTo playerSide}; + default {false}; + }; + + if (_condition) then { + [side _unit,"HQ"] sideChat format ["%1 is down and needs help at %2!",name _unit, mapGridPosition _unit]; + }; + + if (AIS_SHOW_UNC_MARKERS && {side _unit isEqualTo playerSide}) then { + _unit call AIS_Effects_fnc_injuredMarker; + }; + }; + +} else { + + [_unit, "agonyStop"] remoteExec ["playActionNow", 0, false]; + //_unit playActionNow "agonyStop"; + + [_unit, 50] call AIS_system_fnc_reveal; + + addSwitchableUnit _unit; + if (ais_reenable_teamswitch) then { + enableTeamswitch true; + }; + + if (isPlayer _unit) then { + if (local player) then { + showHud true; + if (AIS_TOGGLE_RADIO) then { + [true] call AIS_Effects_fnc_toggleRadio; + }; + }; + }; + + if (AIS_SHOW_UNC_MARKERS && {local player}) then { + _unit call AIS_Effects_fnc_removeinjuredMarker; + }; +}; + + +true \ No newline at end of file diff --git a/source/AIS/System/fn_unconsciousAI.sqf b/source/AIS/System/fn_unconsciousAI.sqf new file mode 100644 index 0000000..1e7254a --- /dev/null +++ b/source/AIS/System/fn_unconsciousAI.sqf @@ -0,0 +1,65 @@ +/* + * Author: Psycho + + * Set the unit in unconcsious state for Non-players. Set all variables and handle things around. + + * Arguments: + 0: Unit (Object) + + * Return value: + Nothing + +* Exapmle: + [unit] call AIS_System_fnc_unconsciousAI; + */ + + +params ["_unit"]; + +// set the variables +_unit setVariable ["ais_unconscious", true, true]; + +// if player drag or carry someone release the body +if (!(isNull (_unit getVariable ["ais_DragDrop_Torso", objNull]))) then { + [_unit] call AIS_System_fnc_release; +}; + +// do some actions for some special situations... +if (count attachedObjects _unit > 0) then { + {detach _x} forEach (attachedObjects _unit); +}; +if (animationState _unit in ["ladderriflestatic", "laddercivilstatic"]) then { + _unit action ["ladderOff", (nearestBuilding _unit)]; +}; + +// animation and other actions across the network to all players +//[_unit, true] remoteExecCall ["AIS_System_fnc_unconcsiousRemote", [-2,0] select hasInterface, false]; +[[_unit, true], { + if (!isDedicated) then { + _this call AIS_System_fnc_unconcsiousRemote; + }; +}] remoteExec ["call"]; + +// AI actions +_unit stop true; +{_unit disableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; + +// remove medic euqipment from unconscious unit +[_unit] call AIS_System_fnc_removeFaks; + +// random screaming +[_unit, 50] call AIS_Effects_fnc_Scream; + +// set unit as captive +[_unit, true] remoteExec ["setCaptive", 0, false]; + +// countdown for AI's +[_unit] spawn AIS_System_fnc_bloodlossAI; + +// correkt animation if unit get pushed out of a vehicle on other ways except the pull-out action +_unit addEventHandler ["getOutMan", {_this call AIS_System_fnc_getOutMan}]; + +// avoid to switching in while unc +removeSwitchableUnit _unit; + +true \ No newline at end of file diff --git a/source/AIS/System/fn_unconsciousPlayer.sqf b/source/AIS/System/fn_unconsciousPlayer.sqf new file mode 100644 index 0000000..2d3eed0 --- /dev/null +++ b/source/AIS/System/fn_unconsciousPlayer.sqf @@ -0,0 +1,84 @@ +/* + * Author: Psycho + + * Set the unit in unconcsious state for PLAYERS. Set all variables and handle things around. + + * Arguments: + 0: Unit (Object) + + * Return value: + Nothing + +* Exapmle: + [player] call AIS_System_fnc_unconsciousPlayer; + */ + +params ["_unit"]; + +// set the variables +_unit setVariable ["ais_unconscious", true, true]; +_unit setVariable ["ais_CarryDrop_Torso", false]; + +// if player drag or carry someone release the body +if (!(isNull (_unit getVariable ["ais_DragDrop_Torso", objNull]))) then { + [_unit] call AIS_System_fnc_release; +}; + +// do some actions for some special situations... +if (count attachedObjects _unit > 0) then { + {detach _x} forEach (attachedObjects _unit); +}; +if (animationState _unit in ["ladderriflestatic", "laddercivilstatic"]) then { + _unit action ["ladderOff", (nearestBuilding _unit)]; +}; + +// animation and other actions across the network +[_unit, true] remoteExecCall ["AIS_System_fnc_unconcsiousRemote", 0, false]; + + +// camera actions +if (dialog) then {closeDialog 0}; +titleCut ["","BLACK IN", 1.5]; +if (visibleMap) then {openMap false}; +showHud false; +_unit switchCamera "INTERNAL"; +if (sunOrMoon isEqualTo 0) then { + _unit action ["nvGogglesOff", _unit]; +}; + +// remove medic euqipment from unconscious unit +[_unit] call AIS_System_fnc_removeFaks; + +// disable radios +if (AIS_TOGGLE_RADIO) then { + [false] call AIS_Effects_fnc_toggleRadio; +}; + +// random screaming +[_unit, 50] call AIS_Effects_fnc_Scream; + +// set unit as captive +[_unit, true] remoteExec ["setCaptive", 0, false]; +_unit addEventHandler ["fired", { + private _shooter = _this select 0; + [_shooter, false] remoteExec ["setCaptive", 0, false]; +}]; + +// value >= 0.5 break the crawl-feature from agony action! (canMove false) +if ((_unit getHitIndex 10) > 0.49) then { + [{(_this select 0) setHitIndex [10, 0.49]}, [_unit]] call AIS_Core_fnc_onNextFrame; +}; + +// countdown and visual effects +[_unit] call AIS_System_fnc_bloodloss; + +// correkt animation if unit get pushed out of a vehicle on other ways except the pull-out action +_unit addEventHandler ["getOutMan", {_this call AIS_System_fnc_getOutMan}]; + +// disable teamSwitch while unc +if (teamswitchenabled) then { + enableTeamswitch false; + ais_reenable_teamswitch = true; +}; + +true \ No newline at end of file diff --git a/source/AIS/System/fn_unloadInjured.sqf b/source/AIS/System/fn_unloadInjured.sqf new file mode 100644 index 0000000..f4033c9 --- /dev/null +++ b/source/AIS/System/fn_unloadInjured.sqf @@ -0,0 +1,34 @@ +/* + * Author: psycho + + * Pull a injured out of a vehicle + + * Arguments: + 0: Unit (Object) + 1: Vehicle (Object) + + * Return value: + - +*/ + +params ["_unit", "_vehicle"]; + +// get the wounded unit +private _crew = crew _vehicle; +private _injured = objNull; +{ + if (_x getVariable ["ais_unconscious", false]) exitWith {_injured = _x}; + true +} count _crew; + +_injured setVariable ["ais_man_pullOut", true, true]; + +// move the wounded out of the vehicle +[[_injured, _vehicle, 0], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"]; + +if (_injured call AIS_System_fnc_allowDrag) then { + [{[(_this select 0), (_this select 1)] call AIS_System_fnc_drag}, [_unit,_injured]] call AIS_Core_fnc_onNextFrame; +}; + + +true \ No newline at end of file diff --git a/source/AIS/cfgFunctions.hpp b/source/AIS/cfgFunctions.hpp new file mode 100644 index 0000000..a98a616 --- /dev/null +++ b/source/AIS/cfgFunctions.hpp @@ -0,0 +1,4 @@ +#include "Core\cfgFunctions.hpp" +#include "System\cfgFunctions.hpp" +#include "Effects\cfgFunctions.hpp" +#include "Damage\cfgFunctions.hpp" \ No newline at end of file diff --git a/source/DUWS_CONFIG.sqf b/source/DUWS_CONFIG.sqf new file mode 100644 index 0000000..e163ef9 --- /dev/null +++ b/source/DUWS_CONFIG.sqf @@ -0,0 +1,219 @@ +// DUWS-R Config + +DUWS_Version = "0.7.0"; //Do not touch + +// Blufor Faction +Blufor_Faction = "BLU_F"; + +// Blufor Soldiers +Blufor_Officer = "B_officer_F"; +Blufor_Squadleader = "B_Soldier_SL_F"; +Blufor_Teamleader = "B_Soldier_TL_F"; +Blufor_Medic = "B_medic_F"; +Blufor_Engineer = "B_engineer_F"; +Blufor_Rifleman = "B_Soldier_F"; +Blufor_Rifleman_Light = "B_Soldier_lite_F"; +Blufor_Rifleman_AT = "B_Soldier_LAT_F"; +Blufor_Marksman = "B_soldier_M_F"; +Blufor_Recon_Scout = "B_recon_F"; +Blufor_Grenadier = "B_Soldier_GL_F"; +Blufor_Autorifleman = "B_soldier_AR_F"; +Blufor_HeavyGunner = "B_HeavyGunner_F"; +Blufor_AT_Specialist = "B_soldier_AT_F"; +Blufor_AA_Specialist = "B_soldier_AA_F"; +Blufor_Pilot = "B_pilot_F"; +Blufor_Heli_Pilot = "B_Helipilot_F"; +Blufor_Crewman = "B_crew_F"; +Blufor_Repair_Specialist = "B_soldier_repair_F"; +Blufor_diver = "B_diver_F"; +Blufor_sniper = "B_sniper_F"; +Blufor_spotter = "B_spotter_F"; +Blufor_Explosive_Specialist = "B_soldier_exp_F"; + +// Blufor Purchasable Units +// Format: ["classname", cost, SF Skill (optional boolean)] +blufor_unit_array = [ + [Blufor_Rifleman, 2], + [Blufor_Grenadier, 3], + [Blufor_Autorifleman, 3], + [Blufor_Rifleman_AT, 3], + [Blufor_Medic, 4], + [Blufor_AA_Specialist, 4], + [Blufor_Repair_Specialist, 4], + [Blufor_AT_Specialist, 4], + [Blufor_diver, 3, true], + [Blufor_Marksman, 3], + [Blufor_sniper, 4, true], + [Blufor_spotter, 3, true], + [Blufor_Explosive_Specialist, 4] +]; + +// Blufor Purchasable Groups +// Format [cost, cfgGroups entry, SF Skill (optional boolean)] +blufor_cfgGroup_array = +[ + [8, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam")], + [16, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfSquad")], + [18, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfSquad_Weapons")], + [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam_AT")], + [15, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam_AA")], + [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_ReconPatrol"), true], + [20, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_ReconSquad"), true], + [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "SpecOps" >> "BUS_DiverTeam"), true], + [8, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_SniperTeam"), true], + [10, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Support" >> "BUS_Support_CLS")], + [28, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Motorized" >> "BUS_MotInf_Team")], + [46, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Mechanized" >> "BUS_MechInfSquad")] +]; + +// Blufor Vehicles +Blufor_Flag = "Flag_NATO_F"; +Blufor_Helowreck = "Land_Wreck_Heli_Attack_01_F"; // Used for 'Downed Pilot' side mission +Blufor_SupplyCrate = "B_supplyCrate_F"; // Used for ammobox support +Blufor_AA_Static = "B_static_AA_F"; +Blufor_GMG_Static = "B_GMG_01_high_F"; +Blufor_AT_Static = "B_static_AT_F"; +Blufor_HMG_Static = "B_HMG_01_high_F"; +Blufor_Truck_Covered = "B_Truck_01_covered_F"; +Blufor_Truck_Open = "B_TrucK_01_transport_F"; +Blufor_Taxi_Boat = "B_Lifeboat"; +Blufor_Taxi_Helo = "B_Heli_Transport_01_camo_F"; + +// Contents of Ammobox Support +// Format: ["classname", amount] +// classname can be of types: item, weapons, magazine +// For more info, see https://community.bistudio.com/wiki/addItemCargo +Blufor_Ammobox_Contents = +[ + ["30Rnd_65x39_caseless_mag", 70], + ["30Rnd_65x39_caseless_mag_Tracer", 70], + ["100Rnd_65x39_caseless_mag", 70], + ["100Rnd_65x39_caseless_mag_tracer", 70], + ["1Rnd_HE_Grenade_shell", 90], + ["UGL_FlareRed_F", 70], + ["UGL_FlareGreen_F", 70], + ["1Rnd_Smoke_Grenade_shell", 70], + ["1Rnd_SmokeRed_Grenade_shell", 70], + ["1Rnd_SmokeBlue_Grenade_shell", 70], + ["NLAW_F", 70], + ["Chemlight_green", 70] +]; + + +// Blufor Purchasable Vehicles +// Format: ["vehicle", cost] +blufor_vehicle_array = [ + [5, "B_LSV_01_unarmed_F"], + [13, "B_LSV_01_armed_F"], + [16,"B_LSV_01_AT_F"], + [5, "B_MRAP_01_F"], + [18, "B_MRAP_01_hmg_F"], + [25, "B_MRAP_01_gmg_F"], + [35, "B_APC_Wheeled_01_cannon_F"], + [8, "B_Truck_01_covered_F"], + [25, "B_Heli_Light_01_armed_F"], + [45, "B_Heli_Attack_01_F"], + [15, "B_Heli_Light_01_F"], + [12, "B_Heli_Transport_01_F"], + [26, "B_Heli_Transport_03_F"], + [25, "B_APC_Tracked_01_rcws_F"], + [1, "B_Quadbike_01_F"], + [30, "B_APC_Tracked_01_AA_F"], + [40, "B_MBT_01_cannon_F"], + [28, "B_APC_Tracked_01_CRV_F"], + [75, "B_MBT_01_mlrs_F"], + [75, "B_MBT_01_arty_F"], + [45, "B_Plane_CAS_01_F"], + [34, "B_MBT_01_cannon_F"], + [40, "B_MBT_01_TUSK_F"], + [20, "B_UGV_01_rcws_F"], + [15, "B_UAV_02_F"], + [15, "B_UAV_02_CAS_F"], + [60, "B_T_UAV_03_F"], + [40, "B_T_VTOL_01_infantry_F"], + [45, "B_T_VTOL_01_vehicle_F"], + [60, "B_T_VTOL_01_armed_F"], + [50, "B_Plane_Fighter_01_F"], + [60, "B_Plane_Fighter_01_Stealth_F"], + [38, "B_AFV_Wheeled_01_cannon_F"], + [42, "B_AFV_Wheeled_01_up_cannon_F"] +]; + +// Opfor Faction +Opfor_Faction = "OPF_F"; + +// Opfor Soldiers +Opfor_Officer = "O_officer_F"; +Opfor_Squadleader = "O_Soldier_SL_F"; +Opfor_Teamleader = "O_Soldier_TL_F"; +Opfor_Medic = "O_medic_F"; +Opfor_Rifleman = "O_Soldier_F"; +Opfor_Rifleman_Light = "O_Soldier_lite_F"; +Opfor_Rifleman_AT = "O_Soldier_LAT_F"; +Opfor_Marksman = "O_soldier_M_F"; +Opfor_Grenadier = "O_Soldier_GL_F"; +Opfor_Autorifleman = "O_Soldier_AR_F"; +Opfor_HeavyGunner = "O_HeavyGunner_F"; +Opfor_AT_Specialist = "O_Soldier_AT_F"; +Opfor_AA_Specialist = "O_Soldier_AA_F"; +Opfor_Pilot = "O_Pilot_F"; +Opfor_Heli_Pilot = "O_helipilot_F"; +Opfor_Crewman = "O_crew_F"; + +// Opfor Vehicles (Used for objectives) +Opfor_Flag = "Flag_CSAT_F"; +Opfor_Supplycrate = "O_supplyCrate_F"; +Opfor_Quadbike = "O_Quadbike_01_F"; +Opfor_Truck_Covered = "O_Truck_02_covered_F"; +Opfor_Truck_Open = "O_TrucK_02_transport_F"; +Opfor_MRAP = "O_MRAP_02_F"; + +// Opfor Groups +Opfor_WARCOM_Fireteam = (configFile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfTeam"); +Opfor_WARCOM_Infantry_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad"); +Opfor_WARCOM_Weapons_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad_Weapons"); +Opfor_WARCOM_Mech_Inf_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInfSquad"); +Opfor_WARCOM_Mech_Wpn_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInf_AT"); + +///////Special Operatives/////// +duws_operator_list=[ + [0.35,0.62,0.67,0.48,0.66,0.32,"Scout","Ready","Matthew 'Ghost' Norton","ghost","B_recon_F","H_Shemag_olive_hs",0,0], + [0.57,0.39,0.49,0.28,0.51,0.35,"Rifleman","Ready","Tyler Adams","adams","B_Soldier_F","H_Cap_oli_hs",0,0], + [0.40,0.35,0.42,0.45,0.40,0.62,"LAT Rifleman","Ready","John Campbell","campbell","B_Soldier_LAT2_F","H_HelmetB_camo",0,0], + [0.33,0.29,0.33,0.37,0.41,0.21,"Medic","Ready","Julian 'Jester' Foote","jester","B_medic_F","H_HelmetB_grass",0,0], + [0.58,0.25,0.31,0.39,0.24,0.54,"Machinegunner","Ready","Ryan Armstrong","armstrong","B_CTRG_soldier_AR_A_F","H_Beret_02",0,0], + [0.68,0.22,0.58,0.28,0.31,0.21,"Sniper","Ready","Darnell Sykes","sykes","B_sniper_F","H_Booniehat_khk",0,0], + [0.47,0.33,0.48,0.59,0.55,0.36,"Team leader","Ready","James O'Connor","oconnor","B_Soldier_TL_F","H_MilCap_ocamo",0,0], + [0.45,0.36,0.38,0.31,0.33,0.52,"Grenadier","Ready","Nick 'Viper' Mundy","viper","B_Soldier_GL_F","H_Booniehat_khk_hs",0,0], + [0.31,0.33,0.37,0.36,0.41,0.29,"Engineer","Ready","Martin 'Frost' Moore","frost","B_CTRG_soldier_engineer_exp_F","H_Watchcap_blk",0,0], + [0.40,0.21,0.32,0.39,0.45,0.21,"Medic","Ready","Chris Hawkins","hawkins","B_CTRG_soldier_M_medic_F","H_HelmetB_camo",0,0], + [0.64,0.26,0.55,0.25,0.46,0.31,"Marksman","Ready","Alex Taylor","taylor","B_Soldier_M_F","H_Watchcap_blk",0,0], + [0.35,0.33,0.39,0.38,0.24,0.53,"AT Specialist","Ready","Arnold Patterson","patterson","B_soldier_AT_F","H_HelmetB",0,0], + [0.58,0.40,0.49,0.41,0.24,0.44,"Rifleman","Ready","Marcus Lopez","lopez","B_Soldier_F","H_Booniehat_mcamo",0,0], + [0.54,0.32,0.27,0.39,0.30,0.49,"Machinegunner","Ready","Adam Reynolds","reynolds","B_soldier_AR_F","H_Cap_headphones",0,0], + [0.30,0.40,0.49,0.41,0.24,0.44,"AA Specialist","Ready","Andrew Levine","levine","B_soldier_AA_F","H_HelmetB_camo",0,0], + [0.49,0.35,0.30,0.36,0.44,0.51,"Grenadier","Ready","Hines McKendrick","mckendrick","B_Story_Protagonist_F","H_Cap_tan_specops_US",0,0], + [0.38,0.41,0.42,0.29,0.33,0.36,"Saboteur","Ready","Sean 'Snake' Vincent","snake","B_recon_exp_F","H_MilCap_ocamo",0,0], + [0.45,0.32,0.55,0.66,0.61,0.24,"Squad leader","Ready","Darryl Franklin","franklin","B_Soldier_SL_F","H_Beret_02",0,0], + [0.41,0.45,0.68,0.27,0.30,0.24,"Spotter","Ready","Julian 'Fox' Warren","fox","B_spotter_F","H_Beret_red",0,0], + [0.37,0.41,0.25,0.22,0.29,0.29,"Repair specialist","Ready","Samuel Martinez","martinez","B_soldier_repair_F","H_HelmetB",0,0], + [0.37,0.35,0.47,0.49,0.23,0.55,"AT Rifleman","Ready","Mike 'Stranger' Sanders","stranger","B_CTRG_soldier_GL_LAT_F","H_Booniehat_khk_hs",0,0], + [0.62,0.25,0.57,0.29,0.30,0.27,"Marksman","Ready","Charles Dixon","dixon","B_recon_M_F","H_Shemag_olive_hs",0,0] +]; + +/* +0: aim +1: reflexes +2: spotting +3: courage +4: communications +5: reload speed +6: role +7: status (always "Ready") +8: name +9: CfgIdentity class +10: soldier class +11: hat +12: time before heal +13: available spendable points +*/ \ No newline at end of file diff --git a/source/INIT.sqf b/source/INIT.sqf index 69e3fe8..2058be3 100644 --- a/source/INIT.sqf +++ b/source/INIT.sqf @@ -1,296 +1,2 @@ -diag_log format ["------------------ DUWS-R START ----v0------ player: %1", profileName]; - - -if (isServer) then { nul = [] execVM "serverinit.sqf"; }; -if (isDedicated) exitWith {}; -waitUntil {!isNull player}; - -player allowDamage false; - -persistent_stat_script_init = [] execVM "persistent\persistent_stats_init.sqf"; -waitUntil {scriptDone persistent_stat_script_init}; -execvm "dynamic_music\dyn_music_init.sqf"; - - -#include "dialog\supports_init.hpp" -#include "dialog\squad_number_init.hpp" - -if (hasInterface) then { execVM "misc\gps_marker.sqf";}; -if (!isMultiplayer) then { - getsize_script = [player] execVM "mapsize.sqf"; -}; -staminaEnabled = ["Stamina", false] call BIS_fnc_getParamValue; -if(staminaEnabled == 0) then { - staminaEnabled = false; -} else { - staminaEnabled = true; -}; -// IF MP -if (isMultiplayer) then { - - // Get the variables from the parameters lobby - _revive_activated = ["Revive", 1] call BIS_fnc_getParamValue; - DUWSMP_CP_death_cost = ["DeathPenalty", 1] call BIS_fnc_getParamValue; - //staminaEnabled = ["Stamina", 0] call BIS_fnc_getParamValue; - - /*if(staminaEnabled == 0) then { - staminaEnabled = false; - } else { - staminaEnabled = true; - };*/ - - if (support_armory_available) then { - hq_blu1 addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; - { - _x addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; - } forEach (Array_of_FOBS); - }; - - if (_revive_activated == 1) then {execVM "duws_revive\reviveInit.sqf"}; - - PlayerKilledEH = player addEventHandler ["killed", { - commandpointsblu1 = commandpointsblu1 - DUWSMP_CP_death_cost; - publicVariable "commandpointsblu1"; - }]; - - PlayerBetrayerEH = player addEventHandler ["HandleRating", { - // If playerRating is negative (traitor) then reset to zero - _playerRating = rating (_this select 0); - if (_playerRating < 0) then { - player addRating (0 - _playerRating); - }; - // If final rating is positive, do not modify, else zero. - _rating = _this select 1; - [0,_rating] select ((_playerRating - _rating) > 0); - }]; - - "support_specialized_training_available" addPublicVariableEventHandler {lbSetColor [2103, 11, [0, 1, 0, 1]];}; - "support_armory_available" addPublicVariableEventHandler { - hq_blu1 addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; - { - _x addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; - } forEach (Array_of_FOBS); - lbSetColor [2103, 5, [0, 1, 0, 1]]; - }; - - // change the shown CP for request dialog - "commandpointsblu1" addPublicVariableEventHandler {ctrlSetText [1000, format["%1",commandpointsblu1]]; }; - - // each time there is a new FOB - "Array_of_FOBS" addPublicVariableEventHandler { - if (!fobSwitch) then { - [] execVM "support\FOBreceiveaction.sqf"; - }; - fobSwitch = false; - //Add the FoB to the list of revive locations. - _fobAmount = count Array_of_FOBS; - _fobIndex = _fobAmount - 1; - _createdFOB = Array_of_FOBS select _fobIndex; - - [missionNamespace, _createdFOB] call BIS_fnc_addRespawnPosition; - }; - - if (!isServer) then { - "savegameNumber" addPublicVariableEventHandler {[] execVM "savegameClient.sqf";}; - }; - if (!isServer) then { - "capturedZonesNumber" addPublicVariableEventHandler {[] execVM "persistent\persistent_stats_zones_add.sqf";}; // change the shown CP for request dialog - }; - if (!isServer) then { - "finishedMissionsNumber" addPublicVariableEventHandler {[] execVM "persistent\persistent_stats_missions_total.sqf";}; // change the shown CP for request dialog - }; - - player globalChat format ["gamemaster: %1", game_master]; - player globalChat format ["HQ_pos_found_generated: %1", HQ_pos_found_generated]; - - if (!isDedicated && !HQ_pos_found_generated) then { // SERVER INIT - if (((vehiclevarname player) in game_master)) then { - DUWS_host_start = false; - publicVariable "DUWS_host_start"; - waitUntil {time > 0.1}; - getsize_script = [player] execVM "mapsize.sqf"; - DUWS_host_start = true; - publicVariable "DUWS_host_start"; - - // init High Command - _handle = [] execVM "dialog\hc_init.sqf"; - waitUntil {scriptDone getsize_script}; - }; - }; -}; - -if (!isDedicated && !HQ_pos_found_generated) then { - if (((vehiclevarname player) in game_master)) then { - _null = [] execVM "dialog\startup\hq_placement\placement.sqf"; - waitUntil {chosen_hq_placement}; - player globalChat format ["hq_manually_placed: %1", hq_manually_placed]; - player globalChat format ["player_is_choosing_hqpos: %1", player_is_choosing_hqpos]; - // create random HQ - if (!hq_manually_placed && !player_is_choosing_hqpos) then { - player globalChat "lance recherche position..."; - hq_create = [20, 0.015] execVM "initHQ\locatorHQ.sqf"; - waitUntil {scriptDone hq_create}; - }; - }; -}; - -/* -//////// DEBUG LOOP ///////////// -[] spawn { - while {true} do { - hintsilent format["OvercastVar: %1\nFogVar: %2",OvercastVar,FogVar]; - sleep 1; - }; -}; -//////// DEBUG LOOP ///////////// -*/ - -// AMBIANCE LOOP -//_nul = [] execVM "musicloop.sqf"; - -if (isServer) then { - // group cleaning script - clean = [ - 5*60, // seconds to delete dead bodies (0 means don't delete) - 5*60, // seconds to delete dead vehicles (0 means don't delete) - 0, // seconds to delete immobile vehicles (0 means don't delete) - 5*60, // seconds to delete dropped weapons (0 means don't delete) - 0, // seconds to deleted planted explosives (0 means don't delete) - 10*60 // seconds to delete dropped smokes/chemlights (0 means don't delete) - ] execVM 'repetitive_cleanup.sqf'; -}; - -if (hasInterface) then { - // WHEN CLIENT CONNECTS INIT (might need sleep) - waitUntil {isPlayer Player}; - hintsilent "Waiting for the host to find an HQ..."; - waitUntil {HQ_pos_found_generated && time > 0.1}; - player setpos [(getpos hq_blu1 select 0),(getpos hq_blu1 select 1)+10]; - _drawicon = [] execVM "inithq\drawIcon.sqf"; - hintsilent "Waiting for the host to select the campaign parameters..."; - waitUntil {chosen_settings}; - [hq_blu1] execVM "initHQ\HQaddactions.sqf"; - sleep 1; - player setdamage 0; - player allowDamage true; - hintsilent format["Joined game, welcome to %1, %2",worldName,profileName]; - - // init High Command - _handle = [] execVM "dialog\hc_init.sqf"; - [] execVM "dialog\startup\weather_client.sqf"; - - if(!staminaEnabled) then { - player enableStamina false; - }; -}; - -if (!isMultiplayer) then { - _handle = [] execVM "dialog\hc_init.sqf"; -}; - - - - - -// INIT the operative list -execVM "dialog\operative\operator_init.sqf"; - -// Create help for DUWS -_index = player createDiarySubject ["help","DUWS-R Manual"]; -player createDiaryRecord ["help", ["Feedback/bug report", "Internal team members: Use the ""issues"" section to report items."]]; -player createDiaryRecord ["help", ["Export to another island", "How to export to another island:
You just need to take the .pbo file and rename it with the name of the island you want to export the mission to. You don't have anything else to do

Example:
SP_DUWS-R.stratis.pbo >>> SP_DUWS-R.chernarus.pbo"]]; -player createDiaryRecord ["help", ["Credits", "Many thanks goes out to everyone that worked on the original DUWS by kibot!"]]; -player createDiaryRecord ["help", ["Command Points (CP)", "Command points are used to purchase vehicles, units and ask for support (like artillery or save the game outside the base). To obtain Command points, you must capture the enemy controlled zones (red zones on the map) or execute side missions. You also receive 3 command points for each zone you have under your control every 30 minutes."]]; -player createDiaryRecord ["help", ["Army Power (AP)", "Army power represent the strenght of the BLUFOR forces present on the island. By capturing enemy positions and accomplishing side missions, you will add Army Power to your army. The attack waves of the BLUFOR army will become stronger."]]; -player createDiaryRecord ["help", ["Experience", "By accomplishing side missions, capturing zones and islands, you will increase your experience. With experience, you will automatically unlock new abilties. Once you have an ability, a description of this ability will be available in the 'ability' tab in the briefing.
Capturing an island gives you 5 XP
Achieving a side mission: 2 XP
Capturing a zone: 1 XP"]]; -player createDiaryRecord ["help", ["Saving the game", "You can save the game by resting at the base. Just go near the officer and select the action ""Rest"". Note that 6 hours will ellapse during that time. You can also save at any time by giving a SITREP in the support menu (0-8-1). Giving a SITREP does not make you wait, but it will cost you 1 CP for each save."]]; -player createDiaryRecord ["help", ["Repairing/Rearming", "To repair, refuel or rearm a vehicle you need to unlock the ""vehicle refit"" support. Once you have it, you can call the support and your vehicle will be rearmed, repaired and refueled. Note that you must be close to the base to be able to use the vehicle refit."]]; -player createDiaryRecord ["help", ["Support", "During the campaign you may unlock several support options at you HQ. You can access the available support in the radio menu (0-8). Note that calling for support cost CP."]]; -player createDiaryRecord ["help", ["Making a FOB", "After you have captured your first zone, you'll get the ability to establish a FOB for 10 CP. A FOB allows you to rest(save) at remote locations outside the base. Establishing a FOB will also spawn some BLUFOR patrols around it and if there are enemies around it, you will be notified. To establish a FOB, you must make sure the zone around you is clear in a radius of 500 meters. Just go to the support menu and select 'Establish FOB'. A FOB will be deployed to your location."]]; -player createDiaryRecord ["help", ["Side Missions", "You can request a side mission at the officer in the base. Successful side missions will not give any army power to the enemy, but will give you CP and increase your army power."]]; -player createDiaryRecord ["help", ["Requesting units", "To request units, go to the officer at the base and select the action ""Request units""."]]; -player createDiaryRecord ["help", ["Taking the Island", "At the beginning of the game, you are alone with your officer and only a few command points available, but as the war escalates, the BLUFOR HQ will start to launch attacks on enemy zone and will try to retake the island. You can help the main forces by assisting them in capturing the island, or you can also achieve side missions to boost the available assets of your army. It's up to you on how you want to play this campaign."]]; - -// Operatives -_index = player createDiarySubject ["operativehelp","Special operatives"]; -player createDiaryRecord ["operativehelp", ["Skills", "Aiming:
Pretty self explanatory, how well the operative can aim, lead a target, compensante for bullet drop and manage recoil.

Reflexes:
How fast the operator can react to a new threat and stabilize its aim.

Spotting:
The operative ability to spot targets within it's visual or audible range, and how accurately he can spot targets.

Courage:
Affects the morale of subordinates units of the operative, how likely they will flee, depending on what is in front of them and the squad status.

Communications:
How quickly recognized targets are shared with the squad.

Reload speed:
The operator's ability to switch weapon or reload quickly."]]; -player createDiaryRecord ["operativehelp", ["Recruiting operatives", "Operatives can be recruited at the HQ, inside the ""request unit"" menu. When you recruit someone for the first time, you'll have to spend 5 CP. However, once an operative has been already recruited, has been ""injured""(killed) in battle, you can recruit it again for only 2 CP after a delay between 20 and 80 minutes."]]; -player createDiaryRecord ["operativehelp", ["Overview", "You can recruit special operatives that will stay and progress with you for all the duration of the campaign. Some of these mens have special equipment, specialities and skills. Their skills will increase each time a zone is captured or a mission is accomplished, whether they're in your squad or not. However, when an operative is actually in the game, he will gain 10 spendable points wich can be assigned freely in any skill at the operative menu."]]; - -// MP notes -if (isMultiplayer) then { - player createDiaryRecord ["help", ["MP notes", "The CP pool is common for everyone.

While most support unlocks are indivdual, the Armory and the Specialized infantry training are common, and need to be unlocked only once by a single player.

While everybody can rest to heal, only the host can save and skip the time.

Only the host can request side mission and finish them. However, everyone receive the persistent stats and xp bonuses."]]; -}; - -// MP notification -if (isMultiplayer) then { - [] spawn { - waitUntil {time > 5}; - ["info",["MP Mechanics","Check the manual for the specifics of the DUWS-R in MP"]] call bis_fnc_showNotification; - }; -}; - -// create mission victory script //SPAWN BEGIN -[] spawn { - - // CREATE MAIN OBJECTIVE - capture_island_obj = player createSimpleTask ["taskIsland"]; - capture_island_obj setSimpleTaskDescription ["The ennemy is controlling the island, we must take it back! Capture every zone under enemy control and the mission will succeed.
You can let your BLUFOR forces take the island by themselves and help them getting a bigger army by accomplishing side missions. Or you can capture the zones yourself and do all the big work. As the campaign progress, the war will escalate and the armies will get stronger and start to use bigger guns.
To capture a zone, you need to have more units inside the zone than the enemy.

It's up to you on how you want to play this.
Good luck, soldier!","Take the island",""]; - - // WAIT UNTIL ALL ZONES ARE CAPTURED - waitUntil {sleep 1; amount_zones_created > 0}; - waitUntil {sleep 3; (zoneundercontrolblu >= amount_zones_created);}; // Toutes les zones sont capturées - persistent_stat_script_win = [] execVM "persistent\persistent_stats_win.sqf"; - ["TaskSucceeded",["","Island captured!"]] call bis_fnc_showNotification; - capture_island_obj setTaskState "Succeeded"; - sleep 3; - ["island_captured_win",true,true] call BIS_fnc_endMission; -}; - - - -if (mission_DUWS_firstlaunch) then { - waitUntil {chosen_settings}; - sleep 8; - ["info",["Buying troops","Go talk to your commander to buy troops and vehicles with CP"]] call bis_fnc_showNotification; - sleep 2.5; - ["info",["Command points","Acquire more CP by capturing enemy areas or accomplishing side missions"]] call bis_fnc_showNotification; - - sleep 15; - ["info",["RESTING AND HEALING","Save the game and heal by resting at the base"]] call bis_fnc_showNotification; - - sleep 15; - // SITREP - ["sitrepinfo",["SITREP","You can also save the game by giving a SITREP"]] call bis_fnc_showNotification; - - sleep 20; - ["info",["DUWS Manual","Check the manual in the briefing for more info"]] call bis_fnc_showNotification; - - profileNamespace setVariable ["profile_DUWS_firstlaunch", false]; - saveProfileNamespace; -}; - -//Cleanup unused players. -for[{_x = 2},{_x <= 20},{_x = _x + 1}] do { - _thePlayer = missionNamespace getVariable format["player%1", _x]; - if(!isNil("_thePlayer")) then { - if(!isPlayer _thePlayer) then { - deleteVehicle _thePlayer; - }; - }; -}; - - -_dynam = [player,"DynamicSupportMenu"] call BIS_fnc_addCommMenuItem; - -//Loading player position and gear. -//TODO: Add bought supports. -/* -if(isServer) then -{ - execVM "persistent\missionSpecific\saveFuncs.sqf"; - waitUntil {!isNil "saveFuncsLoaded"}; - - execVM "persistent\missionSpecific\loadAccount.sqf"; -}; -*/ +serverInitHandle = [] spawn duws_fnc_serverInit; +[] spawn duws_fnc_clientInit; \ No newline at end of file diff --git a/source/WARCOM/WARCOM_opf_qrf.sqf b/source/WARCOM/WARCOM_opf_qrf.sqf deleted file mode 100644 index a6ecddd..0000000 --- a/source/WARCOM/WARCOM_opf_qrf.sqf +++ /dev/null @@ -1,37 +0,0 @@ -if (!WARCOM_qrf_ready) exitWith {}; -WARCOM_qrf_ready = false; -_attachedUnit = _this select 0; -_unitPos = getpos _attachedUnit; -//hint format["%1",_attachedUnit]; - -// Attack waves main - - if (count WARCOM_zones_controled_by_OPFOR > 0) then { // make sure opfor is controlling at least 1 zones - sleep 2; - - // find a zone where to spawn OPF wave away from player *** BEGIN - _found = false; - _randomZone = []; - _failSafe = 0; - while {!_found} do { - _randomZone = WARCOM_zones_controled_by_OPFOR call BIS_fnc_selectRandom; - if (_randomZone distance player > 2000) then {_found=true;}; - sleep 0.2; - // player sidechat format["Failsafe: %1",_failsafe]; - _failSafe = _failSafe + 1; - if (_failsafe > 10) then {sleep 300; _failsafe = 0;} - }; - // find a zone *** end - _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; - _group = [_randomZone, EAST, WARCOM_opf_patrol_type,[],[],WARCOM_opf_ai_skill_range] call BIS_fnc_spawnGroup; - _opf_assault = [_group,_unitPos] execVM "WARCOM\WARCOM_wp_opf_qrf.sqf"; -// _blu_assault = [_group,"derp"] execVM "WARCOM\WARCOM_gps_marker.sqf"; - - - }; - - - - -sleep 1800; -WARCOM_qrf_ready = true; \ No newline at end of file diff --git a/source/createopfortified.sqf b/source/createopfortified.sqf deleted file mode 100644 index 0f40967..0000000 --- a/source/createopfortified.sqf +++ /dev/null @@ -1,22 +0,0 @@ -_position = _this select 0; - -// hint format["%1",_position]; - -_group = [ - _position, - EAST, [ - "O_Soldier_SL_F", - "O_Soldier_AA_F", - "O_Soldier_AT_F", - "O_Soldier_GL_F", - "O_Soldier_TL_F", - "O_Soldier_AR_F", - "O_Soldier_LAT_F", - "O_Soldier_GL_F"], - [], - [], - opfor_ai_skill] call BIS_fnc_spawnGroup; -[_group, _position] call bis_fnc_taskDefend; - -// ADD QRF eventhandler -_EH = leader _group addEventHandler ["Fired", {[_this select 0] spawn QRF_test}]; \ No newline at end of file diff --git a/source/createpatrol.sqf b/source/createpatrol.sqf deleted file mode 100644 index f6e29ca..0000000 --- a/source/createpatrol.sqf +++ /dev/null @@ -1,9 +0,0 @@ -// usage: [position, radius] execvm "createpatrol.sqf" -// radius: 50 for patrol inside and around base, 500 for medium lenght skirmish, 1300 for island - -_position = _this select 0; -_radius = _this select 1; - -_group = [_position, WEST, ["B_Soldier_TL_F","B_Soldier_F"]] call BIS_fnc_spawnGroup; -_patrolRadius = round(_radius/3); -[_group, _position, _patrolRadius] call bis_fnc_taskPatrol; \ No newline at end of file diff --git a/source/description.ext b/source/description.ext index a45f6ca..f4d9c95 100644 --- a/source/description.ext +++ b/source/description.ext @@ -10,29 +10,30 @@ respawn = 3; respawnDelay = 4; disabledAI = 1; -#include "debriefing.hpp" -#include "dialog\defines.hpp" -#include "dialog\squad\squadmng.hpp" -#include "dialog\squad\rename\renamesquad.hpp" -#include "dialog\request.hpp" -#include "dialog\fob\fobmanager.hpp" -#include "dialog\info\info.hpp" -#include "dialog\info\reset\reset.hpp" -#include "locations.hpp" -#include "support\support.hpp" -#include "hints.hpp" -#include "dialog\startup\startup.hpp" -#include "dialog\startup\hq_placement\placement.hpp" +#include "includes\debriefing.hpp" +#include "includes\defines.hpp" +#include "includes\squad\squadmng.hpp" +#include "includes\squad\renamesquad.hpp" +#include "includes\request.hpp" +#include "includes\fobmanager.hpp" +#include "includes\info\info.hpp" +#include "includes\info\reset.hpp" +#include "includes\locations.hpp" +#include "includes\support.hpp" +#include "includes\hints.hpp" +#include "includes\startup\startup.hpp" +#include "includes\startup\placement.hpp" #include "sounds\sounds.hpp" -#include "dialog\operative\identities.hpp" -#include "dialog\operative\operative.hpp" -#include "params.hpp" -#include "duws_revive\gui\duws_revive.hpp" +#include "includes\operative\identities.hpp" +#include "includes\operative\operative.hpp" +#include "includes\params.hpp" +#include "includes\CfgFunctions.hpp" +#include "AIS\Effects\BarDlg.hpp" // TAW INIT BEGIN -- #include "taw_vd\GUI.h" -class CfgFunctions +/*class CfgFunctions { #include "taw_vd\CfgFunctions.hpp" -}; +};*/ // TAW INIT END -- diff --git a/source/dialog/fob/gui_edit_format.TXT b/source/dialog/fob/gui_edit_format.TXT deleted file mode 100644 index f182fa3..0000000 --- a/source/dialog/fob/gui_edit_format.TXT +++ /dev/null @@ -1,14 +0,0 @@ -/* #Sevoly -$[ - 1.063, - ["azeza",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], - [1800,"mainframe_fobmanager",[2,"FOB Manager",["5 * GUI_GRID_W + GUI_GRID_X","8.5 * GUI_GRID_H + GUI_GRID_Y","29 * GUI_GRID_W","9.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1801,"fob_reinforce_frame",[2,"Reinforce a FOB",["5.5 * GUI_GRID_W + GUI_GRID_X","9.5 * GUI_GRID_H + GUI_GRID_Y","28 * GUI_GRID_W","3 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Send a team from your High Command to reinforce a specific FOB","-1"],[]], - [2101,"reinforce_combo",[2,"",["19.5 * GUI_GRID_W + GUI_GRID_X","10.5 * GUI_GRID_H + GUI_GRID_Y","13.5 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Select a FOB","-1"],[]], - [1600,"reinforce_button",[2,"Send reinforcements",["6.5 * GUI_GRID_W + GUI_GRID_X","10.5 * GUI_GRID_H + GUI_GRID_Y","12 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Send a team from your High Command to reinforce a specific FOB","-1"],[]], - [1802,"frame_fast_travel",[2,"Fast travel",["5.5 * GUI_GRID_W + GUI_GRID_X","13 * GUI_GRID_H + GUI_GRID_Y","28 * GUI_GRID_W","3 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Fast travel between the FOB's and the base","-1"],[]], - [1601,"fast_travel_button",[2,"Fast travel",["6.5 * GUI_GRID_W + GUI_GRID_X","14 * GUI_GRID_H + GUI_GRID_Y","12 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Send a team from your High Command to reinforce a specific FOB","-1"],[]], - [2100,"fast_travel_combo",[2,"",["19.5 * GUI_GRID_W + GUI_GRID_X","14 * GUI_GRID_H + GUI_GRID_Y","13.5 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Select a FOB","-1"],[]], - [1602,"exit_button",[2,"EXIT",["13.5 * GUI_GRID_W + GUI_GRID_X","16.5 * GUI_GRID_H + GUI_GRID_Y","12 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Leave the FOB manager","-1"],[]] -] -*/ diff --git a/source/dialog/info/gui_editor_info.TXT b/source/dialog/info/gui_editor_info.TXT deleted file mode 100644 index eec98d2..0000000 --- a/source/dialog/info/gui_editor_info.TXT +++ /dev/null @@ -1,21 +0,0 @@ -/* #Qezugi -/* #Pitohi -$[ - 1.062, - ["aze",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], - [1800,"infoBackground",[2,"CAMPAIGN INFO",["0 * GUI_GRID_W + GUI_GRID_X","0 * GUI_GRID_H + GUI_GRID_Y","40 * GUI_GRID_W","25 * GUI_GRID_H"],[-1,-1,-1,-1],[0,0,0,0.5],[-1,-1,-1,-1],"","-1"],[]], - [1604,"",[2,"OK",["11.5 * GUI_GRID_W + GUI_GRID_X","23.5 * GUI_GRID_H + GUI_GRID_Y","8 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1806,"zones_captured_total_frame",[2,"Total of zones captured",["1 * GUI_GRID_W + GUI_GRID_X","1 * GUI_GRID_H + GUI_GRID_Y","18.5 * GUI_GRID_W","2 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1803,"",[2,"Side missions completed in total",["20.5 * GUI_GRID_W + GUI_GRID_X","1 * GUI_GRID_H + GUI_GRID_Y","18.5 * GUI_GRID_W","2 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1001,"",[2,"ZUC:XXX",["1 * GUI_GRID_W + GUI_GRID_X","1.5 * GUI_GRID_H + GUI_GRID_Y","18.5 * GUI_GRID_W","1.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Total amount of zones you have captured","-1"],[]], - [1004,"missionsuccess",[2,"XXX",["21 * GUI_GRID_W + GUI_GRID_X","1.5 * GUI_GRID_H + GUI_GRID_Y","17 * GUI_GRID_W","1.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Total amount of side mission you have completed","-1"],[]], - [1801,"island_captured_frame",[2,"Islands captured",["1 * GUI_GRID_W + GUI_GRID_X","3.5 * GUI_GRID_H + GUI_GRID_Y","18.5 * GUI_GRID_W","6.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1500,"islandscapturedlistbox",[2,"",["1.5 * GUI_GRID_W + GUI_GRID_X","4.5 * GUI_GRID_H + GUI_GRID_Y","17.5 * GUI_GRID_W","5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Islands you have captured","-1"],[]], - [1600,"reset_stats_button",[2,"RESET STATS",["20.5 * GUI_GRID_W + GUI_GRID_X","23.5 * GUI_GRID_H + GUI_GRID_Y","8 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Reset your stats to 0","-1"],[]], - [1802,"frame_player_xp",[2,"(player) total experience",["20.5 * GUI_GRID_W + GUI_GRID_X","3.5 * GUI_GRID_H + GUI_GRID_Y","18.5 * GUI_GRID_W","2 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Experience of the player","-1"],[]], - [1000,"player_experience_text",[2,"XXX",["21 * GUI_GRID_W + GUI_GRID_X","4 * GUI_GRID_H + GUI_GRID_Y","17 * GUI_GRID_W","1.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Experience of the player","-1"],[]] -] -*/ - -*/ - diff --git a/source/dialog/info/reset/gui_editor_info.TXT b/source/dialog/info/reset/gui_editor_info.TXT deleted file mode 100644 index 0d54656..0000000 --- a/source/dialog/info/reset/gui_editor_info.TXT +++ /dev/null @@ -1,11 +0,0 @@ -/* #Ceroce -$[ - 1.062, - ["qsdqsdq",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], - [1800,"confirmation_frame",[2,"Confirmation",["6.5 * GUI_GRID_W + GUI_GRID_X","9 * GUI_GRID_H + GUI_GRID_Y","29 * GUI_GRID_W","5.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1000,"confirmation_text",[2,"Are you sure you want to reset all your persistent stats ?",["7 * GUI_GRID_W + GUI_GRID_X","9 * GUI_GRID_H + GUI_GRID_Y","34 * GUI_GRID_W","2.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1600,"reset_button",[2,"RESET STATS",["7.5 * GUI_GRID_W + GUI_GRID_X","11.5 * GUI_GRID_H + GUI_GRID_Y","12.5 * GUI_GRID_W","2.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1601,"no_button",[2,"KEEP STATS",["22 * GUI_GRID_W + GUI_GRID_X","11.5 * GUI_GRID_H + GUI_GRID_Y","12.5 * GUI_GRID_W","2.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]] -] -*/ - diff --git a/source/dialog/operative/operator_init.sqf b/source/dialog/operative/operator_init.sqf deleted file mode 100644 index 10a5d41..0000000 --- a/source/dialog/operative/operator_init.sqf +++ /dev/null @@ -1,150 +0,0 @@ -duws_operator_list=[ - [0.35,0.62,0.67,0.48,0.66,0.32,"Scout","Ready","Matthew 'Ghost' Norton","ghost","B_recon_F","H_Shemag_olive_hs",0,0], - [0.57,0.39,0.49,0.28,0.51,0.35,"Rifleman","Ready","Tyler Adams","adams","B_Soldier_F","H_Cap_oli_hs",0,0], - [0.40,0.35,0.42,0.45,0.40,0.62,"AT Rifleman","Ready","John Campbell","campbell","B_soldier_LAT_F","H_HelmetB_camo",0,0], - [0.33,0.29,0.33,0.37,0.41,0.21,"Medic","Ready","Julian 'Jester' Foote","jester","B_medic_F","H_HelmetB_grass",0,0], - [0.58,0.25,0.31,0.39,0.24,0.54,"Machinegunner","Ready","Ryan Armstrong","armstrong","B_CTRG_soldier_AR_A_F","H_Beret_02",0,0], - [0.68,0.22,0.58,0.28,0.31,0.21,"Sniper","Ready","Darnell Sykes","sykes","B_sniper_F","H_Booniehat_khk",0,0], - [0.47,0.33,0.48,0.59,0.55,0.36,"Team leader","Ready","James O'Connor","oconnor","B_Soldier_TL_F","H_MilCap_ocamo",0,0], - [0.45,0.36,0.38,0.31,0.33,0.52,"Grenadier","Ready","Nick 'Viper' Mundy","viper","B_Soldier_GL_F","H_Booniehat_khk_hs",0,0], - [0.31,0.33,0.37,0.36,0.41,0.29,"Engineer","Ready","Martin 'Frost' Moore","frost","B_CTRG_soldier_engineer_exp_F","H_Watchcap_blk",0,0], - [0.40,0.21,0.32,0.39,0.45,0.21,"Medic","Ready","Chris Hawkins","hawkins","B_CTRG_soldier_M_medic_F","H_HelmetB_camo",0,0], - [0.64,0.26,0.55,0.25,0.46,0.31,"Marksman","Ready","Alex Taylor","taylor","B_soldier_M_F","H_Watchcap_blk",0,0], - [0.35,0.33,0.39,0.38,0.24,0.53,"AT Specialist","Ready","Arnold Patterson","patterson","B_soldier_AT_F","H_HelmetB",0,0], - [0.58,0.40,0.49,0.41,0.24,0.44,"Rifleman","Ready","Marcus Lopez","lopez","B_Soldier_F","H_Booniehat_mcamo",0,0], - [0.54,0.32,0.27,0.39,0.30,0.49,"Machinegunner","Ready","Adam Reynolds","reynolds","B_soldier_AR_F","H_Cap_headphones",0,0], - [0.30,0.40,0.49,0.41,0.24,0.44,"AA Specialist","Ready","Andrew Levine","levine","B_soldier_AA_F","H_HelmetB_camo",0,0], - [0.49,0.35,0.30,0.36,0.44,0.51,"Grenadier","Ready","Hines McKendrick","mckendrick","B_Story_Protagonist_F","H_Cap_tan_specops_US",0,0], - [0.38,0.41,0.42,0.29,0.33,0.36,"Saboteur","Ready","Sean 'Snake' Vincent","snake","B_recon_exp_F","H_MilCap_ocamo",0,0], - [0.45,0.32,0.55,0.66,0.61,0.24,"Squad leader","Ready","Darryl Franklin","franklin","B_Soldier_SL_F","H_Beret_02",0,0], - [0.41,0.45,0.68,0.27,0.30,0.24,"Spotter","Ready","Julian 'Fox' Warren","fox","B_spotter_F","H_Beret_red",0,0], - [0.37,0.41,0.25,0.22,0.29,0.29,"Repair specialist","Ready","Samuel Martinez","martinez","B_soldier_repair_F","H_HelmetB",0,0], - [0.37,0.35,0.47,0.49,0.23,0.55,"AT Rifleman","Ready","Mike 'Stranger' Sanders","stranger","B_CTRG_soldier_GL_LAT_F","H_Booniehat_khk_hs",0,0], - [0.62,0.25,0.57,0.29,0.30,0.27,"Marksman","Ready","Charles Dixon","dixon","B_recon_M_F","H_Shemag_olive_hs",0,0] -]; - -/* -0: aim -1: reflexes -2: spotting -3: courage -4: communications -5: reload speed -6: role -7: status (always "Ready") -8: name -9: CfgIdentity class -10: soldier class -11: hat -12: time before heal -13: available spendable points -*/ - -// init functions for adding skills -DUWS_operator_add_aim = { - _selected_index = lbCurSel 1500; - _selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index - - _selected_soldier_aim = _selected_soldier select 0; - _selected_soldier_points = _selected_soldier select 13; - if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; - if (_selected_soldier_aim >= 1) exitWith {hint "This stat is already at the maximum"}; - - _selected_soldier_aim_new = _selected_soldier_aim + 0.01; // update the variable - _selected_soldier set [0,_selected_soldier_aim_new]; - - _selected_soldier_pts_new = _selected_soldier_points - 1; - _selected_soldier set [13,_selected_soldier_pts_new]; - [] execVM 'dialog\operative\LBselected.sqf'; - hint "New stats will be applied at the next deployment of this operative"; -}; - -DUWS_operator_add_reflexes = { - _selected_index = lbCurSel 1500; - _selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index - - _selected_soldier_reflexes = _selected_soldier select 1; - _selected_soldier_points = _selected_soldier select 13; - if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; - if (_selected_soldier_reflexes >= 1) exitWith {hint "This stat is already at the maximum"}; - - _selected_soldier_reflexes_new = _selected_soldier_reflexes + 0.01; // update the variable - _selected_soldier set [1,_selected_soldier_reflexes_new]; - - _selected_soldier_pts_new = _selected_soldier_points - 1; - _selected_soldier set [13,_selected_soldier_pts_new]; - [] execVM 'dialog\operative\LBselected.sqf'; - hint "New stats will be applied at the next deployment of this operative"; -}; - -DUWS_operator_add_spotting = { - _selected_index = lbCurSel 1500; - _selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index - - _selected_soldier_spotting = _selected_soldier select 2; - _selected_soldier_points = _selected_soldier select 13; - if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; - if (_selected_soldier_spotting >= 1) exitWith {hint "This stat is already at the maximum"}; - - _selected_soldier_spotting_new = _selected_soldier_spotting + 0.01; // update the variable - _selected_soldier set [2,_selected_soldier_spotting_new]; - - _selected_soldier_pts_new = _selected_soldier_points - 1; - _selected_soldier set [13,_selected_soldier_pts_new]; - [] execVM 'dialog\operative\LBselected.sqf'; - hint "New stats will be applied at the next deployment of this operative"; -}; - -DUWS_operator_add_courage = { - _selected_index = lbCurSel 1500; - _selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index - - _selected_soldier_courage = _selected_soldier select 3; - _selected_soldier_points = _selected_soldier select 13; - if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; - if (_selected_soldier_courage >= 1) exitWith {hint "This stat is already at the maximum"}; - - _selected_soldier_courage_new = _selected_soldier_courage + 0.01; // update the variable - _selected_soldier set [3,_selected_soldier_courage_new]; - - _selected_soldier_pts_new = _selected_soldier_points - 1; - _selected_soldier set [13,_selected_soldier_pts_new]; - [] execVM 'dialog\operative\LBselected.sqf'; - hint "New stats will be applied at the next deployment of this operative"; -}; - -DUWS_operator_add_comms = { - _selected_index = lbCurSel 1500; - _selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index - - _selected_soldier_comms = _selected_soldier select 4; - _selected_soldier_points = _selected_soldier select 13; - if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; - if (_selected_soldier_comms >= 1) exitWith {hint "This stat is already at the maximum"}; - - _selected_soldier_comms_new = _selected_soldier_comms + 0.01; // update the variable - _selected_soldier set [4,_selected_soldier_comms_new]; - - _selected_soldier_pts_new = _selected_soldier_points - 1; - _selected_soldier set [13,_selected_soldier_pts_new]; - [] execVM 'dialog\operative\LBselected.sqf'; - hint "New stats will be applied at the next deployment of this operative"; -}; - -DUWS_operator_add_reload = { - _selected_index = lbCurSel 1500; - _selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index - - _selected_soldier_reload = _selected_soldier select 5; - _selected_soldier_points = _selected_soldier select 13; - if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; - if (_selected_soldier_reload >= 1) exitWith {hint "This stat is already at the maximum"}; - - _selected_soldier_reload_new = _selected_soldier_reload + 0.01; // update the variable - _selected_soldier set [5,_selected_soldier_reload_new]; - - _selected_soldier_pts_new = _selected_soldier_points - 1; - _selected_soldier set [13,_selected_soldier_pts_new]; - [] execVM 'dialog\operative\LBselected.sqf'; - hint "New stats will be applied at the next deployment of this operative"; -}; \ No newline at end of file diff --git a/source/dialog/request_vehicle.sqf b/source/dialog/request_vehicle.sqf deleted file mode 100644 index a58b992..0000000 --- a/source/dialog/request_vehicle.sqf +++ /dev/null @@ -1,135 +0,0 @@ -diag_log "DUWS-R: dialog/request_vehicle.sqf running..."; - -_index = lbCurSel 2102; - -//findEmptyPosition example -_spawnPos = (getpos hq_blu1) findEmptyPosition [20, 70]; -_spawnPos = [(_spawnPos select 0)+30, _spawnPos select 1]; - -vehic = nil; - -switch (_index) do { - case 0: { // Small Truck 1 - [4, "I_G_Offroad_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 1: { // Small Truck 2 - [6, "I_G_Van_01_transport_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 2: { // Prowler Unarmed - [5, "B_T_LSV_01_unarmed_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 3: { // Prowler Armed - [13, "B_T_LSV_01_armed_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 4: { // Hunter Unarmed - [5, "B_MRAP_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 5: { // Hunter HMG - [18, "B_MRAP_01_hmg_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 6: { // Hunter GMG - [25, "B_MRAP_01_gmg_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 7: { // Marshall - [35, "B_APC_Wheeled_01_cannon_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 8: { //HEMETT Transport Covered - [8, "B_Truck_01_covered_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 9: { // Pawnee - [25, "B_Heli_Light_01_armed_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 10: { // Blackfoot - [45, "B_Heli_Attack_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 11: { // HummingBird - [15, "B_Heli_Light_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 12: { // M-900 Civ. - [12, "C_Heli_Light_01_civil_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 13: { // Taru Empty - [18, "O_Heli_Transport_04_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 14: { // GhostHawk - [22, "B_Heli_Transport_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 15: { // Huron - [26, "B_Heli_Transport_03_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 16: { // Panther IFV - [25, "B_APC_Tracked_01_rcws_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 17: { // ATV Quad - [1, "B_Quadbike_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 18: { // Cheetah AA - [30, "B_APC_Tracked_01_AA_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 19: { // Slammer - [40, "B_MBT_01_cannon_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 20: { // Bobcat - [28, "B_APC_Tracked_01_CRV_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 21: { // SF SUV - [2, "C_Offroad_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 22: { // MLRS Artillery - [75, "B_MBT_01_mlrs_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 23: { // Scorcher Artillery - [75, "B_MBT_01_arty_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 24: { // Fuel Truck (van) - [10, "B_G_Van_01_fuel_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 25: { // Wipeout CAS - [45, "B_Plane_CAS_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 26: { // Slammer Urban Purpose - [40, "B_MBT_01_TUSK_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 27: { // Stomper RCWS - [20, "B_UGV_01_rcws_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 28: { // Stomper Scout - [10, "B_UGV_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 29: { // Greyhawk ATG - [15, "B_UAV_02_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 30: { // Greyhawk CAS - [15, "B_UAV_02_CAS_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 31: { // MQ-12 Falcon - [60, "B_T_UAV_03_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 32: { // Darter UAV - [5, "B_UAV_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 33: { // Blackfish (Infantry) - [40, "B_T_VTOL_01_infantry_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 34: { // Blackfish (Vehicle) - [45, "B_T_VTOL_01_vehicle_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 35: { // Blackfish (Armed) - [60, "B_T_VTOL_01_armed_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 36: { //WASP - [50, "B_Plane_Fighter_01_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 37: { //WASP (Stealth) - [60, "B_Plane_Fighter_01_Stealth_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 38: { //Rhino (Stealth) - [38, "B_AFV_Wheeled_01_cannon_F"] execVM "dialog\spawnVehicle.sqf"; - }; - case 39: { //Rhino UP (Stealth) - [42, "B_AFV_Wheeled_01_up_cannon_F"] execVM "dialog\spawnVehicle.sqf"; - }; -}; -vehic = nil; -publicVariable "commandpointsblu1"; -//hint format["index: %1",_index]; diff --git a/source/dialog/squad/dialog_editor.TXT b/source/dialog/squad/dialog_editor.TXT deleted file mode 100644 index e4d220d..0000000 --- a/source/dialog/squad/dialog_editor.TXT +++ /dev/null @@ -1,13 +0,0 @@ -/* #Tunama -$[ - 1.062, - ["azeazeaze",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], - [1800,"squadmng_mainframe",[2,"SQUAD MANAGER",["0.04 * GUI_GRID_W + GUI_GRID_X","8.02 * GUI_GRID_H + GUI_GRID_Y","40 * GUI_GRID_W","17 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1801,"dismiss_frame",[2,"Add squad members to High Command",["0.5 * GUI_GRID_W + GUI_GRID_X","9 * GUI_GRID_H + GUI_GRID_Y","39 * GUI_GRID_W","5.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1600,"dismissbutton",[2,"Add yellow team to High Command control",["8.5 * GUI_GRID_W + GUI_GRID_X","13 * GUI_GRID_H + GUI_GRID_Y","24.5 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Add the squad members under your control with High Command","-1"],[]], - [1000,"dismiss_txt_info",[2,"Dismiss the squad members under the yellow team of your squad and add them under you control with High Command",["1 * GUI_GRID_W + GUI_GRID_X","10 * GUI_GRID_H + GUI_GRID_Y","38 * GUI_GRID_W","2.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1802,"HCdismiss_frame",[2,"Add High Command squad directly under your control",["0.5 * GUI_GRID_W + GUI_GRID_X","15 * GUI_GRID_H + GUI_GRID_Y","39 * GUI_GRID_W","5.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1001,"dismissHC_txt",[2,"Dismiss a squad from the High Command and add the units directly under your control. Once you have clicked the button, you'll have 10 seconds to select a squad. Then, this squad will be dismissed and all units added directly under your control.",["1 * GUI_GRID_W + GUI_GRID_X","16 * GUI_GRID_H + GUI_GRID_Y","38 * GUI_GRID_W","2.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1601,"dismissHC_button",[2,"Put units of selected HC squad under your command",["8.5 * GUI_GRID_W + GUI_GRID_X","19 * GUI_GRID_H + GUI_GRID_Y","24.5 * GUI_GRID_W","1 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Dismiss a HC squad and add the units under your direct control","-1"],[]] -] -*/ diff --git a/source/dialog/squad/rename/rename_gui_editor.TXT b/source/dialog/squad/rename/rename_gui_editor.TXT deleted file mode 100644 index 4e3d582..0000000 --- a/source/dialog/squad/rename/rename_gui_editor.TXT +++ /dev/null @@ -1,9 +0,0 @@ -/* #Miwysa -$[ - 1.062, - ["rename",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], - [1800,"renameHCmainframe",[2,"Enter new name",["5 * GUI_GRID_W + GUI_GRID_X","12 * GUI_GRID_H + GUI_GRID_Y","30 * GUI_GRID_W","5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Enter the new name of the selected HC squad","-1"],[]], - [1400,"editbox_rename",[2,"",["5.5 * GUI_GRID_W + GUI_GRID_X","13 * GUI_GRID_H + GUI_GRID_Y","29 * GUI_GRID_W","1.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"Enter the new name of the selected HC squad","-1"],[]], - [1600,"confirm_button",[2,"Confirm",["10 * GUI_GRID_W + GUI_GRID_X","15 * GUI_GRID_H + GUI_GRID_Y","19 * GUI_GRID_W","1.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]] -] -*/ diff --git a/source/dialog/startup/startup_closed.sqf b/source/dialog/startup/startup_closed.sqf deleted file mode 100644 index 17a60c8..0000000 --- a/source/dialog/startup/startup_closed.sqf +++ /dev/null @@ -1,2 +0,0 @@ -if (chosen_settings) exitWith {}; -_null = [] execVM "dialog\startup\startup.sqf"; \ No newline at end of file diff --git a/source/duws_revive/exitMenu.sqf b/source/duws_revive/exitMenu.sqf deleted file mode 100644 index aff1f55..0000000 --- a/source/duws_revive/exitMenu.sqf +++ /dev/null @@ -1 +0,0 @@ -if (DUWS_player_injured) then {_handle = createDialog "duws_revive_menu"}; \ No newline at end of file diff --git a/source/duws_revive/get_loadout.sqf b/source/duws_revive/get_loadout.sqf deleted file mode 100644 index 15166e9..0000000 --- a/source/duws_revive/get_loadout.sqf +++ /dev/null @@ -1,265 +0,0 @@ -/* - - AUTHOR: aeroson - NAME: get_loadout.sqf - VERSION: 3.3 - - DOWNLOAD & PARTICIPATE: - https://github.com/aeroson/a3-loadout - http://forums.bistudio.com/showthread.php?148577-GET-SET-Loadout-(saves-and-loads-pretty-much-everything) - - DESCRIPTION: - These scripts allows you set/get (load/save)all of the unit's gear, including: - uniform, vest, backpack, contents of it, all quiped items, all three weapons with their attachments, currently loaded magazines and number of ammo in magazines - Useful for saving/loading loadouts. - Ideal for revive scripts where you have to set exactly the same loadout to newly created unit. - Uses workaround with placeholders to add vest/backpack items, so items stay where you put them. - - PARAMETER(S): - 0 : target unit - 1 : (optional) array of options, default [] : ["ammo"] will save ammo count of partially emptied magazines - - RETURNS: - Array : array of strings/arrays containing target unit's loadout, to be used by fnc_set_loadout.sqf - - addAction support: - Saves player's loadout into global var loadout - -*/ - -private ["_target","_options","_saveMagsAmmo","_onFoot","_currentWeapon","_currentMode","_isFlashlightOn","_isIRLaserOn","_loadedMagazines","_saveWeapon","_getMagsAmmo","_magazinesName","_magazinesAmmo","_backPackItems","_assignedItems","_data"]; - -_options = []; - -// addAction support -if(count _this < 4) then { - #define PARAM_START private ["_PARAM_INDEX"]; _PARAM_INDEX=0; - #define PARAM_REQ(A) if (count _this <= _PARAM_INDEX) exitWith { systemChat format["required param '%1' not supplied in file:'%2' at line:%3", #A ,__FILE__,__LINE__]; }; A = _this select _PARAM_INDEX; _PARAM_INDEX=_PARAM_INDEX+1; - #define PARAM(A,B) A = B; if (count _this > _PARAM_INDEX) then { A = _this select _PARAM_INDEX; }; _PARAM_INDEX=_PARAM_INDEX+1; - PARAM_START - PARAM_REQ(_target) - PARAM(_options,[]) -} else { - _target = player; -}; - -_saveMagsAmmo = "ammo" in _options; -_onFoot = vehicle _target == _target; - -_currentWeapon = ""; -_currentMode = ""; -_isFlashlightOn = false; -_isIRLaserOn = false; - -// save weapon mode and muzzle -if(_onFoot) then { - _currentWeapon = currentMuzzle _target; - _currentMode = currentWeaponMode _target; - _isFlashlightOn = _target isFlashlightOn _currentWeapon; - _isIRLaserOn = _target isIRLaserOn _currentWeapon; -} else { - _currentWeapon = currentWeapon _target; -}; - -// save loaded magazines /+ loaded magazines ammo count -_loadedMagazines = []; - -// universal weapon saving -_saveWeapon = { - private ["_weapon","_magazines","_magazine","_muzzles"]; - _weapon = _this select 0; - _magazines = []; - if(_weapon != "") then { - _target selectWeapon _weapon; - _magazine = currentMagazine _target; - if(_saveMagsAmmo && _onFoot) then { - _magazine = [_magazine, _target ammo _weapon]; - }; - _magazines = [_magazine]; - _muzzles = configFile>>"CfgWeapons">>_weapon>>"muzzles"; - if(isArray(_muzzles)) then { - { // add one mag for each muzzle - if (_x != "this") then { - _target selectWeapon _x; - _magazine = currentMagazine _target; - if(_saveMagsAmmo) then { - _magazine = [_magazine, _target ammo _x]; - }; - _magazines set [count _magazines, _magazine]; - }; - } forEach getArray(_muzzles); - }; - }; - _loadedMagazines set [count _loadedMagazines, _magazines]; -}; - -[primaryWeapon _target] call _saveWeapon; -[handgunWeapon _target] call _saveWeapon; -[secondaryWeapon _target] call _saveWeapon; - -_getMagsAmmo = { // default function with _saveMagsAmmo == false - _this select 0; -}; - -if(_saveMagsAmmo) then { - // fill following 2 arrays with magazine name and current ammo in it - _magazinesName = []; - _magazinesAmmo = []; - { - private ["_name","_ammo","_ammoCountIndex","_ammoCurrent","_ammoFull","_readingAmmoFull"]; - scopeName "a"; - _name = []; - _ammoCurrent = []; - _ammoFull = []; - _readingAmmoFull = false; - _x = toArray _x; - _ammoCountIndex = count _x - 1; - while { _ammoCountIndex>0 && (_x select _ammoCountIndex)!=40 } do { - _ammoCountIndex = _ammoCountIndex - 1; - }; - { - if(_forEachIndex != _ammoCountIndex) then { - if(_forEachIndex < _ammoCountIndex) then { - _name set [count _name, _x]; - } else { - if(_x==47) then { - _readingAmmoFull = true; - } else { - if(!_readingAmmoFull) then { - _ammoCurrent set [count _ammoCurrent, _x]; - } else { - if(_x==41) then { - breakTo "a"; - } else { - _ammoFull set [count _ammoFull, _x]; - }; - }; - }; - }; - }; - } forEach _x; - if !([_ammoCurrent,_ammoFull] call BIS_fnc_areEqual) then { - _magazinesName set [count _magazinesName, toString(_name)]; - _magazinesAmmo set [count _magazinesAmmo, parseNumber(toString(_ammoCurrent))]; - }; - } forEach magazinesDetail player; - - // check if input array contains magazine, if it does, find it in magazinesDetail and change _x to [_x, ammo count] - _getMagsAmmo = { - private ["_items","_index"]; - _items = _this select 0; - { - _name = getText(configFile >> "cfgMagazines" >> _x >> "displayName"); - if(_name!="") then { - _index = _magazinesName find _name; - if(_index != -1) then { - _items set [_forEachIndex, [_x, _magazinesAmmo select _index]]; - _magazinesName set [_index, -1]; - _magazinesAmmo set [_index, -1]; - _magazinesName = _magazinesName - [-1]; - _magazinesAmmo = _magazinesAmmo - [-1]; - }; - } - } forEach _items; - _items; - }; - -}; - -// get backpack items -_cargo = getbackpackcargo (unitbackpack _target); -_backpacks = []; -{ - for "_i" from 1 to ((_cargo select 1) select _foreachindex) do { - _backpacks set [count _backpacks, _x]; - }; -} foreach (_cargo select 0); -_backPackItems = (backpackitems _target) + _backpacks; - -// get assigned items -_assignedItems = assignedItems _target; -_headgear = headgear _target; -_goggles = goggles _target; -if((_headgear != "") && !(_headgear in _assignedItems)) then { - _assignedItems set [count _assignedItems, _headgear]; -}; -if((_goggles != "") && !(_goggles in _assignedItems)) then { - _assignedItems set [count _assignedItems, _goggles]; -}; - -// get magazines of all assigned items -_magazines = []; -{ - _target selectWeapon _x; - if(currentWeapon _target==_x) then { - _magazine = currentMagazine _target; - if(_magazine != "") then { - _magazines set[count _magazines, _magazine]; - }; - }; -} forEach _assignedItems; -_loadedMagazines set [3, _magazines]; - -// select back originaly selected weapon and mode -if(vehicle _target == _target) then { - if(_currentWeapon != "" && _currentMode != "") then { - _muzzles = 0; - while{ (_currentWeapon != currentMuzzle _target || _currentMode != currentWeaponMode _target ) && _muzzles < 200 } do { - _target action ["SWITCHWEAPON", _target, _target, _muzzles]; - _muzzles = _muzzles + 1; - }; - if(_isFlashlightOn) then { - _target action ["GunLightOn"]; - } else { - _target action ["GunLightOff"]; - }; - if(_isIRLaserOn) then { - _target action ["IRLaserOn"]; - } else { - _target action ["IRLaserOff"]; - }; - }; -} else { - _currentMode = ""; -}; -if(_currentMode == "") then { - if(_currentWeapon=="") then { - _target action ["SWITCHWEAPON", _target, _target, 0]; - } else { - _target selectWeapon _currentWeapon; - }; -}; - -_data = [ - _assignedItems, //0 - - primaryWeapon _target, //1 - primaryWeaponItems _target, //2 - - handgunWeapon _target, //3 - handgunItems _target, //4 - - secondaryWeapon _target, //5 - secondaryWeaponItems _target, //6 - - uniform _target, //7 - [uniformItems _target] call _getMagsAmmo, //8 - - vest _target, //9 - [vestItems _target] call _getMagsAmmo, //10 - - backpack _target, //11 - [_backPackItems] call _getMagsAmmo, //12 - - _loadedMagazines, //13 (optional) - _currentWeapon, //14 (optional) - _currentMode //15 (optional) -]; - -// addAction support -if(count _this < 4) then { - _data; -} else { - loadout = _data; - //playSound3D ["A3\Sounds_F\sfx\ZoomOut.wav", _target]; -}; diff --git a/source/duws_revive/gui/duws_revive.hpp b/source/duws_revive/gui/duws_revive.hpp deleted file mode 100644 index b8f4182..0000000 --- a/source/duws_revive/gui/duws_revive.hpp +++ /dev/null @@ -1,37 +0,0 @@ -class duws_revive_menu -{ - idd = -1; - movingenable = false; - onUnload = "_nul = execVM ""duws_revive\exitMenu.sqf"""; //UI event handler -// onLoad = "_this call FRAME_01_Load"; - -class controls -{ -//////////////////////////////////////////////////////// -// GUI EDITOR OUTPUT START -//////////////////////////////////////////////////////// - -class duws_death_waiting_txt: RscText -{ - idc = 1000; - text = "You are waiting to be revived..."; //--- ToDo: Localize; - x = 13 * GUI_GRID_W + GUI_GRID_X; - y = 2 * GUI_GRID_H + GUI_GRID_Y; - w = 15 * GUI_GRID_W; - h = 2.5 * GUI_GRID_H; -}; -class duws_death_respawn: RscButton -{ - idc = 1600; - text = "Respawn"; //--- ToDo: Localize; - x = 14.5 * GUI_GRID_W + GUI_GRID_X; - y = 5.5 * GUI_GRID_H + GUI_GRID_Y; - w = 11 * GUI_GRID_W; - h = 1.5 * GUI_GRID_H; - action = "_derp = [] execVM 'duws_revive\respawnClicked.sqf'"; -}; -//////////////////////////////////////////////////////// -// GUI EDITOR OUTPUT END -//////////////////////////////////////////////////////// -}; -}; \ No newline at end of file diff --git a/source/duws_revive/gui/guieditorformat.TXT b/source/duws_revive/gui/guieditorformat.TXT deleted file mode 100644 index 732d4c7..0000000 --- a/source/duws_revive/gui/guieditorformat.TXT +++ /dev/null @@ -1,8 +0,0 @@ -/* #Zoxome -$[ - 1.063, - ["respawn",[[0,0,1,1],0.025,0.04,"GUI_GRID"],0,0,0], - [1000,"duws_death_waiting_txt",[2,"You are waiting to be revived...",["13 * GUI_GRID_W + GUI_GRID_X","2 * GUI_GRID_H + GUI_GRID_Y","15 * GUI_GRID_W","2.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]], - [1600,"duws_death_respawn",[2,"Respawn",["14.5 * GUI_GRID_W + GUI_GRID_X","5.5 * GUI_GRID_H + GUI_GRID_Y","11 * GUI_GRID_W","1.5 * GUI_GRID_H"],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],"","-1"],[]] -] -*/ diff --git a/source/duws_revive/onKilled.sqf b/source/duws_revive/onKilled.sqf deleted file mode 100644 index 45aa33f..0000000 --- a/source/duws_revive/onKilled.sqf +++ /dev/null @@ -1,16 +0,0 @@ -_killedPlayer = _this select 0; -_corpse = _this select 1; - -_deathPos = getpos _corpse; -deletevehicle _corpse; -player allowdamage false; -player setpos _deathPos; -[player,"DUWS_sync_animinjured"] spawn BIS_fnc_mp; -[player,saved_loadout] spawn setLoadout; - -DUWS_player_injured = true; - - _handle = createDialog "duws_revive_menu"; - waitUntil {dialog}; - - [player,"DUWS_revive_addaction"] spawn BIS_fnc_MP; \ No newline at end of file diff --git a/source/duws_revive/playerRevived.sqf b/source/duws_revive/playerRevived.sqf deleted file mode 100644 index 6f02bc7..0000000 --- a/source/duws_revive/playerRevived.sqf +++ /dev/null @@ -1,6 +0,0 @@ -_injured_player = _this select 0; - - -[player,"DUWS_sync_animhealing"] spawn BIS_fnc_MP; -sleep 5; -[_injured_player,"DUWS_revive_revived"] spawn BIS_fnc_MP; diff --git a/source/duws_revive/respawnClicked.sqf b/source/duws_revive/respawnClicked.sqf deleted file mode 100644 index c640c58..0000000 --- a/source/duws_revive/respawnClicked.sqf +++ /dev/null @@ -1,15 +0,0 @@ -_handle = [player,"DUWS_revive_respawned"] spawn BIS_fnc_MP; -waituntil {scriptdone _handle}; - -DUWS_player_injured = false; -[player,"DUWS_sync_animgood"] spawn BIS_fnc_mp; -player setpos [getpos hq_blu1 select 0, (getpos hq_blu1 select 1)+10]; -player allowdamage true; - -if(!staminaEnabled) then { - player enableStamina false; -}; - -_dynam = [player,"DynamicSupportMenu"] call BIS_fnc_addCommMenuItem; - -closedialog 0; diff --git a/source/duws_revive/reviveInit.sqf b/source/duws_revive/reviveInit.sqf deleted file mode 100644 index 6ccc568..0000000 --- a/source/duws_revive/reviveInit.sqf +++ /dev/null @@ -1,54 +0,0 @@ -DUWS_PlayerRespawnReviveEH = player addEventHandler ["respawn", {_this execVM "duws_revive\onKilled.sqf"}]; -DUWS_player_injured = false; - -DUWS_revive_addaction = { - if (!DUWS_player_injured) then { - _this addaction ["Revive","duws_revive\playerRevived.sqf", "", 0, true, true, "", "((_target distance _this) < 3"]; - }; -}; - -DUWS_revive_respawned = { - if (!DUWS_player_injured) then { - //removeAllActions _this; - }; -}; - -DUWS_revive_revived = { - if (_this == player) then { - DUWS_player_injured = false; - [player,"DUWS_sync_animgood"] spawn BIS_fnc_mp; - player allowdamage true; - commandpointsblu1 = commandpointsblu1 + DUWSMP_CP_death_cost; - publicvariable "commandpointsblu1"; - closedialog 0; - _handle = [player,"DUWS_revive_respawned"] spawn BIS_fnc_MP; - }; -}; - -DUWS_sync_animinjured = { - _this switchmove "acts_InjuredLookingRifle02"; - }; - - -DUWS_sync_animgood = { - _this switchmove "AmovPpneMstpSnonWnonDnon"; - }; - -DUWS_sync_animhealing = { - _this switchmove "AinvPknlMstpSlayWpstDnon_medic"; - }; - - -// Compile scripts -getLoadout = compile preprocessFileLineNumbers 'duws_revive\get_loadout.sqf'; -setLoadout = compile preprocessFileLineNumbers 'duws_revive\set_loadout.sqf'; - -// Save loadout every 5 seconds -[] spawn { - while{true} do { - if(alive player) then { - saved_loadout = [player] call getLoadout; - }; - sleep 5; - }; -}; diff --git a/source/duws_revive/set_loadout.sqf b/source/duws_revive/set_loadout.sqf deleted file mode 100644 index e09ba83..0000000 --- a/source/duws_revive/set_loadout.sqf +++ /dev/null @@ -1,359 +0,0 @@ -/* - - AUTHOR: aeroson - NAME: set_loadout.sqf - VERSION: 4.1 - - DOWNLOAD & PARTICIPATE: - https://github.com/aeroson/a3-loadout - http://forums.bistudio.com/showthread.php?148577-GET-SET-Loadout-(saves-and-loads-pretty-much-everything) - - DESCRIPTION: - These scripts allows you set/get (load/save)all of the unit's gear, including: - uniform, vest, backpack, contents of it, all quiped items, all three weapons with their attachments, currently loaded magazines and number of ammo in magazines - Useful for saving/loading loadouts. - Ideal for revive scripts where you have to set exactly the same loadout to newly created unit. - Uses workaround with placeholders to add vest/backpack items, so items stay where you put them. - - PARAMETER(S): - 0 : target unit - 1 : array of strings/arrays containing desired target unit's loadout, obtained from fnc_get_loadout.sqf - 2 : (optional) array of options, default [] : ["ammo"] will allow loading of partially emptied magazines, otherwise magazines will be full - - addAction support: - Sets player's loadout from global var loadout - -*/ - -private ["_target","_options","_loadMagsAmmo","_data","_loadedMagazines","_placeholderCount","_add","_outfit","_addWeapon","_addPrimary","_addHandgun","_addSecondary","_addOrder","_currentWeapon","_currentMode"]; - -_options = []; - -// addAction support -if(count _this < 4) then { - #define PARAM_START private ["_PARAM_INDEX"]; _PARAM_INDEX=0; - #define PARAM_REQ(A) if (count _this <= _PARAM_INDEX) exitWith { systemChat format["required param '%1' not supplied in file:'%2' at line:%3", #A ,__FILE__,__LINE__]; }; A = _this select _PARAM_INDEX; _PARAM_INDEX=_PARAM_INDEX+1; - #define PARAM(A,B) A = B; if (count _this > _PARAM_INDEX) then { A = _this select _PARAM_INDEX; }; _PARAM_INDEX=_PARAM_INDEX+1; - PARAM_START - PARAM_REQ(_target) - PARAM_REQ(_data) - PARAM(_options,[]) -} else { - _target = player; - _data = loadout; - //playSound3D ["A3\Sounds_F\sfx\ZoomIn.wav", _target]; -}; - -if(isNil{_data}) exitWith { - systemChat "you are trying to set/load empty loadout"; -}; -if(count _data < 13) exitWith { - systemChat "you are trying to set/load corrupted loadout"; -}; - -#define QUOTE(A) #A -#define EL(A,B) ((A) select (B)) -#define _THIS(A) EL(_this,A) - -// placeholders -#define PLACEHOLDER_BACKPACK QUOTE(B_Kitbag_mcamo) // any backpack with capacity>0 -#define PLACEHOLDER_ITEM QUOTE(ItemWatch) // item placeholder should be smallest item possible - -_loadMagsAmmo = "ammo" in _options; -_loadedMagazines = []; -if(count _data > 13) then { - if(typeName(_data select 13)=="ARRAY") then { - _loadedMagazines = _data select 13; - }; -}; - -_currentWeapon = ""; -if(count _data > 14) then { - _currentWeapon = _data select 14; -}; -_currentMode = ""; -if(count _data > 15) then { - _currentMode = _data select 15; -}; - -_placeholderCount = 0; - -// basic add function intended for use with uniform and vest -_add = { - private ["_target","_item"]; - _target = _this select 0; - _item = _this select 1; - if(typename _item == "ARRAY") then { - if(_item select 0 != "") then { - if(_loadMagsAmmo) then { - _target addMagazine _item; - } else { - _target addMagazine (_item select 0); - }; - }; - } else { - if(_item != "") then { - if(isClass(configFile>>"CfgMagazines">>_item)) then { - _target addMagazine _item; - } else { - if(isClass(configFile>>"CfgWeapons">>_item>>"WeaponSlotsInfo") && getNumber(configFile>>"CfgWeapons">>_item>>"showempty")==1) then { - _target addWeapon _item; - } else { - _target addItem _item; - }; - }; - }; - }; -}; - -// remove clothes to prevent incorrect mag loading -removeUniform _target; -removeVest _target; -removeBackpack _target; - -_outfit = PLACEHOLDER_BACKPACK; // we need to add items somewhere before we can assign them -_target addBackpack _outfit; -clearAllItemsFromBackpack _target; -removeAllAssignedItems _target; - -// add loaded magazines of assigned items -if(count _loadedMagazines>=3) then { - { - [_target,_x] call _add; - } forEach (_loadedMagazines select 3); -}; - -// add assigned items -{ - [_target,_x] call _add; - _target assignItem _x; -} forEach (_data select 0); - -// universal add weapon to hands -_addWeapon = { - private ["_weapon","_magazines","_muzzles"]; - clearAllItemsFromBackpack _target; - _target removeWeapon ([] call _THIS(0)); - _weapon = _data select _THIS(1); - if(_weapon != "") then { - if(isClass(configFile>>"CfgWeapons">>_weapon)) then { - if (_currentWeapon == "") then { - _currentWeapon = _weapon; - }; - if(count _loadedMagazines > 0) then { - _magazines = _loadedMagazines select _THIS(5); // get loaded magazines from saved loadout - if(typename _magazines != "ARRAY") then { // backwards compatibility, make sure _magazines is array - if(_magazines=="") then { - _magazines = []; - } else { - _magazines = [_magazines]; - }; - }; - } else { - _magazines = [getArray(configFile>>"CfgWeapons">>_weapon>>"magazines") select 0]; // generate weapon magazine - _muzzles = configFile>>"CfgWeapons">>_weapon>>"muzzles"; - if(isArray(_muzzles)) then { // generate magazine for each muzzle - { - if (_x != "this") then { - _magazines set [count _magazines, toLower(getArray(configFile>>"CfgWeapons">>_weapon>>_x>>"magazines") select 0)]; - }; - } forEach getArray(_muzzles); - }; - }; - { - [_target, _x] call _add; - } forEach _magazines; // add magazines - _target addWeapon _weapon; - { - if(_x!="" && !(_x in ([] call _THIS(3)))) then { - _x call _THIS(4); - }; - } forEach (_data select (1+_THIS(1))); // add weapon items - } else { - systemchat format["%1 %2 doesn't exist",_THIS(2),_weapon]; - if (_currentWeapon == _weapon) then { - _currentWeapon = ""; - _currentMode = ""; - }; - }; - }; -}; - -// add primary weapon, add primary weapon loaded magazine, add primary weapon items -_addPrimary = { - [ - { primaryWeapon _target }, // 0 // get current weapon - 1, // 1 //weapon classname index in _data - "primary", // 2 // weapon debug type - { primaryWeaponItems _target }, // 3 // weapon items - { _target addPrimaryWeaponItem _this }, // 4 // add weapon item - 0 // 5 // index in _loadedMagazines - ] call _addWeapon; -}; - -// add handgun weapon, add handgun weapon loaded magazine, add handgun weapon items -_addHandgun = { - [ - { handgunWeapon _target }, // 0 // get current weapon - 3, // 1 //weapon classname index in _data - "handgun", // 2 // weapon debug type - { handgunItems _target }, // 3 // weapon items - { _target addHandgunItem _this }, // 4 // add weapon item - 1 // 5 // index in _loadedMagazines - ] call _addWeapon; -}; - -// add secondary weapon, add secondary weapon loaded magazine, add secondary weapon items -_addSecondary = { - [ - { secondaryWeapon _target }, // 0 // get current weapon - 5, // 1 //weapon classname index in _data in _data - "secondary", // 2 // weapon debug type - { secondaryWeaponItems _target }, // 3 // weapon items - { _target addSecondaryWeaponItem _this }, // 4 // add weapon item - 2 // 5 // index in _loadedMagazines - ] call _addWeapon; -}; - - -// first added weapon is selected, order add functions to firstly add currently selected weapon -_addOrder=[_addPrimary,_addHandgun,_addSecondary]; -if(_currentWeapon!="") then { - _addOrder = switch _currentWeapon do { - case (_data select 3): {[_addHandgun,_addPrimary,_addSecondary]}; - case (_data select 5): {[_addSecondary,_addPrimary,_addHandgun]}; - default {_addOrder}; - }; -}; -{ - [] call _x; -} forEach _addOrder; - -// select weapon and firing mode -if(vehicle _target == _target && _currentWeapon != "" && _currentMode != "") then { - _muzzles = 0; - while { (_currentWeapon != currentMuzzle _target || _currentMode != currentWeaponMode _target ) && _muzzles < 100 } do { - _target action ["SWITCHWEAPON", _target, _target, _muzzles]; - _muzzles = _muzzles + 1; - }; - if(_muzzles >= 100) then { - systemchat format["mode %1 for %2 doesn't exist", _currentMode, _currentWeapon]; - _currentMode = ""; - }; -} else { - _currentMode = ""; -}; -if(_currentMode == "" && _currentWeapon != "") then { - _target selectWeapon _currentWeapon; -}; - -clearAllItemsFromBackpack _target; - -// add uniform, add uniform items and fill uniform with item placeholders -_outfit = _data select 7; -if(_outfit != "") then { - if(isClass(configFile>>"CfgWeapons">>_outfit)) then { - _target addUniform _outfit; - _target addItem PLACEHOLDER_ITEM; - if(loadUniform _target > 0) then { - _placeholderCount = _placeholderCount + 1; - { - [_target,_x] call _add; - } forEach (_data select 8); - while{true} do { - _loadBeforeAdd = loadUniform _target; - _target addItem PLACEHOLDER_ITEM; - if(loadUniform _target == _loadBeforeAdd) exitWith {}; - _placeholderCount = _placeholderCount + 1; - }; - }; - } else { - systemchat format["uniform %1 doesn't exist",_outfit]; - }; -}; - -// add vest, add vest items and fill vest with item placeholders -_outfit = _data select 9; -if(_outfit != "") then { - if(isClass(configFile>>"CfgWeapons">>_outfit)) then { - _target addVest _outfit; - _target addItem PLACEHOLDER_ITEM; - if(loadVest _target > 0) then { - _placeholderCount = _placeholderCount + 1; - { - [_target,_x] call _add; - } forEach (_data select 10); - while{true} do { - _loadBeforeAdd = loadVest _target; - _target addItem PLACEHOLDER_ITEM; - if(loadVest _target == _loadBeforeAdd) exitWith {}; - _placeholderCount = _placeholderCount + 1; - }; - }; - } else { - systemchat format["vest %1 doesn't exist",_outfit]; - }; -}; - -// more complex add function intended for use with backpack -_add = { - private ["_target","_item"]; - _target = _this select 0; - _item = _this select 1; - if(typename _item == "ARRAY") then { - if(_item select 0 != "") then { - if(_loadMagsAmmo) then { - _target addMagazine _item; - } else { - _target addMagazine (_item select 0); - }; - }; - } else { - if(isClass(configFile>>"CfgMagazines">>_item)) then { - (unitBackpack _target) addMagazineCargo [_item,1]; - } else { - if(_item != "") then { - if(getNumber(configFile>>"CfgVehicles">>_item>>"isbackpack")==1) then { - (unitBackpack _target) addBackpackCargo [_item,1]; - } else { - if(isClass(configFile>>"CfgWeapons">>_item>>"WeaponSlotsInfo") && getNumber(configFile>>"CfgWeapons">>_item>>"showempty")==1) then { - (unitBackpack _target) addWeaponCargo [_item,1]; - } else { - _target addItem _item; - }; - }; - }; - }; - }; -}; - -// add backpack and add backpack items -removeBackpack _target; -_outfit = _data select 11; -if(_outfit != "") then { - if(getNumber(configFile>>"CfgVehicles">>_outfit>>"isbackpack")==1) then { - _target addBackpack _outfit; - clearAllItemsFromBackpack _target; - _target addItem PLACEHOLDER_ITEM; - _placeholderCount = _placeholderCount + 1; - if(loadBackpack _target > 0) then { - { - [_target, _x] call _add; - } forEach (_data select 12); - }; - } else { - systemchat format["backpack %1 doesn't exist",_outfit]; - }; -}; - -// remove item placeholders -for "_i" from 1 to _placeholderCount do { - _target removeItem PLACEHOLDER_ITEM; -}; - - -// make loadout visible fix? -if(vehicle _target == _target) then { - //_target switchMove (getArray(configFile>>"CfgMovesMaleSdr">>"States">>animationState player>>"ConnectTo") select 0); - _target setPosATL (getPosATL _target); -}; diff --git a/source/fnc_test.Sqf b/source/fnc_test.Sqf deleted file mode 100644 index d919f6e..0000000 --- a/source/fnc_test.Sqf +++ /dev/null @@ -1,39 +0,0 @@ -//// --------------- taken from locatorflat QUI MARCHE --- FUNCTION -_foundSafePos = _this select 0; -_radius = _this select 1; -_varname = _this select 2; -_array_exist = true; -_found_dist_away = true; - - -if (isnil (format["%1",_varname])) then call compile format["%1" = [[-99999,-99999,-99999]; _array_exist = true;],_varname]; - - // check if the array of zones already exist. If not, give him at least 1 location with impossible value and tell that the array was NOT existing - -_kibot_distances_array = []; - - for [{_t=1}, {_t<=count _varname}, {_t=_t+1}] do // for each element of the array of positions - { - _kibot_pos_array_missionPos_index = _t-1; // get the index of the element - _kibot_distances_array = _kibot_distances_array +[(_varname select _kibot_pos_array_missionPos_index) distance (_foundSafePos)]; //compare the distance of the given pos with other pos in pos array and add it into an array of all the compared distance --> an array of distances is obtained - }; - - for [{_t=1}, {_t<=count _kibot_distances_array}, {_t=_t+1}] do // for each element of the array of distances we just generated... - { - _kibot_distances_array_index = _t-1; // get the index of the tested element - _check = (_kibot_distances_array select _kibot_distances_array_index); // select the element we just took the index so we can check them - hint format["%1",_kibot_distances_array]; - if (_check < _radius) then { // check the distances contained the distances array 1 by 1. If a distance is inferior to defined value, this is a no go. - _found_dist_away = false; // If no zone is under 1500 meters, tell it to this variable - }; - }; - -// if a distance has been found, add the position to the array of pos, because it's a valid pos. -if (_found_dist_away) then { -call compile format["%1 = %1 + [%2],_varname,_foundsafepos]; -true -} -else -{ -false -} \ No newline at end of file diff --git a/source/WARCOM/WARCOM_blu_assault.sqf b/source/functions/WARCOM/fn_WARCOM_blu_assault.sqf similarity index 86% rename from source/WARCOM/WARCOM_blu_assault.sqf rename to source/functions/WARCOM/fn_WARCOM_blu_assault.sqf index d651ac8..ced1d51 100644 --- a/source/WARCOM/WARCOM_blu_assault.sqf +++ b/source/functions/WARCOM/fn_WARCOM_blu_assault.sqf @@ -5,7 +5,7 @@ WARCOM_blu_attack_wave_avalaible = false; // Type of attack wave [] spawn { - //WARCOM_blu_attack_wave_type = ["B_Soldier_TL_F","B_Soldier_F"]; + //WARCOM_blu_attack_wave_type = [Blufor_Teamleader,Blufor_Rifleman]; diag_log format ["WARCOM_blufor_ap_assault: %1", WARCOM_blufor_ap]; waitUntil {sleep 1; WARCOM_blufor_ap>=10}; [West,"HQ"] sidechat "This is HQ, BLUFOR troops just arrived on the island, we'll soon be able to push through the enemy lines"; @@ -44,11 +44,11 @@ WARCOM_blu_attack_wave_avalaible = false; while {true} do { sleep 30; _group = [WARCOM_blu_hq_pos, WEST, WARCOM_blu_attack_wave_type,[],[],blufor_ai_skill] call BIS_fnc_spawnGroup; - _TFname = [1] call compile preprocessFile "random_name.sqf"; + _TFname = [1] call duws_fnc_random_name; [West,"HQ"] sidechat format["This is HQ, We are sending Task Force %1, we will try to push as far as possible in enemy territory",_TFname]; - _blu_assault = [_group] execVM "WARCOM\WARCOM_wp.sqf"; - _blu_assault = [_group,_TFname] execVM "WARCOM\WARCOM_gps_marker.sqf"; + _blu_assault = [_group] call duws_fnc_WARCOM_wp; + _blu_assault = [_group,_TFname] spawn duws_fnc_WARCOM_gps_marker; sleep (WARCOM_blu_attack_delay + random 1200); diff --git a/source/WARCOM/WARCOM_blu_patrol.sqf b/source/functions/WARCOM/fn_WARCOM_blu_patrol.sqf similarity index 87% rename from source/WARCOM/WARCOM_blu_patrol.sqf rename to source/functions/WARCOM/fn_WARCOM_blu_patrol.sqf index 8cae2fd..a875b90 100644 --- a/source/WARCOM/WARCOM_blu_patrol.sqf +++ b/source/functions/WARCOM/fn_WARCOM_blu_patrol.sqf @@ -55,16 +55,16 @@ diag_log format ["WARCOM_blufor_ap_patrol: %1", WARCOM_blufor_ap]; // find a zone *** end _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; _group = [_randomZone, WEST, WARCOM_blu_patrol_type,[],[],WARCOM_blu_ai_skill_range] call BIS_fnc_spawnGroup; - _opf_assault = [_group] execVM "WARCOM\WARCOM_wp_blu_patrol.sqf"; -// _blu_assault = [_group,"derp"] execVM "WARCOM\WARCOM_gps_marker.sqf"; + [_group] call duws_fnc_WARCOM_wp_blu_patrol; +// [_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; // spawn armored if (WARCOM_blufor_ap>50) then { - ["BLU_F","armored",_randomZone] execVM "WARCOM\random_veh_blu_patrol.sqf"; + ["BLU_F","armored",_randomZone] spawn duws_fnc_random_veh_blu_patrol ; }; if (WARCOM_blufor_ap>200) then { - ["BLU_F","air",_randomZone] execVM "WARCOM\random_veh_blu_patrol.sqf"; + ["BLU_F","air",_randomZone] spawn duws_fnc_random_veh_blu_patrol ; }; }; diff --git a/source/WARCOM/WARCOM_gps_marker.sqf b/source/functions/WARCOM/fn_WARCOM_gps_marker.sqf similarity index 85% rename from source/WARCOM/WARCOM_gps_marker.sqf rename to source/functions/WARCOM/fn_WARCOM_gps_marker.sqf index f63865c..0351c51 100644 --- a/source/WARCOM/WARCOM_gps_marker.sqf +++ b/source/functions/WARCOM/fn_WARCOM_gps_marker.sqf @@ -1,9 +1,5 @@ -_group = _this select 0; -_TFname = _this select 1; +params ["_group","_TFname"]; -[_group,_TFname] spawn { -_group = _this select 0; -_TFname = _this select 1; _loop = true; @@ -17,7 +13,7 @@ str(_markername) setMarkerColor "ColorBlue"; str(_markername) setMarkerText format["TF %1",_TFname]; WARCOM_marker_num = WARCOM_marker_num + 1; - while {_loop} do { +while {_loop} do { _units_alive = {alive _x }count units _group; if (_units_alive<=0) exitWith { // IF ALL DEAD, EXIT. str(_markername) setMarkerColor "ColorRed"; @@ -29,10 +25,8 @@ WARCOM_marker_num = WARCOM_marker_num + 1; _leader = leader _group; str(_markername) setMarkerPos getpos _leader; sleep 4; - }; - - }; + // fin du script \ No newline at end of file diff --git a/source/WARCOM/WARCOM_init.sqf b/source/functions/WARCOM/fn_WARCOM_init.sqf similarity index 70% rename from source/WARCOM/WARCOM_init.sqf rename to source/functions/WARCOM/fn_WARCOM_init.sqf index 073e179..fde2eca 100644 --- a/source/WARCOM/WARCOM_init.sqf +++ b/source/functions/WARCOM/fn_WARCOM_init.sqf @@ -1,4 +1,4 @@ -// _handle = [[zones],posHQblu,posHQop,blufor AP,opfor AP, blu attack delay, blu skill range, opfor skill range, opf attack delay] execVM "WARCOM\WARCOM_init.sqf" +// _handle = [[zones],posHQblu,posHQop,blufor AP,opfor AP, blu attack delay, blu skill range, opfor skill range, opf attack delay] call duws_fnc_WARCOM_init // | | | | | | // array of arrays | array | number | // array number number @@ -6,15 +6,18 @@ player globalchat "Initializing WARCOM..."; WARCOM_init_done = false; -_array_of_zones_total =_this select 0; -_blu_hq_pos =_this select 1; -_op_hq_pos =_this select 2; -_blufor_ap =_this select 3; -_opfor_ap =_this select 4; -_blu_attack_delay =_this select 5; -_blu_ai_skill_range =_this select 6; -_opfor_ai_skill = _this select 7; -_opfor_assault_delay = _this select 8; +params +[ +"_array_of_zones_total", +"_blu_hq_pos", +"_op_hq_pos", +"_blufor_ap", +"_opfor_ap", +"_blu_attack_delay", +"_blu_ai_skill_range", +"_opfor_ai_skill", +"_opfor_assault_delay" +]; // INIT VARIABLES WARCOM_blu_hq_pos = [_blu_hq_pos select 0, (_blu_hq_pos select 1) + 16]; @@ -45,24 +48,20 @@ WARCOM_zones_controled_by_OPFOR = [] + _WARCOM_zones_controled_by_OPFOR; // Init BLU patrols diag_log "Init BLU patrols"; -_blu_patrol = [] execVM "WARCOM\WARCOM_blu_patrol.sqf"; -//waitUntil {scriptDone _blu_patrol}; +[] call duws_fnc_WARCOM_blu_patrol; // Init OPF patrols diag_log "Init OPF patrols"; -_opf_patrol = [] execVM "WARCOM\WARCOM_opf_patrol.sqf"; -//waitUntil {scriptDone _opf_patrol}; +[] call duws_fnc_WARCOM_opf_patrol; // Initialize the BLU attack waves diag_log "Initialize the BLU attack waves"; -_blu_assault = [] execVM "WARCOM\WARCOM_blu_assault.sqf"; -//waitUntil {scriptDone _blu_assault}; +[] call duws_fnc_WARCOM_blu_assault; // Init the OPF attack waves diag_log "Init the OPF attack waves"; -_opf_assault = [] execVM "WARCOM\WARCOM_opf_assault.sqf"; -//waitUntil {scriptDone _opf_assault}; +[] call duws_fnc_WARCOM_opf_assault; diff --git a/source/WARCOM/WARCOM_opf_assault.sqf b/source/functions/WARCOM/fn_WARCOM_opf_assault.sqf similarity index 65% rename from source/WARCOM/WARCOM_opf_assault.sqf rename to source/functions/WARCOM/fn_WARCOM_opf_assault.sqf index 6b122c9..f7ae630 100644 --- a/source/WARCOM/WARCOM_opf_assault.sqf +++ b/source/functions/WARCOM/fn_WARCOM_opf_assault.sqf @@ -8,19 +8,19 @@ WARCOM_opf_attack_wave_avalaible = false; waitUntil {sleep 1; WARCOM_opfor_ap>=10}; WARCOM_opf_attack_wave_avalaible = true; - WARCOM_opf_attack_wave_type = (configFile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfTeam"); + WARCOM_opf_attack_wave_type = Opfor_WARCOM_Fireteam; waitUntil {sleep 1; WARCOM_opfor_ap>40}; - WARCOM_opf_attack_wave_type = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad"); + WARCOM_opf_attack_wave_type = Opfor_WARCOM_Infantry_Squad; waitUntil {sleep 1; WARCOM_opfor_ap>65}; - WARCOM_opf_attack_wave_type = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad_Weapons"); + WARCOM_opf_attack_wave_type = Opfor_WARCOM_Weapons_Squad; waitUntil {sleep 1; WARCOM_opfor_ap>100}; - WARCOM_opf_attack_wave_type = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInfSquad"); + WARCOM_opf_attack_wave_type = Opfor_WARCOM_Mech_Inf_Squad; waitUntil {sleep 1; WARCOM_opfor_ap>135}; - WARCOM_opf_attack_wave_type = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInf_AT"); + WARCOM_opf_attack_wave_type = Opfor_WARCOM_Mech_Wpn_Squad; }; @@ -58,8 +58,8 @@ WARCOM_opf_attack_wave_avalaible = false; _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; _group = [_randomZone, EAST, WARCOM_opf_attack_wave_type,[],[],WARCOM_opf_ai_skill_range] call BIS_fnc_spawnGroup; - _opf_assault = [_group,_randomZone] execVM "WARCOM\WARCOM_wp_opf.sqf"; -// _blu_assault = [_group,"derp"] execVM "WARCOM\WARCOM_gps_marker.sqf"; + [_group,_randomZone] call duws_fnc_WARCOM_wp_opf; +// [_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; sleep (WARCOM_opf_attack_delay + random 1200); diff --git a/source/WARCOM/WARCOM_opf_patrol.sqf b/source/functions/WARCOM/fn_WARCOM_opf_patrol.sqf similarity index 60% rename from source/WARCOM/WARCOM_opf_patrol.sqf rename to source/functions/WARCOM/fn_WARCOM_opf_patrol.sqf index b52bcd3..9e949c9 100644 --- a/source/WARCOM/WARCOM_opf_patrol.sqf +++ b/source/functions/WARCOM/fn_WARCOM_opf_patrol.sqf @@ -4,19 +4,19 @@ WARCOM_opf_patrol_type = ""; // Type of attack wave [] spawn { - WARCOM_opf_patrol_type = (configFile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfTeam"); + WARCOM_opf_patrol_type = Opfor_WARCOM_Fireteam; waitUntil {sleep 1; WARCOM_opfor_ap>40}; - WARCOM_opf_patrol_type = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad"); + WARCOM_opf_patrol_type = Opfor_WARCOM_Infantry_Squad; waitUntil {sleep 1; WARCOM_opfor_ap>65}; - WARCOM_opf_patrol_type = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad_Weapons"); + WARCOM_opf_patrol_type = Opfor_WARCOM_Weapons_Squad; waitUntil {sleep 1; WARCOM_opfor_ap>100}; - WARCOM_opf_patrol_type = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInfSquad"); + WARCOM_opf_patrol_type = Opfor_WARCOM_Mech_Inf_Squad; waitUntil {sleep 1; WARCOM_opfor_ap>135}; - WARCOM_opf_patrol_type = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInf_AT"); + WARCOM_opf_patrol_type = Opfor_WARCOM_Mech_Wpn_Squad; }; @@ -53,16 +53,16 @@ WARCOM_opf_patrol_type = ""; // find a zone *** end _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; _group = [_randomZone, EAST, WARCOM_opf_patrol_type,[],[],WARCOM_opf_ai_skill_range] call BIS_fnc_spawnGroup; - _opf_assault = [_group] execVM "WARCOM\WARCOM_wp_opf_patrol.sqf"; -// _blu_assault = [_group,"derp"] execVM "WARCOM\WARCOM_gps_marker.sqf"; + [_group] call duws_fnc_WARCOM_wp_opf_patrol; +// [_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; // spawn armored if (WARCOM_opfor_ap>50) then { - ["OPF_F","armored",_randomZone] execVM "WARCOM\random_veh_opf_patrol.sqf"; + [opfor_Faction,"armored",_randomZone] spawn duws_fnc_random_veh_opf_patrol ; }; if (WARCOM_opfor_ap>200) then { - ["OPF_F","air",_randomZone] execVM "WARCOM\random_veh_opf_patrol.sqf"; + [opfor_Faction,"air",_randomZone] spawn duws_fnc_random_veh_opf_patrol ; }; }; diff --git a/source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf b/source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf new file mode 100644 index 0000000..8e6a1a3 --- /dev/null +++ b/source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf @@ -0,0 +1,39 @@ +if (!WARCOM_qrf_ready) exitWith {}; +WARCOM_qrf_ready = false; +params ["_attachedUnit"]; +_unitPos = getpos _attachedUnit; +//hint format["%1",_attachedUnit]; + +// Attack waves main + +if (count WARCOM_zones_controled_by_OPFOR > 0) then { // make sure opfor is controlling at least 1 zones + sleep 2; + + // find a zone where to spawn OPF wave away from player *** BEGIN + _found = false; + _randomZone = []; + _failSafe = 0; + while {!_found} do { + _randomZone = WARCOM_zones_controled_by_OPFOR call BIS_fnc_selectRandom; + if (_randomZone distance player > 2000) then {_found=true;}; + sleep 0.2; + //player sidechat format["Failsafe: %1",_failsafe]; + _failSafe = _failSafe + 1; + if (_failsafe > 10) then + { + sleep 300; + _failsafe = 0; + }; + }; + // find a zone *** end + _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; + _group = [_randomZone, EAST, WARCOM_opf_patrol_type,[],[],WARCOM_opf_ai_skill_range] call BIS_fnc_spawnGroup; + [_group,_unitPos] call duws_fnc_WARCOM_wp_opf_qrf; + //[_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; +}; + + + + +sleep 1800; +WARCOM_qrf_ready = true; \ No newline at end of file diff --git a/source/WARCOM/WARCOM_wp.sqf b/source/functions/WARCOM/fn_WARCOM_wp.sqf similarity index 89% rename from source/WARCOM/WARCOM_wp.sqf rename to source/functions/WARCOM/fn_WARCOM_wp.sqf index f34190b..4496d43 100644 --- a/source/WARCOM/WARCOM_wp.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp.sqf @@ -1,4 +1,4 @@ -_group =_this select 0; +params ["_group"]; _group setCombatMode "RED"; diff --git a/source/WARCOM/WARCOM_wp_blu_patrol.sqf b/source/functions/WARCOM/fn_WARCOM_wp_blu_patrol.sqf similarity index 94% rename from source/WARCOM/WARCOM_wp_blu_patrol.sqf rename to source/functions/WARCOM/fn_WARCOM_wp_blu_patrol.sqf index 91dab21..6ddffce 100644 --- a/source/WARCOM/WARCOM_wp_blu_patrol.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp_blu_patrol.sqf @@ -1,4 +1,4 @@ -_group =_this select 0; +params ["_group"]; _group setCombatMode "RED"; diff --git a/source/WARCOM/WARCOM_wp_opf.sqf b/source/functions/WARCOM/fn_WARCOM_wp_opf.sqf similarity index 94% rename from source/WARCOM/WARCOM_wp_opf.sqf rename to source/functions/WARCOM/fn_WARCOM_wp_opf.sqf index 9bea8de..0e1ad68 100644 --- a/source/WARCOM/WARCOM_wp_opf.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp_opf.sqf @@ -1,4 +1,4 @@ -_group =_this select 0; +params ["_group"]; _group setCombatMode "RED"; diff --git a/source/WARCOM/WARCOM_wp_opf_patrol.sqf b/source/functions/WARCOM/fn_WARCOM_wp_opf_patrol.sqf similarity index 94% rename from source/WARCOM/WARCOM_wp_opf_patrol.sqf rename to source/functions/WARCOM/fn_WARCOM_wp_opf_patrol.sqf index c9333ac..7f7021c 100644 --- a/source/WARCOM/WARCOM_wp_opf_patrol.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp_opf_patrol.sqf @@ -1,4 +1,4 @@ -_group =_this select 0; +params ["_group"]; _group setCombatMode "RED"; diff --git a/source/WARCOM/WARCOM_wp_opf_qrf.sqf b/source/functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf similarity index 78% rename from source/WARCOM/WARCOM_wp_opf_qrf.sqf rename to source/functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf index a8d8407..9589b39 100644 --- a/source/WARCOM/WARCOM_wp_opf_qrf.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf @@ -1,5 +1,4 @@ -_group =_this select 0; -_unitPos = _this select 1; +params ["_group","_unitPos"]; _group setCombatMode "RED"; diff --git a/source/WARCOM/random_veh_opf_patrol.sqf b/source/functions/WARCOM/fn_random_veh_blu_patrol.sqf similarity index 88% rename from source/WARCOM/random_veh_opf_patrol.sqf rename to source/functions/WARCOM/fn_random_veh_blu_patrol.sqf index ab8628e..f0c7e48 100644 --- a/source/WARCOM/random_veh_opf_patrol.sqf +++ b/source/functions/WARCOM/fn_random_veh_blu_patrol.sqf @@ -3,10 +3,7 @@ //hasDriver = 1; //canFloat = 0; -_faction = _this select 0; -_vehClass = _this select 1; -_position = _this select 2; -_radius = _this select 3; +params ["_faction","_vehClass","_position","_radius"]; _cfgVehicles = configFile >> "CfgVehicles"; _totalentries = count _cfgVehicles; // GO INTO CFGVEHICLES AND CHECK NUMBER OF ENTRIES @@ -38,7 +35,7 @@ _simulation_paracheck = getText (_checked_veh >> "simulation"); // check if not // DETERMINE LA FACTION _side = EAST; if(_faction=="BLU_F") then {_side=WEST}; -if(_faction=="OPF_F") then {_side=EAST}; +if(_faction==Opfor_Faction) then {_side=EAST}; if(_faction=="IND_F") then {_side=RESISTANCE}; if(_faction=="CIV_F") then {_side=CIVILIAN}; @@ -46,7 +43,7 @@ _createdVehFnc = [_position,0,_foundVeh,_side] call bis_fnc_spawnvehicle; _vehGroup = _createdVehFnc select 2; //hint format["%1",_patrolRadius]; -_opf_assault = [_vehGroup] execVM "WARCOM\WARCOM_wp_opf_patrol.sqf"; +[_vehGroup] call duws_fnc_WARCOM_wp_blu_patrol; //_crews = _createdVehFnc select 1; // //_driver = _crews select 0; //DEBUG diff --git a/source/WARCOM/random_veh_blu_patrol.sqf b/source/functions/WARCOM/fn_random_veh_opf_patrol.sqf similarity index 88% rename from source/WARCOM/random_veh_blu_patrol.sqf rename to source/functions/WARCOM/fn_random_veh_opf_patrol.sqf index 88d7f85..428e9e7 100644 --- a/source/WARCOM/random_veh_blu_patrol.sqf +++ b/source/functions/WARCOM/fn_random_veh_opf_patrol.sqf @@ -3,10 +3,7 @@ //hasDriver = 1; //canFloat = 0; -_faction = _this select 0; -_vehClass = _this select 1; -_position = _this select 2; -_radius = _this select 3; +params ["_faction","_vehClass","_position","_radius"]; _cfgVehicles = configFile >> "CfgVehicles"; _totalentries = count _cfgVehicles; // GO INTO CFGVEHICLES AND CHECK NUMBER OF ENTRIES @@ -38,7 +35,7 @@ _simulation_paracheck = getText (_checked_veh >> "simulation"); // check if not // DETERMINE LA FACTION _side = EAST; if(_faction=="BLU_F") then {_side=WEST}; -if(_faction=="OPF_F") then {_side=EAST}; +if(_faction==Opfor_Faction) then {_side=EAST}; if(_faction=="IND_F") then {_side=RESISTANCE}; if(_faction=="CIV_F") then {_side=CIVILIAN}; @@ -46,7 +43,7 @@ _createdVehFnc = [_position,0,_foundVeh,_side] call bis_fnc_spawnvehicle; _vehGroup = _createdVehFnc select 2; //hint format["%1",_patrolRadius]; -_opf_assault = [_vehGroup] execVM "WARCOM\WARCOM_wp_blu_patrol.sqf"; +[_vehGroup] call duws_fnc_WARCOM_wp_opf_patrol; //_crews = _createdVehFnc select 1; // //_driver = _crews select 0; //DEBUG diff --git a/source/dialog/fob/fast_travel.sqf b/source/functions/fob/fn_fast_travel.sqf similarity index 100% rename from source/dialog/fob/fast_travel.sqf rename to source/functions/fob/fn_fast_travel.sqf diff --git a/source/dialog/fob/fobmanageropen.sqf b/source/functions/fob/fn_fobmanageropen.sqf similarity index 100% rename from source/dialog/fob/fobmanageropen.sqf rename to source/functions/fob/fn_fobmanageropen.sqf diff --git a/source/sounds/radiochatter.sqf b/source/functions/fob/fn_radiochatter.sqf similarity index 90% rename from source/sounds/radiochatter.sqf rename to source/functions/fob/fn_radiochatter.sqf index d1f1d2f..951fadf 100644 --- a/source/sounds/radiochatter.sqf +++ b/source/functions/fob/fn_radiochatter.sqf @@ -1,4 +1,4 @@ -_object = _this select 0; +params ["_object"]; _arrayOfSounds = ["radiochatter2", "radiochatter4"]; diff --git a/source/dialog/fob/reinforce.sqf b/source/functions/fob/fn_reinforce.sqf similarity index 100% rename from source/dialog/fob/reinforce.sqf rename to source/functions/fob/fn_reinforce.sqf diff --git a/source/bisArsenal.sqf b/source/functions/generic/fn_bisArsenal.sqf similarity index 100% rename from source/bisArsenal.sqf rename to source/functions/generic/fn_bisArsenal.sqf diff --git a/source/captured.sqf b/source/functions/generic/fn_captured.sqf similarity index 84% rename from source/captured.sqf rename to source/functions/generic/fn_captured.sqf index 016ab6c..c92e618 100644 --- a/source/captured.sqf +++ b/source/functions/generic/fn_captured.sqf @@ -1,8 +1,4 @@ -_place = _this select 0; -_points = _this select 1; -_markername = _this select 2; -_markername2 = _this select 3; -_triggerPos = _this select 4; +params ["_place","_points","_markername","_markername2","_triggerPos"]; amount_zones_captured = amount_zones_captured + 1; publicVariable "amount_zones_captured"; @@ -38,7 +34,7 @@ WARCOM_blufor_ap = WARCOM_blufor_ap + _points; publicVariable "WARCOM_blufor_ap"; // ADD PERSISTENT STAT -_addzone = [] execVM "persistent\persistent_stats_zones_add.sqf"; +_addzone = [] call duws_fnc_persistent_stats_zones_add; // MODIFY MARKER ICON str(_markername) setMarkerColor "ColorGreen"; @@ -56,4 +52,4 @@ call compile format["_trg = trigger%1%2",round (_triggerPos select 0),round (_tr //// MAKE THE TRIGGER CAPTURABLE FOR OPFOR _trg setTriggerActivation["EAST SEIZED","PRESENT",true]; -_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] execvm 'zonescap\opfor_cap.sqf'",_place,_points,_markername,_markername2,_triggerPos], ""]; \ No newline at end of file +_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] call duws_fnc_opfor_cap",_place,_points,_markername,_markername2,_triggerPos], ""]; \ No newline at end of file diff --git a/source/dialog/convertCPtoAP.sqf b/source/functions/generic/fn_convertCPtoAP.sqf similarity index 100% rename from source/dialog/convertCPtoAP.sqf rename to source/functions/generic/fn_convertCPtoAP.sqf diff --git a/source/functions/generic/fn_createopfortified.sqf b/source/functions/generic/fn_createopfortified.sqf new file mode 100644 index 0000000..18e2c47 --- /dev/null +++ b/source/functions/generic/fn_createopfortified.sqf @@ -0,0 +1,22 @@ +params ["_position"]; + +// hint format["%1",_position]; + +_group = [ + _position, + EAST, [ + Opfor_Squadleader, + Opfor_AA_Specialist, + Opfor_AT_Specialist, + Opfor_Grenadier, + Opfor_Teamleader, + Opfor_Autorifleman, + Opfor_Rifleman_AT, + Opfor_Grenadier], + [], + [], + opfor_ai_skill] call BIS_fnc_spawnGroup; +[_group, _position] call bis_fnc_taskDefend; + +// ADD QRF eventhandler +_EH = leader _group addEventHandler ["Fired", {[_this select 0] spawn duws_fnc_WARCOM_opf_qrf}]; \ No newline at end of file diff --git a/source/createoppatrol.sqf b/source/functions/generic/fn_createoppatrol.sqf similarity index 62% rename from source/createoppatrol.sqf rename to source/functions/generic/fn_createoppatrol.sqf index 2cc4eae..e850145 100644 --- a/source/createoppatrol.sqf +++ b/source/functions/generic/fn_createoppatrol.sqf @@ -1,12 +1,11 @@ -// usage: [position, radius] execvm "createoppatrol.sqf" + // radius: 50 for patrol inside and around base, 500 for medium lenght skirmish, 1300 for island -_position = _this select 0; -_radius = _this select 1; +params ["_position","_radius"]; // hint format["%1",_position]; -_group = [_position, EAST, ["O_Soldier_F","O_Soldier_F"],[],[],opfor_ai_skill] call BIS_fnc_spawnGroup; +_group = [_position, EAST, [Opfor_Teamleader,Opfor_Rifleman],[],[],opfor_ai_skill] call BIS_fnc_spawnGroup; _patrolRadius = round(_radius/2); [_group, _position, _patrolradius] call bis_fnc_taskPatrol; @@ -14,4 +13,4 @@ _patrolRadius = round(_radius/2); //player globalchat format["%1",_skill]; // ADD QRF eventhandler -_EH = leader _group addEventHandler ["Fired", {[_this select 0] spawn QRF_test}]; \ No newline at end of file +_EH = leader _group addEventHandler ["Fired", {[_this select 0] spawn duws_fnc_WARCOM_opf_qrf}]; \ No newline at end of file diff --git a/source/createopteam.sqf b/source/functions/generic/fn_createopteam.sqf similarity index 53% rename from source/createopteam.sqf rename to source/functions/generic/fn_createopteam.sqf index fab4c3d..0e4090a 100644 --- a/source/createopteam.sqf +++ b/source/functions/generic/fn_createopteam.sqf @@ -1,14 +1,13 @@ -// usage: [position, radius] execvm "createoppatrol.sqf" + // radius: 50 for patrol inside and around base, 500 for medium lenght skirmish, 1300 for island -_position = _this select 0; -_radius = _this select 1; +params["_position","_radius"]; // hint format["%1",_position]; -_group = [_position, EAST, ["O_Soldier_TL_F","O_Soldier_AR_F","O_Soldier_LAT_F","O_Soldier_GL_F"],[],[],opfor_ai_skill] call BIS_fnc_spawnGroup; +_group = [_position, EAST, [Opfor_Teamleader,Opfor_Autorifleman,Opfor_Rifleman_AT,Opfor_Grenadier],[],[],opfor_ai_skill] call BIS_fnc_spawnGroup; _patrolRadius = round(_radius/2); [_group, _position, _patrolradius] call bis_fnc_taskPatrol; // ADD QRF eventhandler -_EH = leader _group addEventHandler ["Fired", {[_this select 0] spawn QRF_test}]; \ No newline at end of file +_EH = leader _group addEventHandler ["Fired", {[_this select 0] spawn duws_fnc_WARCOM_opf_qrf}]; \ No newline at end of file diff --git a/source/createopwpteam.sqf b/source/functions/generic/fn_createopwpteam.sqf similarity index 60% rename from source/createopwpteam.sqf rename to source/functions/generic/fn_createopwpteam.sqf index 45b863e..bdf9d59 100644 --- a/source/createopwpteam.sqf +++ b/source/functions/generic/fn_createopwpteam.sqf @@ -1,16 +1,15 @@ -// usage: [position, radius] execvm "createoppatrol.sqf" + // radius: 50 for patrol inside and around base, 500 for medium lenght skirmish, 1300 for island -_position = _this select 0; -_radius = _this select 1; +params ["_position","_radius"]; // hint format["%1",_position]; -_group = [_position, EAST, ["O_Soldier_TL_F","O_Soldier_AA_F","O_Soldier_AT_F"],[],[],opfor_ai_skill] call BIS_fnc_spawnGroup; +_group = [_position, EAST, [Opfor_Teamleader,Opfor_AA_Specialist,Opfor_AT_Specialist],[],[],opfor_ai_skill] call BIS_fnc_spawnGroup; _patrolRadius = round(_radius/2); [_group, _position, _patrolradius] call bis_fnc_taskPatrol; //_skill = skill leader _group; //player globalchat format["%1",_skill]; // ADD QRF eventhandler -_EH = leader _group addEventHandler ["Fired", {[_this select 0] spawn QRF_test}]; \ No newline at end of file +_EH = leader _group addEventHandler ["Fired", {[_this select 0] spawn duws_fnc_WARCOM_opf_qrf}]; \ No newline at end of file diff --git a/source/functions/generic/fn_createpatrol.sqf b/source/functions/generic/fn_createpatrol.sqf new file mode 100644 index 0000000..cbc8df7 --- /dev/null +++ b/source/functions/generic/fn_createpatrol.sqf @@ -0,0 +1,8 @@ + +// radius: 50 for patrol inside and around base, 500 for medium lenght skirmish, 1300 for island + +params ["_position","_radius"]; + +_group = [_position, WEST, [Blufor_Teamleader,Blufor_Rifleman]] call BIS_fnc_spawnGroup; +_patrolRadius = round(_radius/3); +[_group, _position, _patrolRadius] call bis_fnc_taskPatrol; \ No newline at end of file diff --git a/source/dynamic_music/dyn_music_init.sqf b/source/functions/generic/fn_dyn_music_init.sqf similarity index 100% rename from source/dynamic_music/dyn_music_init.sqf rename to source/functions/generic/fn_dyn_music_init.sqf diff --git a/source/dynamic_menu.sqf b/source/functions/generic/fn_dynamic_menu.sqf similarity index 82% rename from source/dynamic_menu.sqf rename to source/functions/generic/fn_dynamic_menu.sqf index 18c30d0..dfc150e 100644 --- a/source/dynamic_menu.sqf +++ b/source/functions/generic/fn_dynamic_menu.sqf @@ -13,6 +13,10 @@ Returns: - Nil - */ + +/* +DUWS note: This is available as a function! [params] call duws_fnc_dynamic_menu +*/ menuItemFormatter = { format [ "[""%1"", [%2], """", -5, [[""expression"", ""%3""]], ""1"", ""%4""]", @@ -36,7 +40,7 @@ _transportItems = []; //Offensive Submenu checks if(support_mortar_available) then { - _text = ["Mortar (2 CP)", 2, '_null = [8, 50, 5, 3, 2, 2, ""grenade""] execVM ""support\mapclickarty.sqf""', 1] call menuItemFormatter; + _text = ["Mortar (2 CP)", 2, '_null = [8, 50, 5, 3, 2, 2, ""grenade""] spawn duws_fnc_mapclickarty', 1] call menuItemFormatter; _offensiveItems pushBack _text; } else { _text = ["Mortar (N/A)", 2, "", 0] call menuItemFormatter; @@ -44,7 +48,7 @@ if(support_mortar_available) then { }; if(support_arty_available) then { - _text = ["Artillery Strike (4 CP)", 3, '_null = [6, 100, 8, 3, 1, 4, ""R_80mm_HE""] execVM ""support\mapclickarty.sqf""', 1] call menuItemFormatter; + _text = ["Artillery Strike (4 CP)", 3, '_null = [6, 100, 8, 3, 1, 4, ""R_80mm_HE""] spawn duws_fnc_mapclickarty', 1] call menuItemFormatter; _offensiveItems pushBack _text; } else { _text = ["Artillery Strike (N/A)", 3, "", 0] call menuItemFormatter; @@ -52,7 +56,7 @@ if(support_arty_available) then { }; if(support_cluster_available) then { - _text = ["Cluster Bomb (6 CP)", 4, '_null = [1, 250, 1, 90, 1, 6, ""grenade""] execVM ""support\cluster\mapclickcluster.sqf""', 1] call menuItemFormatter; + _text = ["Cluster Bomb (6 CP)", 4, '_null = [1, 250, 1, 90, 1, 6, ""grenade""] spawn duws_fnc_cluster', 1] call menuItemFormatter; _offensiveItems pushBack _text; } else { _text = ["Cluster Bomb (N/A)", 4, "", 0] call menuItemFormatter; @@ -60,7 +64,7 @@ if(support_cluster_available) then { }; if(support_jdam_available) then { - _text = ["JDAM Strike (1 CP)", 5, '_null = [1, 2, 1, 1, 3, 1, ""Bo_Mk82""] execVM ""support\mapclickarty.sqf""', 1] call menuItemFormatter; + _text = ["JDAM Strike (1 CP)", 5, '_null = [1, 2, 1, 1, 3, 1, ""Bo_Mk82""] spawn duws_fnc_mapclickarty', 1] call menuItemFormatter; _offensiveItems pushBack _text; } else { _text = ["JDAM (N/A)", 5, "", 0] call menuItemFormatter; @@ -79,7 +83,7 @@ call _myCode; //Logistics Submenu Checks if(support_supplydrop_available) then { - _text = ["Supply Drop (2 CP)", 2, '_null = [player] execVM ""support\ammobox.sqf""', 1] call menuItemFormatter; + _text = ["Supply Drop (2 CP)", 2, '_null = [player] spawn duws_fnc_ammobox', 1] call menuItemFormatter; _logisticsItems pushBack _text; } else { _text = ["Supply Drop ((N/A)", 2, '', 0] call menuItemFormatter; @@ -87,7 +91,7 @@ if(support_supplydrop_available) then { }; if(support_paradrop_available) then { - _text = ["Airborne troops (25 CP)", 3, '_null = [player] execVM ""support\paradrop.sqf""', 1] call menuItemFormatter; + _text = ["Airborne troops (25 CP)", 3, '_null = [player] spawn duws_fnc_paradrop', 1] call menuItemFormatter; _logisticsItems pushBack _text; } else { _text = ["Airborne troops (N/A)", 3, '', 0] call menuItemFormatter; @@ -95,7 +99,7 @@ if(support_paradrop_available) then { }; if(support_uav_recon_available) then { - _text = ["UAV Recon (3 CP)", 4, '_null = [player] execVM ""support\mapclickuav.sqf""', 1] call menuItemFormatter; + _text = ["UAV Recon (3 CP)", 4, '_null = [player] spawn duws_fnc_mapclickuav', 1] call menuItemFormatter; _logisticsItems pushBack _text; } else { _text = ["UAV Recon (N/A)", 4, '', 0] call menuItemFormatter; @@ -103,7 +107,7 @@ if(support_uav_recon_available) then { }; if(support_veh_refit_available) then { - _text = ["Vehicle Refit (2 CP)", 5, '_null = [player] execVM ""support\veh_refit.sqf""', 1] call menuItemFormatter; + _text = ["Vehicle Refit (2 CP)", 5, '_null = [player] call duws_fnc_veh_refit', 1] call menuItemFormatter; _logisticsItems pushBack _text; } else { _text = ["Vehicle Refit (N/A)", 5, '', 0] call menuItemFormatter; @@ -122,7 +126,7 @@ call _myCode; //Transport Submenu check if(support_helotaxi_available) then { - _text = ["Helicopter taxi(1 CP)", 2, '_nill = [getpos player,50] execVM ""support\taxi\helotaxi.sqf""', 1] call menuItemFormatter; + _text = ["Helicopter taxi(1 CP)", 2, '_nill = [getpos player,50] spawn duws_fnc_heloTaxi', 1] call menuItemFormatter; _transportItems pushBack _text; } else { _text = ["Helicopter taxi(N/A)", 2, '', 0] call menuItemFormatter; @@ -130,7 +134,7 @@ if(support_helotaxi_available) then { }; if(support_boattaxi_available) then { - _text = ["Boat taxi (1 CP)", 3, '_null = [getpos player,10] execVM ""support\taxi\boattaxi.sqf""', 1] call menuItemFormatter; + _text = ["Boat taxi (1 CP)", 3, '_null = [getpos player,10] spawn duws_fnc_boatTaxi', 1] call menuItemFormatter; _transportItems pushBack _text; } else { _text = ["Boat taxi (N/A)", 3, '', 0] call menuItemFormatter; diff --git a/source/enterlocation.sqf b/source/functions/generic/fn_enterlocation.sqf similarity index 74% rename from source/enterlocation.sqf rename to source/functions/generic/fn_enterlocation.sqf index 5d5f732..1850978 100644 --- a/source/enterlocation.sqf +++ b/source/functions/generic/fn_enterlocation.sqf @@ -1,5 +1,4 @@ -_place = _this select 0; -_trigger = _this select 1; +params ["_place","_trigger"]; sleep 0.5; diff --git a/source/dialog/hc_init.sqf b/source/functions/generic/fn_hc_init.sqf similarity index 100% rename from source/dialog/hc_init.sqf rename to source/functions/generic/fn_hc_init.sqf diff --git a/source/mapsize.sqf b/source/functions/generic/fn_mapsize.sqf similarity index 95% rename from source/mapsize.sqf rename to source/functions/generic/fn_mapsize.sqf index a4fc71c..8a76d3d 100644 --- a/source/mapsize.sqf +++ b/source/functions/generic/fn_mapsize.sqf @@ -1,5 +1,4 @@ -_unit = _this select 0; -_debug = _this select 1; +params ["_unit","_debug"]; private ["_grid_size"]; disableserialization; diff --git a/source/musicloop.sqf b/source/functions/generic/fn_musicloop.sqf similarity index 100% rename from source/musicloop.sqf rename to source/functions/generic/fn_musicloop.sqf diff --git a/source/random_name.sqf b/source/functions/generic/fn_random_name.sqf similarity index 99% rename from source/random_name.sqf rename to source/functions/generic/fn_random_name.sqf index f0ebb25..3e0f439 100644 --- a/source/random_name.sqf +++ b/source/functions/generic/fn_random_name.sqf @@ -1,4 +1,4 @@ -_length = _this select 0; +params ["_length"]; _operation = "Operation "; _first = "--blank--"; diff --git a/source/random_veh.sqf b/source/functions/generic/fn_random_veh.sqf similarity index 88% rename from source/random_veh.sqf rename to source/functions/generic/fn_random_veh.sqf index 827311a..1fd42cf 100644 --- a/source/random_veh.sqf +++ b/source/functions/generic/fn_random_veh.sqf @@ -3,10 +3,7 @@ //hasDriver = 1; //canFloat = 0; -_faction = _this select 0; -_vehClass = _this select 1; -_position = _this select 2; -_radius = _this select 3; +params ["_faction","_vehClass","_position","_radius"]; _cfgVehicles = configFile >> "CfgVehicles"; _totalentries = count _cfgVehicles; // GO INTO CFGVEHICLES AND CHECK NUMBER OF ENTRIES @@ -27,12 +24,13 @@ while {!_found} do { _actual_faction = getText (_checked_veh >> "faction"); _scope = getNumber (_checked_veh >> "scope"); // check if actually present in editor _simulation_paracheck = getText (_checked_veh >> "simulation"); // check if not a parachute + _artilleryScanner = getNumber (_checked_veh >> "artilleryScanner"); //Check if it is an artillery unit if (_actual_vehclass == _vehClass && _actual_faction == _faction && _scope != 0 && _simulation_paracheck != "parachute" - && _classname != "O_MBT_02_arty_F") exitWith { + && _artilleryScanner == 0) exitWith { //hintSilent format["%1",_classname]; //_veh = createVehicle [_classname, _position, [], 0, _vehClass]; @@ -45,7 +43,7 @@ while {!_found} do { // DETERMINE LA FACTION _side = EAST; if(_faction=="BLU_F") then {_side=WEST}; -if(_faction=="OPF_F") then {_side=EAST}; +if(_faction==Opfor_Faction) then {_side=EAST}; if(_faction=="IND_F") then {_side=RESISTANCE}; if(_faction=="CIV_F") then {_side=CIVILIAN}; diff --git a/source/repetitive_cleanup.sqf b/source/functions/generic/fn_repetitive_cleanup.sqf similarity index 98% rename from source/repetitive_cleanup.sqf rename to source/functions/generic/fn_repetitive_cleanup.sqf index a810a7c..e7a2d14 100644 --- a/source/repetitive_cleanup.sqf +++ b/source/functions/generic/fn_repetitive_cleanup.sqf @@ -17,6 +17,8 @@ 10*60, // seconds to deleted planted explosives (0 means don't delete) 0 // seconds to delete dropped smokes/chemlights (0 means don't delete) ] execVM 'repetitive_cleanup.sqf'; + + //NOTE! This has been turned into a function. Use spawn duws_fnc_repetitive_cleanup will delete dead bodies after 60 seconds (1 minute) will delete dead vehicles after 5*60 seconds (5 minutes) diff --git a/source/dialog/request.sqf b/source/functions/generic/fn_request.sqf similarity index 88% rename from source/dialog/request.sqf rename to source/functions/generic/fn_request.sqf index 767d737..e84a80f 100644 --- a/source/dialog/request.sqf +++ b/source/functions/generic/fn_request.sqf @@ -5,7 +5,7 @@ ctrlSetText [1001, format["%1",zoneundercontrolblu]]; ctrlSetText [1002, format["%1",WARCOM_blufor_ap]]; // UNITS -_index = lbAdd [2100, "Rifleman(2CP)"]; // 0 +/*_index = lbAdd [2100, "Rifleman(2CP)"]; // 0 _index = lbAdd [2100, "Grenadier(3CP)"]; // 1 _index = lbAdd [2100, "Automatic Rifleman(3CP)"]; // 2 _index = lbAdd [2100, "AT Rifleman(3CP)"]; // 3 @@ -17,12 +17,19 @@ _index = lbAdd [2100, "SF Diver(3CP)"]; // 8 _index = lbAdd [2100, "Marksman(3CP)"]; // 9 _index = lbAdd [2100, "Sniper(4CP)"]; // 10 _index = lbAdd [2100, "Spotter(3CP)"]; // 11 -_index = lbAdd [2100, "Explosive specialist(4CP)"]; // 12 +_index = lbAdd [2100, "Explosive specialist(4CP)"]; // 12*/ + +{ + _unit = _x select 0; + _cost = _x select 1; + _displayName = getText (configfile >> "CfgVehicles" >> _unit >> "displayName"); + lbAdd [2100, format ["%1 (%2 CP)",_displayName,_cost]]; +} forEach blufor_unit_array; lbSetCurSel [2100, 0]; // SQUADS -_index0 = lbAdd [2101, "Fireteam(8CP)"]; // 0 +/*_index0 = lbAdd [2101, "Fireteam(8CP)"]; // 0 _index0 = lbAdd [2101, "Rifle Squad(16CP)"]; // 1 _index0 = lbAdd [2101, "Weapons Squad(18CP)"]; // 2 _index0 = lbAdd [2101, "AT Team(12CP)"]; // 3 @@ -33,11 +40,18 @@ _index0 = lbAdd [2101, "Divers Team(12CP)"]; // 7 _index0 = lbAdd [2101, "Sniper Team(8CP)"]; // 8 _index0 = lbAdd [2101, "Medical Team(10CP)"]; // 9 _index0 = lbAdd [2101, "Motorized scouts(28CP)"]; // 10 -_index0 = lbAdd [2101, "Mechanized squad(46CP)"]; // 11 +_index0 = lbAdd [2101, "Mechanized squad(46CP)"]; // 11*/ +{ + _cfgGroup = _x select 1; + _cost = _x select 0; + _displayName = [_cfgGroup, "name"] call BIS_fnc_returnConfigEntry; + lbAdd [2101, format ["%1 (%2 CP)",_displayName,_cost]]; +} forEach blufor_cfgGroup_array; + lbSetCurSel [2101, 0]; // VEHICLES -_index1 = lbAdd [2102, "Small Transport Truck 1 (seats 6 - 4CP)"]; // 0 +/*_index1 = lbAdd [2102, "Small Transport Truck 1 (seats 6 - 4CP)"]; // 0 _index1 = lbAdd [2102, "Small Transport Truck 2 (seats 9 - 6CP)"]; // 1 _index1 = lbAdd [2102, "Prowler Unarmed (5CP)"]; // 2 _index1 = lbAdd [2102, "Prowler Armed (13CP)"]; // 3 @@ -76,7 +90,14 @@ _index1 = lbAdd [2102, "Blackfish Armed (60CP)"]; // 35 _index1 = lbAdd [2102, "Black Wasp II (50CP)"]; // 36 _index1 = lbAdd [2102, "Black Wasp II (Stealth) (60CP)"]; // 37 _index1 = lbAdd [2102, "Rhino MGS (40CP)"]; // 38 -_index1 = lbAdd [2102, "Rhino MGS UP (42CP)"]; // 39 +_index1 = lbAdd [2102, "Rhino MGS UP (42CP)"]; // 39*/ +{ + _vehicle = _x select 1; + _cost = _x select 0; + _displayName = getText (configfile >> "CfgVehicles" >> _vehicle >> "displayName"); + lbAdd [2102, format ["%1 (%2 CP)",_displayName,_cost]]; +} forEach blufor_vehicle_array; + lbSetCurSel [2102, 0]; // Supports !!! CHECK TO ADD AT INIT diff --git a/source/dialog/request_squad.sqf b/source/functions/generic/fn_request_squad.sqf similarity index 99% rename from source/dialog/request_squad.sqf rename to source/functions/generic/fn_request_squad.sqf index b559cd4..349664e 100644 --- a/source/dialog/request_squad.sqf +++ b/source/functions/generic/fn_request_squad.sqf @@ -6,8 +6,10 @@ _index = lbCurSel 2101; _spawnPos = [getpos hq_blu1, 80, 250, 20, 0, 20, 0] call BIS_fnc_findSafePos; _spawnPos = [(_spawnPos select 0)+15, _spawnPos select 1]; -switch (_index) do -{ +switch (_index) do requestGroupCases; + + +/*{ case 0: { _cost = 8; _grouptype = (configFile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam"); @@ -188,5 +190,5 @@ switch (_index) do hint "Not enough command points"; }; }; -}; +};*/ publicVariable "commandpointsblu1"; diff --git a/source/dialog/request_support.sqf b/source/functions/generic/fn_request_support.sqf similarity index 97% rename from source/dialog/request_support.sqf rename to source/functions/generic/fn_request_support.sqf index ffdf307..7951a65 100644 --- a/source/dialog/request_support.sqf +++ b/source/functions/generic/fn_request_support.sqf @@ -83,9 +83,9 @@ switch (_index2) do { ctrlSetText [1000, format["%1",commandpointsblu1]]; lbSetColor [2103, index_support_armory, [0, 1, 0, 1]]; support_armory_available = true; - hq_blu1 addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; + hq_blu1 addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; { - _x addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; + _x addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; } forEach (Array_of_FOBS); playSound "loadgun"; @@ -103,7 +103,7 @@ switch (_index2) do { if (!support_PFLIR_available) then { commandpointsblu1 = commandpointsblu1 - 20; ctrlSetText [1000, format["%1",commandpointsblu1]]; - pFLIRenable = player addaction ["Activate FLIR","pflir\livefeed.sqf","", 0,false,true,"","_target == _this"]; + pFLIRenable = player addaction ["Activate FLIR",{_this spawn duws_fnc_livefeed},"", 0,false,true,"","_target == _this"]; lbSetColor [2103, index_support_pFLIR, [0, 1, 0, 1]]; support_pflir_available = true; playSound "loadgun"; diff --git a/source/dialog/request_unit.sqf b/source/functions/generic/fn_request_unit.sqf similarity index 81% rename from source/dialog/request_unit.sqf rename to source/functions/generic/fn_request_unit.sqf index 6f545ed..d50c260 100644 --- a/source/dialog/request_unit.sqf +++ b/source/functions/generic/fn_request_unit.sqf @@ -4,14 +4,16 @@ _skill = (blufor_ai_skill select 0)+0.2; _skillSF = (blufor_ai_skill select 0)+0.5; _spawnpos = [(getpos hq_blu1 select 0)-8, (getpos hq_blu1 select 1)-3.5]; -switch (_index) do { +switch (_index) do requestUnitCases; + +/*{ case 0: { if (commandpointsblu1 >= 2) then { hint "Unit ready !"; commandpointsblu1 = commandpointsblu1 - 2; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_Soldier_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_Rifleman createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -22,7 +24,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 3; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_Soldier_GL_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_Grenadier createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -33,7 +35,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 3; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_Soldier_AR_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_Autorifleman createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -44,7 +46,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 3; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_Soldier_LAT_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_Rifleman_AT createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -55,7 +57,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 4; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_medic_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_Medic createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -66,7 +68,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 4; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_soldier_AA_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_AA_Specialist createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -77,7 +79,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 4; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_soldier_repair_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_Repair_Specialist createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -88,7 +90,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 4; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_soldier_AT_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_AT_Specialist createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -99,7 +101,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 3; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_diver_F" createUnit [_spawnpos, _group, "", _skillSF, "private"] ; + Blufor_diver createUnit [_spawnpos, _group, "", _skillSF, "private"] ; } else { hint "Not enough command points"; }; @@ -110,7 +112,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 3; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_soldier_M_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_Marksman createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; @@ -121,7 +123,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 4; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_sniper_F" createUnit [_spawnpos, _group, "", _skillSF, "private"] ; + Blufor_sniper createUnit [_spawnpos, _group, "", _skillSF, "private"] ; } else { hint "Not enough command points"; }; @@ -132,7 +134,7 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 3; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_spotter_F" createUnit [_spawnpos, _group, "", _skillSF, "private"] ; + Blufor_spotter createUnit [_spawnpos, _group, "", _skillSF, "private"] ; } else { hint "Not enough command points"; }; @@ -143,12 +145,12 @@ switch (_index) do { commandpointsblu1 = commandpointsblu1 - 4; ctrlSetText [1000, format["%1",commandpointsblu1]]; _group = group player ; - "B_soldier_exp_F" createUnit [_spawnpos, _group, "", _skill, "private"] ; + Blufor_Explosive_Specialist createUnit [_spawnpos, _group, "", _skill, "private"] ; } else { hint "Not enough command points"; }; }; -}; +};*/ //hint format["AI skill: %1",_skill]; publicVariable "commandpointsblu1"; diff --git a/source/functions/generic/fn_request_vehicle.sqf b/source/functions/generic/fn_request_vehicle.sqf new file mode 100644 index 0000000..9da87f4 --- /dev/null +++ b/source/functions/generic/fn_request_vehicle.sqf @@ -0,0 +1,137 @@ +diag_log "DUWS-R: dialog/request_vehicle.sqf running..."; + +_index = lbCurSel 2102; + +//findEmptyPosition example +_spawnPos = (getpos hq_blu1) findEmptyPosition [20, 70]; +_spawnPos = [(_spawnPos select 0)+30, _spawnPos select 1]; + +vehic = nil; + +switch (_index) do requestVehicleCases; + +/*{ + case 0: { // Small Truck 1 + [4, "I_G_Offroad_01_F"] call duws_fnc_spawnVehicle; + }; + case 1: { // Small Truck 2 + [6, "I_G_Van_01_transport_F"] call duws_fnc_spawnVehicle; + }; + case 2: { // Prowler Unarmed + [5, "B_T_LSV_01_unarmed_F"] call duws_fnc_spawnVehicle; + }; + case 3: { // Prowler Armed + [13, "B_T_LSV_01_armed_F"] call duws_fnc_spawnVehicle; + }; + case 4: { // Hunter Unarmed + [5, "B_MRAP_01_F"] call duws_fnc_spawnVehicle; + }; + case 5: { // Hunter HMG + [18, "B_MRAP_01_hmg_F"] call duws_fnc_spawnVehicle; + }; + case 6: { // Hunter GMG + [25, "B_MRAP_01_gmg_F"] call duws_fnc_spawnVehicle; + }; + case 7: { // Marshall + [35, "B_APC_Wheeled_01_cannon_F"] call duws_fnc_spawnVehicle; + }; + case 8: { //HEMETT Transport Covered + [8, Blufor_Truck_Covered] call duws_fnc_spawnVehicle; + }; + case 9: { // Pawnee + [25, "B_Heli_Light_01_armed_F"] call duws_fnc_spawnVehicle; + }; + case 10: { // Blackfoot + [45, "B_Heli_Attack_01_F"] call duws_fnc_spawnVehicle; + }; + case 11: { // HummingBird + [15, "B_Heli_Light_01_F"] call duws_fnc_spawnVehicle; + }; + case 12: { // M-900 Civ. + [12, "C_Heli_Light_01_civil_F"] call duws_fnc_spawnVehicle; + }; + case 13: { // Taru Empty + [18, "O_Heli_Transport_04_F"] call duws_fnc_spawnVehicle; + }; + case 14: { // GhostHawk + [22, "B_Heli_Transport_01_F"] call duws_fnc_spawnVehicle; + }; + case 15: { // Huron + [26, "B_Heli_Transport_03_F"] call duws_fnc_spawnVehicle; + }; + case 16: { // Panther IFV + [25, "B_APC_Tracked_01_rcws_F"] call duws_fnc_spawnVehicle; + }; + case 17: { // ATV Quad + [1, "B_Quadbike_01_F"] call duws_fnc_spawnVehicle; + }; + case 18: { // Cheetah AA + [30, "B_APC_Tracked_01_AA_F"] call duws_fnc_spawnVehicle; + }; + case 19: { // Slammer + [40, "B_MBT_01_cannon_F"] call duws_fnc_spawnVehicle; + }; + case 20: { // Bobcat + [28, "B_APC_Tracked_01_CRV_F"] call duws_fnc_spawnVehicle; + }; + case 21: { // SF SUV + [2, "C_Offroad_01_F"] call duws_fnc_spawnVehicle; + }; + case 22: { // MLRS Artillery + [75, "B_MBT_01_mlrs_F"] call duws_fnc_spawnVehicle; + }; + case 23: { // Scorcher Artillery + [75, "B_MBT_01_arty_F"] call duws_fnc_spawnVehicle; + }; + case 24: { // Fuel Truck (van) + [10, "B_G_Van_01_fuel_F"] call duws_fnc_spawnVehicle; + }; + case 25: { // Wipeout CAS + [45, "B_Plane_CAS_01_F"] call duws_fnc_spawnVehicle; + }; + case 26: { // Slammer Urban Purpose + [40, "B_MBT_01_TUSK_F"] call duws_fnc_spawnVehicle; + }; + case 27: { // Stomper RCWS + [20, "B_UGV_01_rcws_F"] call duws_fnc_spawnVehicle; + }; + case 28: { // Stomper Scout + [10, "B_UGV_01_F"] call duws_fnc_spawnVehicle; + }; + case 29: { // Greyhawk ATG + [15, "B_UAV_02_F"] call duws_fnc_spawnVehicle; + }; + case 30: { // Greyhawk CAS + [15, "B_UAV_02_CAS_F"] call duws_fnc_spawnVehicle; + }; + case 31: { // MQ-12 Falcon + [60, "B_T_UAV_03_F"] call duws_fnc_spawnVehicle; + }; + case 32: { // Darter UAV + [5, "B_UAV_01_F"] call duws_fnc_spawnVehicle; + }; + case 33: { // Blackfish (Infantry) + [40, "B_T_VTOL_01_infantry_F"] call duws_fnc_spawnVehicle; + }; + case 34: { // Blackfish (Vehicle) + [45, "B_T_VTOL_01_vehicle_F"] call duws_fnc_spawnVehicle; + }; + case 35: { // Blackfish (Armed) + [60, "B_T_VTOL_01_armed_F"] call duws_fnc_spawnVehicle; + }; + case 36: { //WASP + [50, "B_Plane_Fighter_01_F"] call duws_fnc_spawnVehicle; + }; + case 37: { //WASP (Stealth) + [60, "B_Plane_Fighter_01_Stealth_F"] call duws_fnc_spawnVehicle; + }; + case 38: { //Rhino (Stealth) + [38, "B_AFV_Wheeled_01_cannon_F"] call duws_fnc_spawnVehicle; + }; + case 39: { //Rhino UP (Stealth) + [42, "B_AFV_Wheeled_01_up_cannon_F"] call duws_fnc_spawnVehicle; + }; +};*/ +vehic = nil; +publicVariable "commandpointsblu1"; +//hint format["index: %1",_index]; diff --git a/source/savegame.sqf b/source/functions/generic/fn_savegame.sqf similarity index 87% rename from source/savegame.sqf rename to source/functions/generic/fn_savegame.sqf index e24ff57..c6d113e 100644 --- a/source/savegame.sqf +++ b/source/functions/generic/fn_savegame.sqf @@ -12,5 +12,5 @@ if (isServer) then { publicVariable "savegameNumber"; sleep 2; - [] execVM "misc\bottom_right_message.sqf"; + [] call duws_fnc_bottom_right_message; }; \ No newline at end of file diff --git a/source/savegameClient.sqf b/source/functions/generic/fn_savegameClient.sqf similarity index 100% rename from source/savegameClient.sqf rename to source/functions/generic/fn_savegameClient.sqf diff --git a/source/dialog/spawnVehicle.sqf b/source/functions/generic/fn_spawnVehicle.sqf similarity index 95% rename from source/dialog/spawnVehicle.sqf rename to source/functions/generic/fn_spawnVehicle.sqf index 6a3edf2..860ad32 100644 --- a/source/dialog/spawnVehicle.sqf +++ b/source/functions/generic/fn_spawnVehicle.sqf @@ -1,5 +1,4 @@ -_requiredPoints = _this select 0; -_vehicleType = _this select 1; +params ["_requiredPoints","_vehicleType"]; if (commandpointsblu1 >= _requiredPoints) then { commandpointsblu1 = commandpointsblu1 - _requiredPoints; diff --git a/source/functions/generic/fn_zones_bonus.sqf b/source/functions/generic/fn_zones_bonus.sqf new file mode 100644 index 0000000..94ca4aa --- /dev/null +++ b/source/functions/generic/fn_zones_bonus.sqf @@ -0,0 +1,7 @@ +waitUntil {zoneundercontrolblu >= 1}; +sleep 20; +[player,"fob_support"] remoteExecCall ["BIS_fnc_addCommMenuItem", 0, true]; +//_sitrep = [player,"fob_support"] call BIS_fnc_addCommMenuItem; +["info",["Establishing a FOB","Check the briefing for more info (RTI Manual)"]] remoteExecCall ["bis_fnc_showNotification", 0, true]; +//["info",["Establishing a FOB","Check the briefing for more info (RTI Manual)"]] call bis_fnc_showNotification; +sleep 2; \ No newline at end of file diff --git a/source/zonesundercontrol.sqf b/source/functions/generic/fn_zonesundercontrol.sqf similarity index 100% rename from source/zonesundercontrol.sqf rename to source/functions/generic/fn_zonesundercontrol.sqf diff --git a/source/dialog/info/info.sqf b/source/functions/info/fn_info.sqf similarity index 100% rename from source/dialog/info/info.sqf rename to source/functions/info/fn_info.sqf diff --git a/source/initHQ/BluHQinit.sqf b/source/functions/initHQ/fn_BluHQinit.sqf similarity index 81% rename from source/initHQ/BluHQinit.sqf rename to source/functions/initHQ/fn_BluHQinit.sqf index bbce22a..3e08228 100644 --- a/source/initHQ/BluHQinit.sqf +++ b/source/functions/initHQ/fn_BluHQinit.sqf @@ -1,4 +1,5 @@ -_hqblu = _this select 0; +params ["_hqblu"]; + blu_hq_created = true; PosOfBLUHQ = _hqblu; publicVariable "PosOfBLUHQ"; @@ -22,7 +23,7 @@ _trg5=createTrigger["EmptyDetector",_hqblu]; _trg5 triggerAttachVehicle [player]; _trg5 setTriggerArea[100,100,0,false]; _trg5 setTriggerActivation["VEHICLE","PRESENT",true]; -_trg5 setTriggerStatements["this", format["[""%1"",thislist] execvm 'enterlocation.sqf'",'Main Base'], ""]; +_trg5 setTriggerStatements["this", format["[""%1"",thislist] spawn duws_fnc_enterlocation",'Main Base'], ""]; // warning trigger when an enemy approaches the camp _trgWarning=createTrigger["EmptyDetector",_hqblu]; @@ -32,22 +33,23 @@ _trgWarning setTriggerStatements["this","[west, ""PAPA_BEAR""] sidechat 'This is // CREATE THE OFFICER _group = createGroup west; -_hq = _group createUnit ["b_officer_f",(getmarkerpos str(blu_hq_markername)), [], 0, "FORM"]; +_hq = _group createUnit [Blufor_Officer,(getmarkerpos str(blu_hq_markername)), [], 0, "FORM"]; hq_blu1 = _hq; publicVariable "hq_blu1"; _hq setpos [_hqblu select 0, _hqblu select 1, 0.59]; _hq disableAI "AUTOTARGET"; -_hq setdir 0; +_hq disableAI "MOVE"; removeallweapons _hq; -_hq switchMove "acts_StandingSpeakingUnarmed"; -_handle = [_hq] execVM "sounds\radiochatter.sqf"; +[_hq] spawn duws_fnc_commanderAnim; +_hq setdir 270; +_handle = [_hq] spawn duws_fnc_radiochatter; //_drawicon = [] execVM "inithq\drawIcon.sqf"; // create the icon //GUARDS -_handle = [(getpos hq_blu1), _hq] execVM "initHQ\guards.sqf"; +_handle = [(getpos hq_blu1), _hq] call duws_fnc_guards; //STATIC DEFENSES -_handle = [(getpos hq_blu1), _hq] execVM "initHQ\fortify.sqf"; +_handle = [(getpos hq_blu1), _hq] spawn duws_fnc_fortify; // IF THE OFFICER IS DEAD -- BEGIN OF "SPAWN" [_hq] spawn { @@ -60,8 +62,8 @@ _handle = [(getpos hq_blu1), _hq] execVM "initHQ\fortify.sqf"; }; //CREATE PATROL -_handle = [getpos hq_blu1] execVM "initHQ\guardsHQ.sqf"; -_handle = [getpos hq_blu1] execVM "initHQ\guardsHQ.sqf"; +[getpos hq_blu1] call duws_fnc_guardsHQ; +[getpos hq_blu1] call duws_fnc_guardsHQ; // IF THE OFFICER IS DEAD -- End OF "SPAWN" @@ -81,13 +83,13 @@ if (!zones_manually_placed) then { // SHOW THE STARTUP MENU if (!zones_created) then { sleep 0.1; - _nill = [] execVM "dialog\startup\startup.sqf"; + [] spawn duws_fnc_startup; waitUntil {chosen_settings}; // WAIT UNTIL THE PLAYER HAS CHOSEN THE SETTINGS }; // WEATHER INIT if (dynamic_weather_enable) then { - _weather_script = [] execVM "dialog\startup\weather.sqf"; + _weather_script = [] spawn duws_fnc_weather; }; // CALL ZONES GENERATION diff --git a/source/functions/initHQ/fn_HQaddactions.sqf b/source/functions/initHQ/fn_HQaddactions.sqf new file mode 100644 index 0000000..dbdce2a --- /dev/null +++ b/source/functions/initHQ/fn_HQaddactions.sqf @@ -0,0 +1,15 @@ +params ["_hq"]; + +_hq addaction ["Player stats",{_this spawn duws_fnc_info}, "", 0, true, true, "", "_this == player"]; +_hq addaction ["Request units",{_this call duws_fnc_request}, "", 0, true, true, "", "_this == player"]; +_hq addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; +_hq addaction ["FOB manager",{_this spawn duws_fnc_fobmanageropen}, "", 0, true, true, "", "_this == player"]; +if (isServer) then { + _hq addaction ["Rest (wait/save)", {[]spawn duws_fnc_savegame}, "", 0, true, true, "", "_this == player"]; +}; + +if (!isServer) then { + _hq addaction ["Rest",{[] spawn duws_fnc_savegameClient}, "", 0, true, true, "", "_this == player"]; +}; + +_hq addaction ["RESET SQUAD LEADER",{[] call duws_fnc_groupReset}, "", 0, true, true, "", "_this == player"]; diff --git a/source/functions/initHQ/fn_commanderAnim.sqf b/source/functions/initHQ/fn_commanderAnim.sqf new file mode 100644 index 0000000..0e64cb5 --- /dev/null +++ b/source/functions/initHQ/fn_commanderAnim.sqf @@ -0,0 +1,6 @@ +params ["_unit"]; +private _animations = ["HubBriefing_lookAround1","HubBriefing_lookAround2","HubBriefing_scratch","HubBriefing_stretch","HubBriefing_talkAround","HubBriefing_think"]; +while {alive _unit} do { + _unit switchMove selectRandom _animations; + sleep 15; +}; \ No newline at end of file diff --git a/source/initHQ/drawIcon.sqf b/source/functions/initHQ/fn_drawIcon.sqf similarity index 60% rename from source/initHQ/drawIcon.sqf rename to source/functions/initHQ/fn_drawIcon.sqf index cd8ce68..004526d 100644 --- a/source/initHQ/drawIcon.sqf +++ b/source/functions/initHQ/fn_drawIcon.sqf @@ -1,8 +1,7 @@ -DUWS_draw_icon_fnc = compile preprocessFile "initHQ\drawIconFnc.sqf"; while {alive hq_blu1} do { waitUntil {sleep 2; player distance hq_blu1 < 15}; - _addStackedEHfnc = ["draw_hq_icon", "onEachFrame", "DUWS_draw_icon_fnc"] call BIS_fnc_addStackedEventHandler; + _addStackedEHfnc = ["draw_hq_icon", "onEachFrame", "duws_fnc_drawIconFnc"] call BIS_fnc_addStackedEventHandler; sleep 0.1; waitUntil {sleep 0.2; player distance hq_blu1 > 15}; diff --git a/source/initHQ/drawIconFnc.sqf b/source/functions/initHQ/fn_drawIconFnc.sqf similarity index 100% rename from source/initHQ/drawIconFnc.sqf rename to source/functions/initHQ/fn_drawIconFnc.sqf diff --git a/source/initHQ/fobmanager.sqf b/source/functions/initHQ/fn_fobmanager.sqf similarity index 97% rename from source/initHQ/fobmanager.sqf rename to source/functions/initHQ/fn_fobmanager.sqf index a46c9e5..8d0e4d0 100644 --- a/source/initHQ/fobmanager.sqf +++ b/source/functions/initHQ/fn_fobmanager.sqf @@ -22,7 +22,7 @@ _index = -1; _fob_fobname = "FOB " + _fobname; _actual_array = [_fobpos, - {_handle = [_fobpos] execVM "initHQ\teleport.sqf";}, + {[_fobpos] call duws_fnc_teleport;}, _fob_fobname, format["Fast travel to %1",_fob_fobname], "", diff --git a/source/initHQ/fortify.sqf b/source/functions/initHQ/fn_fortify.sqf similarity index 77% rename from source/initHQ/fortify.sqf rename to source/functions/initHQ/fn_fortify.sqf index 683b280..e9eedab 100644 --- a/source/initHQ/fortify.sqf +++ b/source/functions/initHQ/fn_fortify.sqf @@ -1,52 +1,51 @@ -_centerPos = _this select 0; -_hq = _this select 1; +params ["_centerPos","_hq"]; _groupGuard = createGroup WEST; // AA on the roof -_aaPod = createVehicle ["B_static_AA_F", [0,0,0], [], 0, "NONE"]; +_aaPod = createVehicle [Blufor_AA_Static, [0,0,0], [], 0, "NONE"]; _aaPod allowdamage false; _aaPod setdamage 0; _aaPod setpos [_centerPos select 0, _centerPos select 1,(_centerPos select 2)+3.109]; -_hqGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 moveinGunner _aaPod; // GMG -_gl1Pod = createVehicle ["B_GMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_gl1Pod = createVehicle [Blufor_GMG_Static, [0,0,0], [], 0, "NONE"]; _gl1Pod allowdamage false; _gl1Pod setdamage 0; _gl1Pod setpos [(_centerPos select 0)-7, (_centerPos select 1)+5.5]; -_hqGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 moveinGunner _gl1Pod; // AT -_atPod1 = createVehicle ["B_static_AT_F", [0,0,0], [], 0, "NONE"]; +_atPod1 = createVehicle [Blufor_AT_Static, [0,0,0], [], 0, "NONE"]; _atPod1 setpos [(_centerPos select 0)-7, (_centerPos select 1)-8]; _atPod1 allowdamage false; _atPod1 setdamage 0; _atPod1 setdir 215; -_hqGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 moveinGunner _atPod1; // HMG -_atPod2 = createVehicle ["B_HMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_atPod2 = createVehicle [Blufor_HMG_Static, [0,0,0], [], 0, "NONE"]; _atPod2 allowdamage false; _atPod2 setdamage 0; _atPod2 setpos [(_centerPos select 0)+8, (_centerPos select 1)-7]; -_hqGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 moveinGunner _atPod2; // GMG -_atPod3 = createVehicle ["B_GMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_atPod3 = createVehicle [Blufor_GMG_Static, [0,0,0], [], 0, "NONE"]; _atPod3 allowdamage false; _atPod3 setdamage 0; _atPod3 setpos [(_centerPos select 0)+7, (_centerPos select 1)+8]; -_hqGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 moveinGunner _atPod3; // LIGHTS @@ -112,4 +111,4 @@ _light8 allowdamage true; _light9 allowdamage true; -_hq addAction ["Replace Defences (20CP)", "initHQ\refortify.sqf", [_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _hq], 0, true, true, "", "_this == player"]; \ No newline at end of file +_hq addAction ["Replace Defences (20CP)", {_this call duws_fnc_refortify}, [_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _hq], 0, true, true, "", "_this == player"]; \ No newline at end of file diff --git a/source/initHQ/fortifyFOB.sqf b/source/functions/initHQ/fn_fortifyFOB.sqf similarity index 72% rename from source/initHQ/fortifyFOB.sqf rename to source/functions/initHQ/fn_fortifyFOB.sqf index 8916fba..99c7f58 100644 --- a/source/initHQ/fortifyFOB.sqf +++ b/source/functions/initHQ/fn_fortifyFOB.sqf @@ -1,7 +1,7 @@ -_centerPos = (_this select 3) select 0; -_actionID = _this select 2; -_object = _this select 0; -_fob = (_this select 3) select 1; +params ["_object","_caller","_actionId", "_arguments"]; + +_centerPos = _arguments select 0; +_fob = _arguments select 1; aliveAllUnits = {alive _x} count allunits; if (commandpointsblu1 < 4) exitWith {hint "You don't have enough Command Points"}; @@ -17,49 +17,49 @@ playSound "loadgun"; _groupGuard = createGroup WEST; // AA on the roof -_aaPod = createVehicle ["B_static_AA_F", [0,0,0], [], 0, "NONE"]; +_aaPod = createVehicle [Blufor_AA_Static, [0,0,0], [], 0, "NONE"]; _aaPod allowdamage false; _aaPod setdamage 0; _aaPod setpos [_centerPos select 0, _centerPos select 1,(_centerPos select 2)+3.109]; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _aaPod; // GMG -_gl1Pod = createVehicle ["B_GMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_gl1Pod = createVehicle [Blufor_GMG_Static, [0,0,0], [], 0, "NONE"]; _gl1Pod allowdamage false; _gl1Pod setdamage 0; _gl1Pod setpos [(_centerPos select 0)-7, (_centerPos select 1)+5.5]; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _gl1Pod; // AT -_atPod1 = createVehicle ["B_static_AT_F", [0,0,0], [], 0, "NONE"]; +_atPod1 = createVehicle [Blufor_AT_Static, [0,0,0], [], 0, "NONE"]; _atPod1 setpos [(_centerPos select 0)-7, (_centerPos select 1)-8]; _atPod1 allowdamage false; _atPod1 setdamage 0; _atPod1 setdir 215; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _atPod1; // HMG -_atPod2 = createVehicle ["B_HMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_atPod2 = createVehicle [Blufor_HMG_Static, [0,0,0], [], 0, "NONE"]; _atPod2 allowdamage false; _atPod2 setdamage 0; _atPod2 setpos [(_centerPos select 0)+8, (_centerPos select 1)-7]; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _atPod2; // GMG -_atPod3 = createVehicle ["B_GMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_atPod3 = createVehicle [Blufor_GMG_Static, [0,0,0], [], 0, "NONE"]; _atPod3 allowdamage false; _atPod3 setdamage 0; _atPod3 setpos [(_centerPos select 0)+7, (_centerPos select 1)+8]; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _atPod3; // LIGHTS @@ -100,4 +100,4 @@ _light3 allowdamage true; _light4 allowdamage true; _light5 allowdamage true; -_fob addAction ["Replace FOB Defences (15CP)", "initHQ\refortifyFOB.sqf", [_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _fob], 0, true, true, "", "_this == player"]; \ No newline at end of file +_fob addAction ["Replace FOB Defences (15CP)", {_this call duws_fnc_refortifyFOB}, [_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _fob], 0, true, true, "", "_this == player"]; \ No newline at end of file diff --git a/source/initHQ/fortifyFOB2.sqf b/source/functions/initHQ/fn_fortifyFOB2.sqf similarity index 71% rename from source/initHQ/fortifyFOB2.sqf rename to source/functions/initHQ/fn_fortifyFOB2.sqf index e7c0960..23dfa72 100644 --- a/source/initHQ/fortifyFOB2.sqf +++ b/source/functions/initHQ/fn_fortifyFOB2.sqf @@ -1,52 +1,54 @@ +params ["_centerPos","_fob"]; + _centerPos = _this select 0; _fob = _this select 1; _groupGuard = createGroup WEST; // AA on the roof -_aaPod = createVehicle ["B_static_AA_F", [0,0,0], [], 0, "NONE"]; +_aaPod = createVehicle [Blufor_AA_Static, [0,0,0], [], 0, "NONE"]; _aaPod allowdamage false; _aaPod setdamage 0; _aaPod setpos [_centerPos select 0, _centerPos select 1,(_centerPos select 2)+3.109]; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _aaPod; // GMG -_gl1Pod = createVehicle ["B_GMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_gl1Pod = createVehicle [Blufor_GMG_Static, [0,0,0], [], 0, "NONE"]; _gl1Pod allowdamage false; _gl1Pod setdamage 0; _gl1Pod setpos [(_centerPos select 0)-7, (_centerPos select 1)+5.5]; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _gl1Pod; // AT -_atPod1 = createVehicle ["B_static_AT_F", [0,0,0], [], 0, "NONE"]; +_atPod1 = createVehicle [Blufor_AT_Static, [0,0,0], [], 0, "NONE"]; _atPod1 setpos [(_centerPos select 0)-7, (_centerPos select 1)-8]; _atPod1 allowdamage false; _atPod1 setdamage 0; _atPod1 setdir 215; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _atPod1; // HMG -_atPod2 = createVehicle ["B_HMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_atPod2 = createVehicle [Blufor_HMG_Static, [0,0,0], [], 0, "NONE"]; _atPod2 allowdamage false; _atPod2 setdamage 0; _atPod2 setpos [(_centerPos select 0)+8, (_centerPos select 1)-7]; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _atPod2; // GMG -_atPod3 = createVehicle ["B_GMG_01_high_F", [0,0,0], [], 0, "NONE"]; +_atPod3 = createVehicle [Blufor_GMG_Static, [0,0,0], [], 0, "NONE"]; _atPod3 allowdamage false; _atPod3 setdamage 0; _atPod3 setpos [(_centerPos select 0)+7, (_centerPos select 1)+8]; -_fobGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_fobGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _fobGuard1 moveinGunner _atPod3; // LIGHTS @@ -87,4 +89,4 @@ _light3 allowdamage true; _light4 allowdamage true; _light5 allowdamage true; -_fob addAction ["Replace FOB Defences (15CP)", "initHQ\refortifyFOB.sqf", [_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _fob], 0, true, true, "", "_this == player"]; \ No newline at end of file +_fob addAction ["Replace FOB Defences (15CP)", {_this call duws_fnc_refortifyFOB}, [_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _fob], 0, true, true, "", "_this == player"]; \ No newline at end of file diff --git a/source/initHQ/guards.sqf b/source/functions/initHQ/fn_guards.sqf similarity index 81% rename from source/initHQ/guards.sqf rename to source/functions/initHQ/fn_guards.sqf index df75393..c0ad4ad 100644 --- a/source/initHQ/guards.sqf +++ b/source/functions/initHQ/fn_guards.sqf @@ -1,31 +1,30 @@ -_centerPos = _this select 0; -_hq = _this select 1; +params ["_centerPos","_hq"]; // Create the guards _groupGuard = createGroup WEST; -_hqGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 setpos [(_centerPos select 0)-6.5, (_centerPos select 1)-1.6]; _hqGuard1 setdir 270; [_hqGuard1,"STAND","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard2 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard2 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard2 setpos [(_centerPos select 0)-6.5, (_centerPos select 1)-4.7]; _hqGuard2 setdir 270; [_hqGuard2,"STAND_IA","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard3 = _groupGuard createUnit ["B_Soldier_TL_F", _centerPos, [], 0, "FORM"]; +_hqGuard3 = _groupGuard createUnit [Blufor_Teamleader, _centerPos, [], 0, "FORM"]; _hqGuard3 setpos [(_centerPos select 0), (_centerPos select 1)-7.58]; _hqGuard3 setdir 180; [_hqGuard3,"LEAN","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard4 = _groupGuard createUnit ["B_Soldier_LAT_F", _centerPos, [], 0, "FORM"]; +_hqGuard4 = _groupGuard createUnit [Blufor_Rifleman_AT, _centerPos, [], 0, "FORM"]; _hqGuard4 setpos [(_centerPos select 0), (_centerPos select 1)-9]; _hqGuard4 setdir 0; [_hqGuard4,"STAND","FULL"] call BIS_fnc_ambientAnimCombat; // patrolling guard _groupPatrol = createGroup WEST; -_hqGuard5 = _groupPatrol createUnit ["B_Soldier_GL_F", _centerPos, [], 0, "FORM"]; +_hqGuard5 = _groupPatrol createUnit [Blufor_Grenadier, _centerPos, [], 0, "FORM"]; _hqGuard5 setpos [(_centerPos select 0)+10, (_centerPos select 1)+10]; _groupPatrol setCombatMode "YELLOW"; diff --git a/source/initHQ/guardsFOB.sqf b/source/functions/initHQ/fn_guardsFOB.sqf similarity index 80% rename from source/initHQ/guardsFOB.sqf rename to source/functions/initHQ/fn_guardsFOB.sqf index 5db39aa..adcfe32 100644 --- a/source/initHQ/guardsFOB.sqf +++ b/source/functions/initHQ/fn_guardsFOB.sqf @@ -1,32 +1,32 @@ -_centerPos = _this select 0; -_fob = _this select 1; -_size = 500; +params ["_centerPos","_fob","_size"]; + +if (isnil _size) then {_size = 500}; // Create the guards _groupGuard = createGroup WEST; -_hqGuard1 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 setpos [(_centerPos select 0)-6.5, (_centerPos select 1)-1.6]; _hqGuard1 setdir 270; [_hqGuard1,"STAND","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard2 = _groupGuard createUnit ["B_Soldier_F", _centerPos, [], 0, "FORM"]; +_hqGuard2 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard2 setpos [(_centerPos select 0)-6.5, (_centerPos select 1)-4.7]; _hqGuard2 setdir 270; [_hqGuard2,"WATCH","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard3 = _groupGuard createUnit ["B_Soldier_TL_F", _centerPos, [], 0, "FORM"]; +_hqGuard3 = _groupGuard createUnit [Blufor_Teamleader, _centerPos, [], 0, "FORM"]; _hqGuard3 setpos [(_centerPos select 0), (_centerPos select 1)-7.58]; _hqGuard3 setdir 180; [_hqGuard3,"LEAN","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard4 = _groupGuard createUnit ["B_Soldier_LAT_F", _centerPos, [], 0, "FORM"]; +_hqGuard4 = _groupGuard createUnit [Blufor_Rifleman_AT, _centerPos, [], 0, "FORM"]; _hqGuard4 setpos [(_centerPos select 0), (_centerPos select 1)-9]; _hqGuard4 setdir 0; [_hqGuard4,"STAND","FULL"] call BIS_fnc_ambientAnimCombat; // patrolling guard _groupPatrol = createGroup WEST; -_hqGuard5 = _groupPatrol createUnit ["B_Soldier_GL_F", _centerPos, [], 0, "FORM"]; +_hqGuard5 = _groupPatrol createUnit [Blufor_Grenadier, _centerPos, [], 0, "FORM"]; _hqGuard5 setpos [(_centerPos select 0)+10, (_centerPos select 1)+10]; _groupPatrol setCombatMode "YELLOW"; diff --git a/source/initHQ/guardsHQ.sqf b/source/functions/initHQ/fn_guardsHQ.sqf similarity index 84% rename from source/initHQ/guardsHQ.sqf rename to source/functions/initHQ/fn_guardsHQ.sqf index 4a02285..84aff62 100644 --- a/source/initHQ/guardsHQ.sqf +++ b/source/functions/initHQ/fn_guardsHQ.sqf @@ -1,7 +1,7 @@ -_centerPos = _this select 0; +params ["_centerPos"]; // patrolling guard -_groupPatrol = [ [(_centerPos select 0)+40, (_centerPos select 1)+40], WEST, ["B_Soldier_F","B_Soldier_F","B_Soldier_AT_F","B_engineer_F","B_medic_F","B_recon_F","B_Soldier_AT_F","B_Soldier_AA_F"],[],[],[0.6,0.8,0.7]] call BIS_fnc_spawnGroup; +_groupPatrol = [ [(_centerPos select 0)+40, (_centerPos select 1)+40], WEST, [Blufor_Rifleman,Blufor_Rifleman,Blufor_AT_Specialist,Blufor_Engineer,Blufor_Medic,Blufor_Recon_Scout,Blufor_AT_Specialist,Blufor_AA_Specialist],[],[],[0.6,0.8,0.7]] call BIS_fnc_spawnGroup; _groupPatrol setCombatMode "YELLOW"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+40, (_centerPos select 1)+40], 0]; diff --git a/source/initHQ/hq_radioloop.sqf b/source/functions/initHQ/fn_hq_radioloop.sqf similarity index 97% rename from source/initHQ/hq_radioloop.sqf rename to source/functions/initHQ/fn_hq_radioloop.sqf index 6a69ab5..cc1369a 100644 --- a/source/initHQ/hq_radioloop.sqf +++ b/source/functions/initHQ/fn_hq_radioloop.sqf @@ -1,4 +1,4 @@ -_object = _this select 0; +params ["_object"]; _music_list = [ "RadioAmbient1", "RadioAmbient2", diff --git a/source/initHQ/locatorhq.sqf b/source/functions/initHQ/fn_locatorhq.sqf similarity index 86% rename from source/initHQ/locatorhq.sqf rename to source/functions/initHQ/fn_locatorhq.sqf index a0b928d..e3cfc8e 100644 --- a/source/initHQ/locatorhq.sqf +++ b/source/functions/initHQ/fn_locatorhq.sqf @@ -6,4 +6,4 @@ while {!_found} do { if (_foundSafePos select 0 != 0 && _foundSafePos select 1 != 0) then {_found=true;}; }; player globalChat format ["foundSafePos: %1", _foundSafePos]; -_handle = [_foundSafePos] execVM "initHQ\bluHQinit.sqf"; \ No newline at end of file +_handle = [_foundSafePos] spawn duws_fnc_BluHQinit; \ No newline at end of file diff --git a/source/initHQ/refortify.sqf b/source/functions/initHQ/fn_refortify.sqf similarity index 63% rename from source/initHQ/refortify.sqf rename to source/functions/initHQ/fn_refortify.sqf index 8ef299a..f14f5ea 100644 --- a/source/initHQ/refortify.sqf +++ b/source/functions/initHQ/fn_refortify.sqf @@ -1,10 +1,12 @@ -_aaPod = (_this select 3) select 0; -_gl1Pod = (_this select 3) select 1; -_atPod1 = (_this select 3) select 2; -_atPod2 = (_this select 3) select 3; -_atPod3 = (_this select 3) select 4; -_centerPos = (_this select 3) select 5; -_hq = (_this select 3) select 6; +params ["_target", "_caller", "_actionId", "_arguments"]; + +_aaPod = _arguments select 0; +_gl1Pod = _arguments select 1; +_atPod1 = _arguments select 2; +_atPod2 = _arguments select 3; +_atPod3 = _arguments select 4; +_centerPos = _arguments select 5; +_hq = _arguments select 6; if (commandpointsblu1>20) then { commandpointsblu1 = commandpointsblu1 - 20; @@ -19,7 +21,7 @@ if (commandpointsblu1>20) then { {deletevehicle _x} foreach crew _atPod3 + [_atPod3]; (_this select 0) removeaction (_this select 2); - 0 = [_centerPos, _hq] execvm "initHQ\fortify.sqf"; + 0 = [_centerPos, _hq] spawn duws_fnc_fortify; } else { hint "Not enough Command Points (20CP required)"; }; \ No newline at end of file diff --git a/source/initHQ/refortifyFOB.sqf b/source/functions/initHQ/fn_refortifyFOB.sqf similarity index 62% rename from source/initHQ/refortifyFOB.sqf rename to source/functions/initHQ/fn_refortifyFOB.sqf index b07001d..9c12f64 100644 --- a/source/initHQ/refortifyFOB.sqf +++ b/source/functions/initHQ/fn_refortifyFOB.sqf @@ -1,10 +1,12 @@ -_aaPod = (_this select 3) select 0; -_gl1Pod = (_this select 3) select 1; -_atPod1 = (_this select 3) select 2; -_atPod2 = (_this select 3) select 3; -_atPod3 = (_this select 3) select 4; -_centerPos = (_this select 3) select 5; -_fob = (_this select 3) select 6; +params ["_target", "_caller", "_actionId", "_arguments"]; + +_aaPod = _arguments select 0; +_gl1Pod = _arguments select 1; +_atPod1 = _arguments select 2; +_atPod2 = _arguments select 3; +_atPod3 = _arguments select 4; +_centerPos = _arguments select 5; +_fob = _arguments select 6; if (commandpointsblu1>15) then { commandpointsblu1 = commandpointsblu1 - 15; @@ -19,7 +21,7 @@ if (commandpointsblu1>15) then { {deletevehicle _x} foreach crew _atPod3 + [_atPod3]; (_this select 0) removeaction (_this select 2); - 0 = [_centerPos, _fob] execvm "initHQ\fortifyFOB2.sqf"; + 0 = [_centerPos, _fob] spawn duws_fnc_fortifyFOB2; } else { hint "Not enough Command Points (15CP required)"; }; \ No newline at end of file diff --git a/source/initHQ/reguard.sqf b/source/functions/initHQ/fn_reguard.sqf similarity index 60% rename from source/initHQ/reguard.sqf rename to source/functions/initHQ/fn_reguard.sqf index 5fe3205..f34b54c 100644 --- a/source/initHQ/reguard.sqf +++ b/source/functions/initHQ/fn_reguard.sqf @@ -1,7 +1,9 @@ -_groupGuard = (_this select 3) select 0; -_groupPatrol = (_this select 3) select 1; -_centerPos = (_this select 3) select 2; -_hq = (_this select 3) select 3; +params ["_object","_caller","_actionId", "_arguments"]; + +_groupGuard = _arguments select 0; +_groupPatrol = _arguments select 1; +_centerPos = _arguments select 2; +_hq = _arguments select 3; if (commandpointsblu1>20) then { commandpointsblu1 = commandpointsblu1 - 20; @@ -13,7 +15,7 @@ if (commandpointsblu1>20) then { {deletevehicle _x} foreach units _groupPatrol; (_this select 0) removeaction (_this select 2); - 0 = [_centerPos, _hq] execvm "initHQ\guards.sqf"; + 0 = [_centerPos, _hq] call duws_fnc_guards; } else { hint "Not enough Command Points (20CP required)"; }; \ No newline at end of file diff --git a/source/initHQ/reguardFOB.sqf b/source/functions/initHQ/fn_reguardFOB.sqf similarity index 60% rename from source/initHQ/reguardFOB.sqf rename to source/functions/initHQ/fn_reguardFOB.sqf index 115653c..e2d18cd 100644 --- a/source/initHQ/reguardFOB.sqf +++ b/source/functions/initHQ/fn_reguardFOB.sqf @@ -1,7 +1,9 @@ -_groupGuard = (_this select 3) select 0; -_groupPatrol = (_this select 3) select 1; -_centerPos = (_this select 3) select 2; -_fob = (_this select 3) select 3; +params ["_object","_caller","_actionId", "_arguments"]; + +_groupGuard = _arguments select 0; +_groupPatrol = _arguments select 1; +_centerPos = _arguments select 2; +_fob = _arguments select 3; if (commandpointsblu1>15) then { commandpointsblu1 = commandpointsblu1 - 15; @@ -13,7 +15,7 @@ if (commandpointsblu1>15) then { {deletevehicle _x} foreach units _groupPatrol; (_this select 0) removeaction (_this select 2); - _handle = [_centerPos, _fob] execVM "initHQ\guardsFOB.sqf"; + [_centerPos, _fob] call duws_fnc_guardsFOB; } else { hint "Not enough Command Points (15CP required)"; }; \ No newline at end of file diff --git a/source/initHQ/teleport.sqf b/source/functions/initHQ/fn_teleport.sqf similarity index 65% rename from source/initHQ/teleport.sqf rename to source/functions/initHQ/fn_teleport.sqf index fcb25dd..c291cef 100644 --- a/source/initHQ/teleport.sqf +++ b/source/functions/initHQ/fn_teleport.sqf @@ -1,4 +1,4 @@ -_fobpos = _this select 0; +params ["_fobpos"]; player setpos _fobpos; hint format["%1",_fobpos]; \ No newline at end of file diff --git a/source/functions/initMission/fn_clientInit.sqf b/source/functions/initMission/fn_clientInit.sqf new file mode 100644 index 0000000..87ddb51 --- /dev/null +++ b/source/functions/initMission/fn_clientInit.sqf @@ -0,0 +1,289 @@ +diag_log format ["------------------ DUWS-R START ----v0------ player: %1", profileName]; + + +if (isDedicated) exitWith {}; +waitUntil {!isNull player}; + +player allowDamage false; + +[] call duws_fnc_persistent_stats_init; + + +#include "..\..\includes\supports_init.hpp" +#include "..\..\includes\squad_number_init.hpp" + +if (hasInterface) then {[] spawn duws_fnc_gps_marker;}; +if (!isMultiplayer) then { + getsize_script = [player] spawn duws_fnc_mapsize; +}; +staminaEnabled = ["Stamina", false] call BIS_fnc_getParamValue; +if(staminaEnabled == 0) then { + staminaEnabled = false; +} else { + staminaEnabled = true; +}; +// IF MP +if (isMultiplayer) then { + + // Get the variables from the parameters lobby + _revive_activated = ["Revive", 1] call BIS_fnc_getParamValue; + DUWSMP_CP_death_cost = ["DeathPenalty", 1] call BIS_fnc_getParamValue; + //staminaEnabled = ["Stamina", 0] call BIS_fnc_getParamValue; + + /*if(staminaEnabled == 0) then { + staminaEnabled = false; + } else { + staminaEnabled = true; + };*/ + + if (support_armory_available) then { + hq_blu1 addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; + { + _x addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; + } forEach (Array_of_FOBS); + }; + + PlayerKilledEH = player addEventHandler ["killed", { + commandpointsblu1 = commandpointsblu1 - DUWSMP_CP_death_cost; + publicVariable "commandpointsblu1"; + }]; + + PlayerBetrayerEH = player addEventHandler ["HandleRating", { + // If playerRating is negative (traitor) then reset to zero + _playerRating = rating (_this select 0); + if (_playerRating < 0) then { + player addRating (0 - _playerRating); + }; + // If final rating is positive, do not modify, else zero. + _rating = _this select 1; + [0,_rating] select ((_playerRating - _rating) > 0); + }]; + + "support_specialized_training_available" addPublicVariableEventHandler {lbSetColor [2103, 11, [0, 1, 0, 1]];}; + "support_armory_available" addPublicVariableEventHandler { + hq_blu1 addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; + { + _x addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; + } forEach (Array_of_FOBS); + lbSetColor [2103, 5, [0, 1, 0, 1]]; + }; + + // change the shown CP for request dialog + "commandpointsblu1" addPublicVariableEventHandler {ctrlSetText [1000, format["%1",commandpointsblu1]]; }; + + // each time there is a new FOB + "Array_of_FOBS" addPublicVariableEventHandler { + if (!fobSwitch) then { + [] spawn duws_fnc_FOBreceiveaction; + }; + fobSwitch = false; + //Add the FoB to the list of revive locations. + _fobAmount = count Array_of_FOBS; + _fobIndex = _fobAmount - 1; + _createdFOB = Array_of_FOBS select _fobIndex; + + [missionNamespace, _createdFOB] call BIS_fnc_addRespawnPosition; + }; + + if (!isServer) then { + "savegameNumber" addPublicVariableEventHandler {[] spawn duws_fnc_savegameClient}; + }; + if (!isServer) then { + "capturedZonesNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_zones_add;}; // change the shown CP for request dialog + }; + if (!isServer) then { + "finishedMissionsNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_missions_total;}; // change the shown CP for request dialog + }; + + player globalChat format ["gamemaster: %1", game_master]; + player globalChat format ["HQ_pos_found_generated: %1", HQ_pos_found_generated]; + + if (!isDedicated && !HQ_pos_found_generated) then { // SERVER INIT + if (((vehiclevarname player) in game_master)) then { + DUWS_host_start = false; + publicVariable "DUWS_host_start"; + waitUntil {time > 0.1}; + getsize_script = [player] spawn duws_fnc_mapsize; + DUWS_host_start = true; + publicVariable "DUWS_host_start"; + + // init High Command + [] call duws_fnc_hc_init; + waitUntil {scriptDone getsize_script}; + }; + }; +}; + +if (!isDedicated && !HQ_pos_found_generated) then { + if (((vehiclevarname player) in game_master)) then { + [] spawn duws_fnc_placement; + waitUntil {chosen_hq_placement}; + player globalChat format ["hq_manually_placed: %1", hq_manually_placed]; + player globalChat format ["player_is_choosing_hqpos: %1", player_is_choosing_hqpos]; + // create random HQ + if (!hq_manually_placed && !player_is_choosing_hqpos) then { + player globalChat "lance recherche position..."; + hq_create = [20, 0.015] spawn duws_fnc_locatorhq; + waitUntil {scriptDone hq_create}; + }; + }; +}; + +/* +//////// DEBUG LOOP ///////////// +[] spawn { + while {true} do { + hintsilent format["OvercastVar: %1\nFogVar: %2",OvercastVar,FogVar]; + sleep 1; + }; +}; +//////// DEBUG LOOP ///////////// +*/ + +// AMBIANCE LOOP +//_nul = [] execVM "musicloop.sqf"; + +if (isServer) then { + // group cleaning script + clean = [ + 5*60, // seconds to delete dead bodies (0 means don't delete) + 5*60, // seconds to delete dead vehicles (0 means don't delete) + 0, // seconds to delete immobile vehicles (0 means don't delete) + 5*60, // seconds to delete dropped weapons (0 means don't delete) + 0, // seconds to deleted planted explosives (0 means don't delete) + 10*60 // seconds to delete dropped smokes/chemlights (0 means don't delete) + ] spawn duws_fnc_repetitive_cleanup; +}; + +if (hasInterface) then { + // WHEN CLIENT CONNECTS INIT (might need sleep) + waitUntil {isPlayer Player}; + hintsilent "Waiting for the host to find an HQ..."; + waitUntil {HQ_pos_found_generated && time > 0.1}; + player setpos [(getpos hq_blu1 select 0),(getpos hq_blu1 select 1)+10]; + _drawicon = [] spawn duws_fnc_drawIcon; + hintsilent "Waiting for the host to select the campaign parameters..."; + waitUntil {chosen_settings}; + [hq_blu1] call duws_fnc_HQaddactions; + sleep 1; + player setdamage 0; + player allowDamage true; + hintsilent format["Joined game, welcome to %1, %2",worldName,profileName]; + + // init High Command + [] call duws_fnc_hc_init; + [] spawn duws_fnc_weather_client; + + // process purchasable units + [] call duws_fnc_processUnitConfig; + [] call duws_fnc_processVehicleConfig; + [] call duws_fnc_processGroupConfig; + + if(!staminaEnabled) then { + player enableStamina false; + }; +}; + +if (!isMultiplayer) then { + [] call duws_fnc_hc_init; +}; + +// Create help for DUWS +_index = player createDiarySubject ["help","DUWS-R Manual"]; +player createDiaryRecord ["help", ["Feedback/bug report", "Internal team members: Use the ""issues"" section to report items."]]; +player createDiaryRecord ["help", ["Export to another island", "How to export to another island:
You just need to take the .pbo file and rename it with the name of the island you want to export the mission to. You don't have anything else to do

Example:
SP_DUWS-R.stratis.pbo >>> SP_DUWS-R.chernarus.pbo"]]; +player createDiaryRecord ["help", ["Credits", "Many thanks goes out to everyone that worked on the original DUWS by kibot!"]]; +player createDiaryRecord ["help", ["Command Points (CP)", "Command points are used to purchase vehicles, units and ask for support (like artillery or save the game outside the base). To obtain Command points, you must capture the enemy controlled zones (red zones on the map) or execute side missions. You also receive 3 command points for each zone you have under your control every 30 minutes."]]; +player createDiaryRecord ["help", ["Army Power (AP)", "Army power represent the strenght of the BLUFOR forces present on the island. By capturing enemy positions and accomplishing side missions, you will add Army Power to your army. The attack waves of the BLUFOR army will become stronger."]]; +player createDiaryRecord ["help", ["Experience", "By accomplishing side missions, capturing zones and islands, you will increase your experience. With experience, you will automatically unlock new abilties. Once you have an ability, a description of this ability will be available in the 'ability' tab in the briefing.
Capturing an island gives you 5 XP
Achieving a side mission: 2 XP
Capturing a zone: 1 XP"]]; +player createDiaryRecord ["help", ["Saving the game", "You can save the game by resting at the base. Just go near the officer and select the action ""Rest"". Note that 6 hours will ellapse during that time. You can also save at any time by giving a SITREP in the support menu (0-8-1). Giving a SITREP does not make you wait, but it will cost you 1 CP for each save."]]; +player createDiaryRecord ["help", ["Repairing/Rearming", "To repair, refuel or rearm a vehicle you need to unlock the ""vehicle refit"" support. Once you have it, you can call the support and your vehicle will be rearmed, repaired and refueled. Note that you must be close to the base to be able to use the vehicle refit."]]; +player createDiaryRecord ["help", ["Support", "During the campaign you may unlock several support options at you HQ. You can access the available support in the radio menu (0-8). Note that calling for support cost CP."]]; +player createDiaryRecord ["help", ["Making a FOB", "After you have captured your first zone, you'll get the ability to establish a FOB for 10 CP. A FOB allows you to rest(save) at remote locations outside the base. Establishing a FOB will also spawn some BLUFOR patrols around it and if there are enemies around it, you will be notified. To establish a FOB, you must make sure the zone around you is clear in a radius of 500 meters. Just go to the support menu and select 'Establish FOB'. A FOB will be deployed to your location."]]; +player createDiaryRecord ["help", ["Side Missions", "You can request a side mission at the officer in the base. Successful side missions will not give any army power to the enemy, but will give you CP and increase your army power."]]; +player createDiaryRecord ["help", ["Requesting units", "To request units, go to the officer at the base and select the action ""Request units""."]]; +player createDiaryRecord ["help", ["Taking the Island", "At the beginning of the game, you are alone with your officer and only a few command points available, but as the war escalates, the BLUFOR HQ will start to launch attacks on enemy zone and will try to retake the island. You can help the main forces by assisting them in capturing the island, or you can also achieve side missions to boost the available assets of your army. It's up to you on how you want to play this campaign."]]; + +// Operatives +_index = player createDiarySubject ["operativehelp","Special operatives"]; +player createDiaryRecord ["operativehelp", ["Skills", "Aiming:
Pretty self explanatory, how well the operative can aim, lead a target, compensante for bullet drop and manage recoil.

Reflexes:
How fast the operator can react to a new threat and stabilize its aim.

Spotting:
The operative ability to spot targets within it's visual or audible range, and how accurately he can spot targets.

Courage:
Affects the morale of subordinates units of the operative, how likely they will flee, depending on what is in front of them and the squad status.

Communications:
How quickly recognized targets are shared with the squad.

Reload speed:
The operator's ability to switch weapon or reload quickly."]]; +player createDiaryRecord ["operativehelp", ["Recruiting operatives", "Operatives can be recruited at the HQ, inside the ""request unit"" menu. When you recruit someone for the first time, you'll have to spend 5 CP. However, once an operative has been already recruited, has been ""injured""(killed) in battle, you can recruit it again for only 2 CP after a delay between 20 and 80 minutes."]]; +player createDiaryRecord ["operativehelp", ["Overview", "You can recruit special operatives that will stay and progress with you for all the duration of the campaign. Some of these mens have special equipment, specialities and skills. Their skills will increase each time a zone is captured or a mission is accomplished, whether they're in your squad or not. However, when an operative is actually in the game, he will gain 10 spendable points wich can be assigned freely in any skill at the operative menu."]]; + +// MP notes +if (isMultiplayer) then { + player createDiaryRecord ["help", ["MP notes", "The CP pool is common for everyone.

While most support unlocks are indivdual, the Armory and the Specialized infantry training are common, and need to be unlocked only once by a single player.

While everybody can rest to heal, only the host can save and skip the time.

Only the host can request side mission and finish them. However, everyone receive the persistent stats and xp bonuses."]]; +}; + +// MP notification +if (isMultiplayer) then { + [] spawn { + waitUntil {time > 5}; + ["info",["MP Mechanics","Check the manual for the specifics of the DUWS-R in MP"]] call bis_fnc_showNotification; + }; +}; + +// create mission victory script //SPAWN BEGIN +[] spawn { + + // CREATE MAIN OBJECTIVE + capture_island_obj = player createSimpleTask ["taskIsland"]; + capture_island_obj setSimpleTaskDescription ["The ennemy is controlling the island, we must take it back! Capture every zone under enemy control and the mission will succeed.
You can let your BLUFOR forces take the island by themselves and help them getting a bigger army by accomplishing side missions. Or you can capture the zones yourself and do all the big work. As the campaign progress, the war will escalate and the armies will get stronger and start to use bigger guns.
To capture a zone, you need to have more units inside the zone than the enemy.

It's up to you on how you want to play this.
Good luck, soldier!","Take the island",""]; + + // WAIT UNTIL ALL ZONES ARE CAPTURED + waitUntil {sleep 1; amount_zones_created > 0}; + waitUntil {sleep 3; (zoneundercontrolblu >= amount_zones_created);}; // Toutes les zones sont capturées + persistent_stat_script_win = [] call duws_fnc_persistent_stats_win; + ["TaskSucceeded",["","Island captured!"]] call bis_fnc_showNotification; + capture_island_obj setTaskState "Succeeded"; + sleep 3; + ["island_captured_win",true,true] call BIS_fnc_endMission; +}; + + + +if (mission_DUWS_firstlaunch) then { + waitUntil {chosen_settings}; + sleep 8; + ["info",["Buying troops","Go talk to your commander to buy troops and vehicles with CP"]] call bis_fnc_showNotification; + sleep 2.5; + ["info",["Command points","Acquire more CP by capturing enemy areas or accomplishing side missions"]] call bis_fnc_showNotification; + + sleep 15; + ["info",["RESTING AND HEALING","Save the game and heal by resting at the base"]] call bis_fnc_showNotification; + + sleep 15; + // SITREP + ["sitrepinfo",["SITREP","You can also save the game by giving a SITREP"]] call bis_fnc_showNotification; + + sleep 20; + ["info",["DUWS Manual","Check the manual in the briefing for more info"]] call bis_fnc_showNotification; + + profileNamespace setVariable ["profile_DUWS_firstlaunch", false]; + saveProfileNamespace; +}; + +//Cleanup unused players. +for[{_x = 2},{_x <= 20},{_x = _x + 1}] do { + _thePlayer = missionNamespace getVariable format["player%1", _x]; + if(!isNil("_thePlayer")) then { + if(!isPlayer _thePlayer) then { + deleteVehicle _thePlayer; + }; + }; +}; + + +_dynam = [player,"DynamicSupportMenu"] call BIS_fnc_addCommMenuItem; + +//Loading player position and gear. +//TODO: Add bought supports. +/* +if(isServer) then +{ + execVM "persistent\missionSpecific\saveFuncs.sqf"; + waitUntil {!isNil "saveFuncsLoaded"}; + + execVM "persistent\missionSpecific\loadAccount.sqf"; +}; +*/ diff --git a/source/functions/initMission/fn_processGroupConfig.sqf b/source/functions/initMission/fn_processGroupConfig.sqf new file mode 100644 index 0000000..7b7b39f --- /dev/null +++ b/source/functions/initMission/fn_processGroupConfig.sqf @@ -0,0 +1,30 @@ +private _request_group_cases_string = ""; +private _skillSF = [0.9,1]; +private _skill = blufor_ai_skill; + +{ + _cfgGroup = _x select 1; + _cost = _x select 0; + _indexNumber = blufor_cfgGroup_array find _x; + _request_group_cases_string = _request_group_cases_string + format [' + case %1: { + if (commandpointsblu1 >= %2) then { + commandpointsblu1 = commandpointsblu1 - %2; + ctrlSetText [1000, str commandpointsblu1]; + _group = group player ; + _group = [_spawnPos, WEST, %3, [], [], %4] call BIS_fnc_spawnGroup; + player hcsetgroup [_group,""]; + hint "Squad ready !\nAccess it with [L.CTRL - SPACE]"; + } else { + hint "Not enough command points"; + }; + }; + ', + _indexNumber, + _cost, + [[[_cfgGroup], ""] call BIS_fnc_configPath, "", true] call BIS_fnc_configPath, + if (!isnil "_skillBoolean" && {_skillBoolean}) then {_skillSF} else {_skill}]; +} +forEach blufor_cfgGroup_array; + +requestGroupCases = compileFinal _request_group_cases_string; \ No newline at end of file diff --git a/source/functions/initMission/fn_processUnitConfig.sqf b/source/functions/initMission/fn_processUnitConfig.sqf new file mode 100644 index 0000000..daac44d --- /dev/null +++ b/source/functions/initMission/fn_processUnitConfig.sqf @@ -0,0 +1,26 @@ +private _request_unit_cases_string = ""; +private _skillSF = (blufor_ai_skill select 0) + 0.5; +private _skill = (blufor_ai_skill select 0) + 0.2; + +{ + _unit = _x select 0; + _cost = _x select 1; + _skillBoolean = _x select 2; + _indexNumber = blufor_unit_array find _x; + _request_unit_cases_string = _request_unit_cases_string + format [' + case %1: { + if (commandpointsblu1 >= %2) then { + hint "Unit ready !"; + commandpointsblu1 = commandpointsblu1 - %2; + ctrlSetText [1000, str commandpointsblu1]; + _group = group player ; + "%3" createUnit [_spawnpos, _group, "", %4, "private"] ; + } else { + hint "Not enough command points"; + }; + }; + ',_indexNumber, _cost, _unit, if (!isnil "_skillBoolean" && {_skillBoolean}) then {_skillSF} else {_skill}]; +} +forEach blufor_unit_array; + +requestUnitCases = compileFinal _request_unit_cases_string; \ No newline at end of file diff --git a/source/functions/initMission/fn_processVehicleConfig.sqf b/source/functions/initMission/fn_processVehicleConfig.sqf new file mode 100644 index 0000000..3a096ad --- /dev/null +++ b/source/functions/initMission/fn_processVehicleConfig.sqf @@ -0,0 +1,16 @@ +//Dynamically creates cases for duws_fnc_request + +private _request_vehicle_cases_string = ""; + +{ + _vehicle = _x select 0; + _cost = _x select 1; + _indexNumber = blufor_vehicle_array find _x; + _request_vehicle_cases_string = _request_vehicle_cases_string + format [' + case %1: { + [%2,"%3"] call duws_fnc_spawnVehicle; + }; + ',_indexNumber, _vehicle, _cost]; +} foreach blufor_vehicle_array; + +requestVehicleCases = compileFinal _request_vehicle_cases_string; \ No newline at end of file diff --git a/source/serverinit.sqf b/source/functions/initMission/fn_serverInit.sqf similarity index 89% rename from source/serverinit.sqf rename to source/functions/initMission/fn_serverInit.sqf index 37677a2..33aa3b3 100644 --- a/source/serverinit.sqf +++ b/source/functions/initMission/fn_serverInit.sqf @@ -1,237 +1,237 @@ -if (!isServer) exitWith {}; - - -////////////////////////////////////////////////////// -// HOW TO MANUALLY CREATE THE MISSION: -// 1)YOU MUST PLACE THE HQ LOCATION -// 2)DEFINE THE CAPTURABLE ZONES -// -- YOU CAN ALSO JUST PUT A HQ SOMEWHERE AND LET THE ZONES BEING RANDOMLY GENERATED -// -- YOU MUST PLACE MANUALLY THE HQ IF YOU ARE ALREADY PLACING THE ZONES BY HAND -// 3) DONT FORGET TO DEFINE THE VARIABLES BELOW. If you are ONLY placing the HQ by hand, you just need to put "hq_manually_placed" to -// "true" instead of "false". If you are also placing the zones by hand, make "zones_manually_placed" to "true". -///////////////////////////////////////////////////////////// -// 1) In the gamelogic, for the HQ( !! MAKE ONLY ONE HQ !!): _null=[getpos this] execVM "initHQ\BluHQinit.sqf" -// -// 2) In the init of gamelogic, to create a capturable enemy zone: -// _null = ["zone name",pts awarded upon capture, zone radius,getpos this,false/true,false/true] execvm "createzone.sqf"; -// "zone name": name of the zone -// pts awarded upon capture: points you earn when you capture the zone. Also the amount of points of army power you take and receive -// from the enemy after capture -// zone radius: how large the zone is -// getpos this: It's the position of the zone. The gamelogic actually. You don't have to modify this. -// false/true: if the zone is fortified or not. If the zone is fortified, there will be a bit more enemies and they will be maning -// static defences if there are any -// false/true: if the zone is selecting randomly a prefab base. Prefab is selected according to the zone radius. The bigger the zone, -// the bigger the prefab asset will be chosen. -// -// EXAMPLE, in the init of a gamelogic you have placed on the map: -// _null=["OP Xander",20,200,getpos this,true,false] execvm "initZones\createzone.sqf" -// -// 3) Define these variables: - -// choose between "tropical" - "arid" - "temperate" - "temperate_cold" - "mediterranean" -if (isNil "weather_type") then {weather_type = "tropical";};publicVariable "weather_type"; -// set the skill range of ennemy AI -if (isNil "opfor_ai_skill") then {opfor_ai_skill = [0.1,0.3];};publicVariable "opfor_ai_skill"; -// set the skill range of friendly AI, from 0 to 1 (0 being completely dumb) -if (isNil "blufor_ai_skill") then {blufor_ai_skill = [0.4,0.7];};publicVariable "blufor_ai_skill"; - -// you must specify if you have manually placed HQ or not. false = HQ is randomly placed, true = you have manually placed the HQ -hq_manually_placed = false;publicVariable "hq_manually_placed"; -// you must specify if you have manually placed the zones or not. false = zones are randomly generated, true = you have manually placed the zones -zones_manually_placed = false;publicVariable "zones_manually_placed"; -zones_max_dist_from_hq = 7500;publicVariable "zones_max_dist_from_hq"; -dynamic_weather_enable = true;publicVariable "dynamic_weather_enable"; -manually_chosen = false;publicVariable "manually_chosen"; - -if (isNil "enable_fast_travel") then { enable_fast_travel = true; };publicVariable "enable_fast_travel"; -// chopper taxi (support) will fast travel (teleport) or not -if (isNil "enableChopperFastTravel") then { enableChopperFastTravel = true; };publicVariable "enableChopperFastTravel"; -// Starting CP -if (isNil "commandpointsblu1") then { commandpointsblu1 = 20; };publicVariable "commandpointsblu1"; -// STARTING ARMY POWER -if (isNil "blufor_ap") then {blufor_ap = 0;};publicVariable "blufor_ap"; -opfor_ap = 0; - - -/////////////////////////////////////////////////////// -// initialise variables -////////////////////////////////////////////////////// -// MOST OF THE VALUES ARE BEING OVERWRITTEN BY PLAYER INPUT AT THE BEGINNING -////////////////////////////////////////////////////// - -///////////////////////////////////////////////////////////// -debugmode = false; // Debug mode, kind of obsolete -/// ------------- VALUES UNDER THIS ARE OVERWRITTEN -zones_number = 9; // Number of capturables zones to create (when zones are created randomly) -zones_spacing = 1200; // minimum space between 2 zones (in meters) // SOON OBSOLETE -zones_max_radius = 1000; // Determine the maximum radius a generated zone can have -zones_min_radius = 200; // Determine the minium radius a generated zone can have. SHOULD NOT BE UNDER 200. - -/////////////////////////////////////////////////////// -// This mission will have a harder time generating stuff if a lot of the terrain of the island is sloped, meaning that valid locations -// will be harder/take longer to find (side missions, mission init). -// Keep that in mind when tweaking the zones amount/radius value. -///////////////////////////////////////////////////////// -// preprocess the qrf file for the EH -QRF_test = compile preprocessFile "WARCOM\WARCOM_opf_qrf.sqf"; - - -// nber of missions succes(!!dont touch!!) -missions_success = 0;publicVariable "missions_success"; - -zones_created = false;publicVariable "zones_created"; -blu_hq_created = false;publicVariable "blu_hq_created"; -can_get_mission = true;publicVariable "can_get_mission"; -failsafe_zones_not_found = false;publicVariable "failsafe_zones_not_found"; -createcenter sideLogic; -LogicGroup = createGroup SideLogic;publicVariable "LogicGroup"; -locator_hq_actived = false;publicVariable "locator_hq_actived"; -op_zones_index = 0;publicVariable "op_zones_index"; -clientisSync = false;publicVariable "clientisSync"; -fobSwitch = false;publicVariable "fobSwitch"; -player_is_choosing_hqpos = false;publicVariable "player_is_choosing_hqpos"; - -if (isNil "amount_zones_created") then { - amount_zones_created = 0; -}; - -publicVariable "amount_zones_created"; - -if (isNil "HQ_pos_found_generated") then { - HQ_pos_found_generated = false; -}; - -publicVariable "HQ_pos_found_generated"; - -if (isNil "chosen_settings") then { - chosen_settings = false; -}; - -publicVariable "chosen_settings"; - -if (isNil "chosen_hq_placement") then { - chosen_hq_placement = false; -}; - -publicVariable "chosen_hq_placement"; - -if (isNil "zoneundercontrolblu") then { - zoneundercontrolblu = 0; -}; - -publicVariable "zoneundercontrolblu"; - -if (isNil "amount_zones_captured") then { - amount_zones_captured = 0; -}; - -publicVariable "amount_zones_captured"; - -if (isNil "savegameNumber") then { - savegameNumber = 0; -}; - -publicVariable "savegameNumber"; - -if (isNil "capturedZonesNumber") then { - capturedZonesNumber = 0; -}; - -publicVariable "capturedZonesNumber"; - -if (isNil "finishedMissionsNumber") then { - finishedMissionsNumber = 0; -}; - -publicVariable "finishedMissionsNumber"; - -if (isNil "OvercastVar") then { - OvercastVar = 0; -}; - -publicVariable "OvercastVar"; - -if (isNil "FogVar") then { - FogVar = 0; -}; - -publicVariable "FogVar"; - -if (isNil "createzone_server") then { - createzone_server = false; -}; - -publicVariable "createzone_server"; - -if (isNil "mission_number_of_zones_captured") then { - mission_number_of_zones_captured = 0; -}; - -publicVariable "mission_number_of_zones_captured"; - -// this is a special one (if/else) -if (isNil "Array_of_FOBS") then { - // if the player is sp or server or no fobs have been created - Array_of_FOBS = []; -} -else /// JIP for the client -{ - { - [_x] execVM "support\FOBactions.sqf"; - } forEach Array_of_FOBS; -}; - -if (isNil "Array_of_FOBname") then { - Array_of_FOBname = []; -}; - -publicVariable "Array_of_FOBS"; -publicVariable "Array_of_FOBname"; - -game_master = ["player1"];publicVariable "game_master"; - - waitUntil {chosen_settings && createzone_server}; - - if (!manually_chosen) then { - if (!zones_created) then { // CHECK IF ZONES ARE PLACED, IF NOT EXECUTE locatorZonesV1.sqf - _zones_create = [50, 0.2] execVM "initZones\locatorZonesV1.sqf"; // CHECK IF ZONES HAVE ALREADY BEEN PLACED - }; - } else { - if (!zones_created) then { // CHECK IF ZONES ARE PLACED, IF NOT EXECUTE locatorZonesV1.sqf - _zones_create = {[50,0.2] execVM "initZones\locatorZonesV2.sqf"} remoteExec ["bis_fnc_spawn", game_master select 0]; // CHECK IF ZONES HAVE ALREADY BEEN PLACED - }; - }; - -//FIX ME: Execution Order requires zone bonus and reward be before WARCOM INIT - if (isServer) then { - // initialise the ressources per zone bonus - _basepoint = [] execVM "zonesundercontrol.sqf"; - }; - - // init the bonuses you get when capturing zones - _basepoint = [] execVM "zones_bonus.sqf"; - -waitUntil { !isNil "serv_zones_array" }; -diag_log format ["serv_zones_array: %1", serv_zones_array]; -_warcom_init = [serv_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 2000] execVM "WARCOM\WARCOM_init.sqf"; // 2700 is 40 mins -waitUntil {scriptDone _warcom_init}; - -if (isServer) then { - // group cleaning script - 0 = [ - 60*60, // seconds to delete dead bodies (0 means don't delete) - 60*60, // seconds to delete dead vehicles (0 means don't delete) - 60*60, // seconds to delete dropped weapons (0 means don't delete) - 0, // seconds to deleted planted explosives (0 means don't delete) - 60*60 // seconds to delete dropped smokes/chemlights (0 means don't delete) - ] execVM 'repetitive_cleanup.sqf'; -}; - - - -if (zones_manually_placed) then { - waitUntil {!isNil ("Array_of_OPFOR_zones")}; - sleep 1; - _warcom_init = [Array_of_OPFOR_zones, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 1500] execVM "WARCOM\WARCOM_init.sqf"; -}; +if (!isServer) exitWith {}; + + +////////////////////////////////////////////////////// +// HOW TO MANUALLY CREATE THE MISSION: +// 1)YOU MUST PLACE THE HQ LOCATION +// 2)DEFINE THE CAPTURABLE ZONES +// -- YOU CAN ALSO JUST PUT A HQ SOMEWHERE AND LET THE ZONES BEING RANDOMLY GENERATED +// -- YOU MUST PLACE MANUALLY THE HQ IF YOU ARE ALREADY PLACING THE ZONES BY HAND +// 3) DONT FORGET TO DEFINE THE VARIABLES BELOW. If you are ONLY placing the HQ by hand, you just need to put "hq_manually_placed" to +// "true" instead of "false". If you are also placing the zones by hand, make "zones_manually_placed" to "true". +///////////////////////////////////////////////////////////// +// 1) In the gamelogic, for the HQ( !! MAKE ONLY ONE HQ !!): _null=[getpos this] execVM "initHQ\BluHQinit.sqf" +// +// 2) In the init of gamelogic, to create a capturable enemy zone: +// _null = ["zone name",pts awarded upon capture, zone radius,getpos this,false/true,false/true] execvm "createzone.sqf"; +// "zone name": name of the zone +// pts awarded upon capture: points you earn when you capture the zone. Also the amount of points of army power you take and receive +// from the enemy after capture +// zone radius: how large the zone is +// getpos this: It's the position of the zone. The gamelogic actually. You don't have to modify this. +// false/true: if the zone is fortified or not. If the zone is fortified, there will be a bit more enemies and they will be maning +// static defences if there are any +// false/true: if the zone is selecting randomly a prefab base. Prefab is selected according to the zone radius. The bigger the zone, +// the bigger the prefab asset will be chosen. +// +// EXAMPLE, in the init of a gamelogic you have placed on the map: +// _null=["OP Xander",20,200,getpos this,true,false] execvm "initZones\createzone.sqf" +// +// Note, this has been moved to the functions library! +// use '_null=["OP Xander",20,200,getpos this,true,false] spawn duws_fnc_createzone' instead! +// +// 3) Define these variables: + +// choose between "tropical" - "arid" - "temperate" - "temperate_cold" - "mediterranean" +if (isNil "weather_type") then {weather_type = "tropical";};publicVariable "weather_type"; +// set the skill range of ennemy AI +if (isNil "opfor_ai_skill") then {opfor_ai_skill = [0.1,0.3];};publicVariable "opfor_ai_skill"; +// set the skill range of friendly AI, from 0 to 1 (0 being completely dumb) +if (isNil "blufor_ai_skill") then {blufor_ai_skill = [0.4,0.7];};publicVariable "blufor_ai_skill"; + +// you must specify if you have manually placed HQ or not. false = HQ is randomly placed, true = you have manually placed the HQ +hq_manually_placed = false;publicVariable "hq_manually_placed"; +// you must specify if you have manually placed the zones or not. false = zones are randomly generated, true = you have manually placed the zones +zones_manually_placed = false;publicVariable "zones_manually_placed"; +zones_max_dist_from_hq = 7500;publicVariable "zones_max_dist_from_hq"; +dynamic_weather_enable = true;publicVariable "dynamic_weather_enable"; +manually_chosen = false;publicVariable "manually_chosen"; + +if (isNil "enable_fast_travel") then { enable_fast_travel = true; };publicVariable "enable_fast_travel"; +// chopper taxi (support) will fast travel (teleport) or not +if (isNil "enableChopperFastTravel") then { enableChopperFastTravel = true; };publicVariable "enableChopperFastTravel"; +// Starting CP +if (isNil "commandpointsblu1") then { commandpointsblu1 = 20; };publicVariable "commandpointsblu1"; +// STARTING ARMY POWER +if (isNil "blufor_ap") then {blufor_ap = 0;};publicVariable "blufor_ap"; +opfor_ap = 0; + + +/////////////////////////////////////////////////////// +// initialise variables +////////////////////////////////////////////////////// +// MOST OF THE VALUES ARE BEING OVERWRITTEN BY PLAYER INPUT AT THE BEGINNING +////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////// +debugmode = false; // Debug mode, kind of obsolete +/// ------------- VALUES UNDER THIS ARE OVERWRITTEN +zones_number = 9; // Number of capturables zones to create (when zones are created randomly) +zones_spacing = 1200; // minimum space between 2 zones (in meters) // SOON OBSOLETE +zones_max_radius = 1000; // Determine the maximum radius a generated zone can have +zones_min_radius = 200; // Determine the minium radius a generated zone can have. SHOULD NOT BE UNDER 200. + +/////////////////////////////////////////////////////// +// This mission will have a harder time generating stuff if a lot of the terrain of the island is sloped, meaning that valid locations +// will be harder/take longer to find (side missions, mission init). +// Keep that in mind when tweaking the zones amount/radius value. +///////////////////////////////////////////////////////// + + +// nber of missions succes(!!dont touch!!) +missions_success = 0;publicVariable "missions_success"; + +zones_created = false;publicVariable "zones_created"; +blu_hq_created = false;publicVariable "blu_hq_created"; +can_get_mission = true;publicVariable "can_get_mission"; +failsafe_zones_not_found = false;publicVariable "failsafe_zones_not_found"; +createcenter sideLogic; +LogicGroup = createGroup SideLogic;publicVariable "LogicGroup"; +locator_hq_actived = false;publicVariable "locator_hq_actived"; +op_zones_index = 0;publicVariable "op_zones_index"; +clientisSync = false;publicVariable "clientisSync"; +fobSwitch = false;publicVariable "fobSwitch"; +player_is_choosing_hqpos = false;publicVariable "player_is_choosing_hqpos"; + +if (isNil "amount_zones_created") then { + amount_zones_created = 0; +}; + +publicVariable "amount_zones_created"; + +if (isNil "HQ_pos_found_generated") then { + HQ_pos_found_generated = false; +}; + +publicVariable "HQ_pos_found_generated"; + +if (isNil "chosen_settings") then { + chosen_settings = false; +}; + +publicVariable "chosen_settings"; + +if (isNil "chosen_hq_placement") then { + chosen_hq_placement = false; +}; + +publicVariable "chosen_hq_placement"; + +if (isNil "zoneundercontrolblu") then { + zoneundercontrolblu = 0; +}; + +publicVariable "zoneundercontrolblu"; + +if (isNil "amount_zones_captured") then { + amount_zones_captured = 0; +}; + +publicVariable "amount_zones_captured"; + +if (isNil "savegameNumber") then { + savegameNumber = 0; +}; + +publicVariable "savegameNumber"; + +if (isNil "capturedZonesNumber") then { + capturedZonesNumber = 0; +}; + +publicVariable "capturedZonesNumber"; + +if (isNil "finishedMissionsNumber") then { + finishedMissionsNumber = 0; +}; + +publicVariable "finishedMissionsNumber"; + +if (isNil "OvercastVar") then { + OvercastVar = 0; +}; + +publicVariable "OvercastVar"; + +if (isNil "FogVar") then { + FogVar = 0; +}; + +publicVariable "FogVar"; + +if (isNil "createzone_server") then { + createzone_server = false; +}; + +publicVariable "createzone_server"; + +if (isNil "mission_number_of_zones_captured") then { + mission_number_of_zones_captured = 0; +}; + +publicVariable "mission_number_of_zones_captured"; + +// this is a special one (if/else) +if (isNil "Array_of_FOBS") then { + // if the player is sp or server or no fobs have been created + Array_of_FOBS = []; +} +else /// JIP for the client +{ + { + [_x] call duws_fnc_FOBactions; + } forEach Array_of_FOBS; +}; + +if (isNil "Array_of_FOBname") then { + Array_of_FOBname = []; +}; + +publicVariable "Array_of_FOBS"; +publicVariable "Array_of_FOBname"; + +game_master = ["player1"];publicVariable "game_master"; + + waitUntil {chosen_settings && createzone_server}; + + if (!manually_chosen) then { + if (!zones_created) then { // CHECK IF ZONES ARE PLACED, IF NOT EXECUTE locatorZonesV1.sqf + _zones_create = [50, 0.2] spawn duws_fnc_locatorzonesV1; // CHECK IF ZONES HAVE ALREADY BEEN PLACED + }; + } else { + if (!zones_created) then { // CHECK IF ZONES ARE PLACED, IF NOT EXECUTE locatorZonesV1.sqf + _zones_create = {[50,0.2] spawn duws_fnc_locatorzonesV2} remoteExec ["bis_fnc_spawn", game_master select 0]; // CHECK IF ZONES HAVE ALREADY BEEN PLACED + }; + }; + +//FIX ME: Execution Order requires zone bonus and reward be before WARCOM INIT + if (isServer) then { + // initialise the ressources per zone bonus + _basepoint = [] spawn duws_fnc_zonesundercontrol; + }; + + // init the bonuses you get when capturing zones + _basepoint = [] spawn duws_fnc_zones_bonus; + +waitUntil { !isNil "serv_zones_array" }; +diag_log format ["serv_zones_array: %1", serv_zones_array]; +[serv_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 2000] call duws_fnc_WARCOM_init; // 2700 is 40 mins + +if (isServer) then { + // group cleaning script + 0 = [ + 60*60, // seconds to delete dead bodies (0 means don't delete) + 60*60, // seconds to delete dead vehicles (0 means don't delete) + 60*60, // seconds to delete dropped weapons (0 means don't delete) + 0, // seconds to deleted planted explosives (0 means don't delete) + 60*60 // seconds to delete dropped smokes/chemlights (0 means don't delete) + ] spawn duws_fnc_repetitive_cleanup; +}; + + + +if (zones_manually_placed) then { + waitUntil {!isNil ("Array_of_OPFOR_zones")}; + sleep 1; + _warcom_init = [Array_of_OPFOR_zones, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 1500] call duws_fnc_WARCOM_init; +}; diff --git a/source/functions/initZones/fn_createzone.sqf b/source/functions/initZones/fn_createzone.sqf new file mode 100644 index 0000000..9aaf96e --- /dev/null +++ b/source/functions/initZones/fn_createzone.sqf @@ -0,0 +1,240 @@ +// _trg = ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzone; +// Name of the place,pts,radius,position,fortified/not +// + +params ["_place","_points","_size","_trigger","_fortified","_prefab"]; + +amount_zones_created = amount_zones_created + 1; +publicVariable "amount_zones_created"; +zones_created = true; // Tell that at least 1 zone is created + +// Add the zone to the array of zones (need for manual placement of zones and WARCOM) +if (isNil ("Array_of_OPFOR_zones")) then {Array_of_OPFOR_zones = [];}; +Array_of_OPFOR_zones = Array_of_OPFOR_zones + [_trigger]; + +// CREATE MARKER (ICON) +_markername = format["%1%2",round(_trigger select 0),round(_trigger select 1)]; // Define marker name +//hint _markername; +_markerstr = createMarker [str(_markername),_trigger]; +_markerstr setMarkerShape "ICON"; +str(_markername) setMarkerType "hd_objective"; +str(_markername) setMarkerColor "ColorRed"; +str(_markername) setMarkerText _place; +str(_markername) setMarkerSize [0, 0]; + +// CREATE MARKER (ELLIPSE ZONE) +_markername2 = format["%1%2ellipse",round(_trigger select 0),round(_trigger select 1)]; // Define marker name +//hint _markername2; +_markerstr2 = createMarker [str(_markername2),_trigger]; +_markerstr2 setMarkerShape "ELLIPSE"; +str(_markername2) setMarkerBrush "SolidBorder"; +str(_markername2) setMarkerColor "ColorRed"; +str(_markername2) setMarkerSize [_size, _size]; +str(_markername2) setMarkerAlpha 0.1; + + + +// CREATE ZONE CAPTURABLE TRIGGER +_trg=createTrigger["EmptyDetector",_trigger]; +_trg setTriggerArea[_size,_size,0,false]; +_trg setTriggerActivation["WEST SEIZED","PRESENT",false]; +_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] spawn duws_fnc_captured",_place,_points,_markername,_markername2,_trigger], ""]; +_trg setTriggerTimeout [30, 60, 300, true ]; +// CREATE VARNAME FOR ZONE TRIGGER --> use the pos of the trigger +_triggerName = format["trigger%1%2",round (_trigger select 0),round (_trigger select 1)]; +call compile format["%1 = _trg",_triggerName]; + + + + + + + + + +// CREATE PREFAB +if (_prefab) then { +_array_of_prefabs = [["Command Outpost", true, duws_fnc_site_commandOP], +["Vehicle Refit Station", false, duws_fnc_site_vehfittingstation], +["Research Bunker", true, duws_fnc_site_researchBunker], +["Recon Outpost", true, duws_fnc_site_reconOutpost], +["Power Relay", true, duws_fnc_site_powerRelay], +["Com. Station", true, duws_fnc_site_CommStation], +["Outpost", true, duws_fnc_site_outpost1], +["Outpost", true, duws_fnc_site_outpost2], +["Barracks", true, duws_fnc_site_Barracks], +["Research Station", false, duws_fnc_site_researchStation], +["Camp Site", false, duws_fnc_site_campsite]]; + +_amount_of_prefabs = count _array_of_prefabs; +_indexedAmount = _amount_of_prefabs - 1; +_dice = round random _indexedAmount; + +_prefab_array = _array_of_prefabs select _dice; +_place = _prefab_array select 0; +_fortified = _prefab_array select 1; +_function = _prefab_array select 2; + +_prefab_create = [_trigger] spawn _function; +str(_markername) setMarkerText _place; +}; + + + +// CREATE ZONE NOTIFICATION TRIGGER +_trg2=createTrigger["EmptyDetector",_trigger]; +_trg2 triggerAttachVehicle [player]; +_trg2 setTriggerArea[_size,_size,0,false]; +_trg2 setTriggerActivation["VEHICLE","PRESENT",true]; +_trg2 setTriggerStatements["this", format["[""%1"",thislist] spawn duws_fnc_enterlocation",_place], ""]; + + + + + + + + + + + + + + + + + + +// move the spawn location, or units get stuck +_fortifiedspawn = _trigger; +_trigger = [(_trigger select 0)+40,_trigger select 1]; + + +// CREATE OPFOR. HEAVY CLUSTERFUCK INCOMING. +// Check if fortified is true +if (_fortified) then +{ + [_fortifiedspawn] call duws_fnc_createopfortified; + sleep 2; +}; + +// Check if radius is 100m or smaller => create 2 patrols then exit the script +if (_size < 101) exitWith +{ + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; +}; +// Check if radius is 250m-100m => create 2 patrols and 1 fireteam then exit the script +if (_size < 251) exitWith +{ + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; +}; +// Check if radius is 250m-500m => create 2 patrols and 2 fireteams then exit the script +if (_size < 501) exitWith +{ + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; +}; +if (_size <= 1000) exitWith +{ + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; +}; +if (_size <= 1500) exitWith +{ +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; +waitUntil {scriptDone _vehcreate}; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; +}; +if (_size <= 2000) exitWith +{ +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; +waitUntil {scriptDone _vehcreate}; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; +}; +if (_size <= 3000) exitWith +{ + _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; + waitUntil {scriptDone _vehcreate}; + + _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; + waitUntil {scriptDone _vehcreate}; + + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; +}; + +// IF NOT IN PARAMETERS (TOO BIG ZONE) +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; +waitUntil {scriptDone _vehcreate}; + +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; +waitUntil {scriptDone _vehcreate}; + + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; + \ No newline at end of file diff --git a/source/initZones/createzonebackup.sqf b/source/functions/initZones/fn_createzonebackup.sqf similarity index 52% rename from source/initZones/createzonebackup.sqf rename to source/functions/initZones/fn_createzonebackup.sqf index 6df3903..873248b 100644 --- a/source/initZones/createzonebackup.sqf +++ b/source/functions/initZones/fn_createzonebackup.sqf @@ -1,13 +1,8 @@ -// _trg = ["Outpost Airbase",5,50,getpos this,true] execvm "createzone.sqf"; -// Name of the place,pts,radius,position,fortified/not +// _trg = ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzonebackup; +// Name of the place,pts,radius,position,fortified/not // -_place = _this select 0; -_points = _this select 1; -_size = _this select 2; -_trigger = _this select 3; -_fortified = _this select 4; -_prefab = _this select 5; +params ["_place","_points","_size","_trigger","_fortified","_prefab"]; amount_zones_created = amount_zones_created + 1; publicVariable "amount_zones_created"; @@ -43,7 +38,7 @@ str(_markername2) setMarkerAlpha 0.1; _trg=createTrigger["EmptyDetector",_trigger]; _trg setTriggerArea[_size,_size,0,false]; _trg setTriggerActivation["WEST SEIZED","PRESENT",false]; -_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] execvm 'captured.sqf'",_place,_points,_markername,_markername2,_trigger], ""]; +_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] spawn duws_fnc_captured'",_place,_points,_markername,_markername2,_trigger], ""]; _trg setTriggerTimeout [30, 60, 300, true ]; // CREATE VARNAME FOR ZONE TRIGGER --> use the pos of the trigger _triggerName = format["trigger%1%2",round (_trigger select 0),round (_trigger select 1)]; @@ -91,7 +86,7 @@ _trg2=createTrigger["EmptyDetector",_trigger]; _trg2 triggerAttachVehicle [player]; _trg2 setTriggerArea[_size,_size,0,false]; _trg2 setTriggerActivation["VEHICLE","PRESENT",true]; -_trg2 setTriggerStatements["this", format["[""%1"",thislist] execvm 'enterlocation.sqf'",_place], ""]; +_trg2 setTriggerStatements["this", format["[""%1"",thislist] spawn duws_fnc_enterlocation",_place], ""]; @@ -119,194 +114,194 @@ _trigger = [(_trigger select 0)+40,_trigger select 1]; // Check if fortified is true if (_fortified) then { - [_fortifiedspawn] execvm "createopfortified.sqf"; + [_fortifiedspawn] call duws_fnc_createopfortified; sleep 2; }; // Check if radius is 100m or smaller => create 2 patrols then exit the script if (_size < 101) exitWith { - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; }; // Check if radius is 250m-100m => create 2 patrols and 1 fireteam then exit the script if (_size < 251) exitWith { - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; }; // Check if radius is 250m-500m => create 2 patrols and 2 fireteams then exit the script if (_size < 501) exitWith { - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; }; if (_size <= 1000) exitWith { - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 10; - ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; + [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; }; if (_size <= 1500) exitWith { -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; sleep 10; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 10+(random 3); - ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; + [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; }; if (_size <= 2000) exitWith { -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; sleep 10; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 10+(random 3); - ["OPF_F","air",_trigger,_size] execVM "random_veh.sqf"; + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; }; if (_size <= 3000) exitWith { -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; sleep 10; -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; sleep 10; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 10+(random 3); - ["OPF_F","air",_trigger,_size] execVM "random_veh.sqf"; + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; }; // IF NOT IN PARAMETERS (TOO BIG ZONE) -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; sleep 10; -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; +_vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; sleep 10; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopwpteam.sqf"; + [_trigger, _size] call duws_fnc_createopwpteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [_trigger, _size] execvm "createopteam.sqf"; + [_trigger, _size] call duws_fnc_createopteam; sleep 3; - [_trigger, _size] execvm "createoppatrol.sqf"; + [_trigger, _size] call duws_fnc_createoppatrol; sleep 10+(random 3); - ["OPF_F","air",_trigger,_size] execVM "random_veh.sqf"; + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; \ No newline at end of file diff --git a/source/initZones/locatorzonesV1.sqf b/source/functions/initZones/fn_locatorzonesV1.sqf similarity index 94% rename from source/initZones/locatorzonesV1.sqf rename to source/functions/initZones/fn_locatorzonesV1.sqf index 28fc51f..874fc93 100644 --- a/source/initZones/locatorzonesV1.sqf +++ b/source/functions/initZones/fn_locatorzonesV1.sqf @@ -1,5 +1,5 @@ -_radius = _this select 0; -_diff = _this select 1; +params ["_radius","_diff"]; + _infinite_failsafe_loop = true; @@ -85,7 +85,7 @@ while {!_found} do if (_found_distance) then { _missionPos = [round(_missionPos select 0),round(_missionPos select 1)]; - _generatezonescript = [format["Zone %1",_i],_points_zone,_zone_radius,_MissionPos,_fortified,true] execvm "initZones\createzone.sqf"; + _generatezonescript = [format["Zone %1",_i],_points_zone,_zone_radius,_MissionPos,_fortified,true] spawn duws_fnc_createzone; _found=true; _zones_array = _zones_array + [_MissionPos]; @@ -103,7 +103,7 @@ player globalChat format["All zones found. Welcome to %1, %2",_worldName,profile hint format["Campaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]; [] spawn { sleep 20; -[] execVM "misc\bottom_right_message.sqf"; +[] call duws_fnc_bottom_right_message; }; @@ -113,7 +113,7 @@ _zones_array = [_zones_array, 0] call BIS_fnc_removeIndex; //player globalchat format["%1",_zones_array]; serv_zones_array = [] + _zones_array; publicVariable "serv_zones_array"; -//_warcom_init = [_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 2000] execVM "WARCOM\WARCOM_init.sqf"; // 2700 is 40 mins +//_warcom_init = [_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 2000] call duws_fnc_WARCOM_init; // 2700 is 40 mins //waitUntil {scriptDone _warcom_init}; savegame; sleep 1; diff --git a/source/initZones/locatorzonesV1_backup.sqf b/source/functions/initZones/fn_locatorzonesV1_backup.sqf similarity index 94% rename from source/initZones/locatorzonesV1_backup.sqf rename to source/functions/initZones/fn_locatorzonesV1_backup.sqf index 772f68a..084e060 100644 --- a/source/initZones/locatorzonesV1_backup.sqf +++ b/source/functions/initZones/fn_locatorzonesV1_backup.sqf @@ -1,5 +1,5 @@ -_radius = _this select 0; -_diff = _this select 1; +params ["_radius","_diff"]; + _infinite_failsafe_loop = true; @@ -122,7 +122,7 @@ while {!_found} do if (_found_distance) then { _missionPos = [round(_missionPos select 0),round(_missionPos select 1),round(_missionPos select 2)]; - _null = [format["Zone %1",_i],_points_zone,_zone_radius,_MissionPos,_fortified] execvm "initZones\createzone.sqf"; + _null = [format["Zone %1",_i],_points_zone,_zone_radius,_MissionPos,_fortified] spawn duws_fnc_createzone; _found=true; _zones_array = _zones_array + [_MissionPos]; @@ -139,8 +139,7 @@ player globalChat format["All zones found. Welcome to %1, %2",_worldName,profile _zones_array = [_zones_array, 0] call BIS_fnc_removeIndex; //player globalchat format["%1",_zones_array]; -_warcom_init = [_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 1500] execVM "WARCOM\WARCOM_init.sqf"; // 2700 is 40 mins -waitUntil {scriptDone _warcom_init}; +[_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 1500] call duws_fnc_WARCOM_init; // 2700 is 40 mins sleep 0.1; savegame; diff --git a/source/initZones/locatorzonesV2.sqf b/source/functions/initZones/fn_locatorzonesV2.sqf similarity index 90% rename from source/initZones/locatorzonesV2.sqf rename to source/functions/initZones/fn_locatorzonesV2.sqf index 6f28423..c3e9085 100644 --- a/source/initZones/locatorzonesV2.sqf +++ b/source/functions/initZones/fn_locatorzonesV2.sqf @@ -1,5 +1,4 @@ -_radius = _this select 0; -_diff = _this select 1; +params ["_radius","_diff"]; [["The zones are being generated
Please wait for mission initialization to complete..."]] spawn BIS_fnc_typeText; [[{player globalChat "DO NOT USE ACTION MENU UNTIL MISSION INITIALIZATION IS COMPLETE"}],"BIS_fnc_Spawn",true,false] call BIS_fnc_MP; @@ -50,7 +49,7 @@ for [{_i=1}, {_i<=zones_number}, {_i=_i+1}] do // BEGIN "FOR" LOOP -- if (_found_distance) then { _missionPos = [round(_missionPos select 0),round(_missionPos select 1)]; - _generatezonescript = [format["Zone %1",_i],_points_zone,_zone_radius,_missionPos,_fortified,true] execvm "initZones\createzone.sqf"; + _generatezonescript = [format["Zone %1",_i],_points_zone,_zone_radius,_missionPos,_fortified,true] spawn duws_fnc_createzone; _found = true; _zones_array = _zones_array + [_missionPos]; @@ -72,7 +71,7 @@ player globalChat format["All zones found. Welcome to %1, %2",_worldName,profile [[{hint format["MISSION INITIALIZATION COMPLETE!\nCampaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]}],"BIS_fnc_Spawn",true,false] call BIS_fnc_MP; [] spawn { sleep 9; - [] execVM "misc\bottom_right_message.sqf"; + [] call duws_fnc_bottom_right_message; }; @@ -80,11 +79,10 @@ player globalChat format["All zones found. Welcome to %1, %2",_worldName,profile _zones_array = [_zones_array, 0] call BIS_fnc_removeIndex; //player globalchat format["%1",_zones_array]; -_warcom_init = [_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 2000] execVM "WARCOM\WARCOM_init.sqf"; // 2700 is 40 mins -waitUntil {scriptDone _warcom_init}; +[_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 2000] call duws_fnc_WARCOM_init; // 2700 is 40 mins sleep 0.1; -execVM "utilities\autoSave.sqf"; +[] spawn duws_fnc_autoSave; sleep 1; [[format["MISSION INITIALIZATION COMPLETE!
Campaign generated
Welcome to %1, %2",_worldName,profilename]]] spawn BIS_fnc_typeText; diff --git a/source/misc/bottom_right_message.sqf b/source/functions/misc/fn_bottom_right_message.sqf similarity index 100% rename from source/misc/bottom_right_message.sqf rename to source/functions/misc/fn_bottom_right_message.sqf diff --git a/source/misc/gps_marker.sqf b/source/functions/misc/fn_gps_marker.sqf similarity index 100% rename from source/misc/gps_marker.sqf rename to source/functions/misc/fn_gps_marker.sqf diff --git a/source/missions/missions/destroy/mission.sqf b/source/functions/missions/fn_destroy_mission.sqf similarity index 88% rename from source/missions/missions/destroy/mission.sqf rename to source/functions/missions/fn_destroy_mission.sqf index 384bab6..bd03436 100644 --- a/source/missions/missions/destroy/mission.sqf +++ b/source/functions/missions/fn_destroy_mission.sqf @@ -1,4 +1,5 @@ -_MissionPos = _this select 0; +params ["_MissionPos"]; + // define random pos AROUND SOLDIERS. spawn markers at random. _radius = 400; _randompos = [(_missionpos select 0)+(random _radius)-(random _radius), (_missionpos select 1)+(random _radius)-(random _radius)]; @@ -39,16 +40,16 @@ _tower setVectorUp [0,0,1]; if (!ismultiplayer) then { - execVM "utilities\autoSave.sqf"; + [] spawn duws_fnc_autoSave; }; ["TaskAssigned",["",_mission_name]] call bis_fnc_showNotification; // CREATE PATROLS sleep 1; -[_missionpos, 15] execvm "createoppatrol.sqf"; // <-- around target -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createopteam.sqf"; +[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createopteam; // MISSION COMPLETED -- ATTENDRE QUE LA TOUR SOIT KO waitUntil {sleep 1; !alive _tower}; @@ -75,7 +76,7 @@ finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; -_operHandler = execVM "dialog\operative\operative_mission_complete.sqf"; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] execVM "persistent\persistent_stats_missions_total.sqf"; +_addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/missions/missionTimer.sqf b/source/functions/missions/fn_missionTimer.sqf similarity index 100% rename from source/missions/missionTimer.sqf rename to source/functions/missions/fn_missionTimer.sqf diff --git a/source/missions/missions/pilot/mission.sqf b/source/functions/missions/fn_pilot_mission.sqf similarity index 80% rename from source/missions/missions/pilot/mission.sqf rename to source/functions/missions/fn_pilot_mission.sqf index 497e0ae..212b68d 100644 --- a/source/missions/missions/pilot/mission.sqf +++ b/source/functions/missions/fn_pilot_mission.sqf @@ -1,4 +1,4 @@ -_MissionPos = _this select 0; +params ["_MissionPos"]; _initpos = getpos hq_blu1; // define random pos AROUND TARGET. spawn markers at random. _radius = 175; @@ -27,16 +27,16 @@ str(_markername2) setMarkerAlpha 0.5; // CREATE PATROLS sleep 1; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createopteam.sqf"; +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createopteam; // CREATE WRECK -_choppa = "Land_Wreck_Heli_Attack_01_F" createVehicle (_missionpos); +_choppa = Blufor_Helowreck createVehicle (_missionpos); _group = createGroup west; // CREATE PILOT -_pilot = _group createUnit ["B_Helipilot_F", [_missionpos select 0, (_missionpos select 1)+2], [], 0, "FORM"]; +_pilot = _group createUnit [Blufor_Heli_Pilot, [_missionpos select 0, (_missionpos select 1)+2], [], 0, "FORM"]; _pilot setcaptive true; _pilot switchMove "acts_CrouchingIdleRifle01"; @@ -46,10 +46,10 @@ _pilot switchMove "acts_CrouchingIdleRifle01"; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername));/ if (!ismultiplayer) then { - execVM "utilities\autoSave.sqf"; + [] spawn duws_fnc_autoSave; }; -[west, "_taskhandle", ["taskPilot.", "One of our AH-99 helicopters has been downed somewhere around this area. We have reports that the pilot is still alive. You must find him and bring him back to base.", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["One of our AH-99 helicopters has been downed somewhere around this area. We have reports that the pilot is still alive. You must find him and bring him back to base.", "Downed Pilot", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; ["TaskAssigned",["",_mission_name]] call bis_fnc_showNotification; @@ -107,7 +107,7 @@ commandpointsblu1 = commandpointsblu1 + reward; publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; missions_success = missions_success + 1; -_operHandler = execVM "dialog\operative\operative_mission_complete.sqf"; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] execVM "persistent\persistent_stats_missions_total.sqf"; +_addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/missions/missions/rescue/mission.sqf b/source/functions/missions/fn_rescue_mission.sqf similarity index 69% rename from source/missions/missions/rescue/mission.sqf rename to source/functions/missions/fn_rescue_mission.sqf index 6ffcb96..03a92e9 100644 --- a/source/missions/missions/rescue/mission.sqf +++ b/source/functions/missions/fn_rescue_mission.sqf @@ -1,4 +1,4 @@ -_MissionPos = _this select 0; +params ["_MissionPos"]; // define random pos AROUND SOLDIERS. spawn markers at random. _radius = 125; _randompos = [(_missionpos select 0)+(random _radius)-(random _radius), (_missionpos select 1)+(random _radius)-(random _radius)]; @@ -30,9 +30,9 @@ _soldier3 = format ["s3%1%2",round(_MissionPos select 0),round(_Missionpos selec _group = createGroup west; -"b_soldier_tl_f" createUnit [[(_missionpos select 0)+(random 10),(_missionpos select 1)+(random 10)], _group,format["this setcaptive true; this switchMove ""acts_InjuredCoughRifle02""; %1 = this",_soldier1]]; -"B_Soldier_F" createUnit [[(_missionpos select 0),(_missionpos select 1)], _group,format["this setcaptive true; this switchMove ""acts_InjuredLookingRifle02""; %1 = this",_soldier2]]; -"B_Soldier_ar_F" createUnit [[(_missionpos select 0)+(random 5),(_missionpos select 1)+(random 5)], _group,format["this setcaptive true; this switchMove ""acts_InjuredLookingRifle03""; %1 = this",_soldier3]]; +Blufor_Teamleader createUnit [[(_missionpos select 0)+(random 10),(_missionpos select 1)+(random 10)], _group,format["this setcaptive true; this switchMove ""acts_InjuredCoughRifle02""; %1 = this",_soldier1]]; +Blufor_Rifleman createUnit [[(_missionpos select 0),(_missionpos select 1)], _group,format["this setcaptive true; this switchMove ""acts_InjuredLookingRifle02""; %1 = this",_soldier2]]; +Blufor_Autorifleman createUnit [[(_missionpos select 0)+(random 5),(_missionpos select 1)+(random 5)], _group,format["this setcaptive true; this switchMove ""acts_InjuredLookingRifle03""; %1 = this",_soldier3]]; // END CREATE SOLDIERS // TASK AND NOTIFICATION @@ -43,10 +43,10 @@ _VARtaskgeneratedName = format ["rescue%1%2",round(_MissionPos select 0),round(_ //_taskhandle setSimpleTaskDescription ["One of our patrols has been ambushed and requires immediate assistance",_mission_name,""]; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername)); -[west, "_taskhandle", ["taskRescue.", "One of our patrols has been ambushed and requires immediate assistance", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["One of our patrols has been ambushed and requires immediate assistance", "Ambushed Patrol", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { - execVM "utilities\autoSave.sqf"; + [] spawn duws_fnc_autoSave; }; ["TaskAssigned",["",_mission_name]] call bis_fnc_showNotification; @@ -57,11 +57,11 @@ call compile format ["%1 = _taskhandle",_VARtaskgeneratedName]; // create variab _trg=createTrigger["EmptyDetector",_MissionPos]; _trg setTriggerArea[25,25,0,false]; _trg setTriggerActivation["WEST","PRESENT",false]; -_trg setTriggerStatements["this",format["[""%1"",%2,%3,%4,%5,""%6"",this] execvm ""missions\missions\rescue\success.sqf""",_markername,_soldier1,_soldier2,_soldier3,_MissionPos,_markername2], ""]; +_trg setTriggerStatements["this",format["[""%1"",%2,%3,%4,%5,""%6"",this] spawn duws_fnc_rescue_success",_markername,_soldier1,_soldier2,_soldier3,_MissionPos,_markername2], ""]; _trg setTriggerTimeout [10, 10, 10, true ]; // CREATE OPFOR PATROLS sleep 1; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createoppatrol.sqf"; +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createoppatrol; diff --git a/source/missions/missions/rescue/success.sqf b/source/functions/missions/fn_rescue_success.sqf similarity index 82% rename from source/missions/missions/rescue/success.sqf rename to source/functions/missions/fn_rescue_success.sqf index 20f381a..7cd6fbb 100644 --- a/source/missions/missions/rescue/success.sqf +++ b/source/functions/missions/fn_rescue_success.sqf @@ -1,10 +1,4 @@ -_markername = _this select 0; -_sol1 = _this select 1; -_sol2 = _this select 2; -_sol3 = _this select 3; -_MissionPos = _this select 4; -_markername2 = _this select 5; -_trg = _this select 6; +params ["_markername","_sol1","_sol2","_sol3","_MissionPos","_markername2","_trg"]; // remove markers deleteMarker str(_markername2); @@ -45,7 +39,7 @@ commandpointsblu1 = commandpointsblu1 + reward; WARCOM_blufor_ap = WARCOM_blufor_ap + 15; publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; -_operHandler = execVM "dialog\operative\operative_mission_complete.sqf"; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] execVM "persistent\persistent_stats_missions_total.sqf"; \ No newline at end of file +_addmission = [] call duws_fnc_persistent_stats_missions_total; \ No newline at end of file diff --git a/source/missions/missions/sabotage/mission.sqf b/source/functions/missions/fn_sabotage_mission.sqf similarity index 74% rename from source/missions/missions/sabotage/mission.sqf rename to source/functions/missions/fn_sabotage_mission.sqf index a4470c7..a0ba5aa 100644 --- a/source/missions/missions/sabotage/mission.sqf +++ b/source/functions/missions/fn_sabotage_mission.sqf @@ -1,4 +1,4 @@ -_MissionPos = _this select 0; +params ["_MissionPos"]; // define random pos AROUND SOLDIERS. spawn markers at random. _radius = 150; _randompos = [(_missionpos select 0)+(random _radius)-(random _radius), (_missionpos select 1)+(random _radius)-(random _radius)]; @@ -26,7 +26,7 @@ str(_markername2) setMarkerAlpha 0.3; // create TOWER _tower = createVehicle ["Land_dp_transformer_F", _MissionPos, [], 0, "NONE"]; _tower addEventHandler ["HandleDamage", {0}]; -_tower addaction ["Sabotage", "missions\missions\sabotage\success.sqf",[_missionPos,_mission_name,_markername,_markername2]]; +_tower addaction ["Sabotage", {_this call duws_fnc_sabotage_success;},[_missionPos,_mission_name,_markername,_markername2]]; // TASK AND NOTIFICATION _VARtaskgeneratedName = format["tsksabot%1%2",round(_MissionPos select 0),round(_Missionpos select 1)]; // generate variable name for task @@ -35,10 +35,10 @@ _VARtaskgeneratedName = format["tsksabot%1%2",round(_MissionPos select 0),round( //_taskhandle setSimpleTaskDescription ["The enemy is using a power supply somewhere in this area. We need you to find it and sabotage it. It will allow us to have a bit of better intel on our enemies.",_mission_name,""]; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername)); -[west, "_taskhandle", ["taskSabot.", "The enemy is using a power supply somewhere in this area. We need you to find it and sabotage it. It will allow us to have a bit of better intel on our enemies."], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["The enemy is using a power supply somewhere in this area. We need you to find it and sabotage it. It will allow us to have a bit of better intel on our enemies.", "Sabotage"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { - execVM "utilities\autoSave.sqf"; + [] spawn duws_fnc_autoSave; }; ["TaskAssigned",["",_mission_name]] call bis_fnc_showNotification; @@ -47,8 +47,8 @@ call compile format ["%1 = _taskhandle",_VARtaskgeneratedName]; // create variab // CREATE OPFOR PATROLS sleep 1; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_missionpos, 15] execvm "createoppatrol.sqf"; // <-- around target +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createoppatrol; +[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target sleep 10; -[_missionpos, 15] execvm "createoppatrol.sqf"; // <-- around target \ No newline at end of file +[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target \ No newline at end of file diff --git a/source/missions/missions/sabotage/success.sqf b/source/functions/missions/fn_sabotage_success.sqf similarity index 89% rename from source/missions/missions/sabotage/success.sqf rename to source/functions/missions/fn_sabotage_success.sqf index 6acc93d..e86050c 100644 --- a/source/missions/missions/sabotage/success.sqf +++ b/source/functions/missions/fn_sabotage_success.sqf @@ -33,7 +33,7 @@ publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; -_operHandler = execVM "dialog\operative\operative_mission_complete.sqf"; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] execVM "persistent\persistent_stats_missions_total.sqf"; \ No newline at end of file +_addmission = [] call duws_fnc_persistent_stats_missions_total; \ No newline at end of file diff --git a/source/missions/missions/steal/mission.sqf b/source/functions/missions/fn_steal_mission.sqf similarity index 74% rename from source/missions/missions/steal/mission.sqf rename to source/functions/missions/fn_steal_mission.sqf index 876ccfe..dc91f26 100644 --- a/source/missions/missions/steal/mission.sqf +++ b/source/functions/missions/fn_steal_mission.sqf @@ -1,4 +1,4 @@ -_MissionPos = _this select 0; +params ["_MissionPos"]; // define random pos AROUND SOLDIERS. spawn markers at random. _radius = 200; _randompos = [(_missionpos select 0)+(random _radius)-(random _radius), (_missionpos select 1)+(random _radius)-(random _radius)]; @@ -27,11 +27,11 @@ str(_markername2) setMarkerSize [_radius, _radius]; str(_markername2) setMarkerAlpha 0.3; // CREATE TRUCK & CRATES -_truck1 = "O_Truck_02_transport_F" createVehicle (_missionpos); +_truck1 = Opfor_Truck_Open createVehicle (_missionpos); -_box1 = "O_supplyCrate_F" createVehicle (_missionpos); -_box2 = "O_supplyCrate_F" createVehicle (_missionpos); -_box3 = "O_supplyCrate_F" createVehicle (_missionpos); +_box1 = Opfor_Supplycrate createVehicle (_missionpos); +_box2 = Opfor_Supplycrate createVehicle (_missionpos); +_box3 = Opfor_Supplycrate createVehicle (_missionpos); _box1 attachTo [_truck1,[0,0.2,-0.8]]; _box1 setDir 90; @@ -47,24 +47,24 @@ _box3 setdir 180; //_taskhandle = player createSimpleTask ["taskSteal"]; //_taskhandle setSimpleTaskDescription ["An enemy truck full of supplies has been spotted in the area. Find it and bring it back to the base in one piece.",_mission_name,""]; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername)); -[west, "_taskhandle", ["taskSteal.", "An enemy truck full of supplies has been spotted in the area. Find it and bring it back to the base in one piece.", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["An enemy truck full of supplies has been spotted in the area. Find it and bring it back to the base in one piece.", "Grand Theft", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { - execVM "utilities\autoSave.sqf"; + [] spawn duws_fnc_autoSave; }; ["TaskAssigned",["",_mission_name]] call bis_fnc_showNotification; // CREATE PATROLS sleep 1; -[_missionpos, 15] execvm "createoppatrol.sqf"; // <-- around target -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createopteam.sqf"; +[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createopteam; _group = createGroup east; -_unit = _group createUnit ["O_Soldier_SL_F", _missionpos, [], 0, "FORM"]; -_unit = _group createUnit ["O_Soldier_LAT_F", _missionpos, [], 0, "FORM"]; -_unit = _group createUnit ["O_soldier_F", _missionpos, [], 0, "FORM"]; +_unit = _group createUnit [Opfor_Squadleader, _missionpos, [], 0, "FORM"]; +_unit = _group createUnit [Opfor_Rifleman_AT, _missionpos, [], 0, "FORM"]; +_unit = _group createUnit [Opfor_Rifleman, _missionpos, [], 0, "FORM"]; // MISSION COMPLETED -- ATTENDRE QUE LE CAMION SOIT ARRIVE A LA BASE OU DETRUIT @@ -96,10 +96,10 @@ publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; -_operHandler = execVM "dialog\operative\operative_mission_complete.sqf"; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] execVM "persistent\persistent_stats_missions_total.sqf"; +_addmission = [] call duws_fnc_persistent_stats_missions_total; sleep 2; deleteVehicle _box3; diff --git a/source/missions/stratmap.sqf b/source/functions/missions/fn_stratmap.sqf similarity index 85% rename from source/missions/stratmap.sqf rename to source/functions/missions/fn_stratmap.sqf index 329b404..6fa13d8 100644 --- a/source/missions/stratmap.sqf +++ b/source/functions/missions/fn_stratmap.sqf @@ -61,12 +61,12 @@ while {_counter < 6;} do { case 0: { // mission RESCUE //add the mission into the strat map _radius = 300; - MissionNameCase0 = [0] call compile preprocessFile "random_name.sqf"; + MissionNameCase0 = [0] call duws_fnc_random_name; PosOfCase0Mission = _foundSafepos; _missionArray = [ [(_foundSafepos select 0)+(random _radius)-(random _radius),(_foundSafepos select 1)+(random _radius)-(random _radius)], - {_handle = [PosOfCase0Mission] execVM "missions\missions\rescue\mission.sqf"; _handle = execVM "missions\missionTimer.sqf"}, + {_handle = [PosOfCase0Mission] spawn duws_fnc_rescue_mission; _handle = [] spawn duws_fnc_missionTimer}, MissionNameCase0, "A friendly patrol has been ambushed and needs to be rescued in this area", "", @@ -79,12 +79,12 @@ while {_counter < 6;} do { case 1: { // mission STEAL //add the mission into the strat map _radius = 300; - MissionNameCase1 = [0] call compile preprocessFile "random_name.sqf"; + MissionNameCase1 = [0] call duws_fnc_random_name; PosOfCase1Mission = _foundSafepos; _missionArray = [ [(_foundSafepos select 0)+(random _radius)-(random _radius),(_foundSafepos select 1)+(random _radius)-(random _radius)], - {_handle = [PosOfCase1Mission] execVM "missions\missions\steal\mission.sqf"; _handle = execVM "missions\missionTimer.sqf"}, + {_handle = [PosOfCase1Mission] spawn duws_fnc_steal_mission; _handle = [] spawn duws_fnc_missionTimer}, MissionNameCase1, "An enemy truck full of supplies is stuck somewhere here. Find it and bring it back to base safely.", "", @@ -98,12 +98,12 @@ while {_counter < 6;} do { case 2: { // mission TARGET //add the mission into the strat map _radius = 300; - MissionNameCase2 = [0] call compile preprocessFile "random_name.sqf"; + MissionNameCase2 = [0] call duws_fnc_random_name; PosOfCase2Mission = _foundSafepos; _missionArray = [ [(_foundSafepos select 0)+(random _radius)-(random _radius),(_foundSafepos select 1)+(random _radius)-(random _radius)], - {_handle = [PosOfCase2Mission] execVM "missions\missions\target\mission.sqf"; _handle = execVM "missions\missionTimer.sqf"}, + {_handle = [PosOfCase2Mission] spawn duws_fnc_target_mission; _handle = [] spawn duws_fnc_missionTimer}, MissionNameCase2, "Our intel has reported a high value target around this area, probably an officer. Find him and kill him.", "", @@ -116,12 +116,12 @@ while {_counter < 6;} do { case 3: { // mission DESTROY //add the mission into the strat map _radius = 300; - MissionNameCase3 = [0] call compile preprocessFile "random_name.sqf"; + MissionNameCase3 = [0] call duws_fnc_random_name; PosOfCase3Mission = _foundSafepos; _missionArray = [ [(_foundSafepos select 0)+(random _radius)-(random _radius),(_foundSafepos select 1)+(random _radius)-(random _radius)], - {_handle = [PosOfCase3Mission] execVM "missions\missions\destroy\mission.sqf"; _handle = execVM "missions\missionTimer.sqf"}, + {_handle = [PosOfCase3Mission] spawn duws_fnc_destroy_mission; _handle = [] spawn duws_fnc_missionTimer}, MissionNameCase3, "A major military infrastructure has been detected around this area. You must destroy it.", "", @@ -135,11 +135,11 @@ while {_counter < 6;} do { case 4: { // mission PILOT //add the mission into the strat map _radius = 300; - MissionNameCase4 = [0] call compile preprocessFile "random_name.sqf"; + MissionNameCase4 = [0] call duws_fnc_random_name; PosOfCase4Mission = _foundSafepos; _missionArray = [[(_foundSafepos select 0)+(random _radius)-(random _radius),(_foundSafepos select 1)+(random _radius)-(random _radius)], - {_handle = [PosOfCase4Mission] execVM "missions\missions\pilot\mission.sqf"; _handle = execVM "missions\missionTimer.sqf"}, + {_handle = [PosOfCase4Mission] spawn duws_fnc_pilot_mission; _handle = [] spawn duws_fnc_missionTimer}, MissionNameCase4, "One of our aircraft has been downed somewhere around this position. You must find the pilot and bring it back to base safely.", "", @@ -153,12 +153,12 @@ while {_counter < 6;} do { case 5: { // mission SABOTAGE //add the mission into the strat map _radius = 300; - MissionNameCase5 = [0] call compile preprocessFile "random_name.sqf"; + MissionNameCase5 = [0] call duws_fnc_random_name; PosOfCase5Mission = _foundSafepos; _missionArray = [ [(_foundSafepos select 0)+(random _radius)-(random _radius),(_foundSafepos select 1)+(random _radius)-(random _radius)], - {_handle = [PosOfCase5Mission] execVM "missions\missions\sabotage\mission.sqf"; _handle = execVM "missions\missionTimer.sqf"}, + {_handle = [PosOfCase5Mission] spawn duws_fnc_sabotage_mission; _handle = [] spawn duws_fnc_missionTimer}, MissionNameCase5, "The enemy is using a power supply near this location. We need to sabotage this power supply in order to know where their main infrastructures are.", "", diff --git a/source/missions/missions/target/mission.sqf b/source/functions/missions/fn_target_mission.sqf similarity index 71% rename from source/missions/missions/target/mission.sqf rename to source/functions/missions/fn_target_mission.sqf index f0aac6d..cb0f88d 100644 --- a/source/missions/missions/target/mission.sqf +++ b/source/functions/missions/fn_target_mission.sqf @@ -1,4 +1,4 @@ -_MissionPos = _this select 0; +params ["_MissionPos"]; // define random pos AROUND TARGET. spawn markers at random. _radius = 175; _randompos = [(_missionpos select 0)+(random _radius)-(random _radius), (_missionpos select 1)+(random _radius)-(random _radius)]; @@ -26,25 +26,25 @@ str(_markername2) setMarkerAlpha 0.5; // CREATE PATROLS sleep 1; -[_missionpos, 15] execvm "createoppatrol.sqf"; // <-- around target -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createopteam.sqf"; -"O_MRAP_02_F" createVehicle ([(_missionpos select 0)+(random 10),(_missionpos select 1)+(random 10)]); +[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createopteam; +Opfor_MRAP createVehicle ([(_missionpos select 0)+(random 10),(_missionpos select 1)+(random 10)]); _group = createGroup east; -_target = _group createUnit ["O_officer_F", _missionpos, [], 0, "FORM"]; -_unit = _group createUnit ["O_soldier_F", _missionpos, [], 0, "FORM"]; -_unit = _group createUnit ["O_soldier_F", _missionpos, [], 0, "FORM"]; +_target = _group createUnit [Opfor_Officer, _missionpos, [], 0, "FORM"]; +_unit = _group createUnit [Opfor_Rifleman, _missionpos, [], 0, "FORM"]; +_unit = _group createUnit [Opfor_Rifleman, _missionpos, [], 0, "FORM"]; // TASK AND NOTIFICATION //_taskhandle = player createSimpleTask ["taskTarget"]; //_taskhandle setSimpleTaskDescription ["A high enemy target has been spotted somewhere in this location. Hunt him down.",_mission_name,""]; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername)); -[west, "_taskhandle", ["taskDestroy.", "A high enemy target has been spotted somewhere in this location. Hunt him down.", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["A high ranking enemy target has been spotted somewhere in this location. Hunt him down.", "High Value Target", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { - execVM "utilities\autoSave.sqf"; + [] spawn duws_fnc_autoSave; }; ["TaskAssigned",["",_mission_name]] call bis_fnc_showNotification; @@ -72,7 +72,7 @@ publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; -_operHandler = execVM "dialog\operative\operative_mission_complete.sqf"; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] execVM "persistent\persistent_stats_missions_total.sqf"; \ No newline at end of file +_addmission = [] call duws_fnc_persistent_stats_missions_total; \ No newline at end of file diff --git a/source/missions/missions/underwater/mission.sqf b/source/functions/missions/fn_underwater_mission.sqf similarity index 83% rename from source/missions/missions/underwater/mission.sqf rename to source/functions/missions/fn_underwater_mission.sqf index 9bbf4e0..9af59f2 100644 --- a/source/missions/missions/underwater/mission.sqf +++ b/source/functions/missions/fn_underwater_mission.sqf @@ -1,4 +1,4 @@ -_MissionPos = _this select 0; +params ["_MissionPos"]; // define random pos AROUND SOLDIERS. spawn markers at random. _radius = 150; _randompos = [(_missionpos select 0)+(random _radius)-(random _radius), (_missionpos select 1)+(random _radius)-(random _radius)]; @@ -25,7 +25,7 @@ str(_markername2) setMarkerAlpha 0.3; // create TOWER _tower = createVehicle ["Land_dp_transformer_F", _MissionPos, [], 0, "NONE"]; -_tower addaction ["Sabotage", "missions\missions\sabotage\success.sqf",[_missionPos,_mission_name,_markername,_markername2]]; +_tower addaction ["Sabotage", {_this call duws_fnc_sabotage_success;},[_missionPos,_mission_name,_markername,_markername2]]; // TASK AND NOTIFICATION _VARtaskgeneratedName = format["tsksabot%1%2",round(_MissionPos select 0),round(_Missionpos select 1)]; // generate variable name for task @@ -37,7 +37,7 @@ _VARtaskgeneratedName = format["tsksabot%1%2",round(_MissionPos select 0),round( [west, "_taskhandle", ["taskDestroy.", "The enemy is using a power supply somewhere in this area. We need you to find it and sabotage it. It will allow us to have a bit of better intel on our enemies.", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { - execVM "utilities\autoSave.sqf"; + [] spawn duws_fnc_autoSave; }; ["TaskAssigned",["",_mission_name]] call bis_fnc_showNotification; @@ -47,8 +47,8 @@ call compile format ["%1 = _taskhandle",_VARtaskgeneratedName]; // create variab // CREATE OPFOR PATROLS sleep 1; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_randompos, _radius] execvm "createoppatrol.sqf"; -[_missionpos, 15] execvm "createoppatrol.sqf"; // <-- around target +[_randompos, _radius] call duws_fnc_createoppatrol; +[_randompos, _radius] call duws_fnc_createoppatrol; +[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target sleep 10; -[_missionpos, 15] execvm "createoppatrol.sqf"; // <-- around target \ No newline at end of file +[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target \ No newline at end of file diff --git a/source/missions/missions/underwater/success.sqf b/source/functions/missions/fn_underwater_success.sqf similarity index 94% rename from source/missions/missions/underwater/success.sqf rename to source/functions/missions/fn_underwater_success.sqf index a0330f0..f525c1f 100644 --- a/source/missions/missions/underwater/success.sqf +++ b/source/functions/missions/fn_underwater_success.sqf @@ -38,4 +38,4 @@ finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; // ADD PERSISTENT STAT -_addmission = [] execVM "persistent\persistent_stats_missions_total.sqf"; \ No newline at end of file +_addmission = [] call duws_fnc_persistent_stats_missions_total; \ No newline at end of file diff --git a/source/dialog/operative/lbselected.sqf b/source/functions/operative/fn_lbselected.sqf similarity index 92% rename from source/dialog/operative/lbselected.sqf rename to source/functions/operative/fn_lbselected.sqf index f227e71..f6deaaa 100644 --- a/source/dialog/operative/lbselected.sqf +++ b/source/functions/operative/fn_lbselected.sqf @@ -28,7 +28,7 @@ _selected_soldier_status = _selected_soldier select 7; switch (_selected_soldier_status) do { case "Ready": { - buttonSetAction [1601, "execVM 'dialog\operative\operator_recruit.sqf'"]; + buttonSetAction [1601, "[] spawn duws_fnc_operator_recruit"]; ctrlSetText [1601, "DEPLOY (5 CP)"]; }; case "Injured": { @@ -40,7 +40,7 @@ switch (_selected_soldier_status) do ctrlSetText [1601, "ALREADY DEPLOYED"]; }; case "Healed": { - buttonSetAction [1601, "execVM 'dialog\operative\operator_recruit.sqf'"]; + buttonSetAction [1601, "[] spawn duws_fnc_operator_recruit"]; ctrlSetText [1601, "REDEPLOY (2 CP)"]; }; }; \ No newline at end of file diff --git a/source/dialog/operative/operative_mission_complete.sqf b/source/functions/operative/fn_operative_mission_complete.sqf similarity index 100% rename from source/dialog/operative/operative_mission_complete.sqf rename to source/functions/operative/fn_operative_mission_complete.sqf diff --git a/source/functions/operative/fn_operator_add_aim.sqf b/source/functions/operative/fn_operator_add_aim.sqf new file mode 100644 index 0000000..dfb6e40 --- /dev/null +++ b/source/functions/operative/fn_operator_add_aim.sqf @@ -0,0 +1,16 @@ + +_selected_index = lbCurSel 1500; +_selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index + +_selected_soldier_aim = _selected_soldier select 0; +_selected_soldier_points = _selected_soldier select 13; +if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; +if (_selected_soldier_aim >= 1) exitWith {hint "This stat is already at the maximum"}; + +_selected_soldier_aim_new = _selected_soldier_aim + 0.01; // update the variable +_selected_soldier set [0,_selected_soldier_aim_new]; + +_selected_soldier_pts_new = _selected_soldier_points - 1; +_selected_soldier set [13,_selected_soldier_pts_new]; +[] call duws_fnc_lbselected; +hint "New stats will be applied at the next deployment of this operative"; \ No newline at end of file diff --git a/source/functions/operative/fn_operator_add_comms.sqf b/source/functions/operative/fn_operator_add_comms.sqf new file mode 100644 index 0000000..ff9ff00 --- /dev/null +++ b/source/functions/operative/fn_operator_add_comms.sqf @@ -0,0 +1,15 @@ +_selected_index = lbCurSel 1500; +_selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index + +_selected_soldier_comms = _selected_soldier select 4; +_selected_soldier_points = _selected_soldier select 13; +if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; +if (_selected_soldier_comms >= 1) exitWith {hint "This stat is already at the maximum"}; + +_selected_soldier_comms_new = _selected_soldier_comms + 0.01; // update the variable +_selected_soldier set [4,_selected_soldier_comms_new]; + +_selected_soldier_pts_new = _selected_soldier_points - 1; +_selected_soldier set [13,_selected_soldier_pts_new]; +[] call duws_fnc_lbselected; +hint "New stats will be applied at the next deployment of this operative"; \ No newline at end of file diff --git a/source/functions/operative/fn_operator_add_courage.sqf b/source/functions/operative/fn_operator_add_courage.sqf new file mode 100644 index 0000000..5cd500b --- /dev/null +++ b/source/functions/operative/fn_operator_add_courage.sqf @@ -0,0 +1,15 @@ +_selected_index = lbCurSel 1500; +_selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index + +_selected_soldier_courage = _selected_soldier select 3; +_selected_soldier_points = _selected_soldier select 13; +if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; +if (_selected_soldier_courage >= 1) exitWith {hint "This stat is already at the maximum"}; + +_selected_soldier_courage_new = _selected_soldier_courage + 0.01; // update the variable +_selected_soldier set [3,_selected_soldier_courage_new]; + +_selected_soldier_pts_new = _selected_soldier_points - 1; +_selected_soldier set [13,_selected_soldier_pts_new]; +[] call duws_fnc_lbselected; +hint "New stats will be applied at the next deployment of this operative"; \ No newline at end of file diff --git a/source/functions/operative/fn_operator_add_reflexes.sqf b/source/functions/operative/fn_operator_add_reflexes.sqf new file mode 100644 index 0000000..98bb578 --- /dev/null +++ b/source/functions/operative/fn_operator_add_reflexes.sqf @@ -0,0 +1,15 @@ +_selected_index = lbCurSel 1500; +_selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index + +_selected_soldier_reflexes = _selected_soldier select 1; +_selected_soldier_points = _selected_soldier select 13; +if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; +if (_selected_soldier_reflexes >= 1) exitWith {hint "This stat is already at the maximum"}; + +_selected_soldier_reflexes_new = _selected_soldier_reflexes + 0.01; // update the variable +_selected_soldier set [1,_selected_soldier_reflexes_new]; + +_selected_soldier_pts_new = _selected_soldier_points - 1; +_selected_soldier set [13,_selected_soldier_pts_new]; +[] call duws_fnc_lbselected; +hint "New stats will be applied at the next deployment of this operative"; \ No newline at end of file diff --git a/source/functions/operative/fn_operator_add_reload.sqf b/source/functions/operative/fn_operator_add_reload.sqf new file mode 100644 index 0000000..e1714c4 --- /dev/null +++ b/source/functions/operative/fn_operator_add_reload.sqf @@ -0,0 +1,15 @@ +_selected_index = lbCurSel 1500; +_selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index + +_selected_soldier_reload = _selected_soldier select 5; +_selected_soldier_points = _selected_soldier select 13; +if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; +if (_selected_soldier_reload >= 1) exitWith {hint "This stat is already at the maximum"}; + +_selected_soldier_reload_new = _selected_soldier_reload + 0.01; // update the variable +_selected_soldier set [5,_selected_soldier_reload_new]; + +_selected_soldier_pts_new = _selected_soldier_points - 1; +_selected_soldier set [13,_selected_soldier_pts_new]; +[] call duws_fnc_lbselected; +hint "New stats will be applied at the next deployment of this operative"; \ No newline at end of file diff --git a/source/functions/operative/fn_operator_add_spotting.sqf b/source/functions/operative/fn_operator_add_spotting.sqf new file mode 100644 index 0000000..c546046 --- /dev/null +++ b/source/functions/operative/fn_operator_add_spotting.sqf @@ -0,0 +1,16 @@ + +_selected_index = lbCurSel 1500; +_selected_soldier = duws_operator_list select _selected_index; // get the selected soldier from the array of soldier using the selected index + +_selected_soldier_spotting = _selected_soldier select 2; +_selected_soldier_points = _selected_soldier select 13; +if (_selected_soldier_points <= 0) exitWith {hint "You have no points available"}; +if (_selected_soldier_spotting >= 1) exitWith {hint "This stat is already at the maximum"}; + +_selected_soldier_spotting_new = _selected_soldier_spotting + 0.01; // update the variable +_selected_soldier set [2,_selected_soldier_spotting_new]; + +_selected_soldier_pts_new = _selected_soldier_points - 1; +_selected_soldier set [13,_selected_soldier_pts_new]; +[] call duws_fnc_lbselected; +hint "New stats will be applied at the next deployment of this operative"; diff --git a/source/dialog/operative/operator_open.sqf b/source/functions/operative/fn_operator_open.sqf similarity index 100% rename from source/dialog/operative/operator_open.sqf rename to source/functions/operative/fn_operator_open.sqf diff --git a/source/dialog/operative/operator_recruit.sqf b/source/functions/operative/fn_operator_recruit.sqf similarity index 100% rename from source/dialog/operative/operator_recruit.sqf rename to source/functions/operative/fn_operator_recruit.sqf diff --git a/source/pFLIR/livefeed.sqf b/source/functions/pFLIR/fn_livefeed.sqf similarity index 85% rename from source/pFLIR/livefeed.sqf rename to source/functions/pFLIR/fn_livefeed.sqf index 2474663..02a56aa 100644 --- a/source/pFLIR/livefeed.sqf +++ b/source/functions/pFLIR/fn_livefeed.sqf @@ -1,4 +1,4 @@ -// pFLIRenable = player addaction ["Activate FLIR","pflir\livefeed.sqf","", 0,false,true,"","_target == _this"]; +// pFLIRenable = player addaction ["Activate FLIR",{_this spawn duws_fnc_livefeed},"", 0,false,true,"","_target == _this"]; // pflir aim trucPIPtarget = "Land_Sack_F" createVehicle ([0,0,0]); // PAS OUBLIER DE SUPPRIMER LE TRUC @@ -43,8 +43,8 @@ switch (_actualStance) do // add action to disable FLIR sleep 1; -pFLIRdisable = player addaction ["Deactivate FLIR","pflir\livefeedexit.sqf","", 0,false,true,"","_target == _this"]; -PlayerKilledEH2 = player addEventHandler ["killed", {execvm "pflir\livefeedexit.sqf"}]; //removes screen from hud +pFLIRdisable = player addaction ["Deactivate FLIR",{_this spawn duws_fnc_livefeedexit},"", 0,false,true,"","_target == _this"]; +PlayerKilledEH2 = player addEventHandler ["killed", {[] spawn duws_fnc_livefeedexit}]; //removes screen from hud diff --git a/source/pFLIR/livefeed1.sqf b/source/functions/pFLIR/fn_livefeed1.sqf similarity index 85% rename from source/pFLIR/livefeed1.sqf rename to source/functions/pFLIR/fn_livefeed1.sqf index 7bccd6f..e860fdb 100644 --- a/source/pFLIR/livefeed1.sqf +++ b/source/functions/pFLIR/fn_livefeed1.sqf @@ -1,4 +1,4 @@ -// pFLIRenable = player addaction ["Activate FLIR","pflir\livefeed.sqf","", 0,false,true,"","_target == _this"]; +// pFLIRenable = player addaction ["Activate FLIR",{_this spawn duws_fnc_livefeed1},"", 0,false,true,"","_target == _this"]; // pflir aim trucPIPtarget = "Land_Sack_F" createVehicle ([0,0,0]); // PAS OUBLIER DE SUPPRIMER LE TRUC @@ -43,8 +43,8 @@ switch (_actualStance) do // add action to disable FLIR sleep 1; -pFLIRdisable = player addaction ["Deactivate FLIR","pflir\livefeedexit.sqf","", 0,false,true,"","_target == _this"]; -PlayerKilledEH2 = player addEventHandler ["killed", {execvm "pflir\livefeedexit.sqf"}]; //removes screen from hud +pFLIRdisable = player addaction ["Deactivate FLIR",{_this spawn duws_fnc_livefeedexit},"", 0,false,true,"","_target == _this"]; +PlayerKilledEH2 = player addEventHandler ["killed", {[] spawn duws_fnc_livefeedexit}]; //removes screen from hud diff --git a/source/pFLIR/livefeedexit.sqf b/source/functions/pFLIR/fn_livefeedexit.sqf similarity index 62% rename from source/pFLIR/livefeedexit.sqf rename to source/functions/pFLIR/fn_livefeedexit.sqf index b7673c9..7e4913f 100644 --- a/source/pFLIR/livefeedexit.sqf +++ b/source/functions/pFLIR/fn_livefeedexit.sqf @@ -9,7 +9,7 @@ player removeEventHandler ["killed",PlayerKilledEH2]; sleep 2; waitUntil {alive player}; -pFLIRenable = player addaction ["Enable FLIR","pflir\livefeed.sqf","", 0,false,true,"","_target == _this"]; //original last line in script +pFLIRenable = player addaction ["Enable FLIR",{_this spawn duws_fnc_livefeed},"", 0,false,true,"","_target == _this"]; //original last line in script -PlayerKilledEH3 = player addEventHandler ["respawn",{player addaction ["Enable FLIR","pflir\livefeed.sqf","", 0,false,true,"","_target == _this"]}]; +PlayerKilledEH3 = player addEventHandler ["respawn",{player addaction ["Enable FLIR",{_this spawn duws_fnc_livefeed},"", 0,false,true,"","_target == _this"]}]; diff --git a/source/persistent/experience/experience_ability_check.sqf b/source/functions/persistent/fn_experience_ability_check.sqf similarity index 85% rename from source/persistent/experience/experience_ability_check.sqf rename to source/functions/persistent/fn_experience_ability_check.sqf index fda5aa9..a620d98 100644 --- a/source/persistent/experience/experience_ability_check.sqf +++ b/source/functions/persistent/fn_experience_ability_check.sqf @@ -1,7 +1,7 @@ // Abilities based on the players accumulated experience is enabled here. waitUntil {sleep 2; experience_total>=5}; -_handle = [player] execVM "persistent\experience\experience_ability_stamina.sqf"; +_handle = [player] spawn duws_fnc_experience_ability_stamina; ["new_ability",["New ability: Enhanced Conditioning","Boost your endurance, evade and escape enemies"]] call bis_fnc_showNotification; ["new_ability",["Abilities","More info on abilities inside the briefing"]] call bis_fnc_showNotification; _index = player createDiarySubject ["abilities_info","Abilities"]; @@ -11,47 +11,47 @@ player createDiaryRecord ["abilities_info", ["Enhanced Conditioning", "=15}; if (!isMultiplayer) then { - _handle = [player] execVM "persistent\experience\experience_ability_slowtime.sqf"; + _handle = [player] spawn duws_fnc_experience_ability_slowtime; ["new_ability",["New ability: Quick Reflexes","Slow down time, take your shot"]] call bis_fnc_showNotification; player createDiaryRecord ["abilities_info", ["Quick Reflexes", "Cooldown: 5 minutes
Description:
When activated through the radio menu, the time is slowed down for around 12 seconds, allowing you to clear rooms, compound or kill in a brief amount of time a group of enemies."]]; } else { // Place holder until a new skill can be thought up. :-) - _handle = [player] execVM "persistent\experience\experience_ability_logistic.sqf"; + _handle = [player] spawn duws_fnc_experience_ability_logistic; ["new_ability",["New ability: Logistic Support","They're sending lots of resources your way"]] call bis_fnc_showNotification; player createDiaryRecord ["abilities_info", ["Logistic Support", "Cooldown: 15 minutes (passive)
Description:
This passive ability gives you +1 command point every 15 minutes."]]; }; waitUntil {sleep 2; experience_total>=25}; -_handle = [player] execVM "persistent\experience\experience_ability_heal.sqf"; +_handle = [player] spawn duws_fnc_experience_ability_heal; ["new_ability",["New ability: Field Surgery","You are really hard to kill, you know that ?"]] call bis_fnc_showNotification; player createDiaryRecord ["abilities_info", ["Field Surgery", "Cooldown: 20 minutes
Description:
When activated through the radio menu, you will be fully healed after a short period of time"]]; waitUntil {sleep 2; experience_total>=30}; -_handle = [player] execVM "persistent\experience\experience_ability_fieldcomm.sqf"; +_handle = [player] spawn duws_fnc_experience_ability_fieldcomm; ["new_ability",["New ability: Field Commander","Leading the way"]] call bis_fnc_showNotification; player createDiaryRecord ["abilities_info", ["Field Commander", "Cooldown: N/A
Description:
You can now access the squad manager when you want."]]; waitUntil {sleep 2; experience_total>=35}; -_handle = [player] execVM "persistent\experience\experience_ability_warrior.sqf"; +_handle = [player] spawn duws_fnc_experience_ability_warrior; ["new_ability",["New ability: Veteran Instinct","I think I saw someone around this corner..."]] call bis_fnc_showNotification; player createDiaryRecord ["abilities_info", ["Veteran Instinct", "Cooldown: 10 minutes
Description:
When activated through the radio menu, for 60 seconds you will know if the zone in a radius of 50 meters around you is clear of enemies or not."]]; waitUntil {sleep 2; experience_total>=45}; -_handle = [player] execVM "persistent\experience\experience_ability_refit.sqf"; +_handle = [player] spawn duws_fnc_experience_ability_refit; ["new_ability",["New ability: Field Repair","Did someone say MacGyver ?"]] call bis_fnc_showNotification; player createDiaryRecord ["abilities_info", ["Field Repair", "Cooldown: 1 hour
Description:
When activated through the radio menu, the vehicle in which you are inside will be repaired, and a little bit of fuel added."]]; waitUntil {sleep 2; experience_total>=55}; if (!isMultiplayer) then { - _handle = [player] execVM "persistent\experience\experience_ability_logistic.sqf"; + _handle = [player] spawn duws_fnc_experience_ability_logistic; ["new_ability",["New ability: Logistic Support","They're sending lots of ressources your way"]] call bis_fnc_showNotification; player createDiaryRecord ["abilities_info", ["Logistic Support", "Cooldown: 15 minutes (passive)
Description:
This passive ability gives you +1 command point every 15 minutes."]]; } else { - _handle = [player] execVM "persistent\experience\experience_ability_logistic_boost.sqf"; + _handle = [player] spawn duws_fnc_experience_ability_logistic_boost; ["new_ability",["New ability: Logistic Boost","We are committed to winning."]] call bis_fnc_showNotification; player createDiaryRecord ["abilities_info", ["Logistic Boost", "Cooldown: 30 minutes (passive)
Description:
This passive ability gives you +5 command point every 30 minutes."]]; }; \ No newline at end of file diff --git a/source/functions/persistent/fn_experience_ability_fieldcomm.sqf b/source/functions/persistent/fn_experience_ability_fieldcomm.sqf new file mode 100644 index 0000000..d0acafe --- /dev/null +++ b/source/functions/persistent/fn_experience_ability_fieldcomm.sqf @@ -0,0 +1,7 @@ +player addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; + + + + + + \ No newline at end of file diff --git a/source/persistent/experience/experience_ability_heal.sqf b/source/functions/persistent/fn_experience_ability_heal.sqf similarity index 100% rename from source/persistent/experience/experience_ability_heal.sqf rename to source/functions/persistent/fn_experience_ability_heal.sqf diff --git a/source/persistent/experience/experience_ability_logistic.sqf b/source/functions/persistent/fn_experience_ability_logistic.sqf similarity index 100% rename from source/persistent/experience/experience_ability_logistic.sqf rename to source/functions/persistent/fn_experience_ability_logistic.sqf diff --git a/source/persistent/experience/experience_ability_logistic_boost.sqf b/source/functions/persistent/fn_experience_ability_logistic_boost.sqf similarity index 100% rename from source/persistent/experience/experience_ability_logistic_boost.sqf rename to source/functions/persistent/fn_experience_ability_logistic_boost.sqf diff --git a/source/persistent/experience/experience_ability_refit.sqf b/source/functions/persistent/fn_experience_ability_refit.sqf similarity index 100% rename from source/persistent/experience/experience_ability_refit.sqf rename to source/functions/persistent/fn_experience_ability_refit.sqf diff --git a/source/persistent/experience/experience_ability_slowtime.sqf b/source/functions/persistent/fn_experience_ability_slowtime.sqf similarity index 100% rename from source/persistent/experience/experience_ability_slowtime.sqf rename to source/functions/persistent/fn_experience_ability_slowtime.sqf diff --git a/source/persistent/experience/experience_ability_stamina.sqf b/source/functions/persistent/fn_experience_ability_stamina.sqf similarity index 100% rename from source/persistent/experience/experience_ability_stamina.sqf rename to source/functions/persistent/fn_experience_ability_stamina.sqf diff --git a/source/persistent/experience/experience_ability_warrior.sqf b/source/functions/persistent/fn_experience_ability_warrior.sqf similarity index 100% rename from source/persistent/experience/experience_ability_warrior.sqf rename to source/functions/persistent/fn_experience_ability_warrior.sqf diff --git a/source/persistent/experience/experience_init.sqf b/source/functions/persistent/fn_experience_init.sqf similarity index 85% rename from source/persistent/experience/experience_init.sqf rename to source/functions/persistent/fn_experience_init.sqf index db774cd..0a8fb29 100644 --- a/source/persistent/experience/experience_init.sqf +++ b/source/functions/persistent/fn_experience_init.sqf @@ -16,4 +16,4 @@ experience_total = experience_missions + experience_zones + experience_islands; }; }; -_handle = [] execVM "persistent\experience\experience_ability_check.sqf" // lance le script de check de l'xp. \ No newline at end of file +[] spawn duws_fnc_experience_ability_check // lance le script de check de l'xp. \ No newline at end of file diff --git a/source/persistent/persistent_stats_init.sqf b/source/functions/persistent/fn_persistent_stats_init.sqf similarity index 95% rename from source/persistent/persistent_stats_init.sqf rename to source/functions/persistent/fn_persistent_stats_init.sqf index 96af581..6fdb938 100644 --- a/source/persistent/persistent_stats_init.sqf +++ b/source/functions/persistent/fn_persistent_stats_init.sqf @@ -41,5 +41,4 @@ mission_DUWS_firstlaunch = profileNamespace getVariable "profile_DUWS_firstlaunc // Lance l'init de l'xp -_handle = [] execVM "persistent\experience\experience_init.sqf"; -waitUntil {scriptDone _handle}; +[] call duws_fnc_experience_init; diff --git a/source/persistent/persistent_stats_missions_total.sqf b/source/functions/persistent/fn_persistent_stats_missions_total.sqf similarity index 100% rename from source/persistent/persistent_stats_missions_total.sqf rename to source/functions/persistent/fn_persistent_stats_missions_total.sqf diff --git a/source/persistent/persistent_stats_reset.sqf b/source/functions/persistent/fn_persistent_stats_reset.sqf similarity index 100% rename from source/persistent/persistent_stats_reset.sqf rename to source/functions/persistent/fn_persistent_stats_reset.sqf diff --git a/source/persistent/persistent_stats_win.sqf b/source/functions/persistent/fn_persistent_stats_win.sqf similarity index 100% rename from source/persistent/persistent_stats_win.sqf rename to source/functions/persistent/fn_persistent_stats_win.sqf diff --git a/source/persistent/persistent_stats_zones_add.sqf b/source/functions/persistent/fn_persistent_stats_zones_add.sqf similarity index 100% rename from source/persistent/persistent_stats_zones_add.sqf rename to source/functions/persistent/fn_persistent_stats_zones_add.sqf diff --git a/source/initZones/prefabs/Barracks.sqf b/source/functions/prefabs/fn_site_Barracks.sqf similarity index 100% rename from source/initZones/prefabs/Barracks.sqf rename to source/functions/prefabs/fn_site_Barracks.sqf diff --git a/source/initZones/prefabs/CommStation.sqf b/source/functions/prefabs/fn_site_CommStation.sqf similarity index 100% rename from source/initZones/prefabs/CommStation.sqf rename to source/functions/prefabs/fn_site_CommStation.sqf diff --git a/source/initZones/prefabs/campsite.sqf b/source/functions/prefabs/fn_site_campsite.sqf similarity index 98% rename from source/initZones/prefabs/campsite.sqf rename to source/functions/prefabs/fn_site_campsite.sqf index 139e82e..3d3ab5f 100644 --- a/source/initZones/prefabs/campsite.sqf +++ b/source/functions/prefabs/fn_site_campsite.sqf @@ -215,7 +215,7 @@ _this setPos [(1820.2357)-_centerX+_centerSpawnX, (5625.1577)-_centerY+_centerSp _vehicle_34 = objNull; if (true) then { -_this = createVehicle ["B_G_Offroad_01_armed_F", [1818.2542, 5619.2583, 0.090222724], [], 0, "CAN_COLLIDE"]; +_this = createVehicle ["Land_Wreck_Ural_F", [1818.2542, 5619.2583, 0.090222724], [], 0, "CAN_COLLIDE"]; _vehicle_34 = _this; _this setDir 197.77122; _this setPos [(1818.2542)-_centerX+_centerSpawnX, (5619.2583)-_centerY+_centerSpawnY, 0.090222724]; @@ -233,7 +233,7 @@ _this setPos [(1814.3376)-_centerX+_centerSpawnX, (5622.2422)-_centerY+_centerSp _vehicle_39 = objNull; if (true) then { -_this = createVehicle ["O_Quadbike_01_F", [1818.0513, 5627.2832, 0.11207256], [], 0, "CAN_COLLIDE"]; +_this = createVehicle [Opfor_Quadbike, [1818.0513, 5627.2832, 0.11207256], [], 0, "CAN_COLLIDE"]; _vehicle_39 = _this; _this setDir 211.33353; _this setPos [(1818.0513)-_centerX+_centerSpawnX, (5627.2832)-_centerY+_centerSpawnY, 0.11207256]; diff --git a/source/initZones/prefabs/commandOP.sqf b/source/functions/prefabs/fn_site_commandOP.sqf similarity index 99% rename from source/initZones/prefabs/commandOP.sqf rename to source/functions/prefabs/fn_site_commandOP.sqf index 96204b6..1c67c1a 100644 --- a/source/initZones/prefabs/commandOP.sqf +++ b/source/functions/prefabs/fn_site_commandOP.sqf @@ -445,7 +445,7 @@ if (true) then _vehicle_159 = objNull; if (true) then { - _this = createVehicle ["O_supplyCrate_F", [1799.2623, 5582.4023, 9.5367432e-007], [], 0, "CAN_COLLIDE"]; + _this = createVehicle [Opfor_Supplycrate, [1799.2623, 5582.4023, 9.5367432e-007], [], 0, "CAN_COLLIDE"]; _vehicle_159 = _this; _this setDir 103.3849; _this setPos [(1799.2623)-_centerX+_centerSpawnX, (5582.4023)-_centerY+_centerSpawnY, 9.5367432e-007]; @@ -578,7 +578,7 @@ if (true) then _vehicle_204 = objNull; if (true) then { - _this = createVehicle ["O_supplyCrate_F", [1809.151, 5571.9531, 1.9073486e-006], [], 0, "CAN_COLLIDE"]; + _this = createVehicle [Opfor_Supplycrate, [1809.151, 5571.9531, 1.9073486e-006], [], 0, "CAN_COLLIDE"]; _vehicle_204 = _this; _this setDir 135.43332; _this setPos [(1809.151)-_centerX+_centerSpawnX, (5571.9531)-_centerY+_centerSpawnY, 1.9073486e-006]; @@ -587,7 +587,7 @@ if (true) then _vehicle_207 = objNull; if (true) then { - _this = createVehicle ["O_supplyCrate_F", [1810.049, 5570.918, 6.1988831e-006], [], 0, "CAN_COLLIDE"]; + _this = createVehicle [Opfor_Supplycrate, [1810.049, 5570.918, 6.1988831e-006], [], 0, "CAN_COLLIDE"]; _vehicle_207 = _this; _this setDir 118.68628; _this setPos [(1810.049)-_centerX+_centerSpawnX, (5570.918)-_centerY+_centerSpawnY, 6.1988831e-006]; diff --git a/source/initZones/prefabs/outpost1.sqf b/source/functions/prefabs/fn_site_outpost1.sqf similarity index 100% rename from source/initZones/prefabs/outpost1.sqf rename to source/functions/prefabs/fn_site_outpost1.sqf diff --git a/source/initZones/prefabs/outpost2.sqf b/source/functions/prefabs/fn_site_outpost2.sqf similarity index 100% rename from source/initZones/prefabs/outpost2.sqf rename to source/functions/prefabs/fn_site_outpost2.sqf diff --git a/source/initZones/prefabs/powerRelay.sqf b/source/functions/prefabs/fn_site_powerRelay.sqf similarity index 98% rename from source/initZones/prefabs/powerRelay.sqf rename to source/functions/prefabs/fn_site_powerRelay.sqf index 2f05c08..38e04bb 100644 --- a/source/initZones/prefabs/powerRelay.sqf +++ b/source/functions/prefabs/fn_site_powerRelay.sqf @@ -182,7 +182,7 @@ if (true) then _vehicle_74 = objNull; if (true) then { - _this = createVehicle ["O_Truck_02_covered_F", [1810.3815, 5620.46], [], 0, "CAN_COLLIDE"]; + _this = createVehicle [Opfor_Truck_Covered, [1810.3815, 5620.46], [], 0, "CAN_COLLIDE"]; _vehicle_74 = _this; _this setDir 3.5739508; _this setPos [(1810.3815)-_centerX+_centerSpawnX, (5620.46)-_centerY+_centerSpawnY]; diff --git a/source/initZones/prefabs/reconOutpost.sqf b/source/functions/prefabs/fn_site_reconOutpost.sqf similarity index 100% rename from source/initZones/prefabs/reconOutpost.sqf rename to source/functions/prefabs/fn_site_reconOutpost.sqf diff --git a/source/initZones/prefabs/researchBunker.sqf b/source/functions/prefabs/fn_site_researchBunker.sqf similarity index 100% rename from source/initZones/prefabs/researchBunker.sqf rename to source/functions/prefabs/fn_site_researchBunker.sqf diff --git a/source/initZones/prefabs/researchStation.sqf b/source/functions/prefabs/fn_site_researchStation.sqf similarity index 100% rename from source/initZones/prefabs/researchStation.sqf rename to source/functions/prefabs/fn_site_researchStation.sqf diff --git a/source/initZones/prefabs/vehfittingstation.sqf b/source/functions/prefabs/fn_site_vehfittingstation.sqf similarity index 97% rename from source/initZones/prefabs/vehfittingstation.sqf rename to source/functions/prefabs/fn_site_vehfittingstation.sqf index 5968b64..85e342a 100644 --- a/source/initZones/prefabs/vehfittingstation.sqf +++ b/source/functions/prefabs/fn_site_vehfittingstation.sqf @@ -117,7 +117,7 @@ if (true) then _vehicle_105 = objNull; if (true) then { - _this = createVehicle ["O_Truck_02_transport_F", [1802.9224, 5576.1797, 1.0490417e-005], [], 0, "CAN_COLLIDE"]; + _this = createVehicle [Opfor_Truck_Open, [1802.9224, 5576.1797, 1.0490417e-005], [], 0, "CAN_COLLIDE"]; _vehicle_105 = _this; _this setDir 187.68138; _this setPos [(1802.9224)-_centerX+_centerSpawnX, (5576.1797)-_centerY+_centerSpawnY, 1.0490417e-005]; @@ -126,7 +126,7 @@ if (true) then _vehicle_107 = objNull; if (true) then { - _this = createVehicle ["O_Truck_02_covered_F", [1802.2045, 5585.0039, 8.5830688e-006], [], 0, "CAN_COLLIDE"]; + _this = createVehicle [Opfor_Truck_Covered, [1802.2045, 5585.0039, 8.5830688e-006], [], 0, "CAN_COLLIDE"]; _vehicle_107 = _this; _this setDir 141.58446; _this setPos [(1802.2045)-_centerX+_centerSpawnX, (5585.0039)-_centerY+_centerSpawnY, 8.5830688e-006]; @@ -364,7 +364,7 @@ if (true) then _vehicle_183 = objNull; if (true) then { - _this = createVehicle ["O_supplyCrate_F", [1805.4933, 5574.2349, 1.3851749], [], 0, "CAN_COLLIDE"]; + _this = createVehicle [Opfor_Supplycrate, [1805.4933, 5574.2349, 1.3851749], [], 0, "CAN_COLLIDE"]; _vehicle_183 = _this; _this setDir 64.2202; _this setPos [(1805.4933)-_centerX+_centerSpawnX, (5574.2349)-_centerY+_centerSpawnY, 1.3851749]; @@ -373,7 +373,7 @@ if (true) then _vehicle_184 = objNull; if (true) then { - _this = createVehicle ["O_MRAP_02_F", [1816.5087, 5582.4043], [], 0, "CAN_COLLIDE"]; + _this = createVehicle [Opfor_MRAP, [1816.5087, 5582.4043], [], 0, "CAN_COLLIDE"]; _vehicle_184 = _this; _this setDir -9.1138811; _this setPos [(1816.5087)-_centerX+_centerSpawnX, (5582.4043)-_centerY+_centerSpawnY]; diff --git a/source/initZones/old/createzone.sqf b/source/functions/prefabs/old/createzone.sqf similarity index 72% rename from source/initZones/old/createzone.sqf rename to source/functions/prefabs/old/createzone.sqf index 28939bc..6c5837d 100644 --- a/source/initZones/old/createzone.sqf +++ b/source/functions/prefabs/old/createzone.sqf @@ -1,6 +1,7 @@ // _trg = ["Outpost Airbase",5,50,this,true] execvm "createzone.sqf"; // Name of the place,pts,radius,this,fortified/not // +// New usage: _trg = ["Outpost Airbase",5,50,this,true] spawn duws_fnc_createzone _place = _this select 0; _points = _this select 1; @@ -52,7 +53,7 @@ str(_markername2) setMarkerAlpha 0.1; _trg=createTrigger["EmptyDetector",getPos _trigger]; _trg setTriggerArea[_size,_size,0,false]; _trg setTriggerActivation["WEST SEIZED","PRESENT",false]; -_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4""] execvm 'captured.sqf'",_place,_points,_markername,_markername2], ""]; +_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4""] spawn duws_fnc_captured",_place,_points,_markername,_markername2], ""]; _trg setTriggerTimeout [30, 60, 300, true ]; // hint format["""%1"",%2",_place,_points]; @@ -62,52 +63,52 @@ _trg2=createTrigger["EmptyDetector",getPos _trigger]; _trg2 triggerAttachVehicle [player1]; _trg2 setTriggerArea[_size,_size,0,false]; _trg2 setTriggerActivation["VEHICLE","PRESENT",true]; -_trg2 setTriggerStatements["this", format["[""%1"",thislist] execvm 'enterlocation.sqf'",_place], ""]; +_trg2 setTriggerStatements["this", format["[""%1"",thislist] spawn duws_fnc_enterlocation",_place], ""]; // CREATE OPFOR. HEAVY CLUSTERFUCK INCOMING. // Check if fortified is true if (_fortified) then { - [getpos _trigger] execvm "createopfortified.sqf"; + [getpos _trigger] call duws_fnc_createopfortified; sleep 2; }; // Check if radius is 100m or smaller => create 2 patrols then exit the script if (_size < 101) exitWith { - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; }; // Check if radius is 250m-100m => create 2 patrols and 1 fireteam then exit the script if (_size < 251) exitWith { - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [getpos _trigger, _size] execvm "createopteam.sqf"; + [getpos _trigger, _size] call duws_fnc_createopteam }; // Check if radius is 250m-500m => create 2 patrols and 2 fireteams then exit the script if (_size < 501) exitWith { - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [getpos _trigger, _size] execvm "createopteam.sqf"; + [getpos _trigger, _size] call duws_fnc_createopteam sleep 3; - [getpos _trigger, _size] execvm "createopteam.sqf"; + [getpos _trigger, _size] call duws_fnc_createopteam }; // if superior to 500m: 3 ft 3 patrols - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; sleep (random 3); - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [getpos _trigger, _size] execvm "createoppatrol.sqf"; + [getpos _trigger, _size] call duws_fnc_createoppatrol; sleep 2+(random 3); - [getpos _trigger, _size] execvm "createopteam.sqf"; + [getpos _trigger, _size] call duws_fnc_createopteam sleep 3; - [getpos _trigger, _size] execvm "createopteam.sqf"; + [getpos _trigger, _size] call duws_fnc_createopteam sleep 3; - [getpos _trigger, _size] execvm "createopteam.sqf"; \ No newline at end of file + [getpos _trigger, _size] call duws_fnc_createopteam \ No newline at end of file diff --git a/source/initZones/old/locatorzones.sqf b/source/functions/prefabs/old/locatorzones.sqf similarity index 82% rename from source/initZones/old/locatorzones.sqf rename to source/functions/prefabs/old/locatorzones.sqf index 895cab8..e3596af 100644 --- a/source/initZones/old/locatorzones.sqf +++ b/source/functions/prefabs/old/locatorzones.sqf @@ -29,7 +29,7 @@ for [{_i=1}, {_i<=zones_number}, {_i=_i+1}] do // BEGIN "FOR" LOOP -- while {!_found} do { - _truc = "B_Truck_01_covered_F" createVehicle ([0,0,0]); + _truc = Blufor_Truck_Covered createVehicle ([0,0,0]); _posX = random _mapSize ; _posY = random _mapSize ; @@ -40,15 +40,15 @@ while {!_found} do _posDeTrucZ = _posDeTruc select 2; sleep 0.1; if (_posDeTrucZ > 0) then { // SI AU DESSUS DE L'EAU - _meilleurTruc = "B_Truck_01_covered_F" createVehicle (_posDeTruc); // Reference truck + _meilleurTruc = Blufor_Truck_Covered createVehicle (_posDeTruc); // Reference truck _posDeMeilleurTruc = getPos _meilleurTruc; _playerDistance = _posDeMeilleurTruc distance player; deleteVehicle _meilleurTruc; - _trucX = "B_Truck_01_covered_F" createVehicle ([(_posDeMeilleurTruc select 0)+_radius, _posDeMeilleurTruc select 1, _posDeMeilleurTruc select 2]); - _trucY = "B_Truck_01_covered_F" createVehicle ([_posDeMeilleurTruc select 0, (_posDeMeilleurTruc select 1)+_radius, _posDeMeilleurTruc select 2]); - _truc_X = "B_Truck_01_covered_F" createVehicle ([(_posDeMeilleurTruc select 0)-_radius, _posDeMeilleurTruc select 1, _posDeMeilleurTruc select 2]); - _truc_Y = "B_Truck_01_covered_F" createVehicle ([_posDeMeilleurTruc select 0, (_posDeMeilleurTruc select 1)-_radius, _posDeMeilleurTruc select 2]); + _trucX = Blufor_Truck_Covered createVehicle ([(_posDeMeilleurTruc select 0)+_radius, _posDeMeilleurTruc select 1, _posDeMeilleurTruc select 2]); + _trucY = Blufor_Truck_Covered createVehicle ([_posDeMeilleurTruc select 0, (_posDeMeilleurTruc select 1)+_radius, _posDeMeilleurTruc select 2]); + _truc_X = Blufor_Truck_Covered createVehicle ([(_posDeMeilleurTruc select 0)-_radius, _posDeMeilleurTruc select 1, _posDeMeilleurTruc select 2]); + _truc_Y = Blufor_Truck_Covered createVehicle ([_posDeMeilleurTruc select 0, (_posDeMeilleurTruc select 1)-_radius, _posDeMeilleurTruc select 2]); _posTrucX = getpos _trucX; _posTrucY = getpos _trucY; @@ -99,7 +99,7 @@ while {!_found} do if (_found_distance) then { - _null = [format["Zone %1",_i],_points,_zone_radius,_MissionPos,_fortified] execvm "initZones\createzone.sqf"; + _null = [format["Zone %1",_i],_points,_zone_radius,_MissionPos,_fortified] spawn duws_fnc_createzone; _found=true; _zones_array = _zones_array + [_MissionPos]; // hintSilent format["Zone location #%1 found !",_i]; diff --git a/source/initZones/prefabs/regex.TXT b/source/functions/prefabs/regex.TXT similarity index 100% rename from source/initZones/prefabs/regex.TXT rename to source/functions/prefabs/regex.TXT diff --git a/source/dialog/squad/copyloadout.sqf b/source/functions/squad/fn_copyloadout.sqf similarity index 100% rename from source/dialog/squad/copyloadout.sqf rename to source/functions/squad/fn_copyloadout.sqf diff --git a/source/dialog/squad/dismiss.sqf b/source/functions/squad/fn_dismiss.sqf similarity index 100% rename from source/dialog/squad/dismiss.sqf rename to source/functions/squad/fn_dismiss.sqf diff --git a/source/dialog/squad/dismissHC.sqf b/source/functions/squad/fn_dismissHC.sqf similarity index 100% rename from source/dialog/squad/dismissHC.sqf rename to source/functions/squad/fn_dismissHC.sqf diff --git a/source/dialog/squad/rename/renamesquad.sqf b/source/functions/squad/fn_renamesquad.sqf similarity index 100% rename from source/dialog/squad/rename/renamesquad.sqf rename to source/functions/squad/fn_renamesquad.sqf diff --git a/source/dialog/squad/squadmng.sqf b/source/functions/squad/fn_squadmng.sqf similarity index 100% rename from source/dialog/squad/squadmng.sqf rename to source/functions/squad/fn_squadmng.sqf diff --git a/source/dialog/startup/hq_placement/manual.sqf b/source/functions/startup/fn_manual.sqf similarity index 92% rename from source/dialog/startup/hq_placement/manual.sqf rename to source/functions/startup/fn_manual.sqf index 0512072..59aa0f6 100644 --- a/source/dialog/startup/hq_placement/manual.sqf +++ b/source/functions/startup/fn_manual.sqf @@ -22,7 +22,7 @@ while {true} do { hint "Valid pos, creating HQ"; openMap [false, false]; chosen_hq_placement = true; - _handle = [_foundPickupPos] execVM "initHQ\bluHQinit.sqf"; + [_foundPickupPos] spawn duws_fnc_BluHQinit; }; }; diff --git a/source/dialog/startup/hq_placement/placement.sqf b/source/functions/startup/fn_placement.sqf similarity index 100% rename from source/dialog/startup/hq_placement/placement.sqf rename to source/functions/startup/fn_placement.sqf diff --git a/source/dialog/startup/hq_placement/placement_closed.sqf b/source/functions/startup/fn_placement_closed.sqf similarity index 51% rename from source/dialog/startup/hq_placement/placement_closed.sqf rename to source/functions/startup/fn_placement_closed.sqf index 632aaf0..0cf4219 100644 --- a/source/dialog/startup/hq_placement/placement_closed.sqf +++ b/source/functions/startup/fn_placement_closed.sqf @@ -1,2 +1,2 @@ if (chosen_hq_placement or player_is_choosing_hqpos) exitWith {}; -_null = [] execVM "dialog\startup\hq_placement\placement.sqf"; \ No newline at end of file +[] spawn duws_fnc_placement; \ No newline at end of file diff --git a/source/dialog/startup/hq_placement/random.sqf b/source/functions/startup/fn_random.sqf similarity index 100% rename from source/dialog/startup/hq_placement/random.sqf rename to source/functions/startup/fn_random.sqf diff --git a/source/dialog/startup/startup.sqf b/source/functions/startup/fn_startup.sqf similarity index 100% rename from source/dialog/startup/startup.sqf rename to source/functions/startup/fn_startup.sqf diff --git a/source/functions/startup/fn_startup_closed.sqf b/source/functions/startup/fn_startup_closed.sqf new file mode 100644 index 0000000..7d7932e --- /dev/null +++ b/source/functions/startup/fn_startup_closed.sqf @@ -0,0 +1,2 @@ +if (chosen_settings) exitWith {}; +[] spawn duws_fnc_startup; \ No newline at end of file diff --git a/source/dialog/startup/startup_common.sqf b/source/functions/startup/fn_startup_common.sqf similarity index 100% rename from source/dialog/startup/startup_common.sqf rename to source/functions/startup/fn_startup_common.sqf diff --git a/source/dialog/startup/startup_manual_start.sqf b/source/functions/startup/fn_startup_manual_start.sqf similarity index 86% rename from source/dialog/startup/startup_manual_start.sqf rename to source/functions/startup/fn_startup_manual_start.sqf index ff6df28..4682e21 100644 --- a/source/dialog/startup/startup_manual_start.sqf +++ b/source/functions/startup/fn_startup_manual_start.sqf @@ -1,5 +1,4 @@ -_handle = [] execVM "dialog\startup\startup_common.sqf"; -waitUntil {scriptDone _handle}; +[] call duws_fnc_startup_common; manually_chosen = true; publicVariable "manually_chosen"; diff --git a/source/dialog/startup/startup_random_start.sqf b/source/functions/startup/fn_startup_random_start.sqf similarity index 84% rename from source/dialog/startup/startup_random_start.sqf rename to source/functions/startup/fn_startup_random_start.sqf index 260c663..de04f3d 100644 --- a/source/dialog/startup/startup_random_start.sqf +++ b/source/functions/startup/fn_startup_random_start.sqf @@ -1,5 +1,4 @@ -startup_common = [] execVM "dialog\startup\startup_common.sqf"; -waitUntil {scriptDone startup_common}; +[] call duws_fnc_startup_common; manually_chosen = false; publicVariable "manually_chosen"; diff --git a/source/dialog/startup/weather.sqf b/source/functions/startup/fn_weather.sqf similarity index 99% rename from source/dialog/startup/weather.sqf rename to source/functions/startup/fn_weather.sqf index 4175237..f9c5401 100644 --- a/source/dialog/startup/weather.sqf +++ b/source/functions/startup/fn_weather.sqf @@ -19,7 +19,7 @@ _weather_loop = true; if (isMultiplayer) then { - _handle = [] execVM "dialog\startup\weather_broadcast.sqf"; + _handle = [] spawn duws_fnc_weather_broadcast; }; switch (weather_type) do { diff --git a/source/dialog/startup/weather_broadcast.sqf b/source/functions/startup/fn_weather_broadcast.sqf similarity index 100% rename from source/dialog/startup/weather_broadcast.sqf rename to source/functions/startup/fn_weather_broadcast.sqf diff --git a/source/dialog/startup/weather_client.sqf b/source/functions/startup/fn_weather_client.sqf similarity index 100% rename from source/dialog/startup/weather_client.sqf rename to source/functions/startup/fn_weather_client.sqf diff --git a/source/support/cluster/cluster.sqf b/source/functions/support/cluster/fn_cluster.sqf similarity index 96% rename from source/support/cluster/cluster.sqf rename to source/functions/support/cluster/fn_cluster.sqf index 9289204..bc739ee 100644 --- a/source/support/cluster/cluster.sqf +++ b/source/functions/support/cluster/fn_cluster.sqf @@ -46,10 +46,10 @@ _trg5 setTriggerStatements["this","", ""]; // create unit for comms _group = createGroup west; -_unit = _group createUnit ["B_Soldier_SL_F", [0,0,0], [], 0, "FORM"]; +_unit = _group createUnit [Blufor_Squadleader, [0,0,0], [], 0, "FORM"]; _unit allowDamage false; // generate randomname -_fobname = [1] call compile preprocessFile "random_name.sqf"; +_fobname = [1] call duws_fnc_random_name; _random1 = round random 9; _random2 = round random 9; diff --git a/source/support/cluster/mapclickcluster.sqf b/source/functions/support/cluster/fn_mapclickcluster.sqf similarity index 85% rename from source/support/cluster/mapclickcluster.sqf rename to source/functions/support/cluster/fn_mapclickcluster.sqf index 00998c3..fdcc443 100644 --- a/source/support/cluster/mapclickcluster.sqf +++ b/source/functions/support/cluster/fn_mapclickcluster.sqf @@ -16,7 +16,7 @@ _this select 6 - STRING - Ammo type used for salvos Usage: - _null = [1, 250, 1, 90, 1, 6, 'grenade'] execVM 'support\cluster\mapclickcluster.sqf'; + _null = [1, 250, 1, 90, 1, 6, 'grenade'] spawn duws_fnc_mapclickcluster; Returns: - Nil - @@ -39,7 +39,9 @@ if (commandpointsblu1<_cost) exitWith { }; hint "Click on your map to give the coordinates or wait 60 seconds to cancel the strike"; -OnMapSingleClick format["_null = [_pos,%2,%3,%4,%5,%6,%7,'%8'] execVM 'support\cluster\cluster.sqf';clicked=true;onMapSingleClick ''",_pos,_salvos,_radius,_interval,_rps,_supportype,_cost,_ammotype]; +OnMapSingleClick format["_null = [_pos,%2,%3,%4,%5,%6,%7,'%8'] spawn duws_fnc_cluster; +clicked=true; +onMapSingleClick ''",_pos,_salvos,_radius,_interval,_rps,_supportype,_cost,_ammotype]; // TIMER while {_timer>0 AND !clicked} do { diff --git a/source/functions/support/fn_FOBactions.sqf b/source/functions/support/fn_FOBactions.sqf new file mode 100644 index 0000000..c681799 --- /dev/null +++ b/source/functions/support/fn_FOBactions.sqf @@ -0,0 +1,17 @@ +params ["_fob"]; + +_fob addaction ["Player stats",{_this spawn duws_fnc_info}, "", 0, true, true, "", "_this == player"]; +_fob addaction ["Request ammobox drop(2CP)",{_this spawn duws_fnc_fob_ammobox}, "", 0, true, true, "", "_this == player"]; + +if (support_armory_available) then { + _fob addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; +}; + +_fob addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; +_fob addaction ["FOB manager",{_this spawn duws_fnc_fobmanageropen}, "", 0, true, true, "", "_this == player"]; + +if (isServer) then { + _fob addaction ["Rest (wait/save)",{[]spawn duws_fnc_savegame}, "", 0, true, true, "", "_this == player"]; +} else { + _fob addaction ["Rest", {[] spawn duws_fnc_savegameClient}, "", 0, true, true, "", "_this == player"]; +}; diff --git a/source/support/FOBreceiveaction.sqf b/source/functions/support/fn_FOBreceiveaction.sqf similarity index 82% rename from source/support/FOBreceiveaction.sqf rename to source/functions/support/fn_FOBreceiveaction.sqf index ea9a70c..594e0b8 100644 --- a/source/support/FOBreceiveaction.sqf +++ b/source/functions/support/fn_FOBreceiveaction.sqf @@ -3,4 +3,4 @@ _fobIndex = _fobAmount - 1; _createdFOB = Array_of_FOBS select _fobIndex; // hint format["fobIndex: %1\ncreatedFOB: %2\nArray: %3",_fobIndex,_createdFOB,Array_of_FOBS]; - [_createdFOB] execVM "support\FOBactions.sqf"; \ No newline at end of file + [_createdFOB] call duws_fnc_FOBactions; \ No newline at end of file diff --git a/source/support/ammobox.sqf b/source/functions/support/fn_ammobox.sqf similarity index 57% rename from source/support/ammobox.sqf rename to source/functions/support/fn_ammobox.sqf index c7c2614..357a871 100644 --- a/source/support/ammobox.sqf +++ b/source/functions/support/fn_ammobox.sqf @@ -16,7 +16,7 @@ - Nil - */ -_target = _this select 0; +params ["_target"]; _location = getpos _target; @@ -32,25 +32,16 @@ hint "A supply crate has been dropped near your location"; _parachute = "Steerable_Parachute_F" CreateVehicle _location; _parachute setPos [_location select 0, _location select 1, (_location select 2)+100]; // Create the supply crate -_ammo = "B_supplyCrate_F" CreateVehicle [_location select 0,_location select 1,(_location select 2)+50]; +_ammo = Blufor_SupplyCrate CreateVehicle [_location select 0,_location select 1,(_location select 2)+50]; _ammo attachTo [_parachute,[0,0,0]]; -_ammo addMagazineCargo ["30Rnd_65x39_caseless_mag", 70]; -_ammo addMagazineCargo ["30Rnd_65x39_caseless_mag_Tracer", 70]; -_ammo addMagazineCargo ["100Rnd_65x39_caseless_mag", 70]; -_ammo addMagazineCargo ["100Rnd_65x39_caseless_mag_tracer", 70]; -_ammo addMagazineCargo ["1Rnd_HE_Grenade_shell", 90]; -_ammo addMagazineCargo ["UGL_FlareRed_F", 70]; -_ammo addMagazineCargo ["UGL_FlareGreen_F", 70]; -_ammo addMagazineCargo ["1Rnd_Smoke_Grenade_shell", 70]; -_ammo addMagazineCargo ["1Rnd_SmokeRed_Grenade_shell", 70]; -_ammo addMagazineCargo ["1Rnd_SmokeBlue_Grenade_shell", 70]; -_ammo addMagazineCargo ["NLAW_F", 70]; -_ammo addMagazineCargo ["Chemlight_green", 70]; +{ + _ammo addItemCargo _x; +} forEach Blufor_Ammobox_Contents; _ammo addBackpackCargo ["B_AssaultPack_khk",10]; -if (support_armory_available) then {[[_ammo,["Armory","bisArsenal.sqf",[], 0, false, false, "", "_this distance _target < 4"]],"addAction",true,true] call BIS_fnc_MP;}; +if (support_armory_available) then {[[_ammo,["Armory",{[] call duws_fnc_bisArsenal},[], 0, false, false, "", "_this distance _target < 4"]],"addAction",true,true] call BIS_fnc_MP;}; waitUntil {sleep 1; getpos _ammo select 2<0.2}; _smoke = "SmokeShellGreen" CreateVehicle (getpos _ammo); diff --git a/source/support/arty.sqf b/source/functions/support/fn_arty.sqf similarity index 100% rename from source/support/arty.sqf rename to source/functions/support/fn_arty.sqf diff --git a/source/support/fob.sqf b/source/functions/support/fn_fob.sqf similarity index 76% rename from source/support/fob.sqf rename to source/functions/support/fn_fob.sqf index 4f0cfeb..ad377a8 100644 --- a/source/support/fob.sqf +++ b/source/functions/support/fn_fob.sqf @@ -16,8 +16,7 @@ - Nil - */ -_position = _this select 0; -_size = _this select 1; +params ["_position","_size"]; if (commandpointsblu1 < 10) exitWith { ["info",["Not enough command points","Not enough Command Points (10CP required)"]] call bis_fnc_showNotification; @@ -56,7 +55,7 @@ commandpointsblu1 = commandpointsblu1 - 10; publicVariable "commandpointsblu1"; [west, "PAPA_BEAR"] sidechat "Roger that, the FOB is being deployed..."; -_fobname = [1] call compile preprocessFile "random_name.sqf"; +_fobname = [1] call duws_fnc_random_name; // create marker on FOB _markername = format["fob%1%2",round (_foundPickupPos select 0),round (_foundPickupPos select 1)]; // Define marker name //hint _markername; @@ -74,31 +73,31 @@ sleep 5; _fob = "Land_Cargo_HQ_V1_F" createVehicle _foundPickupPos; DUWS_fnc_fob = { - _this addaction ["Player stats","dialog\info\info.sqf", "", 0, true, true, "", "_this == player"]; - _this addaction ["Request ammobox drop(2CP)","support\fob_ammobox.sqf", "", 0, true, true, "", "_this == player"]; - _this addaction ["Squad manager","dialog\squad\squadmng.sqf", "", 0, true, true, "", "_this == player"]; - _this addaction ["FOB manager","dialog\fob\FOBmanageropen.sqf", "", 0, true, true, "", "_this == player"]; + _this addaction ["Player stats",{_this spawn duws_fnc_info}, "", 0, true, true, "", "_this == player"]; + _this addaction ["Request ammobox drop(2CP)",{_this spawn duws_fnc_fob_ammobox}, "", 0, true, true, "", "_this == player"]; + _this addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; + _this addaction ["FOB manager",{_this spawn duws_fnc_fobmanageropen}, "", 0, true, true, "", "_this == player"]; if (support_armory_available) then { _this addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; }; if (isServer) then { - _this addaction ["Rest (wait/save)","savegame.sqf", "", 0, true, true, "", "_this == player"]; + _this addaction ["Rest (wait/save)",{[]spawn duws_fnc_savegame}, "", 0, true, true, "", "_this == player"]; } else { - _this addaction ["Rest","savegameClient.sqf", "", 0, true, true, "", "_this == player"]; + _this addaction ["Rest",{[] spawn duws_fnc_savegameClient}, "", 0, true, true, "", "_this == player"]; }; }; [_fob,"DUWS_fnc_fob",true,true] spawn BIS_fnc_MP; // [_fob,"DUWS_fnc_fob",nil,true] spawn BIS_fnc_MP; // For fortifying -_fob addaction ["Fortify FOB(4CP)","inithq\fortifyFOB.sqf", [(getpos _fob), _fob], 0, true, true, "", "_this == player"]; +_fob addaction ["Fortify FOB(4CP)","_this spawn duws_fnc_fortifyFOB", [(getpos _fob), _fob], 0, true, true, "", "_this == player"]; -[_foundPickupPos, _size] execvm "createpatrol.sqf"; -[_foundPickupPos, _size] execvm "createpatrol.sqf"; -[_foundPickupPos, _size] execvm "createpatrol.sqf"; +[_foundPickupPos, _size] call duws_fnc_createpatrol; +[_foundPickupPos, _size] call duws_fnc_createpatrol; +[_foundPickupPos, _size] call duws_fnc_createpatrol; [west, "PAPA_BEAR"] sidechat "The FOB has been deployed."; -_handle = [_foundPickupPos, _fob] execVM "initHQ\guardsFOB.sqf"; +[_foundPickupPos, _fob] call duws_fnc_guardsFOB; // CREATE ZONE NOTIFICATION TRIGGER @@ -107,7 +106,7 @@ _trg23=createTrigger["EmptyDetector",_foundPickupPos]; _trg23 triggerAttachVehicle [player]; _trg23 setTriggerArea[_size,_size,0,false]; _trg23 setTriggerActivation["VEHICLE","PRESENT",true]; -_trg23 setTriggerStatements["this", format["[""FOB %1"",thislist] execvm 'enterlocation.sqf'",_fobname], ""]; +_trg23 setTriggerStatements["this", format["[""FOB %1"",thislist] spawn duws_fnc_enterlocation",_fobname], ""]; // warning trigger when an enemy approaches the camp _trgWarning=createTrigger["EmptyDetector",_foundPickupPos]; diff --git a/source/support/fob_ammobox.sqf b/source/functions/support/fn_fob_ammobox.sqf similarity index 84% rename from source/support/fob_ammobox.sqf rename to source/functions/support/fn_fob_ammobox.sqf index 33d49a6..63293f4 100644 --- a/source/support/fob_ammobox.sqf +++ b/source/functions/support/fn_fob_ammobox.sqf @@ -11,14 +11,13 @@ _this select 0 - OBJECT - A non-nil object with a physical location. Usage: - _scriptHandle = [player] execVM 'fob_ammobox.sqf'; + _scriptHandle = [player] spawn duws_fnc_fob_ammobox; Returns: - Nil - */ -_target = _this select 0; -_location = getpos _target; +params ["_target","_location"]; if (commandpointsblu1<2) exitWith { ["info",["Not enough command points","Not enough Command Points (2CP required)"]] call bis_fnc_showNotification; @@ -32,7 +31,7 @@ hint "A supply crate has been dropped near the FOB"; _parachute = "Steerable_Parachute_F" CreateVehicle _location; _parachute setPos [_location select 0, _location select 1, (_location select 2)+50]; // Create the supply crate -_ammo = "B_supplyCrate_F" CreateVehicle [_location select 0,_location select 1,(_location select 2)+20]; +_ammo = Blufor_SupplyCrate CreateVehicle [_location select 0,_location select 1,(_location select 2)+20]; _ammo attachTo [_parachute,[0,0,0]]; _ammo addMagazineCargo ["30Rnd_65x39_caseless_mag", 70]; @@ -50,7 +49,7 @@ _ammo addMagazineCargo ["Chemlight_green", 70]; _ammo addBackpackCargo ["B_AssaultPack_khk",10]; -if (support_armory_available) then {[[_ammo,["Armory","bisArsenal.sqf",[], 0, false, false, "", "_this distance _target < 4"]],"addAction",true,true] call BIS_fnc_MP;}; +if (support_armory_available) then {[[_ammo,["Armory",{[] call duws_fnc_bisArsenal},[], 0, false, false, "", "_this distance _target < 4"]],"addAction",true,true] call BIS_fnc_MP;}; waitUntil {sleep 1; getpos _ammo select 2<0.2}; _smoke = "SmokeShellGreen" CreateVehicle (getpos _ammo); diff --git a/source/support/mapclickarty.sqf b/source/functions/support/fn_mapclickarty.sqf similarity index 93% rename from source/support/mapclickarty.sqf rename to source/functions/support/fn_mapclickarty.sqf index f822c98..2f47b5d 100644 --- a/source/support/mapclickarty.sqf +++ b/source/functions/support/fn_mapclickarty.sqf @@ -41,7 +41,7 @@ if (commandpointsblu1<_cost) exitWith { }; hint "Click on your map to give the coordinates or wait 60 seconds to cancel the strike"; -OnMapSingleClick format["_null = [_pos,%2,%3,%4,%5,%6,%7,'%8'] execVM 'support\arty.sqf';clicked=true;onMapSingleClick ''",_pos,_salvos,_radius,_interval,_rps,_supportype,_cost,_ammotype]; +OnMapSingleClick format["_null = [_pos,%2,%3,%4,%5,%6,%7,'%8'] spawn duws_fnc_arty;clicked=true;onMapSingleClick ''",_pos,_salvos,_radius,_interval,_rps,_supportype,_cost,_ammotype]; // TIMER while {_timer > 0 AND !clicked} do { diff --git a/source/support/mapclickuav.sqf b/source/functions/support/fn_mapclickuav.sqf similarity index 87% rename from source/support/mapclickuav.sqf rename to source/functions/support/fn_mapclickuav.sqf index a855dac..aad869d 100644 --- a/source/support/mapclickuav.sqf +++ b/source/functions/support/fn_mapclickuav.sqf @@ -12,7 +12,7 @@ if (commandpointsblu1<3) exitWith { }; hint "Click on your map to scan a location using the UAV"; -OnMapSingleClick "_null = [_pos,500] execVM 'support\uav_map.sqf';clicked=true;onMapSingleClick ''; hint 'Coordinates received'"; +OnMapSingleClick "_null = [_pos,500] spawn duws_fnc_uav_map;clicked=true;onMapSingleClick ''; hint 'Coordinates received'"; // TIMER while {_timer>0 AND !clicked} do { diff --git a/source/support/paradrop.sqf b/source/functions/support/fn_paradrop.sqf similarity index 79% rename from source/support/paradrop.sqf rename to source/functions/support/fn_paradrop.sqf index 5150d10..907b774 100644 --- a/source/support/paradrop.sqf +++ b/source/functions/support/fn_paradrop.sqf @@ -1,4 +1,4 @@ -_target = _this select 0; +params ["_target"]; _lz = getpos _target; @@ -18,42 +18,42 @@ _radius = 130; _parachute1 = "Steerable_Parachute_F" CreateVehicle _lz; _parachute1 setPos [_lz select 0, _lz select 1, (_lz select 2)+150]; -_soldier1 = _group createUnit ["B_medic_F",[0,0,0],[],0,"form"]; +_soldier1 = _group createUnit [Blufor_Medic,[0,0,0],[],0,"form"]; _soldier1 moveindriver _parachute1; _parachute2 = "Steerable_Parachute_F" CreateVehicle _lz; _parachute2 setPos [(_lz select 0)+(random _radius)-(random _radius), (_lz select 1)+(random _radius)-(random _radius), (_lz select 2)+150]; -_soldier2 = _group createUnit ["B_Soldier_LAT_F",[0,0,0],[],0,"form"]; +_soldier2 = _group createUnit [Blufor_Rifleman_AT,[0,0,0],[],0,"form"]; _soldier2 moveindriver _parachute2; _parachute3 = "Steerable_Parachute_F" CreateVehicle _lz; _parachute3 setPos [(_lz select 0)+(random _radius)-(random _radius), (_lz select 1)+(random _radius)-(random _radius), (_lz select 2)+150]; -_soldier3 = _group createUnit ["B_Soldier_GL_F",[0,0,0],[],0,"form"]; +_soldier3 = _group createUnit [Blufor_Grenadier,[0,0,0],[],0,"form"]; _soldier3 moveindriver _parachute3; _parachute1 = "Steerable_Parachute_F" CreateVehicle _lz; _parachute1 setPos [_lz select 0, _lz select 1, (_lz select 2)+150]; -_soldier1 = _group createUnit ["B_soldier_gl_F",[0,0,0],[],0,"form"]; +_soldier1 = _group createUnit [Blufor_Grenadier,[0,0,0],[],0,"form"]; _soldier1 moveindriver _parachute1; _parachute2 = "Steerable_Parachute_F" CreateVehicle _lz; _parachute2 setPos [(_lz select 0)+(random _radius)-(random _radius), (_lz select 1)+(random _radius)-(random _radius), (_lz select 2)+150]; -_soldier2 = _group createUnit ["B_Soldier_ar_F",[0,0,0],[],0,"form"]; +_soldier2 = _group createUnit [Blufor_Autorifleman,[0,0,0],[],0,"form"]; _soldier2 moveindriver _parachute2; _parachute3 = "Steerable_Parachute_F" CreateVehicle _lz; _parachute3 setPos [(_lz select 0)+(random _radius)-(random _radius), (_lz select 1)+(random _radius)-(random _radius), (_lz select 2)+150]; -_soldier3 = _group createUnit ["B_Soldier_F",[0,0,0],[],0,"form"]; +_soldier3 = _group createUnit [Blufor_Rifleman,[0,0,0],[],0,"form"]; _soldier3 moveindriver _parachute3; _parachute2 = "Steerable_Parachute_F" CreateVehicle _lz; _parachute2 setPos [(_lz select 0)+(random _radius)-(random _radius), (_lz select 1)+(random _radius)-(random _radius), (_lz select 2)+150]; -_soldier2 = _group createUnit ["B_Soldier_lat_F",[0,0,0],[],0,"form"]; +_soldier2 = _group createUnit [Blufor_Rifleman_AT,[0,0,0],[],0,"form"]; _soldier2 moveindriver _parachute2; _parachute3 = "Steerable_Parachute_F" CreateVehicle _lz; _parachute3 setPos [(_lz select 0)+(random _radius)-(random _radius), (_lz select 1)+(random _radius)-(random _radius), (_lz select 2)+150]; -_soldier3 = _group createUnit ["B_Soldier_ar_F",[0,0,0],[],0,"form"]; +_soldier3 = _group createUnit [Blufor_Autorifleman,[0,0,0],[],0,"form"]; _soldier3 moveindriver _parachute3; diff --git a/source/functions/support/fn_sitrep.sqf b/source/functions/support/fn_sitrep.sqf new file mode 100644 index 0000000..5e094c8 --- /dev/null +++ b/source/functions/support/fn_sitrep.sqf @@ -0,0 +1,18 @@ + + + +if (commandpointsblu1>=1) exitWith +{ + commandpointsblu1 = commandpointsblu1 - 1; + publicVariable "commandpointsblu1"; + + saveGame; + + sleep 0.5; + ["sitrepinfo",["SITREP","The game has been saved"]] call bis_fnc_showNotification; + [west, "PAPA_BEAR"] sidechat format["SITREP received, we have %1 command points and our army power is at %2",commandpointsblu1,WARCOM_blufor_ap]; + sleep 1; + [] call duws_fnc_bottom_right_message; +}; + +["sitrepinfo",["SITREP","Not enough Command Points (1CP)"]] call bis_fnc_showNotification; \ No newline at end of file diff --git a/source/support/uav_map.sqf b/source/functions/support/fn_uav_map.sqf similarity index 98% rename from source/support/uav_map.sqf rename to source/functions/support/fn_uav_map.sqf index 31f2665..83618c1 100644 --- a/source/support/uav_map.sqf +++ b/source/functions/support/fn_uav_map.sqf @@ -1,5 +1,4 @@ -_centerPos = _this select 0; -_checkedRadius = _this select 1; +params ["_centerPos", "_checkedRadius"]; commandpointsblu1 = commandpointsblu1 - 3; publicVariable "commandpointsblu1"; diff --git a/source/support/veh_refit.sqf b/source/functions/support/fn_veh_refit.sqf similarity index 100% rename from source/support/veh_refit.sqf rename to source/functions/support/fn_veh_refit.sqf diff --git a/source/support/taxi/boatTaxi.sqf b/source/functions/support/taxi/fn_boatTaxi.sqf similarity index 91% rename from source/support/taxi/boatTaxi.sqf rename to source/functions/support/taxi/fn_boatTaxi.sqf index dfc6ed7..55d583e 100644 --- a/source/support/taxi/boatTaxi.sqf +++ b/source/functions/support/taxi/fn_boatTaxi.sqf @@ -1,9 +1,9 @@ -_posplayer = _this select 0; -_radius = _this select 1; +params ["_posplayer","_radius"]; + _foundPickupPos = []; taxiCanTakeOff = false; -_music = call compile preprocessFile "support\taxi\random_music.sqf"; +_music = [] call duws_fnc_random_music; //B_Lifeboat if (commandpointsblu1 < 1) exitWith { @@ -36,11 +36,11 @@ str(_markerpickup) setMarkerText "Pickup"; _spawnPos = [_posplayer, 400,500,10,2,5,0,[],[[0,0],[0,0]]] call BIS_fnc_findSafePos; // create the boat -_helo = createVehicle ["B_Lifeboat", _spawnPos,[], 0, "FLY"]; +_helo = createVehicle [Blufor_Taxi_Boat, _spawnPos,[], 0, "FLY"]; _helogroup = createGroup west; -_pilot = _helogroup createUnit ["B_diver_F", [5,5,5], [], 0, "NONE"]; +_pilot = _helogroup createUnit [Blufor_diver, [5,5,5], [], 0, "NONE"]; -_helo addAction ["Tell the driver where to go", "support\taxi\mapclickboat.sqf", "", 0, true, true, "", "vehicle _this == _target"]; +_helo addAction ["Tell the driver where to go", {_this spawn duws_fnc_mapclickboat}, "", 0, true, true, "", "vehicle _this == _target"]; _pilot setcaptive true; _pilot moveindriver _helo; @@ -49,7 +49,7 @@ _wp = _helogroup addWaypoint [[_foundPickupPos select 0, (_foundPickupPos select _wp setWaypointType "MOVE"; [_helogroup, 1] setWaypointCombatMode "BLUE"; -_fobname = [1] call compile preprocessFile "random_name.sqf"; +_fobname = [1] call duws_fnc_random_name; _pilot sideChat format["This is %1, I'm approching your location for pick up, check your map. ETA 2 minutes.",_fobname]; @@ -69,7 +69,7 @@ while {_inVehCheck} do { waitUntil {sleep 0.1;taxiCanTakeOff or (getdammage _helo > 0.7 or !alive _pilot)}; // wait until the player has given a validpos if (getdammage _helo > 0.7 or !alive _pilot) exitWith {}; // get out of the loop if choopa is down // check if player is inside choppa -if (vehicle player != _helo) then {taxiCanTakeOff = false; _pilot sidechat format["This is %1, get back in, I can't transport you're not inside the boat !",_fobname]; _helo addAction ["Give a location to the pilot", "support\taxi\mapclickboat.sqf", "", 0, true, true, "", "vehicle _this == _target"];} else {_inVehCheck = false;}; +if (vehicle player != _helo) then {taxiCanTakeOff = false; _pilot sidechat format["This is %1, get back in, I can't transport you're not inside the boat !",_fobname]; _helo addAction ["Give a location to the pilot", {_this spawn duws_fnc_mapclickboat}, "", 0, true, true, "", "vehicle _this == _target"];} else {_inVehCheck = false;}; }; // IF THE PILOT IS DEAD OR CHOPPA DOWN ************** diff --git a/source/support/taxi/helotaxi.sqf b/source/functions/support/taxi/fn_helotaxi.sqf similarity index 91% rename from source/support/taxi/helotaxi.sqf rename to source/functions/support/taxi/fn_helotaxi.sqf index df41583..e1b2307 100644 --- a/source/support/taxi/helotaxi.sqf +++ b/source/functions/support/taxi/fn_helotaxi.sqf @@ -1,9 +1,9 @@ -_posplayer = _this select 0; -_radius = _this select 1; +params ["_posplayer","_radius"]; + _foundPickupPos = []; taxiCanTakeOff = false; -_music = call compile preprocessFile "support\taxi\random_music.sqf"; +_music = [] call duws_fnc_random_music; if (commandpointsblu1 < 1) exitWith { @@ -35,14 +35,14 @@ str(_markerpickup) setMarkerText "LZ"; // create the chopper, gunners and pilots -_helo = createVehicle ["B_Heli_Transport_01_camo_F", [_posplayer select 0, (_posplayer select 1)+2000, 200],[], 0, "FLY"]; +_helo = createVehicle [Blufor_Taxi_Helo, [_posplayer select 0, (_posplayer select 1)+2000, 200],[], 0, "FLY"]; _helogroup = createGroup west; -_pilot = _helogroup createUnit ["B_Helipilot_F", [5,5,5], [], 0, "NONE"]; -_copilot = _helogroup createUnit ["B_Helipilot_F", [5,5,5], [], 0, "NONE"]; -_gunner1 = _helogroup createUnit ["B_Helipilot_F", [5,5,5], [], 0, "NONE"]; -_gunner2 = _helogroup createUnit ["B_Helipilot_F", [5,5,5], [], 0, "NONE"]; +_pilot = _helogroup createUnit [Blufor_Heli_Pilot, [5,5,5], [], 0, "NONE"]; +_copilot = _helogroup createUnit [Blufor_Heli_Pilot, [5,5,5], [], 0, "NONE"]; +_gunner1 = _helogroup createUnit [Blufor_Heli_Pilot, [5,5,5], [], 0, "NONE"]; +_gunner2 = _helogroup createUnit [Blufor_Heli_Pilot, [5,5,5], [], 0, "NONE"]; _helo flyInHeight 100; -_helo addAction ["Give a LZ to the pilot", "support\taxi\mapclickhelo.sqf", "", 0, true, true, "", "vehicle _this == _target"]; +_helo addAction ["Give a LZ to the pilot", {_this spawn duws_fnc_mapclickhelo}, "", 0, true, true, "", "vehicle _this == _target"]; _pilot setcaptive true; @@ -58,7 +58,7 @@ _wp = _helogroup addWaypoint [[_foundPickupPos select 0, (_foundPickupPos select _wp setWaypointType "MOVE"; [_helogroup, 1] setWaypointCombatMode "BLUE"; -_fobname = [1] call compile preprocessFile "random_name.sqf"; +_fobname = [1] call duws_fnc_random_name; _random1 = round random 9; _random2 = round random 9; @@ -102,7 +102,7 @@ while {_inVehCheck} do { waitUntil {sleep 0.1;taxiCanTakeOff or (vehicle _pilot == _pilot or !alive _pilot)}; // wait until the player has given a validpos if (vehicle _pilot == _pilot or !alive _pilot) exitWith {}; // get out of the loop if choopa is down // check if player is inside choppa -if (vehicle player != _helo) then {taxiCanTakeOff = false; _pilot sidechat format["This is %1 %2-%3, get back in, I can't transport you're not inside the chopper !",_fobname,_random1,_random2]; _helo addAction ["Give a LZ to the pilot", "support\taxi\mapclickhelo.sqf", "", 0, true, true, "", "vehicle _this == _target"];} else {_inVehCheck = false;}; +if (vehicle player != _helo) then {taxiCanTakeOff = false; _pilot sidechat format["This is %1 %2-%3, get back in, I can't transport you're not inside the chopper !",_fobname,_random1,_random2]; _helo addAction ["Give a LZ to the pilot", {_this spawn duws_fnc_mapclickhelo}, "", 0, true, true, "", "vehicle _this == _target"];} else {_inVehCheck = false;}; }; // IF THE PILOT IS DEAD OR CHOPPA DOWN ************** diff --git a/source/support/taxi/mapclickboat.sqf b/source/functions/support/taxi/fn_mapclickboat.sqf similarity index 94% rename from source/support/taxi/mapclickboat.sqf rename to source/functions/support/taxi/fn_mapclickboat.sqf index ca9ed03..8b576ac 100644 --- a/source/support/taxi/mapclickboat.sqf +++ b/source/functions/support/taxi/fn_mapclickboat.sqf @@ -1,7 +1,7 @@ _timer = 9999999; clicked = false; -_helo = _this select 0; -_actionID = _this select 2; +params ["_target", "_caller", "_actionId", "_arguments"]; +private _helo = _target; /* // IF NOT ENOUGH PTS if (commandpointsblu1<3) exitWith { diff --git a/source/support/taxi/mapclickhelo.sqf b/source/functions/support/taxi/fn_mapclickhelo.sqf similarity index 94% rename from source/support/taxi/mapclickhelo.sqf rename to source/functions/support/taxi/fn_mapclickhelo.sqf index 252207b..a8810c2 100644 --- a/source/support/taxi/mapclickhelo.sqf +++ b/source/functions/support/taxi/fn_mapclickhelo.sqf @@ -1,7 +1,7 @@ _timer = 9999999; clicked = false; -_helo = _this select 0; -_actionID = _this select 2; +params ["_target", "_caller", "_actionId", "_arguments"]; +private _helo = _target; /* // IF NOT ENOUGH PTS if (commandpointsblu1<3) exitWith { diff --git a/source/support/taxi/random_music.Sqf b/source/functions/support/taxi/fn_random_music.Sqf similarity index 100% rename from source/support/taxi/random_music.Sqf rename to source/functions/support/taxi/fn_random_music.Sqf diff --git a/source/taw_vd/CfgFunctions.hpp b/source/functions/taw_vd/CfgFunctions.hpp similarity index 100% rename from source/taw_vd/CfgFunctions.hpp rename to source/functions/taw_vd/CfgFunctions.hpp diff --git a/source/functions/taw_vd/GUI.h b/source/functions/taw_vd/GUI.h new file mode 100644 index 0000000..26322e2 --- /dev/null +++ b/source/functions/taw_vd/GUI.h @@ -0,0 +1,668 @@ +#include "defines.h" + +class RscEdit_taw { + type = 2; + style = 0x00 + 0x40; + font = "PuristaMedium"; + shadow = 2; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorBackground[] = {0, 0, 0, 1}; + soundSelect[] = {"",0.1,1}; + soundExpand[] = {"",0.1,1}; + colorText[] = {0.95, 0.95, 0.95, 1}; + colorDisabled[] = {1, 1, 1, 0.25}; + autocomplete = false; + colorSelection[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1}; + canModify = 1; +}; + +class RscListBox_taw { + style = 16; + idc = -1; + type = 5; + w = 0.275; + h = 0.04; + font = "PuristaMedium"; + colorSelect[] = {1, 1, 1, 1}; + colorText[] = {1, 1, 1, 1}; + colorBackground[] = {0.28,0.28,0.28,0.28}; + colorSelect2[] = {1, 1, 1, 1}; + colorSelectBackground[] = {0.95, 0.95, 0.95, 0.5}; + colorSelectBackground2[] = {1, 1, 1, 0.5}; + colorScrollbar[] = {0.2, 0.2, 0.2, 1}; + colorPicture[] = {1,1,1,1}; + colorPictureSelected[] = {1,1,1,1}; + colorPictureDisabled[] = {1,1,1,1}; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + wholeHeight = 0.45; + rowHeight = 0.04; + color[] = {0.7, 0.7, 0.7, 1}; + colorActive[] = {0,0,0,1}; + colorDisabled[] = {0,0,0,0.3}; + sizeEx = 0.023; + soundSelect[] = {"",0.1,1}; + soundExpand[] = {"",0.1,1}; + soundCollapse[] = {"",0.1,1}; + maxHistoryDelay = 1; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + tooltipColorText[] = {1,1,1,1}; + tooltipColorBox[] = {1,1,1,1}; + tooltipColorShade[] = {0,0,0,0.65}; + + class ListScrollBar { + color[] = {1,1,1,1}; + colorActive[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.3}; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + shadow = 0; + scrollSpeed = 0.06; + width = 0; + height = 0; + autoScrollEnabled = 1; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + } +}; + +class RscCheckBox { + access = 0; // Control access (0 - ReadAndWrite, 1 - ReadAndCreate, 2 - ReadOnly, 3 - ReadOnlyVerified) + idc = -1; // Control identification (without it, the control won't be displayed) + type = 77; // Type + style = ST_LEFT + ST_MULTI; // Style + default = 0; // Control selected by default (only one within a display can be used) + blinkingPeriod = 0; // Time in which control will fade out and back in. Use 0 to disable the effect. + + x = 0; + y = 0; + w = 1 * GUI_GRID_CENTER_W; // Width + h = 1 * GUI_GRID_CENTER_H; // Height + + //Colors + color[] = { 1, 1, 1, 0.7 }; // Texture color + colorFocused[] = { 1, 1, 1, 1 }; // Focused texture color + colorHover[] = { 1, 1, 1, 1 }; // Mouse over texture color + colorPressed[] = { 1, 1, 1, 1 }; // Mouse pressed texture color + colorDisabled[] = { 1, 1, 1, 0.2 }; // Disabled texture color + + //Background colors + colorBackground[] = { 0, 0, 0, 0 }; // Fill color + colorBackgroundFocused[] = { 0, 0, 0, 0 }; // Focused fill color + colorBackgroundHover[] = { 0, 0, 0, 0 }; // Mouse hover fill color + colorBackgroundPressed[] = { 0, 0, 0, 0 }; // Mouse pressed fill color + colorBackgroundDisabled[] = { 0, 0, 0, 0 }; // Disabled fill color + + //Textures + textureChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked CheckBox. + textureUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked CheckBox. + textureFocusedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked focused CheckBox (Could be used for showing different texture when focused). + textureFocusedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked focused CheckBox. + textureHoverChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + textureHoverUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + texturePressedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + texturePressedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + textureDisabledChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + textureDisabledUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + + tooltip = ""; // Tooltip text + tooltipColorShade[] = { 0, 0, 0, 1 }; // Tooltip background color + tooltipColorText[] = { 1, 1, 1, 1 }; // Tooltip text color + tooltipColorBox[] = { 1, 1, 1, 1 }; // Tooltip frame color + + //Sounds + soundClick[] = { "\A3\ui_f\data\sound\RscButton\soundClick", 0.09, 1 }; // Sound played after control is activated in format {file, volume, pitch} + soundEnter[] = { "\A3\ui_f\data\sound\RscButton\soundEnter", 0.09, 1 }; // Sound played when mouse cursor enters the control + soundPush[] = { "\A3\ui_f\data\sound\RscButton\soundPush", 0.09, 1 }; // Sound played when the control is pushed down + soundEscape[] = { "\A3\ui_f\data\sound\RscButton\soundEscape", 0.09, 1 }; // Sound played when the control is released after pushing down +}; + +class RscXSliderH { + style = 1024; + type = 43; + shadow = 2; + x = 0; + y = 0; + h = 0.029412; + w = 0.400000; + color[] = { + 1, 1, 1, 0.7 + }; + colorActive[] = { + 1, 1, 1, 1 + }; + colorDisabled[] = { + 1, 1, 1, 0.500000 + }; + arrowEmpty = "\A3\ui_f\data\gui\cfg\slider\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\slider\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\slider\border_ca.paa"; + thumb = "\A3\ui_f\data\gui\cfg\slider\thumb_ca.paa"; +}; + +class RscText_taw { + x = 0; + y = 0; + h = 0.037; + w = 0.3; + type = 0; + style = 0; + shadow = 1; + colorShadow[] = {0, 0, 0, 0.5}; + font = "PuristaMedium"; + SizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + text = ""; + colorText[] = {1, 1, 1, 1.0}; + colorBackground[] = {0, 0, 0, 0}; + linespacing = 1; +}; + +class RscTitle:RscText_taw { + style = 0; + shadow = 0; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorText[] = {0.95, 0.95, 0.95, 1}; +}; + +class RscShortcutButton_taw { + idc = -1; + style = 0; + default = 0; + shadow = 1; + w = 0.183825; + h = "( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20)"; + color[] = {1,1,1,1.0}; + colorFocused[] = {1,1,1,1.0}; + color2[] = {0.95,0.95,0.95,1}; + colorDisabled[] = {1,1,1,0.25}; + colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + colorBackgroundFocused[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + colorBackground2[] = {1,1,1,1}; + animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa"; + animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa"; + animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa"; + periodFocus = 1.2; + periodOver = 0.8; + class HitZone + { + left = 0.0; + top = 0.0; + right = 0.0; + bottom = 0.0; + }; + class ShortcutPos + { + left = 0; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + w = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; + h = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + }; + class TextPos + { + left = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + right = 0.005; + bottom = 0.0; + }; + period = 0.4; + font = "PuristaMedium"; + size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + text = ""; + soundEnter[] = {"\A3\ui_f\data\sound\RscButton\soundEnter",0.09,1}; + soundPush[] = {"\A3\ui_f\data\sound\RscButton\soundPush",0.09,1}; + soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; + soundEscape[] = {"\A3\ui_f\data\sound\RscButton\soundEscape",0.09,1}; + action = ""; + class Attributes + { + font = "PuristaMedium"; + color = "#E5E5E5"; + align = "left"; + shadow = "true"; + }; + class AttributesImage + { + font = "PuristaMedium"; + color = "#E5E5E5"; + align = "left"; + }; +}; + +class RscControlsGroup { + type = 15; + idc = -1; + x = 0; + y = 0; + w = 1; + h = 1; + shadow = 0; + style = 16; + + class ScrollBar { + color[] = {1, 1, 1, 0.6}; + colorActive[] = {1, 1, 1, 1}; + colorDisabled[] = {1, 1, 1, 0.3}; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + shadow = 0; + scrollSpeed = 0.05; + }; + + class VScrollbar:ScrollBar { + width = 0.021; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + shadow = 0; + color[] = {1, 1, 1, 0.6}; + }; + + class HScrollbar:ScrollBar { + height = 0.028; + shadow = 0; + color[] = {1, 1, 1, 0.6}; + }; + + //class ListScrollBar : ScrollBar {}; + + class Controls {}; +}; + +class RscControlsGroupNoScrollbars : RscControlsGroup { + class VScrollbar : VScrollbar { + width = 0; + }; + + class HScrollbar : HScrollbar { + height = 0; + }; +}; + +class RscButtonMenu:RscShortcutButton_taw { + idc = -1; + type = 16; + style = "0x02 + 0xC0"; + default = 0; + shadow = 0; + x = 0; + y = 0; + w = 0.095589; + h = 0.039216; + animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; + animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; + colorBackground[] = {0,0,0,0.8}; + colorBackgroundFocused[] = {1,1,1,1}; + colorBackground2[] = {0.75,0.75,0.75,1}; + color[] = {1,1,1,1}; + colorFocused[] = {0,0,0,1}; + color2[] = {0,0,0,1}; + colorText[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.25}; + period = 1.2; + periodFocus = 1.2; + periodOver = 1.2; + size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + tooltipColorText[] = {1,1,1,1}; + tooltipColorBox[] = {1,1,1,1}; + tooltipColorShade[] = {0,0,0,0.65}; + class TextPos + { + left = "0.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + right = 0.005; + bottom = 0.0; + }; + class Attributes + { + font = "PuristaLight"; + color = "#E5E5E5"; + align = "left"; + shadow = "false"; + }; + class ShortcutPos + { + left = "(6.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005"; + top = 0.005; + w = 0.0225; + h = 0.03; + }; + soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",0.09,1}; + soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1}; + soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick",0.09,1}; + soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1}; + textureNoShortcut = ""; +}; + +class TAW_VDMenu { + idd = MENU_IDD; + name = "TAW_VDMenu"; + movingEnabled = 0; + enableSimulation = 1; + + onLoad = "((_this select 0) displayCtrl 2999) ctrlSetFade 1; ((_this select 0) displayCtrl 2999) ctrlCommit 0;"; + + class controlsBackground { + class TitleBackground : RscText_taw { + colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; + idc = -1; + x = .3; + y = .2; + w = .5; + h = (1 / 25); + }; + + class MainBackground : RscText_taw { + colorBackground[] = { 0, 0, 0, .7 }; + idc = -1; + x = .3; + y = .2 + (11 / 250); + w = .5; + h = .57 - (22 / 250); + }; + + class Title : RscTitle { + colorBackround[] = { 0, 0, 0, 0 }; + idc = -1; + text = "View Settings (SCRIPT)"; + x = .3; + y = .2; + w = .8; + h = (1 / 25); + }; + + class OnFootText : RscText_taw { + idc = -1; + text = "Infantry:"; + x = .32; + y = .258; + w = .275; + h = .04; + }; + + class inCarText : OnFootText { + text = "Ground:"; + y = .305; + }; + + class inAirText : OnFootText { + text = "Air:"; + y = .355; + }; + + class ObjectText : OnFootText { + text = "Object:"; + y = .655; + }; + + class DroneText : OnFootText { + text = "Drone:"; + y = .405; + }; + + class TerrainBackground : TitleBackground { + text = "Grass Settings"; + shadow = 0; + y = .46; + }; + + class ObjectBackground : TitleBackground { + text = "Object Settings"; + y = .55; + }; + + class ButtonClose : RscButtonMenu { + idc = -1; + text = "Close"; + onButtonClick = "closeDialog 0;"; + x = 0.3; + y = 0.77 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + + class SaveManagerBtn:ButtonClose { + text = "Saves"; + onButtonClick = "[] call tawvd_fnc_openSaveManager;"; + x = .465; + }; + }; + + class controls { + + //Sliders + class VD_onFoot_slider : RscXSliderH { + idc = INFANTRY_SLIDER; + text = ""; + onSliderPosChanged = "[0, _this select 1] call TAWVD_fnc_onSliderChanged;"; + toolTip = "View Distance while on foot"; + x = .42; + y = .30 - (1 / 25); + w = "9 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + }; + + class VD_inCar_slider : VD_onFoot_slider { + idc = GROUND_SLIDER; + toolTip = "View distance while in a ground vehicle"; + onSliderPosChanged = "[1, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .35 - (1 / 25); + }; + + class VD_inAir_slider : VD_onFoot_slider { + idc = AIR_SLIDER; + toolTip = "View distance while in an aircraft"; + onSliderPosChanged = "[2, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .40 - (1 / 25); + }; + + class VD_Object_slider : VD_onFoot_slider { + idc = OBJECT_SLIDER; + toolTip = "Object rendering distance"; + onSliderPosChanged = "[3, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .7 - (1 / 25); + }; + + class VD_Drone_slider:VD_onFoot_slider { + idc = DRONE_SLIDER; + toolTip = "View distance while operating a UAV/UGV"; + onSliderPosChanged = "[4, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .45 - (1 / 25); + } + + //Values (RscEdit Butons) + class VD_onFoot_Edit : RscEdit_taw { + idc = INFANTRY_EDIT; + text = ""; + onKeyUp = "[_this select 0, _this select 1, 'ground',true] call TAWVD_fnc_onChar;"; + + x = .7; + y = .258; + w = .08; + h = .04; + }; + + class VD_inCar_Edit : VD_onFoot_Edit { + idc = GROUND_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'vehicle',true] call TAWVD_fnc_onChar;"; + y = .31; + }; + + class VD_inAir_Edit : VD_onFoot_Edit { + idc = AIR_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'air',true] call TAWVD_fnc_onChar;"; + y = .36; + }; + + class VD_inDrone_Edit:VD_onFoot_Edit { + idc = DRONE_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'drone',true] call TAWVD_fnc_onChar;"; + y = .41; + }; + + class VD_Object_Edit : VD_onFoot_Edit { + idc = OBJECT_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'object',true] call TAWVD_fnc_onChar;"; + y = .656; + }; + + //Grass Settings + class VD_terrain_none { + idc = TERRAIN_NONE; + type = 11; + style = 0; + font = "PuristaLight"; + color[] = { 1, 1, 1, 1 }; + colorActive[] = { 1, 0.2, 0.2, 1 }; + colorDisabled[] = {0, 0, 0, 1}; + soundEnter[] = { "\A3\ui_f\data\sound\onover", 0.09, 1 }; + soundPush[] = { "\A3\ui_f\data\sound\new1", 0.0, 0 }; + soundClick[] = { "\A3\ui_f\data\sound\onclick", 0.07, 1 }; + soundEscape[] = { "\A3\ui_f\data\sound\onescape", 0.09, 1 }; + text = "None"; + action = "['none'] call TAWVD_fnc_onTerrainChanged;"; + sizeEx = 0.04; + + x = .38; y = .505; + w = .275; h = .04; + }; + + class VD_terrain_low : VD_terrain_none { + idc = -1; + text = "Low"; + action = "['low'] call TAWVD_fnc_onTerrainChanged;"; + x = .47; + }; + + class VD_terrain_normal : VD_terrain_none { + idc = -1; + text = "Normal"; + action = "['norm'] call TAWVD_fnc_onTerrainChanged;"; + x = .56; + }; + + class VD_terrain_high : VD_terrain_none { + idc = -1; + text = "High"; + action = "['high'] call TAWVD_fnc_onTerrainChanged;"; + x = .67; + }; + + class ObjectSyncCheckbox : RscCheckbox + { + idc = 2931; + x = .32; y = .6; + tooltip = "Sync object rendering with view rendering"; + onCheckedChanged = "if((_this select 1) == 1) then {tawvd_syncObject = true;ctrlEnable [2941,false]; ctrlEnable [2942,false];} else {tawvd_syncObject = false; ctrlEnable [2942,true]; ctrlEnable [2941,true];};"; + w = 1 * GUI_GRID_CENTER_W; + h = 1 * GUI_GRID_CENTER_H; + }; + + class ObjectSynctext : RscText_taw { + idc = -1; + text = "Sync with view"; + x = .345; y = .596; + w = .35; h = .04; + }; + + class Manager:RscControlsGroup { + idc = MANAGER_GROUP; + + x = -0.21; y = .2; + w = .5; h = 3; + class Controls { + class SaveLoadGroup:RscControlsGroupNoScrollbars { + idc = SAVELOAD_GROUP; + + x = 0; + y = 0; + w = .5; + h = 3; + + class Controls { + class MyTitleBackground:RscText_taw { + colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; + idc = -1; + x = 0; + y = 0; + w = .5; + h = (1 / 25); + }; + + class Title : RscTitle { + colorBackround[] = { 0, 0, 0, 0 }; + idc = -1; + text = "Save Manager"; + x = 0; + y = 0; + w = .8; + h = (1 / 25); + }; + + class MainBackground:RscText_taw { + colorBackground[] = { 0, 0, 0, .7 }; + idc = -1; + x = 0; + y = 0 + (11 / 250); + w = .5; + h = .57 - (22 / 250); + }; + + class SaveList:RscListBox_taw { + idc = SAVES_LIST; + sizeEx = 0.04; + colorBackground[] = {0.1,0.1,0.1,0.9}; + x = 0; y = 0 + (11 / 250); + w = .5; h = .49 - (22 / 250); + + onLBSelChanged = "_this call TAWVD_fnc_onSaveSelectionChanged;"; + }; + + class SaveSlotName:VD_onFoot_Edit { + idc = SLOT_NAME; + text = "SAVE NAME"; + colorBackground[] = {0,0,0,0.6}; + onKeyUp = ""; + + x = .025; y = .42 + (11 / 250); + w = .45; + }; + + class SaveButton:RscButtonMenu { + text = "Save"; + onButtonClick = "[] call TAWVD_fnc_onSavePressed;"; + x = 0; + y = 0.57 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + + class HideButton:RscButtonMenu { + text = "Hide"; + onButtonClick = "((findDisplay 2900) displayCtrl 2999) ctrlSetFade 1; ((findDisplay 2900) displayCtrl 2999) ctrlCommit 0.3;"; + x = .16; + y = 0.57 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + }; + }; + }; + }; + }; +}; diff --git a/source/functions/taw_vd/defines.h b/source/functions/taw_vd/defines.h new file mode 100644 index 0000000..e75b7f9 --- /dev/null +++ b/source/functions/taw_vd/defines.h @@ -0,0 +1,44 @@ +/* Main display IDD & IDC's */ +#define MENU_IDD 2900 +#define INFANTRY_SLIDER 2901 +#define INFANTRY_EDIT 2902 +#define GROUND_SLIDER 2911 +#define GROUND_EDIT 2912 +#define AIR_SLIDER 2921 +#define AIR_EDIT 2922 +#define OBJECT_SLIDER 2941 +#define OBJECT_EDIT 2942 +#define DRONE_SLIDER 2951 +#define DRONE_EDIT 2952 +#define TERRAIN_NONE 2950 +#define GUI_GRID_CENTER_WAbs ((safezoneW / safezoneH) min 1.2) +#define GUI_GRID_CENTER_HAbs (GUI_GRID_CENTER_WAbs / 1.2) +#define GUI_GRID_CENTER_W (GUI_GRID_CENTER_WAbs / 40) +#define GUI_GRID_CENTER_H (GUI_GRID_CENTER_HAbs / 25) +#define GUI_GRID_CENTER_X (safezoneX + (safezoneW - GUI_GRID_CENTER_WAbs)/2) +#define GUI_GRID_CENTER_Y (safezoneY + (safezoneH - GUI_GRID_CENTER_HAbs)/2) +#define ST_LEFT 0x00 +#define ST_MULTI 0x10 +#define SEL(ARRAY,INDEX) (ARRAY select INDEX) + +/* Save / Load Manager */ +#define MANAGER_GROUP 2999 +#define SAVELOAD_GROUP 3000 +#define SAVES_LIST 3001 +#define SLOT_NAME 3002 + +/* Namespace Macros */ +#define SVAR_MNS missionNamespace setVariable +#define SVAR_UINS uiNamespace setVariable +#define SVAR_PNS parsingNamespace setVariable +#define GVAR_MNS missionNamespace getVariable +#define GVAR_UINS uiNamespace getVariable +#define GVAR_PNS parsingNamespace getVariable + +/* Condition Macros */ +#define EQUAL(condition1,condition2) condition1 isEqualTo condition2 + +/* Display Macros */ +#define CONTROL(disp,ctrl) ((findDisplay ##disp) displayCtrl ##ctrl) +#define CONTROL_DATA(ctrl) (lbData[ctrl,lbCurSel ctrl]) +#define CONTROL_DATAI(ctrl,index) ctrl lbData index \ No newline at end of file diff --git a/source/taw_vd/fn_onChar.sqf b/source/functions/taw_vd/fn_onChar.sqf similarity index 100% rename from source/taw_vd/fn_onChar.sqf rename to source/functions/taw_vd/fn_onChar.sqf diff --git a/source/taw_vd/fn_onSavePressed.sqf b/source/functions/taw_vd/fn_onSavePressed.sqf similarity index 100% rename from source/taw_vd/fn_onSavePressed.sqf rename to source/functions/taw_vd/fn_onSavePressed.sqf diff --git a/source/taw_vd/fn_onSaveSelectionChanged.sqf b/source/functions/taw_vd/fn_onSaveSelectionChanged.sqf similarity index 100% rename from source/taw_vd/fn_onSaveSelectionChanged.sqf rename to source/functions/taw_vd/fn_onSaveSelectionChanged.sqf diff --git a/source/taw_vd/fn_onSliderChanged.sqf b/source/functions/taw_vd/fn_onSliderChanged.sqf similarity index 100% rename from source/taw_vd/fn_onSliderChanged.sqf rename to source/functions/taw_vd/fn_onSliderChanged.sqf diff --git a/source/taw_vd/fn_onTerrainChanged.sqf b/source/functions/taw_vd/fn_onTerrainChanged.sqf similarity index 100% rename from source/taw_vd/fn_onTerrainChanged.sqf rename to source/functions/taw_vd/fn_onTerrainChanged.sqf diff --git a/source/taw_vd/fn_openMenu.sqf b/source/functions/taw_vd/fn_openMenu.sqf similarity index 100% rename from source/taw_vd/fn_openMenu.sqf rename to source/functions/taw_vd/fn_openMenu.sqf diff --git a/source/taw_vd/fn_openSaveManager.sqf b/source/functions/taw_vd/fn_openSaveManager.sqf similarity index 100% rename from source/taw_vd/fn_openSaveManager.sqf rename to source/functions/taw_vd/fn_openSaveManager.sqf diff --git a/source/taw_vd/fn_stateTracker.fsm b/source/functions/taw_vd/fn_stateTracker.fsm similarity index 100% rename from source/taw_vd/fn_stateTracker.fsm rename to source/functions/taw_vd/fn_stateTracker.fsm diff --git a/source/taw_vd/fn_updateViewDistance.sqf b/source/functions/taw_vd/fn_updateViewDistance.sqf similarity index 100% rename from source/taw_vd/fn_updateViewDistance.sqf rename to source/functions/taw_vd/fn_updateViewDistance.sqf diff --git a/source/utilities/autoSave.sqf b/source/functions/utilities/fn_autoSave.sqf similarity index 100% rename from source/utilities/autoSave.sqf rename to source/functions/utilities/fn_autoSave.sqf diff --git a/source/utilities/groupReset.sqf b/source/functions/utilities/fn_groupReset.sqf similarity index 100% rename from source/utilities/groupReset.sqf rename to source/functions/utilities/fn_groupReset.sqf diff --git a/source/zonescap/blufor_cap.sqf b/source/functions/zonescap/fn_blufor_cap.sqf similarity index 83% rename from source/zonescap/blufor_cap.sqf rename to source/functions/zonescap/fn_blufor_cap.sqf index 7b388fc..f0480ab 100644 --- a/source/zonescap/blufor_cap.sqf +++ b/source/functions/zonescap/fn_blufor_cap.sqf @@ -1,9 +1,4 @@ -_place = _this select 0; -_points = _this select 1; -_markername = _this select 2; -_markername2 = _this select 3; -_triggerPos = _this select 4; - +params ["_place","_points","_markername","_markername2","_triggerPos"]; amount_zones_captured = amount_zones_captured + 1; ["us_takencontrol",[_place]] call bis_fnc_showNotification; @@ -32,7 +27,7 @@ WARCOM_blufor_ap = WARCOM_blufor_ap + _points; publicVariable "WARCOM_blufor_ap"; // ADD Skill to operatives -_operHandler = execVM "dialog\operative\operative_mission_complete.sqf"; +[] call operative_mission_complete; // MODIFY MARKER ICON str(_markername) setMarkerColor "ColorGreen"; @@ -54,6 +49,6 @@ private "_trg"; call compile format["_trg = trigger%1%2",round (_triggerPos select 0),round (_triggerPos select 1)]; //// MAKE THE TRIGGER CAPTURABLE FOR OPFOR _trg setTriggerActivation["EAST SEIZED","PRESENT",true]; -_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] execvm 'zonescap\opfor_cap.sqf'",_place,_points,_markername,_markername2,_triggerPos], ""]; +_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] call duws_fnc_opfor_cap",_place,_points,_markername,_markername2,_triggerPos], ""]; diff --git a/source/zonescap/opfor_cap.sqf b/source/functions/zonescap/fn_opfor_cap.sqf similarity index 85% rename from source/zonescap/opfor_cap.sqf rename to source/functions/zonescap/fn_opfor_cap.sqf index 31ee35d..8e0ac8f 100644 --- a/source/zonescap/opfor_cap.sqf +++ b/source/functions/zonescap/fn_opfor_cap.sqf @@ -1,9 +1,4 @@ -_place = _this select 0; -_points = _this select 1; -_markername = _this select 2; -_markername2 = _this select 3; -_triggerPos = _this select 4; - +params ["_place","_points","_markername","_markername2","_triggerPos"]; amount_zones_captured = amount_zones_captured - 1; ["us_lostcontrol",[_place]] call bis_fnc_showNotification; @@ -44,6 +39,6 @@ private "_trg"; call compile format["_trg = trigger%1%2",round (_triggerPos select 0),round (_triggerPos select 1)]; //// MAKE THE TRIGGER CAPTURABLE FOR OPFOR _trg setTriggerActivation["WEST SEIZED","PRESENT",true]; -_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] execvm 'zonescap\blufor_cap.sqf'",_place,_points,_markername,_markername2,_triggerPos], ""]; +_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] call duws_fnc_blufor_cap",_place,_points,_markername,_markername2,_triggerPos], ""]; diff --git a/source/includes/CfgFunctions.hpp b/source/includes/CfgFunctions.hpp new file mode 100644 index 0000000..15e9c75 --- /dev/null +++ b/source/includes/CfgFunctions.hpp @@ -0,0 +1,465 @@ +//https://community.bistudio.com/wiki/Functions_Library_(Arma_3) +class CfgFunctions +{ + class duws + { + class initMission + { + //duws_fnc_clientInit + class clientInit + { + //postInit = 1; + }; + //duws_fnc_serverInit + class serverInit + { + //preInit = 1; + }; + class DUWS_CONFIG + { + preInit = 1; + file = "DUWS_CONFIG.sqf"; + }; + class processUnitConfig {}; + class processVehicleConfig {}; + class processGroupConfig {}; + }; + + class generic + { + class bisArsenal {}; + // [] call duws_fnc_bisArsenal + class captured {}; + // [place, points, markername, markername2, triggerPos] call duws_fnc_captured + class createopfortified {}; + // [position] call duws_fnc_createopfortified + class createoppatrol {}; + // [position, radius] call duws_fnc_createoppatrol + class createopteam {}; + // [position, radius] call duws_fnc_createopteam + class createopwpteam {}; + // [position, radius] call duws_fnc_createopwpteam + class createpatrol {}; + // [position, radius] call duws_fnc_createpatrol + class convertCPtoAP {}; + // [] call duws_fnc_convertCPtoAP + class dynamic_menu {}; + // [???] spawn duws_fnc_dynamic_menu + class dyn_music_init + { + postInit = 1; + }; + // [] spawn duws_fnc_dynamic_music_init + class enterlocation {}; + // [place, trigger] spawn duws_fnc_enterlocation + class mapsize {}; + // [unit, debug] spawn duws_fnc_mapsize + class musicloop {}; + // [] spawn duws_fnc_musicloop + class random_name {}; + // [length] call duws_fnc_random_name + class random_veh {}; + // [faction, vehClass, position, radius] spawn duws_fnc_random_veh + class repetitive_cleanup {}; + // [] spawn duws_fnc_repetitive_cleanup + class request {}; + // [] call duws_fnc_request + class request_squad {}; + // [] call duws_fnc_request_squad + class request_support {}; + // [] call duws_fnc_request_support + class request_unit {}; + // [] call duws_fnc_request_unit + class request_vehicle {}; + // [] call duws_fnc_request_vehicle + class savegame {}; + // [] spawn duws_fnc_savegame + class savegameClient {}; + // [] spawn duws_fnc_savegameClient + class spawnVehicle {}; + //[requiredPoints, vehicleType] call duws_fnc_spawnVehicle + class zones_bonus {}; + // [] spawn duws_fnc_zones_bonus + class zonesundercontrol {}; + // [] spawn duws_fnc_zonesundercontrol + class hc_init {}; + // [] call duws_fnc_hc_init + }; + + class fob + { + class fast_travel {}; + // [] call duws_fnc_fast_travel + class fobmanageropen {}; + // [] spawn duws_fnc_fobmanageropen + class radiochatter {}; + // [object] spawn duws_fnc_radiochatter + class reinforce {}; + // [] spawn duws_fnc_reinforce + }; + + class utilities + { + class autoSave {}; + // [] spawn duws_fnc_autoSave + class groupReset {}; + // [] call duws_fnc_groupReset + }; + + class WARCOM + { + class random_veh_blu_patrol {}; + // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_blu_patrol + class random_veh_opf_patrol {}; + // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_opf_patrol + class WARCOM_blu_assault {}; + // [] call duws_fnc_WARCOM_blu_assault + class WARCOM_blu_patrol {}; + // [] call duws_fnc_WARCOM_blu_patrol + class WARCOM_gps_marker {}; + // [group, TFname] spawn duws_fnc_WARCOM_gps_marker + class WARCOM_init {}; + // [array of zones total, blu hq pos, op hq pos, blufor ap, opfor ap, blu attack delay, blu ai skill range, opfor ai skill, opfor assault delay] call duws_fnc_WARCOM_init + class WARCOM_opf_assault {}; + // [] call duws_fnc_WARCOM_opf_assault + class WARCOM_opf_patrol {}; + // [] call duws_fnc_WARCOM_opf_patrol + class WARCOM_opf_qrf {}; + // [attachedUnit] spawn duws_fnc_WARCOM_opf_qrf + class WARCOM_wp {}; + // [group] call duws_fnc_WARCOM_wp + class WARCOM_wp_blu_patrol {}; + // [group] call duws_fnc_WARCOM_wp_blu_patrol + class WARCOM_wp_opf {}; + // [group] call duws_fnc_WARCOM_wp_opf + class WARCOM_wp_opf_patrol {}; + // [group] call duws_fnc_WARCOM_wp_opf_patrol + class WARCOM_wp_opf_qrf {}; + // [group, unitpos] call duws_fnc_WARCOM_wp_opf_qrf + }; + + class initHQ + { + class BluHQinit {}; + // [_hqblu] spawn duws_fnc_BluHQinit + class drawIcon {}; + // [] spawn duws_fnc_drawIcon + // Used for generating HQ 3d marker + class drawIconFnc {}; + // [] spawn duws_fnc_drawIconFnc + // Called from duws_fnc_drawIcon + class fobmanager {}; + // [] call duws_fnc_fobmanager + class fortify {}; + // [_centerPos, _hq] spawn duws_fnc_fortify + class fortifyFOB {}; + // (in addaction) '_this spawn duws_fnc_fortifyFOB' with arguments '[(getpos _fob), _fob]' + class fortifyFOB2 {}; + // [_centerPos, _fob] spawn duws_fnc_fortifyFOB2 + class guards {}; + // [_centerPos, _hq] call duws_fnc_guards + class guardsFOB {}; + // [_centerPos, _fob, _size] call duws_fnc_guardsFOB + class guardsHQ {}; + // [_centerPos] call duws_fnc_guardsHQ + class hq_radioloop {}; + // [_object] spawn duws_fnc_radioloop + class HQaddactions {}; + // [_hq] call duws_fnc_HQaddactions + class locatorhq {}; + // [] spawn duws_fnc_locatorhq + class refortify {}; + // (in addaction) '_this call duws_fnc_fortify' with arguments '[_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _hq]' + class refortifyFOB {}; + // (in addaction) '_this call duws_fnc_refortifyFOB' with arguments '[_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _fob]' + class reguard {}; + // (in addaction) '_this call duws_fnc_reguard' with arguments '[_groupGuard, _groupPatrol, _centerPos, _hq]' + class reguardFOB {}; + // (in addaction) '_this call duws_fnc_reguardFOB' with arguments '[_groupGuard, _groupPatrol, _centerPos, _fob]' + class teleport {}; + // [_fobpos] call duws_fnc_teleport + class commanderAnim {}; + // [unit] call duws_fnc_commanderAnim + }; + + class startup + { + class manual {}; + // [] spawn duws_fnc_manual + class placement {}; + // [] spawn duws_fnc_placement + class placement_closed {}; + // [] spawn duws_fnc_placement_closed + class random {}; + // [] call duws_fnc_random + class startup {}; + // [] spawn duws_fnc_startup + class startup_closed {}; + // [] call duws_fnc_startup_closed + class startup_common {}; + // [] call duws_fnc_startup_common + class startup_manual_start {}; + // [] spawn duws_fnc_startup_manual_start + class startup_random_start {}; + // [] spawn duws_fnc_startup_random_start + class weather {}; + // [] spawn duws_fnc_weather + class weather_broadcast {}; + // [] spawn duws_fnc_weather_broadcast + class weather_client {}; + // [] spawn duws_fnc_weather_client + }; + + class initZones + { + class createzone {}; + // ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzone + class createzonebackup {}; + // ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzonebackup + class locatorzonesV1 {}; + // [radius, diff] spawn duws_fnc_locatorzonesV1 + class locatorzonesV1_backup {}; + // [radius, diff] spawn duws_fnc_locatorzonesV1_backup + class locatorzonesV2 {}; + // [radius, diff] spawn duws_fnc_locatorzonesV2 + }; + + class zonescap + { + class blufor_cap {} + // [place, points, markername, markername2, triggerPos] call duws_fnc_blufor_cap + class opfor_cap {}; + // [place, points, markername, markername2, triggerPos] call duws_fnc_opfor_cap + }; + + class prefabs + { + class site_Barracks {}; + class site_campsite {}; + class site_commandOP {}; + class site_CommStation {}; + class site_outpost1 {}; + class site_outpost2 {}; + class site_powerRelay {}; + class site_reconOutpost {}; + class site_researchBunker {}; + class site_researchStation {}; + class site_vehfittingstation {}; + }; + + class persistent + { + class persistent_stats_init {}; + // [] call duws_fnc_persistent_stats_init; + class persistent_stats_missions_total {}; + // [] call duws_fnc_persistent_stats_missions_total; + class persistent_stats_reset {}; + // [] spawn duws_fnc_persistent_stats_reset; + class persistent_stats_win {}; + // [] call duws_fnc_persistent_stats_win; + class persistent_stats_zones_add {}; + // [] call duws_fnc_persistent_stats_zones_add; + + class experience_init {}; + // [] call duws_fnc_experience_init; + class experience_ability_check {}; + // [] spawn duws_fnc_experience_ability_check + class experience_ability_fieldcomm {}; + // [player] spawn duws_fnc_experience_ability_fieldcomm; + class experience_ability_heal {}; + // [player] spawn duws_fnc_experience_ability_heal; + class experience_ability_logistic {}; + // [player] spawn duws_fnc_experience_ability_logistic; + class experience_ability_logistic_boost {}; + // [player] spawn duws_fnc_experience_ability_logistic_boost + class experience_ability_refit {}; + // [player] spawn duws_fnc_experience_ability_refit + class experience_ability_slowtime {}; + // [player] spawn duws_fnc_experience_ability_slowtime; + class experience_ability_stamina {}; + // [player] spawn duws_fnc_experience_ability_stamina; + class experience_ability_warrior {}; + // [player] spawn duws_fnc_experience_ability_warruir + }; + + class operative + { + class operator_add_aim {}; + // [] call duws_fnc_operator_add_aim + class operator_add_comms {}; + // [] call duws_fnc_operator_add_comms + class operator_add_courage {}; + // [] call duws_fnc_operator_add_courage + class operator_add_reflexes {}; + // [] call duws_fnc_operator_add_reflexes + class operator_add_reload {}; + // [] call duws_fnc_operator_add_reload + class operator_add_spotting {}; + // [] call duws_fnc_operator_add_spotting + class lbselected {}; + // [] call duws_fnc_lbselected + class operative_mission_complete {}; + // [] call operative_mission_complete + class operator_open {}; + // [] spawn duws_fnc_operator_open + class operator_recruit {}; + // [] spawn duws_fnc_operator_recruit + }; + + class missions + { + class destroy_mission {}; + // [location] spawn duws_fnc_destroy_mission + class pilot_mission {}; + // [location] spawn duws_fnc_pilot_mission + class rescue_mission {}; + // [location] spawn duws_fnc_rescue_mission + class rescue_success {}; + // ["_markername","_sol1","_sol2","_sol3","_MissionPos","_markername2","_trg"] spawn duws_fnc_rescue_success + class sabotage_mission {}; + // [location] spawn duws_fnc_sabotage_mission + class sabotage_success {}; + // (in addaction) {_this call duws_fnc_sabotage_success;} + class steal_mission {}; + // [location] spawn duws_fnc_steal_mission + class target_mission {}; + // [location] spawn duws_fnc_target_mission + class underwater_mission {}; + // [location] spawn duws_fnc_underwater_mission + class underwater_success {}; + // (in addaction) {_this call duws_fnc_underwater_success;} + + class missionTimer {}; + // [] spawn duws_fnc_missionTimer + class stratmap {}; + // [] spawn duws_fnc_stratmap + }; + + class squad + { + class copyloadout {}; + // [] call duws_fnc_copyLoadout + class dismiss {}; + // [] call duws_fnc_dismiss + class dismissHC {}; + // [] spawn duws_fnc_dismissHC + class renamesquad {}; + // [] spawn duws_fnc_renamesquad + class squadmng {}; + // [] spawn duws_fnc_squadmng + }; + + class support + { + class ammobox {}; + // [target] spawn duws_fnc_ammobox + class arty {}; + // [position, salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_arty + class fob {}; + // [position, size] spawn duws_fnc_fob + class fob_ammobox {}; + // [target, location] spawn duws_fnc_fob_ammobox + class FOBactions {}; + // [fob] call duws_fnc_FOBactions + class FOBreceiveaction {}; + // [] spawn duws_fnc_FOBreceiveaction + class mapclickarty {}; + // [salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_mapclickarty + class mapclickuav {}; + // [] spawn duws_fnc_mapclickuav + class paradrop {}; + // [] spawn duws_fnc_paradrop + class sitrep {}; + // [] spawn duws_fnc_sitrep + class uav_map {}; + // [centerPos, checkedRadius] spawn duws_fnc_uav_map + class veh_refit {}; + // [] call duws_fnc_veh_refit + + // Taxi + class boatTaxi + { + file = "functions\support\taxi\fn_boatTaxi.sqf"; + }; + // [posplayer, radius] spawn duws_fnc_boatTaxi + class heloTaxi + { + file = "functions\support\taxi\fn_heloTaxi.sqf"; + }; + // [posplayer, radius] spawn duws_fnc_heloTaxi + class mapclickboat + { + file = "functions\support\taxi\fn_mapclickboat.sqf"; + }; + // (in addaction) {_this spawn duws_fnc_mapclickboat} + class mapclickhelo + { + file = "functions\support\taxi\fn_mapclickhelo.sqf"; + }; + // (in addaction) {_this spawn duws_fnc_mapclickhelo} + class random_music + { + file = "functions\support\taxi\fn_random_music.sqf"; + }; + // [] call duws_fnc_random_music + + // Cluster + class cluster + { + file = "functions\support\cluster\fn_cluster.sqf"; + }; + // [position, salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_cluster + class mapclickcluster + { + file = "functions\support\cluster\fn_mapclickcluster.sqf"; + }; + // [salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_mapclickcluster + }; + + class misc + { + class bottom_right_message {}; + // [position, date] call duws_fnc_bottom_right_message + class gps_marker {}; + // [] spawn duws_fnc_gps_marker + }; + + class info + { + class info {}; + // [] spawn duws_fnc_info + }; + + class pFLIR + { + class livefeed {}; + class livefeed1 {}; + class livefeedexit {}; + }; + + }; + class TAW_VD + { + tag = "TAWVD"; + + class TAW_VD + { + class stateTracker { + ext = ".fsm"; + postInit = 1; + headerType = -1; + }; + + class onSliderChanged {}; + class onTerrainChanged {}; + class updateViewDistance {}; + class openMenu {}; + class onChar {}; + class openSaveManager {}; + class onSavePressed {}; + class onSaveSelectionChanged {}; + }; + }; + + #include "..\AIS\cfgFunctions.hpp" +}; \ No newline at end of file diff --git a/source/debriefing.hpp b/source/includes/debriefing.hpp similarity index 100% rename from source/debriefing.hpp rename to source/includes/debriefing.hpp diff --git a/source/dialog/defines.hpp b/source/includes/defines.hpp similarity index 100% rename from source/dialog/defines.hpp rename to source/includes/defines.hpp diff --git a/source/dialog/fob/fobmanager.hpp b/source/includes/fobmanager.hpp similarity index 96% rename from source/dialog/fob/fobmanager.hpp rename to source/includes/fobmanager.hpp index 0d6b81e..3417376 100644 --- a/source/dialog/fob/fobmanager.hpp +++ b/source/includes/fobmanager.hpp @@ -56,7 +56,7 @@ class fob_mng_dialog w = 12 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Send a team from your High Command to reinforce a specific FOB"; //--- ToDo: Localize; - action = "_derp = [] execVM 'dialog\fob\reinforce.sqf'"; + action = "[] spawn duws_fnc_reinforce"; }; class frame_fast_travel: RscFrame { @@ -76,7 +76,7 @@ class fob_mng_dialog y = 14 * GUI_GRID_H + GUI_GRID_Y; w = 12 * GUI_GRID_W; h = 1 * GUI_GRID_H; - action = "_derp = [] execVM 'dialog\fob\fast_travel.sqf'"; + action = "[] call duws_fnc_fast_travel"; tooltip = "Fast travel between the FOB's and the base"; //--- ToDo: Localize; }; class fast_travel_combo: RscCombo diff --git a/source/hints.hpp b/source/includes/hints.hpp similarity index 100% rename from source/hints.hpp rename to source/includes/hints.hpp diff --git a/source/dialog/info/info.hpp b/source/includes/info/info.hpp similarity index 100% rename from source/dialog/info/info.hpp rename to source/includes/info/info.hpp diff --git a/source/dialog/info/reset/reset.hpp b/source/includes/info/reset.hpp similarity index 95% rename from source/dialog/info/reset/reset.hpp rename to source/includes/info/reset.hpp index ee9fa3d..f55a1ee 100644 --- a/source/dialog/info/reset/reset.hpp +++ b/source/includes/info/reset.hpp @@ -40,7 +40,7 @@ class reset_confirm colorBackground[] = {1, 0, 0,0.5}; colorBackgroundActive[] = {1,0.2,0.2,1}; colorFocused[] = {1,0.2,0.2,0}; - action = "_hurr = [] execVM ""persistent\persistent_stats_reset.sqf"""; + action = "_hurr = [] spawn duws_fnc_persistent_stats_reset"; }; class no_button: RscButton { diff --git a/source/locations.hpp b/source/includes/locations.hpp similarity index 100% rename from source/locations.hpp rename to source/includes/locations.hpp diff --git a/source/dialog/operative/identities.hpp b/source/includes/operative/identities.hpp similarity index 100% rename from source/dialog/operative/identities.hpp rename to source/includes/operative/identities.hpp diff --git a/source/dialog/operative/operative.hpp b/source/includes/operative/operative.hpp similarity index 96% rename from source/dialog/operative/operative.hpp rename to source/includes/operative/operative.hpp index 55720ce..e76b9a5 100644 --- a/source/dialog/operative/operative.hpp +++ b/source/includes/operative/operative.hpp @@ -66,7 +66,7 @@ class operativemaingui y = 6 * GUI_GRID_H + GUI_GRID_Y; w = 9.5 * GUI_GRID_W; h = 13.5 * GUI_GRID_H; - onLBSelChanged = "execVM 'dialog\operative\LBselected.sqf'"; //UI event handler + onLBSelChanged = "[] call duws_fnc_lbselected"; //UI event handler }; class operative_skill_frame: RscFrame { @@ -280,7 +280,7 @@ class operativemaingui w = 1 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Spend 1 point on this skill"; //--- ToDo: Localize; - action = "call DUWS_operator_add_aim"; + action = "call duws_fnc_operator_add_aim"; }; class operative_add_reflexes: RscButton { @@ -291,7 +291,7 @@ class operativemaingui w = 1 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Spend 1 point on this skill"; //--- ToDo: Localize; - action = "call DUWS_operator_add_reflexes"; + action = "call duws_fnc_operator_add_reflexes"; }; class operative_add_spotting: RscButton { @@ -302,7 +302,7 @@ class operativemaingui w = 1 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Spend 1 point on this skill"; //--- ToDo: Localize; - action = "call DUWS_operator_add_spotting"; + action = "call duws_fnc_operator_add_spotting"; }; class operative_add_courage: RscButton { @@ -313,7 +313,7 @@ class operativemaingui w = 1 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Spend 1 point on this skill"; //--- ToDo: Localize; - action = "call DUWS_operator_add_courage"; + action = "call duws_fnc_operator_add_courage"; }; class operative_add_comms: RscButton { @@ -324,7 +324,7 @@ class operativemaingui w = 1 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Spend 1 point on this skill"; //--- ToDo: Localize; - action = "call DUWS_operator_add_comms"; + action = "call duws_fnc_operator_add_comms"; }; class operative_add_reload: RscButton { @@ -335,7 +335,7 @@ class operativemaingui w = 1 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Spend 1 point on this skill"; //--- ToDo: Localize; - action = "call DUWS_operator_add_reload"; + action = "call duws_fnc_operator_add_reload"; }; //////////////////////////////////////////////////////// // GUI EDITOR OUTPUT END diff --git a/source/params.hpp b/source/includes/params.hpp similarity index 100% rename from source/params.hpp rename to source/includes/params.hpp diff --git a/source/dialog/request.hpp b/source/includes/request.hpp similarity index 94% rename from source/dialog/request.hpp rename to source/includes/request.hpp index e9f5cad..43444e0 100644 --- a/source/dialog/request.hpp +++ b/source/includes/request.hpp @@ -70,7 +70,7 @@ class ressourceheader y = 15.5 * GUI_GRID_H + GUI_GRID_Y; w = 11.5 * GUI_GRID_W; h = 1 * GUI_GRID_H; - action = "_nil=[]ExecVM ""dialog\request_unit.sqf"""; + action = "[] call duws_fnc_request_unit"; tooltip = "Request a single unit AI to join your own personal squad"; }; class requestsquadbutton: RscButton @@ -81,7 +81,7 @@ class ressourceheader y = 15.5 * GUI_GRID_H + GUI_GRID_Y; w = 11.5 * GUI_GRID_W; h = 1 * GUI_GRID_H; - action = "_nil=[]ExecVM ""dialog\request_squad.sqf"""; + action = "[] call duws_fnc_request_squad"; tooltip = "Request an entire squad, accessible through High Command"; }; class requestvehiclebutton: RscButton @@ -93,7 +93,7 @@ class ressourceheader w = 11.5 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Request an EMPTY vehicle to spawn at your position"; - action = "_nil=[]ExecVM ""dialog\request_vehicle.sqf"""; + action = "[] call duws_fnc_request_vehicle"; }; class supportunlockbutton: RscButton { @@ -103,7 +103,7 @@ class ressourceheader y = 21.5 * GUI_GRID_H + GUI_GRID_Y; w = 11.5 * GUI_GRID_W; h = 1 * GUI_GRID_H; - action = "_nil=[]ExecVM ""dialog\request_support.sqf"""; + action = "[] call duws_fnc_request_support"; tooltip = "Unlock supports accessible with the communication menu (0-8) in the radio"; }; class exitbutton: RscButton @@ -164,7 +164,7 @@ class ressourceheader y = 11 * GUI_GRID_H + GUI_GRID_Y; w = 10.5 * GUI_GRID_W; h = 1.5 * GUI_GRID_H; - action = "_derp = [] execVM 'missions\stratmap.sqf'; closeDialog 0"; + action = "_derp = [] spawn duws_fnc_stratmap; closeDialog 0"; tooltip = "Select a random side mission. Accomplishing a side mission gives you CP."; }; class ap_mainframe: RscFrame @@ -232,7 +232,7 @@ class ressourceheader y = 20.5 * GUI_GRID_H + GUI_GRID_Y; w = 11.5 * GUI_GRID_W; h = 1 * GUI_GRID_H; - action = "_nil=[]ExecVM ""dialog\convertCPtoAP.sqf"""; + action = "[]call duws_fnc_convertCPtoAP"; tooltip = "You remove 10 CP from your pool to add 15 AP to our forces"; }; class recruit_operative_button: RscButton @@ -243,7 +243,7 @@ class ressourceheader y = 18 * GUI_GRID_H + GUI_GRID_Y; w = 11.5 * GUI_GRID_W; h = 1 * GUI_GRID_H; - action = "execVM ""dialog\operative\operator_open.sqf"""; + action = "[] spawn duws_fnc_operator_open"; tooltip = "Recruit special units that will stay during the entire campaign"; }; }; diff --git a/source/dialog/squad/rename/renamesquad.hpp b/source/includes/squad/renamesquad.hpp similarity index 95% rename from source/dialog/squad/rename/renamesquad.hpp rename to source/includes/squad/renamesquad.hpp index aa1060d..89bd787 100644 --- a/source/dialog/squad/rename/renamesquad.hpp +++ b/source/includes/squad/renamesquad.hpp @@ -37,7 +37,7 @@ class squad_rename_dialog y = 15 * GUI_GRID_H + GUI_GRID_Y; w = 19 * GUI_GRID_W; h = 1.5 * GUI_GRID_H; - action = "_derp = [] execVM 'dialog\squad\rename\renamesquad.sqf'"; + action = "[] spawn duws_fnc_renamesquad"; }; //////////////////////////////////////////////////////// // GUI EDITOR OUTPUT END diff --git a/source/dialog/squad/squadmng.hpp b/source/includes/squad/squadmng.hpp similarity index 96% rename from source/dialog/squad/squadmng.hpp rename to source/includes/squad/squadmng.hpp index c626f94..bf781c5 100644 --- a/source/dialog/squad/squadmng.hpp +++ b/source/includes/squad/squadmng.hpp @@ -46,7 +46,7 @@ class squad_mng_dialog w = 24.5 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Add the squad members under your control with High Command"; //--- ToDo: Localize; - action = "_derp = [] execVM 'dialog\squad\dismiss.sqf'; closeDialog 0"; + action = "[] call duws_fnc_dismiss; closeDialog 0"; }; class dismiss_txt_info: RscText { @@ -90,7 +90,7 @@ class squad_mng_dialog w = 24.5 * GUI_GRID_W; h = 1 * GUI_GRID_H; tooltip = "Dismiss a HC squad and add the units under your direct control"; //--- ToDo: Localize; - action = "_derp = [] execVM 'dialog\squad\dismissHC.sqf'; closeDialog 0"; + action = "[] spawn duws_fnc_dismissHC; closeDialog 0"; }; class renameHC_button: RscButton { diff --git a/source/dialog/squad_number_init.hpp b/source/includes/squad_number_init.hpp similarity index 100% rename from source/dialog/squad_number_init.hpp rename to source/includes/squad_number_init.hpp diff --git a/source/dialog/startup/hq_placement/placement.hpp b/source/includes/startup/placement.hpp similarity index 86% rename from source/dialog/startup/hq_placement/placement.hpp rename to source/includes/startup/placement.hpp index 560b2be..8902c85 100644 --- a/source/dialog/startup/hq_placement/placement.hpp +++ b/source/includes/startup/placement.hpp @@ -2,7 +2,7 @@ class startup_hq_placement_dialog { idd = -1; movingenable = false; - onUnload = "_nul = execVM ""dialog\startup\hq_placement\placement_closed.sqf"""; //UI event handler + onUnload = "[] spawn duws_fnc_placement_closed"; //UI event handler // onLoad = "_this call FRAME_01_Load"; class controls @@ -37,7 +37,7 @@ class startup_hq_placement_dialog w = 18 * GUI_GRID_W; h = 2.5 * GUI_GRID_H; tooltip = "The HQ is randomly placed somewhere on the island"; //--- ToDo: Localize; - action = "_nul = [] execvm ""dialog\startup\hq_placement\random.sqf""; closedialog 0;"; + action = "[] call duws_fnc_random; closedialog 0;"; }; class hq_placement_manual_button: RscButton { @@ -48,7 +48,7 @@ class startup_hq_placement_dialog w = 18 * GUI_GRID_W; h = 2.5 * GUI_GRID_H; tooltip = "You choose where the HQ is placed on the island"; //--- ToDo: Localize; - action = "_nul = [] execvm ""dialog\startup\hq_placement\manual.sqf""; closedialog 0;"; + action = "[] spawn duws_fnc_manual; closedialog 0;"; }; //////////////////////////////////////////////////////// // GUI EDITOR OUTPUT END diff --git a/source/dialog/startup/startup.hpp b/source/includes/startup/startup.hpp similarity index 97% rename from source/dialog/startup/startup.hpp rename to source/includes/startup/startup.hpp index 20d8269..e991a37 100644 --- a/source/dialog/startup/startup.hpp +++ b/source/includes/startup/startup.hpp @@ -3,7 +3,7 @@ class startup_dialog { idd = -1; movingenable = false; - onUnload = "_nul = execVM ""dialog\startup\startup_closed.sqf"""; // UI event handler + onUnload = "[] call duws_fnc_startup_closed"; // UI event handler class controls { @@ -294,7 +294,7 @@ class startup_dialog sizeEx = 0.05; colorBackground[] = {1, 0, 0,0.5}; tooltip = "Randomly generate the zones, then start the campaign"; - action = "_nul = [] execvm ""dialog\startup\startup_random_start.sqf"""; + action = "[] spawn duws_fnc_startup_random_start"; }; class start_button2: RscButton { @@ -307,7 +307,7 @@ class startup_dialog sizeEx = 0.05; colorBackground[] = {1, 0, 0,0.5}; tooltip = "Manually generate the zones, then start the campaign"; - action = "_nul = [] execvm ""dialog\startup\startup_manual_start.sqf"""; + action = "[] spawn duws_fnc_startup_manual_start"; }; }; }; \ No newline at end of file diff --git a/source/support/support.hpp b/source/includes/support.hpp similarity index 83% rename from source/support/support.hpp rename to source/includes/support.hpp index a5aa21e..1b4c586 100644 --- a/source/support/support.hpp +++ b/source/includes/support.hpp @@ -4,7 +4,7 @@ class CfgCommunicationMenu { text = "DUWS-R Support"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [] execVM 'dynamic_menu.sqf'"; // Code executed upon activation (ignored when the submenu is not empty) + expression = "_null = [] spawn duws_fnc_dynamic_menu"; // Code executed upon activation (ignored when the submenu is not empty) icon = "\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\call_ca.paa"; // Icon displayed permanently next to the command menu cursor = "\a3\Ui_f\data\IGUI\Cfg\Cursors\iconCursorSupport_ca.paa"; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -14,7 +14,7 @@ class CfgCommunicationMenu { text = "Artillery Strike (4 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [6, 100, 8, 3, 1, 4, 'R_80mm_HE'] execVM 'support\mapclickarty.sqf'"; // Code executed upon activation (ignored when the submenu is not empty) + expression = "_null = [6, 100, 8, 3, 1, 4, 'R_80mm_HE'] spawn duws_fnc_mapclickarty"; // Code executed upon activation (ignored when the submenu is not empty) icon = "\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\artillery_ca.paa"; // Icon displayed permanently next to the command menu cursor = "\a3\Ui_f\data\IGUI\Cfg\Cursors\iconCursorSupport_ca.paa"; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -24,7 +24,7 @@ class CfgCommunicationMenu { text = "Mortar strike (2 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [8, 50, 5, 3, 2, 2, 'grenade'] execVM 'support\mapclickarty.sqf'"; // Code executed upon activation (ignored when the submenu is not empty) + expression = "_null = [8, 50, 5, 3, 2, 2, 'grenade'] spawn duws_fnc_mapclickarty"; // Code executed upon activation (ignored when the submenu is not empty) icon = "\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\mortar_ca.paa"; cursor = "\a3\Ui_f\data\IGUI\Cfg\Cursors\iconCursorSupport_ca.paa"; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -34,7 +34,7 @@ class CfgCommunicationMenu { text = "JDAM Strike (1 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [1, 2, 1, 1, 3, 1, 'Bo_Mk82'] execVM 'support\mapclickarty.sqf'"; // Code executed upon activation (ignored when the submenu is not empty) + expression = "_null = [1, 2, 1, 1, 3, 1, 'Bo_Mk82'] spawn duws_fnc_mapclickarty"; // Code executed upon activation (ignored when the submenu is not empty) icon = "\a3\ui_f\data\gui\cfg\hints\Designator_ca.paa"; cursor = "\a3\Ui_f\data\IGUI\Cfg\Cursors\iconCursorSupport_ca.paa"; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -44,7 +44,7 @@ class CfgCommunicationMenu { text = "SITREP (1 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = execVM 'support\sitrep.sqf'"; // Code executed upon activation (ignored when the submenu is not empty) + expression = "_null = [] spawn duws_fnc_sitrep"; // Code executed upon activation (ignored when the submenu is not empty) icon = "\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\call_ca.paa"; // Icon displayed permanently next to the command menu cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -54,7 +54,7 @@ class CfgCommunicationMenu { text = "Supply drop (2 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [player] execVM 'support\ammobox.sqf'"; + expression = "_null = [player] spawn duws_fnc_ammobox"; icon = "\a3\Ui_f\data\GUI\Cfg\CommunicationMenu\supplydrop_ca.paa"; // Icon displayed permanently next to the command menu cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -64,7 +64,7 @@ class CfgCommunicationMenu { text = "Airborne troops (25 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [player] execVM 'support\paradrop.sqf'"; + expression = "_null = [player] spawn duws_fnc_paradrop"; icon = "\a3\ui_f\data\gui\cfg\hints\BasicStances_ca.paa"; cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -74,7 +74,7 @@ class CfgCommunicationMenu { text = "UAV Recon (3 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = execVM 'support\mapclickuav.sqf'"; + expression = "_null = spawn duws_fnc_mapclickuav"; icon = "\a3\ui_f\data\gui\cfg\hints\Radar_ca.paa"; cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -84,7 +84,7 @@ class CfgCommunicationMenu { text = "Vehicle Refit (2 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = execVM 'support\veh_refit.sqf'"; + expression = "_null = call duws_fnc_veh_refit"; icon = "\a3\ui_f\data\gui\cfg\hints\VehicleAmmo_ca.paa"; cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -94,7 +94,7 @@ class CfgCommunicationMenu { text = "Establish FOB (10 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [getpos player, 500] execVM 'support\fob.sqf'"; + expression = "_null = [getpos player, 500] spawn duws_fnc_fob"; icon = "\a3\ui_f\data\gui\cfg\hints\Head_ca.paa"; cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -104,7 +104,7 @@ class CfgCommunicationMenu { text = "Helicopter taxi(1 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_nill = [getpos player,50] execVM 'support\taxi\helotaxi.sqf'"; + expression = "_nill = [getpos player,50] spawn duws_fnc_heloTaxi"; icon = "\a3\ui_f\data\gui\cfg\hints\TakeOff_ca.paa"; cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -114,7 +114,7 @@ class CfgCommunicationMenu { text = "Mk.20 II CBU (6 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [1, 250, 1, 90, 1, 6, 'grenade'] execVM 'support\cluster\mapclickcluster.sqf'"; + expression = "_null = [1, 250, 1, 90, 1, 6, 'grenade'] spawn duws_fnc_mapclickcluster"; icon = "\a3\ui_f\data\gui\cfg\hints\Death_ca.paa"; cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item @@ -124,7 +124,7 @@ class CfgCommunicationMenu { text = "Boat taxi (1 CP)"; // Text displayed in the menu and in a notification submenu = ""; // Submenu opened upon activation - expression = "_null = [getpos player,10] execVM 'support\taxi\boattaxi.sqf'"; + expression = "_null = [getpos player,10] spawn duws_fnc_boatTaxi"; icon = "\a3\ui_f\data\gui\cfg\hints\BasicDive_ca.paa"; cursor = ""; // Custom cursor displayed when the item is selected enable = "1"; // Simple expression condition for enabling the item diff --git a/source/dialog/supports_init.hpp b/source/includes/supports_init.hpp similarity index 100% rename from source/dialog/supports_init.hpp rename to source/includes/supports_init.hpp diff --git a/source/initHQ/HQaddactions.sqf b/source/initHQ/HQaddactions.sqf deleted file mode 100644 index 8ab892b..0000000 --- a/source/initHQ/HQaddactions.sqf +++ /dev/null @@ -1,15 +0,0 @@ -_hq = _this select 0; - -_hq addaction ["Player stats","dialog\info\info.sqf", "", 0, true, true, "", "_this == player"]; -_hq addaction ["Request units","dialog\request.sqf", "", 0, true, true, "", "_this == player"]; -_hq addaction ["Squad manager","dialog\squad\squadmng.sqf", "", 0, true, true, "", "_this == player"]; -_hq addaction ["FOB manager","dialog\fob\FOBmanageropen.sqf", "", 0, true, true, "", "_this == player"]; -if (isServer) then { - _hq addaction ["Rest (wait/save)","savegame.sqf", "", 0, true, true, "", "_this == player"]; -}; - -if (!isServer) then { - _hq addaction ["Rest","savegameClient.sqf", "", 0, true, true, "", "_this == player"]; -}; - -_hq addaction ["RESET SQUAD LEADER","utilities\groupReset.sqf", "", 0, true, true, "", "_this == player"]; diff --git a/source/initZones/createzone.sqf b/source/initZones/createzone.sqf deleted file mode 100644 index aa94c69..0000000 --- a/source/initZones/createzone.sqf +++ /dev/null @@ -1,311 +0,0 @@ -// _trg = ["Outpost Airbase",5,50,getpos this,true] execvm "createzone.sqf"; -// Name of the place,pts,radius,position,fortified/not -// - -_place = _this select 0; -_points = _this select 1; -_size = _this select 2; -_trigger = _this select 3; -_fortified = _this select 4; -_prefab = _this select 5; - -amount_zones_created = amount_zones_created + 1; -publicVariable "amount_zones_created"; -zones_created = true; // Tell that at least 1 zone is created - -// Add the zone to the array of zones (need for manual placement of zones and WARCOM) -if (isNil ("Array_of_OPFOR_zones")) then {Array_of_OPFOR_zones = [];}; -Array_of_OPFOR_zones = Array_of_OPFOR_zones + [_trigger]; - -// CREATE MARKER (ICON) -_markername = format["%1%2",round(_trigger select 0),round(_trigger select 1)]; // Define marker name -//hint _markername; -_markerstr = createMarker [str(_markername),_trigger]; -_markerstr setMarkerShape "ICON"; -str(_markername) setMarkerType "hd_objective"; -str(_markername) setMarkerColor "ColorRed"; -str(_markername) setMarkerText _place; -str(_markername) setMarkerSize [0, 0]; - -// CREATE MARKER (ELLIPSE ZONE) -_markername2 = format["%1%2ellipse",round(_trigger select 0),round(_trigger select 1)]; // Define marker name -//hint _markername2; -_markerstr2 = createMarker [str(_markername2),_trigger]; -_markerstr2 setMarkerShape "ELLIPSE"; -str(_markername2) setMarkerBrush "SolidBorder"; -str(_markername2) setMarkerColor "ColorRed"; -str(_markername2) setMarkerSize [_size, _size]; -str(_markername2) setMarkerAlpha 0.1; - - - -// CREATE ZONE CAPTURABLE TRIGGER -_trg=createTrigger["EmptyDetector",_trigger]; -_trg setTriggerArea[_size,_size,0,false]; -_trg setTriggerActivation["WEST SEIZED","PRESENT",false]; -_trg setTriggerStatements["this", format["[""%1"",%2,""%3"",""%4"",%5] execvm 'captured.sqf'",_place,_points,_markername,_markername2,_trigger], ""]; -_trg setTriggerTimeout [30, 60, 300, true ]; -// CREATE VARNAME FOR ZONE TRIGGER --> use the pos of the trigger -_triggerName = format["trigger%1%2",round (_trigger select 0),round (_trigger select 1)]; -call compile format["%1 = _trg",_triggerName]; - - - - - - - - - -// CREATE PREFAB -if (_prefab) then { -_array_of_prefabs = [["Command Outpost",true,"initZones\prefabs\commandOP.sqf"], -["Vehicle Refit Station",false,"initZones\prefabs\vehfittingstation.sqf"], -["Research Bunker",true,"initZones\prefabs\researchBunker.sqf"], -["Recon Outpost",true,"initZones\prefabs\reconOutpost.sqf"], -["Power Relay",true,"initZones\prefabs\powerRelay.sqf"], -["Com. Station",true,"initZones\prefabs\commstation.sqf"], -["Outpost",true,"initZones\prefabs\outpost1.sqf"], -["Outpost",true,"initZones\prefabs\outpost2.sqf"], -["Barracks",true,"initZones\prefabs\barracks.sqf"], -["Research Station",false,"initZones\prefabs\researchStation.sqf"], -["Camp Site",false,"initZones\prefabs\campsite.sqf"]]; - -_amount_of_prefabs = count _array_of_prefabs; -_indexedAmount = _amount_of_prefabs - 1; -_dice = round random _indexedAmount; - -_prefab_array = _array_of_prefabs select _dice; -_place = _prefab_array select 0; -_fortified = _prefab_array select 1; -_path = _prefab_array select 2; - -_prefab_create = [_trigger] execVM _path; -str(_markername) setMarkerText _place; -}; - - - -// CREATE ZONE NOTIFICATION TRIGGER -_trg2=createTrigger["EmptyDetector",_trigger]; -_trg2 triggerAttachVehicle [player]; -_trg2 setTriggerArea[_size,_size,0,false]; -_trg2 setTriggerActivation["VEHICLE","PRESENT",true]; -_trg2 setTriggerStatements["this", format["[""%1"",thislist] execvm 'enterlocation.sqf'",_place], ""]; - - - - - - - - - - - - - - - - - - -// move the spawn location, or units get stuck -_fortifiedspawn = _trigger; -_trigger = [(_trigger select 0)+40,_trigger select 1]; - - -// CREATE OPFOR. HEAVY CLUSTERFUCK INCOMING. -// Check if fortified is true -if (_fortified) then -{ - [_fortifiedspawn] execvm "createopfortified.sqf"; - sleep 2; -}; - -// Check if radius is 100m or smaller => create 2 patrols then exit the script -if (_size < 101) exitWith -{ - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; -}; -// Check if radius is 250m-100m => create 2 patrols and 1 fireteam then exit the script -if (_size < 251) exitWith -{ - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; -}; -// Check if radius is 250m-500m => create 2 patrols and 2 fireteams then exit the script -if (_size < 501) exitWith -{ - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; -}; -if (_size <= 1000) exitWith -{ - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; -}; -if (_size <= 1500) exitWith -{ -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; -waitUntil {scriptDone _vehcreate}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; -}; -if (_size <= 2000) exitWith -{ -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; -waitUntil {scriptDone _vehcreate}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - ["OPF_F","air",_trigger,_size] execVM "random_veh.sqf"; -}; -if (_size <= 3000) exitWith -{ -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; -waitUntil {scriptDone _vehcreate}; - -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; -waitUntil {scriptDone _vehcreate}; - - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - ["OPF_F","air",_trigger,_size] execVM "random_veh.sqf"; -}; - -// IF NOT IN PARAMETERS (TOO BIG ZONE) -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; -waitUntil {scriptDone _vehcreate}; - -_vehcreate = ["OPF_F","armored",_trigger,_size] execVM "random_veh.sqf"; -waitUntil {scriptDone _vehcreate}; - - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopwpteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createopteam.sqf"; - waituntil {scriptdone _handle}; - _handle = [_trigger, _size] execvm "createoppatrol.sqf"; - waituntil {scriptdone _handle}; - ["OPF_F","air",_trigger,_size] execVM "random_veh.sqf"; - \ No newline at end of file diff --git a/source/mission.sqm b/source/mission.sqm index 2f81338206d64941044aa0b810634fc7ee99e182..5d3154e1c6696055040024403594a1abe1757580 100644 GIT binary patch literal 19368 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 Cq5Kp8 literal 10018 zcmeHNU2odR8onmK!s43x%(rK>;v!AcC{ofyNxRk2YK2^If>p4QZIWfH^WV?o85<0N z#3~`(i$w{7@pyRs%=3QFLzLxln)E6A?Pxd&^W3|P^K#_q$5AI7jjodXk3aiI9enF_ zLq3>>vq4^DVG-xuUO9Hm2Pfk&3x@?(8hjjFU4Oi~*?#FHeuyXAFP(q-aC*J{())`q z%M~HOaP?z%gKtq0y1OdT!pTywjk(LkFVoR{5<%4NQRjcZ)em_*FVfY6KJ!q!mR$p3 z|0jh6D?u&L_~8RLEKEk}^frn{eX59|k`p|T+s5;xh$e2|zGZQA7bo|h!fDj+ z{&9Q#pUdk%KP-}P8V|iMN&JAF3n$*!F!OE~c@a&$civ6(EzXK@7wdIWOn8W+$IsDU zMZbGJ2^U`I-OVSHp64W(EWGMhc__ZTLH zSERmOIxoVk_!@=9ILi8^@Etc2CnNXuF3qB0n6J-S4nCb0K18{@^RfK+G0lc0I_1ib znBDxoh{CMT2$$u>X_^${eo%fKg^Ru_KaA6P*4OrGoXm@;A>haK{(YEZ#3#fqUW@eP zf_)y0e!yca?0jL|t6aEo+tvvsLEV0yW$ApDyA6%8N4b-%+H4FEEcXNdoje|4n@^8# zKU;{a`+twd@esT(XV_^Sw~Cd%Q-)!;UrjN&MRa#pKNqHqLi zR8n^G@9|^;6cw>A7_IUrJ8=?&nOQUiRl~{TF$!mCl6%D%R?1Cr(%ElL1Zkjiz9d!j*X%8c#n(~# zdfHAQtvPC?kW>V|QkqzWq((9+41+>SU&#hcl|m{G%4uzC$bcTN)W@N>60m{Z`z3m} z7c1~)@Bz@u?)Am-e@}0`ldH?iV|eh21)a`@*1}7C?{{xcZ_ZASKUG!<`c~<(Q1&G% zVG8SI+%MFeuC!!bX;(%ni}ENLMki@9vev5Kjq}SnLIJl*tr$&XMwJ8{gqI8>niDA$ z0d}1D+<EgsRdjEFs077e zwg?ZD3IGo^KCBm$FT+!@xH76cs1+smaS}DneUn(PgOJ&UP^q4KA_OBYsN)bPRB@>^ zFd{x^)CMCPWI%>zDfGl6zCJ|3E{Me55Wzxm$%M2d(pnNFdz1t|JfAi%v#1Uqo<%6H zVup+3&xcesy@ryN-M+1iQVCZhlDN1!J3nzZxjFlXV3fk*OQQiNRe@B9u>dFcx!_D~ zz^P&HHKENA%*L`y!ZqY;82pR$J|0$&x@pI2i@hFwx!>Ieh+GF`Wd)wc;{^}+6V{$7 z3cD`3vgRIHKNWNZ4{NO<;kl`NpXrh-Zvu5!ex zjKC2V(u7vx2s5d33&0%53gNNLjrj>3;Xa|HpN^eJJgP2AfmT|j3e zO$MJ^M7^(-EbNSd_jU->P#;Tb`t5+MdvqnyFi z0U#2f^w9#KR(XO0=&c(PZ}<1Fm`QM(WP=vN^xD!1Ai?z;E2K zZJCSseq1Ctgn;h6o8GSd?vksi>%UW*G}ImSw`#yIcm8UQo&OrQJ{q%SSASyj(Px)L zmQn7KfAztRe>eZ&r!Uqw{~}HE=xuc$Co3oyWg__R_M`q+o)>y@#-_GLPcGEcx1OzO JbNB|^|9=gg_u>Em diff --git a/source/mission.sqm.oldBackup b/source/mission.sqm.oldBackup new file mode 100644 index 0000000..7bf1fd0 --- /dev/null +++ b/source/mission.sqm.oldBackup @@ -0,0 +1,530 @@ +version=12; +class Mission +{ + addOns[]= + { + "a3_map_stratis", + "A3_Characters_F_OPFOR", + "A3_Characters_F_Civil", + "A3_Characters_F_INDEP", + "A3_Characters_F_BLUFOR", + "a3_characters_f_beta", + "a3_map_altis", + "a3_characters_f", + "A3_Modules_F" + }; + addOnsAuto[]= + { + "A3_Characters_F_OPFOR", + "a3_characters_f", + "A3_Characters_F_Civil", + "A3_Characters_F_INDEP", + "A3_Characters_F_BLUFOR", + "A3_Modules_F", + "a3_map_altis" + }; + randomSeed=16091530; + class Intel + { + briefingName="[SP/MP]Dynamic Universal War System - Rebirth"; + overviewText="Play a full, randomly generated campaign on whatever island you want to."; + startWeather=0; + startWind=0; + forecastWeather=0; + forecastWind=0; + forecastWaves=0; + wavesForced=1; + windForced=1; + year=2035; + month=7; + day=6; + hour=8; + minute=0; + startFogBase=0.001; + forecastFogBase=0.001; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; + class Groups + { + items=8; + class Item0 + { + side="EAST"; + class Vehicles + { + items=1; + class Item0 + { + position[]={94.314949,-0.25319061,121.57617}; + azimut=-104.97; + id=0; + side="EAST"; + vehicle=Opfor_Rifleman; + leader=1; + skill=0.60000002; + init="removeallweapons this"; + }; + }; + }; + class Item1 + { + side="CIV"; + class Vehicles + { + items=1; + class Item0 + { + position[]={79.035439,0.26340526,80.234863}; + azimut=150.57401; + id=1; + side="CIV"; + vehicle="C_man_1"; + leader=1; + skill=0.60000002; + init="removeallweapons this"; + }; + }; + }; + class Item2 + { + side="GUER"; + class Vehicles + { + items=1; + class Item0 + { + position[]={138.3087,-0.28989583,75.978027}; + id=2; + side="GUER"; + vehicle="I_Soldier_exp_F"; + leader=1; + skill=0.60000002; + init="removeallweapons this"; + }; + }; + }; + class Item3 + { + side="WEST"; + class Vehicles + { + items=5; + class Item0 + { + position[]={147.66809,-0.19525492,125.65027}; + azimut=63.238892; + id=3; + side="WEST"; + vehicle=Blufor_Squadleader; + player="PLAYER COMMANDER"; + leader=1; + rank="SERGEANT"; + skill=0.46666664; + text="player1"; + }; + class Item1 + { + presenceCondition="isMultiplayer"; + position[]={165.2303,-0.083054602,130.39087}; + azimut=38.236099; + id=4; + side="WEST"; + vehicle=Blufor_Medic; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player14"; + }; + class Item2 + { + presenceCondition="isMultiplayer"; + position[]={165.15147,0.0376672,119.52625}; + azimut=38.236099; + id=5; + side="WEST"; + vehicle=Blufor_Engineer; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player19"; + }; + class Item3 + { + presenceCondition="isMultiplayer"; + position[]={160.24103,-0.30163568,110.13025}; + azimut=38.236099; + id=6; + side="WEST"; + vehicle=Blufor_Rifleman; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player17"; + }; + class Item4 + { + presenceCondition="isMultiplayer"; + position[]={147.35245,0.03885065,107.86389}; + azimut=38.236099; + id=7; + side="WEST"; + vehicle=Blufor_Rifleman_AT; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player18"; + }; + }; + }; + class Item4 + { + side="LOGIC"; + class Vehicles + { + items=1; + class Item0 + { + position[]={117.6598,0.16756104,103.34326}; + azimut=83.280197; + id=8; + side="LOGIC"; + vehicle="Logic"; + leader=1; + skill=0.60000002; + }; + }; + }; + class Item5 + { + side="WEST"; + class Vehicles + { + items=5; + class Item0 + { + presenceCondition="isMultiplayer"; + position[]={261.39536,-0.030884311,110.60315}; + azimut=38.236099; + id=9; + side="WEST"; + vehicle=Blufor_Squadleader; + player="PLAY CDG"; + leader=1; + rank="SERGEANT"; + skill=0.46666664; + text="player11"; + }; + class Item1 + { + presenceCondition="isMultiplayer"; + position[]={272.29654,-0.095521234,112.84106}; + azimut=38.236099; + id=10; + side="WEST"; + vehicle=Blufor_Grenadier; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player12"; + }; + class Item2 + { + presenceCondition="isMultiplayer"; + position[]={271.81415,-0.23583208,103.8241}; + azimut=38.236099; + id=11; + side="WEST"; + vehicle=Blufor_Medic; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player13"; + }; + class Item3 + { + presenceCondition="isMultiplayer"; + position[]={258.19226,0.070982374,98.068115}; + azimut=38.236099; + id=12; + side="WEST"; + vehicle=Blufor_Rifleman; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player15"; + }; + class Item4 + { + presenceCondition="isMultiplayer"; + position[]={267.08691,0.079555303,95.828369}; + azimut=38.236099; + id=13; + side="WEST"; + vehicle=Blufor_AT_Specialist; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player16"; + }; + }; + }; + class Item6 + { + side="WEST"; + class Vehicles + { + items=5; + class Item0 + { + presenceCondition="isMultiplayer"; + position[]={250.05234,-0.013635203,141.24255}; + azimut=38.236099; + id=14; + side="WEST"; + vehicle=Blufor_Squadleader; + player="PLAY CDG"; + leader=1; + rank="SERGEANT"; + skill=0.46666664; + text="player6"; + }; + class Item1 + { + presenceCondition="isMultiplayer"; + position[]={236.95015,-0.22034465,146.43323}; + azimut=38.236099; + id=15; + side="WEST"; + vehicle=Blufor_Explosive_Specialist; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player8"; + }; + class Item2 + { + presenceCondition="isMultiplayer"; + position[]={233.0544,-0.22535685,135.8501}; + azimut=38.236099; + id=16; + side="WEST"; + vehicle=Blufor_Engineer; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player9"; + }; + class Item3 + { + presenceCondition="isMultiplayer"; + position[]={256.76801,-0.13899173,128.77588}; + azimut=38.236099; + id=17; + side="WEST"; + vehicle=Blufor_sniper; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player7"; + }; + class Item4 + { + presenceCondition="isMultiplayer"; + position[]={244.01947,-0.34063739,131.32288}; + azimut=38.236099; + id=18; + side="WEST"; + vehicle=Blufor_Medic; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player10"; + }; + }; + }; + class Item7 + { + side="WEST"; + class Vehicles + { + items=5; + class Item0 + { + presenceCondition="isMultiplayer"; + position[]={202.52556,-0.33604091,105.10266}; + azimut=38.236099; + id=19; + side="WEST"; + vehicle="B_recon_TL_F"; + player="PLAY CDG"; + leader=1; + rank="SERGEANT"; + skill=0.46666664; + text="player2"; + }; + class Item1 + { + presenceCondition="isMultiplayer"; + position[]={191.68073,-0.34259987,113.67969}; + azimut=38.236099; + id=20; + side="WEST"; + vehicle="B_recon_M_F"; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player3"; + }; + class Item2 + { + presenceCondition="isMultiplayer"; + position[]={204.96738,-0.037549913,114.25562}; + azimut=38.236099; + id=21; + side="WEST"; + vehicle=Blufor_Recon_Scout; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player4"; + }; + class Item3 + { + presenceCondition="isMultiplayer"; + position[]={218.85191,-0.20261329,114.07117}; + azimut=38.236099; + id=22; + side="WEST"; + vehicle="B_recon_LAT_F"; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player5"; + }; + class Item4 + { + presenceCondition="isMultiplayer"; + position[]={189.76903,-0.095692858,104.1189}; + azimut=38.236099; + id=23; + side="WEST"; + vehicle="B_recon_medic_F"; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player20"; + }; + }; + }; + }; + class Markers + { + items=1; + class Item0 + { + position[]={91.06839,0.14840496,23.99707}; + name="respawn_west"; + type="Empty"; + }; + }; +}; +class Intro +{ + addOns[]= + { + "a3_map_stratis", + "a3_map_altis" + }; + addOnsAuto[]= + { + "a3_map_altis" + }; + randomSeed=14680970; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0.30000001; + startWind=0.1; + startWaves=0.1; + forecastWeather=0.30000001; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + month=7; + day=6; + hour=14; + minute=15; + startFogBase=0.001; + forecastFogBase=0.001; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; +}; +class OutroWin +{ + addOns[]= + { + "a3_map_stratis", + "a3_map_altis" + }; + addOnsAuto[]= + { + "a3_map_altis" + }; + randomSeed=13195057; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0.30000001; + startWind=0.1; + startWaves=0.1; + forecastWeather=0.30000001; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + month=7; + day=6; + hour=14; + minute=15; + startFogBase=0.001; + forecastFogBase=0.001; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; +}; +class OutroLoose +{ + addOns[]= + { + "a3_map_stratis", + "a3_map_altis" + }; + addOnsAuto[]= + { + "a3_map_altis" + }; + randomSeed=16171346; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0.30000001; + startWind=0.1; + startWaves=0.1; + forecastWeather=0.30000001; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + month=7; + day=6; + hour=14; + minute=15; + startFogBase=0.001; + forecastFogBase=0.001; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; +}; diff --git a/source/persistent/experience/experience_ability_fieldcomm.sqf b/source/persistent/experience/experience_ability_fieldcomm.sqf deleted file mode 100644 index b034a9a..0000000 --- a/source/persistent/experience/experience_ability_fieldcomm.sqf +++ /dev/null @@ -1,7 +0,0 @@ -player addaction ["Squad manager","dialog\squad\squadmng.sqf", "", 0, true, true, "", "_this == player"]; - - - - - - \ No newline at end of file diff --git a/source/support/FOBactions.sqf b/source/support/FOBactions.sqf deleted file mode 100644 index 551a5e8..0000000 --- a/source/support/FOBactions.sqf +++ /dev/null @@ -1,17 +0,0 @@ -_fob = _this select 0; - -_fob addaction ["Player stats","dialog\info\info.sqf", "", 0, true, true, "", "_this == player"]; -_fob addaction ["Request ammobox drop(2CP)","support\fob_ammobox.sqf", "", 0, true, true, "", "_this == player"]; - -if (support_armory_available) then { - _fob addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; -}; - -_fob addaction ["Squad manager","dialog\squad\squadmng.sqf", "", 0, true, true, "", "_this == player"]; -_fob addaction ["FOB manager","dialog\fob\FOBmanageropen.sqf", "", 0, true, true, "", "_this == player"]; - -if (isServer) then { - _fob addaction ["Rest (wait/save)","savegame.sqf", "", 0, true, true, "", "_this == player"]; -} else { - _fob addaction ["Rest","savegameClient.sqf", "", 0, true, true, "", "_this == player"]; -}; diff --git a/source/support/sitrep.sqf b/source/support/sitrep.sqf deleted file mode 100644 index 80d52aa..0000000 --- a/source/support/sitrep.sqf +++ /dev/null @@ -1,18 +0,0 @@ - - - -if (commandpointsblu1>=1) exitWith -{ - commandpointsblu1 = commandpointsblu1 - 1; - publicVariable "commandpointsblu1"; - -saveGame; - - sleep 0.5; - ["sitrepinfo",["SITREP","The game has been saved"]] call bis_fnc_showNotification; - [west, "PAPA_BEAR"] sidechat format["SITREP received, we have %1 command points and our army power is at %2",commandpointsblu1,WARCOM_blufor_ap]; - sleep 1; -[] execVM "misc\bottom_right_message.sqf"; -}; - - ["sitrepinfo",["SITREP","Not enough Command Points (1CP)"]] call bis_fnc_showNotification; \ No newline at end of file diff --git a/source/zones_bonus.sqf b/source/zones_bonus.sqf deleted file mode 100644 index 6f9165a..0000000 --- a/source/zones_bonus.sqf +++ /dev/null @@ -1,9 +0,0 @@ -[] spawn { - waitUntil {zoneundercontrolblu >= 1}; - sleep 20; - [player,"fob_support"] remoteExecCall ["BIS_fnc_addCommMenuItem", 0, true]; - //_sitrep = [player,"fob_support"] call BIS_fnc_addCommMenuItem; - ["info",["Establishing a FOB","Check the briefing for more info (RTI Manual)"]] remoteExecCall ["bis_fnc_showNotification", 0, true]; - //["info",["Establishing a FOB","Check the briefing for more info (RTI Manual)"]] call bis_fnc_showNotification; - sleep 2; -}; \ No newline at end of file From 7340f2a36910d26c8bc5d098b2a9e7e6a334a084 Mon Sep 17 00:00:00 2001 From: Freddo Date: Mon, 22 Oct 2018 21:50:01 +0200 Subject: [PATCH 02/17] Replaced tabs with 4 spaces --- source/AIS/AIS_SETUP.sqf | 50 +- source/AIS/Core/cfgFunctions.hpp | 42 +- source/AIS/Core/fn_Interaction_Loop.sqf | 42 +- source/AIS/Core/fn_addAction.sqf | 90 +- source/AIS/Core/fn_aisInitHost.sqf | 38 +- source/AIS/Core/fn_aisInitPlayer.sqf | 138 +- source/AIS/Core/fn_bindEventHandler.sqf | 6 +- source/AIS/Core/fn_createLocalMarker.sqf | 18 +- source/AIS/Core/fn_dynamicText.sqf | 2 +- source/AIS/Core/fn_handleDisconnect.sqf | 28 +- source/AIS/Core/fn_inRange.sqf | 28 +- source/AIS/Core/fn_initEvents.sqf | 76 +- source/AIS/Core/fn_isPlayable.sqf | 8 +- source/AIS/Core/fn_onEachFrame.sqf | 14 +- source/AIS/Core/fn_onNextFrame.sqf | 8 +- source/AIS/Core/fn_postinit.sqf | 74 +- source/AIS/Core/fn_preinit.sqf | 16 +- source/AIS/Core/fn_progress_ShowBar.sqf | 22 +- source/AIS/Core/fn_progress_ShowBarText.sqf | 12 +- source/AIS/Core/fn_removeOnEachFrame.sqf | 8 +- source/AIS/Core/fn_resetOnTeamSwitch.sqf | 10 +- source/AIS/Core/fn_setPosAGLS.sqf | 16 +- source/AIS/Core/fn_setVariables.sqf | 18 +- source/AIS/Core/fn_waitUntilAndExecute.sqf | 6 +- source/AIS/Damage/cfgFunctions.hpp | 10 +- source/AIS/Damage/fn_exitDamageHandler.sqf | 6 +- source/AIS/Damage/fn_getHitIndexValue.sqf | 34 +- source/AIS/Damage/fn_goToDead.sqf | 18 +- source/AIS/Damage/fn_handleDamage.sqf | 158 +- source/AIS/Damage/fn_verifyDamageType.sqf | 38 +- source/AIS/Effects/BarDlg.hpp | 44 +- source/AIS/Effects/cfgFunctions.hpp | 30 +- source/AIS/Effects/fn_bleeding.sqf | 66 +- source/AIS/Effects/fn_bloodSplatterScreen.sqf | 14 +- source/AIS/Effects/fn_bulletImpact.sqf | 56 +- .../Effects/fn_deleteBloodSplatterScreen.sqf | 4 +- source/AIS/Effects/fn_draw3D.sqf | 52 +- source/AIS/Effects/fn_garbage.sqf | 34 +- source/AIS/Effects/fn_helpScream.sqf | 16 +- source/AIS/Effects/fn_injuredMarker.sqf | 10 +- source/AIS/Effects/fn_medEquip.sqf | 68 +- .../AIS/Effects/fn_posUpdateInjuredMarker.sqf | 30 +- source/AIS/Effects/fn_preinit.sqf | 62 +- source/AIS/Effects/fn_removeinjuredMarker.sqf | 12 +- source/AIS/Effects/fn_scream.sqf | 20 +- source/AIS/Effects/fn_stabil.sqf | 60 +- source/AIS/Effects/fn_toggleRadio.sqf | 30 +- source/AIS/System/cfgFunctions.hpp | 96 +- source/AIS/System/fn_AIselfCheck.sqf | 10 +- source/AIS/System/fn_Revive.sqf | 124 +- source/AIS/System/fn_ReviveAI.sqf | 88 +- source/AIS/System/fn_addMedEvacObj.sqf | 18 +- source/AIS/System/fn_allowCarry.sqf | 16 +- source/AIS/System/fn_allowDrag.sqf | 18 +- source/AIS/System/fn_allowPullIn.sqf | 4 +- source/AIS/System/fn_allowPullOut.sqf | 16 +- source/AIS/System/fn_allowRevive.sqf | 34 +- source/AIS/System/fn_allowStabilize.sqf | 20 +- source/AIS/System/fn_bloodloss.sqf | 8 +- source/AIS/System/fn_bloodlossAI.sqf | 14 +- source/AIS/System/fn_calculateLifeTime.sqf | 12 +- source/AIS/System/fn_calculateReviveTime.sqf | 12 +- .../AIS/System/fn_calculateStabilizeTime.sqf | 12 +- source/AIS/System/fn_callHelp.sqf | 4 +- source/AIS/System/fn_carry.sqf | 84 +- source/AIS/System/fn_checkLauncher.sqf | 4 +- source/AIS/System/fn_checkUnload.sqf | 16 +- source/AIS/System/fn_diary.sqf | 10 +- source/AIS/System/fn_disableRespawnButton.sqf | 14 +- source/AIS/System/fn_drag.sqf | 12 +- source/AIS/System/fn_findAIHelper.sqf | 74 +- source/AIS/System/fn_getCargoIndex.sqf | 28 +- source/AIS/System/fn_getOutMan.sqf | 14 +- source/AIS/System/fn_handleHeal.sqf | 72 +- source/AIS/System/fn_isMedic.sqf | 8 +- source/AIS/System/fn_keyHandler.sqf | 40 +- source/AIS/System/fn_killed.sqf | 8 +- source/AIS/System/fn_loadAIS.sqf | 40 +- source/AIS/System/fn_loadAISlocalToPlayer.sqf | 18 +- source/AIS/System/fn_loadInjured.sqf | 6 +- source/AIS/System/fn_medEvacArea.sqf | 20 +- source/AIS/System/fn_moveAIHelper.sqf | 50 +- source/AIS/System/fn_moveCargoRemote.sqf | 16 +- source/AIS/System/fn_overrideHealAction.sqf | 28 +- source/AIS/System/fn_postinit.sqf | 140 +- source/AIS/System/fn_release.sqf | 10 +- source/AIS/System/fn_removeFaks.sqf | 46 +- source/AIS/System/fn_respawn.sqf | 18 +- source/AIS/System/fn_restoreFaks.sqf | 10 +- source/AIS/System/fn_reveal.sqf | 18 +- source/AIS/System/fn_secondsToString.sqf | 4 +- source/AIS/System/fn_setUnconscious.sqf | 22 +- source/AIS/System/fn_stabilize.sqf | 78 +- source/AIS/System/fn_unconcsiousRemote.sqf | 94 +- source/AIS/System/fn_unconsciousAI.sqf | 12 +- source/AIS/System/fn_unconsciousPlayer.sqf | 26 +- source/AIS/System/fn_unloadInjured.sqf | 12 +- source/DUWS_CONFIG.sqf | 248 ++-- source/description.ext | 2 +- .../WARCOM/fn_WARCOM_blu_assault.sqf | 2 +- .../functions/WARCOM/fn_WARCOM_blu_patrol.sqf | 66 +- .../functions/WARCOM/fn_WARCOM_opf_patrol.sqf | 64 +- source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf | 48 +- source/functions/WARCOM/fn_WARCOM_wp.sqf | 4 +- .../WARCOM/fn_WARCOM_wp_blu_patrol.sqf | 12 +- source/functions/WARCOM/fn_WARCOM_wp_opf.sqf | 4 +- .../WARCOM/fn_WARCOM_wp_opf_patrol.sqf | 12 +- .../functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf | 4 +- .../functions/generic/fn_dyn_music_init.sqf | 16 +- source/functions/generic/fn_dynamic_menu.sqf | 4 +- source/functions/generic/fn_random_veh.sqf | 2 +- .../generic/fn_repetitive_cleanup.sqf | 4 +- source/functions/generic/fn_request.sqf | 26 +- source/functions/initHQ/fn_commanderAnim.sqf | 4 +- source/functions/initHQ/fn_drawIcon.sqf | 2 +- source/functions/initHQ/fn_guards.sqf | 8 +- source/functions/initHQ/fn_guardsFOB.sqf | 4 +- source/functions/initHQ/fn_guardsHQ.sqf | 8 +- .../functions/initMission/fn_clientInit.sqf | 156 +- .../initMission/fn_processGroupConfig.sqf | 42 +- .../initMission/fn_processUnitConfig.sqf | 34 +- .../initMission/fn_processVehicleConfig.sqf | 16 +- .../functions/initMission/fn_serverInit.sqf | 54 +- source/functions/initZones/fn_createzone.sqf | 180 +-- .../initZones/fn_createzonebackup.sqf | 2 +- .../functions/initZones/fn_locatorzonesV1.sqf | 28 +- .../functions/initZones/fn_locatorzonesV2.sqf | 6 +- .../misc/fn_bottom_right_message.sqf | 288 ++-- source/functions/misc/fn_gps_marker.sqf | 50 +- .../operative/fn_operator_recruit.sqf | 2 +- source/functions/pFLIR/fn_livefeed.sqf | 56 +- source/functions/pFLIR/fn_livefeed1.sqf | 56 +- .../persistent/fn_experience_ability_heal.sqf | 2 +- .../fn_experience_ability_refit.sqf | 4 +- .../fn_persistent_stats_missions_total.sqf | 12 +- .../fn_persistent_stats_zones_add.sqf | 12 +- .../functions/support/fn_FOBreceiveaction.sqf | 12 +- source/functions/support/fn_ammobox.sqf | 2 +- source/functions/support/fn_sitrep.sqf | 20 +- .../support/taxi/fn_mapclickboat.sqf | 18 +- .../support/taxi/fn_mapclickhelo.sqf | 18 +- source/functions/taw_vd/CfgFunctions.hpp | 36 +- source/functions/taw_vd/GUI.h | 1266 ++++++++--------- source/functions/taw_vd/defines.h | 12 +- source/functions/taw_vd/fn_onChar.sqf | 34 +- source/functions/taw_vd/fn_onSavePressed.sqf | 28 +- .../taw_vd/fn_onSaveSelectionChanged.sqf | 10 +- .../functions/taw_vd/fn_onSliderChanged.sqf | 26 +- .../functions/taw_vd/fn_onTerrainChanged.sqf | 18 +- source/functions/taw_vd/fn_openMenu.sqf | 36 +- .../functions/taw_vd/fn_openSaveManager.sqf | 26 +- source/functions/taw_vd/fn_stateTracker.fsm | 12 +- .../taw_vd/fn_updateViewDistance.sqf | 52 +- source/includes/CfgFunctions.hpp | 920 ++++++------ source/includes/debriefing.hpp | 36 +- source/includes/fobmanager.hpp | 4 +- source/includes/info/info.hpp | 4 +- source/includes/info/reset.hpp | 4 +- source/includes/locations.hpp | 4 +- source/includes/operative/identities.hpp | 16 +- source/includes/squad/squadmng.hpp | 4 +- source/includes/startup/placement.hpp | 6 +- source/mission.sqm | Bin 19368 -> 19395 bytes source/mission.sqm.oldBackup | 1034 +++++++------- source/rtipic.paa | Bin 257635 -> 260641 bytes source/sounds/radiochatter2.ogg | Bin 1275348 -> 1292472 bytes source/sounds/radiochatter3.ogg | Bin 2321317 -> 2347558 bytes source/sounds/radiochatter4.ogg | Bin 1181297 -> 1197260 bytes source/sounds/sounds.hpp | 66 +- source/sounds/support/boots.ogg | Bin 50500 -> 51283 bytes source/sounds/support/loadgun.ogg | Bin 34229 -> 34658 bytes source/taw_vd/GUI.h | 1266 ++++++++--------- source/taw_vd/defines.h | 12 +- 173 files changed, 4873 insertions(+), 4873 deletions(-) diff --git a/source/AIS/AIS_SETUP.sqf b/source/AIS/AIS_SETUP.sqf index ff19485..13bbc0c 100644 --- a/source/AIS/AIS_SETUP.sqf +++ b/source/AIS/AIS_SETUP.sqf @@ -4,35 +4,35 @@ //__________________________________________________________________________________________________________________________________________________________________ // v v v v v v v v v v v v --- Main Settings --- v v v v v v v v v v v v -AIS_REVIVE_INIT_UNITS = "allPlayers"; // Auto-Init a group of units: "allPlayers" , "allPlayables" , "allUnits", "allUnitsBLUFOR", "allUnitsOPFOR", "allUnitsINDFOR", "allUnitsCIVILIAN" - // Warning: I didn't recomment to use "allUnits" if you play with a lot of AI units! AIS is mainly created for players and/or their AI group. -AIS_MEDICAL_EDUCATION = 1; // Who can revive an unconscious unit? 0 == Everybody, 1 == Everybody with a First Aid Kit or Medkit, 2 == Only Medics (this affects both, AI and players!). -AIS_REVIVE_GUARANTY = false; // If true you will fall everytime in uncoscious mode, regardless how strong the impact of damage was. -AIS_MEDEVAC_STATIONS = [];// Add one or more objects and a radius to activate the medevac feature. If enabled revive is only at this place(s) possible. Empty array means feature is disabled. - // Syntax: f.e.: [ [myMedevacVehicle, 15], [myMedicTent, 10] ] --> make sure the variable name is avalible at gamestart. Otherwise call it later in a function. +AIS_REVIVE_INIT_UNITS = "allPlayers"; // Auto-Init a group of units: "allPlayers" , "allPlayables" , "allUnits", "allUnitsBLUFOR", "allUnitsOPFOR", "allUnitsINDFOR", "allUnitsCIVILIAN" + // Warning: I didn't recomment to use "allUnits" if you play with a lot of AI units! AIS is mainly created for players and/or their AI group. +AIS_MEDICAL_EDUCATION = 1; // Who can revive an unconscious unit? 0 == Everybody, 1 == Everybody with a First Aid Kit or Medkit, 2 == Only Medics (this affects both, AI and players!). +AIS_REVIVE_GUARANTY = false; // If true you will fall everytime in uncoscious mode, regardless how strong the impact of damage was. +AIS_MEDEVAC_STATIONS = [];// Add one or more objects and a radius to activate the medevac feature. If enabled revive is only at this place(s) possible. Empty array means feature is disabled. + // Syntax: f.e.: [ [myMedevacVehicle, 15], [myMedicTent, 10] ] --> make sure the variable name is avalible at gamestart. Otherwise call it later in a function. //__________________________________________________________________________________________________________________________________________________________________ -// v v v v v v v v v v v v --- Optional Settings --- v v v v v v v v v v v v +// v v v v v v v v v v v v --- Optional Settings --- v v v v v v v v v v v v -AIS_DAMAGE_TOLLERANCE_FACTOR = 1; // A higher value means more damage tolerance. 1 is Vanilla. 0.8 mean all damage will reduce to 80% of Vanilla. -AIS_BLEEDOUT_TIME = 300; // Basic life time in seconds until the unit bleed out and die.. The real life time depends on the real damage of the unit. (can be less or more time from the basic value) -AIS_REVIVETIME = 30; // Basic revive time in seconds. The real revive time depends on the real damage of the unit. (can be less or more time from the basic value) -AIS_STABILIZETIME = 20; // Basic stabilize time in seconds to stop the bleeding of a unconscious unit. The real revive time depends on the real damage of the unit. (can be less or more time from the basic value) -AIS_REVIVE_HEAL = false; // If set to true the injured unit get completely healed after the revive. (casual gameplay without a medic) -AIS_TOGGLE_RADIO = true; // If set to true, unconscious players cannot use his TFAR or ACRE radios. -AIS_NO_CHAT = true; // If set to true, a injured player cannot use text chat during he is uncoscious. -AIS_AI_HELP_RADIUS = 50; // Number, Radius in metres. Units in this radius will help to revive if no group member is able to revive. Max value is 200 metres. -AIS_DISABLE_RESPAWN_BUTTON = 30; // Time in seconds while the respawn button is disabled (Esc Menu). Set to 0 to enable the respawn button everytime. -AIS_DISABLE_FURTHER_DAMAGE = false; // If set to true, an unconcious unit wont become further damage til death. If set to false, an unconcious unit can also die before bleedout timer is over. (f.e. trough near explosions) +AIS_DAMAGE_TOLLERANCE_FACTOR = 1; // A higher value means more damage tolerance. 1 is Vanilla. 0.8 mean all damage will reduce to 80% of Vanilla. +AIS_BLEEDOUT_TIME = 300; // Basic life time in seconds until the unit bleed out and die.. The real life time depends on the real damage of the unit. (can be less or more time from the basic value) +AIS_REVIVETIME = 30; // Basic revive time in seconds. The real revive time depends on the real damage of the unit. (can be less or more time from the basic value) +AIS_STABILIZETIME = 20; // Basic stabilize time in seconds to stop the bleeding of a unconscious unit. The real revive time depends on the real damage of the unit. (can be less or more time from the basic value) +AIS_REVIVE_HEAL = false; // If set to true the injured unit get completely healed after the revive. (casual gameplay without a medic) +AIS_TOGGLE_RADIO = true; // If set to true, unconscious players cannot use his TFAR or ACRE radios. +AIS_NO_CHAT = true; // If set to true, a injured player cannot use text chat during he is uncoscious. +AIS_AI_HELP_RADIUS = 50; // Number, Radius in metres. Units in this radius will help to revive if no group member is able to revive. Max value is 200 metres. +AIS_DISABLE_RESPAWN_BUTTON = 30; // Time in seconds while the respawn button is disabled (Esc Menu). Set to 0 to enable the respawn button everytime. +AIS_DISABLE_FURTHER_DAMAGE = false; // If set to true, an unconcious unit wont become further damage til death. If set to false, an unconcious unit can also die before bleedout timer is over. (f.e. trough near explosions) //__________________________________________________________________________________________________________________________________________________________________ -// v v v v v v v v v v v v --- Visual Settings --- v v v v v v v v v v v v - -AIS_SHOW_UNC_MARKERS = true; // If set to true, a marker will show injured units on the map. -AIS_SHOW_UNC_MESSAGE_TO = "Group"; // "None", "Side", "Group" --> who read the message about wounded units. -AIS_SHOW_UNC_3D_MARKERS = true; // If set to true, an in-game visible 3D-icon shows you the position of injured units (within a range of 20 metres and 35 metres for medics). -AIS_IMPACT_EFFECTS = true; // Set to true to enable impact effects. (simple simluation of supressing effects) -AIS_SHOW_COUNTDOWN = true; // If set to true, an unconscious unit will be able to see the bleed out timer. -AIS_SHOW_DIARYINFO = true; // If set to true, a diary entry with some informations about the AIS (Credits, features, How to) is added. \ No newline at end of file +// v v v v v v v v v v v v --- Visual Settings --- v v v v v v v v v v v v + +AIS_SHOW_UNC_MARKERS = true; // If set to true, a marker will show injured units on the map. +AIS_SHOW_UNC_MESSAGE_TO = "Group"; // "None", "Side", "Group" --> who read the message about wounded units. +AIS_SHOW_UNC_3D_MARKERS = true; // If set to true, an in-game visible 3D-icon shows you the position of injured units (within a range of 20 metres and 35 metres for medics). +AIS_IMPACT_EFFECTS = true; // Set to true to enable impact effects. (simple simluation of supressing effects) +AIS_SHOW_COUNTDOWN = true; // If set to true, an unconscious unit will be able to see the bleed out timer. +AIS_SHOW_DIARYINFO = true; // If set to true, a diary entry with some informations about the AIS (Credits, features, How to) is added. \ No newline at end of file diff --git a/source/AIS/Core/cfgFunctions.hpp b/source/AIS/Core/cfgFunctions.hpp index 4a4fe3d..1e731b1 100644 --- a/source/AIS/Core/cfgFunctions.hpp +++ b/source/AIS/Core/cfgFunctions.hpp @@ -5,26 +5,26 @@ class AIS_Core file = "AIS\Core"; class preInit { preInit = 1; }; class postInit { postInit = 1; }; - class addAction; - class aisInitHost; - class aisInitPlayer; - class bindEventHandler; - class createLocalMarker; - class dynamicText; - class initEvents; - class inRange; - class interaction_Loop; - class isPlayable; - class onEachFrame; - class onNextFrame; - class progress_ShowBar; - class progress_ShowBarText; - class removeonEachFrame; - class setPosAGLS; - class setVariables; - class triggerEvent; - class waitUntilAndExecute; - class handleDisconnect; - class resetOnTeamSwitch; + class addAction; + class aisInitHost; + class aisInitPlayer; + class bindEventHandler; + class createLocalMarker; + class dynamicText; + class initEvents; + class inRange; + class interaction_Loop; + class isPlayable; + class onEachFrame; + class onNextFrame; + class progress_ShowBar; + class progress_ShowBarText; + class removeonEachFrame; + class setPosAGLS; + class setVariables; + class triggerEvent; + class waitUntilAndExecute; + class handleDisconnect; + class resetOnTeamSwitch; }; }; \ No newline at end of file diff --git a/source/AIS/Core/fn_Interaction_Loop.sqf b/source/AIS/Core/fn_Interaction_Loop.sqf index 89aba08..400b168 100644 --- a/source/AIS/Core/fn_Interaction_Loop.sqf +++ b/source/AIS/Core/fn_Interaction_Loop.sqf @@ -1,26 +1,26 @@ /* - Author: NetFusion - Description: - Continuously checks whether an action should be added to the cursorTarget. - Parameter(s): - - + Author: NetFusion + Description: + Continuously checks whether an action should be added to the cursorTarget. + Parameter(s): + - Remarks: * Should only be called once per mission. - Returns: - - - Example: - - + Returns: + - + Example: + - */ AIS_Core_lastCursorTarget = objNull; [{ _cursorTarget = cursorTarget; - if (_cursorTarget isEqualTo AIS_Core_lastCursorTarget || {player distance _cursorTarget > 15}) exitWith {}; // psycho: prevent cycling trough cursorTargets more than 15m away (engine limitation is 15m for every action) + if (_cursorTarget isEqualTo AIS_Core_lastCursorTarget || {player distance _cursorTarget > 15}) exitWith {}; // psycho: prevent cycling trough cursorTargets more than 15m away (engine limitation is 15m for every action) AIS_Core_lastCursorTarget = _cursorTarget; - private _objActions = _cursorTarget getVariable ["AIS_Core_actionStorage", []]; + private _objActions = _cursorTarget getVariable ["AIS_Core_actionStorage", []]; { _x params ["_onObject", "_text", "_distance", "_condition", "_callback", "_args", "_formated"]; @@ -28,19 +28,19 @@ AIS_Core_lastCursorTarget = objNull; if ((_onObject isEqualType "" && {_cursorTarget isKindOf _onObject}) || (_onObject isEqualType objNull && {_cursorTarget isEqualTo _onObject})) then { private _action = _cursorTarget addAction [_text, _callback, _args, 1.5, true, true, "", _condition, _distance]; _objActions pushBack _x; - - if (_formated != "") then { - _cursorTarget setUserActionText [ - _action, - _text, - format [_formated, _text], - "" - ]; - }; + + if (_formated != "") then { + _cursorTarget setUserActionText [ + _action, + _text, + format [_formated, _text], + "" + ]; + }; }; }; nil } count (missionNamespace getVariable ["AIS_Core_actionStorage", []]); - _cursorTarget setVariable ["AIS_Core_actionStorage", _objActions]; //@todo maybe init array and remove this line - this requires module dependencies + _cursorTarget setVariable ["AIS_Core_actionStorage", _objActions]; //@todo maybe init array and remove this line - this requires module dependencies }] call AIS_Core_fnc_onEachFrame; \ No newline at end of file diff --git a/source/AIS/Core/fn_addAction.sqf b/source/AIS/Core/fn_addAction.sqf index 9340f8f..a6c3dcc 100644 --- a/source/AIS/Core/fn_addAction.sqf +++ b/source/AIS/Core/fn_addAction.sqf @@ -1,28 +1,28 @@ /* - Author: [C-L-F] NetFusion - Edited: Psychobastard + Author: [C-L-F] NetFusion + Edited: Psychobastard - Description: - Add an action to an object or type(s) of object(s). + Description: + Add an action to an object or type(s) of object(s). - Parameter(s): - 0: STRING - the title of the action. - 1: OBJECT, ARRAY, STRING - the object (type) which the action should be added to. - 2: NUMBER - the distance in which the action is visible. - 3: STRING - the condition which is evaluated on every frame (if play is in range) to determine whether the action is visible. - 4: CODE - the callback which gets called when the action is activated. - 5: ARRAY - (optional) the arguments which get passed to the callback. + Parameter(s): + 0: STRING - the title of the action. + 1: OBJECT, ARRAY, STRING - the object (type) which the action should be added to. + 2: NUMBER - the distance in which the action is visible. + 3: STRING - the condition which is evaluated on every frame (if play is in range) to determine whether the action is visible. + 4: CODE - the callback which gets called when the action is activated. + 5: ARRAY - (optional) the arguments which get passed to the callback. Remarks: * '_target' is the object inside the condition string. * [object, caller, ID, arguments] is _this in the callback - Returns: - - + Returns: + - - Example: - ["Hint Hello!", player, 0, "true", { hint format ["Hello %1", name player]; }] call AIS_Core_fnc_addAction; - ["Hint Hello!", "Man", 3, "true", { hint format ["Hello %1", name (_this select 0)]; }] call AIS_Core_fnc_addAction; + Example: + ["Hint Hello!", player, 0, "true", { hint format ["Hello %1", name player]; }] call AIS_Core_fnc_addAction; + ["Hint Hello!", "Man", 3, "true", { hint format ["Hello %1", name (_this select 0)]; }] call AIS_Core_fnc_addAction; */ params ["_text", "_onObject", "_distance", "_condition", "_callback", ["_args", []], ["_formated", "", [""]]]; @@ -35,36 +35,36 @@ if (_distance > 0) then { if (_onObject isEqualType objNull && {_onObject isEqualTo AIS_Core_realPlayer}) exitWith { private _action = _onObject addAction [_text, _callback, _args, 1.5, false, true, "", _condition, _distance]; - - if (_formated != "") then { - _onObject setUserActionText [ - _action, - _text, - format [_formated, _text], - "" - ]; - }; - - [ - "AIS_playerChanged", { - params ["_data", "_params"]; - _data params ["_currentPlayer", "_oldPlayer"]; - _params params ["_text", "_callback", "_distance", ["_args", []], "_condition", ["_formated", "", [""]]]; + + if (_formated != "") then { + _onObject setUserActionText [ + _action, + _text, + format [_formated, _text], + "" + ]; + }; + + [ + "AIS_playerChanged", { + params ["_data", "_params"]; + _data params ["_currentPlayer", "_oldPlayer"]; + _params params ["_text", "_callback", "_distance", ["_args", []], "_condition", ["_formated", "", [""]]]; - private _action = _currentPlayer addAction [_text, _callback, _args, 1.5, false, true, "", _condition, _distance]; - - if (_formated != "") then { - _currentPlayer setUserActionText [ - _action, - _text, - format [_formated, _text], - "" - ]; - }; - }, - [_text, _callback, _distance, _args, _condition, _formated] - ] call AIS_Core_fnc_bindEventHandler; - + private _action = _currentPlayer addAction [_text, _callback, _args, 1.5, false, true, "", _condition, _distance]; + + if (_formated != "") then { + _currentPlayer setUserActionText [ + _action, + _text, + format [_formated, _text], + "" + ]; + }; + }, + [_text, _callback, _distance, _args, _condition, _formated] + ] call AIS_Core_fnc_bindEventHandler; + }; if (!(_onObject isEqualType [])) then { diff --git a/source/AIS/Core/fn_aisInitHost.sqf b/source/AIS/Core/fn_aisInitHost.sqf index 63cfaf9..3993bb4 100644 --- a/source/AIS/Core/fn_aisInitHost.sqf +++ b/source/AIS/Core/fn_aisInitHost.sqf @@ -3,10 +3,10 @@ params ["_unit"]; if (_unit getVariable ["AIS_noReviveInit", false]) exitWith {}; if (!isNil {_unit getVariable "ais_aisInit"}) then { - _unit removeAllEventHandlers "Killed"; - _unit removeAllEventHandlers "Respawn"; - _unit removeAllEventHandlers "HandleHeal"; - [_unit] call AIS_Core_fnc_setVariables; + _unit removeAllEventHandlers "Killed"; + _unit removeAllEventHandlers "Respawn"; + _unit removeAllEventHandlers "HandleHeal"; + [_unit] call AIS_Core_fnc_setVariables; }; _unit setVariable ["ais_aisInit", true]; @@ -14,20 +14,20 @@ _unit setVariable ["ais_aisInit", true]; // set damage EH only for local and non-player units! // last check if unit is local if (local _unit && !(isPlayer _unit)) then { - [_unit] spawn { - _unit = _this select 0; + [_unit] spawn { + _unit = _this select 0; - waitUntil {!isNil {_unit getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; - _unit removeAllEventHandlers "handleDamage"; - ["%1 --- add damageEH to AI %2", diag_ticktime, _unit] call BIS_fnc_logFormat; - ais_hdEH = _unit addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; - - ais_hkEH = _unit addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; - - if ([_unit] call AIS_Core_fnc_isPlayable) then { - ais_hrEH = _unit addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; - }; - _unit removeAllEventHandlers "HandleHeal"; - ais_hhEH = _unit addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; - }; + waitUntil {!isNil {_unit getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; + _unit removeAllEventHandlers "handleDamage"; + ["%1 --- add damageEH to AI %2", diag_ticktime, _unit] call BIS_fnc_logFormat; + ais_hdEH = _unit addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; + + ais_hkEH = _unit addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; + + if ([_unit] call AIS_Core_fnc_isPlayable) then { + ais_hrEH = _unit addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; + }; + _unit removeAllEventHandlers "HandleHeal"; + ais_hhEH = _unit addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + }; }; \ No newline at end of file diff --git a/source/AIS/Core/fn_aisInitPlayer.sqf b/source/AIS/Core/fn_aisInitPlayer.sqf index 934ad0f..9ddeb61 100644 --- a/source/AIS/Core/fn_aisInitPlayer.sqf +++ b/source/AIS/Core/fn_aisInitPlayer.sqf @@ -7,96 +7,96 @@ if (_player getVariable ["AIS_noReviveInit", false]) exitWith {}; // set damage EH local to the player if (local _player) then { - [_player] call AIS_Core_fnc_setVariables; - - [_player] spawn { - _player = _this select 0; - waitUntil {!isNil {_player getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; - _player removeAllEventHandlers "handleDamage"; // make sure nothing else working byside - //["%1 --- add damageEH to player %2", diag_ticktime, _player] call BIS_fnc_logFormat; - _player addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; - - _player addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; - - _player addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; - - _player addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; - - waitUntil {!isNull (findDisplay 46)}; - (findDisplay 46) displayAddEventHandler ["KeyDown", {_this call AIS_System_fnc_keyHandler}]; - }; + [_player] call AIS_Core_fnc_setVariables; + + [_player] spawn { + _player = _this select 0; + waitUntil {!isNil {_player getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; + _player removeAllEventHandlers "handleDamage"; // make sure nothing else working byside + //["%1 --- add damageEH to player %2", diag_ticktime, _player] call BIS_fnc_logFormat; + _player addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; + + _player addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; + + _player addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; + + _player addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + + waitUntil {!isNull (findDisplay 46)}; + (findDisplay 46) displayAddEventHandler ["KeyDown", {_this call AIS_System_fnc_keyHandler}]; + }; }; // AI is local to the group leader on dedicated environment if (!isServer && (count (units group player) > 1)) then { - if (leader group _player isEqualTo _player) then { - - [_player] spawn { - _player = _this select 0; - _groupWithoutPlayers = ((units group _player) - (allUnits select {isPlayer _x})); - {[_x] call AIS_Core_fnc_setVariables; true} count _groupWithoutPlayers; - - waitUntil {!isNil {_player getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; - { - _x removeAllEventHandlers "handleDamage"; - //["%1 --- add damageEH to groupmember of %3's group: %2", diag_ticktime, _x, _player] call BIS_fnc_logFormat; - _x addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; - - _x removeAllEventHandlers "Killed"; - _x addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; - - _x removeAllEventHandlers "Respawn"; - if ([_x] call AIS_Core_fnc_isPlayable) then { - _x addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; - }; - - _x addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; - - true - } count _groupWithoutPlayers; - }; - - }; + if (leader group _player isEqualTo _player) then { + + [_player] spawn { + _player = _this select 0; + _groupWithoutPlayers = ((units group _player) - (allUnits select {isPlayer _x})); + {[_x] call AIS_Core_fnc_setVariables; true} count _groupWithoutPlayers; + + waitUntil {!isNil {_player getVariable "BIS_fnc_feedback_hitArrayHandler"} || {time > 0}}; + { + _x removeAllEventHandlers "handleDamage"; + //["%1 --- add damageEH to groupmember of %3's group: %2", diag_ticktime, _x, _player] call BIS_fnc_logFormat; + _x addEventHandler ["HandleDamage", {_this call AIS_Damage_fnc_handleDamage}]; + + _x removeAllEventHandlers "Killed"; + _x addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; + + _x removeAllEventHandlers "Respawn"; + if ([_x] call AIS_Core_fnc_isPlayable) then { + _x addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; + }; + + _x addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + + true + } count _groupWithoutPlayers; + }; + + }; }; // add handleHeal local to the player for every unit and set the correct anim-state (local) -private _allPlayers = allUnits select {isPlayer _x}; // doesn't use allPlayers at this point, cause it can be delayed in self-hosted env. +private _allPlayers = allUnits select {isPlayer _x}; // doesn't use allPlayers at this point, cause it can be delayed in self-hosted env. private _ais_revive_units = toLower AIS_REVIVE_INIT_UNITS; private _init_units = call { - if (_ais_revive_units isEqualTo "allunits") exitWith {allUnits}; - if (_ais_revive_units isEqualTo "allplayers") exitWith {_allPlayers}; // at this point only as a dummy. Cause everytime every player will auto-init, regardless what the setup will say. - if (_ais_revive_units isEqualTo "allplayables") exitWith {if (isMultiplayer) then {playableUnits} else {switchableUnits}}; - if (_ais_revive_units isEqualTo "allunitsblufor") exitWith {allUnits select {(side _x) isEqualTo blufor}}; - if (_ais_revive_units isEqualTo "allunitsopfor") exitWith {allUnits select {(side _x) isEqualTo opfor}}; - if (_ais_revive_units isEqualTo "allunitsindfor") exitWith {allUnits select {(side _x) isEqualTo resistance}}; - if (_ais_revive_units isEqualTo "allunitscivilian") exitWith {allUnits select {(side _x) isEqualTo civilian}}; - diag_log "AIS ERROR: Issue in Setup-File found! Parameter AIS_REVIVE_UNITS wrong defined."; [] + if (_ais_revive_units isEqualTo "allunits") exitWith {allUnits}; + if (_ais_revive_units isEqualTo "allplayers") exitWith {_allPlayers}; // at this point only as a dummy. Cause everytime every player will auto-init, regardless what the setup will say. + if (_ais_revive_units isEqualTo "allplayables") exitWith {if (isMultiplayer) then {playableUnits} else {switchableUnits}}; + if (_ais_revive_units isEqualTo "allunitsblufor") exitWith {allUnits select {(side _x) isEqualTo blufor}}; + if (_ais_revive_units isEqualTo "allunitsopfor") exitWith {allUnits select {(side _x) isEqualTo opfor}}; + if (_ais_revive_units isEqualTo "allunitsindfor") exitWith {allUnits select {(side _x) isEqualTo resistance}}; + if (_ais_revive_units isEqualTo "allunitscivilian") exitWith {allUnits select {(side _x) isEqualTo civilian}}; + diag_log "AIS ERROR: Issue in Setup-File found! Parameter AIS_REVIVE_UNITS wrong defined."; [] }; { - _x removeAllEventHandlers "HandleHeal"; - _x addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; - - if (_x getVariable ["ais_unconscious", false]) then { - if (!isNull(_x getVariable ["ais_DragDrop_Player", objNull])) then { - _x switchMove "AinjPpneMrunSnonWnonDb"; - } else { - _x playActionNow "agonyStart"; - }; - }; - - true + _x removeAllEventHandlers "HandleHeal"; + _x addEventHandler ["HandleHeal", {_this call AIS_System_fnc_handleHeal}]; + + if (_x getVariable ["ais_unconscious", false]) then { + if (!isNull(_x getVariable ["ais_DragDrop_Player", objNull])) then { + _x switchMove "AinjPpneMrunSnonWnonDb"; + } else { + _x playActionNow "agonyStart"; + }; + }; + + true } count _init_units; ais_medequip_array = []; if (AIS_TOGGLE_RADIO) then { - [true] call AIS_Effects_fnc_toggleRadio; + [true] call AIS_Effects_fnc_toggleRadio; }; // JIP in a unconscious AI... and avoid cheating by left in lobby... if (_player getVariable ["ais_unconscious", false]) then { - [{[(_this select 0)] call AIS_System_fnc_setUnconscious}, [_player]] call AIS_Core_fnc_onNextFrame; + [{[(_this select 0)] call AIS_System_fnc_setUnconscious}, [_player]] call AIS_Core_fnc_onNextFrame; }; inGameUISetEventHandler ["Action", "_this call AIS_System_fnc_overrideHealAction"]; diff --git a/source/AIS/Core/fn_bindEventHandler.sqf b/source/AIS/Core/fn_bindEventHandler.sqf index e7f97b1..83130c2 100644 --- a/source/AIS/Core/fn_bindEventHandler.sqf +++ b/source/AIS/Core/fn_bindEventHandler.sqf @@ -5,16 +5,16 @@ Description: Bind an EH for a custom event. This EH will be called when the event is triggered. - + Parameter(s): - 0: STRING - the name of the event - 1: CODE - the code which get called (_this select 0 will be the data, _this select 1 will be the params) - 2: ARRAY - the params passed to the code (optional) - + Returns: - Example: - + ["playerChanged", { hint "Player has changed"; }] call AIS_Core_fnc_bindEventHandler; */ diff --git a/source/AIS/Core/fn_createLocalMarker.sqf b/source/AIS/Core/fn_createLocalMarker.sqf index 7de3220..bcef002 100644 --- a/source/AIS/Core/fn_createLocalMarker.sqf +++ b/source/AIS/Core/fn_createLocalMarker.sqf @@ -1,15 +1,15 @@ // ["my marker", position player, "ICON", "ColorRed", [0.5,0.5]] call AIS_Core_fnc_createLocalMarker; params [ - ["_name","",[""]], - ["_pos",[0,0],[[]]], - ["_shape","ICON",[""]], - ["_color","Default",[""]], - ["_size",[1,1],[[]]], - ["_text","",[""]], - ["_dir",0,[0]], - ["_type","mil_dot",[""]], - ["_brush","",[""]] + ["_name","",[""]], + ["_pos",[0,0],[[]]], + ["_shape","ICON",[""]], + ["_color","Default",[""]], + ["_size",[1,1],[[]]], + ["_text","",[""]], + ["_dir",0,[0]], + ["_type","mil_dot",[""]], + ["_brush","",[""]] ]; private _marker = createMarkerLocal [_name, _pos]; diff --git a/source/AIS/Core/fn_dynamicText.sqf b/source/AIS/Core/fn_dynamicText.sqf index 2ed9817..cfb83dd 100644 --- a/source/AIS/Core/fn_dynamicText.sqf +++ b/source/AIS/Core/fn_dynamicText.sqf @@ -1,5 +1,5 @@ /* - ["Mein Text"] call AIS_Core_fnc_dynamicText; + ["Mein Text"] call AIS_Core_fnc_dynamicText; */ _text = _this param [0,"",["",{}]]; diff --git a/source/AIS/Core/fn_handleDisconnect.sqf b/source/AIS/Core/fn_handleDisconnect.sqf index f6aa163..2d381e7 100644 --- a/source/AIS/Core/fn_handleDisconnect.sqf +++ b/source/AIS/Core/fn_handleDisconnect.sqf @@ -4,11 +4,11 @@ * Server side handling of disconnected players. The disconnected entity get transfered to the server and re-init the AIS. * Arguments: - 0: Entity (Object, old player) + 0: Entity (Object, old player) * Return value: - - - + - + * Attention! Override: If this EH code returns true, the unit, previously occupied by player, gets transferred to the server, becomes AI and continues to live, even with description.ext param disabledAI = 1; */ @@ -19,25 +19,25 @@ params ["_entity"]; // delete unit if mission designer have set disabledAI param set to 1 _deleteEntity = false; _deleteEntity = if ((getMissionConfigValue "disabledAI") isEqualType 0) then { - _back = if ((getMissionConfigValue ["disabledAI", 0]) > 0) then {true} else {false};_back + _back = if ((getMissionConfigValue ["disabledAI", 0]) > 0) then {true} else {false};_back } else { - _back = if ((toUpper((getMissionConfigValue ["disabledAI", "false"]))) isEqualTo "TRUE") then {true} else {false};_back + _back = if ((toUpper((getMissionConfigValue ["disabledAI", "false"]))) isEqualTo "TRUE") then {true} else {false};_back }; if (_deleteEntity) exitWith { - if (local _entity) then { - if (!isNull objectParent _entity) then { - unassignVehicle _entity; - moveOut _entity; - }; - deleteVehicle _entity; - }; - false + if (local _entity) then { + if (!isNull objectParent _entity) then { + unassignVehicle _entity; + moveOut _entity; + }; + deleteVehicle _entity; + }; + false }; // othrwise re-init the unit on the new owner (server) if (!isNil {_entity getVariable "ais_unconscious"}) then { - _entity call AIS_Core_fnc_aisInitHost; + _entity call AIS_Core_fnc_aisInitHost; }; diff --git a/source/AIS/Core/fn_inRange.sqf b/source/AIS/Core/fn_inRange.sqf index 0582229..7cf4acc 100644 --- a/source/AIS/Core/fn_inRange.sqf +++ b/source/AIS/Core/fn_inRange.sqf @@ -1,29 +1,29 @@ /* - Author: [C-L-F] NetFusion + Author: [C-L-F] NetFusion - Description: - Checks whether an object is in a given range to player. + Description: + Checks whether an object is in a given range to player. - Parameter(s): - 0: OBJECT - the object which should be checked. - 1: NUMBER - the range to check. + Parameter(s): + 0: OBJECT - the object which should be checked. + 1: NUMBER - the range to check. - Returns: - - BOOL - true if the object in in range, false if not. + Returns: + - BOOL - true if the object in in range, false if not. - Example: - [object, 10] call AIS_Core_fnc_inRange; + Example: + [object, 10] call AIS_Core_fnc_inRange; */ params [ - ["_object", objNull, [player]], - ["_distance", 15, [0]] + ["_object", objNull, [player]], + ["_distance", 15, [0]] ]; _return = if (!isNull _object && {player distance2D _object < _distance}) then { - true + true } else { - false + false }; diff --git a/source/AIS/Core/fn_initEvents.sqf b/source/AIS/Core/fn_initEvents.sqf index e15e787..a5c17e1 100644 --- a/source/AIS/Core/fn_initEvents.sqf +++ b/source/AIS/Core/fn_initEvents.sqf @@ -2,16 +2,16 @@ Arma Mission Enhancement - Core\Events\fn_initEvents.sqf Author: NetFusion Changed: Psycho - expand function with "next-frame" and "waitUntil" elements - + Description: Adds a loop which call all OEF EHs. Will be called by autoload for client and server. There is no need to call it manually. - + Parameter(s): - - + Returns: - - + Example: - */ @@ -25,9 +25,9 @@ AIS_waitUntilAndExecArray = []; AIS_Core_eachFrameHandlerId = addMissionEventHandler ["EachFrame", { - // Execute per frame handlers - // Fetch all OEF EHs from missionNamespace. - private _onEachFrameHandler = missionNamespace getVariable ["AIS_Core_onEachFrameData", []]; + // Execute per frame handlers + // Fetch all OEF EHs from missionNamespace. + private _onEachFrameHandler = missionNamespace getVariable ["AIS_Core_onEachFrameData", []]; { _x params ["_code", "_delay", "_nextExecTime", "_params"]; @@ -39,39 +39,39 @@ AIS_Core_eachFrameHandlerId = addMissionEventHandler ["EachFrame", { [_forEachIndex, _params] call _code; //@todo if an EH removed itself the next EH may be skipped }; } forEach _onEachFrameHandler; - + - // Execute the exec next frame functions (from CBA) - if (count AIS_nextFrameBufferA > 0) then { - { - (_x select 0) call (_x select 1); - false - } count AIS_nextFrameBufferA; - // Swap double-buffer: - AIS_nextFrameBufferA = AIS_nextFrameBufferB; - AIS_nextFrameBufferB = []; - AIS_nextFrameNo = diag_frameno + 1; - }; - - - // handle the waitUntil and execute function (from CBA) - if (count AIS_waitUntilAndExecArray > 0) then { - private _delete = false; - { - // if condition is satisfied call statement - if ((_x select 2) call (_x select 0)) then { - (_x select 2) call (_x select 1); - AIS_waitUntilAndExecArray set [_forEachIndex, objNull]; - _delete = true; - }; - } forEach AIS_waitUntilAndExecArray; - if (_delete) then { - AIS_waitUntilAndExecArray = AIS_waitUntilAndExecArray - [objNull]; - }; - }; + // Execute the exec next frame functions (from CBA) + if (count AIS_nextFrameBufferA > 0) then { + { + (_x select 0) call (_x select 1); + false + } count AIS_nextFrameBufferA; + // Swap double-buffer: + AIS_nextFrameBufferA = AIS_nextFrameBufferB; + AIS_nextFrameBufferB = []; + AIS_nextFrameNo = diag_frameno + 1; + }; + + + // handle the waitUntil and execute function (from CBA) + if (count AIS_waitUntilAndExecArray > 0) then { + private _delete = false; + { + // if condition is satisfied call statement + if ((_x select 2) call (_x select 0)) then { + (_x select 2) call (_x select 1); + AIS_waitUntilAndExecArray set [_forEachIndex, objNull]; + _delete = true; + }; + } forEach AIS_waitUntilAndExecArray; + if (_delete) then { + AIS_waitUntilAndExecArray = AIS_waitUntilAndExecArray - [objNull]; + }; + }; - // remove the pfh if client left the mission + // remove the pfh if client left the mission if (getClientState == "GAME FINISHED") then { - removeMissionEventHandler ["EachFrame", AIS_Core_eachFrameHandlerId]; + removeMissionEventHandler ["EachFrame", AIS_Core_eachFrameHandlerId]; }; }]; \ No newline at end of file diff --git a/source/AIS/Core/fn_isPlayable.sqf b/source/AIS/Core/fn_isPlayable.sqf index 54d50d1..c0bdc06 100644 --- a/source/AIS/Core/fn_isPlayable.sqf +++ b/source/AIS/Core/fn_isPlayable.sqf @@ -4,10 +4,10 @@ * Check if a unit is a playable unit. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - BOOL (true if playable) + BOOL (true if playable) */ params ["_unit"]; @@ -15,9 +15,9 @@ private _isplayable = false; if (isPlayer _unit) exitWith {true}; _isplayable = if (isMultiplayer) then { - if (_unit in playableUnits) then {true} else {false}; + if (_unit in playableUnits) then {true} else {false}; } else { - if (_unit in switchableUnits) then {true} else {false}; + if (_unit in switchableUnits) then {true} else {false}; }; diff --git a/source/AIS/Core/fn_onEachFrame.sqf b/source/AIS/Core/fn_onEachFrame.sqf index 91aa399..cbeff02 100644 --- a/source/AIS/Core/fn_onEachFrame.sqf +++ b/source/AIS/Core/fn_onEachFrame.sqf @@ -2,27 +2,27 @@ Arma Mission Enhancement - Core\Events\fn_onEachFrame.sqf Author: NetFusion - + Description: Adds an OEF EHs. The EH will be called on each frame with a custom delay between the calls. - + Parameter(s): - 1: CODE - the code which is called (_this select 0 will be the EH id, _this select 1 will be the params) - 2: SCALAR - the delay between two code calls in seconds (optional) - 3: ARRAY - the parameters which get passed to the code on call (optional) - + Returns: - - + Example: [{ hint (str diagFrameNo); }] call AIS_Core_fnc_onEachFrame; */ params [ - "_code", - ["_delay", 0], - ["_params", []] + "_code", + ["_delay", 0], + ["_params", []] ]; // Push the data on the OEF EH array. diff --git a/source/AIS/Core/fn_onNextFrame.sqf b/source/AIS/Core/fn_onNextFrame.sqf index fff1792..9040dc5 100644 --- a/source/AIS/Core/fn_onNextFrame.sqf +++ b/source/AIS/Core/fn_onNextFrame.sqf @@ -9,19 +9,19 @@ Parameters: _args - Parameters passed to the function executing. This will be the same array every execution. [optional] Returns: Nothing - + Examples: (begin example) [{player sideChat format ["This is frame %1, not %2", diag_frameno, _this select 0];}, [diag_frameno]] call AIS_Core_fnc_onNextFrame; (end) - + Author: esteldunedain and PabstMirror, donated from ACE3 ---------------------------------------------------------------------------- */ params [ - ["_function", {}, [{}]], - ["_args", []] + ["_function", {}, [{}]], + ["_args", []] ]; if (diag_frameno != AIS_nextFrameNo) then { diff --git a/source/AIS/Core/fn_postinit.sqf b/source/AIS/Core/fn_postinit.sqf index a7d55e6..e2662c8 100644 --- a/source/AIS/Core/fn_postinit.sqf +++ b/source/AIS/Core/fn_postinit.sqf @@ -2,40 +2,40 @@ if (ais_ace_shutdown) exitWith {["AIS: AIS shutdown itself cause ACE mod was det #include "..\AIS_SETUP.sqf" if (isServer) then { - private _allPlayers = allUnits select {isPlayer _x}; // doesn't use allPlayers at this point, cause it can be delayed in self-hosted env. + private _allPlayers = allUnits select {isPlayer _x}; // doesn't use allPlayers at this point, cause it can be delayed in self-hosted env. - private _ais_revive_units = toLower AIS_REVIVE_INIT_UNITS; - private _init_units = call { - if (_ais_revive_units isEqualTo "allunits") exitWith {allUnits}; - if (_ais_revive_units isEqualTo "allplayers") exitWith {_allPlayers}; // at this point only as a dummy. Cause everytime every player will auto-init, regardless what the setup will say. - if (_ais_revive_units isEqualTo "allplayables") exitWith {if (isMultiplayer) then {playableUnits} else {switchableUnits}}; - if (_ais_revive_units isEqualTo "allunitsblufor") exitWith {allUnits select {(side _x) isEqualTo blufor}}; - if (_ais_revive_units isEqualTo "allunitsopfor") exitWith {allUnits select {(side _x) isEqualTo opfor}}; - if (_ais_revive_units isEqualTo "allunitsindfor") exitWith {allUnits select {(side _x) isEqualTo resistance}}; - if (_ais_revive_units isEqualTo "allunitscivilian") exitWith {allUnits select {(side _x) isEqualTo civilian}}; - diag_log "AIS ERROR: Issue in Setup-File found! Parameter AIS_REVIVE_UNITS wrong defined."; [] - }; + private _ais_revive_units = toLower AIS_REVIVE_INIT_UNITS; + private _init_units = call { + if (_ais_revive_units isEqualTo "allunits") exitWith {allUnits}; + if (_ais_revive_units isEqualTo "allplayers") exitWith {_allPlayers}; // at this point only as a dummy. Cause everytime every player will auto-init, regardless what the setup will say. + if (_ais_revive_units isEqualTo "allplayables") exitWith {if (isMultiplayer) then {playableUnits} else {switchableUnits}}; + if (_ais_revive_units isEqualTo "allunitsblufor") exitWith {allUnits select {(side _x) isEqualTo blufor}}; + if (_ais_revive_units isEqualTo "allunitsopfor") exitWith {allUnits select {(side _x) isEqualTo opfor}}; + if (_ais_revive_units isEqualTo "allunitsindfor") exitWith {allUnits select {(side _x) isEqualTo resistance}}; + if (_ais_revive_units isEqualTo "allunitscivilian") exitWith {allUnits select {(side _x) isEqualTo civilian}}; + diag_log "AIS ERROR: Issue in Setup-File found! Parameter AIS_REVIVE_UNITS wrong defined."; [] + }; - // run the init for all units present by game/mission start - _init_units = _init_units - _allPlayers; - //diag_log format ["ais init units: %1", _init_units]; - if (count _init_units > 0) then { - { - [_x] call AIS_Core_fnc_aisInitHost; - true - } count _init_units; - }; - - addMissionEventHandler ["HandleDisconnect", {_this call AIS_Core_fnc_handleDisconnect}]; + // run the init for all units present by game/mission start + _init_units = _init_units - _allPlayers; + //diag_log format ["ais init units: %1", _init_units]; + if (count _init_units > 0) then { + { + [_x] call AIS_Core_fnc_aisInitHost; + true + } count _init_units; + }; + + addMissionEventHandler ["HandleDisconnect", {_this call AIS_Core_fnc_handleDisconnect}]; }; if (isNil "AIS_MEDEVAC_STATIONS") then { - AIS_MEDEVAC_STATIONS = []; + AIS_MEDEVAC_STATIONS = []; } else { - if !(AIS_MEDEVAC_STATIONS isEqualType []) then { - AIS_MEDEVAC_STATIONS = []; - ["AIS: AIS_MEDEVAC_STATIONS wasnt defined in the correct way."] call BIS_fnc_logFormat; - }; + if !(AIS_MEDEVAC_STATIONS isEqualType []) then { + AIS_MEDEVAC_STATIONS = []; + ["AIS: AIS_MEDEVAC_STATIONS wasnt defined in the correct way."] call BIS_fnc_logFormat; + }; }; if (isDedicated || !hasInterface) exitWith {}; @@ -47,27 +47,27 @@ AIS_Core_realSide = getNumber (configfile >> "CfgVehicles" >> (typeOf AIS_Core_r [{ // There is no command to get the current player but BI has an variable in mission namespace we can use. - private _currentPlayer = missionNameSpace getVariable ["bis_fnc_moduleRemoteControl_unit", player]; // Psycho: isNull until a unit is remote controlled + private _currentPlayer = missionNameSpace getVariable ["bis_fnc_moduleRemoteControl_unit", player]; // Psycho: isNull until a unit is remote controlled // If the player changed we trigger an event and update the global variable. if (AIS_Core_realPlayer != _currentPlayer) then { - removeAllActions AIS_Core_realPlayer; - AIS_Core_realPlayer enableAI "TEAMSWITCH"; - + removeAllActions AIS_Core_realPlayer; + AIS_Core_realPlayer enableAI "TEAMSWITCH"; + ["AIS_playerChanged", [_currentPlayer, AIS_Core_realPlayer]] call AIS_Core_fnc_triggerEvent; - + AIS_Core_realPlayer = _currentPlayer; - AIS_Core_realSide = getNumber (configfile >> "CfgVehicles" >> (typeOf AIS_Core_realPlayer) >> "side"); + AIS_Core_realSide = getNumber (configfile >> "CfgVehicles" >> (typeOf AIS_Core_realPlayer) >> "side"); }; }] call AIS_Core_fnc_onEachFrame; true call AIS_Core_fnc_Interaction_loop; if (AIS_SHOW_DIARYINFO) then { - call AIS_System_fnc_diary; + call AIS_System_fnc_diary; }; true spawn { - waitUntil {time > 0}; - AIS_Core_3DEHId = addMissionEventHandler ["Draw3D", {_this call AIS_Effects_fnc_draw3D}]; + waitUntil {time > 0}; + AIS_Core_3DEHId = addMissionEventHandler ["Draw3D", {_this call AIS_Effects_fnc_draw3D}]; }; \ No newline at end of file diff --git a/source/AIS/Core/fn_preinit.sqf b/source/AIS/Core/fn_preinit.sqf index ad668ac..54bb585 100644 --- a/source/AIS/Core/fn_preinit.sqf +++ b/source/AIS/Core/fn_preinit.sqf @@ -1,20 +1,20 @@ diag_log format ["############## %1 ############## - AIS init started", missionName]; if (isServer) then { - ais_ace_shutDown = false; - if (isClass (configFile >> "CfgPatches" >> "ace_medical")) then { - ais_ace_shutDown = true; - ["AIS: AIS shutdown itself cause ACE medical system is also running. ACE medical and AIS cant work at the same time."] call BIS_fnc_logFormat; - }; - publicVariable "ais_ace_shutDown"; + ais_ace_shutDown = false; + if (isClass (configFile >> "CfgPatches" >> "ace_medical")) then { + ais_ace_shutDown = true; + ["AIS: AIS shutdown itself cause ACE medical system is also running. ACE medical and AIS cant work at the same time."] call BIS_fnc_logFormat; + }; + publicVariable "ais_ace_shutDown"; }; if (!isNil "AIS_Core_3DEHId") then { - removeMissionEventHandler ["Draw3D", AIS_Core_3DEHId]; + removeMissionEventHandler ["Draw3D", AIS_Core_3DEHId]; }; if (!isNil "AIS_Core_eachFrameHandlerId") then { - removeMissionEventHandler ["EachFrame", AIS_Core_eachFrameHandlerId]; + removeMissionEventHandler ["EachFrame", AIS_Core_eachFrameHandlerId]; }; call AIS_Core_fnc_initEvents; diff --git a/source/AIS/Core/fn_progress_ShowBar.sqf b/source/AIS/Core/fn_progress_ShowBar.sqf index 776e755..1f9c6b4 100644 --- a/source/AIS/Core/fn_progress_ShowBar.sqf +++ b/source/AIS/Core/fn_progress_ShowBar.sqf @@ -5,15 +5,15 @@ * Generate progress bar dialog and pass trough the code what's to do after finish or abort the progress. * Arguments: - 0: Title (String) - 1: duration in sec (Integer) - 2: callback (Code) - 3: arguments for callback (Object or Array) - 4: onAbort (optional) (Code) - 5: doAbort (optional) (Bool) + 0: Title (String) + 1: duration in sec (Integer) + 2: callback (Code) + 3: arguments for callback (Object or Array) + 4: onAbort (optional) (Code) + 5: doAbort (optional) (Bool) * Return value: - nothing + nothing */ @@ -24,13 +24,13 @@ _duration = _this select 1; _callback = _this select 2; _arguments = _this select 3; _onAbort = if (count _this > 4) then {_this select 4} else {{}}; -_doAbort = if (count _this > 5) then {_this select 5} else {false}; // added by Psycho +_doAbort = if (count _this > 5) then {_this select 5} else {false}; // added by Psycho _endTime = time + _duration; _affectingObject = if (typeName _arguments == "ARRAY") then {_arguments select 0} else {_arguments}; if (typeName _affectingObject == "OBJECT") then { if (_affectingObject getVariable ["AIS_Core_Progress_inUse", false]) exitWith { - ["Object in use" call XOrangeText] call AIS_Core_fnc_dynamicText; + ["Object in use" call XOrangeText] call AIS_Core_fnc_dynamicText; }; _affectingObject setVariable ["AIS_Core_Progress_inUse", true, true]; @@ -53,8 +53,8 @@ _time = time; //waitUntil {!dialog || time > _endTime || !alive player || _doAbort}; while {dialog && {time < _endTime} && {alive player} && {!_doAbort}} do { - sleep 0.5; - [_title, ((time - _time) / (_duration)) min 1] spawn AIS_Core_fnc_progress_showBarText; + sleep 0.5; + [_title, ((time - _time) / (_duration)) min 1] spawn AIS_Core_fnc_progress_showBarText; }; closeDialog 0; diff --git a/source/AIS/Core/fn_progress_ShowBarText.sqf b/source/AIS/Core/fn_progress_ShowBarText.sqf index 3b5748c..786ddd5 100644 --- a/source/AIS/Core/fn_progress_ShowBarText.sqf +++ b/source/AIS/Core/fn_progress_ShowBarText.sqf @@ -11,11 +11,11 @@ _sitrep = ""; _sitrepFormat = "" + _title + ":%1"; for "_i" from 0 to (count _sitrepArray - 1) do { - _letter = _sitrepArray select _i; - _delay = if (_letter == "|") then {_letter = "
"; 1} else {0.02}; - _sitrep = _sitrep + _letter; - _text = parseText format [_sitrepFormat, _sitrep + "_"]; + _letter = _sitrepArray select _i; + _delay = if (_letter == "|") then {_letter = "
"; 1} else {0.02}; + _sitrep = _sitrep + _letter; + _text = parseText format [_sitrepFormat, _sitrep + "_"]; - _progressTitle ctrlSetText str(_text); - sleep _delay; + _progressTitle ctrlSetText str(_text); + sleep _delay; }; \ No newline at end of file diff --git a/source/AIS/Core/fn_removeOnEachFrame.sqf b/source/AIS/Core/fn_removeOnEachFrame.sqf index e53f68a..890d435 100644 --- a/source/AIS/Core/fn_removeOnEachFrame.sqf +++ b/source/AIS/Core/fn_removeOnEachFrame.sqf @@ -2,16 +2,16 @@ Arma Mission Enhancement - Core\Events\fn_removeOnEachFrame.sqf Author: NetFusion - + Description: Remove an OEF EH by its id. Ids are not persistent but unique inside one frame. - + Parameter(s): - SCALAR - the id of the OEF EH - + Returns: - - + Example: _id call AIS_Core_fnc_removeOnEachFrame; */ diff --git a/source/AIS/Core/fn_resetOnTeamSwitch.sqf b/source/AIS/Core/fn_resetOnTeamSwitch.sqf index 144b3d8..e93dd53 100644 --- a/source/AIS/Core/fn_resetOnTeamSwitch.sqf +++ b/source/AIS/Core/fn_resetOnTeamSwitch.sqf @@ -4,11 +4,11 @@ * Handle unit state after a teamswtich was performed. * Arguments: - 0: Player New (Object) - 1: Unit Old (Object) + 0: Player New (Object) + 1: Unit Old (Object) * Return value: - - + - */ params ["_new_player", "_old_player"]; @@ -20,11 +20,11 @@ _old_player enableAI "TEAMSWITCH"; AIS_Core_realSide = getNumber (configfile >> "CfgVehicles" >> (typeOf _new_player) >> "side"); if (_old_player getVariable ["ais_unconscious", false]) then { - ais_character_changed = true; // reset blood splatter screen + ais_character_changed = true; // reset blood splatter screen }; if (_new_player getVariable ["ais_unconscious", false]) then { - [_new_player] call AIS_System_fnc_bloodloss; + [_new_player] call AIS_System_fnc_bloodloss; }; diff --git a/source/AIS/Core/fn_setPosAGLS.sqf b/source/AIS/Core/fn_setPosAGLS.sqf index 02a880d..0f0b634 100644 --- a/source/AIS/Core/fn_setPosAGLS.sqf +++ b/source/AIS/Core/fn_setPosAGLS.sqf @@ -1,14 +1,14 @@ // from Killzone Kid /* - //---This will place player exactly on top deck of Cargo HQ on Stratis: - [player, [2437.18,5693.47,0]] call AIS_Core_fnc_setPosAGLS; - - //---This will place player 2m above top deck of Cargo HQ on Stratis: - [player, [2437.18,5693.47,2]] call AIS_Core_fnc_setPosAGLS; - - //---This will place player 2m below top deck of Cargo HQ on Stratis: - [player, [2437.18,5693.47,-2]] call AIS_Core_fnc_setPosAGLS; + //---This will place player exactly on top deck of Cargo HQ on Stratis: + [player, [2437.18,5693.47,0]] call AIS_Core_fnc_setPosAGLS; + + //---This will place player 2m above top deck of Cargo HQ on Stratis: + [player, [2437.18,5693.47,2]] call AIS_Core_fnc_setPosAGLS; + + //---This will place player 2m below top deck of Cargo HQ on Stratis: + [player, [2437.18,5693.47,-2]] call AIS_Core_fnc_setPosAGLS; */ params ["_obj", "_pos", "_offset"]; diff --git a/source/AIS/Core/fn_setVariables.sqf b/source/AIS/Core/fn_setVariables.sqf index f51b3c3..aa9a9ac 100644 --- a/source/AIS/Core/fn_setVariables.sqf +++ b/source/AIS/Core/fn_setVariables.sqf @@ -4,10 +4,10 @@ * Set all needed vars to the unit. * Arguments: - 0: Healer Unit (Object) + 0: Healer Unit (Object) * Return value: - Nothing + Nothing */ params ["_unit"]; @@ -24,13 +24,13 @@ ais_reenable_teamswitch = false; // global (players and AI's) // set Vars only if it is Nil. Isnt't everytime Nil(f.e. JIP's use AI to join in - get the last state from this AI) if (isNil {_unit getVariable "ais_unconscious"}) then { - _unit setVariable ["ais_unconscious", false, true]; - _unit setVariable ["ais_stabilized", false, true]; - _unit setVariable ["ais_hasHelper", objNull, true]; - _unit setVariable ["ais_DragDrop_Player", objNull, true]; - _unit setVariable ["ais_DragDrop_Torso", objNull];// local is enough? - _unit setVariable ["AIS_MedicalStore", [0,0,0,0], true]; - _unit setVariable ["ais_man_pullOut", false, true]; + _unit setVariable ["ais_unconscious", false, true]; + _unit setVariable ["ais_stabilized", false, true]; + _unit setVariable ["ais_hasHelper", objNull, true]; + _unit setVariable ["ais_DragDrop_Player", objNull, true]; + _unit setVariable ["ais_DragDrop_Torso", objNull];// local is enough? + _unit setVariable ["AIS_MedicalStore", [0,0,0,0], true]; + _unit setVariable ["ais_man_pullOut", false, true]; }; diff --git a/source/AIS/Core/fn_waitUntilAndExecute.sqf b/source/AIS/Core/fn_waitUntilAndExecute.sqf index 6be889f..086f8cd 100644 --- a/source/AIS/Core/fn_waitUntilAndExecute.sqf +++ b/source/AIS/Core/fn_waitUntilAndExecute.sqf @@ -25,9 +25,9 @@ Author: ---------------------------------------------------------------------------- */ params [ - ["_condition", {}, [{}]], - ["_statement", {}, [{}]], - ["_args", []] + ["_condition", {}, [{}]], + ["_statement", {}, [{}]], + ["_args", []] ]; AIS_waitUntilAndExecArray pushBack [_condition, _statement, _args]; diff --git a/source/AIS/Damage/cfgFunctions.hpp b/source/AIS/Damage/cfgFunctions.hpp index 5889581..35a8d97 100644 --- a/source/AIS/Damage/cfgFunctions.hpp +++ b/source/AIS/Damage/cfgFunctions.hpp @@ -3,10 +3,10 @@ class AIS_Damage class AIS_Damage { file = "AIS\Damage"; - class exitDamageHandler; - class getHitIndexValue; - class goToDead; - class handleDamage; - class verifyDamageType; + class exitDamageHandler; + class getHitIndexValue; + class goToDead; + class handleDamage; + class verifyDamageType; }; }; \ No newline at end of file diff --git a/source/AIS/Damage/fn_exitDamageHandler.sqf b/source/AIS/Damage/fn_exitDamageHandler.sqf index 318d628..c731542 100644 --- a/source/AIS/Damage/fn_exitDamageHandler.sqf +++ b/source/AIS/Damage/fn_exitDamageHandler.sqf @@ -4,11 +4,11 @@ * give back the last damage of the specific body part * Arguments: - 0: Unit (Object) - 1: hitPartIndex (Number) + 0: Unit (Object) + 1: hitPartIndex (Number) * Return value: - damage + damage */ params ["_unit", "_hitPartIndex"]; diff --git a/source/AIS/Damage/fn_getHitIndexValue.sqf b/source/AIS/Damage/fn_getHitIndexValue.sqf index 9f60dda..5f87eb9 100644 --- a/source/AIS/Damage/fn_getHitIndexValue.sqf +++ b/source/AIS/Damage/fn_getHitIndexValue.sqf @@ -4,35 +4,35 @@ * Give back a wanted hitDamageIndex. Index number or correspondending Hitpart. * Arguments: - 0: Unit (Object) - 1: Hitindex or Hitpart (Number OR String) + 0: Unit (Object) + 1: Hitindex or Hitpart (Number OR String) * Return value: - ["Hitpart" , IndexNumber, partDamage] + ["Hitpart" , IndexNumber, partDamage] */ params [ - "_unit", - ["_hitValue", 0, [0,""]] + "_unit", + ["_hitValue", 0, [0,""]] ]; _ret = if (_hitValue isEqualType 0) then { - if (_hitValue > 10 || _hitValue < 0) exitWith {diag_log format ["AIS ERROR: AIS_Damage_fnc_getHitIndexValue, input number is out of range: %1", _hitValue]; ["",_hitValue, 0]}; - [((getAllHitPointsDamage _unit) select 1) select _hitValue, _hitValue, ((getAllHitPointsDamage _unit) select 2) select _hitValue] - + if (_hitValue > 10 || _hitValue < 0) exitWith {diag_log format ["AIS ERROR: AIS_Damage_fnc_getHitIndexValue, input number is out of range: %1", _hitValue]; ["",_hitValue, 0]}; + [((getAllHitPointsDamage _unit) select 1) select _hitValue, _hitValue, ((getAllHitPointsDamage _unit) select 2) select _hitValue] + } else { - _hitValue = toLower _hitValue; - private _num = ((getAllHitPointsDamage _unit) select 1) find _hitValue; - - if (_num < 0) then { - [_hitValue, -1, damage _unit] - } else { - [_hitValue, _num, ((getAllHitPointsDamage _unit) select 2) select _num] - }; - + _hitValue = toLower _hitValue; + private _num = ((getAllHitPointsDamage _unit) select 1) find _hitValue; + + if (_num < 0) then { + [_hitValue, -1, damage _unit] + } else { + [_hitValue, _num, ((getAllHitPointsDamage _unit) select 2) select _num] + }; + }; diff --git a/source/AIS/Damage/fn_goToDead.sqf b/source/AIS/Damage/fn_goToDead.sqf index 9932c26..bff8dbc 100644 --- a/source/AIS/Damage/fn_goToDead.sqf +++ b/source/AIS/Damage/fn_goToDead.sqf @@ -4,10 +4,10 @@ * Set the unit to the real dead. (overall damage == 1) * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - - + - */ params ["_unit", ["_killer",objNull,[]]]; @@ -19,19 +19,19 @@ _unit setVariable ["AIS_UnitIsDead", true]; // unit is dragged. So the dragger have to call the release function. if (!(isNull (_unit getVariable ["ais_DragDrop_Player", objNull]))) then { - _dragger = _unit getVariable ["ais_DragDrop_Player", objNull]; - [_unit] remoteExecCall ["AIS_System_fnc_release", _dragger, false]; + _dragger = _unit getVariable ["ais_DragDrop_Player", objNull]; + [_unit] remoteExecCall ["AIS_System_fnc_release", _dragger, false]; }; _unit call AIS_System_fnc_restoreFaks; // kill message and score point if (!isNull _killer && {isPlayer _killer}) then { - [_killer, 1] remoteExec ["addScore", 2]; - if (isPlayer _unit) then { - _text = format ["%1 was killed by %2", name _unit, name _source]; - [_text] remoteExec ["systemChat", 0]; - }; + [_killer, 1] remoteExec ["addScore", 2]; + if (isPlayer _unit) then { + _text = format ["%1 was killed by %2", name _unit, name _source]; + [_text] remoteExec ["systemChat", 0]; + }; }; // dead... if some issues with the deadcam (shown killer) give the dead a deleay of 1 frame --> need testing diff --git a/source/AIS/Damage/fn_handleDamage.sqf b/source/AIS/Damage/fn_handleDamage.sqf index 174388a..8f1168c 100644 --- a/source/AIS/Damage/fn_handleDamage.sqf +++ b/source/AIS/Damage/fn_handleDamage.sqf @@ -15,23 +15,23 @@ * Damage */ -/* allHitPointsDamage +/* allHitPointsDamage [ - ["HitFace","HitNeck","HitHead","HitPelvis","HitAbdomen","HitDiaphragm","HitChest","HitBody","HitArms","HitHands","HitLegs"], - ["face_hub","neck","head","pelvis","spine1","spine2","spine3","body","arms","hands","legs"], - [0,0,0,0,0,0,0,0,0,0,0] + ["HitFace","HitNeck","HitHead","HitPelvis","HitAbdomen","HitDiaphragm","HitChest","HitBody","HitArms","HitHands","HitLegs"], + ["face_hub","neck","head","pelvis","spine1","spine2","spine3","body","arms","hands","legs"], + [0,0,0,0,0,0,0,0,0,0,0] ] */ params [ - "_unit", // Object the event handler is assigned to. - "_hitSelection", // Name of the selection where the unit was damaged. "" for over-all structural damage, "?" for unknown selections. - "_damage", // Resulting level of damage for the selection. - "_source", // The source unit (shooter) that caused the damage. - "_projectile", // Classname of the projectile that caused inflicted the damage. ("" for unknown, such as falling damage.) (String) - "_hitPartIndex", // Hit part index of the hit point, -1 otherwise. - "_instigator", // Person who pulled the trigger. (Object) - "_hitPoint" // hit point Cfg name (String) + "_unit", // Object the event handler is assigned to. + "_hitSelection", // Name of the selection where the unit was damaged. "" for over-all structural damage, "?" for unknown selections. + "_damage", // Resulting level of damage for the selection. + "_source", // The source unit (shooter) that caused the damage. + "_projectile", // Classname of the projectile that caused inflicted the damage. ("" for unknown, such as falling damage.) (String) + "_hitPartIndex", // Hit part index of the hit point, -1 otherwise. + "_instigator", // Person who pulled the trigger. (Object) + "_hitPoint" // hit point Cfg name (String) ]; // remote Units @@ -52,12 +52,12 @@ _damageType = [_unit, _hitSelection, _new_damage, _source, _projectile, _hitPart // handle the damage from a fire if (_damageType isEqualTo "smallfire") exitWith {[_unit, _hitPartIndex] call AIS_Damage_fnc_exitDamageHandler}; if (_damageType isEqualTo "bigfire") then { - _fire_damage = _unit getVariable ["ais_fireDamage", 0]; - // fire damage is everytime at index -1, part "" --> set the part to "body" and avoid real overall damage - _hitSelection = "body"; - _this set [1, _hitSelection]; - _new_damage = _fire_damage; // point where we can change the influence of fire - _unit setVariable ["ais_fireDamage", 0]; + _fire_damage = _unit getVariable ["ais_fireDamage", 0]; + // fire damage is everytime at index -1, part "" --> set the part to "body" and avoid real overall damage + _hitSelection = "body"; + _this set [1, _hitSelection]; + _new_damage = _fire_damage; // point where we can change the influence of fire + _unit setVariable ["ais_fireDamage", 0]; }; // exit if the damage is only minor or we have a negative hitpart index @@ -66,10 +66,10 @@ if (_new_damage < 0.05) exitWith {[_unit, _hitPartIndex] call AIS_Damage_fnc_exi // handle the damage of falling (adapted from ACE3) if (_damageType isEqualTo "falling") then { if !(_hitSelection in ["", "legs"]) then { - _new_damage = [ - _new_damage * 0.5, - _new_damage * abs(_unit getVariable ["ais_impactVelocity", _impactVelocity]) / 50 - ] select (_hitSelection isEqualTo "body"); + _new_damage = [ + _new_damage * 0.5, + _new_damage * abs(_unit getVariable ["ais_impactVelocity", _impactVelocity]) / 50 + ] select (_hitSelection isEqualTo "body"); _new_damage = if (_new_damage < 0.1) then {0}; //Filter minor falling damage to non-leg hitpoints } else { if (_hitSelection isEqualTo "") then { @@ -83,11 +83,11 @@ if (_damageType isEqualTo "falling") then { // handle the damage of a crash. Remove the overall damage and bring the damage to a random defined body part. if (_damageType isEqualTo "crash") then { if (_hitSelection isEqualTo "") then { - _hitSelection = selectRandom ["head", "hands", "legs"]; + _hitSelection = selectRandom ["head", "hands", "legs"]; _this set [1, _hitSelection]; }; - private _min = [1, 0.89] select (_hitSelection isEqualTo "head"); - _new_damage = if (_new_damage < 0.1) then {0} else {_new_damage min _min}; + private _min = [1, 0.89] select (_hitSelection isEqualTo "head"); + _new_damage = if (_new_damage < 0.1) then {0} else {_new_damage min _min}; }; @@ -100,37 +100,37 @@ _damage = (_hitPart select 2) + (_new_damage * AIS_DAMAGE_TOLLERANCE_FACTOR); // bullet/splitter impact post process effects if (AIS_IMPACT_EFFECTS) then { - if (_damageType in ["grenade", "bullet"]) then { - if (isPlayer _unit) then { - [_unit, _damage] call AIS_Effects_fnc_bulletImpact; - }; - }; + if (_damageType in ["grenade", "bullet"]) then { + if (isPlayer _unit) then { + [_unit, _damage] call AIS_Effects_fnc_bulletImpact; + }; + }; }; // if there is no revive guarantee, handle a realistic mode. Now we have random chance to die. The risk is increasing with higer damage values and some type of damages. (explos and grenades) if !(AIS_REVIVE_GUARANTY) then { - private _critical_hit = false; - // vehicle blow-up is everytime critical. Set to dead... - if (!(isNull objectParent _unit)) then { - if (damage (vehicle _unit) >= 1) exitWith { - [_unit,_source] call AIS_Damage_fnc_goToDead; - }; - }; - // critical hit trough explos? - if (_damageType in ["grenade", "baaam"] && {_hitSelection in ["pelvis", "head", "body"]}) then { - if (_damage > 1 && {(0.7 + ((0.05 * (_damage - 1)) * 10)) > random 2}) then { - _critical_hit = true; - }; - }; - // critical hit caused by a head shoot? - if (_damageType isEqualTo "bullet" && {_hitSelection isEqualTo "head"}) then { - if (_damage > 1.2 && {(0.6 + ((0.05 * (_damage - 1)) * 10)) > random 2}) then { - _critical_hit = true; - }; - }; - - // unit is instant death - no revive chance - if (_critical_hit) exitWith {[_unit,_source] call AIS_Damage_fnc_goToDead}; + private _critical_hit = false; + // vehicle blow-up is everytime critical. Set to dead... + if (!(isNull objectParent _unit)) then { + if (damage (vehicle _unit) >= 1) exitWith { + [_unit,_source] call AIS_Damage_fnc_goToDead; + }; + }; + // critical hit trough explos? + if (_damageType in ["grenade", "baaam"] && {_hitSelection in ["pelvis", "head", "body"]}) then { + if (_damage > 1 && {(0.7 + ((0.05 * (_damage - 1)) * 10)) > random 2}) then { + _critical_hit = true; + }; + }; + // critical hit caused by a head shoot? + if (_damageType isEqualTo "bullet" && {_hitSelection isEqualTo "head"}) then { + if (_damage > 1.2 && {(0.6 + ((0.05 * (_damage - 1)) * 10)) > random 2}) then { + _critical_hit = true; + }; + }; + + // unit is instant death - no revive chance + if (_critical_hit) exitWith {[_unit,_source] call AIS_Damage_fnc_goToDead}; }; // if a stabilized unit become new damage they won't be longer in the stbilized state @@ -138,9 +138,9 @@ _unit setVariable ["ais_stabilized", false, true]; // unit can die if they get to mutch new damage in unconscious mode if ((diag_tickTime > _unit getVariable ["ais_protector_delay", 0]) && {_unit getVariable ["ais_unconscious", false]}) exitWith { - if (_damage > 0.9) then {[_unit,_source] call AIS_Damage_fnc_goToDead}; - _damage = _damage min 0.89; - _damage + if (_damage > 0.9) then {[_unit,_source] call AIS_Damage_fnc_goToDead}; + _damage = _damage min 0.89; + _damage }; @@ -148,37 +148,37 @@ if ((diag_tickTime > _unit getVariable ["ais_protector_delay", 0]) && {_unit get private _set_unconscious = false; // if the unit is in a exploding vehicle... if (!(isNull objectParent _unit)) then { - if (damage (vehicle _unit) >= 1) then { - [{_this call AIS_System_fnc_checkUnload}, { - [[_this select 0, _this select 1, 0], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"] - }, [_unit, vehicle _unit]] call AIS_Core_fnc_waitUntilAndExecute; - _set_unconscious = true; - }; + if (damage (vehicle _unit) >= 1) then { + [{_this call AIS_System_fnc_checkUnload}, { + [[_this select 0, _this select 1, 0], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"] + }, [_unit, vehicle _unit]] call AIS_Core_fnc_waitUntilAndExecute; + _set_unconscious = true; + }; }; if ((_damage > 0.9) && {_hitSelection in ["", "head", "body"]}) then { - _set_unconscious = true; + _set_unconscious = true; }; // more attention to closer explosives if ((_damage > 1.5) && {_hitSelection in ["pelvis", "head", "body"]} && {_damageType in ["grenade", "baaam"]}) then { - _set_unconscious = true; + _set_unconscious = true; }; if (_set_unconscious && {!(_unit getVariable ["ais_unconscious", false])}) then { - [{[(_this select 0)] call AIS_System_fnc_setUnconscious}, [_unit]] call AIS_Core_fnc_onNextFrame; - // need this delay to prevent new damage for some seconds after the unit go unconscious. after the delay it is possible to kill the unit when they get to much new damage. - _unit setVariable ["ais_protector_delay", (diag_tickTime + 6)]; - - // kill message and score point - if (!isNull _source && {isPlayer _source}) then { - if (side _source != side _unit) then { - [_source, 1] remoteExec ["addScore", 2]; - } else { - [_source, -1] remoteExec ["addScore", 2]; - }; - if (isPlayer _unit) then { - _text = format ["%1 was seriously wounded by %2", name _unit, name _source]; - [_text] remoteExec ["systemChat", 0]; - }; - }; + [{[(_this select 0)] call AIS_System_fnc_setUnconscious}, [_unit]] call AIS_Core_fnc_onNextFrame; + // need this delay to prevent new damage for some seconds after the unit go unconscious. after the delay it is possible to kill the unit when they get to much new damage. + _unit setVariable ["ais_protector_delay", (diag_tickTime + 6)]; + + // kill message and score point + if (!isNull _source && {isPlayer _source}) then { + if (side _source != side _unit) then { + [_source, 1] remoteExec ["addScore", 2]; + } else { + [_source, -1] remoteExec ["addScore", 2]; + }; + if (isPlayer _unit) then { + _text = format ["%1 was seriously wounded by %2", name _unit, name _source]; + [_text] remoteExec ["systemChat", 0]; + }; + }; }; _damage = _damage min 0.89; diff --git a/source/AIS/Damage/fn_verifyDamageType.sqf b/source/AIS/Damage/fn_verifyDamageType.sqf index 8007ae3..ee1bae9 100644 --- a/source/AIS/Damage/fn_verifyDamageType.sqf +++ b/source/AIS/Damage/fn_verifyDamageType.sqf @@ -4,47 +4,47 @@ private _damageType = ""; // Vehicle crash? private _vehicle = vehicle _unit; if (!(isNull objectParent _unit) && {_projectile isEqualTo ""} && {_hitSelection isEqualTo ""} && {_source in [objNull, driver _vehicle, _vehicle]} && {!(_vehicle isKindOf "StaticWeapon")}) exitWith { - "crash" + "crash" }; // Fire? save the micro damages to an storage. Fire is everytime on selection == "". if ((_projectile isEqualTo "") && {_new_damage < 0.05}) exitWith { - if ((_new_damage + (_unit getVariable ["ais_fireDamage", 0])) > 0.15) then { - "bigfire" - } else { - if !(_unit getVariable ["ais_uncoscious", false]) then { // protect from fire if unconscious - _unit setVariable ["ais_fireDamage", (_unit getVariable ["ais_fireDamage", 0]) + _new_damage]; - }; - "smallfire" - }; + if ((_new_damage + (_unit getVariable ["ais_fireDamage", 0])) > 0.15) then { + "bigfire" + } else { + if !(_unit getVariable ["ais_uncoscious", false]) then { // protect from fire if unconscious + _unit setVariable ["ais_fireDamage", (_unit getVariable ["ais_fireDamage", 0]) + _new_damage]; + }; + "smallfire" + }; }; // Unit is falling? Detect a falling unit and reduce their damage depending on affected body part private _impactVelocity = (velocity _unit) select 2; if (_impactVelocity < -5 && {isNull objectParent _unit}) then { _unit setVariable ["ais_impactVelocity", _impactVelocity]; - _damageType = "falling"; + _damageType = "falling"; }; // Bullet? { - if (_projectile isKindOf _x) exitWith { - _damageType = "bullet"; - }; + if (_projectile isKindOf _x) exitWith { + _damageType = "bullet"; + }; } count ["BulletBase", "ShotgunBase"]; // Grenade? { - if (_projectile isKindOf _x) exitWith { - _damageType = "grenade"; - }; + if (_projectile isKindOf _x) exitWith { + _damageType = "grenade"; + }; } count ["Grenade", "GrenadeCore"]; // Explosion? { - if (_projectile isKindOf _x) exitWith { - _damageType = "baaam"; - }; + if (_projectile isKindOf _x) exitWith { + _damageType = "baaam"; + }; } count ["TimeBombCore", "BombCore", "MineCore", "FuelExplosion", "ShellBase", "RocketBase", "MissileBase", "LaserBombCore"]; diff --git a/source/AIS/Effects/BarDlg.hpp b/source/AIS/Effects/BarDlg.hpp index aa1d826..800f845 100644 --- a/source/AIS/Effects/BarDlg.hpp +++ b/source/AIS/Effects/BarDlg.hpp @@ -5,7 +5,7 @@ objects[] = {}; class controlsBackground { - class Background { + class Background { idc = -1; moving = 0; font = "PuristaMedium"; @@ -18,10 +18,10 @@ size = 1; colorBackground[] = {0, 0, 0, 0.7}; colorText[] = {0, 0, 0, 0}; - x = "0.298906 * safezoneW + safezoneX"; - y = "0.082 * safezoneH + safezoneY"; - w = "0.407344 * safezoneW"; - h = "0.011 * safezoneH"; + x = "0.298906 * safezoneW + safezoneX"; + y = "0.082 * safezoneH + safezoneY"; + w = "0.407344 * safezoneW"; + h = "0.011 * safezoneH"; }; class ProgressBar { idc = 1; @@ -36,27 +36,27 @@ size = 1; colorBackground[] = {0.6784, 0.7490, 0.5137, 0.7}; colorText[] = {1,1,1,1}; - x = "0.298906 * safezoneW + safezoneX"; - y = "0.082 * safezoneH + safezoneY"; - w = "0.001 * safezoneW"; - h = "0.011 * safezoneH"; + x = "0.298906 * safezoneW + safezoneX"; + y = "0.082 * safezoneH + safezoneY"; + w = "0.001 * safezoneW"; + h = "0.011 * safezoneH"; }; class TitleBar : ProgressBar { idc = 2; - style = 0x00; + style = 0x00; colorBackground[] = {0, 0, 0, 0}; - x = "0.298906 * safezoneW + safezoneX"; - y = "0.093 * safezoneH + safezoneY"; - w = "0.407344 * safezoneW"; - h = "0.022 * safezoneH"; - size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - sizeEx = "0.02 / (getResolution select 5)"; - font = "EtelkaMonospaceProBold"; - color = "#FFFFFF"; - align = "left"; - valign = "left"; - shadow = 1; - shadowColor = "#000000"; + x = "0.298906 * safezoneW + safezoneX"; + y = "0.093 * safezoneH + safezoneY"; + w = "0.407344 * safezoneW"; + h = "0.022 * safezoneH"; + size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + sizeEx = "0.02 / (getResolution select 5)"; + font = "EtelkaMonospaceProBold"; + color = "#FFFFFF"; + align = "left"; + valign = "left"; + shadow = 1; + shadowColor = "#000000"; }; }; }; \ No newline at end of file diff --git a/source/AIS/Effects/cfgFunctions.hpp b/source/AIS/Effects/cfgFunctions.hpp index a241577..fe65444 100644 --- a/source/AIS/Effects/cfgFunctions.hpp +++ b/source/AIS/Effects/cfgFunctions.hpp @@ -3,20 +3,20 @@ class AIS_Effects class AIS_Effects { file = "AIS\Effects"; - class preInit { preInit = 1; }; - class bleeding; - class BloodSplatterScreen; - class bulletImpact; - class deleteBloodSplatterScreen; - class draw3D; - class garbage; - class helpScream; - class injuredMarker; - class medEquip; - class removeInjuredMarker; - class scream; - class stabil; - class toggleRadio; - class posUpdateInjuredMarker; + class preInit { preInit = 1; }; + class bleeding; + class BloodSplatterScreen; + class bulletImpact; + class deleteBloodSplatterScreen; + class draw3D; + class garbage; + class helpScream; + class injuredMarker; + class medEquip; + class removeInjuredMarker; + class scream; + class stabil; + class toggleRadio; + class posUpdateInjuredMarker; }; }; \ No newline at end of file diff --git a/source/AIS/Effects/fn_bleeding.sqf b/source/AIS/Effects/fn_bleeding.sqf index ad5d963..0f4266c 100644 --- a/source/AIS/Effects/fn_bleeding.sqf +++ b/source/AIS/Effects/fn_bleeding.sqf @@ -4,36 +4,36 @@ * Visual bleeding effects and counter for revive time. Will self-run in a loop till unit get revived/stabilized or died. * Arguments: - 0: Unit (Object) - 1: Revive Time (Number) + 0: Unit (Object) + 1: Revive Time (Number) * Return value: - - + - */ params ["_unit", "_revive_time"]; // breack out if unit died or revived if (!alive _unit || {!(_unit getVariable ["ais_unconscious", false])}) exitWith { - _unit setBleedingRemaining 10; - _unit setFatigue 0.6; - resetCamShake; - titleText ["", "PLAIN DOWN", 1]; - - {_x ppEffectEnable false; true} count ais_ppEff; - ppEffectDestroy ais_ppEff; + _unit setBleedingRemaining 10; + _unit setFatigue 0.6; + resetCamShake; + titleText ["", "PLAIN DOWN", 1]; + + {_x ppEffectEnable false; true} count ais_ppEff; + ppEffectDestroy ais_ppEff; }; // breack out if unit get stabilized if (_unit getVariable ["ais_stabilized", false]) exitWith { - _unit setBleedingRemaining 10; - _unit setFatigue 0.7; - addCamShake [12, 999, 0.9]; - titleText ["You are stabilized.", "PLAIN DOWN", 1]; - - // loop - private _acc_time = diag_tickTime + 1.5; - [{diag_tickTime >= (_this select 1)}, {_this call AIS_Effects_fnc_stabil}, [_unit, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + _unit setBleedingRemaining 10; + _unit setFatigue 0.7; + addCamShake [12, 999, 0.9]; + titleText ["You are stabilized.", "PLAIN DOWN", 1]; + + // loop + private _acc_time = diag_tickTime + 1.5; + [{diag_tickTime >= (_this select 1)}, {_this call AIS_Effects_fnc_stabil}, [_unit, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; }; @@ -45,18 +45,18 @@ private _timeleft = (ais_start_unc_time + _revive_time) - diag_tickTime; // to late if (_timeleft <= 0) exitWith { - _unit setBleedingRemaining 5; - resetCamShake; - titleText ["", "PLAIN DOWN", 1]; - - {_x ppEffectEnable false; true} count ais_ppEff; - ppEffectDestroy ais_ppEff; - - [_unit, objNull] call AIS_Damage_fnc_goToDead; + _unit setBleedingRemaining 5; + resetCamShake; + titleText ["", "PLAIN DOWN", 1]; + + {_x ppEffectEnable false; true} count ais_ppEff; + ppEffectDestroy ais_ppEff; + + [_unit, objNull] call AIS_Damage_fnc_goToDead; }; if (AIS_SHOW_COUNTDOWN) then { - [titleText ["It's to late for you.","PLAIN DOWN",1], titleText [format ["Bleedout in %1 Seconds", floor _timeleft],"PLAIN DOWN",0.2]] select (_timeleft > 3); + [titleText ["It's to late for you.","PLAIN DOWN",1], titleText [format ["Bleedout in %1 Seconds", floor _timeleft],"PLAIN DOWN",0.2]] select (_timeleft > 3); }; _unit setFatigue 1; @@ -69,12 +69,12 @@ ais_ppEff = ppEffectCreate [["radialBlur", 17091], ["colorCorrections", 1580]]; // set visual pp effects _brightness = (_timeleft / _revive_time) + (random 0.1); (ais_ppEff select 1) ppEffectAdjust [ - _brightness, // brightness, image brightness (0 - black, 1 - unchanged, 2 - white ) - 1, // contrast, image contrast (1 - normal contrast) - 0, // offset, image contrast offset (0 - unchanged ) - random 0.9 max 0.3, 0, 0.05, random 0.75, // color for blending ( R,G,B - color, A - blend factor (0 - original color, 1 - blend color )) - 0.2, 0, 0.5, 0.9, // color for colorization ( R,G,B - color, A - saturation (0 - original color, 1 - B&W multiplied by colorize color)) - 0.199, 0.587, 0.114, 1 // RGB weights for desaturation (0.299, 0.587, 0.114, NA) + _brightness, // brightness, image brightness (0 - black, 1 - unchanged, 2 - white ) + 1, // contrast, image contrast (1 - normal contrast) + 0, // offset, image contrast offset (0 - unchanged ) + random 0.9 max 0.3, 0, 0.05, random 0.75, // color for blending ( R,G,B - color, A - blend factor (0 - original color, 1 - blend color )) + 0.2, 0, 0.5, 0.9, // color for colorization ( R,G,B - color, A - saturation (0 - original color, 1 - B&W multiplied by colorize color)) + 0.199, 0.587, 0.114, 1 // RGB weights for desaturation (0.299, 0.587, 0.114, NA) ]; (ais_ppEff select 1) ppEffectCommit 0.5; diff --git a/source/AIS/Effects/fn_bloodSplatterScreen.sqf b/source/AIS/Effects/fn_bloodSplatterScreen.sqf index 2898393..190e5c2 100644 --- a/source/AIS/Effects/fn_bloodSplatterScreen.sqf +++ b/source/AIS/Effects/fn_bloodSplatterScreen.sqf @@ -5,10 +5,10 @@ * Posst process blood effects. (original from BIS_fnc_bloodEffect) * Arguments: - - + - * Return value: - - + - */ if (!canSuspend) exitWith {[] spawn AIS_Effects_fnc_bloodSplatterScreen;}; @@ -24,11 +24,11 @@ _texLower ctrlsetfade 1; _texLower ctrlcommit 0; _texMiddle = _display displayctrl 1212; -_texMiddle ctrlsetfade 1; +_texMiddle ctrlsetfade 1; _texMiddle ctrlcommit 0; _texUpper = _display displayctrl 1213; -_texUpper ctrlsetfade 1; +_texUpper ctrlsetfade 1; _texUpper ctrlcommit 0; _x = ((0 * safezoneW) + safezoneX) + ((safezoneW - (2.125 * safezoneW * 3/4)) / 2); @@ -55,9 +55,9 @@ _texUpper ctrlcommit 0.2; // remove effect if player get revived/stabilized or died or character changed (teamswitch or zeus f.e.) [ - {!alive player || {!(player getVariable ["ais_unconscious", false])} || {(player getVariable ["ais_stabilized", false])}}, - {_this spawn AIS_Effects_fnc_deleteBloodSplatterScreen}, - [_texLower,_texMiddle,_texUpper] + {!alive player || {!(player getVariable ["ais_unconscious", false])} || {(player getVariable ["ais_stabilized", false])}}, + {_this spawn AIS_Effects_fnc_deleteBloodSplatterScreen}, + [_texLower,_texMiddle,_texUpper] ] call AIS_Core_fnc_waitUntilAndExecute; diff --git a/source/AIS/Effects/fn_bulletImpact.sqf b/source/AIS/Effects/fn_bulletImpact.sqf index a68e4a8..673efd5 100644 --- a/source/AIS/Effects/fn_bulletImpact.sqf +++ b/source/AIS/Effects/fn_bulletImpact.sqf @@ -4,14 +4,14 @@ * Impact effect on bullet hit. * Arguments: - 0: Unit (Object) - 1: Strength (Number) - + 0: Unit (Object) + 1: Strength (Number) + * Example: - [player, 0.5] call AIS_Effects_fnc_bulletImpact; + [player, 0.5] call AIS_Effects_fnc_bulletImpact; * Return value: - - + - */ params ["_unit", "_strength"]; @@ -21,29 +21,29 @@ if (_unit getVariable "ais_unconscious") exitWith {}; if (isNull objectParent _unit && {cameraView in ["INTERNAL", "GUNNER"]}) then { - - _strength = if (_strength < 0.2) then {0.2 + (random 0.3)} else {_strength}; - _strength = if (_strength > 5) then {4 + (random 1)} else {_strength}; - private _power = _strength + 4; - enableCamShake true; - - addCamShake [_power, 0.4, 30]; - private _color = (1 - _strength) max 0.15; - - // set color corrections - "colorCorrections" ppEffectEnable true; - "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, _color], [1, 1, 1, 0.0]]; - "colorCorrections" ppEffectCommit 0; - "dynamicBlur" ppEffectEnable true; - "dynamicBlur" ppEffectAdjust [1.8]; - "dynamicBlur" ppEffectCommit 0; - - // set effect duration, depending on hit strength - "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, 1], [1, 1, 1, 0.0]]; - "colorCorrections" ppEffectCommit _strength; - - "dynamicBlur" ppEffectAdjust [0]; - "dynamicBlur" ppEffectCommit _strength; + + _strength = if (_strength < 0.2) then {0.2 + (random 0.3)} else {_strength}; + _strength = if (_strength > 5) then {4 + (random 1)} else {_strength}; + private _power = _strength + 4; + enableCamShake true; + + addCamShake [_power, 0.4, 30]; + private _color = (1 - _strength) max 0.15; + + // set color corrections + "colorCorrections" ppEffectEnable true; + "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, _color], [1, 1, 1, 0.0]]; + "colorCorrections" ppEffectCommit 0; + "dynamicBlur" ppEffectEnable true; + "dynamicBlur" ppEffectAdjust [1.8]; + "dynamicBlur" ppEffectCommit 0; + + // set effect duration, depending on hit strength + "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, 1], [1, 1, 1, 0.0]]; + "colorCorrections" ppEffectCommit _strength; + + "dynamicBlur" ppEffectAdjust [0]; + "dynamicBlur" ppEffectCommit _strength; }; diff --git a/source/AIS/Effects/fn_deleteBloodSplatterScreen.sqf b/source/AIS/Effects/fn_deleteBloodSplatterScreen.sqf index fd87489..28e55bc 100644 --- a/source/AIS/Effects/fn_deleteBloodSplatterScreen.sqf +++ b/source/AIS/Effects/fn_deleteBloodSplatterScreen.sqf @@ -4,10 +4,10 @@ * Remove post process blood effects. * Arguments: - - + - * Return value: - - + - */ disableSerialization; params ["_texLower", "_texMiddle", "_texUpper"]; diff --git a/source/AIS/Effects/fn_draw3D.sqf b/source/AIS/Effects/fn_draw3D.sqf index a2430bb..5ddd695 100644 --- a/source/AIS/Effects/fn_draw3D.sqf +++ b/source/AIS/Effects/fn_draw3D.sqf @@ -1,10 +1,10 @@ -//if (!isNull (findDisplay 12)) exitWith {}; // Map +//if (!isNull (findDisplay 12)) exitWith {}; // Map if (isNull (findDisplay 46)) exitWith {}; -if (!isNull (findDisplay 49)) exitWith {}; // Esc Menu +if (!isNull (findDisplay 49)) exitWith {}; // Esc Menu // remove the meh if client left the mission if (getClientStateNumber in [11,12]) exitWith { - removeMissionEventHandler ["draw3D", AIS_Core_3DEHId]; + removeMissionEventHandler ["draw3D", AIS_Core_3DEHId]; }; private _targets = []; @@ -22,32 +22,32 @@ if (!surfaceIsWater _playerPos) then { { private _target = effectiveCommander _x; - if ( - _target getVariable ["ais_unconscious", false] && - {_target != player} && - //{isPlayer _target} && - {!(_x in allUnitsUAV)} && - {alive player} && - {AIS_Core_realSide isEqualTo (getNumber (configfile >> "CfgVehicles" >> (typeOf _target) >> "side"))} - ) then { + if ( + _target getVariable ["ais_unconscious", false] && + {_target != player} && + //{isPlayer _target} && + {!(_x in allUnitsUAV)} && + {alive player} && + {AIS_Core_realSide isEqualTo (getNumber (configfile >> "CfgVehicles" >> (typeOf _target) >> "side"))} + ) then { _targetPos = getPosASLVisual _target; _distance = _targetPos distance2D _playerPos; - _headPosition = _target modelToWorldVisual (_target selectionPosition "spine"); - _alpha = 0.8; - //_color = [0.94,1,0,_alpha];//Yellow - //_color = [0.65,0.15,0,_alpha];//Dark Red - _color = [0.87,0.03,0,_alpha];//shiny Red + _headPosition = _target modelToWorldVisual (_target selectionPosition "spine"); + _alpha = 0.8; + //_color = [0.94,1,0,_alpha];//Yellow + //_color = [0.65,0.15,0,_alpha];//Dark Red + _color = [0.87,0.03,0,_alpha];//shiny Red _targetPos set [2, ((_target modelToWorld [0,0,0]) select 2) + _height + _distance * 0.026]; _text = format ["%1 (%2m)", name _target, ceil (player distance _target)]; - - _icon = if (_target getVariable ["ais_stabilized", false]) then { - "\a3\ui_f\data\IGUI\Cfg\Actions\heal_ca.paa" - } else { - "\a3\ui_f\data\IGUI\Cfg\Actions\bandage_ca.paa" - }; - - drawIcon3D [_icon, _color, _headPosition vectorAdd [0, 0, 0.4], 0.8, 0.8, 0, _text, 1, 0.04, "PuristaMedium", "center", true]; + + _icon = if (_target getVariable ["ais_stabilized", false]) then { + "\a3\ui_f\data\IGUI\Cfg\Actions\heal_ca.paa" + } else { + "\a3\ui_f\data\IGUI\Cfg\Actions\bandage_ca.paa" + }; + + drawIcon3D [_icon, _color, _headPosition vectorAdd [0, 0, 0.4], 0.8, 0.8, 0, _text, 1, 0.04, "PuristaMedium", "center", true]; }; - - true + + true } count _targets; \ No newline at end of file diff --git a/source/AIS/Effects/fn_garbage.sqf b/source/AIS/Effects/fn_garbage.sqf index b5c9305..f4447bc 100644 --- a/source/AIS/Effects/fn_garbage.sqf +++ b/source/AIS/Effects/fn_garbage.sqf @@ -4,32 +4,32 @@ * Remove ambient medical equimpment from the ground. If euqipment is marked as "do not delete", the loop will set it to delete list for the next time the function is called. * Arguments: - - - + - + * Example: - [player] call AIS_Effects_fnc_garbage; + [player] call AIS_Effects_fnc_garbage; * Return value: - - + - */ if (!local player) exitWith {}; private _delete = false; if (count ais_medequip_array > 0) then { - { - if (count _x > 1) then { - if ((_x select 0) > 0) then { - deleteVehicle (_x select 1); - ais_medequip_array set [_forEachIndex, objNull]; - } else { - _x set [0,1]; - }; - } else { - ais_medequip_array set [_forEachIndex, objNull]; - _delete = true; - }; - } forEach ais_medequip_array; + { + if (count _x > 1) then { + if ((_x select 0) > 0) then { + deleteVehicle (_x select 1); + ais_medequip_array set [_forEachIndex, objNull]; + } else { + _x set [0,1]; + }; + } else { + ais_medequip_array set [_forEachIndex, objNull]; + _delete = true; + }; + } forEach ais_medequip_array; }; ais_medequip_array = ais_medequip_array - [objNull]; diff --git a/source/AIS/Effects/fn_helpScream.sqf b/source/AIS/Effects/fn_helpScream.sqf index 9703aff..80df17b 100644 --- a/source/AIS/Effects/fn_helpScream.sqf +++ b/source/AIS/Effects/fn_helpScream.sqf @@ -4,25 +4,25 @@ * Play a random screaming sound when a unit go unconcsious * Arguments: - 0: Unit (Object) - 1: audible distance (optional) + 0: Unit (Object) + 1: audible distance (optional) * Return value: - - - + - + * Exapmle: - [player, 30] call AIS_Effects_fnc_helpScream; + [player, 30] call AIS_Effects_fnc_helpScream; */ params [ - ["_injured", objNull], - ["_dist", 50, [0]] + ["_injured", objNull], + ["_dist", 50, [0]] ]; // playSound is global _helpsound = format ["a3\sounds_f\characters\human-sfx\%1\%2", ais_personal_soundset select 0, selectRandom (ais_personal_soundset select 1)]; -playSound3D [_helpsound, _injured, false, getPosASL _injured, 1.5, 1, _dist]; +playSound3D [_helpsound, _injured, false, getPosASL _injured, 1.5, 1, _dist]; true \ No newline at end of file diff --git a/source/AIS/Effects/fn_injuredMarker.sqf b/source/AIS/Effects/fn_injuredMarker.sqf index 8b8c8ef..5cde957 100644 --- a/source/AIS/Effects/fn_injuredMarker.sqf +++ b/source/AIS/Effects/fn_injuredMarker.sqf @@ -4,13 +4,13 @@ * Create a local marker for unconcious units * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - the marker itself - + the marker itself + * Exapmle: - player call AIS_Effects_fnc_injuredMarker + player call AIS_Effects_fnc_injuredMarker */ private _unit = _this; @@ -20,7 +20,7 @@ _str = name _unit; _marker = format ["%1_ais_marker", _str]; if (!isNil {_unit getVariable ["ais_unitMarker", Nil]}) then { - _unit call AIS_Effects_fnc_removeInjuredMarker; + _unit call AIS_Effects_fnc_removeInjuredMarker; }; _mark = [_marker, position _unit, "ICON", "Color1_FD_F", [0.7, 0.7], format ["%1 down", _str], 0, "loc_Hospital"] call AIS_Core_fnc_createLocalMarker; diff --git a/source/AIS/Effects/fn_medEquip.sqf b/source/AIS/Effects/fn_medEquip.sqf index 7d66b5c..ad76b84 100644 --- a/source/AIS/Effects/fn_medEquip.sqf +++ b/source/AIS/Effects/fn_medEquip.sqf @@ -4,59 +4,59 @@ * Spawn randomized some ambient medical equipment around the injured. * Arguments: - 0: Unit Helper (Object) - 1: Unit wounded (Object) - + 0: Unit Helper (Object) + 1: Unit wounded (Object) + * Example: - [player] call AIS_Effects_fnc_medEquip; + [player] call AIS_Effects_fnc_medEquip; * Return value: - - + - */ params [ - "_healer", - "_injured" + "_healer", + "_injured" ]; if (!local _healer) exitWith {}; // spawn defi and a bloodbag if (_healer call AIS_System_fnc_isMedic) then { - _defi_pos = _healer modelToWorld [-0.5,0.2,0]; - _defi = "Land_Defibrillator_F" createVehicle _defi_pos; - [_defi, [_defi_pos select 0, _defi_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; - _defi setDir (getDir _healer - 180); - ais_medequip_array pushBack [1,_defi]; - - if (damage _injured >= 0.5 && {(random 2) >= 1}) then { - _bb_pos = _healer modelToWorld [0.4,(0.2 - (random 0.5)),0]; - _bb = "Land_BloodBag_F" createVehicle _bb_pos; - [_bb, [_bb_pos select 0, _bb_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; - _bb setDir (random 359); - ais_medequip_array pushBack [0,_bb]; - }; + _defi_pos = _healer modelToWorld [-0.5,0.2,0]; + _defi = "Land_Defibrillator_F" createVehicle _defi_pos; + [_defi, [_defi_pos select 0, _defi_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; + _defi setDir (getDir _healer - 180); + ais_medequip_array pushBack [1,_defi]; + + if (damage _injured >= 0.5 && {(random 2) >= 1}) then { + _bb_pos = _healer modelToWorld [0.4,(0.2 - (random 0.5)),0]; + _bb = "Land_BloodBag_F" createVehicle _bb_pos; + [_bb, [_bb_pos select 0, _bb_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; + _bb setDir (random 359); + ais_medequip_array pushBack [0,_bb]; + }; }; // spawn bandages for "_i" from 1 to (1 + (round random 3)) do { - _band_pos = _healer modelToWorld [(random 1.3),(0.8 + (random 0.6)),0]; - _band = "Land_Bandage_F" createVehicle _band_pos; - [_band, [_band_pos select 0, _band_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; - _band setDir (random 359); - if (_i > 1) then { - ais_medequip_array pushBack [0,_band]; - } else { - ais_medequip_array pushBack [1,_band]; - }; + _band_pos = _healer modelToWorld [(random 1.3),(0.8 + (random 0.6)),0]; + _band = "Land_Bandage_F" createVehicle _band_pos; + [_band, [_band_pos select 0, _band_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; + _band setDir (random 359); + if (_i > 1) then { + ais_medequip_array pushBack [0,_band]; + } else { + ais_medequip_array pushBack [1,_band]; + }; }; // spawn antibioticum if (random 2 >= 1) then { - _ab_pos = _healer modelToWorld [-0.8,(0.6 - (random 0.4)),0]; - _ab = "Land_Antibiotic_F" createVehicle _ab_pos; - [_ab, [_ab_pos select 0, _ab_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; - _ab setDir (random 359); - ais_medequip_array pushBack [0,_ab]; + _ab_pos = _healer modelToWorld [-0.8,(0.6 - (random 0.4)),0]; + _ab = "Land_Antibiotic_F" createVehicle _ab_pos; + [_ab, [_ab_pos select 0, _ab_pos select 1, 0]] call AIS_Core_fnc_setPosAGLS; + _ab setDir (random 359); + ais_medequip_array pushBack [0,_ab]; }; true \ No newline at end of file diff --git a/source/AIS/Effects/fn_posUpdateInjuredMarker.sqf b/source/AIS/Effects/fn_posUpdateInjuredMarker.sqf index 79a0c3e..7c98032 100644 --- a/source/AIS/Effects/fn_posUpdateInjuredMarker.sqf +++ b/source/AIS/Effects/fn_posUpdateInjuredMarker.sqf @@ -4,30 +4,30 @@ * Update the marker position every 5 seconds until the marker is deleted. * Arguments: - 0: Unit (Object) - 1: Marker (String) + 0: Unit (Object) + 1: Marker (String) * Return value: - - - + - + * Exapmle: - - + - */ params ["_unit"]; _marker = _unit getVariable ["ais_unitMarker", Nil]; if (!isNil "_marker") then { - if (_unit getVariable ["ais_unconscious", false]) then { - _marker setMarkerPosLocal (getPos _unit); - - _acc_time = diag_tickTime + 5; - [{diag_tickTime > (_this select 1)}, {[_this select 0] call AIS_Effects_fnc_posUpdateInjuredMarker}, [_unit, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; - }; - - if (!alive _unit || {isNull _unit}) then { - _unit call AIS_Effects_fnc_removeInjuredMarker; - }; + if (_unit getVariable ["ais_unconscious", false]) then { + _marker setMarkerPosLocal (getPos _unit); + + _acc_time = diag_tickTime + 5; + [{diag_tickTime > (_this select 1)}, {[_this select 0] call AIS_Effects_fnc_posUpdateInjuredMarker}, [_unit, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + }; + + if (!alive _unit || {isNull _unit}) then { + _unit call AIS_Effects_fnc_removeInjuredMarker; + }; }; diff --git a/source/AIS/Effects/fn_preinit.sqf b/source/AIS/Effects/fn_preinit.sqf index 5645b20..08508c8 100644 --- a/source/AIS/Effects/fn_preinit.sqf +++ b/source/AIS/Effects/fn_preinit.sqf @@ -1,36 +1,36 @@ // from domination ais_help_screaming = [ - [ - "Person0", - [ - "P0_moan_13_words.wss", "P0_moan_14_words.wss", "P0_moan_15_words.wss", "P0_moan_16_words.wss", - "P0_moan_17_words.wss", "P0_moan_18_words.wss", "P0_moan_19_words.wss", "P0_moan_20_words.wss" - ] - ], - [ - "Person1", - [ - "P1_moan_19_words.wss", "P1_moan_20_words.wss", "P1_moan_21_words.wss", "P1_moan_22_words.wss", - "P1_moan_23_words.wss", "P1_moan_24_words.wss", "P1_moan_25_words.wss", "P1_moan_26_words.wss", - "P1_moan_27_words.wss", "P1_moan_28_words.wss", "P1_moan_29_words.wss", "P1_moan_30_words.wss", - "P1_moan_31_words.wss", "P1_moan_32_words.wss", "P1_moan_33_words.wss" - ] - ], - [ - "Person2", - [ - "P2_moan_14_words.wss", "P2_moan_15_words.wss", "P2_moan_16_words.wss", "P2_moan_17_words.wss", - "P2_moan_18_words.wss", "P2_moan_19_words.wss", "P2_moan_20_words.wss", "P2_moan_21_words.wss" - ] - ], - [ - "Person3", - [ - "P3_moan_10_words.wss", "P3_moan_11_words.wss", "P3_moan_12_words.wss", "P3_moan_13_words.wss", - "P3_moan_14_words.wss", "P3_moan_15_words.wss", "P3_moan_16_words.wss", "P3_moan_17_words.wss", - "P3_moan_18_words.wss", "P3_moan_19_words.wss", "P3_moan_20_words.wss" - ] - ] + [ + "Person0", + [ + "P0_moan_13_words.wss", "P0_moan_14_words.wss", "P0_moan_15_words.wss", "P0_moan_16_words.wss", + "P0_moan_17_words.wss", "P0_moan_18_words.wss", "P0_moan_19_words.wss", "P0_moan_20_words.wss" + ] + ], + [ + "Person1", + [ + "P1_moan_19_words.wss", "P1_moan_20_words.wss", "P1_moan_21_words.wss", "P1_moan_22_words.wss", + "P1_moan_23_words.wss", "P1_moan_24_words.wss", "P1_moan_25_words.wss", "P1_moan_26_words.wss", + "P1_moan_27_words.wss", "P1_moan_28_words.wss", "P1_moan_29_words.wss", "P1_moan_30_words.wss", + "P1_moan_31_words.wss", "P1_moan_32_words.wss", "P1_moan_33_words.wss" + ] + ], + [ + "Person2", + [ + "P2_moan_14_words.wss", "P2_moan_15_words.wss", "P2_moan_16_words.wss", "P2_moan_17_words.wss", + "P2_moan_18_words.wss", "P2_moan_19_words.wss", "P2_moan_20_words.wss", "P2_moan_21_words.wss" + ] + ], + [ + "Person3", + [ + "P3_moan_10_words.wss", "P3_moan_11_words.wss", "P3_moan_12_words.wss", "P3_moan_13_words.wss", + "P3_moan_14_words.wss", "P3_moan_15_words.wss", "P3_moan_16_words.wss", "P3_moan_17_words.wss", + "P3_moan_18_words.wss", "P3_moan_19_words.wss", "P3_moan_20_words.wss" + ] + ] ]; // every player set only onetime his personal voice set. diff --git a/source/AIS/Effects/fn_removeinjuredMarker.sqf b/source/AIS/Effects/fn_removeinjuredMarker.sqf index 4f4b187..e29a116 100644 --- a/source/AIS/Effects/fn_removeinjuredMarker.sqf +++ b/source/AIS/Effects/fn_removeinjuredMarker.sqf @@ -4,21 +4,21 @@ * Delete a local unconcsious marker * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - - - + - + * Exapmle: - player call AIS_Effects_fnc_removeInjuredMarker; + player call AIS_Effects_fnc_removeInjuredMarker; */ private _unit = _this; private _marker = _unit getVariable ["ais_unitMarker", Nil]; if (!isNil "_marker") then { - deleteMarkerLocal _marker; - _unit setVariable ["ais_unitMarker", Nil]; + deleteMarkerLocal _marker; + _unit setVariable ["ais_unitMarker", Nil]; }; diff --git a/source/AIS/Effects/fn_scream.sqf b/source/AIS/Effects/fn_scream.sqf index f4135d9..6f89aaa 100644 --- a/source/AIS/Effects/fn_scream.sqf +++ b/source/AIS/Effects/fn_scream.sqf @@ -4,25 +4,25 @@ * Play a random screaming sound when a unit go unconcsious * Arguments: - 0: Unit (Object) - 1: audible distance (optional) + 0: Unit (Object) + 1: audible distance (optional) * Return value: - - - + - + * Exapmle: - [player, 30] call AIS_Effects_fnc_Scream; -*/ + [player, 30] call AIS_Effects_fnc_Scream; +*/ params [ - ["_injured", objNull], - ["_dist", 50, [0]] + ["_injured", objNull], + ["_dist", 50, [0]] ]; // playSound is global if (random 3 > 1.7) then { - _deathsound = format ["A3\sounds_f\characters\human-sfx\P0%1\Hit_Max_%2.wss", selectRandom [4,5,6,7,8,9], selectRandom [1,2,3,4,5]]; - playSound3D [_deathsound, _injured, false, getPosASL _injured, 1.5, 1, _dist]; + _deathsound = format ["A3\sounds_f\characters\human-sfx\P0%1\Hit_Max_%2.wss", selectRandom [4,5,6,7,8,9], selectRandom [1,2,3,4,5]]; + playSound3D [_deathsound, _injured, false, getPosASL _injured, 1.5, 1, _dist]; }; diff --git a/source/AIS/Effects/fn_stabil.sqf b/source/AIS/Effects/fn_stabil.sqf index 64fd61e..68cb984 100644 --- a/source/AIS/Effects/fn_stabil.sqf +++ b/source/AIS/Effects/fn_stabil.sqf @@ -4,42 +4,42 @@ * Visual bleeding effects and counter for revive time. Will self-run in a loop till unit get revived/stabilized or died. * Arguments: - 0: Unit (Object) - 1: Revive Time (Number) + 0: Unit (Object) + 1: Revive Time (Number) * Return value: - - + - */ params ["_unit"]; // breack out if unit died or revived if (!alive _unit || {!(_unit getVariable ["ais_unconscious", false])}) exitWith { - _unit setBleedingRemaining 10; - _unit setFatigue 0.6; - resetCamShake; - titleText ["", "PLAIN DOWN", 1]; - - {_x ppEffectEnable false; true} count ais_ppEff; - ppEffectDestroy ais_ppEff; + _unit setBleedingRemaining 10; + _unit setFatigue 0.6; + resetCamShake; + titleText ["", "PLAIN DOWN", 1]; + + {_x ppEffectEnable false; true} count ais_ppEff; + ppEffectDestroy ais_ppEff; }; // breack out if unit get new damage (no longer stabilized) if (!(_unit getVariable ["ais_stabilized", false])) exitWith { - _unit setBleedingRemaining 10; - _unit setFatigue 1; - addCamShake [15, 999, 0.7]; - - // Function use disableSerialisation and can corrupt some other functions in the same frame. So it need a delay till next frame. - [{call AIS_Effects_fnc_bloodSplatterScreen}] call AIS_Core_fnc_onNextFrame; - - // get the revive time - _revive_time = [_unit] call AIS_System_fnc_calculateLifeTime; - _unit setBleedingRemaining _revive_time; - - // loop - private _acc_time = diag_tickTime + 1; - [{diag_tickTime >= (_this select 2)}, {_this call AIS_Effects_fnc_bleeding}, [_unit, _revive_time, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + _unit setBleedingRemaining 10; + _unit setFatigue 1; + addCamShake [15, 999, 0.7]; + + // Function use disableSerialisation and can corrupt some other functions in the same frame. So it need a delay till next frame. + [{call AIS_Effects_fnc_bloodSplatterScreen}] call AIS_Core_fnc_onNextFrame; + + // get the revive time + _revive_time = [_unit] call AIS_System_fnc_calculateLifeTime; + _unit setBleedingRemaining _revive_time; + + // loop + private _acc_time = diag_tickTime + 1; + [{diag_tickTime >= (_this select 2)}, {_this call AIS_Effects_fnc_bleeding}, [_unit, _revive_time, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; }; @@ -54,12 +54,12 @@ ais_ppEff = ppEffectCreate [["radialBlur", 17091], ["colorCorrections", 1580]]; // set visual pp effects (ais_ppEff select 1) ppEffectAdjust [ - 0.9 + (random 0.2), // brightness, image brightness (0 - black, 1 - unchanged, 2 - white ) - 1, // contrast, image contrast (1 - normal contrast) - 0, // offset, image contrast offset (0 - unchanged ) - random 0.7 max 0.2, 0, 0.05, random 0.6, // color for blending ( R,G,B - color, A - blend factor (0 - original color, 1 - blend color )) - 0.2, 0, 0.5, 0.9, // color for colorization ( R,G,B - color, A - saturation (0 - original color, 1 - B&W multiplied by colorize color)) - 0.199, 0.587, 0.114, 1 // RGB weights for desaturation (0.299, 0.587, 0.114, NA) + 0.9 + (random 0.2), // brightness, image brightness (0 - black, 1 - unchanged, 2 - white ) + 1, // contrast, image contrast (1 - normal contrast) + 0, // offset, image contrast offset (0 - unchanged ) + random 0.7 max 0.2, 0, 0.05, random 0.6, // color for blending ( R,G,B - color, A - blend factor (0 - original color, 1 - blend color )) + 0.2, 0, 0.5, 0.9, // color for colorization ( R,G,B - color, A - saturation (0 - original color, 1 - B&W multiplied by colorize color)) + 0.199, 0.587, 0.114, 1 // RGB weights for desaturation (0.299, 0.587, 0.114, NA) ]; (ais_ppEff select 1) ppEffectCommit 0.5; diff --git a/source/AIS/Effects/fn_toggleRadio.sqf b/source/AIS/Effects/fn_toggleRadio.sqf index baddce9..0c0304a 100644 --- a/source/AIS/Effects/fn_toggleRadio.sqf +++ b/source/AIS/Effects/fn_toggleRadio.sqf @@ -4,31 +4,31 @@ * Enable/disable the TFAR and/or ACRE radios when player is unconscious. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Bool + Bool */ _canUse = param [0, true, [true]]; if (_canUse) then { - player setVariable ["tf_globalVolume", 1]; - player setVariable ["tf_voiceVolume", 1]; - player setVariable ["tf_unable_to_use_radio", false]; - - player setVariable ["acre_sys_core_isDisabled", false, true]; - player setVariable ["acre_sys_core_globalVolume", 1]; - + player setVariable ["tf_globalVolume", 1]; + player setVariable ["tf_voiceVolume", 1]; + player setVariable ["tf_unable_to_use_radio", false]; + + player setVariable ["acre_sys_core_isDisabled", false, true]; + player setVariable ["acre_sys_core_globalVolume", 1]; + } else { - player setVariable ["tf_globalVolume", 0.4]; - player setVariable ["tf_voiceVolume", 0]; - player setVariable ["tf_unable_to_use_radio", true]; - - player setVariable ["acre_sys_core_isDisabled", true, true]; - player setVariable ["acre_sys_core_globalVolume", 0]; + player setVariable ["tf_globalVolume", 0.4]; + player setVariable ["tf_voiceVolume", 0]; + player setVariable ["tf_unable_to_use_radio", true]; + + player setVariable ["acre_sys_core_isDisabled", true, true]; + player setVariable ["acre_sys_core_globalVolume", 0]; }; true \ No newline at end of file diff --git a/source/AIS/System/cfgFunctions.hpp b/source/AIS/System/cfgFunctions.hpp index dccd942..2b1c9fb 100644 --- a/source/AIS/System/cfgFunctions.hpp +++ b/source/AIS/System/cfgFunctions.hpp @@ -4,53 +4,53 @@ class AIS_System { file = "AIS\System"; class postInit { postInit = 1; }; - class addMedEvacObj; - class AIselfCheck; - class allowCarry; - class allowDrag; - class allowPullIn; - class allowPullOut; - class allowRevive; - class allowStabilize; - class bloodloss; - class bloodlossAI; - class calculateLifeTime; - class calculateReviveTime; - class calculateStabilizeTime; - class callHelp; - class carry; - class checkLauncher; - class checkUnload; - class diary; - class disableRespawnButton; - class drag; - class findAIHelper; - class getCargoIndex; - class getOutMan; - class handleHeal; - class isMedic; - class keyHandler; - class killed; - class loadAIS; - class loadAISlocalToPlayer; - class loadInjured; - class medEvacArea; - class moveAIHelper; - class moveCargoRemote; - class overrideHealAction; - class release; - class removeFaks; - class respawn; - class restoreFaks; - class reveal; - class Revive; - class ReviveAI; - class secondsToString; - class setUnconscious; - class stabilize; - class unconcsiousRemote; - class unconsciousAI; - class unconsciousPlayer; - class unloadInjured; + class addMedEvacObj; + class AIselfCheck; + class allowCarry; + class allowDrag; + class allowPullIn; + class allowPullOut; + class allowRevive; + class allowStabilize; + class bloodloss; + class bloodlossAI; + class calculateLifeTime; + class calculateReviveTime; + class calculateStabilizeTime; + class callHelp; + class carry; + class checkLauncher; + class checkUnload; + class diary; + class disableRespawnButton; + class drag; + class findAIHelper; + class getCargoIndex; + class getOutMan; + class handleHeal; + class isMedic; + class keyHandler; + class killed; + class loadAIS; + class loadAISlocalToPlayer; + class loadInjured; + class medEvacArea; + class moveAIHelper; + class moveCargoRemote; + class overrideHealAction; + class release; + class removeFaks; + class respawn; + class restoreFaks; + class reveal; + class Revive; + class ReviveAI; + class secondsToString; + class setUnconscious; + class stabilize; + class unconcsiousRemote; + class unconsciousAI; + class unconsciousPlayer; + class unloadInjured; }; }; \ No newline at end of file diff --git a/source/AIS/System/fn_AIselfCheck.sqf b/source/AIS/System/fn_AIselfCheck.sqf index 3663d9b..2e2adad 100644 --- a/source/AIS/System/fn_AIselfCheck.sqf +++ b/source/AIS/System/fn_AIselfCheck.sqf @@ -4,10 +4,10 @@ * Check if no player is in this group. (only AI's) If it is so, the AI will call for other AI's to help him. Otherwise a AI-only group cant be revive. * Arguments: - 0: Injured Unit (Object) + 0: Injured Unit (Object) * Return value: - Nothing + Nothing */ params ["_injured_ai"]; @@ -18,8 +18,8 @@ if (!(_injured_ai getVariable ["ais_unconscious", false])) exitWith {}; // injured is in handling. check some seconds later if handlin was interrupted. if (!isNull (_injured_ai getVariable ["ais_hasHelper", objNull])) then { - private _acc_time = (diag_tickTime + 30); - [{diag_tickTime > (_this select 1)}, {[(_this select 0)] call AIS_System_fnc_AIselfCheck}, [_injured_ai, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + private _acc_time = (diag_tickTime + 30); + [{diag_tickTime > (_this select 1)}, {[(_this select 0)] call AIS_System_fnc_AIselfCheck}, [_injured_ai, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; }; @@ -27,7 +27,7 @@ if (!isNull (_injured_ai getVariable ["ais_hasHelper", objNull])) then { private _group_with_player = false; private _all_members = (units group _injured_ai) - [_injured_ai]; if (count _all_members > 0) then { - {if (isPlayer _x) exitWith {_group_with_player = true};true} count _all_members; + {if (isPlayer _x) exitWith {_group_with_player = true};true} count _all_members; }; // do nothing if players in group diff --git a/source/AIS/System/fn_Revive.sqf b/source/AIS/System/fn_Revive.sqf index 72218ca..cb8bfa8 100644 --- a/source/AIS/System/fn_Revive.sqf +++ b/source/AIS/System/fn_Revive.sqf @@ -4,39 +4,39 @@ * Handle Revive actions from a PLAYER * Arguments: - 0: Healer Unit (Object) - 1: Injured Unit (Object) + 0: Healer Unit (Object) + 1: Injured Unit (Object) * Return value: - Nothing + Nothing */ params [ - ["_healer", player, [player]], - "_injured" + ["_healer", player, [player]], + "_injured" ]; _injured setVariable ["ais_hasHelper", _healer, true]; -//_injured playMove "AinjPpneMstpSnonWrflDnon_rolltoback"; // from AIS fsm +//_injured playMove "AinjPpneMstpSnonWrflDnon_rolltoback"; // from AIS fsm [_injured, "AinjPpneMstpSnonWrflDnon_rolltoback"] remoteExec ["playMove", 0]; // switch to primary weapon if possible. Small delay for handling is needed. if (primaryWeapon _healer != "") then { - _healer switchmove "amovpercmstpsraswrfldnon"; - _healer selectWeapon (primaryWeapon _healer); + _healer switchmove "amovpercmstpsraswrfldnon"; + _healer selectWeapon (primaryWeapon _healer); }; _healer playAction "medicStart"; // full heal anim only with primary weapon possible. ais_animChangeEVH = _healer addEventhandler ["AnimChanged", { - params ["_healer","_anim"]; - if (primaryWeapon _healer isEqualTo "") then { - if (_anim in ["amovpknlmstpsnonwnondnon","amovpknlmstpsraswlnrdnon"]) then { - _healer playActionNow "medicStart"; - }; - }; + params ["_healer","_anim"]; + if (primaryWeapon _healer isEqualTo "") then { + if (_anim in ["amovpknlmstpsnonwnondnon","amovpknlmstpsraswlnrdnon"]) then { + _healer playActionNow "medicStart"; + }; + }; }]; _offset = [0,0,0]; _dir = 0; @@ -48,62 +48,62 @@ _injured attachTo [_healer, _offset]; [_healer, _injured] call AIS_Effects_fnc_medEquip; private _duration = [_healer, _injured] call AIS_System_fnc_calculateReviveTime; -//hint format ["Revive Time Duration: %1", _duration]; // debug +//hint format ["Revive Time Duration: %1", _duration]; // debug [ "Applying First Aid", _duration, { - params ["_injured", "_healer"]; + params ["_injured", "_healer"]; - _injured setVariable ["ais_unconscious", false, true]; - - _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; - detach _healer; - detach _injured; + _injured setVariable ["ais_unconscious", false, true]; + + _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; + detach _healer; + detach _injured; - _healer playAction "medicStop"; - [_healer, 1] remoteExec ["addScore", 2]; // +1 per revive + _healer playAction "medicStop"; + [_healer, 1] remoteExec ["addScore", 2]; // +1 per revive - _injured setVariable ["ais_hasHelper", ObjNull, true]; - call AIS_Effects_fnc_garbage; - - // healing if enabled - if (AIS_REVIVE_HEAL) then { - _injured setDamage 0; - _injured setVariable ["ais_fireDamage", 0]; - } else { - // make sure the unit can walk after revive - if ((_injured getHitIndex 10) > 0.49) then { - [{(_this select 0) setHitIndex [10, 0.49]}, [_injured]] call AIS_Core_fnc_onNextFrame; - }; - }; - - [_injured] remoteExecCall ["AIS_System_fnc_restoreFaks", _injured, false]; - - _injured stop false; - {_injured enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; - [_injured, false] remoteExecCall ["AIS_System_fnc_unconcsiousRemote", 0, false]; - [_injured, false] remoteExec ["setCaptive", 0, false]; - - ["GetOutMan"] remoteExec ["removeAllEventHandlers", _injured, false]; + _injured setVariable ["ais_hasHelper", ObjNull, true]; + call AIS_Effects_fnc_garbage; + + // healing if enabled + if (AIS_REVIVE_HEAL) then { + _injured setDamage 0; + _injured setVariable ["ais_fireDamage", 0]; + } else { + // make sure the unit can walk after revive + if ((_injured getHitIndex 10) > 0.49) then { + [{(_this select 0) setHitIndex [10, 0.49]}, [_injured]] call AIS_Core_fnc_onNextFrame; + }; + }; + + [_injured] remoteExecCall ["AIS_System_fnc_restoreFaks", _injured, false]; + + _injured stop false; + {_injured enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; + [_injured, false] remoteExecCall ["AIS_System_fnc_unconcsiousRemote", 0, false]; + [_injured, false] remoteExec ["setCaptive", 0, false]; + + ["GetOutMan"] remoteExec ["removeAllEventHandlers", _injured, false]; }, [_injured, _healer], - { - params ["_injured", "_healer"]; - - _injured setVariable ["ais_hasHelper", ObjNull, true]; - - _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; - detach _healer; - detach _injured; - - call AIS_Effects_fnc_garbage; - - if (alive _healer) then { - _healer playActionNow "medicStop"; - }; - if (!alive _injured) then {["He is not with us anymore."] call AIS_Core_fnc_dynamicText}; - }, - (!alive _injured || _healer getVariable ["ais_unconscious",false]) + { + params ["_injured", "_healer"]; + + _injured setVariable ["ais_hasHelper", ObjNull, true]; + + _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; + detach _healer; + detach _injured; + + call AIS_Effects_fnc_garbage; + + if (alive _healer) then { + _healer playActionNow "medicStop"; + }; + if (!alive _injured) then {["He is not with us anymore."] call AIS_Core_fnc_dynamicText}; + }, + (!alive _injured || _healer getVariable ["ais_unconscious",false]) ] call AIS_Core_fnc_Progress_ShowBar; \ No newline at end of file diff --git a/source/AIS/System/fn_ReviveAI.sqf b/source/AIS/System/fn_ReviveAI.sqf index 2ccdd5f..4027104 100644 --- a/source/AIS/System/fn_ReviveAI.sqf +++ b/source/AIS/System/fn_ReviveAI.sqf @@ -4,16 +4,16 @@ * Handle Revive actions from a AI. * Arguments: - 0: Healer Unit (Object) - 1: Injured Unit (Object) + 0: Healer Unit (Object) + 1: Injured Unit (Object) * Return value: - Nothing + Nothing */ params [ - ["_healer", player, [player]], - "_injured" + ["_healer", player, [player]], + "_injured" ]; _injured setVariable ["ais_hasHelper", _healer, true]; @@ -22,20 +22,20 @@ _behaviour = behaviour _healer; // move the wounded out of the vehicle if (!isNull objectParent _injured) exitWith { - [[_injured, vehicle _injured, 0], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"]; - _acc_time = diag_tickTime + 1.382; - [{diag_tickTime > (_this select 2)}, {[_this select 0, _this select 1] spawn AIS_System_fnc_ReviveAI}, [_healer, _injured, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + [[_injured, vehicle _injured, 0], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"]; + _acc_time = diag_tickTime + 1.382; + [{diag_tickTime > (_this select 2)}, {[_this select 0, _this select 1] spawn AIS_System_fnc_ReviveAI}, [_healer, _injured, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; }; [_injured, "AinjPpneMstpSnonWrflDnon_rolltoback"] remoteExec ['playMove', 0]; // switch to primary weapon if possible. Small delay for handling is needed. if (primaryWeapon _healer != "") then { - _healer selectWeapon primaryWeapon _healer; - sleep 0.5; + _healer selectWeapon primaryWeapon _healer; + sleep 0.5; }; -_healer setPos (getPos _injured); // avoid to move the injured a few metres away +_healer setPos (getPos _injured); // avoid to move the injured a few metres away [_healer, "medicStart"] remoteExec ['playAction', 0]; _healer stop true; @@ -53,10 +53,10 @@ private _duration = [_healer, _injured] call AIS_System_fnc_calculateReviveTime; private _startTime = diag_tickTime + _duration; waitUntil { - diag_tickTime > _startTime || - !alive _healer || - !alive _injured || - _healer getVariable ["ais_unconscious", false] + diag_tickTime > _startTime || + !alive _healer || + !alive _injured || + _healer getVariable ["ais_unconscious", false] }; _injured setVariable ["ais_hasHelper", ObjNull, true]; @@ -73,35 +73,35 @@ _healer setBehaviour _behaviour; if (alive _injured) then { - _injured setVariable ["ais_unconscious", false, true]; - - // healing if enabled - if (AIS_REVIVE_HEAL) then { - _injured setDamage 0; - _injured setVariable ["ais_fireDamage", 0]; - } else { - // make sure the unit can walk after revive - if ((_injured getHitIndex 10) > 0.49) then { - [{(_this select 0) setHitIndex [10, 0.49]}, [_injured]] call AIS_Core_fnc_onNextFrame; - }; - }; - - [_injured] remoteExecCall ["AIS_System_fnc_restoreFaks", _injured, false]; - - if (isPlayer _injured) then { - [true] remoteExec ['showHud', _injured]; - if (AIS_TOGGLE_RADIO) then { - [true] remoteExecCall ["AIS_Effects_fnc_toggleRadio", _injured, false]; - }; - } else { - _injured stop false; - {_injured enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; - }; - - [_injured, false] remoteExecCall ["AIS_System_fnc_unconcsiousRemote", 0]; - [_injured, false] remoteExec ["setCaptive", 0, false]; - - ["GetOutMan"] remoteExec ["removeAllEventHandlers", _injured, false]; + _injured setVariable ["ais_unconscious", false, true]; + + // healing if enabled + if (AIS_REVIVE_HEAL) then { + _injured setDamage 0; + _injured setVariable ["ais_fireDamage", 0]; + } else { + // make sure the unit can walk after revive + if ((_injured getHitIndex 10) > 0.49) then { + [{(_this select 0) setHitIndex [10, 0.49]}, [_injured]] call AIS_Core_fnc_onNextFrame; + }; + }; + + [_injured] remoteExecCall ["AIS_System_fnc_restoreFaks", _injured, false]; + + if (isPlayer _injured) then { + [true] remoteExec ['showHud', _injured]; + if (AIS_TOGGLE_RADIO) then { + [true] remoteExecCall ["AIS_Effects_fnc_toggleRadio", _injured, false]; + }; + } else { + _injured stop false; + {_injured enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM","AUTOCOMBAT"]; + }; + + [_injured, false] remoteExecCall ["AIS_System_fnc_unconcsiousRemote", 0]; + [_injured, false] remoteExec ["setCaptive", 0, false]; + + ["GetOutMan"] remoteExec ["removeAllEventHandlers", _injured, false]; }; diff --git a/source/AIS/System/fn_addMedEvacObj.sqf b/source/AIS/System/fn_addMedEvacObj.sqf index 09897ae..3334140 100644 --- a/source/AIS/System/fn_addMedEvacObj.sqf +++ b/source/AIS/System/fn_addMedEvacObj.sqf @@ -4,27 +4,27 @@ * Set a object / Vehicle in function of a medevac point and make it public. Usable for spawned objects for example. Public function. * Arguments: - 0: Vehicle (Object) - 1: Distance (Number) + 0: Vehicle (Object) + 1: Distance (Number) * Return value: - changed AIS_MEDEVAC_STATIONS array. - Return a Bool if no new object was added. (error) + changed AIS_MEDEVAC_STATIONS array. + Return a Bool if no new object was added. (error) */ params [["_obj",objNull,[objNull]], ["_distance",0,[0]]]; private _return = false; if (!isNull _obj) then { - _index = AIS_MEDEVAC_STATIONS pushBackUnique [_obj, _distance]; - if (_index != -1) then {_return = true}; + _index = AIS_MEDEVAC_STATIONS pushBackUnique [_obj, _distance]; + if (_index != -1) then {_return = true}; } else { - _return = false; + _return = false; }; if (_return) exitWith { - publicVariable "AIS_MEDEVAC_STATIONS"; - AIS_MEDEVAC_STATIONS + publicVariable "AIS_MEDEVAC_STATIONS"; + AIS_MEDEVAC_STATIONS }; diff --git a/source/AIS/System/fn_allowCarry.sqf b/source/AIS/System/fn_allowCarry.sqf index bca18f2..60a6f9b 100644 --- a/source/AIS/System/fn_allowCarry.sqf +++ b/source/AIS/System/fn_allowCarry.sqf @@ -4,10 +4,10 @@ * Check Unit if carrying is possible/allowed. If yes, drag-action is shown up. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Bool + Bool */ private _target = _this; @@ -21,12 +21,12 @@ _Draging = !(isNull (player getVariable ['ais_DragDrop_Torso', objNull])); _return = if ( - _isUnc && - !_isUncHealer && - {alive _target} && - {_Drag} && - {_Draging} - + _isUnc && + !_isUncHealer && + {alive _target} && + {_Drag} && + {_Draging} + ) then {true} else {false}; diff --git a/source/AIS/System/fn_allowDrag.sqf b/source/AIS/System/fn_allowDrag.sqf index 01797f0..d96f4f2 100644 --- a/source/AIS/System/fn_allowDrag.sqf +++ b/source/AIS/System/fn_allowDrag.sqf @@ -4,10 +4,10 @@ * Check Unit if dragging/carrying is possible/allowed. If yes, drag-action is shown up. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Bool + Bool */ private _target = _this; @@ -22,13 +22,13 @@ _noDraging = isNull (player getVariable ['ais_DragDrop_Torso', objNull]); _return = if ( - _isUnc && - !_isUncHealer && - {alive _target} && - {_noHealer} && - {_noDrag} && - {_noDraging} - + _isUnc && + !_isUncHealer && + {alive _target} && + {_noHealer} && + {_noDrag} && + {_noDraging} + ) then {true} else {false}; diff --git a/source/AIS/System/fn_allowPullIn.sqf b/source/AIS/System/fn_allowPullIn.sqf index b5961a5..3b9bba3 100644 --- a/source/AIS/System/fn_allowPullIn.sqf +++ b/source/AIS/System/fn_allowPullIn.sqf @@ -4,10 +4,10 @@ * Check if uncoscious Unit can load in a vehicle.. * Arguments: - 0: Vehicle (Object) + 0: Vehicle (Object) * Return value: - Bool + Bool */ private _targetVehicle = _this; diff --git a/source/AIS/System/fn_allowPullOut.sqf b/source/AIS/System/fn_allowPullOut.sqf index e8068e4..e7d8e91 100644 --- a/source/AIS/System/fn_allowPullOut.sqf +++ b/source/AIS/System/fn_allowPullOut.sqf @@ -4,10 +4,10 @@ * Check Unit if get a unit out of a vehicle is possible * Arguments: - 0: Vehicle (Object) + 0: Vehicle (Object) * Return value: - Bool + Bool */ private _targetVehicle = _this; @@ -16,12 +16,12 @@ private _crew = crew _targetVehicle; private _isUncInside = false; if (count _crew > 0) then { - { - if (_x getVariable ["ais_unconscious", false]) then { - if (_x call AIS_System_fnc_checkUnload) exitWith {_isUncInside = true}; - }; - true - } count _crew; + { + if (_x getVariable ["ais_unconscious", false]) then { + if (_x call AIS_System_fnc_checkUnload) exitWith {_isUncInside = true}; + }; + true + } count _crew; }; diff --git a/source/AIS/System/fn_allowRevive.sqf b/source/AIS/System/fn_allowRevive.sqf index c1aa052..7dfb123 100644 --- a/source/AIS/System/fn_allowRevive.sqf +++ b/source/AIS/System/fn_allowRevive.sqf @@ -4,10 +4,10 @@ * Check Unit if Revive is possible. If yes, Revive-Action is shown up. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Bool + Bool */ private _target = _this; @@ -21,30 +21,30 @@ _noDraging = isNull (player getVariable ['ais_DragDrop_Torso', objNull]); private _station = true; if (count AIS_MEDEVAC_STATIONS > 0) then { - _station = [player, _target] call AIS_System_fnc_medEvacArea; + _station = [player, _target] call AIS_System_fnc_medEvacArea; }; _is_able_to_do = switch (AIS_MEDICAL_EDUCATION) do { - case (0) : {true}; - case (1) : {(items player) find "FirstAidKit" > -1 || {(items player) find "Medikit" > -1}}; - case (2) : {player call AIS_System_fnc_isMedic}; - default {true}; + case (0) : {true}; + case (1) : {(items player) find "FirstAidKit" > -1 || {(items player) find "Medikit" > -1}}; + case (2) : {player call AIS_System_fnc_isMedic}; + default {true}; }; _return = if ( - _isUnc && - {_isStabil} && - {!_isUncHealer} && - {alive _target} && - {_noHealer} && - {_noDrag} && - {_noDraging} && - {_is_able_to_do} && - {_station} - + _isUnc && + {_isStabil} && + {!_isUncHealer} && + {alive _target} && + {_noHealer} && + {_noDrag} && + {_noDraging} && + {_is_able_to_do} && + {_station} + ) then {true} else {false}; diff --git a/source/AIS/System/fn_allowStabilize.sqf b/source/AIS/System/fn_allowStabilize.sqf index 68f193f..bdd35b3 100644 --- a/source/AIS/System/fn_allowStabilize.sqf +++ b/source/AIS/System/fn_allowStabilize.sqf @@ -4,10 +4,10 @@ * Check Unit if Revive is possible. If yes, Revive-Action is shown up. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Bool + Bool */ private _target = _this; @@ -22,14 +22,14 @@ _noDraging = isNull (player getVariable ['ais_DragDrop_Torso', objNull]); _return = if ( - _isUnc && - {!_isStabil} && - {!_isUncHealer} && - {alive _target} && - {_noHealer} && - {_noDrag} && - {_noDraging} - + _isUnc && + {!_isStabil} && + {!_isUncHealer} && + {alive _target} && + {_noHealer} && + {_noDrag} && + {_noDraging} + ) then {true} else {false}; diff --git a/source/AIS/System/fn_bloodloss.sqf b/source/AIS/System/fn_bloodloss.sqf index cd71530..25fa371 100644 --- a/source/AIS/System/fn_bloodloss.sqf +++ b/source/AIS/System/fn_bloodloss.sqf @@ -4,11 +4,11 @@ * Calculate the time till the unit will die (Revive-Time) and control the injury-effects. * Arguments: - 0: Unit (Object) - 1: Killer (Object) + 0: Unit (Object) + 1: Killer (Object) * Return value: - - + - */ params ["_unit"]; if (!local _unit) exitWith {}; @@ -20,7 +20,7 @@ if (!local _unit) exitWith {}; // shacking gun addCamShake [15, 999, 0.7]; -//if (tcb_ais_bloodParticle) then {[_unit] call tcb_fnc_setBleeding}; // not implemented yet +//if (tcb_ais_bloodParticle) then {[_unit] call tcb_fnc_setBleeding}; // not implemented yet // get the revive time _revive_time = [_unit] call AIS_System_fnc_calculateLifeTime; diff --git a/source/AIS/System/fn_bloodlossAI.sqf b/source/AIS/System/fn_bloodlossAI.sqf index ce373f7..9f65558 100644 --- a/source/AIS/System/fn_bloodlossAI.sqf +++ b/source/AIS/System/fn_bloodlossAI.sqf @@ -4,10 +4,10 @@ * Calculate the time till the AI units will die (Revive-Time) and check if the get revived. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - - + - */ params ["_unit"]; @@ -27,17 +27,17 @@ private _ai_time_over = diag_tickTime + _revive_time; // wait until something happens waitUntil { - !alive _unit || - {!(_unit getVariable ["ais_unconscious", false])} || - {_unit getVariable ["ais_stabilized", false]} || - {diag_tickTime > _ai_time_over} + !alive _unit || + {!(_unit getVariable ["ais_unconscious", false])} || + {_unit getVariable ["ais_stabilized", false]} || + {diag_tickTime > _ai_time_over} }; if (diag_tickTime > _ai_time_over) exitWith {[_unit] call AIS_Damage_fnc_goToDead}; if (_unit getVariable ["ais_stabilized", false]) then { - waitUntil {!alive _unit || {!(_unit getVariable ["ais_unconscious", false])}}; + waitUntil {!alive _unit || {!(_unit getVariable ["ais_unconscious", false])}}; }; if (!alive _unit) exitWith {_unit call AIS_System_fnc_restoreFaks}; diff --git a/source/AIS/System/fn_calculateLifeTime.sqf b/source/AIS/System/fn_calculateLifeTime.sqf index d03b4c4..7dd4a89 100644 --- a/source/AIS/System/fn_calculateLifeTime.sqf +++ b/source/AIS/System/fn_calculateLifeTime.sqf @@ -4,10 +4,10 @@ * Calculate the real revive time. Time depends on real summary damage of all body parts. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - NUMBER (Life Time) + NUMBER (Life Time) */ params ["_unit"]; @@ -22,16 +22,16 @@ _ais_avg_damage_factor = 6; // get real damage (all body parts + overall damage) private _summary_damage = 0; { - _summary_damage = _summary_damage + (((getAllHitPointsDamage _unit) select 2) select _x); - true + _summary_damage = _summary_damage + (((getAllHitPointsDamage _unit) select 2) select _x); + true } count [0,1,2,3,4,5,6,7,8,9,10]; _summary_damage = _summary_damage + (damage _unit); // calculate life time _calculated_life_time = if (_unit getVariable ["AIS_noBleedOut", false]) then { - 999999999 + 999999999 } else { - AIS_BLEEDOUT_TIME + ((_ais_variation_factor * (_ais_avg_damage_factor - _summary_damage)) * 10); + AIS_BLEEDOUT_TIME + ((_ais_variation_factor * (_ais_avg_damage_factor - _summary_damage)) * 10); }; diff --git a/source/AIS/System/fn_calculateReviveTime.sqf b/source/AIS/System/fn_calculateReviveTime.sqf index aba087f..70f850d 100644 --- a/source/AIS/System/fn_calculateReviveTime.sqf +++ b/source/AIS/System/fn_calculateReviveTime.sqf @@ -4,11 +4,11 @@ * Calculate the needed time to revive a unit. * Arguments: - 0: Unit (Object) - 1: Injured (Object) + 0: Unit (Object) + 1: Injured (Object) * Return value: - NUMBER (Revive Time) + NUMBER (Revive Time) */ params ["_unit", "_injured"]; @@ -23,8 +23,8 @@ _ais_avg_damage_factor = 6; // get real damage (all body parts + overall damage) private _summary_damage = 0; { - _summary_damage = _summary_damage + (((getAllHitPointsDamage _injured) select 2) select _x); - true + _summary_damage = _summary_damage + (((getAllHitPointsDamage _injured) select 2) select _x); + true } count [0,1,2,3,4,5,6,7,8,9,10]; _summary_damage = _summary_damage + (damage _injured); @@ -33,7 +33,7 @@ _calculated_revive_time = (AIS_REVIVETIME + ((_ais_variation_factor * (_summary_ // rezise the time if the helper is a medic if (_unit call AIS_System_fnc_isMedic) then { - _calculated_revive_time = _calculated_revive_time / 1.5; + _calculated_revive_time = _calculated_revive_time / 1.5; }; diff --git a/source/AIS/System/fn_calculateStabilizeTime.sqf b/source/AIS/System/fn_calculateStabilizeTime.sqf index a0156a9..29fe353 100644 --- a/source/AIS/System/fn_calculateStabilizeTime.sqf +++ b/source/AIS/System/fn_calculateStabilizeTime.sqf @@ -4,11 +4,11 @@ * Calculate the needed time to stabilize a unit. * Arguments: - 0: Unit (Object) - 1: Injured (Object) + 0: Unit (Object) + 1: Injured (Object) * Return value: - NUMBER (Stabilize Time) + NUMBER (Stabilize Time) */ params ["_unit", "_injured"]; @@ -23,8 +23,8 @@ _ais_avg_damage_factor = 6; // get real damage (all body parts + overall damage) private _summary_damage = 0; { - _summary_damage = _summary_damage + (((getAllHitPointsDamage _injured) select 2) select _x); - true + _summary_damage = _summary_damage + (((getAllHitPointsDamage _injured) select 2) select _x); + true } count [0,1,2,3,4,5,6,7,8,9,10]; _summary_damage = _summary_damage + (damage _injured); @@ -33,7 +33,7 @@ _calculated_stabilize_time = (AIS_STABILIZETIME + ((_ais_variation_factor * (_su // rezise the time if the helper is a medic if (_unit call AIS_System_fnc_isMedic) then { - _calculated_stabilize_time = _calculated_stabilize_time / 1.5; + _calculated_stabilize_time = _calculated_stabilize_time / 1.5; }; diff --git a/source/AIS/System/fn_callHelp.sqf b/source/AIS/System/fn_callHelp.sqf index b955fae..26edb72 100644 --- a/source/AIS/System/fn_callHelp.sqf +++ b/source/AIS/System/fn_callHelp.sqf @@ -4,10 +4,10 @@ * Call for help and also start to check if a AI can help you. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - BOOL (true if help is called, false if not) + BOOL (true if help is called, false if not) */ params ["_unit"]; diff --git a/source/AIS/System/fn_carry.sqf b/source/AIS/System/fn_carry.sqf index d3a5f94..ae0042a 100644 --- a/source/AIS/System/fn_carry.sqf +++ b/source/AIS/System/fn_carry.sqf @@ -4,11 +4,11 @@ * Start to carry a unit. * Arguments: - 0: Unit Drager (Object) - 1: Unit wounded (Object) + 0: Unit Drager (Object) + 1: Unit wounded (Object) * Return value: - - + - */ params ["_unit"]; @@ -16,57 +16,57 @@ private _target = _unit getVariable ["ais_DragDrop_Torso", objNull]; // switch to primary weapon, exit if no primary weapon is present (animation cant be played without a primary :( ) if (primaryWeapon _unit isEqualTo "") exitWith { - ["This action is only with a primary Weapon possible."] call AIS_Core_fnc_dynamicText; + ["This action is only with a primary Weapon possible."] call AIS_Core_fnc_dynamicText; }; if (primaryWeapon _unit != "") then { - _unit switchmove "amovpercmstpsraswrfldnon"; - _unit selectWeapon (primaryWeapon _unit); + _unit switchmove "amovpercmstpsraswrfldnon"; + _unit selectWeapon (primaryWeapon _unit); }; if (_unit call AIS_System_fnc_checkLauncher) exitWith { - ["You are not able to carry anyone else while carrying a launcher on your back."] call AIS_Core_fnc_dynamicText; + ["You are not able to carry anyone else while carrying a launcher on your back."] call AIS_Core_fnc_dynamicText; }; _unit setVariable ["ais_CarryDrop_Torso", true]; [_target,_unit] spawn { - _target = _this select 0; - _unit = _this select 1; - detach _unit; - detach _target; - - _pos = _unit ModelToWorld [0,1.8,0]; - _target setPos _pos; - [_target, "grabCarried"] remoteExec ["playActionNow", 0, false]; - disableUserInput true; - sleep 2.5; - if (!isPlayer _target) then {_target disableAI "ANIM"}; - [_unit, "grabCarry"] remoteExec ["playActionNow", 0, false]; - _unit playActionNow "grabCarry"; - disableUserInput false; - disableUserInput true; - disableUserInput false; - - _timenow = time; - waitUntil {!alive _target || {!alive _unit} || {_unit getVariable ["ais_unconscious", false]} || {time > _timenow + 16}}; - _state = _unit getVariable ["ais_unconscious", false]; - if (!alive _target || {!alive _unit} || {_state}) then { - if (alive _target) then { - [_target, "agonyStart"] remoteExec ["playActionNow", 0, false]; - _target setVariable ["ais_DragDrop_Player", objNull, true]; - }; - if (alive _unit && {!(_state)}) then { - [_unit, "amovpknlmstpsraswrfldnon"] remoteExec ["playMoveNow", 0, false]; - }; - _unit setVariable ["ais_DragDrop_Torso", objNull]; - _unit setVariable ["ais_CarryDrop_Torso", false]; - } else { - _target attachTo [_unit, [-0.6, 0.28, -0.05]]; - [_target, 0] remoteExec ["setDir", 0, false]; - }; - + _target = _this select 0; + _unit = _this select 1; + detach _unit; + detach _target; + + _pos = _unit ModelToWorld [0,1.8,0]; + _target setPos _pos; + [_target, "grabCarried"] remoteExec ["playActionNow", 0, false]; + disableUserInput true; + sleep 2.5; + if (!isPlayer _target) then {_target disableAI "ANIM"}; + [_unit, "grabCarry"] remoteExec ["playActionNow", 0, false]; + _unit playActionNow "grabCarry"; + disableUserInput false; + disableUserInput true; + disableUserInput false; + + _timenow = time; + waitUntil {!alive _target || {!alive _unit} || {_unit getVariable ["ais_unconscious", false]} || {time > _timenow + 16}}; + _state = _unit getVariable ["ais_unconscious", false]; + if (!alive _target || {!alive _unit} || {_state}) then { + if (alive _target) then { + [_target, "agonyStart"] remoteExec ["playActionNow", 0, false]; + _target setVariable ["ais_DragDrop_Player", objNull, true]; + }; + if (alive _unit && {!(_state)}) then { + [_unit, "amovpknlmstpsraswrfldnon"] remoteExec ["playMoveNow", 0, false]; + }; + _unit setVariable ["ais_DragDrop_Torso", objNull]; + _unit setVariable ["ais_CarryDrop_Torso", false]; + } else { + _target attachTo [_unit, [-0.6, 0.28, -0.05]]; + [_target, 0] remoteExec ["setDir", 0, false]; + }; + }; diff --git a/source/AIS/System/fn_checkLauncher.sqf b/source/AIS/System/fn_checkLauncher.sqf index 9cf5924..9c29fc5 100644 --- a/source/AIS/System/fn_checkLauncher.sqf +++ b/source/AIS/System/fn_checkLauncher.sqf @@ -4,10 +4,10 @@ * Check if the unit have a launcher. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - BOOL (true when Launcer is present) + BOOL (true when Launcer is present) */ _ret = if (SecondaryWeapon _this isEqualTo "") then {false} else {true}; diff --git a/source/AIS/System/fn_checkUnload.sqf b/source/AIS/System/fn_checkUnload.sqf index 2ea175b..8b2ba42 100644 --- a/source/AIS/System/fn_checkUnload.sqf +++ b/source/AIS/System/fn_checkUnload.sqf @@ -1,16 +1,16 @@ /* - * Author: psycho + * Author: psycho - * Check if a unit can be unload from a vehicle at the actual situation + * Check if a unit can be unload from a vehicle at the actual situation - * Arguments: - 0: Unit (Object) + * Arguments: + 0: Unit (Object) - * Example: - [player] call AIS_System_fnc_checkUnload; + * Example: + [player] call AIS_System_fnc_checkUnload; - * Return value: - Bool + * Return value: + Bool */ params ["_unit"]; diff --git a/source/AIS/System/fn_diary.sqf b/source/AIS/System/fn_diary.sqf index 07eb158..9eee6b0 100644 --- a/source/AIS/System/fn_diary.sqf +++ b/source/AIS/System/fn_diary.sqf @@ -4,16 +4,16 @@ * Diary entry. * Arguments: - - + - * Return value: - Bool + Bool */ private _who_can_revive = switch (AIS_MEDICAL_EDUCATION) do { - case (0) : {"Everyone can revive"}; - case (1) : {"Everybody with a First Aid Kit or Medkit"}; - case (2) : {"Only medics can revive"}; + case (0) : {"Everyone can revive"}; + case (1) : {"Everybody with a First Aid Kit or Medkit"}; + case (2) : {"Only medics can revive"}; }; private _revive_guaranty = if (AIS_REVIVE_GUARANTY) then {"You are protected from insta-death"} else {"Heavy damage can end in insta-death"}; private _revive_heal = if (AIS_REVIVE_HEAL) then {"completely healed"} else {"separately healing action needed"}; diff --git a/source/AIS/System/fn_disableRespawnButton.sqf b/source/AIS/System/fn_disableRespawnButton.sqf index 9121939..8c4c857 100644 --- a/source/AIS/System/fn_disableRespawnButton.sqf +++ b/source/AIS/System/fn_disableRespawnButton.sqf @@ -4,10 +4,10 @@ * Disable the respawn button for given time. * Arguments: - 1: Key (Number) + 1: Key (Number) * Return value: - Bool + Bool */ disableSerialization; waitUntil {!(isNull (findDisplay 49))}; @@ -17,14 +17,14 @@ private _delay = _downTime + AIS_DISABLE_RESPAWN_BUTTON - 6; private _ctrl = (findDisplay 49) displayCtrl 1010; while {!isNull (findDisplay 49) && {diag_tickTime < _delay}} do { - _ctrl ctrlEnable false; - _ctrl ctrlSetText format ["Respawn Disabled (%1 sec)", [(_delay - diag_tickTime)] call AIS_System_fnc_secondsToString]; - uisleep 0.08; + _ctrl ctrlEnable false; + _ctrl ctrlSetText format ["Respawn Disabled (%1 sec)", [(_delay - diag_tickTime)] call AIS_System_fnc_secondsToString]; + uisleep 0.08; }; if (!ctrlEnabled _ctrl) then { - _ctrl ctrlEnable true; - _ctrl ctrlSetText "Respawn"; + _ctrl ctrlEnable true; + _ctrl ctrlSetText "Respawn"; }; diff --git a/source/AIS/System/fn_drag.sqf b/source/AIS/System/fn_drag.sqf index d5bae50..f426683 100644 --- a/source/AIS/System/fn_drag.sqf +++ b/source/AIS/System/fn_drag.sqf @@ -4,11 +4,11 @@ * Start to drag a unit. * Arguments: - 0: Unit Drager (Object) - 1: Unit wounded (Object) + 0: Unit Drager (Object) + 1: Unit wounded (Object) * Return value: - - + - */ @@ -33,7 +33,7 @@ _target attachTo [_unit, _attachPoint]; // release the injured if the helper getin a vehicle [ - {isNull ((_this select 1) getVariable ["ais_DragDrop_Player", objNull]) || {!(isNull objectParent (_this select 0))}}, - {if (!(isNull objectParent (_this select 0))) then {[(_this select 0)] call AIS_System_fnc_release}}, - [_unit,_target] + {isNull ((_this select 1) getVariable ["ais_DragDrop_Player", objNull]) || {!(isNull objectParent (_this select 0))}}, + {if (!(isNull objectParent (_this select 0))) then {[(_this select 0)] call AIS_System_fnc_release}}, + [_unit,_target] ] call AIS_Core_fnc_waitUntilAndExecute; diff --git a/source/AIS/System/fn_findAIHelper.sqf b/source/AIS/System/fn_findAIHelper.sqf index 7f319ed..09bc379 100644 --- a/source/AIS/System/fn_findAIHelper.sqf +++ b/source/AIS/System/fn_findAIHelper.sqf @@ -4,16 +4,16 @@ * Searching for the best helper in the near of a player. * Arguments: - 0: Unit (Object) (Unit which called for help) - 1: Helper (Object (AI which can help) + 0: Unit (Object) (Unit which called for help) + 1: Helper (Object (AI which can help) * Return value: - Nothing + Nothing */ params [ - ["_injured", objNull, [objNull]], - ["_helper", objNull, [objNull]] + ["_injured", objNull, [objNull]], + ["_helper", objNull, [objNull]] ]; // @@ -21,34 +21,34 @@ params [ // start searching for a match if (isNull _helper) then { - // looking for a valid AI group member. - private _all_members = (units group _injured) - [_injured]; - if (count _all_members > 0) then { - private _matching_members_array = []; - {if (!(_x getVariable ["ais_unconscious", false]) && {!isPlayer _x}) then {_matching_members_array pushBack _x};true} count _all_members; - - if (count _matching_members_array > 0) then { - {if (_x call AIS_System_fnc_isMedic) exitWith {_helper = _x};true} count _matching_members_array; - if (isNull _helper) then {_helper = selectRandom _matching_members_array}; - }; - }; - - // if no valid AI group member was found looking for close AI units of the same side - if (isNull _helper) then { - private _allMenNear = []; - if (AIS_AI_HELP_RADIUS > 200) then {AIS_AI_HELP_RADIUS = 200}; // max 200 metres - _allMenNear = (position _injured) nearEntities ["CAManBase", AIS_AI_HELP_RADIUS]; - _allMenNear = _allMenNear - [_injured]; - if (count _allMenNear > 0) then { - private _matching_side_array = []; - private _side = _injured getVariable ["ais_side", civilian]; // needed, cause the injured can be captive (captive == side civilian) - {if ((_side isEqualTo (side _x)) && {!(_x getVariable ["ais_unconscious", false])} && {!isPlayer _x}) then {_matching_side_array pushBack _x};true} count _allMenNear; - if (count _matching_side_array > 0) then { - {if (_x call AIS_System_fnc_isMedic) exitWith {_helper = _x};true} count _matching_side_array; - if (isNull _helper) then {_helper = _matching_side_array select 0}; // no random value to pick the closest one - }; - }; - }; + // looking for a valid AI group member. + private _all_members = (units group _injured) - [_injured]; + if (count _all_members > 0) then { + private _matching_members_array = []; + {if (!(_x getVariable ["ais_unconscious", false]) && {!isPlayer _x}) then {_matching_members_array pushBack _x};true} count _all_members; + + if (count _matching_members_array > 0) then { + {if (_x call AIS_System_fnc_isMedic) exitWith {_helper = _x};true} count _matching_members_array; + if (isNull _helper) then {_helper = selectRandom _matching_members_array}; + }; + }; + + // if no valid AI group member was found looking for close AI units of the same side + if (isNull _helper) then { + private _allMenNear = []; + if (AIS_AI_HELP_RADIUS > 200) then {AIS_AI_HELP_RADIUS = 200}; // max 200 metres + _allMenNear = (position _injured) nearEntities ["CAManBase", AIS_AI_HELP_RADIUS]; + _allMenNear = _allMenNear - [_injured]; + if (count _allMenNear > 0) then { + private _matching_side_array = []; + private _side = _injured getVariable ["ais_side", civilian]; // needed, cause the injured can be captive (captive == side civilian) + {if ((_side isEqualTo (side _x)) && {!(_x getVariable ["ais_unconscious", false])} && {!isPlayer _x}) then {_matching_side_array pushBack _x};true} count _allMenNear; + if (count _matching_side_array > 0) then { + {if (_x call AIS_System_fnc_isMedic) exitWith {_helper = _x};true} count _matching_side_array; + if (isNull _helper) then {_helper = _matching_side_array select 0}; // no random value to pick the closest one + }; + }; + }; }; // if no match... @@ -57,11 +57,11 @@ if (isNull _helper) exitWith {}; // ...otherwise our new helper will make his way to the injured unit. private _acc_time = diag_tickTime + 1; if (local _helper) then { - [{diag_tickTime > (_this select 2)}, {_this call AIS_System_fnc_moveAIHelper}, [_injured, _helper, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + [{diag_tickTime > (_this select 2)}, {_this call AIS_System_fnc_moveAIHelper}, [_injured, _helper, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; } else { - [{diag_tickTime > (_this select 2)}, { - [_this select 0, _this select 1] remoteExecCall ["AIS_System_fnc_moveAIHelper", 2]; - }, [_injured, _helper, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; + [{diag_tickTime > (_this select 2)}, { + [_this select 0, _this select 1] remoteExecCall ["AIS_System_fnc_moveAIHelper", 2]; + }, [_injured, _helper, _acc_time]] call AIS_Core_fnc_waitUntilAndExecute; }; diff --git a/source/AIS/System/fn_getCargoIndex.sqf b/source/AIS/System/fn_getCargoIndex.sqf index 5bca74d..4ee11bc 100644 --- a/source/AIS/System/fn_getCargoIndex.sqf +++ b/source/AIS/System/fn_getCargoIndex.sqf @@ -4,10 +4,10 @@ * Get a free cargo seat position for given vehicle. * Arguments: - 0: Vehicle (Object) + 0: Vehicle (Object) * Return value: - [vehicle, cargo index] (ARRAY) (empty Array if nothing found) + [vehicle, cargo index] (ARRAY) (empty Array if nothing found) */ params ["_targetVehicle"]; @@ -17,12 +17,12 @@ private _VehicleIndex = []; private _allCargoSeats = []; _allCargoSeats = fullcrew [_targetVehicle, "cargo", true]; if ( count _allCargoSeats > 0) then { - { - if (isNull (_x select 0)) exitWith { - _VehicleIndex = [_targetVehicle, _x select 2]; - }; - true - } count _allCargoSeats; + { + if (isNull (_x select 0)) exitWith { + _VehicleIndex = [_targetVehicle, _x select 2]; + }; + true + } count _allCargoSeats; }; if (count _VehicleIndex > 0) exitWith {_VehicleIndex}; @@ -33,12 +33,12 @@ private _allTurretSeats = []; _VehicleIndex = []; _allTurretSeats = fullcrew [_targetVehicle, "Turret", true]; if ( count _allTurretSeats > 0) then { - { - if (isNull (_x select 0)) exitWith { - _VehicleIndex = [_targetVehicle, _x select 2]; - }; - true - } count _allTurretSeats; + { + if (isNull (_x select 0)) exitWith { + _VehicleIndex = [_targetVehicle, _x select 2]; + }; + true + } count _allTurretSeats; }; diff --git a/source/AIS/System/fn_getOutMan.sqf b/source/AIS/System/fn_getOutMan.sqf index 0cd529e..ba972e7 100644 --- a/source/AIS/System/fn_getOutMan.sqf +++ b/source/AIS/System/fn_getOutMan.sqf @@ -4,21 +4,21 @@ * Check if a unconscious unit is pulled out of the vehicle by a AI order and set the correct anim-state. Is called by the getOutMan EH. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Nothing - + Nothing + * Exapmle: - - + - */ params ["_injured"]; if (_injured getVariable ["ais_unconscious", false]) then { - if (!(_injured getVariable ["ais_man_pullOut", false])) then { - [_injured, "agonyStart"] remoteExec ["playActionNow", 0, false]; - }; + if (!(_injured getVariable ["ais_man_pullOut", false])) then { + [_injured, "agonyStart"] remoteExec ["playActionNow", 0, false]; + }; }; diff --git a/source/AIS/System/fn_handleHeal.sqf b/source/AIS/System/fn_handleHeal.sqf index 9b4c2b0..aede45d 100644 --- a/source/AIS/System/fn_handleHeal.sqf +++ b/source/AIS/System/fn_handleHeal.sqf @@ -2,18 +2,18 @@ * Author: Psycho * Block the engine heal action during the unit is unconscious. Function is triggered trough the Heal-EH. - --> EH is brocken: did not react like the BI description tell it. Work around: remove all faks and give them back after the process is done. (without fak, no healing) + --> EH is brocken: did not react like the BI description tell it. Work around: remove all faks and give them back after the process is done. (without fak, no healing) * Engine healing is also blocked by fn_overrideHealAction. Keep this function cause the other function isnt stackable! * Arguments: - 0: Unit (Object) - 1: Healer (Object) - + 0: Unit (Object) + 1: Healer (Object) + * Example: - [p1, player] call AIS_System_fnc_handleHeal; + [p1, player] call AIS_System_fnc_handleHeal; * Return value: - BOOL - true to block the engine handling, false to do the engine action + BOOL - true to block the engine handling, false to do the engine action */ params ["_injured", "_healer"]; @@ -21,37 +21,37 @@ private _return = false; if (_injured getVariable ["ais_unconscious", false]) then { - // remove FAKS to avoid the damage processing - if (local _healer) then { - [_healer] call AIS_System_fnc_removeFaks; - } else { - [_healer] remoteExec ["[_this select 0] call AIS_System_fnc_removeFaks", _healer, false]; - }; - - - if (isPlayer _healer) then { - _txt = if (_injured getVariable ["ais_stabilized", false]) then { - "First you have to Revive the injured." - } else { - "First you have to Stabilize the injured." - }; - [_txt] remoteExecCall ["AIS_Core_fnc_dynamicText", _healer, false]; - } else { - // we can use the AI handling at this point to start our own revive process... - if (isNull (_injured getVariable ["ais_hasHelper", objNull])) then { - [_healer, _injured] spawn AIS_System_fnc_ReviveAI; - }; - }; + // remove FAKS to avoid the damage processing + if (local _healer) then { + [_healer] call AIS_System_fnc_removeFaks; + } else { + [_healer] remoteExec ["[_this select 0] call AIS_System_fnc_removeFaks", _healer, false]; + }; + + + if (isPlayer _healer) then { + _txt = if (_injured getVariable ["ais_stabilized", false]) then { + "First you have to Revive the injured." + } else { + "First you have to Stabilize the injured." + }; + [_txt] remoteExecCall ["AIS_Core_fnc_dynamicText", _healer, false]; + } else { + // we can use the AI handling at this point to start our own revive process... + if (isNull (_injured getVariable ["ais_hasHelper", objNull])) then { + [_healer, _injured] spawn AIS_System_fnc_ReviveAI; + }; + }; - // give Faks back after healing process - private _startTime = diag_tickTime + 8; - if (local _healer) then { - [{diag_tickTime > (_this select 1)},{[(_this select 0)] call AIS_System_fnc_restoreFaks;},[_healer, _startTime]] call AIS_Core_fnc_waitUntilAndExecute; - } else { - [_healer, _startTime] remoteExec ["[{diag_tickTime > (_this select 1)},{[(_this select 0)] call AIS_System_fnc_restoreFaks;},[_this selct 0, _this selct 1]] call AIS_Core_fnc_waitUntilAndExecute", _healer, false]; - }; - - _return = true; + // give Faks back after healing process + private _startTime = diag_tickTime + 8; + if (local _healer) then { + [{diag_tickTime > (_this select 1)},{[(_this select 0)] call AIS_System_fnc_restoreFaks;},[_healer, _startTime]] call AIS_Core_fnc_waitUntilAndExecute; + } else { + [_healer, _startTime] remoteExec ["[{diag_tickTime > (_this select 1)},{[(_this select 0)] call AIS_System_fnc_restoreFaks;},[_this selct 0, _this selct 1]] call AIS_Core_fnc_waitUntilAndExecute", _healer, false]; + }; + + _return = true; }; diff --git a/source/AIS/System/fn_isMedic.sqf b/source/AIS/System/fn_isMedic.sqf index 83982e7..cbfc2e5 100644 --- a/source/AIS/System/fn_isMedic.sqf +++ b/source/AIS/System/fn_isMedic.sqf @@ -4,13 +4,13 @@ * Chck if the unit is a medic. Also units which set manually to a medic will be found. (setUnitTrait) * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Nothing - + Nothing + * Example: - player call AIS_System_fnc_isMedic; + player call AIS_System_fnc_isMedic; */ diff --git a/source/AIS/System/fn_keyHandler.sqf b/source/AIS/System/fn_keyHandler.sqf index 530b94e..4afbc49 100644 --- a/source/AIS/System/fn_keyHandler.sqf +++ b/source/AIS/System/fn_keyHandler.sqf @@ -2,15 +2,15 @@ * Author: Psycho * unbind some key functions while the player is unconcious. - --> Block the following actions: reload, inventory, weapon change, diary and map, chat, get in/out of a vehicle, throw grenades, open curator interface, eject a vehicle + --> Block the following actions: reload, inventory, weapon change, diary and map, chat, get in/out of a vehicle, throw grenades, open curator interface, eject a vehicle * Also it handle some special key functions. - --> press "H" for calling help while unconscious + --> press "H" for calling help while unconscious * Arguments: - 1: Key (Number) + 1: Key (Number) * Return value: - Bool + Bool */ @@ -19,30 +19,30 @@ private _return = false; if !(player getVariable ['ais_unconscious', false]) exitWith {false}; -if (_keyDown isEqualTo 1) then {[] spawn AIS_System_fnc_disableRespawnButton}; // key "Esc" --> disable Respawn Button +if (_keyDown isEqualTo 1) then {[] spawn AIS_System_fnc_disableRespawnButton}; // key "Esc" --> disable Respawn Button -if (_keyDown isEqualTo 35) then {[player] call AIS_System_fnc_callHelp}; // key "H" --> call for Help +if (_keyDown isEqualTo 35) then {[player] call AIS_System_fnc_callHelp}; // key "H" --> call for Help // vehicle actions if (!(isNull objectParent player)) then { - //hint format ["%1", _keyDown]; - { - if (_keyDown in (actionKeys _x)) exitWith { - _return = true; - }; - Nil - } count ['CarForward','CarBack','HeliCyclicForward','HeliLeft','HeliRudderLeft','HeliRight','HeliRudderRight','AutoHover','CarFastForward','CarSlowForward','submarineForward','submarineBack','SwitchWeapon']; + //hint format ["%1", _keyDown]; + { + if (_keyDown in (actionKeys _x)) exitWith { + _return = true; + }; + Nil + } count ['CarForward','CarBack','HeliCyclicForward','HeliLeft','HeliRudderLeft','HeliRight','HeliRudderRight','AutoHover','CarFastForward','CarSlowForward','submarineForward','submarineBack','SwitchWeapon']; }; { - if (_keyDown in (actionKeys _x)) exitWith { - if (AIS_NO_CHAT && {_keyDown in (actionKeys 'Chat')}) then { - ["Chat disabled."] call AIS_Core_fnc_dynamicText; - }; - _return = true; - }; - Nil + if (_keyDown in (actionKeys _x)) exitWith { + if (AIS_NO_CHAT && {_keyDown in (actionKeys 'Chat')}) then { + ["Chat disabled."] call AIS_Core_fnc_dynamicText; + }; + _return = true; + }; + Nil } count ['ReloadMagazine','Gear','SwitchWeapon','Diary','DeployWeaponAuto','Chat','Throw','ShowMap','turnIn','turnOut','curatorInterface','Eject']; diff --git a/source/AIS/System/fn_killed.sqf b/source/AIS/System/fn_killed.sqf index fb29504..524adb1 100644 --- a/source/AIS/System/fn_killed.sqf +++ b/source/AIS/System/fn_killed.sqf @@ -4,15 +4,15 @@ * Clean up the unit if they got killed. Is called by the killed EH. * Arguments: - 0: Unit (Object) - 1: Killer (Object) + 0: Unit (Object) + 1: Killer (Object) * Return value: - - + - */ params ["_unit", "_killer"]; if (!(isNull (_unit getVariable ["ais_DragDrop_Torso", objNull]))) then { - [_unit] call AIS_System_fnc_release; + [_unit] call AIS_System_fnc_release; }; \ No newline at end of file diff --git a/source/AIS/System/fn_loadAIS.sqf b/source/AIS/System/fn_loadAIS.sqf index a8c80f6..75d06c2 100644 --- a/source/AIS/System/fn_loadAIS.sqf +++ b/source/AIS/System/fn_loadAIS.sqf @@ -4,13 +4,13 @@ * Start to init a unit. It's a public function. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Nothing - + Nothing + * Exapmle: - [_unit] call AIS_System_fnc_loadAIS; + [_unit] call AIS_System_fnc_loadAIS; */ params ["_unit"]; @@ -18,25 +18,25 @@ if (!isNil {_unit getVariable "ais_aisInit"}) exitWith {}; if (isServer) then { - if (local _unit) then { - [_this select 0] call AIS_Core_fnc_aisInitHost; - } else { - _id = owner _unit; - [_unit] remoteExecCall ["AIS_System_fnc_loadAISlocalToPlayer", _id, false]; - }; + if (local _unit) then { + [_this select 0] call AIS_Core_fnc_aisInitHost; + } else { + _id = owner _unit; + [_unit] remoteExecCall ["AIS_System_fnc_loadAISlocalToPlayer", _id, false]; + }; } else { - if (local _unit) then { - [_unit] call AIS_System_fnc_loadAISlocalToPlayer; - } else { - [[_unit], { - if (isServer) then { - [_this select 0] call AIS_Core_fnc_aisInitHost; - }; - }] remoteExec ["call"]; - }; - + if (local _unit) then { + [_unit] call AIS_System_fnc_loadAISlocalToPlayer; + } else { + [[_unit], { + if (isServer) then { + [_this select 0] call AIS_Core_fnc_aisInitHost; + }; + }] remoteExec ["call"]; + }; + }; diff --git a/source/AIS/System/fn_loadAISlocalToPlayer.sqf b/source/AIS/System/fn_loadAISlocalToPlayer.sqf index cb264b9..9b82f86 100644 --- a/source/AIS/System/fn_loadAISlocalToPlayer.sqf +++ b/source/AIS/System/fn_loadAISlocalToPlayer.sqf @@ -4,23 +4,23 @@ * Start to init a unit which is local to a player. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Nothing - + Nothing + * Exapmle: - [_unit] call AIS_System_fnc_loadAISlocalToPlayer; + [_unit] call AIS_System_fnc_loadAISlocalToPlayer; */ params ["_unit"]; if (_unit getVariable ["AIS_noReviveInit", false]) exitWith {}; if (!isNil {_unit getVariable "ais_aisInit"}) then { - _unit removeAllEventHandlers "Killed"; - _unit removeAllEventHandlers "Respawn"; - _unit removeAllEventHandlers "HandleHeal"; - [_unit] call AIS_Core_fnc_setVariables; + _unit removeAllEventHandlers "Killed"; + _unit removeAllEventHandlers "Respawn"; + _unit removeAllEventHandlers "HandleHeal"; + [_unit] call AIS_Core_fnc_setVariables; }; _unit setVariable ["ais_aisInit", true]; @@ -33,7 +33,7 @@ _unit addEventHandler ["Killed", {_this call AIS_System_fnc_killed}]; _unit removeAllEventHandlers "Respawn"; if ([_unit] call AIS_Core_fnc_isPlayable) then { - _unit addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; + _unit addEventHandler ["Respawn", {_this call AIS_System_fnc_respawn}]; }; _unit removeAllEventHandlers "HandleHeal"; diff --git a/source/AIS/System/fn_loadInjured.sqf b/source/AIS/System/fn_loadInjured.sqf index 2a346cc..b1d535c 100644 --- a/source/AIS/System/fn_loadInjured.sqf +++ b/source/AIS/System/fn_loadInjured.sqf @@ -4,11 +4,11 @@ * Load a unit into a vehicles cargo or turret seat. * Arguments: - 0: Unit (Object) - 1: Vehicle (Object) + 0: Unit (Object) + 1: Vehicle (Object) * Return value: - - + - */ params ["_unit", "_vehicle"]; diff --git a/source/AIS/System/fn_medEvacArea.sqf b/source/AIS/System/fn_medEvacArea.sqf index a068d5a..47fa96a 100644 --- a/source/AIS/System/fn_medEvacArea.sqf +++ b/source/AIS/System/fn_medEvacArea.sqf @@ -4,24 +4,24 @@ * Check Unit if is in range of a medevac object. * Arguments: - 0: Unit (Object) - 1: Injured (Object) + 0: Unit (Object) + 1: Injured (Object) * Return value: - Bool + Bool */ params ["_player", "_injured"]; private _return = false; { - _x params [["_obj", objNull], ["_radius", 0, [0]]]; - if (_return) exitWith {true}; - if (!isNull _obj) then { - if (_radius > 0) then { - if ([_obj, _radius] call AIS_Core_fnc_inRange) exitWith {_return = true}; - }; - }; + _x params [["_obj", objNull], ["_radius", 0, [0]]]; + if (_return) exitWith {true}; + if (!isNull _obj) then { + if (_radius > 0) then { + if ([_obj, _radius] call AIS_Core_fnc_inRange) exitWith {_return = true}; + }; + }; } count AIS_MEDEVAC_STATIONS; diff --git a/source/AIS/System/fn_moveAIHelper.sqf b/source/AIS/System/fn_moveAIHelper.sqf index ae2833f..5e40db9 100644 --- a/source/AIS/System/fn_moveAIHelper.sqf +++ b/source/AIS/System/fn_moveAIHelper.sqf @@ -4,40 +4,40 @@ * Make the AI moving to a injured unit and start the revive. * Arguments: - 0: Injured unit (Object) - 1: Helper AI (Object) + 0: Injured unit (Object) + 1: Helper AI (Object) * Return value: - Nothing + Nothing */ params ["_injured", "_helper"]; // help not longer needed or possible if ( - !alive _helper || - !alive _injured || - (!(_injured getVariable ["ais_unconscious", false])) || - (_helper getVariable ["ais_unconscious", false]) || - (!isNull (_injured getVariable ["ais_hasHelper", objNull])) + !alive _helper || + !alive _injured || + (!(_injured getVariable ["ais_unconscious", false])) || + (_helper getVariable ["ais_unconscious", false]) || + (!isNull (_injured getVariable ["ais_hasHelper", objNull])) ) exitWith { - if (alive _helper) then { - _helper enableAI "AUTOCOMBAT"; - } else { - if (alive _injured && {!isPlayer _injured}) then { - [_injured] call AIS_System_fnc_AIselfCheck; // check if another helper is avalible - }; - }; + if (alive _helper) then { + _helper enableAI "AUTOCOMBAT"; + } else { + if (alive _injured && {!isPlayer _injured}) then { + [_injured] call AIS_System_fnc_AIselfCheck; // check if another helper is avalible + }; + }; }; // AI instructions -if (behaviour _helper != "AWARE") then {_helper setBehaviour "AWARE"}; // better "SAFE" ??? +if (behaviour _helper != "AWARE") then {_helper setBehaviour "AWARE"}; // better "SAFE" ??? _helper disableAI "AUTOCOMBAT"; _helper allowFleeing 0; if (currentCommand _helper != "MOVE") then { - _helper stop false; - _helper doMove (position (vehicle _injured)); + _helper stop false; + _helper doMove (position (vehicle _injured)); }; // if injured is in vehicle helper wont go that close --> have to increase the shortest distance @@ -45,13 +45,13 @@ _dist = if (!isNull objectParent _injured) then {(sizeOf (typeOf (vehicle _injur // start revive if close enough and ready for handling. Otherwise reset and repeat searching loop. if (_helper distance2D (vehicle _injured) < _dist) exitWith { - if (isNull (_injured getVariable ["ais_hasHelper", objNull])) then { - _helper disableAI "AUTOCOMBAT"; - [_helper, _injured] spawn AIS_System_fnc_ReviveAI; - } else { - _helper enableAI "AUTOCOMBAT"; - [_injured] call AIS_System_fnc_AIselfCheck; - }; + if (isNull (_injured getVariable ["ais_hasHelper", objNull])) then { + _helper disableAI "AUTOCOMBAT"; + [_helper, _injured] spawn AIS_System_fnc_ReviveAI; + } else { + _helper enableAI "AUTOCOMBAT"; + [_injured] call AIS_System_fnc_AIselfCheck; + }; }; // if not close enough start the function in a few seconds again diff --git a/source/AIS/System/fn_moveCargoRemote.sqf b/source/AIS/System/fn_moveCargoRemote.sqf index 9166a12..703244b 100644 --- a/source/AIS/System/fn_moveCargoRemote.sqf +++ b/source/AIS/System/fn_moveCargoRemote.sqf @@ -4,12 +4,12 @@ * Load a unit into a vehicles cargo or turret seat. Function is everytime called by a player. Checks if the unit is local, if not, use remoteExec. * Arguments: - 0: Unit (Object) - 1: Vehicle (Object) - 2: In/Out (Number) // 0 = Out / 1 = In + 0: Unit (Object) + 1: Vehicle (Object) + 2: In/Out (Number) // 0 = Out / 1 = In * Return value: - - + - */ params ["_injured", "_vehicle", "_handling"]; @@ -18,11 +18,11 @@ private _VehicleIndex = [_vehicle] call AIS_System_fnc_getCargoIndex; if (_handling > 0) then { - _injured assignAsCargoIndex [_vehicle, _VehicleIndex select 1]; - _injured moveInCargo [_vehicle, _VehicleIndex select 1]; + _injured assignAsCargoIndex [_vehicle, _VehicleIndex select 1]; + _injured moveInCargo [_vehicle, _VehicleIndex select 1]; } else { - unassignVehicle _injured; - moveOut _injured; + unassignVehicle _injured; + moveOut _injured; }; diff --git a/source/AIS/System/fn_overrideHealAction.sqf b/source/AIS/System/fn_overrideHealAction.sqf index 6124d11..5ad097c 100644 --- a/source/AIS/System/fn_overrideHealAction.sqf +++ b/source/AIS/System/fn_overrideHealAction.sqf @@ -5,13 +5,13 @@ * This is called by a inGameUISetEventHandler. This isnt a stackable EH. This mean it will maybe be overriden by a mod or some 3rd party scripts! * Arguments: - 0: Unit (Object) - 1: Unit (Object) - 2: Index (Number) - 3: Action (String) + 0: Unit (Object) + 1: Unit (Object) + 2: Index (Number) + 3: Action (String) * Return value: - Bool - true to block the engine handling, false to do the engine action + Bool - true to block the engine handling, false to do the engine action */ @@ -19,15 +19,15 @@ params ["_injured", "_caller", "_index", "_action"]; private _back = false; if (_action isEqualTo "HealSoldier") then { - if (_injured getVariable ["ais_unconscious", false]) then { - _txt = if (_injured getVariable ["ais_stabilized", false]) then { - "First you have to Revive the injured." - } else { - "First you have to Stabilize the injured." - }; - _txt call AIS_Core_fnc_dynamicText; - _back = true; - }; + if (_injured getVariable ["ais_unconscious", false]) then { + _txt = if (_injured getVariable ["ais_stabilized", false]) then { + "First you have to Revive the injured." + } else { + "First you have to Stabilize the injured." + }; + _txt call AIS_Core_fnc_dynamicText; + _back = true; + }; }; diff --git a/source/AIS/System/fn_postinit.sqf b/source/AIS/System/fn_postinit.sqf index eb8ea63..c48216b 100644 --- a/source/AIS/System/fn_postinit.sqf +++ b/source/AIS/System/fn_postinit.sqf @@ -3,99 +3,99 @@ if (ais_ace_shutdown) exitWith {diag_log ["AIS: AIS shutdown itself cause ACE mo /* // expample action _action = [ - "Text", // action text - player, // object which the action is assigned - 2, // distance where action is shown (0 means max distance = 15m) - "true", // condition to show the action + "Text", // action text + player, // object which the action is assigned + 2, // distance where action is shown (0 means max distance = 15m) + "true", // condition to show the action { - my_code // code perform on action + my_code // code perform on action }, - [], // Optional: custom variables run trough - "%1" // Optional: formated text for setUserActionText + [], // Optional: custom variables run trough + "%1" // Optional: formated text for setUserActionText ] call AIS_Core_fnc_addAction; */ [ - "First Aid", - player, - 1.5, - "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowRevive}", - { - [player, cursorTarget] spawn AIS_System_fnc_Revive; - }, - [], - "%1
" + "First Aid", + player, + 1.5, + "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowRevive}", + { + [player, cursorTarget] spawn AIS_System_fnc_Revive; + }, + [], + "%1
" ] call AIS_Core_fnc_addAction; [ - "Stabilize", - player, - 1.5, - "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowStabilize}", - { - [player, cursorTarget] spawn AIS_System_fnc_Stabilize; - }, - [], - "%1
" + "Stabilize", + player, + 1.5, + "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowStabilize}", + { + [player, cursorTarget] spawn AIS_System_fnc_Stabilize; + }, + [], + "%1
" ] call AIS_Core_fnc_addAction; [ - "Drag", - player, - 1.8, - "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowDrag}", - { - [player, cursorTarget] call AIS_System_fnc_drag; - }, - [], - "%1
" + "Drag", + player, + 1.8, + "cursorTarget isKindOf 'CAManBase' && {cursorTarget getVariable ['ais_unconscious',false]} && {cursorTarget call AIS_System_fnc_allowDrag}", + { + [player, cursorTarget] call AIS_System_fnc_drag; + }, + [], + "%1
" ] call AIS_Core_fnc_addAction; [ - "Carry", - player, - 0, - "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull])) && {!(player getVariable ['ais_CarryDrop_Torso', false])}", - { - [player] spawn AIS_System_fnc_carry; - }, - [], - "%1
" + "Carry", + player, + 0, + "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull])) && {!(player getVariable ['ais_CarryDrop_Torso', false])}", + { + [player] spawn AIS_System_fnc_carry; + }, + [], + "%1
" ] call AIS_Core_fnc_addAction; [ - "Release", - player, - 0, - "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull]))", - { - [player] call AIS_System_fnc_release; - }, - [], - "%1
" + "Release", + player, + 0, + "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull]))", + { + [player] call AIS_System_fnc_release; + }, + [], + "%1
" ] call AIS_Core_fnc_addAction; [ - "Unload Injured", - player, - 4, - "(cursorTarget isKindOf 'LandVehicle' || cursorTarget isKindOf 'Air') && {alive cursorTarget} && {cursorTarget call AIS_System_fnc_allowPullOut}", - { - [player, cursorTarget] call AIS_System_fnc_unloadInjured; - }, - [], - "%1
" + "Unload Injured", + player, + 4, + "(cursorTarget isKindOf 'LandVehicle' || cursorTarget isKindOf 'Air') && {alive cursorTarget} && {cursorTarget call AIS_System_fnc_allowPullOut}", + { + [player, cursorTarget] call AIS_System_fnc_unloadInjured; + }, + [], + "%1
" ] call AIS_Core_fnc_addAction; [ - "Load Injured", - player, - 4, - "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull])) && {cursorTarget isKindOf 'LandVehicle' || cursorTarget isKindOf 'Air'} && {cursorTarget call AIS_System_fnc_allowPullIn}", - { - [player, cursorTarget] call AIS_System_fnc_loadInjured; - }, - [], - "%1
" + "Load Injured", + player, + 4, + "!(isNull (player getVariable ['ais_DragDrop_Torso', objNull])) && {cursorTarget isKindOf 'LandVehicle' || cursorTarget isKindOf 'Air'} && {cursorTarget call AIS_System_fnc_allowPullIn}", + { + [player, cursorTarget] call AIS_System_fnc_loadInjured; + }, + [], + "%1
" ] call AIS_Core_fnc_addAction; \ No newline at end of file diff --git a/source/AIS/System/fn_release.sqf b/source/AIS/System/fn_release.sqf index 64fee19..4227f07 100644 --- a/source/AIS/System/fn_release.sqf +++ b/source/AIS/System/fn_release.sqf @@ -4,10 +4,10 @@ * Stop to drag another unit. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - - + - */ params ["_unit"]; @@ -25,9 +25,9 @@ detach _unit; detach _target; if (alive _target) then { - [_target, "AinjPpneMstpSnonWrflDb_release"] remoteExec ["switchMove", 0]; - //[_target, _pos] call AIS_Core_fnc_setPosAGLS; - _target setPos _pos; + [_target, "AinjPpneMstpSnonWrflDb_release"] remoteExec ["switchMove", 0]; + //[_target, _pos] call AIS_Core_fnc_setPosAGLS; + _target setPos _pos; }; diff --git a/source/AIS/System/fn_removeFaks.sqf b/source/AIS/System/fn_removeFaks.sqf index 0b75204..f6b9328 100644 --- a/source/AIS/System/fn_removeFaks.sqf +++ b/source/AIS/System/fn_removeFaks.sqf @@ -4,13 +4,13 @@ * Remove first aid and Medikits * Arguments: - 0: Unit (Object) - + 0: Unit (Object) + * Example: - [player] call AIS_System_fnc_removeFaks; + [player] call AIS_System_fnc_removeFaks; * Return value: - BOOL - false if items already stored + BOOL - false if items already stored */ params ["_unit"]; @@ -25,33 +25,33 @@ _numMedi = _medK; // Faks from the uniform { - if (_x == "FirstAidKit") then { - _numFakUniform = _numFakUniform + 1; - _unit removeItemFromUniform "FirstAidKit"; - }; - nil + if (_x == "FirstAidKit") then { + _numFakUniform = _numFakUniform + 1; + _unit removeItemFromUniform "FirstAidKit"; + }; + nil } count (uniformItems _unit); // Faks from the vest { - if (_x == "FirstAidKit") then { - _numFaksVest = _numFaksVest + 1; - _unit removeItemFromVest "FirstAidKit"; - }; - nil + if (_x == "FirstAidKit") then { + _numFaksVest = _numFaksVest + 1; + _unit removeItemFromVest "FirstAidKit"; + }; + nil } count (vestItems _unit); // Faks and Medikits from the backpack. Kits can only be in backpack, so we don't search for them anywhere else { - if (_x == "FirstAidKit") then { - _numFaksBackpack = _numFaksBackpack + 1; - _unit removeItemFromBackpack "FirstAidKit"; - }; - if (_x == "Medikit") then { - _numMedi = _numMedi + 1; - _unit removeItemFromBackpack "Medikit"; - }; - nil + if (_x == "FirstAidKit") then { + _numFaksBackpack = _numFaksBackpack + 1; + _unit removeItemFromBackpack "FirstAidKit"; + }; + if (_x == "Medikit") then { + _numMedi = _numMedi + 1; + _unit removeItemFromBackpack "Medikit"; + }; + nil } count (backpackItems _unit); // Store the result diff --git a/source/AIS/System/fn_respawn.sqf b/source/AIS/System/fn_respawn.sqf index 55ebb6b..189f5f8 100644 --- a/source/AIS/System/fn_respawn.sqf +++ b/source/AIS/System/fn_respawn.sqf @@ -4,11 +4,11 @@ * Re-initialize a respawned unit. * Arguments: - 0: Unit (Object) - 1: Corpse (Object) + 0: Unit (Object) + 1: Corpse (Object) * Return value: - - + - */ params ["_unit", "_corpse"]; @@ -21,11 +21,11 @@ _unit setVariable ["AIS_UnitIsDead", false]; _unit setCaptive false; if (isPlayer _unit) then { - if (local player) then {showHud true}; - if (AIS_TOGGLE_RADIO) then { - [true] call AIS_Effects_fnc_toggleRadio; - }; + if (local player) then {showHud true}; + if (AIS_TOGGLE_RADIO) then { + [true] call AIS_Effects_fnc_toggleRadio; + }; } else { - _unit stop false; - {_unit enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM"]; + _unit stop false; + {_unit enableAI _x; nil} count ["MOVE","TARGET","AUTOTARGET","ANIM"]; }; \ No newline at end of file diff --git a/source/AIS/System/fn_restoreFaks.sqf b/source/AIS/System/fn_restoreFaks.sqf index 8ae90bc..fc2b317 100644 --- a/source/AIS/System/fn_restoreFaks.sqf +++ b/source/AIS/System/fn_restoreFaks.sqf @@ -5,13 +5,13 @@ * Re-Add first aid and Medikits. * Arguments: - 0: Unit (Object) - + 0: Unit (Object) + * Example: - [player] call AIS_System_fnc_restoreFaks; + [player] call AIS_System_fnc_restoreFaks; * Return value: - - + - */ params ["_unit"]; @@ -20,7 +20,7 @@ private _items = _unit getVariable ["AIS_MedicalStore", [0,0,0,0]]; for "_i" from 1 to (_items select 0) do {_unit addItemToUniform "FirstAidKit"}; -for "_i" from 1 to (_items select 1) do {_unit addItemToVest "FirstAidKit"}; +for "_i" from 1 to (_items select 1) do {_unit addItemToVest "FirstAidKit"}; for "_i" from 1 to (_items select 2) do {_unit addItemTobackpack "FirstAidKit"}; diff --git a/source/AIS/System/fn_reveal.sqf b/source/AIS/System/fn_reveal.sqf index a8d41ab..252bae1 100644 --- a/source/AIS/System/fn_reveal.sqf +++ b/source/AIS/System/fn_reveal.sqf @@ -4,27 +4,27 @@ * Reveal near units after revive. * Arguments: - 0: Revived Unit (Object) - 1: Range (Number) [optional] + 0: Revived Unit (Object) + 1: Range (Number) [optional] * Return value: - Nothing + Nothing */ params [ - ["_unit", player, [player]], - ["_range", 50, [50]] + ["_unit", player, [player]], + ["_range", 50, [50]] ]; _list = _unit nearEntities ["CAManBase", _range]; _side = _unit getVariable ["ais_side", civilian]; { - if ((side _x) isEqualTo _side) then { - _unit reveal [_x, 4]; - }; - true + if ((side _x) isEqualTo _side) then { + _unit reveal [_x, 4]; + }; + true } count _list; diff --git a/source/AIS/System/fn_secondsToString.sqf b/source/AIS/System/fn_secondsToString.sqf index 9c1432a..f919f19 100644 --- a/source/AIS/System/fn_secondsToString.sqf +++ b/source/AIS/System/fn_secondsToString.sqf @@ -5,10 +5,10 @@ * Convert seconds to formatted string. * Arguments: - _this select 0: time in seconds + _this select 0: time in seconds * Return value: - String + String */ _sec = _this param [0, 0, [0]]; diff --git a/source/AIS/System/fn_setUnconscious.sqf b/source/AIS/System/fn_setUnconscious.sqf index 615f784..613de58 100644 --- a/source/AIS/System/fn_setUnconscious.sqf +++ b/source/AIS/System/fn_setUnconscious.sqf @@ -4,30 +4,30 @@ * Set the unit in unconcsious state. This is a public function. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Nothing - + Nothing + * Exapmle: - [player] call AIS_System_fnc_setUnconscious; + [player] call AIS_System_fnc_setUnconscious; */ params ["_unit"]; if (time <= 0) exitWith { - [ - {time > 0}, - {_this call AIS_System_fnc_setUnconscious}, - [_unit] - ] call AIS_Core_fnc_waitUntilAndExecute; + [ + {time > 0}, + {_this call AIS_System_fnc_setUnconscious}, + [_unit] + ] call AIS_Core_fnc_waitUntilAndExecute; }; if (isPlayer _unit) then { - [_unit] call AIS_System_fnc_unconsciousPlayer + [_unit] call AIS_System_fnc_unconsciousPlayer } else { - [_unit] call AIS_System_fnc_unconsciousAI + [_unit] call AIS_System_fnc_unconsciousAI }; diff --git a/source/AIS/System/fn_stabilize.sqf b/source/AIS/System/fn_stabilize.sqf index 90a43c6..bc39437 100644 --- a/source/AIS/System/fn_stabilize.sqf +++ b/source/AIS/System/fn_stabilize.sqf @@ -4,11 +4,11 @@ * Stabilize a unit. A stabilized unit stop to bleed and cant die trough the revive timer. * Arguments: - 0: Unit Helper (Object) - 1: Unit wounded (Object) + 0: Unit Helper (Object) + 1: Unit wounded (Object) * Return value: - - + - */ params ["_healer", "_injured"]; @@ -16,25 +16,25 @@ params ["_healer", "_injured"]; _injured setVariable ["ais_hasHelper", _healer, true]; -//_injured playMove "AinjPpneMstpSnonWrflDnon_rolltoback"; // from AIS fsm +//_injured playMove "AinjPpneMstpSnonWrflDnon_rolltoback"; // from AIS fsm [_injured, "AinjPpneMstpSnonWrflDnon_rolltoback"] remoteExec ["playMove", 0]; // switch to primary weapon if possible. Small delay for handling is needed. if (primaryWeapon _healer != "") then { - _healer switchmove "amovpercmstpsraswrfldnon"; - _healer selectWeapon (primaryWeapon _healer); + _healer switchmove "amovpercmstpsraswrfldnon"; + _healer selectWeapon (primaryWeapon _healer); }; _healer playAction "medicStart"; // full heal anim only with primary weapon possible. ais_animChangeEVH = _healer addEventhandler ["AnimChanged", { - params ["_healer","_anim"]; - if (primaryWeapon _healer isEqualTo "") then { - if (_anim in ["amovpknlmstpsnonwnondnon","amovpknlmstpsraswlnrdnon"]) then { - _healer playActionNow "medicStart"; - }; - }; + params ["_healer","_anim"]; + if (primaryWeapon _healer isEqualTo "") then { + if (_anim in ["amovpknlmstpsnonwnondnon","amovpknlmstpsraswlnrdnon"]) then { + _healer playActionNow "medicStart"; + }; + }; }]; _offset = [0,0,0]; _dir = 0; @@ -46,44 +46,44 @@ _injured attachTo [_healer, _offset]; [_healer, _injured] call AIS_Effects_fnc_medEquip; private _duration = [_healer, _injured] call AIS_System_fnc_calculateStabilizeTime; -//hint format ["Stabilize Time Duration: %1", _duration]; // debug +//hint format ["Stabilize Time Duration: %1", _duration]; // debug [ "Stabilize the Injured", _duration, { - params ["_injured", "_healer"]; + params ["_injured", "_healer"]; - _injured setVariable ["ais_stabilized", true, true]; - - _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; - detach _healer; - detach _injured; + _injured setVariable ["ais_stabilized", true, true]; + + _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; + detach _healer; + detach _injured; - _healer playAction "medicStop"; + _healer playAction "medicStop"; - _injured setVariable ["ais_hasHelper", ObjNull, true]; - call AIS_Effects_fnc_garbage; + _injured setVariable ["ais_hasHelper", ObjNull, true]; + call AIS_Effects_fnc_garbage; }, [_injured, _healer], - { - params ["_injured", "_healer"]; - - _injured setVariable ["ais_hasHelper", ObjNull, true]; - - _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; - detach _healer; - detach _injured; - - call AIS_Effects_fnc_garbage; - - if (alive _healer) then { - _healer playActionNow "medicStop"; - }; - if (!alive _injured) then {["He is not with us anymore."] call AIS_Core_fnc_dynamicText}; - }, - (!alive _injured || _healer getVariable ["ais_unconscious", false]) + { + params ["_injured", "_healer"]; + + _injured setVariable ["ais_hasHelper", ObjNull, true]; + + _healer removeEventHandler ["AnimChanged", ais_animChangeEVH]; + detach _healer; + detach _injured; + + call AIS_Effects_fnc_garbage; + + if (alive _healer) then { + _healer playActionNow "medicStop"; + }; + if (!alive _injured) then {["He is not with us anymore."] call AIS_Core_fnc_dynamicText}; + }, + (!alive _injured || _healer getVariable ["ais_unconscious", false]) ] call AIS_Core_fnc_Progress_ShowBar; diff --git a/source/AIS/System/fn_unconcsiousRemote.sqf b/source/AIS/System/fn_unconcsiousRemote.sqf index 4a44a0b..afae54e 100644 --- a/source/AIS/System/fn_unconcsiousRemote.sqf +++ b/source/AIS/System/fn_unconcsiousRemote.sqf @@ -4,66 +4,66 @@ * Broadcast everything across the network which is needed if a unit fall in agony * Arguments: - 0: Unit (Object) - 1: Unconcsious state of the Unit (Bool) + 0: Unit (Object) + 1: Unconcsious state of the Unit (Bool) * Return value: - Nothing + Nothing */ params [ - ["_unit", objNull, [player]], - ["_is_unoncsious", false, [false]] + ["_unit", objNull, [player]], + ["_is_unoncsious", false, [false]] ]; if (isNull _unit) exitWith {diag_log format ["Non existing unit or wrong data type passed. AIS_System_fnc_unconcsiousRemote.sqf"];}; if (_is_unoncsious) then { - [_unit, "agonyStart"] remoteExec ["playActionNow", 0, false]; - //_unit playActionNow "agonyStart"; - - if (local player) then { - _condition = false; - _condition = switch (AIS_SHOW_UNC_MESSAGE_TO) do { - case ("Group") : {_unit in units group player}; - case ("Side") : {side _unit isEqualTo playerSide}; - default {false}; - }; - - if (_condition) then { - [side _unit,"HQ"] sideChat format ["%1 is down and needs help at %2!",name _unit, mapGridPosition _unit]; - }; - - if (AIS_SHOW_UNC_MARKERS && {side _unit isEqualTo playerSide}) then { - _unit call AIS_Effects_fnc_injuredMarker; - }; - }; - + [_unit, "agonyStart"] remoteExec ["playActionNow", 0, false]; + //_unit playActionNow "agonyStart"; + + if (local player) then { + _condition = false; + _condition = switch (AIS_SHOW_UNC_MESSAGE_TO) do { + case ("Group") : {_unit in units group player}; + case ("Side") : {side _unit isEqualTo playerSide}; + default {false}; + }; + + if (_condition) then { + [side _unit,"HQ"] sideChat format ["%1 is down and needs help at %2!",name _unit, mapGridPosition _unit]; + }; + + if (AIS_SHOW_UNC_MARKERS && {side _unit isEqualTo playerSide}) then { + _unit call AIS_Effects_fnc_injuredMarker; + }; + }; + } else { - [_unit, "agonyStop"] remoteExec ["playActionNow", 0, false]; - //_unit playActionNow "agonyStop"; - - [_unit, 50] call AIS_system_fnc_reveal; - - addSwitchableUnit _unit; - if (ais_reenable_teamswitch) then { - enableTeamswitch true; - }; - - if (isPlayer _unit) then { - if (local player) then { - showHud true; - if (AIS_TOGGLE_RADIO) then { - [true] call AIS_Effects_fnc_toggleRadio; - }; - }; - }; - - if (AIS_SHOW_UNC_MARKERS && {local player}) then { - _unit call AIS_Effects_fnc_removeinjuredMarker; - }; + [_unit, "agonyStop"] remoteExec ["playActionNow", 0, false]; + //_unit playActionNow "agonyStop"; + + [_unit, 50] call AIS_system_fnc_reveal; + + addSwitchableUnit _unit; + if (ais_reenable_teamswitch) then { + enableTeamswitch true; + }; + + if (isPlayer _unit) then { + if (local player) then { + showHud true; + if (AIS_TOGGLE_RADIO) then { + [true] call AIS_Effects_fnc_toggleRadio; + }; + }; + }; + + if (AIS_SHOW_UNC_MARKERS && {local player}) then { + _unit call AIS_Effects_fnc_removeinjuredMarker; + }; }; diff --git a/source/AIS/System/fn_unconsciousAI.sqf b/source/AIS/System/fn_unconsciousAI.sqf index 1e7254a..0ee1306 100644 --- a/source/AIS/System/fn_unconsciousAI.sqf +++ b/source/AIS/System/fn_unconsciousAI.sqf @@ -4,13 +4,13 @@ * Set the unit in unconcsious state for Non-players. Set all variables and handle things around. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Nothing - + Nothing + * Exapmle: - [unit] call AIS_System_fnc_unconsciousAI; + [unit] call AIS_System_fnc_unconsciousAI; */ @@ -21,12 +21,12 @@ _unit setVariable ["ais_unconscious", true, true]; // if player drag or carry someone release the body if (!(isNull (_unit getVariable ["ais_DragDrop_Torso", objNull]))) then { - [_unit] call AIS_System_fnc_release; + [_unit] call AIS_System_fnc_release; }; // do some actions for some special situations... if (count attachedObjects _unit > 0) then { - {detach _x} forEach (attachedObjects _unit); + {detach _x} forEach (attachedObjects _unit); }; if (animationState _unit in ["ladderriflestatic", "laddercivilstatic"]) then { _unit action ["ladderOff", (nearestBuilding _unit)]; diff --git a/source/AIS/System/fn_unconsciousPlayer.sqf b/source/AIS/System/fn_unconsciousPlayer.sqf index 2d3eed0..843d448 100644 --- a/source/AIS/System/fn_unconsciousPlayer.sqf +++ b/source/AIS/System/fn_unconsciousPlayer.sqf @@ -4,13 +4,13 @@ * Set the unit in unconcsious state for PLAYERS. Set all variables and handle things around. * Arguments: - 0: Unit (Object) + 0: Unit (Object) * Return value: - Nothing - + Nothing + * Exapmle: - [player] call AIS_System_fnc_unconsciousPlayer; + [player] call AIS_System_fnc_unconsciousPlayer; */ params ["_unit"]; @@ -21,12 +21,12 @@ _unit setVariable ["ais_CarryDrop_Torso", false]; // if player drag or carry someone release the body if (!(isNull (_unit getVariable ["ais_DragDrop_Torso", objNull]))) then { - [_unit] call AIS_System_fnc_release; + [_unit] call AIS_System_fnc_release; }; // do some actions for some special situations... if (count attachedObjects _unit > 0) then { - {detach _x} forEach (attachedObjects _unit); + {detach _x} forEach (attachedObjects _unit); }; if (animationState _unit in ["ladderriflestatic", "laddercivilstatic"]) then { _unit action ["ladderOff", (nearestBuilding _unit)]; @@ -43,7 +43,7 @@ if (visibleMap) then {openMap false}; showHud false; _unit switchCamera "INTERNAL"; if (sunOrMoon isEqualTo 0) then { - _unit action ["nvGogglesOff", _unit]; + _unit action ["nvGogglesOff", _unit]; }; // remove medic euqipment from unconscious unit @@ -51,7 +51,7 @@ if (sunOrMoon isEqualTo 0) then { // disable radios if (AIS_TOGGLE_RADIO) then { - [false] call AIS_Effects_fnc_toggleRadio; + [false] call AIS_Effects_fnc_toggleRadio; }; // random screaming @@ -60,13 +60,13 @@ if (AIS_TOGGLE_RADIO) then { // set unit as captive [_unit, true] remoteExec ["setCaptive", 0, false]; _unit addEventHandler ["fired", { - private _shooter = _this select 0; - [_shooter, false] remoteExec ["setCaptive", 0, false]; + private _shooter = _this select 0; + [_shooter, false] remoteExec ["setCaptive", 0, false]; }]; // value >= 0.5 break the crawl-feature from agony action! (canMove false) if ((_unit getHitIndex 10) > 0.49) then { - [{(_this select 0) setHitIndex [10, 0.49]}, [_unit]] call AIS_Core_fnc_onNextFrame; + [{(_this select 0) setHitIndex [10, 0.49]}, [_unit]] call AIS_Core_fnc_onNextFrame; }; // countdown and visual effects @@ -77,8 +77,8 @@ _unit addEventHandler ["getOutMan", {_this call AIS_System_fnc_getOutMan}]; // disable teamSwitch while unc if (teamswitchenabled) then { - enableTeamswitch false; - ais_reenable_teamswitch = true; + enableTeamswitch false; + ais_reenable_teamswitch = true; }; true \ No newline at end of file diff --git a/source/AIS/System/fn_unloadInjured.sqf b/source/AIS/System/fn_unloadInjured.sqf index f4033c9..2c0e840 100644 --- a/source/AIS/System/fn_unloadInjured.sqf +++ b/source/AIS/System/fn_unloadInjured.sqf @@ -4,11 +4,11 @@ * Pull a injured out of a vehicle * Arguments: - 0: Unit (Object) - 1: Vehicle (Object) + 0: Unit (Object) + 1: Vehicle (Object) * Return value: - - + - */ params ["_unit", "_vehicle"]; @@ -17,8 +17,8 @@ params ["_unit", "_vehicle"]; private _crew = crew _vehicle; private _injured = objNull; { - if (_x getVariable ["ais_unconscious", false]) exitWith {_injured = _x}; - true + if (_x getVariable ["ais_unconscious", false]) exitWith {_injured = _x}; + true } count _crew; _injured setVariable ["ais_man_pullOut", true, true]; @@ -27,7 +27,7 @@ _injured setVariable ["ais_man_pullOut", true, true]; [[_injured, _vehicle, 0], {_this call AIS_System_fnc_moveCargoRemote}] remoteExec ["call"]; if (_injured call AIS_System_fnc_allowDrag) then { - [{[(_this select 0), (_this select 1)] call AIS_System_fnc_drag}, [_unit,_injured]] call AIS_Core_fnc_onNextFrame; + [{[(_this select 0), (_this select 1)] call AIS_System_fnc_drag}, [_unit,_injured]] call AIS_Core_fnc_onNextFrame; }; diff --git a/source/DUWS_CONFIG.sqf b/source/DUWS_CONFIG.sqf index e163ef9..5d19675 100644 --- a/source/DUWS_CONFIG.sqf +++ b/source/DUWS_CONFIG.sqf @@ -1,69 +1,69 @@ // DUWS-R Config -DUWS_Version = "0.7.0"; //Do not touch +DUWS_Version = "0.7.0"; //Do not touch // Blufor Faction -Blufor_Faction = "BLU_F"; +Blufor_Faction = "BLU_F"; // Blufor Soldiers -Blufor_Officer = "B_officer_F"; -Blufor_Squadleader = "B_Soldier_SL_F"; -Blufor_Teamleader = "B_Soldier_TL_F"; -Blufor_Medic = "B_medic_F"; -Blufor_Engineer = "B_engineer_F"; -Blufor_Rifleman = "B_Soldier_F"; -Blufor_Rifleman_Light = "B_Soldier_lite_F"; -Blufor_Rifleman_AT = "B_Soldier_LAT_F"; -Blufor_Marksman = "B_soldier_M_F"; -Blufor_Recon_Scout = "B_recon_F"; -Blufor_Grenadier = "B_Soldier_GL_F"; -Blufor_Autorifleman = "B_soldier_AR_F"; -Blufor_HeavyGunner = "B_HeavyGunner_F"; -Blufor_AT_Specialist = "B_soldier_AT_F"; -Blufor_AA_Specialist = "B_soldier_AA_F"; -Blufor_Pilot = "B_pilot_F"; -Blufor_Heli_Pilot = "B_Helipilot_F"; -Blufor_Crewman = "B_crew_F"; -Blufor_Repair_Specialist = "B_soldier_repair_F"; -Blufor_diver = "B_diver_F"; -Blufor_sniper = "B_sniper_F"; -Blufor_spotter = "B_spotter_F"; -Blufor_Explosive_Specialist = "B_soldier_exp_F"; +Blufor_Officer = "B_officer_F"; +Blufor_Squadleader = "B_Soldier_SL_F"; +Blufor_Teamleader = "B_Soldier_TL_F"; +Blufor_Medic = "B_medic_F"; +Blufor_Engineer = "B_engineer_F"; +Blufor_Rifleman = "B_Soldier_F"; +Blufor_Rifleman_Light = "B_Soldier_lite_F"; +Blufor_Rifleman_AT = "B_Soldier_LAT_F"; +Blufor_Marksman = "B_soldier_M_F"; +Blufor_Recon_Scout = "B_recon_F"; +Blufor_Grenadier = "B_Soldier_GL_F"; +Blufor_Autorifleman = "B_soldier_AR_F"; +Blufor_HeavyGunner = "B_HeavyGunner_F"; +Blufor_AT_Specialist = "B_soldier_AT_F"; +Blufor_AA_Specialist = "B_soldier_AA_F"; +Blufor_Pilot = "B_pilot_F"; +Blufor_Heli_Pilot = "B_Helipilot_F"; +Blufor_Crewman = "B_crew_F"; +Blufor_Repair_Specialist = "B_soldier_repair_F"; +Blufor_diver = "B_diver_F"; +Blufor_sniper = "B_sniper_F"; +Blufor_spotter = "B_spotter_F"; +Blufor_Explosive_Specialist = "B_soldier_exp_F"; // Blufor Purchasable Units // Format: ["classname", cost, SF Skill (optional boolean)] blufor_unit_array = [ - [Blufor_Rifleman, 2], - [Blufor_Grenadier, 3], - [Blufor_Autorifleman, 3], - [Blufor_Rifleman_AT, 3], - [Blufor_Medic, 4], - [Blufor_AA_Specialist, 4], - [Blufor_Repair_Specialist, 4], - [Blufor_AT_Specialist, 4], - [Blufor_diver, 3, true], - [Blufor_Marksman, 3], - [Blufor_sniper, 4, true], - [Blufor_spotter, 3, true], - [Blufor_Explosive_Specialist, 4] + [Blufor_Rifleman, 2], + [Blufor_Grenadier, 3], + [Blufor_Autorifleman, 3], + [Blufor_Rifleman_AT, 3], + [Blufor_Medic, 4], + [Blufor_AA_Specialist, 4], + [Blufor_Repair_Specialist, 4], + [Blufor_AT_Specialist, 4], + [Blufor_diver, 3, true], + [Blufor_Marksman, 3], + [Blufor_sniper, 4, true], + [Blufor_spotter, 3, true], + [Blufor_Explosive_Specialist, 4] ]; // Blufor Purchasable Groups // Format [cost, cfgGroups entry, SF Skill (optional boolean)] blufor_cfgGroup_array = [ - [8, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam")], - [16, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfSquad")], - [18, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfSquad_Weapons")], - [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam_AT")], - [15, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam_AA")], - [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_ReconPatrol"), true], - [20, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_ReconSquad"), true], - [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "SpecOps" >> "BUS_DiverTeam"), true], - [8, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_SniperTeam"), true], - [10, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Support" >> "BUS_Support_CLS")], - [28, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Motorized" >> "BUS_MotInf_Team")], - [46, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Mechanized" >> "BUS_MechInfSquad")] + [8, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam")], + [16, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfSquad")], + [18, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfSquad_Weapons")], + [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam_AT")], + [15, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam_AA")], + [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_ReconPatrol"), true], + [20, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_ReconSquad"), true], + [12, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "SpecOps" >> "BUS_DiverTeam"), true], + [8, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_SniperTeam"), true], + [10, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Support" >> "BUS_Support_CLS")], + [28, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Motorized" >> "BUS_MotInf_Team")], + [46, (configfile >> "CfgGroups" >> "West" >> "BLU_F" >> "Mechanized" >> "BUS_MechInfSquad")] ]; // Blufor Vehicles @@ -85,95 +85,95 @@ Blufor_Taxi_Helo = "B_Heli_Transport_01_camo_F"; // For more info, see https://community.bistudio.com/wiki/addItemCargo Blufor_Ammobox_Contents = [ - ["30Rnd_65x39_caseless_mag", 70], - ["30Rnd_65x39_caseless_mag_Tracer", 70], - ["100Rnd_65x39_caseless_mag", 70], - ["100Rnd_65x39_caseless_mag_tracer", 70], - ["1Rnd_HE_Grenade_shell", 90], - ["UGL_FlareRed_F", 70], - ["UGL_FlareGreen_F", 70], - ["1Rnd_Smoke_Grenade_shell", 70], - ["1Rnd_SmokeRed_Grenade_shell", 70], - ["1Rnd_SmokeBlue_Grenade_shell", 70], - ["NLAW_F", 70], - ["Chemlight_green", 70] + ["30Rnd_65x39_caseless_mag", 70], + ["30Rnd_65x39_caseless_mag_Tracer", 70], + ["100Rnd_65x39_caseless_mag", 70], + ["100Rnd_65x39_caseless_mag_tracer", 70], + ["1Rnd_HE_Grenade_shell", 90], + ["UGL_FlareRed_F", 70], + ["UGL_FlareGreen_F", 70], + ["1Rnd_Smoke_Grenade_shell", 70], + ["1Rnd_SmokeRed_Grenade_shell", 70], + ["1Rnd_SmokeBlue_Grenade_shell", 70], + ["NLAW_F", 70], + ["Chemlight_green", 70] ]; // Blufor Purchasable Vehicles // Format: ["vehicle", cost] blufor_vehicle_array = [ - [5, "B_LSV_01_unarmed_F"], - [13, "B_LSV_01_armed_F"], - [16,"B_LSV_01_AT_F"], - [5, "B_MRAP_01_F"], - [18, "B_MRAP_01_hmg_F"], - [25, "B_MRAP_01_gmg_F"], - [35, "B_APC_Wheeled_01_cannon_F"], - [8, "B_Truck_01_covered_F"], - [25, "B_Heli_Light_01_armed_F"], - [45, "B_Heli_Attack_01_F"], - [15, "B_Heli_Light_01_F"], - [12, "B_Heli_Transport_01_F"], - [26, "B_Heli_Transport_03_F"], - [25, "B_APC_Tracked_01_rcws_F"], - [1, "B_Quadbike_01_F"], - [30, "B_APC_Tracked_01_AA_F"], - [40, "B_MBT_01_cannon_F"], - [28, "B_APC_Tracked_01_CRV_F"], - [75, "B_MBT_01_mlrs_F"], - [75, "B_MBT_01_arty_F"], - [45, "B_Plane_CAS_01_F"], - [34, "B_MBT_01_cannon_F"], - [40, "B_MBT_01_TUSK_F"], - [20, "B_UGV_01_rcws_F"], - [15, "B_UAV_02_F"], - [15, "B_UAV_02_CAS_F"], - [60, "B_T_UAV_03_F"], - [40, "B_T_VTOL_01_infantry_F"], - [45, "B_T_VTOL_01_vehicle_F"], - [60, "B_T_VTOL_01_armed_F"], - [50, "B_Plane_Fighter_01_F"], - [60, "B_Plane_Fighter_01_Stealth_F"], - [38, "B_AFV_Wheeled_01_cannon_F"], - [42, "B_AFV_Wheeled_01_up_cannon_F"] + [5, "B_LSV_01_unarmed_F"], + [13, "B_LSV_01_armed_F"], + [16,"B_LSV_01_AT_F"], + [5, "B_MRAP_01_F"], + [18, "B_MRAP_01_hmg_F"], + [25, "B_MRAP_01_gmg_F"], + [35, "B_APC_Wheeled_01_cannon_F"], + [8, "B_Truck_01_covered_F"], + [25, "B_Heli_Light_01_armed_F"], + [45, "B_Heli_Attack_01_F"], + [15, "B_Heli_Light_01_F"], + [12, "B_Heli_Transport_01_F"], + [26, "B_Heli_Transport_03_F"], + [25, "B_APC_Tracked_01_rcws_F"], + [1, "B_Quadbike_01_F"], + [30, "B_APC_Tracked_01_AA_F"], + [40, "B_MBT_01_cannon_F"], + [28, "B_APC_Tracked_01_CRV_F"], + [75, "B_MBT_01_mlrs_F"], + [75, "B_MBT_01_arty_F"], + [45, "B_Plane_CAS_01_F"], + [34, "B_MBT_01_cannon_F"], + [40, "B_MBT_01_TUSK_F"], + [20, "B_UGV_01_rcws_F"], + [15, "B_UAV_02_F"], + [15, "B_UAV_02_CAS_F"], + [60, "B_T_UAV_03_F"], + [40, "B_T_VTOL_01_infantry_F"], + [45, "B_T_VTOL_01_vehicle_F"], + [60, "B_T_VTOL_01_armed_F"], + [50, "B_Plane_Fighter_01_F"], + [60, "B_Plane_Fighter_01_Stealth_F"], + [38, "B_AFV_Wheeled_01_cannon_F"], + [42, "B_AFV_Wheeled_01_up_cannon_F"] ]; // Opfor Faction -Opfor_Faction = "OPF_F"; +Opfor_Faction = "OPF_F"; // Opfor Soldiers -Opfor_Officer = "O_officer_F"; -Opfor_Squadleader = "O_Soldier_SL_F"; -Opfor_Teamleader = "O_Soldier_TL_F"; -Opfor_Medic = "O_medic_F"; -Opfor_Rifleman = "O_Soldier_F"; -Opfor_Rifleman_Light = "O_Soldier_lite_F"; -Opfor_Rifleman_AT = "O_Soldier_LAT_F"; -Opfor_Marksman = "O_soldier_M_F"; -Opfor_Grenadier = "O_Soldier_GL_F"; -Opfor_Autorifleman = "O_Soldier_AR_F"; -Opfor_HeavyGunner = "O_HeavyGunner_F"; -Opfor_AT_Specialist = "O_Soldier_AT_F"; -Opfor_AA_Specialist = "O_Soldier_AA_F"; -Opfor_Pilot = "O_Pilot_F"; -Opfor_Heli_Pilot = "O_helipilot_F"; -Opfor_Crewman = "O_crew_F"; +Opfor_Officer = "O_officer_F"; +Opfor_Squadleader = "O_Soldier_SL_F"; +Opfor_Teamleader = "O_Soldier_TL_F"; +Opfor_Medic = "O_medic_F"; +Opfor_Rifleman = "O_Soldier_F"; +Opfor_Rifleman_Light = "O_Soldier_lite_F"; +Opfor_Rifleman_AT = "O_Soldier_LAT_F"; +Opfor_Marksman = "O_soldier_M_F"; +Opfor_Grenadier = "O_Soldier_GL_F"; +Opfor_Autorifleman = "O_Soldier_AR_F"; +Opfor_HeavyGunner = "O_HeavyGunner_F"; +Opfor_AT_Specialist = "O_Soldier_AT_F"; +Opfor_AA_Specialist = "O_Soldier_AA_F"; +Opfor_Pilot = "O_Pilot_F"; +Opfor_Heli_Pilot = "O_helipilot_F"; +Opfor_Crewman = "O_crew_F"; // Opfor Vehicles (Used for objectives) -Opfor_Flag = "Flag_CSAT_F"; -Opfor_Supplycrate = "O_supplyCrate_F"; -Opfor_Quadbike = "O_Quadbike_01_F"; -Opfor_Truck_Covered = "O_Truck_02_covered_F"; -Opfor_Truck_Open = "O_TrucK_02_transport_F"; -Opfor_MRAP = "O_MRAP_02_F"; +Opfor_Flag = "Flag_CSAT_F"; +Opfor_Supplycrate = "O_supplyCrate_F"; +Opfor_Quadbike = "O_Quadbike_01_F"; +Opfor_Truck_Covered = "O_Truck_02_covered_F"; +Opfor_Truck_Open = "O_TrucK_02_transport_F"; +Opfor_MRAP = "O_MRAP_02_F"; // Opfor Groups -Opfor_WARCOM_Fireteam = (configFile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfTeam"); -Opfor_WARCOM_Infantry_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad"); -Opfor_WARCOM_Weapons_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad_Weapons"); -Opfor_WARCOM_Mech_Inf_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInfSquad"); -Opfor_WARCOM_Mech_Wpn_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInf_AT"); +Opfor_WARCOM_Fireteam = (configFile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfTeam"); +Opfor_WARCOM_Infantry_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad"); +Opfor_WARCOM_Weapons_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Infantry" >> "OIA_InfSquad_Weapons"); +Opfor_WARCOM_Mech_Inf_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInfSquad"); +Opfor_WARCOM_Mech_Wpn_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInf_AT"); ///////Special Operatives/////// duws_operator_list=[ diff --git a/source/description.ext b/source/description.ext index f4d9c95..e771f3a 100644 --- a/source/description.ext +++ b/source/description.ext @@ -34,6 +34,6 @@ disabledAI = 1; #include "taw_vd\GUI.h" /*class CfgFunctions { - #include "taw_vd\CfgFunctions.hpp" + #include "taw_vd\CfgFunctions.hpp" };*/ // TAW INIT END -- diff --git a/source/functions/WARCOM/fn_WARCOM_blu_assault.sqf b/source/functions/WARCOM/fn_WARCOM_blu_assault.sqf index ced1d51..9bc9b98 100644 --- a/source/functions/WARCOM/fn_WARCOM_blu_assault.sqf +++ b/source/functions/WARCOM/fn_WARCOM_blu_assault.sqf @@ -6,7 +6,7 @@ WARCOM_blu_attack_wave_avalaible = false; // Type of attack wave [] spawn { //WARCOM_blu_attack_wave_type = [Blufor_Teamleader,Blufor_Rifleman]; - diag_log format ["WARCOM_blufor_ap_assault: %1", WARCOM_blufor_ap]; + diag_log format ["WARCOM_blufor_ap_assault: %1", WARCOM_blufor_ap]; waitUntil {sleep 1; WARCOM_blufor_ap>=10}; [West,"HQ"] sidechat "This is HQ, BLUFOR troops just arrived on the island, we'll soon be able to push through the enemy lines"; WARCOM_blu_attack_wave_avalaible = true; diff --git a/source/functions/WARCOM/fn_WARCOM_blu_patrol.sqf b/source/functions/WARCOM/fn_WARCOM_blu_patrol.sqf index a875b90..2123da1 100644 --- a/source/functions/WARCOM/fn_WARCOM_blu_patrol.sqf +++ b/source/functions/WARCOM/fn_WARCOM_blu_patrol.sqf @@ -5,7 +5,7 @@ diag_log format ["WARCOM_blufor_ap_patrol: %1", WARCOM_blufor_ap]; // Type of attack wave [] spawn { - diag_log "spawn1"; + diag_log "spawn1"; WARCOM_blu_patrol_type = (configFile >> "CfgGroups" >> "West" >> "BLU_F" >> "Infantry" >> "BUS_InfTeam"); waitUntil {sleep 1; WARCOM_blufor_ap>40}; @@ -37,38 +37,38 @@ diag_log format ["WARCOM_blufor_ap_patrol: %1", WARCOM_blufor_ap]; [] spawn { while {true} do { - if (count WARCOM_zones_controled_by_BLUFOR > 1) then { // make sure blufor is controlling at least 2 zones - sleep 2; - - // find a zone where to spawn OPF wave *** BEGIN - _found = false; - _randomZone = []; - _failSafe = 0; - while {!_found} do { - _randomZone = WARCOM_zones_controled_by_BLUFOR call BIS_fnc_selectRandom; - if (_randomZone distance player > 2000) then {_found=true;}; - sleep 0.2; - // player sidechat format["Failsafe: %1",_failsafe]; - _failSafe = _failSafe + 1; - if (_failsafe > 10) then {sleep 300; _failsafe = 0;} - }; - // find a zone *** end - _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; - _group = [_randomZone, WEST, WARCOM_blu_patrol_type,[],[],WARCOM_blu_ai_skill_range] call BIS_fnc_spawnGroup; - [_group] call duws_fnc_WARCOM_wp_blu_patrol; -// [_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; - - // spawn armored - if (WARCOM_blufor_ap>50) then { - ["BLU_F","armored",_randomZone] spawn duws_fnc_random_veh_blu_patrol ; - }; - - if (WARCOM_blufor_ap>200) then { - ["BLU_F","air",_randomZone] spawn duws_fnc_random_veh_blu_patrol ; - }; - - }; - sleep (random 1200); // patrol delay + if (count WARCOM_zones_controled_by_BLUFOR > 1) then { // make sure blufor is controlling at least 2 zones + sleep 2; + + // find a zone where to spawn OPF wave *** BEGIN + _found = false; + _randomZone = []; + _failSafe = 0; + while {!_found} do { + _randomZone = WARCOM_zones_controled_by_BLUFOR call BIS_fnc_selectRandom; + if (_randomZone distance player > 2000) then {_found=true;}; + sleep 0.2; + // player sidechat format["Failsafe: %1",_failsafe]; + _failSafe = _failSafe + 1; + if (_failsafe > 10) then {sleep 300; _failsafe = 0;} + }; + // find a zone *** end + _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; + _group = [_randomZone, WEST, WARCOM_blu_patrol_type,[],[],WARCOM_blu_ai_skill_range] call BIS_fnc_spawnGroup; + [_group] call duws_fnc_WARCOM_wp_blu_patrol; +// [_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; + + // spawn armored + if (WARCOM_blufor_ap>50) then { + ["BLU_F","armored",_randomZone] spawn duws_fnc_random_veh_blu_patrol ; + }; + + if (WARCOM_blufor_ap>200) then { + ["BLU_F","air",_randomZone] spawn duws_fnc_random_veh_blu_patrol ; + }; + + }; + sleep (random 1200); // patrol delay }; }; diff --git a/source/functions/WARCOM/fn_WARCOM_opf_patrol.sqf b/source/functions/WARCOM/fn_WARCOM_opf_patrol.sqf index 9e949c9..1c6d92d 100644 --- a/source/functions/WARCOM/fn_WARCOM_opf_patrol.sqf +++ b/source/functions/WARCOM/fn_WARCOM_opf_patrol.sqf @@ -35,37 +35,37 @@ WARCOM_opf_patrol_type = ""; [] spawn { while {true} do { - if (count WARCOM_zones_controled_by_OPFOR > 1) then { // make sure opfor is controlling at least 2 zones - sleep 2; - - // find a zone where to spawn OPF wave *** BEGIN - _found = false; - _randomZone = []; - _failSafe = 0; - while {!_found} do { - _randomZone = WARCOM_zones_controled_by_OPFOR call BIS_fnc_selectRandom; - if (_randomZone distance player > 2000) then {_found=true;}; - sleep 0.2; - // player sidechat format["Failsafe: %1",_failsafe]; - _failSafe = _failSafe + 1; - if (_failsafe > 10) then {sleep 300; _failsafe = 0;} - }; - // find a zone *** end - _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; - _group = [_randomZone, EAST, WARCOM_opf_patrol_type,[],[],WARCOM_opf_ai_skill_range] call BIS_fnc_spawnGroup; - [_group] call duws_fnc_WARCOM_wp_opf_patrol; -// [_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; - - // spawn armored - if (WARCOM_opfor_ap>50) then { - [opfor_Faction,"armored",_randomZone] spawn duws_fnc_random_veh_opf_patrol ; - }; - - if (WARCOM_opfor_ap>200) then { - [opfor_Faction,"air",_randomZone] spawn duws_fnc_random_veh_opf_patrol ; - }; - - }; - sleep (random 1200); // patrol delay + if (count WARCOM_zones_controled_by_OPFOR > 1) then { // make sure opfor is controlling at least 2 zones + sleep 2; + + // find a zone where to spawn OPF wave *** BEGIN + _found = false; + _randomZone = []; + _failSafe = 0; + while {!_found} do { + _randomZone = WARCOM_zones_controled_by_OPFOR call BIS_fnc_selectRandom; + if (_randomZone distance player > 2000) then {_found=true;}; + sleep 0.2; + // player sidechat format["Failsafe: %1",_failsafe]; + _failSafe = _failSafe + 1; + if (_failsafe > 10) then {sleep 300; _failsafe = 0;} + }; + // find a zone *** end + _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; + _group = [_randomZone, EAST, WARCOM_opf_patrol_type,[],[],WARCOM_opf_ai_skill_range] call BIS_fnc_spawnGroup; + [_group] call duws_fnc_WARCOM_wp_opf_patrol; +// [_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; + + // spawn armored + if (WARCOM_opfor_ap>50) then { + [opfor_Faction,"armored",_randomZone] spawn duws_fnc_random_veh_opf_patrol ; + }; + + if (WARCOM_opfor_ap>200) then { + [opfor_Faction,"air",_randomZone] spawn duws_fnc_random_veh_opf_patrol ; + }; + + }; + sleep (random 1200); // patrol delay }; }; diff --git a/source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf b/source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf index 8e6a1a3..3bbed8a 100644 --- a/source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf +++ b/source/functions/WARCOM/fn_WARCOM_opf_qrf.sqf @@ -7,30 +7,30 @@ _unitPos = getpos _attachedUnit; // Attack waves main if (count WARCOM_zones_controled_by_OPFOR > 0) then { // make sure opfor is controlling at least 1 zones - sleep 2; - - // find a zone where to spawn OPF wave away from player *** BEGIN - _found = false; - _randomZone = []; - _failSafe = 0; - while {!_found} do { - _randomZone = WARCOM_zones_controled_by_OPFOR call BIS_fnc_selectRandom; - if (_randomZone distance player > 2000) then {_found=true;}; - sleep 0.2; - //player sidechat format["Failsafe: %1",_failsafe]; - _failSafe = _failSafe + 1; - if (_failsafe > 10) then - { - sleep 300; - _failsafe = 0; - }; - }; - // find a zone *** end - _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; - _group = [_randomZone, EAST, WARCOM_opf_patrol_type,[],[],WARCOM_opf_ai_skill_range] call BIS_fnc_spawnGroup; - [_group,_unitPos] call duws_fnc_WARCOM_wp_opf_qrf; - //[_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; -}; + sleep 2; + + // find a zone where to spawn OPF wave away from player *** BEGIN + _found = false; + _randomZone = []; + _failSafe = 0; + while {!_found} do { + _randomZone = WARCOM_zones_controled_by_OPFOR call BIS_fnc_selectRandom; + if (_randomZone distance player > 2000) then {_found=true;}; + sleep 0.2; + //player sidechat format["Failsafe: %1",_failsafe]; + _failSafe = _failSafe + 1; + if (_failsafe > 10) then + { + sleep 300; + _failsafe = 0; + }; + }; + // find a zone *** end + _randomZone = [(_randomZone select 0)+40,_randomZone select 1]; + _group = [_randomZone, EAST, WARCOM_opf_patrol_type,[],[],WARCOM_opf_ai_skill_range] call BIS_fnc_spawnGroup; + [_group,_unitPos] call duws_fnc_WARCOM_wp_opf_qrf; + //[_group,"derp"] spawn duws_fnc_WARCOM_gps_marker; +}; diff --git a/source/functions/WARCOM/fn_WARCOM_wp.sqf b/source/functions/WARCOM/fn_WARCOM_wp.sqf index 4496d43..3ce724c 100644 --- a/source/functions/WARCOM/fn_WARCOM_wp.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp.sqf @@ -5,8 +5,8 @@ _group setCombatMode "RED"; { _wp = _group addWaypoint [_x, 0]; _wp setWaypointType "SAD"; - _wp setWaypointCompletionRadius 40; - _wp setWaypointTimeout [300, 450, 600]; + _wp setWaypointCompletionRadius 40; + _wp setWaypointTimeout [300, 450, 600]; } forEach WARCOM_createdZones; diff --git a/source/functions/WARCOM/fn_WARCOM_wp_blu_patrol.sqf b/source/functions/WARCOM/fn_WARCOM_wp_blu_patrol.sqf index 6ddffce..29f1064 100644 --- a/source/functions/WARCOM/fn_WARCOM_wp_blu_patrol.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp_blu_patrol.sqf @@ -6,14 +6,14 @@ _group setCombatMode "RED"; { _wp = _group addWaypoint [_x, 0]; _wp setWaypointType "MOVE"; - _wp setWaypointBehaviour "SAFE"; - _wp setWaypointSpeed "LIMITED"; - _wp setWaypointCompletionRadius 40; - _wp setWaypointTimeout [300, 450, 600]; + _wp setWaypointBehaviour "SAFE"; + _wp setWaypointSpeed "LIMITED"; + _wp setWaypointCompletionRadius 40; + _wp setWaypointTimeout [300, 450, 600]; } forEach WARCOM_zones_controled_by_BLUFOR; _wp1 = _group addWaypoint [getpos leader _group, 0]; _wp1 setWaypointType "CYCLE"; - _wp1 setWaypointBehaviour "SAFE"; - _wp1 setWaypointSpeed "LIMITED"; + _wp1 setWaypointBehaviour "SAFE"; + _wp1 setWaypointSpeed "LIMITED"; diff --git a/source/functions/WARCOM/fn_WARCOM_wp_opf.sqf b/source/functions/WARCOM/fn_WARCOM_wp_opf.sqf index 0e1ad68..ec74e8a 100644 --- a/source/functions/WARCOM/fn_WARCOM_wp_opf.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp_opf.sqf @@ -14,8 +14,8 @@ if (count WARCOM_zones_controled_by_BLUFOR == 0) exitWith { { _wp = _group addWaypoint [_x, 0]; _wp setWaypointType "SAD"; - _wp setWaypointCompletionRadius 40; - _wp setWaypointTimeout [300, 450, 600]; + _wp setWaypointCompletionRadius 40; + _wp setWaypointTimeout [300, 450, 600]; } forEach WARCOM_zones_controled_by_BLUFOR; diff --git a/source/functions/WARCOM/fn_WARCOM_wp_opf_patrol.sqf b/source/functions/WARCOM/fn_WARCOM_wp_opf_patrol.sqf index 7f7021c..9909245 100644 --- a/source/functions/WARCOM/fn_WARCOM_wp_opf_patrol.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp_opf_patrol.sqf @@ -6,14 +6,14 @@ _group setCombatMode "RED"; { _wp = _group addWaypoint [_x, 0]; _wp setWaypointType "MOVE"; - _wp setWaypointBehaviour "SAFE"; - _wp setWaypointSpeed "LIMITED"; - _wp setWaypointCompletionRadius 40; - _wp setWaypointTimeout [300, 450, 600]; + _wp setWaypointBehaviour "SAFE"; + _wp setWaypointSpeed "LIMITED"; + _wp setWaypointCompletionRadius 40; + _wp setWaypointTimeout [300, 450, 600]; } forEach WARCOM_zones_controled_by_OPFOR; _wp1 = _group addWaypoint [getpos leader _group, 0]; _wp1 setWaypointType "CYCLE"; - _wp1 setWaypointBehaviour "SAFE"; - _wp1 setWaypointSpeed "LIMITED"; + _wp1 setWaypointBehaviour "SAFE"; + _wp1 setWaypointSpeed "LIMITED"; diff --git a/source/functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf b/source/functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf index 9589b39..7c4e5f8 100644 --- a/source/functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf +++ b/source/functions/WARCOM/fn_WARCOM_wp_opf_qrf.sqf @@ -4,8 +4,8 @@ _group setCombatMode "RED"; _wp = _group addWaypoint [_unitPos, 0]; _wp setWaypointType "SAD"; - _wp setWaypointCompletionRadius 40; - _wp setWaypointTimeout [300, 450, 600]; + _wp setWaypointCompletionRadius 40; + _wp setWaypointTimeout [300, 450, 600]; diff --git a/source/functions/generic/fn_dyn_music_init.sqf b/source/functions/generic/fn_dyn_music_init.sqf index ad83d1b..0cf6d31 100644 --- a/source/functions/generic/fn_dyn_music_init.sqf +++ b/source/functions/generic/fn_dyn_music_init.sqf @@ -14,16 +14,16 @@ deleteVehicle _trg; if (!_enemypresent) then { - player addEventHandler ["FiredNear", {[] spawn DUWS_dynmusic_firednear}]; - } + player addEventHandler ["FiredNear", {[] spawn DUWS_dynmusic_firednear}]; + } else - { + { - _random_music = DUWS_dynmusic_firednear_list call BIS_fnc_selectRandom; - playmusic _random_music; + _random_music = DUWS_dynmusic_firednear_list call BIS_fnc_selectRandom; + playmusic _random_music; - sleep 300; - player addEventHandler ["FiredNear", {[] spawn DUWS_dynmusic_firednear}]; - }; + sleep 300; + player addEventHandler ["FiredNear", {[] spawn DUWS_dynmusic_firednear}]; + }; }; diff --git a/source/functions/generic/fn_dynamic_menu.sqf b/source/functions/generic/fn_dynamic_menu.sqf index dfc150e..b3e35e8 100644 --- a/source/functions/generic/fn_dynamic_menu.sqf +++ b/source/functions/generic/fn_dynamic_menu.sqf @@ -155,8 +155,8 @@ call _myCode; //Construct and show Support Menu root supportMenu = [ - ["Support Menu",false], - ["Offensive", [2], "#USER:offensive_SubMenu", -5, [["expression", ""]], "1", "1"], + ["Support Menu",false], + ["Offensive", [2], "#USER:offensive_SubMenu", -5, [["expression", ""]], "1", "1"], ["Logistics", [3], "#USER:logistic_SubMenu", -5, [["expression", ""]], "1", "1"], ["Transport", [4], "#USER:transport_SubMenu", -5, [["expression", ""]], "1", "1"] ]; diff --git a/source/functions/generic/fn_random_veh.sqf b/source/functions/generic/fn_random_veh.sqf index 1fd42cf..817bdb6 100644 --- a/source/functions/generic/fn_random_veh.sqf +++ b/source/functions/generic/fn_random_veh.sqf @@ -24,7 +24,7 @@ while {!_found} do { _actual_faction = getText (_checked_veh >> "faction"); _scope = getNumber (_checked_veh >> "scope"); // check if actually present in editor _simulation_paracheck = getText (_checked_veh >> "simulation"); // check if not a parachute - _artilleryScanner = getNumber (_checked_veh >> "artilleryScanner"); //Check if it is an artillery unit + _artilleryScanner = getNumber (_checked_veh >> "artilleryScanner"); //Check if it is an artillery unit if (_actual_vehclass == _vehClass && _actual_faction == _faction diff --git a/source/functions/generic/fn_repetitive_cleanup.sqf b/source/functions/generic/fn_repetitive_cleanup.sqf index e7a2d14..a069502 100644 --- a/source/functions/generic/fn_repetitive_cleanup.sqf +++ b/source/functions/generic/fn_repetitive_cleanup.sqf @@ -17,8 +17,8 @@ 10*60, // seconds to deleted planted explosives (0 means don't delete) 0 // seconds to delete dropped smokes/chemlights (0 means don't delete) ] execVM 'repetitive_cleanup.sqf'; - - //NOTE! This has been turned into a function. Use spawn duws_fnc_repetitive_cleanup + + //NOTE! This has been turned into a function. Use spawn duws_fnc_repetitive_cleanup will delete dead bodies after 60 seconds (1 minute) will delete dead vehicles after 5*60 seconds (5 minutes) diff --git a/source/functions/generic/fn_request.sqf b/source/functions/generic/fn_request.sqf index e84a80f..2bb3c5b 100644 --- a/source/functions/generic/fn_request.sqf +++ b/source/functions/generic/fn_request.sqf @@ -15,15 +15,15 @@ _index = lbAdd [2100, "Repair Specialist(4CP)"]; // 6 _index = lbAdd [2100, "AT Specialist(4CP)"]; // 7 _index = lbAdd [2100, "SF Diver(3CP)"]; // 8 _index = lbAdd [2100, "Marksman(3CP)"]; // 9 -_index = lbAdd [2100, "Sniper(4CP)"]; // 10 +_index = lbAdd [2100, "Sniper(4CP)"]; // 10 _index = lbAdd [2100, "Spotter(3CP)"]; // 11 _index = lbAdd [2100, "Explosive specialist(4CP)"]; // 12*/ { - _unit = _x select 0; - _cost = _x select 1; - _displayName = getText (configfile >> "CfgVehicles" >> _unit >> "displayName"); - lbAdd [2100, format ["%1 (%2 CP)",_displayName,_cost]]; + _unit = _x select 0; + _cost = _x select 1; + _displayName = getText (configfile >> "CfgVehicles" >> _unit >> "displayName"); + lbAdd [2100, format ["%1 (%2 CP)",_displayName,_cost]]; } forEach blufor_unit_array; lbSetCurSel [2100, 0]; @@ -42,10 +42,10 @@ _index0 = lbAdd [2101, "Medical Team(10CP)"]; // 9 _index0 = lbAdd [2101, "Motorized scouts(28CP)"]; // 10 _index0 = lbAdd [2101, "Mechanized squad(46CP)"]; // 11*/ { - _cfgGroup = _x select 1; - _cost = _x select 0; - _displayName = [_cfgGroup, "name"] call BIS_fnc_returnConfigEntry; - lbAdd [2101, format ["%1 (%2 CP)",_displayName,_cost]]; + _cfgGroup = _x select 1; + _cost = _x select 0; + _displayName = [_cfgGroup, "name"] call BIS_fnc_returnConfigEntry; + lbAdd [2101, format ["%1 (%2 CP)",_displayName,_cost]]; } forEach blufor_cfgGroup_array; lbSetCurSel [2101, 0]; @@ -92,10 +92,10 @@ _index1 = lbAdd [2102, "Black Wasp II (Stealth) (60CP)"]; // 3 _index1 = lbAdd [2102, "Rhino MGS (40CP)"]; // 38 _index1 = lbAdd [2102, "Rhino MGS UP (42CP)"]; // 39*/ { - _vehicle = _x select 1; - _cost = _x select 0; - _displayName = getText (configfile >> "CfgVehicles" >> _vehicle >> "displayName"); - lbAdd [2102, format ["%1 (%2 CP)",_displayName,_cost]]; + _vehicle = _x select 1; + _cost = _x select 0; + _displayName = getText (configfile >> "CfgVehicles" >> _vehicle >> "displayName"); + lbAdd [2102, format ["%1 (%2 CP)",_displayName,_cost]]; } forEach blufor_vehicle_array; lbSetCurSel [2102, 0]; diff --git a/source/functions/initHQ/fn_commanderAnim.sqf b/source/functions/initHQ/fn_commanderAnim.sqf index 0e64cb5..707574f 100644 --- a/source/functions/initHQ/fn_commanderAnim.sqf +++ b/source/functions/initHQ/fn_commanderAnim.sqf @@ -1,6 +1,6 @@ params ["_unit"]; private _animations = ["HubBriefing_lookAround1","HubBriefing_lookAround2","HubBriefing_scratch","HubBriefing_stretch","HubBriefing_talkAround","HubBriefing_think"]; while {alive _unit} do { - _unit switchMove selectRandom _animations; - sleep 15; + _unit switchMove selectRandom _animations; + sleep 15; }; \ No newline at end of file diff --git a/source/functions/initHQ/fn_drawIcon.sqf b/source/functions/initHQ/fn_drawIcon.sqf index 004526d..56667ef 100644 --- a/source/functions/initHQ/fn_drawIcon.sqf +++ b/source/functions/initHQ/fn_drawIcon.sqf @@ -3,7 +3,7 @@ while {alive hq_blu1} do { waitUntil {sleep 2; player distance hq_blu1 < 15}; _addStackedEHfnc = ["draw_hq_icon", "onEachFrame", "duws_fnc_drawIconFnc"] call BIS_fnc_addStackedEventHandler; sleep 0.1; - + waitUntil {sleep 0.2; player distance hq_blu1 > 15}; _removeStackedEHfnc = [_addStackedEHfnc, "onEachFrame"] call BIS_fnc_removeStackedEventHandler; onEachFrame {}; diff --git a/source/functions/initHQ/fn_guards.sqf b/source/functions/initHQ/fn_guards.sqf index c0ad4ad..5ed8f09 100644 --- a/source/functions/initHQ/fn_guards.sqf +++ b/source/functions/initHQ/fn_guards.sqf @@ -36,16 +36,16 @@ _wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-10, (_centerPos select 1)+10], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; - +_wp setWaypointSpeed "LIMITED"; + _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-10, (_centerPos select 1)-10], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; +_wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+10, (_centerPos select 1)-10], 0]; _wp setWaypointType "MOVE"; - + _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+10, (_centerPos select 1)+10], 0]; _wp setWaypointType "CYCLE"; _wp setWaypointBehaviour "SAFE"; diff --git a/source/functions/initHQ/fn_guardsFOB.sqf b/source/functions/initHQ/fn_guardsFOB.sqf index adcfe32..8d3d092 100644 --- a/source/functions/initHQ/fn_guardsFOB.sqf +++ b/source/functions/initHQ/fn_guardsFOB.sqf @@ -38,12 +38,12 @@ _wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-10, (_centerPos select 1)+10], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; +_wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-10, (_centerPos select 1)-10], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; +_wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+10, (_centerPos select 1)-10], 0]; _wp setWaypointType "MOVE"; diff --git a/source/functions/initHQ/fn_guardsHQ.sqf b/source/functions/initHQ/fn_guardsHQ.sqf index 84aff62..650b77a 100644 --- a/source/functions/initHQ/fn_guardsHQ.sqf +++ b/source/functions/initHQ/fn_guardsHQ.sqf @@ -12,16 +12,16 @@ _wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-40, (_centerPos select 1)+40], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; - +_wp setWaypointSpeed "LIMITED"; + _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-40, (_centerPos select 1)-40], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; +_wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+40, (_centerPos select 1)-40], 0]; _wp setWaypointType "MOVE"; - + _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+40, (_centerPos select 1)+40], 0]; _wp setWaypointType "CYCLE"; _wp setWaypointBehaviour "SAFE"; diff --git a/source/functions/initMission/fn_clientInit.sqf b/source/functions/initMission/fn_clientInit.sqf index 87ddb51..911433e 100644 --- a/source/functions/initMission/fn_clientInit.sqf +++ b/source/functions/initMission/fn_clientInit.sqf @@ -11,10 +11,10 @@ player allowDamage false; #include "..\..\includes\supports_init.hpp" #include "..\..\includes\squad_number_init.hpp" - + if (hasInterface) then {[] spawn duws_fnc_gps_marker;}; if (!isMultiplayer) then { - getsize_script = [player] spawn duws_fnc_mapsize; + getsize_script = [player] spawn duws_fnc_mapsize; }; staminaEnabled = ["Stamina", false] call BIS_fnc_getParamValue; if(staminaEnabled == 0) then { @@ -25,9 +25,9 @@ if(staminaEnabled == 0) then { // IF MP if (isMultiplayer) then { - // Get the variables from the parameters lobby - _revive_activated = ["Revive", 1] call BIS_fnc_getParamValue; - DUWSMP_CP_death_cost = ["DeathPenalty", 1] call BIS_fnc_getParamValue; + // Get the variables from the parameters lobby + _revive_activated = ["Revive", 1] call BIS_fnc_getParamValue; + DUWSMP_CP_death_cost = ["DeathPenalty", 1] call BIS_fnc_getParamValue; //staminaEnabled = ["Stamina", 0] call BIS_fnc_getParamValue; /*if(staminaEnabled == 0) then { @@ -43,7 +43,7 @@ if (isMultiplayer) then { } forEach (Array_of_FOBS); }; - PlayerKilledEH = player addEventHandler ["killed", { + PlayerKilledEH = player addEventHandler ["killed", { commandpointsblu1 = commandpointsblu1 - DUWSMP_CP_death_cost; publicVariable "commandpointsblu1"; }]; @@ -59,7 +59,7 @@ if (isMultiplayer) then { [0,_rating] select ((_playerRating - _rating) > 0); }]; - "support_specialized_training_available" addPublicVariableEventHandler {lbSetColor [2103, 11, [0, 1, 0, 1]];}; + "support_specialized_training_available" addPublicVariableEventHandler {lbSetColor [2103, 11, [0, 1, 0, 1]];}; "support_armory_available" addPublicVariableEventHandler { hq_blu1 addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; { @@ -71,71 +71,71 @@ if (isMultiplayer) then { // change the shown CP for request dialog "commandpointsblu1" addPublicVariableEventHandler {ctrlSetText [1000, format["%1",commandpointsblu1]]; }; - // each time there is a new FOB - "Array_of_FOBS" addPublicVariableEventHandler { + // each time there is a new FOB + "Array_of_FOBS" addPublicVariableEventHandler { if (!fobSwitch) then { [] spawn duws_fnc_FOBreceiveaction; }; - fobSwitch = false; - //Add the FoB to the list of revive locations. - _fobAmount = count Array_of_FOBS; - _fobIndex = _fobAmount - 1; - _createdFOB = Array_of_FOBS select _fobIndex; - - [missionNamespace, _createdFOB] call BIS_fnc_addRespawnPosition; - }; - - if (!isServer) then { + fobSwitch = false; + //Add the FoB to the list of revive locations. + _fobAmount = count Array_of_FOBS; + _fobIndex = _fobAmount - 1; + _createdFOB = Array_of_FOBS select _fobIndex; + + [missionNamespace, _createdFOB] call BIS_fnc_addRespawnPosition; + }; + + if (!isServer) then { "savegameNumber" addPublicVariableEventHandler {[] spawn duws_fnc_savegameClient}; - }; - if (!isServer) then { - "capturedZonesNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_zones_add;}; // change the shown CP for request dialog - }; - if (!isServer) then { - "finishedMissionsNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_missions_total;}; // change the shown CP for request dialog - }; - - player globalChat format ["gamemaster: %1", game_master]; - player globalChat format ["HQ_pos_found_generated: %1", HQ_pos_found_generated]; - - if (!isDedicated && !HQ_pos_found_generated) then { // SERVER INIT - if (((vehiclevarname player) in game_master)) then { - DUWS_host_start = false; - publicVariable "DUWS_host_start"; - waitUntil {time > 0.1}; - getsize_script = [player] spawn duws_fnc_mapsize; - DUWS_host_start = true; - publicVariable "DUWS_host_start"; - - // init High Command - [] call duws_fnc_hc_init; - waitUntil {scriptDone getsize_script}; - }; - }; + }; + if (!isServer) then { + "capturedZonesNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_zones_add;}; // change the shown CP for request dialog + }; + if (!isServer) then { + "finishedMissionsNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_missions_total;}; // change the shown CP for request dialog + }; + + player globalChat format ["gamemaster: %1", game_master]; + player globalChat format ["HQ_pos_found_generated: %1", HQ_pos_found_generated]; + + if (!isDedicated && !HQ_pos_found_generated) then { // SERVER INIT + if (((vehiclevarname player) in game_master)) then { + DUWS_host_start = false; + publicVariable "DUWS_host_start"; + waitUntil {time > 0.1}; + getsize_script = [player] spawn duws_fnc_mapsize; + DUWS_host_start = true; + publicVariable "DUWS_host_start"; + + // init High Command + [] call duws_fnc_hc_init; + waitUntil {scriptDone getsize_script}; + }; + }; }; if (!isDedicated && !HQ_pos_found_generated) then { - if (((vehiclevarname player) in game_master)) then { - [] spawn duws_fnc_placement; - waitUntil {chosen_hq_placement}; - player globalChat format ["hq_manually_placed: %1", hq_manually_placed]; - player globalChat format ["player_is_choosing_hqpos: %1", player_is_choosing_hqpos]; - // create random HQ - if (!hq_manually_placed && !player_is_choosing_hqpos) then { - player globalChat "lance recherche position..."; - hq_create = [20, 0.015] spawn duws_fnc_locatorhq; - waitUntil {scriptDone hq_create}; - }; - }; + if (((vehiclevarname player) in game_master)) then { + [] spawn duws_fnc_placement; + waitUntil {chosen_hq_placement}; + player globalChat format ["hq_manually_placed: %1", hq_manually_placed]; + player globalChat format ["player_is_choosing_hqpos: %1", player_is_choosing_hqpos]; + // create random HQ + if (!hq_manually_placed && !player_is_choosing_hqpos) then { + player globalChat "lance recherche position..."; + hq_create = [20, 0.015] spawn duws_fnc_locatorhq; + waitUntil {scriptDone hq_create}; + }; + }; }; - + /* //////// DEBUG LOOP ///////////// [] spawn { - while {true} do { - hintsilent format["OvercastVar: %1\nFogVar: %2",OvercastVar,FogVar]; - sleep 1; - }; + while {true} do { + hintsilent format["OvercastVar: %1\nFogVar: %2",OvercastVar,FogVar]; + sleep 1; + }; }; //////// DEBUG LOOP ///////////// */ @@ -158,26 +158,26 @@ if (isServer) then { if (hasInterface) then { // WHEN CLIENT CONNECTS INIT (might need sleep) waitUntil {isPlayer Player}; - hintsilent "Waiting for the host to find an HQ..."; + hintsilent "Waiting for the host to find an HQ..."; waitUntil {HQ_pos_found_generated && time > 0.1}; player setpos [(getpos hq_blu1 select 0),(getpos hq_blu1 select 1)+10]; _drawicon = [] spawn duws_fnc_drawIcon; - hintsilent "Waiting for the host to select the campaign parameters..."; - waitUntil {chosen_settings}; + hintsilent "Waiting for the host to select the campaign parameters..."; + waitUntil {chosen_settings}; [hq_blu1] call duws_fnc_HQaddactions; sleep 1; - player setdamage 0; + player setdamage 0; player allowDamage true; hintsilent format["Joined game, welcome to %1, %2",worldName,profileName]; // init High Command [] call duws_fnc_hc_init; [] spawn duws_fnc_weather_client; - - // process purchasable units - [] call duws_fnc_processUnitConfig; - [] call duws_fnc_processVehicleConfig; - [] call duws_fnc_processGroupConfig; + + // process purchasable units + [] call duws_fnc_processUnitConfig; + [] call duws_fnc_processVehicleConfig; + [] call duws_fnc_processGroupConfig; if(!staminaEnabled) then { player enableStamina false; @@ -217,10 +217,10 @@ if (isMultiplayer) then { // MP notification if (isMultiplayer) then { - [] spawn { - waitUntil {time > 5}; - ["info",["MP Mechanics","Check the manual for the specifics of the DUWS-R in MP"]] call bis_fnc_showNotification; - }; + [] spawn { + waitUntil {time > 5}; + ["info",["MP Mechanics","Check the manual for the specifics of the DUWS-R in MP"]] call bis_fnc_showNotification; + }; }; // create mission victory script //SPAWN BEGIN @@ -280,10 +280,10 @@ _dynam = [player,"DynamicSupportMenu"] call BIS_fnc_addCommMenuItem; //TODO: Add bought supports. /* if(isServer) then -{ - execVM "persistent\missionSpecific\saveFuncs.sqf"; - waitUntil {!isNil "saveFuncsLoaded"}; +{ + execVM "persistent\missionSpecific\saveFuncs.sqf"; + waitUntil {!isNil "saveFuncsLoaded"}; - execVM "persistent\missionSpecific\loadAccount.sqf"; + execVM "persistent\missionSpecific\loadAccount.sqf"; }; */ diff --git a/source/functions/initMission/fn_processGroupConfig.sqf b/source/functions/initMission/fn_processGroupConfig.sqf index 7b7b39f..7345e29 100644 --- a/source/functions/initMission/fn_processGroupConfig.sqf +++ b/source/functions/initMission/fn_processGroupConfig.sqf @@ -3,27 +3,27 @@ private _skillSF = [0.9,1]; private _skill = blufor_ai_skill; { - _cfgGroup = _x select 1; - _cost = _x select 0; - _indexNumber = blufor_cfgGroup_array find _x; - _request_group_cases_string = _request_group_cases_string + format [' - case %1: { - if (commandpointsblu1 >= %2) then { - commandpointsblu1 = commandpointsblu1 - %2; - ctrlSetText [1000, str commandpointsblu1]; - _group = group player ; - _group = [_spawnPos, WEST, %3, [], [], %4] call BIS_fnc_spawnGroup; - player hcsetgroup [_group,""]; - hint "Squad ready !\nAccess it with [L.CTRL - SPACE]"; - } else { - hint "Not enough command points"; - }; - }; - ', - _indexNumber, - _cost, - [[[_cfgGroup], ""] call BIS_fnc_configPath, "", true] call BIS_fnc_configPath, - if (!isnil "_skillBoolean" && {_skillBoolean}) then {_skillSF} else {_skill}]; + _cfgGroup = _x select 1; + _cost = _x select 0; + _indexNumber = blufor_cfgGroup_array find _x; + _request_group_cases_string = _request_group_cases_string + format [' + case %1: { + if (commandpointsblu1 >= %2) then { + commandpointsblu1 = commandpointsblu1 - %2; + ctrlSetText [1000, str commandpointsblu1]; + _group = group player ; + _group = [_spawnPos, WEST, %3, [], [], %4] call BIS_fnc_spawnGroup; + player hcsetgroup [_group,""]; + hint "Squad ready !\nAccess it with [L.CTRL - SPACE]"; + } else { + hint "Not enough command points"; + }; + }; + ', + _indexNumber, + _cost, + [[[_cfgGroup], ""] call BIS_fnc_configPath, "", true] call BIS_fnc_configPath, + if (!isnil "_skillBoolean" && {_skillBoolean}) then {_skillSF} else {_skill}]; } forEach blufor_cfgGroup_array; diff --git a/source/functions/initMission/fn_processUnitConfig.sqf b/source/functions/initMission/fn_processUnitConfig.sqf index daac44d..b249162 100644 --- a/source/functions/initMission/fn_processUnitConfig.sqf +++ b/source/functions/initMission/fn_processUnitConfig.sqf @@ -3,23 +3,23 @@ private _skillSF = (blufor_ai_skill select 0) + 0.5; private _skill = (blufor_ai_skill select 0) + 0.2; { - _unit = _x select 0; - _cost = _x select 1; - _skillBoolean = _x select 2; - _indexNumber = blufor_unit_array find _x; - _request_unit_cases_string = _request_unit_cases_string + format [' - case %1: { - if (commandpointsblu1 >= %2) then { - hint "Unit ready !"; - commandpointsblu1 = commandpointsblu1 - %2; - ctrlSetText [1000, str commandpointsblu1]; - _group = group player ; - "%3" createUnit [_spawnpos, _group, "", %4, "private"] ; - } else { - hint "Not enough command points"; - }; - }; - ',_indexNumber, _cost, _unit, if (!isnil "_skillBoolean" && {_skillBoolean}) then {_skillSF} else {_skill}]; + _unit = _x select 0; + _cost = _x select 1; + _skillBoolean = _x select 2; + _indexNumber = blufor_unit_array find _x; + _request_unit_cases_string = _request_unit_cases_string + format [' + case %1: { + if (commandpointsblu1 >= %2) then { + hint "Unit ready !"; + commandpointsblu1 = commandpointsblu1 - %2; + ctrlSetText [1000, str commandpointsblu1]; + _group = group player ; + "%3" createUnit [_spawnpos, _group, "", %4, "private"] ; + } else { + hint "Not enough command points"; + }; + }; + ',_indexNumber, _cost, _unit, if (!isnil "_skillBoolean" && {_skillBoolean}) then {_skillSF} else {_skill}]; } forEach blufor_unit_array; diff --git a/source/functions/initMission/fn_processVehicleConfig.sqf b/source/functions/initMission/fn_processVehicleConfig.sqf index 3a096ad..684bee5 100644 --- a/source/functions/initMission/fn_processVehicleConfig.sqf +++ b/source/functions/initMission/fn_processVehicleConfig.sqf @@ -3,14 +3,14 @@ private _request_vehicle_cases_string = ""; { - _vehicle = _x select 0; - _cost = _x select 1; - _indexNumber = blufor_vehicle_array find _x; - _request_vehicle_cases_string = _request_vehicle_cases_string + format [' - case %1: { - [%2,"%3"] call duws_fnc_spawnVehicle; - }; - ',_indexNumber, _vehicle, _cost]; + _vehicle = _x select 0; + _cost = _x select 1; + _indexNumber = blufor_vehicle_array find _x; + _request_vehicle_cases_string = _request_vehicle_cases_string + format [' + case %1: { + [%2,"%3"] call duws_fnc_spawnVehicle; + }; + ',_indexNumber, _vehicle, _cost]; } foreach blufor_vehicle_array; requestVehicleCases = compileFinal _request_vehicle_cases_string; \ No newline at end of file diff --git a/source/functions/initMission/fn_serverInit.sqf b/source/functions/initMission/fn_serverInit.sqf index 33aa3b3..4f9c78e 100644 --- a/source/functions/initMission/fn_serverInit.sqf +++ b/source/functions/initMission/fn_serverInit.sqf @@ -44,7 +44,7 @@ hq_manually_placed = false;publicVariable "hq_manually_placed"; // you must specify if you have manually placed the zones or not. false = zones are randomly generated, true = you have manually placed the zones zones_manually_placed = false;publicVariable "zones_manually_placed"; zones_max_dist_from_hq = 7500;publicVariable "zones_max_dist_from_hq"; -dynamic_weather_enable = true;publicVariable "dynamic_weather_enable"; +dynamic_weather_enable = true;publicVariable "dynamic_weather_enable"; manually_chosen = false;publicVariable "manually_chosen"; if (isNil "enable_fast_travel") then { enable_fast_travel = true; };publicVariable "enable_fast_travel"; @@ -101,7 +101,7 @@ publicVariable "amount_zones_created"; if (isNil "HQ_pos_found_generated") then { HQ_pos_found_generated = false; -}; +}; publicVariable "HQ_pos_found_generated"; @@ -114,59 +114,59 @@ publicVariable "chosen_settings"; if (isNil "chosen_hq_placement") then { chosen_hq_placement = false; }; - + publicVariable "chosen_hq_placement"; - + if (isNil "zoneundercontrolblu") then { - zoneundercontrolblu = 0; + zoneundercontrolblu = 0; }; publicVariable "zoneundercontrolblu"; if (isNil "amount_zones_captured") then { - amount_zones_captured = 0; + amount_zones_captured = 0; }; publicVariable "amount_zones_captured"; -if (isNil "savegameNumber") then { - savegameNumber = 0; +if (isNil "savegameNumber") then { + savegameNumber = 0; }; publicVariable "savegameNumber"; -if (isNil "capturedZonesNumber") then { - capturedZonesNumber = 0; -}; +if (isNil "capturedZonesNumber") then { + capturedZonesNumber = 0; +}; publicVariable "capturedZonesNumber"; -if (isNil "finishedMissionsNumber") then { - finishedMissionsNumber = 0; -}; +if (isNil "finishedMissionsNumber") then { + finishedMissionsNumber = 0; +}; publicVariable "finishedMissionsNumber"; -if (isNil "OvercastVar") then { - OvercastVar = 0; -}; +if (isNil "OvercastVar") then { + OvercastVar = 0; +}; publicVariable "OvercastVar"; -if (isNil "FogVar") then { - FogVar = 0; +if (isNil "FogVar") then { + FogVar = 0; }; publicVariable "FogVar"; -if (isNil "createzone_server") then { - createzone_server = false; +if (isNil "createzone_server") then { + createzone_server = false; }; publicVariable "createzone_server"; -if (isNil "mission_number_of_zones_captured") then { - mission_number_of_zones_captured = 0; +if (isNil "mission_number_of_zones_captured") then { + mission_number_of_zones_captured = 0; }; publicVariable "mission_number_of_zones_captured"; @@ -174,7 +174,7 @@ publicVariable "mission_number_of_zones_captured"; // this is a special one (if/else) if (isNil "Array_of_FOBS") then { // if the player is sp or server or no fobs have been created - Array_of_FOBS = []; + Array_of_FOBS = []; } else /// JIP for the client { @@ -184,7 +184,7 @@ else /// JIP for the client }; if (isNil "Array_of_FOBname") then { - Array_of_FOBname = []; + Array_of_FOBname = []; }; publicVariable "Array_of_FOBS"; @@ -195,7 +195,7 @@ game_master = ["player1"];publicVariable "game_master"; waitUntil {chosen_settings && createzone_server}; if (!manually_chosen) then { - if (!zones_created) then { // CHECK IF ZONES ARE PLACED, IF NOT EXECUTE locatorZonesV1.sqf + if (!zones_created) then { // CHECK IF ZONES ARE PLACED, IF NOT EXECUTE locatorZonesV1.sqf _zones_create = [50, 0.2] spawn duws_fnc_locatorzonesV1; // CHECK IF ZONES HAVE ALREADY BEEN PLACED }; } else { @@ -225,7 +225,7 @@ if (isServer) then { 60*60, // seconds to delete dropped weapons (0 means don't delete) 0, // seconds to deleted planted explosives (0 means don't delete) 60*60 // seconds to delete dropped smokes/chemlights (0 means don't delete) - ] spawn duws_fnc_repetitive_cleanup; + ] spawn duws_fnc_repetitive_cleanup; }; diff --git a/source/functions/initZones/fn_createzone.sqf b/source/functions/initZones/fn_createzone.sqf index 9aaf96e..82bed32 100644 --- a/source/functions/initZones/fn_createzone.sqf +++ b/source/functions/initZones/fn_createzone.sqf @@ -1,5 +1,5 @@ // _trg = ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzone; -// Name of the place,pts,radius,position,fortified/not +// Name of the place,pts,radius,position,fortified/not // params ["_place","_points","_size","_trigger","_fortified","_prefab"]; @@ -114,127 +114,127 @@ _trigger = [(_trigger select 0)+40,_trigger select 1]; // Check if fortified is true if (_fortified) then { - [_fortifiedspawn] call duws_fnc_createopfortified; - sleep 2; + [_fortifiedspawn] call duws_fnc_createopfortified; + sleep 2; }; // Check if radius is 100m or smaller => create 2 patrols then exit the script if (_size < 101) exitWith { - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; }; // Check if radius is 250m-100m => create 2 patrols and 1 fireteam then exit the script if (_size < 251) exitWith { - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; }; // Check if radius is 250m-500m => create 2 patrols and 2 fireteams then exit the script if (_size < 501) exitWith { - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; }; -if (_size <= 1000) exitWith +if (_size <= 1000) exitWith { - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; -}; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; +}; if (_size <= 1500) exitWith { _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createoppatrol; - [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; -}; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; +}; if (_size <= 2000) exitWith { _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createoppatrol; - [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; -}; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; +}; if (_size <= 3000) exitWith { - _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; - waitUntil {scriptDone _vehcreate}; - - _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; - waitUntil {scriptDone _vehcreate}; - - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createoppatrol; + _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; + waitUntil {scriptDone _vehcreate}; - [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; + _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; + waitUntil {scriptDone _vehcreate}; + + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; }; -// IF NOT IN PARAMETERS (TOO BIG ZONE) +// IF NOT IN PARAMETERS (TOO BIG ZONE) _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; _vehcreate = [opfor_Faction,"armored",_trigger,_size] spawn duws_fnc_random_veh; waitUntil {scriptDone _vehcreate}; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopwpteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createoppatrol; - [_trigger, _size] call duws_fnc_createopteam; - [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopwpteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createoppatrol; + [_trigger, _size] call duws_fnc_createopteam; + [_trigger, _size] call duws_fnc_createoppatrol; - [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; - \ No newline at end of file + [opfor_Faction,"air",_trigger,_size] spawn duws_fnc_random_veh; + \ No newline at end of file diff --git a/source/functions/initZones/fn_createzonebackup.sqf b/source/functions/initZones/fn_createzonebackup.sqf index 873248b..c10bf22 100644 --- a/source/functions/initZones/fn_createzonebackup.sqf +++ b/source/functions/initZones/fn_createzonebackup.sqf @@ -1,5 +1,5 @@ // _trg = ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzonebackup; -// Name of the place,pts,radius,position,fortified/not +// Name of the place,pts,radius,position,fortified/not // params ["_place","_points","_size","_trigger","_fortified","_prefab"]; diff --git a/source/functions/initZones/fn_locatorzonesV1.sqf b/source/functions/initZones/fn_locatorzonesV1.sqf index 874fc93..81ee60a 100644 --- a/source/functions/initZones/fn_locatorzonesV1.sqf +++ b/source/functions/initZones/fn_locatorzonesV1.sqf @@ -46,18 +46,18 @@ while {!_found} do }; // END OF FAILSAFE EXECUTION, RESET OVER. - _Posfound = false; - _posDeMeilleurTruc = []; - while {!_Posfound} do { - _posDeMeilleurTruc = [center_of_map, 0,half_of_map,5,0,0.1,0,[],[[0,0],[0,0]]] call BIS_fnc_findSafePos; - if (_posDeMeilleurTruc select 0 != 0 && _posDeMeilleurTruc select 1 != 0) then {_Posfound=true;}; - }; - _playerDistance = _posDeMeilleurTruc distance hq_blu1; - - - - - + _Posfound = false; + _posDeMeilleurTruc = []; + while {!_Posfound} do { + _posDeMeilleurTruc = [center_of_map, 0,half_of_map,5,0,0.1,0,[],[[0,0],[0,0]]] call BIS_fnc_findSafePos; + if (_posDeMeilleurTruc select 0 != 0 && _posDeMeilleurTruc select 1 != 0) then {_Posfound=true;}; + }; + _playerDistance = _posDeMeilleurTruc distance hq_blu1; + + + + + if (_playerDistance>(zones_max_radius + 500) && (hq_blu1 distance _posDeMeilleurTruc)<=zones_max_dist_from_hq) then { // VERIFIE SI ELOIGNE DU JOUEUR ET REGARDE LA DISTANCE DES AUTRES ZONES. REGARDE AUSSI LA DISTANCE PAR RAPPORT AU QG @@ -90,8 +90,8 @@ while {!_found} do _zones_array = _zones_array + [_MissionPos]; player globalChat format["Zone location #%1 found !",_i]; - player globalChat format["Generating zone #%1",_i]; - //waituntil {scriptdone _generatezonescript}; + player globalChat format["Generating zone #%1",_i]; + //waituntil {scriptdone _generatezonescript}; }; // END OF THIRD LOOP }; // END SECOND LOOP }; // END WHILE LOOP --- LOCATION FOUND diff --git a/source/functions/initZones/fn_locatorzonesV2.sqf b/source/functions/initZones/fn_locatorzonesV2.sqf index c3e9085..73218f7 100644 --- a/source/functions/initZones/fn_locatorzonesV2.sqf +++ b/source/functions/initZones/fn_locatorzonesV2.sqf @@ -24,10 +24,10 @@ for [{_i=1}, {_i<=zones_number}, {_i=_i+1}] do // BEGIN "FOR" LOOP -- _zone_radius = round _random_zones_max_radius; _points_zone = round (_zone_radius/10); }; - + while {!_found} do { clicked = false; - OnMapSingleClick "ClickedPos = _pos; clicked = true;"; + OnMapSingleClick "ClickedPos = _pos; clicked = true;"; _found_distance = false; _missionPos = []; @@ -61,7 +61,7 @@ for [{_i=1}, {_i<=zones_number}, {_i=_i+1}] do // BEGIN "FOR" LOOP -- }; openMap [false, false]; - + //hintSilent format["All zones found\nWelcome to %1\nHave fun !\nDUWS by kibot",_worldName]; player globalChat format["All zones found. Welcome to %1, %2",_worldName,profileName]; diff --git a/source/functions/misc/fn_bottom_right_message.sqf b/source/functions/misc/fn_bottom_right_message.sqf index 55d5034..d0ade44 100644 --- a/source/functions/misc/fn_bottom_right_message.sqf +++ b/source/functions/misc/fn_bottom_right_message.sqf @@ -1,189 +1,189 @@ /* - Author: Jiri Wainar + Author: Jiri Wainar - Description: - Display OSD with location, time and possibly some other campaign related info. + Description: + Display OSD with location, time and possibly some other campaign related info. - Parameter(s): - _this select 0: array (optional) - position (default: player's position) - _this select 1: array (optional) - date in format [_year,_month,_day,_hour,_min] (default: current date) + Parameter(s): + _this select 0: array (optional) - position (default: player's position) + _this select 1: array (optional) - date in format [_year,_month,_day,_hour,_min] (default: current date) - Example: - [] call BIS_fnc_camp_showOSD; + Example: + [] call BIS_fnc_camp_showOSD; - Returns: - - nothing - + Returns: + - nothing - */ private["_fn_getSector"]; _fn_getSector = { - private["_map","_posX","_posY","_gridX","_gridY","_secWidth","_secHeight"]; - private["_bottomLeftX","_bottomLeftY","_topRightX","_topRightY"]; - - _map = toLower worldName; - - if !(_map in ["altis","stratis"]) exitWith - { - -1 - }; - - if (_map == "stratis") then - { - _bottomLeftX = 1302; - _bottomLeftY = 230; - _topRightX = 6825; - _topRightY = 7810; - } - else - { - _bottomLeftX = 1765; - _bottomLeftY = 4639; - _topRightX = 28624; - _topRightY = 26008; - }; - - _posX = _this select 0; - _posY = _this select 1; - - //check if player is outside the map grid - if !(_posX > _bottomLeftX && _posX < _topRightX && _posY > _bottomLeftY && _posY < _topRightY) exitWith - { - 0 - }; - - //offset player pos to [0,0] - _posX = _posX - _bottomLeftX; - _posY = _posY - _bottomLeftY; - - _secWidth = (_topRightX - _bottomLeftX)/3; - _secHeight = (_topRightY - _bottomLeftY)/3; - - _gridX = floor (_posX/_secWidth); - _gridY = floor (_posY/_secHeight); - - ((_gridY * 3) + _gridX + 1) + private["_map","_posX","_posY","_gridX","_gridY","_secWidth","_secHeight"]; + private["_bottomLeftX","_bottomLeftY","_topRightX","_topRightY"]; + + _map = toLower worldName; + + if !(_map in ["altis","stratis"]) exitWith + { + -1 + }; + + if (_map == "stratis") then + { + _bottomLeftX = 1302; + _bottomLeftY = 230; + _topRightX = 6825; + _topRightY = 7810; + } + else + { + _bottomLeftX = 1765; + _bottomLeftY = 4639; + _topRightX = 28624; + _topRightY = 26008; + }; + + _posX = _this select 0; + _posY = _this select 1; + + //check if player is outside the map grid + if !(_posX > _bottomLeftX && _posX < _topRightX && _posY > _bottomLeftY && _posY < _topRightY) exitWith + { + 0 + }; + + //offset player pos to [0,0] + _posX = _posX - _bottomLeftX; + _posY = _posY - _bottomLeftY; + + _secWidth = (_topRightX - _bottomLeftX)/3; + _secHeight = (_topRightY - _bottomLeftY)/3; + + _gridX = floor (_posX/_secWidth); + _gridY = floor (_posY/_secHeight); + + ((_gridY * 3) + _gridX + 1) }; private["_position","_date","_output","_showDate","_showLocation","_showMap"]; private["_tLoc","_tMap","_tDate","_tTime","_tTimeH","_tTimeM","_tDay","_tMonth","_tYear"]; -_showDate = true; +_showDate = true; -_position = [_this, 0, getPos player, [[]]] call BIS_fnc_param; -_date = [_this, 1, date, [[]]] call BIS_fnc_param; -_tMap = [_this, 2, "auto", [""]] call BIS_fnc_param; -_tLoc = [_this, 3, "auto", [""]] call BIS_fnc_param; +_position = [_this, 0, getPos player, [[]]] call BIS_fnc_param; +_date = [_this, 1, date, [[]]] call BIS_fnc_param; +_tMap = [_this, 2, "auto", [""]] call BIS_fnc_param; +_tLoc = [_this, 3, "auto", [""]] call BIS_fnc_param; if (_tMap != "") then { - _showMap = true; + _showMap = true; } else { - _showMap = false; + _showMap = false; }; if (_tLoc != "") then { - _showLocation = true; + _showLocation = true; } else { - _showLocation = false; + _showLocation = false; }; //get map text if (_showMap && _tMap == "auto") then { - private["_sector","_map","_template"]; - - _sector = _position call _fn_getSector; - - if (_sector == -1) then - { - ["Map not recognized! Only 'Altis' and 'Stratis' are supported."] call BIS_fnc_error; - - _showMap = false; - _showLocation = false; - }; - - _map = gettext (configfile >> "cfgworlds" >> worldname >> "description"); - - _template = switch (_sector) do - { - case 1: {localize "STR_A3_SectorNorthWest"}; - case 2: {localize "STR_A3_SectorSouth"}; - case 3: {localize "STR_A3_SectorSouthEast"}; - case 4: {localize "STR_A3_SectorWest"}; - case 5: {localize "STR_A3_SectorCentral"}; - case 6: {localize "STR_A3_SectorEast"}; - case 7: {localize "STR_A3_SectorNorthWest"}; - case 8: {localize "STR_A3_SectorNorth"}; - case 9: {localize "STR_A3_SectorNorthEast"}; - - default - { - _showLocation = false; - - //hardcoded for Stratis and Altis only - if (worldname == "Stratis") then - { - localize "STR_A3_NearStratis" - } - else - { - localize "STR_A3_NearAltis" - }; - }; - }; - - _tMap = format[_template,_map]; + private["_sector","_map","_template"]; + + _sector = _position call _fn_getSector; + + if (_sector == -1) then + { + ["Map not recognized! Only 'Altis' and 'Stratis' are supported."] call BIS_fnc_error; + + _showMap = false; + _showLocation = false; + }; + + _map = gettext (configfile >> "cfgworlds" >> worldname >> "description"); + + _template = switch (_sector) do + { + case 1: {localize "STR_A3_SectorNorthWest"}; + case 2: {localize "STR_A3_SectorSouth"}; + case 3: {localize "STR_A3_SectorSouthEast"}; + case 4: {localize "STR_A3_SectorWest"}; + case 5: {localize "STR_A3_SectorCentral"}; + case 6: {localize "STR_A3_SectorEast"}; + case 7: {localize "STR_A3_SectorNorthWest"}; + case 8: {localize "STR_A3_SectorNorth"}; + case 9: {localize "STR_A3_SectorNorthEast"}; + + default + { + _showLocation = false; + + //hardcoded for Stratis and Altis only + if (worldname == "Stratis") then + { + localize "STR_A3_NearStratis" + } + else + { + localize "STR_A3_NearAltis" + }; + }; + }; + + _tMap = format[_template,_map]; }; //get current location text if (_showLocation && _tLoc == "auto") then { - private["_locations","_loc"]; - - _locations = nearestLocations [getPos player, ["NameCity","NameCityCapital","NameLocal","NameMarine","NameVillage"], 500]; - - //filter-out locations without names - { - if (text _x == "") then - { - locations set [_forEachIndex, objNull]; - }; - } - forEach _locations; _locations = _locations - [objNull]; - - if (count _locations > 0) then - { - _loc = _locations select 0; - - if ((getPos player) in _loc) then - { - _tLoc = text _loc; - } - else - { - _tLoc = format[localize "STR_A3_NearLocation", text _loc]; //tolocalize: "Poblíž lokace %1" - }; - } - else - { - _tLoc = ""; - _showLocation = false; - }; + private["_locations","_loc"]; + + _locations = nearestLocations [getPos player, ["NameCity","NameCityCapital","NameLocal","NameMarine","NameVillage"], 500]; + + //filter-out locations without names + { + if (text _x == "") then + { + locations set [_forEachIndex, objNull]; + }; + } + forEach _locations; _locations = _locations - [objNull]; + + if (count _locations > 0) then + { + _loc = _locations select 0; + + if ((getPos player) in _loc) then + { + _tLoc = text _loc; + } + else + { + _tLoc = format[localize "STR_A3_NearLocation", text _loc]; //tolocalize: "Poblíž lokace %1" + }; + } + else + { + _tLoc = ""; + _showLocation = false; + }; }; //get daytime data -_tYear = _date select 0; +_tYear = _date select 0; _tMonth = _date select 1; -_tDay = _date select 2; +_tDay = _date select 2; if (_tMonth < 10) then {_tMonth = format["0%1",_tMonth]}; if (_tDay < 10) then {_tDay = format["0%1",_tDay]}; @@ -204,18 +204,18 @@ _tTime = format["%1:%2",_tTimeH,_tTimeM]; //sum the output params & print it _output = [ - [_tDate,"%1",0], - [_tTime,"%1
",5] + [_tDate,"%1",0], + [_tTime,"%1
",5] ]; if (_showLocation) then { - _output = _output + [[toUpper _tLoc,"%1
",5]]; + _output = _output + [[toUpper _tLoc,"%1
",5]]; }; if (_showMap) then { - _output = _output + [[_tMap,"%1
",30]]; + _output = _output + [[_tMap,"%1
",30]]; }; [_output,-safezoneX,0.85,"%1"] spawn BIS_fnc_typeText; \ No newline at end of file diff --git a/source/functions/misc/fn_gps_marker.sqf b/source/functions/misc/fn_gps_marker.sqf index 600b5de..db4c033 100644 --- a/source/functions/misc/fn_gps_marker.sqf +++ b/source/functions/misc/fn_gps_marker.sqf @@ -3,31 +3,31 @@ private ["_markername"]; while {true} do { - while {!_player_has_gps} do { - _number = assignedItems player find "ItemGPS"; - if (_number != -1 && !_player_has_gps) then { // Check if player has a gps assigned, if yes create marker - _markername = format["gps%1%2%3",round (getpos player select 0),round (getpos player select 1),round (random 10000)]; // --START CREATE MARKER-- - _markerstr = createMarker [str(_markername), getpos player]; - _markerstr setMarkerShape "ICON"; - str(_markername) setMarkerType "mil_arrow2"; - str(_markername) setMarkerColor "ColorGreen"; - str(_markername) setMarkerSize [0.3, 0.5]; - str(_markername) setMarkerText format["%1",profileName]; - _player_dir = getDir player; - str(_markername) setmarkerdir _player_dir; - _player_has_gps = true; - }; // --END CREATE MARKER-- - sleep 3; - }; + while {!_player_has_gps} do { + _number = assignedItems player find "ItemGPS"; + if (_number != -1 && !_player_has_gps) then { // Check if player has a gps assigned, if yes create marker + _markername = format["gps%1%2%3",round (getpos player select 0),round (getpos player select 1),round (random 10000)]; // --START CREATE MARKER-- + _markerstr = createMarker [str(_markername), getpos player]; + _markerstr setMarkerShape "ICON"; + str(_markername) setMarkerType "mil_arrow2"; + str(_markername) setMarkerColor "ColorGreen"; + str(_markername) setMarkerSize [0.3, 0.5]; + str(_markername) setMarkerText format["%1",profileName]; + _player_dir = getDir player; + str(_markername) setmarkerdir _player_dir; + _player_has_gps = true; + }; // --END CREATE MARKER-- + sleep 3; + }; - - while {_player_has_gps} do { - _player_dir = getDir player; - str(_markername) setmarkerdir _player_dir; - str(_markername) setMarkerPos getpos player; - _number = assignedItems player find "ItemGPS"; - if (_number == -1) then {_player_has_gps = false; deletemarker str(_markername)}; - sleep 0.7; - }; + + while {_player_has_gps} do { + _player_dir = getDir player; + str(_markername) setmarkerdir _player_dir; + str(_markername) setMarkerPos getpos player; + _number = assignedItems player find "ItemGPS"; + if (_number == -1) then {_player_has_gps = false; deletemarker str(_markername)}; + sleep 0.7; + }; sleep 0.2; }; \ No newline at end of file diff --git a/source/functions/operative/fn_operator_recruit.sqf b/source/functions/operative/fn_operator_recruit.sqf index e6ec3c7..4671c0c 100644 --- a/source/functions/operative/fn_operator_recruit.sqf +++ b/source/functions/operative/fn_operator_recruit.sqf @@ -53,7 +53,7 @@ duws_operator_list select lbCurSel 1500 set [7,"Operating"]; ctrlSetText [1013, format["%1",_selected_soldier_status]]; buttonSetAction [1601, "hint ""This operative is already active in this theatre of operation"""]; -ctrlSetText [1601, "ALREADY DEPLOYED"]; +ctrlSetText [1601, "ALREADY DEPLOYED"]; // wait until the operator is dead waitUntil {sleep 2; !alive _soldier}; diff --git a/source/functions/pFLIR/fn_livefeed.sqf b/source/functions/pFLIR/fn_livefeed.sqf index 02a56aa..ff91042 100644 --- a/source/functions/pFLIR/fn_livefeed.sqf +++ b/source/functions/pFLIR/fn_livefeed.sqf @@ -22,21 +22,21 @@ switch (_actualStance) do { case "STAND": { - BIS_liveFeed attachTo [player,[0,1,1.68]]; - trucPIPtarget attachTo [player,[0,2000,1.68]]; + BIS_liveFeed attachTo [player,[0,1,1.68]]; + trucPIPtarget attachTo [player,[0,2000,1.68]]; }; case "CROUCH": { - BIS_liveFeed attachTo [player,[0,1,0.85]]; - trucPIPtarget attachTo [player,[0,2000,0.85]]; + BIS_liveFeed attachTo [player,[0,1,0.85]]; + trucPIPtarget attachTo [player,[0,2000,0.85]]; }; - + case "PRONE": { - BIS_liveFeed attachTo [player,[0,1,0.25]]; - trucPIPtarget attachTo [player,[0,2000,0.25]]; - }; + BIS_liveFeed attachTo [player,[0,1,0.25]]; + trucPIPtarget attachTo [player,[0,2000,0.25]]; + }; }; @@ -51,26 +51,26 @@ PlayerKilledEH2 = player addEventHandler ["killed", {[] spawn duws_fnc_livefeede while {pFlirActivated} do { waitUntil {(_actualStance != stance player) or !pFlirActivated}; if (!pFlirActivated) exitWith {}; - _actualStance = stance player; - switch (_actualStance) do - { - case "STAND": - { - BIS_liveFeed attachTo [player,[0,1,1.68]]; - trucPIPtarget attachTo [player,[0,2000,1.68]]; - }; + _actualStance = stance player; + switch (_actualStance) do + { + case "STAND": + { + BIS_liveFeed attachTo [player,[0,1,1.68]]; + trucPIPtarget attachTo [player,[0,2000,1.68]]; + }; - case "CROUCH": - { - BIS_liveFeed attachTo [player,[0,1,0.85]]; - trucPIPtarget attachTo [player,[0,2000,0.85]]; - }; - - case "PRONE": - { - BIS_liveFeed attachTo [player,[0,1,0.25]]; - trucPIPtarget attachTo [player,[0,2000,0.25]]; - }; + case "CROUCH": + { + BIS_liveFeed attachTo [player,[0,1,0.85]]; + trucPIPtarget attachTo [player,[0,2000,0.85]]; + }; + + case "PRONE": + { + BIS_liveFeed attachTo [player,[0,1,0.25]]; + trucPIPtarget attachTo [player,[0,2000,0.25]]; + }; - }; + }; }; \ No newline at end of file diff --git a/source/functions/pFLIR/fn_livefeed1.sqf b/source/functions/pFLIR/fn_livefeed1.sqf index e860fdb..5daa5bd 100644 --- a/source/functions/pFLIR/fn_livefeed1.sqf +++ b/source/functions/pFLIR/fn_livefeed1.sqf @@ -22,21 +22,21 @@ switch (_actualStance) do { case "STAND": { - BIS_liveFeed attachTo [player,[0,1,1.68]]; - trucPIPtarget attachTo [player,[0,2000,1.68]]; + BIS_liveFeed attachTo [player,[0,1,1.68]]; + trucPIPtarget attachTo [player,[0,2000,1.68]]; }; case "CROUCH": { - BIS_liveFeed attachTo [player,[0,1,0.85]]; - trucPIPtarget attachTo [player,[0,2000,0.85]]; + BIS_liveFeed attachTo [player,[0,1,0.85]]; + trucPIPtarget attachTo [player,[0,2000,0.85]]; }; - + case "PRONE": { - BIS_liveFeed attachTo [player,[0,1,0.25]]; - trucPIPtarget attachTo [player,[0,2000,0.25]]; - }; + BIS_liveFeed attachTo [player,[0,1,0.25]]; + trucPIPtarget attachTo [player,[0,2000,0.25]]; + }; }; @@ -51,26 +51,26 @@ PlayerKilledEH2 = player addEventHandler ["killed", {[] spawn duws_fnc_livefeede while {pFlirActivated} do { waitUntil {(_actualStance != stance player) or !pFlirActivated}; if (!pFlirActivated) exitWith {}; - _actualStance = stance player; - switch (_actualStance) do - { - case "STAND": - { - BIS_liveFeed attachTo [player,[0,1,1.68]]; - trucPIPtarget attachTo [player,[0,2000,1.68]]; - }; + _actualStance = stance player; + switch (_actualStance) do + { + case "STAND": + { + BIS_liveFeed attachTo [player,[0,1,1.68]]; + trucPIPtarget attachTo [player,[0,2000,1.68]]; + }; - case "CROUCH": - { - BIS_liveFeed attachTo [player,[0,1,0.85]]; - trucPIPtarget attachTo [player,[0,2000,0.85]]; - }; - - case "PRONE": - { - BIS_liveFeed attachTo [player,[0,1,0.25]]; - trucPIPtarget attachTo [player,[0,2000,0.25]]; - }; + case "CROUCH": + { + BIS_liveFeed attachTo [player,[0,1,0.85]]; + trucPIPtarget attachTo [player,[0,2000,0.85]]; + }; + + case "PRONE": + { + BIS_liveFeed attachTo [player,[0,1,0.25]]; + trucPIPtarget attachTo [player,[0,2000,0.25]]; + }; - }; + }; }; \ No newline at end of file diff --git a/source/functions/persistent/fn_experience_ability_heal.sqf b/source/functions/persistent/fn_experience_ability_heal.sqf index bc7fc37..7b58994 100644 --- a/source/functions/persistent/fn_experience_ability_heal.sqf +++ b/source/functions/persistent/fn_experience_ability_heal.sqf @@ -27,7 +27,7 @@ deleteVehicle _trg; titleText [format["%1, patching you up...",_ability_name], "PLAIN DOWN"]; /// ----- ABILITY IS ACTIVATED - player playmove "AinvPknlMstpSlayWrflDnon_medic"; + player playmove "AinvPknlMstpSlayWrflDnon_medic"; sleep 4; player setdamage 0; /// ---- ABILITY IS ACTIVATED diff --git a/source/functions/persistent/fn_experience_ability_refit.sqf b/source/functions/persistent/fn_experience_ability_refit.sqf index be1a3f0..504b803 100644 --- a/source/functions/persistent/fn_experience_ability_refit.sqf +++ b/source/functions/persistent/fn_experience_ability_refit.sqf @@ -30,8 +30,8 @@ deleteVehicle _trg; titleText [format["%1 activated, the vehicle is being fixed...",_ability_name], "PLAIN DOWN"]; /// ----- ABILITY IS ACTIVATED sleep 10; - _actualFuel = fuel _veh; - _veh setFuel (_actualFuel + 0.1); + _actualFuel = fuel _veh; + _veh setFuel (_actualFuel + 0.1); _veh setdamage 0; /// ---- ABILITY IS ACTIVATED titleText [format["%1 done\nCooldown: 1 hour",_ability_name,_cooldown], "PLAIN DOWN"]; diff --git a/source/functions/persistent/fn_persistent_stats_missions_total.sqf b/source/functions/persistent/fn_persistent_stats_missions_total.sqf index b782919..72a965c 100644 --- a/source/functions/persistent/fn_persistent_stats_missions_total.sqf +++ b/source/functions/persistent/fn_persistent_stats_missions_total.sqf @@ -4,9 +4,9 @@ profileNamespace setVariable ["profile_number_of_missions_done", mission_number_ saveProfileNamespace; // sauvegarde le profil if (isMultiplayer) then { - if (isServer) then { - finishedMissionsNumber = finishedMissionsNumber + 1; - publicVariable "finishedMissionsNumber"; - }; - }; - \ No newline at end of file + if (isServer) then { + finishedMissionsNumber = finishedMissionsNumber + 1; + publicVariable "finishedMissionsNumber"; + }; + }; + \ No newline at end of file diff --git a/source/functions/persistent/fn_persistent_stats_zones_add.sqf b/source/functions/persistent/fn_persistent_stats_zones_add.sqf index eba0d2c..735abd0 100644 --- a/source/functions/persistent/fn_persistent_stats_zones_add.sqf +++ b/source/functions/persistent/fn_persistent_stats_zones_add.sqf @@ -4,9 +4,9 @@ profileNamespace setVariable ["profile_number_of_zones_captured", mission_number saveProfileNamespace; // sauvegarde le profil if (isMultiplayer) then { - if (isServer) then { - capturedZonesNumber = capturedZonesNumber + 1; - publicVariable "capturedZonesNumber"; - }; - }; - \ No newline at end of file + if (isServer) then { + capturedZonesNumber = capturedZonesNumber + 1; + publicVariable "capturedZonesNumber"; + }; + }; + \ No newline at end of file diff --git a/source/functions/support/fn_FOBreceiveaction.sqf b/source/functions/support/fn_FOBreceiveaction.sqf index 594e0b8..01d3148 100644 --- a/source/functions/support/fn_FOBreceiveaction.sqf +++ b/source/functions/support/fn_FOBreceiveaction.sqf @@ -1,6 +1,6 @@ - sleep 10; - _fobAmount = count Array_of_FOBS; - _fobIndex = _fobAmount - 1; - _createdFOB = Array_of_FOBS select _fobIndex; -// hint format["fobIndex: %1\ncreatedFOB: %2\nArray: %3",_fobIndex,_createdFOB,Array_of_FOBS]; - [_createdFOB] call duws_fnc_FOBactions; \ No newline at end of file + sleep 10; + _fobAmount = count Array_of_FOBS; + _fobIndex = _fobAmount - 1; + _createdFOB = Array_of_FOBS select _fobIndex; +// hint format["fobIndex: %1\ncreatedFOB: %2\nArray: %3",_fobIndex,_createdFOB,Array_of_FOBS]; + [_createdFOB] call duws_fnc_FOBactions; \ No newline at end of file diff --git a/source/functions/support/fn_ammobox.sqf b/source/functions/support/fn_ammobox.sqf index 357a871..b7c8589 100644 --- a/source/functions/support/fn_ammobox.sqf +++ b/source/functions/support/fn_ammobox.sqf @@ -36,7 +36,7 @@ _ammo = Blufor_SupplyCrate CreateVehicle [_location select 0,_location select 1, _ammo attachTo [_parachute,[0,0,0]]; { - _ammo addItemCargo _x; + _ammo addItemCargo _x; } forEach Blufor_Ammobox_Contents; _ammo addBackpackCargo ["B_AssaultPack_khk",10]; diff --git a/source/functions/support/fn_sitrep.sqf b/source/functions/support/fn_sitrep.sqf index 5e094c8..392c423 100644 --- a/source/functions/support/fn_sitrep.sqf +++ b/source/functions/support/fn_sitrep.sqf @@ -3,16 +3,16 @@ if (commandpointsblu1>=1) exitWith { - commandpointsblu1 = commandpointsblu1 - 1; - publicVariable "commandpointsblu1"; - - saveGame; - - sleep 0.5; - ["sitrepinfo",["SITREP","The game has been saved"]] call bis_fnc_showNotification; - [west, "PAPA_BEAR"] sidechat format["SITREP received, we have %1 command points and our army power is at %2",commandpointsblu1,WARCOM_blufor_ap]; - sleep 1; - [] call duws_fnc_bottom_right_message; + commandpointsblu1 = commandpointsblu1 - 1; + publicVariable "commandpointsblu1"; + + saveGame; + + sleep 0.5; + ["sitrepinfo",["SITREP","The game has been saved"]] call bis_fnc_showNotification; + [west, "PAPA_BEAR"] sidechat format["SITREP received, we have %1 command points and our army power is at %2",commandpointsblu1,WARCOM_blufor_ap]; + sleep 1; + [] call duws_fnc_bottom_right_message; }; ["sitrepinfo",["SITREP","Not enough Command Points (1CP)"]] call bis_fnc_showNotification; \ No newline at end of file diff --git a/source/functions/support/taxi/fn_mapclickboat.sqf b/source/functions/support/taxi/fn_mapclickboat.sqf index 8b576ac..e81b266 100644 --- a/source/functions/support/taxi/fn_mapclickboat.sqf +++ b/source/functions/support/taxi/fn_mapclickboat.sqf @@ -29,15 +29,15 @@ while {_timer>0} do { _foundPickupPos = [ClickedTaxiPos, 0,50,10,2,5,0,[],[[0,0],[0,0]]] call BIS_fnc_findSafePos; // find a valid pos if (0 == _foundPickupPos select 0 && 0 == _foundPickupPos select 1) then { - if (ClickedTaxiPos distance player < 100) exitWith { - clicked = false; - titleText ["Driver: This is too close from our position", "PLAIN DOWN"]; - }; - clicked = false; - titleText ["Driver: I can't go there", "PLAIN DOWN"]; - } - else - {onMapSingleClick "";_timer = 0;taxiCanTakeOff = true;} + if (ClickedTaxiPos distance player < 100) exitWith { + clicked = false; + titleText ["Driver: This is too close from our position", "PLAIN DOWN"]; + }; + clicked = false; + titleText ["Driver: I can't go there", "PLAIN DOWN"]; + } + else + {onMapSingleClick "";_timer = 0;taxiCanTakeOff = true;} }; _timer = _timer-1; // remove 1 to timer diff --git a/source/functions/support/taxi/fn_mapclickhelo.sqf b/source/functions/support/taxi/fn_mapclickhelo.sqf index a8810c2..ad08199 100644 --- a/source/functions/support/taxi/fn_mapclickhelo.sqf +++ b/source/functions/support/taxi/fn_mapclickhelo.sqf @@ -29,15 +29,15 @@ while {_timer>0} do { _foundPickupPos = [ClickedTaxiPos, 0,50,10,0,0.2,0,[],[[0,0],[0,0]]] call BIS_fnc_findSafePos; // find a valid pos if (0 == _foundPickupPos select 0 && 0 == _foundPickupPos select 1) then { - if (ClickedTaxiPos distance player < 1000) exitWith { - clicked = false; - titleText ["Pilot: This LZ is too close from our position", "PLAIN DOWN"]; - }; - clicked = false; - titleText ["Pilot: No clear LZ around here, give me another location", "PLAIN DOWN"]; - } - else - {onMapSingleClick "";_timer = 0;taxiCanTakeOff = true;} + if (ClickedTaxiPos distance player < 1000) exitWith { + clicked = false; + titleText ["Pilot: This LZ is too close from our position", "PLAIN DOWN"]; + }; + clicked = false; + titleText ["Pilot: No clear LZ around here, give me another location", "PLAIN DOWN"]; + } + else + {onMapSingleClick "";_timer = 0;taxiCanTakeOff = true;} }; _timer = _timer-1; // remove 1 to timer diff --git a/source/functions/taw_vd/CfgFunctions.hpp b/source/functions/taw_vd/CfgFunctions.hpp index 65be88c..cb0a2d3 100644 --- a/source/functions/taw_vd/CfgFunctions.hpp +++ b/source/functions/taw_vd/CfgFunctions.hpp @@ -1,21 +1,21 @@ class TAW_VD { - tag = "TAWVD"; + tag = "TAWVD"; - class Initialize { - file = "taw_vd"; - class stateTracker { - ext = ".fsm"; - postInit = 1; - headerType = -1; - }; - - class onSliderChanged {}; - class onTerrainChanged {}; - class updateViewDistance {}; - class openMenu {}; - class onChar {}; - class openSaveManager {}; - class onSavePressed {}; - class onSaveSelectionChanged {}; - }; + class Initialize { + file = "taw_vd"; + class stateTracker { + ext = ".fsm"; + postInit = 1; + headerType = -1; + }; + + class onSliderChanged {}; + class onTerrainChanged {}; + class updateViewDistance {}; + class openMenu {}; + class onChar {}; + class openSaveManager {}; + class onSavePressed {}; + class onSaveSelectionChanged {}; + }; }; \ No newline at end of file diff --git a/source/functions/taw_vd/GUI.h b/source/functions/taw_vd/GUI.h index 26322e2..c79ba93 100644 --- a/source/functions/taw_vd/GUI.h +++ b/source/functions/taw_vd/GUI.h @@ -1,668 +1,668 @@ #include "defines.h" class RscEdit_taw { - type = 2; - style = 0x00 + 0x40; - font = "PuristaMedium"; - shadow = 2; - sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorBackground[] = {0, 0, 0, 1}; - soundSelect[] = {"",0.1,1}; - soundExpand[] = {"",0.1,1}; - colorText[] = {0.95, 0.95, 0.95, 1}; - colorDisabled[] = {1, 1, 1, 0.25}; - autocomplete = false; - colorSelection[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1}; - canModify = 1; + type = 2; + style = 0x00 + 0x40; + font = "PuristaMedium"; + shadow = 2; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorBackground[] = {0, 0, 0, 1}; + soundSelect[] = {"",0.1,1}; + soundExpand[] = {"",0.1,1}; + colorText[] = {0.95, 0.95, 0.95, 1}; + colorDisabled[] = {1, 1, 1, 0.25}; + autocomplete = false; + colorSelection[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1}; + canModify = 1; }; class RscListBox_taw { - style = 16; - idc = -1; - type = 5; - w = 0.275; - h = 0.04; - font = "PuristaMedium"; - colorSelect[] = {1, 1, 1, 1}; - colorText[] = {1, 1, 1, 1}; - colorBackground[] = {0.28,0.28,0.28,0.28}; - colorSelect2[] = {1, 1, 1, 1}; - colorSelectBackground[] = {0.95, 0.95, 0.95, 0.5}; - colorSelectBackground2[] = {1, 1, 1, 0.5}; - colorScrollbar[] = {0.2, 0.2, 0.2, 1}; - colorPicture[] = {1,1,1,1}; - colorPictureSelected[] = {1,1,1,1}; - colorPictureDisabled[] = {1,1,1,1}; - arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; - arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; - wholeHeight = 0.45; - rowHeight = 0.04; - color[] = {0.7, 0.7, 0.7, 1}; - colorActive[] = {0,0,0,1}; - colorDisabled[] = {0,0,0,0.3}; - sizeEx = 0.023; - soundSelect[] = {"",0.1,1}; - soundExpand[] = {"",0.1,1}; - soundCollapse[] = {"",0.1,1}; - maxHistoryDelay = 1; - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - tooltipColorText[] = {1,1,1,1}; - tooltipColorBox[] = {1,1,1,1}; - tooltipColorShade[] = {0,0,0,0.65}; - - class ListScrollBar { - color[] = {1,1,1,1}; - colorActive[] = {1,1,1,1}; - colorDisabled[] = {1,1,1,0.3}; - thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; - arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; - arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; - border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; - shadow = 0; - scrollSpeed = 0.06; - width = 0; - height = 0; - autoScrollEnabled = 1; - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - } + style = 16; + idc = -1; + type = 5; + w = 0.275; + h = 0.04; + font = "PuristaMedium"; + colorSelect[] = {1, 1, 1, 1}; + colorText[] = {1, 1, 1, 1}; + colorBackground[] = {0.28,0.28,0.28,0.28}; + colorSelect2[] = {1, 1, 1, 1}; + colorSelectBackground[] = {0.95, 0.95, 0.95, 0.5}; + colorSelectBackground2[] = {1, 1, 1, 0.5}; + colorScrollbar[] = {0.2, 0.2, 0.2, 1}; + colorPicture[] = {1,1,1,1}; + colorPictureSelected[] = {1,1,1,1}; + colorPictureDisabled[] = {1,1,1,1}; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + wholeHeight = 0.45; + rowHeight = 0.04; + color[] = {0.7, 0.7, 0.7, 1}; + colorActive[] = {0,0,0,1}; + colorDisabled[] = {0,0,0,0.3}; + sizeEx = 0.023; + soundSelect[] = {"",0.1,1}; + soundExpand[] = {"",0.1,1}; + soundCollapse[] = {"",0.1,1}; + maxHistoryDelay = 1; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + tooltipColorText[] = {1,1,1,1}; + tooltipColorBox[] = {1,1,1,1}; + tooltipColorShade[] = {0,0,0,0.65}; + + class ListScrollBar { + color[] = {1,1,1,1}; + colorActive[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.3}; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + shadow = 0; + scrollSpeed = 0.06; + width = 0; + height = 0; + autoScrollEnabled = 1; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + } }; class RscCheckBox { - access = 0; // Control access (0 - ReadAndWrite, 1 - ReadAndCreate, 2 - ReadOnly, 3 - ReadOnlyVerified) - idc = -1; // Control identification (without it, the control won't be displayed) - type = 77; // Type - style = ST_LEFT + ST_MULTI; // Style - default = 0; // Control selected by default (only one within a display can be used) - blinkingPeriod = 0; // Time in which control will fade out and back in. Use 0 to disable the effect. - - x = 0; - y = 0; - w = 1 * GUI_GRID_CENTER_W; // Width - h = 1 * GUI_GRID_CENTER_H; // Height - - //Colors - color[] = { 1, 1, 1, 0.7 }; // Texture color - colorFocused[] = { 1, 1, 1, 1 }; // Focused texture color - colorHover[] = { 1, 1, 1, 1 }; // Mouse over texture color - colorPressed[] = { 1, 1, 1, 1 }; // Mouse pressed texture color - colorDisabled[] = { 1, 1, 1, 0.2 }; // Disabled texture color - - //Background colors - colorBackground[] = { 0, 0, 0, 0 }; // Fill color - colorBackgroundFocused[] = { 0, 0, 0, 0 }; // Focused fill color - colorBackgroundHover[] = { 0, 0, 0, 0 }; // Mouse hover fill color - colorBackgroundPressed[] = { 0, 0, 0, 0 }; // Mouse pressed fill color - colorBackgroundDisabled[] = { 0, 0, 0, 0 }; // Disabled fill color - - //Textures - textureChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked CheckBox. - textureUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked CheckBox. - textureFocusedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked focused CheckBox (Could be used for showing different texture when focused). - textureFocusedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked focused CheckBox. - textureHoverChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; - textureHoverUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; - texturePressedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; - texturePressedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; - textureDisabledChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; - textureDisabledUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; - - tooltip = ""; // Tooltip text - tooltipColorShade[] = { 0, 0, 0, 1 }; // Tooltip background color - tooltipColorText[] = { 1, 1, 1, 1 }; // Tooltip text color - tooltipColorBox[] = { 1, 1, 1, 1 }; // Tooltip frame color - - //Sounds - soundClick[] = { "\A3\ui_f\data\sound\RscButton\soundClick", 0.09, 1 }; // Sound played after control is activated in format {file, volume, pitch} - soundEnter[] = { "\A3\ui_f\data\sound\RscButton\soundEnter", 0.09, 1 }; // Sound played when mouse cursor enters the control - soundPush[] = { "\A3\ui_f\data\sound\RscButton\soundPush", 0.09, 1 }; // Sound played when the control is pushed down - soundEscape[] = { "\A3\ui_f\data\sound\RscButton\soundEscape", 0.09, 1 }; // Sound played when the control is released after pushing down + access = 0; // Control access (0 - ReadAndWrite, 1 - ReadAndCreate, 2 - ReadOnly, 3 - ReadOnlyVerified) + idc = -1; // Control identification (without it, the control won't be displayed) + type = 77; // Type + style = ST_LEFT + ST_MULTI; // Style + default = 0; // Control selected by default (only one within a display can be used) + blinkingPeriod = 0; // Time in which control will fade out and back in. Use 0 to disable the effect. + + x = 0; + y = 0; + w = 1 * GUI_GRID_CENTER_W; // Width + h = 1 * GUI_GRID_CENTER_H; // Height + + //Colors + color[] = { 1, 1, 1, 0.7 }; // Texture color + colorFocused[] = { 1, 1, 1, 1 }; // Focused texture color + colorHover[] = { 1, 1, 1, 1 }; // Mouse over texture color + colorPressed[] = { 1, 1, 1, 1 }; // Mouse pressed texture color + colorDisabled[] = { 1, 1, 1, 0.2 }; // Disabled texture color + + //Background colors + colorBackground[] = { 0, 0, 0, 0 }; // Fill color + colorBackgroundFocused[] = { 0, 0, 0, 0 }; // Focused fill color + colorBackgroundHover[] = { 0, 0, 0, 0 }; // Mouse hover fill color + colorBackgroundPressed[] = { 0, 0, 0, 0 }; // Mouse pressed fill color + colorBackgroundDisabled[] = { 0, 0, 0, 0 }; // Disabled fill color + + //Textures + textureChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked CheckBox. + textureUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked CheckBox. + textureFocusedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked focused CheckBox (Could be used for showing different texture when focused). + textureFocusedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked focused CheckBox. + textureHoverChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + textureHoverUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + texturePressedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + texturePressedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + textureDisabledChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + textureDisabledUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + + tooltip = ""; // Tooltip text + tooltipColorShade[] = { 0, 0, 0, 1 }; // Tooltip background color + tooltipColorText[] = { 1, 1, 1, 1 }; // Tooltip text color + tooltipColorBox[] = { 1, 1, 1, 1 }; // Tooltip frame color + + //Sounds + soundClick[] = { "\A3\ui_f\data\sound\RscButton\soundClick", 0.09, 1 }; // Sound played after control is activated in format {file, volume, pitch} + soundEnter[] = { "\A3\ui_f\data\sound\RscButton\soundEnter", 0.09, 1 }; // Sound played when mouse cursor enters the control + soundPush[] = { "\A3\ui_f\data\sound\RscButton\soundPush", 0.09, 1 }; // Sound played when the control is pushed down + soundEscape[] = { "\A3\ui_f\data\sound\RscButton\soundEscape", 0.09, 1 }; // Sound played when the control is released after pushing down }; class RscXSliderH { - style = 1024; - type = 43; - shadow = 2; - x = 0; - y = 0; - h = 0.029412; - w = 0.400000; - color[] = { - 1, 1, 1, 0.7 - }; - colorActive[] = { - 1, 1, 1, 1 - }; - colorDisabled[] = { - 1, 1, 1, 0.500000 - }; - arrowEmpty = "\A3\ui_f\data\gui\cfg\slider\arrowEmpty_ca.paa"; - arrowFull = "\A3\ui_f\data\gui\cfg\slider\arrowFull_ca.paa"; - border = "\A3\ui_f\data\gui\cfg\slider\border_ca.paa"; - thumb = "\A3\ui_f\data\gui\cfg\slider\thumb_ca.paa"; + style = 1024; + type = 43; + shadow = 2; + x = 0; + y = 0; + h = 0.029412; + w = 0.400000; + color[] = { + 1, 1, 1, 0.7 + }; + colorActive[] = { + 1, 1, 1, 1 + }; + colorDisabled[] = { + 1, 1, 1, 0.500000 + }; + arrowEmpty = "\A3\ui_f\data\gui\cfg\slider\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\slider\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\slider\border_ca.paa"; + thumb = "\A3\ui_f\data\gui\cfg\slider\thumb_ca.paa"; }; class RscText_taw { - x = 0; - y = 0; - h = 0.037; - w = 0.3; - type = 0; - style = 0; - shadow = 1; - colorShadow[] = {0, 0, 0, 0.5}; - font = "PuristaMedium"; - SizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = ""; - colorText[] = {1, 1, 1, 1.0}; - colorBackground[] = {0, 0, 0, 0}; - linespacing = 1; + x = 0; + y = 0; + h = 0.037; + w = 0.3; + type = 0; + style = 0; + shadow = 1; + colorShadow[] = {0, 0, 0, 0.5}; + font = "PuristaMedium"; + SizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + text = ""; + colorText[] = {1, 1, 1, 1.0}; + colorBackground[] = {0, 0, 0, 0}; + linespacing = 1; }; class RscTitle:RscText_taw { - style = 0; - shadow = 0; - sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.95, 0.95, 0.95, 1}; + style = 0; + shadow = 0; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorText[] = {0.95, 0.95, 0.95, 1}; }; class RscShortcutButton_taw { - idc = -1; - style = 0; - default = 0; - shadow = 1; - w = 0.183825; - h = "( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20)"; - color[] = {1,1,1,1.0}; - colorFocused[] = {1,1,1,1.0}; - color2[] = {0.95,0.95,0.95,1}; - colorDisabled[] = {1,1,1,0.25}; - colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; - colorBackgroundFocused[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; - colorBackground2[] = {1,1,1,1}; - animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; - animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; - animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; - animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa"; - animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa"; - animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa"; - periodFocus = 1.2; - periodOver = 0.8; - class HitZone - { - left = 0.0; - top = 0.0; - right = 0.0; - bottom = 0.0; - }; - class ShortcutPos - { - left = 0; - top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; - w = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; - h = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - }; - class TextPos - { - left = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; - top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; - right = 0.005; - bottom = 0.0; - }; - period = 0.4; - font = "PuristaMedium"; - size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = ""; - soundEnter[] = {"\A3\ui_f\data\sound\RscButton\soundEnter",0.09,1}; - soundPush[] = {"\A3\ui_f\data\sound\RscButton\soundPush",0.09,1}; - soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; - soundEscape[] = {"\A3\ui_f\data\sound\RscButton\soundEscape",0.09,1}; - action = ""; - class Attributes - { - font = "PuristaMedium"; - color = "#E5E5E5"; - align = "left"; - shadow = "true"; - }; - class AttributesImage - { - font = "PuristaMedium"; - color = "#E5E5E5"; - align = "left"; - }; + idc = -1; + style = 0; + default = 0; + shadow = 1; + w = 0.183825; + h = "( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20)"; + color[] = {1,1,1,1.0}; + colorFocused[] = {1,1,1,1.0}; + color2[] = {0.95,0.95,0.95,1}; + colorDisabled[] = {1,1,1,0.25}; + colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + colorBackgroundFocused[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + colorBackground2[] = {1,1,1,1}; + animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa"; + animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa"; + animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa"; + periodFocus = 1.2; + periodOver = 0.8; + class HitZone + { + left = 0.0; + top = 0.0; + right = 0.0; + bottom = 0.0; + }; + class ShortcutPos + { + left = 0; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + w = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; + h = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + }; + class TextPos + { + left = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + right = 0.005; + bottom = 0.0; + }; + period = 0.4; + font = "PuristaMedium"; + size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + text = ""; + soundEnter[] = {"\A3\ui_f\data\sound\RscButton\soundEnter",0.09,1}; + soundPush[] = {"\A3\ui_f\data\sound\RscButton\soundPush",0.09,1}; + soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; + soundEscape[] = {"\A3\ui_f\data\sound\RscButton\soundEscape",0.09,1}; + action = ""; + class Attributes + { + font = "PuristaMedium"; + color = "#E5E5E5"; + align = "left"; + shadow = "true"; + }; + class AttributesImage + { + font = "PuristaMedium"; + color = "#E5E5E5"; + align = "left"; + }; }; class RscControlsGroup { - type = 15; - idc = -1; - x = 0; - y = 0; - w = 1; - h = 1; - shadow = 0; - style = 16; - - class ScrollBar { - color[] = {1, 1, 1, 0.6}; - colorActive[] = {1, 1, 1, 1}; - colorDisabled[] = {1, 1, 1, 0.3}; - thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; - arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; - arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; - border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; - shadow = 0; - scrollSpeed = 0.05; - }; - - class VScrollbar:ScrollBar { - width = 0.021; - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - shadow = 0; - color[] = {1, 1, 1, 0.6}; - }; - - class HScrollbar:ScrollBar { - height = 0.028; - shadow = 0; - color[] = {1, 1, 1, 0.6}; - }; - - //class ListScrollBar : ScrollBar {}; - - class Controls {}; + type = 15; + idc = -1; + x = 0; + y = 0; + w = 1; + h = 1; + shadow = 0; + style = 16; + + class ScrollBar { + color[] = {1, 1, 1, 0.6}; + colorActive[] = {1, 1, 1, 1}; + colorDisabled[] = {1, 1, 1, 0.3}; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + shadow = 0; + scrollSpeed = 0.05; + }; + + class VScrollbar:ScrollBar { + width = 0.021; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + shadow = 0; + color[] = {1, 1, 1, 0.6}; + }; + + class HScrollbar:ScrollBar { + height = 0.028; + shadow = 0; + color[] = {1, 1, 1, 0.6}; + }; + + //class ListScrollBar : ScrollBar {}; + + class Controls {}; }; class RscControlsGroupNoScrollbars : RscControlsGroup { - class VScrollbar : VScrollbar { - width = 0; - }; + class VScrollbar : VScrollbar { + width = 0; + }; - class HScrollbar : HScrollbar { - height = 0; - }; + class HScrollbar : HScrollbar { + height = 0; + }; }; class RscButtonMenu:RscShortcutButton_taw { - idc = -1; - type = 16; - style = "0x02 + 0xC0"; - default = 0; - shadow = 0; - x = 0; - y = 0; - w = 0.095589; - h = 0.039216; - animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; - animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; - colorBackground[] = {0,0,0,0.8}; - colorBackgroundFocused[] = {1,1,1,1}; - colorBackground2[] = {0.75,0.75,0.75,1}; - color[] = {1,1,1,1}; - colorFocused[] = {0,0,0,1}; - color2[] = {0,0,0,1}; - colorText[] = {1,1,1,1}; - colorDisabled[] = {1,1,1,0.25}; - period = 1.2; - periodFocus = 1.2; - periodOver = 1.2; - size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - tooltipColorText[] = {1,1,1,1}; - tooltipColorBox[] = {1,1,1,1}; - tooltipColorShade[] = {0,0,0,0.65}; - class TextPos - { - left = "0.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; - top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; - right = 0.005; - bottom = 0.0; - }; - class Attributes - { - font = "PuristaLight"; - color = "#E5E5E5"; - align = "left"; - shadow = "false"; - }; - class ShortcutPos - { - left = "(6.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005"; - top = 0.005; - w = 0.0225; - h = 0.03; - }; - soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",0.09,1}; - soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1}; - soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick",0.09,1}; - soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1}; - textureNoShortcut = ""; + idc = -1; + type = 16; + style = "0x02 + 0xC0"; + default = 0; + shadow = 0; + x = 0; + y = 0; + w = 0.095589; + h = 0.039216; + animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; + animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; + colorBackground[] = {0,0,0,0.8}; + colorBackgroundFocused[] = {1,1,1,1}; + colorBackground2[] = {0.75,0.75,0.75,1}; + color[] = {1,1,1,1}; + colorFocused[] = {0,0,0,1}; + color2[] = {0,0,0,1}; + colorText[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.25}; + period = 1.2; + periodFocus = 1.2; + periodOver = 1.2; + size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + tooltipColorText[] = {1,1,1,1}; + tooltipColorBox[] = {1,1,1,1}; + tooltipColorShade[] = {0,0,0,0.65}; + class TextPos + { + left = "0.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + right = 0.005; + bottom = 0.0; + }; + class Attributes + { + font = "PuristaLight"; + color = "#E5E5E5"; + align = "left"; + shadow = "false"; + }; + class ShortcutPos + { + left = "(6.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005"; + top = 0.005; + w = 0.0225; + h = 0.03; + }; + soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",0.09,1}; + soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1}; + soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick",0.09,1}; + soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1}; + textureNoShortcut = ""; }; class TAW_VDMenu { - idd = MENU_IDD; - name = "TAW_VDMenu"; - movingEnabled = 0; - enableSimulation = 1; - - onLoad = "((_this select 0) displayCtrl 2999) ctrlSetFade 1; ((_this select 0) displayCtrl 2999) ctrlCommit 0;"; - - class controlsBackground { - class TitleBackground : RscText_taw { - colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; - idc = -1; - x = .3; - y = .2; - w = .5; - h = (1 / 25); - }; - - class MainBackground : RscText_taw { - colorBackground[] = { 0, 0, 0, .7 }; - idc = -1; - x = .3; - y = .2 + (11 / 250); - w = .5; - h = .57 - (22 / 250); - }; - - class Title : RscTitle { - colorBackround[] = { 0, 0, 0, 0 }; - idc = -1; - text = "View Settings (SCRIPT)"; - x = .3; - y = .2; - w = .8; - h = (1 / 25); - }; - - class OnFootText : RscText_taw { - idc = -1; - text = "Infantry:"; - x = .32; - y = .258; - w = .275; - h = .04; - }; - - class inCarText : OnFootText { - text = "Ground:"; - y = .305; - }; - - class inAirText : OnFootText { - text = "Air:"; - y = .355; - }; - - class ObjectText : OnFootText { - text = "Object:"; - y = .655; - }; - - class DroneText : OnFootText { - text = "Drone:"; - y = .405; - }; - - class TerrainBackground : TitleBackground { - text = "Grass Settings"; - shadow = 0; - y = .46; - }; - - class ObjectBackground : TitleBackground { - text = "Object Settings"; - y = .55; - }; - - class ButtonClose : RscButtonMenu { - idc = -1; - text = "Close"; - onButtonClick = "closeDialog 0;"; - x = 0.3; - y = 0.77 - (1 / 25); - w = (6.25 / 40); - h = (1 / 25); - }; - - class SaveManagerBtn:ButtonClose { - text = "Saves"; - onButtonClick = "[] call tawvd_fnc_openSaveManager;"; - x = .465; - }; - }; - - class controls { - - //Sliders - class VD_onFoot_slider : RscXSliderH { - idc = INFANTRY_SLIDER; - text = ""; - onSliderPosChanged = "[0, _this select 1] call TAWVD_fnc_onSliderChanged;"; - toolTip = "View Distance while on foot"; - x = .42; - y = .30 - (1 / 25); - w = "9 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - }; - - class VD_inCar_slider : VD_onFoot_slider { - idc = GROUND_SLIDER; - toolTip = "View distance while in a ground vehicle"; - onSliderPosChanged = "[1, _this select 1] call TAWVD_fnc_onSliderChanged;"; - y = .35 - (1 / 25); - }; - - class VD_inAir_slider : VD_onFoot_slider { - idc = AIR_SLIDER; - toolTip = "View distance while in an aircraft"; - onSliderPosChanged = "[2, _this select 1] call TAWVD_fnc_onSliderChanged;"; - y = .40 - (1 / 25); - }; - - class VD_Object_slider : VD_onFoot_slider { - idc = OBJECT_SLIDER; - toolTip = "Object rendering distance"; - onSliderPosChanged = "[3, _this select 1] call TAWVD_fnc_onSliderChanged;"; - y = .7 - (1 / 25); - }; - - class VD_Drone_slider:VD_onFoot_slider { - idc = DRONE_SLIDER; - toolTip = "View distance while operating a UAV/UGV"; - onSliderPosChanged = "[4, _this select 1] call TAWVD_fnc_onSliderChanged;"; - y = .45 - (1 / 25); - } - - //Values (RscEdit Butons) - class VD_onFoot_Edit : RscEdit_taw { - idc = INFANTRY_EDIT; - text = ""; - onKeyUp = "[_this select 0, _this select 1, 'ground',true] call TAWVD_fnc_onChar;"; - - x = .7; - y = .258; - w = .08; - h = .04; - }; - - class VD_inCar_Edit : VD_onFoot_Edit { - idc = GROUND_EDIT; - onKeyUp = "[_this select 0, _this select 1, 'vehicle',true] call TAWVD_fnc_onChar;"; - y = .31; - }; - - class VD_inAir_Edit : VD_onFoot_Edit { - idc = AIR_EDIT; - onKeyUp = "[_this select 0, _this select 1, 'air',true] call TAWVD_fnc_onChar;"; - y = .36; - }; - - class VD_inDrone_Edit:VD_onFoot_Edit { - idc = DRONE_EDIT; - onKeyUp = "[_this select 0, _this select 1, 'drone',true] call TAWVD_fnc_onChar;"; - y = .41; - }; - - class VD_Object_Edit : VD_onFoot_Edit { - idc = OBJECT_EDIT; - onKeyUp = "[_this select 0, _this select 1, 'object',true] call TAWVD_fnc_onChar;"; - y = .656; - }; - - //Grass Settings - class VD_terrain_none { - idc = TERRAIN_NONE; - type = 11; - style = 0; - font = "PuristaLight"; - color[] = { 1, 1, 1, 1 }; - colorActive[] = { 1, 0.2, 0.2, 1 }; - colorDisabled[] = {0, 0, 0, 1}; - soundEnter[] = { "\A3\ui_f\data\sound\onover", 0.09, 1 }; - soundPush[] = { "\A3\ui_f\data\sound\new1", 0.0, 0 }; - soundClick[] = { "\A3\ui_f\data\sound\onclick", 0.07, 1 }; - soundEscape[] = { "\A3\ui_f\data\sound\onescape", 0.09, 1 }; - text = "None"; - action = "['none'] call TAWVD_fnc_onTerrainChanged;"; - sizeEx = 0.04; - - x = .38; y = .505; - w = .275; h = .04; - }; - - class VD_terrain_low : VD_terrain_none { - idc = -1; - text = "Low"; - action = "['low'] call TAWVD_fnc_onTerrainChanged;"; - x = .47; - }; - - class VD_terrain_normal : VD_terrain_none { - idc = -1; - text = "Normal"; - action = "['norm'] call TAWVD_fnc_onTerrainChanged;"; - x = .56; - }; - - class VD_terrain_high : VD_terrain_none { - idc = -1; - text = "High"; - action = "['high'] call TAWVD_fnc_onTerrainChanged;"; - x = .67; - }; - - class ObjectSyncCheckbox : RscCheckbox - { - idc = 2931; - x = .32; y = .6; - tooltip = "Sync object rendering with view rendering"; - onCheckedChanged = "if((_this select 1) == 1) then {tawvd_syncObject = true;ctrlEnable [2941,false]; ctrlEnable [2942,false];} else {tawvd_syncObject = false; ctrlEnable [2942,true]; ctrlEnable [2941,true];};"; - w = 1 * GUI_GRID_CENTER_W; - h = 1 * GUI_GRID_CENTER_H; - }; - - class ObjectSynctext : RscText_taw { - idc = -1; - text = "Sync with view"; - x = .345; y = .596; - w = .35; h = .04; - }; - - class Manager:RscControlsGroup { - idc = MANAGER_GROUP; - - x = -0.21; y = .2; - w = .5; h = 3; - class Controls { - class SaveLoadGroup:RscControlsGroupNoScrollbars { - idc = SAVELOAD_GROUP; - - x = 0; - y = 0; - w = .5; - h = 3; - - class Controls { - class MyTitleBackground:RscText_taw { - colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; - idc = -1; - x = 0; - y = 0; - w = .5; - h = (1 / 25); - }; - - class Title : RscTitle { - colorBackround[] = { 0, 0, 0, 0 }; - idc = -1; - text = "Save Manager"; - x = 0; - y = 0; - w = .8; - h = (1 / 25); - }; - - class MainBackground:RscText_taw { - colorBackground[] = { 0, 0, 0, .7 }; - idc = -1; - x = 0; - y = 0 + (11 / 250); - w = .5; - h = .57 - (22 / 250); - }; - - class SaveList:RscListBox_taw { - idc = SAVES_LIST; - sizeEx = 0.04; - colorBackground[] = {0.1,0.1,0.1,0.9}; - x = 0; y = 0 + (11 / 250); - w = .5; h = .49 - (22 / 250); - - onLBSelChanged = "_this call TAWVD_fnc_onSaveSelectionChanged;"; - }; - - class SaveSlotName:VD_onFoot_Edit { - idc = SLOT_NAME; - text = "SAVE NAME"; - colorBackground[] = {0,0,0,0.6}; - onKeyUp = ""; - - x = .025; y = .42 + (11 / 250); - w = .45; - }; - - class SaveButton:RscButtonMenu { - text = "Save"; - onButtonClick = "[] call TAWVD_fnc_onSavePressed;"; - x = 0; - y = 0.57 - (1 / 25); - w = (6.25 / 40); - h = (1 / 25); - }; - - class HideButton:RscButtonMenu { - text = "Hide"; - onButtonClick = "((findDisplay 2900) displayCtrl 2999) ctrlSetFade 1; ((findDisplay 2900) displayCtrl 2999) ctrlCommit 0.3;"; - x = .16; - y = 0.57 - (1 / 25); - w = (6.25 / 40); - h = (1 / 25); - }; - }; - }; - }; - }; - }; + idd = MENU_IDD; + name = "TAW_VDMenu"; + movingEnabled = 0; + enableSimulation = 1; + + onLoad = "((_this select 0) displayCtrl 2999) ctrlSetFade 1; ((_this select 0) displayCtrl 2999) ctrlCommit 0;"; + + class controlsBackground { + class TitleBackground : RscText_taw { + colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; + idc = -1; + x = .3; + y = .2; + w = .5; + h = (1 / 25); + }; + + class MainBackground : RscText_taw { + colorBackground[] = { 0, 0, 0, .7 }; + idc = -1; + x = .3; + y = .2 + (11 / 250); + w = .5; + h = .57 - (22 / 250); + }; + + class Title : RscTitle { + colorBackround[] = { 0, 0, 0, 0 }; + idc = -1; + text = "View Settings (SCRIPT)"; + x = .3; + y = .2; + w = .8; + h = (1 / 25); + }; + + class OnFootText : RscText_taw { + idc = -1; + text = "Infantry:"; + x = .32; + y = .258; + w = .275; + h = .04; + }; + + class inCarText : OnFootText { + text = "Ground:"; + y = .305; + }; + + class inAirText : OnFootText { + text = "Air:"; + y = .355; + }; + + class ObjectText : OnFootText { + text = "Object:"; + y = .655; + }; + + class DroneText : OnFootText { + text = "Drone:"; + y = .405; + }; + + class TerrainBackground : TitleBackground { + text = "Grass Settings"; + shadow = 0; + y = .46; + }; + + class ObjectBackground : TitleBackground { + text = "Object Settings"; + y = .55; + }; + + class ButtonClose : RscButtonMenu { + idc = -1; + text = "Close"; + onButtonClick = "closeDialog 0;"; + x = 0.3; + y = 0.77 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + + class SaveManagerBtn:ButtonClose { + text = "Saves"; + onButtonClick = "[] call tawvd_fnc_openSaveManager;"; + x = .465; + }; + }; + + class controls { + + //Sliders + class VD_onFoot_slider : RscXSliderH { + idc = INFANTRY_SLIDER; + text = ""; + onSliderPosChanged = "[0, _this select 1] call TAWVD_fnc_onSliderChanged;"; + toolTip = "View Distance while on foot"; + x = .42; + y = .30 - (1 / 25); + w = "9 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + }; + + class VD_inCar_slider : VD_onFoot_slider { + idc = GROUND_SLIDER; + toolTip = "View distance while in a ground vehicle"; + onSliderPosChanged = "[1, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .35 - (1 / 25); + }; + + class VD_inAir_slider : VD_onFoot_slider { + idc = AIR_SLIDER; + toolTip = "View distance while in an aircraft"; + onSliderPosChanged = "[2, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .40 - (1 / 25); + }; + + class VD_Object_slider : VD_onFoot_slider { + idc = OBJECT_SLIDER; + toolTip = "Object rendering distance"; + onSliderPosChanged = "[3, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .7 - (1 / 25); + }; + + class VD_Drone_slider:VD_onFoot_slider { + idc = DRONE_SLIDER; + toolTip = "View distance while operating a UAV/UGV"; + onSliderPosChanged = "[4, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .45 - (1 / 25); + } + + //Values (RscEdit Butons) + class VD_onFoot_Edit : RscEdit_taw { + idc = INFANTRY_EDIT; + text = ""; + onKeyUp = "[_this select 0, _this select 1, 'ground',true] call TAWVD_fnc_onChar;"; + + x = .7; + y = .258; + w = .08; + h = .04; + }; + + class VD_inCar_Edit : VD_onFoot_Edit { + idc = GROUND_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'vehicle',true] call TAWVD_fnc_onChar;"; + y = .31; + }; + + class VD_inAir_Edit : VD_onFoot_Edit { + idc = AIR_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'air',true] call TAWVD_fnc_onChar;"; + y = .36; + }; + + class VD_inDrone_Edit:VD_onFoot_Edit { + idc = DRONE_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'drone',true] call TAWVD_fnc_onChar;"; + y = .41; + }; + + class VD_Object_Edit : VD_onFoot_Edit { + idc = OBJECT_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'object',true] call TAWVD_fnc_onChar;"; + y = .656; + }; + + //Grass Settings + class VD_terrain_none { + idc = TERRAIN_NONE; + type = 11; + style = 0; + font = "PuristaLight"; + color[] = { 1, 1, 1, 1 }; + colorActive[] = { 1, 0.2, 0.2, 1 }; + colorDisabled[] = {0, 0, 0, 1}; + soundEnter[] = { "\A3\ui_f\data\sound\onover", 0.09, 1 }; + soundPush[] = { "\A3\ui_f\data\sound\new1", 0.0, 0 }; + soundClick[] = { "\A3\ui_f\data\sound\onclick", 0.07, 1 }; + soundEscape[] = { "\A3\ui_f\data\sound\onescape", 0.09, 1 }; + text = "None"; + action = "['none'] call TAWVD_fnc_onTerrainChanged;"; + sizeEx = 0.04; + + x = .38; y = .505; + w = .275; h = .04; + }; + + class VD_terrain_low : VD_terrain_none { + idc = -1; + text = "Low"; + action = "['low'] call TAWVD_fnc_onTerrainChanged;"; + x = .47; + }; + + class VD_terrain_normal : VD_terrain_none { + idc = -1; + text = "Normal"; + action = "['norm'] call TAWVD_fnc_onTerrainChanged;"; + x = .56; + }; + + class VD_terrain_high : VD_terrain_none { + idc = -1; + text = "High"; + action = "['high'] call TAWVD_fnc_onTerrainChanged;"; + x = .67; + }; + + class ObjectSyncCheckbox : RscCheckbox + { + idc = 2931; + x = .32; y = .6; + tooltip = "Sync object rendering with view rendering"; + onCheckedChanged = "if((_this select 1) == 1) then {tawvd_syncObject = true;ctrlEnable [2941,false]; ctrlEnable [2942,false];} else {tawvd_syncObject = false; ctrlEnable [2942,true]; ctrlEnable [2941,true];};"; + w = 1 * GUI_GRID_CENTER_W; + h = 1 * GUI_GRID_CENTER_H; + }; + + class ObjectSynctext : RscText_taw { + idc = -1; + text = "Sync with view"; + x = .345; y = .596; + w = .35; h = .04; + }; + + class Manager:RscControlsGroup { + idc = MANAGER_GROUP; + + x = -0.21; y = .2; + w = .5; h = 3; + class Controls { + class SaveLoadGroup:RscControlsGroupNoScrollbars { + idc = SAVELOAD_GROUP; + + x = 0; + y = 0; + w = .5; + h = 3; + + class Controls { + class MyTitleBackground:RscText_taw { + colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; + idc = -1; + x = 0; + y = 0; + w = .5; + h = (1 / 25); + }; + + class Title : RscTitle { + colorBackround[] = { 0, 0, 0, 0 }; + idc = -1; + text = "Save Manager"; + x = 0; + y = 0; + w = .8; + h = (1 / 25); + }; + + class MainBackground:RscText_taw { + colorBackground[] = { 0, 0, 0, .7 }; + idc = -1; + x = 0; + y = 0 + (11 / 250); + w = .5; + h = .57 - (22 / 250); + }; + + class SaveList:RscListBox_taw { + idc = SAVES_LIST; + sizeEx = 0.04; + colorBackground[] = {0.1,0.1,0.1,0.9}; + x = 0; y = 0 + (11 / 250); + w = .5; h = .49 - (22 / 250); + + onLBSelChanged = "_this call TAWVD_fnc_onSaveSelectionChanged;"; + }; + + class SaveSlotName:VD_onFoot_Edit { + idc = SLOT_NAME; + text = "SAVE NAME"; + colorBackground[] = {0,0,0,0.6}; + onKeyUp = ""; + + x = .025; y = .42 + (11 / 250); + w = .45; + }; + + class SaveButton:RscButtonMenu { + text = "Save"; + onButtonClick = "[] call TAWVD_fnc_onSavePressed;"; + x = 0; + y = 0.57 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + + class HideButton:RscButtonMenu { + text = "Hide"; + onButtonClick = "((findDisplay 2900) displayCtrl 2999) ctrlSetFade 1; ((findDisplay 2900) displayCtrl 2999) ctrlCommit 0.3;"; + x = .16; + y = 0.57 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + }; + }; + }; + }; + }; }; diff --git a/source/functions/taw_vd/defines.h b/source/functions/taw_vd/defines.h index e75b7f9..02f92ef 100644 --- a/source/functions/taw_vd/defines.h +++ b/source/functions/taw_vd/defines.h @@ -11,12 +11,12 @@ #define DRONE_SLIDER 2951 #define DRONE_EDIT 2952 #define TERRAIN_NONE 2950 -#define GUI_GRID_CENTER_WAbs ((safezoneW / safezoneH) min 1.2) -#define GUI_GRID_CENTER_HAbs (GUI_GRID_CENTER_WAbs / 1.2) -#define GUI_GRID_CENTER_W (GUI_GRID_CENTER_WAbs / 40) -#define GUI_GRID_CENTER_H (GUI_GRID_CENTER_HAbs / 25) -#define GUI_GRID_CENTER_X (safezoneX + (safezoneW - GUI_GRID_CENTER_WAbs)/2) -#define GUI_GRID_CENTER_Y (safezoneY + (safezoneH - GUI_GRID_CENTER_HAbs)/2) +#define GUI_GRID_CENTER_WAbs ((safezoneW / safezoneH) min 1.2) +#define GUI_GRID_CENTER_HAbs (GUI_GRID_CENTER_WAbs / 1.2) +#define GUI_GRID_CENTER_W (GUI_GRID_CENTER_WAbs / 40) +#define GUI_GRID_CENTER_H (GUI_GRID_CENTER_HAbs / 25) +#define GUI_GRID_CENTER_X (safezoneX + (safezoneW - GUI_GRID_CENTER_WAbs)/2) +#define GUI_GRID_CENTER_Y (safezoneY + (safezoneH - GUI_GRID_CENTER_HAbs)/2) #define ST_LEFT 0x00 #define ST_MULTI 0x10 #define SEL(ARRAY,INDEX) (ARRAY select INDEX) diff --git a/source/functions/taw_vd/fn_onChar.sqf b/source/functions/taw_vd/fn_onChar.sqf index 2026cab..c655536 100644 --- a/source/functions/taw_vd/fn_onChar.sqf +++ b/source/functions/taw_vd/fn_onChar.sqf @@ -1,16 +1,16 @@ #include "defines.h" /* - Author: Bryan "Tonic" Boardwine - - Description: - When a character is entered it is validated and changes the - correct slider it is associated with. I probably over-complicated - this more then I had to but onChar behaves weird. - - PARAMS: - 0: CONTROL - 1: SCALAR (INT) - 2: STRING (Case option) + Author: Bryan "Tonic" Boardwine + + Description: + When a character is entered it is validated and changes the + correct slider it is associated with. I probably over-complicated + this more then I had to but onChar behaves weird. + + PARAMS: + 0: CONTROL + 1: SCALAR (INT) + 2: STRING (Case option) */ private["_value","_varName","_maxRange"]; params ["_control","_code","_slider"]; @@ -23,12 +23,12 @@ _value = parseNumber (ctrlText _control); if(_value > _maxRange OR _value < 100) exitwith {[] call TAWVD_fnc_openMenu;}; _varName = switch (_slider) do { - case "ground": {"tawvd_foot"}; - case "vehicle": {"tawvd_car"}; - case "air": {"tawvd_air"}; - case "object": {"tawvd_object"}; - case "drone": {"tawvd_drone"}; - default {"tawvd_foot"}; + case "ground": {"tawvd_foot"}; + case "vehicle": {"tawvd_car"}; + case "air": {"tawvd_air"}; + case "object": {"tawvd_object"}; + case "drone": {"tawvd_drone"}; + default {"tawvd_foot"}; }; SVAR_MNS [_varName,_value]; diff --git a/source/functions/taw_vd/fn_onSavePressed.sqf b/source/functions/taw_vd/fn_onSavePressed.sqf index fb5ea4a..fe9e93e 100644 --- a/source/functions/taw_vd/fn_onSavePressed.sqf +++ b/source/functions/taw_vd/fn_onSavePressed.sqf @@ -1,25 +1,25 @@ #include "defines.h" /* - Author: Bryan "Tonic" Boardwine - - Description: - Updates the view distance dependant on whether the player - is on foot, a car or an aircraft. + Author: Bryan "Tonic" Boardwine + + Description: + Updates the view distance dependant on whether the player + is on foot, a car or an aircraft. */ private ["_saveIndex","_saveName"]; _saveIndex = lbCurSel SAVES_LIST; _saveName = ctrlText SLOT_NAME; SVAR_PNS [format["tawvd_slot_%1",_saveIndex], - [ - _saveName, - tawvd_foot, - tawvd_car, - tawvd_air, - tawvd_drone, - tawvd_object, - tawvd_syncObject - ] + [ + _saveName, + tawvd_foot, + tawvd_car, + tawvd_air, + tawvd_drone, + tawvd_object, + tawvd_syncObject + ] ]; saveProfileNamespace; diff --git a/source/functions/taw_vd/fn_onSaveSelectionChanged.sqf b/source/functions/taw_vd/fn_onSaveSelectionChanged.sqf index 2715028..cd3fb26 100644 --- a/source/functions/taw_vd/fn_onSaveSelectionChanged.sqf +++ b/source/functions/taw_vd/fn_onSaveSelectionChanged.sqf @@ -1,10 +1,10 @@ #include "defines.h" /* - Author: Bryan "Tonic" Boardwine - - Description: - Updates the view distance dependant on whether the player - is on foot, a car or an aircraft. + Author: Bryan "Tonic" Boardwine + + Description: + Updates the view distance dependant on whether the player + is on foot, a car or an aircraft. */ private "_saveData"; params [["_control",controlNull,[controlNull]],["_index",-1,[0]]]; diff --git a/source/functions/taw_vd/fn_onSliderChanged.sqf b/source/functions/taw_vd/fn_onSliderChanged.sqf index a8423d5..0bf0d73 100644 --- a/source/functions/taw_vd/fn_onSliderChanged.sqf +++ b/source/functions/taw_vd/fn_onSliderChanged.sqf @@ -1,10 +1,10 @@ #include "defines.h" /* - Author: Bryan "Tonic" Boardwine - - Description: - Called when the slider is changed for any field and - updates the view distance for it. + Author: Bryan "Tonic" Boardwine + + Description: + Called when the slider is changed for any field and + updates the view distance for it. */ private "_varData"; params [["_mode",-1,[0]],["_value",-1,[0]]]; @@ -14,11 +14,11 @@ if(EQUAL(_mode,-1) OR EQUAL(_value,-1)) exitWith {}; disableSerialization; _varData = switch(_mode) do { - case 0: {["tawvd_foot",INFANTRY_EDIT]}; - case 1: {["tawvd_car",GROUND_EDIT]}; - case 2: {["tawvd_air",AIR_EDIT]}; - case 3: {["tawvd_object",OBJECT_EDIT]}; - case 4: {["tawvd_drone",DRONE_EDIT]}; + case 0: {["tawvd_foot",INFANTRY_EDIT]}; + case 1: {["tawvd_car",GROUND_EDIT]}; + case 2: {["tawvd_air",AIR_EDIT]}; + case 3: {["tawvd_object",OBJECT_EDIT]}; + case 4: {["tawvd_drone",DRONE_EDIT]}; }; SVAR_MNS [SEL(_varData,0),round(_value)]; @@ -26,10 +26,10 @@ ctrlSetText[SEL(_varData,1),str(GVAR_MNS SEL(_varData,0))]; [] call TAWVD_fnc_updateViewDistance; if(EQUAL(_mode,3)) then { - setObjectViewDistance [tawvd_object,100]; + setObjectViewDistance [tawvd_object,100]; }; if(tawvd_syncObject) then { - sliderSetPosition[OBJECT_SLIDER, tawvd_object]; - ctrlSetText[OBJECT_EDIT,str(tawvd_object)]; + sliderSetPosition[OBJECT_SLIDER, tawvd_object]; + ctrlSetText[OBJECT_EDIT,str(tawvd_object)]; }; \ No newline at end of file diff --git a/source/functions/taw_vd/fn_onTerrainChanged.sqf b/source/functions/taw_vd/fn_onTerrainChanged.sqf index 2194d9d..e75f7e2 100644 --- a/source/functions/taw_vd/fn_onTerrainChanged.sqf +++ b/source/functions/taw_vd/fn_onTerrainChanged.sqf @@ -1,17 +1,17 @@ /* - Author: Bryan "Tonic" Boardwine - - Description: - Updates the players terraingrid when called. + Author: Bryan "Tonic" Boardwine + + Description: + Updates the players terraingrid when called. */ private "_type"; _type = param [0,"",[""]]; if(_type == "") exitWith {}; - + switch (_type) do { - case "none": {if(isNil "tawvd_disablenone") then {setTerrainGrid 50;};}; - case "low": {setTerrainGrid 30;}; - case "norm": {setTerrainGrid 12.5;}; - case "high": {setTerrainGrid 3.125;}; + case "none": {if(isNil "tawvd_disablenone") then {setTerrainGrid 50;};}; + case "low": {setTerrainGrid 30;}; + case "norm": {setTerrainGrid 12.5;}; + case "high": {setTerrainGrid 3.125;}; }; \ No newline at end of file diff --git a/source/functions/taw_vd/fn_openMenu.sqf b/source/functions/taw_vd/fn_openMenu.sqf index bac3f4d..5b15560 100644 --- a/source/functions/taw_vd/fn_openMenu.sqf +++ b/source/functions/taw_vd/fn_openMenu.sqf @@ -1,41 +1,41 @@ #include "defines.h" /* - Author: Bryan "Tonic" Boardwine - - Description: - Called via addAction and opens the TAW View Distance Menu + Author: Bryan "Tonic" Boardwine + + Description: + Called via addAction and opens the TAW View Distance Menu */ if(isNull (findDisplay MENU_IDD)) then { - if(!createDialog "TAW_VDMenu") exitWith {hint "Something went wrong, the menu won't open?"}; + if(!createDialog "TAW_VDMenu") exitWith {hint "Something went wrong, the menu won't open?"}; }; disableSerialization; { - ctrlSetText[SEL(_x,0),str(SEL(_x,1))]; + ctrlSetText[SEL(_x,0),str(SEL(_x,1))]; } foreach [[INFANTRY_EDIT,tawvd_foot],[GROUND_EDIT,tawvd_car],[AIR_EDIT,tawvd_air],[OBJECT_EDIT,tawvd_object],[DRONE_EDIT,tawvd_drone]]; //Setup the sliders { - if(!isNil "tawvd_maxRange") then { - slidersetRange [_x select 0,100,tawvd_maxRange]; - } else { - slidersetRange [_x select 0,100,20000]; - }; - ((findDisplay MENU_IDD) displayCtrl (_x select 0)) sliderSetSpeed [100,100,100]; - sliderSetPosition[_x select 0, _x select 1]; + if(!isNil "tawvd_maxRange") then { + slidersetRange [_x select 0,100,tawvd_maxRange]; + } else { + slidersetRange [_x select 0,100,20000]; + }; + ((findDisplay MENU_IDD) displayCtrl (_x select 0)) sliderSetSpeed [100,100,100]; + sliderSetPosition[_x select 0, _x select 1]; } foreach [[INFANTRY_SLIDER,tawvd_foot],[GROUND_SLIDER,tawvd_car],[AIR_SLIDER,tawvd_air],[OBJECT_SLIDER,tawvd_object],[DRONE_SLIDER,tawvd_drone]]; ((findDisplay MENU_IDD) displayCtrl 2931) cbSetChecked tawvd_syncObject; if(tawvd_syncObject) then { - ctrlEnable [OBJECT_SLIDER,false]; - ctrlEnable [OBJECT_EDIT,false]; + ctrlEnable [OBJECT_SLIDER,false]; + ctrlEnable [OBJECT_EDIT,false]; } else { - ctrlEnable [OBJECT_SLIDER,true]; - ctrlEnable [OBJECT_EDIT,true]; + ctrlEnable [OBJECT_SLIDER,true]; + ctrlEnable [OBJECT_EDIT,true]; }; //Lets disable it.. if(!isNil "tawvd_disablenone") then { - ctrlEnable [TERRAIN_NONE,false]; + ctrlEnable [TERRAIN_NONE,false]; }; \ No newline at end of file diff --git a/source/functions/taw_vd/fn_openSaveManager.sqf b/source/functions/taw_vd/fn_openSaveManager.sqf index 03a4029..33c0fa8 100644 --- a/source/functions/taw_vd/fn_openSaveManager.sqf +++ b/source/functions/taw_vd/fn_openSaveManager.sqf @@ -1,10 +1,10 @@ #include "defines.h" /* - Author: Bryan "Tonic" Boardwine - - Description: - Updates the view distance dependant on whether the player - is on foot, a car or an aircraft. + Author: Bryan "Tonic" Boardwine + + Description: + Updates the view distance dependant on whether the player + is on foot, a car or an aircraft. */ private ["_controlGrp","_saveList"]; disableSerialization; @@ -20,12 +20,12 @@ _controlGrp ctrlCommit .3; /* Fill the listbox */ for "_i" from 0 to 9 do { - _varData = GVAR_PNS format["tawvd_slot_%1",_i]; - if(!isNil "_varData") then { - _saveList lbAdd SEL(_varData,0); - _saveList lbSetData [(lbSize _saveList)-1,"true"]; - } else { - _saveList lbAdd format["Save Slot %1",_i]; - _saveList lbSetData [(lbSize _saveList)-1,"false"]; - }; + _varData = GVAR_PNS format["tawvd_slot_%1",_i]; + if(!isNil "_varData") then { + _saveList lbAdd SEL(_varData,0); + _saveList lbSetData [(lbSize _saveList)-1,"true"]; + } else { + _saveList lbAdd format["Save Slot %1",_i]; + _saveList lbSetData [(lbSize _saveList)-1,"false"]; + }; }; \ No newline at end of file diff --git a/source/functions/taw_vd/fn_stateTracker.fsm b/source/functions/taw_vd/fn_stateTracker.fsm index ba7e91e..16f4c4f 100644 --- a/source/functions/taw_vd/fn_stateTracker.fsm +++ b/source/functions/taw_vd/fn_stateTracker.fsm @@ -39,12 +39,12 @@ class FSM "tawvd_addon_disable = true;" \n "" \n "if(isNil {profileNamespace getVariable ""tawvd_foot""}) then {" \n - " profileNamespace setVariable [""tawvd_foot"",viewDistance];" \n - " profileNamespace setVariable [""tawvd_car"",viewDistance];" \n - " profileNamespace setVariable [""tawvd_air"",viewDistance];" \n - " profileNamespace setVariable [""tawvd_drone"",viewDistance];" \n - " profileNamespace setVariable [""tawvd_object"",viewDistance];" \n - " saveProfileNamespace;" \n + " profileNamespace setVariable [""tawvd_foot"",viewDistance];" \n + " profileNamespace setVariable [""tawvd_car"",viewDistance];" \n + " profileNamespace setVariable [""tawvd_air"",viewDistance];" \n + " profileNamespace setVariable [""tawvd_drone"",viewDistance];" \n + " profileNamespace setVariable [""tawvd_object"",viewDistance];" \n + " saveProfileNamespace;" \n "};" \n "" \n "tawvd_foot = profileNamespace getVariable [""tawvd_foot"",viewDistance];" \n diff --git a/source/functions/taw_vd/fn_updateViewDistance.sqf b/source/functions/taw_vd/fn_updateViewDistance.sqf index 38fe689..d30f1e7 100644 --- a/source/functions/taw_vd/fn_updateViewDistance.sqf +++ b/source/functions/taw_vd/fn_updateViewDistance.sqf @@ -1,35 +1,35 @@ #include "defines.h" /* - Author: Bryan "Tonic" Boardwine - - Description: - Updates the view distance dependant on whether the player - is on foot, a car or an aircraft. + Author: Bryan "Tonic" Boardwine + + Description: + Updates the view distance dependant on whether the player + is on foot, a car or an aircraft. */ private "_dist"; switch (true) do { - case (!(EQUAL(SEL(UAVControl getConnectedUAV player,1),""))): { - setViewDistance tawvd_drone; - _dist = tawvd_drone; - }; - - case ((vehicle player) isKindOf "Man"): { - setViewDistance tawvd_foot; - _dist = tawvd_foot; - }; - - case ((vehicle player) isKindOf "LandVehicle"): { - setViewDistance tawvd_car; - _dist = tawvd_car; - }; - - case ((vehicle player) isKindOf "Air"): { - setViewDistance tawvd_air; - _dist = tawvd_air; - }; + case (!(EQUAL(SEL(UAVControl getConnectedUAV player,1),""))): { + setViewDistance tawvd_drone; + _dist = tawvd_drone; + }; + + case ((vehicle player) isKindOf "Man"): { + setViewDistance tawvd_foot; + _dist = tawvd_foot; + }; + + case ((vehicle player) isKindOf "LandVehicle"): { + setViewDistance tawvd_car; + _dist = tawvd_car; + }; + + case ((vehicle player) isKindOf "Air"): { + setViewDistance tawvd_air; + _dist = tawvd_air; + }; }; if(tawvd_syncObject) then { - setObjectViewDistance [_dist,100]; - tawvd_object = _dist; + setObjectViewDistance [_dist,100]; + tawvd_object = _dist; }; \ No newline at end of file diff --git a/source/includes/CfgFunctions.hpp b/source/includes/CfgFunctions.hpp index 15e9c75..35542cf 100644 --- a/source/includes/CfgFunctions.hpp +++ b/source/includes/CfgFunctions.hpp @@ -1,465 +1,465 @@ //https://community.bistudio.com/wiki/Functions_Library_(Arma_3) class CfgFunctions { - class duws - { - class initMission - { - //duws_fnc_clientInit - class clientInit - { - //postInit = 1; - }; - //duws_fnc_serverInit - class serverInit - { - //preInit = 1; - }; - class DUWS_CONFIG - { - preInit = 1; - file = "DUWS_CONFIG.sqf"; - }; - class processUnitConfig {}; - class processVehicleConfig {}; - class processGroupConfig {}; - }; - - class generic - { - class bisArsenal {}; - // [] call duws_fnc_bisArsenal - class captured {}; - // [place, points, markername, markername2, triggerPos] call duws_fnc_captured - class createopfortified {}; - // [position] call duws_fnc_createopfortified - class createoppatrol {}; - // [position, radius] call duws_fnc_createoppatrol - class createopteam {}; - // [position, radius] call duws_fnc_createopteam - class createopwpteam {}; - // [position, radius] call duws_fnc_createopwpteam - class createpatrol {}; - // [position, radius] call duws_fnc_createpatrol - class convertCPtoAP {}; - // [] call duws_fnc_convertCPtoAP - class dynamic_menu {}; - // [???] spawn duws_fnc_dynamic_menu - class dyn_music_init - { - postInit = 1; - }; - // [] spawn duws_fnc_dynamic_music_init - class enterlocation {}; - // [place, trigger] spawn duws_fnc_enterlocation - class mapsize {}; - // [unit, debug] spawn duws_fnc_mapsize - class musicloop {}; - // [] spawn duws_fnc_musicloop - class random_name {}; - // [length] call duws_fnc_random_name - class random_veh {}; - // [faction, vehClass, position, radius] spawn duws_fnc_random_veh - class repetitive_cleanup {}; - // [] spawn duws_fnc_repetitive_cleanup - class request {}; - // [] call duws_fnc_request - class request_squad {}; - // [] call duws_fnc_request_squad - class request_support {}; - // [] call duws_fnc_request_support - class request_unit {}; - // [] call duws_fnc_request_unit - class request_vehicle {}; - // [] call duws_fnc_request_vehicle - class savegame {}; - // [] spawn duws_fnc_savegame - class savegameClient {}; - // [] spawn duws_fnc_savegameClient - class spawnVehicle {}; - //[requiredPoints, vehicleType] call duws_fnc_spawnVehicle - class zones_bonus {}; - // [] spawn duws_fnc_zones_bonus - class zonesundercontrol {}; - // [] spawn duws_fnc_zonesundercontrol - class hc_init {}; - // [] call duws_fnc_hc_init - }; - - class fob - { - class fast_travel {}; - // [] call duws_fnc_fast_travel - class fobmanageropen {}; - // [] spawn duws_fnc_fobmanageropen - class radiochatter {}; - // [object] spawn duws_fnc_radiochatter - class reinforce {}; - // [] spawn duws_fnc_reinforce - }; - - class utilities - { - class autoSave {}; - // [] spawn duws_fnc_autoSave - class groupReset {}; - // [] call duws_fnc_groupReset - }; - - class WARCOM - { - class random_veh_blu_patrol {}; - // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_blu_patrol - class random_veh_opf_patrol {}; - // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_opf_patrol - class WARCOM_blu_assault {}; - // [] call duws_fnc_WARCOM_blu_assault - class WARCOM_blu_patrol {}; - // [] call duws_fnc_WARCOM_blu_patrol - class WARCOM_gps_marker {}; - // [group, TFname] spawn duws_fnc_WARCOM_gps_marker - class WARCOM_init {}; - // [array of zones total, blu hq pos, op hq pos, blufor ap, opfor ap, blu attack delay, blu ai skill range, opfor ai skill, opfor assault delay] call duws_fnc_WARCOM_init - class WARCOM_opf_assault {}; - // [] call duws_fnc_WARCOM_opf_assault - class WARCOM_opf_patrol {}; - // [] call duws_fnc_WARCOM_opf_patrol - class WARCOM_opf_qrf {}; - // [attachedUnit] spawn duws_fnc_WARCOM_opf_qrf - class WARCOM_wp {}; - // [group] call duws_fnc_WARCOM_wp - class WARCOM_wp_blu_patrol {}; - // [group] call duws_fnc_WARCOM_wp_blu_patrol - class WARCOM_wp_opf {}; - // [group] call duws_fnc_WARCOM_wp_opf - class WARCOM_wp_opf_patrol {}; - // [group] call duws_fnc_WARCOM_wp_opf_patrol - class WARCOM_wp_opf_qrf {}; - // [group, unitpos] call duws_fnc_WARCOM_wp_opf_qrf - }; - - class initHQ - { - class BluHQinit {}; - // [_hqblu] spawn duws_fnc_BluHQinit - class drawIcon {}; - // [] spawn duws_fnc_drawIcon - // Used for generating HQ 3d marker - class drawIconFnc {}; - // [] spawn duws_fnc_drawIconFnc - // Called from duws_fnc_drawIcon - class fobmanager {}; - // [] call duws_fnc_fobmanager - class fortify {}; - // [_centerPos, _hq] spawn duws_fnc_fortify - class fortifyFOB {}; - // (in addaction) '_this spawn duws_fnc_fortifyFOB' with arguments '[(getpos _fob), _fob]' - class fortifyFOB2 {}; - // [_centerPos, _fob] spawn duws_fnc_fortifyFOB2 - class guards {}; - // [_centerPos, _hq] call duws_fnc_guards - class guardsFOB {}; - // [_centerPos, _fob, _size] call duws_fnc_guardsFOB - class guardsHQ {}; - // [_centerPos] call duws_fnc_guardsHQ - class hq_radioloop {}; - // [_object] spawn duws_fnc_radioloop - class HQaddactions {}; - // [_hq] call duws_fnc_HQaddactions - class locatorhq {}; - // [] spawn duws_fnc_locatorhq - class refortify {}; - // (in addaction) '_this call duws_fnc_fortify' with arguments '[_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _hq]' - class refortifyFOB {}; - // (in addaction) '_this call duws_fnc_refortifyFOB' with arguments '[_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _fob]' - class reguard {}; - // (in addaction) '_this call duws_fnc_reguard' with arguments '[_groupGuard, _groupPatrol, _centerPos, _hq]' - class reguardFOB {}; - // (in addaction) '_this call duws_fnc_reguardFOB' with arguments '[_groupGuard, _groupPatrol, _centerPos, _fob]' - class teleport {}; - // [_fobpos] call duws_fnc_teleport - class commanderAnim {}; - // [unit] call duws_fnc_commanderAnim - }; - - class startup - { - class manual {}; - // [] spawn duws_fnc_manual - class placement {}; - // [] spawn duws_fnc_placement - class placement_closed {}; - // [] spawn duws_fnc_placement_closed - class random {}; - // [] call duws_fnc_random - class startup {}; - // [] spawn duws_fnc_startup - class startup_closed {}; - // [] call duws_fnc_startup_closed - class startup_common {}; - // [] call duws_fnc_startup_common - class startup_manual_start {}; - // [] spawn duws_fnc_startup_manual_start - class startup_random_start {}; - // [] spawn duws_fnc_startup_random_start - class weather {}; - // [] spawn duws_fnc_weather - class weather_broadcast {}; - // [] spawn duws_fnc_weather_broadcast - class weather_client {}; - // [] spawn duws_fnc_weather_client - }; - - class initZones - { - class createzone {}; - // ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzone - class createzonebackup {}; - // ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzonebackup - class locatorzonesV1 {}; - // [radius, diff] spawn duws_fnc_locatorzonesV1 - class locatorzonesV1_backup {}; - // [radius, diff] spawn duws_fnc_locatorzonesV1_backup - class locatorzonesV2 {}; - // [radius, diff] spawn duws_fnc_locatorzonesV2 - }; - - class zonescap - { - class blufor_cap {} - // [place, points, markername, markername2, triggerPos] call duws_fnc_blufor_cap - class opfor_cap {}; - // [place, points, markername, markername2, triggerPos] call duws_fnc_opfor_cap - }; - - class prefabs - { - class site_Barracks {}; - class site_campsite {}; - class site_commandOP {}; - class site_CommStation {}; - class site_outpost1 {}; - class site_outpost2 {}; - class site_powerRelay {}; - class site_reconOutpost {}; - class site_researchBunker {}; - class site_researchStation {}; - class site_vehfittingstation {}; - }; - - class persistent - { - class persistent_stats_init {}; - // [] call duws_fnc_persistent_stats_init; - class persistent_stats_missions_total {}; - // [] call duws_fnc_persistent_stats_missions_total; - class persistent_stats_reset {}; - // [] spawn duws_fnc_persistent_stats_reset; - class persistent_stats_win {}; - // [] call duws_fnc_persistent_stats_win; - class persistent_stats_zones_add {}; - // [] call duws_fnc_persistent_stats_zones_add; - - class experience_init {}; - // [] call duws_fnc_experience_init; - class experience_ability_check {}; - // [] spawn duws_fnc_experience_ability_check - class experience_ability_fieldcomm {}; - // [player] spawn duws_fnc_experience_ability_fieldcomm; - class experience_ability_heal {}; - // [player] spawn duws_fnc_experience_ability_heal; - class experience_ability_logistic {}; - // [player] spawn duws_fnc_experience_ability_logistic; - class experience_ability_logistic_boost {}; - // [player] spawn duws_fnc_experience_ability_logistic_boost - class experience_ability_refit {}; - // [player] spawn duws_fnc_experience_ability_refit - class experience_ability_slowtime {}; - // [player] spawn duws_fnc_experience_ability_slowtime; - class experience_ability_stamina {}; - // [player] spawn duws_fnc_experience_ability_stamina; - class experience_ability_warrior {}; - // [player] spawn duws_fnc_experience_ability_warruir - }; - - class operative - { - class operator_add_aim {}; - // [] call duws_fnc_operator_add_aim - class operator_add_comms {}; - // [] call duws_fnc_operator_add_comms - class operator_add_courage {}; - // [] call duws_fnc_operator_add_courage - class operator_add_reflexes {}; - // [] call duws_fnc_operator_add_reflexes - class operator_add_reload {}; - // [] call duws_fnc_operator_add_reload - class operator_add_spotting {}; - // [] call duws_fnc_operator_add_spotting - class lbselected {}; - // [] call duws_fnc_lbselected - class operative_mission_complete {}; - // [] call operative_mission_complete - class operator_open {}; - // [] spawn duws_fnc_operator_open - class operator_recruit {}; - // [] spawn duws_fnc_operator_recruit - }; - - class missions - { - class destroy_mission {}; - // [location] spawn duws_fnc_destroy_mission - class pilot_mission {}; - // [location] spawn duws_fnc_pilot_mission - class rescue_mission {}; - // [location] spawn duws_fnc_rescue_mission - class rescue_success {}; - // ["_markername","_sol1","_sol2","_sol3","_MissionPos","_markername2","_trg"] spawn duws_fnc_rescue_success - class sabotage_mission {}; - // [location] spawn duws_fnc_sabotage_mission - class sabotage_success {}; - // (in addaction) {_this call duws_fnc_sabotage_success;} - class steal_mission {}; - // [location] spawn duws_fnc_steal_mission - class target_mission {}; - // [location] spawn duws_fnc_target_mission - class underwater_mission {}; - // [location] spawn duws_fnc_underwater_mission - class underwater_success {}; - // (in addaction) {_this call duws_fnc_underwater_success;} - - class missionTimer {}; - // [] spawn duws_fnc_missionTimer - class stratmap {}; - // [] spawn duws_fnc_stratmap - }; - - class squad - { - class copyloadout {}; - // [] call duws_fnc_copyLoadout - class dismiss {}; - // [] call duws_fnc_dismiss - class dismissHC {}; - // [] spawn duws_fnc_dismissHC - class renamesquad {}; - // [] spawn duws_fnc_renamesquad - class squadmng {}; - // [] spawn duws_fnc_squadmng - }; - - class support - { - class ammobox {}; - // [target] spawn duws_fnc_ammobox - class arty {}; - // [position, salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_arty - class fob {}; - // [position, size] spawn duws_fnc_fob - class fob_ammobox {}; - // [target, location] spawn duws_fnc_fob_ammobox - class FOBactions {}; - // [fob] call duws_fnc_FOBactions - class FOBreceiveaction {}; - // [] spawn duws_fnc_FOBreceiveaction - class mapclickarty {}; - // [salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_mapclickarty - class mapclickuav {}; - // [] spawn duws_fnc_mapclickuav - class paradrop {}; - // [] spawn duws_fnc_paradrop - class sitrep {}; - // [] spawn duws_fnc_sitrep - class uav_map {}; - // [centerPos, checkedRadius] spawn duws_fnc_uav_map - class veh_refit {}; - // [] call duws_fnc_veh_refit - - // Taxi - class boatTaxi - { - file = "functions\support\taxi\fn_boatTaxi.sqf"; - }; - // [posplayer, radius] spawn duws_fnc_boatTaxi - class heloTaxi - { - file = "functions\support\taxi\fn_heloTaxi.sqf"; - }; - // [posplayer, radius] spawn duws_fnc_heloTaxi - class mapclickboat - { - file = "functions\support\taxi\fn_mapclickboat.sqf"; - }; - // (in addaction) {_this spawn duws_fnc_mapclickboat} - class mapclickhelo - { - file = "functions\support\taxi\fn_mapclickhelo.sqf"; - }; - // (in addaction) {_this spawn duws_fnc_mapclickhelo} - class random_music - { - file = "functions\support\taxi\fn_random_music.sqf"; - }; - // [] call duws_fnc_random_music - - // Cluster - class cluster - { - file = "functions\support\cluster\fn_cluster.sqf"; - }; - // [position, salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_cluster - class mapclickcluster - { - file = "functions\support\cluster\fn_mapclickcluster.sqf"; - }; - // [salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_mapclickcluster - }; - - class misc - { - class bottom_right_message {}; - // [position, date] call duws_fnc_bottom_right_message - class gps_marker {}; - // [] spawn duws_fnc_gps_marker - }; - - class info - { - class info {}; - // [] spawn duws_fnc_info - }; - - class pFLIR - { - class livefeed {}; - class livefeed1 {}; - class livefeedexit {}; - }; - - }; - class TAW_VD - { - tag = "TAWVD"; + class duws + { + class initMission + { + //duws_fnc_clientInit + class clientInit + { + //postInit = 1; + }; + //duws_fnc_serverInit + class serverInit + { + //preInit = 1; + }; + class DUWS_CONFIG + { + preInit = 1; + file = "DUWS_CONFIG.sqf"; + }; + class processUnitConfig {}; + class processVehicleConfig {}; + class processGroupConfig {}; + }; + + class generic + { + class bisArsenal {}; + // [] call duws_fnc_bisArsenal + class captured {}; + // [place, points, markername, markername2, triggerPos] call duws_fnc_captured + class createopfortified {}; + // [position] call duws_fnc_createopfortified + class createoppatrol {}; + // [position, radius] call duws_fnc_createoppatrol + class createopteam {}; + // [position, radius] call duws_fnc_createopteam + class createopwpteam {}; + // [position, radius] call duws_fnc_createopwpteam + class createpatrol {}; + // [position, radius] call duws_fnc_createpatrol + class convertCPtoAP {}; + // [] call duws_fnc_convertCPtoAP + class dynamic_menu {}; + // [???] spawn duws_fnc_dynamic_menu + class dyn_music_init + { + postInit = 1; + }; + // [] spawn duws_fnc_dynamic_music_init + class enterlocation {}; + // [place, trigger] spawn duws_fnc_enterlocation + class mapsize {}; + // [unit, debug] spawn duws_fnc_mapsize + class musicloop {}; + // [] spawn duws_fnc_musicloop + class random_name {}; + // [length] call duws_fnc_random_name + class random_veh {}; + // [faction, vehClass, position, radius] spawn duws_fnc_random_veh + class repetitive_cleanup {}; + // [] spawn duws_fnc_repetitive_cleanup + class request {}; + // [] call duws_fnc_request + class request_squad {}; + // [] call duws_fnc_request_squad + class request_support {}; + // [] call duws_fnc_request_support + class request_unit {}; + // [] call duws_fnc_request_unit + class request_vehicle {}; + // [] call duws_fnc_request_vehicle + class savegame {}; + // [] spawn duws_fnc_savegame + class savegameClient {}; + // [] spawn duws_fnc_savegameClient + class spawnVehicle {}; + //[requiredPoints, vehicleType] call duws_fnc_spawnVehicle + class zones_bonus {}; + // [] spawn duws_fnc_zones_bonus + class zonesundercontrol {}; + // [] spawn duws_fnc_zonesundercontrol + class hc_init {}; + // [] call duws_fnc_hc_init + }; + + class fob + { + class fast_travel {}; + // [] call duws_fnc_fast_travel + class fobmanageropen {}; + // [] spawn duws_fnc_fobmanageropen + class radiochatter {}; + // [object] spawn duws_fnc_radiochatter + class reinforce {}; + // [] spawn duws_fnc_reinforce + }; + + class utilities + { + class autoSave {}; + // [] spawn duws_fnc_autoSave + class groupReset {}; + // [] call duws_fnc_groupReset + }; + + class WARCOM + { + class random_veh_blu_patrol {}; + // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_blu_patrol + class random_veh_opf_patrol {}; + // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_opf_patrol + class WARCOM_blu_assault {}; + // [] call duws_fnc_WARCOM_blu_assault + class WARCOM_blu_patrol {}; + // [] call duws_fnc_WARCOM_blu_patrol + class WARCOM_gps_marker {}; + // [group, TFname] spawn duws_fnc_WARCOM_gps_marker + class WARCOM_init {}; + // [array of zones total, blu hq pos, op hq pos, blufor ap, opfor ap, blu attack delay, blu ai skill range, opfor ai skill, opfor assault delay] call duws_fnc_WARCOM_init + class WARCOM_opf_assault {}; + // [] call duws_fnc_WARCOM_opf_assault + class WARCOM_opf_patrol {}; + // [] call duws_fnc_WARCOM_opf_patrol + class WARCOM_opf_qrf {}; + // [attachedUnit] spawn duws_fnc_WARCOM_opf_qrf + class WARCOM_wp {}; + // [group] call duws_fnc_WARCOM_wp + class WARCOM_wp_blu_patrol {}; + // [group] call duws_fnc_WARCOM_wp_blu_patrol + class WARCOM_wp_opf {}; + // [group] call duws_fnc_WARCOM_wp_opf + class WARCOM_wp_opf_patrol {}; + // [group] call duws_fnc_WARCOM_wp_opf_patrol + class WARCOM_wp_opf_qrf {}; + // [group, unitpos] call duws_fnc_WARCOM_wp_opf_qrf + }; + + class initHQ + { + class BluHQinit {}; + // [_hqblu] spawn duws_fnc_BluHQinit + class drawIcon {}; + // [] spawn duws_fnc_drawIcon + // Used for generating HQ 3d marker + class drawIconFnc {}; + // [] spawn duws_fnc_drawIconFnc + // Called from duws_fnc_drawIcon + class fobmanager {}; + // [] call duws_fnc_fobmanager + class fortify {}; + // [_centerPos, _hq] spawn duws_fnc_fortify + class fortifyFOB {}; + // (in addaction) '_this spawn duws_fnc_fortifyFOB' with arguments '[(getpos _fob), _fob]' + class fortifyFOB2 {}; + // [_centerPos, _fob] spawn duws_fnc_fortifyFOB2 + class guards {}; + // [_centerPos, _hq] call duws_fnc_guards + class guardsFOB {}; + // [_centerPos, _fob, _size] call duws_fnc_guardsFOB + class guardsHQ {}; + // [_centerPos] call duws_fnc_guardsHQ + class hq_radioloop {}; + // [_object] spawn duws_fnc_radioloop + class HQaddactions {}; + // [_hq] call duws_fnc_HQaddactions + class locatorhq {}; + // [] spawn duws_fnc_locatorhq + class refortify {}; + // (in addaction) '_this call duws_fnc_fortify' with arguments '[_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _hq]' + class refortifyFOB {}; + // (in addaction) '_this call duws_fnc_refortifyFOB' with arguments '[_aaPod, _gl1Pod, _atPod1, _atPod2, _atPod3, _centerPos, _fob]' + class reguard {}; + // (in addaction) '_this call duws_fnc_reguard' with arguments '[_groupGuard, _groupPatrol, _centerPos, _hq]' + class reguardFOB {}; + // (in addaction) '_this call duws_fnc_reguardFOB' with arguments '[_groupGuard, _groupPatrol, _centerPos, _fob]' + class teleport {}; + // [_fobpos] call duws_fnc_teleport + class commanderAnim {}; + // [unit] call duws_fnc_commanderAnim + }; + + class startup + { + class manual {}; + // [] spawn duws_fnc_manual + class placement {}; + // [] spawn duws_fnc_placement + class placement_closed {}; + // [] spawn duws_fnc_placement_closed + class random {}; + // [] call duws_fnc_random + class startup {}; + // [] spawn duws_fnc_startup + class startup_closed {}; + // [] call duws_fnc_startup_closed + class startup_common {}; + // [] call duws_fnc_startup_common + class startup_manual_start {}; + // [] spawn duws_fnc_startup_manual_start + class startup_random_start {}; + // [] spawn duws_fnc_startup_random_start + class weather {}; + // [] spawn duws_fnc_weather + class weather_broadcast {}; + // [] spawn duws_fnc_weather_broadcast + class weather_client {}; + // [] spawn duws_fnc_weather_client + }; + + class initZones + { + class createzone {}; + // ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzone + class createzonebackup {}; + // ["Outpost Airbase",5,50,getpos this,true] spawn duws_fnc_createzonebackup + class locatorzonesV1 {}; + // [radius, diff] spawn duws_fnc_locatorzonesV1 + class locatorzonesV1_backup {}; + // [radius, diff] spawn duws_fnc_locatorzonesV1_backup + class locatorzonesV2 {}; + // [radius, diff] spawn duws_fnc_locatorzonesV2 + }; + + class zonescap + { + class blufor_cap {} + // [place, points, markername, markername2, triggerPos] call duws_fnc_blufor_cap + class opfor_cap {}; + // [place, points, markername, markername2, triggerPos] call duws_fnc_opfor_cap + }; + + class prefabs + { + class site_Barracks {}; + class site_campsite {}; + class site_commandOP {}; + class site_CommStation {}; + class site_outpost1 {}; + class site_outpost2 {}; + class site_powerRelay {}; + class site_reconOutpost {}; + class site_researchBunker {}; + class site_researchStation {}; + class site_vehfittingstation {}; + }; + + class persistent + { + class persistent_stats_init {}; + // [] call duws_fnc_persistent_stats_init; + class persistent_stats_missions_total {}; + // [] call duws_fnc_persistent_stats_missions_total; + class persistent_stats_reset {}; + // [] spawn duws_fnc_persistent_stats_reset; + class persistent_stats_win {}; + // [] call duws_fnc_persistent_stats_win; + class persistent_stats_zones_add {}; + // [] call duws_fnc_persistent_stats_zones_add; + + class experience_init {}; + // [] call duws_fnc_experience_init; + class experience_ability_check {}; + // [] spawn duws_fnc_experience_ability_check + class experience_ability_fieldcomm {}; + // [player] spawn duws_fnc_experience_ability_fieldcomm; + class experience_ability_heal {}; + // [player] spawn duws_fnc_experience_ability_heal; + class experience_ability_logistic {}; + // [player] spawn duws_fnc_experience_ability_logistic; + class experience_ability_logistic_boost {}; + // [player] spawn duws_fnc_experience_ability_logistic_boost + class experience_ability_refit {}; + // [player] spawn duws_fnc_experience_ability_refit + class experience_ability_slowtime {}; + // [player] spawn duws_fnc_experience_ability_slowtime; + class experience_ability_stamina {}; + // [player] spawn duws_fnc_experience_ability_stamina; + class experience_ability_warrior {}; + // [player] spawn duws_fnc_experience_ability_warruir + }; + + class operative + { + class operator_add_aim {}; + // [] call duws_fnc_operator_add_aim + class operator_add_comms {}; + // [] call duws_fnc_operator_add_comms + class operator_add_courage {}; + // [] call duws_fnc_operator_add_courage + class operator_add_reflexes {}; + // [] call duws_fnc_operator_add_reflexes + class operator_add_reload {}; + // [] call duws_fnc_operator_add_reload + class operator_add_spotting {}; + // [] call duws_fnc_operator_add_spotting + class lbselected {}; + // [] call duws_fnc_lbselected + class operative_mission_complete {}; + // [] call operative_mission_complete + class operator_open {}; + // [] spawn duws_fnc_operator_open + class operator_recruit {}; + // [] spawn duws_fnc_operator_recruit + }; + + class missions + { + class destroy_mission {}; + // [location] spawn duws_fnc_destroy_mission + class pilot_mission {}; + // [location] spawn duws_fnc_pilot_mission + class rescue_mission {}; + // [location] spawn duws_fnc_rescue_mission + class rescue_success {}; + // ["_markername","_sol1","_sol2","_sol3","_MissionPos","_markername2","_trg"] spawn duws_fnc_rescue_success + class sabotage_mission {}; + // [location] spawn duws_fnc_sabotage_mission + class sabotage_success {}; + // (in addaction) {_this call duws_fnc_sabotage_success;} + class steal_mission {}; + // [location] spawn duws_fnc_steal_mission + class target_mission {}; + // [location] spawn duws_fnc_target_mission + class underwater_mission {}; + // [location] spawn duws_fnc_underwater_mission + class underwater_success {}; + // (in addaction) {_this call duws_fnc_underwater_success;} + + class missionTimer {}; + // [] spawn duws_fnc_missionTimer + class stratmap {}; + // [] spawn duws_fnc_stratmap + }; + + class squad + { + class copyloadout {}; + // [] call duws_fnc_copyLoadout + class dismiss {}; + // [] call duws_fnc_dismiss + class dismissHC {}; + // [] spawn duws_fnc_dismissHC + class renamesquad {}; + // [] spawn duws_fnc_renamesquad + class squadmng {}; + // [] spawn duws_fnc_squadmng + }; + + class support + { + class ammobox {}; + // [target] spawn duws_fnc_ammobox + class arty {}; + // [position, salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_arty + class fob {}; + // [position, size] spawn duws_fnc_fob + class fob_ammobox {}; + // [target, location] spawn duws_fnc_fob_ammobox + class FOBactions {}; + // [fob] call duws_fnc_FOBactions + class FOBreceiveaction {}; + // [] spawn duws_fnc_FOBreceiveaction + class mapclickarty {}; + // [salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_mapclickarty + class mapclickuav {}; + // [] spawn duws_fnc_mapclickuav + class paradrop {}; + // [] spawn duws_fnc_paradrop + class sitrep {}; + // [] spawn duws_fnc_sitrep + class uav_map {}; + // [centerPos, checkedRadius] spawn duws_fnc_uav_map + class veh_refit {}; + // [] call duws_fnc_veh_refit + + // Taxi + class boatTaxi + { + file = "functions\support\taxi\fn_boatTaxi.sqf"; + }; + // [posplayer, radius] spawn duws_fnc_boatTaxi + class heloTaxi + { + file = "functions\support\taxi\fn_heloTaxi.sqf"; + }; + // [posplayer, radius] spawn duws_fnc_heloTaxi + class mapclickboat + { + file = "functions\support\taxi\fn_mapclickboat.sqf"; + }; + // (in addaction) {_this spawn duws_fnc_mapclickboat} + class mapclickhelo + { + file = "functions\support\taxi\fn_mapclickhelo.sqf"; + }; + // (in addaction) {_this spawn duws_fnc_mapclickhelo} + class random_music + { + file = "functions\support\taxi\fn_random_music.sqf"; + }; + // [] call duws_fnc_random_music + + // Cluster + class cluster + { + file = "functions\support\cluster\fn_cluster.sqf"; + }; + // [position, salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_cluster + class mapclickcluster + { + file = "functions\support\cluster\fn_mapclickcluster.sqf"; + }; + // [salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_mapclickcluster + }; + + class misc + { + class bottom_right_message {}; + // [position, date] call duws_fnc_bottom_right_message + class gps_marker {}; + // [] spawn duws_fnc_gps_marker + }; + + class info + { + class info {}; + // [] spawn duws_fnc_info + }; + + class pFLIR + { + class livefeed {}; + class livefeed1 {}; + class livefeedexit {}; + }; + + }; + class TAW_VD + { + tag = "TAWVD"; - class TAW_VD - { - class stateTracker { - ext = ".fsm"; - postInit = 1; - headerType = -1; - }; - - class onSliderChanged {}; - class onTerrainChanged {}; - class updateViewDistance {}; - class openMenu {}; - class onChar {}; - class openSaveManager {}; - class onSavePressed {}; - class onSaveSelectionChanged {}; - }; - }; - - #include "..\AIS\cfgFunctions.hpp" + class TAW_VD + { + class stateTracker { + ext = ".fsm"; + postInit = 1; + headerType = -1; + }; + + class onSliderChanged {}; + class onTerrainChanged {}; + class updateViewDistance {}; + class openMenu {}; + class onChar {}; + class openSaveManager {}; + class onSavePressed {}; + class onSaveSelectionChanged {}; + }; + }; + + #include "..\AIS\cfgFunctions.hpp" }; \ No newline at end of file diff --git a/source/includes/debriefing.hpp b/source/includes/debriefing.hpp index 5bb77f8..06ca5fb 100644 --- a/source/includes/debriefing.hpp +++ b/source/includes/debriefing.hpp @@ -1,22 +1,22 @@ class CfgDebriefing { - class island_captured_win - { - title = "Island Captured!"; - subtitle = ""; - description = "You have successfully captured all the zones and destroyed the enemy forces on the island. This island is now under BLUFOR control. Time to take back another island, soldier..."; - pictureBackground = ""; - picture = "\a3\ui_f\data\gui\cfg\hints\UnitType_ca.paa"; - pictureColor[] = {0.0,0,1,1}; - }; + class island_captured_win + { + title = "Island Captured!"; + subtitle = ""; + description = "You have successfully captured all the zones and destroyed the enemy forces on the island. This island is now under BLUFOR control. Time to take back another island, soldier..."; + pictureBackground = ""; + picture = "\a3\ui_f\data\gui\cfg\hints\UnitType_ca.paa"; + pictureColor[] = {0.0,0,1,1}; + }; - class officerkilled - { - title = "HQ Officer Killed"; - subtitle = ""; - description = "Your commanding officer has been killed, you are now alone and stranded on the island. You will be evacuated shortly."; - pictureBackground = ""; - picture = "\a3\ui_f\data\gui\cfg\hints\ActionMenu_ca.paa"; - pictureColor[] = {1,0,0,1}; - }; + class officerkilled + { + title = "HQ Officer Killed"; + subtitle = ""; + description = "Your commanding officer has been killed, you are now alone and stranded on the island. You will be evacuated shortly."; + pictureBackground = ""; + picture = "\a3\ui_f\data\gui\cfg\hints\ActionMenu_ca.paa"; + pictureColor[] = {1,0,0,1}; + }; }; diff --git a/source/includes/fobmanager.hpp b/source/includes/fobmanager.hpp index 3417376..c3a4678 100644 --- a/source/includes/fobmanager.hpp +++ b/source/includes/fobmanager.hpp @@ -1,7 +1,7 @@ class fob_mng_dialog { - idd = -1; - movingenable = true; + idd = -1; + movingenable = true; // onLoad = "_this call FRAME_01_Load"; class controls diff --git a/source/includes/info/info.hpp b/source/includes/info/info.hpp index 9dfa29f..c6f3816 100644 --- a/source/includes/info/info.hpp +++ b/source/includes/info/info.hpp @@ -1,7 +1,7 @@ class info_radio { - idd = -1; - movingenable = false; + idd = -1; + movingenable = false; // onLoad = "_this call FRAME_01_Load"; class controls diff --git a/source/includes/info/reset.hpp b/source/includes/info/reset.hpp index f55a1ee..be9648a 100644 --- a/source/includes/info/reset.hpp +++ b/source/includes/info/reset.hpp @@ -1,7 +1,7 @@ class reset_confirm { - idd = -1; - movingenable = false; + idd = -1; + movingenable = false; // onLoad = "_this call FRAME_01_Load"; class controls diff --git a/source/includes/locations.hpp b/source/includes/locations.hpp index f6633ee..ecfb157 100644 --- a/source/includes/locations.hpp +++ b/source/includes/locations.hpp @@ -218,7 +218,7 @@ class CfgNotifications duration = 8; // How many seconds will the notification be displayed priority = 0; // Priority; higher number = more important; tasks in queue are selected by priority difficulty[] = {}; // Required difficulty settings. All listed difficulties has to be enabled - }; + }; class operator_healed { @@ -230,5 +230,5 @@ class CfgNotifications duration = 8; // How many seconds will the notification be displayed priority = 0; // Priority; higher number = more important; tasks in queue are selected by priority difficulty[] = {}; // Required difficulty settings. All listed difficulties has to be enabled - }; + }; }; \ No newline at end of file diff --git a/source/includes/operative/identities.hpp b/source/includes/operative/identities.hpp index d112c23..7e08164 100644 --- a/source/includes/operative/identities.hpp +++ b/source/includes/operative/identities.hpp @@ -128,7 +128,7 @@ class CfgIdentities glasses="none"; speaker="Male13ENG"; pitch=0.9; - }; + }; class reynolds { @@ -148,7 +148,7 @@ class CfgIdentities glasses="G_Tactical_Clear"; speaker="Male07ENG"; pitch=0.9; - }; + }; class mckendrick { @@ -158,7 +158,7 @@ class CfgIdentities glasses="none"; speaker="Male04ENG"; pitch=1; - }; + }; class snake { @@ -178,7 +178,7 @@ class CfgIdentities glasses="G_Tactical_Clear"; speaker="Male06ENG"; pitch=1; - }; + }; class fox { @@ -188,7 +188,7 @@ class CfgIdentities glasses="none"; speaker="Male01ENG"; pitch=1.05; - }; + }; class martinez { @@ -198,7 +198,7 @@ class CfgIdentities glasses="G_Combat"; speaker="Male06ENG"; pitch=1; - }; + }; class stranger { @@ -208,7 +208,7 @@ class CfgIdentities glasses="none"; speaker="Male04ENGB"; pitch=0.9; - }; + }; class dixon { @@ -218,5 +218,5 @@ class CfgIdentities glasses="none"; speaker="Male010ENG"; pitch=0.9; - }; + }; }; \ No newline at end of file diff --git a/source/includes/squad/squadmng.hpp b/source/includes/squad/squadmng.hpp index bf781c5..529bbdc 100644 --- a/source/includes/squad/squadmng.hpp +++ b/source/includes/squad/squadmng.hpp @@ -1,7 +1,7 @@ class squad_mng_dialog { - idd = -1; - movingenable = true; + idd = -1; + movingenable = true; // onLoad = "_this call FRAME_01_Load"; class controls diff --git a/source/includes/startup/placement.hpp b/source/includes/startup/placement.hpp index 8902c85..d1c1e85 100644 --- a/source/includes/startup/placement.hpp +++ b/source/includes/startup/placement.hpp @@ -1,8 +1,8 @@ class startup_hq_placement_dialog { - idd = -1; - movingenable = false; - onUnload = "[] spawn duws_fnc_placement_closed"; //UI event handler + idd = -1; + movingenable = false; + onUnload = "[] spawn duws_fnc_placement_closed"; //UI event handler // onLoad = "_this call FRAME_01_Load"; class controls diff --git a/source/mission.sqm b/source/mission.sqm index 5d3154e1c6696055040024403594a1abe1757580..baf59cd3112ad34c86b6de88652239f33cf921eb 100644 GIT binary patch delta 132 zcmZ26o$>H=#tl9kEDAud*_UG-qX>w_z`(%8$dp-Hn9Zxy=BjZn5(&W{sfFq6hR76|L3PA?xq#e8c{0RXRN BBB=lX delta 98 zcmX>+opHr<#tl9kjGUVTIMy-paWXJ4a4|AvmZatuGjMJe;@ZN>$T>NYTVeAn{%uS^ l<{oo}%}0dpazjOr%K32u^@?k}V}Xij>gMu6nY*kx1prpR8-xG= diff --git a/source/mission.sqm.oldBackup b/source/mission.sqm.oldBackup index 7bf1fd0..631d954 100644 --- a/source/mission.sqm.oldBackup +++ b/source/mission.sqm.oldBackup @@ -1,530 +1,530 @@ version=12; class Mission { - addOns[]= - { - "a3_map_stratis", - "A3_Characters_F_OPFOR", - "A3_Characters_F_Civil", - "A3_Characters_F_INDEP", - "A3_Characters_F_BLUFOR", - "a3_characters_f_beta", - "a3_map_altis", - "a3_characters_f", - "A3_Modules_F" - }; - addOnsAuto[]= - { - "A3_Characters_F_OPFOR", - "a3_characters_f", - "A3_Characters_F_Civil", - "A3_Characters_F_INDEP", - "A3_Characters_F_BLUFOR", - "A3_Modules_F", - "a3_map_altis" - }; - randomSeed=16091530; - class Intel - { - briefingName="[SP/MP]Dynamic Universal War System - Rebirth"; - overviewText="Play a full, randomly generated campaign on whatever island you want to."; - startWeather=0; - startWind=0; - forecastWeather=0; - forecastWind=0; - forecastWaves=0; - wavesForced=1; - windForced=1; - year=2035; - month=7; - day=6; - hour=8; - minute=0; - startFogBase=0.001; - forecastFogBase=0.001; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; - class Groups - { - items=8; - class Item0 - { - side="EAST"; - class Vehicles - { - items=1; - class Item0 - { - position[]={94.314949,-0.25319061,121.57617}; - azimut=-104.97; - id=0; - side="EAST"; - vehicle=Opfor_Rifleman; - leader=1; - skill=0.60000002; - init="removeallweapons this"; - }; - }; - }; - class Item1 - { - side="CIV"; - class Vehicles - { - items=1; - class Item0 - { - position[]={79.035439,0.26340526,80.234863}; - azimut=150.57401; - id=1; - side="CIV"; - vehicle="C_man_1"; - leader=1; - skill=0.60000002; - init="removeallweapons this"; - }; - }; - }; - class Item2 - { - side="GUER"; - class Vehicles - { - items=1; - class Item0 - { - position[]={138.3087,-0.28989583,75.978027}; - id=2; - side="GUER"; - vehicle="I_Soldier_exp_F"; - leader=1; - skill=0.60000002; - init="removeallweapons this"; - }; - }; - }; - class Item3 - { - side="WEST"; - class Vehicles - { - items=5; - class Item0 - { - position[]={147.66809,-0.19525492,125.65027}; - azimut=63.238892; - id=3; - side="WEST"; - vehicle=Blufor_Squadleader; - player="PLAYER COMMANDER"; - leader=1; - rank="SERGEANT"; - skill=0.46666664; - text="player1"; - }; - class Item1 - { - presenceCondition="isMultiplayer"; - position[]={165.2303,-0.083054602,130.39087}; - azimut=38.236099; - id=4; - side="WEST"; - vehicle=Blufor_Medic; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player14"; - }; - class Item2 - { - presenceCondition="isMultiplayer"; - position[]={165.15147,0.0376672,119.52625}; - azimut=38.236099; - id=5; - side="WEST"; - vehicle=Blufor_Engineer; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player19"; - }; - class Item3 - { - presenceCondition="isMultiplayer"; - position[]={160.24103,-0.30163568,110.13025}; - azimut=38.236099; - id=6; - side="WEST"; - vehicle=Blufor_Rifleman; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player17"; - }; - class Item4 - { - presenceCondition="isMultiplayer"; - position[]={147.35245,0.03885065,107.86389}; - azimut=38.236099; - id=7; - side="WEST"; - vehicle=Blufor_Rifleman_AT; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player18"; - }; - }; - }; - class Item4 - { - side="LOGIC"; - class Vehicles - { - items=1; - class Item0 - { - position[]={117.6598,0.16756104,103.34326}; - azimut=83.280197; - id=8; - side="LOGIC"; - vehicle="Logic"; - leader=1; - skill=0.60000002; - }; - }; - }; - class Item5 - { - side="WEST"; - class Vehicles - { - items=5; - class Item0 - { - presenceCondition="isMultiplayer"; - position[]={261.39536,-0.030884311,110.60315}; - azimut=38.236099; - id=9; - side="WEST"; - vehicle=Blufor_Squadleader; - player="PLAY CDG"; - leader=1; - rank="SERGEANT"; - skill=0.46666664; - text="player11"; - }; - class Item1 - { - presenceCondition="isMultiplayer"; - position[]={272.29654,-0.095521234,112.84106}; - azimut=38.236099; - id=10; - side="WEST"; - vehicle=Blufor_Grenadier; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player12"; - }; - class Item2 - { - presenceCondition="isMultiplayer"; - position[]={271.81415,-0.23583208,103.8241}; - azimut=38.236099; - id=11; - side="WEST"; - vehicle=Blufor_Medic; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player13"; - }; - class Item3 - { - presenceCondition="isMultiplayer"; - position[]={258.19226,0.070982374,98.068115}; - azimut=38.236099; - id=12; - side="WEST"; - vehicle=Blufor_Rifleman; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player15"; - }; - class Item4 - { - presenceCondition="isMultiplayer"; - position[]={267.08691,0.079555303,95.828369}; - azimut=38.236099; - id=13; - side="WEST"; - vehicle=Blufor_AT_Specialist; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player16"; - }; - }; - }; - class Item6 - { - side="WEST"; - class Vehicles - { - items=5; - class Item0 - { - presenceCondition="isMultiplayer"; - position[]={250.05234,-0.013635203,141.24255}; - azimut=38.236099; - id=14; - side="WEST"; - vehicle=Blufor_Squadleader; - player="PLAY CDG"; - leader=1; - rank="SERGEANT"; - skill=0.46666664; - text="player6"; - }; - class Item1 - { - presenceCondition="isMultiplayer"; - position[]={236.95015,-0.22034465,146.43323}; - azimut=38.236099; - id=15; - side="WEST"; - vehicle=Blufor_Explosive_Specialist; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player8"; - }; - class Item2 - { - presenceCondition="isMultiplayer"; - position[]={233.0544,-0.22535685,135.8501}; - azimut=38.236099; - id=16; - side="WEST"; - vehicle=Blufor_Engineer; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player9"; - }; - class Item3 - { - presenceCondition="isMultiplayer"; - position[]={256.76801,-0.13899173,128.77588}; - azimut=38.236099; - id=17; - side="WEST"; - vehicle=Blufor_sniper; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player7"; - }; - class Item4 - { - presenceCondition="isMultiplayer"; - position[]={244.01947,-0.34063739,131.32288}; - azimut=38.236099; - id=18; - side="WEST"; - vehicle=Blufor_Medic; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player10"; - }; - }; - }; - class Item7 - { - side="WEST"; - class Vehicles - { - items=5; - class Item0 - { - presenceCondition="isMultiplayer"; - position[]={202.52556,-0.33604091,105.10266}; - azimut=38.236099; - id=19; - side="WEST"; - vehicle="B_recon_TL_F"; - player="PLAY CDG"; - leader=1; - rank="SERGEANT"; - skill=0.46666664; - text="player2"; - }; - class Item1 - { - presenceCondition="isMultiplayer"; - position[]={191.68073,-0.34259987,113.67969}; - azimut=38.236099; - id=20; - side="WEST"; - vehicle="B_recon_M_F"; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player3"; - }; - class Item2 - { - presenceCondition="isMultiplayer"; - position[]={204.96738,-0.037549913,114.25562}; - azimut=38.236099; - id=21; - side="WEST"; - vehicle=Blufor_Recon_Scout; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player4"; - }; - class Item3 - { - presenceCondition="isMultiplayer"; - position[]={218.85191,-0.20261329,114.07117}; - azimut=38.236099; - id=22; - side="WEST"; - vehicle="B_recon_LAT_F"; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player5"; - }; - class Item4 - { - presenceCondition="isMultiplayer"; - position[]={189.76903,-0.095692858,104.1189}; - azimut=38.236099; - id=23; - side="WEST"; - vehicle="B_recon_medic_F"; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player20"; - }; - }; - }; - }; - class Markers - { - items=1; - class Item0 - { - position[]={91.06839,0.14840496,23.99707}; - name="respawn_west"; - type="Empty"; - }; - }; + addOns[]= + { + "a3_map_stratis", + "A3_Characters_F_OPFOR", + "A3_Characters_F_Civil", + "A3_Characters_F_INDEP", + "A3_Characters_F_BLUFOR", + "a3_characters_f_beta", + "a3_map_altis", + "a3_characters_f", + "A3_Modules_F" + }; + addOnsAuto[]= + { + "A3_Characters_F_OPFOR", + "a3_characters_f", + "A3_Characters_F_Civil", + "A3_Characters_F_INDEP", + "A3_Characters_F_BLUFOR", + "A3_Modules_F", + "a3_map_altis" + }; + randomSeed=16091530; + class Intel + { + briefingName="[SP/MP]Dynamic Universal War System - Rebirth"; + overviewText="Play a full, randomly generated campaign on whatever island you want to."; + startWeather=0; + startWind=0; + forecastWeather=0; + forecastWind=0; + forecastWaves=0; + wavesForced=1; + windForced=1; + year=2035; + month=7; + day=6; + hour=8; + minute=0; + startFogBase=0.001; + forecastFogBase=0.001; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; + class Groups + { + items=8; + class Item0 + { + side="EAST"; + class Vehicles + { + items=1; + class Item0 + { + position[]={94.314949,-0.25319061,121.57617}; + azimut=-104.97; + id=0; + side="EAST"; + vehicle=Opfor_Rifleman; + leader=1; + skill=0.60000002; + init="removeallweapons this"; + }; + }; + }; + class Item1 + { + side="CIV"; + class Vehicles + { + items=1; + class Item0 + { + position[]={79.035439,0.26340526,80.234863}; + azimut=150.57401; + id=1; + side="CIV"; + vehicle="C_man_1"; + leader=1; + skill=0.60000002; + init="removeallweapons this"; + }; + }; + }; + class Item2 + { + side="GUER"; + class Vehicles + { + items=1; + class Item0 + { + position[]={138.3087,-0.28989583,75.978027}; + id=2; + side="GUER"; + vehicle="I_Soldier_exp_F"; + leader=1; + skill=0.60000002; + init="removeallweapons this"; + }; + }; + }; + class Item3 + { + side="WEST"; + class Vehicles + { + items=5; + class Item0 + { + position[]={147.66809,-0.19525492,125.65027}; + azimut=63.238892; + id=3; + side="WEST"; + vehicle=Blufor_Squadleader; + player="PLAYER COMMANDER"; + leader=1; + rank="SERGEANT"; + skill=0.46666664; + text="player1"; + }; + class Item1 + { + presenceCondition="isMultiplayer"; + position[]={165.2303,-0.083054602,130.39087}; + azimut=38.236099; + id=4; + side="WEST"; + vehicle=Blufor_Medic; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player14"; + }; + class Item2 + { + presenceCondition="isMultiplayer"; + position[]={165.15147,0.0376672,119.52625}; + azimut=38.236099; + id=5; + side="WEST"; + vehicle=Blufor_Engineer; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player19"; + }; + class Item3 + { + presenceCondition="isMultiplayer"; + position[]={160.24103,-0.30163568,110.13025}; + azimut=38.236099; + id=6; + side="WEST"; + vehicle=Blufor_Rifleman; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player17"; + }; + class Item4 + { + presenceCondition="isMultiplayer"; + position[]={147.35245,0.03885065,107.86389}; + azimut=38.236099; + id=7; + side="WEST"; + vehicle=Blufor_Rifleman_AT; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player18"; + }; + }; + }; + class Item4 + { + side="LOGIC"; + class Vehicles + { + items=1; + class Item0 + { + position[]={117.6598,0.16756104,103.34326}; + azimut=83.280197; + id=8; + side="LOGIC"; + vehicle="Logic"; + leader=1; + skill=0.60000002; + }; + }; + }; + class Item5 + { + side="WEST"; + class Vehicles + { + items=5; + class Item0 + { + presenceCondition="isMultiplayer"; + position[]={261.39536,-0.030884311,110.60315}; + azimut=38.236099; + id=9; + side="WEST"; + vehicle=Blufor_Squadleader; + player="PLAY CDG"; + leader=1; + rank="SERGEANT"; + skill=0.46666664; + text="player11"; + }; + class Item1 + { + presenceCondition="isMultiplayer"; + position[]={272.29654,-0.095521234,112.84106}; + azimut=38.236099; + id=10; + side="WEST"; + vehicle=Blufor_Grenadier; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player12"; + }; + class Item2 + { + presenceCondition="isMultiplayer"; + position[]={271.81415,-0.23583208,103.8241}; + azimut=38.236099; + id=11; + side="WEST"; + vehicle=Blufor_Medic; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player13"; + }; + class Item3 + { + presenceCondition="isMultiplayer"; + position[]={258.19226,0.070982374,98.068115}; + azimut=38.236099; + id=12; + side="WEST"; + vehicle=Blufor_Rifleman; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player15"; + }; + class Item4 + { + presenceCondition="isMultiplayer"; + position[]={267.08691,0.079555303,95.828369}; + azimut=38.236099; + id=13; + side="WEST"; + vehicle=Blufor_AT_Specialist; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player16"; + }; + }; + }; + class Item6 + { + side="WEST"; + class Vehicles + { + items=5; + class Item0 + { + presenceCondition="isMultiplayer"; + position[]={250.05234,-0.013635203,141.24255}; + azimut=38.236099; + id=14; + side="WEST"; + vehicle=Blufor_Squadleader; + player="PLAY CDG"; + leader=1; + rank="SERGEANT"; + skill=0.46666664; + text="player6"; + }; + class Item1 + { + presenceCondition="isMultiplayer"; + position[]={236.95015,-0.22034465,146.43323}; + azimut=38.236099; + id=15; + side="WEST"; + vehicle=Blufor_Explosive_Specialist; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player8"; + }; + class Item2 + { + presenceCondition="isMultiplayer"; + position[]={233.0544,-0.22535685,135.8501}; + azimut=38.236099; + id=16; + side="WEST"; + vehicle=Blufor_Engineer; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player9"; + }; + class Item3 + { + presenceCondition="isMultiplayer"; + position[]={256.76801,-0.13899173,128.77588}; + azimut=38.236099; + id=17; + side="WEST"; + vehicle=Blufor_sniper; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player7"; + }; + class Item4 + { + presenceCondition="isMultiplayer"; + position[]={244.01947,-0.34063739,131.32288}; + azimut=38.236099; + id=18; + side="WEST"; + vehicle=Blufor_Medic; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player10"; + }; + }; + }; + class Item7 + { + side="WEST"; + class Vehicles + { + items=5; + class Item0 + { + presenceCondition="isMultiplayer"; + position[]={202.52556,-0.33604091,105.10266}; + azimut=38.236099; + id=19; + side="WEST"; + vehicle="B_recon_TL_F"; + player="PLAY CDG"; + leader=1; + rank="SERGEANT"; + skill=0.46666664; + text="player2"; + }; + class Item1 + { + presenceCondition="isMultiplayer"; + position[]={191.68073,-0.34259987,113.67969}; + azimut=38.236099; + id=20; + side="WEST"; + vehicle="B_recon_M_F"; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player3"; + }; + class Item2 + { + presenceCondition="isMultiplayer"; + position[]={204.96738,-0.037549913,114.25562}; + azimut=38.236099; + id=21; + side="WEST"; + vehicle=Blufor_Recon_Scout; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player4"; + }; + class Item3 + { + presenceCondition="isMultiplayer"; + position[]={218.85191,-0.20261329,114.07117}; + azimut=38.236099; + id=22; + side="WEST"; + vehicle="B_recon_LAT_F"; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player5"; + }; + class Item4 + { + presenceCondition="isMultiplayer"; + position[]={189.76903,-0.095692858,104.1189}; + azimut=38.236099; + id=23; + side="WEST"; + vehicle="B_recon_medic_F"; + player="PLAY CDG"; + rank="SERGEANT"; + skill=0.46666664; + text="player20"; + }; + }; + }; + }; + class Markers + { + items=1; + class Item0 + { + position[]={91.06839,0.14840496,23.99707}; + name="respawn_west"; + type="Empty"; + }; + }; }; class Intro { - addOns[]= - { - "a3_map_stratis", - "a3_map_altis" - }; - addOnsAuto[]= - { - "a3_map_altis" - }; - randomSeed=14680970; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0.30000001; - startWind=0.1; - startWaves=0.1; - forecastWeather=0.30000001; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - month=7; - day=6; - hour=14; - minute=15; - startFogBase=0.001; - forecastFogBase=0.001; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; + addOns[]= + { + "a3_map_stratis", + "a3_map_altis" + }; + addOnsAuto[]= + { + "a3_map_altis" + }; + randomSeed=14680970; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0.30000001; + startWind=0.1; + startWaves=0.1; + forecastWeather=0.30000001; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + month=7; + day=6; + hour=14; + minute=15; + startFogBase=0.001; + forecastFogBase=0.001; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; }; class OutroWin { - addOns[]= - { - "a3_map_stratis", - "a3_map_altis" - }; - addOnsAuto[]= - { - "a3_map_altis" - }; - randomSeed=13195057; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0.30000001; - startWind=0.1; - startWaves=0.1; - forecastWeather=0.30000001; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - month=7; - day=6; - hour=14; - minute=15; - startFogBase=0.001; - forecastFogBase=0.001; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; + addOns[]= + { + "a3_map_stratis", + "a3_map_altis" + }; + addOnsAuto[]= + { + "a3_map_altis" + }; + randomSeed=13195057; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0.30000001; + startWind=0.1; + startWaves=0.1; + forecastWeather=0.30000001; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + month=7; + day=6; + hour=14; + minute=15; + startFogBase=0.001; + forecastFogBase=0.001; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; }; class OutroLoose { - addOns[]= - { - "a3_map_stratis", - "a3_map_altis" - }; - addOnsAuto[]= - { - "a3_map_altis" - }; - randomSeed=16171346; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0.30000001; - startWind=0.1; - startWaves=0.1; - forecastWeather=0.30000001; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - month=7; - day=6; - hour=14; - minute=15; - startFogBase=0.001; - forecastFogBase=0.001; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; + addOns[]= + { + "a3_map_stratis", + "a3_map_altis" + }; + addOnsAuto[]= + { + "a3_map_altis" + }; + randomSeed=16171346; + class Intel + { + timeOfChanges=1800.0002; + startWeather=0.30000001; + startWind=0.1; + startWaves=0.1; + forecastWeather=0.30000001; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + year=2035; + month=7; + day=6; + hour=14; + minute=15; + startFogBase=0.001; + forecastFogBase=0.001; + startFogDecay=0.0049999999; + forecastFogDecay=0.0049999999; + }; }; diff --git a/source/rtipic.paa b/source/rtipic.paa index 020b23f69693a51a529f3fc02949879809ff8c31..4ceb972fe224e13147a8251efa1d1aee7c9f4106 100644 GIT binary patch delta 11030 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 delta 8031 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 delta 45871 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 wi$=Z~5B3kvOJP-gv@p)~?9`?PKU0}}b=hyVZp diff --git a/source/sounds/radiochatter3.ogg b/source/sounds/radiochatter3.ogg index 4a271399b8cfb7a4942f3ea6f700468652c0f5c7..a27ad986103b09b46f7c3493073a885ff735bf78 100644 GIT binary patch delta 96707 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

rj5z9<$eToy+${#QZ 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 N2#$XQX~2NG{{yXB08#(| diff --git a/source/mission.sqm.oldBackup b/source/mission.sqm.oldBackup deleted file mode 100644 index 631d954..0000000 --- a/source/mission.sqm.oldBackup +++ /dev/null @@ -1,530 +0,0 @@ -version=12; -class Mission -{ - addOns[]= - { - "a3_map_stratis", - "A3_Characters_F_OPFOR", - "A3_Characters_F_Civil", - "A3_Characters_F_INDEP", - "A3_Characters_F_BLUFOR", - "a3_characters_f_beta", - "a3_map_altis", - "a3_characters_f", - "A3_Modules_F" - }; - addOnsAuto[]= - { - "A3_Characters_F_OPFOR", - "a3_characters_f", - "A3_Characters_F_Civil", - "A3_Characters_F_INDEP", - "A3_Characters_F_BLUFOR", - "A3_Modules_F", - "a3_map_altis" - }; - randomSeed=16091530; - class Intel - { - briefingName="[SP/MP]Dynamic Universal War System - Rebirth"; - overviewText="Play a full, randomly generated campaign on whatever island you want to."; - startWeather=0; - startWind=0; - forecastWeather=0; - forecastWind=0; - forecastWaves=0; - wavesForced=1; - windForced=1; - year=2035; - month=7; - day=6; - hour=8; - minute=0; - startFogBase=0.001; - forecastFogBase=0.001; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; - class Groups - { - items=8; - class Item0 - { - side="EAST"; - class Vehicles - { - items=1; - class Item0 - { - position[]={94.314949,-0.25319061,121.57617}; - azimut=-104.97; - id=0; - side="EAST"; - vehicle=Opfor_Rifleman; - leader=1; - skill=0.60000002; - init="removeallweapons this"; - }; - }; - }; - class Item1 - { - side="CIV"; - class Vehicles - { - items=1; - class Item0 - { - position[]={79.035439,0.26340526,80.234863}; - azimut=150.57401; - id=1; - side="CIV"; - vehicle="C_man_1"; - leader=1; - skill=0.60000002; - init="removeallweapons this"; - }; - }; - }; - class Item2 - { - side="GUER"; - class Vehicles - { - items=1; - class Item0 - { - position[]={138.3087,-0.28989583,75.978027}; - id=2; - side="GUER"; - vehicle="I_Soldier_exp_F"; - leader=1; - skill=0.60000002; - init="removeallweapons this"; - }; - }; - }; - class Item3 - { - side="WEST"; - class Vehicles - { - items=5; - class Item0 - { - position[]={147.66809,-0.19525492,125.65027}; - azimut=63.238892; - id=3; - side="WEST"; - vehicle=Blufor_Squadleader; - player="PLAYER COMMANDER"; - leader=1; - rank="SERGEANT"; - skill=0.46666664; - text="player1"; - }; - class Item1 - { - presenceCondition="isMultiplayer"; - position[]={165.2303,-0.083054602,130.39087}; - azimut=38.236099; - id=4; - side="WEST"; - vehicle=Blufor_Medic; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player14"; - }; - class Item2 - { - presenceCondition="isMultiplayer"; - position[]={165.15147,0.0376672,119.52625}; - azimut=38.236099; - id=5; - side="WEST"; - vehicle=Blufor_Engineer; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player19"; - }; - class Item3 - { - presenceCondition="isMultiplayer"; - position[]={160.24103,-0.30163568,110.13025}; - azimut=38.236099; - id=6; - side="WEST"; - vehicle=Blufor_Rifleman; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player17"; - }; - class Item4 - { - presenceCondition="isMultiplayer"; - position[]={147.35245,0.03885065,107.86389}; - azimut=38.236099; - id=7; - side="WEST"; - vehicle=Blufor_Rifleman_AT; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player18"; - }; - }; - }; - class Item4 - { - side="LOGIC"; - class Vehicles - { - items=1; - class Item0 - { - position[]={117.6598,0.16756104,103.34326}; - azimut=83.280197; - id=8; - side="LOGIC"; - vehicle="Logic"; - leader=1; - skill=0.60000002; - }; - }; - }; - class Item5 - { - side="WEST"; - class Vehicles - { - items=5; - class Item0 - { - presenceCondition="isMultiplayer"; - position[]={261.39536,-0.030884311,110.60315}; - azimut=38.236099; - id=9; - side="WEST"; - vehicle=Blufor_Squadleader; - player="PLAY CDG"; - leader=1; - rank="SERGEANT"; - skill=0.46666664; - text="player11"; - }; - class Item1 - { - presenceCondition="isMultiplayer"; - position[]={272.29654,-0.095521234,112.84106}; - azimut=38.236099; - id=10; - side="WEST"; - vehicle=Blufor_Grenadier; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player12"; - }; - class Item2 - { - presenceCondition="isMultiplayer"; - position[]={271.81415,-0.23583208,103.8241}; - azimut=38.236099; - id=11; - side="WEST"; - vehicle=Blufor_Medic; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player13"; - }; - class Item3 - { - presenceCondition="isMultiplayer"; - position[]={258.19226,0.070982374,98.068115}; - azimut=38.236099; - id=12; - side="WEST"; - vehicle=Blufor_Rifleman; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player15"; - }; - class Item4 - { - presenceCondition="isMultiplayer"; - position[]={267.08691,0.079555303,95.828369}; - azimut=38.236099; - id=13; - side="WEST"; - vehicle=Blufor_AT_Specialist; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player16"; - }; - }; - }; - class Item6 - { - side="WEST"; - class Vehicles - { - items=5; - class Item0 - { - presenceCondition="isMultiplayer"; - position[]={250.05234,-0.013635203,141.24255}; - azimut=38.236099; - id=14; - side="WEST"; - vehicle=Blufor_Squadleader; - player="PLAY CDG"; - leader=1; - rank="SERGEANT"; - skill=0.46666664; - text="player6"; - }; - class Item1 - { - presenceCondition="isMultiplayer"; - position[]={236.95015,-0.22034465,146.43323}; - azimut=38.236099; - id=15; - side="WEST"; - vehicle=Blufor_Explosive_Specialist; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player8"; - }; - class Item2 - { - presenceCondition="isMultiplayer"; - position[]={233.0544,-0.22535685,135.8501}; - azimut=38.236099; - id=16; - side="WEST"; - vehicle=Blufor_Engineer; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player9"; - }; - class Item3 - { - presenceCondition="isMultiplayer"; - position[]={256.76801,-0.13899173,128.77588}; - azimut=38.236099; - id=17; - side="WEST"; - vehicle=Blufor_sniper; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player7"; - }; - class Item4 - { - presenceCondition="isMultiplayer"; - position[]={244.01947,-0.34063739,131.32288}; - azimut=38.236099; - id=18; - side="WEST"; - vehicle=Blufor_Medic; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player10"; - }; - }; - }; - class Item7 - { - side="WEST"; - class Vehicles - { - items=5; - class Item0 - { - presenceCondition="isMultiplayer"; - position[]={202.52556,-0.33604091,105.10266}; - azimut=38.236099; - id=19; - side="WEST"; - vehicle="B_recon_TL_F"; - player="PLAY CDG"; - leader=1; - rank="SERGEANT"; - skill=0.46666664; - text="player2"; - }; - class Item1 - { - presenceCondition="isMultiplayer"; - position[]={191.68073,-0.34259987,113.67969}; - azimut=38.236099; - id=20; - side="WEST"; - vehicle="B_recon_M_F"; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player3"; - }; - class Item2 - { - presenceCondition="isMultiplayer"; - position[]={204.96738,-0.037549913,114.25562}; - azimut=38.236099; - id=21; - side="WEST"; - vehicle=Blufor_Recon_Scout; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player4"; - }; - class Item3 - { - presenceCondition="isMultiplayer"; - position[]={218.85191,-0.20261329,114.07117}; - azimut=38.236099; - id=22; - side="WEST"; - vehicle="B_recon_LAT_F"; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player5"; - }; - class Item4 - { - presenceCondition="isMultiplayer"; - position[]={189.76903,-0.095692858,104.1189}; - azimut=38.236099; - id=23; - side="WEST"; - vehicle="B_recon_medic_F"; - player="PLAY CDG"; - rank="SERGEANT"; - skill=0.46666664; - text="player20"; - }; - }; - }; - }; - class Markers - { - items=1; - class Item0 - { - position[]={91.06839,0.14840496,23.99707}; - name="respawn_west"; - type="Empty"; - }; - }; -}; -class Intro -{ - addOns[]= - { - "a3_map_stratis", - "a3_map_altis" - }; - addOnsAuto[]= - { - "a3_map_altis" - }; - randomSeed=14680970; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0.30000001; - startWind=0.1; - startWaves=0.1; - forecastWeather=0.30000001; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - month=7; - day=6; - hour=14; - minute=15; - startFogBase=0.001; - forecastFogBase=0.001; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; -}; -class OutroWin -{ - addOns[]= - { - "a3_map_stratis", - "a3_map_altis" - }; - addOnsAuto[]= - { - "a3_map_altis" - }; - randomSeed=13195057; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0.30000001; - startWind=0.1; - startWaves=0.1; - forecastWeather=0.30000001; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - month=7; - day=6; - hour=14; - minute=15; - startFogBase=0.001; - forecastFogBase=0.001; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; -}; -class OutroLoose -{ - addOns[]= - { - "a3_map_stratis", - "a3_map_altis" - }; - addOnsAuto[]= - { - "a3_map_altis" - }; - randomSeed=16171346; - class Intel - { - timeOfChanges=1800.0002; - startWeather=0.30000001; - startWind=0.1; - startWaves=0.1; - forecastWeather=0.30000001; - forecastWind=0.1; - forecastWaves=0.1; - forecastLightnings=0.1; - year=2035; - month=7; - day=6; - hour=14; - minute=15; - startFogBase=0.001; - forecastFogBase=0.001; - startFogDecay=0.0049999999; - forecastFogDecay=0.0049999999; - }; -}; diff --git a/source/rtipic.paa b/source/rtipic.paa index 4ceb972fe224e13147a8251efa1d1aee7c9f4106..020b23f69693a51a529f3fc02949879809ff8c31 100644 GIT binary patch delta 8031 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 From 9f358e252f5138e1c272343fa5234b1bc6e06c69 Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 18:57:10 +0200 Subject: [PATCH 05/17] Added .editorconfig --- .editorconfig | 12 ++++++++++++ .gitignore | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..af1c2ff --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index b4708dc..ef134c7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ DUWS-R.iml localDevDeploy.properties -DUWS-R_dev.Altis.pbo \ No newline at end of file +DUWS-R_dev.Altis.pbo +mission.sqm \ No newline at end of file From 973d6729d3b3c9bc94e9c3541fa7225b6330ba8b Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 19:02:16 +0200 Subject: [PATCH 06/17] Added .gitattributes --- .gitattributes | 4 ++++ .gitignore | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3c59efe --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +* text=auto +*.png binary +*.jpg binary +*.paa binary diff --git a/.gitignore b/.gitignore index ef134c7..9296e8e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,3 @@ DUWS-R.iml localDevDeploy.properties DUWS-R_dev.Altis.pbo -mission.sqm \ No newline at end of file From 0263e08ff11f7afb4869a5421b32b2d42ab4286e Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 19:49:25 +0200 Subject: [PATCH 07/17] Fixed infinite loop of FOB spawning --- source/functions/support/fn_fob.sqf | 18 +----- source/functions/support/fn_fob_addAction.sqf | 12 ++++ source/includes/CfgFunctions.hpp | 62 ++++++++++--------- 3 files changed, 46 insertions(+), 46 deletions(-) create mode 100644 source/functions/support/fn_fob_addAction.sqf diff --git a/source/functions/support/fn_fob.sqf b/source/functions/support/fn_fob.sqf index ad377a8..7fdad3c 100644 --- a/source/functions/support/fn_fob.sqf +++ b/source/functions/support/fn_fob.sqf @@ -42,7 +42,7 @@ if (_amountOPFOR > 0) exitWith { _art = [player,"fob_support"] call BIS_fnc_addCommMenuItem; }; -// Attempt to find a safe position +// Attempt to find a safe position _foundPickupPos = [_position, 0,50,10,0,0.2,0,[],[[0,0],[0,0]]] call BIS_fnc_findSafePos; // find a valid pos if (0 == _foundPickupPos select 0 && 0 == _foundPickupPos select 1) exitWith { hint "No valid FOB pos nearby\nTry to go near a flat, object free zone."; @@ -72,21 +72,7 @@ sleep 5; _fob = "Land_Cargo_HQ_V1_F" createVehicle _foundPickupPos; -DUWS_fnc_fob = { - _this addaction ["Player stats",{_this spawn duws_fnc_info}, "", 0, true, true, "", "_this == player"]; - _this addaction ["Request ammobox drop(2CP)",{_this spawn duws_fnc_fob_ammobox}, "", 0, true, true, "", "_this == player"]; - _this addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; - _this addaction ["FOB manager",{_this spawn duws_fnc_fobmanageropen}, "", 0, true, true, "", "_this == player"]; - if (support_armory_available) then { - _this addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; - }; - if (isServer) then { - _this addaction ["Rest (wait/save)",{[]spawn duws_fnc_savegame}, "", 0, true, true, "", "_this == player"]; - } else { - _this addaction ["Rest",{[] spawn duws_fnc_savegameClient}, "", 0, true, true, "", "_this == player"]; - }; -}; -[_fob,"DUWS_fnc_fob",true,true] spawn BIS_fnc_MP; // [_fob,"DUWS_fnc_fob",nil,true] spawn BIS_fnc_MP; +_fob remoteExecCall ["DUWS_fnc_fob_addAction", 0, true]; // For fortifying _fob addaction ["Fortify FOB(4CP)","_this spawn duws_fnc_fortifyFOB", [(getpos _fob), _fob], 0, true, true, "", "_this == player"]; diff --git a/source/functions/support/fn_fob_addAction.sqf b/source/functions/support/fn_fob_addAction.sqf new file mode 100644 index 0000000..ce309ae --- /dev/null +++ b/source/functions/support/fn_fob_addAction.sqf @@ -0,0 +1,12 @@ +_this addaction ["Player stats",{_this spawn duws_fnc_info}, "", 0, true, true, "", "_this == player"]; +_this addaction ["Request ammobox drop(2CP)",{_this spawn duws_fnc_fob_ammobox}, "", 0, true, true, "", "_this == player"]; +_this addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; +_this addaction ["FOB manager",{_this spawn duws_fnc_fobmanageropen}, "", 0, true, true, "", "_this == player"]; +if (support_armory_available) then { + _this addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; +}; +if (isServer) then { + _this addaction ["Rest (wait/save)",{[]spawn duws_fnc_savegame}, "", 0, true, true, "", "_this == player"]; +} else { + _this addaction ["Rest",{[] spawn duws_fnc_savegameClient}, "", 0, true, true, "", "_this == player"]; +}; diff --git a/source/includes/CfgFunctions.hpp b/source/includes/CfgFunctions.hpp index 35542cf..3a7e422 100644 --- a/source/includes/CfgFunctions.hpp +++ b/source/includes/CfgFunctions.hpp @@ -11,7 +11,7 @@ class CfgFunctions //postInit = 1; }; //duws_fnc_serverInit - class serverInit + class serverInit { //preInit = 1; }; @@ -24,7 +24,7 @@ class CfgFunctions class processVehicleConfig {}; class processGroupConfig {}; }; - + class generic { class bisArsenal {}; @@ -45,7 +45,7 @@ class CfgFunctions // [] call duws_fnc_convertCPtoAP class dynamic_menu {}; // [???] spawn duws_fnc_dynamic_menu - class dyn_music_init + class dyn_music_init { postInit = 1; }; @@ -85,7 +85,7 @@ class CfgFunctions class hc_init {}; // [] call duws_fnc_hc_init }; - + class fob { class fast_travel {}; @@ -97,7 +97,7 @@ class CfgFunctions class reinforce {}; // [] spawn duws_fnc_reinforce }; - + class utilities { class autoSave {}; @@ -105,13 +105,13 @@ class CfgFunctions class groupReset {}; // [] call duws_fnc_groupReset }; - + class WARCOM { class random_veh_blu_patrol {}; - // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_blu_patrol + // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_blu_patrol class random_veh_opf_patrol {}; - // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_opf_patrol + // [faction, vehclass, position, radius] spawn duws_fnc_random_veh_opf_patrol class WARCOM_blu_assault {}; // [] call duws_fnc_WARCOM_blu_assault class WARCOM_blu_patrol {}; @@ -137,7 +137,7 @@ class CfgFunctions class WARCOM_wp_opf_qrf {}; // [group, unitpos] call duws_fnc_WARCOM_wp_opf_qrf }; - + class initHQ { class BluHQinit {}; @@ -181,7 +181,7 @@ class CfgFunctions class commanderAnim {}; // [unit] call duws_fnc_commanderAnim }; - + class startup { class manual {}; @@ -209,7 +209,7 @@ class CfgFunctions class weather_client {}; // [] spawn duws_fnc_weather_client }; - + class initZones { class createzone {}; @@ -223,7 +223,7 @@ class CfgFunctions class locatorzonesV2 {}; // [radius, diff] spawn duws_fnc_locatorzonesV2 }; - + class zonescap { class blufor_cap {} @@ -231,7 +231,7 @@ class CfgFunctions class opfor_cap {}; // [place, points, markername, markername2, triggerPos] call duws_fnc_opfor_cap }; - + class prefabs { class site_Barracks {}; @@ -246,7 +246,7 @@ class CfgFunctions class site_researchStation {}; class site_vehfittingstation {}; }; - + class persistent { class persistent_stats_init {}; @@ -259,7 +259,7 @@ class CfgFunctions // [] call duws_fnc_persistent_stats_win; class persistent_stats_zones_add {}; // [] call duws_fnc_persistent_stats_zones_add; - + class experience_init {}; // [] call duws_fnc_experience_init; class experience_ability_check {}; @@ -281,7 +281,7 @@ class CfgFunctions class experience_ability_warrior {}; // [player] spawn duws_fnc_experience_ability_warruir }; - + class operative { class operator_add_aim {}; @@ -305,7 +305,7 @@ class CfgFunctions class operator_recruit {}; // [] spawn duws_fnc_operator_recruit }; - + class missions { class destroy_mission {}; @@ -328,13 +328,13 @@ class CfgFunctions // [location] spawn duws_fnc_underwater_mission class underwater_success {}; // (in addaction) {_this call duws_fnc_underwater_success;} - + class missionTimer {}; // [] spawn duws_fnc_missionTimer class stratmap {}; // [] spawn duws_fnc_stratmap }; - + class squad { class copyloadout {}; @@ -348,7 +348,7 @@ class CfgFunctions class squadmng {}; // [] spawn duws_fnc_squadmng }; - + class support { class ammobox {}; @@ -357,6 +357,8 @@ class CfgFunctions // [position, salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_arty class fob {}; // [position, size] spawn duws_fnc_fob + class fob_addAction {}; + // object remoteExecCall ["DUWS_fnc_fob_addAction", ] class fob_ammobox {}; // [target, location] spawn duws_fnc_fob_ammobox class FOBactions {}; @@ -375,7 +377,7 @@ class CfgFunctions // [centerPos, checkedRadius] spawn duws_fnc_uav_map class veh_refit {}; // [] call duws_fnc_veh_refit - + // Taxi class boatTaxi { @@ -402,7 +404,7 @@ class CfgFunctions file = "functions\support\taxi\fn_random_music.sqf"; }; // [] call duws_fnc_random_music - + // Cluster class cluster { @@ -415,7 +417,7 @@ class CfgFunctions }; // [salvos, radius, interval, rps, supporttype, cost, ammotype] spawn duws_fnc_mapclickcluster }; - + class misc { class bottom_right_message {}; @@ -423,22 +425,22 @@ class CfgFunctions class gps_marker {}; // [] spawn duws_fnc_gps_marker }; - + class info { class info {}; // [] spawn duws_fnc_info }; - + class pFLIR { class livefeed {}; class livefeed1 {}; class livefeedexit {}; }; - + }; - class TAW_VD + class TAW_VD { tag = "TAWVD"; @@ -449,7 +451,7 @@ class CfgFunctions postInit = 1; headerType = -1; }; - + class onSliderChanged {}; class onTerrainChanged {}; class updateViewDistance {}; @@ -460,6 +462,6 @@ class CfgFunctions class onSaveSelectionChanged {}; }; }; - + #include "..\AIS\cfgFunctions.hpp" -}; \ No newline at end of file +}; From 306a87df5d4bf8a3ba07ecf1a3a8d070b16ae73f Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 19:58:55 +0200 Subject: [PATCH 08/17] Fixed fob_ammobox No location parameter is passed, so it gets the location from the passed object. --- source/functions/support/fn_fob_ammobox.sqf | 26 +++++++-------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/source/functions/support/fn_fob_ammobox.sqf b/source/functions/support/fn_fob_ammobox.sqf index 63293f4..8c805a4 100644 --- a/source/functions/support/fn_fob_ammobox.sqf +++ b/source/functions/support/fn_fob_ammobox.sqf @@ -3,8 +3,8 @@ Author: Kibot - Description: - Variant of ammobox.sqf with less spread in deployment. + Description: + Variant of ammobox.sqf with less spread in deployment. Air-deploys a NATO ammobox with a parachute at a assigned location. Parameter(s): @@ -13,11 +13,12 @@ Usage: _scriptHandle = [player] spawn duws_fnc_fob_ammobox; - Returns: + Returns: - Nil - */ -params ["_target","_location"]; +params ["_target"]; +private _location = getPos _target; if (commandpointsblu1<2) exitWith { ["info",["Not enough command points","Not enough Command Points (2CP required)"]] call bis_fnc_showNotification; @@ -34,20 +35,9 @@ _parachute setPos [_location select 0, _location select 1, (_location select 2)+ _ammo = Blufor_SupplyCrate CreateVehicle [_location select 0,_location select 1,(_location select 2)+20]; _ammo attachTo [_parachute,[0,0,0]]; -_ammo addMagazineCargo ["30Rnd_65x39_caseless_mag", 70]; -_ammo addMagazineCargo ["30Rnd_65x39_caseless_mag_Tracer", 70]; -_ammo addMagazineCargo ["100Rnd_65x39_caseless_mag", 70]; -_ammo addMagazineCargo ["100Rnd_65x39_caseless_mag_tracer", 70]; -_ammo addMagazineCargo ["1Rnd_HE_Grenade_shell", 90]; -_ammo addMagazineCargo ["UGL_FlareRed_F", 70]; -_ammo addMagazineCargo ["UGL_FlareGreen_F", 70]; -_ammo addMagazineCargo ["1Rnd_Smoke_Grenade_shell", 70]; -_ammo addMagazineCargo ["1Rnd_SmokeRed_Grenade_shell", 70]; -_ammo addMagazineCargo ["1Rnd_SmokeBlue_Grenade_shell", 70]; -_ammo addMagazineCargo ["NLAW_F", 70]; -_ammo addMagazineCargo ["Chemlight_green", 70]; - -_ammo addBackpackCargo ["B_AssaultPack_khk",10]; +{ + _ammo addItemCargo _x; +} forEach Blufor_Ammobox_Contents; if (support_armory_available) then {[[_ammo,["Armory",{[] call duws_fnc_bisArsenal},[], 0, false, false, "", "_this distance _target < 4"]],"addAction",true,true] call BIS_fnc_MP;}; From 8a11f6ed72a33a20117be44da4b9650b89661ed4 Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 20:23:41 +0200 Subject: [PATCH 09/17] Fixed artillery patrols, added config options Random vehicle patrols did not check for artillery vehicles. --- source/DUWS_CONFIG.sqf | 12 +++- .../WARCOM/fn_random_veh_opf_patrol.sqf | 56 +++++++++++-------- source/functions/generic/fn_random_veh.sqf | 26 ++++----- 3 files changed, 54 insertions(+), 40 deletions(-) diff --git a/source/DUWS_CONFIG.sqf b/source/DUWS_CONFIG.sqf index 524dc53..c6fa6ad 100644 --- a/source/DUWS_CONFIG.sqf +++ b/source/DUWS_CONFIG.sqf @@ -83,7 +83,7 @@ Blufor_Taxi_Helo = "B_Heli_Transport_01_camo_F"; // Format: ["classname", amount] // classname can be of types: item, weapons, magazine // For more info, see https://community.bistudio.com/wiki/addItemCargo -Blufor_Ammobox_Contents = +Blufor_Ammobox_Contents = [ ["30Rnd_65x39_caseless_mag", 70], ["30Rnd_65x39_caseless_mag_Tracer", 70], @@ -144,7 +144,7 @@ Opfor_Faction = "OPF_F"; // Opfor Soldiers Opfor_Officer = "O_officer_F"; -Opfor_Squadleader = "O_Soldier_SL_F"; +Opfor_Squadleader = "O_Soldier_SL_F"; Opfor_Teamleader = "O_Soldier_TL_F"; Opfor_Medic = "O_medic_F"; Opfor_Rifleman = "O_Soldier_F"; @@ -175,6 +175,12 @@ Opfor_WARCOM_Weapons_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" Opfor_WARCOM_Mech_Inf_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInfSquad"); Opfor_WARCOM_Mech_Wpn_Squad = (configfile >> "CfgGroups" >> "East" >> "OPF_F" >> "Mechanized" >> "OIA_MechInf_AT"); +// Indfor faction +Indfor_Faction = "IND_F"; + +// Civilian faction +Civilian_Faction = "CIV_F"; + ///////Special Operatives/////// duws_operator_list=[ [0.35,0.62,0.67,0.48,0.66,0.32,"Scout","Ready","Matthew 'Ghost' Norton","ghost","B_recon_F","H_Shemag_olive_hs",0,0], @@ -216,4 +222,4 @@ duws_operator_list=[ 11: hat 12: time before heal 13: available spendable points -*/ \ No newline at end of file +*/ diff --git a/source/functions/WARCOM/fn_random_veh_opf_patrol.sqf b/source/functions/WARCOM/fn_random_veh_opf_patrol.sqf index 428e9e7..999037a 100644 --- a/source/functions/WARCOM/fn_random_veh_opf_patrol.sqf +++ b/source/functions/WARCOM/fn_random_veh_opf_patrol.sqf @@ -12,32 +12,40 @@ _found = false; _foundVeh = ""; while {!_found} do { -_checked_veh = _cfgVehicles select round (random _realentries); // RANDOMLY SELECT AN ENTRY -_classname = configName _checked_veh; -if (isClass _checked_veh) then { // CHECK IF THE SELECTED ENTRY IS A CLASS -//hintSilent format["%1",_classname]; -sleep 0.005; -_actual_vehclass = getText (_checked_veh >> "vehicleClass"); -_actual_faction = getText (_checked_veh >> "faction"); -_scope = getNumber (_checked_veh >> "scope"); // check if actually present in editor -_simulation_paracheck = getText (_checked_veh >> "simulation"); // check if not a parachute - - - if (_actual_vehclass == _vehClass && _actual_faction == _faction && _scope != 0 && _simulation_paracheck != "parachute") exitWith { -// hintSilent format["%1",_classname]; -// _veh = createVehicle [_classname, _position, [], 0, _vehClass]; - _foundVeh = _classname; - _found = true; - }; - }; -}; // --- VEHICLE FOUND --> _foundVeh + // RANDOMLY SELECT AN ENTRY + _checked_veh = _cfgVehicles select round (random _realentries); + _classname = configName _checked_veh; + + // CHECK IF THE SELECTED ENTRY IS A CLASS + if (isClass _checked_veh) then { + //hintSilent format["%1",_classname]; + sleep 0.005; + _actual_vehclass = getText (_checked_veh >> "vehicleClass"); + _actual_faction = getText (_checked_veh >> "faction"); + _scope = getNumber (_checked_veh >> "scope"); // check if actually present in editor + _simulation_paracheck = getText (_checked_veh >> "simulation"); // check if not a parachute + _artilleryScanner = getNumber (_checked_veh >> "artilleryScanner"); //Check if it is an artillery unit + + if (_actual_vehclass == _vehClass + && _actual_faction == _faction + && _scope != 0 + && _simulation_paracheck != "parachute" + && _artilleryScanner == 0) exitWith { + + //hintSilent format["%1",_classname]; + //_veh = createVehicle [_classname, _position, [], 0, _vehClass]; + _foundVeh = _classname; + _found = true; + }; + }; +};// --- VEHICLE FOUND --> _foundVeh // DETERMINE LA FACTION -_side = EAST; -if(_faction=="BLU_F") then {_side=WEST}; -if(_faction==Opfor_Faction) then {_side=EAST}; -if(_faction=="IND_F") then {_side=RESISTANCE}; -if(_faction=="CIV_F") then {_side=CIVILIAN}; +_side = EAST; +if(_faction == Blufor_Faction) then {_side=WEST}; +if(_faction == Opfor_Faction) then {_side=EAST}; +if(_faction == Indfor_Faction) then {_side=RESISTANCE}; +if(_faction == Civilian_Faction) then {_side=CIVILIAN}; _createdVehFnc = [_position,0,_foundVeh,_side] call bis_fnc_spawnvehicle; diff --git a/source/functions/generic/fn_random_veh.sqf b/source/functions/generic/fn_random_veh.sqf index 817bdb6..a011220 100644 --- a/source/functions/generic/fn_random_veh.sqf +++ b/source/functions/generic/fn_random_veh.sqf @@ -26,26 +26,26 @@ while {!_found} do { _simulation_paracheck = getText (_checked_veh >> "simulation"); // check if not a parachute _artilleryScanner = getNumber (_checked_veh >> "artilleryScanner"); //Check if it is an artillery unit - if (_actual_vehclass == _vehClass - && _actual_faction == _faction - && _scope != 0 - && _simulation_paracheck != "parachute" - && _artilleryScanner == 0) exitWith { + if (_actual_vehclass == _vehClass + && _actual_faction == _faction + && _scope != 0 + && _simulation_paracheck != "parachute" + && _artilleryScanner == 0) exitWith { //hintSilent format["%1",_classname]; //_veh = createVehicle [_classname, _position, [], 0, _vehClass]; _foundVeh = _classname; _found = true; }; - }; + }; };// --- VEHICLE FOUND --> _foundVeh -// DETERMINE LA FACTION -_side = EAST; -if(_faction=="BLU_F") then {_side=WEST}; -if(_faction==Opfor_Faction) then {_side=EAST}; -if(_faction=="IND_F") then {_side=RESISTANCE}; -if(_faction=="CIV_F") then {_side=CIVILIAN}; +// DETERMINE FACTION +_side = EAST; +if(_faction == Blufor_Faction) then {_side=WEST}; +if(_faction == Opfor_Faction) then {_side=EAST}; +if(_faction == Indfor_Faction) then {_side=RESISTANCE}; +if(_faction == Civilian_Faction) then {_side=CIVILIAN}; _createdVehFnc = [_position,0,_foundVeh,_side] call bis_fnc_spawnvehicle; @@ -56,4 +56,4 @@ _patrolRadius = round(_radius/2); //_crews = _createdVehFnc select 1; // //_driver = _crews select 0; //DEBUG -//addSwitchableUnit _driver; // \ No newline at end of file +//addSwitchableUnit _driver; // From 2113a3c2b9074760abaa26d2b0cd562047a8458b Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 20:34:47 +0200 Subject: [PATCH 10/17] Spread out guards around HQ --- source/functions/initHQ/fn_BluHQinit.sqf | 8 +++--- source/functions/initHQ/fn_guardsHQ.sqf | 36 ++++++++++++------------ source/includes/CfgFunctions.hpp | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/source/functions/initHQ/fn_BluHQinit.sqf b/source/functions/initHQ/fn_BluHQinit.sqf index 3e08228..2fc3f00 100644 --- a/source/functions/initHQ/fn_BluHQinit.sqf +++ b/source/functions/initHQ/fn_BluHQinit.sqf @@ -36,7 +36,7 @@ _group = createGroup west; _hq = _group createUnit [Blufor_Officer,(getmarkerpos str(blu_hq_markername)), [], 0, "FORM"]; hq_blu1 = _hq; publicVariable "hq_blu1"; -_hq setpos [_hqblu select 0, _hqblu select 1, 0.59]; +_hq setpos [_hqblu select 0, _hqblu select 1, 0.59]; _hq disableAI "AUTOTARGET"; _hq disableAI "MOVE"; removeallweapons _hq; @@ -62,8 +62,8 @@ _handle = [(getpos hq_blu1), _hq] spawn duws_fnc_fortify; }; //CREATE PATROL -[getpos hq_blu1] call duws_fnc_guardsHQ; -[getpos hq_blu1] call duws_fnc_guardsHQ; +[getpos hq_blu1, 40] call duws_fnc_guardsHQ; +[getpos hq_blu1, 60] call duws_fnc_guardsHQ; // IF THE OFFICER IS DEAD -- End OF "SPAWN" @@ -111,4 +111,4 @@ if (debugmode) exitWith {}; if (isServer) then { _sitrep = [player,"sitrep"] call BIS_fnc_addCommMenuItem; -}; \ No newline at end of file +}; diff --git a/source/functions/initHQ/fn_guardsHQ.sqf b/source/functions/initHQ/fn_guardsHQ.sqf index 650b77a..83197c1 100644 --- a/source/functions/initHQ/fn_guardsHQ.sqf +++ b/source/functions/initHQ/fn_guardsHQ.sqf @@ -1,34 +1,34 @@ -params ["_centerPos"]; +params ["_centerPos", "_distance"]; // patrolling guard -_groupPatrol = [ [(_centerPos select 0)+40, (_centerPos select 1)+40], WEST, [Blufor_Rifleman,Blufor_Rifleman,Blufor_AT_Specialist,Blufor_Engineer,Blufor_Medic,Blufor_Recon_Scout,Blufor_AT_Specialist,Blufor_AA_Specialist],[],[],[0.6,0.8,0.7]] call BIS_fnc_spawnGroup; +_groupPatrol = [ [(_centerPos select 0)+_distance, (_centerPos select 1)+_distance], WEST, [Blufor_Rifleman,Blufor_Rifleman,Blufor_AT_Specialist,Blufor_Engineer,Blufor_Medic,Blufor_Recon_Scout,Blufor_AT_Specialist,Blufor_AA_Specialist],[],[],[0.6,0.8,0.7]] call BIS_fnc_spawnGroup; _groupPatrol setCombatMode "YELLOW"; - _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+40, (_centerPos select 1)+40], 0]; - _wp setWaypointType "MOVE"; +_wp = _groupPatrol addWaypoint [[(_centerPos select 0)+_distance, (_centerPos select 1)+_distance], 0]; +_wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; _wp setWaypointSpeed "LIMITED"; - _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-40, (_centerPos select 1)+40], 0]; - _wp setWaypointType "MOVE"; +_wp = _groupPatrol addWaypoint [[(_centerPos select 0)-_distance, (_centerPos select 1)+_distance], 0]; +_wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; - - _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-40, (_centerPos select 1)-40], 0]; - _wp setWaypointType "MOVE"; +_wp setWaypointSpeed "LIMITED"; + +_wp = _groupPatrol addWaypoint [[(_centerPos select 0)-_distance, (_centerPos select 1)-_distance], 0]; +_wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; +_wp setWaypointSpeed "LIMITED"; + +_wp = _groupPatrol addWaypoint [[(_centerPos select 0)+_distance, (_centerPos select 1)-_distance], 0]; +_wp setWaypointType "MOVE"; - _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+40, (_centerPos select 1)-40], 0]; - _wp setWaypointType "MOVE"; - - _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+40, (_centerPos select 1)+40], 0]; - _wp setWaypointType "CYCLE"; +_wp = _groupPatrol addWaypoint [[(_centerPos select 0)+_distance, (_centerPos select 1)+_distance], 0]; +_wp setWaypointType "CYCLE"; _wp setWaypointBehaviour "SAFE"; _wp setWaypointSpeed "LIMITED"; // ADD Infinite Ammo eventhandler { -_x addEventHandler ["Fired",{(_this select 0) setvehicleammo 1}]; -_x addEventHandler ["HandleDamage", {false}]; + _x addEventHandler ["Fired",{(_this select 0) setvehicleammo 1}]; + _x addEventHandler ["HandleDamage", {false}]; } forEach (units _groupPatrol); diff --git a/source/includes/CfgFunctions.hpp b/source/includes/CfgFunctions.hpp index 3a7e422..db3cb82 100644 --- a/source/includes/CfgFunctions.hpp +++ b/source/includes/CfgFunctions.hpp @@ -161,7 +161,7 @@ class CfgFunctions class guardsFOB {}; // [_centerPos, _fob, _size] call duws_fnc_guardsFOB class guardsHQ {}; - // [_centerPos] call duws_fnc_guardsHQ + // [_centerPos, _distance] call duws_fnc_guardsHQ class hq_radioloop {}; // [_object] spawn duws_fnc_radioloop class HQaddactions {}; From 29c689b3bf2e00b50f216be7fd99f247e66ca318 Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 20:59:11 +0200 Subject: [PATCH 11/17] Removed duplicate spawn scopes addAction already runs code in a scheduled environment, so spawning it again via {[] spawn function} is unneccessary. Removed some hard links to files. --- source/functions/initHQ/fn_HQaddactions.sqf | 8 ++--- source/functions/initHQ/fn_guards.sqf | 20 ++++++------ source/functions/initHQ/fn_guardsFOB.sqf | 16 +++++----- .../missions/fn_sabotage_mission.sqf | 10 +++--- source/functions/pFLIR/fn_livefeed.sqf | 16 +++++----- source/functions/pFLIR/fn_livefeed1.sqf | 14 ++++---- source/functions/pFLIR/fn_livefeedexit.sqf | 6 ++-- .../fn_experience_ability_fieldcomm.sqf | 13 ++++---- source/functions/support/fn_fob.sqf | 2 +- source/functions/support/fn_fob_addAction.sqf | 14 ++++---- source/functions/support/taxi/fn_boatTaxi.sqf | 22 ++++++------- source/functions/support/taxi/fn_helotaxi.sqf | 32 +++++++++---------- 12 files changed, 86 insertions(+), 87 deletions(-) diff --git a/source/functions/initHQ/fn_HQaddactions.sqf b/source/functions/initHQ/fn_HQaddactions.sqf index dbdce2a..349d956 100644 --- a/source/functions/initHQ/fn_HQaddactions.sqf +++ b/source/functions/initHQ/fn_HQaddactions.sqf @@ -1,11 +1,11 @@ params ["_hq"]; -_hq addaction ["Player stats",{_this spawn duws_fnc_info}, "", 0, true, true, "", "_this == player"]; +_hq addaction ["Player stats",duws_fnc_info, "", 0, true, true, "", "_this == player"]; _hq addaction ["Request units",{_this call duws_fnc_request}, "", 0, true, true, "", "_this == player"]; -_hq addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; -_hq addaction ["FOB manager",{_this spawn duws_fnc_fobmanageropen}, "", 0, true, true, "", "_this == player"]; +_hq addaction ["Squad manager",duws_fnc_squadmng, "", 0, true, true, "", "_this == player"]; +_hq addaction ["FOB manager",duws_fnc_fobmanageropen, "", 0, true, true, "", "_this == player"]; if (isServer) then { - _hq addaction ["Rest (wait/save)", {[]spawn duws_fnc_savegame}, "", 0, true, true, "", "_this == player"]; + _hq addaction ["Rest (wait/save)", duws_fnc_savegame, "", 0, true, true, "", "_this == player"]; }; if (!isServer) then { diff --git a/source/functions/initHQ/fn_guards.sqf b/source/functions/initHQ/fn_guards.sqf index 5ed8f09..d7cb57c 100644 --- a/source/functions/initHQ/fn_guards.sqf +++ b/source/functions/initHQ/fn_guards.sqf @@ -2,29 +2,29 @@ params ["_centerPos","_hq"]; // Create the guards _groupGuard = createGroup WEST; -_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 setpos [(_centerPos select 0)-6.5, (_centerPos select 1)-1.6]; _hqGuard1 setdir 270; [_hqGuard1,"STAND","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard2 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; +_hqGuard2 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard2 setpos [(_centerPos select 0)-6.5, (_centerPos select 1)-4.7]; _hqGuard2 setdir 270; [_hqGuard2,"STAND_IA","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard3 = _groupGuard createUnit [Blufor_Teamleader, _centerPos, [], 0, "FORM"]; +_hqGuard3 = _groupGuard createUnit [Blufor_Teamleader, _centerPos, [], 0, "FORM"]; _hqGuard3 setpos [(_centerPos select 0), (_centerPos select 1)-7.58]; _hqGuard3 setdir 180; [_hqGuard3,"LEAN","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard4 = _groupGuard createUnit [Blufor_Rifleman_AT, _centerPos, [], 0, "FORM"]; +_hqGuard4 = _groupGuard createUnit [Blufor_Rifleman_AT, _centerPos, [], 0, "FORM"]; _hqGuard4 setpos [(_centerPos select 0), (_centerPos select 1)-9]; _hqGuard4 setdir 0; [_hqGuard4,"STAND","FULL"] call BIS_fnc_ambientAnimCombat; // patrolling guard _groupPatrol = createGroup WEST; -_hqGuard5 = _groupPatrol createUnit [Blufor_Grenadier, _centerPos, [], 0, "FORM"]; +_hqGuard5 = _groupPatrol createUnit [Blufor_Grenadier, _centerPos, [], 0, "FORM"]; _hqGuard5 setpos [(_centerPos select 0)+10, (_centerPos select 1)+10]; _groupPatrol setCombatMode "YELLOW"; @@ -36,19 +36,19 @@ _wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-10, (_centerPos select 1)+10], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; - +_wp setWaypointSpeed "LIMITED"; + _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-10, (_centerPos select 1)-10], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; +_wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+10, (_centerPos select 1)-10], 0]; _wp setWaypointType "MOVE"; - + _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+10, (_centerPos select 1)+10], 0]; _wp setWaypointType "CYCLE"; _wp setWaypointBehaviour "SAFE"; _wp setWaypointSpeed "LIMITED"; -_hq addAction ["Replace Guards (20CP)", "initHQ\reguard.sqf", [_groupGuard, _groupPatrol, _centerPos, _hq], 0, true, true, "", "_this == player"]; \ No newline at end of file +_hq addAction ["Replace Guards (20CP)", {_this call DUWS_fnc_reguard}, [_groupGuard, _groupPatrol, _centerPos, _hq], 0, true, true, "", "_this == player"]; diff --git a/source/functions/initHQ/fn_guardsFOB.sqf b/source/functions/initHQ/fn_guardsFOB.sqf index 8d3d092..e1c66df 100644 --- a/source/functions/initHQ/fn_guardsFOB.sqf +++ b/source/functions/initHQ/fn_guardsFOB.sqf @@ -4,29 +4,29 @@ if (isnil _size) then {_size = 500}; // Create the guards _groupGuard = createGroup WEST; -_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; +_hqGuard1 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard1 setpos [(_centerPos select 0)-6.5, (_centerPos select 1)-1.6]; _hqGuard1 setdir 270; [_hqGuard1,"STAND","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard2 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; +_hqGuard2 = _groupGuard createUnit [Blufor_Rifleman, _centerPos, [], 0, "FORM"]; _hqGuard2 setpos [(_centerPos select 0)-6.5, (_centerPos select 1)-4.7]; _hqGuard2 setdir 270; [_hqGuard2,"WATCH","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard3 = _groupGuard createUnit [Blufor_Teamleader, _centerPos, [], 0, "FORM"]; +_hqGuard3 = _groupGuard createUnit [Blufor_Teamleader, _centerPos, [], 0, "FORM"]; _hqGuard3 setpos [(_centerPos select 0), (_centerPos select 1)-7.58]; _hqGuard3 setdir 180; [_hqGuard3,"LEAN","FULL"] call BIS_fnc_ambientAnimCombat; -_hqGuard4 = _groupGuard createUnit [Blufor_Rifleman_AT, _centerPos, [], 0, "FORM"]; +_hqGuard4 = _groupGuard createUnit [Blufor_Rifleman_AT, _centerPos, [], 0, "FORM"]; _hqGuard4 setpos [(_centerPos select 0), (_centerPos select 1)-9]; _hqGuard4 setdir 0; [_hqGuard4,"STAND","FULL"] call BIS_fnc_ambientAnimCombat; // patrolling guard _groupPatrol = createGroup WEST; -_hqGuard5 = _groupPatrol createUnit [Blufor_Grenadier, _centerPos, [], 0, "FORM"]; +_hqGuard5 = _groupPatrol createUnit [Blufor_Grenadier, _centerPos, [], 0, "FORM"]; _hqGuard5 setpos [(_centerPos select 0)+10, (_centerPos select 1)+10]; _groupPatrol setCombatMode "YELLOW"; @@ -38,12 +38,12 @@ _wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-10, (_centerPos select 1)+10], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; +_wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)-10, (_centerPos select 1)-10], 0]; _wp setWaypointType "MOVE"; _wp setWaypointBehaviour "SAFE"; -_wp setWaypointSpeed "LIMITED"; +_wp setWaypointSpeed "LIMITED"; _wp = _groupPatrol addWaypoint [[(_centerPos select 0)+10, (_centerPos select 1)-10], 0]; _wp setWaypointType "MOVE"; @@ -53,4 +53,4 @@ _wp setWaypointType "CYCLE"; _wp setWaypointBehaviour "SAFE"; _wp setWaypointSpeed "LIMITED"; -_fob addAction ["Replace Guards (15CP)", "initHQ\reguardFOB.sqf", [_groupGuard, _groupPatrol, _centerPos, _fob], 0, true, true, "", "_this == player"]; \ No newline at end of file +_fob addAction ["Replace Guards (15CP)", {_this call DUWS_fnc_reguardFOB}, [_groupGuard, _groupPatrol, _centerPos, _fob], 0, true, true, "", "_this == player"]; diff --git a/source/functions/missions/fn_sabotage_mission.sqf b/source/functions/missions/fn_sabotage_mission.sqf index a0ba5aa..9388abd 100644 --- a/source/functions/missions/fn_sabotage_mission.sqf +++ b/source/functions/missions/fn_sabotage_mission.sqf @@ -21,12 +21,12 @@ _markerstr2 setMarkerShape "ELLIPSE"; str(_markername2) setMarkerBrush "SolidBorder"; str(_markername2) setMarkerColor "ColorBrown"; str(_markername2) setMarkerSize [_radius, _radius]; -str(_markername2) setMarkerAlpha 0.3; +str(_markername2) setMarkerAlpha 0.3; -// create TOWER +// create TOWER _tower = createVehicle ["Land_dp_transformer_F", _MissionPos, [], 0, "NONE"]; _tower addEventHandler ["HandleDamage", {0}]; -_tower addaction ["Sabotage", {_this call duws_fnc_sabotage_success;},[_missionPos,_mission_name,_markername,_markername2]]; +_tower addaction ["Sabotage", duws_fnc_sabotage_success,[_missionPos,_mission_name,_markername,_markername2]]; // TASK AND NOTIFICATION _VARtaskgeneratedName = format["tsksabot%1%2",round(_MissionPos select 0),round(_Missionpos select 1)]; // generate variable name for task @@ -35,7 +35,7 @@ _VARtaskgeneratedName = format["tsksabot%1%2",round(_MissionPos select 0),round( //_taskhandle setSimpleTaskDescription ["The enemy is using a power supply somewhere in this area. We need you to find it and sabotage it. It will allow us to have a bit of better intel on our enemies.",_mission_name,""]; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername)); -[west, "_taskhandle", ["The enemy is using a power supply somewhere in this area. We need you to find it and sabotage it. It will allow us to have a bit of better intel on our enemies.", "Sabotage"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["The enemy is using a power supply somewhere in this area. We need you to find it and sabotage it. It will allow us to have a bit of better intel on our enemies.", "Sabotage"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { [] spawn duws_fnc_autoSave; @@ -51,4 +51,4 @@ sleep 1; [_randompos, _radius] call duws_fnc_createoppatrol; [_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target sleep 10; -[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target \ No newline at end of file +[_missionpos, 15] call duws_fnc_createoppatrol; // <-- around target diff --git a/source/functions/pFLIR/fn_livefeed.sqf b/source/functions/pFLIR/fn_livefeed.sqf index ff91042..8320922 100644 --- a/source/functions/pFLIR/fn_livefeed.sqf +++ b/source/functions/pFLIR/fn_livefeed.sqf @@ -1,4 +1,4 @@ -// pFLIRenable = player addaction ["Activate FLIR",{_this spawn duws_fnc_livefeed},"", 0,false,true,"","_target == _this"]; +// pFLIRenable = player addaction ["Activate FLIR",duws_fnc_livefeed,"", 0,false,true,"","_target == _this"]; // pflir aim trucPIPtarget = "Land_Sack_F" createVehicle ([0,0,0]); // PAS OUBLIER DE SUPPRIMER LE TRUC @@ -31,20 +31,20 @@ switch (_actualStance) do BIS_liveFeed attachTo [player,[0,1,0.85]]; trucPIPtarget attachTo [player,[0,2000,0.85]]; }; - + case "PRONE": { BIS_liveFeed attachTo [player,[0,1,0.25]]; trucPIPtarget attachTo [player,[0,2000,0.25]]; - }; + }; }; // add action to disable FLIR sleep 1; -pFLIRdisable = player addaction ["Deactivate FLIR",{_this spawn duws_fnc_livefeedexit},"", 0,false,true,"","_target == _this"]; -PlayerKilledEH2 = player addEventHandler ["killed", {[] spawn duws_fnc_livefeedexit}]; //removes screen from hud +pFLIRdisable = player addaction ["Deactivate FLIR",duws_fnc_livefeedexit,"", 0,false,true,"","_target == _this"]; +PlayerKilledEH2 = player addEventHandler ["killed", duws_fnc_livefeedexit]; //removes screen from hud @@ -65,12 +65,12 @@ if (!pFlirActivated) exitWith {}; BIS_liveFeed attachTo [player,[0,1,0.85]]; trucPIPtarget attachTo [player,[0,2000,0.85]]; }; - + case "PRONE": { BIS_liveFeed attachTo [player,[0,1,0.25]]; trucPIPtarget attachTo [player,[0,2000,0.25]]; - }; + }; }; -}; \ No newline at end of file +}; diff --git a/source/functions/pFLIR/fn_livefeed1.sqf b/source/functions/pFLIR/fn_livefeed1.sqf index 5daa5bd..7bb8375 100644 --- a/source/functions/pFLIR/fn_livefeed1.sqf +++ b/source/functions/pFLIR/fn_livefeed1.sqf @@ -1,4 +1,4 @@ -// pFLIRenable = player addaction ["Activate FLIR",{_this spawn duws_fnc_livefeed1},"", 0,false,true,"","_target == _this"]; +// pFLIRenable = player addaction ["Activate FLIR",duws_fnc_livefeed1,"", 0,false,true,"","_target == _this"]; // pflir aim trucPIPtarget = "Land_Sack_F" createVehicle ([0,0,0]); // PAS OUBLIER DE SUPPRIMER LE TRUC @@ -31,19 +31,19 @@ switch (_actualStance) do BIS_liveFeed attachTo [player,[0,1,0.85]]; trucPIPtarget attachTo [player,[0,2000,0.85]]; }; - + case "PRONE": { BIS_liveFeed attachTo [player,[0,1,0.25]]; trucPIPtarget attachTo [player,[0,2000,0.25]]; - }; + }; }; // add action to disable FLIR sleep 1; -pFLIRdisable = player addaction ["Deactivate FLIR",{_this spawn duws_fnc_livefeedexit},"", 0,false,true,"","_target == _this"]; +pFLIRdisable = player addaction ["Deactivate FLIR",duws_fnc_livefeedexit,"", 0,false,true,"","_target == _this"]; PlayerKilledEH2 = player addEventHandler ["killed", {[] spawn duws_fnc_livefeedexit}]; //removes screen from hud @@ -65,12 +65,12 @@ if (!pFlirActivated) exitWith {}; BIS_liveFeed attachTo [player,[0,1,0.85]]; trucPIPtarget attachTo [player,[0,2000,0.85]]; }; - + case "PRONE": { BIS_liveFeed attachTo [player,[0,1,0.25]]; trucPIPtarget attachTo [player,[0,2000,0.25]]; - }; + }; }; -}; \ No newline at end of file +}; diff --git a/source/functions/pFLIR/fn_livefeedexit.sqf b/source/functions/pFLIR/fn_livefeedexit.sqf index 7e4913f..d18df87 100644 --- a/source/functions/pFLIR/fn_livefeedexit.sqf +++ b/source/functions/pFLIR/fn_livefeedexit.sqf @@ -8,8 +8,8 @@ player removeEventHandler ["killed",PlayerKilledEH2]; sleep 2; -waitUntil {alive player}; -pFLIRenable = player addaction ["Enable FLIR",{_this spawn duws_fnc_livefeed},"", 0,false,true,"","_target == _this"]; //original last line in script +waitUntil {alive player}; +pFLIRenable = player addaction ["Enable FLIR",duws_fnc_livefeed,"", 0,false,true,"","_target == _this"]; //original last line in script -PlayerKilledEH3 = player addEventHandler ["respawn",{player addaction ["Enable FLIR",{_this spawn duws_fnc_livefeed},"", 0,false,true,"","_target == _this"]}]; +PlayerKilledEH3 = player addEventHandler ["respawn",{player addaction ["Enable FLIR",duws_fnc_livefeed,"", 0,false,true,"","_target == _this"]}]; diff --git a/source/functions/persistent/fn_experience_ability_fieldcomm.sqf b/source/functions/persistent/fn_experience_ability_fieldcomm.sqf index d0acafe..da792da 100644 --- a/source/functions/persistent/fn_experience_ability_fieldcomm.sqf +++ b/source/functions/persistent/fn_experience_ability_fieldcomm.sqf @@ -1,7 +1,6 @@ -player addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; - - - - - - \ No newline at end of file +player addaction ["Squad manager",duws_fnc_squadmng, "", 0, true, true, "", "_this == player"]; + + + + + diff --git a/source/functions/support/fn_fob.sqf b/source/functions/support/fn_fob.sqf index 7fdad3c..44bb7d1 100644 --- a/source/functions/support/fn_fob.sqf +++ b/source/functions/support/fn_fob.sqf @@ -75,7 +75,7 @@ _fob = "Land_Cargo_HQ_V1_F" createVehicle _foundPickupPos; _fob remoteExecCall ["DUWS_fnc_fob_addAction", 0, true]; // For fortifying -_fob addaction ["Fortify FOB(4CP)","_this spawn duws_fnc_fortifyFOB", [(getpos _fob), _fob], 0, true, true, "", "_this == player"]; +_fob addaction ["Fortify FOB(4CP)",duws_fnc_fortifyFOB, [(getpos _fob), _fob], 0, true, true, "", "_this == player"]; [_foundPickupPos, _size] call duws_fnc_createpatrol; [_foundPickupPos, _size] call duws_fnc_createpatrol; diff --git a/source/functions/support/fn_fob_addAction.sqf b/source/functions/support/fn_fob_addAction.sqf index ce309ae..df99896 100644 --- a/source/functions/support/fn_fob_addAction.sqf +++ b/source/functions/support/fn_fob_addAction.sqf @@ -1,12 +1,12 @@ -_this addaction ["Player stats",{_this spawn duws_fnc_info}, "", 0, true, true, "", "_this == player"]; -_this addaction ["Request ammobox drop(2CP)",{_this spawn duws_fnc_fob_ammobox}, "", 0, true, true, "", "_this == player"]; -_this addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; -_this addaction ["FOB manager",{_this spawn duws_fnc_fobmanageropen}, "", 0, true, true, "", "_this == player"]; +_this addaction ["Player stats",duws_fnc_info, "", 0, true, true, "", "_this == player"]; +_this addaction ["Request ammobox drop(2CP)",duws_fnc_fob_ammobox, "", 0, true, true, "", "_this == player"]; +_this addaction ["Squad manager",duws_fnc_squadmng, "", 0, true, true, "", "_this == player"]; +_this addaction ["FOB manager",duws_fnc_fobmanageropen, "", 0, true, true, "", "_this == player"]; if (support_armory_available) then { - _this addaction ["Armory (VA)","bisArsenal.sqf", "", 0, true, true, "", "_this == player"]; + _this addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; }; if (isServer) then { - _this addaction ["Rest (wait/save)",{[]spawn duws_fnc_savegame}, "", 0, true, true, "", "_this == player"]; + _this addaction ["Rest (wait/save)",duws_fnc_savegame, "", 0, true, true, "", "_this == player"]; } else { - _this addaction ["Rest",{[] spawn duws_fnc_savegameClient}, "", 0, true, true, "", "_this == player"]; + _this addaction ["Rest",duws_fnc_savegameClient, "", 0, true, true, "", "_this == player"]; }; diff --git a/source/functions/support/taxi/fn_boatTaxi.sqf b/source/functions/support/taxi/fn_boatTaxi.sqf index 55d583e..26c2d57 100644 --- a/source/functions/support/taxi/fn_boatTaxi.sqf +++ b/source/functions/support/taxi/fn_boatTaxi.sqf @@ -37,11 +37,11 @@ _spawnPos = [_posplayer, 400,500,10,2,5,0,[],[[0,0],[0,0]]] call BIS_fnc_findSaf // create the boat _helo = createVehicle [Blufor_Taxi_Boat, _spawnPos,[], 0, "FLY"]; -_helogroup = createGroup west; +_helogroup = createGroup west; _pilot = _helogroup createUnit [Blufor_diver, [5,5,5], [], 0, "NONE"]; -_helo addAction ["Tell the driver where to go", {_this spawn duws_fnc_mapclickboat}, "", 0, true, true, "", "vehicle _this == _target"]; -_pilot setcaptive true; +_helo addAction ["Tell the driver where to go", duws_fnc_mapclickboat, "", 0, true, true, "", "vehicle _this == _target"]; +_pilot setcaptive true; _pilot moveindriver _helo; @@ -61,7 +61,7 @@ hint format["%1 is too damaged to continue the mission",_fobname]; // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"boat_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // **************************************************** _inVehCheck = true; @@ -69,7 +69,7 @@ while {_inVehCheck} do { waitUntil {sleep 0.1;taxiCanTakeOff or (getdammage _helo > 0.7 or !alive _pilot)}; // wait until the player has given a validpos if (getdammage _helo > 0.7 or !alive _pilot) exitWith {}; // get out of the loop if choopa is down // check if player is inside choppa -if (vehicle player != _helo) then {taxiCanTakeOff = false; _pilot sidechat format["This is %1, get back in, I can't transport you're not inside the boat !",_fobname]; _helo addAction ["Give a location to the pilot", {_this spawn duws_fnc_mapclickboat}, "", 0, true, true, "", "vehicle _this == _target"];} else {_inVehCheck = false;}; +if (vehicle player != _helo) then {taxiCanTakeOff = false; _pilot sidechat format["This is %1, get back in, I can't transport you're not inside the boat !",_fobname]; _helo addAction ["Give a location to the pilot", duws_fnc_mapclickboat, "", 0, true, true, "", "vehicle _this == _target"];} else {_inVehCheck = false;}; }; // IF THE PILOT IS DEAD OR CHOPPA DOWN ************** @@ -80,7 +80,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; // --- AJOUTER DE NOUVEAU LE SUPPORT -}; +}; // ***************************** @@ -88,7 +88,7 @@ _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; playMusic [_music, 0]; _helo lock true; titleText ["Driver: Roger that, we're oscar mike...", "PLAIN DOWN"]; -str(_markerpickup) setMarkerPos ClickedTaxiPos; +str(_markerpickup) setMarkerPos ClickedTaxiPos; str(_markerpickup) setMarkerText "Drop point"; @@ -103,7 +103,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // ***************************** // TELEPORT BOAT NEAR DROP POINT @@ -130,7 +130,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // ***************************** @@ -144,7 +144,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // ***************************** titleText ["Driver: We've arrived at the drop point", "PLAIN DOWN"]; @@ -164,7 +164,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // ***************************** diff --git a/source/functions/support/taxi/fn_helotaxi.sqf b/source/functions/support/taxi/fn_helotaxi.sqf index e1b2307..78a26ce 100644 --- a/source/functions/support/taxi/fn_helotaxi.sqf +++ b/source/functions/support/taxi/fn_helotaxi.sqf @@ -36,24 +36,24 @@ str(_markerpickup) setMarkerText "LZ"; // create the chopper, gunners and pilots _helo = createVehicle [Blufor_Taxi_Helo, [_posplayer select 0, (_posplayer select 1)+2000, 200],[], 0, "FLY"]; -_helogroup = createGroup west; +_helogroup = createGroup west; _pilot = _helogroup createUnit [Blufor_Heli_Pilot, [5,5,5], [], 0, "NONE"]; _copilot = _helogroup createUnit [Blufor_Heli_Pilot, [5,5,5], [], 0, "NONE"]; _gunner1 = _helogroup createUnit [Blufor_Heli_Pilot, [5,5,5], [], 0, "NONE"]; _gunner2 = _helogroup createUnit [Blufor_Heli_Pilot, [5,5,5], [], 0, "NONE"]; _helo flyInHeight 100; -_helo addAction ["Give a LZ to the pilot", {_this spawn duws_fnc_mapclickhelo}, "", 0, true, true, "", "vehicle _this == _target"]; - -_pilot setcaptive true; - +_helo addAction ["Give a LZ to the pilot", duws_fnc_mapclickhelo, "", 0, true, true, "", "vehicle _this == _target"]; + +_pilot setcaptive true; + _pilot moveindriver _helo; -_copilot moveInTurret [_helo, [0]]; +_copilot moveInTurret [_helo, [0]]; _gunner1 moveInTurret [_helo, [1]]; _gunner2 moveInTurret [_helo, [2]]; // create the helipad to land and the waypoints -_helipad1 = createVehicle ["Land_HelipadEmpty_F", _foundPickupPos, [], 0, "NONE"]; +_helipad1 = createVehicle ["Land_HelipadEmpty_F", _foundPickupPos, [], 0, "NONE"]; _wp = _helogroup addWaypoint [[_foundPickupPos select 0, (_foundPickupPos select 1)-75], 0]; _wp setWaypointType "MOVE"; [_helogroup, 1] setWaypointCombatMode "BLUE"; @@ -68,7 +68,7 @@ _pilot sideChat format["This is %1 %2-%3, we're approaching your location for pi waitUntil {_foundpickuppos distance _helo < 350 or (vehicle _pilot == _pilot or !alive _pilot)}; // wait until the helo is near the lz -_pilot setcaptive false; +_pilot setcaptive false; // IF THE PILOT IS DEAD OR CHOPPA DOWN ****************** if (vehicle _pilot == _pilot or !alive _pilot) exitWith { deleteVehicle _helipad1; @@ -77,7 +77,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // **************************************************** // spawn smokeshell @@ -102,7 +102,7 @@ while {_inVehCheck} do { waitUntil {sleep 0.1;taxiCanTakeOff or (vehicle _pilot == _pilot or !alive _pilot)}; // wait until the player has given a validpos if (vehicle _pilot == _pilot or !alive _pilot) exitWith {}; // get out of the loop if choopa is down // check if player is inside choppa -if (vehicle player != _helo) then {taxiCanTakeOff = false; _pilot sidechat format["This is %1 %2-%3, get back in, I can't transport you're not inside the chopper !",_fobname,_random1,_random2]; _helo addAction ["Give a LZ to the pilot", {_this spawn duws_fnc_mapclickhelo}, "", 0, true, true, "", "vehicle _this == _target"];} else {_inVehCheck = false;}; +if (vehicle player != _helo) then {taxiCanTakeOff = false; _pilot sidechat format["This is %1 %2-%3, get back in, I can't transport you're not inside the chopper !",_fobname,_random1,_random2]; _helo addAction ["Give a LZ to the pilot", duws_fnc_mapclickhelo, "", 0, true, true, "", "vehicle _this == _target"];} else {_inVehCheck = false;}; }; // IF THE PILOT IS DEAD OR CHOPPA DOWN ************** @@ -113,7 +113,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; // --- AJOUTER DE NOUVEAU LE SUPPORT -}; +}; // ***************************** @@ -121,7 +121,7 @@ _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; playMusic [_music, 0]; //_helo lock true; titleText ["Pilot: Roger that, we're oscar mike...", "PLAIN DOWN"]; -str(_markerpickup) setMarkerPos ClickedTaxiPos; +str(_markerpickup) setMarkerPos ClickedTaxiPos; // create the helipad to land and the waypoints _helipad = createVehicle ["Land_HelipadEmpty_F", ClickedTaxiPos, [], 0, "NONE"]; @@ -150,7 +150,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // ***************************** if (enableChopperFastTravel) then { // TELEPORT HELO NEAR LZ @@ -172,7 +172,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // ***************************** _helo land "LAND"; @@ -196,7 +196,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // ***************************** titleText ["Pilot: We've arrived at the LZ", "PLAIN DOWN"]; _helo lock false; @@ -226,7 +226,7 @@ hint format["%1 %2-%2 is too damaged to continue the mission",_fobname,_random1, // --- AJOUTER DE NOUVEAU LE SUPPORT sleep 15; _art = [player,"helo_taxi"] call BIS_fnc_addCommMenuItem; -}; +}; // ***************************** _pilot sideChat format["This is %1 %2-%3, we are RTB",_fobname,_random1,_random2]; From 6cfa0070d1e5e2298e00728927533100724c118c Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 21:39:15 +0200 Subject: [PATCH 12/17] Replaced BIS_fnc_MP with remoteExec Security and performance reasons. --- .../functions/initZones/fn_locatorzonesV2.sqf | 23 +++++++++--------- .../functions/missions/fn_destroy_mission.sqf | 13 +++++----- .../functions/missions/fn_pilot_mission.sqf | 10 ++++---- .../functions/missions/fn_rescue_success.sqf | 8 +++--- .../missions/fn_sabotage_success.sqf | 8 +++--- .../functions/missions/fn_steal_mission.sqf | 16 ++++++------ .../functions/missions/fn_target_mission.sqf | 10 ++++---- .../missions/fn_underwater_success.sqf | 4 +-- source/functions/support/fn_ammobox.sqf | 9 ++++--- source/functions/support/fn_fob_ammobox.sqf | 5 +++- source/mission.sqm | Bin 20546 -> 20490 bytes 11 files changed, 57 insertions(+), 49 deletions(-) diff --git a/source/functions/initZones/fn_locatorzonesV2.sqf b/source/functions/initZones/fn_locatorzonesV2.sqf index 73218f7..a235cd6 100644 --- a/source/functions/initZones/fn_locatorzonesV2.sqf +++ b/source/functions/initZones/fn_locatorzonesV2.sqf @@ -1,16 +1,15 @@ params ["_radius","_diff"]; [["The zones are being generated
Please wait for mission initialization to complete..."]] spawn BIS_fnc_typeText; -[[{player globalChat "DO NOT USE ACTION MENU UNTIL MISSION INITIALIZATION IS COMPLETE"}],"BIS_fnc_Spawn",true,false] call BIS_fnc_MP; -[[{hint "DO NOT USE ACTION MENU UNTIL MISSION INITIALIZATION IS COMPLETE"}],"BIS_fnc_Spawn",true,false] call BIS_fnc_MP; - +"DO NOT USE ACTION MENU UNTIL MISSION INITIALIZATION IS COMPLETE" remoteExec ["systemChat"]; +"DO NOT USE ACTION MENU UNTIL MISSION INITIALIZATION IS COMPLETE" remoteExec ["hint"]; // ON WATER ? >> FLAT ? >> DISTANCE BETWEEN ZONES ? >> OK ! _worldName = getText(configFile >> "cfgWorlds" >> worldName >> "description"); _fortified = false; -openMap [true, true]; +openMap [true, true]; hint "Click somewhere on the island to place enemy zones"; _zones_array = [[-9999,-9999,-9999]]; for [{_i=1}, {_i<=zones_number}, {_i=_i+1}] do // BEGIN "FOR" LOOP -- @@ -21,13 +20,13 @@ for [{_i=1}, {_i<=zones_number}, {_i=_i+1}] do // BEGIN "FOR" LOOP -- _points_zone = 0; while {_zone_radius<=zones_min_radius} do { _random_zones_max_radius = random zones_max_radius; - _zone_radius = round _random_zones_max_radius; + _zone_radius = round _random_zones_max_radius; _points_zone = round (_zone_radius/10); }; - + while {!_found} do { clicked = false; - OnMapSingleClick "ClickedPos = _pos; clicked = true;"; + OnMapSingleClick "ClickedPos = _pos; clicked = true;"; _found_distance = false; _missionPos = []; @@ -51,7 +50,7 @@ for [{_i=1}, {_i<=zones_number}, {_i=_i+1}] do // BEGIN "FOR" LOOP -- _missionPos = [round(_missionPos select 0),round(_missionPos select 1)]; _generatezonescript = [format["Zone %1",_i],_points_zone,_zone_radius,_missionPos,_fortified,true] spawn duws_fnc_createzone; _found = true; - _zones_array = _zones_array + [_missionPos]; + _zones_array = _zones_array + [_missionPos]; player globalChat format["Zone location #%1 found !",_i]; player globalChat format["Generating zone #%1",_i]; @@ -60,14 +59,16 @@ for [{_i=1}, {_i<=zones_number}, {_i=_i+1}] do // BEGIN "FOR" LOOP -- }; }; -openMap [false, false]; - +openMap [false, false]; + //hintSilent format["All zones found\nWelcome to %1\nHave fun !\nDUWS by kibot",_worldName]; player globalChat format["All zones found. Welcome to %1, %2",_worldName,profileName]; //hint format["MISSION INITIALIZATION COMPLETE!\nCampaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]; +"MISSION INITIALIZATION COMPLETE!" remoteExec ["systemChat"]; [[{player globalChat "MISSION INITIALIZATION COMPLETE!"}],"BIS_fnc_Spawn",true,false] call BIS_fnc_MP; +(format["MISSION INITIALIZATION COMPLETE!\nCampaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]) remoteExec ["hint"]; [[{hint format["MISSION INITIALIZATION COMPLETE!\nCampaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]}],"BIS_fnc_Spawn",true,false] call BIS_fnc_MP; [] spawn { sleep 9; @@ -85,7 +86,7 @@ sleep 0.1; [] spawn duws_fnc_autoSave; sleep 1; -[[format["MISSION INITIALIZATION COMPLETE!
Campaign generated
Welcome to %1, %2",_worldName,profilename]]] spawn BIS_fnc_typeText; +[[format["MISSION INITIALIZATION COMPLETE!
Campaign generated
Welcome to %1, %2",_worldName,profilename]]] spawn BIS_fnc_typeText; playMusic ["EventTrack01a_F_EPA", 0]; if (debugmode) exitWith {}; diff --git a/source/functions/missions/fn_destroy_mission.sqf b/source/functions/missions/fn_destroy_mission.sqf index bd03436..0ce29e9 100644 --- a/source/functions/missions/fn_destroy_mission.sqf +++ b/source/functions/missions/fn_destroy_mission.sqf @@ -22,7 +22,7 @@ _markerstr2 setMarkerShape "ELLIPSE"; str(_markername2) setMarkerBrush "SolidBorder"; str(_markername2) setMarkerColor "ColorOPFOR"; str(_markername2) setMarkerSize [_radius, _radius]; -str(_markername2) setMarkerAlpha 0.3; +str(_markername2) setMarkerAlpha 0.3; // CREATE TOWER _tower = "Land_TTowerBig_1_F" createVehicle (_missionpos); @@ -36,7 +36,7 @@ _tower setVectorUp [0,0,1]; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername)); //NEW //test1 -[west, "_taskhandle", ["taskDestroy.", "We have detected a large amount of enemy trasmissions coming from this area. This is probably caused by a radio tower used by the enemy forces on the island. Destroy the tower. Be sure to take some satchels, which you can find in the armory. Armory can be unlocked at the HQ.", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["taskDestroy.", "We have detected a large amount of enemy trasmissions coming from this area. This is probably caused by a radio tower used by the enemy forces on the island. Destroy the tower. Be sure to take some satchels, which you can find in the armory. Armory can be unlocked at the HQ.", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { @@ -52,7 +52,7 @@ sleep 1; [_randompos, _radius] call duws_fnc_createopteam; // MISSION COMPLETED -- ATTENDRE QUE LA TOUR SOIT KO -waitUntil {sleep 1; !alive _tower}; +waitUntil {sleep 1; !alive _tower}; // remove markers deleteMarker str(_markername2); @@ -62,8 +62,9 @@ deleteMarker str(_markername); //player removeSimpleTask _taskhandle; //NEW -[["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; - +[["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; +["_taskhandle", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; + // Give cookies (bonus & notifications) reward = (30 * cp_reward_multiplier); ["TaskSucceeded",["",_mission_name]] call bis_fnc_showNotification; @@ -76,7 +77,7 @@ finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; -[] call operative_mission_complete; +[] call operative_mission_complete; // ADD PERSISTENT STAT _addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/functions/missions/fn_pilot_mission.sqf b/source/functions/missions/fn_pilot_mission.sqf index 212b68d..726b082 100644 --- a/source/functions/missions/fn_pilot_mission.sqf +++ b/source/functions/missions/fn_pilot_mission.sqf @@ -37,7 +37,7 @@ _choppa = Blufor_Helowreck createVehicle (_missionpos); _group = createGroup west; // CREATE PILOT _pilot = _group createUnit [Blufor_Heli_Pilot, [_missionpos select 0, (_missionpos select 1)+2], [], 0, "FORM"]; -_pilot setcaptive true; +_pilot setcaptive true; _pilot switchMove "acts_CrouchingIdleRifle01"; // TASK AND NOTIFICATION @@ -49,7 +49,7 @@ if (!ismultiplayer) then { [] spawn duws_fnc_autoSave; }; -[west, "_taskhandle", ["One of our AH-99 helicopters has been downed somewhere around this area. We have reports that the pilot is still alive. You must find him and bring him back to base.", "Downed Pilot", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["One of our AH-99 helicopters has been downed somewhere around this area. We have reports that the pilot is still alive. You must find him and bring him back to base.", "Downed Pilot", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; ["TaskAssigned",["",_mission_name]] call bis_fnc_showNotification; @@ -62,7 +62,7 @@ if (!(alive _pilot)) exitWith { deleteMarker str(_markername); //player removeSimpleTask _taskhandle; - [["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; + ["_taskhandle", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; ["TaskFailed",["","The pilot is dead"]] call bis_fnc_showNotification; }; @@ -81,7 +81,7 @@ if (!(alive _pilot)) exitWith { deleteMarker str(_markername); //player removeSimpleTask _taskhandle; - [["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; + ["_taskhandle", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; ["TaskFailed",["","The pilot is dead"]] call bis_fnc_showNotification; }; @@ -107,7 +107,7 @@ commandpointsblu1 = commandpointsblu1 + reward; publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; missions_success = missions_success + 1; -[] call operative_mission_complete; +[] call operative_mission_complete; // ADD PERSISTENT STAT _addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/functions/missions/fn_rescue_success.sqf b/source/functions/missions/fn_rescue_success.sqf index 7cd6fbb..5585487 100644 --- a/source/functions/missions/fn_rescue_success.sqf +++ b/source/functions/missions/fn_rescue_success.sqf @@ -9,7 +9,7 @@ _taskgeneratedName = format ["rescue%1%2",round(_MissionPos select 0),round(_Mis call compile format["_task = %1",_taskgeneratedname]; // recall variable and inject it into handle //player removeSimpleTask _task; -[["_task", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; +["_task", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; // IF SOLDIERS DEAD if (!(alive _sol1) && !(alive _sol2) && !(alive _sol3)) exitWith { @@ -24,7 +24,7 @@ _sol1 switchMove "AmovPpneMstpSnonWnonDnon"; _sol2 switchMove "AmovPpneMstpSnonWnonDnon"; _sol3 switchMove "AmovPpneMstpSnonWnonDnon"; [_sol1, _sol2, _sol3] joinSilent player; -titleText ["Thanks for the rescue, we'll be fighting with you from now on, lead the way!", "PLAIN DOWN"]; +titleText ["Thanks for the rescue, we'll be fighting with you from now on, lead the way!", "PLAIN DOWN"]; sleep 5; @@ -39,7 +39,7 @@ commandpointsblu1 = commandpointsblu1 + reward; WARCOM_blufor_ap = WARCOM_blufor_ap + 15; publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; -[] call operative_mission_complete; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] call duws_fnc_persistent_stats_missions_total; \ No newline at end of file +_addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/functions/missions/fn_sabotage_success.sqf b/source/functions/missions/fn_sabotage_success.sqf index e86050c..a28807a 100644 --- a/source/functions/missions/fn_sabotage_success.sqf +++ b/source/functions/missions/fn_sabotage_success.sqf @@ -3,7 +3,7 @@ _missionPos = _arguments select 0; _mission_name = _arguments select 1; _markername = _arguments select 2; _markername2 = _arguments select 3; - + _action = _this select 2; _object = _this select 0; @@ -17,7 +17,7 @@ call compile format["_taskhandle = %1",_VARtaskgeneratedName]; // recall variabl _object removeAction _action; //player removeSimpleTask _taskhandle; -[["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; +["_taskhandle", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; deleteMarker str(_markername2); deleteMarker str(_markername); @@ -33,7 +33,7 @@ publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; -[] call operative_mission_complete; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] call duws_fnc_persistent_stats_missions_total; \ No newline at end of file +_addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/functions/missions/fn_steal_mission.sqf b/source/functions/missions/fn_steal_mission.sqf index dc91f26..1ed35c5 100644 --- a/source/functions/missions/fn_steal_mission.sqf +++ b/source/functions/missions/fn_steal_mission.sqf @@ -24,7 +24,7 @@ _markerstr2 setMarkerShape "ELLIPSE"; str(_markername2) setMarkerBrush "SolidBorder"; str(_markername2) setMarkerColor "Color3_FD_F"; str(_markername2) setMarkerSize [_radius, _radius]; -str(_markername2) setMarkerAlpha 0.3; +str(_markername2) setMarkerAlpha 0.3; // CREATE TRUCK & CRATES _truck1 = Opfor_Truck_Open createVehicle (_missionpos); @@ -47,7 +47,7 @@ _box3 setdir 180; //_taskhandle = player createSimpleTask ["taskSteal"]; //_taskhandle setSimpleTaskDescription ["An enemy truck full of supplies has been spotted in the area. Find it and bring it back to the base in one piece.",_mission_name,""]; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername)); -[west, "_taskhandle", ["An enemy truck full of supplies has been spotted in the area. Find it and bring it back to the base in one piece.", "Grand Theft", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["An enemy truck full of supplies has been spotted in the area. Find it and bring it back to the base in one piece.", "Grand Theft", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { [] spawn duws_fnc_autoSave; @@ -62,20 +62,20 @@ sleep 1; [_randompos, _radius] call duws_fnc_createopteam; _group = createGroup east; -_unit = _group createUnit [Opfor_Squadleader, _missionpos, [], 0, "FORM"]; +_unit = _group createUnit [Opfor_Squadleader, _missionpos, [], 0, "FORM"]; _unit = _group createUnit [Opfor_Rifleman_AT, _missionpos, [], 0, "FORM"]; _unit = _group createUnit [Opfor_Rifleman, _missionpos, [], 0, "FORM"]; -// MISSION COMPLETED -- ATTENDRE QUE LE CAMION SOIT ARRIVE A LA BASE OU DETRUIT -waitUntil {sleep 2; ((getdammage _truck1)>0.95 OR (_truck1 distance _initpos)<50)}; +// MISSION COMPLETED -- ATTENDRE QUE LE CAMION SOIT ARRIVE A LA BASE OU DETRUIT +waitUntil {sleep 2; ((getdammage _truck1)>0.95 OR (_truck1 distance _initpos)<50)}; // remove markers deleteMarker str(_markername2); deleteMarker str(_markername); //player removeSimpleTask _taskhandle; -[["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; +["_taskhandle", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; if (getdammage _truck1>0.95) exitWith { ["TaskFailed",["","The enemy convoy is destroyed"]] call bis_fnc_showNotification; @@ -83,7 +83,7 @@ if (getdammage _truck1>0.95) exitWith { // IF THE MISSION IS COMPLETE hint "Unloading the truck..."; - + // Give cookies (bonus & notifications) reward = (25 * cp_reward_multiplier); ["TaskSucceeded",["",_mission_name]] call bis_fnc_showNotification; @@ -96,7 +96,7 @@ publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; -[] call operative_mission_complete; +[] call operative_mission_complete; // ADD PERSISTENT STAT _addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/functions/missions/fn_target_mission.sqf b/source/functions/missions/fn_target_mission.sqf index cb0f88d..0508204 100644 --- a/source/functions/missions/fn_target_mission.sqf +++ b/source/functions/missions/fn_target_mission.sqf @@ -33,7 +33,7 @@ sleep 1; Opfor_MRAP createVehicle ([(_missionpos select 0)+(random 10),(_missionpos select 1)+(random 10)]); _group = createGroup east; -_target = _group createUnit [Opfor_Officer, _missionpos, [], 0, "FORM"]; +_target = _group createUnit [Opfor_Officer, _missionpos, [], 0, "FORM"]; _unit = _group createUnit [Opfor_Rifleman, _missionpos, [], 0, "FORM"]; _unit = _group createUnit [Opfor_Rifleman, _missionpos, [], 0, "FORM"]; @@ -41,7 +41,7 @@ _unit = _group createUnit [Opfor_Rifleman, _missionpos, [], 0, "FORM"]; //_taskhandle = player createSimpleTask ["taskTarget"]; //_taskhandle setSimpleTaskDescription ["A high enemy target has been spotted somewhere in this location. Hunt him down.",_mission_name,""]; //_taskhandle setSimpleTaskDestination (getMarkerPos str(_markername)); -[west, "_taskhandle", ["A high ranking enemy target has been spotted somewhere in this location. Hunt him down.", "High Value Target", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; +[west, "_taskhandle", ["A high ranking enemy target has been spotted somewhere in this location. Hunt him down.", "High Value Target", "(getMarkerPos str(_markername)"], objNull, true] call BIS_fnc_taskCreate; if (!ismultiplayer) then { [] spawn duws_fnc_autoSave; @@ -56,7 +56,7 @@ deleteMarker str(_markername2); deleteMarker str(_markername); //player removeSimpleTask _taskhandle; -[["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; +["_taskhandle", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; sleep 1; @@ -72,7 +72,7 @@ publicVariable "commandpointsblu1"; publicVariable "WARCOM_blufor_ap"; finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; -[] call operative_mission_complete; +[] call operative_mission_complete; // ADD PERSISTENT STAT -_addmission = [] call duws_fnc_persistent_stats_missions_total; \ No newline at end of file +_addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/functions/missions/fn_underwater_success.sqf b/source/functions/missions/fn_underwater_success.sqf index f525c1f..22c14c4 100644 --- a/source/functions/missions/fn_underwater_success.sqf +++ b/source/functions/missions/fn_underwater_success.sqf @@ -20,7 +20,7 @@ call compile format["_taskhandle = %1",_VARtaskgeneratedName]; _object removeAction _action; //player removeSimpleTask _taskhandle; -[["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; +["_taskhandle", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; deleteMarker str(_markername2); deleteMarker str(_markername); @@ -38,4 +38,4 @@ finishedMissionsNumber = finishedMissionsNumber + 1; publicVariable "finishedMissionsNumber"; // ADD PERSISTENT STAT -_addmission = [] call duws_fnc_persistent_stats_missions_total; \ No newline at end of file +_addmission = [] call duws_fnc_persistent_stats_missions_total; diff --git a/source/functions/support/fn_ammobox.sqf b/source/functions/support/fn_ammobox.sqf index b7c8589..b4adf4f 100644 --- a/source/functions/support/fn_ammobox.sqf +++ b/source/functions/support/fn_ammobox.sqf @@ -3,7 +3,7 @@ Author: Kibot - Description: + Description: Air-deploys a NATO ammobox with a parachute at a assigned location. Parameter(s): @@ -12,7 +12,7 @@ Usage: _scriptHandle = [player] execVM 'ammobox.sqf'; - Returns: + Returns: - Nil - */ @@ -41,7 +41,10 @@ _ammo attachTo [_parachute,[0,0,0]]; _ammo addBackpackCargo ["B_AssaultPack_khk",10]; -if (support_armory_available) then {[[_ammo,["Armory",{[] call duws_fnc_bisArsenal},[], 0, false, false, "", "_this distance _target < 4"]],"addAction",true,true] call BIS_fnc_MP;}; +if (support_armory_available) then +{ + [_ammo,["Armory",{[] call duws_fnc_bisArsenal},[], 0, false, false, "", "_this distance _target < 4"]] remoteExecCall ["addAction", 0, true]; +}; waitUntil {sleep 1; getpos _ammo select 2<0.2}; _smoke = "SmokeShellGreen" CreateVehicle (getpos _ammo); diff --git a/source/functions/support/fn_fob_ammobox.sqf b/source/functions/support/fn_fob_ammobox.sqf index 8c805a4..2c3f276 100644 --- a/source/functions/support/fn_fob_ammobox.sqf +++ b/source/functions/support/fn_fob_ammobox.sqf @@ -39,7 +39,10 @@ _ammo attachTo [_parachute,[0,0,0]]; _ammo addItemCargo _x; } forEach Blufor_Ammobox_Contents; -if (support_armory_available) then {[[_ammo,["Armory",{[] call duws_fnc_bisArsenal},[], 0, false, false, "", "_this distance _target < 4"]],"addAction",true,true] call BIS_fnc_MP;}; +if (support_armory_available) then +{ + [_ammo,["Armory",{[] call duws_fnc_bisArsenal},[], 0, false, false, "", "_this distance _target < 4"]] remoteExecCall ["addAction", 0, true]; +}; waitUntil {sleep 1; getpos _ammo select 2<0.2}; _smoke = "SmokeShellGreen" CreateVehicle (getpos _ammo); diff --git a/source/mission.sqm b/source/mission.sqm index 3ffe2302b1f7209d70273f7b83d6712e01a35ba4..51526affbe93683a44c4b557138eda1783cd82a5 100644 GIT binary patch delta 4507 zcmai2YiwLc6+ZXI>)46X#PK67!Rtq_?fShB+q+#m*fhtg@ia1OIRo&q(KT+sSu$K0a|DUN~OSe#xu^n zq7{}_GvAqW&YW+~nRD;;rL)HLSz`l@_xBS1((p@tVZ*)5$u7)#CKBVLeM2L3xf|l7 z+xYWZV=|eVe%J7(xUt@r7(7r%GkO}Jn-xkLq=9-heU#?fh$fTX_5VpRQj*?Hkqu^w zTigj*;zz~lU9IDz6Ju?${4adzQ2+46;1^-GnRKtj#o1#74Je>=ZTbQe#Fu;SQKHZZT6|p7AjU8cig|hxSh-2IJ%w z*W6Xz7GjohryAxE2*t?-HOb9Gu{<^P(sF^C`e@WrQ$MAZsA&yNml9m|nfW4PTczmC@3UA)Ywic*p{p!e4bDsZ3&aPmEOWU)}RTiFK=#KbVSCE|MpI+BF)@rK6A$8Xt(v2vjM zPELlg^;~KuM{umgG82X3ob{P?=L?}^4n0Mi#MMn%VrOBAEAL^VQE{v=V4g1&p2l2p zy>OSsLMOpKme>fs_pl^5YDt3Uu=*ZrsNm)_R>55ZwiEPtnIL>HK@3c=3Tct4Q9ib7 ztbFVR)&%c7_O&p!W`Y=);71k{G%CfLR@n7M5$?jNqJUXhgq&>=y+z{|%bb+nXNir{ z@nT6St%NBRgo=rd!=*W^%6mDp&Z2k$XDeQRna2Q)L z1q@8#TO~3_3#dt%qs=l$-+Ax>@k~jMEA$A_w0Nl`U@nx%Jbh5I(_*2M)Hq9Qq}G&5 zQq!eOs_;#$u0f$|Qi~d^0RQ%gxERSYVZ^L3Fsn8g@a@n>k87-qCV(}o*IJKq-+}!PykH2cHe57MdQ<@!nI_$1sN)JgB;+8|^{X_Op zr-)W$n>Q=|e_Q;nZdYpKS2R`|zr`D?w%9n{e`plVO$LsEn_x$!{bb@aE4-CeJ+Fpn zrDK0m6Z|%taIg1L$fKq{TJou>pAOclX$=`cqS=t>&9lt%D%k}G#K)B}*X=5zkcd?U z%z-M|1z)Y&W3kYgx58>jY{i$Xmcp zDl%qel8*Q#RwhNjI!z}pO@y%#R~`ngyth2^KHXy_?s+-l52ab+^BXsd%bpz9H@!ql z;vG-GyysC(B1bfPpR{M6T^T4 z^u7!wnF3{WUSnmn0BmQrB;NI9nb?tuec3Os)EN=h^K`F^{Qa&OY zD&(3FbvG=-?fsLM=aJxTyu3$6&ZB_(^I#~>#KF2vv|SDYndfBUWWsc zml2e_`~jlF_-S5E8mpKFfgQZ+m=}C7FAU7C_At^#jkH5Zp&$8$?# z6;B%09GqmXaz#NX%Y-MUGys)Zn~S){%Ed``p(t?+#Ll2pElr3UjI#nCPL>od)PdQOKiAg1dpHechHQ`=4-?hp(0 zl|6TNkbGICPwIl7ZGg>67o6X&rao$qs;QqAo7A+1`dWzKle^$t19w4lxj~$2h`Qq2 zh~~xb8UifH*fwRcz?runvSc+jFEwnJd7IxZYw;tjHt_a}tP69A71NK>p%TZBV{FZ}h=FUdBP?t2gs2EdU3bGo?P5F}Fi(W#<9H#w z$6}$AlP}`rG#`=;0RXdSwqG1oW?pHaUqgz!iG6uU=HaxcX{^8<{^!hO)aqI zz%NSJ3LK1faWGnBUWrNyX(Aa7yN)yxEsB3d14f#tZj4)uozcI}5?e-^n`HEhO)~m> zSZ(Iit4JQeTw)c8M?{;lP1tbs7&!VF=*V(WHZN(cY<>)^qvxxGtvCZ1I0L(5GW_R7 zZLG<)wwb6;JRJ*|&&Om2uEq9REOc@Rv&6>XO0(q9*CMOx8(6)<8Y-UC8moAI0&K6U zmA7yBU``mAQx0mL>t6dP)>!#y1lF9^-8d1()|`<(akQn#{9}uxv{hVeX-=JOmA7Yo zYn{2Zb+vPkweGce#mVdUEV1!AutV~~<>Mz(F)s80{B%rp8mpN00NZ(aecZX>gLz?K zUPj0_Abv+&ekTBEZtP&Ux;8?>C>fUVq+7rqO5@;cpH88;&P`mNwIg-uChM=M>y**>Gcr*0aK;ID24mO~< zOd`FpMZM8@l&%;F0loY>Z0On^|Q^eqbz>s7rMjzWdpLIeoO0D_uVwa-^_%E#_;aLykuJ0cIE3Lc)2?XbEQ?IuXh1Vg*)F)2Rt}9R}IT^~^xq0!>Q!hthfZSx01*qXV} zFxPX1%ys*FY-A7gQmVSNE?u3t>rORVxWUu5iRh%7EDYN373$>uvG4(h2i=fIcq9Qb zrAR}bEYgs_z-$VRx`F(i(GuVd=tM}LP9A(PBpQZ%2tE>6_h5r#EY+k`m4IHO!u73wh{6 zMoT=;KqoSJD>!lR!AxkF>94RU;Q}Z={$sTG$iSRodU51X2wQ{6tCtX$9I|gdbT92< zb9-nt4P)@D%hDIAoIiv!U7RJhpBgQ(UFFTBayE@d_YZUZV>UEgC;LjVcS0z$YJF*0 z(#2Xro!52pRW?|ulRLc9_0x5~bOSV5DcuUntR|XO$4d+B)-qiu534Js5l>P%>b%-i z7PJnlJ!MZitlc?m;E~lRd^A_CbGXB+bNCcy=h#9RPZ}+ZGth>S>!dfpIfM`9M8i2; zkJxqm;-kQ5@ezhLIh=ZZJcOWpa#jT*6G=f*%NFbG4&WNF-<@x zrpH^w=MFxY3k`F902{s*#>YoSi;p#!Gh9SRLfD$Q&@k5v)tc+FYOD@CL4XNB_>Dxy=J|QHOzsAIS#{S zHet<_(X!@cXv4uZ5Lh7xAS`UMj8o1CP zT|dRc(hbmJvvezHVk^M`5G|;)^+6s;$thLoTe=+{ zbf@oK9$5{@NBbId`W71WvCKvY`#22YEjL;hXzB^h*bPFbx`}2_O?X8{(tcXz|elZD{z-3S09fL&KMBIjnK~ z>gjOEbEXL|u}u8p5NntL4Kw@*M*0}ZqBo6}Mf1>xfiKu1mVp5cGaQL%h70PBNVCV+LNuWshy?8m z5zX*YWS7H(ZiWFKNnluR(RrEJs`E09*=4qnc-}Bt;`tCdF)u4`^6crNTq+hl2wNmq2tL&CmseU64kGi3f+T2jj zwrMCV<;vHE*=N~8p!OIo0UcGLw)HmFFa#Qg_&sd&g_bo7M$4MDxaw55xypB~{R@3>J_Bd`CEW0wH(Fx*4R0oIf05WAzFA`=Y|p?=+d z%yWJlzQwEVZP~lHN1mH!!b^AFgOP+YGV9WQdbA^PK0sf>uM2LvTVXKMseB#T>Yv-1 z>-NKeb|O#nNuwp=m!VC>`O)6T28KF@`}$(NSfrDJhFzV$r^R24z4iX$s@7<6wFBBD z20_4<6JtH9ydBZ!(h9W@#O9JO{Q!5cxSn_rlE@?C;A_M C#Iz&; From 7e437984560f7fe86ba9ae7cbb712f5182aa1b98 Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 22:58:17 +0200 Subject: [PATCH 13/17] Replaced BIS_fnc_MP with remoteExec Missed a few. Also removed some duplicate spawn scopes --- source/functions/initZones/fn_locatorzonesV2.sqf | 4 +--- source/functions/missions/fn_destroy_mission.sqf | 1 - source/functions/missions/fn_sabotage_mission.sqf | 2 +- source/functions/support/fn_FOBactions.sqf | 12 ++++++------ 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/source/functions/initZones/fn_locatorzonesV2.sqf b/source/functions/initZones/fn_locatorzonesV2.sqf index a235cd6..dcdeba5 100644 --- a/source/functions/initZones/fn_locatorzonesV2.sqf +++ b/source/functions/initZones/fn_locatorzonesV2.sqf @@ -67,9 +67,7 @@ player globalChat format["All zones found. Welcome to %1, %2",_worldName,profile //hint format["MISSION INITIALIZATION COMPLETE!\nCampaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]; "MISSION INITIALIZATION COMPLETE!" remoteExec ["systemChat"]; -[[{player globalChat "MISSION INITIALIZATION COMPLETE!"}],"BIS_fnc_Spawn",true,false] call BIS_fnc_MP; -(format["MISSION INITIALIZATION COMPLETE!\nCampaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]) remoteExec ["hint"]; -[[{hint format["MISSION INITIALIZATION COMPLETE!\nCampaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]}],"BIS_fnc_Spawn",true,false] call BIS_fnc_MP; +(format["MISSION INITIALIZATION COMPLETE!\nCampaign generated\nzones: %1\nmaximum radius: %2m\nminimum radius: %3m\nmax. distance from HQ: %4m\n\nIf you experience performance issues, restart the mission and try reducing the amount of zones/and or their radius",zones_number,zones_max_radius,zones_min_radius,zones_max_dist_from_hq]) remoteExecCall ["hint"]; [] spawn { sleep 9; [] call duws_fnc_bottom_right_message; diff --git a/source/functions/missions/fn_destroy_mission.sqf b/source/functions/missions/fn_destroy_mission.sqf index 0ce29e9..dbc5fbc 100644 --- a/source/functions/missions/fn_destroy_mission.sqf +++ b/source/functions/missions/fn_destroy_mission.sqf @@ -62,7 +62,6 @@ deleteMarker str(_markername); //player removeSimpleTask _taskhandle; //NEW -[["_taskhandle", "WEST"],"BIS_fnc_deleteTask", true, true] call BIS_fnc_MP; ["_taskhandle", "WEST"] remoteExecCall ["BIS_fnc_deleteTask", 0, true]; // Give cookies (bonus & notifications) diff --git a/source/functions/missions/fn_sabotage_mission.sqf b/source/functions/missions/fn_sabotage_mission.sqf index 9388abd..03ba7fc 100644 --- a/source/functions/missions/fn_sabotage_mission.sqf +++ b/source/functions/missions/fn_sabotage_mission.sqf @@ -26,7 +26,7 @@ str(_markername2) setMarkerAlpha 0.3; // create TOWER _tower = createVehicle ["Land_dp_transformer_F", _MissionPos, [], 0, "NONE"]; _tower addEventHandler ["HandleDamage", {0}]; -_tower addaction ["Sabotage", duws_fnc_sabotage_success,[_missionPos,_mission_name,_markername,_markername2]]; +_tower addaction ["Sabotage", {_this call duws_fnc_sabotage_success;},[_missionPos,_mission_name,_markername,_markername2]]; // TASK AND NOTIFICATION _VARtaskgeneratedName = format["tsksabot%1%2",round(_MissionPos select 0),round(_Missionpos select 1)]; // generate variable name for task diff --git a/source/functions/support/fn_FOBactions.sqf b/source/functions/support/fn_FOBactions.sqf index c681799..10bf546 100644 --- a/source/functions/support/fn_FOBactions.sqf +++ b/source/functions/support/fn_FOBactions.sqf @@ -1,17 +1,17 @@ params ["_fob"]; -_fob addaction ["Player stats",{_this spawn duws_fnc_info}, "", 0, true, true, "", "_this == player"]; -_fob addaction ["Request ammobox drop(2CP)",{_this spawn duws_fnc_fob_ammobox}, "", 0, true, true, "", "_this == player"]; +_fob addaction ["Player stats",duws_fnc_info, "", 0, true, true, "", "_this == player"]; +_fob addaction ["Request ammobox drop(2CP)",duws_fnc_fob_ammobox, "", 0, true, true, "", "_this == player"]; if (support_armory_available) then { _fob addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; }; -_fob addaction ["Squad manager",{_this spawn duws_fnc_squadmng}, "", 0, true, true, "", "_this == player"]; -_fob addaction ["FOB manager",{_this spawn duws_fnc_fobmanageropen}, "", 0, true, true, "", "_this == player"]; +_fob addaction ["Squad manager",duws_fnc_squadmng, "", 0, true, true, "", "_this == player"]; +_fob addaction ["FOB manager",duws_fnc_fobmanageropen, "", 0, true, true, "", "_this == player"]; if (isServer) then { - _fob addaction ["Rest (wait/save)",{[]spawn duws_fnc_savegame}, "", 0, true, true, "", "_this == player"]; + _fob addaction ["Rest (wait/save)",duws_fnc_savegame, "", 0, true, true, "", "_this == player"]; } else { - _fob addaction ["Rest", {[] spawn duws_fnc_savegameClient}, "", 0, true, true, "", "_this == player"]; + _fob addaction ["Rest", duws_fnc_savegameClient, "", 0, true, true, "", "_this == player"]; }; From 4f2352ef09f1ba0e159941be8a6e444ade37655f Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Mon, 10 Jun 2019 23:15:39 +0200 Subject: [PATCH 14/17] Removed cleanup script Replaced by the vanilla implementation. --- .../generic/fn_repetitive_cleanup.sqf | 157 ------------------ source/functions/initHQ/fn_HQaddactions.sqf | 2 +- .../functions/initMission/fn_clientInit.sqf | 62 +++---- .../functions/initMission/fn_serverInit.sqf | 63 +++---- source/includes/CfgFunctions.hpp | 2 - source/mission.sqm | Bin 20490 -> 20702 bytes 6 files changed, 51 insertions(+), 235 deletions(-) delete mode 100644 source/functions/generic/fn_repetitive_cleanup.sqf diff --git a/source/functions/generic/fn_repetitive_cleanup.sqf b/source/functions/generic/fn_repetitive_cleanup.sqf deleted file mode 100644 index a069502..0000000 --- a/source/functions/generic/fn_repetitive_cleanup.sqf +++ /dev/null @@ -1,157 +0,0 @@ -/* - NAME: repetitive_cleanup.sqf - VERSION: 1.9 - - DESCRIPTION: - Can delete everything that is not really needed - dead bodies, dropped items, smokes, chemlights, explosives, empty groups - Works even on Altis, it eats only items which are/were 100m from all units - - USAGE: - in server's init - [ - 60, // seconds to delete dead bodies (0 means don't delete) - 5*60, // seconds to delete dead vehicles (0 means don't delete) - 3*60, // seconds to delete immobile vehicles (0 means don't delete) - 2*60, // seconds to delete dropped weapons (0 means don't delete) - 10*60, // seconds to deleted planted explosives (0 means don't delete) - 0 // seconds to delete dropped smokes/chemlights (0 means don't delete) - ] execVM 'repetitive_cleanup.sqf'; - - //NOTE! This has been turned into a function. Use spawn duws_fnc_repetitive_cleanup - - will delete dead bodies after 60 seconds (1 minute) - will delete dead vehicles after 5*60 seconds (5 minutes) - will delete immobile vehicles after 3*60 seconds (3 minutes) - will delete weapons after 2*60 seconds (2 minutes) - will delete planted explosives after 10*60 seconds (10 minutes) - will not delete any smokes/chemlights since its disabled (set to 0) - - If you want something to withstand the clean up, paste this into it's init: - this setVariable["persistent",true]; -*/ - -if (!isServer) exitWith {}; // isn't server - -#define PUSH(A,B) A set [count (A),B]; -#define REM(A,B) A=A-[B]; - -private ["_ttdBodies","_ttdVehiclesDead","_ttdVehiclesImmobile","_ttdWeapons","_ttdPlanted","_ttdSmokes","_addToCleanup","_unit","_objectsToCleanup","_timesWhenToCleanup","_removeFromCleanup"]; - -_ttdBodies=[_this,0,0,[0]] call BIS_fnc_param; -_ttdVehiclesDead=[_this,1,0,[0]] call BIS_fnc_param; -_ttdVehiclesImmobile=[_this,2,0,[0]] call BIS_fnc_param; -_ttdWeapons=[_this,3,0,[0]] call BIS_fnc_param; -_ttdPlanted=[_this,4,0,[0]] call BIS_fnc_param; -_ttdSmokes=[_this,5,0,[0]] call BIS_fnc_param; - -if({_x>0}count _this==0) exitWith {}; // all times are 0, we do not want to run this script at all - -_objectsToCleanup=[]; -_timesWhenToCleanup=[]; - -_addToCleanup = { - _object = _this select 0; - if(!(_object getVariable["persistent",false])) then { - _newTime = (_this select 1)+time; - _index = _objectsToCleanup find _object; - if(_index == -1) then { - PUSH(_objectsToCleanup,_object) - PUSH(_timesWhenToCleanup,_newTime) - } else { - _currentTime = _timesWhenToCleanup select _index; - if(_currentTime>_newTime) then { - _timesWhenToCleanup set[_index, _newTime]; - }; - }; - }; -}; - -_removeFromCleanup = { - _object = _this select 0; - _index = _objectsToCleanup find _object; - if(_index != -1) then { - _objectsToCleanup set[_index, 0]; - _timesWhenToCleanup set[_index, 0]; - }; -}; - -while{true} do { - sleep 10; - { - _unit = _x; - if (_ttdWeapons>0) then { - { - { - [_x, _ttdWeapons] call _addToCleanup; - } forEach (getpos _unit nearObjects [_x, 100]); - } forEach ["WeaponHolder","GroundWeaponHolder","WeaponHolderSimulated"]; - }; - - if (_ttdPlanted>0) then { - { - { - [_x, _ttdPlanted] call _addToCleanup; - } forEach (getpos _unit nearObjects [_x, 100]); - } forEach ["TimeBombCore"]; - }; - - if (_ttdSmokes>0) then { - { - { - [_x, _ttdSmokes] call _addToCleanup; - } forEach (getpos _unit nearObjects [_x, 100]); - } forEach ["SmokeShell"]; - }; - - } forEach allUnits; - - { - if ((count units _x)==0) then { - deleteGroup _x; - }; - } forEach allGroups; - - if (_ttdBodies>0) then { - { - [_x, _ttdBodies] call _addToCleanup; - } forEach allDeadMen; - }; - - if (_ttdVehiclesDead>0) then { - { - if(_x == vehicle _x) then { // make sure its vehicle - [_x, _ttdVehiclesDead] call _addToCleanup; - }; - } forEach (allDead - allDeadMen); // all dead without dead men == mostly dead vehicles - }; - - if (_ttdVehiclesImmobile>0) then { - { - if(!canMove _x && {alive _x}count crew _x==0) then { - [_x, _ttdVehiclesImmobile] call _addToCleanup; - } else { - [_x] call _removeFromCleanup; - }; - } forEach vehicles; - }; - - REM(_objectsToCleanup,0) - REM(_timesWhenToCleanup,0) - - { - if(isNull(_x)) then { - _objectsToCleanup set[_forEachIndex, 0]; - _timesWhenToCleanup set[_forEachIndex, 0]; - } else { - if(_timesWhenToCleanup select _forEachIndex < time) then { - deleteVehicle _x; - _objectsToCleanup set[_forEachIndex, 0]; - _timesWhenToCleanup set[_forEachIndex, 0]; - }; - }; - } forEach _objectsToCleanup; - - REM(_objectsToCleanup,0) - REM(_timesWhenToCleanup,0) -}; \ No newline at end of file diff --git a/source/functions/initHQ/fn_HQaddactions.sqf b/source/functions/initHQ/fn_HQaddactions.sqf index 349d956..783a826 100644 --- a/source/functions/initHQ/fn_HQaddactions.sqf +++ b/source/functions/initHQ/fn_HQaddactions.sqf @@ -9,7 +9,7 @@ if (isServer) then { }; if (!isServer) then { - _hq addaction ["Rest",{[] spawn duws_fnc_savegameClient}, "", 0, true, true, "", "_this == player"]; + _hq addaction ["Rest",duws_fnc_savegameClient, "", 0, true, true, "", "_this == player"]; }; _hq addaction ["RESET SQUAD LEADER",{[] call duws_fnc_groupReset}, "", 0, true, true, "", "_this == player"]; diff --git a/source/functions/initMission/fn_clientInit.sqf b/source/functions/initMission/fn_clientInit.sqf index 911433e..49a1723 100644 --- a/source/functions/initMission/fn_clientInit.sqf +++ b/source/functions/initMission/fn_clientInit.sqf @@ -11,7 +11,7 @@ player allowDamage false; #include "..\..\includes\supports_init.hpp" #include "..\..\includes\squad_number_init.hpp" - + if (hasInterface) then {[] spawn duws_fnc_gps_marker;}; if (!isMultiplayer) then { getsize_script = [player] spawn duws_fnc_mapsize; @@ -42,12 +42,12 @@ if (isMultiplayer) then { _x addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; } forEach (Array_of_FOBS); }; - + PlayerKilledEH = player addEventHandler ["killed", { commandpointsblu1 = commandpointsblu1 - DUWSMP_CP_death_cost; publicVariable "commandpointsblu1"; }]; - + PlayerBetrayerEH = player addEventHandler ["HandleRating", { // If playerRating is negative (traitor) then reset to zero _playerRating = rating (_this select 0); @@ -56,9 +56,9 @@ if (isMultiplayer) then { }; // If final rating is positive, do not modify, else zero. _rating = _this select 1; - [0,_rating] select ((_playerRating - _rating) > 0); + [0,_rating] select ((_playerRating - _rating) > 0); }]; - + "support_specialized_training_available" addPublicVariableEventHandler {lbSetColor [2103, 11, [0, 1, 0, 1]];}; "support_armory_available" addPublicVariableEventHandler { hq_blu1 addaction ["Armory (VA)",{[] call duws_fnc_bisArsenal}, "", 0, true, true, "", "_this == player"]; @@ -81,23 +81,23 @@ if (isMultiplayer) then { _fobAmount = count Array_of_FOBS; _fobIndex = _fobAmount - 1; _createdFOB = Array_of_FOBS select _fobIndex; - + [missionNamespace, _createdFOB] call BIS_fnc_addRespawnPosition; }; - + if (!isServer) then { "savegameNumber" addPublicVariableEventHandler {[] spawn duws_fnc_savegameClient}; }; if (!isServer) then { - "capturedZonesNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_zones_add;}; // change the shown CP for request dialog + "capturedZonesNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_zones_add;}; // change the shown CP for request dialog }; if (!isServer) then { - "finishedMissionsNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_missions_total;}; // change the shown CP for request dialog - }; - + "finishedMissionsNumber" addPublicVariableEventHandler {[] call duws_fnc_persistent_stats_missions_total;}; // change the shown CP for request dialog + }; + player globalChat format ["gamemaster: %1", game_master]; player globalChat format ["HQ_pos_found_generated: %1", HQ_pos_found_generated]; - + if (!isDedicated && !HQ_pos_found_generated) then { // SERVER INIT if (((vehiclevarname player) in game_master)) then { DUWS_host_start = false; @@ -117,18 +117,18 @@ if (isMultiplayer) then { if (!isDedicated && !HQ_pos_found_generated) then { if (((vehiclevarname player) in game_master)) then { [] spawn duws_fnc_placement; - waitUntil {chosen_hq_placement}; + waitUntil {chosen_hq_placement}; player globalChat format ["hq_manually_placed: %1", hq_manually_placed]; player globalChat format ["player_is_choosing_hqpos: %1", player_is_choosing_hqpos]; // create random HQ if (!hq_manually_placed && !player_is_choosing_hqpos) then { player globalChat "lance recherche position..."; hq_create = [20, 0.015] spawn duws_fnc_locatorhq; - waitUntil {scriptDone hq_create}; + waitUntil {scriptDone hq_create}; }; }; }; - + /* //////// DEBUG LOOP ///////////// [] spawn { @@ -143,37 +143,25 @@ if (!isDedicated && !HQ_pos_found_generated) then { // AMBIANCE LOOP //_nul = [] execVM "musicloop.sqf"; -if (isServer) then { - // group cleaning script - clean = [ - 5*60, // seconds to delete dead bodies (0 means don't delete) - 5*60, // seconds to delete dead vehicles (0 means don't delete) - 0, // seconds to delete immobile vehicles (0 means don't delete) - 5*60, // seconds to delete dropped weapons (0 means don't delete) - 0, // seconds to deleted planted explosives (0 means don't delete) - 10*60 // seconds to delete dropped smokes/chemlights (0 means don't delete) - ] spawn duws_fnc_repetitive_cleanup; -}; - -if (hasInterface) then { +if (hasInterface) then { // WHEN CLIENT CONNECTS INIT (might need sleep) waitUntil {isPlayer Player}; - hintsilent "Waiting for the host to find an HQ..."; + hintsilent "Waiting for the host to find an HQ..."; waitUntil {HQ_pos_found_generated && time > 0.1}; player setpos [(getpos hq_blu1 select 0),(getpos hq_blu1 select 1)+10]; _drawicon = [] spawn duws_fnc_drawIcon; - hintsilent "Waiting for the host to select the campaign parameters..."; - waitUntil {chosen_settings}; + hintsilent "Waiting for the host to select the campaign parameters..."; + waitUntil {chosen_settings}; [hq_blu1] call duws_fnc_HQaddactions; sleep 1; - player setdamage 0; + player setdamage 0; player allowDamage true; hintsilent format["Joined game, welcome to %1, %2",worldName,profileName]; // init High Command [] call duws_fnc_hc_init; [] spawn duws_fnc_weather_client; - + // process purchasable units [] call duws_fnc_processUnitConfig; [] call duws_fnc_processVehicleConfig; @@ -189,7 +177,7 @@ if (!isMultiplayer) then { }; // Create help for DUWS -_index = player createDiarySubject ["help","DUWS-R Manual"]; +_index = player createDiarySubject ["help","DUWS-R Manual"]; player createDiaryRecord ["help", ["Feedback/bug report", "Internal team members: Use the ""issues"" section to report items."]]; player createDiaryRecord ["help", ["Export to another island", "How to export to another island:
You just need to take the .pbo file and rename it with the name of the island you want to export the mission to. You don't have anything else to do

Example:
SP_DUWS-R.stratis.pbo >>> SP_DUWS-R.chernarus.pbo"]]; player createDiaryRecord ["help", ["Credits", "Many thanks goes out to everyone that worked on the original DUWS by kibot!"]]; @@ -259,7 +247,7 @@ if (mission_DUWS_firstlaunch) then { sleep 20; ["info",["DUWS Manual","Check the manual in the briefing for more info"]] call bis_fnc_showNotification; - profileNamespace setVariable ["profile_DUWS_firstlaunch", false]; + profileNamespace setVariable ["profile_DUWS_firstlaunch", false]; saveProfileNamespace; }; @@ -279,8 +267,8 @@ _dynam = [player,"DynamicSupportMenu"] call BIS_fnc_addCommMenuItem; //Loading player position and gear. //TODO: Add bought supports. /* -if(isServer) then -{ +if(isServer) then +{ execVM "persistent\missionSpecific\saveFuncs.sqf"; waitUntil {!isNil "saveFuncsLoaded"}; diff --git a/source/functions/initMission/fn_serverInit.sqf b/source/functions/initMission/fn_serverInit.sqf index 4f9c78e..da20a0b 100644 --- a/source/functions/initMission/fn_serverInit.sqf +++ b/source/functions/initMission/fn_serverInit.sqf @@ -2,31 +2,31 @@ if (!isServer) exitWith {}; ////////////////////////////////////////////////////// -// HOW TO MANUALLY CREATE THE MISSION: +// HOW TO MANUALLY CREATE THE MISSION: // 1)YOU MUST PLACE THE HQ LOCATION // 2)DEFINE THE CAPTURABLE ZONES // -- YOU CAN ALSO JUST PUT A HQ SOMEWHERE AND LET THE ZONES BEING RANDOMLY GENERATED -// -- YOU MUST PLACE MANUALLY THE HQ IF YOU ARE ALREADY PLACING THE ZONES BY HAND -// 3) DONT FORGET TO DEFINE THE VARIABLES BELOW. If you are ONLY placing the HQ by hand, you just need to put "hq_manually_placed" to +// -- YOU MUST PLACE MANUALLY THE HQ IF YOU ARE ALREADY PLACING THE ZONES BY HAND +// 3) DONT FORGET TO DEFINE THE VARIABLES BELOW. If you are ONLY placing the HQ by hand, you just need to put "hq_manually_placed" to // "true" instead of "false". If you are also placing the zones by hand, make "zones_manually_placed" to "true". ///////////////////////////////////////////////////////////// -// 1) In the gamelogic, for the HQ( !! MAKE ONLY ONE HQ !!): _null=[getpos this] execVM "initHQ\BluHQinit.sqf" -// -// 2) In the init of gamelogic, to create a capturable enemy zone: +// 1) In the gamelogic, for the HQ( !! MAKE ONLY ONE HQ !!): _null=[getpos this] execVM "initHQ\BluHQinit.sqf" +// +// 2) In the init of gamelogic, to create a capturable enemy zone: // _null = ["zone name",pts awarded upon capture, zone radius,getpos this,false/true,false/true] execvm "createzone.sqf"; // "zone name": name of the zone // pts awarded upon capture: points you earn when you capture the zone. Also the amount of points of army power you take and receive // from the enemy after capture // zone radius: how large the zone is // getpos this: It's the position of the zone. The gamelogic actually. You don't have to modify this. -// false/true: if the zone is fortified or not. If the zone is fortified, there will be a bit more enemies and they will be maning +// false/true: if the zone is fortified or not. If the zone is fortified, there will be a bit more enemies and they will be maning // static defences if there are any // false/true: if the zone is selecting randomly a prefab base. Prefab is selected according to the zone radius. The bigger the zone, // the bigger the prefab asset will be chosen. // // EXAMPLE, in the init of a gamelogic you have placed on the map: // _null=["OP Xander",20,200,getpos this,true,false] execvm "initZones\createzone.sqf" -// +// // Note, this has been moved to the functions library! // use '_null=["OP Xander",20,200,getpos this,true,false] spawn duws_fnc_createzone' instead! // @@ -44,7 +44,7 @@ hq_manually_placed = false;publicVariable "hq_manually_placed"; // you must specify if you have manually placed the zones or not. false = zones are randomly generated, true = you have manually placed the zones zones_manually_placed = false;publicVariable "zones_manually_placed"; zones_max_dist_from_hq = 7500;publicVariable "zones_max_dist_from_hq"; -dynamic_weather_enable = true;publicVariable "dynamic_weather_enable"; +dynamic_weather_enable = true;publicVariable "dynamic_weather_enable"; manually_chosen = false;publicVariable "manually_chosen"; if (isNil "enable_fast_travel") then { enable_fast_travel = true; };publicVariable "enable_fast_travel"; @@ -54,7 +54,7 @@ if (isNil "enableChopperFastTravel") then { enableChopperFastTravel = true; };pu if (isNil "commandpointsblu1") then { commandpointsblu1 = 20; };publicVariable "commandpointsblu1"; // STARTING ARMY POWER if (isNil "blufor_ap") then {blufor_ap = 0;};publicVariable "blufor_ap"; -opfor_ap = 0; +opfor_ap = 0; /////////////////////////////////////////////////////// @@ -62,13 +62,13 @@ opfor_ap = 0; ////////////////////////////////////////////////////// // MOST OF THE VALUES ARE BEING OVERWRITTEN BY PLAYER INPUT AT THE BEGINNING ////////////////////////////////////////////////////// - + ///////////////////////////////////////////////////////////// debugmode = false; // Debug mode, kind of obsolete /// ------------- VALUES UNDER THIS ARE OVERWRITTEN zones_number = 9; // Number of capturables zones to create (when zones are created randomly) zones_spacing = 1200; // minimum space between 2 zones (in meters) // SOON OBSOLETE -zones_max_radius = 1000; // Determine the maximum radius a generated zone can have +zones_max_radius = 1000; // Determine the maximum radius a generated zone can have zones_min_radius = 200; // Determine the minium radius a generated zone can have. SHOULD NOT BE UNDER 200. /////////////////////////////////////////////////////// @@ -101,7 +101,7 @@ publicVariable "amount_zones_created"; if (isNil "HQ_pos_found_generated") then { HQ_pos_found_generated = false; -}; +}; publicVariable "HQ_pos_found_generated"; @@ -114,9 +114,9 @@ publicVariable "chosen_settings"; if (isNil "chosen_hq_placement") then { chosen_hq_placement = false; }; - + publicVariable "chosen_hq_placement"; - + if (isNil "zoneundercontrolblu") then { zoneundercontrolblu = 0; }; @@ -129,43 +129,43 @@ if (isNil "amount_zones_captured") then { publicVariable "amount_zones_captured"; -if (isNil "savegameNumber") then { +if (isNil "savegameNumber") then { savegameNumber = 0; }; publicVariable "savegameNumber"; -if (isNil "capturedZonesNumber") then { +if (isNil "capturedZonesNumber") then { capturedZonesNumber = 0; -}; +}; publicVariable "capturedZonesNumber"; -if (isNil "finishedMissionsNumber") then { +if (isNil "finishedMissionsNumber") then { finishedMissionsNumber = 0; -}; +}; publicVariable "finishedMissionsNumber"; -if (isNil "OvercastVar") then { +if (isNil "OvercastVar") then { OvercastVar = 0; -}; +}; publicVariable "OvercastVar"; -if (isNil "FogVar") then { +if (isNil "FogVar") then { FogVar = 0; }; publicVariable "FogVar"; -if (isNil "createzone_server") then { +if (isNil "createzone_server") then { createzone_server = false; }; publicVariable "createzone_server"; -if (isNil "mission_number_of_zones_captured") then { +if (isNil "mission_number_of_zones_captured") then { mission_number_of_zones_captured = 0; }; @@ -217,19 +217,6 @@ waitUntil { !isNil "serv_zones_array" }; diag_log format ["serv_zones_array: %1", serv_zones_array]; [serv_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 2000] call duws_fnc_WARCOM_init; // 2700 is 40 mins -if (isServer) then { - // group cleaning script - 0 = [ - 60*60, // seconds to delete dead bodies (0 means don't delete) - 60*60, // seconds to delete dead vehicles (0 means don't delete) - 60*60, // seconds to delete dropped weapons (0 means don't delete) - 0, // seconds to deleted planted explosives (0 means don't delete) - 60*60 // seconds to delete dropped smokes/chemlights (0 means don't delete) - ] spawn duws_fnc_repetitive_cleanup; -}; - - - if (zones_manually_placed) then { waitUntil {!isNil ("Array_of_OPFOR_zones")}; sleep 1; diff --git a/source/includes/CfgFunctions.hpp b/source/includes/CfgFunctions.hpp index db3cb82..57b3a2b 100644 --- a/source/includes/CfgFunctions.hpp +++ b/source/includes/CfgFunctions.hpp @@ -60,8 +60,6 @@ class CfgFunctions // [length] call duws_fnc_random_name class random_veh {}; // [faction, vehClass, position, radius] spawn duws_fnc_random_veh - class repetitive_cleanup {}; - // [] spawn duws_fnc_repetitive_cleanup class request {}; // [] call duws_fnc_request class request_squad {}; diff --git a/source/mission.sqm b/source/mission.sqm index 51526affbe93683a44c4b557138eda1783cd82a5..6cc3046f34d3db4479900e9b8574adac8bcf749a 100644 GIT binary patch literal 20702 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 literal 20490 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 Date: Tue, 11 Jun 2019 12:38:05 +0200 Subject: [PATCH 15/17] Fixed end conditions on dedicated server Mission would not properly end on dedicated as it would only trigger on the client side. Mission endings are now handled by the server and remoteexeced to the clients. --- source/functions/initHQ/fn_BluHQinit.sqf | 10 ------- .../functions/initMission/fn_clientInit.sqf | 21 +++------------ .../functions/initMission/fn_serverInit.sqf | 3 +++ source/functions/startup/fn_endconditions.sqf | 27 +++++++++++++++++++ source/includes/CfgFunctions.hpp | 2 ++ 5 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 source/functions/startup/fn_endconditions.sqf diff --git a/source/functions/initHQ/fn_BluHQinit.sqf b/source/functions/initHQ/fn_BluHQinit.sqf index 2fc3f00..9bc9670 100644 --- a/source/functions/initHQ/fn_BluHQinit.sqf +++ b/source/functions/initHQ/fn_BluHQinit.sqf @@ -51,16 +51,6 @@ _handle = [(getpos hq_blu1), _hq] call duws_fnc_guards; //STATIC DEFENSES _handle = [(getpos hq_blu1), _hq] spawn duws_fnc_fortify; -// IF THE OFFICER IS DEAD -- BEGIN OF "SPAWN" -[_hq] spawn { - _hq = _this select 0; - waitUntil {sleep 1;!alive _hq}; - _hq switchMove "AidlPercMstpSnonWnonDnon01"; - ["TaskFailed",["","Your commanding officer has been killed"]] call bis_fnc_showNotification; - sleep 6; - ["officerkilled",false,true] call BIS_fnc_endMission; -}; - //CREATE PATROL [getpos hq_blu1, 40] call duws_fnc_guardsHQ; [getpos hq_blu1, 60] call duws_fnc_guardsHQ; diff --git a/source/functions/initMission/fn_clientInit.sqf b/source/functions/initMission/fn_clientInit.sqf index 49a1723..8372d5d 100644 --- a/source/functions/initMission/fn_clientInit.sqf +++ b/source/functions/initMission/fn_clientInit.sqf @@ -211,24 +211,9 @@ if (isMultiplayer) then { }; }; -// create mission victory script //SPAWN BEGIN -[] spawn { - - // CREATE MAIN OBJECTIVE - capture_island_obj = player createSimpleTask ["taskIsland"]; - capture_island_obj setSimpleTaskDescription ["The ennemy is controlling the island, we must take it back! Capture every zone under enemy control and the mission will succeed.
You can let your BLUFOR forces take the island by themselves and help them getting a bigger army by accomplishing side missions. Or you can capture the zones yourself and do all the big work. As the campaign progress, the war will escalate and the armies will get stronger and start to use bigger guns.
To capture a zone, you need to have more units inside the zone than the enemy.

It's up to you on how you want to play this.
Good luck, soldier!","Take the island",""]; - - // WAIT UNTIL ALL ZONES ARE CAPTURED - waitUntil {sleep 1; amount_zones_created > 0}; - waitUntil {sleep 3; (zoneundercontrolblu >= amount_zones_created);}; // Toutes les zones sont capturées - persistent_stat_script_win = [] call duws_fnc_persistent_stats_win; - ["TaskSucceeded",["","Island captured!"]] call bis_fnc_showNotification; - capture_island_obj setTaskState "Succeeded"; - sleep 3; - ["island_captured_win",true,true] call BIS_fnc_endMission; -}; - - +// Generate main task +capture_island_obj = player createSimpleTask ["taskIsland"]; +capture_island_obj setSimpleTaskDescription ["The ennemy is controlling the island, we must take it back! Capture every zone under enemy control and the mission will succeed.
You can let your BLUFOR forces take the island by themselves and help them getting a bigger army by accomplishing side missions. Or you can capture the zones yourself and do all the big work. As the campaign progress, the war will escalate and the armies will get stronger and start to use bigger guns.
To capture a zone, you need to have more units inside the zone than the enemy.

It's up to you on how you want to play this.
Good luck, soldier!","Take the island",""]; if (mission_DUWS_firstlaunch) then { waitUntil {chosen_settings}; diff --git a/source/functions/initMission/fn_serverInit.sqf b/source/functions/initMission/fn_serverInit.sqf index da20a0b..58351fa 100644 --- a/source/functions/initMission/fn_serverInit.sqf +++ b/source/functions/initMission/fn_serverInit.sqf @@ -213,6 +213,9 @@ game_master = ["player1"];publicVariable "game_master"; // init the bonuses you get when capturing zones _basepoint = [] spawn duws_fnc_zones_bonus; +// Mission ending handler +missionEndHandle = [] spawn duws_fnc_endconditions; + waitUntil { !isNil "serv_zones_array" }; diag_log format ["serv_zones_array: %1", serv_zones_array]; [serv_zones_array, getpos hq_blu1, [0,0,0], blufor_ap, opfor_ap, 2700,blufor_ai_skill,opfor_ai_skill, 2000] call duws_fnc_WARCOM_init; // 2700 is 40 mins diff --git a/source/functions/startup/fn_endconditions.sqf b/source/functions/startup/fn_endconditions.sqf new file mode 100644 index 0000000..bf4cb4e --- /dev/null +++ b/source/functions/startup/fn_endconditions.sqf @@ -0,0 +1,27 @@ +waitUntil {!isNil "hq_blu1"}; + +// End mission if HQ unit is killed +hq_blu1 spawn { + waitUntil {time > 1}; + _this addMPEventHandler ["MPKilled", + { + [] spawn + { + ["TaskFailed",["","Your commanding officer has been killed"]] call bis_fnc_showNotification; + sleep 6; + ["officerkilled",false,true] call BIS_fnc_endMission; + }; + }]; +}; + +waitUntil {!isNil "amount_zones_created" && {amount_zones_created > 0}}; + +// WAIT UNTIL ALL ZONES ARE CAPTURED +waitUntil {sleep 3; (zoneundercontrolblu >= amount_zones_created);}; // Toutes les zones sont capturées +{ + persistent_stat_script_win = [] call duws_fnc_persistent_stats_win; + ["TaskSucceeded",["","Island captured!"]] call bis_fnc_showNotification; + capture_island_obj setTaskState "Succeeded"; + sleep 3; + ["island_captured_win",true,true] call BIS_fnc_endMission; +} remoteExecCall ["BIS_fnc_spawn", 0, true]; diff --git a/source/includes/CfgFunctions.hpp b/source/includes/CfgFunctions.hpp index 57b3a2b..c7f3168 100644 --- a/source/includes/CfgFunctions.hpp +++ b/source/includes/CfgFunctions.hpp @@ -182,6 +182,8 @@ class CfgFunctions class startup { + class endconditions {}; + // [] spawn duws_fnc_endconditions class manual {}; // [] spawn duws_fnc_manual class placement {}; From 9917c78cfb4e5921c1899e1d765b6cd27e06317c Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Tue, 11 Jun 2019 12:39:24 +0200 Subject: [PATCH 16/17] Additional parameters Enable admin console for easy debugging. Time acceleration parameter. --- source/includes/paramdebugconsole.hpp | 15 +++++++++++++++ source/includes/params.hpp | 6 ++++++ source/includes/paramtimeacceleration.hpp | 22 ++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 source/includes/paramdebugconsole.hpp create mode 100644 source/includes/paramtimeacceleration.hpp diff --git a/source/includes/paramdebugconsole.hpp b/source/includes/paramdebugconsole.hpp new file mode 100644 index 0000000..9cfe3c6 --- /dev/null +++ b/source/includes/paramdebugconsole.hpp @@ -0,0 +1,15 @@ +// From biwiki: +// Param templates currently don't work with PBO missions manually copied to MPMissions folder. Unpacked missions, Steam missions and missions which are part of an addon works correctly. +// So I just copied the file into the mission instead. + +#ifndef DEBUGCONSOLE_DEFAULT + #define DEBUGCONSOLE_DEFAULT 0 +#endif + +class DebugConsole +{ + title = $STR_A3_paramDebugConsole_title; + values[] = {0,1}; + texts[] = {$STR_DISABLED,$STR_ENABLED}; + default = DEBUGCONSOLE_DEFAULT; +}; diff --git a/source/includes/params.hpp b/source/includes/params.hpp index 932719a..bb7feda 100644 --- a/source/includes/params.hpp +++ b/source/includes/params.hpp @@ -19,4 +19,10 @@ class Params { texts[] = {"On","Off"}; default = 1; }; + + #define DEBUGCONSOLE_DEFAULT 0 + #include "paramDebugConsole.hpp" + + #define TIMEACCELERATION_DEFAULT 10 + #include "paramTimeAcceleration.hpp" } diff --git a/source/includes/paramtimeacceleration.hpp b/source/includes/paramtimeacceleration.hpp new file mode 100644 index 0000000..ae245ba --- /dev/null +++ b/source/includes/paramtimeacceleration.hpp @@ -0,0 +1,22 @@ +// From biwiki: +// Param templates currently don't work with PBO missions manually copied to MPMissions folder. Unpacked missions, Steam missions and missions which are part of an addon works correctly. +// So I just copied the file into the mission instead. + +#ifndef TIMEACCELERATION_DEFAULT + #define TIMEACCELERATION_DEFAULT 1 +#endif + +class TimeAcceleration +{ + title = $STR_usract_time_inc; + values[] = {1,2,5,10,20}; + texts[] = { + "x1", + "x2", + "x5", + "x10", + "x20" + }; + default = TIMEACCELERATION_DEFAULT; + function = "BIS_fnc_paramTimeAcceleration"; +}; From 83a590e44708597240bbb18cf9e97cab1ba34d68 Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Tue, 11 Jun 2019 13:25:51 +0200 Subject: [PATCH 17/17] Replaced skipTime with BIS_fnc_setDate Provides a nicer transition. --- source/functions/generic/fn_savegame.sqf | 4 ++-- source/functions/generic/fn_savegameClient.sqf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/functions/generic/fn_savegame.sqf b/source/functions/generic/fn_savegame.sqf index c6d113e..f7341b4 100644 --- a/source/functions/generic/fn_savegame.sqf +++ b/source/functions/generic/fn_savegame.sqf @@ -3,7 +3,7 @@ player setdammage 0; if (isServer) then { - skiptime 6; + [6, true, true] call BIS_fnc_setDate; sleep 0.3; saveGame; @@ -13,4 +13,4 @@ if (isServer) then { sleep 2; [] call duws_fnc_bottom_right_message; -}; \ No newline at end of file +}; diff --git a/source/functions/generic/fn_savegameClient.sqf b/source/functions/generic/fn_savegameClient.sqf index 48af196..61784c0 100644 --- a/source/functions/generic/fn_savegameClient.sqf +++ b/source/functions/generic/fn_savegameClient.sqf @@ -1,4 +1,4 @@ -skipTime 6; +[6, true, true] call BIS_fnc_setDate; player setdammage 0; {_x setdammage 0} forEach units group player; -hint "You and your squad members have been fully healed"; \ No newline at end of file +hint "You and your squad members have been fully healed";

lZ(*QD@Vrr`MeCt2+9_Rm+A�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 z z&Mp0#PqDPqh3U*J+|0ENOm&?SX|aK64$!O(%msjgH!?$Xh-PhMI@s!NFv>b7w%&OQ z9inY!VArR^HZ$WuHu`uAQyj&7z147gW*cMN)79F}Tm+hh+nGuboCZ5q@Ne6A*kiBnAMo`XmDjtOIyKKQH4*HS!_=|XeZObJnbj8y?S-i) zmia!dQKGa}i}BV)Wn^8(%(J+FNYXh2nw!fs1iq(onV$e1JI_P{A0!l&kHLqm&u2XKJJuw@^{#aMK;`^DI0Kz^(pYtYOq&fbH@9VJ)> zv5%BwG5z>dlI?(UHfPy+K=K01Vn%a?@@&|b+@A`Ldq=u7>-{h=GxNGnkVA1jIio2GdlD54)mX@m$tI1B z0sU*3+5Oo4tTYQ3lq9MQ3qDWYm0=-or*j?-GgeJPb5jae z|F&pc>dQITkG22*Z?d{7I|x|Vy0T6{&c&5&f$lTJooxk;JKR|oRXtjb-3&NGtFz$y z^jLK^6T64jWOJdrel6C&zJ+aEh^_VFfLxEh-L2L|^201mtNMEsFZxxj%))7VN2I(s zlIs%maDI<3g{$AJ9DJbGF3SkIvlcr7X*$(rKY$#HCwmneUwE-;z-WFQ7K*IoS{-Bd zn|iZY?l|qu4ux@beAt!%P4r=Lt?u?g=OWL2jB&wr*+gLXwl3QU*;T90#_91gSg^H^ z2;S__QaF)m5tJOO&#u$A$@j6{vZ-c%61I zvfIgPC!b&4xjfZbC-=4q3rQ_0*OcwAvs~ysVDO*hiF=CA{0&Fo`Au0YhS%_A2kE!d zrMyQziHlC?yb3No*7&km?3&Pw#XZTrIXe@z+1`R(0`mF!84EJhkL?d_IesjrKhOQx z$0+mp)+`oYp0;K&E1@&}*)Bkm-fGJlPYMd!vEF(zlaU$fo#y~w{YokZu#mwJzW^hy z+zw!k&)Jv)Sv)S!3S_r}$-FzU_b`~q!E7&(ZbUHa3f+mpMP8}D?8y7%?-lyGu-6pF z*3ue}iKMuj?V0K}enA&vV2ZjLo~m{GCuRBW$dD#>XYtmHCiP^mU~nAPmo;8{oeg2P z0rQFdSSWDPll|DusQRb@Y#vyNwhCoGppEMdHrz7Cfaux5Y$>$owIS?ApgA>y?G4bK z2-ZO_$mG4cwGBS7^*h3d0tbh(S3&QDVXRS4dmG8-1Mc}zY(Ic%jb^I=6g-;6lfw4V zY&gp0FqZ8CbcT;*jpN+-aqMNlX&Yq(u0NZ5}TL}%&W-@yU zL4GQmRvZTGoXK8-FYyVkc|f0s*|XU=;3CAa2>_+WvC{!^p2JqrKSd@ad;DoK>{Q_I zrs|FRRv#>=wC5al659CsJl064?Bf3gEB}RT2=L8Z$aX}p`MH?A291}Nuyql?#Bw8U z(`-@{t$_Q&RV)^tJFYe$ehoXLiG_W+f@Ae#A3Z6xUhNeX?&cqQH|A~SMl5UPwCLkV zeZ`-@1K=NoS)$g=Oh%9klY4eS+YbKJ<@ z0POD@*(&G(6*3J6@yle>q5F9z%R@16&yeXY^^KGM-ORQ`dHlAqSfrZ2jm2NXCIfb{ zqxAr_pjSf7)ahP7bE{Xst?Tr-s0Re-zMJ&{XyI=5H$e0E7?I}P9+ZTtd)cS<(Ea-m zi#3{#hgrzhN&6#4RGf5#O@(pgkFryAh^{=!8uunuvsn-5?w-x|fbN~yhM&_z#|;~j z4=0RGpxQ}xJ>Xn9$zt`+bjsLs{+wcs8}9CBjIe&;3`+ndG>4r4YzlG=zbZ=HS*Ur? zfL!(k1{9x5MTGR7Vk@72fBRjFrD)=1*8P9J6ZS+Ni_~->B&3x8%T8TJv&x^kXPI1)FNGq?jP9Oi0t)=jX^Ko z^O_p_L7P2||Wu^?(+K+Q{VBXx-GD#4-g$dgjsFX(DD0tc_GueH1U zYJT|6Qhs`KW06Y&b~i=N1(+0y9De$qgsL1om~FDN+l;jiTl(C1*5+DDaL7PC!zLLj zR|&AssT@oevDdiaKxeGR8HcoOW<&ji(p(!rxmB9OY^q}!4&oL0REA3fnyM z(%rRPTm4u`E>+?%Iz%~fCxLw9$~c9zS7pw)bUfa5zU)fd$PMvB&d<&Wt?A{Z8-A?|2UUMkzA85j zNUW}kZbi>j<&tr72fK0QAk>hV)j3F5sCNy{xX|&f$pxXWF7x14>6EBvZEiH;ulM9C zqan|FaWTLtpbiJQH)-O{!C`@}_2wLK;87p05C$Hti_=9*)Z@-!_tpB`3E;D$0rwXh z6B}`vfYYKe=MPYPW5aRxH0DacKzgJJ*BimIz8rp}k#uU#Jq9G77F;cWLR)YZ^*U%w z@kLeZblL1UHsD9);LMse!{e4ruOm%=dDg$CLr*Yg(N~@7NL2RY_M^Sdx90qyQEJ0g zLphuHb66Uf@6S~SM*ID_asXZT=O7&;o7!?Kp{;d0E*7A3?QpiKZ2-3b2`+BW;o0cF z4oHyB@4!XCq|ony+*}+P+nH;p6QUP8bLlu~ql0l$=$Bw_I2vYPH?9{VWp(HN0@BeQ z+$z}2#h+c1^*dbJzc+{bKaK0d4MN4=hHy@RBlhFgBh7vNxsu2;dm#5fPX>xlJHNkL zWZ(MBLWaj}$rv?c-Ch67x;^&~;xa(z0ioPry|@*;uE&3IoxMhkn`_l9FQeLuK92fc zrw@M+%1zaipp0vq`(+-hc~Vax$dE7&6NdaSZWPe#G?>c~Aufy0o zrh9sxOhUrBM=-{32zOB5?}m2hc(QDzDr+73IXDE=hBYKaaNhbb+A4y}g#46z7-cxp z_0dK!nJ|WXZ3hHHCvup444i}^izZLv+M|))Oy*u9cylV}hhX_=t~r>NhQ$7h3@2t_ z*rJ1H8u6PZ&F10}%XJP{0YK7vF831nd(PurLFQibI45|dvp%)|@ycRa@zSaKo=xY@ z=Xj)%6wft=E0Da^ZM-G!0R}lsxN!jaF6CAOtNf+h ze4P3SVl0%~gv00H#5;+@y!})X2PGf!D~U@6IxAOVsHDwTap|bh)79K_=)Smy+YD?b zCv#1J4Lz93mYjFBlrXg{y=TZQI6GgvN{8IO7-kVs~+S5x>D6&IyP1 zpYuw+q=!S3_>F_sap1Gv)2v;!O@+ItUjwNN;Z!(0utR^MaXM4))<7}piV z@W|%I;m8dqILyoFjguUQ5iHxrU$PF!!VaBe77!v`Ee zqvt*0<^r+4Pr0+uPu!jxImyfiT*%Dn<+oMWE6=p^ zE6%t!x%HN-rki4Wg+#7P=-ueTX&vAjVl54$2_~7Pjx$v zEgln7xO8X7T{eER2CVaQ@%#Q4O5d&@xff_X=`;5Wr-%E-d4hSGedC&;qsIO)_5qUd zlgokr(Z38wCNKYR3xMr}zedJ7vXFz?51CWQ!I^7MaUP$9(v>#6@gSggF&;7`>SV{a z!buD-$v**#9ZT`yz;J&lei$D2s)~GfXp9#5T~N>Q4Gu1wxp+m9!vtNk>Ka_bz4XOY;!A=+Dx;@$${Vfya>2 zz=1bbt$$hG0c9Upkp~AP?<(?3f%*(b{vA>uYU=WquK~c{}r9e=^va z?*wfJoOw(?+^X;wk<1Sl{vgoaQo;)5?ZhP`g0olQehZsp#dhxLF(rI=0r6{N3!?%QiJ$?A*z-6@$kFH5(*W>XR z^SvG)ifaDXfcHW4i2XX+ZYZ5AkZS~S!&V0#q@tLWG<+xNa5UL4j|V}69b zdi?(DUfL>pQF(thYtG_;5GQ@5kWGyZ0p2#|zd#sLW~aI?vnvWhm1fIZURwt`e(XO| zr}d*L-xK5x^2O;P$9;Lo*Xb``9zR`3a+~vIVBpi{{Cnz;LhK0Y%HnA}jqBz+=gk zbnL+6w*969Z-%sk*mdT8K%7RM`9^x0P>+8-a%AZRB{DMic(dOAdP+p+cIL~0lhX}d zjWtB?cKavo_8xpN%Gi_th}!(<#bZU5-uRElQUw{+pT7q@0|yw6o;HB@hql)Pj3szv zARh#6@*w^TKqW)@YdS>lhw>*dcUn7yUyVj<5DKc!}&C5Yd(Va z1t@j|kGTUK!Q-yCVQ3@|0gwzE%@2lw*GKc1kEf5}ujp-b+*p1DuKlMI_*>AJHIc_0 zo_3tf-v&a|eHw2(H18Y3Z_poh9JO&usIv56LAM2WBIfGzrA+6;P?gECXi;({mLH_Q zyv+A+_OyIrs^g1{jX7?9k6y2wwWLn`!)U zH$0vzomb5EQ9-oLk`S0q5(+0d0eEZMt z)l)CE&`tAr9)61`ZAf){VV=L=N8h`BDwiugL02Mo0gn$`Xk-E(fv$FM37-lgO+zfTn7di1CWX zCh~K!kxSykfcCf~{wB^s$JIuBq4ksb!7!Ajr4+3KknPr5{yJc7U&jx}{)!uTEW}gy z4E``Oc%I461f=1c(8grIX5LM&VKjD(He2O3KR4CN?}6Q!_#E4tdZ~=0ZsuD9(u>W8 zngh4+gP`r~7XA!yU$T`qo~s|*&aXp3!gdn)u{pHRBR_W-@nV@2c z2Ye0G%jY2<0*&M$k5yS(?+ITI`y-$7x1m4anUO>keM>BV3>qC@{2SThB|lJaBu8GN z`_SJn|E;}tuZ_sP>^1KM1NXh=;{a;*26Gki=S|TLq8r2EE$;iDM zRLI{#aE!I^1YM$MF(Cu-i)jDW6NSVs5--M<`!c_{Mia)R-3 zp(o{qhQPg21z{;bdn*X10Gd)!C=1YviUOo&lvWh_!gs8SLg$EH>^f)bYPttjswCi6 zJFb$@Oh=>pDhWoJ^`nze6KGYcEMS38b`~JKl1a`26qM-(XCVdUY~vy{hj-ZXbPn-V zh5vxWo2mllJ+EB_jQNyx7cdx;an*#jAi=R}!WlaN=hha`XUGvx;UQ2;^%5Xyps&1y zN@#Spo`6w+)~PQTmsmX;2+x61i-rQeHKjG12z7DJLz@f7fv9^60k`>YEd)%yL;Zwe zwtD(Fx4)CkklTZUuVv0HI&Or(5B|_8tqqBu{Op}zh)*jYD4wYE4j zv~^p->3=RDBH9U%Inzz;g#KtquDyV7JgC?~7;CseN5K=p1A#&r1g~~7{FO#_5#r$b z=tQ|ICPzP=vvn{sAkBh>JP5*@t@7>5&no%~*r^{ZW2jSC;WCo@+)b#2_SgCdKhc%N z5Wyb@^y(+r!Qo$9a3#>C!h4-dcz?kWY&o|-`VHORUpS3OF#`poPMbeSz$zk{878y< zq?|CJB0w*~ge3q?8Eh=c8c2!6i_D{h6)D(XTUHa0ie&r1l$8s zh8w)epAo`5z@9Twa78!RIYz*Pcg3;7X6VixD_~WHRE;vamqr=utk-y4rKH;gp$;&d zKS7As_skKkTJig1b*ogGDB!7K@Mrdw7{WW-Z8=} z7+Pt%P!3Kgws94{=AKJw8NB+u)s~+=-`>4_c3S7vC05uCgGcv$&kh44UcBzKa8UI5iyX;|#>O2K%) z_i(ikWD&`6RzR(fhubBHgWAV04ahn;!!L7AiRx{tT(|Vmz%_!5dJaq$1_8UX$%1iN z=8|UEE+$P_1>F_Wg=$d2+$^z=zBOLT2IgG~fO|R8W37N0(bBa-EFhF#C!9ymdAdPJ zg2tGQLIiStlOfE|8_B3l0q$^UnN7lCTWH+86-m-(TZNBE==Kf)N)*IzrvRH4`Lk2l z1H^aj5{%=w{T>0X`^dOG0`5s~_6YcPiq_uuZ@n+wFE}Ih{Rahn-1F?9fR_v2hXhBx zY@QW!?sUwHt>tW{*Eo5s-;maKW`!q?=>Y|v;fI7+5SxBHD&SA765rzjW`9$U8_}-$ z31J`zyWxaj{1iu}97EVeIYJpwe^U;+6bU&ioP)ON=Y(0P={cb!`p)58;X7J%?*-vB zjGTH=fT|6-anW%3l9vShMNHycmVOCaIcDDNm?YFd$6Spy1kWzPqEg-?ZJHmT_GVThHW0O($j0j#E_MqHmt4iFTwQ+s$^0rX6n_3{?X|U4+ zVGvFoePnE?%wxe(wup6k@b0))omy^kpSw<%vi@TsQh)c9N9f94CG7kxt#tQep)~S8 z|HKfg$un4`mg^j_2+Md5&yFV^>`<&15$OkOR`4KZ_dm{V!Elal#(~%lTwqp^&3vE}JfbE0L1cA{MGPT8j|h$p>o@ zvMUm3BSMU&Gi^lUWl3*)@v>h3xnOmC*vX+DDXAM%j?}$+qsxd2Romz3JpGD`N6;{~ zr9@vyg3{Vp#aAeJEnzjHqe%o|NEt?i+=j+5qH$8#&WhtfOE*p&2;NB+$RegSZ)MRH zy3LAM9T$V2DsIDt__=gZsZJk2zLpc80hC`}#I3ThyqE>(SrtSRQqQf7jU?V#JOtfs ztB3?0LM118%+SU~_^+~bHDjO&ZZu%!< zi)u;^neIIn>!}Ad)f4X{hgS{6jX-Q^Lvb)be;OLvA8CZ9Cv_W(p3pm_vG^94_GltT zp}j9R6+7WHS8gu$K$A>qAz~gO`Wg22^b;|1uksTyjlSt8`U6R)mZI@x?UP%JkdBhm ztwlUCrL_^uA?>67#vDYo741-rDeXk#N_2L65%Y*T9SkJesiSBl@!JB$rl8QfKoJki ztviVmK#pUb#Eod7Awgmw3_KVl!tO=728*3xU`DVw6q#$?#CfprqaCwDuB;W^6Up-mD)M9c&}hlp6yp4CsR3P@Y~iT6>!1p~y{*7}({*Y-_6&tjfu zHtGZ%2Z`TdaG6lCJPxiKCK_MeayDGV^1$gK;wgjJP;m!<#CN!%(YWCvJ~^O^Mu?k= z1J%Y+qEY-GHC|k1;prH=V%f@pa?-q|*=yP!I_{a4|0*yq(7$#yU7$)6#1{G}=d&w9 z%1;d{z0oyh^~`YhS!45<8cK5;UrQ&QIzb$PbM$tSxD9x%nJkV+M>J0p!%@PRXwg~k zC+nldbb#8%h@Szc>2$Fo68dk3m<`=dGesxpZaGtIgWU^eBOlTvPIQ3o9&us?=%(Z6 zipD)uVZ5k9zq+94N4^34vP8s8h#p^Fgs-=f{3P)K^k=OU(@^38t8vyz+G<1MR%^so zFfe|NmeN*bH&0DgXZbRdYUR4+go9pI7r_Z*LJS5 zHnZoowq57yk1|MPI>uCbIbEE9MBA+sPk@}ldR$TD@OrVFeqmuDP4280V?nI{Hi(B1 ztz3o(8#{^55GzCXjtsG!Jf6k!$5yu>H1q?ipBc3j%TP-kd zhDE)gluIT0!zm~Jf_Pd#`P43$5Zyb{(o1?@6kh`~|4Skky3#M<-b2DJi)WzM7gqk2j8ewaL+$~4)dHXsCelju)lTHSS`P= zipHJF-)rJ-3<10Di7`-oT$x$XxrG1u?)KJM;F-7aqvU2J}8~`P&7Vj zvF?%h1|(kcSR4aTi6Z(+gk)%n!*Qf?CROl%>t4aFU19bJ^q!r2c@m~)`+%QZ^dOGPS zn6594UE`F|p7-9&&1oFe)Lp-fpiV#kMUj)gL}&eh`Vuwo&;B;D*QDiV7YVn0vaN%{8uckbE5nHify4-WwFFCE7xOAt;bk2a}bBBw1%C!BV3x_R>XI?DT6%X(gI)u}SJ;tv@wdc*wfnRSOP% z%}7}%ywo3{7J^huhv;ZQ8jk~CixO_rPLgCiUAZMog{a3ZO{xw^ z_GYP@jb5a3>NhZ?*^!NVJKPI(7~8Gap&q*MBg;sz6_8nFBs`7XFC%3GcAA4U#acg( zIBsYV;r3vnl`g$oxgwK*c%92je*g-sAVG>rJSs|60KaQRLnPYONm_z9FDpy1eu%TP z^aVybRFQr`_@!EP$td&pt|5&J^vrp<7!D$0MXtVd44n@A=kT+3I&{4&B<8lrcT z>%LML3~bU&iosnY%TG#!?g1^OY0&+sr8E!d&=GBtB3t=IC=ODzM3E-Y9w{&i~U*Y_%)`nkVMSjSU+iw*j6 zLZ{KLy>twivK=JIeo40uQe*vfuWeTMHut)?x~3GbG4lB935!~#TX5*c4pK4HcuPm= zFQ9J@lzIYGypxotL-bB3$@qfvuR#**YxGL6Q~=m?S2rmQt<<%rv|Qgf4rV`1c<73b0k7?0v#VjNW;(=9fzR_Xy!2K z4eFRULK=-A6Di?O0+H-d(q_OPF0Sm{6L9yC_kiR4R1Nm0<45G8fP z=<|G{G!w}WpDekd9*I+>FNn1uTG|Rk8^=ig`f~@<^^MxR_>e3|*RH<19d@UcD*F00 zi&4m`7zxWIZKq2&0jqMX)L4%yOgX7wOzqjL5;BLBO|8^p#XucpbS%avk`XIa1o3iW zrFke`@N8)w=9drVNfAJ@{d{ShE=W0({nqton}qgwNX@%;HIr<;gY?aS+?p?a1X{WA zl2J}NxllR{1mY7U59mIUAmM?AUR)#%2K7n3rP5yLf45ZXisosxT*C7#os%dHMDx5| zA>n!VK$2vG_=i_Xu*1_$tEI*`^2Hh{PJbXFwmfz9Of;EaN9ce3l*j5bx*cMZjd*cA zSu!%=$0^bdka&5jg!_I>nv`YZY{5C{@4B_$-7h1mC;5;3sM$~4$-mdqwb1)h0~$8f zY5uoPatAf$u9H5ZMWsO_GsH4&5xZgQ5F2OVd!|dRwL8`ek%d=AmVK`i>vD zJgm;4hJ$l|d3ES-VL%UVmGJJD?An%vXzCU#FdZRZ2na{ccJ=0Fp^}jLjtZj?@qhb?2UBi(=f*m+%lw{@j=L11VY{ zeZ+~#d?>~11s2aK#B+el_xn>uH;fz6q4J%m^9N^awlF3g9vObz=&{rc=}vv}Z|h2Y zDn%gUVlSjoHu~$1#bMF5QkY*zD+uxQh-_lqc8Sk}7a4~rXP`q7C{swfe*cFZRwpgviHv8!Q zS4I>s`j+B3pJ#WixwrWIOO|#$ubZD5wB1T6Tl94ixf=^RwjFNiAXSRXu*~U=;&L5S ziYX=I;;mas#tn~@X5`_(c{U?&2hR0ac{}2~;AMq| zx0yT(2cB*&_k!-qEo9g#$h#KuE*O~ZCmZ*$*IUXz5a&{B83F^fYa=^iql>?M3JAUN zm+{15YAa8{?m6wynB-79c@t0{93U^o?qBWY6?)@_WgTQ_+pxT&3_mi{xstA4Qqk*2 zH0kRgc>yq+6fBnohy=?E^nl?;0$lb420gFR^UT}Iy(*O-c0Fh28=XR?oO8L;XrjNE@?Vvs_cP{2d2q^fNhGF zR|Aw0Ek^_79wS3hh~A5l@iPy!FxHq9T6d=W2+dM9POhd~efN_=Z~Ew`LE0fs##?Qg zF{fzN0MX$2@)_RZ38lVdectj|&-;i=yc`PM@$oWd_Wc&f_{xIBEtI{W`_Mx9obHJa zO4q72{!>WVxdUI=9C%U1JJ7Cb{rudo&W&{^OG}VP8G0|4G4gL+ERO*ym6yoJb%;J& zB2R>YwEr?$hIydl5@k1RO<5tk!d1>pyPYE|4I9vZLLHsO)g*Zls6<0o%K`R4Z&!Me zQ|Jeq+~6a3E`?NE_anU3U$Y~3iw?A)kpb)Es~|+Z^)ep2hp(4&&;#ma8t(Z%vnV{n z$g`W}jX-|%7TLI3xx3Zy_@mn}6p+u`WXS1B&~|yKUNxx@TF$=kz7|bmf7|9g(?z(n zT|N(l*X)q79B^TW?2Fv^U2+%b9Dgg<1VG)6$ddrdJ0hP1XvI+(4=qqc_6fXJ|SP#9neR#x0-+Bf z^vzYd3wmI)8%55d@52LK+Nabh-Pg+5y78LIA@=QbHq~#*cw2JhmSMuqw=v=p(;dtc z$e}wj)>6LSk)MJL_wLF>hc=A8hr0q9moG;^@56lA6{IoUmyL%uI}2ny=Kn5`V_{(Q z0~wBPB;|p82HL_O%8-52{SW0DsQt4?axio^ek>;dbm6gl2cXO+7+=YPr?MH^);~3} zk=&<-IenkWMs2qFbJ+#W6#i1iYbY}2m0{##uh5rhlh;PXCtcsj-+_9^w{i`Dro5FK z=@32eR&D{`BlmjnqP8ms_}}o(KPS(7zv`ksyF_?zNS^v$4g&12?`60_p1v_@1Cz1z5R$l83<~H@)se6F(REA9Uq?k-MT|?%!o2 zk#F+@XM{xlz-2)9{gC}|QVoa7vVy5cnyg^Nvr&{(J^1(j{wD54dch1T zmN>I_ORX-egEvn6T55danZ2LfKRa92!? gldyKt*&M_ZhW)qu8yxJ!nEB`6!1q< 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 diff --git a/source/sounds/radiochatter4.ogg b/source/sounds/radiochatter4.ogg index ee089426994e1f9efefcaa0f47354b75bcdcbffd..ce2da52bcc02fac38a8c07b4efd4552219f02519 100644 GIT binary patch delta 58716 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 D-zl$} delta 42895 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�l>J5Qr=_Xp?%98bVRcFaEpP!v2F!CVBkVYi zPSy2!e0&$~K*~xk)o`X@5)4ciO9EYXakdJx$EmPnGFO8itlMV#wJ6=Z8-iPvJCOB8 zbQ|#O3WTB(8`V+9HlD;`W6RHwk;$m~-d?ots`fwXLBiNnEFj(}r(y}M_Tm;L1YA-H zmj!u#y@M;k=34F#g0Cpt4SKCKJaKSf?~ftwiH;1`Fur!Lto0o_Iuwt&{i!1j%yoH& zt~S=7_fhQaqS6uQ;(<(B@Vs?`fW*Zw{vyE&# zkv^+|H6vekF~<;#7)En#%Lq}{?r?^(`*zT8&hs75#uD#T(!|-d^pmKrbs?Qur*v(b ze)CD{9YuUI!$gE-4Rz>?M>p+)z0EPu}Z_%bfeGV2;Lan8gB!|cTji_j& z^XWy~CrE@wj?pp94yj-lk*s|=Eo`s@ZW!Vr1r?QjcNUTdcG96&*-0;EYbU+f&pTlZ zpc^N~hKG6A5^$4s(a)TLI)jgUWR$Z3KQu99_ONm_{nlMq(`e@1Rp5HCo1VOv-D68D zI!(LDeshLSr^>T~V4i+1o&eIEyGDy=dqki+*(27&S^Y!sFZ;A-1(-&imvYE4OSrA^ aSU;s=Mv`uWqETqg?i3TpnIR5|*mEg$$ delta 1915 zcmXw(dpwkB6vy9p#xRFSle^SNE(u|C86uYzR+FA`02p0C zC>pB-`N&~GJgSyVjwLFk-fpBwKM1*7-yPYdZ;Kq!KZmR}Sd4sUkbnWp4O2!8$DP*nJd z)6I#@h0dTCrEMG2SJ$Qc1Cwd{HwI?TdW4kN)syY3+b=+4nLTctId5-=d}c4jB`k7? zr@v^bNAiqZK*d(@huXe5K>s1XGF^ zzCg}j4@{-!M|AC*tBs-f@cR|z3;oN8{1-8v8Z!`pdtyrh zgUP1{^IxHHBWN)mBx|~O8cFUQ?1YtJGnaUi0=0&z(Acz8m%{}zV06m=fhx;Re~Jrs|f$xd5YOqSFn4JQxY*MjkNuC^eSU(#ywXiT;t>l{dVfkyY* z&$K3(hUrX7yMAQ`us^Q%M-5|;`T?nv<~9-PZmF!Jq8l}9X*COV?9nvRcme4n80?;* zB;w&rAEaZJ7@3=O6S*M!3DRNXR1}47oJ2&4Ie77z&pBquDY>L=J#)z=T9ZoxJT^H1 ztd`20kDteyc=x492Ne%kPH|_;bEjtk&OUCIwq)D zWeF{IO;AIdTAwR zHgH{r0&mG&CUj3#sW}FUyMG9BiM6GG^0Inwu4U8GB74EV|@)>7+&|W0|%~*8uvWB4DKKZ&^0yoDPn4cJOHJd8;k;x$5kLzX+?O#UovEx*? zi$-uI2kcQ`dyovN@Por7srYaONqYYXnTIp091J0^!l_~A-B;2v<$_@N^D&NE*l~vJV@_N4(Qna>J_6{)1`QW6fk5FcmD8k+u3Z zY20YVHe|1~%823Lb{WZQCwDWXo%CvIJ8A2-cIa(oXijV~$j3fUmDM@25zwyyign5!}9@3?xKILf;% ukZs+LYTz3L%pcv!=!@-1q4idcW{!v+t(3~Tn(Dk%8o&FESjfNfo diff --git a/source/sounds/support/loadgun.ogg b/source/sounds/support/loadgun.ogg index 4fb30e928eee73a773510d11f7ff03703aedbcbb..eb3660ee31319e9e48847d88f32b2b387c5dac9c 100644 GIT binary patch delta 1422 zcmXw(Ye-XJ7{}R~NNJm8xNJFQGrPE1cCj57UNX~~O|f6xDMAGY87{GaFl{(0YXcKwL-b-ncX z8x8x^HxI4c(#sW1omF4f#1)$jEt{lGq8h#hZ*e}0HazX@QL~=r+WhKYy9lbwX zr$0Sni^2a3?%miItMC`bjbikSOoh>Q+3En40w=@)xCuX?EeslvqBL246>v*F70@Sd zLX%ICB|+(7$V`+zhqRLCxiCLUkxJt@kYkzw{X(Pa7LhfgNTOf?yABK(nmi2*g>H2M z$x=-dE!&iau#`Ca^I53HZlCy`PGOlco$|+_?wFh z;Sn7_Odg?zIPys2;>WW|oj6{}g^hV9bRvPpNGZFFDX{r#>>=l##A9f(C$&J6C2yuP zC{3j!d!D)!nsWI{((=>qU@j`-F|?5kB}J33iXV$+T7a%{Qw-puiLxj%VJ=i;)=;<1 zj0pS{^J;XDnh(OfD(e}U+p>d+3N0EMtXZ=c{Q)^|0UvYp7!1$-MokKjq!cO#Fuj_`lQ=NVGL-Sv@=9BF!DS}M>&g}Z>dLA_5ac^l6m;&++qBW}u4r_HdaKdZ z=(XS>72cO;QdxV{*`eI8#amECL#YVrsgs6&wYctVp@E3JR`8uz;}2ty4Az*jB&` zh`?t|mURxo6ypu?ix4B5w+u6*L>ZcHqSMW}Y$4tvE^JQsyi4}a@BQBAJm)#*JLmk| zAwJzE?)*j0I{F@_SB&Y(WJ@|~dvxVl+J42X-R65b#!I*oj`0qzn`44l+|9|E)$1Ia zv3nm~WB2i;`|W=)epvEXI7>~-<3tLPNR;Xy**xE3jBMFg+^)Lp-JX@ogo!sY{SX%u zpaKg5W)Qk|_FXX=UEpy!D{0@Oyt&Ug<|opx)Qa>mvXmvExzeIO#=jZV1MiWbY!2Rk z=Ek5|9DIVZd{Q?WYe=F5#VgmsAov!Xr{WDS;~4w8`L4F7x{C?(7Oo&QN6|wIK40XJ zv7d@xE{yQS4Y;aQ-vo_39c(%g9R0n8@l8?TaDExpOA`z+lgQ?yV-;wOv3Al)dE|uX~4@OZnTuRRsx<8VZ6S347Nc<^tKbWA@>#BN65U zfAqa(e1CEIAz6~;5%*Kf!4x2aJVoHd{uZ5?BB4OzBi166Gd$b)?4!9;Jpv0 zHCGRuyRN=7{mJY3UGrM2{kiL-2fIg)Grpx5rzOZXR?*sRb`O={(qvA;+)T(XyG(s_ z`4uY9D$b(tgAN_|$U%=eYV-SG<>oVBT;(FrT=_SwIaO}5-mLx#Y^=!zZ`CA&p|u_0 z(b}`KnVX^Ld$Vw&J3udPBr+-=|X_#qXo2N@0JUcQ(Cte?5y)Zl74K#Eeno% zGmTvMbS)Ux5C$eSM1dO{{se7}86nK^a6EgKO%rDMU~WkJ3)dEh*0jrwbsDD-Fw~Sx h0W;fhoWd8bcxtY>ab3cY=fB4u(YyzmFwi1!{{o;qXP*E7 diff --git a/source/taw_vd/GUI.h b/source/taw_vd/GUI.h index 26322e2..c79ba93 100644 --- a/source/taw_vd/GUI.h +++ b/source/taw_vd/GUI.h @@ -1,668 +1,668 @@ #include "defines.h" class RscEdit_taw { - type = 2; - style = 0x00 + 0x40; - font = "PuristaMedium"; - shadow = 2; - sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorBackground[] = {0, 0, 0, 1}; - soundSelect[] = {"",0.1,1}; - soundExpand[] = {"",0.1,1}; - colorText[] = {0.95, 0.95, 0.95, 1}; - colorDisabled[] = {1, 1, 1, 0.25}; - autocomplete = false; - colorSelection[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1}; - canModify = 1; + type = 2; + style = 0x00 + 0x40; + font = "PuristaMedium"; + shadow = 2; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorBackground[] = {0, 0, 0, 1}; + soundSelect[] = {"",0.1,1}; + soundExpand[] = {"",0.1,1}; + colorText[] = {0.95, 0.95, 0.95, 1}; + colorDisabled[] = {1, 1, 1, 0.25}; + autocomplete = false; + colorSelection[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1}; + canModify = 1; }; class RscListBox_taw { - style = 16; - idc = -1; - type = 5; - w = 0.275; - h = 0.04; - font = "PuristaMedium"; - colorSelect[] = {1, 1, 1, 1}; - colorText[] = {1, 1, 1, 1}; - colorBackground[] = {0.28,0.28,0.28,0.28}; - colorSelect2[] = {1, 1, 1, 1}; - colorSelectBackground[] = {0.95, 0.95, 0.95, 0.5}; - colorSelectBackground2[] = {1, 1, 1, 0.5}; - colorScrollbar[] = {0.2, 0.2, 0.2, 1}; - colorPicture[] = {1,1,1,1}; - colorPictureSelected[] = {1,1,1,1}; - colorPictureDisabled[] = {1,1,1,1}; - arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; - arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; - wholeHeight = 0.45; - rowHeight = 0.04; - color[] = {0.7, 0.7, 0.7, 1}; - colorActive[] = {0,0,0,1}; - colorDisabled[] = {0,0,0,0.3}; - sizeEx = 0.023; - soundSelect[] = {"",0.1,1}; - soundExpand[] = {"",0.1,1}; - soundCollapse[] = {"",0.1,1}; - maxHistoryDelay = 1; - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - tooltipColorText[] = {1,1,1,1}; - tooltipColorBox[] = {1,1,1,1}; - tooltipColorShade[] = {0,0,0,0.65}; - - class ListScrollBar { - color[] = {1,1,1,1}; - colorActive[] = {1,1,1,1}; - colorDisabled[] = {1,1,1,0.3}; - thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; - arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; - arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; - border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; - shadow = 0; - scrollSpeed = 0.06; - width = 0; - height = 0; - autoScrollEnabled = 1; - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - } + style = 16; + idc = -1; + type = 5; + w = 0.275; + h = 0.04; + font = "PuristaMedium"; + colorSelect[] = {1, 1, 1, 1}; + colorText[] = {1, 1, 1, 1}; + colorBackground[] = {0.28,0.28,0.28,0.28}; + colorSelect2[] = {1, 1, 1, 1}; + colorSelectBackground[] = {0.95, 0.95, 0.95, 0.5}; + colorSelectBackground2[] = {1, 1, 1, 0.5}; + colorScrollbar[] = {0.2, 0.2, 0.2, 1}; + colorPicture[] = {1,1,1,1}; + colorPictureSelected[] = {1,1,1,1}; + colorPictureDisabled[] = {1,1,1,1}; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + wholeHeight = 0.45; + rowHeight = 0.04; + color[] = {0.7, 0.7, 0.7, 1}; + colorActive[] = {0,0,0,1}; + colorDisabled[] = {0,0,0,0.3}; + sizeEx = 0.023; + soundSelect[] = {"",0.1,1}; + soundExpand[] = {"",0.1,1}; + soundCollapse[] = {"",0.1,1}; + maxHistoryDelay = 1; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + tooltipColorText[] = {1,1,1,1}; + tooltipColorBox[] = {1,1,1,1}; + tooltipColorShade[] = {0,0,0,0.65}; + + class ListScrollBar { + color[] = {1,1,1,1}; + colorActive[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.3}; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + shadow = 0; + scrollSpeed = 0.06; + width = 0; + height = 0; + autoScrollEnabled = 1; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + } }; class RscCheckBox { - access = 0; // Control access (0 - ReadAndWrite, 1 - ReadAndCreate, 2 - ReadOnly, 3 - ReadOnlyVerified) - idc = -1; // Control identification (without it, the control won't be displayed) - type = 77; // Type - style = ST_LEFT + ST_MULTI; // Style - default = 0; // Control selected by default (only one within a display can be used) - blinkingPeriod = 0; // Time in which control will fade out and back in. Use 0 to disable the effect. - - x = 0; - y = 0; - w = 1 * GUI_GRID_CENTER_W; // Width - h = 1 * GUI_GRID_CENTER_H; // Height - - //Colors - color[] = { 1, 1, 1, 0.7 }; // Texture color - colorFocused[] = { 1, 1, 1, 1 }; // Focused texture color - colorHover[] = { 1, 1, 1, 1 }; // Mouse over texture color - colorPressed[] = { 1, 1, 1, 1 }; // Mouse pressed texture color - colorDisabled[] = { 1, 1, 1, 0.2 }; // Disabled texture color - - //Background colors - colorBackground[] = { 0, 0, 0, 0 }; // Fill color - colorBackgroundFocused[] = { 0, 0, 0, 0 }; // Focused fill color - colorBackgroundHover[] = { 0, 0, 0, 0 }; // Mouse hover fill color - colorBackgroundPressed[] = { 0, 0, 0, 0 }; // Mouse pressed fill color - colorBackgroundDisabled[] = { 0, 0, 0, 0 }; // Disabled fill color - - //Textures - textureChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked CheckBox. - textureUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked CheckBox. - textureFocusedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked focused CheckBox (Could be used for showing different texture when focused). - textureFocusedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked focused CheckBox. - textureHoverChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; - textureHoverUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; - texturePressedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; - texturePressedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; - textureDisabledChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; - textureDisabledUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; - - tooltip = ""; // Tooltip text - tooltipColorShade[] = { 0, 0, 0, 1 }; // Tooltip background color - tooltipColorText[] = { 1, 1, 1, 1 }; // Tooltip text color - tooltipColorBox[] = { 1, 1, 1, 1 }; // Tooltip frame color - - //Sounds - soundClick[] = { "\A3\ui_f\data\sound\RscButton\soundClick", 0.09, 1 }; // Sound played after control is activated in format {file, volume, pitch} - soundEnter[] = { "\A3\ui_f\data\sound\RscButton\soundEnter", 0.09, 1 }; // Sound played when mouse cursor enters the control - soundPush[] = { "\A3\ui_f\data\sound\RscButton\soundPush", 0.09, 1 }; // Sound played when the control is pushed down - soundEscape[] = { "\A3\ui_f\data\sound\RscButton\soundEscape", 0.09, 1 }; // Sound played when the control is released after pushing down + access = 0; // Control access (0 - ReadAndWrite, 1 - ReadAndCreate, 2 - ReadOnly, 3 - ReadOnlyVerified) + idc = -1; // Control identification (without it, the control won't be displayed) + type = 77; // Type + style = ST_LEFT + ST_MULTI; // Style + default = 0; // Control selected by default (only one within a display can be used) + blinkingPeriod = 0; // Time in which control will fade out and back in. Use 0 to disable the effect. + + x = 0; + y = 0; + w = 1 * GUI_GRID_CENTER_W; // Width + h = 1 * GUI_GRID_CENTER_H; // Height + + //Colors + color[] = { 1, 1, 1, 0.7 }; // Texture color + colorFocused[] = { 1, 1, 1, 1 }; // Focused texture color + colorHover[] = { 1, 1, 1, 1 }; // Mouse over texture color + colorPressed[] = { 1, 1, 1, 1 }; // Mouse pressed texture color + colorDisabled[] = { 1, 1, 1, 0.2 }; // Disabled texture color + + //Background colors + colorBackground[] = { 0, 0, 0, 0 }; // Fill color + colorBackgroundFocused[] = { 0, 0, 0, 0 }; // Focused fill color + colorBackgroundHover[] = { 0, 0, 0, 0 }; // Mouse hover fill color + colorBackgroundPressed[] = { 0, 0, 0, 0 }; // Mouse pressed fill color + colorBackgroundDisabled[] = { 0, 0, 0, 0 }; // Disabled fill color + + //Textures + textureChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked CheckBox. + textureUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked CheckBox. + textureFocusedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked focused CheckBox (Could be used for showing different texture when focused). + textureFocusedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked focused CheckBox. + textureHoverChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + textureHoverUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + texturePressedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + texturePressedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + textureDisabledChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; + textureDisabledUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; + + tooltip = ""; // Tooltip text + tooltipColorShade[] = { 0, 0, 0, 1 }; // Tooltip background color + tooltipColorText[] = { 1, 1, 1, 1 }; // Tooltip text color + tooltipColorBox[] = { 1, 1, 1, 1 }; // Tooltip frame color + + //Sounds + soundClick[] = { "\A3\ui_f\data\sound\RscButton\soundClick", 0.09, 1 }; // Sound played after control is activated in format {file, volume, pitch} + soundEnter[] = { "\A3\ui_f\data\sound\RscButton\soundEnter", 0.09, 1 }; // Sound played when mouse cursor enters the control + soundPush[] = { "\A3\ui_f\data\sound\RscButton\soundPush", 0.09, 1 }; // Sound played when the control is pushed down + soundEscape[] = { "\A3\ui_f\data\sound\RscButton\soundEscape", 0.09, 1 }; // Sound played when the control is released after pushing down }; class RscXSliderH { - style = 1024; - type = 43; - shadow = 2; - x = 0; - y = 0; - h = 0.029412; - w = 0.400000; - color[] = { - 1, 1, 1, 0.7 - }; - colorActive[] = { - 1, 1, 1, 1 - }; - colorDisabled[] = { - 1, 1, 1, 0.500000 - }; - arrowEmpty = "\A3\ui_f\data\gui\cfg\slider\arrowEmpty_ca.paa"; - arrowFull = "\A3\ui_f\data\gui\cfg\slider\arrowFull_ca.paa"; - border = "\A3\ui_f\data\gui\cfg\slider\border_ca.paa"; - thumb = "\A3\ui_f\data\gui\cfg\slider\thumb_ca.paa"; + style = 1024; + type = 43; + shadow = 2; + x = 0; + y = 0; + h = 0.029412; + w = 0.400000; + color[] = { + 1, 1, 1, 0.7 + }; + colorActive[] = { + 1, 1, 1, 1 + }; + colorDisabled[] = { + 1, 1, 1, 0.500000 + }; + arrowEmpty = "\A3\ui_f\data\gui\cfg\slider\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\slider\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\slider\border_ca.paa"; + thumb = "\A3\ui_f\data\gui\cfg\slider\thumb_ca.paa"; }; class RscText_taw { - x = 0; - y = 0; - h = 0.037; - w = 0.3; - type = 0; - style = 0; - shadow = 1; - colorShadow[] = {0, 0, 0, 0.5}; - font = "PuristaMedium"; - SizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = ""; - colorText[] = {1, 1, 1, 1.0}; - colorBackground[] = {0, 0, 0, 0}; - linespacing = 1; + x = 0; + y = 0; + h = 0.037; + w = 0.3; + type = 0; + style = 0; + shadow = 1; + colorShadow[] = {0, 0, 0, 0.5}; + font = "PuristaMedium"; + SizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + text = ""; + colorText[] = {1, 1, 1, 1.0}; + colorBackground[] = {0, 0, 0, 0}; + linespacing = 1; }; class RscTitle:RscText_taw { - style = 0; - shadow = 0; - sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.95, 0.95, 0.95, 1}; + style = 0; + shadow = 0; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorText[] = {0.95, 0.95, 0.95, 1}; }; class RscShortcutButton_taw { - idc = -1; - style = 0; - default = 0; - shadow = 1; - w = 0.183825; - h = "( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20)"; - color[] = {1,1,1,1.0}; - colorFocused[] = {1,1,1,1.0}; - color2[] = {0.95,0.95,0.95,1}; - colorDisabled[] = {1,1,1,0.25}; - colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; - colorBackgroundFocused[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; - colorBackground2[] = {1,1,1,1}; - animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; - animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; - animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; - animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa"; - animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa"; - animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa"; - periodFocus = 1.2; - periodOver = 0.8; - class HitZone - { - left = 0.0; - top = 0.0; - right = 0.0; - bottom = 0.0; - }; - class ShortcutPos - { - left = 0; - top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; - w = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; - h = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - }; - class TextPos - { - left = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; - top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; - right = 0.005; - bottom = 0.0; - }; - period = 0.4; - font = "PuristaMedium"; - size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = ""; - soundEnter[] = {"\A3\ui_f\data\sound\RscButton\soundEnter",0.09,1}; - soundPush[] = {"\A3\ui_f\data\sound\RscButton\soundPush",0.09,1}; - soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; - soundEscape[] = {"\A3\ui_f\data\sound\RscButton\soundEscape",0.09,1}; - action = ""; - class Attributes - { - font = "PuristaMedium"; - color = "#E5E5E5"; - align = "left"; - shadow = "true"; - }; - class AttributesImage - { - font = "PuristaMedium"; - color = "#E5E5E5"; - align = "left"; - }; + idc = -1; + style = 0; + default = 0; + shadow = 1; + w = 0.183825; + h = "( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20)"; + color[] = {1,1,1,1.0}; + colorFocused[] = {1,1,1,1.0}; + color2[] = {0.95,0.95,0.95,1}; + colorDisabled[] = {1,1,1,0.25}; + colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + colorBackgroundFocused[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1}; + colorBackground2[] = {1,1,1,1}; + animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; + animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa"; + animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa"; + animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa"; + periodFocus = 1.2; + periodOver = 0.8; + class HitZone + { + left = 0.0; + top = 0.0; + right = 0.0; + bottom = 0.0; + }; + class ShortcutPos + { + left = 0; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + w = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; + h = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + }; + class TextPos + { + left = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + right = 0.005; + bottom = 0.0; + }; + period = 0.4; + font = "PuristaMedium"; + size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + text = ""; + soundEnter[] = {"\A3\ui_f\data\sound\RscButton\soundEnter",0.09,1}; + soundPush[] = {"\A3\ui_f\data\sound\RscButton\soundPush",0.09,1}; + soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; + soundEscape[] = {"\A3\ui_f\data\sound\RscButton\soundEscape",0.09,1}; + action = ""; + class Attributes + { + font = "PuristaMedium"; + color = "#E5E5E5"; + align = "left"; + shadow = "true"; + }; + class AttributesImage + { + font = "PuristaMedium"; + color = "#E5E5E5"; + align = "left"; + }; }; class RscControlsGroup { - type = 15; - idc = -1; - x = 0; - y = 0; - w = 1; - h = 1; - shadow = 0; - style = 16; - - class ScrollBar { - color[] = {1, 1, 1, 0.6}; - colorActive[] = {1, 1, 1, 1}; - colorDisabled[] = {1, 1, 1, 0.3}; - thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; - arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; - arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; - border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; - shadow = 0; - scrollSpeed = 0.05; - }; - - class VScrollbar:ScrollBar { - width = 0.021; - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - shadow = 0; - color[] = {1, 1, 1, 0.6}; - }; - - class HScrollbar:ScrollBar { - height = 0.028; - shadow = 0; - color[] = {1, 1, 1, 0.6}; - }; - - //class ListScrollBar : ScrollBar {}; - - class Controls {}; + type = 15; + idc = -1; + x = 0; + y = 0; + w = 1; + h = 1; + shadow = 0; + style = 16; + + class ScrollBar { + color[] = {1, 1, 1, 0.6}; + colorActive[] = {1, 1, 1, 1}; + colorDisabled[] = {1, 1, 1, 0.3}; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + shadow = 0; + scrollSpeed = 0.05; + }; + + class VScrollbar:ScrollBar { + width = 0.021; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + shadow = 0; + color[] = {1, 1, 1, 0.6}; + }; + + class HScrollbar:ScrollBar { + height = 0.028; + shadow = 0; + color[] = {1, 1, 1, 0.6}; + }; + + //class ListScrollBar : ScrollBar {}; + + class Controls {}; }; class RscControlsGroupNoScrollbars : RscControlsGroup { - class VScrollbar : VScrollbar { - width = 0; - }; + class VScrollbar : VScrollbar { + width = 0; + }; - class HScrollbar : HScrollbar { - height = 0; - }; + class HScrollbar : HScrollbar { + height = 0; + }; }; class RscButtonMenu:RscShortcutButton_taw { - idc = -1; - type = 16; - style = "0x02 + 0xC0"; - default = 0; - shadow = 0; - x = 0; - y = 0; - w = 0.095589; - h = 0.039216; - animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; - animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; - colorBackground[] = {0,0,0,0.8}; - colorBackgroundFocused[] = {1,1,1,1}; - colorBackground2[] = {0.75,0.75,0.75,1}; - color[] = {1,1,1,1}; - colorFocused[] = {0,0,0,1}; - color2[] = {0,0,0,1}; - colorText[] = {1,1,1,1}; - colorDisabled[] = {1,1,1,0.25}; - period = 1.2; - periodFocus = 1.2; - periodOver = 1.2; - size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - tooltipColorText[] = {1,1,1,1}; - tooltipColorBox[] = {1,1,1,1}; - tooltipColorShade[] = {0,0,0,0.65}; - class TextPos - { - left = "0.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; - top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; - right = 0.005; - bottom = 0.0; - }; - class Attributes - { - font = "PuristaLight"; - color = "#E5E5E5"; - align = "left"; - shadow = "false"; - }; - class ShortcutPos - { - left = "(6.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005"; - top = 0.005; - w = 0.0225; - h = 0.03; - }; - soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",0.09,1}; - soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1}; - soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick",0.09,1}; - soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1}; - textureNoShortcut = ""; + idc = -1; + type = 16; + style = "0x02 + 0xC0"; + default = 0; + shadow = 0; + x = 0; + y = 0; + w = 0.095589; + h = 0.039216; + animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; + animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; + colorBackground[] = {0,0,0,0.8}; + colorBackgroundFocused[] = {1,1,1,1}; + colorBackground2[] = {0.75,0.75,0.75,1}; + color[] = {1,1,1,1}; + colorFocused[] = {0,0,0,1}; + color2[] = {0,0,0,1}; + colorText[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.25}; + period = 1.2; + periodFocus = 1.2; + periodOver = 1.2; + size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + tooltipColorText[] = {1,1,1,1}; + tooltipColorBox[] = {1,1,1,1}; + tooltipColorShade[] = {0,0,0,0.65}; + class TextPos + { + left = "0.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; + right = 0.005; + bottom = 0.0; + }; + class Attributes + { + font = "PuristaLight"; + color = "#E5E5E5"; + align = "left"; + shadow = "false"; + }; + class ShortcutPos + { + left = "(6.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005"; + top = 0.005; + w = 0.0225; + h = 0.03; + }; + soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",0.09,1}; + soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1}; + soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick",0.09,1}; + soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1}; + textureNoShortcut = ""; }; class TAW_VDMenu { - idd = MENU_IDD; - name = "TAW_VDMenu"; - movingEnabled = 0; - enableSimulation = 1; - - onLoad = "((_this select 0) displayCtrl 2999) ctrlSetFade 1; ((_this select 0) displayCtrl 2999) ctrlCommit 0;"; - - class controlsBackground { - class TitleBackground : RscText_taw { - colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; - idc = -1; - x = .3; - y = .2; - w = .5; - h = (1 / 25); - }; - - class MainBackground : RscText_taw { - colorBackground[] = { 0, 0, 0, .7 }; - idc = -1; - x = .3; - y = .2 + (11 / 250); - w = .5; - h = .57 - (22 / 250); - }; - - class Title : RscTitle { - colorBackround[] = { 0, 0, 0, 0 }; - idc = -1; - text = "View Settings (SCRIPT)"; - x = .3; - y = .2; - w = .8; - h = (1 / 25); - }; - - class OnFootText : RscText_taw { - idc = -1; - text = "Infantry:"; - x = .32; - y = .258; - w = .275; - h = .04; - }; - - class inCarText : OnFootText { - text = "Ground:"; - y = .305; - }; - - class inAirText : OnFootText { - text = "Air:"; - y = .355; - }; - - class ObjectText : OnFootText { - text = "Object:"; - y = .655; - }; - - class DroneText : OnFootText { - text = "Drone:"; - y = .405; - }; - - class TerrainBackground : TitleBackground { - text = "Grass Settings"; - shadow = 0; - y = .46; - }; - - class ObjectBackground : TitleBackground { - text = "Object Settings"; - y = .55; - }; - - class ButtonClose : RscButtonMenu { - idc = -1; - text = "Close"; - onButtonClick = "closeDialog 0;"; - x = 0.3; - y = 0.77 - (1 / 25); - w = (6.25 / 40); - h = (1 / 25); - }; - - class SaveManagerBtn:ButtonClose { - text = "Saves"; - onButtonClick = "[] call tawvd_fnc_openSaveManager;"; - x = .465; - }; - }; - - class controls { - - //Sliders - class VD_onFoot_slider : RscXSliderH { - idc = INFANTRY_SLIDER; - text = ""; - onSliderPosChanged = "[0, _this select 1] call TAWVD_fnc_onSliderChanged;"; - toolTip = "View Distance while on foot"; - x = .42; - y = .30 - (1 / 25); - w = "9 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - }; - - class VD_inCar_slider : VD_onFoot_slider { - idc = GROUND_SLIDER; - toolTip = "View distance while in a ground vehicle"; - onSliderPosChanged = "[1, _this select 1] call TAWVD_fnc_onSliderChanged;"; - y = .35 - (1 / 25); - }; - - class VD_inAir_slider : VD_onFoot_slider { - idc = AIR_SLIDER; - toolTip = "View distance while in an aircraft"; - onSliderPosChanged = "[2, _this select 1] call TAWVD_fnc_onSliderChanged;"; - y = .40 - (1 / 25); - }; - - class VD_Object_slider : VD_onFoot_slider { - idc = OBJECT_SLIDER; - toolTip = "Object rendering distance"; - onSliderPosChanged = "[3, _this select 1] call TAWVD_fnc_onSliderChanged;"; - y = .7 - (1 / 25); - }; - - class VD_Drone_slider:VD_onFoot_slider { - idc = DRONE_SLIDER; - toolTip = "View distance while operating a UAV/UGV"; - onSliderPosChanged = "[4, _this select 1] call TAWVD_fnc_onSliderChanged;"; - y = .45 - (1 / 25); - } - - //Values (RscEdit Butons) - class VD_onFoot_Edit : RscEdit_taw { - idc = INFANTRY_EDIT; - text = ""; - onKeyUp = "[_this select 0, _this select 1, 'ground',true] call TAWVD_fnc_onChar;"; - - x = .7; - y = .258; - w = .08; - h = .04; - }; - - class VD_inCar_Edit : VD_onFoot_Edit { - idc = GROUND_EDIT; - onKeyUp = "[_this select 0, _this select 1, 'vehicle',true] call TAWVD_fnc_onChar;"; - y = .31; - }; - - class VD_inAir_Edit : VD_onFoot_Edit { - idc = AIR_EDIT; - onKeyUp = "[_this select 0, _this select 1, 'air',true] call TAWVD_fnc_onChar;"; - y = .36; - }; - - class VD_inDrone_Edit:VD_onFoot_Edit { - idc = DRONE_EDIT; - onKeyUp = "[_this select 0, _this select 1, 'drone',true] call TAWVD_fnc_onChar;"; - y = .41; - }; - - class VD_Object_Edit : VD_onFoot_Edit { - idc = OBJECT_EDIT; - onKeyUp = "[_this select 0, _this select 1, 'object',true] call TAWVD_fnc_onChar;"; - y = .656; - }; - - //Grass Settings - class VD_terrain_none { - idc = TERRAIN_NONE; - type = 11; - style = 0; - font = "PuristaLight"; - color[] = { 1, 1, 1, 1 }; - colorActive[] = { 1, 0.2, 0.2, 1 }; - colorDisabled[] = {0, 0, 0, 1}; - soundEnter[] = { "\A3\ui_f\data\sound\onover", 0.09, 1 }; - soundPush[] = { "\A3\ui_f\data\sound\new1", 0.0, 0 }; - soundClick[] = { "\A3\ui_f\data\sound\onclick", 0.07, 1 }; - soundEscape[] = { "\A3\ui_f\data\sound\onescape", 0.09, 1 }; - text = "None"; - action = "['none'] call TAWVD_fnc_onTerrainChanged;"; - sizeEx = 0.04; - - x = .38; y = .505; - w = .275; h = .04; - }; - - class VD_terrain_low : VD_terrain_none { - idc = -1; - text = "Low"; - action = "['low'] call TAWVD_fnc_onTerrainChanged;"; - x = .47; - }; - - class VD_terrain_normal : VD_terrain_none { - idc = -1; - text = "Normal"; - action = "['norm'] call TAWVD_fnc_onTerrainChanged;"; - x = .56; - }; - - class VD_terrain_high : VD_terrain_none { - idc = -1; - text = "High"; - action = "['high'] call TAWVD_fnc_onTerrainChanged;"; - x = .67; - }; - - class ObjectSyncCheckbox : RscCheckbox - { - idc = 2931; - x = .32; y = .6; - tooltip = "Sync object rendering with view rendering"; - onCheckedChanged = "if((_this select 1) == 1) then {tawvd_syncObject = true;ctrlEnable [2941,false]; ctrlEnable [2942,false];} else {tawvd_syncObject = false; ctrlEnable [2942,true]; ctrlEnable [2941,true];};"; - w = 1 * GUI_GRID_CENTER_W; - h = 1 * GUI_GRID_CENTER_H; - }; - - class ObjectSynctext : RscText_taw { - idc = -1; - text = "Sync with view"; - x = .345; y = .596; - w = .35; h = .04; - }; - - class Manager:RscControlsGroup { - idc = MANAGER_GROUP; - - x = -0.21; y = .2; - w = .5; h = 3; - class Controls { - class SaveLoadGroup:RscControlsGroupNoScrollbars { - idc = SAVELOAD_GROUP; - - x = 0; - y = 0; - w = .5; - h = 3; - - class Controls { - class MyTitleBackground:RscText_taw { - colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; - idc = -1; - x = 0; - y = 0; - w = .5; - h = (1 / 25); - }; - - class Title : RscTitle { - colorBackround[] = { 0, 0, 0, 0 }; - idc = -1; - text = "Save Manager"; - x = 0; - y = 0; - w = .8; - h = (1 / 25); - }; - - class MainBackground:RscText_taw { - colorBackground[] = { 0, 0, 0, .7 }; - idc = -1; - x = 0; - y = 0 + (11 / 250); - w = .5; - h = .57 - (22 / 250); - }; - - class SaveList:RscListBox_taw { - idc = SAVES_LIST; - sizeEx = 0.04; - colorBackground[] = {0.1,0.1,0.1,0.9}; - x = 0; y = 0 + (11 / 250); - w = .5; h = .49 - (22 / 250); - - onLBSelChanged = "_this call TAWVD_fnc_onSaveSelectionChanged;"; - }; - - class SaveSlotName:VD_onFoot_Edit { - idc = SLOT_NAME; - text = "SAVE NAME"; - colorBackground[] = {0,0,0,0.6}; - onKeyUp = ""; - - x = .025; y = .42 + (11 / 250); - w = .45; - }; - - class SaveButton:RscButtonMenu { - text = "Save"; - onButtonClick = "[] call TAWVD_fnc_onSavePressed;"; - x = 0; - y = 0.57 - (1 / 25); - w = (6.25 / 40); - h = (1 / 25); - }; - - class HideButton:RscButtonMenu { - text = "Hide"; - onButtonClick = "((findDisplay 2900) displayCtrl 2999) ctrlSetFade 1; ((findDisplay 2900) displayCtrl 2999) ctrlCommit 0.3;"; - x = .16; - y = 0.57 - (1 / 25); - w = (6.25 / 40); - h = (1 / 25); - }; - }; - }; - }; - }; - }; + idd = MENU_IDD; + name = "TAW_VDMenu"; + movingEnabled = 0; + enableSimulation = 1; + + onLoad = "((_this select 0) displayCtrl 2999) ctrlSetFade 1; ((_this select 0) displayCtrl 2999) ctrlCommit 0;"; + + class controlsBackground { + class TitleBackground : RscText_taw { + colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; + idc = -1; + x = .3; + y = .2; + w = .5; + h = (1 / 25); + }; + + class MainBackground : RscText_taw { + colorBackground[] = { 0, 0, 0, .7 }; + idc = -1; + x = .3; + y = .2 + (11 / 250); + w = .5; + h = .57 - (22 / 250); + }; + + class Title : RscTitle { + colorBackround[] = { 0, 0, 0, 0 }; + idc = -1; + text = "View Settings (SCRIPT)"; + x = .3; + y = .2; + w = .8; + h = (1 / 25); + }; + + class OnFootText : RscText_taw { + idc = -1; + text = "Infantry:"; + x = .32; + y = .258; + w = .275; + h = .04; + }; + + class inCarText : OnFootText { + text = "Ground:"; + y = .305; + }; + + class inAirText : OnFootText { + text = "Air:"; + y = .355; + }; + + class ObjectText : OnFootText { + text = "Object:"; + y = .655; + }; + + class DroneText : OnFootText { + text = "Drone:"; + y = .405; + }; + + class TerrainBackground : TitleBackground { + text = "Grass Settings"; + shadow = 0; + y = .46; + }; + + class ObjectBackground : TitleBackground { + text = "Object Settings"; + y = .55; + }; + + class ButtonClose : RscButtonMenu { + idc = -1; + text = "Close"; + onButtonClick = "closeDialog 0;"; + x = 0.3; + y = 0.77 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + + class SaveManagerBtn:ButtonClose { + text = "Saves"; + onButtonClick = "[] call tawvd_fnc_openSaveManager;"; + x = .465; + }; + }; + + class controls { + + //Sliders + class VD_onFoot_slider : RscXSliderH { + idc = INFANTRY_SLIDER; + text = ""; + onSliderPosChanged = "[0, _this select 1] call TAWVD_fnc_onSliderChanged;"; + toolTip = "View Distance while on foot"; + x = .42; + y = .30 - (1 / 25); + w = "9 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + }; + + class VD_inCar_slider : VD_onFoot_slider { + idc = GROUND_SLIDER; + toolTip = "View distance while in a ground vehicle"; + onSliderPosChanged = "[1, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .35 - (1 / 25); + }; + + class VD_inAir_slider : VD_onFoot_slider { + idc = AIR_SLIDER; + toolTip = "View distance while in an aircraft"; + onSliderPosChanged = "[2, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .40 - (1 / 25); + }; + + class VD_Object_slider : VD_onFoot_slider { + idc = OBJECT_SLIDER; + toolTip = "Object rendering distance"; + onSliderPosChanged = "[3, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .7 - (1 / 25); + }; + + class VD_Drone_slider:VD_onFoot_slider { + idc = DRONE_SLIDER; + toolTip = "View distance while operating a UAV/UGV"; + onSliderPosChanged = "[4, _this select 1] call TAWVD_fnc_onSliderChanged;"; + y = .45 - (1 / 25); + } + + //Values (RscEdit Butons) + class VD_onFoot_Edit : RscEdit_taw { + idc = INFANTRY_EDIT; + text = ""; + onKeyUp = "[_this select 0, _this select 1, 'ground',true] call TAWVD_fnc_onChar;"; + + x = .7; + y = .258; + w = .08; + h = .04; + }; + + class VD_inCar_Edit : VD_onFoot_Edit { + idc = GROUND_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'vehicle',true] call TAWVD_fnc_onChar;"; + y = .31; + }; + + class VD_inAir_Edit : VD_onFoot_Edit { + idc = AIR_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'air',true] call TAWVD_fnc_onChar;"; + y = .36; + }; + + class VD_inDrone_Edit:VD_onFoot_Edit { + idc = DRONE_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'drone',true] call TAWVD_fnc_onChar;"; + y = .41; + }; + + class VD_Object_Edit : VD_onFoot_Edit { + idc = OBJECT_EDIT; + onKeyUp = "[_this select 0, _this select 1, 'object',true] call TAWVD_fnc_onChar;"; + y = .656; + }; + + //Grass Settings + class VD_terrain_none { + idc = TERRAIN_NONE; + type = 11; + style = 0; + font = "PuristaLight"; + color[] = { 1, 1, 1, 1 }; + colorActive[] = { 1, 0.2, 0.2, 1 }; + colorDisabled[] = {0, 0, 0, 1}; + soundEnter[] = { "\A3\ui_f\data\sound\onover", 0.09, 1 }; + soundPush[] = { "\A3\ui_f\data\sound\new1", 0.0, 0 }; + soundClick[] = { "\A3\ui_f\data\sound\onclick", 0.07, 1 }; + soundEscape[] = { "\A3\ui_f\data\sound\onescape", 0.09, 1 }; + text = "None"; + action = "['none'] call TAWVD_fnc_onTerrainChanged;"; + sizeEx = 0.04; + + x = .38; y = .505; + w = .275; h = .04; + }; + + class VD_terrain_low : VD_terrain_none { + idc = -1; + text = "Low"; + action = "['low'] call TAWVD_fnc_onTerrainChanged;"; + x = .47; + }; + + class VD_terrain_normal : VD_terrain_none { + idc = -1; + text = "Normal"; + action = "['norm'] call TAWVD_fnc_onTerrainChanged;"; + x = .56; + }; + + class VD_terrain_high : VD_terrain_none { + idc = -1; + text = "High"; + action = "['high'] call TAWVD_fnc_onTerrainChanged;"; + x = .67; + }; + + class ObjectSyncCheckbox : RscCheckbox + { + idc = 2931; + x = .32; y = .6; + tooltip = "Sync object rendering with view rendering"; + onCheckedChanged = "if((_this select 1) == 1) then {tawvd_syncObject = true;ctrlEnable [2941,false]; ctrlEnable [2942,false];} else {tawvd_syncObject = false; ctrlEnable [2942,true]; ctrlEnable [2941,true];};"; + w = 1 * GUI_GRID_CENTER_W; + h = 1 * GUI_GRID_CENTER_H; + }; + + class ObjectSynctext : RscText_taw { + idc = -1; + text = "Sync with view"; + x = .345; y = .596; + w = .35; h = .04; + }; + + class Manager:RscControlsGroup { + idc = MANAGER_GROUP; + + x = -0.21; y = .2; + w = .5; h = 3; + class Controls { + class SaveLoadGroup:RscControlsGroupNoScrollbars { + idc = SAVELOAD_GROUP; + + x = 0; + y = 0; + w = .5; + h = 3; + + class Controls { + class MyTitleBackground:RscText_taw { + colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" }; + idc = -1; + x = 0; + y = 0; + w = .5; + h = (1 / 25); + }; + + class Title : RscTitle { + colorBackround[] = { 0, 0, 0, 0 }; + idc = -1; + text = "Save Manager"; + x = 0; + y = 0; + w = .8; + h = (1 / 25); + }; + + class MainBackground:RscText_taw { + colorBackground[] = { 0, 0, 0, .7 }; + idc = -1; + x = 0; + y = 0 + (11 / 250); + w = .5; + h = .57 - (22 / 250); + }; + + class SaveList:RscListBox_taw { + idc = SAVES_LIST; + sizeEx = 0.04; + colorBackground[] = {0.1,0.1,0.1,0.9}; + x = 0; y = 0 + (11 / 250); + w = .5; h = .49 - (22 / 250); + + onLBSelChanged = "_this call TAWVD_fnc_onSaveSelectionChanged;"; + }; + + class SaveSlotName:VD_onFoot_Edit { + idc = SLOT_NAME; + text = "SAVE NAME"; + colorBackground[] = {0,0,0,0.6}; + onKeyUp = ""; + + x = .025; y = .42 + (11 / 250); + w = .45; + }; + + class SaveButton:RscButtonMenu { + text = "Save"; + onButtonClick = "[] call TAWVD_fnc_onSavePressed;"; + x = 0; + y = 0.57 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + + class HideButton:RscButtonMenu { + text = "Hide"; + onButtonClick = "((findDisplay 2900) displayCtrl 2999) ctrlSetFade 1; ((findDisplay 2900) displayCtrl 2999) ctrlCommit 0.3;"; + x = .16; + y = 0.57 - (1 / 25); + w = (6.25 / 40); + h = (1 / 25); + }; + }; + }; + }; + }; + }; }; diff --git a/source/taw_vd/defines.h b/source/taw_vd/defines.h index e75b7f9..02f92ef 100644 --- a/source/taw_vd/defines.h +++ b/source/taw_vd/defines.h @@ -11,12 +11,12 @@ #define DRONE_SLIDER 2951 #define DRONE_EDIT 2952 #define TERRAIN_NONE 2950 -#define GUI_GRID_CENTER_WAbs ((safezoneW / safezoneH) min 1.2) -#define GUI_GRID_CENTER_HAbs (GUI_GRID_CENTER_WAbs / 1.2) -#define GUI_GRID_CENTER_W (GUI_GRID_CENTER_WAbs / 40) -#define GUI_GRID_CENTER_H (GUI_GRID_CENTER_HAbs / 25) -#define GUI_GRID_CENTER_X (safezoneX + (safezoneW - GUI_GRID_CENTER_WAbs)/2) -#define GUI_GRID_CENTER_Y (safezoneY + (safezoneH - GUI_GRID_CENTER_HAbs)/2) +#define GUI_GRID_CENTER_WAbs ((safezoneW / safezoneH) min 1.2) +#define GUI_GRID_CENTER_HAbs (GUI_GRID_CENTER_WAbs / 1.2) +#define GUI_GRID_CENTER_W (GUI_GRID_CENTER_WAbs / 40) +#define GUI_GRID_CENTER_H (GUI_GRID_CENTER_HAbs / 25) +#define GUI_GRID_CENTER_X (safezoneX + (safezoneW - GUI_GRID_CENTER_WAbs)/2) +#define GUI_GRID_CENTER_Y (safezoneY + (safezoneH - GUI_GRID_CENTER_HAbs)/2) #define ST_LEFT 0x00 #define ST_MULTI 0x10 #define SEL(ARRAY,INDEX) (ARRAY select INDEX) From 78aa0f4b2fdf6ef985d6b3e89424dd84ad0735f4 Mon Sep 17 00:00:00 2001 From: Freddo Date: Mon, 22 Oct 2018 21:53:03 +0200 Subject: [PATCH 03/17] Cleaned up spaces --- source/DUWS_CONFIG.sqf | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/source/DUWS_CONFIG.sqf b/source/DUWS_CONFIG.sqf index 5d19675..524dc53 100644 --- a/source/DUWS_CONFIG.sqf +++ b/source/DUWS_CONFIG.sqf @@ -1,33 +1,33 @@ // DUWS-R Config -DUWS_Version = "0.7.0"; //Do not touch +DUWS_Version = "0.7.0"; //Do not touch // Blufor Faction -Blufor_Faction = "BLU_F"; +Blufor_Faction = "BLU_F"; // Blufor Soldiers -Blufor_Officer = "B_officer_F"; -Blufor_Squadleader = "B_Soldier_SL_F"; -Blufor_Teamleader = "B_Soldier_TL_F"; -Blufor_Medic = "B_medic_F"; +Blufor_Officer = "B_officer_F"; +Blufor_Squadleader = "B_Soldier_SL_F"; +Blufor_Teamleader = "B_Soldier_TL_F"; +Blufor_Medic = "B_medic_F"; Blufor_Engineer = "B_engineer_F"; Blufor_Rifleman = "B_Soldier_F"; -Blufor_Rifleman_Light = "B_Soldier_lite_F"; -Blufor_Rifleman_AT = "B_Soldier_LAT_F"; +Blufor_Rifleman_Light = "B_Soldier_lite_F"; +Blufor_Rifleman_AT = "B_Soldier_LAT_F"; Blufor_Marksman = "B_soldier_M_F"; -Blufor_Recon_Scout = "B_recon_F"; -Blufor_Grenadier = "B_Soldier_GL_F"; +Blufor_Recon_Scout = "B_recon_F"; +Blufor_Grenadier = "B_Soldier_GL_F"; Blufor_Autorifleman = "B_soldier_AR_F"; -Blufor_HeavyGunner = "B_HeavyGunner_F"; -Blufor_AT_Specialist = "B_soldier_AT_F"; -Blufor_AA_Specialist = "B_soldier_AA_F"; -Blufor_Pilot = "B_pilot_F"; -Blufor_Heli_Pilot = "B_Helipilot_F"; -Blufor_Crewman = "B_crew_F"; -Blufor_Repair_Specialist = "B_soldier_repair_F"; -Blufor_diver = "B_diver_F"; -Blufor_sniper = "B_sniper_F"; -Blufor_spotter = "B_spotter_F"; +Blufor_HeavyGunner = "B_HeavyGunner_F"; +Blufor_AT_Specialist = "B_soldier_AT_F"; +Blufor_AA_Specialist = "B_soldier_AA_F"; +Blufor_Pilot = "B_pilot_F"; +Blufor_Heli_Pilot = "B_Helipilot_F"; +Blufor_Crewman = "B_crew_F"; +Blufor_Repair_Specialist = "B_soldier_repair_F"; +Blufor_diver = "B_diver_F"; +Blufor_sniper = "B_sniper_F"; +Blufor_spotter = "B_spotter_F"; Blufor_Explosive_Specialist = "B_soldier_exp_F"; // Blufor Purchasable Units From 86c9f7db1d79d1e07d6d42d58c267a93a62951bf Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Tue, 28 May 2019 16:59:14 +0200 Subject: [PATCH 04/17] Fixed binarized files Accidentally got caught when replacing tabs with spaces --- source/mission.sqm | Bin 19395 -> 20546 bytes source/mission.sqm.oldBackup | 530 ----------------------------------- source/rtipic.paa | Bin 260641 -> 257635 bytes 3 files changed, 530 deletions(-) delete mode 100644 source/mission.sqm.oldBackup diff --git a/source/mission.sqm b/source/mission.sqm index baf59cd3112ad34c86b6de88652239f33cf921eb..3ffe2302b1f7209d70273f7b83d6712e01a35ba4 100644 GIT binary patch literal 20546 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