public override void Update(TimeSpan time)
            {
                base.Update(time);

                _timer.Update(time);
                if (!_timer.Passed)
                {
                    return;
                }
                _timer.Reset();


                if (ReinforceHandler._nextReinforceCounterIncrease < DateTime.Now)
                {
                    ReinforceHandler.SetNextReinforceCounterIncreaseFromNow(REINFORCE_COUNTER_INCREASE_MINUTES);

                    var oldValue = ReinforceHandler.ReinforceCounter;
                    ReinforceHandler.IncreaseReinforceCounter();
                    var newValue = ReinforceHandler.ReinforceCounter;

                    if (oldValue != newValue)
                    {
                        WriteLog("reinforce counter increased. " + ReinforceHandler._pbsUnit.ED.Name + "  " + oldValue + "->" + newValue);
                    }
                }
            }
            public override void Exit()
            {
                var pbsUnitObject = ReinforceHandler._pbsUnit;

                pbsUnitObject.DynamicProperties.Update(k.vulnerable, 0);
                pbsUnitObject.DynamicProperties.Update(k.vulnerableEnd, default(DateTime));

                var zone = pbsUnitObject.Zone;

                if (zone != null)
                {
                    ReinforceHandler.StartAsyncLog(PBSLogType.vulnerableEnd);
                }

                base.Exit();
            }
            public override void Exit()
            {
                ReinforceHandler._pbsUnit.OrphanedStateChanged -= OnOrphanedStateChanged;
                ReinforceHandler._pbsUnit.DynamicProperties.Update(k.isReinforced, 0);
                ReinforceHandler._pbsUnit.DynamicProperties.Update(k.reinforceEnd, default(DateTime));
                ReinforceHandler._pbsUnit.States.Reinforced = false;

                ReinforceHandler.StartAsyncLog(PBSLogType.reinforceEnd);
                ReinforceHandler.SetNextReinforceCounterIncreaseFromNow(VULNERABLE_LENGTH_MINUTES);

                if (PBSHelper.IsOfflineOnReinforce(ReinforceHandler._pbsUnit))
                {
                    //go online if the node is leaving reinforce
                    ReinforceHandler._pbsUnit.SetOnlineStatus(true, false, true);
                }

                base.Exit();
            }
            public override void Enter()
            {
                var pbsUnitObject = ReinforceHandler._pbsUnit;

                pbsUnitObject.DynamicProperties.Set(k.vulnerable, 1);

                //unless the init has already set it
                if (_vulnerableEnd.Equals(default(DateTime)))
                {
                    //we calculate a new end time
                    _vulnerableEnd = DateTime.Now.AddMinutes(VULNERABLE_LENGTH_MINUTES);
                    pbsUnitObject.DynamicProperties.Update(k.vulnerableEnd, _vulnerableEnd);
                    pbsUnitObject.ApplyPvPEffect(TimeSpan.FromMinutes(VULNERABLE_LENGTH_MINUTES));
                    ReinforceHandler.SetNextReinforceCounterIncreaseFromNow(VULNERABLE_LENGTH_MINUTES);

                    var zone = pbsUnitObject.Zone;
                    if (zone != null)
                    {
                        ReinforceHandler.LogWrite(PBSLogType.vulnerableStart);
                    }
                }
                else
                {
                    //server start, was init
                    Logger.Info("VULNERABLE STATE ENTER: skipping calculation, server start. " + pbsUnitObject.Eid + " " + pbsUnitObject.Name);

                    //somewhere in the future
                    if (DateTime.Now < _vulnerableEnd)
                    {
                        var pvpEffectTime = _vulnerableEnd.Subtract(DateTime.Now);
                        pbsUnitObject.ApplyPvPEffect(pvpEffectTime);
                    }
                }

                pbsUnitObject.States.Reinforced = false;



                base.Enter();
            }
            private void DoEnter()
            {
                var pbsUnitObject = ReinforceHandler._pbsUnit;

                var zone = pbsUnitObject.Zone;

                if (zone == null)
                {
                    return;
                }

                //ettol van rajta a grafikai effekt
                pbsUnitObject.States.Reinforced = true;

                pbsUnitObject.DynamicProperties.Set(k.isReinforced, 1);

                //if already set by the init, then we skip this part
                if (_reinforceEnd.Equals(default(DateTime)))
                {
                    Logger.Info(" fresh reinforce start for " + pbsUnitObject);

                    var killer = _reinforceStartedBy?.Id;

                    //sql log
                    PBSHelper.WritePBSLog(PBSLogType.reinforceStart, pbsUnitObject.Eid, pbsUnitObject.Definition, pbsUnitObject.Owner, zoneId: zone.Configuration.Id, killerCharacterId: killer);


                    var oldCounter = ReinforceHandler.ReinforceCounter;
                    //elveszunk egy lehetoseget
                    ReinforceHandler.DecreaseReinforceCounter();
                    var newCounter = ReinforceHandler.ReinforceCounter;

                    //kozoljuk, h mikor lesz a kovetkezo reinforce increase
                    ReinforceHandler.SetNextReinforceCounterIncreaseFromNow(VULNERABLE_LENGTH_MINUTES + REINFORCE_LENGTH_MINUTES);

                    Logger.Info("reinforce counter from:" + oldCounter + " to:" + newCounter + " " + pbsUnitObject.ED.Name);

                    var networkNodes = pbsUnitObject.ConnectionHandler.NetworkNodes.ToArray();

                    if (networkNodes.Length > 1)
                    {
                        //ez egy networkben levo node

                        //ez a bazis a networkben
                        var pbsDockingBase = networkNodes.FirstOrDefault(o => o is PBSDockingBase);

                        if (pbsDockingBase != null)
                        {
                            //van bazis a networkben
                            //abban van a napi offset beallitva

                            if (!pbsDockingBase.Equals(pbsUnitObject))
                            {
                                //not myself
                                ReinforceHandler._offsetHoursWithinDay = pbsDockingBase.ReinforceHandler.ReinforceOffsetHours; //transfer the daily offset from the base

                                Logger.Info("daily offset was transferred from base to:" + pbsUnitObject.ED.Name + " " + pbsUnitObject.Name);
                            }


                            //search for the first reinforced node
                            foreach (var networkNode in networkNodes)
                            {
                                if (networkNode.Equals(pbsUnitObject))
                                {
                                    continue;
                                }

                                if (!networkNode.ReinforceHandler.CurrentState.IsReinforced)
                                {
                                    continue;
                                }

                                //ebben a nodeban van, hogy mikor lesz vege a reinforcenak
                                var tmpEnd = networkNode.ReinforceHandler.GetReinforceDetails();


                                if (!tmpEnd.Equals(default(DateTime)) && DateTime.Now < tmpEnd)
                                {
                                    _reinforceEnd = tmpEnd;

                                    Logger.Info(" ");
                                    Logger.Info(" reinforceEnd:" + _reinforceEnd);
                                    Logger.Info("reinforce timer transferred to:" + pbsUnitObject);

                                    GoOfflineOnReinforce(pbsUnitObject);

                                    return;
                                }
                            }
                        }
                    }

                    //ez az ag amikor egyedul van a networkben a node amit megtamadtak
                    //vagy nem volt node ami meghatarozta volna az ertekeket


                    _reinforceEnd = CalculateReinforceEnd();

                    Logger.Info("reinforceEnd:" + _reinforceEnd);
                    Logger.Info("node switches to reinforced: " + pbsUnitObject.Name + " " + pbsUnitObject.Eid + " " + pbsUnitObject.ED.Name);
                }
                else
                {
                    Logger.Info("ACTIVE REINFORCE STATE: skipping inital round, this is a server restart " + pbsUnitObject.Eid + " " + pbsUnitObject.Name);
                }

                GoOfflineOnReinforce(pbsUnitObject);
            }