diff --git a/@epochhive/addons/sem.pbo b/@epochhive/addons/sem.pbo
new file mode 100644
index 0000000..e627a00
Binary files /dev/null and b/@epochhive/addons/sem.pbo differ
diff --git a/MPMissions/epoch.Altis.pbo b/MPMissions/epoch.Altis.pbo
index c142573..8d0bf66 100644
Binary files a/MPMissions/epoch.Altis.pbo and b/MPMissions/epoch.Altis.pbo differ
diff --git a/MPMissions/epoch.Altis/VEMFConfig.sqf b/MPMissions/epoch.Altis/VEMFConfig.sqf
new file mode 100644
index 0000000..81ede6e
--- /dev/null
+++ b/MPMissions/epoch.Altis/VEMFConfig.sqf
@@ -0,0 +1,149 @@
+/*
+ Vampire's Epoch Mission Framework Config by Vampire
+
+ If you paid for this script, they are breaking the license terms.
+ If you paid to have this installed, I suggest you get a refund.
+
+ VEMF: https://github.com/SMVampire/VEMF
+*/
+
+///////////////////////////////////////////////////////////////////
+/* Mission Config */
+///////////////////////////////////////////////////////////////////
+// VEMF Debug Settings:
+// Creates a lot of RPT Entries, turn off after debugging
+VEMFDebugLocs = false;
+VEMFDebugAI = false;
+VEMFDebugFunc = false;
+
+// AI Group Count per City
+// Default is 3 Groups
+VEMFGroupCnt = 3;
+
+// Punish Players who Run Over AI?
+// Causes 10% Vehicle Damage per AI Runover
+VEMFPunishRunover = true;
+
+// Dynamic Crate Loot?
+// Blacklist Still Applies
+VEMFDynCrate = true;
+
+// Crate Loot List
+// (DynCrate must be off)
+VEMFLootList = [
+ ""
+];
+
+// Blacklist Crate Loot
+VEMFCrateBlacklist = [
+ "DemoCharge_Remote_Mag", "SatchelCharge_Remote_Mag", "ATMine_Range_Mag",
+ "ClaymoreDirectionalMine_Remote_Mag", "APERSMine_Range_Mag",
+ "APERSBoundingMine_Range_Mag", "SLAMDirectionalMine_Wire_Mag",
+ "APERSTripMine_Wire_Mag"
+];
+
+// Min & Max Mission Times (Will Be Made Better)
+// Time is in Minutes
+// Min Must Be Less Than Max
+VEMFMinMissTime = 5;
+VEMFMaxMissTime = 20;
+
+// Timeout (No Players Near)
+// Time in minutes
+VEMFTimeoutTime = 20;
+
+// Enable Timeout?
+// In false waits forever
+VEMFTimeout = true;
+
+// Announce to Last Killer or to Near Players?
+// Distance in Meters. 0 for Last Killer option.
+VEMFMissEndAnn = 0;
+
+// Mission Name Array
+VEMFMissionArray = ["DynamicTownInvasion"];
+
+// Custom Addon Array (Don't Touch Unless You're Positive)
+// What is your addon script name?
+// Example: Caves.sqf
+VEMFAddon = [""];
+
+// Blacklist Zone Array -- missions will not spawn in these areas
+// format: [[x,y,z],radius]
+// Ex: [[06325,07807,0],300] //Starry Sobor
+VEMFBlacklistZones = [
+ [[0,0,0],50]
+];
+
+///////////////////////////////////////////////////////////////////
+/* AI Config */
+///////////////////////////////////////////////////////////////////
+
+// Generate Dynamic Weapon List?
+// If True WeaponLists Below Ignored
+// Recommended to Use With Blacklist
+VEMFDynWeapons = true;
+
+// Required Kill Percentage
+// Example 0.80 (80%)
+VEMFRequiredKillPercent = 1.0;
+
+// Blacklisted Weapons
+VEMFWepBlack = [
+ "ChainSaw",
+ "Hatchet",
+ "speargun_epoch",
+ "MultiGun",
+ "m107Tan_EPOCH",
+ "m107_EPOCH",
+ "srifle_GM6_F",
+ "srifle_LRR_F"
+];
+
+// AI Headgear Array
+// 39-70, 74-92, Festives
+VEMFHeadgearList = [
+ "H_39_EPOCH","H_40_EPOCH","H_41_EPOCH","H_42_EPOCH","H_43_EPOCH","H_44_EPOCH","H_45_EPOCH","H_46_EPOCH","H_47_EPOCH","H_48_EPOCH",
+ "H_49_EPOCH","H_50_EPOCH","H_51_EPOCH","H_52_EPOCH","H_53_EPOCH","H_54_EPOCH","H_55_EPOCH","H_56_EPOCH","H_57_EPOCH","H_58_EPOCH",
+ "H_59_EPOCH","H_60_EPOCH","H_61_EPOCH","H_62_EPOCH","H_63_EPOCH","H_64_EPOCH","H_65_EPOCH","H_66_EPOCH","H_67_EPOCH","H_68_EPOCH",
+ "H_69_EPOCH","H_70_EPOCH","H_74_EPOCH","H_75_EPOCH","H_76_EPOCH","H_77_EPOCH","H_78_EPOCH","H_79_EPOCH","H_80_EPOCH","H_81_EPOCH",
+ "H_82_EPOCH","H_83_EPOCH","H_84_EPOCH","H_85_EPOCH","H_86_EPOCH","H_87_EPOCH","H_88_EPOCH","H_89_EPOCH","H_90_EPOCH","H_91_EPOCH",
+ "H_92_EPOCH",
+ "wolf_mask_epoch","pkin_mask_epoch"
+];
+
+// AI Uniform Array
+VEMFUniformList = [
+ "U_O_CombatUniform_ocamo", "U_O_PilotCoveralls", "U_OG_Guerilla1_1", "U_OG_Guerilla2_1", "U_OG_Guerilla2_3",
+ "U_OG_Guerilla3_1", "U_OG_Guerilla3_2", "U_OG_leader", "U_C_Poloshirt_stripped", "U_C_Poloshirt_blue", "U_C_Poloshirt_burgundy",
+ "U_C_Poloshirt_tricolour", "U_C_Poloshirt_salmon", "U_C_Poloshirt_redwhite", "U_C_Poor_1", "U_C_WorkerCoveralls", "U_C_Journalist",
+ "U_OrestesBody", "U_CamoRed_uniform", "U_CamoBrn_uniform", "U_CamoBlue_uniform", "U_Camo_uniform", "U_C_Driver_3", "U_C_Driver_4"
+];
+
+// AI Vest Array
+VEMFVestList = [
+ "V_1_EPOCH","V_2_EPOCH","V_3_EPOCH","V_4_EPOCH","V_5_EPOCH","V_6_EPOCH","V_7_EPOCH","V_8_EPOCH","V_9_EPOCH","V_10_EPOCH",
+ "V_11_EPOCH","V_12_EPOCH","V_13_EPOCH","V_14_EPOCH","V_15_EPOCH","V_16_EPOCH","V_17_EPOCH","V_18_EPOCH","V_19_EPOCH","V_20_EPOCH",
+ "V_21_EPOCH","V_22_EPOCH","V_23_EPOCH","V_24_EPOCH","V_25_EPOCH","V_26_EPOCH","V_27_EPOCH","V_28_EPOCH","V_29_EPOCH","V_30_EPOCH",
+ "V_31_EPOCH","V_32_EPOCH","V_33_EPOCH","V_34_EPOCH","V_35_EPOCH","V_36_EPOCH","V_37_EPOCH","V_38_EPOCH","V_39_EPOCH","V_40_EPOCH"
+];
+
+// AI Rifle Array
+VEMFRiflesList = [
+ "srifle_EBR_F","srifle_DMR_01_F","arifle_Katiba_F","arifle_Katiba_C_F","arifle_Katiba_GL_F","arifle_MXC_F","arifle_MX_F",
+ "arifle_MX_GL_F","arifle_MXM_F","arifle_SDAR_F","arifle_TRG21_F","arifle_TRG20_F","arifle_TRG21_GL_F","arifle_Mk20_F",
+ "arifle_Mk20C_F","arifle_Mk20_GL_F","arifle_Mk20_plain_F","arifle_Mk20C_plain_F","arifle_Mk20_GL_plain_F","SMG_01_F",
+ "SMG_02_F","hgun_PDW2000_F","arifle_MXM_Black_F","arifle_MX_GL_Black_F","arifle_MX_Black_F","arifle_MXC_Black_F","Rollins_F",
+ "LMG_Mk200_F","arifle_MX_SW_F","LMG_Zafir_F","arifle_MX_SW_Black_F","m249_EPOCH","m249Tan_EPOCH",
+ "m16_EPOCH","m16Red_EPOCH","M14_EPOCH","M14Grn_EPOCH","m4a3_EPOCH","AKM_EPOCH"
+];
+
+// AI Pistol Array
+VEMFPistolsList = [
+ "hgun_ACPC2_F","hgun_Rook40_F","hgun_P07_F","hgun_Pistol_heavy_01_F","hgun_Pistol_heavy_02_F","ruger_pistol_epoch",
+ "1911_pistol_epoch","hgun_Pistol_Signal_F"
+];
+
+/* ======== Do Not Modify Below ======== */
+diag_log text format ["[VEMF]: Configuration File Loaded!"];
+VEMFVersion = "1.0.0c-PreAlpha";
\ No newline at end of file
diff --git a/MPMissions/epoch.Altis/init.sqf b/MPMissions/epoch.Altis/init.sqf
index ca47a7e..c7a65d2 100644
--- a/MPMissions/epoch.Altis/init.sqf
+++ b/MPMissions/epoch.Altis/init.sqf
@@ -1,19 +1,6 @@
//Admin list
-ADMIN_LIST = ["76561198087015545","0","0"]
-//VEMF Missions
-if (!isDedicated) then {
- "VEMFChatMsg" addPublicVariableEventHandler {
- systemChat ((_this select 1) select 0);
- [
- [
- [((_this select 1) select 0),"align = 'center' size = '1' font='PuristaBold'"],
- ["","
"],
- [((_this select 1) select 1),"align = 'center' size = '0.5'"]
- ]
- ] spawn BIS_fnc_typeText2;
- VEMFChatMsg = nil;
- };
-};
+ADMIN_LIST = ["76561198087015545","0","0"];
+
//Status Bar
[] execVM "custom\fn_statusBar.sqf";
@@ -50,4 +37,21 @@ _target = cursorTarget;
_isbike = _target isKindOf "ebike_epoch";
if (_isbike) then{
player addaction [("" + ("PackBike") +""),"custom\packbike2.sqf","",5,false,true,"",""];
+};
+//SEM Missions
+if(hasInterface)then{execVM "semClient.sqf"};
+
+//VEMF Missions
+if (!isDedicated) then {
+ "VEMFChatMsg" addPublicVariableEventHandler {
+ systemChat ((_this select 1) select 0);
+ [
+ [
+ [((_this select 1) select 0),"align = 'center' size = '1' font='PuristaBold'"],
+ ["","
"],
+ [((_this select 1) select 1),"align = 'center' size = '0.5'"]
+ ]
+ ] spawn BIS_fnc_typeText2;
+ VEMFChatMsg = nil;
+ };
};
\ No newline at end of file
diff --git a/MPMissions/epoch.Altis/semClient.sqf b/MPMissions/epoch.Altis/semClient.sqf
new file mode 100644
index 0000000..ba486fb
--- /dev/null
+++ b/MPMissions/epoch.Altis/semClient.sqf
@@ -0,0 +1,129 @@
+ /* KiloSwiss */
+if(isDedicated)exitWith{}; //Everything below this line is only executed on the client (player or local host)
+
+[] spawn { waitUntil{player == player && !isNil "SEM_version"}; sleep 50;
+ /* This is the advertisement. */
+ private "_worldName";
+ _worldName = switch(toLower worldName)do{
+ case "bootcamp_acr" :{"Bukovina"};
+ case "woodland_acr" :{"Bystrica"};
+ case "chernarus_summer" :{"Chernarus (summer)"};
+ case "mbg_celle2" :{"Celle"};
+ case "isladuala" :{"Isla-Duala"};
+ case "panthera2" :{"Panthera"};
+ case "panthera3" :{"Panthera"};
+ case "smd_sahrani_a2" :{"Sahrani"};
+ case "sara" :{"Sahrani"};
+ case "saralite" :{"Sahrani"};
+ case "sara_dbe1" :{"Sahrani"};
+ case "tavi" :{"Taviana"};
+ default{worldName};
+ };
+ titleText [format["\nWelcome to EPOCH %1 survivor %2.", _worldName, name player], "PLAIN DOWN", 2];
+ sleep 15;
+ titleText [format["This server is running %1 v%2", str "Simple Epoch Missions", SEM_version], "PLAIN DOWN", 2];
+ /* End of advertisement */
+ "SEM_version" addPublicVariableEventHandler {titleText [format["This server is running %1 v%2", str "Simple Epoch Missions", _this select 1], "PLAIN DOWN"]};
+};
+
+
+SEM_client_createMissionMarker = { private ["_create","_markerTimeout","_markerPos","_markerID","_markerA","_markerB","_markerC","_markerC_Pos","_markerName"];
+ _create = _this select 0;
+
+ //Create Marker
+ if(_create)then[{
+
+ _markerPos = _this select 1;
+ _markerID = _this select 2;
+ _markerName = _this select 3;
+
+ _markerA = createMarkerLocal [format["SEM_MissionMarkerA_%1", _markerID], _markerPos];
+ _markerB = createMarkerLocal [format["SEM_MissionMarkerB_%1", _markerID], _markerPos];
+ _markerC = createMarkerLocal [format["SEM_MissionMarkerC_%1", _markerID], _markerPos];
+
+ { _x setMarkerShapeLocal "ELLIPSE"; _x setMarkerSizeLocal [350,350];
+ _x setMarkerPosLocal _markerPos}forEach [_markerA,_markerB];
+
+ _markerA setMarkerBrushLocal "Cross";
+ _markerA setMarkerColorLocal "ColorYellow";
+
+ _markerB setMarkerBrushLocal "Border";
+ _markerB setMarkerColorLocal "ColorRed";
+
+ _markerC_Pos = [(_markerPos select 0) - (count _markerName * 12), (_markerPos select 1) - 370, 0];
+ _markerC setMarkerShapeLocal "Icon";
+ _markerC setMarkerTypeLocal "HD_Arrow";
+ _markerC setMarkerColorLocal "ColorRed";
+ _markerC setMarkerPosLocal _markerC_Pos;
+ _markerC setMarkerTextLocal _markerName;
+ _markerC setMarkerDirLocal 37;
+
+ },{ //else delete marker
+
+ _this spawn { private ["_markerTimeout","_markerID"];
+ _markerTimeout = _this select 1;
+ _markerID = _this select 2;
+
+ if(_markerTimeout > 0)then{
+ format["SEM_MissionMarkerB_%1", _markerID] setMarkerColorLocal "ColorGreen";
+ format["SEM_MissionMarkerC_%1", _markerID] setMarkerColorLocal "ColorGreen";
+ sleep _markerTimeout;
+ };
+
+ if (getMarkerColor format["SEM_MissionMarkerA_%1", _markerID] != "")then{ //Only delete existing Marker
+ deleteMarkerLocal format["SEM_MissionMarkerA_%1", _markerID];
+ deleteMarkerLocal format["SEM_MissionMarkerB_%1", _markerID];
+ deleteMarkerLocal format["SEM_MissionMarkerC_%1", _markerID];
+ };
+ };
+ }];
+};
+
+if(!isNil "SEM_globalMissionMarker")then{SEM_globalMissionMarker call SEM_client_createMissionMarker};
+"SEM_globalMissionMarker" addPublicVariableEventHandler {_this select 1 call SEM_client_createMissionMarker};
+
+SEM_lastEvent = 0;
+"SEM_globalHint" addPublicVariableEventHandler {
+ _this select 1 spawn { private "_sound";
+ //waitUntil{time - SEM_lastEvent > 20}; SEM_lastEvent = time;
+ waitUntil{if(time - SEM_lastEvent > 20)exitwith{SEM_lastEvent = time; true}; false};
+ _sound = _this select 0;
+ switch(_sound)do{
+ case 0:{playSound "UAV_05"}; //Mission start
+ case 1:{playSound "UAV_01"}; //Mission fail (object destroyed)
+ case 2:{playSound "UAV_04"}; //Mission fail (time out)
+ case 3:{playsound "UAV_03"}; //Mission success
+ };
+ hint parseText format["%1", _this select 1];
+ };
+};
+
+"SEM_vehDamage" addPublicVariableEventHandler { private ["_vk","_vP","_s"];
+ _vk = _this select 1;
+ _vP = vehicle player;
+ if(!local _vk)exitWith{};
+ if(_vk != _vP)exitWith{};
+ _s = [ "MOTOR","karoserie","palivo","glass1","glass2","glass3","door1","door2","door3","door4",
+ "wheel_1_1_steering","wheel_2_1_steering","wheel_1_2_steering","wheel_2_2_steering",
+ "wheel_1_3_steering","wheel_2_3_steering","wheel_1_4_steering","wheel_2_4_steering"];
+ {_vk setHit [_x,(_vk getHit _x)+(.2+(random .15))]}count _s;
+};
+
+
+[] spawn {
+ waitUntil{!isNil "SEM_AIsniperDamageDistance"};
+ waitUntil{!isNil "SEM_AI_Units"};
+
+ while{true}do{ private "_units";
+ _units = SEM_AI_Units;
+ { sleep 0.05;
+ if(_x distance (vehicle player) > SEM_AIsniperDamageDistance)then[{
+ if(!isPlayer _x)then{_x allowDamage false};
+ },{
+ if(!isPlayer _x)then{_x allowDamage true};
+ }];
+ }forEach _units;
+ };
+};
+//if(!isNil "SEM_AIsniperDamageEH")then{SEM_AI_Units call SEM_client_AIaddDamageEH};
+//"SEM_AI_Units" addPublicVariableEventHandler {_this select 1 call SEM_client_AIaddDamageEH};
\ No newline at end of file