fixes turn issue when you pocket several balls
This commit is contained in:
parent
5445f06968
commit
3323e7f39e
@ -42,7 +42,7 @@ enum E_POOL_BALL_OFFSET_DATA
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const
|
static const
|
||||||
g_poolBallOffsetData[ ] [ E_POOL_BALL_OFFSET_DATA ] =
|
g_poolBallOffsetData[ 16 ] [ E_POOL_BALL_OFFSET_DATA ] =
|
||||||
{
|
{
|
||||||
{ 3003, "Cueball", E_CUE, 0.5000, 0.0000 },
|
{ 3003, "Cueball", E_CUE, 0.5000, 0.0000 },
|
||||||
{ 3002, "One", E_SOLID, -0.300, 0.0000 },
|
{ 3002, "One", E_SOLID, -0.300, 0.0000 },
|
||||||
@ -73,7 +73,7 @@ static const
|
|||||||
/* ** Variables ** */
|
/* ** Variables ** */
|
||||||
enum E_POOL_BALL_DATA
|
enum E_POOL_BALL_DATA
|
||||||
{
|
{
|
||||||
E_BALL_OBJECT[ 16 ], bool: E_EXISTS[ 16 ], bool: E_MOVING[ 16 ]
|
E_BALL_OBJECT[ 16 ], bool: E_POCKETED[ 16 ]
|
||||||
};
|
};
|
||||||
|
|
||||||
enum E_POOL_TABLE_DATA
|
enum E_POOL_TABLE_DATA
|
||||||
@ -86,6 +86,7 @@ enum E_POOL_TABLE_DATA
|
|||||||
E_NEXT_SHOOTER,
|
E_NEXT_SHOOTER,
|
||||||
|
|
||||||
E_SHOTS_LEFT, E_FOULS, E_PLAYER_8BALL_TARGET[ MAX_PLAYERS ],
|
E_SHOTS_LEFT, E_FOULS, E_PLAYER_8BALL_TARGET[ MAX_PLAYERS ],
|
||||||
|
bool: E_EXTRA_SHOT,
|
||||||
|
|
||||||
Float: E_POWER, E_DIRECTION,
|
Float: E_POWER, E_DIRECTION,
|
||||||
|
|
||||||
@ -100,7 +101,7 @@ new
|
|||||||
|
|
||||||
bool: p_isPlayingPool [ MAX_PLAYERS char ],
|
bool: p_isPlayingPool [ MAX_PLAYERS char ],
|
||||||
bool: p_PoolChalking [ MAX_PLAYERS char ],
|
bool: p_PoolChalking [ MAX_PLAYERS char ],
|
||||||
p_PoolCamera [ MAX_PLAYERS ],
|
bool: p_PoolCameraBirdsEye [ MAX_PLAYERS char ],
|
||||||
p_PoolScore [ MAX_PLAYERS ],
|
p_PoolScore [ MAX_PLAYERS ],
|
||||||
p_PoolHoleGuide [ MAX_PLAYERS ] = { -1, ... },
|
p_PoolHoleGuide [ MAX_PLAYERS ] = { -1, ... },
|
||||||
Float: p_PoolAngle [ MAX_PLAYERS ] [ 2 ],
|
Float: p_PoolAngle [ MAX_PLAYERS ] [ 2 ],
|
||||||
@ -113,7 +114,6 @@ new
|
|||||||
;
|
;
|
||||||
|
|
||||||
/* ** Forwards ** */
|
/* ** Forwards ** */
|
||||||
|
|
||||||
forward deleteBall ( poolid, ballid );
|
forward deleteBall ( poolid, ballid );
|
||||||
forward RestoreWeapon ( playerid );
|
forward RestoreWeapon ( playerid );
|
||||||
forward RestoreCamera ( playerid, poolid );
|
forward RestoreCamera ( playerid, poolid );
|
||||||
@ -121,7 +121,6 @@ forward OnPoolUpdate ( poolid );
|
|||||||
forward PlayPoolSound ( poolid, soundid );
|
forward PlayPoolSound ( poolid, soundid );
|
||||||
|
|
||||||
/* ** Hooks ** */
|
/* ** Hooks ** */
|
||||||
|
|
||||||
hook OnScriptInit( )
|
hook OnScriptInit( )
|
||||||
{
|
{
|
||||||
// textdraws
|
// textdraws
|
||||||
@ -201,8 +200,6 @@ hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
|
|||||||
{
|
{
|
||||||
if (g_poolTableData[ poolid ] [ E_AIMER ] == playerid)
|
if (g_poolTableData[ poolid ] [ E_AIMER ] == playerid)
|
||||||
{
|
{
|
||||||
if (p_PoolCamera[ playerid ] < 2) p_PoolCamera[ playerid ] ++;
|
|
||||||
else p_PoolCamera[ playerid ] = 0;
|
|
||||||
|
|
||||||
new Float:poolrot = p_PoolAngle[ playerid ] [ 0 ],
|
new Float:poolrot = p_PoolAngle[ playerid ] [ 0 ],
|
||||||
Float:Xa,
|
Float:Xa,
|
||||||
@ -213,22 +210,19 @@ hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
|
|||||||
|
|
||||||
GetObjectPos(g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], Xa, Ya, Za);
|
GetObjectPos(g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], Xa, Ya, Za);
|
||||||
|
|
||||||
switch (p_PoolCamera[ playerid ])
|
if ( ( p_PoolCameraBirdsEye{ playerid } = ! p_PoolCameraBirdsEye{ playerid } ) == false )
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
{
|
{
|
||||||
GetXYBehindObjectInAngle(g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], poolrot, x, y, 0.675);
|
GetXYBehindObjectInAngle(g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], poolrot, x, y, 0.675);
|
||||||
SetPlayerCameraPos(playerid, x, y, g_poolTableData[ poolid ] [ E_Z ] + DEFAULT_AIM);
|
SetPlayerCameraPos(playerid, x, y, g_poolTableData[ poolid ] [ E_Z ] + DEFAULT_AIM);
|
||||||
SetPlayerCameraLookAt(playerid, Xa, Ya, Za + 0.170);
|
SetPlayerCameraLookAt(playerid, Xa, Ya, Za + 0.170);
|
||||||
}
|
}
|
||||||
case 1 .. 2:
|
else
|
||||||
{
|
{
|
||||||
SetPlayerCameraPos(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ] + 2.0);
|
SetPlayerCameraPos(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ] + 2.0);
|
||||||
SetPlayerCameraLookAt(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ]);
|
SetPlayerCameraLookAt(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if ( RELEASED( KEY_HANDBRAKE ) )
|
if ( RELEASED( KEY_HANDBRAKE ) )
|
||||||
{
|
{
|
||||||
@ -250,7 +244,8 @@ hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
|
|||||||
GetPlayerPos( playerid, X, Y, Z );
|
GetPlayerPos( playerid, X, Y, Z );
|
||||||
GetObjectPos( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], Xa, Ya, Za );
|
GetObjectPos( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], Xa, Ya, Za );
|
||||||
|
|
||||||
new Float: distance_to_ball = GetDistanceFromPointToPoint( X, Y, Xa, Ya );
|
new
|
||||||
|
Float: distance_to_ball = GetDistanceFromPointToPoint( X, Y, Xa, Ya );
|
||||||
|
|
||||||
if ( distance_to_ball < 1.5 && Z < 999.5 )
|
if ( distance_to_ball < 1.5 && Z < 999.5 )
|
||||||
{
|
{
|
||||||
@ -269,7 +264,7 @@ hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
|
|||||||
|
|
||||||
SetPlayerCameraPos(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ] + 2.0);
|
SetPlayerCameraPos(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ] + 2.0);
|
||||||
|
|
||||||
ApplyAnimation(playerid, "POOL", "POOL_Med_Start", 50.0, 0, 0, 0, 1, 1, 1);
|
ApplyAnimation( playerid, "POOL", "POOL_Med_Start", 4.1, 0, 1, 1, 0, 0, 1 );
|
||||||
|
|
||||||
g_poolTableData[ poolid ] [ E_AIMER ] = playerid;
|
g_poolTableData[ poolid ] [ E_AIMER ] = playerid;
|
||||||
g_poolTableData[ poolid ] [ E_POWER ] = 1.0;
|
g_poolTableData[ poolid ] [ E_POWER ] = 1.0;
|
||||||
@ -287,11 +282,12 @@ hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
|
|||||||
TogglePlayerControllable(playerid, true);
|
TogglePlayerControllable(playerid, true);
|
||||||
GivePlayerWeapon(playerid, 7, 1);
|
GivePlayerWeapon(playerid, 7, 1);
|
||||||
|
|
||||||
ApplyAnimation(playerid, "CARRY", "crry_prtial", 1.0, 0, 0, 0, 0, 0, 1);
|
ClearAnimations( playerid );
|
||||||
SetCameraBehindPlayer( playerid );
|
SetCameraBehindPlayer( playerid );
|
||||||
|
|
||||||
g_poolTableData[ poolid ] [ E_AIMER ] = -1;
|
g_poolTableData[ poolid ] [ E_AIMER ] = -1;
|
||||||
DestroyObject( g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] );
|
DestroyObject( g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] );
|
||||||
|
g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -300,13 +296,16 @@ hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
|
|||||||
{
|
{
|
||||||
if ( g_poolTableData[ poolid ] [ E_AIMER ] == playerid )
|
if ( g_poolTableData[ poolid ] [ E_AIMER ] == playerid )
|
||||||
{
|
{
|
||||||
new
|
new Float: ball_x, Float: ball_y, Float: ball_z;
|
||||||
Float: speed;
|
new Float: speed;
|
||||||
|
|
||||||
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] --;
|
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] --;
|
||||||
|
|
||||||
Pool_UpdateScoreboard( poolid );
|
Pool_UpdateScoreboard( poolid );
|
||||||
ApplyAnimation( playerid, "POOL", "POOL_Med_Shot", 3.0, 0, 0, 0, 0, 0, 1 );
|
|
||||||
|
GetObjectPos( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], ball_x, ball_y, ball_z );
|
||||||
|
|
||||||
|
ApplyAnimation( playerid, "POOL", "POOL_Med_Shot", 4.1, 0, 1, 1, 0, 0, 1);
|
||||||
|
|
||||||
speed = 0.4 + ( g_poolTableData[ poolid ] [ E_POWER ] * 2.0 ) / 100.0;
|
speed = 0.4 + ( g_poolTableData[ poolid ] [ E_POWER ] * 2.0 ) / 100.0;
|
||||||
PHY_SetObjectVelocity(g_poolBallData[poolid] [E_BALL_OBJECT] [0], speed * floatsin(-p_PoolAngle[ playerid ] [ 0 ], degrees), speed * floatcos(-p_PoolAngle[ playerid ] [ 0 ], degrees));
|
PHY_SetObjectVelocity(g_poolBallData[poolid] [E_BALL_OBJECT] [0], speed * floatsin(-p_PoolAngle[ playerid ] [ 0 ], degrees), speed * floatcos(-p_PoolAngle[ playerid ] [ 0 ], degrees));
|
||||||
@ -317,6 +316,7 @@ hook OnPlayerKeyStateChange( playerid, newkeys, oldkeys )
|
|||||||
PlayPoolSound(poolid, 31810);
|
PlayPoolSound(poolid, 31810);
|
||||||
g_poolTableData[ poolid ] [ E_AIMER ] = -1;
|
g_poolTableData[ poolid ] [ E_AIMER ] = -1;
|
||||||
DestroyObject( g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] );
|
DestroyObject( g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] );
|
||||||
|
g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] = -1;
|
||||||
|
|
||||||
GivePlayerWeapon( playerid, 7, 1 );
|
GivePlayerWeapon( playerid, 7, 1 );
|
||||||
}
|
}
|
||||||
@ -514,6 +514,7 @@ stock RespawnPoolBalls( poolid )
|
|||||||
//ApplyAnimation(g_poolTableData[ poolid ] [ E_AIMER ], "CARRY", "crry_prtial", 1.0, 0, 0, 0, 0, 0);
|
//ApplyAnimation(g_poolTableData[ poolid ] [ E_AIMER ], "CARRY", "crry_prtial", 1.0, 0, 0, 0, 0, 0);
|
||||||
SetCameraBehindPlayer( g_poolTableData[ poolid ] [ E_AIMER ] );
|
SetCameraBehindPlayer( g_poolTableData[ poolid ] [ E_AIMER ] );
|
||||||
DestroyObject( g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] );
|
DestroyObject( g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] );
|
||||||
|
g_poolTableData[ poolid ] [ E_AIMER_OBJECT ] = -1;
|
||||||
|
|
||||||
//TextDrawHideForPlayer(g_poolTableData[ poolid ] [ E_AIMER ], gPoolTD);
|
//TextDrawHideForPlayer(g_poolTableData[ poolid ] [ E_AIMER ], gPoolTD);
|
||||||
//HidePlayerProgressBar(g_poolTableData[ poolid ] [ E_AIMER ], g_PoolPowerBar[g_poolTableData[ poolid ] [ E_AIMER ]]);
|
//HidePlayerProgressBar(g_poolTableData[ poolid ] [ E_AIMER ], g_PoolPowerBar[g_poolTableData[ poolid ] [ E_AIMER ]]);
|
||||||
@ -530,11 +531,10 @@ stock RespawnPoolBalls( poolid )
|
|||||||
RotateXY( g_poolBallOffsetData[ i ] [ E_OFFSET_X ], g_poolBallOffsetData[ i ] [ E_OFFSET_Y ], g_poolTableData[ poolid ] [ E_ANGLE ], offset_x, offset_y );
|
RotateXY( g_poolBallOffsetData[ i ] [ E_OFFSET_X ], g_poolBallOffsetData[ i ] [ E_OFFSET_Y ], g_poolTableData[ poolid ] [ E_ANGLE ], offset_x, offset_y );
|
||||||
|
|
||||||
// reset balls
|
// reset balls
|
||||||
if ( g_poolBallData[ poolid ] [ E_EXISTS ] [ i ] ) {
|
if ( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] != -1 ) {
|
||||||
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
||||||
g_poolBallData[ poolid ] [ E_EXISTS ] [ i ] = false;
|
|
||||||
}
|
|
||||||
DestroyObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
DestroyObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
// create pool balls on table
|
// create pool balls on table
|
||||||
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] = CreateObject(
|
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] = CreateObject(
|
||||||
@ -563,7 +563,7 @@ stock InitBalls(poolid, ballid)
|
|||||||
PHY_SetObjectAirResistance(g_poolBallData[poolid] [E_BALL_OBJECT] [ballid], 0.2);
|
PHY_SetObjectAirResistance(g_poolBallData[poolid] [E_BALL_OBJECT] [ballid], 0.2);
|
||||||
PHY_RollObject(g_poolBallData[poolid] [E_BALL_OBJECT] [ballid]);
|
PHY_RollObject(g_poolBallData[poolid] [E_BALL_OBJECT] [ballid]);
|
||||||
|
|
||||||
g_poolBallData[ poolid ] [ E_EXISTS ] [ ballid ] = true;
|
g_poolBallData[ poolid ] [ E_POCKETED ] [ ballid ] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
stock RotateXY( Float: xi, Float: yi, Float: angle, &Float: xf, &Float: yf )
|
stock RotateXY( Float: xi, Float: yi, Float: angle, &Float: xf, &Float: yf )
|
||||||
@ -585,16 +585,22 @@ stock GetXYBehindObjectInAngle(objectid, Float:a, &Float:x2, &Float:y2, Float:di
|
|||||||
stock AreAllBallsStopped( poolid )
|
stock AreAllBallsStopped( poolid )
|
||||||
{
|
{
|
||||||
new
|
new
|
||||||
Float: x, Float: y, Float: z;
|
balls_not_moving = 0;
|
||||||
|
|
||||||
for ( new i = 0; i < 16; i ++ ) if ( g_poolBallData[ poolid ] [ E_EXISTS ] [ i ] )
|
new bool: checklist[ 16];
|
||||||
{
|
|
||||||
PHY_GetObjectVelocity( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ], x, y, z );
|
|
||||||
|
|
||||||
if ( x != 0.0 || y != 0.0 )
|
for ( new i = 0; i < 16; i ++ ) if ( g_poolBallData[ poolid ] [ E_POCKETED ] [ i ] || ! PHY_IsObjectMoving( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] ) ) {
|
||||||
return 0;
|
balls_not_moving ++;
|
||||||
|
checklist[i] = true;
|
||||||
}
|
}
|
||||||
return 1;
|
|
||||||
|
szBigString = "";
|
||||||
|
for ( new i = 0; i < 16; i++ ) {
|
||||||
|
if ( checklist[i] == false ) format( szBigString, sizeof(szBigString), "%s%s(%d), ", szBigString, g_poolBallOffsetData[i][E_BALL_NAME], i);
|
||||||
|
}
|
||||||
|
printf("not stopped: %s", szBigString);
|
||||||
|
|
||||||
|
return balls_not_moving >= 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
stock GetAngleToXY(Float:X, Float:Y, Float:CurrX, Float:CurrY, &Float:angle)
|
stock GetAngleToXY(Float:X, Float:Y, Float:CurrX, Float:CurrY, &Float:angle)
|
||||||
@ -698,17 +704,14 @@ stock Pool_EndGame( poolid )
|
|||||||
g_poolTableData[ poolid ] [ E_AIMER ] = -1;
|
g_poolTableData[ poolid ] [ E_AIMER ] = -1;
|
||||||
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 0;
|
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 0;
|
||||||
g_poolTableData[ poolid ] [ E_FOULS ] = 0;
|
g_poolTableData[ poolid ] [ E_FOULS ] = 0;
|
||||||
|
g_poolTableData[ poolid ] [ E_EXTRA_SHOT ] = false;
|
||||||
|
|
||||||
KillTimer(g_poolTableData[ poolid ] [ E_TIMER ]);
|
KillTimer(g_poolTableData[ poolid ] [ E_TIMER ]);
|
||||||
for (new i = 0; i < 16; i ++)
|
|
||||||
{
|
|
||||||
DestroyObject(g_poolBallData[poolid] [E_BALL_OBJECT] [i]);
|
|
||||||
|
|
||||||
if (g_poolBallData[poolid] [E_EXISTS] [i])
|
for ( new i = 0; i < 16; i ++ ) if ( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] != -1 ) {
|
||||||
{
|
|
||||||
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
||||||
g_poolBallData[poolid] [E_EXISTS] [i] = false;
|
DestroyObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
||||||
}
|
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateDynamic3DTextLabelText( g_poolTableData[ poolid ] [ E_LABEL ], COLOR_GREY, DEFAULT_POOL_STRING );
|
UpdateDynamic3DTextLabelText( g_poolTableData[ poolid ] [ E_LABEL ], COLOR_GREY, DEFAULT_POOL_STRING );
|
||||||
@ -762,24 +765,26 @@ public OnPoolUpdate(poolid)
|
|||||||
newrot = p_PoolAngle[ playerid ] [ 0 ] + (lr > 0 ? 0.9 : -0.9);
|
newrot = p_PoolAngle[ playerid ] [ 0 ] + (lr > 0 ? 0.9 : -0.9);
|
||||||
dist = GetDistanceBetweenPoints( X, Y, 0.0, Xa, Ya, 0.0 );
|
dist = GetDistanceBetweenPoints( X, Y, 0.0, Xa, Ya, 0.0 );
|
||||||
|
|
||||||
|
printf("%f", dist);
|
||||||
|
if ( dist < 0.85 ) {
|
||||||
|
dist = 0.85;
|
||||||
|
}
|
||||||
|
|
||||||
if (AngleInRangeOfAngle(p_PoolAngle[ playerid ] [ 1 ], newrot, 30.0))
|
if (AngleInRangeOfAngle(p_PoolAngle[ playerid ] [ 1 ], newrot, 30.0))
|
||||||
{
|
{
|
||||||
p_PoolAngle[ playerid ] [ 0 ] = newrot;
|
p_PoolAngle[ playerid ] [ 0 ] = newrot;
|
||||||
switch (p_PoolCamera[ playerid ])
|
|
||||||
{
|
if ( ! p_PoolCameraBirdsEye{ playerid } )
|
||||||
case 0:
|
|
||||||
{
|
{
|
||||||
GetXYBehindObjectInAngle(g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], newrot, x, y, 0.675);
|
GetXYBehindObjectInAngle(g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ], newrot, x, y, 0.675);
|
||||||
|
|
||||||
SetPlayerCameraPos(playerid, x, y, g_poolTableData[ poolid ] [ E_Z ] + DEFAULT_AIM);
|
SetPlayerCameraPos(playerid, x, y, g_poolTableData[ poolid ] [ E_Z ] + DEFAULT_AIM);
|
||||||
SetPlayerCameraLookAt(playerid, Xa, Ya, Za + 0.170);
|
SetPlayerCameraLookAt(playerid, Xa, Ya, Za + 0.170);
|
||||||
}
|
}
|
||||||
case 1, 2:
|
else
|
||||||
{
|
{
|
||||||
SetPlayerCameraPos(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ] + 2.0);
|
SetPlayerCameraPos(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ] + 2.0);
|
||||||
SetPlayerCameraLookAt(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ]);
|
SetPlayerCameraLookAt(playerid, g_poolTableData[ poolid ] [ E_X ], g_poolTableData[ poolid ] [ E_Y ], g_poolTableData[ poolid ] [ E_Z ]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
GetXYInFrontOfPos(Xa, Ya, newrot + 180, x, y, 0.085);
|
GetXYInFrontOfPos(Xa, Ya, newrot + 180, x, y, 0.085);
|
||||||
SetObjectPos(g_poolTableData[ poolid ] [ E_AIMER_OBJECT ], x, y, Za);
|
SetObjectPos(g_poolTableData[ poolid ] [ E_AIMER_OBJECT ], x, y, Za);
|
||||||
@ -812,9 +817,6 @@ public OnPoolUpdate(poolid)
|
|||||||
g_poolTableData[ poolid ] [ E_POWER ] = 100.0;
|
g_poolTableData[ poolid ] [ E_POWER ] = 100.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TextDrawTextSize(g_PoolTextdraw[2], 501.0 + ((67.0 * g_poolTableData[ poolid ] [ E_POWER ])/100.0), 0.0);
|
|
||||||
// TextDrawShowForPlayer(playerid, g_PoolTextdraw[2]);
|
|
||||||
|
|
||||||
// ShowPlayerPoolTextdraw(playerid);
|
// ShowPlayerPoolTextdraw(playerid);
|
||||||
|
|
||||||
SetPlayerProgressBarMaxValue(playerid, g_PoolPowerBar[playerid], 67.0);
|
SetPlayerProgressBarMaxValue(playerid, g_PoolPowerBar[playerid], 67.0);
|
||||||
@ -828,9 +830,8 @@ public OnPoolUpdate(poolid)
|
|||||||
new
|
new
|
||||||
current_player = g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ];
|
current_player = g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ];
|
||||||
|
|
||||||
if ( ! g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] && AreAllBallsStopped( poolid ) )
|
if ( ( ! g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] || g_poolTableData[ poolid ] [ E_FOULS ] || g_poolTableData[ poolid ] [ E_EXTRA_SHOT ] ) && AreAllBallsStopped( poolid ) )
|
||||||
{
|
{
|
||||||
Pool_ResetBallPositions( poolid );
|
|
||||||
Pool_QueueNextPlayer( poolid, current_player );
|
Pool_QueueNextPlayer( poolid, current_player );
|
||||||
SetTimerEx( "RestoreCamera", 800, 0, "dd", current_player, poolid );
|
SetTimerEx( "RestoreCamera", 800, 0, "dd", current_player, poolid );
|
||||||
}
|
}
|
||||||
@ -839,23 +840,6 @@ public OnPoolUpdate(poolid)
|
|||||||
|
|
||||||
public RestoreCamera(playerid, poolid)
|
public RestoreCamera(playerid, poolid)
|
||||||
{
|
{
|
||||||
if (!g_poolBallData[poolid] [E_EXISTS] [0])
|
|
||||||
{
|
|
||||||
DestroyObject(g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ]);
|
|
||||||
|
|
||||||
new Float: x, Float: y, Float: pos[3], Float: angle;
|
|
||||||
|
|
||||||
pos[0] = g_poolTableData[ poolid ] [ E_X ];
|
|
||||||
pos[1] = g_poolTableData[ poolid ] [ E_Y ];
|
|
||||||
pos[2] = g_poolTableData[ poolid ] [ E_Z ];
|
|
||||||
angle = g_poolTableData[ poolid ] [ E_ANGLE ];
|
|
||||||
|
|
||||||
RotateXY(0.5, 0.0, angle, x, y);
|
|
||||||
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ] = CreateObject(3003, x + pos[0], y + pos[1], (pos[2] - 0.045), 0, 0, 0);
|
|
||||||
|
|
||||||
InitBalls(poolid, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( g_poolTableData[ poolid ] [ E_AIMER ] == playerid )
|
if ( g_poolTableData[ poolid ] [ E_AIMER ] == playerid )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -868,12 +852,11 @@ public RestoreCamera(playerid, poolid)
|
|||||||
|
|
||||||
public deleteBall( poolid, ballid )
|
public deleteBall( poolid, ballid )
|
||||||
{
|
{
|
||||||
if (g_poolBallData[poolid] [E_MOVING] [ballid])
|
if ( g_poolBallData[ poolid ] [ E_POCKETED ] [ ballid ] && g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ ballid ] != -1 )
|
||||||
{
|
{
|
||||||
g_poolBallData[poolid] [E_EXISTS] [ballid] = false;
|
|
||||||
DestroyObject(g_poolBallData[poolid] [E_BALL_OBJECT] [ballid]);
|
|
||||||
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ ballid ] );
|
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ ballid ] );
|
||||||
g_poolBallData[poolid] [E_MOVING] [ballid] = false;
|
DestroyObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ ballid ] );
|
||||||
|
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ ballid ] = -1;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -926,9 +909,16 @@ public PHY_OnObjectCollideWithWall( objectid, wallid )
|
|||||||
|
|
||||||
public PHY_OnObjectUpdate( objectid )
|
public PHY_OnObjectUpdate( objectid )
|
||||||
{
|
{
|
||||||
|
new
|
||||||
|
poolball_index = GetPoolBallIndexFromModel( GetObjectModel( objectid ) );
|
||||||
|
|
||||||
|
if ( poolball_index == -1 ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
foreach ( new poolid : pooltables ) if ( g_poolTableData[ poolid ] [ E_STARTED ] )
|
foreach ( new poolid : pooltables ) if ( g_poolTableData[ poolid ] [ E_STARTED ] )
|
||||||
{
|
{
|
||||||
for ( new j = 0; j < 16; j ++ ) if ( objectid == g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ j ] && ! g_poolBallData[ poolid ] [ E_MOVING ] [ j ] && PHY_IsObjectMoving( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ j ] ) )
|
if ( objectid == g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ poolball_index ] && ! g_poolBallData[ poolid ] [ E_POCKETED ] [ poolball_index ] && PHY_IsObjectMoving( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ poolball_index ] ) )
|
||||||
{
|
{
|
||||||
new
|
new
|
||||||
holeid = IsBallInHole( poolid, objectid );
|
holeid = IsBallInHole( poolid, objectid );
|
||||||
@ -938,7 +928,6 @@ public PHY_OnObjectUpdate( objectid )
|
|||||||
new first_player = Iter_First( poolplayers< poolid > );
|
new first_player = Iter_First( poolplayers< poolid > );
|
||||||
new second_player = Iter_Last( poolplayers< poolid > );
|
new second_player = Iter_Last( poolplayers< poolid > );
|
||||||
new current_player = g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ];
|
new current_player = g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ];
|
||||||
new poolball_index = GetPoolBallIndexFromModel( GetObjectModel( objectid ) );
|
|
||||||
|
|
||||||
// printf ("first_player %d, second_player %d, current_player = %d", first_player, second_player, current_player);
|
// printf ("first_player %d, second_player %d, current_player = %d", first_player, second_player, current_player);
|
||||||
|
|
||||||
@ -973,24 +962,10 @@ public PHY_OnObjectUpdate( objectid )
|
|||||||
{
|
{
|
||||||
GameTextForPlayer( current_player, "~n~~n~~n~~r~~h~You have pocketed the cue ball!", 10000, 4 );
|
GameTextForPlayer( current_player, "~n~~n~~n~~r~~h~You have pocketed the cue ball!", 10000, 4 );
|
||||||
|
|
||||||
// respawn the cue ball
|
|
||||||
if ( ! g_poolBallData[ poolid ] [ E_EXISTS ] [ 0 ] )
|
|
||||||
{
|
|
||||||
|
|
||||||
new
|
|
||||||
Float: x, Float: y;
|
|
||||||
|
|
||||||
RotateXY( 0.5, 0.0, g_poolTableData[ poolid ] [ E_ANGLE ], x, y );
|
|
||||||
|
|
||||||
DestroyObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ] );
|
|
||||||
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ] = CreateObject( 3003, g_poolTableData[ poolid ] [ E_X ] + x, g_poolTableData[ poolid ] [ E_Y ] + y, g_poolTableData[ poolid ] [ E_Z ], 0.0, 0.0, 0.0 );
|
|
||||||
|
|
||||||
InitBalls( poolid, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// penalty for that
|
// penalty for that
|
||||||
g_poolTableData[ poolid ] [ E_FOULS ] ++;
|
g_poolTableData[ poolid ] [ E_FOULS ] ++;
|
||||||
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 0;
|
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 0;
|
||||||
|
g_poolTableData[ poolid ] [ E_EXTRA_SHOT ] = false;
|
||||||
}
|
}
|
||||||
else if ( g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_8BALL )
|
else if ( g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_8BALL )
|
||||||
{
|
{
|
||||||
@ -1005,15 +980,17 @@ public PHY_OnObjectUpdate( objectid )
|
|||||||
// check if valid shot
|
// check if valid shot
|
||||||
if ( p_PoolScore[ current_player ] < 7 )
|
if ( p_PoolScore[ current_player ] < 7 )
|
||||||
{
|
{
|
||||||
|
p_PoolScore[ opposite_player ] ++;
|
||||||
Pool_SendTableMessage( poolid, COLOR_YELLOW, "%s(%d) has accidentally pocketed the 8-Ball ... %s(%d) wins!", ReturnPlayerName( current_player ), current_player, ReturnPlayerName( opposite_player ), opposite_player );
|
Pool_SendTableMessage( poolid, COLOR_YELLOW, "%s(%d) has accidentally pocketed the 8-Ball ... %s(%d) wins!", ReturnPlayerName( current_player ), current_player, ReturnPlayerName( opposite_player ), opposite_player );
|
||||||
}
|
}
|
||||||
else if ( g_poolTableData[ poolid ] [ E_PLAYER_8BALL_TARGET ] [ current_player ] != holeid )
|
else if ( g_poolTableData[ poolid ] [ E_PLAYER_8BALL_TARGET ] [ current_player ] != holeid )
|
||||||
{
|
{
|
||||||
|
p_PoolScore[ opposite_player ] ++;
|
||||||
Pool_SendTableMessage( poolid, COLOR_YELLOW, "%s(%d) has put the 8-Ball in the wrong pocket ... %s(%d) wins!", ReturnPlayerName( current_player ), current_player, ReturnPlayerName( opposite_player ), opposite_player );
|
Pool_SendTableMessage( poolid, COLOR_YELLOW, "%s(%d) has put the 8-Ball in the wrong pocket ... %s(%d) wins!", ReturnPlayerName( current_player ), current_player, ReturnPlayerName( opposite_player ), opposite_player );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p_PoolScore[ current_player ] ++; // shows on the end result if we do it anyway here
|
p_PoolScore[ current_player ] ++;
|
||||||
Pool_OnPlayerWin( poolid, current_player );
|
Pool_OnPlayerWin( poolid, current_player );
|
||||||
}
|
}
|
||||||
return Pool_EndGame( poolid );
|
return Pool_EndGame( poolid );
|
||||||
@ -1030,12 +1007,13 @@ public PHY_OnObjectUpdate( objectid )
|
|||||||
GameTextForPlayer( current_player, "~n~~n~~n~~r~wrong ball", 3000, 4);
|
GameTextForPlayer( current_player, "~n~~n~~n~~r~wrong ball", 3000, 4);
|
||||||
|
|
||||||
foreach ( new playerid : poolplayers< poolid > ) {
|
foreach ( new playerid : poolplayers< poolid > ) {
|
||||||
SendClientMessageFormatted( playerid, COLOR_RED, "* %s(%d) has wrongly pocketed %s, instead of %s!", ReturnPlayerName( current_player ), current_player, g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_STRIPED ? ( "Striped" ) : ( "Solid" ), g_poolTableData[ poolid ] [ E_PLAYER_BALL_TYPE ] [ current_player ] == E_STRIPED ? ( "Striped" ) : ( "Solid" ) );
|
SendClientMessageFormatted( playerid, COLOR_RED, "* %s(%d) has wrongly pocketed %s %s, instead of %s!", ReturnPlayerName( current_player ), current_player, g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_STRIPED ? ( "Striped" ) : ( "Solid" ), g_poolBallOffsetData[ poolball_index ] [ E_BALL_NAME ], g_poolTableData[ poolid ] [ E_PLAYER_BALL_TYPE ] [ current_player ] == E_STRIPED ? ( "Striped" ) : ( "Solid" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// penalty for that
|
// penalty for that
|
||||||
g_poolTableData[ poolid ] [ E_FOULS ] ++;
|
g_poolTableData[ poolid ] [ E_FOULS ] ++;
|
||||||
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 0;
|
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 0;
|
||||||
|
g_poolTableData[ poolid ] [ E_EXTRA_SHOT ] = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1047,9 +1025,8 @@ public PHY_OnObjectUpdate( objectid )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// extra shot for scoring one's own
|
// extra shot for scoring one's own
|
||||||
if ( ! g_poolTableData[ poolid ] [ E_FOULS ] ) {
|
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = g_poolTableData[ poolid ] [ E_FOULS ] > 0 ? 0 : 1;
|
||||||
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 1;
|
g_poolTableData[ poolid ] [ E_EXTRA_SHOT ] = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// mark final target hole
|
// mark final target hole
|
||||||
@ -1067,6 +1044,7 @@ public PHY_OnObjectUpdate( objectid )
|
|||||||
p_PoolHoleGuide[ player_being_marked ] = CreateDynamicObject( 18643, g_poolTableData[ poolid ] [ E_X ] + hole_x, g_poolTableData[ poolid ] [ E_Y ] + hole_y, g_poolTableData[ poolid ] [ E_Z ] - 0.5, 0.0, -90.0, 0.0, .playerid = player_being_marked );
|
p_PoolHoleGuide[ player_being_marked ] = CreateDynamicObject( 18643, g_poolTableData[ poolid ] [ E_X ] + hole_x, g_poolTableData[ poolid ] [ E_Y ] + hole_y, g_poolTableData[ poolid ] [ E_Z ] - 0.5, 0.0, -90.0, 0.0, .playerid = player_being_marked );
|
||||||
g_poolTableData[ poolid ] [ E_PLAYER_8BALL_TARGET ] [ player_being_marked ] = opposite_holeid;
|
g_poolTableData[ poolid ] [ E_PLAYER_8BALL_TARGET ] [ player_being_marked ] = opposite_holeid;
|
||||||
SendPoolMessage( player_being_marked, "You are now required to put the 8-Ball in the designated pocket." );
|
SendPoolMessage( player_being_marked, "You are now required to put the 8-Ball in the designated pocket." );
|
||||||
|
Streamer_Update( player_being_marked );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1075,20 +1053,24 @@ public PHY_OnObjectUpdate( objectid )
|
|||||||
RotateXY( g_poolPotOffsetData[ holeid ] [ 0 ], g_poolPotOffsetData[ holeid ] [ 1 ], g_poolTableData[ poolid ] [ E_ANGLE ], hole_x, hole_y );
|
RotateXY( g_poolPotOffsetData[ holeid ] [ 0 ], g_poolPotOffsetData[ holeid ] [ 1 ], g_poolTableData[ poolid ] [ E_ANGLE ], hole_x, hole_y );
|
||||||
|
|
||||||
// move object into the pocket
|
// move object into the pocket
|
||||||
MoveObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ j ], g_poolTableData[ poolid ] [ E_X ] + hole_x, g_poolTableData[ poolid ] [ E_Y ] + hole_y, g_poolTableData[ poolid ] [ E_Z ] - 0.5, 1.0);
|
new move_speed = MoveObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ poolball_index ], g_poolTableData[ poolid ] [ E_X ] + hole_x, g_poolTableData[ poolid ] [ E_Y ] + hole_y, g_poolTableData[ poolid ] [ E_Z ] - 0.5, 1.0);
|
||||||
|
|
||||||
g_poolBallData[ poolid ] [ E_MOVING ] [ j ] = true;
|
// mark ball as pocketed
|
||||||
|
g_poolBallData[ poolid ] [ E_POCKETED ] [ poolball_index ] = true;
|
||||||
|
|
||||||
SetTimerEx( "deleteBall", 500, false, "dd", poolid, j );
|
// delete it anyway
|
||||||
|
SetTimerEx( "deleteBall", move_speed + 100, false, "dd", poolid, poolball_index );
|
||||||
PlayerPlaySound( current_player, 31803, 0.0, 0.0, 0.0 );
|
|
||||||
|
|
||||||
// update scoreboard
|
// update scoreboard
|
||||||
Pool_UpdateScoreboard( poolid );
|
Pool_UpdateScoreboard( poolid );
|
||||||
|
PlayerPlaySound( current_player, 31803, 0.0, 0.0, 0.0 );
|
||||||
|
|
||||||
// reset cam
|
// reset cam
|
||||||
Pool_QueueNextPlayer( poolid, current_player );
|
/*if ( AreAllBallsStopped( poolid ) ) {
|
||||||
|
printf ( "Second %d" , g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] );
|
||||||
|
Pool_QueueNextPlayer( poolid, g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ] );
|
||||||
SetTimerEx( "RestoreCamera", 800, 0, "dd", current_player, poolid );
|
SetTimerEx( "RestoreCamera", 800, 0, "dd", current_player, poolid );
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1096,14 +1078,11 @@ public PHY_OnObjectUpdate( objectid )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
CMD:fakescore( playerid, params [ ]) {
|
|
||||||
p_PoolScore[ playerid ] = 6;
|
|
||||||
Pool_UpdateScoreboard(GetClosestPoolTable(playerid ));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
stock Pool_OnPlayerWin( poolid, winning_player )
|
stock Pool_OnPlayerWin( poolid, winning_player )
|
||||||
{
|
{
|
||||||
|
if ( ! IsPlayerConnected( winning_player ) )
|
||||||
|
return 0;
|
||||||
|
|
||||||
// restore camera
|
// restore camera
|
||||||
RestoreCamera( winning_player, poolid );
|
RestoreCamera( winning_player, poolid );
|
||||||
|
|
||||||
@ -1116,9 +1095,10 @@ stock Pool_OnPlayerWin( poolid, winning_player )
|
|||||||
|
|
||||||
stock Pool_QueueNextPlayer( poolid, current_player )
|
stock Pool_QueueNextPlayer( poolid, current_player )
|
||||||
{
|
{
|
||||||
if ( g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] > 0 && g_poolTableData[ poolid ] [ E_FOULS ] < 1 )
|
if ( g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] && g_poolTableData[ poolid ] [ E_FOULS ] < 1 )
|
||||||
{
|
{
|
||||||
Pool_SendTableMessage( poolid, COLOR_RED, "%s(%d) has %d shots remaining!", ReturnPlayerName( current_player ), current_player, g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] );
|
g_poolTableData[ poolid ] [ E_EXTRA_SHOT ] = false;
|
||||||
|
Pool_SendTableMessage( poolid, COLOR_RED, "%s(%d) has %d shot remaining!", ReturnPlayerName( current_player ), current_player, g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1127,14 +1107,36 @@ stock Pool_QueueNextPlayer( poolid, current_player )
|
|||||||
|
|
||||||
g_poolTableData[ poolid ] [ E_FOULS ] = 0;
|
g_poolTableData[ poolid ] [ E_FOULS ] = 0;
|
||||||
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 1;
|
g_poolTableData[ poolid ] [ E_SHOTS_LEFT ] = 1;
|
||||||
|
g_poolTableData[ poolid ] [ E_EXTRA_SHOT ] = false;
|
||||||
g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ] = current_player == first_player ? second_player : first_player;
|
g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ] = current_player == first_player ? second_player : first_player;
|
||||||
|
|
||||||
// reset ball positions just incase
|
// reset ball positions just incase
|
||||||
Pool_SendTableMessage( poolid, COLOR_RED, "%s(%d)'s turn to play!", ReturnPlayerName( g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ] ), g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ] );
|
Pool_SendTableMessage( poolid, COLOR_RED, "%s(%d)'s turn to play!", ReturnPlayerName( g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ] ), g_poolTableData[ poolid ] [ E_NEXT_SHOOTER ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// respawn the cue ball if it has been pocketed
|
||||||
|
if ( g_poolBallData[ poolid ] [ E_POCKETED ] [ 0 ] )
|
||||||
|
{
|
||||||
|
new
|
||||||
|
Float: x, Float: y;
|
||||||
|
|
||||||
|
RotateXY( 0.5, 0.0, g_poolTableData[ poolid ] [ E_ANGLE ], x, y );
|
||||||
|
|
||||||
|
// make sure object dont exist
|
||||||
|
if ( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ] != -1 ) {
|
||||||
|
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ] );
|
||||||
|
DestroyObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// recreate cueball
|
||||||
|
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ 0 ] = CreateObject( 3003, g_poolTableData[ poolid ] [ E_X ] + x, g_poolTableData[ poolid ] [ E_Y ] + y, g_poolTableData[ poolid ] [ E_Z ] - 0.045, 0.0, 0.0, 0.0 );
|
||||||
|
|
||||||
|
InitBalls( poolid, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
// update turn
|
// update turn
|
||||||
Pool_UpdateScoreboard( poolid );
|
Pool_UpdateScoreboard( poolid );
|
||||||
|
Pool_ResetBallPositions( poolid );
|
||||||
}
|
}
|
||||||
|
|
||||||
stock Pool_SendTableMessage( poolid, colour, format[ ], va_args<> ) // Conversion to foreach 14 stuffed the define, not sure how...
|
stock Pool_SendTableMessage( poolid, colour, format[ ], va_args<> ) // Conversion to foreach 14 stuffed the define, not sure how...
|
||||||
@ -1155,11 +1157,10 @@ stock Pool_ResetBallPositions( poolid )
|
|||||||
static Float: last_x, Float: last_y, Float: last_z;
|
static Float: last_x, Float: last_y, Float: last_z;
|
||||||
static Float: last_rx, Float: last_ry, Float: last_rz;
|
static Float: last_rx, Float: last_ry, Float: last_rz;
|
||||||
|
|
||||||
for ( new i = 0; i < sizeof( g_poolBallOffsetData ); i ++ ) if ( g_poolBallData[ poolid ] [ E_EXISTS ] [ i ] )
|
for ( new i = 0; i < sizeof( g_poolBallOffsetData ); i ++ ) if ( ! g_poolBallData[ poolid ] [ E_POCKETED ] [ i ] )
|
||||||
{
|
{
|
||||||
if ( ! IsValidObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] ) ) {
|
if ( ! IsValidObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] ) )
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
new
|
new
|
||||||
modelid = GetObjectModel( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
modelid = GetObjectModel( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
||||||
@ -1169,8 +1170,10 @@ stock Pool_ResetBallPositions( poolid )
|
|||||||
GetObjectRot( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ], last_rx, last_ry, last_rz );
|
GetObjectRot( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ], last_rx, last_ry, last_rz );
|
||||||
|
|
||||||
// destroy object
|
// destroy object
|
||||||
|
if ( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] != -1 ) {
|
||||||
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
PHY_DeleteObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
||||||
DestroyObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
DestroyObject( g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
// create pool balls on table
|
// create pool balls on table
|
||||||
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] = CreateObject( modelid, last_x, last_y, last_z, last_rx, last_ry, last_rz );
|
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] = CreateObject( modelid, last_x, last_y, last_z, last_rx, last_ry, last_rz );
|
||||||
@ -1180,14 +1183,14 @@ stock Pool_ResetBallPositions( poolid )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*hook OnPlayerWeaponShot( playerid, weaponid, hittype, hitid, Float: fX, Float: fY, Float: fZ )
|
hook OnPlayerWeaponShot( playerid, weaponid, hittype, hitid, Float: fX, Float: fY, Float: fZ )
|
||||||
{
|
{
|
||||||
if ( hittype == BULLET_HIT_TYPE_OBJECT )
|
if ( hittype == BULLET_HIT_TYPE_OBJECT )
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
/* ** Commands ** */
|
/* ** Commands ** */
|
||||||
CMD:endgame(playerid)
|
CMD:endgame(playerid)
|
||||||
|
Loading…
Reference in New Issue
Block a user