Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Нужна помощь?

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

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • Не хотите БАН?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок
  • Загляните на торговую площадку

    Там вы можете купить
    Всё что касается игровых серверов
BorizzK

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

Recommended Posts

Posted (edited)

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

 

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

 

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

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites



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

	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?

Share this post


Link to post
Share on other sites

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

Кроме того

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

 

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

 

Share this post


Link to post
Share on other sites
Posted (edited)
15 часов назад, SinSin сказал:

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

 

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

Цитата

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

{

      Object obj;

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

      obj.SetOrientation( orientation );

}

 

Edited by mate26
Убрал мусор (see edit history)

Share this post


Link to post
Share on other sites
Posted (edited)

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

 

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

Edited by mate26 (see edit history)

Share this post


Link to post
Share on other sites
Posted (edited)

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

Edited by mate26 (see edit history)

Share this post


Link to post
Share on other sites
09.07.2020 в 07:13, mate26 сказал:

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

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

Share this post


Link to post
Share on other sites
Posted (edited)

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

 

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

 

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

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

Edited by SinSin (see edit history)

Share this post


Link to post
Share on other sites

Просто

Переменная orientation

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

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

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

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

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

 

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

Share this post


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

Просто

Переменная orientation

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

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites
Posted (edited)
31.07.2020 в 09:19, SinSin сказал:

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

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

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

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

obj.SetOrientation("45 0 0");

Или

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

Да как и с SetPosition

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

Share this post


Link to post
Share on other sites
31.07.2020 в 08:01, BorizzK сказал:

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

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

Share this post


Link to post
Share on other sites
01.08.2020 в 22:11, SinSin сказал:

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

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

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

×
×
  • 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.