public override void AddComponent(Abstract.IComponent component)
 {
     if (AdditionalComponents == null)
     {
         AdditionalComponents = new System.Collections.Generic.List <Abstract.IComponent>
         {
             component
         };
     }
     else
     {
         AdditionalComponents.Add(component);
     }
 }
        /// <summary>
        /// This function is called when the window becomes enabled and active.
        /// </summary>
        public static void OnEnable()
        {
            properties   = new WeaponProperties();
            delay        = new EditorDelay(0.1f);
            toolbarItems = new string[] { "First Person Weapon", "Pickable Weapon" };
            Transform player = UEditorInternal.FindPlayer();

            if (player != null)
            {
                inventory = UEditorInternal.FindComponent <AdvancedInventory>(player);
            }
            additionalComponents = new List <AdditionalComponents>()
            {
                new AdditionalComponents
                {
                    name      = "Crosshair",
                    component = typeof(Crosshair),
                    isActive  = true
                },
                new AdditionalComponents
                {
                    name      = "Camera Zoom",
                    component = typeof(FPCameraZoom),
                    isActive  = true
                }
            };
            additionalComponentsRL = new ReorderableList(additionalComponents, typeof(AdditionalComponents), true, true, false, false)
            {
                drawHeaderCallback = (rect) =>
                {
                    EditorGUI.LabelField(new Rect(rect.x, rect.y + 1, 200, EditorGUIUtility.singleLineHeight), "Additional Components");
                },

                drawElementCallback = (rect, index, isActive, isFocused) =>
                {
                    AdditionalComponents additionalSystem = additionalComponents[index];
                    EditorGUI.LabelField(new Rect(rect.x, rect.y + 2, 100, EditorGUIUtility.singleLineHeight), additionalSystem.name);
                    additionalSystem.isActive   = EditorGUI.Toggle(new Rect(rect.width + 10, rect.y + 2, 30, EditorGUIUtility.singleLineHeight), additionalSystem.isActive);
                    additionalComponents[index] = additionalSystem;
                }
            };
        }
示例#3
0
        // метод обработки сообщений
        public static void handleResults(byte[] data, IPEndPoint remoteIp)
        {
            // если мы не закончили работу
            if (!done)
            {
                // отправитель
                string sender = remoteIp.Address.ToString();
                // полученное сообщение
                string   message = Encoding.Unicode.GetString(data);
                string[] msgArr  = message.Split('~');
                // тип сообщения
                messageType type = AdditionalComponents.stringToMessageType(msgArr[1]);
                // текст сообщения
                message = msgArr[0];
                // получатель сообщения
                string _receiver = msgArr[2];
                // если тип сообщения - Join (клиент подключился)
                if (type == messageType.Join)
                {
                    // добавляем адрес клиента в список
                    clientAddresses.Add(sender);
                    // увеличиваем счетчик количества подключившихся клиентов
                    clientCount++;
                    // сообщаем о подключении
                    Console.WriteLine("UDP >> Клиент " + sender + " успешно подключен!");
                    // если все клиенты подключились
                    if (clientCount == clientCountMax)
                    {
                        // ввод с клавиатуры количества массивов для генерации
                        Console.Write(">> Введите количество массивов, которые нужно сгенерировать: ");
                        count = int.Parse(Console.ReadLine());
                        // отправляем клиентам сообщение о необходимости начала генерации (количество массивов делим на количество клиентов)
                        if (clientAddresses.Count > 0)
                        {
                            //Console.WriteLine(">> Отправка запросов генерации " + (1.1 * count / clientCountMax) + " (+10%) массивов...");
                            Console.WriteLine(">> Отправка запросов генерации " + (count / clientCountMax) + " массивов...");

                            for (int i = 0; i < clientAddresses.Count; i++)
                            {
                                //SendMessage((1.1 * count / clientCount).ToString() + "|" + i.ToString(), messageType.TransmissionBegin, clientAddresses[i]);
                                SendMessage((count / clientCount).ToString() + "|" + i.ToString(), messageType.TransmissionBegin, clientAddresses[i]);
                            }
                        }
                    }
                }
                // если мы - получатели
                if (_receiver == AdditionalComponents.LocalIPAddress())
                {
                    // если тип сообщения - Data (получили сгенерированные массивы)
                    if (type == messageType.Data)
                    {
                        // разбиение полученного пакета на отдельные (каждый кусок соответствует одному сгенерированному массиву)
                        string[] energyDataStr = message.Split('/');
                        for (int i = 0; i < energyDataStr.Length - 1; i++)
                        {
                            // содержимое каждого сгенерированного массива
                            List <double> energyData = new List <double>();
                            // извлечение данных из сообщения
                            string[] energyValues = energyDataStr[i].Split('|');
                            // конвертация
                            for (int j = 0; j < energyValues.Length - j; j++)
                            {
                                energyData.Add(Convert.ToDouble(energyValues[j]));
                            }
                            // добавление сгенерированного массива в список
                            generatedData.Add(new EnergyInput(energyData));
                            // сохранение в файл
                            StreamWriter sw = new StreamWriter("generatedData.txt", true);
                            sw.WriteLine(energyDataStr[i].Replace('|', ';'));
                            sw.Close();
                        }
                        Console.WriteLine("UDP >> Получен пакет данных от " + sender + " длиной " + data.Length + " байт; массивов в пакете: " + (energyDataStr.Length - 1));
                    }
                    // если тип сообщения - TransmissionEnd (сообщение об окончании передачи)
                    else if (type == messageType.TransmissionEnd)
                    {
                        // извлекаем из сообщения время генерации
                        double time = Math.Round(Convert.ToDouble(message), 2);
                        // если этот клиент потратил на генерацию больше времени, чем какой-либо другой, то записываем это время как новое
                        if (time > totalClientTime)
                        {
                            totalClientTime = time;
                        }
                        // отмечаем в массиве флагов, что клиент закончил генерацию
                        doneByClients[clientAddresses.IndexOf(sender)] = true;

                        Console.WriteLine("UDP >> Клиент " + sender + " завершил передачу данных, сгенерированных за " + time + " секунд!");

                        // проверяем, все ли клиенты закончили генерацию
                        int c = 0;
                        foreach (bool client in doneByClients)
                        {
                            if (client)
                            {
                                c++;
                            }
                        }

                        // если все клиенты закончили
                        if (c == clientAddresses.Count)
                        {
                            // отмечаем флаг завершения работы
                            done = true;

                            /*double lost = 1.1 * count - generatedData.Count();
                            *  double lostp = 110 * lost / generatedData.Count();*/
                            // выводим информационные сообщения
                            Console.WriteLine(">> Все клиенты завершили передачу данных!");
                            Console.WriteLine(">> Сгенерировано массивов: " + count);
                            //Console.WriteLine(">> Сгенерировано массивов: " + generatedData.Count() + " / " + count);
                            //Console.WriteLine(">> Потеряно при передаче: " + Math.Round(lost, 0) + " (" + Math.Round(lostp, 2) + "%)");

                            /*if (generatedData.Count > count)
                             * {
                             *  Console.WriteLine(">> Компенсационные излишки: " + (generatedData.Count() - count));
                             *  generatedData.RemoveRange(count, generatedData.Count - count);
                             *  Console.WriteLine(">> Итого массивов: " + generatedData.Count());
                             * }*/
                            Console.WriteLine(">> Потрачено времени на выполнение: " + Math.Round(totalClientTime, 2) + " секунд");
                            Console.WriteLine(">> Нажмите любую клавишу для выхода...");
                            // выход из программы
                            Console.ReadKey();
                            Environment.Exit(0);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Create new weapon by properties.
        /// </summary>
        private static GameObject CreateFPWeapon(WeaponProperties properties)
        {
            // Initialize gameobjects.
            GameObject weapon = GameObject.Instantiate <GameObject>(properties.GetWeapon(), Vector3.zero, Quaternion.identity);

            weapon.name  = properties.GetName();
            weapon.tag   = TNC.WEAPON;
            weapon.layer = LayerMask.NameToLayer(LNC.WEAPON);
            for (int i = 0, length = weapon.transform.childCount; i < length; i++)
            {
                weapon.transform.GetChild(i).gameObject.layer = LayerMask.NameToLayer(LNC.WEAPON);
            }

            // Initialize weapon components.
            Animator              animator              = UEditorInternal.AddComponent <Animator>(weapon);
            WeaponIdentifier      weaponIdentifier      = UEditorInternal.AddComponent <WeaponIdentifier>(weapon);
            WeaponAnimationSystem weaponAnimationSystem = UEditorInternal.AddComponent <WeaponAnimationSystem>(weapon);

            switch (properties.GetWeaponType())
            {
            case WeaponProperties.Type.Gun:
            {
                WeaponShootingSystem weaponShootingSystem = UEditorInternal.AddComponent <WeaponShootingSystem>(weapon);
                WeaponReloadSystem   weaponReloadSystem   = UEditorInternal.AddComponent <WeaponReloadSystem>(weapon);
                break;
            }

            case WeaponProperties.Type.Melee:
            {
                WeaponMeleeSystem weaponMeleeSystem = UEditorInternal.AddComponent <WeaponMeleeSystem>(weapon);
                break;
            }

            case WeaponProperties.Type.Throw:
            {
                ThrowingWeaponSystem throwingWeaponSystem = UEditorInternal.AddComponent <ThrowingWeaponSystem>(weapon);
                WeaponReloadSystem   weaponReloadSystem   = UEditorInternal.AddComponent <WeaponReloadSystem>(weapon);
                break;
            }
            }
            AudioSource audioSource = UEditorInternal.AddComponent <AudioSource>(weapon);

            // Setup Animator component.
            if (properties.GetController() != null)
            {
                animator.runtimeAnimatorController = properties.GetController();
            }

            // Setup WeaponID component.
            if (properties.GetWeaponID() != null)
            {
                weaponIdentifier.SetWeapon(properties.GetWeaponID());
            }

            // Apply components position.
            UEditorInternal.MoveComponentBottom <Animator>(weapon.transform);
            UEditorInternal.MoveComponentBottom <WeaponIdentifier>(weapon.transform);
            UEditorInternal.MoveComponentBottom <WeaponAnimationSystem>(weapon.transform);
            switch (properties.GetWeaponType())
            {
            case WeaponProperties.Type.Gun:
            {
                UEditorInternal.MoveComponentBottom <WeaponShootingSystem>(weapon.transform);
                UEditorInternal.MoveComponentBottom <WeaponReloadSystem>(weapon.transform);
                break;
            }

            case WeaponProperties.Type.Melee:
            {
                UEditorInternal.MoveComponentBottom <WeaponMeleeSystem>(weapon.transform);
                break;
            }

            case WeaponProperties.Type.Throw:
            {
                UEditorInternal.MoveComponentBottom <ThrowingWeaponSystem>(weapon.transform);
                UEditorInternal.MoveComponentBottom <WeaponReloadSystem>(weapon.transform);
                break;
            }
            }
            for (int i = 0, length = additionalComponents.Count; i < length; i++)
            {
                AdditionalComponents component = additionalComponents[i];
                if (component.isActive)
                {
                    weapon.AddComponent(component.component);
                }
            }
            UEditorInternal.MoveComponentBottom <AudioSource>(weapon.transform);

            return(weapon);
        }
示例#5
0
        // метод обработки сообщений
        private static void ReceiveMessage()
        {
            // UdpClient для получения данных
            UdpClient receiver = new UdpClient(localPort);

            // подключаемся к широковещательной рассылке
            receiver.JoinMulticastGroup(serverAddress, 20);
            // адрес отправителя
            IPEndPoint remoteIp = null;

            try
            {
                // бесконечный цикл
                while (true)
                {
                    // получение сообщения в виде массива байтов
                    byte[] data = receiver.Receive(ref remoteIp);
                    // отправитель
                    string sender = remoteIp.Address.ToString();
                    // полученное сообщение
                    string   message = Encoding.Unicode.GetString(data);
                    string[] msgArr  = message.Split('~');
                    // тип сообщения
                    messageType type = AdditionalComponents.stringToMessageType(msgArr[1]);
                    // текст сообщения
                    message = msgArr[0];
                    // получатель сообщения
                    string _receiver = msgArr[2];
                    // мы - получатели
                    if (_receiver == AdditionalComponents.LocalIPAddress())
                    {
                        // если тип сообщения - TransmissionBegin (начало передачи)
                        if (type == messageType.TransmissionBegin)
                        {
                            // сохраняем IP-адрес сервера
                            serverIP = sender;
                            // извлекаем из сообщения количество массивов для генерации и порядковый номер клиента
                            string[] msg = message.Split('|');
                            count     = Convert.ToInt32(msg[0]);
                            clientNum = Convert.ToInt32(msg[1]);
                            // выводим информационное сообщение
                            Console.WriteLine("UDP >> Получен запрос генерации " + count + " массивов данных от " + sender + ", запуск");
                            // начинаем генерацию
                            beginGeneration();
                        }
                    }

                    // если все потоки завершили работу
                    if (abortFlag)
                    {
                        Console.WriteLine(">> Нажмите любую клавишу для выхода...");
                        Console.ReadKey();
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("UDP >> " + ex.Message);
            }
            finally
            {
                receiver.Close();
            }
        }