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

  1. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.434
    Симпатии:
    4.580
    Пол:
    Мужской
    @PRoSToC0der,
    Код:
    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();
    меня прям вымораживает этот код... :D
    почему нельзя сделать нормально?))))
     
  2. pUzzlik

    Регистрация:
    06.05.15
    Сообщения:
    947
    Симпатии:
    319
    Пол:
    Мужской
    У твоему защитует фраг или просто информер? А то я что то найти не могу.
     
  3. Andrey777

    Регистрация:
    30.03.15
    Сообщения:
    321
    Симпатии:
    40
    Пол:
    Мужской
    Skype:
    Andrey777best
    @PRoSToC0der, А для hlds можешь сделать? Тот что был там не всегда показывает помошника, и чтобы ники не резал?
     
  4. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    437
    Симпатии:
    161
    Пол:
    Мужской
    @neygomon это норма, не ну если хочешь сам выноси нужную функцию из ReHLDS, токо это будет выглядеть ещё костыльнее скорее всего.
    @pUzzlik просто информёр, Ваня пусть уж сам смотрит что добавить.
    @Andrey777 это я не менял, у ассистента должно быть больше урона чем у убийцы (это в принципе не так сложно там отредачить, тому же Ване). С обрезанием ников ничего не поделать, разве что поумнее их обрезать.
     
  5. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.434
    Симпатии:
    4.580
    Пол:
    Мужской
    что?:)
     
  6. pUzzlik

    Регистрация:
    06.05.15
    Сообщения:
    947
    Симпатии:
    319
    Пол:
    Мужской
    @PRoSToC0der, Да за чем что то поправлять все норм режит, парню что то в голову взбрило.
     
  7. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    437
    Симпатии:
    161
    Пол:
    Мужской
    Ну, например, если в сумме длина превышает допустимую, но один из ников короче второго, то второй обрезать по оставшейся длине, а не по половине. Можно ещё многоточие добавлять, показывая что ник обрезан (но тогда ники ещё сильнее будут резаться).
    В общем в любом случае гауно xD будет из-за лимита.
     
  8. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.434
    Симпатии:
    4.580
    Пол:
    Мужской
    @PRoSToC0der, :D
    в итоге, проще хукнуть killed и написать в чат, что id помог id2 убить id3
     
    Последнее редактирование: 16.06.16
  9. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    437
    Симпатии:
    161
    Пол:
    Мужской
    @neygomon чат засорять как-то не айс.
     
  10. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.434
    Симпатии:
    4.580
    Пол:
    Мужской
    @PRoSToC0der, можно в HUD, как все тру поцЫки
     
  11. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    437
    Симпатии:
    161
    Пол:
    Мужской
    Поправил проверку для FFA.
    Код:
    #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, victimEntIndex)
    		 && cs_get_user_team(bestAttackerEntIndex) != CS_TEAM_SPECTATOR)
    		{
    			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);
    }
     
    mforce нравится это.
  12. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.925
    Симпатии:
    913
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    @PRoSToC0der, так, чисто для интереса вопрос: почему const, а не #define?
     
  13. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.434
    Симпатии:
    4.580
    Пол:
    Мужской
    @Phantom, тож интересно.
    примерно понимаю почему, но хочется мнение про.. =)
     
  14. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    437
    Симпатии:
    161
    Пол:
    Мужской
    @Phantom, потому что макросы изначально не предназначены для констант.
     
    Phantom нравится это.
  15. Andrey777

    Регистрация:
    30.03.15
    Сообщения:
    321
    Симпатии:
    40
    Пол:
    Мужской
    Skype:
    Andrey777best
    @neygomon, Помоги как сделать что бы показывало ассистента при нанесении урона 50 и более...
    Код:
    #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() <> {
    }
     
  16. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.434
    Симпатии:
    4.580
    Пол:
    Мужской
    @Andrey777, его и так показывает :)
     
  17. Andrey777

    Регистрация:
    30.03.15
    Сообщения:
    321
    Симпатии:
    40
    Пол:
    Мужской
    Skype:
    Andrey777best
    @neygomon, Показывает, но тут нужно нанести больше урона что бы показывало... а как сделать что бы было от 50 урона?
     
  18. neygomon Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    8.434
    Симпатии:
    4.580
    Пол:
    Мужской
    @Andrey777,
    Код:
    new bestAttacker = 0;
    for (new i = 1; i <= MAX_PLAYERS; i++) {
        if (g_playerDamage[i][victimIndex] >= 50.0) {
            bestAttacker = i;
            break
        }
    }
     
    Andrey777 нравится это.
  19. PRoSToC0der Разработчик

    Регистрация:
    22.02.16
    Сообщения:
    437
    Симпатии:
    161
    Пол:
    Мужской
    Пофиксил подсчёт урона (спасибо s1lent). (неверно понял возвращаемое значение TakeDamage)
    Код:
    #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 Float: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.0;
        }
    }
    
    public OnPlayerTakeDamage_Post(playerEntIndex, inflictorEntIndex, attackerEntIndex, Float:damage, damageType) {
        if (attackerEntIndex != playerEntIndex
         && is_user_connected(attackerEntIndex)
         && !IsTeammates(attackerEntIndex, playerEntIndex))
        {
            g_playerDamage[attackerEntIndex][playerEntIndex] += damage;
        }
    }
    
    public OnDeathNotice(victimEntIndex, killerEntIndex, inflictorEntIndex) {
        if (killerEntIndex != victimEntIndex
         && is_user_connected(killerEntIndex)
         && !IsTeammates(killerEntIndex, victimEntIndex))
        {
            new Float:maxDamage = 0.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, victimEntIndex)
             && cs_get_user_team(bestAttackerEntIndex) != CS_TEAM_SPECTATOR)
            {
                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);
    }
     
  20. umic VIP user

    Регистрация:
    08.04.16
    Сообщения:
    513
    Симпатии:
    38
    Пол:
    Мужской