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

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

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

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

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

Странности с Identity или я туплю?

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

Реши сначала на клиенте чат отмоддидь, но потом обнаружил что Даон в VPP своей это уже сделал и мне остается только отмоддидь одну его функцию на стороне сервера, что я и сделал

 

Посмотрел

 

На клиенте моддинг строки чата с перехватом 5_Mission\GUI
ChatInputMenu.c

modded class ChatInputMenu
{
	override bool OnChange(Widget w, int x, int y, bool finished)
	{
		if (!finished) return false;
		
		string text = m_edit_box.GetText();
		if (text != "" && (text.Substring(0,1)) == "/")
		{
			GetRPCManager().SendRPC( "RPC_MissionServer", "HandleChatCommand", new Param1<string>(text), true);
			m_close_timer.Run(0.1, this, "Close"); //Exit out as we don't want to send commands in chat for others to see.
			return true;
		}
		
		return super.OnChange(w, x, y, finished);
	}
};

если строка начинается на / то через RPC засылаем на сервер RPC передавая ей текст и завершаем функцию

ну а если не на / вызываем нативную функцию

 

На сервере в классе MissionServer зареген RPC "RPC_MissionServer" (используя функционал мода CF)

	void MissionServer()
	{
		GetRPCManager().AddRPC( "RPC_MissionServer", "RequestLockServer", this, SingeplayerExecutionType.Server );
		
		m_DEXML = new DEXML;
		
		//=============RPC's====================
		GetRPCManager().AddRPC( "RPC_ReadFromXML", "GetTypesXML", this, SingeplayerExecutionType.Server );	
		GetRPCManager().AddRPC( "RPC_MissionServer", "HandleChatCommand", this, SingeplayerExecutionType.Server );		
		//======================================
	}

Сервер получая RPC "RPC_MissionServer"   вызывает из этого класса функцию HandleChatCommand (собственно так же используется функционал мода CF)
Как и что вдаваться в подробности смысла нет

Вот собственно она

 

	void HandleChatCommand( CallType type, ParamsReadContext ctx, PlayerIdentity sender, Object target)
	{
		Param1<string> data; //chat string
        if ( !ctx.Read( data ) ) return;

        if (type == CallType.Server)
        {
			GetChatCommandManager().ParseCommand(data.param1,sender.GetPlainId());
		}
	}

Ну а нам осталось только перехватить то что прилетает в эту функцию и забрать себе

 

	override void HandleChatCommand(CallType type, ParamsReadContext ctx, PlayerIdentity sender, Object target)
	{
		Param1<string> data; //chat string
        if (!ctx.Read(data)) return;
        if (type == CallType.Server && sender && data.param1)
        {
			
			AdminMod.OnAdminChatRequestVPP(sender, data.param1);
			return;
		}
	}

Все получили, все прилетело улетело куда надо

 

Но!

 

нам в нашей одминке нужно получить перса отправителя

Попытка сделать это так:

 

class AdminMod
{
	void OnAdminChatRequestVPP(Playeridentity sender, string command)
    {
        PlayerBase player = GetAdminPlayerByIdentity(sender);
        if (player)
        {
        	AdminCommand(player, command);
        }
    }      
      
	PlayerBase GetAdminPlayerByIdentity(PlayerIdentity sender)
	{
		array<Man> players = new array<Man>;
		GetGame().GetPlayers(players);
		for ( int i = 0; i < players.Count(); ++i )
		{
			if (players[i].GetIdentity() == sender && IsAdmin(sender))
			{
				return PlayerBase.Cast(players[i]);
			}
		}
		return NULL;
	}

    bool IsAdmin(PlayerIdentity sender)
	{
		if (m_AdminsList.Contains(sender.GetPlainId()))
		{
			return true;
		}
		return false;
	}
  
  	AdminCommand(PlayerBase player, string command);
  	{
     //тут обрабочик и тп
    }
  
}

 

Почти все норм
Но условие
if (players.GetIdentity() == sender)

НИКОГДА НЕ РАБОТАЕТ

ВООБЩЕ

 

по итогам логгирования выяснил что у одного и того же клиента players.GetIdentity() != sender - хотя в sender прилетает как бы Identity

Сделал проверку так

	PlayerBase GetAdminPlayerByIdentity(PlayerIdentity sender)
	{
		array<Man> players = new array<Man>;
		GetGame().GetPlayers(players);
		for ( int i = 0; i < players.Count(); ++i )
		{
			if (players[i].GetIdentity().GetPlainId() == sender.GetPlainId() && IsAdmin(sender))
			{
				return PlayerBase.Cast(players[i]);
			}
		}
		return NULL;
	}

И все взлетело!

 

НО!
Как?

Два разных Identity  и функция GetPlainId() возвращает одинаковые steam UID

 

Вот как я Вас спрашиваю?

Или это CF гадит...

 

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

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


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

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

  • 0

BorizzK по опыту копания на проекте, с которого ушел на прошлой неделе по своим определенным причинам, скажу так - попробуй провернуть эту связку без всяких CF и прочих модов, даже не на чате а тупо на банальной отправке в лог игры хотя бы. И сравни идентификаторы там и там тупо.
Я обычно когда такие описки в коде на сервере игры делал, обычно искал не по самому identify а по Identity.GetId() или Identity.GetPlainId() и мне этого за глаза хватало обычно, т.к. на сервере ну редко когда игрок может быть с тем же идентификатором далеко не один (из смешного - его стим на сервер не пустит, 2-го с тем же id. А игровой Game ID BiS и GUID Battleye в конечном итоге напрямую от steam64id зависят, который в свою очередь от стим библиотек и аккаунта стим зависит)

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


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





  • 0

123new как ты проверишь без мода? нужно моддидь чат и слать его через рпц на сервер

старый чать админский теперь через OnEvent НЕ ПЕРЕХВАТЫВАЕТСЯ - тк НЕ РАБОТАЕТ - бегемоты все сломали

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


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

BorizzK Я хз через что ты там все это делаешь, - есть стандартный плайерИмплемент, и там прекрасно расписано OnRPC и все ок. И с командами чата который с клиента летит и т.д. и т.п.

P.S.не пользуюсь ни фреймворками ничем иным, - только свои скрипты и моддинг самого дайза.

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


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

NoNameUltima это понятно

я тож так сделаю

но эт был самый короткий путь на тут момент

но тут вот такая свисто-пля-пляска (((

что за хня - я ума не приложу

 

ЗЫ Дал бы примерчик - ибо я чет как-то все не доберусь до RPC в чистом виде

пользую CF - но походу все глюки из-за него

то ли переменные долго не живут

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

 

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


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

NoNameUltima 

обнаружил

что

если сначала PlayerIdentity identity = sender;

то как бы вроде бы все нормально

а sender после такого может поменять свое значение или стать вообще пустым

 

	override void HandleChatCommand(CallType type, ParamsReadContext ctx, PlayerIdentity sender, Object target)
	{
		Param1<string> data; //chat string
        if (!ctx.Read(data)) return;
        if (type == CallType.Server && sender && data.param1)
        {
			PlayerIdentity identity = sender;
			AdminMod.OnAdminChatRequestVPP(identity, data.param1);
			return;
		}
	}

потом переделал под получение UID и засылку UID вместо identity - так работает ровно

 

кстати проблема описана на фидбеке бисов - если передавать значение identity в функцию и потом с этой переменной манипулировать - могут быть проблемы

походу косяк движка очередной

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

 

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


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

BorizzK 

Двоятся ники, потому что какой то мудозвон, в Дайзе криворукий не корректно написал скрипт синхрона для игры, - ты открой его и глянь, там второкласник походу писал, это такой лютый 3.14здец, что нет слов... В игру- клиентам передаются Ник+ЮИД. Но каким образом - там просто ЖЕСТЬ! Именно из-за этого гавна я в свое время написал свой класс и передачу и синхрон в админку(а позже и в клиент ибо в банке надо).

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

А само идентити лично у меня работает корректно и прекрасно.

P.S. но скрипт открой и глянь. Ваще желание было ВЫЛОЖИТЬ его как есть на форуме дайза и спросить - КТО ЭТО ДЕЛАЛ?

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


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

NoNameUltima Гляну
Кстати местами смотрю и вижу лютый ад

Ребята мои (системщики) смотрели двигло - разбирали - особенно как оно в сети пашет (смотрели со сниффингом и прочими пристрастиями)

Тож офигевали

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


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

123new как ты проверишь без мода? нужно моддидь чат и слать его через рпц на сервер

старый чать админский теперь через OnEvent НЕ ПЕРЕХВАТЫВАЕТСЯ - тк НЕ РАБОТАЕТ - бегемоты все сломали

да хоть банально через OnPressKey, разумеется в виде временного клиентского мода для проверки. Мы ж не на активный сервер это ставим а так, чисто для проверки и изучения игры. Так что заморочиться можно. А далее через RPC и OnRPC как и сказал ультима. Да, там несколько специфично сделано, но разобраться можно думаю. Плюс в модах покопайся, где-то наверняка это уже сделано.

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


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

123new ну вот на днях накатаю свой вариант чатки и через него попробую

У меня одна сложность - с графикой, layouts  итп

В упор не врубаюсь

Ну и как тестить - среды разработки же нет

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


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

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

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

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

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

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

Войти

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

Войти сейчас

  • Похожие публикации

    • Автор: Miduznya
      Всем привет, чет не нашел не где как можно в ручную обновить через .bat или .cmd файл
      если есть у кого такой поделитесь плиз. Прошу сильно не пинать если есть такая тема дайте ссылку
    • Автор: NoNameUltima
      Есть идейка накатать приложение(в основном под android), с помощью которого игрок Вашего сервера сможет читать, и писать в игровой чат.
      Вход по UID + пароль.(таблица с UID+пасс, хранится в SQL БД).
      Пароли можно выдавать через ВК, или накидать скрипт который будет позволять их создавать в игре.
       
      Как в целом идея?)
    • Автор: MrMiBl
      Возник вопрос: как запустить выделенный сервер имея только mpmission? Хочу запустить серв кооп миссии Antistasi altis 
      Вот сам файл миссии скачать архив
      Описание и установка:
      Вообщем помощь нужна в написание батника, или чё там сделать надо....
    • Автор: Sovest2
      Никак не могу избавиться от снятия с трупа бота бесконечного количества денег(Если спрятать его и дождаться пока он пропадет),которое отображается как "any".
      Проблему пытаюсь исправить в check_wallet.sqf
      Вот такой вот текст у меня в check_wallet.sqf
      private ["_body", "_hisMoney", "_myMoney"]; _body = _this select 3; _PlayerNear = _body call dze_isnearest_player; if (_PlayerNear ) exitWith {cutText [localize "str_pickup_limit_4", "PLAIN DOWN"]}; _name = _body getVariable ["bodyName","Неизвестный"]; _hisMoney = _body getVariable ["cashMoney",0]; diag_log format["_name = %1 , _hisMoney = %2 , _body = %3",_name,_hisMoney,_body]; if( (isNull _body) || (_name == "<NULL-object>") || (_name == "<null>")) exitWith {cutText ["Вы не можете снять деньги с этого трупа,попробуйте еще раз", "PLAIN DOWN"]}; _myMoney = player getVariable ["cashMoney",0]; _myMoney = _myMoney + _hisMoney; _body setVariable ["cashMoney", 0 , true]; player setVariable ["cashMoney", _myMoney , true]; systemChat format ['Вы забрали %1 монет с %2 !',_hisMoney,_name]; Условие  
      _name = "<null>" Пропускает значение  _name = <null>
       
      Код в fn_selfActions.sqf
      // Study Body if (_player_studybody && !_clothesTaken) then { if (s_player_studybody < 0) then { // --------ZUPA - Check Wallet -------- s_player_studybody = player addAction [("<t color=""#FF0000"">"+("Проверить кошелек") + "</t>"), "custom\singlecurrency\actions\check_wallet.sqf",_cursorTarget, 0, false, true, "",""]; // ---- ZUPA END --- }; if((s_player_clothes < 0)) then { s_player_clothes = player addAction [("<t color='#0096ff'>")+("Снять одежду")+("</t>"), "custom\take_clothes\take_clothes.sqf",cursorTarget, -10, false, true]; }; } else { player removeAction s_player_studybody; s_player_studybody = -1; player removeAction s_player_clothes; s_player_clothes = -1; };  
  • Наш выбор

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

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

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