trezona

Standalone API

23 сообщения в этой теме

Данный мод позволяет ускорить и в разы облегчить разработку модов.

Данный мод ( Библиотека ) на данный момент не имеет конкурентов.

 

 

canvas.png.32f51516fbd2cdf41e723f2eee68aa57.pngSfb3uY7vHqY.jpg.95df995bac14d3d15aaaa2b9f0fa91dc.jpg

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

 

 

Особенности:

Event Manager на замену ScriptInvoker, CallQueue

имеет ряд преимуществ, не вызывает задержек при вызове.

Имеет свою структуру данных. Позволяет хранить любые данные.

И создавать совершенно разные преимущества перед остальными.

А так же является универсальным загрузчиком и инициализатором вашим модов или скриптов.

 

Network

Самая интересная и сложная в реализации класс.

Выполняет роль получения и отправки пакетов, позволяет отправлять и получать данные в любом порядке.

А самое главное поддерживает очень широкий список данных для отправки по сети.

* Поддерживает следующие типы
* # float
* # int
* # string
* # class
* # managed
* # vector

 

Инструкция по запуску мода, без modded:

1. Начнем с создания класса

ref _NEW_CLASS newClass = new _NEW_CLASS ();
class _NEW_CLASS { ... }

2. Нам нужно инициализировать событие в классе

обычно мы в missionServer / GameplayMission вписываем наш мол что бы он заработал, но благодаря данному апи, нам больше не требуется вмешиваться в данные файлы. Напишем следующий код.

void _NEW_CLASS_()
{
	event.AddWaitFunc(this, "Init", event.SERVER.ON_INIT)
}

void Init()
{
	Print("Скрипт _NEW_CLASS_ Запустился, Сервер принимает подключения");
}

Теперь наша функция Init() сработала, после того как сервер начал принимать подключения новых игроков. А значит все настройки сервера были завершены.

 

Инструкция Network:

class _NEW_CLASS_
{
	Здесь можно создать Network 2-мя способами.

	//ref Network networkServer = new Network(this); // Здесь имя сети примет, имя вашего класса. т.е '_NEW_CLASS_'
	ref Network networkServer = new Network(this, "You Custom Name Network"); // меня не устраивает имя '_NEW_CLASS_' задал свое имя
    void _NEW_CLASS_()
    {
        event.AddWaitFunc(this, "Init", event.SERVER.ON_INIT) // Иницилизируем наш мод. На окончание загрузки сервера.
    }

	void ExecCommand()
    {
		if(networkServer.GetData() == null) return; // В дальнейшех патчах исправлю null сигнатуру.
		string noTitle;
		if(networkServer.GetData().Read(noTitle)) Print(noTitle); // Нужно читать строго по порядку записи.
		string titleText;
		if(networkServer.GetData().Read("titleCommand", titleText)) Print(titleText); // Можем читать в любом порядке.
    }

    void Init()
    {
        Print("Скрипт _NEW_CLASS_ Запустился, Сервер принимает подключения");
		//Теперь представим, что весь код который здесь находится на клиенте.
		//Я хочу выполнить команду ExecCommand, которая находится на сервере
		NetworkCommand cmd = new NetworkCommand("You Custom Name Network"); // Пишем сюда имя сети. Которое указали выше.
		cmd.Data.Write("Hello World Example 1"); // Здесь записываем порядочные данные. Читать тоже придется по порядку.
		cmd.Data.Write("titleCommand", "Hello World Example 1"); // Записываем по заголовку. Можем читать как хотим.
		// Сами данные могут быть любые, из поддерживаемых форматов.
		// Например cmd.Data.Write("playerBase", m_player); //playerBase - является заголовком для пакета.
		cmd.SendPacket("ExecCommand"); // Сюда пишем название функции, которую хотим выполнить.
		//cmd.ClearData() - можем очистить записанные данные, что бы записать новые данные и отправить другим пакетом.
		//Используя текущий коммандер
    }
}

 

Если захотите отблагодарить за проделанную работу

реквизиты можете посмотреть в мастерской стим.

 

StandaloneAPI

https://steamcommunity.com/sharedfiles/filedetails/?id=1824292535

Изменено пользователем trezona (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


Прикрепил пример Network, Полностью рабочий. Загружаете и тестируете. class-item: BloodTestKit

 

В планах добавить CRON, пока без идей как будет использоваться. В классе event или будет отдельным..

Так же добавить Trigger, класс на основе event. который будет срабатывать при игроке внутри или чего угодно. Что имеет координаты. А так же постараюсь добавить - создание зон по множеству точек. С замыкающей последней точкой. В мусорку настройку радиуса.. Сами зададим форму триггера, хоть круг, овал или кошачья мордашка

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

trezona Это все конечно интересно? Но зачем делать доппрокладки если есть все штатное?

Мне это решительно непонятно

Я например стараюсь по максимуму сократить использование любых переменных, классов, вызовов и тп

В тестовом варианте, да,  что-то добавляю лишнего

Но в рабочем режу все нещадно

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK Почему я решил сделать.

Я задался вопросом, как делать моды.. Не где описания нет. Открыл моды из воркшопа. Смотрю а там просто файлы игры модифицируются.. Ну я полез в файлы и понял примерно что и как делается. затем возник вопрос, а какие функции есть и куда они относятся к серверу или клиенту. В игровых файлах тоже нету не каких подсказок. например GetGame() Частично и к серверу и клиенту.. А какие именно не понятно. и приходится методом тыка проверять где работает.

или например возьмем идею cron или триггера. Кто знает, кто как напишет что то подобное.. Может будет вызывать нагрузку сильнее чем множество созданных классов как в данном апи. А так я создаю некую оболочку где разработчики могут не тратить время и продумать логику как реализовать то или иное. А просто возьмут например API.SERVER. И получат все функции сервера или на оборот. или просто сделают
val = New Trigger(arrray<float>);
val.AddFunc(..)
ну и итд.. Я надеюсь уловил мой ход мыслей и чего я пытаюсь достичь этим апи.

Приведу пример, вот переписывал CodeLock под API,  и скажу так.. где CF, создавал множество ссылок. мне обошлось всего 2 классами. Где каждый работает по 1 ссылке.
Network(this) - Отвечает за сервер и клиент (сразу)
и Command - Отвечают за отправку данных. Все.. Остальное просто SendPacket и все.. Без создания кучей ссылок.. и кучей проверок которые сделаны в CF.

Сравни @CF и мой класс Network.. Скажи, где будет шустрее работать и где память будет более свободней? Не забывай что new.. Он как нагружает ровно память на столько сколько и хранит информации так и освобождает когда не используется.. когда не указана ссылка. В моем случае, он не хранит ссылки и не какую информацию.

 

Действительно сравни CF и мой Network.. И скажи где будет быстрее работать и меньше памяти есть. Только попрошу с аргументами.

 

А Так же готов выслушать любые предложения, по тому что улучшить, добавить и в целом что вам в данном апи не хватает. А так же найденные ошибки пишем ссюда. Будем исправлять вместе.

Изменено пользователем trezona (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

trezona Это все обертка

А в движке выходит тож самое

Хотя и выглядит наверное красиво, не спорю, за что и поставил плюсик

 

Пробежался по коду

Еще раз пришел к выводу

Писать надо напрямую используя только натив для своих модов

Без зависимостей от чужих

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, trezona сказал:

Остальное просто SendPacket

Ну да просто...

 

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

Игра в принципе так и напишет.

Так что, делать там огого.

При отправке, слать идентификатор пакета, кол-во пакетов в стеке которые должны прийти, в каждом пакете назначать ид(т.к. юдп не гарантирует ни приход ни то что они в указанном порядке придут), затем по приходу всех - клеить их в единое, и только потом отдавать парсеру уже полные данные.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обновление NetworkCommand, добавлено.

  1.  SendClassPacket(fnc, class) -> Отправляется в заголовок функции
  2.  SendParamPacket(fnc, param) -> Отправляется в заголовок функции

 

 Обновление Network, добавлено.

  1. bool skipErrorPacket - Выполнять код, при наличии ошибок.
  2. int GetErrorType() - Код Ошибки
  3. bool IsExistError() - Наличие ошибки
  4. int GetID() - индификатор RPC ID
  5. string GetName() - имя сети
  6. ParamsReadContext GetPacket() - сам пакет от RPC
  7. PlayerIdentity GetPacketIdentity() - PlayerIndentity от RPC
  8. Object GetPacketTarget() - Object Target от RPC
  9. int GetPacketID() - ID, пришедшего пакета.
  10. NetworkData GetData() - данные от SendPacket. Обработанные.
  11. bool IsExistData() - Наличие данных от SendPacket.
  12. NetworkData GetLastData() - Предыдущие данные от SendPacket.
  13. bool IsClientAndServer() - Сеть работает в обе стороны
  14. bool IsServer() - Сеть работает только на сервере
  15. bool IsClient() - Сеть работает только на клиенте

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

trezona 

 

Хочу предложить насчет расширения функционала - в идеале выделения в отдельный мод

Сам хочу заняться этим давно - но времени не хватает да же допилить то что начал (дом, семья, работа и тп)

 

Класс и функции позволяющие

1 Отправка на клиента вызова создания меню по параметрам

2 Обработка в этом меню на клиенте и отправка данных на сервер

3 Прием на сервере данных из этого меню и обработка на сервере

4 Отправка на клиента вызова создания партикля (партикли обрабатываются только на клиенте)

5 Отправка на клиента вызова управления партиклем

6 Отправка на клиента вызова удаления партикля

7 Отправка на клиента вызова для изменения освещения/блура итд итп

 

ну там можно и дальше раширять функционал - вызовы для создания звука, управления камерой итд итп, но направление думаю понятно

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK Спасибо за предложение, это все планируется но все в одной куче. Когда возьмусь за данный функционал я не знаю. Сейчас стоит цель, это как ты сказал сделать обертку вокруг стандартных и разделить на 2 группы. Клиент - Сервер. Набросок как все это будет выглядеть в моде есть. Но если есть желание помочь разрабатывать данный мод, буду рад. API пока очень легкое и доступное в использовании. Думаю сможешь разобраться, а если нет готов подсказать. От помощи не откажусь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

trezona Помочь в чем-то готов, как и многие тут, но наверное не всегда, ибо времени не хватает катастрофически...

Про все в одной куче - имхо это не правильно.

 

Про сетевые пакеты

я когда писал для промки -  давно-давно - сети были медленные и тупые

 

делал так

собирал все в единый пул

резал на куски

 

в первом куске заголовок что это начало  + идетификатор кучи + кол-во кусков которое должна принять другая сторона + размер каждого куска

та сторона получала этот кусок, фрмировала пул под прием и сообщала об этом отправителю

 

отправитель поняв, что та сторона готова принимать слал по кускам + в начале каждого куска порядковый номер и контрольная сумма

 

после получения каждого куска принимающая сторона извещала об этом отправителя

если контрольная сумма какого-то куска не сходилась он перезапрашивался

 

после отпарвки последнего куска отправлялся еще один и общей контрольной суммой всего пула и заголовком что это конец всей передачи

 

на той стороне это все собиралось в пул по кускам в готовый пул

 

по завершению приема и при условии что все сошлось та сторона извещала что все ок и передача завершалась

 

однако

у нас тут все это движок проделывает + сетевой стек ОС - мы ему просто даем данные для пересылки - зачем заморачиваться

 

хотя проверять что все что надо дошло и дошло корректно, независимо от движка, имхо не помешает

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Загрузил обновление.

Не много обновил функционал.

Теперь данные от сети можно получить 2-мя способами.

// 1 - Способ
void ExecNetworkCommand( NetworkData data )
{
	if(GetGame().IsClient() || data == null) return; // Вариант 1.
	if(network.IsClient() || !network.IsExistData()) return; // Вариант 2.
	
	string messageFromClient;
	if(data.Read(messageFromClient)) Print(messageFromClient);
}

// 2 - Способ - Выбор автора.
Network network = new Network(this);
void ExecNetworkCommand( )
{
	if(network.IsClient() || !network.IsExistData()) return; // IsExistData - записывает сам RPC при наличии пакета.. иначе false.
	string messageFromClient;
	if(network.GetData().Read(messageFromClient)) Print(messageFromClient);
}
Изменено пользователем trezona (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добавил Комбайнер файлов XML.

Начал делать сервер и понял, что вручную перебирать каждый файл очень долго и трудоемко.

 

1. Создаете папку StandaloneAPI_Profile/XML/

2. Кладете туда все XML файлы

3. Удаляете во всех файлах

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<types>
</types>

4. Запускаете сервер. В папке появился файл types, осталось только положить в папку с картой и добавить префикс .xml

Что может быть проще, чем хранить данные в каждом своем XML. не смешивая все в куче. А при удалении мода. Просто удалить этот файл xml и сгенерировать файл.

 

Не забывайте каждый раз удалять с генерированный файл. Он отключает повторную генерацию.

Изменено пользователем trezona (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

trezona А что мешало

обрабатывать при наличии?

 

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
< types>

< /types>

 

и расширение собственно то же можно не резать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

BorizzK Я не хотел долго мучатся с откладкой. По этому решил для начала пусть будет хоть как то работать.. А там уже можно будет постепенно доводить до ума

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас