Пример #1
0
        public override void OnPush()
        {
            // Racial override can suppress trade
            // We still setup and push window normally, actual suppression is done in Update()
            MagicAndEffects.MagicEffects.RacialOverrideEffect racialOverride = GameManager.Instance.PlayerEffectManager.GetRacialOverrideEffect();
            if (racialOverride != null)
            {
                suppressInventory = racialOverride.GetSuppressInventory(out suppressInventoryMessage);
            }

            // Identify spell can run anywhere - only get building info when not using spell
            if (!usingIdentifySpell)
            {
                // Get building info, message if invalid, otherwise setup acccepted item list
                buildingDiscoveryData = GameManager.Instance.PlayerEnterExit.BuildingDiscoveryData;
                if (buildingDiscoveryData.buildingKey <= 0)
                {
                    DaggerfallUI.MessageBox(HardStrings.oldSaveNoTrade, true);
                }
                else if (windowMode == WindowModes.Sell)
                {
                    itemTypesAccepted = storeBuysItemType[buildingDiscoveryData.buildingType];
                }
            }

            // Local items starts pointing to player inventory
            localItems = PlayerEntity.Items;

            // Initialise remote items
            remoteItems      = (windowMode == WindowModes.Repair) ? PlayerEntity.OtherItems : merchantItems;
            remoteTargetType = RemoteTargetTypes.Merchant;

            // Clear wagon button state
            if (wagonButton != null)
            {
                SelectWagon(false);
            }

            // Refresh window
            Refresh();
        }
Пример #2
0
        /// <summary>
        /// Promote pending mobiles to live status and recycle out of range mobiles.
        /// </summary>
        void UpdateMobiles()
        {
            // Racial override can suppress population, e.g. transformed lycanthrope
            MagicAndEffects.MagicEffects.RacialOverrideEffect racialOverride = GameManager.Instance.PlayerEffectManager.GetRacialOverrideEffect();
            bool suppressPopulationSpawns = racialOverride != null && racialOverride.SuppressPopulationSpawns;

            bool isDaytime = DaggerfallUnity.Instance.WorldTime.Now.IsDay;

            for (int i = 0; i < populationPool.Count; i++)
            {
                PoolItem poolItem = populationPool[i];

                // Get distance to player
                poolItem.distanceToPlayer = Vector3.Distance(playerGPS.transform.position, poolItem.npc.Motor.transform.position);

                // Show pending mobiles when available
                if (poolItem.active &&
                    poolItem.scheduleEnable &&
                    AllowMobileActivationChange(ref poolItem) &&
                    isDaytime &&
                    !suppressPopulationSpawns)
                {
                    poolItem.npc.Motor.gameObject.SetActive(true);
                    poolItem.scheduleEnable = false;
                    poolItem.npc.RandomiseNPC(GetEntityRace());
                    poolItem.npc.Motor.InitMotor();

                    // Adjust billboard position for actual size
                    Vector2 size = poolItem.npc.Asset.GetSize();
                    if (Mathf.Abs(size.y - 2f) > 0.1f)
                    {
                        poolItem.npc.Asset.transform.Translate(0, (size.y - 2f) * 0.52f, 0);
                    }
                }

                // Mark for recycling
                if (poolItem.npc.Motor.SeekCount > 4 ||
                    poolItem.distanceToPlayer > recycleDistance ||
                    !isDaytime)
                {
                    poolItem.scheduleRecycle = true;
                }

                // Recycle pending mobiles when available
                if (poolItem.active && poolItem.scheduleRecycle && AllowMobileActivationChange(ref poolItem))
                {
                    poolItem.npc.Motor.gameObject.SetActive(false);
                    poolItem.active          = false;
                    poolItem.scheduleEnable  = false;
                    poolItem.scheduleRecycle = false;
                    if (poolItem.npc.Asset)
                    {
                        poolItem.npc.Asset.transform.localPosition = Vector3.zero;
                    }
                }

                populationPool[i] = poolItem;

                // Do not render active mobile until it has made at least 1 full tile move
                // This hides skating effect while unit aligning to navigation grid
                if (poolItem.active && poolItem.npc.Asset)
                {
                    MeshRenderer billboardRenderer = poolItem.npc.Asset.GetComponent <MeshRenderer>();
                    if (billboardRenderer)
                    {
                        billboardRenderer.enabled = (poolItem.npc.Motor.MoveCount > 0) ? true : false;
                    }
                }
            }
        }