- add xp dilation just so people do not get bored of "+1 xp" constantly
- double xp factored in
This commit is contained in:
parent
2cb296835a
commit
1e6b9d8116
@ -11,6 +11,9 @@
|
|||||||
/* ** Definitions ** */
|
/* ** Definitions ** */
|
||||||
#define EXP_MAX_PLAYER_LEVEL ( 100 )
|
#define EXP_MAX_PLAYER_LEVEL ( 100 )
|
||||||
|
|
||||||
|
/* ** Double XP ** */
|
||||||
|
#define IsDoubleXP() ( GetGVarInt( "doublexp" ) )
|
||||||
|
|
||||||
/* ** Constants ** */
|
/* ** Constants ** */
|
||||||
enum E_LEVELS {
|
enum E_LEVELS {
|
||||||
E_LAW_ENFORCEMENT,
|
E_LAW_ENFORCEMENT,
|
||||||
@ -25,27 +28,27 @@ enum E_LEVELS {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum E_LEVEL_DATA {
|
enum E_LEVEL_DATA {
|
||||||
E_NAME[ 16 ], Float: E_MAX_UNITS
|
E_NAME[ 16 ], Float: E_MAX_UNITS, Float: E_XP_DILATION
|
||||||
};
|
};
|
||||||
|
|
||||||
static const
|
static const
|
||||||
g_levelData[ ] [ E_LEVEL_DATA ] =
|
g_levelData[ ] [ E_LEVEL_DATA ] =
|
||||||
{
|
{
|
||||||
// Level Name Level 100 Req.
|
// Level Name Level 100 Req. XP Dilation (just to confuse user)
|
||||||
{ "Law Enforcement", 25000.0 }, // 25K arrests
|
{ "Law Enforcement", 25000.0, 3.0 }, // 25K arrests
|
||||||
{ "Robbery", 100000.0 }, // 100K robberies
|
{ "Robbery", 100000.0, 2.0 }, // 100K robberies
|
||||||
{ "Deathmatch", 200000.0 } // 200K kills
|
{ "Deathmatch", 200000.0, 1.0 } // 200K kills
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
/* ** Variables ** */
|
/* ** Variables ** */
|
||||||
new
|
static stock
|
||||||
Float: g_playerExperience [ MAX_PLAYERS ] [ E_LEVELS ]
|
Float: g_playerExperience [ MAX_PLAYERS ] [ E_LEVELS ]
|
||||||
;
|
;
|
||||||
|
|
||||||
/* ** Important ** */
|
/* ** Important ** */
|
||||||
stock Float: GetPlayerLevel( playerid, E_LEVELS: level ) {
|
stock Float: GetPlayerLevel( playerid, E_LEVELS: level ) {
|
||||||
return floatsqroot( g_playerExperience[ playerid ] [ level ] / ( g_levelData[ _: level ] [ E_MAX_UNITS ] / ( EXP_MAX_PLAYER_LEVEL * EXP_MAX_PLAYER_LEVEL ) ) );
|
return floatsqroot( g_playerExperience[ playerid ] [ level ] / ( ( g_levelData[ _: level ] [ E_MAX_UNITS ] * g_levelData[ _: level ] [ E_XP_DILATION ] ) / ( EXP_MAX_PLAYER_LEVEL * EXP_MAX_PLAYER_LEVEL ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
stock Float: GetPlayerTotalExperience( playerid ) {
|
stock Float: GetPlayerTotalExperience( playerid ) {
|
||||||
@ -59,9 +62,14 @@ stock Float: GetPlayerTotalExperience( playerid ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ** Hooks ** */
|
/* ** Hooks ** */
|
||||||
hook OnPlayerDisconnect( playerid, reason ) {
|
hook OnPlayerUpdateEx( playerid )
|
||||||
for ( new l = 0; l < sizeof ( g_levelData ); l ++ ) {
|
{
|
||||||
g_playerExperience[ playerid ] [ E_LEVELS: l ] = 0;
|
if ( IsPlayerLoggedIn( playerid ) )
|
||||||
|
{
|
||||||
|
new
|
||||||
|
Float: total_experience = GetPlayerTotalExperience( playerid );
|
||||||
|
|
||||||
|
PlayerTextDrawSetString( playerid, p_ExperienceTD[ playerid ], sprintf( "%08.0f", total_experience ) );
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -72,6 +80,13 @@ hook OnPlayerLogin( playerid )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hook OnPlayerDisconnect( playerid, reason ) {
|
||||||
|
for ( new l = 0; l < sizeof ( g_levelData ); l ++ ) {
|
||||||
|
g_playerExperience[ playerid ] [ E_LEVELS: l ] = 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* ** Commands ** */
|
/* ** Commands ** */
|
||||||
CMD:level( playerid, params[ ] )
|
CMD:level( playerid, params[ ] )
|
||||||
{
|
{
|
||||||
@ -87,21 +102,6 @@ CMD:level( playerid, params[ ] )
|
|||||||
return ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST_HEADERS, "{FFFFFF}Player Level", szLargeString, "Close", "" );
|
return ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST_HEADERS, "{FFFFFF}Player Level", szLargeString, "Close", "" );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ** Functions ** */
|
|
||||||
stock GivePlayerExperience( playerid, E_LEVELS: level, Float: experience = 1.0 )
|
|
||||||
{
|
|
||||||
if ( ( g_playerExperience[ playerid ] [ level ] += experience ) > g_levelData[ _: level ] [ E_MAX_UNITS ] ) {
|
|
||||||
g_playerExperience[ playerid ] [ level ] = g_levelData[ _: level ] [ E_MAX_UNITS ];
|
|
||||||
}
|
|
||||||
|
|
||||||
// save to database
|
|
||||||
mysql_format(
|
|
||||||
dbHandle, szBigString, sizeof( szBigString ),
|
|
||||||
"INSERT INTO `USER_LEVELS` (`USER_ID`,`LEVEL_ID`,`EXPERIENCE`) VALUES(%d,%d,%d) ON DUPLICATE KEY UPDATE `EXPERIENCE`=%d",
|
|
||||||
GetPlayerAccountID( playerid ), _: level, g_playerExperience[ playerid ] [ level ], g_playerExperience[ playerid ] [ level ]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ** SQL Threads ** */
|
/* ** SQL Threads ** */
|
||||||
thread Experience_OnLoad( playerid )
|
thread Experience_OnLoad( playerid )
|
||||||
{
|
{
|
||||||
@ -124,6 +124,46 @@ thread Experience_OnLoad( playerid )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ** Functions ** */
|
||||||
|
stock GivePlayerExperience( playerid, E_LEVELS: level, Float: experience = 1.0 )
|
||||||
|
{
|
||||||
|
if ( ! IsPlayerLoggedIn( playerid ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// dilation is there so people see +3 when they arrest ... could trigger dopamine levels instead of constantly +1 lol
|
||||||
|
new xp_earned = ( experience * g_levelData[ _: level ] [ E_XP_DILATION ] ) * ( IsDoubleXP( ) ? 2.0 : 1.0 );
|
||||||
|
|
||||||
|
// check if its over 100 anyway
|
||||||
|
if ( ( g_playerExperience[ playerid ] [ level ] += xp_earned ) > g_levelData[ _: level ] [ E_MAX_UNITS ] * g_levelData[ _: level ] [ E_XP_DILATION ] ) {
|
||||||
|
g_playerExperience[ playerid ] [ level ] = g_levelData[ _: level ] [ E_MAX_UNITS ] * g_levelData[ _: level ] [ E_XP_DILATION ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// alert user
|
||||||
|
PlayerTextDrawSetString( playerid, p_ExperienceAwardTD[ playerid ], sprintf( "+%0.0f", xp_earned ) );
|
||||||
|
PlayerTextDrawShow( playerid, p_ExperienceAwardTD[ playerid ] );
|
||||||
|
SetTimerEx( "Experience_HideIncrementTD", 3500, false, "d", playerid );
|
||||||
|
|
||||||
|
// TODO: on level change
|
||||||
|
|
||||||
|
// save to database
|
||||||
|
mysql_format(
|
||||||
|
dbHandle, szBigString, sizeof( szBigString ),
|
||||||
|
"INSERT INTO `USER_LEVELS` (`USER_ID`,`LEVEL_ID`,`EXPERIENCE`) VALUES(%d,%d,%d) ON DUPLICATE KEY UPDATE `EXPERIENCE`=%d",
|
||||||
|
GetPlayerAccountID( playerid ), _: level, g_playerExperience[ playerid ] [ level ], g_playerExperience[ playerid ] [ level ]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Experience_HideIncrementTD( playerid ) {
|
||||||
|
return PlayerTextDrawHide( playerid, p_ExperienceAwardTD[ playerid ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
stock GetPlayerTotalLevel( playerid, &level = 0 ) {
|
||||||
|
for ( new l = 0; l < sizeof ( g_levelData ); l ++ ) {
|
||||||
|
level += floatround( GetPlayerLevel( playerid, E_LEVELS: l ), floatround_floor );
|
||||||
|
}
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
/* ** Migrations ** */
|
/* ** Migrations ** */
|
||||||
/*
|
/*
|
||||||
CREATE TABLE IF NOT EXISTS USER_LEVELS (
|
CREATE TABLE IF NOT EXISTS USER_LEVELS (
|
||||||
|
@ -65,7 +65,6 @@ new
|
|||||||
bool: p_Spectating [ MAX_PLAYERS char ],
|
bool: p_Spectating [ MAX_PLAYERS char ],
|
||||||
bool: p_Muted [ MAX_PLAYERS char ],
|
bool: p_Muted [ MAX_PLAYERS char ],
|
||||||
bool: p_InfectedHIV [ MAX_PLAYERS char ],
|
bool: p_InfectedHIV [ MAX_PLAYERS char ],
|
||||||
p_ExperienceHideTimer [ MAX_PLAYERS ],
|
|
||||||
p_AntiTextSpam [ MAX_PLAYERS ],
|
p_AntiTextSpam [ MAX_PLAYERS ],
|
||||||
bool: p_BlockedPM [ MAX_PLAYERS ] [ MAX_PLAYERS ],
|
bool: p_BlockedPM [ MAX_PLAYERS ] [ MAX_PLAYERS ],
|
||||||
bool: p_inFBI [ MAX_PLAYERS char ],
|
bool: p_inFBI [ MAX_PLAYERS char ],
|
||||||
@ -265,3 +264,4 @@ stock IsPlayerAdminOnDuty( playerid ) return p_AdminOnDuty{ playerid };
|
|||||||
|
|
||||||
stock IsPlayerSpawnProtected( playerid ) return p_AntiSpawnKillEnabled{ playerid };
|
stock IsPlayerSpawnProtected( playerid ) return p_AntiSpawnKillEnabled{ playerid };
|
||||||
|
|
||||||
|
stock IsPlayerLoggedIn( playerid ) return p_PlayerLogged{ playerid };
|
||||||
|
@ -71,9 +71,6 @@ new bool: False = false;
|
|||||||
#define IsPlayerNpcEx(%0) (IsPlayerNPC(%0) || strmatch(p_PlayerIP[%0], "127.0.0.1"))
|
#define IsPlayerNpcEx(%0) (IsPlayerNPC(%0) || strmatch(p_PlayerIP[%0], "127.0.0.1"))
|
||||||
#define GetBusinessSecurity(%0) (g_businessSecurityData[%0][E_LEVEL])
|
#define GetBusinessSecurity(%0) (g_businessSecurityData[%0][E_LEVEL])
|
||||||
|
|
||||||
/* Dynamic Macros */
|
|
||||||
#define IsDoubleXP() (GetGVarInt("doublexp")!=0)
|
|
||||||
|
|
||||||
/* Beast Functions */
|
/* Beast Functions */
|
||||||
#define SendClientMessageToCops(%1,%2,%3) \
|
#define SendClientMessageToCops(%1,%2,%3) \
|
||||||
do{foreach(new fI : Player){if (p_Class[fI]==CLASS_POLICE)format(szNormalString,sizeof(szNormalString),(%2),%3),SendClientMessage(fI,(%1),szNormalString);}}while(False)
|
do{foreach(new fI : Player){if (p_Class[fI]==CLASS_POLICE)format(szNormalString,sizeof(szNormalString),(%2),%3),SendClientMessage(fI,(%1),szNormalString);}}while(False)
|
||||||
@ -2551,7 +2548,6 @@ public OnServerUpdateTimer( )
|
|||||||
|
|
||||||
// Generally Updated textdraws
|
// Generally Updated textdraws
|
||||||
PlayerTextDrawSetString( playerid, p_LocationTD[ playerid ], GetPlayerArea( playerid ) );
|
PlayerTextDrawSetString( playerid, p_LocationTD[ playerid ], GetPlayerArea( playerid ) );
|
||||||
PlayerTextDrawSetString( playerid, p_ExperienceTD[ playerid ], sprintf( "%08d", p_XP[ playerid ] ) );
|
|
||||||
|
|
||||||
// Update casino labels
|
// Update casino labels
|
||||||
UpdateDynamic3DTextLabelText( p_RewardsLabel_Caligs[ playerid ], COLOR_GOLD, sprintf( "[CASINO REWARDS]\n\n"COL_WHITE"You have %s rewards points!", points_format( p_CasinoRewardsPoints[ playerid ] ) ) );
|
UpdateDynamic3DTextLabelText( p_RewardsLabel_Caligs[ playerid ], COLOR_GOLD, sprintf( "[CASINO REWARDS]\n\n"COL_WHITE"You have %s rewards points!", points_format( p_CasinoRewardsPoints[ playerid ] ) ) );
|
||||||
@ -17991,7 +17987,7 @@ stock GivePlayerXP( playerid, amount )
|
|||||||
p_XP[ playerid ] += amount;
|
p_XP[ playerid ] += amount;
|
||||||
PlayerTextDrawSetString( playerid, p_ExperienceAwardTD[ playerid ], string );
|
PlayerTextDrawSetString( playerid, p_ExperienceAwardTD[ playerid ], string );
|
||||||
PlayerTextDrawShow( playerid, p_ExperienceAwardTD[ playerid ] );
|
PlayerTextDrawShow( playerid, p_ExperienceAwardTD[ playerid ] );
|
||||||
p_ExperienceHideTimer[ playerid ] = SetTimerEx( "ExperienceTD_hide", 3500, false, "d", playerid );
|
SetTimerEx( "ExperienceTD_hide", 3500, false, "d", playerid );
|
||||||
if ( p_XP[ playerid ] > 99999999 ) p_XP[ playerid ] = 99999999;
|
if ( p_XP[ playerid ] > 99999999 ) p_XP[ playerid ] = 99999999;
|
||||||
autosaveStart( playerid ); // auto-save
|
autosaveStart( playerid ); // auto-save
|
||||||
return 1;
|
return 1;
|
||||||
@ -17999,8 +17995,6 @@ stock GivePlayerXP( playerid, amount )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function ExperienceTD_hide( playerid ) return PlayerTextDrawHide( playerid, p_ExperienceAwardTD[ playerid ] );
|
|
||||||
|
|
||||||
stock IsPlayerFBI( playerid )
|
stock IsPlayerFBI( playerid )
|
||||||
{
|
{
|
||||||
new
|
new
|
||||||
|
Loading…
Reference in New Issue
Block a user