Пользователи, просматривающие тему (Пользователей: 0, Гостей: 0)

  1. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    452
    Симпатии:
    167
    Пол:
    Мужской
    Там как минимум при дисконнекте нужно искать в g_iAssist вышедшего игрока и обнулять.
    А вообще я полгода назад делал такой вариант:
    Код:
    #include <amxmodx>
    #include <cstrike>
    #include <hamsandwich>
    
    #if !defined MAX_PLAYERS
    const MAX_PLAYERS = 32;
    #endif
    
    #if !defined MAX_NAME_SIZE
    const MAX_NAME_SIZE = 32;
    #endif
    
    #if !defined MAX_MODELNAME_SIZE
    const MAX_MODELNAME_SIZE = 64;
    #endif
    
    #if !defined MAX_USERINFO_SIZE
    const MAX_USERINFO_SIZE = 256;
    #endif
    
    new Float:g_playerDamage[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
    
    public plugin_init() {
    	RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn_PostHook", true);
    	RegisterHam(Ham_TakeDamage, "player", "OnPlayerTakeDamage_PreHook", false);
    	
    	register_message(get_user_msgid("DeathMsg"), "OnDeathMsg_PreHook");
    	register_event("DeathMsg", "OnDeathMsg_PostHook", "a");
    	
    	state UserInfoRestore:Disabled;
    }
    
    public client_connect(playerIndex) {
    	arrayset(_:g_playerDamage[playerIndex], 0, sizeof(g_playerDamage[]));
    }
    
    public OnPlayerSpawn_PostHook(playerIndex) {
    	for (new i = 1; i <= MAX_PLAYERS; i++) {
    		g_playerDamage[i][playerIndex] = 0.0;
    	}
    }
    
    public OnPlayerTakeDamage_PreHook(playerIndex, inflictorIndex, attackerIndex, Float:damage) {
    	if (attackerIndex != playerIndex
    	 && is_user_connected(attackerIndex)
    	 && cs_get_user_team(attackerIndex) != cs_get_user_team(playerIndex))
    	{
    		g_playerDamage[attackerIndex][playerIndex] += damage;
    	}
    }
    
    public OnDeathMsg_PreHook() {
    	new killerIndex = get_msg_arg_int(1);
    	new victimIndex = get_msg_arg_int(2);
    	
    	if (killerIndex != victimIndex
    	 && killerIndex != 0
    	 && cs_get_user_team(killerIndex) != cs_get_user_team(victimIndex))
    	{
    		new Float:maxDamage = 0.0;
    		new bestAttacker = 0;
    		for (new i = 1; i <= MAX_PLAYERS; i++) {
    			if (g_playerDamage[i][victimIndex] > maxDamage) {
    				maxDamage = g_playerDamage[i][victimIndex];
    				bestAttacker = i;
    			}
    		}
    		
    		// Assistant must have more damage than killer
    		if (bestAttacker != killerIndex
    		 && is_user_connected(bestAttacker)
    		 && cs_get_user_team(bestAttacker) == cs_get_user_team(killerIndex))
    		{
    			state UserInfoRestore:Enabled;
    			
    			new name1[MAX_NAME_SIZE], name2[MAX_NAME_SIZE], name[MAX_NAME_SIZE];
    			get_user_name(killerIndex, name1, charsmax(name1));
    			get_user_name(bestAttacker, name2, charsmax(name2));
    			
    			// TODO: cut nicknames if big length (> 14) and add ...
    			// TODO: UTF-8 cut correctly
    			if (strlen(name1) + strlen(name2) > 28) {
    				formatex(name, charsmax(name), "%.14s + %.14s", name1, name2);
    			} else {
    				formatex(name, charsmax(name), "%s + %s", name1, name2);
    			}
    			
    			message_begin(MSG_ALL, SVC_UPDATEUSERINFO);
    			write_byte(killerIndex - 1);
    			write_long(get_user_userid(killerIndex));
    			write_char('\');
    			write_char('n');
    			write_char('a');
    			write_char('m');
    			write_char('e');
    			write_char('\');
    			write_string(name);
    			for (new i = 0; i < 16; i++) {
    				write_byte(0);
    			}
    			message_end();
    		}
    	}
    }
    
    // TODO: restore userinfo properly
    public OnDeathMsg_PostHook() <UserInfoRestore:Enabled> {
    	state UserInfoRestore:Disabled;
    	
    	new killerIndex = read_data(1);
    	
    	new name[MAX_NAME_SIZE];
    	get_user_name(killerIndex, name, charsmax(name));
    	
    	// TODO: it can be incorrect with mods
    	new modelName[MAX_MODELNAME_SIZE];
    	cs_get_user_model(killerIndex, modelName, charsmax(modelName));
    	
    	new steamid[32];
    	get_user_info(killerIndex, "*sid", steamid, charsmax(steamid));
    	
    	new hltv[2];
    	get_user_info(killerIndex, "*hltv", hltv, charsmax(hltv));
    	
    	// TODO: standart CS player models not need this
    	new bottomColor[16];
    	get_user_info(killerIndex, "bottomcolor", bottomColor, charsmax(bottomColor));
    	
    	// TODO: standart CS player models not need this
    	new topColor[16];
    	get_user_info(killerIndex, "topcolor", topColor, charsmax(topColor));
    	
    	new userInfo[MAX_USERINFO_SIZE];
    	formatex(userInfo, charsmax(userInfo),
    	         "\name\%s\model\%s\*sid\%s\*hltv\%s\bottomcolor\%s\topcolor\%s",
    	         name, modelName, steamid, hltv, bottomColor, topColor);
    	
    	message_begin(MSG_ALL, SVC_UPDATEUSERINFO);
    	write_byte(killerIndex - 1);
    	write_long(get_user_userid(killerIndex));
    	write_string(userInfo);
    	// TODO: amxx hash functions can hash only strings, but we need to hash data
    	for (new i = 0; i < 16; i++) {
    		write_byte(0);
    	}
    	message_end();
    }
    
    public OnDeathMsg_PostHook() <UserInfoRestore:Disabled> {
    }
    
    public OnDeathMsg_PostHook() <> {
    }
     
    Последнее редактирование: 13.06.16
    gudaus и Phantom нравится это.
  2. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.575
    Симпатии:
    4.655
    Пол:
    Мужской
    О_О
    --- добавлено 13.06.16 ---
    Код:
    ResetAssist(id)
    {
        g_iAssist[id] = 0;
        arrayset(_:g_fDamage[id], _:0.0, sizeof g_fDamage[]);
    }
     
  3. pUzzlik

    Регистрация:
    06.05.15
    Сообщения:
    956
    Симпатии:
    323
    Пол:
    Мужской
    @neygomon, Ну бага однозначно есть, игроки мне на сервере тоже о таком говорят когда я играю спрашивают за что им фраг прилетает если они еще никого не видели а в чат пишет что они помогли убить.
     
  4. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.575
    Симпатии:
    4.655
    Пол:
    Мужской
    @pUzzlik,
    попробуй
    Код:
    public client_disconnected(id)
        ResetAssist(id);
    >
    Код:
    public client_disconnected(id)
    {
        for(new i = 1; i <= MaxClients; i++)
        {
            if(g_iAssist[i] == id)
                g_iAssist[i] = 0;
        }
        ResetAssist(id);
    }
     
  5. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    452
    Симпатии:
    167
    Пол:
    Мужской
    Вот это я и имел в виду.
     
    gudaus нравится это.
  6. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.575
    Симпатии:
    4.655
    Пол:
    Мужской
  7. Punisher

    Регистрация:
    08.02.16
    Сообщения:
    2.830
    Симпатии:
    505
    Пол:
    Мужской
    VKcom:
    wkolopunisher
    Telegram:
    punproject
    Skype:
    punproject
    @neygomon, я себе поставил, отпишу
     
  8. Le$hiy VIP user

    Регистрация:
    13.06.15
    Сообщения:
    835
    Симпатии:
    227
    Пол:
    Мужской
    VKcom:
    leshiy_bannikoff
    Это не помогает, все равно обнуление идет некорректно. Человек меня убивает в голову, а в следующем раунде ему снова прибавляется фраг за убийство меня, в котором он даже не участвовал.
     
    pUzzlik нравится это.
  9. pUzzlik

    Регистрация:
    06.05.15
    Сообщения:
    956
    Симпатии:
    323
    Пол:
    Мужской
    Тоже самое у меня.
     
  10. Andrey777

    Регистрация:
    30.03.15
    Сообщения:
    358
    Симпатии:
    48
    Пол:
    Мужской
    Skype:
    Andrey777best
    @PRoSToC0der, Не всегда показывает помощь, и какую максимальную длину ника можно сделать что бы не обрезало?
     
  11. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.575
    Симпатии:
    4.655
    Пол:
    Мужской
    @Andrey777, там и так максимум
     
  12. ThePhoenix

    Регистрация:
    08.03.15
    Сообщения:
    1.524
    Симпатии:
    151
    Пол:
    Мужской
    Telegram:
    ThePhoenix2017
    Skype:
    the.phoenix666
    @Andrey777, может 50 урона не наносил?
     
  13. Andrey777

    Регистрация:
    30.03.15
    Сообщения:
    358
    Симпатии:
    48
    Пол:
    Мужской
    Skype:
    Andrey777best
    @ThePhoenix, Наносил точно, также стоит еще Lite Kill Assist этот в чате показывал а плагин от @PRoSToC0der, не всегда показывает asdf+erty=>tyyh
     
    ThePhoenix нравится это.
  14. Boss

    Регистрация:
    07.10.15
    Сообщения:
    486
    Симпатии:
    44
    Пол:
    Мужской
    Странно почему у меня все нормально работает?
     
  15. Andrey777

    Регистрация:
    30.03.15
    Сообщения:
    358
    Симпатии:
    48
    Пол:
    Мужской
    Skype:
    Andrey777best
    @Boss, Кинь ip в лс
     
  16. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    452
    Симпатии:
    167
    Пол:
    Мужской
    Код:
    #include <amxmodx>
    #include <cstrike>
    #include <reapi>
    
    #if !defined MAX_PLAYERS
    const MAX_PLAYERS = 32;
    #endif
    
    #if !defined MAX_NAME_SIZE
    const MAX_NAME_SIZE = 32;
    #endif
    
    //                            who's             whom
    new g_playerDamage[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
    new HookChain:g_deathNoticePostHook;
    
    public plugin_init() {
    	if (!is_regamedll() || !is_rehlds()) {
    		set_fail_state("Needs CS ReGameDLL and ReHLDS");
    	}
    	
    	RegisterHookChain(RG_CBasePlayer_Spawn, "OnPlayerSpawn_Post", true);
    	RegisterHookChain(RG_CBasePlayer_TakeDamage, "OnPlayerTakeDamage_Post", true);
    	RegisterHookChain(RG_CSGameRules_DeathNotice, "OnDeathNotice", false);
    	g_deathNoticePostHook = RegisterHookChain(RG_CSGameRules_DeathNotice, "OnDeathNotice_Post", true);
    	DisableHookChain(g_deathNoticePostHook);
    }
    
    public client_connect(playerEntIndex) {
    	arrayset(g_playerDamage[playerEntIndex], 0, sizeof(g_playerDamage[]));
    }
    
    public OnPlayerSpawn_Post(playerEntIndex) {
    	for (new i = 1; i <= MAX_PLAYERS; i++) {
    		g_playerDamage[i][playerEntIndex] = 0;
    	}
    }
    
    public OnPlayerTakeDamage_Post(playerEntIndex, inflictorEntIndex, attackerEntIndex, Float:damage, damageType) {
    	if (attackerEntIndex != playerEntIndex
    	 && is_user_connected(attackerEntIndex)
    	 && !IsTeammates(attackerEntIndex, playerEntIndex))
    	{
    		g_playerDamage[attackerEntIndex][playerEntIndex] += _:GetHookChainReturn();
    	}
    }
    
    public OnDeathNotice(victimEntIndex, killerEntIndex, inflictorEntIndex) {
    	if (killerEntIndex != victimEntIndex
    	 && is_user_connected(killerEntIndex)
    	 && !IsTeammates(killerEntIndex, victimEntIndex))
    	{
    		new maxDamage = 0;
    		new bestAttackerEntIndex = 0;
    		for (new i = 1; i <= MAX_PLAYERS; i++) {
    			if (g_playerDamage[i][victimEntIndex] > maxDamage) {
    				maxDamage = g_playerDamage[i][victimEntIndex];
    				bestAttackerEntIndex = i;
    			}
    		}
    		
    		// Assistant must have more damage than killer
    		if (bestAttackerEntIndex != killerEntIndex
    		 && is_user_connected(bestAttackerEntIndex)
    		 && IsTeammates(bestAttackerEntIndex, killerEntIndex))
    		{
    			new name1[MAX_NAME_SIZE], name2[MAX_NAME_SIZE], name[MAX_NAME_SIZE];
    			get_user_name(killerEntIndex, name1, charsmax(name1));
    			get_user_name(bestAttackerEntIndex, name2, charsmax(name2));
    			
    			// TODO: cut nicknames if big length (> 14) and add ...
    			// TODO: UTF-8 cut correctly
    			if (strlen(name1) + strlen(name2) > 28) {
    				formatex(name, charsmax(name), "%.14s + %.14s", name1, name2);
    			} else {
    				formatex(name, charsmax(name), "%s + %s", name1, name2);
    			}
    			
    			message_begin(MSG_ALL, SVC_UPDATEUSERINFO);
    			write_byte(killerEntIndex - 1);
    			write_long(get_user_userid(killerEntIndex));
    			write_char('\');
    			write_char('n');
    			write_char('a');
    			write_char('m');
    			write_char('e');
    			write_char('\');
    			write_string(name);
    			for (new i = 0; i < 16; i++) {
    				write_byte(0);
    			}
    			message_end();
    			
    			EnableHookChain(g_deathNoticePostHook);
    		}
    	}
    }
    
    public OnDeathNotice_Post(victimEntIndex, killerEntIndex, inflictorEntIndex) {
    	rh_update_user_info(killerEntIndex);
    	
    	DisableHookChain(g_deathNoticePostHook);
    }
    
    bool:IsTeammates(lhsPlayerEntIndex, rhsPlayerEntIndex) {
    	static pCvarFreeForAll = 0;
    	if (!pCvarFreeForAll) {
    		pCvarFreeForAll = get_cvar_pointer("mp_freeforall");
    	}
    	
    	return !get_pcvar_num(pCvarFreeForAll) && cs_get_user_team(lhsPlayerEntIndex) == cs_get_user_team(rhsPlayerEntIndex);
    }
     
    Последнее редактирование: 15.06.16
  17. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.575
    Симпатии:
    4.655
    Пол:
    Мужской
    @PRoSToC0der, зачем стейт?
    выключить хукчейн не торт?)
     
  18. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    452
    Симпатии:
    167
    Пол:
    Мужской
    @neygomon точняггг, поправил.
     
  19. Andrey777

    Регистрация:
    30.03.15
    Сообщения:
    358
    Симпатии:
    48
    Пол:
    Мужской
    Skype:
    Andrey777best
  20. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    452
    Симпатии:
    167
    Пол:
    Мужской
    @Andrey777 да, только пока что ReHLDS и ReAPI не обновили для новой функции, которая здесь уже используется.