move global taxing into its own module

This commit is contained in:
Lorenc Pekaj 2019-01-02 00:57:26 +11:00
parent 675876a41a
commit 692f58a1f5
2 changed files with 161 additions and 139 deletions

View File

@ -0,0 +1,159 @@
/*
* Irresistible Gaming (c) 2018
* Developed by Lorenc
* Module: cnr\features\tax.pwn
* Purpose: system for globally taxing player assets
*/
/* ** Includes ** */
#include < YSI\y_hooks >
/* ** Hooks ** */
hook OnScriptInit( )
{
AddServerVariable( "taxtime", "0", GLOBAL_VARTYPE_INT );
AddServerVariable( "taxrate", "1.0", GLOBAL_VARTYPE_FLOAT );
AddServerVariable( "taxprofit", "0.0", GLOBAL_VARTYPE_FLOAT );
AddServerVariable( "taxprofit_prev", "0.0", GLOBAL_VARTYPE_FLOAT );
return 1;
}
hook OnServerUpdate( )
{
new
server_time = GetServerTime( );
// Time For Tax?
if ( server_time >= GetGVarInt( "taxtime" ) ) {
UpdateServerVariable( "taxtime", server_time + 86400, 0.0, "", GLOBAL_VARTYPE_INT );
BeginEconomyTax( );
}
return 1;
}
/* ** Commands ** */
CMD:gettaxrate( playerid, params[ ] ) return cmd_tax( playerid, params );
CMD:getmytax( playerid, params[ ] ) return cmd_tax( playerid, params );
CMD:tax( playerid, params[ ] )
{
new Float: tax_discount = p_VIPLevel[ playerid ] >= VIP_DIAMOND ? 0.5 : 1.0;
new Float: tax_rate = GetGVarFloat( "taxrate" ) * tax_discount;
new player_tax = floatround( float( GetPlayerTotalCash( playerid ) ) * ( tax_rate / 100.0 ) );
if ( player_tax < 0 ) player_tax = 0;
if ( tax_discount != 1.0 ) {
SendServerMessage( playerid, "Your tax is "COL_GOLD"%s"COL_WHITE" at %0.2f%s in %s. "COL_GOLD"(50%s Reduced)", cash_format( player_tax ), tax_rate, "%%", secondstotime( GetGVarInt( "taxtime" ) - g_iTime ), "%%" );
} else {
SendServerMessage( playerid, "Your tax is "COL_GOLD"%s"COL_WHITE" at %0.2f%s in %s.", cash_format( player_tax ), tax_rate, "%%", secondstotime( GetGVarInt( "taxtime" ) - g_iTime ) );
}
return 1;
}
CMD:gettotalcash( playerid, params[ ] )
{
mysql_function_query( dbHandle, "SELECT USER_CASH, BIZ_CASH, GANG_CASH FROM (SELECT (SUM(BANKMONEY)+SUM(CASH)) USER_CASH FROM USERS) A CROSS JOIN (SELECT SUM(BANK) BIZ_CASH FROM BUSINESSES) B CROSS JOIN (SELECT SUM(BANK) GANG_CASH FROM GANGS) C", true, "gettotalcash", "i", playerid );
return 1;
}
/* ** SQL Threads ** */
thread OnTaxEconomy( starting )
{
new
rows = cache_get_row_count( );
if ( ! rows ) {
return 1;
}
new user_cash = cache_get_field_content_int( 0, "USER_CASH", dbHandle );
new biz_cash = cache_get_field_content_int( 0, "BIZ_CASH", dbHandle );
new gang_cash = cache_get_field_content_int( 0, "GANG_CASH", dbHandle );
// total_thousands
new Float: total_thousands = float( user_cash + biz_cash + gang_cash ) / 1000000.0;
// step
if ( starting == 1 )
{
new Float: tax_rate = GetGVarFloat( "taxrate" ) / 100.0; // 1%
// players
foreach ( new playerid : Player ) {
new Float: tax_discount = p_VIPLevel[ playerid ] >= VIP_DIAMOND ? 0.5 : 1.0;
new player_tax = floatround( float( GetPlayerTotalCash( playerid ) ) * tax_rate * tax_discount );
if ( player_tax > 0 ) {
ShowPlayerHelpDialog( playerid, 5000, sprintf( "~w~You have paid ~r~%s~w~ in tax", cash_format( player_tax ) ) );
GivePlayerCash( playerid, -player_tax );
}
}
// businesses
foreach ( new businessid : business ) {
new business_tax = floatround( float( g_businessData[ businessid ] [ E_BANK ] ) * tax_rate );
if ( business_tax > 0 ) g_businessData[ businessid ] [ E_BANK ] -= business_tax;
}
// gangs
foreach ( new gangid : gangs ) {
new gang_tax = floatround( float( g_gangData[ gangid ] [ E_BANK ] ) * tax_rate );
if ( gang_tax > 0 ) g_gangData[ gangid ] [ E_BANK ] -= gang_tax;
}
// queries
mysql_single_query( sprintf( "UPDATE `USERS` SET `CASH`=`CASH`*IF(`VIP_PACKAGE`>=3,%f,%f),`BANKMONEY`=`BANKMONEY`*IF(`VIP_PACKAGE`>=5,%f,%f) WHERE `ONLINE`=0 AND (`BANKMONEY`+`CASH`)>0", 1.0 - tax_rate / 2.0, 1.0 - tax_rate, 1.0 - tax_rate / 2.0, 1.0 - tax_rate ) );
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `BANK`=`BANK`*%f WHERE `BANK`>0", 1.0 - tax_rate ) );
mysql_single_query( sprintf( "UPDATE `GANGS` SET `BANK`=`BANK`*%f WHERE `BANK`>0", 1.0 - tax_rate ) );
// set current economy money
SetGVarFloat( "before_tax", total_thousands );
printf("[SERVER ECONOMY TAX] $%0.3fM before tax.", total_thousands );
BeginEconomyTax( .starting = 0 );
}
else
{
new Float: profit = GetGVarFloat( "before_tax" ) - total_thousands; // millions
// eventbank donate
new eventbank = floatround( profit * 100000.0 ); // 10%
UpdateServerVariable( "eventbank", GetGVarInt( "eventbank" ) + eventbank, 0.0, "", GLOBAL_VARTYPE_INT );
// hitman budget
new hitman_budget = floatround( profit * 100000.0 ); // 10%
RandomHits_IncreaseHitPool( hitman_budget );
// add to server vars
UpdateServerVariable( "taxprofit_prev", 0, GetGVarFloat( "taxprofit" ), "", GLOBAL_VARTYPE_FLOAT );
UpdateServerVariable( "taxprofit", 0, GetGVarFloat( "taxprofit" ) + profit, "", GLOBAL_VARTYPE_FLOAT );
printf( "[SERVER ECONOMY TAX] The server economy has been successfully taxed for a profit of $%0.3fM.", profit );
}
return 1;
}
thread gettotalcash( playerid )
{
new
rows;
cache_get_data( rows, tmpVariable );
if ( rows )
{
new tax_profit = floatround( ( GetGVarFloat( "taxprofit" ) - GetGVarFloat( "taxprofit_prev" ) ) * 1000000.0 );
new user_cash = cache_get_field_content_int( 0, "USER_CASH", dbHandle );
new biz_cash = cache_get_field_content_int( 0, "BIZ_CASH", dbHandle );
new gang_cash = cache_get_field_content_int( 0, "GANG_CASH", dbHandle );
new total_cash = user_cash + biz_cash + gang_cash;
format( szLargeString, 512, "Total User Cash\t"COL_GREY"%s\nTotal Gang Cash\t"COL_GREY"%s\nTotal Business Cash\t"COL_GREY"%s\nTotal Server Cash\t"COL_GOLD"%s\nTotal Tax Profit (Day)\t"COL_GOLD"%s",
cash_format( user_cash ), cash_format( gang_cash ), cash_format( biz_cash ), cash_format( total_cash ), cash_format( tax_profit ) );
// SendServerMessage( playerid, "Total: "COL_GOLD"%s"COL_WHITE", Tax Rate: "COL_GOLD"%s"COL_WHITE" per 24 mins.", cash_format( total_cash ), cash_format( tax_rate ) );
ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST, "{FFFFFF}SF-CNR Economy", szLargeString, "Close", "" );
}
else SendError( playerid, "An error has occurred, try again later." );
return 1;
}
/* ** Functions ** */
stock BeginEconomyTax( starting = 1 ) {
mysql_function_query( dbHandle, "SELECT USER_CASH, BIZ_CASH, GANG_CASH FROM (SELECT (SUM(BANKMONEY)+SUM(CASH)) USER_CASH FROM USERS) A CROSS JOIN (SELECT SUM(BANK) BIZ_CASH FROM BUSINESSES) B CROSS JOIN (SELECT SUM(BANK) GANG_CASH FROM GANGS) C", true, "OnTaxEconomy", "i", starting );
}

View File

@ -104,10 +104,6 @@ public OnGameModeInit()
MapAndreas_Init( MAP_ANDREAS_MODE_MINIMAL );
/* ** Server Variables ** */
AddServerVariable( "taxtime", "0", GLOBAL_VARTYPE_INT );
AddServerVariable( "taxrate", "1.0", GLOBAL_VARTYPE_FLOAT );
AddServerVariable( "taxprofit", "0.0", GLOBAL_VARTYPE_FLOAT );
AddServerVariable( "taxprofit_prev", "0.0", GLOBAL_VARTYPE_FLOAT );
AddServerVariable( "doublexp", "0", GLOBAL_VARTYPE_INT );
AddServerVariable( "eventbank", "0", GLOBAL_VARTYPE_INT );
AddServerVariable( "eventhost", "0", GLOBAL_VARTYPE_INT );
@ -269,17 +265,11 @@ public OnServerUpdateTimer( )
iWeapon, iAmmo
;
// for hooks
CallLocalFunction( "OnServerUpdate", "" );
// better to store in a variable as we are getting the timestamp from hardware
g_iTime = gettime( );
// Time For Tax?
if ( g_iTime >= GetGVarInt( "taxtime" ) ) {
UpdateServerVariable( "taxtime", g_iTime + 86400, 0.0, "", GLOBAL_VARTYPE_INT );
BeginEconomyTax( );
}
// for hooks
CallLocalFunction( "OnServerUpdate", "" );
// Begin iterating all players
foreach ( new playerid : Player )
@ -1290,81 +1280,6 @@ public OnPlayerTakePlayerDamage( playerid, issuerid, &Float: amount, weaponid, b
}
#endif
stock BeginEconomyTax( starting = 1 ) {
mysql_function_query( dbHandle, "SELECT USER_CASH, BIZ_CASH, GANG_CASH FROM (SELECT (SUM(BANKMONEY)+SUM(CASH)) USER_CASH FROM USERS) A CROSS JOIN (SELECT SUM(BANK) BIZ_CASH FROM BUSINESSES) B CROSS JOIN (SELECT SUM(BANK) GANG_CASH FROM GANGS) C", true, "OnTaxEconomy", "i", starting );
}
thread OnTaxEconomy( starting )
{
new rows;
cache_get_data( rows, tmpVariable );
if ( ! rows ) return 1;
new user_cash = cache_get_field_content_int( 0, "USER_CASH", dbHandle );
new biz_cash = cache_get_field_content_int( 0, "BIZ_CASH", dbHandle );
new gang_cash = cache_get_field_content_int( 0, "GANG_CASH", dbHandle );
// total_thousands
new Float: total_thousands = float( user_cash + biz_cash + gang_cash ) / 1000000.0;
// step
if ( starting == 1 )
{
new Float: tax_rate = GetGVarFloat( "taxrate" ) / 100.0; // 1%
// players
foreach ( new playerid : Player ) {
new Float: tax_discount = p_VIPLevel[ playerid ] >= VIP_DIAMOND ? 0.5 : 1.0;
new player_tax = floatround( float( GetPlayerTotalCash( playerid ) ) * tax_rate * tax_discount );
if ( player_tax > 0 ) {
ShowPlayerHelpDialog( playerid, 5000, sprintf( "~w~You have paid ~r~%s~w~ in tax", cash_format( player_tax ) ) );
GivePlayerCash( playerid, -player_tax );
}
}
// businesses
foreach ( new businessid : business ) {
new business_tax = floatround( float( g_businessData[ businessid ] [ E_BANK ] ) * tax_rate );
if ( business_tax > 0 ) g_businessData[ businessid ] [ E_BANK ] -= business_tax;
}
// gangs
foreach ( new gangid : gangs ) {
new gang_tax = floatround( float( g_gangData[ gangid ] [ E_BANK ] ) * tax_rate );
if ( gang_tax > 0 ) g_gangData[ gangid ] [ E_BANK ] -= gang_tax;
}
// queries
mysql_single_query( sprintf( "UPDATE `USERS` SET `CASH`=`CASH`*IF(`VIP_PACKAGE`>=3,%f,%f),`BANKMONEY`=`BANKMONEY`*IF(`VIP_PACKAGE`>=5,%f,%f) WHERE `ONLINE`=0 AND (`BANKMONEY`+`CASH`)>0", 1.0 - tax_rate / 2.0, 1.0 - tax_rate, 1.0 - tax_rate / 2.0, 1.0 - tax_rate ) );
mysql_single_query( sprintf( "UPDATE `BUSINESSES` SET `BANK`=`BANK`*%f WHERE `BANK`>0", 1.0 - tax_rate ) );
mysql_single_query( sprintf( "UPDATE `GANGS` SET `BANK`=`BANK`*%f WHERE `BANK`>0", 1.0 - tax_rate ) );
// set current economy money
SetGVarFloat( "before_tax", total_thousands );
printf("[SERVER ECONOMY TAX] $%0.3fM before tax.", total_thousands );
BeginEconomyTax( .starting = 0 );
}
else
{
new Float: profit = GetGVarFloat( "before_tax" ) - total_thousands; // millions
// eventbank donate
new eventbank = floatround( profit * 100000.0 ); // 10%
UpdateServerVariable( "eventbank", GetGVarInt( "eventbank" ) + eventbank, 0.0, "", GLOBAL_VARTYPE_INT );
// hitman budget
new hitman_budget = floatround( profit * 100000.0 ); // 10%
RandomHits_IncreaseHitPool( hitman_budget );
// add to server vars
UpdateServerVariable( "taxprofit_prev", 0, GetGVarFloat( "taxprofit" ), "", GLOBAL_VARTYPE_FLOAT );
UpdateServerVariable( "taxprofit", 0, GetGVarFloat( "taxprofit" ) + profit, "", GLOBAL_VARTYPE_FLOAT );
printf( "[SERVER ECONOMY TAX] The server economy has been successfully taxed for a profit of $%0.3fM.", profit );
}
return 1;
}
#if defined AC_INCLUDED
public OnPlayerDeathEx( playerid, killerid, reason, Float: damage, bodypart )
#else
@ -1432,12 +1347,6 @@ public OnPlayerDeath( playerid, killerid, reason )
TextDrawHideForPlayer( playerid, g_currentXPTD );
CallLocalFunction( "OnPlayerUnloadTextdraws", "d", playerid );
/* ** Tax And Medical Fees **
if ( GetPlayerTotalCash( playerid ) > 0 && ! ( IsPlayerInPaintBall( playerid ) || IsPlayerDueling( playerid ) || IsPlayerInEvent( playerid ) ) ) {
ShowPlayerHelpDialog( playerid, 5000, sprintf( "~w~You have paid ~r~$100~w~ in medical fees" ) );
GivePlayerCash( playerid, -100 );
} */
new
playerGangId = p_GangID[ playerid ];
@ -2259,52 +2168,6 @@ CMD:robitems( playerid, params[ ] )
return 1;
}
CMD:gettaxrate( playerid, params[ ] ) return cmd_tax( playerid, params );
CMD:getmytax( playerid, params[ ] ) return cmd_tax( playerid, params );
CMD:tax( playerid, params[ ] )
{
new Float: tax_discount = p_VIPLevel[ playerid ] >= VIP_DIAMOND ? 0.5 : 1.0;
new Float: tax_rate = GetGVarFloat( "taxrate" ) * tax_discount;
new player_tax = floatround( float( GetPlayerTotalCash( playerid ) ) * ( tax_rate / 100.0 ) );
if ( player_tax < 0 ) player_tax = 0;
if ( tax_discount != 1.0 ) {
SendServerMessage( playerid, "Your tax is "COL_GOLD"%s"COL_WHITE" at %0.2f%s in %s. "COL_GOLD"(50%s Reduced)", cash_format( player_tax ), tax_rate, "%%", secondstotime( GetGVarInt( "taxtime" ) - g_iTime ), "%%" );
} else {
SendServerMessage( playerid, "Your tax is "COL_GOLD"%s"COL_WHITE" at %0.2f%s in %s.", cash_format( player_tax ), tax_rate, "%%", secondstotime( GetGVarInt( "taxtime" ) - g_iTime ) );
}
return 1;
}
CMD:gettotalcash( playerid, params[ ] )
{
mysql_function_query( dbHandle, "SELECT USER_CASH, BIZ_CASH, GANG_CASH FROM (SELECT (SUM(BANKMONEY)+SUM(CASH)) USER_CASH FROM USERS) A CROSS JOIN (SELECT SUM(BANK) BIZ_CASH FROM BUSINESSES) B CROSS JOIN (SELECT SUM(BANK) GANG_CASH FROM GANGS) C", true, "gettotalcash", "i", playerid );
return 1;
}
thread gettotalcash( playerid )
{
new
rows;
cache_get_data( rows, tmpVariable );
if ( rows )
{
new tax_profit = floatround( ( GetGVarFloat( "taxprofit" ) - GetGVarFloat( "taxprofit_prev" ) ) * 1000000.0 );
new user_cash = cache_get_field_content_int( 0, "USER_CASH", dbHandle );
new biz_cash = cache_get_field_content_int( 0, "BIZ_CASH", dbHandle );
new gang_cash = cache_get_field_content_int( 0, "GANG_CASH", dbHandle );
new total_cash = user_cash + biz_cash + gang_cash;
format( szLargeString, 512, "Total User Cash\t"COL_GREY"%s\nTotal Gang Cash\t"COL_GREY"%s\nTotal Business Cash\t"COL_GREY"%s\nTotal Server Cash\t"COL_GOLD"%s\nTotal Tax Profit (Day)\t"COL_GOLD"%s",
cash_format( user_cash ), cash_format( gang_cash ), cash_format( biz_cash ), cash_format( total_cash ), cash_format( tax_profit ) );
// SendServerMessage( playerid, "Total: "COL_GOLD"%s"COL_WHITE", Tax Rate: "COL_GOLD"%s"COL_WHITE" per 24 mins.", cash_format( total_cash ), cash_format( tax_rate ) );
ShowPlayerDialog( playerid, DIALOG_NULL, DIALOG_STYLE_TABLIST, "{FFFFFF}SF-CNR Economy", szLargeString, "Close", "" );
}
else SendError( playerid, "An error has occurred, try again later." );
return 1;
}
/*CMD:policetutorial( playerid, params[ ] )
{
if ( p_CopTutorial{ playerid } == 0 ) return SendError( playerid, "You have already enabled the law enforcement officer tutorial." );