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

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

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

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

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

Сокрытие аттачментов игрока при посадке в тачку и раскрытие при выходе

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

Суть такова

Когда "ванильно" садишься в машину рюкзак прет сквозь спинку сиденья, оружие может торчать сквозь крышу - разработчики просто не позаботились об этих нюансах, но предусмотрели функционал для решения этих "проблем"

 

Это нативная функция в двигле (сторона C++) SetInvisible

И штатная функция в скриптах игры SetInvisibleRecursive в классе EntityAI (базовый для всех сущностей игры) (которая юзает SetInvisible) + юзает рекурсивно саму себя, что бы скрыть/показать аттачменты аттачметнтов

Я просто покажу как сделать скрытие того, что находится в слотах игрока когда он садится в тачку и показать когда он вылезает из нее

Слоты имеют индексы (номера)
На стороне скриптов определяются они (для простоты программирования) через класс InventorySlots (inventoryslots.c) - это нативный класс в двигле игры (обьявленный на стороне скриптов, что бы иметь к нему доступ) (кстати есть еще классы

в двигле которые не обьявлены бисами на стороне скриптов, но которые можно обьявить самому и получить доступ к чудесатому функционалу - нужно ковырять экзешник и эксперементировать)

Так вот... не буду тянуть кота за его и без того оттянутые бисами ойца... собственно код
 

modded class PlayerBase extends ManBase
{
	protected ref array<int> hideAttachmentsSlotsArray 	= new array<int>;
	protected bool m_AttachmentsHide 					= false;
	protected bool m_AttachmentsHidden 					= false;
	
	void PlayerBase()
	{
		hideAttachmentsSlotsArray.Insert(InventorySlots.MELEE);
		hideAttachmentsSlotsArray.Insert(InventorySlots.BACK);
		hideAttachmentsSlotsArray.Insert(InventorySlots.SHOULDER);
	}
	
	void Init()
	{
		super.Init();
		RegisterNetSyncVariableBool("m_AttachmentsHide");
	}
	
	override void OnCommandVehicleStart()
	{
		m_AttachmentsHide = true;
		#ifdef SERVER
		SetSynchDirty();
		#endif
		Print("::: ["+this+"]: OnCommandVehicleStart: m_AttachmentsHide: " + m_AttachmentsHide);
		super.OnCommandVehicleStart();
	}

	override void OnCommandVehicleFinish()
	{
		m_AttachmentsHide = false;
		Print("::: ["+this+"]: OnCommandVehicleFinish: m_AttachmentsHide: " + m_AttachmentsHide);
		super.OnCommandVehicleFinish();
	}

	void HideAttachments(bool hiddenstate)
	{
		SetInvisibleRecursive(hiddenstate,this,hideAttachmentsSlotsArray);
	}
	
	override void OnVariablesSynchronized()
	{
		super.OnVariablesSynchronized();
		
		if (m_AttachmentsHide != m_AttachmentsHidden)
		{
			m_AttachmentsHidden = m_AttachmentsHide;
			HideAttachments(m_AttachmentsHide);
		}
	}
}

 

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

 

вобщем как-то так

P.S. Сорян - после почти 10 литров пива пишется хорошо, но чем больше количество символов, тем меньше хочется писать и больше хочется продолжить банкет

 

Всем удачи!

 



 

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

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


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





В общем.. Обозвал скрипт inventoryslots.c, подключил его в моем серверном 4_World(4_World подключен, скрипты работают там) и ничего не работает... Пулеметы с рюками, как торчали так и торчат.  

Проверил логи, ничего не уросит. 

Для подстраховки, нашел функции PlayerBase.c в dta\scripts\4_World\Entities\ManBase\PlayerBase.c, ну это такое, убедиться что в 4 надо разместить. 

Пива у меня, правда, 2 литра.... Может в этом дело? 

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


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

В общем.. Обозвал скрипт inventoryslots.c, подключил его в моем серверном 4_World(4_World подключен, скрипты работают там) и ничего не работает... Пулеметы с рюками, как торчали так и торчат.  

Проверил логи, ничего не уросит. 

Для подстраховки, нашел функции PlayerBase.c в dta\scripts\4_World\Entities\ManBase\PlayerBase.c, ну это такое, убедиться что в 4 надо разместить. 

Пива у меня, правда, 2 литра.... Может в этом дело? 

ЭТО  КЛИЕНТ-СЕРВЕРНЫЙ

 

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


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

Информативно, но ничего не понятно )). Я так понял что скрипт как угодно можно назвать? А в PBO что должно лежать? Какие названия папок делать?

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


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

@Славик возьми конфиг с этого гайда 

 

И кидай скрипт в 4_World

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


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

Добрый вечер!!
Большое спасибо. Готов на бутылочку пива кнуть!!)))
Все ОК!!
С уважением,

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


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


Дополнительно прописал еще головной убор - hideAttachmentsSlotsArray.Insert(InventorySlots.HEADGEAR);
Теперь и ПНВ не торчит. При этом ПНВ работает нормально.

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

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


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

А есть условие срабатывания из разряда просто потому что? Нужно на постоянку скрыть содержимое слота

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


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

А есть условие срабатывания из разряда просто потому что? Нужно на постоянку скрыть содержимое слота

 

modded class PlayerBase extends ManBase
{
    protected ref array<int> hideAttachmentsSlotsArray = new array<int>; // массив в классе который будет содержать номерки слотов для сокрытия
    
    void PlayerBase() //лучше заполнять их один раз, можно прям в классе, но мне больше нравится делать это в конструкторе
    {
        hideAttachmentsSlotsArray.Insert(InventorySlots.MELEE); //InventorySlots.MELEE номер слота...
        hideAttachmentsSlotsArray.Insert(InventorySlots.BACK);
        hideAttachmentsSlotsArray.Insert(InventorySlots.SHOULDER);
        
        super.PlayerBase();
        
        HideAttachments(true);
    }

    void HideAttachments(bool variable)
    {
        SetInvisibleRecursive(variable,this,hideAttachmentsSlotsArray); //рекурсивно скрывает/раскрывает аттачменты(и аттачсменты аттачментов) которые находятся в указанных слотах (
    }
}

Попробуй так...

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


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

 

27 минут назад, NeonMurdered сказал:

 


modded class PlayerBase extends ManBase
{
    protected ref array<int> hideAttachmentsSlotsArray = new array<int>; // массив в классе который будет содержать номерки слотов для сокрытия
    
    void PlayerBase() //лучше заполнять их один раз, можно прям в классе, но мне больше нравится делать это в конструкторе
    {
        hideAttachmentsSlotsArray.Insert(InventorySlots.MELEE); //InventorySlots.MELEE номер слота...
        hideAttachmentsSlotsArray.Insert(InventorySlots.BACK);
        hideAttachmentsSlotsArray.Insert(InventorySlots.SHOULDER);
        
        super.PlayerBase();
        
        HideAttachments(true);
    }

    void HideAttachments(bool variable)
    {
        SetInvisibleRecursive(variable,this,hideAttachmentsSlotsArray); //рекурсивно скрывает/раскрывает аттачменты(и аттачсменты аттачментов) которые находятся в указанных слотах (
    }
}

Попробуй так...

Увы, но нет 

 

image.png.16efdf01ecbd0e035b052a0fa98167c1.png

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

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


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

Этож надо догадаться super вызов запихнуть в конструктор ))))))))))))))))))))

Конструктор класса - это одноименная классу функция которая выполняется в момент его создания

в каждом "моде" если класс моддится и есть конструктор то его код просто добавляется к исходной функции

 

ЗЫ в исходнике super не было

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

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


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

Этож надо догадаться super вызов запихнуть в конструктор ))))))))))))))))))))

А не подскажешь как правильно? Я к скриптам только начал прикасаться

 

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


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

А не подскажешь как правильно? Я к скриптам только начал прикасаться

 

Что-то не ясно в первом посте??? Откуда взялся вызов super в твоем коде?

super.PlayerBase();

 

Если уж хотите что-то там программировать - изучайте основы

 

P.S. Файлов с modded PlayerBase блаблабла в моде может быть не один - не надо все пихать в один файл - компилятор сам разберется и разложит

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

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


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

Что-то не ясно в первом посте??? Откуда взялся вызов super в твоем коде?

super.PlayerBase();

 

Если уж хотите что-то там программировать - изучайте основы

 

P.S. Файлов с modded PlayerBase блаблабла в моде может быть не один - не надо все пихать в один файл - компилятор сам разберется и разложит

Про кол-во файлов мне понятно, но мне нужно условие срабатывания, в твоем коде это OnCommandVehicleStart, а мне нужно что бы слот был скрыт всегда

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


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

Тут речь о сел в машину вышел из машины

Хочешь скрывать всегда

смотри PlayerBase

 

функции

 

OnConnect

EEItemAttached

 

PS Вот в них в начале нужен вызов super

 

Хотите что бы показал подробно и научил

Мое время в реале стоит $40 час

Остальное время стоит $60час

 

 

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

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


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

Мое время в реале стоит $40 час

Остальное время стоит $60час

Держи нас в курсе.

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


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

Держи нас в курсе.

Держать нечего,  час спеца может стоить 4к и 5к 

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

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


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

Сори, не бог коддинга, выкинул лишь догадку)

@BorizzK

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


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

@Eternal @BorizzK

 

modded class PlayerBase extends ManBase
{
	protected ref array<int> hideAttachmentsSlotsArray = new array<int>; // массив в классе который будет содержать номерки слотов для сокрытия
	
	void PlayerBase()
	{
		hideAttachmentsSlotsArray.Insert(InventorySlots.MELEE); //InventorySlots.MELEE номер слота...
		hideAttachmentsSlotsArray.Insert(InventorySlots.BACK);
		hideAttachmentsSlotsArray.Insert(InventorySlots.SHOULDER);
	}
	
	void OnConnect()
	{
		super.OnConnect();
	}
	
	override void EEItemAttached(EntityAI item, string slot_name)
	{
		super.EEItemAttached(item, slot_name);
		HideAttachments(true);
	}

	void HideAttachments(bool variable)
	{
		SetInvisibleRecursive(variable,this,hideAttachmentsSlotsArray); //рекурсивно скрывает/раскрывает аттачменты(и аттачсменты аттачментов) которые находятся в указанных слотах (
	}
}


Готово, в этот раз всё работает)). Скрывает указанные в конструкторе аттачменты на персонаже.
 

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


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

Конечно можно заморочиться и сделать под определённые класснеймы скрытие, но как сказал многоуважаемый @BorizzK Время - Деньги😀

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


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

И кидай скрипт в 4_World

Всё ок, всё работает. В любом PBO должен лежать конфиг как я понял. 

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


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

Всё ок, всё работает. В любом PBO должен лежать конфиг как я понял. 

Да, в любом.

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


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

@Eternal @BorizzK


modded class PlayerBase extends ManBase
{
	protected ref array<int> hideAttachmentsSlotsArray = new array<int>; // массив в классе который будет содержать номерки слотов для сокрытия
	
	void PlayerBase()
	{
		hideAttachmentsSlotsArray.Insert(InventorySlots.MELEE); //InventorySlots.MELEE номер слота...
		hideAttachmentsSlotsArray.Insert(InventorySlots.BACK);
		hideAttachmentsSlotsArray.Insert(InventorySlots.SHOULDER);
	}
	
	void OnConnect()
	{
		super.OnConnect();
	}
	
	override void EEItemAttached(EntityAI item, string slot_name)
	{
		super.EEItemAttached(item, slot_name);
		HideAttachments(true);
	}

	void HideAttachments(bool variable)
	{
		SetInvisibleRecursive(variable,this,hideAttachmentsSlotsArray); //рекурсивно скрывает/раскрывает аттачменты(и аттачсменты аттачментов) которые находятся в указанных слотах (
	}
}


Готово, в этот раз всё работает)). Скрывает указанные в конструкторе аттачменты на персонаже.
 

Чувак, ты прям гребаный волшебник, до блока override void EEItemAttached(EntityAI item, string slot_name) я и сам допер, но использовал его без блока void OnConnect() и компилятор выдавал ошибку, а посколько компилятор крайне не многословен приходилось перебирать варианты. А так уже были потуги с класснеймами на основе скриптов из MassMany Item overhaul. Ты меня прям очень выручил Спасибо

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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