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
BorizzK

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

Recommended Posts

Суть такова

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

 

Это нативная функция в двигле (сторона 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 литров пива пишется хорошо, но чем больше количество символов, тем меньше хочется писать и больше хочется продолжить банкет

 

Всем удачи!

 



 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites



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

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

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

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

Share this post


Link to post
Share on other sites
19.06.2021 в 19:26, Plut сказал:

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

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites


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

Edited by DedForester (see edit history)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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); //рекурсивно скрывает/раскрывает аттачменты(и аттачсменты аттачментов) которые находятся в указанных слотах (
    }
}

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

Share this post


Link to post
Share on other sites

 

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

Edited by Eternal (see edit history)

Share this post


Link to post
Share on other sites

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

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

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

 

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
Только что, BorizzK сказал:

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

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

 

Share this post


Link to post
Share on other sites
4 минуты назад, Eternal сказал:

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

 

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

super.PlayerBase();

 

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

 

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
2 минуты назад, BorizzK сказал:

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

super.PlayerBase();

 

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

смотри PlayerBase

 

функции

 

OnConnect

EEItemAttached

 

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

 

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

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

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

 

 

Edited by BorizzK (see edit history)

Share this post


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

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

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

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites

@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); //рекурсивно скрывает/раскрывает аттачменты(и аттачсменты аттачментов) которые находятся в указанных слотах (
	}
}


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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
21.06.2021 в 07:48, NeonMurdered сказал:

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

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

Share this post


Link to post
Share on other sites
44 минуты назад, Славик сказал:

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

Да, в любом.

Share this post


Link to post
Share on other sites
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. Ты меня прям очень выручил Спасибо

Edited by Eternal (see edit history)

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.