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

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

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

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

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

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

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

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

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

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

 

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

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

 

Примечание:

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

 

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

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

 

Скриншоты:

 

чуть позже

 

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

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


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





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

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


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

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

 

 

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

 

 

 

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

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

 

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

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

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

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

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

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


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

Маркеры

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

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

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


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

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

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

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

Маркеры

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

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

 

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

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

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


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

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

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

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


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

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

 

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

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

 

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
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();

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

 

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


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

123

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

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

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

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

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

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

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

 

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

 

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

 

 

 

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

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


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

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

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

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 что и где отправлять и ловить?

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


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

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

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

	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 и вот всё непонятное выше.

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


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

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

 

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()) и чтобы все игроки это могли получать по курсору.

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


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

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

 

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

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


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

Миша, запросы идут от клиента на сервер и от сервера на клиент, для этого используется 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 запросы клиент-сервер, но не быстро (свои дела + жара)

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

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


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

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

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

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

 

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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