Как делает Half-Life 2 многопользовательская работа протокола?

Я написал эту функцию для перемещения выбранных предметов:

using System.Collections;
using System.Collections.Generic;

private void MoveListboxItems(int step, ListBox lb) {
    /* 'step' should be:
     *   -1 for moving selected items up
     *    1 for moving selected items down
     * 'lb' is your ListBox
     *   see examples how to call below this function
    */
    try {
        // do only something when really an item is selected
        if (lb.SelectedIndex > -1) {
            // get some needed values - they change while we manipulate the listbox
            // but we need them as they was original
            IList SelectedItems = lb.SelectedItems;
            IList SelectedIndices = lb.SelectedIndices;

            // set some default values
            int selIndex = -1;
            int newIndex = -1;
            int selCount = SelectedItems.Count;
            int lc = 0;
            int mc = 0;
            string moveOldValue = string.Empty;
            string selectedItemValue = string.Empty;

            if (step == 1) {
                mc = selCount - 1;
            } else {
                mc = lc;
            }
            // enter the loop through the selected items
            while (lc < selCount) {
                selectedItemValue = string.Empty;
                moveOldValue = string.Empty;

                try {
                    // get the item that should get moved
                    selectedItemValue = SelectedItems[mc].ToString();
                    selIndex = Convert.ToInt32(SelectedIndices[mc]);
                } catch {
                    selIndex = -1;
                }
                // gen index for new place
                newIndex = selIndex + step;
                try {
                    // get the old value from the place where the item get moved
                    moveOldValue = lb.Items[newIndex].ToString();
                } catch { /* do nothing */ }
                try {
                    if (!String.IsNullOrEmpty(selectedItemValue) && !String.IsNullOrEmpty(moveOldValue) && selIndex != -1 && newIndex != -1 && !lb.SelectedIndices.Contains(newIndex)) {
                        // move selected item
                        lb.Items.RemoveAt(newIndex);
                        lb.Items.Insert(newIndex, selectedItemValue);
                        // write old value back to the old place from selected item
                        lb.Items.RemoveAt(selIndex);
                        lb.Items.Insert(selIndex, moveOldValue);
                        // hold the moved item selected
                        lb.SetSelected(newIndex, true);
                    }
                } catch { /* do nothing */ }
                lc++;
                if (step == 1) {
                    mc -= step;
                } else {
                    mc = lc;
                }
            }
        }
    } catch { /* do nothing */ };
}

// examples how i call the function above
void BtnLbUp_Click(object sender, EventArgs e) {
    MoveListboxItems(-1, this.lbMyList);
}

void BtnLbDown_Click(object sender, EventArgs e) {
    MoveListboxItems(1, this.lbMyList);
}
21
задан John Smith 3 August 2009 в 11:57
поделиться

5 ответов

Half-Life 2, Counter-Strike: Source и т. Д. Используют движок Valves Source. Valve имеет вики для разработчиков , которая охватывает множество вещей (это довольно круто, проверьте это!) ...

Эти статьи могут вас заинтересовать:

Методы компенсации задержки в клиент-серверных системах. Протокол, дизайн и оптимизация игры

Исходная многопользовательская сеть

40
ответ дан 29 November 2019 в 19:59
поделиться

Я глядел на эту книгу. Мои познания в математике невелики ... но есть ключ:

Для понимания таких вещей, если у вас есть творческий ум и хорошее понимание абстрактной природы структур и математических принципов у вас все должно быть в порядке. Моя умственная арифметика довольно скудна по любым стандартам, но я люблю читать о дискретной математике из-за ее абстрактной природы.

Я бы не считал себя очень хорошим математиком в числовом смысле, но как разработчик программного обеспечения. Мне нравится думать, что у меня математический (или механический) ум.

Я бы не стал ' Я слишком беспокоюсь о своей числовой силе , но больше о природе математики и личности концепций, лежащих в основе информатики. Если у вас хороший ум в программировании, возможно, попробуйте улучшить это с помощью комбинаторики / дискретной / конкретной математики (которая, помимо теории счета, во многих случаях избегает сухих чисел ).

Я нашел свою любовь к вещам как компиляторы, изучающие теорию множеств, и я бы не хотел сдавать математику A-level без большого количества зубрежки!

Попробуйте, что вам терять?

(im 22 and в похожей на вас ситуации)

Удачи

PS: Мне тоже показались интересными видеолекции. Вы можете загрузить их через торрент с

http://groups.csail.mit.edu/mac/classes/6.

3
ответ дан 29 November 2019 в 19:59
поделиться

Вам следует ознакомиться с статьями Луиджи Ауриеммаса о Half-Life. Вы также найдете там декодер пакетов и несколько разобранных алгоритмов.

Возможно, будет трудно найти информацию о обратном инжиниринге Half-Life 2 из-за ее пригодности для мошенничества. Думаю, вам лучше всего подойдут такие форумы, как mpcforum .

5
ответ дан 29 November 2019 в 19:59
поделиться

Я предлагаю вам изучить Quake 1 -3 двигателя. Они доступны с исходным кодом. Протокол Half-Life может быть немного другим, но, скорее всего, достаточно близким.

1
ответ дан 29 November 2019 в 19:59
поделиться

Хотя детали могут отличаться, общая структура довольно старая. Вот краткий обзор:

В ранних играх с fps, таких как doom и Quake, позиция игрока обновлялась только после ответа сервера на вашу команду перемещения. То есть вы нажали кнопку перехода вперед, и клиент сообщил об этом серверу, сервер обновил вашу позицию в своей памяти, а затем ретранслировал новое игровое состояние вашему клиенту с вашей новой позицией. Это приводило к очень медленной игре: стрельба, даже передвижение в узких коридорах, была игрой с предсказанием отставания.

Новые игры позволяли клиенту самостоятельно управлять стрельбой и перемещением игрока. Хотя это привело к перемещению и запуску без задержек, оно открыло больше возможностей для мошенничества путем взлома клиентского кода. Теперь каждый игрок двигается и стреляет независимо на своем компьютере и сообщает серверу, что они сделали. Это выходит из строя только тогда, когда два игрока сталкиваются друг с другом или одновременно пытаются поймать силу.

Теперь у сервера есть этот поток состояний клиента, исходящий от каждого игрока, и он должен синхронизировать их и создать согласованную игру. их. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.

Это очень приблизительный обзор, но он должен дать вам общее представление.

Это выходит из строя только тогда, когда два игрока сталкиваются друг с другом или одновременно пытаются поймать мощность.

Теперь у сервера есть поток состояний клиента, исходящий от каждого игрока, и он должен синхронизировать их и создать согласованную игру. их. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.

Это очень приблизительный обзор, но он должен дать вам общее представление.

Это выходит из строя только тогда, когда два игрока сталкиваются друг с другом или одновременно пытаются поймать мощность.

Теперь у сервера есть поток состояний клиента, исходящий от каждого игрока, и он должен синхронизировать их и создать согласованную игру. их. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.

Это очень приблизительный обзор, но он должен дать вам общее представление.

Теперь сервер имеет этот поток состояний клиента, исходящий от каждого игрока, и должен синхронизировать их и сделать из них согласованную игру. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.

Это очень приблизительный обзор, но он должен дать вам общее представление.

Теперь у сервера есть этот поток состояний клиента, исходящий от каждого игрока, и он должен синхронизировать их и сделать из них согласованную игру. Уловка состоит в том, чтобы измерить задержку каждого игрока. Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.

Это очень приблизительный обзор, но он должен дать вам общее представление.

Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.

Это очень приблизительный обзор, но он должен дать вам общее представление.

Конечная цель - иметь возможность стрелять из оружия с очень малой задержкой (например, снайперской винтовки или рейлгана) по врагу, движущемуся боком, и правильно поражать его. Если задержка от каждого игрока известна, предположим, что игрок A (задержка 50 мс) стреляет из пушки по B (задержка 60 мс). Чтобы попасть в цель, выстрел должен попасть в точку B, где B был 60 мс назад, а A - 50 мс назад.

Это очень приблизительный обзор, но он должен дать вам общее представление.

2
ответ дан 29 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: