Senior Member
|
08-04-2023
, 13:36
Re: set_user_flags & remove_user_flags & get_user_flags
|
#5
|
Quote:
Originally Posted by lexzor
first of all, don't assume you are "giving vip". you should assuming you are settings some flags, maybe the vip plugin it's using a bool var like bIsVIP[id] that is true or false after the user is connected and even if you change the flags the user won't have vip
Code:
#include <amxmodx>
#include <amxmisc>
#define LOG "log.log"
enum _:CVARS
{
CVAR_VIP_PLAYER,
CVAR_FLAGS_GIVE[12]
}
new xCvars[CVARS]
new bool:g_bTop[MAX_PLAYERS + 1]
public plugin_init()
{
bind_pcvar_num(
create_cvar(
"cx_vip_players",
"15",
FCVAR_NONE,
"Quanto player no rank pode ser VIP"
),
xCvars[CVAR_VIP_PLAYER]
)
bind_pcvar_string(
create_cvar(
"cx_vip_flags_give",
"bst",
FCVAR_NONE,
"Quanto player no rank pode ser VIP"
),
xCvars[CVAR_FLAGS_GIVE],
charsmax(xCvars[CVAR_FLAGS_GIVE])
)
set_task(60.0, "CheckPlayerRank", .flags = "b")
}
public client_connect(id)
{
g_bTop[id] = false
}
public CheckPlayerRank(id)
{
if(is_user_admin(id))
return
new szFlags[20]
new iStats[8], iBodyHits[8], szName[MAX_NAME_LENGTH]
new iRank
new iPlayers[MAX_PLAYERS], iNum
get_players(iPlayers, iNum, "chi")
for(new i = 0, iPlayer; i < iNum; i++)
{
iPlayer = iPlayers[i]
if(!is_user_connected(iPlayer))
continue;
if(1 <= iRank <= xCvars[CVAR_VIP_PLAYER])
{
get_user_name(iPlayer, szName, charsmax(szName))
if(!g_bTop[iPlayer])
{
set_user_flags(iPlayer, read_flags(xCvars[CVAR_FLAGS_GIVE]))
if(get_user_flags(iPlayer) & ADMIN_USER)
{
remove_user_flags(iPlayer, ADMIN_USER)
}
server_print("Do %s have the flags? [%s]", szName,bool:(get_user_flags(iPlayer) & read_flags(szFlags)) ? "Yes" : "No")
}
else
{
server_print("User %s is already top", szName)
}
}
iRank = get_user_stats(id, iStats, iBodyHits)
}
return
}
you have to struggle your code to look clean
don't overhelm you with many functionalities from beginning, start with simpler things then add more functionalities
first of all, in that task you have to parse every player and decide if he's top
i'm not sure about this, but i think you can't remove user flags if he has only that flag
|
Everything kind of stopped working now, I'm not getting serve_print because rank was reset but since there's only me on the server shouldn't it appear that I'm in the top 1?
client_connect = client_putinserver?
For some reason it stopped saving, when I exit and return to the server the flag is not being saved.
PHP Code:
enum _:xFvaultData { xAuthId[64], xDataTop[128] }
enum _:PlayerData { pl_szAuthid[MAX_AUTHID_LENGTH], }
enum _:xMaxCvars { CVAR_LIST_RANK_TYPE, CVAR_TOP15_SHOW_AMOUNT, CVAR_MOTD_CSS, CVAR_PRUNE, CVAR_PREFIXCHAT, CVAR_FULL_TO_SHOW, CVAR_MIN_PLAYERS, CVAR_VIP_PLAYER, CVAR_FLAGS_GIVE[12] }
new xCvars[xMaxCvars] new xFlagDelivery[33], xFlagCapturated[33], xFlagRecuperated[33], xMotd[2000], Player[MAX_PLAYERS + 1][PlayerData]; new bool:isTop[33], bool:isAdmin[33] new szLeFlags[32]
new db_top15_data[] = "db_top15_flags"
public plugin_init() { register_plugin(PLUGIN, AUTHOR, VERSION) xCvars[CVAR_TOP15_SHOW_AMOUNT] = create_cvar("csr_top15f_show_amount", "10", .has_min = true, .min_val = 5.0, .has_max = true, .max_val = 15.0) xCvars[CVAR_PRUNE] = create_cvar("csr_top15f_prune_days", "0") // Tempo Ate Rank Reseta xCvars[CVAR_FULL_TO_SHOW] = create_cvar("csr_top15f_full_to_show", "0") // Shows MODT only complete xCvars[CVAR_MIN_PLAYERS] = create_cvar("csr_top15f_min_players", "0") // Minimum number of players for the ranking to be activated xCvars[CVAR_VIP_PLAYER] = create_cvar("cx_vip_players", "15") // How much player rank can be VIP xCvars[CVAR_FLAGS_GIVE] = create_cvar("cx_vip_flags_give", "bst") // Which VIP Flags do you receive
set_task(60.0, "CheckPlayerRank", .flags = "b")
register_clcmd("amx_resetflag", "xResetTop15")
xRegisterSay("topflag", "xShowMotdTop") xRegisterSay("topflag", "xShowMotdTop") xRegisterSay("topb", "xShowMotdTop") xRegisterSay("pbtop", "xShowMotdTop") xRegisterSay("rankpb", "xSkillTop") xRegisterSay("rankb", "xSkillTop") xRegisterSay("pbrank", "xSkillTop") }
public client_disconnected(id) {
Player[id][pl_szAuthid][0] = 0; xFlagDelivery[id] = false xFlagCapturated[id] = false xFlagRecuperated[id] = false
xSaveData(id); }
public client_putinserver(id) { if(is_user_admin(id)) isAdmin[id] = true
isTop[id] = false
if(!Player[id][pl_szAuthid][0]) { set_task(1.5, "client_putinserver", id); } get_flags(get_user_flags(id), szLeFlags, charsmax(szLeFlags)); //server_print("Player (%d) Flags: %s", id, szLeFlags);/*skill issue*/ set_task(4.0, "CheckPlayerRank", id) set_task(1.0, "xSaveData", id, _, _, "b") xLoadData(id) }
public client_authorized(id, const authid[]) { copy(Player[id][pl_szAuthid], charsmax(Player[][pl_szAuthid]), authid); }
public CheckPlayerRank(id) { if(is_user_admin(id)) return
new szFlags[20] new iStats[8], iBodyHits[8], szName[MAX_NAME_LENGTH] new iRank
new iPlayers[MAX_PLAYERS], iNum get_players(iPlayers, iNum, "chi")
for(new i = 0, iPlayer; i < iNum; i++) { iPlayer = iPlayers[i]
if(!is_user_connected(iPlayer)) continue;
if(1 <= iRank <= xCvars[CVAR_VIP_PLAYER]) { get_user_name(iPlayer, szName, charsmax(szName)) if(!isTop[iPlayer]) {
set_user_flags(iPlayer, read_flags(xCvars[CVAR_FLAGS_GIVE]))
if(get_user_flags(iPlayer) & ADMIN_USER) { remove_user_flags(iPlayer, ADMIN_USER) } server_print("Do %s have the flags? [%s]", szName,bool:(get_user_flags(iPlayer) & read_flags(szFlags)) ? "Yes" : "No") } else { server_print("User %s is already top", szName) } }
iRank = get_user_stats(id, iStats, iBodyHits) }
return }
public xNtvFilter(const name[], index, trap) { if(!trap) return PLUGIN_HANDLED return PLUGIN_CONTINUE }
public xSaveData(id) { if(get_playersnum(1) < get_pcvar_num(xCvars[CVAR_MIN_PLAYERS]) || is_user_alive(id)) return PLUGIN_HANDLED
if(is_user_bot(id) || is_user_hltv(id) || !Player[id][pl_szAuthid][0]) return PLUGIN_HANDLED; { static xData[500], xUserName[32] get_user_name(id, xUserName, charsmax(xUserName))
formatex(xData, charsmax(xData), "%d %d %d ^"%s^"", xFlagDelivery[id], xFlagRecuperated[id], xFlagCapturated[id], xUserName) fvault_set_data(db_top15_data, Player[id][pl_szAuthid], xData) }
return PLUGIN_CONTINUE }
public xLoadData(id) { if(is_user_bot(id) || is_user_hltv(id)) return PLUGIN_HANDLED;
static xData[500] static xEnt[10], xRc[10], xCap[10], xIgnoreCase[32]
if(fvault_get_data(db_top15_data, Player[id][pl_szAuthid], xData, charsmax(xData))) { parse(xData, xEnt, charsmax(xEnt), xRc, charsmax(xRc), xCap, charsmax(xCap), xIgnoreCase, charsmax(xIgnoreCase))
xFlagDelivery[id] = str_to_num(xEnt) xFlagRecuperated[id] = str_to_num(xRc) xFlagCapturated[id] = str_to_num(xCap) }
set_task(35.0, "xWarnTopPrune", id+TASKID_WARN_PRUNE, _, _, "a", 2)
xSaveData(id)
return PLUGIN_CONTINUE }
public xSortData(Array:aArray, iItem1, iItem2, iData[], iDataSize) { new Data1[xFvaultData] new Data2[xFvaultData] ArrayGetArray(aArray, iItem1, Data1) ArrayGetArray(aArray, iItem2, Data2) new iCount1, iCount2, xStrKills, xStrKills2
new xK[10] parse(Data1[xDataTop], xK, charsmax(xK))
xStrKills = str_to_num(xK)
new xK2[10] parse(Data2[xDataTop], xK2, charsmax(xK2))
xStrKills2 = str_to_num(xK2)
iCount1 = xStrKills iCount2 = xStrKills2 return (iCount1 > iCount2) ? -1 : ( (iCount1 < iCount2) ? 1 : 0 ) }
public xNtvGetUserPosTop(id) { if(!is_user_connected(id)) return false
new Array:aKey = ArrayCreate(35) new Array:aData = ArrayCreate(128) new Array:aAll = ArrayCreate(xFvaultData) fvault_load(db_top15_data, aKey, aData) new iArraySize = ArraySize(aKey) new Data[xFvaultData]
new i for(i = 0; i < iArraySize; i++) { ArrayGetString(aKey, i, Data[xAuthId], charsmax(Data[xAuthId])) ArrayGetString(aData, i, Data[xDataTop], charsmax(Data[xDataTop])) ArrayPushArray(aAll, Data) } ArraySort(aAll, "xSortData")
new szAuthIdFromArray[64]
static xGetAuth[64] get_user_authid(id, xGetAuth, charsmax(xGetAuth))
new j for(j = 0; j < iArraySize; j++) { ArrayGetString(aAll, j, szAuthIdFromArray, charsmax(szAuthIdFromArray)) if(equal(szAuthIdFromArray, xGetAuth)) break; } ArrayDestroy(aKey) ArrayDestroy(aData) ArrayDestroy(aAll)
return j+1 }
public xNtvGetTotalTop() { return fvault_size(db_top15_data) }
Last edited by yagami; 08-04-2023 at 13:38.
Reason: error
|
|