Skip to content
This repository has been archived by the owner on May 24, 2022. It is now read-only.

Naked units after transfer to HC #48

Closed
Arcanum417 opened this issue Nov 21, 2016 · 45 comments
Closed

Naked units after transfer to HC #48

Arcanum417 opened this issue Nov 21, 2016 · 45 comments
Assignees
Milestone

Comments

@Arcanum417
Copy link

Arcanum417 commented Nov 21, 2016

Arma 3 Version: stable 1.64.138762 (stable / rc / dev)
CBA Version: 3.1.2.161105 (stable / dev + commit hash)
ACE3 Version: 3.8.1 (stable / dev + commit hash)
ACEX Version: 3.1.1 (stable / dev + commit hash)

Mods:

  • @CBA_A3
  • @ace
  • @acex

Description:
Some units loose their clothes on transfer to HC and drivers and or crew tend to disembark.
There should be a workaround for this.
https://forums.bistudio.com/topic/189818-units-becomes-naked-driver-jumps-out-on-ownership-change/

Steps to reproduce:

  • Spawn lot of groups at once
  • wait and see naked soldiers

Where did the issue occur?

  • Dedicated

Placed Modules:

class ace_medical_blood_enabledFor {
    value = 2;
    typeName = "SCALAR";
    force = 1;
};
class ace_common_forceAllSettings {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_common_checkPBOsAction {
    value = 2;
    typeName = "SCALAR";
    force = 1;
};
class ace_common_checkPBOsCheckAll {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_common_checkPBOsWhitelist {
    value = "[]";
    typeName = "STRING";
    force = 1;
};
class ace_cookoff_enable {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_cookoff_enableAmmobox {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_cookoff_enableAmmoCookoff {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_finger_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_finger_maxRange {
    value = 6;
    typeName = "SCALAR";
    force = 1;
};
class ace_frag_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_frag_spallEnabled {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_frag_reflectionsEnabled {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_frag_maxTrack {
    value = 500;
    typeName = "SCALAR";
    force = 1;
};
class ace_frag_maxTrackPerFrame {
    value = 50;
    typeName = "SCALAR";
    force = 1;
};
class ace_frag_enableDebugTrace {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_goggles_effects {
    value = 2;
    typeName = "SCALAR";
    force = 1;
};
class ace_hitreactions_minDamageToTrigger {
    value = 0.1;
    typeName = "SCALAR";
    force = 1;
};
class ace_interaction_enableTeamManagement {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_laser_dispersionCount {
    value = 2;
    typeName = "SCALAR";
    force = 1;
};
class ace_laserpointer_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_magazinerepack_timePerAmmo {
    value = 1.5;
    typeName = "SCALAR";
    force = 1;
};
class ace_magazinerepack_timePerMagazine {
    value = 2;
    typeName = "SCALAR";
    force = 1;
};
class ace_magazinerepack_timePerBeltLink {
    value = 8;
    typeName = "SCALAR";
    force = 1;
};
class ace_map_BFT_Interval {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_map_BFT_Enabled {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_map_BFT_HideAiGroups {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_map_BFT_ShowPlayerNames {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_map_mapIllumination {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_map_mapGlow {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_map_mapShake {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_map_mapLimitZoom {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_map_mapShowCursorCoordinates {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_map_defaultChannel {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_map_gestures_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_map_gestures_maxRange {
    value = 10;
    typeName = "SCALAR";
    force = 1;
};
class ace_map_gestures_interval {
    value = 0.03;
    typeName = "SCALAR";
    force = 1;
};
class ace_map_gestures_groupColorConfigurations {
    
    typeName = "ARRAY";
    force = 1;
};
class ace_map_gestures_groupColorConfigurationMapping {
    
    typeName = "ARRAY";
    force = 1;
};
class ace_medical_level {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_medicSetting {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_increaseTrainingInLocations {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_enableFor {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_enableOverdosing {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_bleedingCoefficient {
    value = 0.3;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_painCoefficient {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_enableAirway {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_enableFractures {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_enableAdvancedWounds {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_enableVehicleCrashes {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_enableScreams {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_playerDamageThreshold {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_AIDamageThreshold {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_enableUnconsciousnessAI {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_remoteControlledAI {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_preventInstaDeath {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_enableRevive {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_maxReviveTime {
    value = 333;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_amountOfReviveLives {
    value = -1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_allowDeadBodyMovement {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_allowLitterCreation {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_litterSimulationDetail {
    value = 3;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_litterCleanUpDelay {
    value = 1800;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_medicSetting_basicEpi {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_medicSetting_PAK {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_medicSetting_SurgicalKit {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_consumeItem_PAK {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_consumeItem_SurgicalKit {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_useLocation_basicEpi {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_useLocation_PAK {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_useLocation_SurgicalKit {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_useCondition_PAK {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_useCondition_SurgicalKit {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_keepLocalSettingsSynced {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_healHitPointAfterAdvBandage {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_painIsOnlySuppressed {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_allowUnconsciousAnimationOnTreatment {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_moveUnitsFromGroupOnUnconscious {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_medical_delayUnconCaptive {
    value = 3;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_ai_enabledFor {
    value = 2;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_menu_allow {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_medical_menu_maxRange {
    value = 3;
    typeName = "SCALAR";
    force = 1;
};
class ace_microdagr_mapDataAvailable {
    value = 2;
    typeName = "SCALAR";
    force = 1;
};
class ace_mk6mortar_airResistanceEnabled {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_mk6mortar_allowComputerRangefinder {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_mk6mortar_allowCompass {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_mk6mortar_useAmmoHandling {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_nametags_showCursorTagForVehicles {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_nametags_playerNamesViewDistance {
    value = 10;
    typeName = "SCALAR";
    force = 1;
};
class ace_nametags_playerNamesMaxAlpha {
    value = 0.8;
    typeName = "SCALAR";
    force = 1;
};
class ace_nightvision_disableNVGsWithSights {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_overheating_overheatingDispersion {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_overheating_unJamOnreload {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_overheating_unJamFailChance {
    value = 0.1;
    typeName = "SCALAR";
    force = 1;
};
class ace_overheating_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_rearm_level {
    value = 2;
    typeName = "SCALAR";
    force = 1;
};
class ace_refuel_rate {
    value = 10;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_engineerSetting_repair {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_engineerSetting_wheel {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_repairDamageThreshold {
    value = 0.6;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_repairDamageThreshold_engineer {
    value = 0.4;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_consumeItem_toolKit {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_fullRepairLocation {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_engineerSetting_fullRepair {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_addSpareParts {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_repair_wheelRepairRequiredItems {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_repair_autoShutOffEngineWhenStartingRepair {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_respawn_savePreDeathGear {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_respawn_removeDeadBodiesDisconnected {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_respawn_bodyRemoveTimer {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_spectator_filterUnits {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_spectator_filterSides {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_spectator_restrictModes {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_spectator_restrictVisions {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_switchunits_enableSwitchUnits {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_switchunits_switchToWest {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_switchunits_switchToEast {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_switchunits_switchToIndependent {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_switchunits_switchToCivilian {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_switchunits_enableSafeZone {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_switchunits_safeZoneRadius {
    value = 100;
    typeName = "SCALAR";
    force = 1;
};
class ace_ui_allowSelectiveUI {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_vehiclelock_defaultLockpickStrength {
    value = 10;
    typeName = "SCALAR";
    force = 1;
};
class ace_vehiclelock_lockVehicleInventory {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_vehiclelock_vehicleStartingLockState {
    value = -1;
    typeName = "SCALAR";
    force = 1;
};
class ace_viewdistance_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_viewdistance_limitViewDistance {
    value = 10000;
    typeName = "SCALAR";
    force = 1;
};
class ace_weather_enableServerController {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_weather_useACEWeather {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_weather_syncRain {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_weather_syncWind {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_weather_syncMisc {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_weather_serverUpdateInterval {
    value = 60;
    typeName = "SCALAR";
    force = 1;
};
class ace_winddeflection_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_winddeflection_vehicleEnabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_winddeflection_simulationInterval {
    value = 0.05;
    typeName = "SCALAR";
    force = 1;
};
class ace_winddeflection_simulationRadius {
    value = 3000;
    typeName = "SCALAR";
    force = 1;
};
class ace_zeus_zeusAscension {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_zeus_zeusBird {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_zeus_remoteWind {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_zeus_radioOrdnance {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_zeus_revealMines {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_zeus_autoAddObjects {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class acex_sitting_enable {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class acex_viewrestriction_mode {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class acex_viewrestriction_modeSelectiveFoot {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class acex_viewrestriction_modeSelectiveLand {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class acex_viewrestriction_modeSelectiveAir {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class acex_viewrestriction_modeSelectiveSea {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_advanced_fatigue_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_fatigue_performanceFactor {
    value = 1;
    typeName = "SCALAR";
    force = 1;
};
class ace_advanced_fatigue_recoveryFactor {
    value = 1.25;
    typeName = "SCALAR";
    force = 1;
};
class ace_advanced_fatigue_loadFactor {
    value = 0.75;
    typeName = "SCALAR";
    force = 1;
};
class ace_advanced_fatigue_terrainGradientFactor {
    value = 0.7;
    typeName = "SCALAR";
    force = 1;
};
class ace_advanced_throwing_enablePickUp {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_throwing_enablePickUpAttached {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_captives_allowHandcuffOwnSide {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_captives_requireSurrender {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_captives_allowSurrender {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_cargo_enable {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_explosives_requireSpecialist {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_explosives_punishNonSpecialists {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_explosives_explodeOnDefuse {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class acex_headless_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class acex_headless_delay {
    value = 15;
    typeName = "SCALAR";
    force = 1;
};
class acex_headless_endMission {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class acex_headless_log {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_enabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_simulateForSnipers {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_simulateForGroupMembers {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_simulateForEveryone {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_disabledInFullAutoMode {
    value = 0;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_ammoTemperatureEnabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_barrelLengthInfluenceEnabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_bulletTraceEnabled {
    value = 1;
    typeName = "BOOL";
    force = 1;
};
class ace_advanced_ballistics_simulationInterval {
    value = 0;
    typeName = "SCALAR";
    force = 1;
};
class ace_advanced_ballistics_simulationRadius {
    value = 3000;
    typeName = "SCALAR";
    force = 1;
}
@jonpas
Copy link
Member

jonpas commented Nov 21, 2016

I never experienced this issue, and sleep is not something we will use. Delaying 10s is also not wanted, I'd say this is up to BI to fix.

And please use Gist or Pastebin for the huge list of settings, as it is described in the issue template.

@jonpas jonpas added this to the Backlog milestone Nov 21, 2016
@Arcanum417
Copy link
Author

It ultimately is, but ACEX is kinda useless now... I tried to "force" our group mission makers (curators) to use HC but there are so much problems with zeus and HC.

  • Cannot rotate units you don't own
  • Cannot give waypoints to units you don't own
  • This random naked units you need to lookout for

It's just a irreplicable mess you cannot fix as a modset/server admin.
BIS just recently got Linux HC working decently (still some random diffrences from windows but at least they now work with Battleye).

So is there a scope for ACEX to make HC really usefull and usable with zeus ?

@jonpas
Copy link
Member

jonpas commented Nov 21, 2016

  • Cannot rotate units you don't own
  • Cannot give waypoints to units you don't own

We can't do anything about either of those, it's completely a Zeus problem.

It ultimately is, but ACEX is kinda useless now...

Well that's simply not true. We use it just fine and it works perfectly, never had a single issue.

@Arcanum417
Copy link
Author

Well it sure is usefull, but not really if you don't want to make every curators job much more tedious. (or if not using zeus at all)

Is it really meant to use with zeus ?

@jonpas
Copy link
Member

jonpas commented Nov 21, 2016

Sure, but Zeus has its own problems we simply can't fix. You might want to take a look at Mars in the future as a Zeus replacement.

I have put this issue on Backlog for now, as it is not something I'd like to see implemented due to rather high delays necessary, but if someone wants to, feel free to, can always make it a setting.

@commy2
Copy link
Contributor

commy2 commented Nov 21, 2016

added github spoiler text

@Fourjays
Copy link

Our group has been running Zeus alongside HCs for over a year now and ACEX is the best implementation we've used.

In my experience, increasing the time delay before a unit is transferred reduces the frequency with which the nakedness bug occurs (ACEX has a setting for adjusting the delay - ours is at 45 seconds). A delay also gives time for Zeus to make precise adjustments (move, rotate) before the transfer occurs. We eventually developed a Zeus module for setting the "no HC transfer" flag on units, which is useful when precise control over a particular group is needed.

@jonpas
Copy link
Member

jonpas commented Nov 24, 2016

@Fourjays I'd be interested in that module.

@Arcanum417
Copy link
Author

Arcanum417 commented Nov 24, 2016 via email

@Fourjays
Copy link

@jonpas @Arcanum417 I've not publicly released it in compiled form (one day maybe), but I keep the code open source under one of the Arma Community licenses so others can learn from it. It is part of a set of utility tools I developed for Zeus/Eden:
https://gitlab.com/blackwatchint/bwi_addons/tree/develop/addons/bwi_utils

This file is the main part of the HC transfer prevention (looks complicated, but all it does is set the blacklist variable that ACEX looks for before transferring a unit - you could just as easily set it via a unit's init line if pre-placed in the editor):
https://gitlab.com/blackwatchint/bwi_addons/blob/develop/addons/bwi_utils/modules/fn_preventHCTransfer.sqf

@Arcanum417
Copy link
Author

Arcanum417 commented Nov 25, 2016 via email

@Arcanum417
Copy link
Author

I can see a few approaches now.

  1. Just implement a module which disables transfer of a group and if the owner is not the curator who placed it on a unit transfer a group to him.
  2. Implement a switch (userconfig) that selects a mode: transfer all units expect marked or transfer only marked units. This way the usage wont be forced on a curator, he can choose not to transfer any units if he wants to.

@PhillyJoker
Copy link

This issue is actually related to bad documentation. If you connect headless client using the IP address of the server you'll get the lag because it's going outside of the LAN. You have to use the local ip, as they say use the 127.0.0.1, yet they fail to mention you MUST also provide the port of the server. So it's actually 127.0.0.1:2302 bam. We've since had no issues with naked AI.

@jonpas
Copy link
Member

jonpas commented Feb 8, 2017

Can anyone with the issue confirm @PhillyJoker 's solution works?

@Fourjays
Copy link

Fourjays commented Feb 8, 2017

I think @PhillyJoker's solution would only prevent the nakedness occuring on units placed in the editor that get transferred to HC. Our HCs have always connected to 127.0.0.1:2302 and the issue still occurs on Zeus->HC transfers, but not server->HC transfers.

With the Zeus->HC transfers, the frequency with which it occurs seems to correlate to the connection quality of the Zeus. Increasing the delay between spawn and transfer does help reduce the number of occurences, but still some slip through.

My assumption has always been that it is simply a case of the HC client not getting the full copy of the unit's inventory by the time the unit is transferred, causing the HC's version to become "canon". We've had the same issue with other HC scripts as well, so I don't think it is ACEX specific.

@jonpas
Copy link
Member

jonpas commented Feb 8, 2017

Ah, Zeus, awesome as always...

@PhillyJoker
Copy link

I guess I should have added that it erased 99% of the occurrences. We can still force it to happen by spawning 300 + AI in a minute, but it is extremely rare. I think at this point we're just hitting the limits of our hardware and BIS software.

I agree this is not an ace issue.

Theorizing for a second, it might be because BIS has no throttle to the amount of data it's trying to pass, so like others mentioned, it's missing gear and going default.

@jonpas
Copy link
Member

jonpas commented Feb 9, 2017

We have experienced this issue yesterday, however the units spawned only turned naked for the Zeus client that spawned them. Everyone else saw them normally. By reports it also happens when transferring from Zeus client to server.

I am closing this issue as there isn't much we can do, all we can do is bandaid and that's already possible by increasing the delay. However, since majority apparently does not have the issue I will not be changing the default values.

Fingers crossed this gets fixed one day. 🤞

@CreepPork
Copy link

CreepPork commented Apr 16, 2018

@jonpas
The issue is getting quite regularly raised in the Achilles Discord of AI losing their clothes. But everyone sees the units naked not just the Curator.

A possible solution could be saving the gear of the units before transferring them to the HC.

@Meiestrix
Copy link

Has someone meanwhile found a workaround for this problem?
I have increased the delay to 120 seconds but it is still a problem, that some units are naked.

Also sometimes the AI does not react to Zeus commands after the transfer to the HC, but this could be another problem.

@jonpas
Copy link
Member

jonpas commented Apr 23, 2018

Latter is locality issue, some Zeus modules only properly work on local units.

@jonpas
Copy link
Member

jonpas commented Apr 23, 2018

Saving gear could work, but could also be destructive if someone relies on certain gear or something, would keep it default disabled maybe.

I have no clue what the cause would be, never really experienced the issue myself.

@jonpas jonpas reopened this Apr 23, 2018
@Meiestrix
Copy link

Just an idea...
I don't know if it is possible but could you run a scipt on the HC wich checks if the transferred unit has a uniform and if not restore the default equipment of this class?

@CreepPork
Copy link

@Meiestrix
Deleting units is a terrible idea.

@Meiestrix
Copy link

Hm okay, than we need to add the default items back to the unite,
but I am not sure how to do this.

@Kexanone
Copy link
Member

The command getUnitLoadout essentially reveals the issue. When executed on the HC, the command will tell you if a unit becomes naked even before the transfer.

This is the current workaround we are using for our transfer ownership module:
https://gist.github.com/oOKexOo/117b7a3a5886075894650b6eef576697
Clarification: Achilles_fnc_spawn could be replaced with BIS_fnc_MP, since it takes the same arguments.

@Meiestrix
Copy link

Meiestrix commented Apr 25, 2018

Thank you.
The command getUnitLoadout / setUnitLoadout is the solution for me.
I can still use the ACEX HC and just add the missing items back with:
_x setUnitLoadout (configFile >> "CfgVehicles" >> _UnitClassname);

@stale
Copy link

stale bot commented Nov 10, 2018

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale bot added the wontfix label Nov 10, 2018
@Arcanum417
Copy link
Author

Arcanum417 commented Nov 10, 2018 via email

@stale stale bot removed the wontfix label Nov 10, 2018
@jonpas
Copy link
Member

jonpas commented Nov 10, 2018

What is the workaround? get/setUnitLoadout?

It looks like there is a sync issue, wonder if we can fix it somehow else by making the HC aware of the loadouts first.

@Arcanum417
Copy link
Author

Arcanum417 commented Nov 10, 2018 via email

@jonpas
Copy link
Member

jonpas commented Nov 10, 2018

I will take a look at some point, can't promise any time frame. If anyone wants to add and test a fix/workaround, that'd be great.

@jonpas jonpas added this to the Backlog milestone Nov 18, 2018
@jonpas
Copy link
Member

jonpas commented Dec 22, 2018

Ok, so I recommend something in this form (modified from Arma 3 Discord, posted by Schwaggot) which just sets loadout to config's default:

["CAManBase", "Local", {
    params ["_entity", "_local"];

    if (_local && {uniform _entity == ""}) then {
        _entity setUnitLoadout (getUnitLoadout (typeOf _entity));
    };
}] call CBA_fnc_addClassEventHandler;

But rework it so we have a setting that enables this functionality (because of possible network performance penalty).

Functionality is saving gear of each unit moved to HC, transmitting that data to the HC (setVariable public on the unit should work) and then checking if it was changed and if true, reset it.

Final form should look like this:

// Somewhere in transfer code
UNIT setVariable [QGVAR(loadout), getUnitLoadout UNIT, true];

// XEH code
["CAManBase", "Local", {
    params ["_entity", "_local"];

    // Check something more or is that enough?
    // Definitely check something though, `setUnitLoadout` is not a light command used en masse
    if (_local && {uniform _entity == ""}) then {
        // Set old loadout, if unavailable reset to config default (still better than naked)
        _entity setUnitLoadout (_entity getVariable [QGVAR(loadout), typeOf _entity]);
    };
}] call CBA_fnc_addClassEventHandler;

As said, setting because some communities are not experiencing this at all, and it would only cause unnecessary overhead.

Thoughts?

@jonpas jonpas modified the milestones: Backlog, 3.5.0 Dec 22, 2018
@jonpas jonpas self-assigned this Dec 22, 2018
@Drofseh
Copy link

Drofseh commented Dec 22, 2018

Having unit's loadouts reset themselves to their configs would ruin my group's scripted loadouts.

It's strongly prefer something like

cache getUnitLoadout
wait until transfer
getUnitLoadout , check if == cached loadout
if true then do nothing
if false then setUnitLoadout cached loadout

@Arcanum417
Copy link
Author

Arcanum417 commented Dec 22, 2018 via email

@Cuel
Copy link
Contributor

Cuel commented Dec 22, 2018

@Drofseh that's solved by the "final form"

@Arcanum417
Copy link
Author

Arcanum417 commented Dec 22, 2018 via email

@Drofseh
Copy link

Drofseh commented Dec 22, 2018

derp, that comment didn't expand properly on my phone.

@jonpas
Copy link
Member

jonpas commented Dec 22, 2018

Lol, I love how quickly you guys panicked after 1 misread. XD

@Arcanum417
Copy link
Author

Arcanum417 commented Dec 22, 2018 via email

@Fourjays
Copy link

How intensive on network resources or performance would the initial saving of the loadout to a variable be?

I ask as simply resetting to the config default would be perfectly fine for our needs. All of our AI units are configured as addons, so saving loadouts to a variable would be a pointless waste of valuable resources.

Could this behaviour be a secondary option or even a per-unit option (e.g. Preserve Customized Loadouts)? You could also just have the "no uniform and reset to config default" check as standard behaviour, with only the more intensive step of "saving the variable and reading it back" as a configurable option.

@jonpas
Copy link
Member

jonpas commented Dec 22, 2018

Not that big of a deal, although loadout arrays can get pretty big. But as you said, still pointless in your case, I'll add an option to save that (Disabled, Config Loadout, Save Loadout).

@Fourjays
Copy link

Awesome, thanks @jonpas.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests