detects ball type and number

This commit is contained in:
Lorenc Pekaj 2018-09-12 10:59:04 +10:00
parent e317d90417
commit ff9ee58d55

View File

@ -23,18 +23,38 @@
#define COL_POOL "{C0C0C0}" #define COL_POOL "{C0C0C0}"
/* ** Constants (do not modify) ** */ /* ** Constants (do not modify) ** */
enum E_POOL_BALL_TYPE {
E_STRIPED,
E_SOLID,
E_CUE,
E_8BALL
};
enum E_POOL_BALL_OFFSET_DATA enum E_POOL_BALL_OFFSET_DATA
{ {
E_MODEL_ID, Float: E_OFFSET_X, Float: E_OFFSET_Y E_MODEL_ID, E_BALL_NAME[ 9 ], E_POOL_BALL_TYPE: E_BALL_TYPE,
Float: E_OFFSET_X, Float: E_OFFSET_Y
}; };
static const static const
g_poolBallOffsetData[ ] [ E_POOL_BALL_OFFSET_DATA ] = g_poolBallOffsetData[ ] [ E_POOL_BALL_OFFSET_DATA ] =
{ {
{ 3003, 0.5, 0.0 }, { 3002, -0.3, 0.0 }, { 3100, -0.525, -0.040 }, { 3101, -0.375, 0.044 }, { 3003, "Cueball", E_CUE, 0.5000, 0.0000 },
{ 3102, -0.600, 0.079 }, { 3103, -0.525, 0.118 }, { 3104, -0.600, -0.157 }, { 3105, -0.450, -0.079 }, { 3002, "One", E_SOLID, -0.300, 0.0000 },
{ 3106, -0.450, 0.0 }, { 2995, -0.375, -0.044 }, { 2996, -0.450, 0.079 }, { 2997, -0.525, -0.118 }, { 3100, "Two", E_SOLID, -0.525, -0.040 },
{ 2998, -0.600, -0.079 }, { 2999, -0.600, 0.0 }, { 3000, -0.600, 0.157 }, { 3001, -0.525, 0.040 } { 3101, "Three", E_SOLID, -0.375, 0.0440 },
{ 3102, "Four", E_SOLID, -0.600, 0.0790 },
{ 3103, "Five", E_SOLID, -0.525, 0.1180 },
{ 3104, "Six", E_SOLID, -0.600, -0.157 },
{ 3105, "Seven", E_SOLID, -0.450, -0.079 },
{ 3106, "Eight", E_8BALL, -0.450, 0.0000 },
{ 2995, "Nine", E_STRIPED, -0.375, -0.044 },
{ 2996, "Ten", E_STRIPED, -0.450, 0.0790 },
{ 2997, "Eleven", E_STRIPED, -0.525, -0.118 },
{ 2998, "Twelve", E_STRIPED, -0.600, -0.079 },
{ 2999, "Thirteen", E_STRIPED, -0.600, 0.0000 },
{ 3000, "Fourteen", E_STRIPED, -0.600, 0.1570 },
{ 3001, "Fiftteen", E_STRIPED, -0.525, 0.0400 }
}, },
Float: g_poolPotOffsetData[ ] [ ] = Float: g_poolPotOffsetData[ ] [ ] =
{ {
@ -55,10 +75,13 @@ enum E_POOL_TABLE_DATA
Float: E_X, Float: E_Y, Float: E_Z, Float: E_X, Float: E_Y, Float: E_Z,
Float: E_ANGLE, E_WORLD, E_INTERIOR, Float: E_ANGLE, E_WORLD, E_INTERIOR,
E_TIMER, E_COUNTDOWN, E_PLAYER[ 2 ], E_TIMER, E_PLAYER[ 2 ], E_POOL_BALL_TYPE: E_PLAYER_BALL_TYPE[ 2 ],
bool: E_STARTED, E_AIMER, E_AIMER_OBJECT, bool: E_STARTED, E_AIMER, E_AIMER_OBJECT,
E_LAST_SHOOTER, E_LAST_SCORE, Float: E_POWER, E_LAST_SHOOTER,
E_DIRECTION,
E_BALLS_SCORED,
Float: E_POWER, E_DIRECTION,
E_TABLE, Text3D: E_LABEL, E_TABLE, Text3D: E_LABEL,
} }
@ -222,10 +245,14 @@ hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
Float:x, Float:y; Float:x, Float:y;
GetPlayerPos(playerid, X, Y, Z); GetPlayerPos(playerid, X, Y, Z);
GetObjectPos(g_poolBallData[id] [E_BALL_OBJECT] [0], Xa, Ya, Za); GetObjectPos( g_poolBallData[ id ] [ E_BALL_OBJECT ] [ 0 ], Xa, Ya, Za );
if (GetDistanceFromPointToPoint(X, Y, Xa, Ya) < 1.5 && Z < 999.5) new Float: distance_to_ball = GetDistanceFromPointToPoint( X, Y, Xa, Ya );
if ( distance_to_ball < 1.5 && Z < 999.5 )
{ {
printf( "Distance To Ball %f", distance_to_ball );
TogglePlayerControllable(playerid, false); TogglePlayerControllable(playerid, false);
GetAngleToXY(Xa, Ya, X, Y, poolrot); GetAngleToXY(Xa, Ya, X, Y, poolrot);
SetPlayerFacingAngle(playerid, poolrot); SetPlayerFacingAngle(playerid, poolrot);
@ -289,7 +316,6 @@ hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
GivePlayerWeapon(playerid, 7, 1); GivePlayerWeapon(playerid, 7, 1);
g_poolTableData[ id ] [ E_LAST_SHOOTER ] = playerid; g_poolTableData[ id ] [ E_LAST_SHOOTER ] = playerid;
g_poolTableData[ id ] [ E_LAST_SCORE ] = 0;
} }
else ClearAnimations(playerid); else ClearAnimations(playerid);
} }
@ -304,7 +330,7 @@ hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
stock getNearestPoolTable( playerid ) stock getNearestPoolTable( playerid )
{ {
for ( new i = 0; i != MAX_TABLES; i ++ ) if ( IsPlayerInRangeOfPoint( playerid, 2.5, g_poolTableData[ i] [ E_X ], g_poolTableData[ i] [ E_Y ], g_poolTableData[ i] [ E_Z ]) ) { foreach ( new i : pooltables ) if ( IsPlayerInRangeOfPoint( playerid, 2.5, g_poolTableData[ i ] [ E_X ], g_poolTableData[ i ] [ E_Y ], g_poolTableData[ i ] [ E_Z ]) ) {
return i; return i;
} }
return -1; return -1;
@ -381,20 +407,9 @@ stock CreatePoolTable( Float: X, Float: Y, Float: Z, Float: A = 0.0, interior =
return gID; return gID;
} }
stock RespawnPoolBalls(poolid, mode = 0) stock RespawnPoolBalls( poolid )
{ {
for (new i = 0; i < 16; i ++) if ( g_poolTableData[ poolid ] [ E_AIMER ] != -1 )
{
DestroyObject(g_poolBallData[poolid] [E_BALL_OBJECT] [i]);
if (g_poolBallData[i] [E_EXISTS] [i])
{
PHY_DeleteObject(g_poolBallData[poolid] [E_BALL_OBJECT] [i]);
g_poolBallData[poolid] [E_EXISTS] [i] = false;
}
}
if (g_poolTableData[ poolid ] [ E_AIMER ] != -1)
{ {
TogglePlayerControllable(g_poolTableData[ poolid ] [ E_AIMER ], 1); TogglePlayerControllable(g_poolTableData[ poolid ] [ E_AIMER ], 1);
//ClearAnimations(g_poolTableData[ poolid ] [ E_AIMER ]); //ClearAnimations(g_poolTableData[ poolid ] [ E_AIMER ]);
@ -408,18 +423,38 @@ stock RespawnPoolBalls(poolid, mode = 0)
g_poolTableData[ poolid ] [ E_AIMER ] = -1; g_poolTableData[ poolid ] [ E_AIMER ] = -1;
} }
CreateBalls(poolid); new
Float: offset_x,
Float: offset_y;
if (mode) for ( new i = 0; i < sizeof( g_poolBallOffsetData ); i ++ )
{ {
KillTimer(g_poolTableData[ poolid ] [ E_TIMER ]); // get offset according to angle of table
g_poolTableData[ poolid ] [ E_TIMER ] = SetTimerEx("OnPoolUpdate", POOL_TIMER_SPEED, true, "d", poolid); RotateXY( g_poolBallOffsetData[ i ] [ E_OFFSET_X ], g_poolBallOffsetData[ i ] [ E_OFFSET_Y ], g_poolTableData[ poolid ] [ E_ANGLE ], offset_x, offset_y );
for (new i = 0; i < 16; i ++) // reset balls
{ if ( g_poolBallData[ i ] [ E_EXISTS ] [ i ] ) {
InitBalls(poolid, 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 ] );
// create pool balls on table
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] = CreateObject(
g_poolBallOffsetData[ i ] [ E_MODEL_ID ],
g_poolTableData[ poolid ] [ E_X ] + offset_x,
g_poolTableData[ poolid ] [ E_Y ] + offset_y,
g_poolTableData[ poolid ] [ E_Z ] - 0.045,
0.0, 0.0, 0.0
);
// initialize physics on each ball
InitBalls( poolid, i );
} }
KillTimer( g_poolTableData[ poolid ] [ E_TIMER ] );
g_poolTableData[ poolid ] [ E_TIMER ] = SetTimerEx( "OnPoolUpdate", POOL_TIMER_SPEED, true, "d", poolid );
g_poolTableData[ poolid ] [ E_BALLS_SCORED ] = 0;
} }
stock InitBalls(poolid, ballid) stock InitBalls(poolid, ballid)
@ -441,27 +476,6 @@ stock RotateXY( Float: xi, Float: yi, Float: angle, &Float: xf, &Float: yf )
return 1; return 1;
} }
stock CreateBalls( poolid )
{
new
Float: offset_x,
Float: offset_y;
for ( new i = 0; i < sizeof( g_poolBallOffsetData ); i ++ )
{
// get offset according to angle of table
RotateXY( g_poolBallOffsetData[ i ] [ E_OFFSET_X ], g_poolBallOffsetData[ i ] [ E_OFFSET_Y ], g_poolTableData[ poolid ] [ E_ANGLE ], offset_x, offset_y );
// create pool balls on table
g_poolBallData[ poolid ] [ E_BALL_OBJECT ] [ i ] = CreateObject(
g_poolBallOffsetData[ i ] [ E_MODEL_ID ],
g_poolTableData[ poolid ] [ E_X ] + offset_x,
g_poolTableData[ poolid ] [ E_Y ] + offset_y,
g_poolTableData[ poolid ] [ E_Z ] - 0.045,
0.0, 0.0, 0.0
);
}
}
stock IsKeyJustUp(key, newkeys, oldkeys) { stock IsKeyJustUp(key, newkeys, oldkeys) {
return !(newkeys & key) && (oldkeys & key); return !(newkeys & key) && (oldkeys & key);
@ -824,11 +838,17 @@ public RestoreWeapon(playerid)
return 1; return 1;
} }
/** * Public Functions * **/ stock GetPoolBallIndexFromModel( modelid ) {
for ( new i = 0; i < sizeof( g_poolBallOffsetData ); i ++ ) if ( g_poolBallOffsetData[ i ] [ E_MODEL_ID ] == modelid ) {
return i;
}
return -1;
}
/** * Physics Callbacks * **/
public PHY_OnObjectCollideWithObject(object1, object2) public PHY_OnObjectCollideWithObject(object1, object2)
{ {
for (new id = 0; id < MAX_TABLES; id ++) if (g_poolTableData[ id ] [ E_STARTED ]) foreach ( new id : pooltables ) if ( g_poolTableData[ id ] [ E_STARTED ] )
{ {
for (new i = 0; i < 16; i++) for (new i = 0; i < 16; i++)
{ {
@ -844,7 +864,7 @@ public PHY_OnObjectCollideWithObject(object1, object2)
public PHY_OnObjectCollideWithWall( objectid, wallid ) public PHY_OnObjectCollideWithWall( objectid, wallid )
{ {
for ( new id = 0; id < MAX_TABLES; id ++ ) if ( g_poolTableData[ id ] [ E_STARTED ] ) foreach ( new id : pooltables ) if ( g_poolTableData[ id ] [ E_STARTED ] )
{ {
for ( new i = 0; i < 16; i ++ ) if ( objectid == g_poolBallData[ id ] [ E_BALL_OBJECT ] [ i ] ) for ( new i = 0; i < 16; i ++ ) if ( objectid == g_poolBallData[ id ] [ E_BALL_OBJECT ] [ i ] )
{ {
@ -874,15 +894,44 @@ public PHY_OnObjectUpdate(objectid)
if ( holeid != -1 ) if ( holeid != -1 )
{ {
new pool_player = g_poolTableData[ poolid ] [ E_LAST_SHOOTER ], new pool_player = g_poolTableData[ poolid ] [ E_LAST_SHOOTER ];
modelid = GetObjectModel( objectid ); new pool_player_index = g_poolTableData[ poolid ] [ E_PLAYER ] [ 0 ] == pool_player ? 0 : 1; // use foreach for players
if (modelid == 3003) new poolball_index = GetPoolBallIndexFromModel( GetObjectModel( objectid ) );
// check if first ball was potted to figure winner
if ( ++ g_poolTableData[ poolid ] [ E_BALLS_SCORED ] == 1 && g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_STRIPED || g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_SOLID )
{ {
GameTextForPlayer(pool_player, "~n~~n~~n~~r~~h~You have pocketed the cue ball!", 10000, 4); g_poolTableData[ poolid ] [ E_PLAYER_BALL_TYPE ] [ pool_player_index ] = g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ];
// assign player 2 a ball
foreach ( new playerid : Player ) if ( p_PoolID[ playerid ] == poolid ) {
SendClientMessageFormatted( playerid, COLOR_YELLOW, "* %s(%d) is now playing as %s", ReturnPlayerName( playerid ), playerid, g_poolTableData[ poolid ] [ E_PLAYER_BALL_TYPE ] [ pool_player_index ] == E_STRIPED ? ( "Striped" ) : ( "Solid" ) );
}
}
if ( g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_CUE )
{
GameTextForPlayer( pool_player, "~n~~n~~n~~r~~h~You have pocketed the cue ball!", 10000, 4 );
respawnCueBall( poolid ); respawnCueBall( poolid );
} }
else if ( g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_8BALL )
{
// gamemode
GameTextForPlayer( pool_player, "~n~~n~~n~~r~~h~Gameover! 8ball in", 10000, 4 );
}
else
{
// check if player potted their own ball type or btfo
if ( g_poolTableData[ poolid ] [ E_BALLS_SCORED ] > 1 && g_poolTableData[ poolid ] [ E_PLAYER_BALL_TYPE ] [ pool_player_index ] != g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] )
{
//p_PoolScore[ pool_player ] -= 1;
GameTextForPlayer( pool_player, "~n~~n~~n~~w~Score: -1", 3000, 4);
foreach ( new playerid : Player ) if ( p_PoolID[ playerid ] == poolid ) {
SendClientMessageFormatted( playerid, COLOR_RED, "* %s(%d) has hit %s, instead of %s", ReturnPlayerName( playerid ), playerid, g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_STRIPED ? ( "Striped" ) : ( "Solid" ), g_poolTableData[ poolid ] [ E_PLAYER_BALL_TYPE ] [ pool_player_index ] == E_STRIPED ? ( "Striped" ) : ( "Solid" ) );
}
}
else else
{ {
p_PoolScore[ pool_player ] += 1; p_PoolScore[ pool_player ] += 1;
@ -892,7 +941,9 @@ public PHY_OnObjectUpdate(objectid)
PlayerTextDrawHide( pool_player, g_PoolTextdraw[ pool_player ] ); PlayerTextDrawHide( pool_player, g_PoolTextdraw[ pool_player ] );
PlayerTextDrawShow( pool_player, g_PoolTextdraw[ pool_player ] ); PlayerTextDrawShow( pool_player, g_PoolTextdraw[ pool_player ] );
//ShowPlayerHelpDialog( pool_player, 10000, "~w~You have pocketed another ball!~n~~n~Score: %d", p_PoolScore[pool_player]); foreach ( new playerid : Player ) if ( p_PoolID[ playerid ] == poolid ) {
SendClientMessageFormatted( playerid, COLOR_YELLOW, "%s(%d) has potted a %s %s!", ReturnPlayerName( playerid ), playerid, g_poolBallOffsetData[ poolball_index ] [ E_BALL_TYPE ] == E_STRIPED ? ( "Striped" ) : ( "Solid" ), g_poolBallOffsetData[ poolball_index ] [ E_BALL_NAME ] );
}
if (pool_player == g_poolTableData[ poolid ] [ E_PLAYER ] [ 0 ]) if (pool_player == g_poolTableData[ poolid ] [ E_PLAYER ] [ 0 ])
{ {
@ -905,6 +956,7 @@ public PHY_OnObjectUpdate(objectid)
UpdateDynamic3DTextLabelText(g_poolTableData[ poolid ] [ E_LABEL ], -1, szNormalString); UpdateDynamic3DTextLabelText(g_poolTableData[ poolid ] [ E_LABEL ], -1, szNormalString);
} }
}
new Float: hole_x, Float: hole_y; new Float: hole_x, Float: hole_y;
@ -945,7 +997,7 @@ public PHY_OnObjectUpdate(objectid)
else if (AreAllBallsStopped(poolid)) else if (AreAllBallsStopped(poolid))
{ {
SetTimerEx("RestoreCamera", 800, 0, "dd", g_poolTableData[ poolid ] [ E_LAST_SHOOTER ], poolid); SetTimerEx("RestoreCamera", 800, 0, "dd", g_poolTableData[ poolid ] [ E_LAST_SHOOTER ], poolid);
g_poolTableData[ i] [ E_LAST_SHOOTER ] = -1; g_poolTableData[ i ] [ E_LAST_SHOOTER ] = -1;
} }
} }
} }
@ -1008,7 +1060,7 @@ CMD:pool(playerid, params[])
if (!g_poolTableData[ poolid ] [ E_STARTED ]) if (!g_poolTableData[ poolid ] [ E_STARTED ])
{ {
g_poolTableData[ poolid ] [ E_STARTED ] = true; g_poolTableData[ poolid ] [ E_STARTED ] = true;
RespawnPoolBalls(poolid, 1); RespawnPoolBalls( poolid );
} }
return 1; return 1;
} }
@ -1114,7 +1166,7 @@ CMD:play(playerid)
UpdateDynamic3DTextLabelText(g_poolTableData[ iPool ] [ E_LABEL ], -1, sprintf( "{FFDC2E}%s is currently playing a test game.", ReturnPlayerName( playerid )) ); UpdateDynamic3DTextLabelText(g_poolTableData[ iPool ] [ E_LABEL ], -1, sprintf( "{FFDC2E}%s is currently playing a test game.", ReturnPlayerName( playerid )) );
RespawnPoolBalls(iPool, 1); RespawnPoolBalls( iPool );
} }
} }
else else