AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Count Player Leaves (https://forums.alliedmods.net/showthread.php?t=242308)

pepe_thugs 06-17-2014 08:46

Count Player Leaves
 
I want to count how many times the player leaves server but not count the retry command.
I have this simple code (test code) i saw other codes but i want one simple solution.
Someone can help me ?

PHP Code:

new gDisc[33]

public 
client_disconnect(id)
{
    
set_task(10.0"LeaveSv"id)
}

public 
LeaveSv(id)
{
    if(!
is_user_connected(id))
    {
        
gDisc[id]++
        
SaveLeave(id)
    }



YamiKaitou 06-17-2014 09:00

Re: Count Player Leaves
 
It is not possible to detect if the user disconnected with the retry command. Also, if they do use retry, there is no guarantee that they will have the same index as they did before

HamletEagle 06-17-2014 09:17

Re: Count Player Leaves
 
I want to count how many times the player leaves server but not count the retry command.

So:

PHP Code:

new gDisc

public client_disconnect(id

        
gDisc++ 
        
SaveLeave(id


Why not simply do this ?

Nextra 06-17-2014 11:22

Re: Count Player Leaves
 
You need to work with SteamIDs here, using a Trie is usually the best option for that. Just using the client entity index is not reliable because they are not constant for any one client. If player a leaves and player b connects afterwards they will have the same index.

PHP Code:

#include <amxmodx>

#define RETRY_TIME 10.0

new Trie:g_last_leaveTrie:g_leave_countg_steamid[33][33];

public 
plugin_init() {
   
g_last_leave TrieCreate();
   
g_leave_count TrieCreate();
}

public 
client_authorized(client) {
   
get_user_authid(clientg_steamid[client], charsmax(g_steamid[]));

   new 
Float:last;
   if (
TrieGetCell(g_last_leaveg_steamid[client], last) && get_gametime() - last <= RETRY_TIME) {
      new 
count;
      
TrieGetCell(g_leave_countg_steamid[client], count);

      
TrieSetCell(g_leave_countg_steamid[client], count 1);
   }
}

public 
client_disconnect(client) {
   
TrieSetCell(g_last_leaveg_steamid[client], get_gametime());

   new 
count;
   
TrieGetCell(g_leave_countg_steamid[client], count);
   
TrieSetCell(g_leave_countg_steamid[client], count 1);


This is a very basic example. On client_disconnect we save the last time the player disconnected and increment the leave count by one. If the player reconnects within RETRY_TIME seconds we decrement the counter by one.

pepe_thugs 06-17-2014 16:36

Re: Count Player Leaves
 
Quote:

Originally Posted by HamletEagle (Post 2153033)

Why not simply do this ?

Because i want to count how many times the player disconnect but count when player disconnect more than 10 seconds.

@Nextra Thanks but one more question i can use a global count because i want to run one function to save this in sqlx?
Like this:

PHP Code:


#include <amxmodx>

#define RETRY_TIME 10.0

new Trie:g_last_leaveTrie:g_leave_countg_steamid[33][33];
new 
count[33]

public 
plugin_init() {
   
g_last_leave TrieCreate();
   
g_leave_count TrieCreate();
}

public 
client_authorized(client) {
   
get_user_authid(clientg_steamid[client], charsmax(g_steamid[]));

   new 
Float:last;
   if (
TrieGetCell(g_last_leaveg_steamid[client], last) && get_gametime() - last <= RETRY_TIME) {

      
TrieGetCell(g_leave_countg_steamid[client], count[client]);

      
TrieSetCell(g_leave_countg_steamid[client], count[client]--);
   }
}

public 
client_disconnect(client) {
   
TrieSetCell(g_last_leaveg_steamid[client], get_gametime());

   
TrieGetCell(g_leave_countg_steamid[client], count[client]);
   
TrieSetCell(g_leave_countg_steamid[client], count[client]++);



Nextra 06-17-2014 18:42

Re: Count Player Leaves
 
Storing the counts globally based on player index is pointless. As multiple people have told you the indexes are meaningless after a user disconnects. The code you have posted above will break because of this. I repeat: Indexes are not permanent! There is a reason I used the tries to work with steamids instead of player indexes.

If you want a per-user count use my code. Add a global counter if you want, but do it separately from the player counts.

If you want only a global count you can remove everything regarding the g_leave_count trie and just work with the global counter.


/edit: Please try to actually understand what I did with the code. Your changes break it completely and shows that you did not understand it at all.

^SmileY 06-18-2014 01:32

Re: Count Player Leaves
 
Search in forum, i think the Disconnect reason (With orpheu) can help you :)

EDIT: https://forums.alliedmods.net/showthread.php?p=1545485

You need to custom this plugin to use a DR_DROPPED to count as quit

ezio_auditore 06-18-2014 12:52

Re: Count Player Leaves
 
Or simply incrementing his leaves in client_disconnect() and save it using nVault with AutdID

^SmileY 06-18-2014 16:11

Re: Count Player Leaves
 
Quote:

Originally Posted by ezio_auditore (Post 2153605)
Or simply incrementing his leaves in client_disconnect() and save it using nVault with AutdID

Client disconnect do not return if an player leaves by timeout or dropped or kicked.

pepe_thugs 06-18-2014 20:07

Re: Count Player Leaves
 
Problem Solved.
Thanks for all answers.
And special thanks Nextra for the code and sorry my ignorance.


All times are GMT -4. The time now is 21:13.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.