Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
Sign in to follow this  
trezona

APIWrapper

Recommended Posts

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

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

 

 

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() - можем очистить записанные данные, что бы записать новые данные и отправить другим пакетом.
		//Используя текущий коммандер
    }
}

 

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

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

 

APIWrapper

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

Share this post


Link to post
Share on other sites









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

 

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

 

Share this post


Link to post
Share on other sites

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.. И скажи где будет быстрее работать и меньше памяти есть. Только попрошу с аргументами.

 

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

Edited by trezona (see edit history)

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

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

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

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
1 час назад, trezona сказал:

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

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

 

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

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

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

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

 

Share this post


Link to post
Share on other sites

Обновление 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() - Сеть работает только на клиенте

 

Share this post


Link to post
Share on other sites

trezona 

 

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

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

 

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

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

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

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

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

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

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

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

 

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

 

 

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

 

делал так

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

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

 

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

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

 

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

 

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

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

 

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

 

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

 

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

 

однако

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

 

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

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

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

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

Теперь данные от сети можно получить 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);
}
Edited by trezona (see edit history)

Share this post


Link to post
Share on other sites

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

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

 

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

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

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

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

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

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

 

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

Edited by trezona (see edit history)

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

trezona А что мешало

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

 

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

< /types>

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

trezona есть же DeleteFile, CopyFile
Созданный файл скопировал с нужным расширением

Старый удалил

Я так ротацию некоторых логов в своей системе логгирования организую

Жаль что переименования нет

 

Share this post


Link to post
Share on other sites

Одно из крупных обновлений API, уже совсем скоро.

Коротко что сделано.

 

Сделан инициализатор классов и встроенное API внутри.

class YouModServer : APIServer {  }

class YouModClient : APIClient {  }

И для любителей иметь в одном классе, и сервер и клиент.

class YouModClient : APICore {  }

 

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

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

 

Например смело можете писать такой код.

class YOrClass : APIServer
{
	override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
	{
		SendMessageAll(string.Format("Player %1 connected on server", player.GetName()));
		SendMessage(player, "You play on very nice server :D");
		ItemBase item;
		if(!GiveItem(player, "Ammo_380", item))
		{
			SendMessage(player, "Предмет выпал на землю, подберите.");
		}
	}
}

На данный момент, вторым сильно затронувшее изменение API были события Event

 

Теперь они имеют всего 3 функции статичные и не только.
Вызывает функцию с задержкой, время задержки изменяется. Возможны погрешности во время расчета из за оптимизации кода.

event.CallLater (..., int delay, bool repeat, ...) - Вызывает событие сейчас, или через некоторое время после вызова функции.

event.CallLaterGame (..., int hour, int minute, bool repeat, ...) - Вызывает событие при достижении игрового времени.

event.CallLaterTime (..., int hour, int minute, bool repeat, ...) - Вызывает событие при достижении времени на серверной машине.

 

и доступны 2 только при создании new event;

event.Call ( ) - Добавляет ваше событие, для дальнейшего вызова..

event.Invoke() - инициализирует ваше кастомное событие.

 

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

При вызове одной из 2-х функций, событие перестраивается на ваши новые настройки.

SetTime( hour, minute, IsTimeGame)
SetDelay( seconds )

Delete() - если захотите удалить определенное событие.

 

Разработка еще в процессе. Это только та часть которая уже готова.. Слушаю предложения и пожелания. Если успею, добавлю в обновление ваши просьбы.

 

 

 

Edited by trezona (see edit history)

Share this post


Link to post
Share on other sites

trezona Имхо, Все что Вы делаете - пустая трата времени

Никто не будет разбираться в Вашем API пока не будет нормально оформленной доки, хотя мне кажется, что даж если она и будет, никто не станет использовать подобное.

 

API поверх API... Странное решение

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

BorizzK все может быть. Посмотри Steam обсуждения. Документация в таком виде подойдет? Но для меня довольно очень полезное, которая позволяет избежать сотни тысяч строк в модах. А заниматься сразу логикой мода, не создавая все связи между собой. Т.к ScriptInvoker - пробовал, совсем не то.. Сырое очень, что лучше работает мой event или ScriptInvoker не знаю. Судить не мне. Ну по краней мере event модифицируем как пожелает душа.

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

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

 

Я поступлю следующим образом. Если как ты сказал что ни кому не нужно то что я делаю.

Тогда пожалуй оставлю эту тему в таком виде в каком она сейчас.

 

Edited by trezona (see edit history)

Share this post


Link to post
Share on other sites

trezona Я точно предпочту писать напрямую не используя никакие другие моды/прокладки и тп

 

 

Share this post


Link to post
Share on other sites

trezona Ну во первых ты бы изменил название, чтобы людей не путать, т.к. это не апи, а обертка - фреймворк. И к своем фреймворку ты уже даешь апи. Но исключительно твое, а не стандалоновское вдруг..

Share this post


Link to post
Share on other sites

Контент в мастерской закрыли, из за жалоб на контент.

Не понимаю кому я мешаю своим контентом..

 

Но не суть.

Новая страница: https://steamcommunity.com/sharedfiles/filedetails/?id=1839439370

И новое название: APIWrapper

 

А письмо в поддержку отправил для выяснения ситуации с предыдущей страницей.

Edited by trezona (see edit history)

Share this post


Link to post
Share on other sites

trezona Изменил название темы и ссылку на актуальную версию по просьбе автора

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.