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(); }
/// <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; } } } }