From d446a98d07ef2a6fb93942f652cc5756a5e23c22 Mon Sep 17 00:00:00 2001 From: Lorenc Date: Mon, 26 Mar 2018 00:02:19 +1100 Subject: [PATCH] * add vote.inc (wip) * rename boxing --- .../visage/{boxing--.inc => boxing.inc} | 96 ++--- pawno/include/irresistible/features/vote.inc | 355 ++++++++++++++++++ 2 files changed, 382 insertions(+), 69 deletions(-) rename pawno/include/irresistible/features/visage/{boxing--.inc => boxing.inc} (95%) create mode 100644 pawno/include/irresistible/features/vote.inc diff --git a/pawno/include/irresistible/features/visage/boxing--.inc b/pawno/include/irresistible/features/visage/boxing.inc similarity index 95% rename from pawno/include/irresistible/features/visage/boxing--.inc rename to pawno/include/irresistible/features/visage/boxing.inc index d41f5a1..45d28a5 100644 --- a/pawno/include/irresistible/features/visage/boxing--.inc +++ b/pawno/include/irresistible/features/visage/boxing.inc @@ -22,7 +22,6 @@ /* ENUMS */ enum E_BOXER_DATA { - E_ACCOUNT_ID, E_WINS, E_LOSSES, E_TOTAL_FIGHTS, @@ -51,15 +50,27 @@ new g_boxingArenaData[ E_ARENA_DATA ]; new g_boxingArenaObjects[ 9 ]; public OnPlayerConnect( playerid ) { - - Boxing_SetValues( playerid ); - + g_boxingMatchData[ playerid ][ E_FIGHTING ] = false; + g_boxingMatchData[ playerid ][ E_OPPONENT ] = -1; + g_boxingMatchData[ playerid ][ E_INVITED ] = false; + g_boxingMatchData[ playerid ][ E_ROUNDS_SET ] = 1; + g_boxingMatchData[ playerid ][ E_BET_AMOUNT_SET ] = 0; + g_boxingMatchData[ playerid ][ E_IS_HOST ] = false; + g_boxingMatchData[ playerid ][ E_SCORE ] = 0; } public OnPlayerDisconnect( playerid, reason ) { - - Boxing_ResetValues( playerid ); - + g_boxingMatchData[ playerid ][ E_WINS ] = 0; + g_boxingMatchData[ playerid ][ E_LOSSES ] = 0; + g_boxingMatchData[ playerid ][ E_TOTAL_FIGHTS ] = 0; + g_boxingMatchData[ playerid ][ E_FIGHTING ] = false; + g_boxingMatchData[ playerid ][ E_OPPONENT ] = -1; + g_boxingMatchData[ playerid ][ E_INVITED ] = false; + g_boxingMatchData[ playerid ][ E_INVITE_TIMER ] = 0; + g_boxingMatchData[ playerid ][ E_ROUNDS_SET ] = 1; + g_boxingMatchData[ playerid ][ E_BET_AMOUNT_SET ] = 0; + g_boxingMatchData[ playerid ][ E_IS_HOST ] = false; + g_boxingMatchData[ playerid ][ E_SCORE ] = 0; } /* BOXING COMMANDS */ @@ -279,7 +290,6 @@ stock ResetBoxingPlayerVariables( playerid, targetID ) { g_boxingMatchData[ targetID ][ E_FIGHTING ] = false; g_boxingMatchData[ targetID ][ E_SCORE ] = 0; TogglePlayerControllable( targetID, 1 ); - return true; } @@ -294,8 +304,7 @@ stock ResetBoxingArenaVariables() { } -forward KillInviteTimer( playerid ); -public KillInviteTimer( playerid ) { +function KillInviteTimer( playerid ) { new opponent = g_boxingMatchData[ playerid ][ E_OPPONENT ]; @@ -311,10 +320,8 @@ public KillInviteTimer( playerid ) { } -/* MATCH FUNCTIONS */ - -forward StartMatch( playerid, targetID ); -public StartMatch( playerid, targetID ) { +/* ** Functions ** */ +function StartMatch( playerid, targetID ) { if ( g_boxingMatchData[ playerid ][ E_FIGHTING ] == true && g_boxingMatchData[ playerid ][ E_FIGHTING ] ) { @@ -356,20 +363,16 @@ public StartMatch( playerid, targetID ) { } -forward NextRound( playerid, targetID ); -public NextRound( playerid, targetID ) { +function NextRound( playerid, targetID ) { SetBoxingPlayerConfig( playerid, targetID ); KillTimer( g_boxingArenaData[ E_CD_TIMER ] ); g_boxingArenaData[ E_CD_TIMER ] = SetTimerEx( "boxingCountDown", 960, false, "d", 8 ); - return true; - } -forward EndMatch( playerid, targetID ); -public EndMatch( playerid, targetID ) { +function EndMatch( playerid, targetID ) { if ( g_boxingArenaData[ E_BET ] == 0 ) { @@ -411,8 +414,7 @@ public EndMatch( playerid, targetID ) { } -forward ForfeitMatch( playerid, targetID ); -public ForfeitMatch( playerid, targetID ) { +function ForfeitMatch( playerid, targetID ) { if ( g_boxingArenaData[ E_BET ] == 0 ) { @@ -444,8 +446,7 @@ public ForfeitMatch( playerid, targetID ) { } -forward SetBoxingPlayerConfig( playerid, targetID ); -public SetBoxingPlayerConfig( playerid, targetID ) { +function SetBoxingPlayerConfig( playerid, targetID ) { SetPlayerPos( playerid, 2238.29, 1679.2426, 1009.188 ); SetPlayerPos( targetID, 2234.3279, 1675.3125, 1009.188 ); @@ -472,8 +473,7 @@ public SetBoxingPlayerConfig( playerid, targetID ) { } -forward boxingCountDown( time ); -public boxingCountDown( time ) { +function boxingCountDown( time ) { if ( !time ) { @@ -517,7 +517,7 @@ public boxingCountDown( time ) { /* ONPLAYER GIVE/TAKE DAMAGE HANDLING */ -public OnPlayerTakeDamage( playerid, issuerid, Float:amount, weaponid, bodypart ) { +hook OnPlayerTakeDamage( playerid, issuerid, Float:amount, weaponid, bodypart ) { if ( g_boxingMatchData[ playerid ][ E_FIGHTING ] == true ) { @@ -670,48 +670,6 @@ stock DestroyBoxingArena() { } -/* MYSQL PLAYER RELATED */ -stock Boxing_SetValues( playerid ) { - - // TODO: player variable setting - g_boxingMatchData[ playerid ][ E_ACCOUNT_ID ] = playerid; - // ^ so it doesn't spit a warning - - g_boxingMatchData[ playerid ][ E_FIGHTING ] = false; - g_boxingMatchData[ playerid ][ E_OPPONENT ] = -1; - g_boxingMatchData[ playerid ][ E_INVITED ] = false; - g_boxingMatchData[ playerid ][ E_ROUNDS_SET ] = 1; - g_boxingMatchData[ playerid ][ E_BET_AMOUNT_SET ] = 0; - g_boxingMatchData[ playerid ][ E_IS_HOST ] = false; - g_boxingMatchData[ playerid ][ E_SCORE ] = 0; - -} - -stock Boxing_SaveValues( playerid ) { - - // TODO: player variable saving - g_boxingMatchData[ playerid ][ E_ACCOUNT_ID ] = playerid; - // ^ so it doesn't spit a warning - -} - -stock Boxing_ResetValues( playerid ) { - - g_boxingMatchData[ playerid ][ E_ACCOUNT_ID ] = -1; - g_boxingMatchData[ playerid ][ E_WINS ] = 0; - g_boxingMatchData[ playerid ][ E_LOSSES ] = 0; - g_boxingMatchData[ playerid ][ E_TOTAL_FIGHTS ] = 0; - g_boxingMatchData[ playerid ][ E_FIGHTING ] = false; - g_boxingMatchData[ playerid ][ E_OPPONENT ] = -1; - g_boxingMatchData[ playerid ][ E_INVITED ] = false; - g_boxingMatchData[ playerid ][ E_INVITE_TIMER ] = 0; - g_boxingMatchData[ playerid ][ E_ROUNDS_SET ] = 1; - g_boxingMatchData[ playerid ][ E_BET_AMOUNT_SET ] = 0; - g_boxingMatchData[ playerid ][ E_IS_HOST ] = false; - g_boxingMatchData[ playerid ][ E_SCORE ] = 0; - return 1; -} - /* MESSAGE FUNCTIONS */ stock SendBoxingGlobal( string[] ) { diff --git a/pawno/include/irresistible/features/vote.inc b/pawno/include/irresistible/features/vote.inc new file mode 100644 index 0000000..a9b0d13 --- /dev/null +++ b/pawno/include/irresistible/features/vote.inc @@ -0,0 +1,355 @@ +/* + * Irresistible Gaming (c) 2018 + * Developed by Cloudy + * Module: vote.inc + * Purpose: vote system for individuals + */ + + +/* ** Includes ** */ +#include < YSI\y_hooks > + +/* ** Definitions ** */ +#define DIALOG_VOTE_CONFIG 5671 +#define DIALOG_VOTE_QUESTION 5672 +#define DIALOG_VOTE_ADDOPTION 5673 +#define DIALOG_VOTE_EDITOPTION 5674 + +/* ** Variables ** */ +new bool: v_started; +new v_question [ 80 ]; //// the vote question content +new v_option [ 5 ] [ 50 ]; //// five options max +new v_option_votes [ 5 ]; //// Stores the votes of each option. +new v_voted [ MAX_PLAYERS ]; //// This will have the accounts ID's of the voters, to prevent voting more than once. + +new Text: v_TD_Question; +new Text: v_TD_Option [ 5 ]; + +/* ** Hooks ** */ +hook OnGameModeInit( ) +{ + ResetVoteAll( ); + LoadVotingTextdraws( ); + return 1; +} + +hook OnPlayerText( playerid, text[ ] ) +{ + if( !v_started || GetPlayerAccountID( playerid ) <= 0 ) return 1; /// no poll or player isn't logged in. + new option; + if( !sscanf( text, "i", option ) ) { + if( ( 1 <= option <= 5 ) && strcmp( v_option[ option-1 ], "n/a", true ) ) { + if( !didPlayerVote( playerid ) ) { + new string[ 128 ]; + AddPlayerVote( playerid, option-1 ); + format( string, sizeof( string ), "{C0C0C0}[SERVER]{FFFFFF} Your vote has been added: {C0C0C0}%d", option ); + SendClientMessage( playerid, -1, string ); + return 0; + } + } + } + return 1; +} + +#if defined AC_INCLUDED +hook OnPlayerDeathEx( playerid, killerid, reason, Float: damage, bodypart ) +#else +hook OnPlayerDeath( playerid, killerid, reason ) +#endif +{ + HideVoteTextdrawsForPlayer( playerid ); + return 1; +} + +hook OnPlayerSpawn( playerid ) +{ + ShowVoteTextdrawsForPlayer( playerid ); + return 1; +} + +hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[ ] ) +{ + if( dialogid == DIALOG_VOTE_CONFIG && response ) { + if( GetPlayerAdminLevel( playerid ) >= 4 ) { + if( listitem == 0 ) + ShowPlayerDialog( playerid, DIALOG_VOTE_QUESTION, DIALOG_STYLE_INPUT, "{FFFFFF}Vote Settings - Set Question", "{FFFFFF}Write the question you want to vote for:", "Set", "Back" ); + else if( !strcmp( inputtext, "Add a new option", true, 16 ) ) + ShowPlayerDialog( playerid, DIALOG_VOTE_ADDOPTION, DIALOG_STYLE_INPUT, "{FFFFFF}Vote Settings - Add Option", "{FFFFFF}Write the option you want to add:", "Add", "Back" ); + else { + new optionid = strval( inputtext[ 0 ] ) - 1; + SetPVarInt( playerid, "p_VoteEditOption", optionid ); + ShowPlayerDialog( playerid, DIALOG_VOTE_EDITOPTION, DIALOG_STYLE_INPUT, "{FFFFFF}Vote Settings - Edit Option", "{FFFFFF}Enter the text you want to set the option to:", "Update", "Back" ); + } + } + } + + else if( dialogid == DIALOG_VOTE_QUESTION ) { + if( GetPlayerAdminLevel( playerid ) >= 4 ) + return SendError( playerid, "You don't have an appropriate administration level to use this feature." ); + + if( response ) { + if( !strlen( inputtext ) ) + ShowPlayerDialog( playerid, DIALOG_VOTE_QUESTION, DIALOG_STYLE_INPUT, "{FFFFFF}Vote Settings - Set Question", "{FFFFFF}Write the question you want to vote for:\n\n{FF0000}Invalid question", "Set", "Back" ); + else { + format( v_question, sizeof( v_question ), inputtext ); + if( v_started ) updateQuestionTD( ); + ShowVoteConfig( playerid ); + } + } + } + + else if( dialogid == DIALOG_VOTE_ADDOPTION ) { + if( GetPlayerAdminLevel( playerid ) >= 4 ) + if( response ) { + if( v_started ) { + SendClientMessage( playerid, -1, "{FF0000}[ERROR]{FFFFFF} You cannot edit options while poll is on." ); + ShowVoteConfig( playerid ); + return 1; + } + if( !strlen( inputtext ) ) + ShowPlayerDialog( playerid, DIALOG_VOTE_ADDOPTION, DIALOG_STYLE_INPUT, "{FFFFFF}Vote Settings - Add Option", "{FFFFFF}Write the option you want to add:\n\n{FF0000}Invalid text", "Add", "Back" ); + else { + if( getNextOptionID( ) != -1 ) { + format( v_option[ getNextOptionID( ) ], 50, inputtext ); + SendClientMessage(playerid, -1, "{C0C0C0}[VOTE]{FFFFFF} You've added a new option." ); + } + else + SendClientMessage(playerid, -1, "{FF0000}[ERROR]{FFFFFF} You can have a maximum of 5 options." ); + ShowVoteConfig( playerid ); + } + } + else if( !response ) + ShowVoteConfig( playerid ); + } + + else if( dialogid == DIALOG_VOTE_EDITOPTION ) { + if( GetPlayerAdminLevel( playerid ) >= 4 ) + if( response ) { + if( v_started ) { + SendClientMessage( playerid, -1, "{FF0000}[ERROR]{FFFFFF} You cannot edit options while poll is on." ); + ShowVoteConfig( playerid ); + return 1; + } + if( !strlen( inputtext ) ) + ShowPlayerDialog( playerid, DIALOG_VOTE_EDITOPTION, DIALOG_STYLE_INPUT, "{FFFFFF}Vote Settings - Edit Option", "{FFFFFF}Enter the text you want to set the option to:\n\n{FF0000}Invalid text", "Update", "Back" ); + else { + new optionid = GetPVarInt( playerid, "p_VoteEditOption" ); + format( v_option[ optionid ], 50, inputtext ); + SendClientMessage(playerid, -1, "{C0C0C0}[VOTE]{FFFFFF} You've updated an option." ); + ShowVoteConfig( playerid ); + } + } + else if( !response ) + ShowVoteConfig( playerid ); + } + return 1; +} + +stock ResetVoteAll( ) +{ + v_question = "n/a"; + for( new i = 0; i < 5; i++ ) v_option[ i ] = "n/a"; + ResetVotes( ); + endVote( ); +} + +stock ResetVotes( ) +{ + for( new i = 0; i < MAX_PLAYERS; i++ ) v_voted[ i ] = -1; + for( new i = 0; i < 5; i++ ) v_option_votes[ i ] = 0; +} + +stock startVote( ) +{ + v_started = true; + ResetVotes( ); + updateAllVote( ); + ShowVoteTextdrawsForAll( ); +} + +stock endVote( ) +{ + HideVoteTextdrawsForAll( ); + v_started = false; + ResetVotes( ); +} + +stock updateOptionTD( option ) +{ + if( strcmp( v_option[ option ], "n/a" ) ) { + new string[128]; + format(string, sizeof(string), "%i. (%d) %s", option+1, v_option_votes[ option ], v_option[ option ] ); + TextDrawSetString( v_TD_Option[ option ], string ); + } + else TextDrawSetString( v_TD_Option[ option ], " " ); +} + +stock updateQuestionTD( ) +{ + new question[ 80 ]; + format( question, sizeof( question ), "~y~POLL: ~w~~h~%s", v_question ); + TextDrawSetString( v_TD_Question, question ); +} +stock updateAllVote( ) +{ + updateQuestionTD( ); + for( new i = 0; i < 5; i++ ) + updateOptionTD( i ); +} + +stock ShowVoteConfig( playerid ) +{ + reorderOptions( ); + new finalstring[ 600 ]; + format( finalstring, sizeof( finalstring ), "{C0C0C0}QUESTION: {FFFFFF}%s\n", v_question); + + new c_options = 0; + for( new i = 0; i < 5; i++ ) if( strcmp( v_option[ i ], "n/a", true ) ) { + format( finalstring, sizeof( finalstring ), "%s{C0C0C0}%i. {FFFFFF}%s\n", finalstring, i+1, v_option[ i ] ); + c_options++; + } + if(c_options < 5) + format( finalstring, sizeof( finalstring ), "%s{FFFFFF}Add a new option..", finalstring ); + ShowPlayerDialog( playerid, DIALOG_VOTE_CONFIG, DIALOG_STYLE_LIST, "{FFFFFF}Vote Settings", finalstring, "Select", "Close" ); + +} + +stock reorderOptions( ) /// This thing, is to re-order options, like if there is option 1, 2 and 3, and I remove option 2, then option 3 will come in place of option 2. +{ + for( new i = 0; i < 5; i++ ) { + if( i + 1 < 5 ) + if( !strcmp( v_option[ i ], "n/a" ) && strcmp( v_option[ i+1 ], "n/a" ) ) { + v_option[ i ] = v_option[ i+1 ]; + v_option_votes[ i ] = v_option_votes[ i+1 ]; + v_option[ i+1 ] = "n/a"; + v_option_votes[ i+1 ] = 0; + } + } +} + +stock getNextOptionID( ) +{ + for( new i = 0; i < 5; i++ ) if( !strcmp( v_option[ i ], "n/a" ) ) { + return i; + } + return -1; +} + +stock didPlayerVote( playerid ) +{ + for( new i = 0; i < MAX_PLAYERS; i++ ) if( v_voted[ i ] == GetPlayerAccountID( playerid ) ) { + return true; + } + return false; +} + +stock AddPlayerVote( playerid, option ) +{ + for( new i = 0; i < MAX_PLAYERS; i++ ) { + if( v_voted[ i ] == -1 ) { + v_voted[ i ] = GetPlayerAccountID( playerid ); + v_option_votes[ option ]++; + updateOptionTD( option ); + break; + } + } +} + +stock LoadVotingTextdraws( ) +{ + v_TD_Question = TextDrawCreate( 16.000000, 168.000000, "POLL: Who's the best player here?" ); + TextDrawBackgroundColor( v_TD_Question, 255 ); + TextDrawFont( v_TD_Question, 1 ); + TextDrawLetterSize( v_TD_Question, 0.200000, 1.100000 ); + TextDrawColor( v_TD_Question, -1 ); + TextDrawSetOutline( v_TD_Question, 1 ); + TextDrawSetProportional( v_TD_Question, 1 ); + TextDrawSetSelectable( v_TD_Question, 0 ); + + new Float: td_y_temp = 182.000000; + for( new i = 0; i < 5; i++ ) { + v_TD_Option[ i ] = TextDrawCreate( 16.000000, td_y_temp, "1. (35) Cloudy" ); + TextDrawBackgroundColor( v_TD_Option[ i ], 255 ); + TextDrawFont( v_TD_Option[ i ], 1); + TextDrawLetterSize( v_TD_Option[ i ], 0.200000, 1.100000 ); + TextDrawColor( v_TD_Option[ i ], -1 ); + TextDrawSetOutline( v_TD_Option[ i ], 1 ); + TextDrawSetProportional( v_TD_Option[ i ], 1 ); + TextDrawSetSelectable( v_TD_Option[ i ], 0 ); + td_y_temp += 11.0; + } +} + +stock ShowVoteTextdrawsForPlayer( playerid ) +{ + if( v_started ) { + TextDrawShowForPlayer( playerid, v_TD_Question ); + for( new i = 0; i < 5; i++ ) { + if( strcmp( v_option[ i ], "n/a" ) ) TextDrawShowForPlayer( playerid, v_TD_Option[ i ] ); + else TextDrawHideForPlayer( playerid, v_TD_Option[ i ] ); + } + } +} + +stock HideVoteTextdrawsForPlayer( playerid ) +{ + if( v_started ) { + TextDrawHideForPlayer( playerid, v_TD_Question ); + for( new i = 0; i < 5; i++ ) { + TextDrawHideForPlayer( playerid, v_TD_Option[ i ] ); + } + } +} + +stock ShowVoteTextdrawsForAll( ) { + if( v_started ) { + TextDrawShowForAll( v_TD_Question ); + for( new i = 0; i < 5; i++ ) { + if( strcmp( v_option[ i ], "n/a" ) ) TextDrawShowForAll( v_TD_Option[ i ] ); + else TextDrawHideForAll( v_TD_Option[ i ] ); + } + } +} + +stock HideVoteTextdrawsForAll( ) { + if( v_started ) { + TextDrawHideForAll( v_TD_Question ); + for( new i = 0; i < 5; i++ ) TextDrawHideForAll( v_TD_Option[ i ] ); + } +} + +/* ** Commands **/ +CMD:vote( playerid, params[ ] ) +{ + if( GetPlayerAdminLevel( playerid ) < 4 ) + return SendClientMessage( playerid, -1, "{FF0000}[ERROR]{FFFFFF} You don't have an appropriate administration level to use this command." ); + + if( !strcmp( params, "start", true, 5 ) ) { + if( !strcmp( v_question, "n/a" ) ) + return SendClientMessage( playerid, -1, "{FF0000}[ERROR]{FFFFFF} You have not set a question for the vote." ); + + startVote( ); + new string[ 128 ]; + format( string, sizeof( string ), "{FF0770}[ADMIN]{FFFFFF} %s(%d) has started a new poll.", ReturnPlayerName( playerid ), playerid ); + SendClientMessageToAll( -1, string ); + } + else if( !strcmp( params, "end", true, 3 ) ) { + if( !v_started ) + return SendClientMessage( playerid, -1, "{FF0000}[ERROR]{FFFFFF} There are no poll to end." ); + + endVote( ); + new string[ 128 ]; + format( string, sizeof( string ), "{FF0770}[ADMIN]{FFFFFF} %s(%d) has ended the poll.", ReturnPlayerName( playerid ), playerid ); + SendClientMessageToAll( -1, string ); + } + else if( !strcmp( params, "reset", true, 5 ) ) { + if( v_started ) SendClientMessageToAll( -1, sprintf( "{FF0770}[ADMIN]{FFFFFF} %s(%d) has ended the poll.", ReturnPlayerName( playerid ), playerid ) ); + ResetVoteAll(); + SendClientMessage( playerid, -1, "{C0C0C0}[VOTE]{FFFFFF} You have reset vote parameters." ); + } + else if( !strcmp( params, "config", true, 6 ) ) { + ShowVoteConfig( playerid ); + } + else SendUsage( playerid, "/vote [RESET/START/END/CONFIG]" ); + return 1; +}