Jump to content

RimBlock

Member
  • Posts

    1140
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by RimBlock

  1. So, as many will know, there is an issue in A2Epoch (possibily from DayZ) in the unique identifier generation not always producing unique identifiers.

     

    What is the unique identifier and how is it used ?.

     

    Epoch uses two object identifiers.

    • ObjectID
    • ObjectUID

    ObjectID is generated by the MySQL DB backend.  ObjectUID is generated within the ARMA 2 game world via SQF code.

     

    Why two identifiers ?.

     

    For some reason... there is only one HiveExt.dll call to get the ObjectID for an object in the DB.  This call is the one used to load all the DB objects in to ARMA.  The offshoot of this is that when a new object is created and saved to the DB, the DB creates a unique objectID but this objectID cannot get back to the ARMA 2 game world until the ARMA 2 server process is restarted and all the objects are then read from the DB again.

     

    To get around this, the ObjectUID is created when a new object is created in the game world.  This is used to reference the object in the game world and on the DB if the ARMA 2 engine does not know the DB assigned ObjectID.

     

    So, what is the problem ?.

     

    Whilst the code to generate a unique objectUID looks fairly good, it does not always create a unique ID.  THis means that manipulation of any new objects that have not yet got an objectID in the game world (ie. created after the last server restart) but having an objectUID that matches the objectUID of an object currently in the DB will cause all sorts of problems.

     

    How is the objectUID calculated currently ?.

     

    There are three functions used to calculate the objectUID currently (all defined in server_functions.sqf).

    • dayz_objectUID - No longer used it seems.
    • dayz_objectUID2 - Used for objects objectUID generation.
    • dayz_objectUID3 - Used for vehicle objectUID generation.

    dayz_objectUID just works out the required input parameters and then calls dayz_objectUID2.

     

    dayz_objectUID2 generates the objectUID for the object by applying the following calculation.

    •  x,y,z coords each multiplied by 10.
    • Results made positive if required by multiplying by -10 and rounded to a whole number.
    • 3 numbers are concatenated together (X + Y + Z).
    • The objects direction (in degrees) after rounding is then concatenated to the result.

    dayz_objectUID3 does the same but adds the mission time (time in seconds since the ARMA 2 mission was started) to the direction value before adding it to the result for the x/y/x/ * 10 part.

     

    Worked example for dayz_objectUID2 

    Worldspace = [351.545[11079.8,11834.3,-0.380997]]

    =

    X = 11079.8 * 10 = 110798 

    Y = 11834.3 * 10 = 118343

    Z = -0.380997 * 10 = -3.80997 * -10 (make positive) = 38.0997 round = 38

    DIR = 351.545 rounded = 352

     

    = concat  110798 + 118343 + 38 + 352

    Calculated objectUID

    11079811834338352

     

    Stored ObjectUID

     

    11079811834338352

     

    So why is it not random ?.

     

    A set of coodinates ( [dir,[x,y,z]] ) for an object of [0,[1,1,10]] will produce the same result as a set of coordinates of [0,[1,10,1]].  The uniqueness plays on the probability of combination resulting in the same onjectUID being generated as unlikely.  The more items you have in your DB then the more likely it is to happen.

     

    Ok, so what can we do about it ?.

     

    So this is the purpose of this thread.  Both to highlight the issues to those who were not aware and to have a discussion on peoples thoughts on a better solution.

     

    I am curious as to why the code does not start at 0 and each time a objectUID is needed it just increments (possibly by 2 / 5 / 10).  A server global variable could hold the current value and be populated on server restart by the highest objectUID found in the loaded objects.  The only issue I can see is if multiple requests for a new objectUID resulted in the same objectUIDs being given out to multiple requestors as the global 'current objectUID' variable cannot be updated quickly enough.  Presumabily that ould be managed by a basic schedualing system enforcing a FIFO queue so each request could be processed one at a time.

     

    Any other thoughts or observations ?.  I am hoping we can all come up with a better solution that does not require any custom .dlls or DB table changes.  Good news is that any new generation system should be pretty easy to plugin to Epoch.

     

    Over to you...

  2. I just attempted to install the latest version.  I have a lot of scripts running with a heavily modified compiles.sqf, variables.sqf, and others.  I already had Snap Pro 1.4.1 with Vector Build and Precise Base Build installed.   In an attempt to not have to back anything out, I compared scripts and merged what was appropriate so as to not (hopefully) break any scripts that were already running successfully.  Other scripts had already modified about half of the files from PP4L and they are already in my "custom" directory. I merged with the PP4L files of the same name and changed the references in all locations I could find.

     

    So I cannot even get it to start now. I get this error in my server-side .rpt:

     

    15:02:22 "DayZ Epoch: PRELOAD Functions\init [[:0 (FunctionsManager)],any]"

    15:02:22 "DayZ Epoch: MPframework inited"

    15:02:24 Error in expression if(_unit == _PUID player) then {

    player setVariable["publi>

    15:02:24 Error position: player setVariable["publi>

    15:02:24 Error Missing )

    15:02:24 File mpmissions\DayZ_Epoch_13.Tavi\custom\compiles.sqf, line 47

    15:02:24 Error in expression if(_unit == _PUID player) then {

    player setVariable["publi>

    15:02:24 Error position: player setVariable["publi>

    15:02:24 Error Missing )

    15:02:24 File mpmissions\DayZ_Epoch_13.Tavi\custom\compiles.sqf, line 47

    15:02:27 Warning: z\addons\dayz_communityassets\models\compass.p3d:0 Error while trying to generate ST for points: 863, 853, 852

    15:02:31 "Res3tting B!S effects..."

     

    and here's my compiles.sqf.

     

    /*

    FUNCTION COMPILES

    */

    //Player only

    if (!isDedicated) then {

    "filmic" setToneMappingParams [0.07, 0.31, 0.23, 0.37, 0.011, 3.750, 6, 4]; setToneMapping "Filmic";

    BIS_Effects_Burn = compile preprocessFile "\ca\Data\ParticleEffects\SCRIPTS\destruction\burn.sqf";

    player_zombieCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_zombieCheck.sqf"; //Run on a players computer, checks if the player is near a zombie

    player_zombieAttack = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_zombieAttack.sqf"; //Run on a players computer, causes a nearby zombie to attack them

    fnc_usec_damageActions = compile preprocessFileLineNumbers "custom\fn_damageActions.sqf"; //Checks which actions for nearby casualty

    fnc_inAngleSector = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_inAngleSector.sqf"; //Checks which actions for nearby casualty

    fnc_usec_selfActions = compile preprocessFileLineNumbers "custom\fn_selfActions.sqf";

    //Checks which actions for self

    fnc_usec_unconscious = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_unconscious.sqf";

    player_temp_calculation = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_temperatur.sqf"; //Temperatur System //TeeChange

    player_weaponFiredNear = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_weaponFiredNear.sqf";

    player_animalCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_animalCheck.sqf";

    player_spawnCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_spawnCheck.sqf";

    player_dumpBackpack = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_dumpBackpack.sqf";

    building_spawnLoot = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\building_spawnLoot.sqf";

    building_spawnZombies = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\building_spawnZombies.sqf";

    dayz_spaceInterrupt = compile preprocessFileLineNumbers "custom\dayz_spaceInterrupt.sqf";

    player_fired = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_fired.sqf"; //Runs when player fires. Alerts nearby Zeds depending on calibre && audial rating

    player_harvest = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_harvest.sqf";

    player_packTent = compile preprocessFileLineNumbers "custom\player_packTent.sqf";

    player_packVault = compile preprocessFileLineNumbers "custom\player_packVault.sqf";

    player_unlockVault = compile preprocessFileLineNumbers "custom\player_unlockVault.sqf";

    player_removeObject = compile preprocessFileLineNumbers "custom\remove.sqf";

    player_removeNearby = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_removeNearby.sqf";

    player_removeTankTrap = {

    //Object Array, Range, Error Message (@Skaronator)

    [["Hedgehog_DZ"], 1,"STR_EPOCH_ACTIONS_14"] call player_removeNearby;

    };

    player_removeNet = {

    [["DesertLargeCamoNet","ForestCamoNet_DZ","DesertLargeCamoNet_DZ","ForestLargeCamoNet_DZ"], 5,"str_epoch_player_8"] call player_removeNearby;

    };

    player_login = {

    private ["_unit","_detail","_PUID"];

    _unit = _this select 0;

    _detail = _this select 1;

    _PUID = [player] call FNC_GetPlayerUID;

    if(_unit == _PUID player) then {

    player setVariable["publish",_detail];

    };

    };

    player_unlockDoor = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_unlockDoor.sqf";

    player_changeCombo = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_changeCombo.sqf";

    player_lockVault = compile preprocessFileLineNumbers "custom\player_lockVault.sqf";

    player_updateGui = compile preprocessFileLineNumbers "custom\player_updateGui.sqf";

    player_crossbowBolt = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_crossbowBolt.sqf";

    player_music = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_music.sqf"; //Used to generate ambient music

    player_death = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_death.sqf";

    player_switchModel = compile preprocessFileLineNumbers "custom\player_switchModel.sqf";

    player_checkStealth = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_checkStealth.sqf";

    world_sunRise = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_sunRise.sqf";

    world_surfaceNoise = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_surfaceNoise.sqf";

    player_humanityMorph = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_humanityMorph.sqf";

    player_throwObject = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_throwObject.sqf";

    player_alertZombies = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_alertZombies.sqf";

    player_fireMonitor = compile preprocessFileLineNumbers "\z\addons\dayz_code\system\fire_monitor.sqf";

    fn_gearMenuChecks = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_gearMenuChecks.sqf";

    //SUV and MV22 Actions

    mv22_pack = compile preprocessFileLineNumbers "\ca\air2\mv22\scripts\pack.sqf";

    //Objects

    object_roadFlare = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_roadFlare.sqf";

    object_setpitchbank = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_setpitchbank.sqf";

    object_monitorGear = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_monitorGear.sqf";

    local_roadDebris = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_roadDebris.sqf";

    //Zombies

    zombie_findTargetAgent = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\zombie_findTargetAgent.sqf";

    zombie_loiter = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\zombie_loiter.sqf"; //Server compile, used for loiter behaviour

    zombie_generate = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\zombie_generate.sqf"; //Server compile, used for loiter behaviour

    wild_spawnZombies = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\wild_spawnZombies.sqf"; //Server compile, used for loiter behaviour

    pz_attack = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\pzombie\pz_attack.sqf";

    dog_findTargetAgent = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dog_findTargetAgent.sqf";

    //Code Changer

    ckc_button = compile preprocessFileLineNumbers "ckc\ckc_button.sqf";

    ckc_upddoor = compile preprocessFileLineNumbers "ckc\ckc_upddoor.sqf";

    ckc_updSafe = compile preprocessFileLineNumbers "ckc\ckc_updSafe.sqf";

    //actions

    player_countmagazines = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_countmagazines.sqf";

    player_addToolbelt = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_addToolbelt.sqf";

    player_copyKey = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_copyKey.sqf";

    player_reloadMag = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_reloadMags.sqf";

    player_loadCrate = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_loadCrate.sqf";

    player_craftItem = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_craftItem.sqf";

    player_tentPitch = compile preprocessFileLineNumbers "custom\tent_pitch.sqf";

    player_vaultPitch = compile preprocessFileLineNumbers "custom\vault_pitch.sqf";

    player_drink = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_drink.sqf";

    player_eat = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_eat.sqf";

    player_useMeds = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_useMeds.sqf";

    player_fillWater = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\water_fill.sqf";

    player_makeFire = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_makefire.sqf";

    player_harvestPlant = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_harvestPlant.sqf";

    player_goFishing = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_goFishing.sqf";

    //Snap Build

    player_build = compile preprocessFileLineNumbers "scripts\PP4L\Action\modular_build.sqf";

    player_build_countNearby = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_countNearby.sqf";

    player_build_states = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_states.sqf";

    player_build_needNearby = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_needNearby.sqf";

    player_build_getConfig = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_getConfig.sqf";

    player_build_plotCheck = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_plotCheck.sqf";

    player_build_buildReq = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_buildReq.sqf";

    player_build_create = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_create.sqf";

    player_build_controls = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_controls.sqf";

    player_build_publish = compile preprocessFileLineNumbers "scripts\PP4L\Action\player_build_publish.sqf";

    DZE_snap_build_file = "scripts\Snap_Pro\snap_build.sqf"; // Set as a global variable as it is also referenced in snapbuild.sqf

    // player_build = compile preprocessFileLineNumbers "scripts\snap_pro\player_build.sqf";

    snap_build = compile preprocessFileLineNumbers DZE_snap_build_file;

    player_wearClothes = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_wearClothes.sqf";

    object_pickup = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\object_pickup.sqf";

    player_flipvehicle = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_flipvehicle.sqf";

    player_sleep = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_sleep.sqf";

    player_antiWall = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_antiWall.sqf";

    player_deathBoard = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\list_playerDeathsAlt.sqf";

    player_plotPreview = compile preprocessFileLineNumbers "custom\object_showPlotRadius.sqf";

    player_upgradeVehicle = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_upgradeVehicle.sqf";

    //ui

    player_selectSlot = compile preprocessFileLineNumbers "custom\ui_selectSlot.sqf";;

    player_gearSync = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_gearSync.sqf";

    player_gearSet = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_gearSet.sqf";

    ui_changeDisplay = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\ui_changeDisplay.sqf";

    ui_gear_sound = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\ui_gear_sound.sqf";

    //System

    player_monitor = compile preprocessFileLineNumbers "\z\addons\dayz_code\system\player_monitor.sqf";

    player_spawn_1 = compile preprocessFileLineNumbers "\z\addons\dayz_code\system\player_spawn_1.sqf";

    player_spawn_2 = compile preprocessFileLineNumbers "\z\addons\dayz_code\system\player_spawn_2.sqf";

    onPreloadStarted "dayz_preloadFinished = false;";

    onPreloadFinished "dayz_preloadFinished = true;";

    // helper functions

    player_hasTools = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_hasTools.sqf";

    player_checkItems = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_checkItems.sqf";

    player_removeItems = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_removeItems.sqf";

    //Trader ["Trader City Name",false,"enter"] - Trader City Name | Show Message | "enter" || "leave"

    player_traderCity = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_traderCity.sqf";

    // combination of check && remove items

    player_checkAndRemoveItems = {

    private ["_items","_b"];

    _items = _this;

    _b = _items call player_checkItems;

    if (_ B) then {

    _b = _items call player_removeItems;

    };

    _b

    };

    dayz_HungerThirst = {

    dayz_hunger = dayz_hunger + (_this select 0);

    dayz_thirst = dayz_thirst + (_this select 1);

    };

    epoch_totalCurrency = {

    // total currency

    private ["_total_currency","_part","_worth"];

    _total_currency = 0;

    {

    _part = (configFile >> "CfgMagazines" >> _x);

    _worth = (_part >> "worth");

    if isNumber (_worth) then {

    _total_currency = _total_currency + getNumber(_worth);

    };

    } count (magazines player);

    _total_currency

    };

    epoch_itemCost = {

    private ["_trade_total","_part_inWorth","_part_in_configClass"];

    _trade_total = 0;

    {

    _part_in_configClass = configFile >> "CfgMagazines" >> (_x select 0);

    if (isClass (_part_in_configClass)) then {

    _part_inWorth = (_part_in_configClass >> "worth");

    if isNumber (_part_inWorth) then {

    _trade_total = _trade_total + (getNumber(_part_inWorth) * (_x select 1));

    };

    };

    } count _this;

    //diag_log format["DEBUG TRADER ITEMCOST: %1", _this];

    _trade_total

    };

    epoch_returnChange = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\epoch_returnChange.sqf";

    // usage [["partinclassname",4]] call epoch_returnChange;

    dayz_losChance = {

    private["_agent","_maxDis","_dis","_val","_maxExp","_myExp"];

    _agent = _this select 0;

    _dis = _this select 1;

    _maxDis = _this select 2;

    // diag_log ("VAL: " + str(_this));

    _val = (_maxDis - _dis) max 0;

    _maxExp = ((exp 2) * _maxDis);

    _myExp = ((exp 2) * (_val)) / _maxExp;

    _myExp = _myExp * 0.7;

    _myExp

    };

    ui_initDisplay = {

    private["_control","_ctrlBleed","_display","_ctrlFracture","_ctrlDogFood","_ctrlDogWater","_ctrlDogWaterBorder", "_ctrlDogFoodBorder"];

    disableSerialization;

    _display = uiNamespace getVariable 'DAYZ_GUI_display';

    _control = _display displayCtrl 1204;

    _control ctrlShow false;

    if (!r_player_injured) then {

    _ctrlBleed = _display displayCtrl 1303;

    _ctrlBleed ctrlShow false;

    };

    if (!r_fracture_legs && !r_fracture_arms) then {

    _ctrlFracture = _display displayCtrl 1203;

    _ctrlFracture ctrlShow false;

    };

    _ctrlDogFoodBorder = _display displayCtrl 1501;

    _ctrlDogFoodBorder ctrlShow false;

    _ctrlDogFood = _display displayCtrl 1701;

    _ctrlDogFood ctrlShow false;

    _ctrlDogWaterBorder = _display displayCtrl 1502;

    _ctrlDogWaterBorder ctrlShow false;

    _ctrlDogWater = _display displayCtrl 1702;

    _ctrlDogWater ctrlShow false

    };

    dayz_losCheck = {

    private ["_target","_agent","_cantSee","_tPos","_zPos"];

    _target = _this select 0; // PUT THE PLAYER IN FIRST ARGUMENT!!!!

    _agent = _this select 1;

    _cantSee = true;

    if (!isNull _target) then {

    _tPos = visiblePositionASL _target;

    _zPos = visiblePositionASL _agent;

    _tPos set [2,(_tPos select 2)+1];

    _zPos set [2,(_zPos select 2)+1];

    if ((count _tPos > 0) && (count _zPos > 0)) then {

    _cantSee = terrainIntersectASL [_tPos, _zPos];

    if (!_cantSee) then {

    _cantSee = lineIntersects [_tPos, _zPos, _agent, vehicle _target];

    };

    };

    };

    _cantSee

    };

    dayz_equipCheck = {

    private ["_empty","_needed","_diff","_success","_config"];

    _config = _this;

    _empty = [player] call BIS_fnc_invSlotsEmpty;

    _needed = [_config] call BIS_fnc_invSlotType;

    _diff = [_empty,_needed] call BIS_fnc_vectorDiff;

    _success = true;

    {

    if (_x > 0) then {_success = false};

    } count _diff;

    hint format["Config: %5\nEmpty: %1\nNeeded: %2\nDiff: %3\nSuccess: %4",_empty,_needed,_diff,_success,_config];

    _success

    };

    vehicle_gear_count = {

    private["_counter"];

    _counter = 0;

    {

    _counter = _counter + _x;

    } count _this;

    _counter

    };

    player_tagFriendlyMsg = {

    if(player == (_this select 0)) then {

    cutText[(localize "str_epoch_player_2"),"PLAIN DOWN"];

    };

    };

    player_serverModelChange = {

    private["_object","_model"];

    _object = _this select 0;

    _model = _this select 1;

    if (_object == player) then {

    _model call player_switchModel;

    };

    };

    player_guiControlFlash = {

    private["_control"];

    _control = _this;

    if (ctrlShown _control) then {

    _control ctrlShow false;

    } else {

    _control ctrlShow true;

    };

    };

    gearDialog_create = {

    private ["_i","_dialog"];

    if (!isNull (findDisplay 106)) then {

    (findDisplay 106) closeDisplay 0;

    };

    openMap false;

    closeDialog 0;

    if (gear_done) then {sleep 0.001;};

    player action ["Gear", player];

    if (gear_done) then {sleep 0.001;};

    _dialog = findDisplay 106;

    _i = 0;

    while {isNull _dialog} do {//DO NOT CHANGE TO A FOR LOOP!

    _i = _i + 1;

    _dialog = findDisplay 106;

    if (gear_done) then {sleep 0.001;};

    if (_i in [100,200,299]) then {

    closeDialog 0;

    player action ["Gear", player];

    };

    if (_i > 300) exitWith {};

    };

    if (gear_done) then {sleep 0.001;};

    _dialog = findDisplay 106;

    if ((parseNumber(_this select 0)) != 0) then {

    ctrlActivate (_dialog displayCtrl 157);

    if (gear_done) then {

    waitUntil {ctrlShown (_dialog displayCtrl 159)};

    sleep 0.001;

    };

    };

    _dialog

    };

    gear_ui_offMenu = {

    private ["_control","_parent","_menu","_grpPos"];

    disableSerialization;

    _control = _this select 0;

    _parent = findDisplay 106;

    if (!(_this select 3)) then {

    for "_i" from 0 to 9 do {

    _menu = _parent displayCtrl (1600 + _i);

    _menu ctrlShow false;

    };

    _grpPos = ctrlPosition _control;

    _grpPos set [3,0];

    _control ctrlSetPosition _grpPos;

    _control ctrlShow false;

    _control ctrlCommit 0;

    };

    };

    dze_surrender_off = {

    player setVariable ["DZE_Surrendered", false, true];

    DZE_Surrender = false;

    };

    gear_ui_init = {

    private ["_control","_parent","_menu","_grpPos"];

    disableSerialization;

    _parent = findDisplay 106;

    _control = _parent displayCtrl 6902;

    for "_i" from 0 to 9 do {

    _menu = _parent displayCtrl (1600 + _i);

    _menu ctrlShow false;

    };

    _grpPos = ctrlPosition _control;

    _grpPos set [3,0];

    _control ctrlSetPosition _grpPos;

    _control ctrlShow false;

    _control ctrlCommit 0;

    };

    dayz_eyeDir = {

    private["_vval","_vdir"];

    _vval = (eyeDirection _this);

    _vdir = (_vval select 0) atan2 (_vval select 1);

    if (_vdir < 0) then {_vdir = 360 + _vdir};

    _vdir

    };

    DZE_getModelName = {

    private ["_i","_objInfo","_lenInfo","_objName"];

    _objInfo = toArray(str(_this));

    _lenInfo = count _objInfo - 1;

    _objName = [];

    _i = 0;

    // determine where the object name starts

    {

    if (58 == _objInfo select _i) exitWith {};

    _i = _i + 1;

    } count _objInfo;

    _i = _i + 2; // skip the ": " part

    for "_k" from _i to _lenInfo do {

    _objName set [(count _objName), (_objInfo select _k)];

    };

    _objName = toLower(toString(_objName));

    _objName

    };

    dze_isnearest_player = {

    private ["_notClosest","_playerDistance","_nearPlayers","_playerNear"];

    if(!isNull _this) then {

    _nearPlayers = _this nearEntities ["CAManBase", 12];

    _playerNear = ({isPlayer _x} count _nearPlayers) > 1;

    _notClosest = false;

    if (_playerNear) then {

    // check if another player is closer

    _playerDistance = player distance _this;

    {

    if (_playerDistance > (_x distance _this)) exitWith { _notClosest = true; };

    } count _nearPlayers;

    };

    } else {

    _notClosest = false;

    };

    _notClosest

    };

    // trader menu code

    if (DZE_ConfigTrader) then {

    call compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_traderMenuConfig.sqf";

    }else{

    call compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_traderMenuHive.sqf";

    };

    // recent murders menu code

    call compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_murderMenu.sqf";

    call compile preprocessFileLineNumbers "custom\player_traderMenuHive.sqf";

    /*

    //This is still needed but the fsm should terminate if any errors pop up.

    [] spawn {

    private["_timeOut","_display","_control1","_control2"];

    disableSerialization;

    _timeOut = 0;

    dayz_loadScreenMsg = "";

    diag_log "DEBUG: loadscreen guard started.";

    _display = uiNameSpace getVariable "BIS_loadingScreen";

    if (!isNil "_display") then {

    _control1 = _display displayctrl 8400;

    _control2 = _display displayctrl 102;

    };

    if (!isNil "dayz_DisplayGenderSelect") then {

    waitUntil {!dayz_DisplayGenderSelect};

    };

    // 120 sec timeout (12000 * 0.01)

    while { _timeOut < 12000 } do {

    if (dayz_clientPreload && dayz_authed) exitWith { diag_log "PLOGIN: Login loop completed!"; };

    if (!isNil "_display") then {

    if ( isNull _display ) then {

    waitUntil { !dialog; };

    startLoadingScreen ["","RscDisplayLoadCustom"];

    _display = uiNameSpace getVariable "BIS_loadingScreen";

    _control1 = _display displayctrl 8400;

    _control2 = _display displayctrl 102;

    };

    if ( dayz_loadScreenMsg != "" ) then {

    _control1 ctrlSetText dayz_loadScreenMsg;

    dayz_loadScreenMsg = "";

    };

    _control2 ctrlSetText format["%1",round(_timeOut*0.01)];

    };

    _timeOut = _timeOut + 1;

    if (_timeOut >= 12000) then {

    1 cutText [localize "str_player_login_timeout", "PLAIN DOWN"];

    sleep 10;

    endLoadingScreen;

    endMission "END1";

    };

    sleep 0.01;

    };

    };

    */

    Zupa_LoadingMessage = ["Loading up server."]; // initial message before the server ever sends a message to the client.

    "PVDZE_Z_LoadMessage" addPublicVariableEventHandler {Zupa_LoadingMessage = _this select 1;};

    //This is still needed but the fsm should terminate if any errors pop up.

    [] spawn {

    private["_timeOut","_display","_control1","_control2"];

    disableSerialization;

    _timeOut = 0;

    dayz_loadScreenMsg = "";

    diag_log "DEBUG: loadscreen guard started.";

    _display = uiNameSpace getVariable "BIS_loadingScreen";

    if (!isNil "_display") then {

    _control1 = _display displayctrl 8400;

    _control2 = _display displayctrl 102;

    };

    if (!isNil "dayz_DisplayGenderSelect") then {

    waitUntil {!dayz_DisplayGenderSelect};

    };

    // 120 sec timeout (12000 * 0.01)

    while { _timeOut < 12000 } do {

    if (dayz_clientPreload && dayz_authed) exitWith {

    diag_log "PLOGIN: Login loop completed!";

    endLoadingScreen;

    };

    if (!isNil "_display") then {

    if ( isNull _display ) then {

    waitUntil { !dialog; };

    startLoadingScreen ["","RscDisplayLoadCustom"];

    _display = uiNameSpace getVariable "BIS_loadingScreen";

    _control1 = _display displayctrl 8400;

    _control2 = _display displayctrl 102;

    };

    _control1 ctrlSetText format["theAbandoned: %1 & %2.",Zupa_LoadingMessage select 0 ,dayz_loadScreenMsg];

    _control2 ctrlSetText format["%1",round(_timeOut*0.01)];

    };

    if( Zupa_LoadingMessage select 0 != "Server running")then{

    _timeOut = 0;

    }else{

    _timeOut = _timeOut + 1;

    };

    if (_timeOut >= 12000) then {

    1 cutText [localize "str_player_login_timeout", "PLAIN DOWN"];

    sleep 10;

    endLoadingScreen;

    endMission "END1";

    };

    sleep 0.01;

    };

    };

    dayz_meleeMagazineCheck = {

    private ["_meleeNum","_magType","_wpnType"];

    _magType = ([] + getArray (configFile >> "CfgWeapons" >> _wpnType >> "magazines")) select 0;

    _meleeNum = ({_x == _magType} count magazines player);

    if (_meleeNum < 1) then {

    player addMagazine _magType;

    };

    };

    dayz_originalPlayer = player;

    progressLoadingScreen 0.8;

    };

    //Both

    BIS_fnc_selectRandom = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_selectRandom.sqf";

    BIS_fnc_vectorAdd = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_vectorAdd.sqf";

    BIS_fnc_halo = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_halo.sqf";

    BIS_fnc_findNestedElement = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_findNestedElement.sqf";

    BIS_fnc_param = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_param.sqf";

    fnc_buildWeightedArray = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_buildWeightedArray.sqf"; //Checks which actions for nearby casualty

    fnc_usec_damageVehicle = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_damageHandlerVehicle.sqf"; //Event handler run on damage

    // object_vehicleKilled = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_vehicleKilled.sqf"; //Event handler run on damage

    object_setHitServer = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_setHitServer.sqf"; //process the hit as a NORMAL damage (useful for persistent vehicles)

    object_setFixServer = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_setFixServer.sqf"; //process the hit as a NORMAL damage (useful for persistent vehicles)

    object_getHit = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_getHit.sqf"; //gets the hit value for a HitPoint (i.e. HitLegs) against the selection (i.e. "legs"), returns the value

    object_setHit = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_setHit.sqf"; //process the hit as a NORMAL damage (useful for persistent vehicles)

    object_processHit = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_processHit.sqf"; //process the hit in the REVO damage system (records && sets hit)

    object_delLocal = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_delLocal.sqf";

    // object_cargoCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_cargoCheck.sqf"; //Run by the player || server to monitor changes in cargo contents

    fnc_usec_damageHandler = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_damageHandler.sqf"; //Event handler run on damage

    fnc_veh_ResetEH = compile preprocessFileLineNumbers "\z\addons\dayz_code\init\veh_ResetEH.sqf"; //Initialize vehicle

    // Vehicle damage fix

    vehicle_handleDamage = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\vehicle_handleDamage.sqf";

    vehicle_handleKilled = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\vehicle_handleKilled.sqf";

    //fnc_vehicleEventHandler = compile preprocessFileLineNumbers "\z\addons\dayz_code\init\vehicle_init.sqf"; //Initialize vehicle

    fnc_inString = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_inString.sqf";

    fnc_isInsideBuilding = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_isInsideBuilding.sqf"; //_isInside = [_unit,_building] call fnc_isInsideBuilding;

    fnc_isInsideBuilding2 = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_isInsideBuilding2.sqf"; //_isInside = [_unit,_building] call fnc_isInsideBuilding2;

    fnc_isInsideBuilding3 = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_isInsideBuilding3.sqf"; //_isInside = [_unit,_building] call fnc_isInsideBuilding3;

    dayz_zombieSpeak = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_speak.sqf"; //Used to generate random speech for a unit

    vehicle_getHitpoints = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\vehicle_getHitpoints.sqf";

    local_gutObject = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_gutObject.sqf"; //Generated on the server (|| local to unit) when gutting an object

    local_lockUnlock = compile preprocessFileLineNumbers "scripts\mf-tow\local_lockUnlock.sqf"; //When vehicle is local to unit perform locking vehicle

    local_gutObjectZ = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_gutObjectZ.sqf"; //Generated on the server (|| local to unit) when gutting an object

    local_zombieDamage = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_damageHandlerZ.sqf"; //Generated by the client who created a zombie to track damage

    local_eventKill = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_eventKill.sqf"; //Generated when something is killed

    //player_weaponCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_weaponCheck.sqf"; //Run by the player || server to monitor whether they have picked up a new weapon

    curTimeStr = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_curTimeStr.sqf";

    player_medBandage = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medBandaged.sqf";

    player_medInject = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medInject.sqf";

    player_medEpi = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medEpi.sqf";

    player_medTransfuse = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medTransfuse.sqf";

    player_medMorphine = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medMorphine.sqf";

    player_breaklegs = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medBreakLegs.sqf";

    player_medPainkiller = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medPainkiller.sqf";

    //Stronghold

    player_buildStronghold = compile preprocessFileLineNumbers "scripts\build\stronghold\s.sqf";

    world_isDay = {if ((daytime < (24 - dayz_sunRise)) && (daytime > dayz_sunRise)) then {true} else {false}};

    player_humanityChange = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_humanityChange.sqf";

    spawn_loot = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\spawn_loot.sqf";

    spawn_loot_small = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\spawn_loot_small.sqf";

    // player_projectileNear = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_projectileNear.sqf";

    FNC_GetPlayerUID = {

    private ["_object","_version","_PID"];

    _object = _this select 0;

    _version = productVersion select 3;

    if (DayZ_UseSteamID) then {

    _PID = GetPlayerUID _object;

    } else {

    if (_version >= 125548) then {

    _PID = call (compile "GetPlayerUIDOld _object");

    } else {

    _PID = GetPlayerUID _object;

    diag_log format["Your game version, %1, is less than the required for the old UID system; using Steam ID system instead. Update to 1.63.125548 (or latest steam beta)", _version];

    };

    };

    _PID

    };

    FNC_GetSetPos = { //DO NOT USE IF YOU NEED ANGLE COMPENSATION!!!!

    private ["_pos","_thingy"];

    _thingy = _this select 0;

    _pos = getPosASL _thingy;

    if (surfaceIsWater _pos) then {

    _thingy setPosASL _pos;

    } else {

    _thingy setPosATL (ASLToATL _pos);

    };

    };

    FNC_GetPos = {

    private ["_pos","_thingy"];

    if (isNil {_this select 0}) exitWith {[0,0,0]};

    _thingy = _this select 0;

    _pos = getPosASL _thingy;

    if !(surfaceIsWater _pos) then {

    _pos = ASLToATL _pos;

    };

    _pos

    };

    local_setFuel = {

    private["_qty","_vehicle"];

    _vehicle = _this select 0;

    _qty = _this select 1;

    _vehicle setFuel _qty;

    };

    zombie_initialize = {

    private ["_unit","_id","_position"];

    _unit = _this select 0;

    if (isServer) then {

    _unit addEventHandler ["local", {_this call zombie_findOwner}];

    };

    _id = _unit addeventhandler["HandleDamage", { _this call local_zombieDamage }];

    _id = _unit addeventhandler["Killed", { [_this, "zombieKills"] call local_eventKill }];

    };

    dayz_EjectPlayer = {

    // check if player in vehicle

    private ["_noDriver","_vehicle","_inVehicle"];

    _vehicle = vehicle player;

    _inVehicle = (_vehicle != player);

    if(_inVehicle) then {

    _noDriver = ((_vehicle emptyPositions "driver") > 0);

    if (_noDriver && (speed _vehicle) != 0) then {

    player action [ "eject", _vehicle];

    };

    };

    };

    player_sumMedical = {

    private["_character","_wounds","_legs","_arms","_medical"];

    _character = _this;

    _wounds = [];

    if (_character getVariable["USEC_injured",false]) then {

    {

    if (_character getVariable[_x,false]) then {

    _wounds set [count _wounds,_x];

    };

    } count USEC_typeOfWounds;

    };

    _legs = _character getVariable ["hit_legs",0];

    _arms = _character getVariable ["hit_arms",0];

    _medical = [

    _character getVariable["USEC_isDead",false],

    _character getVariable["NORRN_unconscious", false],

    _character getVariable["USEC_infected",false],

    _character getVariable["USEC_injured",false],

    _character getVariable["USEC_inPain",false],

    _character getVariable["USEC_isCardiac",false],

    _character getVariable["USEC_lowBlood",false],

    _character getVariable["USEC_BloodQty",12000],

    _wounds,

    [_legs,_arms],

    _character getVariable["unconsciousTime",0],

    _character getVariable["messing",[0,0]]

    ];

    _medical

    };

    //Server Only

    if (isServer) then {

    call compile preprocessFileLineNumbers "server\init\server_functions.sqf";

    } else {

    eh_localCleanup = {};

    };

    initialized = true;

     

     Although it says "Error Missing )", I couldn't find a missing ) and neither did Squint,  I didn't seen anything amiss in line 47 or the code for FNC_GetPlayerUID.  DId I miss something?

     

    Thanks,

    Bob

     

    Had a quick look but didn't see anything obvious.

     

    Diffmerge the file (just to see the differences without actually merging) against the stock Epoch file and it may give you some pointers on where the error may actually be.  These errors come up for a number of reasons like having a = rather than a == in an if comparison somewhere.  The line reported does not always indicate which line is actually causing the issue  :( .  Sometimes some corruption has occurred or an invisible control code has snuck in and even though I could not see any issue, typing the line out again and deleting the original has fixed it for me.

  3. I am saying exactly what I said.  I built the mod for Epoch and not for Overpoch.  Whether it works for Overpoch or not 'out of the box' is something I do not know as I have never tried.

     

    What I do know is that a number of people run it on Overpoch servers but I do not know what, if anything, they changed to get it to work.  I also know that I do not support installations on Overpoch.

     

    If someone wants to try amending A Plot for Life so it will work on Overpoch.

     

    Saying lockboxes and vaults do not work with A Plot for Life installed without saying it is on Overpoch (which it was never designed to work on) seems a little unclear.  If it was not working on Epoch then it would be something I would look in to and try to rectify if I could recreate the issue.

     

    If you search my thread for the A Plot for Life mod for "Overpoch" then you would probably get an idea of people who may be able to help.

  4. A Plot for Life is built for Epoch and not Overpoch.

    Vaults / lock boxes should open for their owners without the need for codes. Others must supply codes. This is code in Epoch that was not fully finished. A Plot for life supplied the missing piece.

    If anyone is running A Plot for Life on Epoch with nothing else and is seeing issues then report them on the A Plot for Life thread or they will most likely not be known about by the author (Me).

  5. @RedBaron,

     

    Are you able to dump out the objects for a base where this is happening or provide a copy of your DB for me to load in to my test server.  I can then see if I can simulate the issue.  Upload to dropbox or something and PM me the link then take off after I have downloaded.

     

    Which map are you using ?.

     

    Also, just to be sure, this issue did not occur when you tested on your test server taking ownership of the same bases ?.

     

    An idea of the hardware you are using may help and, if you have any idea, what were the player numbers like when the duplication happened ?.

     

    You could change the sleep to uisleep which is a bit more accurate.  You could try playing with the numbers a bit.

     

    0.01 = 100 items a second.

    0.05 = 20 items a second.

     

     

     

    Thanks.

  6. @fettneX

     

    This mod is built for Epoch and has not been tested on Overpoch and is not supported of Overpoch installs.

     

    Having said that....

     

    If you link to one file and then link to another file and both contain code with the same function name then the last one to be called will overwrite the first one.

     

    ie.

     

    File 1

    testfunction = {diag_log text :Cat.";}

     

    File 2

    testfunction = {diag_log text :Dog.";}

     

    Main code

    [] call testfunction;

     

    Result = Dog.

     

    Now what may be happening is that the original functions defined in the compiles etc in the Overpoch files are defining Overpoch functions with different names to the Epoch functions.  Calling the compiles etc from my mod then only overwrites the Epoch functions and not the Overpoch ones as they have different names.  THis is all just a theory though.

     

    The downside with this is that you are defining functions more than once which is wasteful and makes startup slower.  The better way would be to use something like diffmerge to merge the changes in to a single file that is then called.  There are two links to guide on how to do this on the first post.

     

    I also do not use / support infinistar.  You would have to go back to him.

     

    For the servermonitor line, you are kicking off two processes that are trying to do the same thing.  You should only be running one server_monitor.

  7. Mikeeeyy has kindly allowed me to include precision base building in to A Plot for LIfe.  This means that the system to stop walls moving and gaps forming in your bases will be included as standard in a future release.

     

    I will look to include it in the next release.

     

    Many thanks to Mikeeeyy (who wrote it for Epoch) and to KillZoneKid for the original code that manages the conversions.

  8. If you are installing A Plot for Life then try with v2.35 rather than v2.4.  v2.4 has just been released and Zupa will need to update for compatibility.  v2.4 is smaller and simpler code wise so it should be easy for him to update plot management pretty quickly time permitting on his side.

     

    If you are already using v2.35 (or v2.34) of A Plot for Life then maybe you should PM Zupa to let him know.  I understand he is very bust on a number of other mods at this time plus it is the holiday season so he may have other commitments (non Epoch related) to slot in to his busy schedule.

  9. @RedBaron.

     

    Note that ObjectUIDs are not 100% unique.  If the object class, position etc are the same then you will probably have had duplication but if the class names are not the same or the worldspace coords are not the same then you may have been hit by the weekness in the objectUID generation system.

     

    The objectUID is genetated by a simple mathematical equation.

     

    positive value of X *10 + positive value of Y *10 + positive value of Z *10 + direction (in degrees).

     

    If an objects x/y/z/dir = 1,1,10,1 then it will have the same objectUID as an object with 10,1,1,1

     

    Some of your duplicates may have been due to that.

     

    Ideally there should be a rolling objectUID in game assigned rather than a calculated one.  I may look at putting one in place as an update to v2.4.  It should be pretty easy to do (on the face of it).

     

    There are 3 objectUID generation bits of code.

    • dayz_objectUID
    • dayz_objectUID2
    • dayz_objectUID3

    Nothing seems to be using dayz_objectUID, dayz_objectUID2 is used for object objectUIDs, dayz_objectUID3 is used for vehicles and just adds "time" (time from mission start to present) to the vehicles direction.

     

    I would imagine this is old legacy code that was just never revisited or just left for DayZ compatibility (if DayZ is using this method).

  10. Hey RimBlock got a question i want to run plotmanagement 2.1 and i wanne use your new version only 1 problem is

    Player_build.sqf is not in there and plotmanagement needs it can you fix this or is there a way to work arround it

    here is the link to show you on step 7

    https://github.com/DevZupa/PlotManagement/blob/master/P4L_Epoch.md

     

    Ok, I have not looking in to Zupas Plot Management mod or the information he stores in his PlotFriends so this may or may not work.

     

    Open "custom\A_Plot_for_Life\compiles\fn_check_owner.sqf"

     

    Find

    _friendlies	= _player getVariable ["friendlyTo",[]]; 
    
    if (_playerUID in _friendlies) then { 
    	_friendly = true; 
    };
    

    Change to

    _friendlies	= _nearestPole getVariable ["plotfriends",[]];
    _fuid  = [];
    {
          _friendUID = _x select 0;
          _fuid  =  _fuid  + [_friendUID];
    } forEach _friendlies;
    if (_playerUID in _fuid) then { 
    	_friendly = true; 
    }; 
    

    Logically it will be doing the same thing based on step 7 of the install instruction for Zupas mod you linked to.

     

    It appears the player_buildDowngrading has not been updated to use the new functions.  I will correct and upload tonight. 

     

    GIve it a go and if it is still not working then you will need to contact Zupa.

     

    Note, the Modular Build System is just a set of small scripts made from cutting up the player_build script.  You should be able to find the code parts in the seperate files.  That check, before I created the new function, would have been in player_build_plotCheck.sqf.

  11. All three files now just use fn_check_owner.sqf for those checks so changing in that single file will sort it out for all three.

    Have a look and play around. It should be pretty simple. If you post on Zupas thread he should be able to give you the code change pretty easily.

    Gone 11 pm here and work day tomorrow. Will have a quick look if Zupa has not supplied an update.

  12. New version up.

     

    A Plot for Life v2.4

    New features.
    1. Removed the option to turn the mod off (simpler, smaller code base)

    2. Removed option for modular build (it is now defaulted as on)

    3. New functions to reduce instances of common code in the building system.  Both are small and precompiled.

      1. fn_check_owner.sqf to check ownership and friendly status

      2. fn_find_plots to get all nearby plot poles and return a count and the nearest alive one (if one exists).

    4. Optimised a bit by changing nearestobjects to nearEntities.

    5. Added delay in the Take Ownership function so the Hiveext / DB does not get spammed when taking ownership of large bases.

    6. Moved totally to modular build.  Player_build.sqf is no longer used at all and had been removed from the distribution.

    7. Changes have saved between 20k & 30k in the mission package size.

    First post and links updated.  Links to v2.35 kept just in case someone needs a version with player_buiild.sqf in.

  13. hey RimBlock,

     

    thank you so much for your effort. I am really happy for all your hard work as for someone like me that has no knowledge you are really healping me allot in regards to gettng everything working.

    I hope you and your family have a great festive season, takiing singapore has been in the MOOD since (felt) october :)

     

    I am looking forward to the new version and hope then for me the duplication is sorted. Also Thank you to RedBaron for taking  the time helping RimBlock out. 

     

    Best Regards.

    Huppabubba

     

    Thanks and you are most welcome.

     

    Both myself and RedBaron are hoping the sleeps in the take ownership will stop the extension call getting flodded with delete / create requests when taking ownership of large bases.

     

    To all who may be reading this, have a great time over the holiday season and a happly, lucky, exciting (in a good way) New Year.  May your scopes be true and your loot bags full of tuna, spare mags and briefcases (without duping :P  ).

  14. No, I don't have PP4L but the Github download has SnapPro integrated into it, which I DO have installed.  Plus my Snap Pro has already been modified for Vector Build and Precise Base Build - which is NOT part of the Github download for PP4L.  That means if I follow his instructions, I'll be installing PP4L that does NOT have the other two so I'd have go back through Precise Base Build and Vector Build to replace/update the vanilla Snap Pro that is part of the PP4L Github download.  

     

    I'm just trying to avoid the extra work of having to redo all the build scripts/mods. 

     

    Is PP4L v2.5 close to completion?

     

    Bob

     

    My advice would be to wait a bit.

     

    V2.4 is in testing.  Striker is aware and will be looking at integrating with his vector build and modifying Snap Build Pro.

     

    v2.5 is not yet in development.  It is a list of items I want to add.  Once v2.4 is out then I will start on v2.5.

  15. In the list of mods you say you have installed, you do not have A Plot for Life.  In the second paragraph you seem to be saying you do have A Plot for Life.  Note really clear which one you mean.

     

    I would wait for A Plot for Life v2.4 which should be out in a week or so as it will remove some of the complexity (not checks to see if it is turned on or off in every file as it is now on all the time).  Just need some more testing before releasing.

     

    I always advise installing A Plot for Life on a clean server first as it modifies a lot of files and you get Snap Build Pro included.  Afterwards, add precise and vector build and then the other mods.

     

    Alternatively use diffmerge to checkout the changes in each file included with A Plot for Life and merge them in.  For Plot Management you will need to ask Zupa or wait for A Plot for Life v2.5 which is planned to have an action menu system  for management (mouse scroll wheel).

  16. Wow your wanting us to replace / override current files that are already edited for other modifications, instead of just editing?  Too much crazy work for me to consider this.  There has to be a better way.

     

    Nope, I don't want you to do anything.

     

    If you wish to use my mod that has taken many hours to put together and that I am giving to the community for free then yes, you have to actually do a bit of work.   If you use diffmerge the process is fairly simple and Raymix has produced a video guide which actually includes a older version of this mod as an example. 

     

    Why not write some instructions yourself to share with the community, you know, giving something back.  Strangely, of the few people who have commented there is not a step by step guide, no one has made the effort to actually create one in order to help others when I have suggested it.

     

    Me, I am spending my spare time (the time not spent working in my regular job, or doing stuff with my wife and kids).

    Bug fixing issues reported.

    Adding improvements for the next two versions for this mod, testing and releasing.

    Writing and Releasing other scripts / mods.

    Helping others here, on Skype and via PM with various problesm, quite a few of them having nothing to do with this mod.

    Working on our A3 Dominion mod (most mod makers stop with the A2Epoch mods when they move to working with A3.  I have not done that).

  17. Sorry, the only code I have for this is the code for our new A3 mod which is not yet ready for release.

     

    Have a look at sending variables to clients and remember that variables can also contain full sqf functions and you should be able to put it together with a bit of testing. The techneque is also JIP (Join in Progress) compatible.

  18. So the other option is to send the script code from the server as a publicvariableclient call to a specific client where the SteamID matches yours and the event handler on your client takes the code in the public variable, compiles and runs it.  The code only exists on your machine and the server that way. 

     

    Read up on public variables and event handlers to get a better idea.

  19. Scripts on your server in the server.pbo do not go to the client so the client cannot run them on the client.

     

    What you can do from the client is to get the server to run the server side scripts when the client asks it to via publicVariableServer which will send a message to the server with the variable contents you sent.  The server needs an event handler to listen for the message and this fires a script when the server sees a change to the variable.  The script executes on the server.

     

    Alternatively, any code you put in your ARMA2OA\mpmissions\[mapname]\ folder will get sent to all clients when the map loads if that was what you were meaning.

×
×
  • Create New...