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
DZR_Михаил

Цена договорная / Показать имя игрока и имя трупа игрока

Recommended Posts

Название: Показать имя игрока и имя трупа игрока

(рабочее название DZR_IDz)

Цена: Не представляю, какие цены. Допустим 1000 🙂 И у меня уже есть заготовки и интерфейса и скриптов, только не могу достать имя из трупа.

 

Функционал и особенности:

По функционалу скрипт повторяет мод Check Identity. Только выводить имя нужно не в плашке действия, а в определённом радиусе под курсором. И не по F вплотную, а по другой клавише в режиме ON\OFF.

 

Примечание:

Мод будет залит на публичный Git и опубликован в стим. Им будут пользоваться все желающие. Мод как бы "уходит сообществу".

 

Алгоритм такой

  1. Начинает работу скрипт по нажатию клавиши (например P англ.)
  2. Под курсором заготовлен текстовый виджет.
  3. Если по центру экрана (на курсоре) никого нет, в тексте -, прочерк, 0, или пусто
  4. Если по центру экрана есть игрок или его труп, показываем его имя через 2 секунды.
  5. Если дистанция до объекта больше 20 метров, ничего не показываем как в п.3
  6. В любой момент нажатием клавиши P всё это скрывается. Скрипт останавливается.

 

Скриншоты:

 

чуть позже

 

Контакты: пишите сюда в личку, потом продолжим в ВК (чуть удобнее мне там)

Share this post


Link to post
Share on other sites



а показ я так понял по кд? или единоразово с пропаданием текста?

Share this post


Link to post
Share on other sites

Тема не редактируется. Скину так.

 

 

Надписи No Player, Out of Range, и дистанция просто для дебага. В чистовие их не будет.

 

 

 

1 час назад, 123new сказал:

а показ я так понял по кд? или единоразово с пропаданием текста?

 

Нажали P и оно всё время работает (на демке в чате видно).

Нажали P ещё раз, курсор пропал, ничего не показывается.

Обновляется раз в 2 секунды.

При определении имени имя появляется через 2 секунды, не сразу.

Edited by DZR_Михаил (see edit history)

Share this post


Link to post
Share on other sites

Маркеры

они есть бесплатно в стиме - неск вариаций

под кнопку там можно доработать

Share this post


Link to post
Share on other sites

Вот текущее состояние. Перелопаченный Check Identity как на видео.

https://gitlab.com/dayz-russia/dzr-idz

3 минуты назад, BorizzK сказал:

Маркеры

они есть бесплатно в стиме - неск вариаций

под кнопку там можно доработать

 

Нужен не маркер, а просто текст под курсором, когда смотришь на игрока или труп. И получить имя игрока не проблема, identity и getName. Проблема получить имя трупа. Мучаюсь уже больше недели. Мозгов не хватает.

Edited by DZR_Михаил (see edit history)

Share this post


Link to post
Share on other sites
1 час назад, DZR_Михаил сказал:

Проблема получить имя трупа. Мучаюсь уже больше недели. Мозгов не хватает.

от трупа так  элемент Object или EntityAI  GetType() выдаст тип (id) трупа (класснейм по старинке), GetName() выдаст имя, заданное скину игрока в конфигах

Share this post


Link to post
Share on other sites
20 минут назад, 123new сказал:

от трупа так  элемент Object или EntityAI  GetType() выдаст тип (id) трупа (класснейм по старинке), GetName() выдаст имя, заданное скину игрока в конфигах

 

Попробую осмыслить 🙂 Но Get Identity моду пришлось что-то там мухлевать через RPC и добавлять имя в класс PlayeBase.c, чтобы в момент проверки трупа имя "прошлого" игрока вылезло.

У меня ощущение, что труп вообще тупо не хранит имя игрока. Там всё как буд-то вычищается. 

 

"EntityAI  GetType() выдаст тип (id)"

Не очень понимаю... Мы нужно зарейкастить на труп, собрать с луча объект, опознать его как EntityAI а потом собрать с него GetName?

Share this post


Link to post
Share on other sites
27 минут назад, DZR_Михаил сказал:

Попробую осмыслить 🙂 Но Get Identity моду пришлось что-то там мухлевать через RPC и добавлять имя в класс PlayeBase.c, чтобы в момент проверки трупа имя "прошлого" игрока вылезло.

У меня ощущение, что труп вообще тупо не хранит имя игрока. Там всё как буд-то вычищается.

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

 

30 минут назад, DZR_Михаил сказал:

"EntityAI  GetType() выдаст тип (id)"

Не очень понимаю... Мы нужно зарейкастить на труп, собрать с луча объект, опознать его как EntityAI а потом собрать с него GetName?

угу. Определить сам труп надо.

Например:

EntityAI killed_body;

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

string type_killed_body = killes_body.GetType();

заполнит нам classname объекта трупа, проще говоря скин

а

string name_killed_body = killes_body.GetName();

заполнит нам его текстовое имя с конфига игры. Но это будет не имя игрока, а имя самого трупа (скина). Ник не хранится на трупе поумолчанию.

 

Share this post


Link to post
Share on other sites

123

Ну лементарно же

по рпц на клиента закидывать имя фамилию )))

причем 1 раз при первой синхре

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

(на сервере ловим и шлем переменные с именем и фамилией - переменные эти на сервере присваиваем 1 раз в OnCOnnect)

серв поймал рпц с клиента и отправил ему в ответ имя и фамилию

на клиенте поймали и присвоили соответствующие переменные

 

дальше дело техники

 

и неважно труп это или не труп

 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

Вот смотрите, что они сделали.

Вот та самая переменная, в которой они имя хранят.

modded class PlayerBase
{
    PlayerBase m_CheckIdentityLastTarget;

    protected string m_CharacterName;

 

Потом у них там же работа с этой переменной

    string GetCharacterName()
    {
        return m_CharacterName;
    }

    void SetCharacterName(string name)
    {
        m_CharacterName = name;
    }

Если я делаю рйекаст на труп с сет функцией, то потом гетом имя с трупа достаётся.

 

Теперь дальше начинается чёрная магия.

    override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
    {
        super.InvokeOnConnect(player, identity);

        player.SetCharacterName(identity.GetName());

 

Это они самому игроку его имя в переменную записали при коннекте. Вроде бы чуток понятно, но дальше ваще какая-то RPC сатана.

 

 override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
    {
        super.OnRPC(sender, rpc_type, ctx);

        switch (rpc_type)
        {
            case CIRPC.CHECKCHARACTERNAME:
            {
                Param1<string> nameParams;
                if (!ctx.Read(nameParams))
                    return;

                if (m_CheckIdentityLastTarget)
                    m_CheckIdentityLastTarget.SetLastUAMessage(nameParams.param1);
					
					GetGame().Chat( "[Check Identity] : "+nameParams.param1, "colorImportant" );
                break;
            }
            case CIRPC.CHECKIDENTITYCONFIG:
            {
                Param1<CIConfig> configParams;
                if (!ctx.Read(configParams))
                    return;

                m_PlayerAI = false;
                GetDayZGame().SetCheckIdentityConfig(configParams.param1);
                break;
            }
        }
    }

Даже здесь вроде бы понятно. Они записывают в Last User Action Target Message имя игрока. Поэтому в моде подходишь к трупу, жмёшь "опознать" и в результате опознания заполняется именем строка в плашке действия, как группа крови или пульс. В том же месте. И когда бы ты ни подошел к трупу после этого, у действия "Опознать" результат всегда висит с именем.

 

Я не понимаю главного, как во время действия в трупе происходит опознание. И его суть кроется где-то здесь:

 

    override void OnEndServer(ActionData action_data)
    {
        PlayerBase targetPlayer = PlayerBase.Cast(action_data.m_Target.GetObject());
        PlayerBase player = action_data.m_Player;

        if (targetPlayer.GetCharacterName() == string.Empty && targetPlayer.IsAI())
            targetPlayer.SetRandomCharacterName();

        auto data = new Param1<string>(targetPlayer.GetCharacterName());
        GetGame().RPCSingleParam(player, CIRPC.CHECKCHARACTERNAME, data, true, player.GetIdentity());
    }

Что это? Можно ли это как-то выполнить БЕЗ действия по F? Как сделать так, чтобы как только сработал EEKilled во время которого на труп прилетело бы this.SetCharacterName( <БЫВШИЙ_ИГРОК.ЕГО_ИМЯ>);?


Где-то вот тут есть момент, который я уже неделю пытаюсь понять.

9 часов назад, BorizzK сказал:

серв поймал рпц с клиента и отправил ему в ответ имя и фамилию

на клиенте поймали и присвоили соответствующие переменные

 

У меня неполные знания по RPC этому. Что откуда вызывать пока не дошло, вслепую отправлял. Удалось отправить и получить по примеру, но связать реального игрока с его трупом не нашёл где.

 @BorizzK что и где отправлять и ловить?

Share this post


Link to post
Share on other sites

Я даже пытался расковырять моды на жетоны. Там тоже есть момент, где скрипт решает, что этот труп должен получить именно этот жетон, на котором именно это имя.

Но там точно так же непонятен момент связи. Допустим вот

	override void EEKilled(Object killer)
	{
		super.EEKilled(killer);

		if (HasDogtag() && DogtagsTimeRequired())
			GetDogtag().SetKilled(true);
	}

И потом в самом классе жетона вот такое

 

	void RequestTagData()
	{
		if (IsMissionClient())
		{
			if (m_NickName && m_Birthday)
				return;

			ScriptRPC rpc = new ScriptRPC();
			rpc.Send(this, RPC_DOGTAG_DATA, true, null);
		}
	}

И вот здесь тоже интересно в Item Manager

 

modded class ItemManager
{
	override void PrepareTooltip(EntityAI item, int x = 0, int y = 0)
	{
		if (IsDragging() || !item)
			return;

		if (item.IsInherited(Dogtag_Base))
		{
			Dogtag_Base tag = Dogtag_Base.Cast(item);
			tag.RequestTagData(); // request dogtag data when hovering over item in inventory
		}

		super.PrepareTooltip(item, x, y);
	}

Вот, смотрите внимательно на эту строку:

tag.RequestTagData(); // request dogtag data when hovering over item in inventory

В комменте он пишет "запросить информацию из жетона когда на него наводишь мышку в инвентаре".

 

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

"запросить информацию из трупа когда на него наводишь курсор".

 

Но мозгов нет. Уже думал как-то сделать какой-то невидимый закрытый слот в PlayerBase и в него кидать этот жетон, потом из него вытаскивать информацию. Но решил всё-таки Check Identity раскурить. А там тоже тупик. Там всё завязано на действии по F и вот всё непонятное выше.

Share this post


Link to post
Share on other sites

Вот это я ковырял, но так и не смог ни к чему прикрутить.

 

override void EEKilled( Object killer )
	{
		Print(Object.GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " event EEKilled, player has died at STS=" + GetSimulationTimeStamp());
		
		if ( m_AdminLog )
		{
			m_AdminLog.PlayerKilled( this, killer );
		}
		
		if( GetBleedingManagerServer() ) delete GetBleedingManagerServer();

		// kill character in database
		if (GetHive())
		{
			GetHive().CharacterKill(this);
		}
	
		// disable voice communication
		GetGame().EnableVoN(this, false); 
		if( !GetGame().IsMultiplayer() || GetGame().IsClient() )
			ClientData.RemovePlayerBase( this );
		GetSymptomManager().OnPlayerKilled();
		
		if ( GetEconomyProfile() && !m_CorpseProcessing && GetGame().GetMission().InsertCorpse(this) )
		{
			m_CorpseProcessing = true;
			Print("EEKilled - processing corpse");
		}
		
		if ( GetGame().IsMultiplayer() && GetGame().IsServer() )
		{
			if (GetGame().GetMission())
			{
				GetGame().GetMission().SyncRespawnModeInfo(GetIdentity());
			}
		}
		
		super.EEKilled( killer );
	}

Я понял, что это и есть момент отвязки игрока от "куклы" и тут идёт зачистка. Я думаю, что теоретически, если вклиниться в эту функцию, то до какого-то момента полной очистки можно успеть забрать имя и накинуть на труп. Вот есть же тут вот это: InsertCorpse(this)

Нужно как-то на this накинуть setCharacterName(player....getName()) и чтобы все игроки это могли получать по курсору.

Share this post


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

Ну нагромоздили....

 

Больше громоздить нечего. Это кажется всё. Идей больше нет.

Share this post


Link to post
Share on other sites

Миша, запросы идут от клиента на сервер и от сервера на клиент, для этого используется RPC протокол в игре, OnRPC - функция принятия запроса (как сервер, так и клиент).

ScriptRPC rpc = new ScriptRPC();
			rpc.Send(this, RPC_DOGTAG_DATA, true, null);

и

GetGame().RPCSingleParam(player, CIRPC.CHECKCHARACTERNAME, data, true, player.GetIdentity());

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

Соответственно в

override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)

идет принятие отправленных данных и обработка по id  RPC запроса.

Далее уже оперирование с принятыми-переданными данными и все что нужно делается, например вывести на экран или заполнить поле визуально на экране.

Отправлять RPC запрос можно с любого места где тебе надо, например, по нажатию кнопки у игрока или по коннекту к серверу.

 

 

Если сильно надо, уверен, NoNameUltima, BorizK могут помочь сделать этот скрипт до желаемого вида за определенную копеечку. Я могу поглядеть это все, но у меня не сильно много опыта в визуалах и рейкаст, если это все в наличии, могу глянуть эти rpc запросы клиент-сервер, но не быстро (свои дела + жара)

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites

Всё получилось. Я сделал мод. Мечтал с 2014 года 🙂

Всем спасибо за помощь. Прошу любить и жаловать. Тестировали немного, но сейчас зальём на живой сервак и уже основательно всё проверим.

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

 

P.S. Тему можно закрывать или переименовать и продолжить для этого мода, на усмотрение модератора.

Edited by DZR_Михаил (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.