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
  • 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 гадит...

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

10 answers to this question

Recommended Posts

  • 0

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

Share this post


Link to post
Share on other sites









  • 0

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 0

NoNameUltima это понятно

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

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

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

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

 

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

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

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

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

 

Share this post


Link to post
Share on other sites
  • 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 в функцию и потом с этой переменной манипулировать - могут быть проблемы

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

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

 

Share this post


Link to post
Share on other sites
  • 0

BorizzK 

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

Share this post


Link to post
Share on other sites
  • 0
16 часов назад, BorizzK сказал:

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

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

  • Similar Content

    • By Miduznya
      Всем привет, чет не нашел не где как можно в ручную обновить через .bat или .cmd файл
      если есть у кого такой поделитесь плиз. Прошу сильно не пинать если есть такая тема дайте ссылку
    • By NoNameUltima
      Есть идейка накатать приложение(в основном под android), с помощью которого игрок Вашего сервера сможет читать, и писать в игровой чат.
      Вход по UID + пароль.(таблица с UID+пасс, хранится в SQL БД).
      Пароли можно выдавать через ВК, или накидать скрипт который будет позволять их создавать в игре.
       
      Как в целом идея?)
    • By MrMiBl
      Возник вопрос: как запустить выделенный сервер имея только mpmission? Хочу запустить серв кооп миссии Antistasi altis 
      Вот сам файл миссии скачать архив
      Описание и установка:
      Вообщем помощь нужна в написание батника, или чё там сделать надо....
    • By 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; };  
  • Our picks

×
×
  • 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.