Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
BorizzK

Новая (рекомендуемая функция) для создания обьектов с версии 1.08 CreateObjectEx

Рекомендованные сообщения

Размещу информацию тут, считаю ей здесь самое место

 

Синтаксис функции

 

GetGame().CreateObjectEx(string type, vector pos, int iFlags, int iRotation = RF_DEFAULT);

 

1й параметр - класснейм создаваемого объекта  - обязательный параметр

2й параметр - координаты типа vector - обязательный параметр

3й параметр - флаг - тип установки объекта - обязательный параметр (ECE)

4й параметр - флаг - тип поворота создаваемого объекта - необязательный параметр (RF)

 

Флаги можно комбинировать через знак |

 

Например ECE_SETUP | ECE_PLACE_ON_SURFACE

 

Смысл обновленной функции  - оптимизация создания обьектов в мире

Например, не нужно дополнительно, без особой необходимости сразу после создания вызывать функцию установки объекта на поверхность (PlaceOnSurface) или его поворота (SetOrientation)

или дополнительных функций генерации динамического navmesh для дополнения статического (спеченного) - добавляем флаг ECE_UPDATEPATHGRAPH  и двиг все сделает как надо

Все можно указать флагами и двиг все сделает быстро и непринужденно

 

пример вызова

 

GetGame().CreateObjectEx("Apple", Vector(5000, 20, 3000), ECE_PLACE_ON_SURFACE);
GetGame().CreateObjectEx("Zmbm_dyadyaVasya", Vector(5000, 20, 3000), ECE_SETUP | ECE_PLACE_ON_SURFACE);

 

Собственно 3 и 4й параметр можно задавать как цифрами, так и константами

 

Список констант для флагов (думаю перевести описание не проблема)

const int ECE_NONE							= 0;
	
const int ECE_SETUP							= 2;	// process full entity setup (when creating NEW entity)
const int ECE_TRACE							= 4;	// trace under entity when being placed (from the point of creation)
const int ECE_CENTER						= 8;	// use center from shape (model) for placement

const int ECE_UPDATEPATHGRAPH				= 32;	// update navmesh when object placed upon it

const int ECE_ROTATIONFLAGS					= 512;	// enable rotation flags for object placement
const int ECE_CREATEPHYSICS					= 1024;	// create collision envelope and related physics data (if object has them)
const int ECE_AIRBORNE						= 4096;	// create flying unit in the air

const int ECE_EQUIP_ATTACHMENTS				= 8192;		// equip with configured ATTACHMENTS
const int ECE_EQUIP_CARGO					= 16384;	// equip with configured CARGO
const int ECE_EQUIP							= 24576;	// equip with configured (ATTACHMENTS + CARGO)
const int ECE_EQUIP_CONTAINER				= 2097152;	// populate DE/ group CONTAINER during spawn
const int ECE_LOCAL							= 1073741824; // create object locally

const int ECE_NOSURFACEALIGN				= 262144;	// do not align object on surface/ terrain
const int ECE_KEEPHEIGHT					= 524288;	// keep height when creating object (do not use trace or placement on surface)

// note: use predefined combination when not solving something specific
//
const int ECE_IN_INVENTORY					= 787456;	// ECE_CREATEPHYSICS|ECE_KEEPHEIGHT|ECE_NOSURFACEALIGN
const int ECE_PLACE_ON_SURFACE				= 1060;		// ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH|ECE_TRACE
const int ECE_OBJECT_SWAP					= 787488;	// ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH|ECE_KEEPHEIGHT|ECE_NOSURFACEALIGN


// -------------------------------------------------------------------------
// object (RF) Rotation Flags (use to force and/ or invoke placement rotation)
//
const int	RF_NONE					= 0;

const int	RF_FRONT				= 1;	// front side placement
const int	RF_TOP					= 2;	// top side placement
const int	RF_LEFT					= 4;	// left side placement
const int	RF_RIGHT				= 8;	// right side placement
const int	RF_BACK					= 16;	// back side placement
const int	RF_BOTTOM				= 32;	// bottom side placement

const int	RF_ALL					= 63;	// RF_FRONT|RF_TOP|RF_LEFT|RF_RIGHT|RF_BACK|RF_BOTTOM

const int	RF_IGNORE				= 64;	// ignore placement RF flags - object will spawn as model was created

const int	RF_TOPBOTTOM			= 34;	// RF_TOP|RF_BOTTOM
const int	RF_LEFTRIGHT			= 12;	// RF_LEFT|RF_RIGHT
const int	RF_FRONTBACK			= 17;	// RF_FRONT|RF_BACK

const int	RF_RANDOMROT			= 64;	// allow random rotation around axis when placing
const int	RF_ORIGINAL				= 128;	// use default placement setuped on object in config
const int	RF_DECORRECTION			= 256;	// angle correction when spawning InventoryItem at Building angle
const int	RF_DEFAULT				= 512;	// use default placement setuped on object in config

 

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

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


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





Получается, привычная функция расстановки объектов карты

	void SpawnObject(string objectName, vector position, vector orientation)
	{
	    Object obj;
	    obj = Object.Cast(GetGame().CreateObject(objectName, "0 0 0"));
	    obj.SetPosition(position);
	    obj.SetOrientation(orientation);

	    // Force update collisions
	    if (obj.CanAffectPathgraph())
	    {
	        obj.SetAffectPathgraph(true, false);
	        GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(GetGame().UpdatePathgraphRegionByObject, 100, false, obj);
	    }
	}

Приобретает вид 

	void SpawnObject(string objectName, vector position, vector orientation)
	{
		Object objectName;
		GetGame().CreateObjectEx(objectName, position, ECE_SETUP | ECE_UPDATEPATHGRAPH | ECE_PLACE_ON_SURFACE, orientation);
	}

? И нужно ли добавлять флаги ECE_ROTATIONFLAGS и RF_ALL, раз используется смена ориентации объекта, или отработка вращения уже включена в ECE_SETUP?

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


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

А я еще не пробовал
Руки не дошли

Кроме того

ECE_PLACE_ON_SURFACE уже включает ECE_UPDATEPATHGRAPH
ECE_SETUP - не нужен для статик обьектов
orientation - не то - получите ошибку - ибо это vector, а в параметрах функции флаг типа int

 

Надо поиграться - посмотреть

 

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


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

Получается, привычная функция расстановки объектов карты приобретает вид 

 

Судя по тому, как сами богемы спавнят получается так:

Цитата

void SpawnObject(string objectName, vector position, vector orientation)

{

      Object obj;

      obj = GetGame().CreateObjectEx(objectName, position, ECE_PLACE_ON_SURFACE );

      obj.SetOrientation( orientation );

}

 

Изменено пользователем mate26
Убрал мусор (история изменений)

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


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

И, опять же глядя в код богемии, если надо спавнить на поверхность, то нужен флаг ECE_PLACE_ON_SURFACE, иначе ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH

 

Конечно если речь идёт только о постройках...

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

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


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

Проверил в работе, после смены ориентации у объекта всё равно надо делать UPDATE иначе зомби сквозь стены ходят

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

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


Ссылка на сообщение
Поделиться на других сайтах
09.07.2020 в 07:13, mate26 сказал:

Проверил в работе, после смены ориентации у объекта всё равно надо делать UPDATE иначе зомби сквозь стены ходят

А если просто добавить флаг ECE_UPDATEPATHGRAPH?

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


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

Возвращаемся к вопросу установки ориентации объекта.

 

При использовании конструкции

 

void SpawnObject(string objectName, vector position, vector orientation)
{
	Object obj;

	obj = GetGame().CreateObjectEx(objectName, position, ECE_PLACE_ON_SURFACE);

	obj.SetOrientation(orientation);
	// Force update collisions
	if ( obj.CanAffectPathgraph() )
	{
		obj.SetAffectPathgraph( true, false );
		GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, obj );
	}
}

 

Сервер ругается на NULL

Цитата

NULL pointer to instance
Function: 'SpawnObject'

 

с ссылкой на строку

obj.SetOrientation(orientation);

 

@BorizzK @mate26

Вопрос: каким образом правильно устанавливать ориентацию объекта? Как вообще должна выглядеть эта функция в итоге?

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

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


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

Просто

Переменная orientation

Там тож вектор

 Только не координаты, а углы

1й октет угол на плоскости

2й продольный наклон

3й поперечный

 

Кстати условие if ( obj.CanAffectPathgraph() ) и конструкция внутри после использования CreateObjectEx больше не нужна

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


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

Просто

Переменная orientation

Там тож вектор

 Только не координаты, а углы

1й октет угол на плоскости

2й продольный наклон

3й поперечный

 

Кстати условие if ( obj.CanAffectPathgraph() ) и конструкция внутри после использования CreateObjectEx больше не нужна

Понятно, но не понятно, как перевести углы в читаемый для SetOrientation формат 🙂

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


Ссылка на сообщение
Поделиться на других сайтах
31.07.2020 в 09:19, SinSin сказал:

Понятно, но не понятно, как перевести углы в читаемый для SetOrientation формат 🙂

Как как, обычные градусы

И что значит перевести углы в читаемый формат?

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

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


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

Фикировано можно так

obj.SetOrientation("45 0 0");

Или

obj.SetOrientation(Vector(45,0,0));

Да как и с SetPosition

Ток тут углы в градусах

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


Ссылка на сообщение
Поделиться на других сайтах
31.07.2020 в 08:01, BorizzK сказал:

Кстати условие if ( obj.CanAffectPathgraph() ) и конструкция внутри после использования CreateObjectEx больше не нужна

Но чуть выше сообщили, что нужна, если используется SetOrientation, поскольку зомби начинают проходить сквозь объекты

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


Ссылка на сообщение
Поделиться на других сайтах
01.08.2020 в 22:11, SinSin сказал:

Но чуть выше сообщили, что нужна, если используется SetOrientation, поскольку зомби начинают проходить сквозь объекты

У меня кстати так и не получилось сделать так, чтобы зомби не ходили сквозь стены. Зомби вообще странные существа, иногда они проходят сквозь заборы и сторожевые вышки

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


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

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

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

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

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

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

Войти

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

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.