-
Content count
365 -
Donations
0.00 EUR -
Joined
-
Last visited
-
Days Won
1
Content Type
Profiles
Forums
Wiki
Servers
Devblog
Everything posted by speedweasel
-
I'm re-posting a DM here that contains some advice on getting ALiVE AI working with Exile. I've been running ALiVE AI on my Exile Chernarus server for the last month and while there are some compromises and drawbacks, the overall player experience eclipses DMS and A3XAI. Hi, I am using the following modules: Alive Required Virtual AI System (Profile) Military AI Skill Military AI commander Military Placement Module Civilian Placement Module Military Logistics I'm also running the Zeus module so I can spectate and debug the AI. I recommend you do this while developing your mission. You can take the Zeus module out before you 'go live.' In order to add loot, respect and poptabs to AI you'll need to add some event handler code to the end of your description.ext file: class Extended_Init_EventHandlers { class Man { init = "_this call (compile preprocessFileLineNumbers 'ai_init.sqf')"; }; }; This code will apply to every 'man' class of object your server spawns. Once you've added this code above, create a new file called ai_init.sqf in the root of your Exile mission folder (right next to description.ext.) Add the following code to the ai_init.sqf file to give the AI, respect, loot and poptabs. It also registers AI deaths and displays the Exile 'killed' message on your screen: private "_this"; _this = _this select 0; if (side _this == east) then { _poptabs = round random 200; _this setVariable ["ExileMoney",_poptabs,true]; _this addMPEventHandler ["MPKilled",'if (isServer) then {_this call DMS_fnc_OnKilled;};']; _this setVariable ["DMS_AI_Side", "Bandit"]; _this setVariable ["DMS_AI_Type", "Soldier"]; _this setVariable [ "DMS_AI_Respect", missionNamespace getVariable [format ["DMS_%1_%2_RepGain","Bandit","Soldier"],0] ]; }; This assumes all your AI are all OPFOR (east). The code above uses functions from the DMS AI mission system which most server admins run. If you don't want DMS missions running on your server you can edit the DMS config file to turn off all missions and loot drops, etc but you still need DMS running on your server to use the above code. As for AI killing each other. I had the same problem for hours and hours. I've tried every permutation of config settings but all of my OPFOR (OPF_F and OPF_G_F) were spawning in as INDEPENDENT groups and shooting each other (you can use Zeus to confirm this. They are dressed as OPF but show up in green groups). Eventually I swapped to CUP units and the problem stopped. Today I'm running three factions on my Chernarus server; CUP_O_RU, CUP_O_ChDKZ & CUP_I_NAPA and everything works perfectly. It turns out that Exile *does* interfere with the way Alive spawns vanilla Arma 3 OPFOR units. It makes them all spawn in as INDEPENDENT groups. I haven't found the code that does this yet but I have run the same Alive mission with and without Exile loaded and it runs perfectly without Exile. I'm continuing to search Exile's code... So, currently you'll need to use CUP Units (or possibly another mod) to get around the problem of Alive units killing each other. Other things you might want to consider: Use ALIVE blacklists to remove all AA groups and units otherwise they will routinely shoot down player helicopters (google alive blacklists, it's pretty easy) If factions are using vehicles, check the 'Ambient Vehicle' setting at the bottom of the Military Placement Module settings Blacklist all of your trader zones using the Blacklist Marker field in your Military and Civilian Placement Modules Alive units will spawn with weapons that have attachments. This lets players dupe attachments like optics, suppressors. Some units also have thermal and launchers. There is no way around this other than creating your own factions using the Alive ORBAT editor. That's a big job. I run a community server and I trust my players so it's no big deal but larger, public servers will have duping problems. Use the minimum filter settings for Objective Size and Objective Priority in your Military and Civilian Placement Modules. If you have unfiltered objectives the AI commander will place units in the tiniest buildings in the middle of nowhere. Good luck with your mission. Let me know how you go. speed.
-
****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)
-
It would be good to be able to save two or three custom loadouts in the database. You could go to a trader, click on, "Save Loadout" and it would store a list of all the equipment you are carrying. From then on, clicking on "Purchase Loadout," would automatically purchase all of the gear in the loadout you saved. If you already have some of the gear on you, you would be sold only the items you're missing from the loadout. It's the equivalent of going to your local pub and asking for 'the usual.' It saves everyone some time and mouse miles.
-
Any idea why Exile breaks the Zeus UI? Error message is in the screenshot attached. This error is always shown when using Zeus with the Exile mod loaded on the client.
-
Thanks. Anyone with deeper insight?
-
Improved loot spawner for Exile v1.0.3. Makes the size of loot spawns less predictable and occasionally spawns a large crate full of gear. Fully configurable. Instructions: 1. Overwrite the CfgExileLootSettings class in your mission config.cpp file with the code below. Just overwrite the class - including the class name and the opening and closing braces {} - Do not overwrite the whole config.cpp file. class CfgExileLootSettings { /** * Lifetime of loot in minutes. Synchronize this with * the garbage collector settings of your server * CfgSettings! */ lifeTime = 30; /** * Interval in seconds when the client searches for * new buildings to spawn loot in */ spawnInterval = 12; /** * This is a percentage value to determine how many loot * positions should contain loot when the system spawns loot. * * If a building has 20 positions defined, Exile will * spawn loot in 10 random positions of them. * * This means smaller buildings spawn less loot and larger * ones spawn more loot. * * You can also cap it at a maximum value. See below. */ maximumPositionCoverage = 30; /** * Limit the number of loot positions per building. If the * above percentage value exceeds this value, it will be capped. * * Example: Coverage is 50%. Building has 60 loot positions defined. * This results in 30 loot positions and that is too much. So we * cap this at 10 */ maximumNumberOfLootSpotsPerBuilding = 3; /** * Exile spawns a random number of items per loot spot. This * is the upper cap for that. So 3 means it will never spawn more than 3 items in one spot. */ maximumNumberOfItemsPerLootSpot = 7; /** * This is the mid range for the number of loot items per spot. Exile is most likely to spawn this number of items. https://community.bistudio.com/wiki/random */ midNumberOfItemsPerLootSpot = 3; /** * This is the minimum number of loot items per spot. */ minimumNumberOfItemsPerLootSpot = 1; /** * This is the chance (as a percentage) of spawning a crate full of items. */ percentageChanceToSpawnCrate = 1; // 2 = 2% chance to spawn a crate. Keep it low. /** * The number of items to spawn in a crate. */ numberOfItemsPerCrate = 50; /** * Radius in meter to spawn loot AROUND each player. * Do NOT touch this value if you dont know what you do. * The higher the number, the higher the drop rates, the * easier your server will lag. * * 50m = Minimum * 200m = Maximum */ spawnRadius = 60; /** * Defines the radius around trader cities where the system should * not spawn loot. Set this to 0 if you want to have loot spawning * in trader citites, ugh. */ minimumDistanceToTraderZones = 500; /** * Defines the radius around territories where no loot spawns. * This does not regard the actual size of a territory. So do not * set this to a lower value than the maximum radius of a territory, * which is 150m by default. */ minimumDistanceToTerritories = 150; }; 2. Tune the settings in CfgExileLootSettings to your liking. 3. Overwrite the ExileServer_system_lootManager_spawnLootInBuilding function with the code below, using the regular Exile CustomCode overwrite method. /** * ExileServer_system_lootManager_spawnLootInBuilding * * 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["_numberOfItemsPerCrate","_percentageChanceToSpawnCrate","_midNumberOfItemsPerLootSpot","_minimumNumberOfItemsPerLootSpot","_crate","_building", "_buildingConfig", "_lootTableName", "_localPositions", "_lootConfig", "_maximumNumberOfLootPositions", "_maximumPositionCoverage", "_maximumNumberOfItemsPerLootSpot", "_numberOfPositionsToUse", "_lootPositions", "_spawnedItemClassNames", "_lootWeaponHolderNetIDs", "_lootPosition", "_lootHolder", "_numberOfItemsToSpawn", "_n", "_itemClassName", "_cargoType", "_magazineClassNames", "_magazineClassName", "_numberOfMagazines"]; _building = _this; _building setVariable ["ExileLootSpawnedAt", time]; _building setVariable ["ExileHasLoot", true]; _buildingConfig = configFile >> "CfgBuildings" >> typeOf _building; _lootTableName = getText (_buildingConfig >> "table"); _localPositions = getArray (_buildingConfig >> "positions"); if ((getPosATL _building) call ExileClient_util_world_isInRadiatedZone) then { _lootTableName = "Radiation"; }; _lootConfig = missionConfigFile >> "CfgExileLootSettings"; _maximumNumberOfLootPositions = getNumber (_lootConfig >> "maximumNumberOfLootSpotsPerBuilding"); _maximumPositionCoverage = getNumber (_lootConfig >> "maximumPositionCoverage"); _maximumNumberOfItemsPerLootSpot = getNumber (_lootConfig >> "maximumNumberOfItemsPerLootSpot"); _minimumNumberOfItemsPerLootSpot = getNumber (_lootConfig >> "minimumNumberOfItemsPerLootSpot"); _midNumberOfItemsPerLootSpot = getNumber (_lootConfig >> "midNumberOfItemsPerLootSpot"); _numberOfPositionsToUse = 1 max (((count _localPositions) * _maximumPositionCoverage / 100) min _maximumNumberOfLootPositions); _localPositions = _localPositions call ExileClient_util_array_shuffle; _lootPositions = _localPositions select [0, _numberOfPositionsToUse]; _spawnedItemClassNames = []; _lootWeaponHolderNetIDs = []; _percentageChanceToSpawnCrate = getNumber (_lootConfig >> "percentageChanceToSpawnCrate"); _numberOfItemsPerCrate = getNumber (_lootConfig >> "numberOfItemsPerCrate"); { _lootPosition = ASLToATL (AGLToASL (_building modelToWorld _x)); if (_lootPosition select 2 < 0.05) then { _lootPosition set [2, 0.05]; }; _lootHolder = objNull; _numberOfItemsToSpawn = round random [_minimumNumberOfItemsPerLootSpot,_midNumberOfItemsPerLootSpot,_maximumNumberOfItemsPerLootSpot]; // [min,mid,max] if (random 100 <= _percentageChanceToSpawnCrate) then {_numberOfItemsToSpawn = _numberOfItemsPerCrate}; // occasionally have a big loot cache for "_n" from 1 to _numberOfItemsToSpawn do { _itemClassName = _lootTableName call ExileServer_system_lootManager_dropItem; if !(_itemClassName in _spawnedItemClassNames) then { if (isNull _lootHolder) then { if (_numberOfItemsToSpawn == _numberOfItemsPerCrate) then //if you have a big loot cache, put it in a random crate { _crate = selectRandom [ "Box_IND_Ammo_F", "Box_T_East_Ammo_F", "Box_East_Ammo_F", "Box_NATO_Ammo_F", "Box_Syndicate_Ammo_F", "Box_IND_Wps_F", "Box_T_East_Wps_F", "Box_East_Wps_F", "Box_T_NATO_Wps_F", "Box_Syndicate_Wps_F", "Box_Syndicate_WpsLaunch_F", "Box_IND_WpsSpecial_F", "Box_East_WpsSpecial_F", "Box_T_NATO_WpsSpecial_F", "Box_NATO_WpsSpecial_F", "Box_IND_Support_F", "Box_East_Support_F", "Box_NATO_Support_F"]; _lootHolder = createVehicle [_crate, _lootPosition, [], 0, "CAN_COLLIDE"]; clearWeaponCargoGlobal _lootHolder; // empty crate clearMagazineCargoGlobal _lootHolder; // empty crate clearItemCargoGlobal _lootHolder; // empty crate clearBackpackCargoGlobal _lootHolder; // empty crate } else { _lootHolder = createVehicle ["LootWeaponHolder", _lootPosition, [], 0, "CAN_COLLIDE"]; }; _lootHolder setDir (random 360); _lootHolder setPosATL _lootPosition; _lootHolder setVariable ["ExileSpawnedAt", time]; _lootWeaponHolderNetIDs pushBack (netId _lootHolder); }; _cargoType = _itemClassName call ExileClient_util_cargo_getType; switch (_cargoType) do { case 1: { if (_itemClassName isEqualTo "Exile_Item_MountainDupe") then { _lootHolder addMagazineCargoGlobal [_itemClassName, 2]; } else { _lootHolder addMagazineCargoGlobal [_itemClassName, 1]; }; }; case 3: { _lootHolder addBackpackCargoGlobal [_itemClassName, 1]; }; case 2: { _lootHolder addWeaponCargoGlobal [_itemClassName, 1]; if !(_itemClassName isKindOf ["Exile_Melee_Abstract", configFile >> "CfgWeapons"]) then { _magazineClassNames = getArray(configFile >> "CfgWeapons" >> _itemClassName >> "magazines"); if (count(_magazineClassNames) > 0) then { _magazineClassName = selectRandom _magazineClassNames; _numberOfMagazines = 2 + floor(random 3); _lootHolder addMagazineCargoGlobal [_magazineClassName, _numberOfMagazines]; _spawnedItemClassNames pushBack _magazineClassName; }; }; _numberOfItemsToSpawn = -1; }; default { _lootHolder addItemCargoGlobal [_itemClassName, 1]; }; }; _spawnedItemClassNames pushBack _itemClassName; }; }; } forEach _lootPositions; _building setVariable ["ExileLootWeaponHolderNetIDs", _lootWeaponHolderNetIDs]; ExileServerBuildingNetIdsWithLoot pushBack (netId _building); Enjoy!
-
Can we add a checkbox to the respawn dialogue that lets players choose whether they parachute in or not on a per-respawn basis? Sometimes you want to parachute in, other times you don't want to get shot out of the air.
-
Private accepts several alternative syntaxes, including an array of strings (like I've used above). https://community.bistudio.com/wiki/private
-
Sure. Any number between 0 and 100 should work. Be aware that 0.1 would mean an average of 1 crate in 1000 loot spawns. That's pretty rare. Many players will never find a crate.
-
Now that it takes time to repair vehicles, can we make it so players can repair their vehicles while in combat? Getting a wheel shot out on your Hunter, piling out of the vehicle and defending your teammate trying to repair it is a fantastic combat scenario. As things stand, as soon as a vehicle is damaged, it's effectively a wreck until the firefight is over. It's unnecessarily limiting.
-
Lots of people have been asking for these so I though I'd share my Chernarus trader zones. There are 3 zones; a 'supermarket' in Vybor, a construction compound south west of Berezino and a warehouse building on the docks in Elektro. There is also a deactivated supermarket trader in Stary Sobor, I don't use it but you can reactivate it if you like. Zones contain a decent number of props, furnishings, lighting, guards, etc to create a proper trader atmosphere. Anyone can make some traders stand around an empty building but I've gone the extra mile. Enjoy! ***EDIT 22/04/2016*** Updated this post with the latest version. Have re-worked the Elektro trader to give a better atmosphere (and an indoor rifle range!) Have also added Aircraft Trader and Aircraft Customs guys in Krasnostav. New screenshots also. Exile.Chernarus\initServer.sqf Exile.Chernarus\initPlayerLocal.sqf ***EDIT*** 17/05/2016 The missing piece has been my mission.sqm file which includes trader zone markers as well as lighting for the trader zones (you cant see in the dark.)
-
Happy to answer questions. ALiVE doesn't work perfectly with Exile but you can get it to work well enough.
-
You need to sync up your ALiVE modules, place some TOAR markers, and generally configure ALiVE to work properly. I suggest you get an ALiVE mission working without Exile, then manually merge the two missions when you know ALiVE is working correctly.
-
Seriously, please do something about the loadingscreen "spinner"...
speedweasel replied to IT07's topic in Constructive Criticism
I'm guessing some people have a grander, more dignified vision of Exile than others. -
Seriously, please do something about the loadingscreen "spinner"...
speedweasel replied to IT07's topic in Constructive Criticism
Yeah, these messages really don't do anything for Exile. Kinda amateurish and embarrassing actually. -
Alive performs significantly better than DMS, Occupation or A3XAI for me. With *way* more AI. ALiVE works great with Exile as long as you stick to ALiVE's AI modules and avoid using the other modules (like respawn). I got ALiVE running nicely with Exile in an afternoon. It took another hour the next morning to script the ALiVE AI to have ExileMoney, Respect and loot. DMS (like lots of other addons) focuses the admin on editing scripts and config files and testing iteratively which was fine when I was unemployed but painful if you value your time. With ALiVE you can place your prisoners in the middle of a dynamic, populated environment just using the 3DEN editor. And here's the kicker; the AI environment is different every time. Exile AI mods are just so predictable. You could, but I didn't need to. 50 FPS, 40-50 CPS. We only have half a dozen players on Chernarus but the server is also weak. YMMV. Your post discouraged me from even trying to get Exile and ALiVE working for like 2 weeks. I'm glad that in the end I didn't listen to you.
-
ALiVE runs brilliantly with Exile now they have stacked event handlers.
-
Around 1 in 10 locked vehicles disappear from my server. I've done some testing and after a reboot, those vehicles simply aren't in the database any more. Some of the vehicles were in safe zones, some weren't. 100% of the missing vehicles were locked. unlockInSafeZonesAfterRestart = 0; ^ I've turned off unlocking vehicles in safe zones. Is anyone else seeing this on their servers?
-
I have set maximumNumberOfLootSpotsPerBuilding = 2; but I still get between 3 and 8 piles of loot per building. Is anyone else seeing this? Also, does anyone know why the devs removed the spawnChancePerBuilding variable? This was great if you didn't want *every* building to spawn loot.
-
Player not spawning due to database field length limit?
speedweasel replied to speedweasel's question in Serverside
Legend. -
One of my regulars couldn't spawn in and I found this data in the 'hitpoints' field in the DB. [["face_hub",0.00787402],["neck",0.00787402],["head",0.00787402],["pelvis",0.00787402],["spine1",0.00787402],["spine2",0.00787402],["spine3",0.00787402],["body",0.00787402],["arms",0.00787402],["head_hit",0.00787402],["hand_r",0.00787402],["body",0.039370 Note the data is 255 characters long and appears truncated (I'm guessing) due to length. Note also this player has three spines. Handy. .rpt error follows: 30:31 Error compiling '' in 'HitPelvis' 20:30:31 Error compiling '' in 'HitAbdomen' 20:30:31 Error compiling '' in 'HitDiaphragm' 20:30:31 Error compiling '' in 'HitChest' 20:30:31 Error compiling '' in 'HitArms' 20:30:31 Error compiling '' in 'HitLegs' 20:30:31 "ExileServer - Player **** (UID *****************) connected!" 20:30:34 Error: Object(4 : 121) not found 20:30:34 Error: Object(4 : 122) not found 20:30:35 "ExileServer - Starting session for '*****' with ID 'eYlAFczm'..." 20:30:35 "ExileServer - Dispatching hasPlayerRequest for session 'eYlAFczm'..." 20:30:35 Error in expression <15309,32490,0,60,1,"*****",37,0,10000]]]> 20:30:35 Error position: <> 20:30:35 Error Missing ] 20:30:35 Error in expression <15309,32490,0,60,1,"*****",37,0,10000]]]> 20:30:35 Error position: <> 20:30:35 Error Missing ] 20:30:35 Error in expression <10; _player = (createGroup independent) createUnit ["Exile_Unit_Player", _positi> 20:30:35 Error position: <createUnit ["Exile_Unit_Player", _positi> 20:30:35 Error Type Any, expected Number 20:30:35 File exile_server\code\ExileServer_object_player_database_load.sqf, line 20
-
[SOLVED] Easy way to get classnames of items
speedweasel replied to BetterDeadThanZed's topic in Items & Weapons
...and *still* cant search the 3den objects using classnames. It's like no one at BIS has ever seen a modern app UI. It's still 2002 in Prague. -
I'm done. GG, Arma.
-
Forget Key Frames. As of Arma 1.55 you can use weighted random values to select weather (and other stuff) on the fly. ExileServer_system_weather_thread_weatherSimulation /** * ExileServer_system_weather_thread_weatherSimulation * * 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["_interval","_keyframes","_keyframeName","_keyframeConfig"]; _interval = round(getNumber (configFile >> "CfgSettings" >> "Weather" >> "interval") * 60); _keyframes = getArray (configFile >> "CfgSettings" >> "Weather" >> "keyframes"); _keyframeName = selectRandom _keyframes; _keyframeConfig = configFile >> "CfgSettings" >> "Weather" >> _keyframeName; _interval setFog getNumber (_keyframeConfig >> "fogValue"); _interval setFog [ getNumber (_keyframeConfig >> "fogValue"), getNumber (_keyframeConfig >> "fogDecay"), getNumber (_keyframeConfig >> "fogBase") ]; _interval setOvercast random [0,0.2,1]; _interval setWaves random [0,0.2,1]; _interval setWindStr random [0,0.1,1]; _interval setGusts random [0,0.2,1]; _interval setRain random [0,0.2,1]; _interval setLightnings random [0,0.2,1]; _interval setRainbow random [0,0.2,1]; /*_interval setOvercast (getNumber (_keyframeConfig >> "overcast")); _interval setWaves (getNumber (_keyframeConfig >> "waves")); _interval setWindStr (getNumber (_keyframeConfig >> "wind")); _interval setGusts (getNumber (_keyframeConfig >> "gusts")); _interval setRain (getNumber (_keyframeConfig >> "rain")); _interval setLightnings (getNumber (_keyframeConfig >> "lightnings")); _interval setRainbow (getNumber (_keyframeConfig >> "rainbows"));*/ true
-
Play in an ever-evolving ALiVE AI war zone. No two AI encounters are the same. Custom lootspawns. Tuned for maximum FPS (seriously, I know everyone says that but this server is smooooth.)