2018-03-15 04:20:47 +00:00
/*
* Irresistible Gaming ( c ) 2018
2018-03-30 08:42:56 +00:00
* Developed by Damen , Lorenc
* Module : Boxing
* Purpose : Boxing for Visage
2018-03-15 04:20:47 +00:00
*/
2018-03-30 08:42:56 +00:00
/* ** Includes ** */
#include < YSI\y_hooks >
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
/* ** Definitions ** */
#define IsPlayerBoxing(%0) (g_boxingPlayerData[ %0 ] [ E_FIGHTING ])
#define SendBoxing(%0,%1) (SendClientMessageFormatted( %0, -1, "{B74AFF}[BOXING] {FFFFFF}" # %1))
#define SendBoxingGlobal(%0) (SendClientMessageFormatted( INVALID_PLAYER_ID, -1, "{B74AFF}[BOXING] {FFFFFF}" # %0))
#define IsPlayerNearBoxingArena(%0) (GetPlayerDistanceFromPoint( %0, 2654.885986, 1613.157958, 1506.269042 ) < 25.0)
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
/* ** Variables ** */
2018-03-15 04:20:47 +00:00
enum E_BOXER_DATA {
2018-03-30 08:42:56 +00:00
bool : E_FIGHTING ,
2018-03-15 04:20:47 +00:00
E_OPPONENT ,
2018-03-30 08:42:56 +00:00
bool : E_INVITED ,
E_INVITE_TIMESTAMP ,
2018-03-15 04:20:47 +00:00
E_ROUNDS_SET ,
E_BET_AMOUNT_SET ,
2018-03-30 08:42:56 +00:00
bool : E_IS_HOST ,
2018-03-15 04:20:47 +00:00
E_SCORE ,
2018-03-30 08:42:56 +00:00
Float : E_PRIOR_HEALTH ,
Float : E_PRIOR_ARMOUR ,
E_PRIOR_WEP [ 12 ],
E_PRIOR_WEP_AMMO [ 12 ],
E_PRIOR_SKIN
2018-03-15 04:20:47 +00:00
};
enum E_ARENA_DATA {
bool : E_OCCUPIED ,
E_CD_TIMER ,
E_CURRENT_ROUNDS ,
E_ROUNDS ,
E_BET
};
2018-03-30 08:42:56 +00:00
new g_boxingPlayerData [ MAX_PLAYERS ] [ E_BOXER_DATA ];
new g_boxingArenaData [ E_ARENA_DATA ];
new Text3D : arenaLabel = Text3D : INVALID_3DTEXT_ID ;
/* ** Hooks ** */
hook OnGameModeInit ( ) {
print ( " -> Boxing System - By: Damen " );
arenaLabel = CreateDynamic3DTextLabel ( " Boxing Arena \n { FFFFFF}/boxing fight " , COLOR_GREY , 2655.3022 , 1613.6146 , 1507.0977 , 15.0 );
return 1 ;
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
hook OnPlayerConnect ( playerid ) {
g_boxingPlayerData [ playerid ] [ E_FIGHTING ] = false ;
g_boxingPlayerData [ playerid ] [ E_OPPONENT ] = - 1 ;
g_boxingPlayerData [ playerid ] [ E_INVITED ] = false ;
g_boxingPlayerData [ playerid ] [ E_ROUNDS_SET ] = 1 ;
g_boxingPlayerData [ playerid ] [ E_BET_AMOUNT_SET ] = 0 ;
g_boxingPlayerData [ playerid ] [ E_IS_HOST ] = false ;
g_boxingPlayerData [ playerid ] [ E_SCORE ] = 0 ;
return 1 ;
}
hook OnPlayerDisconnect ( playerid , reason ) {
2018-03-30 14:20:37 +00:00
boxing_ForfeitMatch ( playerid , g_boxingPlayerData [ playerid ] [ E_OPPONENT ] );
return 1 ;
}
#if defined AC_INCLUDED
hook OnPlayerDeathEx ( playerid , killerid , reason , Float : damage , bodypart )
#else
hook OnPlayerDeath ( playerid , killerid , reason )
#endif
{
2018-06-23 07:54:55 +00:00
boxing_ForfeitMatch ( playerid , g_boxingPlayerData [ playerid ] [ E_OPPONENT ] );
// printf("BOXING MATCH DEATH BY %s -> RETURN %d", ReturnPlayerName(playerid), );
2018-03-30 08:42:56 +00:00
return 1 ;
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
/* ** Commands ** */
2018-03-15 04:20:47 +00:00
CMD : boxing ( playerid , params [ ] ) {
2018-03-30 08:42:56 +00:00
if ( ! IsPlayerNearBoxingArena ( playerid ) )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " You must be within 25 meters of the arena to use this command. " );
if ( g_boxingArenaData [ E_OCCUPIED ] == true )
2018-04-13 04:50:25 +00:00
return SendError ( playerid , " The arena is currently occupied. Please wait for the arena to clear. " );
if ( GetPlayerWantedLevel ( playerid ) )
return SendError ( playerid , " You cannot box while you are currently wanted. " );
2018-03-15 04:20:47 +00:00
if ( ! strcmp ( params , " fight " , true , 5 ) ) {
2018-03-30 08:42:56 +00:00
new targetID , betAmount , rounds ;
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_FIGHTING ] == true )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " You are currently fighting an opponent. Please finish your fight. " );
2018-03-30 08:42:56 +00:00
if ( sscanf ( params [ 6 ], " uD(0)D(3) " , targetID , betAmount , rounds ) )
return SendUsage ( playerid , " /boxing fight [PLAYER_ID] [BET_AMOUNT (0)] [ROUNDS (3)] " );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( ! IsPlayerConnected ( targetID ) )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " Player is not connected. " );
if ( targetID == playerid )
return SendError ( playerid , " You cannot invite yourself to a boxing match. " );
2018-03-30 08:42:56 +00:00
if ( ! IsPlayerNearBoxingArena ( targetID ) )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " The player you have invited to a boxing match is not near the boxing arena. " );
2018-03-30 08:42:56 +00:00
if ( GetPlayerCash ( targetID ) < betAmount )
return SendError ( playerid , " The player you invited does not have enough money to wager that amount. " );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( ! ( 0 <= betAmount <= 10000000 ) )
return SendError ( playerid , " Please specify an amount between $ 0 and $ 10,000,000. " );
2018-03-15 04:20:47 +00:00
2018-08-02 00:29:19 +00:00
if ( rounds != 1 && rounds != 3 && rounds != 5 && rounds != 9 )
return SendError ( playerid , " Please choose between 1, 3, 5, or 9 rounds. " );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ targetID ] [ E_INVITED ] == true )
return SendError ( playerid , " That player has already been invited to a fight. " );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ targetID ] [ E_FIGHTING ] == true )
return SendError ( playerid , " That player is currently fighting another opponent. Please wait until after their match to reinvite them. " );
2018-03-15 04:20:47 +00:00
2018-04-13 04:50:25 +00:00
if ( GetPlayerWantedLevel ( targetID ) )
return SendError ( playerid , " You cannot box a wanted player. " );
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_INVITED ] == true ) {
SendBoxing ( playerid , " You have cancelled your invite to %s. " , ReturnPlayerName ( g_boxingPlayerData [ playerid ] [ E_OPPONENT ] ) );
SendBoxing ( g_boxingPlayerData [ playerid ] [ E_OPPONENT ], " %s has cancelled the match invite. " , ReturnPlayerName ( playerid ) );
ResetBoxingPlayerVariables ( playerid , g_boxingPlayerData [ playerid ] [ E_OPPONENT ] );
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
g_boxingPlayerData [ playerid ] [ E_INVITED ] = true ;
g_boxingPlayerData [ playerid ] [ E_OPPONENT ] = targetID ;
g_boxingPlayerData [ playerid ] [ E_IS_HOST ] = true ;
g_boxingPlayerData [ playerid ] [ E_ROUNDS_SET ] = rounds ;
g_boxingPlayerData [ playerid ] [ E_BET_AMOUNT_SET ] = betAmount ;
g_boxingPlayerData [ targetID ] [ E_INVITED ] = true ;
g_boxingPlayerData [ targetID ] [ E_OPPONENT ] = playerid ;
g_boxingPlayerData [ targetID ] [ E_INVITE_TIMESTAMP ] = GetServerTime ( ) + 30000 ;
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_BET_AMOUNT_SET ] == 0 ) {
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
SendBoxing ( playerid , " You have invited %s to a boxing match with no wager through %i round(s). " , ReturnPlayerName ( targetID ), g_boxingPlayerData [ playerid ] [ E_ROUNDS_SET ] );
2018-03-15 04:20:47 +00:00
SendBoxing ( playerid , " To cancel your invite, use /boxing [CANCEL]. " );
2018-03-30 08:42:56 +00:00
SendBoxing ( targetID , " %s has invited you to a boxing match with no wager through %i round(s). " , ReturnPlayerName ( playerid ), g_boxingPlayerData [ playerid ] [ E_ROUNDS_SET ] );
2018-03-15 04:20:47 +00:00
SendBoxing ( targetID , " To accept or decline the invite, use /boxing [ACCEPT/DECLINE]. " );
} else {
2018-03-30 08:42:56 +00:00
SendBoxing ( playerid , " You have invited %s to a boxing match with a %s wager through %i round(s). " , ReturnPlayerName ( targetID ), number_format ( g_boxingPlayerData [ playerid ] [ E_BET_AMOUNT_SET ] ), g_boxingPlayerData [ playerid ] [ E_ROUNDS_SET ] );
2018-03-15 04:20:47 +00:00
SendBoxing ( playerid , " To cancel your invite, use /boxing [CANCEL]. " );
2018-03-30 08:42:56 +00:00
SendBoxing ( targetID , " %s has invited you to a boxing match with a %s wager through %i round(s). " , ReturnPlayerName ( playerid ), number_format ( g_boxingPlayerData [ playerid ] [ E_BET_AMOUNT_SET ] ), g_boxingPlayerData [ playerid ] [ E_ROUNDS_SET ] );
2018-03-15 04:20:47 +00:00
SendBoxing ( targetID , " To accept or decline the invite, use /boxing [ACCEPT/DECLINE]. " );
}
2018-03-30 08:42:56 +00:00
return 1 ;
2018-03-15 04:20:47 +00:00
} else if ( ! strcmp ( params , " cancel " , true , 6 ) ) {
2018-03-30 08:42:56 +00:00
new opponent = g_boxingPlayerData [ playerid ] [ E_OPPONENT ];
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_FIGHTING ] == true )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " You're currently in a boxing match. Use /boxing [FORFEIT] if you would like to forfeit the match. " );
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_IS_HOST ] == false )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " You have no boxing match invites to cancel. " );
2018-03-30 08:42:56 +00:00
SendBoxing ( opponent , " %s has cancelled the boxing match invitation. " , ReturnPlayerName ( playerid ) );
SendBoxing ( playerid , " You have cancelled the boxing match invitation sent to %s. " , ReturnPlayerName ( opponent ) );
2018-03-15 04:20:47 +00:00
ResetBoxingPlayerVariables ( playerid , opponent );
return 1 ;
} else if ( ! strcmp ( params , " accept " , true , 6 ) ) {
2018-03-30 08:42:56 +00:00
new opponent = g_boxingPlayerData [ playerid ] [ E_OPPONENT ];
if ( GetServerTime ( ) > g_boxingPlayerData [ playerid ] [ E_INVITE_TIMESTAMP ] && g_boxingPlayerData [ playerid ] [ E_INVITED ] ) {
SendServerMessage ( opponent , " %s has attempted to accept your boxing invite after it has expired. " , ReturnPlayerName ( playerid ) );
ResetBoxingPlayerVariables ( playerid , opponent );
return SendError ( playerid , " This invitation has expired. " );
}
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_INVITED ] == false )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " You do not have any boxing match invitations to accept. " );
if ( opponent == - 1 )
return SendError ( playerid , " Your opponent is no longer available to fight. " );
2018-03-30 08:42:56 +00:00
if ( ! IsPlayerNearBoxingArena ( opponent ) ) {
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
SendError ( playerid , " %s is no longer near the arena. Your invitation has been cancelled. " , ReturnPlayerName ( opponent ) );
SendBoxing ( opponent , " %s has attempted to accept your invite while you were not near the arena. " , ReturnPlayerName ( playerid ) );
2018-03-15 04:20:47 +00:00
return ResetBoxingPlayerVariables ( playerid , opponent );
}
2018-03-30 08:42:56 +00:00
if ( GetPlayerCash ( playerid ) < g_boxingPlayerData [ opponent ] [ E_BET_AMOUNT_SET ] ) {
2018-03-15 04:20:47 +00:00
SendError ( playerid , " You do not have enough money to participate in the match with the bet amount set. " );
2018-03-30 08:42:56 +00:00
SendError ( opponent , " %s does not have enough money to participate in the match with the bet amount set. " , ReturnPlayerName ( playerid ) );
2018-03-15 04:20:47 +00:00
return ResetBoxingPlayerVariables ( playerid , opponent );
2018-03-30 08:42:56 +00:00
} else if ( GetPlayerCash ( opponent ) < g_boxingPlayerData [ opponent ] [ E_BET_AMOUNT_SET ] ) {
2018-03-15 04:20:47 +00:00
SendError ( opponent , " You do not have enough money to participate in the match with the bet amount set. " );
2018-03-30 08:42:56 +00:00
SendError ( playerid , " %s does not have enough money to participate in the match with the bet amount set. " , ReturnPlayerName ( opponent ) );
2018-03-15 04:20:47 +00:00
return ResetBoxingPlayerVariables ( playerid , opponent );
}
2018-09-07 14:20:55 +00:00
g_boxingArenaData [ E_OCCUPIED ] = true ;
2018-03-30 08:42:56 +00:00
g_boxingPlayerData [ playerid ] [ E_FIGHTING ] = true ;
g_boxingPlayerData [ playerid ] [ E_INVITED ] = false ;
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
g_boxingPlayerData [ opponent ] [ E_FIGHTING ] = true ;
g_boxingPlayerData [ opponent ] [ E_INVITED ] = false ;
g_boxingPlayerData [ opponent ] [ E_IS_HOST ] = true ;
2018-03-15 04:20:47 +00:00
return StartMatch ( playerid , opponent );
} else if ( ! strcmp ( params , " decline " , true , 7 ) ) {
2018-03-30 08:42:56 +00:00
new opponent = g_boxingPlayerData [ playerid ] [ E_OPPONENT ];
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_INVITED ] == false )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " You do not have any boxing match invitations to decline. " );
2018-03-30 08:42:56 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_OPPONENT ] == - 1 )
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " Your opponent is no longer available to fight. " );
2018-03-30 08:42:56 +00:00
SendBoxing ( opponent , " %s has declined your invitation. " , ReturnPlayerName ( playerid ) );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
SendBoxing ( playerid , " You have declined %s's invitation. " , ReturnPlayerName ( opponent ) );
2018-03-15 04:20:47 +00:00
return ResetBoxingPlayerVariables ( playerid , opponent );
} else if ( ! strcmp ( params , " forfeit " , true , 7 ) ) {
2018-03-30 14:20:37 +00:00
if ( ! boxing_ForfeitMatch ( playerid , g_boxingPlayerData [ playerid ] [ E_OPPONENT ] ) ) {
2018-03-15 04:20:47 +00:00
return SendError ( playerid , " You're not fighting anyone. " );
2018-03-30 14:20:37 +00:00
}
return 1 ;
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
return SendUsage ( playerid , " /boxing [FIGHT/CANCEL/ACCEPT/DECLINE/FORFEIT] " );
2018-03-15 04:20:47 +00:00
}
2018-03-25 13:02:19 +00:00
/* ** Functions ** */
2018-03-30 08:42:56 +00:00
stock StartMatch ( playerid , targetID ) {
2018-03-15 04:20:47 +00:00
2018-04-01 23:40:18 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_FIGHTING ] && g_boxingPlayerData [ targetID ] [ E_FIGHTING ] ) {
2018-03-15 04:20:47 +00:00
new Float : health_P , Float : armour_P , Float : health_T , Float : armour_T ;
2018-03-30 11:39:53 +00:00
ClearAnimations ( playerid );
2018-03-15 04:20:47 +00:00
GetPlayerHealth ( playerid , health_P );
GetPlayerArmour ( playerid , armour_P );
2018-04-01 23:40:18 +00:00
SetPlayerSpecialAction ( playerid , SPECIAL_ACTION_NONE );
2018-03-30 08:42:56 +00:00
g_boxingPlayerData [ playerid ] [ E_PRIOR_HEALTH ] = health_P ;
g_boxingPlayerData [ playerid ] [ E_PRIOR_ARMOUR ] = armour_P ;
g_boxingPlayerData [ playerid ] [ E_PRIOR_SKIN ] = GetPlayerSkin ( playerid );
SetPlayerSkin ( playerid , 81 );
2018-03-15 04:20:47 +00:00
2018-03-30 11:39:53 +00:00
ClearAnimations ( targetID );
2018-03-15 04:20:47 +00:00
GetPlayerHealth ( targetID , health_T );
GetPlayerArmour ( targetID , armour_T );
2018-04-01 23:40:18 +00:00
SetPlayerSpecialAction ( targetID , SPECIAL_ACTION_NONE );
2018-03-30 08:42:56 +00:00
g_boxingPlayerData [ targetID ] [ E_PRIOR_HEALTH ] = health_T ;
g_boxingPlayerData [ targetID ] [ E_PRIOR_ARMOUR ] = armour_T ;
g_boxingPlayerData [ targetID ] [ E_PRIOR_SKIN ] = GetPlayerSkin ( targetID );
SetPlayerSkin ( targetID , 80 );
// save weapons
for ( new iSlot = 0 ; iSlot != 12 ; iSlot ++ ) {
GetPlayerWeaponData ( playerid , iSlot , g_boxingPlayerData [ playerid ] [ E_PRIOR_WEP ] [ iSlot ], g_boxingPlayerData [ playerid ] [ E_PRIOR_WEP_AMMO ] [ iSlot ] );
GetPlayerWeaponData ( targetID , iSlot , g_boxingPlayerData [ targetID ] [ E_PRIOR_WEP ] [ iSlot ], g_boxingPlayerData [ targetID ] [ E_PRIOR_WEP_AMMO ] [ iSlot ] );
}
g_boxingArenaData [ E_ROUNDS ] = g_boxingPlayerData [ targetID ] [ E_ROUNDS_SET ];
g_boxingArenaData [ E_BET ] = g_boxingPlayerData [ targetID ] [ E_BET_AMOUNT_SET ];
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingArenaData [ E_BET ] > 0 ) {
GivePlayerCash ( playerid , - g_boxingArenaData [ E_BET ] );
GivePlayerCash ( targetID , - g_boxingArenaData [ E_BET ] );
}
2018-03-15 04:20:47 +00:00
SetBoxingPlayerConfig ( playerid , targetID );
KillTimer ( g_boxingArenaData [ E_CD_TIMER ] );
2018-03-30 08:42:56 +00:00
g_boxingArenaData [ E_CD_TIMER ] = SetTimerEx ( " boxingCountDown " , 960 , false , " d " , 5 );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
SendBoxing ( playerid , " You are fighting %s through the best of %i round(s). Good luck! " , ReturnPlayerName ( targetID ), g_boxingArenaData [ E_ROUNDS ] );
SendBoxing ( targetID , " You are fighting %s through the best of %i round(s). Good luck! " , ReturnPlayerName ( playerid ), g_boxingArenaData [ E_ROUNDS ] );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
UpdateArenaScoreLabel ( playerid , targetID );
2018-03-15 04:20:47 +00:00
return true ;
} else {
return SendError ( playerid , " I'm sorry. Something has gone terribly wrong with starting the match. Please try again. " );
}
}
2018-03-30 08:42:56 +00:00
stock NextRound ( playerid , targetID )
{
UpdateArenaScoreLabel ( playerid , targetID );
2018-03-15 04:20:47 +00:00
SetBoxingPlayerConfig ( playerid , targetID );
KillTimer ( g_boxingArenaData [ E_CD_TIMER ] );
2018-03-30 08:42:56 +00:00
g_boxingArenaData [ E_CD_TIMER ] = SetTimerEx ( " boxingCountDown " , 960 , false , " d " , 5 );
return 1 ;
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
stock EndMatch ( playerid , targetID ) {
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
new winnerid = g_boxingPlayerData [ targetID ] [ E_SCORE ] > g_boxingPlayerData [ playerid ] [ E_SCORE ] ? targetID : playerid ;
new loserid = winnerid == playerid ? targetID : playerid ;
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingArenaData [ E_BET ] <= 0 ) {
SendBoxingGlobal ( " %s has won a boxing match against %s with a final score of %i! " , ReturnPlayerName ( winnerid ), ReturnPlayerName ( loserid ), g_boxingPlayerData [ winnerid ] [ E_SCORE ] );
} else {
2018-03-30 14:20:37 +00:00
new winning_prize = floatround ( float ( g_boxingArenaData [ E_BET ] ) * 1.9 ); // We take 5% of the total pot
2018-03-30 08:42:56 +00:00
GivePlayerCash ( winnerid , winning_prize );
SendBoxingGlobal ( " %s has won a boxing match against %s for %s with a final score of %i! " , ReturnPlayerName ( winnerid ), ReturnPlayerName ( loserid ), number_format ( g_boxingArenaData [ E_BET ] ), g_boxingPlayerData [ winnerid ] [ E_SCORE ] );
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
boxing_RestorePlayer ( playerid );
boxing_RestorePlayer ( targetID );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
SetPlayerPos ( playerid , 2658.3181 , 1607.2100 , 1507.1793 );
SetPlayerPos ( targetID , 2652.0947 , 1607.2100 , 1507.1793 );
2018-03-15 04:20:47 +00:00
ResetBoxingArenaVariables ();
ResetBoxingPlayerVariables ( playerid , targetID );
2018-03-30 08:42:56 +00:00
UpdateDynamic3DTextLabelText ( arenaLabel , COLOR_GREY , " Boxing Arena \n " COL_WHITE " /boxing fight " );
return 1 ;
}
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
stock boxing_RestorePlayer ( playerid )
{
2018-03-30 14:20:37 +00:00
// user reported 0xff health, maybe spawn protection
if ( g_boxingPlayerData [ playerid ] [ E_PRIOR_HEALTH ] > 100.0 ) g_boxingPlayerData [ playerid ] [ E_PRIOR_HEALTH ] = 100.0 ;
if ( g_boxingPlayerData [ playerid ] [ E_PRIOR_ARMOUR ] > 100.0 ) g_boxingPlayerData [ playerid ] [ E_PRIOR_ARMOUR ] = 100.0 ;
// set prior health
2018-03-30 08:42:56 +00:00
SetPlayerHealth ( playerid , g_boxingPlayerData [ playerid ] [ E_PRIOR_HEALTH ] );
SetPlayerArmour ( playerid , g_boxingPlayerData [ playerid ] [ E_PRIOR_ARMOUR ] );
SetPlayerSkin ( playerid , g_boxingPlayerData [ playerid ] [ E_PRIOR_SKIN ] );
ResetPlayerWeapons ( playerid );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
for ( new iSlot = 0 ; iSlot != 12 ; iSlot ++ ) {
GivePlayerWeapon ( playerid , g_boxingPlayerData [ playerid ] [ E_PRIOR_WEP ] [ iSlot ], g_boxingPlayerData [ playerid ] [ E_PRIOR_WEP_AMMO ] [ iSlot ] );
}
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
stock boxing_ForfeitMatch ( playerid , targetID ) {
2018-03-30 14:20:37 +00:00
if ( ! g_boxingPlayerData [ playerid ] [ E_FIGHTING ] ) return 0 ;
2018-03-15 04:20:47 +00:00
if ( g_boxingArenaData [ E_BET ] == 0 ) {
2018-03-30 08:42:56 +00:00
SendBoxingGlobal ( " %s has won a boxing match by forfeit against %s. " , ReturnPlayerName ( targetID ), ReturnPlayerName ( playerid ) );
2018-03-15 04:20:47 +00:00
} else if ( g_boxingArenaData [ E_BET ] > 0 ) {
2018-03-30 08:42:56 +00:00
GivePlayerCash ( targetID , g_boxingArenaData [ E_BET ] );
SendBoxingGlobal ( " %s has won a boxing match by forfeit against %s for %s. " , ReturnPlayerName ( targetID ), ReturnPlayerName ( playerid ), number_format ( g_boxingArenaData [ E_BET ] ) );
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
boxing_RestorePlayer ( playerid );
SetPlayerPos ( playerid , 2658.3181 , 1607.2100 , 1507.1793 );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( 0 <= targetID < MAX_PLAYERS ) {
boxing_RestorePlayer ( targetID );
2018-04-01 23:40:18 +00:00
SetPlayerPos ( targetID , 2652.0947 , 1607.2100 , 1507.1793 );
2018-03-30 08:42:56 +00:00
}
2018-03-15 04:20:47 +00:00
ResetBoxingArenaVariables ();
ResetBoxingPlayerVariables ( playerid , targetID );
2018-03-30 08:42:56 +00:00
UpdateDynamic3DTextLabelText ( arenaLabel , COLOR_GREY , " Boxing Arena \n " COL_WHITE " /boxing fight " );
return 1 ;
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
stock SetBoxingPlayerConfig ( playerid , targetID ) {
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
SetPlayerPos ( playerid , 2657.4133 , 1615.7841 , 1507.0977 );
SetPlayerPos ( targetID , 2653.1357 , 1611.4575 , 1507.0977 );
2018-03-15 04:20:47 +00:00
SetPlayerFacingAngle ( playerid , 136 );
SetPlayerFacingAngle ( targetID , 315 );
SetCameraBehindPlayer ( playerid );
SetCameraBehindPlayer ( targetID );
SetPlayerHealth ( playerid , 100.0 );
SetPlayerHealth ( targetID , 100.0 );
SetPlayerArmour ( playerid , 100.0 );
SetPlayerArmour ( targetID , 100.0 );
ResetPlayerWeapons ( playerid );
ResetPlayerWeapons ( targetID );
TogglePlayerControllable ( playerid , 0 );
TogglePlayerControllable ( targetID , 0 );
return true ;
}
2018-03-25 13:02:19 +00:00
function boxingCountDown ( time ) {
2018-03-15 04:20:47 +00:00
if ( ! time ) {
2018-03-30 08:42:56 +00:00
foreach ( new playerid : Player ) {
if ( g_boxingPlayerData [ playerid ] [ E_FIGHTING ] == true ) {
2018-03-15 04:20:47 +00:00
format ( szNormalString , sizeof ( szNormalString ), " ~r~FIGHT! " , time );
GameTextForPlayer ( playerid , szNormalString , 2000 , 3 );
PlayerPlaySound ( playerid , 1057 , 0.0 , 0.0 , 0.0 );
TogglePlayerControllable ( playerid , 1 );
}
}
2018-03-30 08:42:56 +00:00
g_boxingArenaData [ E_CD_TIMER ] = - 1 ;
2018-03-15 04:20:47 +00:00
} else {
2018-03-30 08:42:56 +00:00
foreach ( new playerid : Player ) {
2018-04-01 23:40:18 +00:00
if ( g_boxingPlayerData [ playerid ] [ E_FIGHTING ] == true ) {
2018-03-15 04:20:47 +00:00
format ( szNormalString , sizeof ( szNormalString ), " ~y~%d " , time );
GameTextForPlayer ( playerid , szNormalString , 2000 , 3 );
PlayerPlaySound ( playerid , 1056 , 0.0 , 0.0 , 0.0 );
}
}
g_boxingArenaData [ E_CD_TIMER ] = SetTimerEx ( " boxingCountDown " , 960 , false , " d " , time - 1 );
}
2018-03-30 08:42:56 +00:00
return 1 ;
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
stock UpdateArenaScoreLabel ( playerid , opponent ) {
format ( szNormalString , sizeof ( szNormalString ), " %s [ %i ] - [ %i ] %s " , ReturnPlayerName ( playerid ), g_boxingPlayerData [ playerid ] [ E_SCORE ], g_boxingPlayerData [ opponent ] [ E_SCORE ], ReturnPlayerName ( opponent ) );
return UpdateDynamic3DTextLabelText ( arenaLabel , COLOR_GOLD , szNormalString );
}
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
stock ResetBoxingPlayerVariables ( playerid , targetID ) {
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
g_boxingPlayerData [ playerid ] [ E_INVITED ] = false ;
g_boxingPlayerData [ playerid ] [ E_OPPONENT ] = - 1 ;
g_boxingPlayerData [ playerid ] [ E_IS_HOST ] = false ;
g_boxingPlayerData [ playerid ] [ E_FIGHTING ] = false ;
g_boxingPlayerData [ playerid ] [ E_SCORE ] = 0 ;
TogglePlayerControllable ( playerid , 1 );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( 0 <= targetID < MAX_PLAYERS )
{
g_boxingPlayerData [ targetID ] [ E_INVITED ] = false ;
g_boxingPlayerData [ targetID ] [ E_OPPONENT ] = - 1 ;
g_boxingPlayerData [ targetID ] [ E_IS_HOST ] = false ;
g_boxingPlayerData [ targetID ] [ E_FIGHTING ] = false ;
g_boxingPlayerData [ targetID ] [ E_SCORE ] = 0 ;
TogglePlayerControllable ( targetID , 1 );
2018-03-15 04:20:47 +00:00
}
return true ;
}
2018-03-30 08:42:56 +00:00
stock ResetBoxingArenaVariables () {
g_boxingArenaData [ E_OCCUPIED ] = false ;
g_boxingArenaData [ E_CURRENT_ROUNDS ] = 0 ;
g_boxingArenaData [ E_ROUNDS ] = 0 ;
g_boxingArenaData [ E_BET ] = 0 ;
return true ;
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
/* Hooks */
#if defined AC_INCLUDED
hook OnPlayerDamagePlayer ( playerid , damagedid , Float : amount , weaponid , bodypart )
#else
hook OnPlayerGiveDamage ( playerid , damagedid , Float : amount , weaponid , bodypart )
#endif
{
if ( g_boxingPlayerData [ damagedid ] [ E_FIGHTING ] == true ) {
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
new Float : currentArmour ;
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
GetPlayerArmour ( damagedid , currentArmour );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( currentArmour <= 0.0 ) {
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
new opponent = g_boxingPlayerData [ damagedid ] [ E_OPPONENT ];
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
g_boxingPlayerData [ opponent ] [ E_SCORE ] ++ ;
g_boxingArenaData [ E_CURRENT_ROUNDS ] ++ ;
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
if ( g_boxingArenaData [ E_CURRENT_ROUNDS ] == g_boxingArenaData [ E_ROUNDS ] ) {
return EndMatch ( damagedid , opponent );
2018-03-15 04:20:47 +00:00
}
2018-03-30 08:42:56 +00:00
SendBoxing ( damagedid , " You have lost the round. Let the next round begin. " );
SendBoxing ( opponent , " You have won the round. Let the next round begin. " );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
SendBoxing ( damagedid , " Best of %i - [ %s: %i ] - [ %s: %i ] " , g_boxingArenaData [ E_ROUNDS ], ReturnPlayerName ( damagedid ), g_boxingPlayerData [ damagedid ] [ E_SCORE ], ReturnPlayerName ( opponent ), g_boxingPlayerData [ opponent ] [ E_SCORE ] );
SendBoxing ( opponent , " Best of %i - [ %s: %i ] - [ %s: %i ] " , g_boxingArenaData [ E_ROUNDS ], ReturnPlayerName ( damagedid ), g_boxingPlayerData [ damagedid ] [ E_SCORE ], ReturnPlayerName ( opponent ), g_boxingPlayerData [ opponent ] [ E_SCORE ] );
2018-03-15 04:20:47 +00:00
2018-03-30 08:42:56 +00:00
NextRound ( damagedid , opponent );
2018-03-15 04:20:47 +00:00
}
}
2018-03-30 08:42:56 +00:00
return Y_HOOKS_CONTINUE_RETURN_1 ;
2018-03-15 04:20:47 +00:00
}