Beispiel #1
0
        // Calculate an entity's default scale
        private static float GetDefaultScale(Transform target)
        {
            if (!target || target == Player.Get().transform)
            {
                return(1f);
            }

            AIs.AI ai = target.GetComponent <AIs.AI>();
            if (ai && ai.m_Spawner)
            {
                float aiAverageScale = (ai.m_Spawner.m_MinScale + ai.m_Spawner.m_MaxScale) * 0.5f;
                if (aiSpawnerPrefab != null)
                {
                    GameObject aiPrefab = aiSpawnerPrefab.GetValue(ai.m_Spawner) as GameObject;
                    if (aiPrefab)
                    {
                        aiAverageScale *= aiPrefab.transform.localScale.x;
                    }
                }

                return(aiAverageScale);
            }

            return(1f);
        }
Beispiel #2
0
        private EntityData AddScaledEntityToCache(Transform scaledEntity, bool updateSpawnerScale)
        {
            EntityData result;
            int        entityIndex = IndexOfEntityInList(scaledEntityCache, scaledEntity);

            if (entityIndex >= 0)
            {
                result = scaledEntityCache[entityIndex];
            }
            else
            {
                for (int i = scaledEntityCache.Count - 1; i >= 0; i--)
                {
                    if (!scaledEntityCache[i].transform)
                    {
                        scaledEntityCache.RemoveAt(i);
                    }
                }

                if (scaledEntityCache.Count >= MAX_NUMBER_OF_SCALED_ENTITIES_TO_CACHE)
                {
                    scaledEntityCache.RemoveAt(0);
                }

                result = new EntityData(scaledEntity);
                scaledEntityCache.Add(result);
            }

            // Recalculate animator speed
            if (result.animator)
            {
                result.SetSpeedMultiplier(Mathf.Clamp(1f / GetMultipliedScale(result.transform.localScale.x * result.invDefaultScale, 0.25f), 0.25f, 1f));
            }

            // If this entity isn't just spawned from an AISpawner, set the custom scale value of that AISpawner to this entity's scale
            if (updateSpawnerScale)
            {
                AIs.AI ai = scaledEntity.GetComponent <AIs.AI>();
                if (ai && ai.m_Spawner)
                {
                    AISpawnerEntityScales[ai.m_Spawner] = scaledEntity.transform.localScale.x;
                }
            }

            return(result);
        }
Beispiel #3
0
        private void Update()
        {
            float currentTime = Time.realtimeSinceStartup;

            // Don't toggle the menu while typing something to chat
            if (toggleKey.Length > 0 && !InputsManager.Get().m_TextInputActive)
            {
                // Check if configurable key is held
                // First, make sure that all modifier keys are held
                bool modifierKeysHeld = true;
                for (int i = 0; i < toggleKey.Length - 1; i++)
                {
                    if (!Input.GetKey(toggleKey[i]))
                    {
                        modifierKeysHeld   = false;
                        toggleKeyTriggered = false;
                        break;
                    }
                }

                if (modifierKeysHeld)
                {
                    if (!toggleKeyTriggered && Input.GetKeyDown(toggleKey[toggleKey.Length - 1]))
                    {
                        toggleKeyTriggered = true;
                        toggleKeyHeldTime  = 0f;
                    }
                    else if (toggleKeyTriggered && Input.GetKey(toggleKey[toggleKey.Length - 1]))
                    {
                        toggleKeyHeldTime += Time.unscaledDeltaTime;
                        if (toggleKeyHeldTime >= toggleKeyHoldDuration)
                        {
                            toggleKeyTriggered = false;
                            SetUIVisible(!uiVisible);
                        }
                    }
                    else
                    {
                        toggleKeyTriggered = false;
                    }
                }
            }

            // Allow rotating the camera while RMB is held
            if (uiVisible)
            {
                if (!rmbHeld && Input.GetMouseButtonDown(1))
                {
                    rmbHeld = true;
                    Player.Get().UnblockRotation();
                }
                else if (rmbHeld && Input.GetMouseButtonUp(1))
                {
                    rmbHeld = false;
                    Player.Get().BlockRotation();
                }
            }

            // Allow closing the menu with ESC key
            if (uiVisible && !InputsManager.Get().m_TextInputActive&& Input.GetKeyDown(KeyCode.Escape))
            {
                SetUIVisible(false);
            }

            if (isPickingEntity)
            {
                hoveredEntity = null;

                // Raycast doesn't hit some animals easily, SphereCast is better
                //RaycastHit hit;
                //if( Physics.Raycast( CameraManager.Get().m_MainCamera.ScreenPointToRay( Input.mousePosition ), out hit, 100f, aiLayerMask ) )

                int hitCount = Physics.SphereCastNonAlloc(CameraManager.Get().m_MainCamera.ScreenPointToRay(Input.mousePosition), 0.25f, raycastHits, 100f, AI_LAYER_MASK);
                for (int i = 0; i < hitCount && !hoveredEntity; i++)
                {
                    AIs.AI hitAI = raycastHits[i].transform.GetComponentInParent <AIs.AI>();
                    if (hitAI)
                    {
                        hoveredEntity = hitAI.transform;

                        if (Input.GetMouseButtonDown(0))
                        {
                            isPickingEntity = false;
                            pickedEntity    = hoveredEntity;

                            Collider aiCollider = hitAI.GetComponent <Collider>();
                            if (aiCollider)
                            {
                                Vector3 aiBounds      = aiCollider.bounds.size;
                                float   boundsAverage = (aiBounds.x + aiBounds.y + aiBounds.z) / (3f * hoveredEntity.localScale.x);

                                pickedEntityMinScale = Mathf.Min(MIN_ENTITY_SCALE / boundsAverage, hoveredEntity.localScale.x);
                                pickedEntityMaxScale = MAX_ENTITY_SCALE / boundsAverage;
                            }
                            else
                            {
                                float defaultScale = GetDefaultScale(pickedEntity);
                                pickedEntityMinScale = Mathf.Max(0.1f, defaultScale * 0.1f);
                                pickedEntityMaxScale = Mathf.Max(10f, defaultScale * 10f);
                            }
                        }
                    }
                }
            }

            // Regularly sync IsEnabled value with peers so that new users can fetch its value
            if (currentTime >= enabledStateNextSyncTime)
            {
                SendEnabledStateToPeers();
            }

            // Sync changes made to entities
            if (currentTime >= modifiedEntitiesNextSyncTime)
            {
                modifiedEntitiesNextSyncTime = currentTime + MODIFIED_ENTITIES_SYNC_INTERVAL;

                P2PNetworkWriter writer = CreateNetworkWriterForChangedEntities(modifiedEntities);
                if (writer != null)
                {
                    P2PSession.Instance.SendWriterToAll(writer, 0);                       // 0: TCP, 1: UDP
                    modifiedEntities.Clear();
                }
            }

            // Allow scaling player or pickedEntity (must hold Alt) with numpad - and + keys (click * key to reset scale)
            if (IsEnabled && (uiVisible || canUseHotkeysWhenHidden))
            {
                if (Input.GetKey(KeyCode.KeypadPlus))
                {
                    if (!Input.GetKey(KeyCode.LeftAlt))
                    {
                        SetTargetScale(Player.Get().transform, Player.Get().transform.localScale.x *(1f + KEYBOARD_SCALE_SPEED * Time.deltaTime));
                    }
                    else if (pickedEntity)
                    {
                        SetTargetScale(pickedEntity, pickedEntity.localScale.x * (1f + KEYBOARD_SCALE_SPEED * Time.deltaTime));
                    }
                }
                else if (Input.GetKey(KeyCode.KeypadMinus))
                {
                    if (!Input.GetKey(KeyCode.LeftAlt))
                    {
                        SetTargetScale(Player.Get().transform, Player.Get().transform.localScale.x *Mathf.Max(0.1f, 1f - KEYBOARD_SCALE_SPEED * Time.deltaTime));
                    }
                    else if (pickedEntity)
                    {
                        SetTargetScale(pickedEntity, pickedEntity.localScale.x * Mathf.Max(0.1f, 1f - KEYBOARD_SCALE_SPEED * Time.deltaTime));
                    }
                }
                else if (Input.GetKeyDown(KeyCode.KeypadMultiply))
                {
                    if (!Input.GetKey(KeyCode.LeftAlt))
                    {
                        ResetTargetScale(Player.Get().transform);
                    }
                    else if (pickedEntity)
                    {
                        ResetTargetScale(pickedEntity);
                    }
                }
            }
        }