Scripts Latest Topicshttps://exile.majormittens.co.uk/forum/162-scripts/Scripts Latest TopicsenFlag Hacking 1.0.4https://exile.majormittens.co.uk/topic/25956-flag-hacking-104/ Made yesterday. It utilizes CfgExileDelayedActions for optimal performance (like exile does it).
If the hack succeeds it picks a random vehicle and takes it out of the garage. I'm too lazy to give my fix claimVehicleOwnership but if you feel like it, you can fix it and submit a pull request/ do whatever.

https://github.com/Cloudhax23/Exile/tree/master/FlagHacking

Anything named compile needs to be compiled with missionNamespace. Pretty much add stuff to your configs. (someone else can make an install guide).
Credits: Exile

]]>
25956Sat, 17 Mar 2018 16:08:46 +0000
[RELEASE] LIVE SCOREBOARDShttps://exile.majormittens.co.uk/topic/26555-release-live-scoreboards/ LIVE SCOREBOARDS

Hey guys this is my first release for Exile Mod. I was not sure where to put it but i think scripts is the correct sub section. This is a server side script that allows you to put live scoreboards in Exile. You can use it to also put custom messages but you will have to figure out how to do that yourself. I have made a GitHub repository so please feel free to contribute,  report bugs or fork it and do as you please with it. The installation instructions are on the GitHub page and all the info regarding the script will be updated there.

GitHub Repository : https://github.com/ivaylosp/message_boards

message_board.jpgscoreboard.jpg

]]>
26555Wed, 06 Jun 2018 22:54:21 +0000
Persistence Infection FIX for RZInfectionhttps://exile.majormittens.co.uk/topic/27776-persistence-infection-fix-for-rzinfection/ Here is a fix for Persistence Infection if you use the RZInfection MOD.
Please just Copy and Paste this File.

Spoiler

/**
 * ExileServer_object_player_database_load
 *
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * Modified by DirtySanchez @ DonkeyPunch.INFO
 * RZI Persistence Code
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_data","_oldPlayerObject","_playerUID","_sessionID","_position","_direction","_player","_clanID","_clanName","_clanData","_clanGroup","_devFriendlyMode","_devs","_requestingPlayer","_bambiPlayer","_headgear","_goggles","_binocular","_primaryWeapon","_handgunWeapon","_secondaryWeapon","_currentWeapon","_uniform","_vest","_backpack","_uniformContainer","_vestContainer","_backpackContainer","_assignedItems"];
_data = _this select 0;
_oldPlayerObject = _this select 1;
_playerUID = _this select 2;
_sessionID = _this select 3;
_name = name _oldPlayerObject;
_position = [_data select 11, _data select 12, _data select 13];
_direction = _data select 10;
_player = (createGroup independent) createUnit ["Exile_Unit_Player", _position, [], 0, "CAN_COLLIDE"];
_player setDir _direction;
_player setPosATL _position;
_player disableAI "FSM";
_player disableAI "MOVE";
_player disableAI "AUTOTARGET";
_player disableAI "TARGET";
_player disableAI "CHECKVISIBLE";
_clanID = (_data select 42);
_clanName = (_data select 43);
if !((typeName _clanID) isEqualTo "SCALAR") then
{
    _clanID = -1;
    _clanData = [];
}
else
{
    _clanData = missionnamespace getVariable [format ["ExileServer_clan_%1",_clanID],[]];
    if(isNull (_clanData select 5))then
    {
        _clanGroup = createGroup independent;
        _clanData set [5,_clanGroup];
        _clanGroup setGroupIdGlobal [_clanData select 0];
        missionNameSpace setVariable [format ["ExileServer_clan_%1",_clanID],_clanData];
    }
    else
    {
        _clanGroup = (_clanData select 5);
    };
    [_player] joinSilent _clanGroup;
};
_player setDamage (_data select 3);
_player setName _name;
_player setVariable ["ExileMoney", (_data select 38), true];
_player setVariable ["ExileScore", (_data select 39)];
_player setVariable ["ExileKills", (_data select 40)];
_player setVariable ["ExileDeaths", (_data select 41)];
_player setVariable ["ExileClanID", _clanID];
_player setVariable ["ExileClanData", _clanData];
_player setVariable ["ExileName", _name]; 
_player setVariable ["ExileOwnerUID", _playerUID]; 
_player setVariable ["ExileDatabaseID", _data select 0];
_player setVariable ["ExileHunger", _data select 4];
_player setVariable ["ExileThirst", _data select 5];
_player setVariable ["ExileAlcohol", _data select 6]; 
_player setVariable ["ExileTemperature", _data select 44]; 
_player setVariable ["ExileWetness", _data select 45]; 
_player setVariable ["ExileIsBambi", false];
_player setVariable ["ExileXM8IsOnline", false, true];
_player setOxygenRemaining (_data select 7);
_player setBleedingRemaining (_data select 8);
_player setVariable ["ExileLocker", (_data select 46), true];
[_player, _data select 9] call ExileClient_util_player_applyHitPointMap;
_devFriendlyMode = getNumber (configFile >> "CfgSettings" >> "ServerSettings" >> "devFriendyMode");
if (_devFriendlyMode isEqualTo 1) then 
{
    _devs = getArray (configFile >> "CfgSettings" >> "ServerSettings" >> "devs");
    {
        if ((getPlayerUID _requestingPlayer) isEqualTo (_x select 0))exitWith 
        {
            if((name _requestingPlayer) isEqualTo (_x select 1))then
            {
                _bambiPlayer setVariable ["ExileMoney", 500000, true];
                _bambiPlayer setVariable ["ExileScore", 100000];
            };
        };
    }
    forEach _devs;
};
_player call ExileClient_util_playerCargo_clear;
_headgear = _data select 23;
if (_headgear != "") then
{
    _player addHeadgear _headgear;
};
_goggles = _data select 20;
if (_goggles != "") then
{
    _player addGoggles _goggles;
};
_binocular = _data select 24;
if (_binocular != "") then
{
    _player addWeaponGlobal _binocular;
};
_primaryWeapon = _data select 26;
if (_primaryWeapon != "") then 
{
    _player addWeaponGlobal _primaryWeapon;
    removeAllPrimaryWeaponItems _player;
    { 
        if (_x != "") then
        {
            _player addPrimaryWeaponItem _x; 
        };
    } 
    forEach (_data select 27);
};
_handgunWeapon = _data select 22;
if (_handgunWeapon != "") then
{
    _player addWeaponGlobal _handgunWeapon;
    removeAllHandgunItems _player;
    { 
        if (_x != "") then
        {
            _player addHandgunItem _x; 
        };
    } 
    forEach (_data select 21);
};
_secondaryWeapon = _data select 28;
if (_secondaryWeapon != "") then
{
    _player addWeaponGlobal _secondaryWeapon;
    { 
        if (_x != "") then
        {
            _player addSecondaryWeaponItem _x; 
        };
    } 
    forEach (_data select 29);
};
 _currentWeapon = _data select 19;
if (_currentWeapon != "") then
{
     _player selectWeapon _currentWeapon;
};

    _player addWeaponItem [_x select 0, [_x select 1, _x select 2, _x select 3]];

forEach (_data select 25);
_uniform = _data select 30;
_vest = _data select 34;
_backpack = _data select 15;
if (_uniform != "") then 
{
    _player forceAddUniform _uniform;
};
if (_vest != "") then
{
    _player addVest _vest;
};
if (_backpack != "") then
{
    _player addBackpackGlobal _backpack;
};
_uniformContainer = uniformContainer _player;
if !(isNil "_uniformContainer") then
{
    { 
        _uniformContainer addWeaponCargoGlobal _x; 
    } 
    forEach (_data select 33);
    { 
        _uniformContainer addMagazineAmmoCargo [_x select 0, 1, _x select 1]; 
    } 
    forEach (_data select 32);
    { 
        _uniformContainer addItemCargoGlobal _x; 
    } 
    forEach (_data select 31);
};
_vestContainer = vestContainer _player;
if !(isNil "_vestContainer") then
{
    { 
        _vestContainer addWeaponCargoGlobal _x; 
    } 
    forEach (_data select 37);
    { 
        _vestContainer addMagazineAmmoCargo [_x select 0, 1, _x select 1]; 
    } 
    forEach (_data select 36);
    { 
        _vestContainer addItemCargoGlobal _x; 
    } 
    forEach (_data select 35);
};
_backpackContainer = backpackContainer _player;
if !(isNil "_backpackContainer") then
{
    { 
        _backpackContainer addWeaponCargoGlobal _x; 
    } 
    forEach (_data select 18);
    { 
        _backpackContainer addMagazineAmmoCargo [_x select 0, 1, _x select 1]; 
    } 
    forEach (_data select 17);
    { 
        _backpackContainer addItemCargoGlobal _x; 
    } 
    forEach (_data select 16);
};
_assignedItems = _data select 14;
if !(_assignedItems isEqualTo []) then
{
    {
        _player linkItem _x;
    }
    forEach _assignedItems;
};
_player addMPEventHandler ["MPKilled", {_this call ExileServer_object_player_event_onMpKilled}];
if (getNumber (configFile >> "CfgSettings" >> "VehicleSpawn" >> "thermalVision") isEqualTo 0) then 
{
    _player addEventHandler ["WeaponAssembled", {(_this select 1) disableTIEquipment true;}];
};

//RZ Infection Persistence Block
_rziData = format ["getInfection:%1", _player getVariable["ExileOwnerUID",""]] call ExileServer_system_database_query_selectSingle;
_infection = parsenumber (_rziData select 0);
diag_log format ["_infection Type: %1, _infection value: %2",(typeName _infection),_infection];

_player setVariable ["ryanzombiesinfected", _infection, true];
if(_infection > 0)then {
 [_player, RESISTANCE] execVM "\rzinfection\code\infection.sqf";
};

[
    _sessionID, 
    "loadPlayerResponse", 
    [
        (netId _player),
        str (_player getVariable ["ExileScore", 0]),
        (_player getVariable ["ExileKills", 0]),
        (_player getVariable ["ExileDeaths", 0]),
        (_player getVariable ["ExileHunger", 100]),
        (_player getVariable ["ExileThirst", 100]),
        (_player getVariable ["ExileAlcohol", 0]),
        (_player getVariable ["ExileClanData", []]),
        (_player getVariable ["ExileTemperature", 0]),
        (_player getVariable ["ExileWetness", 0])
    ]

call ExileServer_system_network_send_to;
[_sessionID, _player] call ExileServer_system_session_update;
true

Cheers and Best Regards

]]>
27776Thu, 11 Apr 2019 11:51:22 +0000
<![CDATA[[RELEASE] Anomaly & Creatures Pack by Alias]]>https://exile.majormittens.co.uk/topic/26451-release-anomaly-creatures-pack-by-alias/ Anomaly & Creatures Pack by Alias

modified for Arma3 Exile by @aussie battler

If you like this script please support Alias: Become a Patron https://www.patreon.com/aliascartoons

Donate a dollar or two to Alias & keep more mods coming https://goo.gl/ySqv9q

Original scripts can be found here: https://steamcommunity.com/sharedfiles/filedetails/?id=1123074587

Shout out to @kuplion who gave me the idea to add random objects & smoke into these missions.
20180519222528_1.jpg

About this script:

The script places random ToXic field missions on any map with soldiers & anomaly creatures protecting a loot crate. The four creatures are Farty, STRIGOI, Sparky & the Screamer. All creatures can be destroyed with explosives, under-barrel launchers or grenades. It is very easy to install.

Farty is a smelly green slug creature that appears from the ground to spit toXic goo on it's enemies. https://goo.gl/FSK7WV

Sparky is at every mission protecting the loot crate. It creates electrical shock waves when someone comes to collect the reward. https://goo.gl/zmJrnL

The Screamer is an ancient statue that screams sonic waves at it's enemies. https://goo.gl/Pw6KuQ

STRIGOI a spectre that runs at lightening speeds with the abilty to jump into tree tops for cover. https://goo.gl/cEZcp6

Flamer a fire demon that shoots fire balls and sets the ground of it's enemies on fire. https://goo.gl/ZKM1CH

The soldiers guarding the mission include up to 4 guards, two static guns and an armed vehicle. The loot in the crate includes a variety of Exile items plus $500 to $20000 poptabs.

Requirements You must have Exile, Dms & Occupation installed for this to work.
Exile http://exile.majormittens.co.uk/downloads/
Exile Dms mission System by @Defent: https://goo.gl/R8xjns
Exile Occupation by @second_coming: https://goo.gl/YJjKjW
Edit files with https://notepad-plus-plus.org/download/v7.5.6.html

Install

Download & instructions here: https://github.com/aussie-battler/Alias-Anomaly-Creatures

Exile mission file -

  1. Unpack your mission file and drop the folders Al_Farty, Al_screamer, Al_spark & sound in your mission default directory.
  2. Edit your description.ext and and add the following:
Spoiler

class CfgSounds
{
#include "sound\sound_farty\sound.hpp"
#include "sound\sound_screamer\sound.hpp"
#include "sound\sound_sparky\sound.hpp"
#include "sound\sound_strigoi\sound.hpp"
#include "sound\sound_flamer\sound.hpp"
};

If you already have a class CfgSounds just add these lines to it:

Spoiler

#include "sound\sound_farty\sound.hpp"
#include "sound\sound_screamer\sound.hpp"
#include "sound\sound_sparky\sound.hpp"
#include "sound\sound_strigoi\sound.hpp"
#include "sound\sound_flamer\sound.hpp"
  1. Repack your mission file & that bit is done.

     a3_exile_occupation -

  1. Open @ExileServer\addons\a3_exile_occupation\config.sqf and:
  • Just below"SC_occupyHeliCrashes = true; // true if you want to have Dayz style helicrashes. Paste in the Fart Setup (ToXic Slug), Screamer Setup & Spectre Setup (Strigoi) code.
  • Turn off Anomalies by setting the first line in each section to false. You can also configure each anomaly to your liking.
Spoiler

SC_Screamer             = true;        // true if you want Alias Screamer
SC_occupyScreamerStatic         = false;       // true if you want to have random loot crates spawn in pre-defined locations set in SC_occupyLootCratesLocations
SC_occupyScreamerLocations    = [
                                    [1000,1000,0],
                                    [2000,2000,0],
                                    [3000,3000,0],
                                    [4000,4000,0]
                                ];
SC_SpawnScreamerGuards            = true;        // true if you want to enable AI guards
SC_numberofScreamers                   = 2;     // if SC_Screamer = true spawn this many Screamer missions (overrided below for Namalsk)
SC_ScreamerCrateGuards              = 4;     // number of AI to spawn at each crate
SC_ScreamerCrateGuardsRandomize     = true;  // Use a random number of guards up to a maximum = SC_LootCrateGuards (so between 1 and SC_LootCrateGuards)
SC_occupyScreamerMarkers        = true;     // true if you want to have markers on the loot crate spawns

SC_ScreamerRopeAttach                   = false;   // Allow lootcrates to be airlifted (for SC_occupyLootCrates and SC_occupyHeliCrashes)

 

 

Change the loot gear by searching for SC_LootCrateItems, here is mine:
 

Spoiler

SC_LootCrateItems           	= [
                                    ["Exile_Melee_Axe",1,0],
                                    ["Exile_Item_GloriousKnakworst",1,2],
                                    ["Exile_Item_PlasticBottleFreshWater",1,2],
                                    ["Exile_Item_Knife",5,1],
                                    ["Exile_Item_BaseCameraKit",0,2],
                                    ["Exile_Item_InstaDoc",1,3],
                                    ["Exile_Item_Matches",1,0],
                                    ["Exile_Item_CookingPot",1,0],                      
                                    ["Exile_Item_MetalPole",1,0],
                                    ["Exile_Item_CodeLock",1,2],
                                    ["Exile_Item_FuelCanisterEmpty",1,0],
                                    ["Exile_Item_WoodPlank",0,8],
                                    ["Exile_Item_woodFloorKit",0,2],
                                    ["Exile_Item_WoodWindowKit",0,1],
                                    ["Exile_Item_WoodDoorwayKit",0,1],
                                    ["Exile_Item_WoodFloorPortKit",0,2],   
                                    ["Exile_Item_Laptop",0,1],
                                    ["Exile_Item_CodeLock",0,1],
				    ["Exile_Item_Cement",2,10],
				    ["Exile_Item_Sand",2,10],
				    ["Exile_Item_MetalWire",1,5],
      				    ["Exile_Item_WaterCanisterEmpty",0,2],
				    ["Exile_Item_Shovel",0,1],
				    ["Exile_Item_SafeKit",1,2],
				    ["H_PilotHelmetFighter_O",0,1],						  
				    ["Exile_Item_MetalScrews",0,5]
                            ];   
  1. Drop the files deleteMapMarkers.sqf, occupationFarty.sqf, occupationScreamer.sqf, occupationFlamer, startOccupation.sqf into your @ExileServer\addons\a3_exile_occupation\scripts folder.
  2. Add this to your mission's initserver:      
Spoiler

#include "AL_flamer\functions_flame.hpp"

 

     JOB DONE, sit back and have a beer.

 

      Optional Mods

  • Change the soldier's uniform in occupationFarty.sqf & occupationScreamer.sqf
Spoiler

	_customGearSet =
				[
					"srifle_DMR_05_blk_F",
					["muzzle_snds_93mmg","optic_AMS","bipod_01_F_blk"],
					[["10Rnd_93x64_DMR_05_Mag",6],["Titan_AT",2]],          
					"",
					[""],
					["Rangefinder","ItemGPS"],
					"launch_O_Titan_short_ghex_F",
					"H_PilotHelmetFighter_B",  //helmet (leave this, it is the protection against Sparky's damage)
					"U_I_Protagonist_VR",   //the ai uniform (green VR Suit for added effect)
					"V_PlateCarrierIAGL_dgtl", //vest
					"B_Carryall_ghex_F"  //backpack
				];
Spoiler

_box setVariable ["ExileMoney", (5000 + round (random (20000))),true];//Adds between $5K to $20K in poptabs to the loot crate

          in occupationFarty.sqf & occupationScreamer.sqf

  • I have shown an example in initserver.sqf of how to start the missions at night.

20180519231907_1.jpg20180520234416_2.jpg20180519231141_1.jpg

 

UPDATES:

25.05.18

+ Thanks to @VipWip we now have no spamming in the logs. You will need to update your screamer file here:

https://github.com/aussie-battler/Alias-Anomaly-Creatures/blob/master/Exile.Mission/AL_screamer/screamer.sqf

+ Sparky now deals damage, you need to update this file:

https://github.com/aussie-battler/Alias-Anomaly-Creatures/blob/master/Exile.Mission/AL_spark/al_orb_move.sqf

+ Make a Radiation Field at the mission. Thanks to the idea from @ItsDutch you can now make the ToXic field a radiation zone. You will need to wear a gas mask to enter the zone.
1. @ExileServer_Lingor\addons\a3_exile_occupation\scripts\occupationFarty.sqf
change lines 43 to 50:

Spoiler

    if (SC_occupyLootCratesMarkers) then
    {        
        _event_marker = createMarker [ format ["Toxic_%1", _i], _position];
        _event_marker setMarkerColor "ColorGreen";
        _event_marker setMarkerAlpha 1;
        _event_marker setMarkerText "Toxic Weed Crop";
        _event_marker setMarkerType "ExileContaminatedZoneIcon";
        _event_marker2 = createMarker [ format ["ToxicCircle_%1", _i], _position];
        _event_marker2 setMarkerAlpha 1;
        _event_marker2 setMarkerType "ExileContaminatedZone";
        _event_marker2 setMarkerSize [150, 150];
        _event_marker2 setMarkerShape "ELLIPSE";        
        _event_marker2 setMarkerColor "ColorGreen";
        _event_marker2 setMarkerBrush "Border";
    };   

2. @ExileServer_Lingor\addons\a3_exile_occupation\scripts\occupationScreamer.sqf
change lines 43 to 50:

Spoiler

    if (SC_occupyLootCratesMarkers) then
    {        
        _event_marker = createMarker [ format ["Screamer_%1", _i], _position];
        _event_marker setMarkerColor "ColorGreen";
        _event_marker setMarkerAlpha 1;
        _event_marker setMarkerText "Screamer";
        _event_marker setMarkerType "ExileContaminatedZoneIcon";
        _event_marker2 = createMarker [ format ["ScreamerCircle_%1", _i], _position];
        _event_marker2 setMarkerAlpha 1;
        _event_marker2 setMarkerType "ExileContaminatedZone";
        _event_marker2 setMarkerSize [150, 150];
        _event_marker2 setMarkerShape "ELLIPSE";        
        _event_marker2 setMarkerColor "ColorGreen";
        _event_marker2 setMarkerBrush "Border";
    };   

3. In Exile.mission\config.cpp

Spoiler

        class Radiation 
        {
            // 1 = enabled, 0 = disabled
           enable = 1;

         };

UPDATE 30.05.18

  • Added a new Alias Anomaly, Strigoi. 
  • Added a the ability to turn Anomalies on/off in @ExileServer\addons\a3_exile_occupation\config.sqf
  • Cleaned up the sound folder so you can delete sounds to Anomalies that you don't want to use.
  • Made it easier to see which anomaly is loading up in the logs.
  • Sparky now deals damage, players can wear / have a protective item to avoid it. The protection is defined in Exile.Mission\\AL_spark\al_orb_move.sqf in line 6:

         obj_prot_sparky = "H_PilotHelmetFighter_B";  // I set it to the helmet worn by the mission ai.

 

20180529013425_1.jpg

 

       Update 5.06.18

  • Configured an easy setup for each Anomaly in:    @ExileServer\addons\a3_exile_occupation\config.sqf

  • Added toast success hint at the end of each misison. Configure it here:  @ExileServer\addons\a3_exile_occupation\scripts\deleteMapMarkers.sqf

  • Anomalies wont depawn when the map marker deletes (except for Farty). I extended the player detection range for Farty so you can't run in & delete the map marker (removing the Farty Slug). 

 

 

20180605040835_1.jpg

20180605040854_1.jpg

Updates 26.11.18

Randomly spawn one of the Anomaly missons on each server restart found in: @ExileServer\addons\a3_exile_occupation\startOccupation.sqf

Spoiler

_script = [1,4] call BIS_fnc_randomInt;  

switch (_script) do
{
  case 1 : { [] execVM "\x\addons\a3_exile_occupation\scripts\occupationScreamer.sqf"; };
  case 2 : { [] execVM "\x\addons\a3_exile_occupation\scripts\occupationSpectre.sqf"; };
  case 3 : { [] execVM "\x\addons\a3_exile_occupation\scripts\occupationFarty.sqf"; };
  case 4 : { [] execVM "\x\addons\a3_exile_occupation\scripts\occupationFlamer.sqf"; };
};

  • Added toast messages at the start of each misison. Configure it here:
  • @ExileServer\addons\a3_exile_occupation\scripts occupationFarty.sqf, occupationFlamer.sqf, occupationScreamer.sqf, occupationSpectre.sqf.

  • Changed the sparky code to deal damage if you dont wear the protective helmet.

  • Added the Flamer mission.

68747470733a2f2f63646e2e646973636f726461

68747470733a2f2f676f6f2e676c2f7443464837

]]>
26451Tue, 22 May 2018 09:48:11 +0000
[RELEASE] DAPE: Dynamic Air Patrol Event (Updated to 1.4)https://exile.majormittens.co.uk/topic/27840-release-dape-dynamic-air-patrol-event-updated-to-14/ Dynamic Air Patrol Event:

This script creates an air patrol event in which a random plane is spawned, flies around for a few minutes before an interceptor launches and chases the patrol.  Once down, a Quick Reaction Force chopper launches to search for survivors and secure the site.  This is the base mission from @John.  It has been modified to run until it successfully launches a rescue mission, has been optimized to reduce impact on performance, and had several issues corrected that were causing some problems.  Also added in the ability to customize for your specific content (easy to change out patrols, interceptors, and loot helis), new AI logic, some special effects and a few other features.  Enjoy! 

Features

- Highly customizable, you can modify it to use any content

- Randomized content, different mission and experience every time.

- Cool way to offer heli’s as loot

     (Version 1.4)

    - Added code to reset if rescue heli is shot down
    - Added option to protect rescue heli until it lands
    - Added option to run without Exile
    - Added delay before QRF launches
    - Minor code corrections 

     (Version 1.3)
    - Helicopter is now only persistent after someone jumps in
    - Script will now pause until a player joins the server
    - Debug is now on by default to verify its working 

    (Version 1.2)
    - Added option to turn off interceptor
    - Added random amounts of cash (poptabs) to AI
    - Added option to make helicopter persistent vehicle with code
    - If not persistent, Vehicle Claim Script should work for most vehicles
    (Version 1.1)
    - Script will now auto clean markers and old mission site once a player jumps in the helicopter
    - Script now runs continuously 
    - Optimized some code
    (Version 1.0)
    - Offers a highly randomized mission and experience
    - Can be easily customized for any custom content or equipment/vehicle mod
    - Should work on any map

 

Link to GitHub <=- Download from here

Installation

1. Copy the folder "DAPE" to the root of your mission folder (ex. Exile.Altis)
2. Edit your init.sqf in the root of your mission folder and add the following line to the bottom:

[] execVM "DAPE\DAPE.sqf";   // Dynamic Air Patrol Mission

Re-PBO your mission file and you're good to go.

 

Credits: Thanks to @John  for his "Dynamic Air Patrol / Interceptor Event" script.  This was the original inspiration and the basis for this code.

IF YOU USE MY SCRIPTS:  Please post a cool screenshot and where you are in the world, I’m always curious who actually plays with these little toys I make.

]]>
27840Sun, 12 May 2019 07:06:28 +0000
Enhanced Movement Mod in Exile (Working!)https://exile.majormittens.co.uk/topic/17664-enhanced-movement-mod-in-exile-working/ Hi all,

First of all, i'd like to express my thanks to this forum for helping our group setup and modify our server! So i'd like to give this to guys as a thanks! Apologies if this causes any adverse affects to any games but it's a starting off point i suppose.

For awhile I've been trying to get BadBenson's Arma Enhanced Movement mod working (great mod by the way, very well made) with Exile, it took some doing but I found that the Arma Enhanced Movement mod uses 'onEachFrame'. In the Arma documentation for onEachFrame (https://community.bistudio.com/wiki/onEachFrame), a member called neokika (thank you so much for that comment!)  left a comment which stated:

onEachFrame {}; //Reset event

I searched the exile files and found that, ExileClient_system_thread_initialize.sqf, has this exact line in. So I commented out the line and overridden the file in my mission file. After resolving a few BattleEye filters it worked like a charm! Has been tested on Altis and Tanoa, with a vanilla build and with a load of mods.

How to get it working on your server

1) Find your 'ExileClient_system_thread_initialize.sqf' in '@Exile' > 'addons' > 'exile_client.pbo' > 'code'. This can be the file on your server or locally (just make sure its the latest).

2) Download your mission file from your server you are currently using. This will be found in the 'mpmissions' folder, it will be called something liek 'Exile.Tanoa.pbo' or 'Exile.Altis.pb. Unpack the .pbo and head inside the newly created folder.

3) Inside the extracted folder, create another folder called 'Overrides', and place a copy of the 'ExileClient_system_thread_initialize.sqf' inside of it.

4) Open 'ExileClient_system_thread_initialize.sqf' which is inside the 'Overrides' folder with a text editor and comment out the the "onEachFrame = {};" line.

5) Then open your missions config.cpp and search for "CfgExileCustomCode" and add this line:

ExileClient_system_thread_initialize = "Overrides\ExileClient_system_thread_initialize.sqf";

6) Save your changes and re-package your mission file into a .pbo and upload it to your server.

So now, it wont be resetting the onEachFrame event, allowing the ArmaEnhancedMovement mod to run. Hooray!

7) Now, you may want to enter all of these BattleEye restrictions into your script.txt. These are the ones I was hit with when I tried to run the mod, or attempted to jump:

Spoiler

(Restriciton #13, enter it on line #15)
!="fnc_command_ab","BABE_CORE_fnc_command_abc","BABE_CORE_fnc_addaction","BABE_CORE_fnc_switchMove","BABE_CORE_fnc_movein","BABE_CO" 
(Restriction #0, enter it on line #2)
!="e_keyhandlersaver") then \n{\n(findDisplay 46) displayRemoveEventHandler ['KeyDown', babe_core_keyhandlersaver];\n};\n\nbabe_core_key" 
(Restriction #15, enter it on line #17)
!=" [];\n\nbabe_core_escM_mousepos = [];\n\n\n\n["BABE_MAINLOOP", "onEachFrame", \n{\nprivate ["_i"];\n\nfor "_i" from 0 to (count babe_core_"
(Restriction #21, enter it on line #23)
!="= _EH select 8;\n\n\nif (_delay == -1 or diag_tickTime - (call compile (_id+"_timer")) >= _delay) then \n{\ncall compile (_id + "_tim" 
(Restriction #7, enter it on line #9)
!="call babe_fd_fnc_init_fd;\n\n\nbabe_em_help = "babe_helper" createVehicleLocal [0,0,0];\n\nbabe_em_debug_a = "Sign_Arrow_Green_F" cre" 
(Restriction #25, enter it on line #27)
!="oneachframe", "onpreloadstarted", "onpreloadfinished", "onmapsingleclick", "onplayerconnected", "onplayerdisconnected"];\n\n\nif !(" 
(Restriction #40, enter it on line #42)
!=" "oneachframe" : { onEachFrame { ["oneachframe"] call BIS_fnc_executeStackedEventHandler; }; };\ncase "onpreloadstarted" : { onPr" 
(Restrcition #2, enter it on line #4)
!=" [];\n\n_menuW = 3.5;\n_menuH = 4;\n\n\n_ctrlbg = findDisplay 49 ctrlCreate ["BABE_CORE_Listbg", 21251327];\n_ctrl = findDisplay 49 ctr" 
(Restriction #14, enter it on line #16)
!="then\n{\n_obj = (_int select 0) select 3;\n\nif (EM_debug) then\n{\ndrawLine3D [_posa, _posb, [1,0,0,1]];\n};\n\n_testpos = (_int select " 

8) Subscribe to BadBenson's Arma Enhanced Movement mod on the steam workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=333310405&searchtext=Enhanced).

9) Find the mod directory locally on your PC, and upload the mod folder to your server, ensuring there are no spaces in the folder name. Don't forget to copy the keys over to your servers 'keys' folder.

10) Add the Arma Enhanced Movement mod to your servers mod parameters (i added my to both the -serverMod and -mods parameters to ensure all clients joined with it).

11) Restart your server.

Clients only need to subscribe to the Arma Enhanced Movement mod on the steam workshop, and ensure they have it loaded before joining the server. If all goes well, users should be able to see the mod's menu when they hit escape.

This was everything I needed on an Exile vanilla server to get Arma Enhanced Movement mod working. I got this working on two servers, one running only Exile, the other running Exile and a plethora of mods (Advanced towing, Rappelling, Ryanzombies, CUP vehicles, units and weapons, dms missions).

Apologies if this has an adverse affect on Exile I have overlooked, but I have had no issues on our server so far (please say something if it has).

I hope this works for other users like it did for me, as I have seen a lot of people struggling to get this working.

Here's a video of it working in our server:

Here is the vanilla Exile.Tanoa file i used:

http://www.filedropper.com/exileenhancedmovement

All the best,

Nome.

]]>
17664Sat, 20 Aug 2016 11:13:42 +0000
[RELEASE] Random Starting Loadouts/Uniformshttps://exile.majormittens.co.uk/topic/14433-release-random-starting-loadoutsuniforms/ Nope.

]]>
14433Wed, 25 May 2016 11:41:55 +0000
[Release] Sell Crates to Waste Dumphttps://exile.majormittens.co.uk/topic/22604-release-sell-crates-to-waste-dump/ This will allow you to sell a crate (or the contents of the crate) directly to the waste dump trader. How your players get the crate to the trader depends on how you have your server setup. To get crates to the trader, you can use Advanced Sling Loading, IgiLoad, R3F, etc.. It does not matter how you get the crate to the trader. What does matter, is that once it is there, it cannot be attached to anything to be detected by the Waste Dump trader. This was done to prevent players from selling someone else's crate before it is even unloaded from a truck or dropped from a helicopter. Once unloaded or dropped, anyone will be able to sell the crate to the Waste Dump trader.

You will need to modify two client-side files and one server side file. Additionally, you will need to include these three files in the CfgExileCustomCode.
 

Client-Side File: ExileClient_gui_traderDialog_updateInventoryDropdown.sqf

Spoiler

private["_dialog","_inventoryDropdown","_index","_nearVehicles","_crateTypes"];
disableSerialization;
_crateTypes = [
		"CargoNet_01_box_F",
		"Exile_Container_SupplyBox",
		"I_CargoNet_01_ammo_F",
		"O_CargoNet_01_ammo_F",
		"B_CargoNet_01_ammo_F",
		"I_supplyCrate_F", 
		"O_supplyCrate_F", 
		"B_supplyCrate_F", 
		"C_supplyCrate_F",
		"IG_supplyCrate_F", 
		"Box_NATO_AmmoVeh_F", 
		"Box_East_AmmoVeh_F", 
		"Box_IND_AmmoVeh_F", 
		"I_CargoNET_01_F",
		"O_CargoNET_01_F",
		"B_CargoNET_01_F",
		"Land_CargoBox_V1_F", 
		"ASC_B_box",
		"Box_NATO_Wps_F", 
		"Box_East_Wps_F", 
		"Box_IND_Wps_F", 
		"Box_East_WpsLaunch_F", 
		"Box_NATO_WpsLaunch_F", 
		"Box_IND_WpsLaunch_F", 
		"Box_IND_WpsSpecial_F", 
		"Box_East_WpsSpecial_F", 
		"Box_NATO_WpsSpecial_F",
		"Box_NATO_Wps_F", 
		"Box_East_Wps_F", 
		"Box_IND_Wps_F", 
		"Box_East_WpsLaunch_F", 
		"Box_NATO_WpsLaunch_F", 
		"Box_IND_WpsLaunch_F", 
		"Box_IND_WpsSpecial_F", 
		"Box_East_WpsSpecial_F", 
		"Box_NATO_WpsSpecial_F",
		"Box_NATO_AmmoOrd_F", 
		"Box_East_AmmoOrd_F", 
		"Box_IND_AmmoOrd_F", 
		"Box_NATO_Grenades_F", 
		"Box_East_Grenades_F", 
		"Box_IND_Grenades_F", 
		"Box_NATO_Ammo_F", 
		"Box_East_Ammo_F", 
		"Box_IND_Ammo_F", 
		"Box_IND_Support_F", 
		"Box_East_Support_F", 
		"Box_NATO_Support_F"
	];
_dialog = uiNameSpace getVariable ["RscExileTraderDialog", displayNull];
_inventoryDropdown = _dialog displayCtrl 4004;
lbClear _inventoryDropdown;
_index = _inventoryDropdown lbAdd "Equipment";
_inventoryDropdown lbSetValue [_index, 1];
_inventoryDropdown lbSetPicture [_index, "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\face_ca.paa"];
_inventoryDropdown lbSetCurSel 0;
if !((uniform player) isEqualTo "") then
{
	_index = _inventoryDropdown lbAdd "Uniform";
	_inventoryDropdown lbSetPicture [_index, "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa"];
	_inventoryDropdown lbSetValue [_index, 2];
};
if !((vest player) isEqualTo "") then
{
	_index = _inventoryDropdown lbAdd "Vest";
	_inventoryDropdown lbSetPicture [_index, "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\vest_ca.paa"];
	_inventoryDropdown lbSetValue [_index, 3];
};
if !((backpack player) isEqualTo "") then
{
	_index = _inventoryDropdown lbAdd "Backpack";
	_inventoryDropdown lbSetPicture [_index, "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\backpack_ca.paa"];
	_inventoryDropdown lbSetValue [_index, 4];
};
_nearVehicles = nearestObjects [player, ["LandVehicle","Air","Ship"] + _crateTypes, 80];
{
	if (local _x) then
	{
		if (alive _x) then
		{
			if (isNull attachedTo _x) then
			{
				_index = _inventoryDropdown lbAdd getText(configFile >> "CfgVehicles" >> (typeOf _x) >> "displayName");
				_inventoryDropdown lbSetData [_index, netId _x];
				_inventoryDropdown lbSetValue [_index, 5];
			};
		};
	} else {
		if (typeOf _x in _crateTypes) then
		{
			if (alive _x) then
			{
				if (isNull attachedTo _x) then
				{
					_index = _inventoryDropdown lbAdd getText(configFile >> "CfgVehicles" >> (typeOf _x) >> "displayName");
					_inventoryDropdown lbSetData [_index, netId _x];
					_inventoryDropdown lbSetValue [_index, 5];
				};
			};
		};
	};
}
forEach _nearVehicles;
true

 

Client-Side File: ExileClient_gui_wasteDumpDialog_show.sqf

Spoiler

private["_nearVehicles","_localVehicles","_display","_revenue","_sellButton","_dropdown","_vehicleObject","_vehicleName","_index","_crateTypes"];
disableSerialization;
_crateTypes = [
		"CargoNet_01_box_F",
		"Exile_Container_SupplyBox",
		"I_CargoNet_01_ammo_F",
		"O_CargoNet_01_ammo_F",
		"B_CargoNet_01_ammo_F",
		"I_supplyCrate_F", 
		"O_supplyCrate_F", 
		"B_supplyCrate_F", 
		"C_supplyCrate_F",
		"IG_supplyCrate_F", 
		"Box_NATO_AmmoVeh_F", 
		"Box_East_AmmoVeh_F", 
		"Box_IND_AmmoVeh_F", 
		"I_CargoNET_01_F",
		"O_CargoNET_01_F",
		"B_CargoNET_01_F",
		"Land_CargoBox_V1_F", 
		"ASC_B_box",
		"Box_NATO_Wps_F", 
		"Box_East_Wps_F", 
		"Box_IND_Wps_F", 
		"Box_East_WpsLaunch_F", 
		"Box_NATO_WpsLaunch_F", 
		"Box_IND_WpsLaunch_F", 
		"Box_IND_WpsSpecial_F", 
		"Box_East_WpsSpecial_F", 
		"Box_NATO_WpsSpecial_F",
		"Box_NATO_Wps_F", 
		"Box_East_Wps_F", 
		"Box_IND_Wps_F", 
		"Box_East_WpsLaunch_F", 
		"Box_NATO_WpsLaunch_F", 
		"Box_IND_WpsLaunch_F", 
		"Box_IND_WpsSpecial_F", 
		"Box_East_WpsSpecial_F", 
		"Box_NATO_WpsSpecial_F",
		"Box_NATO_AmmoOrd_F", 
		"Box_East_AmmoOrd_F", 
		"Box_IND_AmmoOrd_F", 
		"Box_NATO_Grenades_F", 
		"Box_East_Grenades_F", 
		"Box_IND_Grenades_F", 
		"Box_NATO_Ammo_F", 
		"Box_East_Ammo_F", 
		"Box_IND_Ammo_F", 
		"Box_IND_Support_F", 
		"Box_East_Support_F", 
		"Box_NATO_Support_F"
	];
_nearVehicles = nearestObjects [player, ["LandVehicle", "Air", "Ship"] + _crateTypes, 150];
_localVehicles = [];
{
	if (local _x) then
	{
		if (alive _x) then
		{
			if (isNull attachedTo _x) then
			{
				_localVehicles pushBack _x;
			};
		};
	} else {
		if (typeOf _x in _crateTypes) then
		{
			if (alive _x) then
			{
				if (isNull attachedTo _x) then
				{
					_localVehicles pushBack _x;
				};
			};
		};
	};
}
forEach _nearVehicles;
if (_localVehicles isEqualTo []) exitWith
{
	["ErrorTitleAndText", ["Whoops!", "Park within 50m and get in as driver first."]] call ExileClient_gui_toaster_addTemplateToast;
};
ExileClientCurrentTrader = _this;
createDialog "RscExileWasteDumpDialog";
waitUntil { !isNull findDisplay 24011 };
_display = uiNameSpace getVariable ["RscExileWasteDumpDialog", displayNull];
_revenue = _display displayCtrl 4001;
_revenue ctrlSetStructuredText (parseText "<t size='1.4'>0<img image='\exile_assets\texture\ui\poptab_notification_ca.paa' size='1' shadow='true' /></t>");
_sellButton = _display displayCtrl 4000;
_sellButton ctrlEnable false;
_dropdown = _display displayCtrl 4002;
lbClear _dropdown;
{
	_vehicleObject = _x;
	_vehicleName = getText(configFile >> "CfgVehicles" >> (typeOf _vehicleObject) >> "displayName");
	_index = _dropdown lbAdd (format ["Cargo: %1", _vehicleName]);
	_dropdown lbSetData [_index, netId _vehicleObject];
	_dropdown lbSetValue [_index, 1];
	_index = _dropdown lbAdd (format ["Vehicle + Cargo: %1", _vehicleName]);
	_dropdown lbSetData [_index, netId _vehicleObject];
	_dropdown lbSetValue [_index, 2];
}
forEach _localVehicles;
true call ExileClient_gui_postProcessing_toggleDialogBackgroundBlur;
true

 

Server-Side File: ExileServer_system_trading_network_wasteDumpRequest.sqf

Spoiler

private["_sessionID","_parameters","_vehicleNetID","_mode","_vehicleObject","_vehicleDBID","_playerObject","_cargo","_revenue","_playerMoney","_respectGain","_playerRespect","_logging","_traderLog","_responseCode","_crateTypes"];
_sessionID = _this select 0;
_parameters = _this select 1;
_vehicleNetID = _parameters select 0;
_mode = _parameters select 1;
_crateTypes = [
		"CargoNet_01_box_F",
		"Exile_Container_SupplyBox",
		"I_CargoNet_01_ammo_F",
		"O_CargoNet_01_ammo_F",
		"B_CargoNet_01_ammo_F",
		"I_supplyCrate_F", 
		"O_supplyCrate_F", 
		"B_supplyCrate_F", 
		"C_supplyCrate_F",
		"IG_supplyCrate_F", 
		"Box_NATO_AmmoVeh_F", 
		"Box_East_AmmoVeh_F", 
		"Box_IND_AmmoVeh_F", 
		"I_CargoNET_01_F",
		"O_CargoNET_01_F",
		"B_CargoNET_01_F",
		"Land_CargoBox_V1_F", 
		"ASC_B_box",
		"Box_NATO_Wps_F", 
		"Box_East_Wps_F", 
		"Box_IND_Wps_F", 
		"Box_East_WpsLaunch_F", 
		"Box_NATO_WpsLaunch_F", 
		"Box_IND_WpsLaunch_F", 
		"Box_IND_WpsSpecial_F", 
		"Box_East_WpsSpecial_F", 
		"Box_NATO_WpsSpecial_F",
		"Box_NATO_Wps_F", 
		"Box_East_Wps_F", 
		"Box_IND_Wps_F", 
		"Box_East_WpsLaunch_F", 
		"Box_NATO_WpsLaunch_F", 
		"Box_IND_WpsLaunch_F", 
		"Box_IND_WpsSpecial_F", 
		"Box_East_WpsSpecial_F", 
		"Box_NATO_WpsSpecial_F",
		"Box_NATO_AmmoOrd_F", 
		"Box_East_AmmoOrd_F", 
		"Box_IND_AmmoOrd_F", 
		"Box_NATO_Grenades_F", 
		"Box_East_Grenades_F", 
		"Box_IND_Grenades_F", 
		"Box_NATO_Ammo_F", 
		"Box_East_Ammo_F", 
		"Box_IND_Ammo_F", 
		"Box_IND_Support_F", 
		"Box_East_Support_F", 
		"Box_NATO_Support_F"
	];
try 
{
	_vehicleObject = objectFromNetId _vehicleNetID;
	_vehicleDBID = _vehicleObject getVariable "ExileDatabaseID";
	if (isNull _vehicleObject) then
	{
		throw 6;
	};
	if (_vehicleObject getVariable ["ExileMutex", false]) then
	{
		throw 12;
	};
	_vehicleObject setVariable ["ExileMutex", true];
	_playerObject = _sessionID call ExileServer_system_session_getPlayerObject;
	if (isNull _playerObject) then
	{
		throw 1;
	};
	if !(alive _playerObject) then
	{
		throw 2;
	};
	if !((owner _vehicleObject) isEqualTo (owner _playerObject)) then 
	{
		if (typeOf _vehicleObject in _crateTypes) then
		{
			_vehicleObject setOwner (owner _playerObject);
		} else {
			throw 6;
		};
	};
	_cargo = _vehicleObject call ExileClient_util_containerCargo_list;
	_revenue = _cargo call ExileClient_util_gear_calculateTotalSellPrice;
	clearBackpackCargoGlobal _vehicleObject;
	clearItemCargoGlobal _vehicleObject;
	clearMagazineCargoGlobal _vehicleObject;
	clearWeaponCargoGlobal _vehicleObject;
	if (_mode isEqualTo 2) then
	{
		_revenue = _revenue + ([(typeOf _vehicleObject)] call ExileClient_util_gear_calculateTotalSellPrice);
		_vehicleObject call ExileServer_object_vehicle_remove;
		deleteVehicle _vehicleObject;
	}
	else 
	{
		_vehicleObject call ExileServer_object_vehicle_database_update;
	};
	_playerMoney = _playerObject getVariable ["ExileMoney", 0];
	_playerMoney = _playerMoney + _revenue;
	_playerObject setVariable ["ExileMoney", _playerMoney, true];
	format["setPlayerMoney:%1:%2", _playerMoney, _playerObject getVariable ["ExileDatabaseID", 0]] call ExileServer_system_database_query_fireAndForget;
	_respectGain = _revenue * getNumber (configFile >> "CfgSettings" >> "Respect" >> "tradingRespectFactor");
	_playerRespect = _playerObject getVariable ["ExileScore", 0];
	_playerRespect = floor (_playerRespect + _respectGain);
	_playerObject setVariable ["ExileScore", _playerRespect];
	format["setAccountScore:%1:%2", _playerRespect, (getPlayerUID _playerObject)] call ExileServer_system_database_query_fireAndForget;
	[_sessionID, "wasteDumpResponse", [0, _revenue, str _playerRespect]] call ExileServer_system_network_send_to;
	_logging = getNumber(configFile >> "CfgSettings" >> "Logging" >> "traderLogging");
	if (_logging isEqualTo 1) then
	{
		_traderLog = format ["PLAYER: ( %1 ) %2 SOLD ITEM: %3 (ID# %4) with Cargo %5 FOR %6 POPTABS AND %7 RESPECT | PLAYER TOTAL MONEY: %8",getPlayerUID _playerObject,_playerObject,typeOf _vehicleObject,_vehicleDBID,_cargo,_revenue,_respectGain,_playerMoney];
		"extDB2" callExtension format["1:TRADING:%1",_traderLog];
	};
}
catch
{
	_responseCode = _exception;
	[_sessionID, "wasteDumpResponse", [_responseCode, 0, ""]] call ExileServer_system_network_send_to;
};
if (!isNull _vehicleObject) then
{
	_vehicleObject setVariable ["ExileMutex", false];
};
true

 

CfgExileCustomCode:

Spoiler

class CfgExileCustomCode
{
	ExileClient_gui_traderDialog_updateInventoryDropdown = "overrides\ExileClient_gui_traderDialog_updateInventoryDropdown.sqf";
	ExileClient_gui_wasteDumpDialog_show = "overrides\ExileClient_gui_wasteDumpDialog_show.sqf";
	ExileServer_system_trading_network_wasteDumpRequest = "overrides\ExileServer_system_trading_network_wasteDumpRequest.sqf";
};

 

Make sure you set the appropriate file path in your CfgExileCustomCode if it is different than mine or your server will not be able to find the files.

Note: This will NOT require any changes to Advanced Sling Load, IgiLoad, R3F or any other logistics script needed to transport crates to the Waste Dump trader.

Enjoy!

 

]]>
22604Sun, 30 Apr 2017 01:12:08 +0000
[Guide] Custom Vehicle Spawn (Air/Ground/Water)https://exile.majormittens.co.uk/topic/14289-guide-custom-vehicle-spawn-airgroundwater/ Enable Boats near coast and Helicopters near Airfields
Enable collored debugmarkers
Enable 2 debug logs (full/important)
a lot of more 

Example for debugmarkers

Spoiler

Black Air

Blue Water

Green Ground

Yellow Spawnzone

20160814212422_1.jpg
Only with 2 steps

Step1:
overwrite in 

exile_server_config\config.cpp
the whole class VehicleSpawn 

Spoiler

class VehicleSpawn
    {    
        /**
        * Array of hotspots Positions 
        * not included now
        **/
        hotSpots[] =
        {};
        /**
        * Array of blacklisted Positions
        * not included now
        **/
        blackList[] =
        {};
        /**
        *chosed loging format
        **/
        vehicleDebugLog = 1; //"0"=Disabled "1"=Full "2"=Important
        /**
        * Vehicle ammount 
        * donot set rhis to high,
        * serverstart will take long time 
        * 70 Vehicles ~ 3 minutes
        */
        groundVehicleAmount = 40; //"0"=Disabled
        waterVehicleAmount = 20; //"0"=Disabled
        airVehicleAmount = 10; //"0"=Disabled
        /**
        * Creates global markers for vehicle spawn tweeking,
        * after you are satisfied with vehicle ammount and spread set this to 0.
        */
        groundDebugMarkers = 1; //"0"=Disabled "1"=Enabled
        waterDebugMarkers = 1; //"0"=Disabled "1"=Enabled
        airDebugMarkers = 1; //"0"=Disabled "1"=Enabled
        /**
         * Radius of spawn around Road/Coast/Airfields
         * Dont set it smaller then 50
         */
        groundSpawnRadius = 100; //around Roads
        waterSpawnRadius = 50; //around Coasts
        airSpawnRadius = 200; //around Airfields +750(default)
        /**
        * The server will apply random damage up to this value when spawning a vehicle.
        */
        groundDamageChance = 20; // 20% chance for a vehicle HITPOINT to be damaged
        waterDamageChance = 20; // 20% chance for a vehicle HITPOINT to be damaged
        airDamageChance = 20; // 20% chance for a vehicle HITPOINT to be damaged
        
        groundMaximumDamage = 10; // vehicle HITPOINT to be damaged
        waterMaximumDamage = 10; // vehicle HITPOINT to be damaged
        airMaximumDamage = 10; // vehicle HITPOINT to be damaged
        /**
         * Enables or disables nightvision optics on ALL vehicles
         *
         * 0 = off
         * 1 = on
         */
        NightVision = 1;

        /**
         * Enables or disables thermal optics on ALL vehicles
         *
         * 0 = off
         * 1 = on
         */
        ThermalVision = 1;

        /**
         * Set this to 1 to unlock vehicles on server boot if they are in safe zones
         *
         * 0 = off
         * 1 = on
         */
        UnlockInSafeZonesAfterRestart = 1;

        // Stuff to spawn on roads
        ground[] = 
        {
            
            "Exile_Car_BRDM2_HQ",
            "Exile_Car_BTR40_MG_Camo",
            "Exile_Car_BTR40_Camo",
            "Exile_Car_Golf_Black",
            "Exile_Car_Hatchback_Black",
            "Exile_Car_Hatchback_Sport_Admin",
            "Exile_Car_HEMMT",
            "Exile_Car_HMMWV_M134_Desert",
            "Exile_Car_HMMWV_M2_Desert",
            "Exile_Car_HMMWV_UNA_Desert",
            "Exile_Car_Hunter",
            "Exile_Car_Ifrit",
            "Exile_Car_Ikarus_Party",
            "Exile_Car_Kart_RedStone",
            "Exile_Car_Lada_Hipster",
            "Exile_Car_LandRover_Urban",
            "Exile_Car_LandRover_Ambulance_Green",
            "Exile_Car_MB4WD",
            "Exile_Car_MB4WDOpen",
            "Exile_Car_Octavius_Black",
            "Exile_Car_Offroad_Guerilla06",
            "Exile_Car_Offroad_Armed_Guerilla12",
            "Exile_Car_Offroad_Repair_Civillian",
            "Exile_Car_OldTractor_Red",
            "Exile_Car_ProwlerUnarmed",
            "Exile_Car_QilinUnarmed",
            "Exile_Car_Strider",
            "Exile_Car_SUV_Black",
            "Exile_Car_SUVXL_Black",
            "Exile_Car_SUV_Armed_Black",
            "Exile_Car_Tempest",
            "Exile_Car_TowTractor_White",
            "Exile_Car_Tractor_Red",
            "Exile_Car_UAZ_Green",
            "Exile_Car_UAZ_Open_Green",
            "Exile_Car_Ural_Covered_Military",
            "Exile_Car_Ural_Open_Military",
            "Exile_Car_V3S_Covered",
            "Exile_Car_V3S_Open",
            "Exile_Car_Van_Guerilla02",
            "Exile_Car_Van_Box_Guerilla04",
            "Exile_Car_Van_Fuel_Guerilla03",
            "Exile_Car_Volha_Black",
            "Exile_Car_Zamak",
            "Exile_Car_MountainBike",
            "Exile_Car_OldBike",
            "Exile_Car_QuadBike_Csat"
        };
        
        // Stuff to spawn on water
        water[] = 
        {
            "Exile_Car_BRDM2_HQ",
            "Exile_Car_Strider",
            "Exile_Boat_MotorBoat_Police",
            "Exile_Boat_MotorBoat_Orange",
            "Exile_Boat_MotorBoat_White",
            "Exile_Boat_RubberDuck_CSAT",
            "Exile_Boat_RubberDuck_Digital",
            "Exile_Boat_RubberDuck_Orange",
            "Exile_Boat_RubberDuck_Blue",
            "Exile_Boat_RubberDuck_Black",
            "Exile_Boat_SDV_CSAT",
            "Exile_Boat_SDV_Digital",
            "Exile_Boat_SDV_Grey"
        };
        
        // Stuff to spawn on airfield
        air[] = 
        {
            "Exile_Chopper_Hellcat_Green",
            "Exile_Chopper_Huey_Green",
            "Exile_Chopper_Huey_Armed_Green",
            "Exile_Chopper_Hummingbird_Green",
            "Exile_Chopper_Hummingbird_Civillian_ION",
            "Exile_Chopper_Huron_Black",
            "Exile_Chopper_Mohawk_FIA",
            "Exile_Chopper_Orca_CSAT",
            "Exile_Chopper_Taru_CSAT",
            "Exile_Chopper_Taru_Covered_CSAT",
            "Exile_Chopper_Taru_Transport_CSAT",
            "Exile_Plane_AN2_Green",
            "Exile_Plane_BlackfishInfantry",
            "Exile_Plane_BlackfishVehicle",
            "Exile_Plane_Ceasar",
            "Exile_Plane_Cessna"
        };
    
    };

Step 2
overwrite the whole 

exile_server\code\ExileServer_world_spawnVehicles content
 

Spoiler

/**
 * ExileServer_world_spawnVehicles
 * edited by Warsheep(GER)
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_worldName","_worldSize","_middle","_quarter","_threeQuarter","_southwestPos","_southPos","_southeastPos","_westPos","_middlPos","_eastPos","_northwestPos","_northPos","_northeastPos","_groundVehicleAmount","_waterVehicleAmount","_airVehicleAmount","_vehicleAmount","_vehicleCount","_errorCount","_ground","_groundVehicleCount","_groundVehicleClassNames","_groundDebugMarkers","_groundDebugMarker","_groundSpawnRadiusRoad","_groundDamageChance","_groundMaximumDamage","_water","_waterVehicleCount","_waterVehicleClassNames","_waterDebugMarkers","_waterDebugMarker","_waterSpawnRadiusCoast","_waterDamageChance","_waterMaximumDamage","_air","_airVehicleCount","_airVehicleClassNames","_airDebugMarkers","_airDebugMarker","_airSpawnRadiusAirField","_airDamageChance","_airMaximumDamage","_mapPos","_spawnedPositions","_airportPositions"];

_debugLog                    = getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "vehicleDebugLog");

_worldName                     = worldName;
_worldSize                    = worldSize;
_middle                        = worldSize / 2;
_quarter                    = worldSize / 4;
_threeQuarter                = _quarter * 3;

_southwestPos                = [_quarter,_quarter,0];
_southPos                    = [_middle,_quarter,0];
_southeastPos                = [_threeQuarter,_quarter,0];
_westPos                    = [_quarter,_middle,0];
_middlPos                    = [_middle,_middle,0];
_eastPos                    = [_threeQuarter,_middle,0];
_northwestPos                = [_quarter,_threeQuarter,0];
_northPos                    = [_middle,_threeQuarter,0];
_northeastPos                = [_threeQuarter,_threeQuarter,0];

_groundVehicleAmount            = getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "groundVehicleAmount");
_waterVehicleAmount                = getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "waterVehicleAmount");
_airVehicleAmount                = getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "airVehicleAmount");
_vehicleAmount                    = _groundVehicleAmount + _waterVehicleAmount + _airVehicleAmount;
_vehicleCount                    = 0;
_errorCount                        = 0;

if(_vehicleAmount isEqualTo 0)exitWith{
    if(_debugLog >= 1) then {
        format ["||WARSHEEP||Spawning Dynamic Vehicles Disabled."] call ExileServer_util_log;
    };
};

if(_groundVehicleAmount isEqualTo 0) then {
    _ground                     = 0;
    if(_debugLog >= 1) then {                    
        format ["||WARSHEEP||Spawning Dynamic Ground Vehicles Disabled."] call ExileServer_util_log;
    };
}else{ 
    _ground                     = 1;
    _groundVehicleCount            = 0;
    _groundVehicleClassNames    = getArray (configFile >> "CfgSettings" >> "VehicleSpawn" >> "ground");
    _groundDebugMarkers            = ((getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "groundDebugMarkers")) isEqualTo 1);
    _groundSpawnRadiusRoad        = getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "groundSpawnRadius");
    _groundDamageChance            = getNumber (configFile >> "CfgSettings" >> "VehicleSpawn" >> "groundDamageChance");
    _groundMaximumDamage        = getNumber (configFile >> "CfgSettings" >> "VehicleSpawn" >> "groundMaximumDamage");
};

if(_waterVehicleAmount isEqualTo 0) then {
    _water                         = 0;
    if(_debugLog >= 1) then {
        format ["||WARSHEEP||Spawning Dynamic Water Vehicles Disabled."] call ExileServer_util_log;
    };
}else{ 
    _water                         = 1;
    _waterVehicleCount            = 0;
    _waterVehicleClassNames        = getArray (configFile >> "CfgSettings" >> "VehicleSpawn" >> "water");
    _waterDebugMarkers            = ((getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "waterDebugMarkers")) isEqualTo 1);
    _waterSpawnRadiusCoast        = getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "waterSpawnRadius");
    _waterDamageChance            = getNumber (configFile >> "CfgSettings" >> "VehicleSpawn" >> "waterDamageChance");
    _waterMaximumDamage            = getNumber (configFile >> "CfgSettings" >> "VehicleSpawn" >> "waterMaximumDamage");
};

if(_airVehicleAmount isEqualTo 0) then {
    _air                         = 0;
    if(_debugLog >= 1) then {
        format ["||WARSHEEP||Spawning Dynamic Air Vehicles Disabled."] call ExileServer_util_log;
    };
}else{ 
    _air                         = 1;
    _airVehicleCount            = 0;
    _airVehicleClassNames        = getArray (configFile >> "CfgSettings" >> "VehicleSpawn" >> "air");
    _airDebugMarkers            = ((getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "airDebugMarkers")) isEqualTo 1);
    _airSpawnRadiusAirField        = getNumber(configFile >> "CfgSettings" >> "VehicleSpawn" >> "airSpawnRadius");
    _airDamageChance            = getNumber (configFile >> "CfgSettings" >> "VehicleSpawn" >> "airDamageChance");
    _airMaximumDamage            = getNumber (configFile >> "CfgSettings" >> "VehicleSpawn" >> "airMaximumDamage");
};

_mapPos                     = [_southwestPos,_middlPos,_southPos,_middlPos,_southeastPos,_middlPos,_westPos,_middlPos,_eastPos,_middlPos,_northwestPos,_middlPos,_northPos,_middlPos,_northeastPos,_middlPos];
_spawnedPositions             = [];
_airportPositions             = call ExileClient_util_world_getAllAirportPositions;

if(_debugLog >= 1) then {
    format ["||WARSHEEP||Spawning Dynamic Vehicles. Config loaded!"] call ExileServer_util_log;
};
while {_vehicleCount < _vehicleAmount} do {
    if (_ground isEqualTo 1) then {
        if (_groundVehicleCount < _groundVehicleAmount) then {
            _pos = selectRandom _mapPos;
            _vehiclePosition = [_pos, _middle] call ExileClient_util_world_findRoadPosition;
            _positionReal = [_vehiclePosition, 1, _groundSpawnRadiusRoad, 2, 0 , 0 , 0 , _spawnedPositions] call BIS_fnc_findSafePos;
            if(count _positionReal isEqualTo 3 ) then {
                _groundVehicleAmount = _groundVehicleAmount - 1;
                _vehicleAmount = _vehicleAmount - 1;
                _errorCount = _errorCount + 1;
                _spawnControl = [[(_positionReal select 0) - 50, (_positionReal select 1) + 50],[(_positionReal select 0) + 50,(_positionReal select 1) - 50]];
                _spawnedPositions pushBack _spawnControl;
                if(_debugLog isEqualTo 1) then {
                    format ["||WARSHEEP||%1 Error Position",_positionReal] call ExileServer_util_log;
                };
            }else{
                _spawnControl = [[(_positionReal select 0) - 50, (_positionReal select 1) + 50],[(_positionReal select 0) + 50,(_positionReal select 1) - 50]];
                _spawnedPositions pushBack _spawnControl;
                _positionReal pushBack 0;
                _vehicleClassName = selectRandom _groundVehicleClassNames;
                _vehicle = [_vehicleClassName, _positionReal, random 360, true] call ExileServer_object_vehicle_createNonPersistentVehicle;
                if(_debugLog isEqualTo 1) then {
                    format ["||WARSHEEP||%1 Spawned",_vehicleClassName] call ExileServer_util_log;
                };
                _hitpointsData = getAllHitPointsDamage _vehicle;
                if !(_hitpointsData isEqualTo []) then {
                    _hitpoints = _hitpointsData select 0;{
                        if ((random 100) < _groundDamageChance) then{
                            _vehicle setHitPointDamage [_x, random _groundMaximumDamage];
                        };
                    }forEach _hitpoints;
                };
                if (_groundDebugMarkers) then{
                    _groundDebugMarker = createMarker ["vehicleMarkerGround#"+str _groundVehicleCount, _positionReal];
                    _groundDebugMarker setMarkerColor "ColorGreen";
                    _groundDebugMarker setMarkerType "mil_dot_noShadow";
                };
                _groundVehicleCount = _groundVehicleCount + 1;
                _vehicleCount = _vehicleCount + 1;
            };
        }else{
            _ground = 0;
        };
    };
    
    if (_water isEqualTo 1) then {
        if (_waterVehicleCount < _waterVehicleAmount) then {
            _pos = selectRandom _mapPos;
            _vehiclePosition = [_pos, 1, _middle, 2, 1, 0, 1, _spawnedPositions] call BIS_fnc_findSafePos;
            _posSafe = _vehiclePosition call ExileClient_util_world_findCoastPosition;
            _positionReal = [_posSafe, 1, _waterSpawnRadiusCoast, 1, 2 , 0 , 0 , _spawnedPositions] call BIS_fnc_findSafePos;
            if(count _positionReal isEqualTo 3 ) then {
                _waterVehicleAmount = _waterVehicleAmount - 1;
                _vehicleAmount = _vehicleAmount - 1;
                _errorCount = _errorCount + 1;
                _spawnControl = [[(_positionReal select 0) - 50, (_positionReal select 1) + 50],[(_positionReal select 0) + 50,(_positionReal select 1) - 50]];
                _spawnedPositions pushBack _spawnControl;
                if(_debugLog isEqualTo 1) then {
                    format ["||WARSHEEP||%1 Error Position",_positionReal] call ExileServer_util_log;
                };
            }else{
                _spawnControl = [[(_positionReal select 0) - 50, (_positionReal select 1) + 50],[(_positionReal select 0) + 50,(_positionReal select 1) - 50]];
                _spawnedPositions pushBack _spawnControl;
                _positionReal pushBack 0;
                _vehicleClassName = selectRandom _waterVehicleClassNames;
                _vehicle = [_vehicleClassName, _positionReal, random 360, true] call ExileServer_object_vehicle_createNonPersistentVehicle;
                if(_debugLog isEqualTo 1) then {
                    format ["||WARSHEEP||%1 Spawned",_vehicleClassName] call ExileServer_util_log;
                };
                _hitpointsData = getAllHitPointsDamage _vehicle;
                if !(_hitpointsData isEqualTo []) then {
                    _hitpoints = _hitpointsData select 0;{
                        if ((random 100) < _waterDamageChance) then{
                            _vehicle setHitPointDamage [_x, random _waterMaximumDamage];
                        };
                    }forEach _hitpoints;
                };
                if (_waterDebugMarkers) then{
                    _waterDebugMarker = createMarker ["vehicleMarkerWater#"+str _waterVehicleCount, _positionReal];
                    _waterDebugMarker setMarkerColor "ColorBlue";
                    _waterDebugMarker setMarkerType "mil_dot_noShadow";
                };
                _waterVehicleCount = _waterVehicleCount + 1;
                _vehicleCount = _vehicleCount + 1;
            };
        }else{
            _water = 0;
        };
    };
    
    if (_air isEqualTo 1) then {
        if (_airVehicleCount < _airVehicleAmount) then {
            _pos = selectRandom _airportPositions;
            _vehiclePosition = [_pos, 750] call ExileClient_util_world_findRoadPosition;
            _positionReal = [_vehiclePosition, 1, _airSpawnRadiusAirField, 7, 0 , 0 , 0 , _spawnedPositions] call BIS_fnc_findSafePos;
            if(count _positionReal isEqualTo 3 ) then {
                _airVehicleAmount = _airVehicleAmount - 1;
                _vehicleAmount = _vehicleAmount - 1;
                _errorCount = _errorCount + 1;    
                _spawnControl = [[(_positionReal select 0) - 50, (_positionReal select 1) + 50],[(_positionReal select 0) + 50,(_positionReal select 1) - 50]];
                _spawnedPositions pushBack _spawnControl;
                if(_debugLog isEqualTo 1) then {
                    format ["||WARSHEEP||%1 Error Position",_positionReal] call ExileServer_util_log;
                };
            }else{
                _spawnControl = [[(_positionReal select 0) - 50, (_positionReal select 1) + 50],[(_positionReal select 0) + 50,(_positionReal select 1) - 50]];
                _spawnedPositions pushBack _spawnControl;
                _positionReal pushBack 0;
                _vehicleClassName = selectRandom _airVehicleClassNames;
                _vehicle = [_vehicleClassName, _positionReal, random 360, true] call ExileServer_object_vehicle_createNonPersistentVehicle;
                if(_debugLog isEqualTo 1) then {
                    format ["||WARSHEEP||%1 Spawned",_vehicleClassName] call ExileServer_util_log;
                };
                _hitpointsData = getAllHitPointsDamage _vehicle;
                if !(_hitpointsData isEqualTo []) then {
                    _hitpoints = _hitpointsData select 0;{
                        if ((random 100) < _airDamageChance) then{
                            _vehicle setHitPointDamage [_x, random _airMaximumDamage];
                        };
                    }forEach _hitpoints;
                };
                if (_airDebugMarkers) then{
                    _airDebugMarker = createMarker ["vehicleMarkerAir#"+str _airVehicleCount, _positionReal];
                    _airDebugMarker setMarkerColor "ColorBlack";
                    _airDebugMarker setMarkerType "mil_dot_noShadow";
                };
                _airVehicleCount = _airVehicleCount + 1;
                _vehicleCount = _vehicleCount + 1;
            };
        }else{
            _air = 0;
        };
    };
};
if (_errorCount > 0)then {
    if(_debugLog >= 1) then {
        format ["||WARSHEEP||Dynamic Vehicles Error. Count : %1",_errorCount] call ExileServer_util_log;
    };
};
if (_groundVehicleAmount > 0) then {
    if(_debugLog >= 1) then {
        format ["||WARSHEEP||Dynamic Ground Vehicles Spawned. Count : %1/%2",_groundVehicleCount,_groundVehicleAmount] call ExileServer_util_log;
    };
};
if (_waterVehicleAmount > 0) then {
    if(_debugLog >= 1) then {
        format ["||WARSHEEP||Dynamic Water Vehicles Spawned. Count : %1/%2",_waterVehicleCount,_waterVehicleAmount] call ExileServer_util_log;
    };
};
if (_airVehicleAmount > 0) then {
    if(_debugLog >= 1) then {
        format ["||WARSHEEP||Dynamic Air Vehicles Spawned. Count : %1/%2",_airVehicleCount,_airVehicleAmount] call ExileServer_util_log;
    };
};
if(_debugLog >= 1) then {
        format ["||WARSHEEP||Dynamic Vehicles Spawned. Count : %1/%2",_vehicleCount,_vehicleAmount] call ExileServer_util_log;
};

Extras (spawnzone debug markers)

1.add in class BambiSettings

exile_server_config\config.cpp

Spoiler

/**
        * Creates global markers for vehicle spawn tweeking,
        * after you are satisfied with vehicle ammount and spread set this to 0.
        */
        vehiclesDebugMarkers = 0;


2.overwrite the full
exile_server\code\ExileServer_world_spawnSpawnZoneVehicles

Spoiler

/**
 * ExileServer_world_spawnSpawnZoneVehicles
 * editet by warsheep(GER)
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_debugMarker","_debugMarkers","_vehicleCount","_spawnRadius","_vehiclesToSpawn","_markerName","_markerCenterPosition","_numberOfVehiclesToSpawn","_vehicleClassName","_i","_vehiclePosition","_vehicleDirection"];
"Creating spawn zone vehicles..." call ExileServer_util_log;
_debugMarkers = ((getNumber(configFile >> "CfgSettings" >> "BambiSettings" >> "vehiclesDebugMarkers")) isEqualTo 1);
_vehicleCount = 0;
_spawnRadius = getNumber(configFile >> "CfgSettings" >> "BambiSettings" >> "spawnZoneRadius");
_vehiclesToSpawn = getArray(configFile >> "CfgSettings" >> "BambiSettings" >> "spawnZoneVehicles");
{
    _markerName = _x;
    if (getMarkerType _markerName == "ExileSpawnZone") then
    {
        _markerCenterPosition = getMarkerPos _markerName;
        {
            _numberOfVehiclesToSpawn = _x select 0;
            _vehicleClassName = _x select 1;
            for "_i" from 1 to _numberOfVehiclesToSpawn do
            {
                _vehiclePosition = [_markerCenterPosition, _spawnRadius] call ExileClient_util_world_findRoadPosition;
                if(_vehiclePosition isEqualTo [])exitWith{};
                _vehicleDirection = (random 360);
                [_vehicleClassName, _vehiclePosition, _vehicleDirection, true] call ExileServer_object_vehicle_createNonPersistentVehicle;
            };
            if (_debugMarkers) then
            {
                _debugMarker = createMarker ["vehicleMarkerSpawn#"+str _vehicleCount, _vehiclePosition];
                _debugMarker setMarkerColor "ColorYellow";
                _debugMarker setMarkerType "mil_dot_noShadow";
            };
            _vehicleCount = _vehicleCount + 1;
        }
        forEach _vehiclesToSpawn;
    };
}
forEach allMapMarkers;

format ["Dynamic Spawn Zone Vehicle spawned. Count : %1",_vehicleCount] call ExileServer_util_log;
true

 

 

fix for kohlrabi update 

 

 

fix for exploding Vehicles thx @dekela

On 25.4.2018 at 1:38 AM, dekela said:

for those who still have vehicles exploding when simulation kicks in, change these values to less than 1 ,  EG 0.8

damage is measured between 0-1, so as they are, the vehicle suffers 10 times the maximum amount of damage


 groundMaximumDamage = 10; // vehicle HITPOINT to be damaged
 waterMaximumDamage = 10; // vehicle HITPOINT to be damaged
 airMaximumDamage = 10; // vehicle HITPOINT to be damaged

 

]]>
14289Thu, 19 May 2016 14:20:40 +0000
[XM8 APP] BRAma Cookbook [UPDATED]https://exile.majormittens.co.uk/topic/11296-xm8-app-brama-cookbook-updated/ Presenting [BRAma] Cookbook an XM8 App

Special Note
The below code is open for everyone to change and modify for any purposes, in other words do what you want with it :)

Overview
This App allows you to view from your xm8 all available crafting recipes and will show you everything required. Clicking Craft will open the regular exile crafting screen.
Categories are dynamically determined based on whether the item is available in traders or not, if they are not available in traders they will be marked as Priceless ( because money cant buy them )
Category is now defined against each recipe see installation instructions for details

GitHub
Manual Download
Zip
Download

Latest Change | Historical Changes
2016-03-01  |  Manual Recipe Categories
2016-02-14  |  Removed Invalid Control on ComboBox ( Doesnt cause a problem just put an error in the log )

Installation

Spoiler

Install Base XM8 Apps script
XM8 Apps

Installing BRAma Cookbook

  1. Create a Folder inside xm8Apps directory like so 
    
    xm8Apps\BRAmaRecipes

    Place init.sqf & BRAma.paa in xm8Apps\BRAmaRecipes

  2. Edit xm8Apps\XM8Apps_Init.sqf 

    Find a app button for example //App 1 change to 
    
    //App 1
    _app1Text = "Recipes";
    _app1Logo = "xm8Apps\BRAmaRecipes\BRAma.paa";
    app1_action = {
    execVM "xm8Apps\BRAmaRecipes\init.sqf";
    };

     

  3. If using Infistar you need to whitelist the controls

    Find

  4. 
    /* Use IDD White-List ? */ UDW = true;
    /* allowedIDDs: Insert IDDs here to prevent them from being closed! */
    allowedIDDs[] =
    {

    Add 

    
     	//BRAma Cookbook
    	5501,5502,5503,5504,5505,5506,5507,

     

Adding Categories to Recipes
Add a category class to each recipe as per below examples, if you do not add one they will fall under "Uncategorised"

Spoiler

class CookBBQSandwich: Exile_AbstractCraftingRecipe
{
    name = "Cook BBQ Sandwich";
    pictureItem = "Exile_Item_BBQSandwich_Cooked";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_BBQSandwich_Cooked"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_BBQSandwich"}
    };
    category = "Food";
};

class CookCatFood: Exile_AbstractCraftingRecipe
{
    name = "Cook Cat Food";
    pictureItem = "Exile_Item_CatFood_Cooked";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_CatFood_Cooked"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_CatFood"}
    };
    category = "Food";
};

class CookChristmasTinner: Exile_AbstractCraftingRecipe
{
    name = "Cook Christmas Tinner";
    pictureItem = "Exile_Item_ChristmasTinner_Cooked";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_ChristmasTinner_Cooked"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_ChristmasTinner"}
    };
    category = "Food";
};
class CookCoffee: Exile_AbstractCraftingRecipe
{
    name = "Brew Coffee";
    pictureItem = "Exile_Item_PlasticBottleCoffee";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_PlasticBottleCoffee"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_PlasticBottleFreshWater"},
        {1, "Exile_Item_InstantCoffee"}
    };
    category = "Drink";
};
class CookDogFood: Exile_AbstractCraftingRecipe
{
    name = "Cook Dog Food";
    pictureItem = "Exile_Item_DogFood_Cooked";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_DogFood_Cooked"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_DogFood"}
    };
    category = "Food";
};

class CookGloriousKnakworst: Exile_AbstractCraftingRecipe
{
    name = "Cook Glorious Knakworst";
    pictureItem = "Exile_Item_GloriousKnakworst_Cooked";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_GloriousKnakworst_Cooked"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_GloriousKnakworst"}
    };
    category = "Food";
};

class CookPlasticBottleDirtyWater: Exile_AbstractCraftingRecipe
{
    name = "Cook Dirty Water";
    pictureItem = "Exile_Item_PlasticBottleFreshWater";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_PlasticBottleFreshWater"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_PlasticBottleDirtyWater"}
    };
    category = "Drink";
};
class CookPlasticBottleSaltWater: Exile_AbstractCraftingRecipe
{
    name = "Cook Salt Water";
    pictureItem = "Exile_Item_PlasticBottleFreshWater";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_PlasticBottleFreshWater"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_PlasticBottleSaltWater"}
    };
    category = "Drink";
};

class CookSausageGravy: Exile_AbstractCraftingRecipe
{
    name = "Cook Sausage Gravy";
    pictureItem = "Exile_Item_SausageGravy_Cooked";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_SausageGravy_Cooked"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_SausageGravy"}
    };
    category = "Food";
};

class CookSurstromming: Exile_AbstractCraftingRecipe
{
    name = "Cook Surströmming";
    pictureItem = "Exile_Item_Surstromming_Cooked";
    requiresFire = 1;
    returnedItems[] =
    {
        {1, "Exile_Item_Surstromming_Cooked"}
    };
    tools[] =
    {
        "Exile_Item_CookingPot"
    };
    components[] = 
    {
        {1, "Exile_Item_Surstromming"}
    };
    category = "Food";
};

class CraftBushKitGreen: Exile_AbstractCraftingRecipe
{
    name = "Craft a Bush Kit (Green)";
    pictureItem = "Exile_Item_BushKit_Green";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_BushKit_Green"}
    };
    components[] = 
    {
        {10, "Exile_Item_Leaves"},
        {5, "Exile_Item_WoodSticks"},
        {1, "Exile_Item_Rope"}
    };
    category = "Camo";
};
class CraftFirePlace: Exile_AbstractCraftingRecipe
{
    name = "Craft Fire Place";
    pictureItem = "Exile_Item_CampFireKit";
    returnedItems[] = 
    {
        {1, "Exile_Item_CampFireKit"}
    };
    components[] = 
    {
        {2, "Exile_Item_WoodLog"}
    };
    category = "Construction Props";
};
class CraftFloodLight: Exile_AbstractCraftingRecipe
{
    name = "Craft Flood Light";
    pictureItem = "Exile_Item_FloodLightKit";
    requiresFire = 1;
    returnedItems[] = 
    {
        {1, "Exile_Item_FloodLightKit"}
    };
    components[] = 
    {
        {1, "Exile_Item_MetalPole"},
        {1, "Exile_Item_LightBulb"},
        {1, "Exile_Item_ExtensionCord"}
    };
    category = "Construction Interactive";
};
class CraftFortificationUpgrade: Exile_AbstractCraftingRecipe
{
    name = "Craft Fortification Upgrade";
    pictureItem = "Exile_Item_MetalBoard"; //<< CHANGE IT
    requiresFire = 1;
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_FortificationUpgrade"}
    };
    components[] = 
    {
        {2, "Exile_Item_MetalPole"},
        {4, "Exile_Item_MetalBoard"}
    };
    tools[] = {"Exile_Item_Grinder"};
    category = "Construction Upgrades";
};
class CraftMetalBoard: Exile_AbstractCraftingRecipe
{
    name = "Craft Metal Board";
    pictureItem = "Exile_Item_MetalBoard";
    requiresFire = 1;
    returnedItems[] = 
    {
        {1, "Exile_Item_MetalBoard"}
    };
    components[] = 
    {
        {3, "Exile_Item_JunkMetal"}
    };
    tools[] = {"Exile_Item_Grinder"};
    category = "Construction Components";
};
class CraftMetalPole: Exile_AbstractCraftingRecipe
{
    name = "Craft Metal Pole";
    pictureItem = "Exile_Item_MetalPole";
    requiresFire = 1;
    returnedItems[] = 
    {
        {1, "Exile_Item_MetalPole"}
    };
    components[] = 
    {
        {5, "Exile_Item_JunkMetal"}
    };
    tools[] = {"Exile_Item_Grinder"};
    category = "Construction Components";
};
class CraftPortableGenerator: Exile_AbstractCraftingRecipe
{
    name = "Craft Portable Generator";
    pictureItem = "Exile_Item_PortableGeneratorKit";
    requiresFire = 1;
    returnedItems[] = 
    {
        {1, "Exile_Item_PortableGeneratorKit"}
    };
    components[] = 
    {
        {4, "Exile_Item_MetalBoard"},
        {1, "Exile_Item_FuelCanisterFull"},
        {1, "Exile_Item_ExtensionCord"}
    };
    category = "Construction Interactive";
};
class CraftStorageCrate: Exile_AbstractCraftingRecipe
{
    name = "Craft Storage Crate";
    pictureItem = "Exile_Item_StorageCrateKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_StorageCrateKit"}
    };
    components[] = 
    {
        {5, "Exile_Item_WoodPlank"}
    };
    category = "Storage";
};
class CraftWoodDoorWay: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Doorway";
    pictureItem = "Exile_Item_WoodDoorwayKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodDoorwayKit"}
    };
    components[] = 
    {
        {6, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
/*
class CraftWoodDrawBridge: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Draw-Bridge";
    pictureItem = "Exile_Item_WoodDrawBridgeKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodDrawBridgeKit"}
    };
    components[] = 
    {
        {4, "Exile_Item_WoodPlank"},
        {2, "Exile_Item_Rope"}
    };
};
*/
class CraftWoodFloor: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Floor";
    pictureItem = "Exile_Item_WoodFloorKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodFloorKit"}
    };
    components[] = 
    {
        {4, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class CraftWoodFloorPort: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Floor Port";
    pictureItem = "Exile_Item_WoodFloorPortKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodFloorPortKit"}
    };
    components[] = 
    {
        {6, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class CraftWoodGate: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Gate";
    pictureItem = "Exile_Item_WoodGateKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodGateKit"}
    };
    components[] = 
    {
        {8, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class CraftWoodPlank: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Plank";
    pictureItem = "Exile_Item_WoodPlank";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodPlank"}
    };
    components[] = 
    {
        {2, "Exile_Item_WoodLog"}
    };
    tools[] = {"Exile_Item_Handsaw"};
    category = "Construction Wooden";
};
class CraftWoodStairs: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Stairs";
    pictureItem = "Exile_Item_WoodStairsKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodStairsKit"}
    };
    components[] = 
    {
        {6, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class CraftWoodSupport: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Support";
    pictureItem = "Exile_Item_WoodSupportKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodSupportKit"}
    };
    components[] = 
    {
        {6, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class CraftWoodWall: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Wall";
    pictureItem = "Exile_Item_WoodWallKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodWallKit"}
    };
    components[] = 
    {
        {4, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class CraftWoodWallHalf: Exile_AbstractCraftingRecipe
{
    name = "Craft 1/2 Wood Wall";
    pictureItem = "Exile_Item_WoodWallHalfKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodWallHalfKit"}
    };
    components[] = 
    {
        {2, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class CraftWoodWindow: Exile_AbstractCraftingRecipe
{
    name = "Craft Wood Window";
    pictureItem = "Exile_Item_WoodWindowKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodWindowKit"}
    };
    components[] = 
    {
        {6, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class CraftWorkBench: Exile_AbstractCraftingRecipe
{
    name = "Craft Work Bench";
    pictureItem = "Exile_Item_WorkBenchKit";
    returnedItems[] = 
    {
        {1, "Exile_Item_WorkBenchKit"}
    };
    components[] = 
    {
        {4, "Exile_Item_WoodLog"}
    };
    category = "Construction Interactive";
};
class EmptyFuelCanister: Exile_AbstractCraftingRecipe
{
    name = "Empty Fuel Canister";
    pictureItem = "Exile_Item_FuelCanisterEmpty";
    returnedItems[] = 
    {
        {1, "Exile_Item_FuelCanisterEmpty"}
    };
    components[] = 
    {
        {1, "Exile_Item_FuelCanisterFull"}
    };
    category = "Misc Consumables";
};
class EmptyPlasticBottleDirtyWater: Exile_AbstractCraftingRecipe
{
    name = "Empty Dirty Water";
    pictureItem = "Exile_Item_PlasticBottleEmpty";
    returnedItems[] =
    {
        {1, "Exile_Item_PlasticBottleEmpty"}
    };
    components[] =
    {
        {1, "Exile_Item_PlasticBottleDirtyWater"}
    };
    category = "Drink";
};
class EmptyPlasticBottleSaltWater: Exile_AbstractCraftingRecipe
{
    name = "Empty Salt Water";
    pictureItem = "Exile_Item_PlasticBottleEmpty";
    returnedItems[] =
    {
        {1, "Exile_Item_PlasticBottleEmpty"}
    };
    components[] =
    {
        {1, "Exile_Item_PlasticBottleSaltWater"}
    };
    category = "Drink";
};
class FillEmptyPlasticBottleWithDirtyWater: Exile_AbstractCraftingRecipe
{
    name = "Fill Dirty Water";
    pictureItem = "Exile_Item_PlasticBottleDirtyWater";
    requiredInteractionModelGroup = "WaterSource";
    returnedItems[] =
    {
        {1, "Exile_Item_PlasticBottleDirtyWater"}
    };
    components[] = 
    {
        {1, "Exile_Item_PlasticBottleEmpty"}
    };
    category = "Drink";
};
class FillEmptyPlasticBottleWithFreshWater: Exile_AbstractCraftingRecipe
{
    name = "Fill Fresh Water";
    pictureItem = "Exile_Item_PlasticBottleFreshWater";
    requiredInteractionModelGroup = "CleanWaterSource";
    returnedItems[] =
    {
        {1, "Exile_Item_PlasticBottleFreshWater"}
    };
    components[] = 
    {
        {1, "Exile_Item_PlasticBottleEmpty"}
    };
    category = "Drink";
};
class FillEmptyPlasticBottleWithSaltWater: Exile_AbstractCraftingRecipe
{
    name = "Fill Salt Water";
    pictureItem = "Exile_Item_PlasticBottleSaltWater";
    requiresOcean = 1;
    returnedItems[] = 
    {
        {1, "Exile_Item_PlasticBottleSaltWater"}
    };
    components[] = 
    {
        {1, "Exile_Item_PlasticBottleEmpty"}
    };
    category = "Drink";
};
class FillFuelCanister: Exile_AbstractCraftingRecipe
{
    name = "Fill Fuel Canister";
    pictureItem = "Exile_Item_FuelCanisterFull";
    requiredInteractionModelGroup = "FuelSource";
    returnedItems[] = 
    {
        {1, "Exile_Item_FuelCanisterFull"}
    };
    components[] = 
    {
        {1, "Exile_Item_FuelCanisterEmpty"}
    };
    category = "Misc Consumables";
};
class UpgradeToWoodDoor: Exile_AbstractCraftingRecipe
{
    name = "Upgrade to Wood Door";
    pictureItem = "Exile_Item_WoodDoorKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodDoorKit"}
    };
    components[] = 
    {
        {1, "Exile_Item_WoodDoorwayKit"},
        {2, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class UpgradeToWoodFloorPort: Exile_AbstractCraftingRecipe
{
    name = "Upgrade to Wood Floor Port";
    pictureItem = "Exile_Item_WoodFloorPortKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodFloorPortKit"}
    };
    components[] = 
    {
        {1, "Exile_Item_WoodFloorKit"},
        {2, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class UpgradeToWoodGate: Exile_AbstractCraftingRecipe
{
    name = "Upgrade to Wood Gate";
    pictureItem = "Exile_Item_WoodGateKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodGateKit"}
    };
    components[] = 
    {
        {1, "Exile_Item_WoodWallKit"},
        {4, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};
class UpgradeToWoodWall: Exile_AbstractCraftingRecipe
{
    name = "Upgrade to Wood Wall";
    pictureItem = "Exile_Item_WoodWallHalfKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodWallKit"}
    };
    components[] = 
    {
        {2, "Exile_Item_WoodWallHalfKit"}
    };
    category = "Construction Wooden";
};
class UpgradeToWoodWindow: Exile_AbstractCraftingRecipe
{
    name = "Upgrade to Wood Window";
    pictureItem = "Exile_Item_WoodWindowKit";
    requiredInteractionModelGroup = "WorkBench";
    returnedItems[] = 
    {
        {1, "Exile_Item_WoodWindowKit"}
    };
    components[] = 
    {
        {1, "Exile_Item_WoodWallKit"},
        {2, "Exile_Item_WoodPlank"}
    };
    category = "Construction Wooden";
};

Preview
BRAmaXM8APP.gif

 

]]>
11296Fri, 12 Feb 2016 14:50:09 +0000
[Updated] Claim Non-Persistent Vehicleshttps://exile.majormittens.co.uk/topic/13283-updated-claim-non-persistent-vehicles/ Allows players to claim server-spawned non-persistent vehicles with a codelock.

Download

 

Spoiler

pixel_pepe_by_cucumberhorse-d96n8iz.gif

Drop ClaimVehicles_Server.pbo into @ExileServer/addons folder.

Drop ClaimVehicles_Client Folder into mpmission/Exile.MAPNAME

Open init.sqf or initplayerLocal.sqf and add the following.


[] execVM "ClaimVehicles_Client\ClaimVehicles_Client_init.sqf";

Open your missionfile config.cpp and find class "CAR"

Spoiler

61e6928cc0.png

Add the contents of EXAMPLE_Config.cpp as a Interaction class  look at the screenshot. Repeat this step for Class "AIR" and Class tank if you have it.

Donezo!

^ Install Instructions ^

 

Note: This was tested with Vanilla Exile and Arma3 Vehicles. There's no reason why it shouldn't work with 3rd party vehicle mods, But if it doesn't I won't be making it work xD

]]>
13283Mon, 04 Apr 2016 21:46:45 +0000
[FIX] Spawn in groundhttps://exile.majormittens.co.uk/topic/26326-fix-spawn-in-ground/ Well, after so many people are having the spawn in ground bug i decided to take a quick look at the cause, and I've figured it out.

TLDR: Arma

Long reason:

Spoiler

Basically what's happening is the main display (46) is for some reason not loading fast enough and the display is not being created, another thing to note is that Exile are also suspending in an FSM O.o

 

I DON'T CARE ABOUT THE REASON JUST GIVE ME THE FIX.... ok ok... here is the fix:

 

Make a file in your mission file called "ExileClient_gui_selectSpawnLocation_show.sqf" and add inside of it:

Spoiler

/**
 * ExileClient_gui_selectSpawnLocation_show
 *
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */

ExileClientSpawnLocationSelectionDone = false;
ExileClientSelectedSpawnLocationMarkerName = "";

[] spawn
{
	disableSerialization;
	private["_display", "_spawnButton", "_listBox", "_listItemIndex", "_numberOfSpawnPoints", "_randNum", "_randData", "_randomSpawnIndex"];

	uiSleep 0.1;
	waitUntil {!isNull (findDisplay 46)};

	createDialog "RscExileSelectSpawnLocationDialog";
	waitUntil
	{
		_display = findDisplay 24002;
		!isNull _display
	};
	
	_spawnButton = _display displayCtrl 24003;
	_spawnButton ctrlEnable false;
	_display displayAddEventHandler ["KeyDown", "_this call ExileClient_gui_loadingScreen_event_onKeyDown"];
	_listBox = _display displayCtrl 24002;
	lbClear _listBox;
	{
		if (getMarkerType _x == "ExileSpawnZone") then
		{
			_listItemIndex = _listBox lbAdd (markerText _x);
			_listBox lbSetData [_listItemIndex, _x];
		};
	}
	forEach allMapMarkers;
	_numberOfSpawnPoints = {getMarkerType _x == "ExileSpawnZone"} count allMapMarkers;
	if (_numberOfSpawnPoints > 0) then 
	{
		_randNum = floor(random _numberOfSpawnPoints);
		_randData = lbData [24002,_randNum];
		_randomSpawnIndex = _listBox lbAdd "Random";
		_listBox lbSetData [_randomSpawnIndex, _randData];
	};
	true
};

true

 

 

then go to the config.cpp (or wherever your CfgExileCustomCode is) and find CfgExileCustomCode and add:

ExileClient_gui_selectSpawnLocation_show = "ExileClient_gui_selectSpawnLocation_show.sqf";

 

NOTE: if you're using XS Spawn use this instead:

Spoiler

/**
 * ExileClient_gui_selectSpawnLocation_show
 *
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
ExileClientSpawnLocationSelectionDone = false;
ExileClientSelectedSpawnLocationMarkerName = "";
[] spawn
{
	private["_display","_spawnButton","_spawnButton2","_tipText","_tipTextList","_listBox","_listItemIndex","_numberOfSpawnPoints","_randNum","_randData","_randomSpawnIndex"];
	disableSerialization;

	uiSleep 0.1;
	waitUntil{!isNull (findDisplay 46)};

	createDialog "xstremeGroundorHaloDialog";
	_display = uiNamespace getVariable ["xstremeGroundorHaloDialog",displayNull];
	_display displayAddEventHandler ["KeyDown", "_this call ExileClient_gui_loadingScreen_event_onKeyDown"];
	_spawnButton = _display displayCtrl 1600;
	_spawnButton2 = _display displayCtrl 1601;
	_spawnButton ctrlEnable false;
	_spawnButton2 ctrlEnable false;
	_tipText = _display displayCtrl 1204;
	_listBox = _display displayCtrl 1500;
	lbClear _listBox;
	{
		if (getMarkerType _x == "ExileSpawnZone") then
		{
			_listItemIndex = _listBox lbAdd (markerText _x);
			_listBox lbSetData [_listItemIndex, _x];
		};
	}
	forEach allMapMarkers;
	_numberOfSpawnPoints = {getMarkerType _x == "ExileSpawnZone"} count allMapMarkers;
	if (_numberOfSpawnPoints > 0) then 
	{
		_randNum = floor(random _numberOfSpawnPoints);
		_randData = lbData [1500,_randNum];
		_randomSpawnIndex = _listBox lbAdd "Random";
		_listBox lbSetData [_randomSpawnIndex, _randData];
	};

	_tipTextList = selectRandom 
	[
		"Connect to the xstreme gaming discord at discord.xstremegaming.com",
		"Server news, comp claims and more join the communnity www.xstremegaming.com",
		"This is a game of loss, its a wild world out there, good luck!",
		"Enjoy the server... Please consider donating to help keep us alive",
		"Any vehicle left inside the black safezone circle will be deleted at restart",
		"Press 'M' key for Map in game to view Server Rules and Building Limits",
		"Do not leave vehicles on exile base parts, at restart they will likely explode",
		"Press the 'U' key when your loaded in to show your FPS on the Status bar"
	];
	_tipText ctrlSetStructuredText parseText format["<t size ='1.8 / (getResolution select 5)' valign='middle' align='right'>[ %1 ]</t>",_tipTextList];

	true
};

true

 

WITH eXpoch base respawn:

Spoiler

/**
 * ExileClient_gui_selectSpawnLocation_show
 *
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */

//private["_display","_spawnButton","_spawnButton2","_tipText","_tipTextList","_listBox","_listItemIndex","_numberOfSpawnPoints","_randNum","_randData","_randomSpawnIndex"];
//disableSerialization;
ExileClientSpawnLocationSelectionDone = false;
ExileClientSelectedSpawnLocationMarkerName = "";
eXpochClientPlayerBases = [];
[] spawn
{
    uiSleep 0.1;
    waitUntil {!isNull (findDisplay 46)};
    disableSerialization;
    private["_display","_spawnButton","_spawnButton2","_tipText","_tipTextList","_listBox","_listItemIndex","_numberOfSpawnPoints","_randNum","_randData","_randomSpawnIndex"];
	// Normal Code..
	createDialog "xstremeGroundorHaloDialog";
	_display = uiNamespace getVariable ["xstremeGroundorHaloDialog",displayNull];
	_display displayAddEventHandler ["KeyDown", "_this call ExileClient_gui_loadingScreen_event_onKeyDown"];
	_spawnButton = _display displayCtrl 1600;
	_spawnButton2 = _display displayCtrl 1601;
	_spawnButton ctrlEnable false;
	_spawnButton2 ctrlEnable false;
	_tipText = _display displayCtrl 1204;
	_listBox = _display displayCtrl 1500;
	lbClear _listBox;
	{
		if (getMarkerType _x == "ExileSpawnZone") then
		{
			_listItemIndex = _listBox lbAdd (markerText _x);
			_listBox lbSetData [_listItemIndex, _x];
		};
	}
	forEach allMapMarkers;

	//eXpoch base spawn
	if (eXpochClientPlayerLastBaseSpawn < (diag_tickTime - eXpochBaseRespawnTimeLimit)) then
	{
		_mapCenter = [worldSize/2,worldSize/2,0];
		_allTerritoryFlags = (nearestObjects [_mapCenter, ["Exile_Construction_Flag_Static"], ceil(worldSize/1.75 + 3000)]);
		{
			_playerUID = getPlayerUID player;
			_buildRights = _x getVariable [eXpochBaseSpawnAllowedType, []];
			if (_playerUID in _buildRights) then
			{
				_territoryLevelConfig =_x getVariable ["ExileTerritoryLevel", 0];
				if (_territoryLevelConfig >= eXpochBaseSpawnLevelRequired) then
				{
					_baseName = _x getVariable ["ExileTerritoryName", ""];
					eXpochClientPlayerBases pushBack _baseName;
					createMarker [_baseName,getPosATL _x];
					_listItemIndex = _listBox lbAdd _baseName;
					_listBox lbSetData [_listItemIndex, _baseName];
					_listBox lbSetColor [_listItemIndex, [0.72,0.18,0.2,1]];
				};
			};
		}
		forEach _allTerritoryFlags;
	};

	_numberOfSpawnPoints = {getMarkerType _x == "ExileSpawnZone"} count allMapMarkers;
	if (_numberOfSpawnPoints > 0) then
	{
		_randNum = floor(random _numberOfSpawnPoints);
		_randData = lbData [1500,_randNum];
		_randomSpawnIndex = _listBox lbAdd "Random";
		_listBox lbSetData [_randomSpawnIndex, _randData];
		_listBox lbSetColor [_randomSpawnIndex, [0,0.78,0.06,1]];
	};

	_tipTextList = selectRandom
	[
		"Find us at FriendlyPlayerShooting.com",
		"If you enjoy the server, please consider donating to keep it alive!",
		"This is a game of loss, its a wild world out there, good luck!",
		"Check out our Discord at discord.me/friendlyplayershooting"
	];

	_tipText ctrlSetStructuredText parseText format["<t size ='1.8 / (getResolution select 5)' valign='middle' align='right'>%1</t>",_tipTextList];
	true
};

true

 

 

]]>
26326Wed, 02 May 2018 15:06:48 +0000
Xm8/Territory show max constructions in territory detailhttps://exile.majormittens.co.uk/topic/27723-xm8territory-show-max-constructions-in-territory-detail/ Just a little tweak, so when your players are building, they can check their Xm8/territory app to see how many constructions they can build up to for that level, now shows map coordinates too!

nis6dzD.jpg

Grab ExileClient_gui_xm8_slide_territory_onOpen.sqf from client files and change the code to the following:-

Spoiler

/**
 * ExileClient_gui_xm8_slide_territory_onOpen
 *
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_territoryLevelConfigs","_territoryLevelConfig","_numberOfConstructionsAllowed","_display", "_territoryDropDown", "_playerUID", "_flag", "_buildRights", "_size", "_level", "_parts", "_index", "_kickButton", "_leaveButton", "_promoteButton", "_demoteButton", "_radiusButton"];
disableSerialization;
_display = uiNameSpace getVariable ["RscExileXM8", displayNull];
_territoryDropDown = _display displayCtrl 4132;
lbClear _territoryDropDown;
_playerUID = getPlayerUID player;
{
	_flag = _x;
	_buildRights = _flag getVariable ["ExileTerritoryBuildRights", []];
	if (_playerUID in _buildRights) then
	{
		_name = _flag getVariable ["ExileTerritoryName", ""];
		_size = _flag getVariable ["ExileTerritorySize", 0];
		_level = _flag getVariable ["ExileTerritoryLevel", 0];
		_parts = count (_flag nearObjects ["Exile_Construction_Abstract_Static", _size]);
		_territoryLevelConfigs = getArray (missionConfigFile >> "CfgTerritories" >> "prices");
		_territoryLevelConfig = _territoryLevelConfigs select ((_flag getVariable ["ExileTerritoryLevel", 0]) - 1);
		_numberOfConstructionsAllowed = _territoryLevelConfig select 2;
		_index = _territoryDropDown lbAdd (format ["%1 (Level: %2, Radius: %3m, Parts: %4/%5, Coords: %6)",_name, _level, _size, _parts,_numberOfConstructionsAllowed,mapGridPosition _flag]);
		_territoryDropDown lbSetData [_index, netId _flag]; 
	};
}
forEach (allMissionObjects "Exile_Construction_Flag_Static");
_kickButton = _display displayCtrl 4134;
_kickButton ctrlEnable false;
_leaveButton = _display displayCtrl 4135;
_leaveButton ctrlEnable false;
_promoteButton = _display displayCtrl 4136;
_promoteButton ctrlEnable false;
_demoteButton = _display displayCtrl 4137;
_demoteButton ctrlEnable false;
_radiusButton = _display displayCtrl 4138;
_radiusButton ctrlEnable false;
_territoryDropDown lbSetCurSel 0;
true

 


Then, place the file in your mission file and add the path to mission config/CfgExileCustomCode

class CfgExileCustomCode
{
	ExileClient_gui_xm8_slide_territory_onOpen = "myfixes\ExileClient_gui_xm8_slide_territory_onOpen.sqf";//change to your path!
};

Pack your mission and you're done!

Edit: Updated 23rd June 19, will now show coordinates of base

]]>
27723Thu, 28 Mar 2019 10:24:05 +0000
Dynamic Vehicle Spawn with Items in their Inventoryhttps://exile.majormittens.co.uk/topic/9184-dynamic-vehicle-spawn-with-items-in-their-inventory/ Hey Exile Community,

one of my players came up with a great idea ... random spawned vehicles should have some goodies in their inventory.

And i thought ... why not share this, with everyone here ... so short and simple:

Here it is: https://github.com/Jenartor/exile-vehicle_spawn_with_inventory

]]>
9184Thu, 24 Dec 2015 04:59:48 +0000
[Release] CUP AI Shiphttps://exile.majormittens.co.uk/topic/24570-release-cup-ai-ship/ Me and my friends made a custom AI ship and I decided to share it with the community. The ship has vehicles and crates full of weapons and equipment inside it. I have imported it on the maps Altis, Tanoa, Malden, and Chernarus. If you wish additional maps please let me know. The ship has an AI boat and helicopter that does patrols as well as many AI inside. There is an working elevator within the ship to move vehicles around. You will need a lifting script like R3F Logistics to lift vehicles off ship. There is a AH-1Z on the main deck of the ship that players can take once they secure the ship. You will need some experience with Eden Editor to import/merge this on your current map. If you are unfamiliar with doing this see the my guide in my signature. There is an Eden section that should get you pointed in the right direction. Lastly, you will need Extended Base Mod (EBM) as well as CUP Units, Vehicles, and Weapons in order to use the ship.

Steps are simple:

1. Place your map pbo (i.e. Exile.Altis) into your missions folder within "My Documents" and extract (see my guide).

2. Drop the "AIShip.pbo" within the same folder as your map .pbo.

3. Extract the "AIShip.pbo" into its own folder "AIShip.*Map*.pbo" (same as step 1).

4. Ensure you have EBM, CUP Units, Vehicles, and Weapons loaded and launch ARMA 3.

5. Open your map pbo in Eden Editor.

6. Merge the "AIShip.*Map*" with your current map.

7. Save your map pbo, Repbo it and upload to your server.

The items on the ship may seem like they are floating in the air. Don't worry when your server loads it they will be on the correct level. You may reposition the ship and all the items within Eden if you don't like where the ship is at on map. If you do this though you will have to adjust the height of the ship or items on the ship.

Required Addons:

CBA_A3

CUP Units

CUP Weapons

CUP Vehicles

Extended Base Mod

R3F Logistics (optional)

DOWNLOADS:

AIShip.Altis

AIShip.Chernarus

AIShip.Tanoa

AIShip.Malden

Note: Players enter the ship at the rear. There is an scroll option to open back gate.

Spoiler

20171006181910_1.jpg20171006182018_1.jpg20171006181927_1.jpg20171006182136_1.jpg20171006182031_1.jpg20171006182250_1.jpg20171006182232_1.jpg20171006182439_1.jpg20171006182317_1.jpg

]]>
24570Sat, 07 Oct 2017 06:21:30 +0000
[Updated] R3F Logistics Exile (with CUP)https://exile.majormittens.co.uk/topic/20199-updated-r3f-logistics-exile-with-cup/ This is merely a rework on what @SLB2k11 has done I just expanded on it.  R3F Logistics is a towing, lifting, and container moving mod that can be used on any type of server.  This version is modified for Exile (obviously).  Follow the normal installation guide from the link below.  I did include my own Battle Eye filters, but all you need is to find the R3F lines in the script.txt and apply them to your own.  Also, I do use CUP Vehicles so if you don't make sure to comment out the line in the config.sqf.  Again this is not my mod/script.  I had a hard time finding and adding all of the vehicles for Exile and figured I would share my work.  

Update: I have added lifting for helicopters to support the release of my AI ships. You may disable this if you desire.

What's enabled :

1. All vehicles can be towed.

2. All vehicles other than cars can tow.

3. Quads, Bikes, Karts, and Rubber boats can be loading into vehicles.
    (These items can not hold crates or other vehicles)
4. Boats can tow Subs (SDV).

5. All crates can be loaded in vehicles (not cars).

6. Boats can be towed by vehicles (not cars).

7. Water crates can be picked up for storing (no SDV requirement).

8. All aircraft can store crates and every item listed in #3.

9. *NEW* All helicopters can now lift vehicles and tanks.

You can customize these values just follow the instructions guide it will tell you how.  I will list vehicles from other mods as I get to it.  If you need help on adding another mods vehicles into R3F just let me know.  Read the instructions carefully.  You will notice that there are actually no lines that specifically say "Exile_Car_xxxx".  This is because I used the higherarchy system to cover all of a specific vehicle.  For example the "Exile_Car_Offroad_Repair_Red" is automatically included when you add  "Offroad_01_repair_base_F". The latter line will include all Offroad vehicles without having to add each variant of the vehicle line by line.  A note on the trucks for Exile: I didn't bother to add each truck individually so all the trucks are included in the line "Truck_F" this includes the HEMMT and Zamak.  I will break the trucks down further in the future.  

DOWNLOAD

Other Links:

R3F Logistics Main Post

Instructions Guide

Server Owner Guide v1.1

]]>
20199Mon, 19 Dec 2016 01:48:57 +0000
ExAd addon spawn Exile Supply Cratehttps://exile.majormittens.co.uk/topic/24021-exad-addon-spawn-exile-supply-crate/ All credit goes to Janski for his amazing addon ExAd

This is just an edit to add Exile_Container_SupplyBox so players can craft them to use with looting missions, looting in general or moving their bases, they are not persistent after restart unless you still have the install option under class CfgInteractionMenus

This is assuming you already have ExAd installed and working on your server with exad_dv.pbo in your @ExileServer\addons folder

Go to your mission.pbo [I.E. Exile.Altis] open up config.cpp with notepad++ or your primary editing tool

Find extraApps and add at the end ,"Supply_Box"

It should look like this

  Reveal hidden contents

Then go to the bottom of your ExAd XM8 Class and add this

    class Supply_Box
    {
        title = "Supply Crate";
        bambiState = 0;
        vehicleClass = "Exile_Container_SupplyBox";
        recipe[] = {{"Exile_Item_WoodPlank",2}};
        packable = 1;
        quickFunction = "['Supply_Box'] call ExAd_XM8_DV_fnc_spawnVehicle";
    };

it should look like this

  Reveal hidden contents

 

repack pbo and restart server

]]>
24021Tue, 08 Aug 2017 16:29:39 +0000
[RELEASE] ExileMod Re-Arm/Repair (New Release 16/09/18!)https://exile.majormittens.co.uk/topic/20311-release-exilemod-re-armrepair-new-release-160918/ Repair/Rearm script for exilemod.

Features:

  • Custom GUI (see pics below)
  • Reloads all ammo types including smokes and flares.
  • Per Bullet pricing for re-arming (define the cost for each bullet to be loaded, for each bullet type). Definable in the config file.
  • Definable items used to determine cost of repairs (e.g. will retrieve the price of a wheel in the trader to determine repair cost for a wheel).
  • % damage of parts determines final cost of repairs
  • Both in vehicle and out of vehicle access to the service centre menu option (configurable)
  • Highly configurable through a consolidated config file (configure everything in one location, from bullet cost to trigger objects!)
  • Wide range of config options in the config file inc. enable/disable refueling, enable or disable default Arma refueling, configurable to work/not in safezones, configurable to work/not in territories, configurable to work/not if aggro'd, configurable (on/off) service point markers.
  • Repair/reload sounds played

 

Spoiler

VehicleService1.thumb.jpg.1b9e952f7e1e159d76ff6b7df83a4add.jpg

VehicleService2.thumb.jpg.7a9865bc8db9a7e1bb3894e2f849ac63.jpg

VehicleService3.thumb.jpg.7ae3d158c9a54fa8bd927c0b84e7c267.jpg

Download:

https://github.com/Bones50/Advanced-Vehicle-Service-Centre

Install Instructions in the link.

Enjoy!

]]>
20311Mon, 26 Dec 2016 23:36:43 +0000
[Release] xsSpawn | Ground Spawn or Halo Selectionhttps://exile.majormittens.co.uk/topic/22983-release-xsspawn-ground-spawn-or-halo-selection/ What is it?
It is a custom spawn selection screen that replaces the default exile spawn selection and it gives you the option to either halo spawn or ground spawn.
You can also add your server logo and custom messeages to be displayed when your players spawn, like important announcments or server tips.

20170521230332_1.jpg

Download: https://github.com/xstremebam/xsSpawn

How to Install:

Client Side:
Step 1: Copy the xs folder to your mission root (same location as mission.sqm)

Step 2: Open description.ext in your mission root folder and paste the following at the bottom and save

#include "xs\spawn\Dialog\xsSpawnDefines.hpp"
#include "xs\spawn\Dialog\xsSpawnDiaglog.hpp"

Step 3: In your mission root open config.cpp and find class CfgExileCustomCode and insert the below

//Spawn Selection by bambam
ExileClient_gui_selectSpawnLocation_event_onSpawnButtonClick = "xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_event_onSpawnButtonClick.sqf";
ExileClient_gui_selectSpawnLocation_show = "xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_show.sqf";
ExileClient_gui_selectSpawnLocation_zoomToMarker = "xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_zoomToMarker.sqf";
ExileClient_gui_selectSpawnLocation_event_onListBoxSelectionChanged = "xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_event_onListBoxSelectionChanged.sqf";
ExileServer_object_player_createBambi = "xs\spawn\Overwrites\ExileServer_object_player_createBambi.sqf";

For Example:
class CfgExileCustomCode 
{    
    //Spawn Selection by bambam
    ExileClient_gui_selectSpawnLocation_event_onSpawnButtonClick = "xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_event_onSpawnButtonClick.sqf";
    ExileClient_gui_selectSpawnLocation_show = "xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_show.sqf";
    ExileClient_gui_selectSpawnLocation_zoomToMarker = "xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_zoomToMarker.sqf";
    ExileClient_gui_selectSpawnLocation_event_onListBoxSelectionChanged = "xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_event_onListBoxSelectionChanged.sqf";
    ExileServer_object_player_createBambi = "xs\spawn\Overwrites\ExileServer_object_player_createBambi.sqf";
};

Step 4: Open xs\spawn\Overwrites\ExileClient_gui_selectSpawnLocation_show.sqf and at the bottom you can edit the one liners to suit your server
Each time a player spawns it will randomly select one of these lines to display on their spawn selection screen as seen in the above screenshot.

_tipTextList = selectRandom 
[
    "Connect to the xstreme gaming discord at discord.xstremegaming.com",
    "Server news, comp claims and more join the communnity www.xstremegaming.com",
    "This is a game of loss, its a wild world out there, good luck!",
    "Enjoy the server... Please consider donating to help keep us alive",
    "Any vehicle left inside the black safezone circle will be deleted at restart",
    "Press 'M' key for Map in game to view Server Rules and Building Limits",
    "Do not leave vehicles on exile base parts, at restart they will likely explode",
    "Press the 'U' key when your loaded in to show your FPS on the Status bar"
];

Step 5: Change the logo to your logo (.paa format) & Change the Background (.paa format)
In the \xs\spawn folder simply replace the images with your own
- xsbackground.paa
- xslogo.paa

Only have jpegs?
- Open \xs\spawn\Dialog\xsSpawnDiaglog.hpp
- Locate class xsSpawnBackground: xsSpawnRscPicture (first control)
replace: text = "xs\spawn\xsbackground.paa"; with: text = "xs\spawn\xsbackground.jpg";
- Locate class xsSpawnLogo: xsSpawnRscPictureKeepAspect (second control)
replace: text = "xs\spawn\xslogo.paa"; with: text = "xs\spawn\xslogo.jpg";
- In the \xs\spawn folder insert your jpg image with the correct image names
- xsbackground.jpg
- xslogo.jpg

Server Side:
Step 6: Open @exileserver\addons\exile_server_config\config.cpp
Locate class BambiSettings and make sure your settings for halo match the below
parachuteSpawning = 1;
haloJump = 1;
parachuteDropHeight = 1000; (this ones up to you)

Step 7: If you use infistar you will need to add the following idd number to your allowed idd list
- Open a3_infiSTAR_Exile\EXILE_AHAT_CONFIG.hpp
- Look for allowedIDDs[] =
- Insert 86000,    // xsSpawn above the last number 46

For Example:
allowedIDDs[] =
{
    /* default idds */
    -1,0,4,5,6,8,12,18,24,49,54,55,70,101,160,174,177,999,131,63,602,301,

    /* exile idds */
    24001,24002,20023,24005,24004,24010,24025,20021,20017,24012,24027,
    20019,20016,24007,20024,20018,24008,24011,24015,24000,24006,24014,
    20020,24026,4002,4000,4001,4003,1500,

    24033,24030,24029,24028,24031,24034,

    4004,21000,    // Bounty system and MarXet
    8457,    // http://exile.majormittens.co.uk/topic/9040-xm8-apps/
    65431,    // r3f menu fix
    6666,    // Paintshop
    0711,    // Advanced Banking
    0720,    // Virtual Garage
    5501,5502,5503,5504,5505,5506,5507,    // BRAma Cookbook
    -1339,-1340,    // custom infiSTAR dialogs (some editor & a private chat menu)

    86000,    // xsSpawn
    /* main idd - never delete it */
    46
};

That is it i hope you enjoy.

]]>
22983Sun, 21 May 2017 22:26:44 +0000
Remove certain ammo from vehicles.https://exile.majormittens.co.uk/topic/24174-remove-certain-ammo-from-vehicles/ The script is self explanatory. 
Ammo is removed and so are the weapons when you get in the vehicle, so when you buy it from trader, you don't even notice.

The Readme on GITHUB explains all. 

Thanks to those who helped:

@wombdilator for helping me with the jets configs.

and @eraser1 for the help with Event handler configs earlier on this year!

and @MGTDB for his work on this and @kuplion for the pointers!

 

Link: https://github.com/GamingAtDeathsDoor/Remove-Vehicle-Ammo

]]>
24174Wed, 23 Aug 2017 22:35:03 +0000
ExAd v1.0.4https://exile.majormittens.co.uk/topic/25899-exad-v104/ Guys do to real life stuff I am unable to work on Exile anymore. I am not certain this version of ExAd still works. If someone wants to fix it like @Monkeynutz please do. I just can't find the time to work on scripting at the moment. 

_______________________________________________________________________________________________________________

First, thanks to @Janski and @Monkeynutz for giving us this awesome mod in the first place. I understand they have been under intense scrutiny to fix ExAd to work on latest Exile release. Second, thanks to @Spazz711 and @Razor77 for working with the community and providing a solid update that works. I am merely the guy that put all their work into a simple download that will hopefully be easy for others to implement. Now without further adieu ExAd v1.0.4.

This version of ExAd includes the following additions:

ExAd Server Rules

ExAd View Distance Settings

ExAd Unit Scanner by @jaxx0rr & @woodysg

ExAd Virtual Garage (removable)

BRAmaRecipes

Basemarker by @Lunchbox

ExAd Statusbar

ExAd Deploy Quad Bike

Recuit AI Bodyguards by @aussie battler

 

Again this is not my work, but a compile of mods/apps that will work on current version of Exile 1.0.4. My hope is to make things a bit easier for the community to employ these apps. Please follow the directions located in the README file provided. If you get confused read original ExAd documentation.

DOWNLOAD

 

]]>
25899Tue, 13 Mar 2018 07:20:00 +0000
[Release] Ducks of Warhttps://exile.majormittens.co.uk/topic/25818-release-ducks-of-war/ Demo: (yes the video doesn't show the body being removed, was made before that was fixed.)

Another contribution to the PVP mod community. Introducing Ducks of War... What this mod does is add the option to "Claim a Trophy" from a PVP killed player.  The trophy in this case happens to be a rubber ducky. Which they can collect and sell at the traders. You adjust the value of the duck in the code provided below. Here are the conditions.

  • Body must be a player (no NPC or Zombies)
  • Player must be killed as a direct result of PVP, no bambis, team-kills, crashes, accidents or suicides.
  • Once trophy claimed, body will be removed. (so collect gear FIRST!) *Thanks to StokesMagee

Installation:

Create the file dow_claimtrophy.sqf and put it somewhere in your mission folder.. For mine i use the folder addons.

Spoiler

/* --------------------------------------------------
 * Ducks of war mod
 * Created by Geekm0nkey for Arma 3 Exile.
 * Copyright 2018, Geekm0nkey, All rights reserved.
 * --------------------------------------------------
 */
 
private["_target","_victim","_killer","_killType","_credit","_reward"];

_target     = _this select 0;
_victim     = _target getVariable["ExileName", "-unknown-"];
_killer     = _target getVariable["DOWGV_killer", 0];
_killType     = _target getVariable["DOWGV_killType", 0];

if (_killer == name player) then
{
    _credit = "your";
}else
{
    _credit = "someone else's";
};

["SuccessTitleAndText", ["DOW: Trophy search!", format["looking for a trophy from %1 kill.", _credit]]] call ExileClient_gui_toaster_addTemplateToast;

switch (_killType) do
{
    default
    {
        player playMove "AinvPknlMstpSnonWnonDr_medic1";
        uisleep 10;
        ["ErrorTitleAndText", ["DOW: Trophy failed!", format["No trophy can be collected at this time from %1.", _victim]]] call ExileClient_gui_toaster_addTemplateToast;
    };
    case 3:
    {
        player playMove "AinvPknlMstpSnonWnonDr_medic1";
        uisleep 10;
        ["ErrorTitleAndText", ["DOW: Trophy failed!", format["%1 was killed in an accident! Cannot collect from crash test dummies.", _victim]]] call ExileClient_gui_toaster_addTemplateToast;
    };
    case 4:
    {
        player playMove "AinvPknlMstpSnonWnonDr_medic1";
        uisleep 10;
        ["ErrorTitleAndText", ["DOW: Trophy failed!", format["%1 was killed by NPC! Cannot collect from AI kills.", _victim]]] call ExileClient_gui_toaster_addTemplateToast;
    };
    case 5:
    {
        player playMove "AinvPknlMstpSnonWnonDr_medic1";
        uisleep 10;
        ["ErrorTitleAndText", ["DOW: Trophy failed!", format["%1 was team-killed! Cannot collect from dishonorable kills.", _victim]]] call ExileClient_gui_toaster_addTemplateToast;
    };
    case 6:
    {
        player playMove "AinvPknlMstpSnonWnonDr_medic1";
        uisleep 10;
        ["ErrorTitleAndText", ["DOW: Trophy failed!", format["%1 was a BAMBI! Cannot collect from fresh spawns.", _victim]]] call ExileClient_gui_toaster_addTemplateToast;
    };
    case 7:
    {
        player playMove "AinvPknlMstpSnonWnonDr_medic1";
        _target setVariable["DOWGV_killType", 0];
        player action ["hideBody", _target];
        uisleep 10;
        deleteVehicle _target;
        _target setPos [0,0,0];
        _reward = createVehicle [ "WeaponHolderSimulated", player modelToWorld [0,2,.5], [], 0, "CAN_COLLIDE" ];  
        _reward addMagazineCargoGlobal ["Exile_item_RubberDuck", 1];
        ["SuccessTitleAndText", ["DOW: Trophy collected!", format["You have successfully claimed your trophy of a rubber ducky from %1.", _victim]]] call ExileClient_gui_toaster_addTemplateToast;
    };
};

 

Next Step:

Edit the file initPlayerLocal.sqf if you have it, or make one.. And add this near the top. Make sure to adjust the folder to match yours.

Spoiler

// Ducks of war mod
DOW_FN_ClaimTrophy = compileFinal preprocessFileLineNumbers "addons\dow_claimtrophy.sqf";

Next Step:

Edit the file config.cpp and add the following... Find "class Player" >> "class Actions" look for "Identify Body" put this code below that block of code so that it looks like the following. Do not duplicate the identify body section, this is just an example of how it should look.

Spoiler

class Identify: ExileAbstractAction
            {
                title = "Identify Body";
                condition = "!(alive ExileClientInteractionObject)";
                action = "_this call ExileClient_object_player_identifyBody";
            };
           
            // Ducks of war mod
            class Trophy: ExileAbstractAction
            {
                title = "Claim Trophy";
                condition = "!(alive ExileClientInteractionObject)";
                action = "_this call DOW_FN_ClaimTrophy";
            };

Next Step:

By now, you should have an overwrite created for a killfeed... If you don't, wouldn't hurt to create one. I will provide a copy of mine for you but you only need the 2 lines that pertain to this mod to be added to yours if you already have one. *Thanks to Kuplion.

Spoiler

/**
 * ExileServer_object_player_event_onMpKilled
 *
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * Modified by [FPS]kuplion - www.friendlyplayershooting.com
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_victim","_killer","_countDeath","_countKill","_killSummary","_killingPlayer","_killType","_oldVictimRespect","_newVictimRespect","_oldKillerRespect","_newKillerRespect","_systemChat","_modifyVictimRespect","_respectLoss","_perks","_minRespectTransfer","_respectTransfer","_perkNames","_killerStatsNeedUpdate","_newKillerFrags","_victimStatsNeedUpdate","_newVictimDeaths","_victimPosition"];
_victim = _this select 0;
_killer = _this select 1;
//_instigator = _this select 2; // 1.0.3 Seems to be bugged
if (!isServer || hasInterface || isNull _victim) exitWith {};
_victim setVariable ["ExileDiedAt", time];
if !(isPlayer _victim) exitWith {};
_victim setVariable ["ExileIsDead", true];
_victim setVariable ["ExileName", name _victim, true];
_countDeath = false;
_countKill = false;
_killSummary = [];
_killingPlayer = _killer call ExileServer_util_getFragKiller;
_killType = [_victim, _killer, _killingPlayer] call ExileServer_util_getFragType; // 1.0.2 files as a temp fix
//_killType = [_victim, _killer, _killingPlayer, _instigator] call ExileServer_util_getFragType; // 1.0.3 Seems to be bugged
_oldVictimRespect = _victim getVariable ["ExileScore", 0];
_newVictimRespect = _oldVictimRespect;
_oldKillerRespect = 0;
if !(isNull _killingPlayer) then
{
    _oldKillerRespect = _killingPlayer getVariable ["ExileScore", 0];
};
_newKillerRespect = _oldKillerRespect;

// Ducks of war mod
_victim setVariable["DOWGV_killer", name _killingPlayer, 0];
_victim setVariable["DOWGV_killType", _killType, 0];

switch (_killType) do
{
    default
    {
        _unknownReasons =
        [
            "%1 died because... Arma.",
            "%1 died because the universe hates him.",
            "%1 died a mysterious death.",
            "%1 died and nobody knows why.",
            "%1 died because that's why.",
            "%1 died because %1 was very unlucky.",
            "%1 died due to Arma bugs and is probably very salty right now.",
            "%1 died an awkward death.",
            "%1 died. Yes, %1 is dead. Like really dead-dead."
        ];
        _countDeath = true;
        _systemChat = format [selectRandom _unknownReasons, name _victim];
        _newVictimRespect = _oldVictimRespect - round ((abs _oldVictimRespect) / 100 * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Percentages" >> "unlucky")));
    };
    case 1:
    {
        private["_zombieKill"];
        _victimPosition = position _victim;
        _bystanders = _victimPosition nearEntities ['Man',5];
        _zombieKill = false;
        {
            _zombieKill = getText(configFile >> 'CfgVehicles' >> typeOf _x >> 'author') isEqualTo 'Ryan';
        } forEach _bystanders;
       
        if(_zombieKill) then
        {
        _countDeath = true;
        _modifyVictimRespect = true;
        _zombieDeath = selectRandom ["was killed", "was eaten"]; //Add more messages here to change the killed text
        _systemChat = format ["%1 %2 by a zombie!", name _victim, _zombieDeath];
        _newVictimRespect = _oldVictimRespect - round ((abs _oldVictimRespect) / 100 * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Percentages" >> "suicide")));
        }
        else
        {
       
        _countDeath = true;
        _modifyVictimRespect = true;
        _systemChat = format ["%1 commited suicide!", name _victim];
        _newVictimRespect = _oldVictimRespect - round ((abs _oldVictimRespect) / 100 * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Percentages" >> "suicide")));
        };
    };
    case 2:
    {
        _countDeath = true;
        _countKill = false;
        _systemChat = format ["%1 died while playing Russian Roulette!", name _victim];
        _newVictimRespect = _oldVictimRespect;
        _victim call ExileServer_system_russianRoulette_event_onPlayerDied;
    };
    case 3:
    {
        _countDeath = true;
        _countKill = false;
        _systemChat = format ["%1 crashed and died!", name _victim];
        _newVictimRespect = _oldVictimRespect - round ((abs _oldVictimRespect) / 100 * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Percentages" >> "crash")));
    };
    case 4:
    {
        _countDeath = true;
        _countKill = false;
        _npcDeath = selectRandom ["was killed", "was murdered"]; //Add more messages here to change the killed text
        _systemChat = format ["%1 %2 by an NPC!", name _victim, _npcDeath];
        _newVictimRespect = _oldVictimRespect - round ((abs _oldVictimRespect) / 100 * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Percentages" >> "npc")));
    };
    case 5:
    {
        _countDeath = false;
        _countKill = false;
        _systemChat = format ["%1 was team-killed by %2!", name _victim, name _killingPlayer];
        _respectLoss = round ((abs _oldKillerRespect) / 100 * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Percentages" >> "friendyFire")));
        _newKillerRespect = _oldKillerRespect - _respectLoss;
        _killSummary pushBack ["FRIENDLY FIRE", -1 * _respectLoss];
    };
    case 6:
    {
        _countDeath = false;
        _countKill = false;
        _systemChat = format ["%1 was killed by %2! (BAMBI SLAYER)", name _victim, name _killingPlayer];
        _respectLoss = round ((abs _oldKillerRespect) / 100 * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Percentages" >> "bambiKill")));
        _newKillerRespect = _oldKillerRespect - _respectLoss;
        _killSummary pushBack ["BAMBI SLAYER", -1 * _respectLoss];
    };
    case 7:
    {
        private["_weapon","_weaponDisplayName","_weaponScope","_weaponScopeDisplayName","_vehicle"];
        _countDeath = true;
        _countKill = true;
        _perks = [_victim, _killer, _killingPlayer] call ExileServer_util_getFragPerks;
        _minRespectTransfer = getNumber (configFile >> "CfgSettings" >> "Respect" >> "minRespectTransfer");
        _respectTransfer = round ((abs _oldVictimRespect) / 100 * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Percentages" >> "frag")));


       
        _weapon = currentWeapon _killer;
        _weaponDisplayName = getText (configfile >> "CfgWeapons" >> _weapon >> "displayName");
               
        if !((vehicle _killer) isEqualTo _killer) then
        {
            _weapon = vehicle _killer weaponsTurret (assignedVehicleRole _killer select 1);
            _weaponDisplayName = getText (configfile >> "CfgWeapons" >> _weapon select 0 >> "displayName");
        };
       
        _weaponScope = "";
        _weaponScopeDisplayName = "Iron Sights";
        if ((vehicle _killer) isEqualTo _killer) then
        {
            _weaponScope = (_killer weaponAccessories (currentWeapon _killer)) select 2;
            if !(_weaponScope isEqualTo "") then
            {
                _weaponScopeDisplayName = getText (configfile >> "CfgWeapons" >> _weaponScope >> "displayName");
            };
        };
       
        if (_respectTransfer < _minRespectTransfer) then
        {
            _respectTransfer = _minRespectTransfer;
        };
        _newVictimRespect = _oldVictimRespect - _respectTransfer;
        _newKillerRespect = _oldKillerRespect + _respectTransfer;
        _killSummary pushBack ["ENEMY FRAGGED", _respectTransfer];
        if (_perks isEqualTo []) then
        {
            if !((vehicle _killer) isEqualTo _killer) then
            {
            _systemChat = format ["%1 was killed by %2", name _victim, name _killingPlayer];
            }
            else
            {
            _systemChat = format ["%1 was killed by %2 with a %3 (%4)!", name _victim, name _killingPlayer, _weaponDisplayName, _weaponScopeDisplayName];
            };
           
        }
        else
        {
            if !((vehicle _killer) isEqualTo _killer) then
            {
            _perkNames = [];
            {
                _perkNames pushBack (_x select 0);
                _killSummary pushBack _x;
                _newKillerRespect = _newKillerRespect + (_x select 1);
            }
            forEach _perks;
            _systemChat = format ["%1 was killed by %2! (%3)", name _victim, name _killingPlayer, _perkNames joinString ", "];
            }           
            else
            {
            _perkNames = [];
            {
                _perkNames pushBack (_x select 0);
                _killSummary pushBack _x;
                _newKillerRespect = _newKillerRespect + (_x select 1);
            }
            forEach _perks;
            _systemChat = format ["%1 was killed by %2 with a %3 (%4)! (%5)", name _victim, name _killingPlayer, _weaponDisplayName, _weaponScopeDisplayName, _perkNames joinString ", "];
            };
           
        };
    };
};
if !(isNull _killingPlayer) then
{
    if !(_killSummary isEqualTo []) then
    {   
        [_killingPlayer, "showFragRequest", [_killSummary]] call ExileServer_system_network_send_to;
    };
};
if !(isNull _killingPlayer) then
{
    _killerStatsNeedUpdate = false;
    if (_countKill) then
    {
        _newKillerFrags = _killingPlayer getVariable ["ExileKills", 0];
        _newKillerFrags = _newKillerFrags + 1;
        _killerStatsNeedUpdate = true;
        _killingPlayer setVariable ["ExileKills", _newKillerFrags];
        format["addAccountKill:%1", getPlayerUID _killingPlayer] call ExileServer_system_database_query_fireAndForget;
    };
    if !(_newKillerRespect isEqualTo _oldKillerRespect) then
    {
        _killingPlayer setVariable ["ExileScore", _newKillerRespect];
        _killerStatsNeedUpdate = true;
        format["setAccountScore:%1:%2", _newKillerRespect, getPlayerUID _killingPlayer] call ExileServer_system_database_query_fireAndForget;
    };
    if (_killerStatsNeedUpdate) then
    {
        _killingPlayer call ExileServer_object_player_sendStatsUpdate;
    };
};
_victimStatsNeedUpdate = false;
if (_countDeath) then
{
    _newVictimDeaths = _victim getVariable ["ExileDeaths", 0];
    _newVictimDeaths = _newVictimDeaths + 1;
    _victim setVariable ["ExileDeaths", _newVictimDeaths];
    _victimStatsNeedUpdate = true;
    format["addAccountDeath:%1", getPlayerUID _victim] call ExileServer_system_database_query_fireAndForget;
};
if !(_newVictimRespect isEqualTo _oldVictimRespect) then
{
    _victim setVariable ["ExileScore", _newVictimRespect];
    _victimStatsNeedUpdate = true;
    format["setAccountScore:%1:%2", _newVictimRespect, getPlayerUID _victim] call ExileServer_system_database_query_fireAndForget;
};
if (_victimStatsNeedUpdate) then
{
    _victim call ExileServer_object_player_sendStatsUpdate;
};
if ((vehicle _victim) isEqualTo _victim) then
{
    if !(underwater _victim) then
    {
        if !(_victim call ExileClient_util_world_isInTraderZone) then
        {
            _victim call ExileServer_object_flies_spawn;
        };
    };
};
if !(_systemChat isEqualTo "") then
{
    if ((getNumber (configFile >> "CfgSettings" >> "KillFeed" >> "showKillFeed")) isEqualTo 1) then
    {
        ["systemChatRequest", [_systemChat]] call ExileServer_system_network_send_broadcast;
    };
};
if !(_systemChat isEqualTo "") then
{
    if ((getNumber (configFile >> "CfgSettings" >> "Logging" >> "deathLogging")) isEqualTo 1) then
    {
        "extDB2" callExtension format["1:DEATH:%1", _systemChat];
    };
};
_victimPosition = getPos _victim;
format["insertPlayerHistory:%1:%2:%3:%4:%5", getPlayerUID _victim, name _victim, _victimPosition select 0, _victimPosition select 1, _victimPosition select 2] call ExileServer_system_database_query_fireAndForget;
format["deletePlayer:%1", _victim getVariable ["ExileDatabaseId", -1]] call ExileServer_system_database_query_fireAndForget;
true

or just the lines in question, which need to be added below where _killType is defined.

Spoiler

// Ducks of war mod
_victim setVariable["DOWGV_killer", name _killingPlayer, 0];
_victim setVariable["DOWGV_killType", _killType, 0];

Last Step:

You need to add the duck to the trader data so that the player can sell it. (if you already have the duck, it will need to be removed as this is the trophy item) You add this in the config.cpp or if using the easy trader mod, in the ExileItemsList.sqf as.

Spoiler

class Exile_item_RubberDuck                { quality = 1; price = 10000; sellPrice = 10000; };

Make the price and sellprice the same.

And your done... Hope you enjoy.

]]>
25818Wed, 07 Mar 2018 18:02:35 +0000
[Release] Recruit Ai Bodyguardshttps://exile.majormittens.co.uk/topic/23933-release-recruit-ai-bodyguards/ Description: Recruit Ai Body guards from your XM8 or from placed objects on the map.

How it works: Recruit an Ai Guard from your Xm8 using beef parts. The ai will auotmatically join the group (controlled by the player who made the party).

Rules: Ai despawns on restarts. Ai only attacks mission ai (only tested on DMS Ai).

Command Ai movement:
1. Press ESC>Configure>Controls>Show:Command

2. Change the "ACTION" of "Select Unit 1" to the key of your choice (I used "semicolon"). Press "OK" and go back to the game.

3. Press "semicolon" to select your Ai, then hit "space bar"

4. Move your mouse to the position you wish the Ai to hold or vehicle you wish the Ai to enter. Now hit the "space bar" :)

Command Ai to drive:

1. Exist a vehicle from a passenger seat.
2. Order the Ai will hop in the vehicle.
3. Get in the vehicle & mark waypoints on the map. You can also take over driving.

(thanks to @TheDaddy for the Ai driving tip)

I would like to change the ai behaviour to help kill other Exile Players out of the players group & also command the Ai. Let me know if you have any ideas.

Install V2: Scroll to the bottom (replaces the XM8 server info button + able to choose between 6 different ai soldiers).

https://github.com/aussie-battler/Salty-Dog-Exile-Recruit-Ai-V2

Install V1: Recruit Ai from your XM8.

  1. Install ExAd by @Janski https://goo.gl/VBxFFa

  2. Drop the DeployVehicle folder into your.mission\ExAdClient\XM8\Apps\DeployVehicle   found here https://github.com/aussie-battler/Salty-Dog-Exile-Recruit-Ai
    Make sure you drop the Deploy Vehicle server file in your @ExileServer/addons folder found here https://github.com/aussie-battler/Salty-Dog-Exile-Recruit-Ai/tree/master/ExileServer/addons

  3. In config.cpp search for class CFGXM8 

         Add the following to extraApps[] = { };
 

Spoiler

"ExAd_Unit"

        The line should now read: extraApps[] = {"ExAd_Unit"};

  1. Underneath the class CfgXM8, edit it to read:

         

Spoiler

class CfgXM8
{
    extraApps[] = {"ExAd_Unit"};
    
        class settings
    {
        controlID = 4070;
        appID = "App01";
        title = "Settings";
    };
    
    class healthScanner
    {
        controlID = 4120;
        appID = "App02";
        title = "Health Scanner";
    };
    
    class slothMachine
    {
        controlID = 4140;
        appID = "App03";
        title = "Sloth Machine";
    };
    
    class ExAd_Unit
    {
        title = "Recruit Soldier: x2 Beef Parts needed";
        logo = "ExAdClient\XM8\Apps\DeployVehicle\dog.paa";
        bambiState = 0;
        vehicleClass = "Land_AncientStatue_01_F";
        recipe[] = {{"Exile_Item_BeefParts",1}};
        packable = 0;
        autoCleanUp = 0;
        quickFunction = "['ExAd_Unit'] call ExAd_XM8_DV_fnc_spawnVehicle";
    };

};

/*
    XM8 Extra apps, the Exile way of doing it
    
    Here is an example app layout:
    class XM8_App01_Button: RscExileXM8AppButton1x1
    {
        textureNoShortcut = "";      // Path to picture. This can be via mission file or client side PBO
        text = "";                    // The name of the app to be display on the button
        onButtonClick = "";            // The code to fire when the app is clicked
        resource = "";                // The name of the resource to load for the app, leave as an empty string if you just want to run code without a GUI, like BOOM or spawning a bike
    };
*/

class XM8_App01_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "\exile_assets\texture\ui\xm8_app_settings_ca.paa";
    text = "Settings";
    onButtonClick = "['settings', 0] call ExileClient_gui_xm8_slide";
    resource = "XM8SlideSettings";
};

class XM8_App02_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "\exile_assets\texture\ui\xm8_app_health_scanner_ca.paa";
    text = "Health Scanner";
    onButtonClick = "['healthScanner', 0] call ExileClient_gui_xm8_slide";
    resource = "XM8SlideHealthScanner";
};

class XM8_App03_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "\exile_assets\texture\ui\xm8_app_slothMachine_ca.paa";
    text = "Sloth Machine";
    onButtonClick = "['slothMachine', 0] call ExileClient_gui_xm8_slide";
    resource = "XM8SlideSlothMachine";
};

class XM8_App04_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "\exile_assets\texture\ui\xm8_app_boom_ca.paa";
    text = "BOOM!";
    onButtonClick = "call ExileClient_system_breaching_detonate";
    resource = "";
};


class XM8_App5_Button: RscExileXM8AppButton1x1
{
textureNoShortcut = "ExAdClient\XM8\Apps\Unit\dog.paa";
text = "Recruit Soldier: 1x Beef Parts needed";
onButtonClick = "ExileClientXM8CurrentSlide = 'apps';closeDialog 0;[] execVM 'ExAdClient\XM8\Apps\Unit\bodyguard.sqf'";
resource = "";
};

class XM8_App06_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};

class XM8_App07_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};

class XM8_App08_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};

class XM8_App09_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};

class XM8_App10_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};

class XM8_App11_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};

class XM8_App12_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};

class XM8_App13_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};

class XM8_App14_Button: RscExileXM8AppButton1x1
{
    textureNoShortcut = "";
    text = "";
    onButtonClick = "";
    resource = "";
};   

      5.  In config.cpp search for BeefParts and change the line to:          

Spoiler

class Exile_Item_BeefParts                                 { quality = 1; price = 50000; sellPrice = 14;};              // change the buy/sell price to whatever suits.

 

Want to make changes?

  1. Change the XM8 logo at:

your.mission\ExAdClient\XM8\Apps\DeployVehicle\dog.paa

In config.cpp under "class ExAd_Unit", change the line to suit your logo name

logo = "ExAdClient\XM8\Apps\DeployVehicle\dog.paa";

  1. Change the soldiers at:

your.mission\ExAdClient\XM8\Apps\DeployVehicle\bodyguard.sqf (line 7)

Here are the classnames: https://community.bistudio.com/wiki/Arma_3_CfgVehicles_GUER

Infistar Settings (thanks to @1Man):
Add "Craft Vehicle" to the allowedActions section:

allowedActions[] = {"Break free","Use AutoLockPicker","Craft Vehicle","Hack UAV"};

Future Updates:

Would love the ai to attack players not in your group. Not sure how to command the ai, I tried keybinding commands (like target) but it didn't work.
Let me know if you have ideas on how to do this.

Thanks to @Janski for making the cool EXAD XM8 Apps and @BetterDeadThanZed for the custom buildings to server addons script.

Enjoy!! aussie

 

OPTIONAL EXTRA:

Spawn the Ai from a mobile phone thanks to @1Man

If you want to allow owners to pick another option I have this if you want to add it.

config.cpp

Spoiler

Under class CfgInteractionMenus

    class Bodyguard
    {
        targetType = 2;
        target = "Land_SatellitePhone_F";
        class Actions
        {
            class Body_guard: ExileAbstractAction
            {
                title = "Deploy AI";
                condition = "('Exile_Item_MobilePhone' in (magazines player) && !ExilePlayerInSafezone)";
                action = "ExAdClient\XM8\Apps\DeployVehicle\bodyguard.sqf";
            };
        };
    };

Under class CfgXM8

    class ExAd_Unit
    {
        title = "AI Support";
        config = "ExAdClient\XM8\Apps\DeployVehicle\guard.sqf";
        logo = "ExAdClient\XM8\Apps\JX\icon_man.paa";
        bambiState = 0;
        vehicleClass = "Land_SatellitePhone_F";
        recipe[] = {{"Exile_Item_MobilePhone",1}};
        autoCleanUp = 1;
        quickFunction = "['ExAd_Unit'] call ExAd_XM8_DV_fnc_spawnVehicle";
        onLoad = "ExAdClient\XM8\Apps\DeployVehicle\guard.sqf";
    };

guard.sqf

Spoiler

ExAd_DV_DESPAWN_IDLE_TIME = 300;

ExAd_XM8_DV_fnc_itemsInCargo = {
    params ["_container","_itemArray","_item","_amount","_response"];

    _item = toLower (_itemArray select 0);
    _amount = _itemArray select 1;

    _response = false;
    {
        if(_item == toLower _x)then{
            _amount = _amount - 1;
        };
        if(_amount <= 0)exitWith{_response = true}
    }forEach magazines player;

    _response    
};

ExAd_XM8_DV_fnc_itemsMissing = {
    params["_recipe","_recipeStr"];
    
    _recipeStr = "";
    {
        private["_amount","_configName","_displayName","_text"];
        _amount = if(count _x > 1)then{_x select 1}else{1};
        _text = [_x select 0] call ExAd_XM8_DV_fnc_getDisplayName;
        _recipeStr = _recipeStr + format["%1x : %2<br />",(if(_amount < 0)then{((-1) * _amount)}else{_amount}), _text];
    }forEach _recipe;
    
    _response = format["You need <br />%1",_recipeStr];

    _response
};

ExAd_XM8_DV_fnc_getDisplayName = {
    params["_class","_configName","_displayName"];
    _configName = _class call ExileClient_util_gear_getConfigNameByClassName;
    _displayName = getText(configFile >> _configName >> _class >> "displayName");
    _text = if(count _displayName > 0)then{_displayName}else{_class};

    _text
};

ExAd_XM8_DV_fnc_canPack = {
    ( ExileClientInteractionObject getVariable["ExAd_DV_Packable", false] )
};

ExAd_XM8_DV_fnc_pack = {
    [ExileClientInteractionObject] spawn {
        params["_obj"];
    
        disableUserInput true;
        player playActionNow "Medic";

        uiSleep 3;
        ["despawnDeployableVehicle", [netId _obj]] call ExAd_fnc_serverDispatch;
        uiSleep 1;

        ["SuccessTitleAndText", ["Vehicle Packed"]] call ExileClient_gui_toaster_addTemplateToast;
        disableUserInput false;
    };
};

ExAd_XM8_DV_fnc_spawnVehicle = {
    params["_slideClass","_bambiState","_delopyRecipe","_vehicleClass"];

    try
    {    
        _bambiState = if(isNumber(missionConfigFile >> "CfgXM8" >> _slideClass >> "bambiState")) then
        {
            if(getNumber(missionConfigFile >> "CfgXM8" >> _slideClass >> "bambiState") > 0)then{true}else{false}
        } else {true};

        if(_bambiState && !ExileClientPlayerIsBambi) then { throw "You can only spawn vehicles as a bambi!"};

        _delopyRecipe = getArray(missionConfigFile >> "CfgXM8" >> _slideClass >> "recipe");
        if(count _delopyRecipe > 0) then
        {
            {
                if(count _x > 1) then
                {
                    _amount = if(_x select 1 == -1)then{1}else{_x select 1};
                    if!([player, [_x select 0, _amount]] call ExAd_XM8_DV_fnc_itemsInCargo) then
                    {
                        throw ([_delopyRecipe] call ExAd_XM8_DV_fnc_itemsMissing);
                    };
                } else {
                    if!([player, _x select 0] call ExileClient_util_playerEquipment_contains) then
                    {
                        throw ([_delopyRecipe] call ExAd_XM8_DV_fnc_itemsMissing);
                    }
                }
            }forEach _delopyRecipe;

            {
                _count = if(count _x > 1)then{(_x select 1)}else{1};
                for "_i" from 1 to _count do {
                    [player, _x select 0] call ExileClient_util_playerCargo_remove
                }
            }forEach _delopyRecipe;
        };

        _vehicleClass = getText(missionConfigFile >> "CfgXM8" >> _slideClass >> "vehicleClass");
        if!(isClass(configFile >> "CfgVehicles" >> _vehicleClass ))then { throw "The vehicle class doesn't exist"};

        [_slideClass] spawn {
            params["_slideClass"];
            disableUserInput true;
            player playActionNow "Medic";

            uiSleep 3;
            ["spawnDeployableVehicle", [netId player, _slideClass]] call ExAd_fnc_serverDispatch;
            uiSleep 1;
            ["SuccessTitleAndText", ["Request AI w/ scroll option"]] call ExileClient_gui_toaster_addTemplateToast;
            ExileClientXM8CurrentSlide = "extraApps";
            disableUserInput false;
        };    

        ["extraApps", 1] call ExileClient_gui_xm8_slide;
        closeDialog 0;


    }
    catch{
        [_exception] spawn {
            UISleep 0.5;
            ["ErrorTitleAndText", ["ExAd - Deploy Vehicle", _this select 0]] call ExileClient_gui_toaster_addTemplateToast;
            ["extraApps", 1] call ExileClient_gui_xm8_slide;
        };
    };
};

bodyguard.sqf

Spoiler

/** Salty Dog Exile: Recruit Ai V.2
**  by aussie 2017
** https://github.com/aussie-battler/Salty-Dog-Exile-Recruit-Ai

    Thanks to geekm0nkey for updating the following:
 +  Fixed toast message not displaying when you didn't have beef parts.. Hint: ( }; else { wont work.. take out the ; )
 +  Added delay during animation so the solider doesn't show till after.. Just my personal preference.
 +  No spawn in safezone.
**/

private ["_statue","_unit","unitList"];
    if(ExilePlayerInSafezone) exitWith {
        ["ErrorTitleAndText", ["Deployment Failed!", "You can't deploy soldier in trader!"]] call ExileClient_gui_toaster_addTemplateToast;
    };
    if ("Exile_Item_BeefParts" in (magazines player)) then
    {
    player removeItem "Exile_Item_BeefParts";
    disableUserInput true;
    player playMove "AinvPknlMstpSnonWnonDr_medic3"; 
    uisleep 10;
    unitList = ["I_Soldier_AT_F","I_ghillie_lsh_F","I_ghillie_sard_F","I_G_Sharpshooter_F"];
    _unit = group player createUnit [unitList select (round(random ((count unitList) - 1))), getPos player, [], 0, "FORM"];
    _unit setskill ["aimingAccuracy",0.9];
    _unit setskill ["aimingShake",0.9];
    _unit setskill ["aimingSpeed",0.9];
    _unit setskill ["spotDistance",0.9];
    _unit setskill ["spotTime",0.9];
    _unit setskill ["courage",1.0];
    _unit setskill ["reloadSpeed",1.0];
    _unit setskill ["commanding",1.0];
    _unit setskill ["general",0.9];
    _unit setCombatMode "RED";
    _unit allowFleeing 0;
    _unit setVariable ["ExileMoney",15000,true];
    ["SuccessTitleAndText",["Bodyguard Deployed, shoot him before restart to get his money."]] call ExileClient_gui_toaster_addTemplateToast;
    _statue = nearestObject [player, "Land_AncientStatue_01_F"];
    deleteVehicle _statue;
    disableUserInput false;
    }
    else
    {
       ["ErrorTitleAndText", ["Deployment Failed!", "You need beef parts..."]] call ExileClient_gui_toaster_addTemplateToast;
    }; 
}; 

Changelog:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.09.17 Updated the Ai skill level which can be set in Exile.Mission/ExAdClient/XM8/Apps/DeployVehicle/bodyguard.sqf

Currently it is set to:

Spoiler

    _unit setskill ["aimingAccuracy",0.9];
    _unit setskill ["aimingShake",0.9];
    _unit setskill ["aimingSpeed",0.9];
    _unit setskill ["spotDistance",0.9];
    _unit setskill ["spotTime",0.9];
    _unit setskill ["courage",1.0];
    _unit setskill ["reloadSpeed",1.0];
    _unit setskill ["commanding",1.0];
    _unit setskill ["general",0.9];
    _unit setCombatMode "RED";
    _unit allowFleeing 0;

To learn more about Ai skill settings head to http://exile.majormittens.co.uk/topic/13096-guide-how-to-configure-the-ai-properly/
by Tobias Solem

Thanks to @TheDaddy for the idea.

Control your ai with this mod: http://steamcommunity.com/sharedfiles/filedetails/?id=491016790 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.09.17 Updated instructions on commanding the Ai to move & stay.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12.03.18 Updated for Exile 1.0.4's new XM8 apps.
+ Removed the deploy statue, it confused players.
+ Updated the script to only deploy cool ai units.
+ Ai can now be recruited in a safe zone.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

UPDATE 21.11.18:

In your description.ext turn on the commanding menu (change to 1):

showHUD[] =
{
    1,   // Scripted HUD (same as showHUD command)
    1,   // Vehicle + soldier info
    1,   // Vehicle radar
    1,   // Vehicle compass
    1,   // Tank direction indicator
    1,  // Commanding menu
    0,  // Group Bar
    1,   // HUD Weapon Cursors
    1   // Squad Radar
};

 

Then players can see the command ai menu.

20181121164817_1.thumb.jpg.3936be67ea98205f1237340bc59039f4.jpg

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

20170731154131_1.jpg

20170731153857_1.jpg

20170731154509_1.jpg

20170731154233_1.jpg

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

I have updated recruit Ai to V2.

https://github.com/aussie-battler/Salty-Dog-Exile-Recruit-Ai-V2

This version uses XM8Apps by @Shix to spawn the Ai. You will replace the "Server Info" button with an apps button.
You can now choose what type of Ai you would like to spawn (AT, AA, Sniper Ghillie, Sharpshooter or Machine Gunner):

20190403102351_1.thumb.jpg.311d30daf9cd406dfd1a63c83dd97be9.jpg

I left in some other apps that I use:
@Shix : Created XM8Apps, eBase XM8 App, View Distance. Lunchbox: Created XM8 App Base Location Markers.

@happydayz - Enigma: created ExileSecurity.

Brun: created BRAma Recipes.

@Unkown_GTX : created voyagerCompass.

@Johno: created Player_Light ( I think JohnO created this. I modified it to work in Cherno Redux in daytime.)

I am not sure who made the server info script or the selfie, but thanks.

Hints & Tricks by @Runewulv
 

Spoiler

Hints & Tricks by Runewulv

I've been doing extensive testing with Recruit AI and will walk you through what menus are the needed and how to control your ai. So let's start out with the basics.

Menus:

You will have to rebind most of the items you will be using under the Command options in your control's config.

Most of the menus are completely useless or simply do not work in Exile. There are two in particular that you will have to get at the very least. SELECT ALL should be rebound to a key and the MOUNT menu should be bound to a key. You should also bind the FORMATION menu. The TARGET menu works as well but honestly I've never really used it much.

Besides SELECT ALL I suggest you rebind UNIT 2-8 SELECT, which allows you to individually select your AI based on their position in your group. (you are only allowed 6 at a time but when 1 AI dies sometimes it tends to keep one of your unit slots until the corpse despawns). Personally I bound 2, 3, and 4 to my Shift+Z, +X, and +C, then 5, 6, and 7 to my CTRL+ Z, +X, +C. This is just what works for me. I do bind Unit 1 to a key as well but most often this will not be filled because the player actually takes up the Unit 1 slot most of the time. Unless you die and then spawn another AI as you could fill another slot.

Next bind that MOUNT menu. Once you select all you can then press your bind for the MOUNT menu which will open only when an AI is selected. This menu will let you tell the AI which seat to fill. Most often I select AI individually so I can better disperse them among whatever vehicles I am bringing.

Next is the FORMATION menu. Select this menu and choose which formation they will follow you in other vehicles or on foot. I've convoyed as many as 4 vehicles at once. It's tedious and can be dangerous but very possible. Selecting Column will have them follow you in a line and will keep them on the road. Any other formation seems to make them want to drive off road and will stop at every rock in their path.
 
Now that the required menus are covered, let's talk about garrisons. Select all or Unit select and looking at even the tallest part of a patrol tower will allow you to send the selected unit but you have to highlight a building position to do so. Regroup calls them back as always.

AI are decent drivers but they are not efficient at following you in convoy. If you select Column under the formation menu they will follow you in a vehicle in regroup but they are likely to stop at some point if something obstructs their path or you get too far away from them. Then you have to get back within range to get them moving again.

Instead I find it best to send AI ahead of me by opening the map and selecting the vehicle's driver then highlight "Move There" on his action menu then left click the map. The AI, most often with a slight delay, will then travel the best route to that point. You have to drive at least one vehicle though. If you are not in the driver's seat of at least one vehicle, the AI tend to bug out and stop. This usually causes disaster because the AI driving your vehicle wont navigate around him and a rear end collision will occur.

Alternatively in a convoy you can micro manage them a little more. Instead of clicking the map you can lead the pack and use select all and use the cursor to MOVE THERE in front of you. You will basically have to keep re-updating the Move There spot to keep them moving with you.

It's usually wisest to have the AI drive the slowest vehicle in the convoy and then follow them. Going slow is the most optimal way to get another AI regroup following you to not break follow. So let the AI drive that tank or that URAL. Follow him in your fast vehicle and have whatever vehicle you want in regroup following you. Or have the third vehicle AI go on ahead.

I do not know the exact range but if it's tied to you like UAVs are then there is about a 1000m range the AI will travel away from you. Moving back within this range before their waypoint times out will get them to move again without prompting but if you are out of range for too long they will go into idle and you will need to regroup and reset their waypoint.

Sometimes AI will refuse to acknowledge your commands. This is a fault in the game itself, some times the AI gets stuck in an idle loop. In these cases the best way to break them of it is to click Regroup and that SHOULD get them moving again on your waypoint clicks.

They will fight AI, they will fight zeds, and they will friendly fire you trying to save your life.

Medics will heal you and other AI by selecting the medic individually. The medic will heal you if you click "Injured" at the bottom of the menu. They will treat other AI by choosing the medic and then highlighting another AI with the crosshair.

Mechanic/Engineers will fix your vehicles a percentage. I notice they will not always fix your vehicle 100% but it will always get them moving again.

Kill the surviving AI before restart to get 1000 pops and their gear. Doing so can get you your money back and then some in most cases.

Utilize Move There to position your AI safely, they will remain in that spot and even try to seek cover if next to an object.

Selecting Regroup will stop a vehicle from visiting any way point you select. This has saved several rear end collisions in my convoys.

Military vehicles allow you to use the WSAD keys to drive from any seat as long as an AI is in the driver's seat. So you can essentially gun and drive at the same time.

Civilian vehicles like quads and cars and trucks will not respond to WSAD. The AI will only drive the vehicle when a map waypoint or cursor waypoint is issued.

AI fly pretty well. I've had as many as three mozzie AI following me in my mozzie on my way to Terminal. Just dont get too far ahead or behind them or they will stop following you and land.

Unfortunately there's no way to really tell where your AI is but they will respond to a regroup command as far as 500m away.

Be careful and happy hunting out there.



20190403102130_1.thumb.jpg.5be0d5a185e8fe1d87dcd232114a7760.jpg20190403102134_1.thumb.jpg.e6d5007ad5c8d72360b1c7fa4ab1c7e4.jpg

unknown.png

]]>
23933Mon, 31 Jul 2017 10:17:17 +0000
[Closed] Improved Kill Feed (for v0.9.6)https://exile.majormittens.co.uk/topic/14173-closed-improved-kill-feed-for-v096/ ****EDIT 3 July 2016****   *****As of Exile version 0.9.8 this script no longer works.  Please do not use.*****

I've tweaked ExileServer_object_player_event_onMpKilled to handle and report the following in the kill feed:

- Running over another player in a vehicle

- Getting killed by a Ryan Zombie

- The nearest town to the killing

- The weapon the killer used

- The optic the killer used (or "Iron sights" if no optic)

Spoiler

/**
 * ExileServer_object_player_event_onMpKilled
 *
 * Exile Mod
 * exile.majormittens.co.uk
 * © 2015 Exile Mod Team
 *
 * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
 */
 
private["_killerVehicle","_weaponScopeDisplayName","_weaponScope","_weaponDisplayName","_zombieKill","_zombie","_bystanders","_weapon","_victimNear","_locationNames","_victim","_killer","_victimPosition","_addDeathStat","_addKillStat","_normalkill","_killerRespectPoints","_fragAttributes","_player","_grpvictim","_grpkiller","_log","_lastVictims","_victimUID","_vehicleRole","_vehicle","_lastKillAt","_killStack","_distance","_distanceBonus","_flagNextToKiller","_homieBonus","_flagNextToVictim","_raidBonus","_overallRespectChange","_newKillerScore","_killMessage","_newKillerFrags","_newVictimDeaths"];
if (!isServer || hasInterface) exitWith {};
_victim = _this select 0;
_killer = _this select 1;

diag_log format ["%1 killed %2", _killer, _victim];

if( isNull _victim ) exitWith {};
_victim setVariable ["ExileDiedAt", time];
if !(isPlayer _victim) exitWith {};
_victimPosition = getPos _victim;

_distance = floor(_victim distance _killer);

_locationNames = nearestLocations [getPos _victim, ["NameVillage","NameCity","NameCityCapital"], 4000];   
_victimNear = text (_locationNames select 0);

format["insertPlayerHistory:%1:%2:%3:%4:%5", getPlayerUID _victim, name _victim, _victimPosition select 0, _victimPosition select 1, _victimPosition select 2] call ExileServer_system_database_query_fireAndForget;
format["deletePlayer:%1", _victim getVariable ["ExileDatabaseId", -1]] call ExileServer_system_database_query_fireAndForget;
_victim setVariable ["ExileIsDead", true];
_victim setVariable ["ExileName", name _victim, true]; 
_victim call ExileServer_object_flies_spawn;
_addDeathStat = true;
_addKillStat = true;
_normalkill = true;
_killerRespectPoints = [];
_fragAttributes = [];
_zombieKill = false;

if (_victim isEqualTo _killer) then
{
    _bystanders = _victimPosition nearEntities ['Man',3];
    {_zombie = getText(configFile >> 'CfgVehicles' >> typeOf _x >> 'author') isEqualTo 'Ryan';
    if(_zombie)then
    {
        _zombieKill = true;
    };
    } forEach _bystanders;
    if (_zombieKill) then
    {
        ["systemChatRequest", [format["%1 was eaten by a zombie!", (name _victim)]]] call ExileServer_object_player_event_killFeed;            
    }
    else
    {
        ["systemChatRequest", [format["%1 committed suicide!", (name _victim)]]] call ExileServer_object_player_event_killFeed;
    };
}
else 
{
    if (vehicle _victim isEqualTo _killer) then
    {
        ["systemChatRequest", [format["%1 crashed!", (name _victim)]]] call ExileServer_object_player_event_killfeed;
    }
    else 
    {
        if (isNull _killer) then
        {
            ["systemChatRequest", [format["%1 died for an unknown reason.", (name _victim)]]] call ExileServer_object_player_event_killfeed;
        }
        else 
        {
            _player = objNull;
            if (isPlayer _killer) then 
            {
                if ((typeOf _killer) isEqualTo "Exile_Unit_Player") then
                {
                    _player = _killer;    
                }
                else 
                {
                    _uid = getPlayerUID _killer;
                    {
                        if ((getPlayerUID _x) isEqualTo _uid) exitWith 
                        {
                            _player = _x;
                        };
                    }
                    forEach allPlayers;
                };
            }
            else 
            {
                if (isUAVConnected _killer) then 
                {
                    _player = (UAVControl _killer) select 0;
                };
            };
            if !(isNull _player) then
            {
                _killer = _player;
                if (_victim getVariable ["ExileIsBambi", false]) then
                {
                    _addKillStat = false;
                    _addDeathStat = false;
                    _fragAttributes pushBack "Bambi Slayer";
                    _killerRespectPoints pushBack ["BAMBI SLAYER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "bambi"))];
                }
                else 
                {
                    _grpvictim = _victim getVariable ["ExileGroup",(group _victim)];
                    _grpkiller = _killer getVariable ["ExileGroup",(group _killer)];
                    if((_grpvictim isEqualTo _grpkiller)&&!(ExileGraveyardGroup isEqualTo _grpkiller))then
                    {
                        _log = format["%2 was team-killed by %1!", (name _killer), (name _victim)];
                        ["systemChatRequest", [_log]] call ExileServer_object_player_event_killfeed;
                        _fragAttributes pushBack "Teamkill";
                        _killerRespectPoints pushBack ["TEAMKILL", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "friendlyFire"))];
                        _normalkill = false;
                    }
                    else
                    {
                        _lastVictims = _killer getVariable ["ExileLastVictims", ["0", "1", "2"]];
                        _victimUID = _victim getVariable ["ExileOwnerUID", getPlayerUID _victim];
                        if (_victimUID in _lastVictims) then
                        {
                            _log = format["%1 keeps killing %2!", (name _killer), (name _victim)];
                            ["systemChatRequest", [_log]] call ExileServer_object_player_event_killfeed;
                            _fragAttributes pushBack "Domination";
                            _killerRespectPoints pushBack ["DOMINATION BONUS", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "domination"))];
                        }
                        else
                        {
                            _lastVictims deleteAt 0;
                            _lastVictims pushBack _victimUID;
                            _killer setVariable ["ExileLastVictims", _lastVictims];
                            if ((vehicle _killer) isEqualTo _killer) then 
                            {
                                if ((currentWeapon _killer) isEqualTo "Exile_Melee_Axe") then
                                {
                                    _fragAttributes pushBack "Humiliation";
                                    _killerRespectPoints pushBack ["HUMILIATION", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "humiliation"))];
                                }
                                else 
                                {
                                    _killerRespectPoints pushBack ["ENEMY FRAGGED", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "standard"))];
                                };
                            }
                            else 
                            {
                                _vehicleRole = assignedVehicleRole _killer;
                                switch (toLower (_vehicleRole select 0)) do 
                                {
                                    case "driver":
                                    {
                                        _vehicle = vehicle _killer;
                                        switch (true) do 
                                        {
                                            case (_vehicle isKindOf "ParachuteBase"):
                                            {
                                                _fragAttributes pushBack "Chute > Chopper";
                                                _killerRespectPoints pushBack ["CHUTE > CHOPPER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "chuteGreaterChopper"))];
                                            };
                                            case (_vehicle isKindOf "Air"):
                                            {
                                                _fragAttributes pushBack "Big Bird";
                                                _killerRespectPoints pushBack ["BIG BIRD", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "bigBird"))];
                                            };
                                            default 
                                            {
                                                _fragAttributes pushBack "Road Kill";
                                                _killerRespectPoints pushBack ["ROAD KILL", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "roadKill"))];
                                            };
                                        };
                                    };
                                    case "turret":
                                    {
                                        if ((currentWeapon _killer) isKindOf "StaticWeapon") then 
                                        {
                                            _fragAttributes pushBack "Let it Rain";
                                            _killerRespectPoints pushBack ["LET IT RAIN", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "letItRain"))];
                                        }
                                        else 
                                        {
                                            _fragAttributes pushBack "Mad Passenger";
                                            _killerRespectPoints pushBack ["MAD PASSENGER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "passenger"))];
                                        };
                                    };
                                    default
                                    {
                                        _fragAttributes pushBack "Mad Passenger";
                                        _killerRespectPoints pushBack ["MAD PASSENGER", (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Frags" >> "passenger"))];
                                    };
                                };
                            };                        
                        };
                    };
                };
                if (_addKillStat) then
                {
                    if(_normalkill)then
                    {
                        _lastKillAt = _killer getVariable ["ExileLastKillAt", 0];
                        _killStack = _killer getVariable ["ExileKillStack", 0];
                        _killStack = _killStack + 1;
                        if (isNil "ExileServerHadFirstBlood") then
                        {
                            ExileServerHadFirstBlood = true;
                            _fragAttributes pushBack "First Blood";
                            _killerRespectPoints pushBack ["FIRST BLOOD", getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "firstBlood")];
                        }
                        else 
                        {
                            if (time - _lastKillAt < (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "killStreakTimeout"))) then
                            {
                                _fragAttributes pushBack (format ["%1x Kill Streak", _killStack]);
                                _killerRespectPoints pushBack [(format ["%1x KILL STREAK", _killStack]), _killStack * (getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "killStreak"))];
                            }
                            else 
                            {
                                _killStack = 1; 
                            };
                        };
                        _killer setVariable ["ExileKillStack", _killStack];
                        _killer setVariable ["ExileLastKillAt", time];
                    };
//                    _distance = floor(_victim distance _killer);
                    _fragAttributes pushBack (format ["%1m Range", _distance]);
                    _distanceBonus = (floor ((_distance min 3000) / 100)) * getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "per100mDistance");
                    if (_distanceBonus > 0) then
                    {
                        _killerRespectPoints pushBack [(format ["%1m RANGE BONUS", _distance]), _distanceBonus];
                    };
                    _flagNextToKiller = _killer call ExileClient_util_world_getTerritoryAtPosition;
                    if !(isNull _flagNextToKiller) then 
                    {
                        if ((getPlayerUID _killer) in (_flagNextToKiller getVariable ["ExileTerritoryBuildRights", []])) then
                        {
                            _homieBonus = getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "homie");
                            if (_homieBonus > 0) then
                            {
                                _fragAttributes pushBack "Homie";
                                _killerRespectPoints pushBack ["HOMIE BONUS", _homieBonus];
                            };
                        };
                    };
                    _flagNextToVictim = _victim call ExileClient_util_world_getTerritoryAtPosition;
                    if !(isNull _flagNextToVictim) then 
                    {
                        if ((getPlayerUID _victim) in (_flagNextToVictim getVariable ["ExileTerritoryBuildRights", []])) then
                        {
                            _raidBonus = getNumber (configFile >> "CfgSettings" >> "Respect" >> "Bonus" >> "raid");
                            if (_raidBonus > 0) then
                            {
                                _fragAttributes pushBack "Raid";
                                _killerRespectPoints pushBack ["RAID BONUS", _raidBonus];
                            };
                        };
                    };
                };
                _overallRespectChange = 0;
                {
                    _overallRespectChange = _overallRespectChange + (_x select 1);
                }
                forEach _killerRespectPoints;
                _newKillerScore = _killer getVariable ["ExileScore", 0];
                _newKillerScore = _newKillerScore + _overallRespectChange;
                _killer setVariable ["ExileScore", _newKillerScore];
                format["setAccountScore:%1:%2", _newKillerScore,getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                if(_normalkill)then
                {
                    if (((vehicle _killer) != _killer) && (driver (vehicle _killer) == _killer)) then  // Killer is in a vehicle AND they are the driver
                    {
                        _killMessage = format ["%1 was run over by %2 near %3", (name _victim), (name _killer), (text _victimNear)];
                    }
                    else
                    {
                        _weapon = currentWeapon _killer;
                        _weaponDisplayName = getText (configfile >> "CfgWeapons" >> _weapon >> "displayName");
                        _weaponScope = ""; 
                        _weaponScope = _killer weaponAccessories currentMuzzle _killer select 2;
                        if (_weaponScope == "") then
                        {
                            _weaponScopeDisplayName = "Iron sights";
                        }
                        else
                        {
                            _weaponScopeDisplayName = getText (configfile >> "CfgWeapons" >> _weaponScope >> "displayName");
                        };
                        _killMessage = format ["%1 was killed by %2 with a %3 (%4) near %5", (name _victim), (name _killer), (text _weaponDisplayName), (text _weaponScopeDisplayName), (text _victimNear)];
                    };
                    if !(count _fragAttributes isEqualTo 0) then
                    {
                        _killMessage = _killMessage + " (" + (_fragAttributes joinString ", ") + ")";
                    };
                    ["systemChatRequest", [_killMessage]] call ExileServer_object_player_event_killfeed;
                    if (_addKillStat isEqualTo true) then
                    {
                        _newKillerFrags = _killer getVariable ["ExileKills", 0];
                        _newKillerFrags = _newKillerFrags + 1;
                        _killer setVariable ["ExileKills", _newKillerFrags];
                        format["addAccountKill:%1", getPlayerUID _killer] call ExileServer_system_database_query_fireAndForget;
                    };
                    
                };
                [_killer, "showFragRequest", [_killerRespectPoints]] call ExileServer_system_network_send_to;
                _killer call ExileServer_object_player_sendStatsUpdate;
            }
            else 
            {
                ["systemChatRequest", [format["%1 was killed by AI (%2m Range)", (name _victim), floor(_victim distance _killer)]]] call ExileServer_object_player_event_killfeed;
            };
        };
    };
};
if (_addDeathStat isEqualTo true) then
{
    _newVictimDeaths = _victim getVariable ["ExileDeaths", 0];
    _newVictimDeaths = _newVictimDeaths + 1;
    _victim setVariable ["ExileDeaths", _newVictimDeaths];
    format["addAccountDeath:%1", getPlayerUID _victim] call ExileServer_system_database_query_fireAndForget;
    _victim call ExileServer_object_player_sendStatsUpdate;
};
[_victim] joinSilent ExileGraveyardGroup;
true

 

]]>
14173Sun, 15 May 2016 04:26:50 +0000
Wire Transfer Scripthttps://exile.majormittens.co.uk/topic/27273-wire-transfer-script/ Have you ever wanted to be able to send funds directly from your bank to the bank of a friend, or someone you just owe money to? Me neither! Good thing I wasted my Halloween making this monstrosity. Yay. As the last sentence suggested, players can now wire funds from their bank or wallet directly to the bank of another online player. Simply choose from the list of online players, type in a numerical value for how much you want to send and check the box for if you want to send it directly from your locker. Presto. In all seriousness, this is my first script so i am aware that the code and the gui could be better and cleaner, if you have any suggestions i more than welcome them. Huge thanks to @StokesMagee for helping optimize the code and helping me learn a few things.

Spoiler

86F161BA640C26F1FB21702C00C04E39853559C5

Download

]]>
27273Thu, 01 Nov 2018 04:32:00 +0000