move global taxing into its own module
This commit is contained in:
parent
675876a41a
commit
692f58a1f5
159
gamemodes/irresistible/cnr/features/tax.pwn
Normal file
159
gamemodes/irresistible/cnr/features/tax.pwn
Normal 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 );
|
||||
}
|
@ -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." );
|
||||
|
Loading…
Reference in New Issue
Block a user