sfcnr/gamemodes/irresistible/cnr/features/toys.pwn
2018-10-06 12:11:26 +10:00

749 lines
34 KiB
Plaintext

/*
* Irresistible Gaming (c) 2018
* Developed by Lorenc Pekaj
* Module: cnr\features\toys.pwn
* Purpose: toy system for players (attach objects to player)
*/
/* ** Includes ** */
#include < YSI\y_hooks >
/* ** Definitions ** */
#define MAX_TOYS ( sizeof( g_ToyData ) )
#define MAX_TOY_UNLOCKS ( 200 ) // should be ideally MAX_TOYS
#define CATEGORY_WATCHES ( 0 )
#define CATEGORY_BERETS ( 1 )
#define CATEGORY_HATS ( 2 )
#define CATEGORY_HEADPHONES ( 3 )
#define CATEGORY_MASKS ( 4 )
#define CATEGORY_MOTORCYCLE ( 5 )
#define CATEGORY_GUITARS ( 6 )
#define CATEGORY_GLASSES ( 7 )
#define CATEGORY_HANDHELD ( 8 )
#define CATEGORY_WEAPONS ( 9 )
#define CATEGORY_MISC ( 10 )
#define CATEGORY_VIP ( 11 )
/* ** Variables ** */
enum E_ATTACHED_DATA
{
E_ENABLED, E_MODELID, E_BONE,
Float: E_OX, Float: E_OY, Float: E_OZ,
Float: E_RX, Float: E_RY, Float: E_RZ,
Float: E_SX, Float: E_SY, Float: E_SZ,
E_COLOR, E_SQL_ID
};
enum E_TOY_DATA
{
E_CATEGORY, E_ID, E_NAME[ 24 ],
E_MODEL, E_PRICE, E_DEFAULT_BONE
};
new
g_ToyCategory[ ] [ ] =
{
{ "Watches" }, { "Berets" }, { "Hats" }, { "Headphones" }, { "Masks" },
{ "Motorcycle Helmets" }, { "Guitars" }, { "Glasses" }, { "Handheld" },
{ "Weapons" }, { "Miscellaneous" }, { "V.I.P" }
},
g_ToyData[ ] [ E_TOY_DATA ] =
{
// WATCHES
{ CATEGORY_WATCHES, 0, "Rolex Datejust II", 19039, 220000, 5 },
{ CATEGORY_WATCHES, 1, "Rolex Datejust I", 19042, 160000, 5 },
{ CATEGORY_WATCHES, 2, "Rolex Explorer", 19040, 140800, 5 },
{ CATEGORY_WATCHES, 3, "Rolex Sky-Dweller", 19041, 95000, 5 },
{ CATEGORY_WATCHES, 4, "G-Shock Camo", 19053, 25000, 5 },
{ CATEGORY_WATCHES, 5, "G-Shock Navy Camo", 19048, 20000, 5 },
{ CATEGORY_WATCHES, 6, "G-Shock Pink Camo", 19049, 17500, 5 },
{ CATEGORY_WATCHES, 7, "G-Shock Orange Camo", 19051, 17500, 5 },
{ CATEGORY_WATCHES, 8, "G-Shock Purple", 19047, 10000, 5 },
{ CATEGORY_WATCHES, 9, "G-Shock Pink", 19045, 10000, 5 },
{ CATEGORY_WATCHES, 10, "G-Shock Green", 19046, 5000, 5 },
// BERET
{ CATEGORY_BERETS, 11, "Camo Beret", 18924, 750, 2 },
// { CATEGORY_BERETS, 12, "Gucci Black", 18921, 340, 2 },
// { CATEGORY_BERETS, 13, "Gucci Red", 18922, 340, 2 },
// { CATEGORY_BERETS, 14, "Gucci Blue", 18923, 340, 2 },
// HATS
{ CATEGORY_HATS, 126, "Witch Hat", 19528, 6666, 2 }, // special
{ CATEGORY_HATS, 93, "Santa Hat", 19064, 5000, 2 }, // special
{ CATEGORY_HATS, 15, "Gangsta Beanie", 19067, 1300, 2 },
{ CATEGORY_HATS, 16, "Snake Skin Hat", 18973, 1000, 2 },
{ CATEGORY_HATS, 17, "Tiger Print Hat", 18970, 1000, 2 },
{ CATEGORY_HATS, 18, "Skull Beanie", 19069, 1000, 2 },
{ CATEGORY_HATS, 19, "Boxing Helmet", 18952, 900, 2 },
// { CATEGORY_HATS, 20, "Knit Cap Grey", 18954, 800, 2 },
// { CATEGORY_HATS, 21, "Knit Cap Black", 18953, 800, 2 },
{ CATEGORY_HATS, 22, "Dukes Hat", 18972, 800, 2 },
{ CATEGORY_HATS, 23, "Cowboy Hat", 18962, 800, 2 },
{ CATEGORY_HATS, 24, "Trucker Cap", 18961, 700, 2 },
//{ CATEGORY_HATS, 25, "Black Bowler", 18944, 500, 2 },
{ CATEGORY_HATS, 26, "White Fedora", 19488, 500, 2 },
//{ CATEGORY_HATS, 27, "Blue Bowler", 18945, 500, 2 },
{ CATEGORY_HATS, 28, "Island Fedora", 18946, 500, 2 },
{ CATEGORY_HATS, 29, "Bloody Fedora", 18950, 500, 2 },
// { CATEGORY_HATS, 30, "Yellow Bowler", 18951, 500, 2 },
{ CATEGORY_HATS, 31, "Skater Bucket Hat", 18968, 500, 2 },
//{ CATEGORY_HATS, 32, "Fishing Cap", 18969, 500, 2 },
{ CATEGORY_HATS, 33, "Black Top Hat", 19352, 500, 2 },
{ CATEGORY_HATS, 34, "White Top Hat", 19487, 500, 2 },
{ CATEGORY_HATS, 35, "Fireman Helmet", 19330, 400, 2 },
{ CATEGORY_HATS, 36, "Sheriff Hat", 19099, 300, 2 },
{ CATEGORY_HATS, 37, "Camo Cap", 18926, 240, 2 },
{ CATEGORY_HATS, 38, "Chicken Hat", 19137, 240, 2 },
{ CATEGORY_HATS, 39, "BurgerShot Hat", 19094, 240, 2 },
{ CATEGORY_HATS, 40, "Police Cap", 18636, 240, 2 },
{ CATEGORY_HATS, 41, "Gas Mask", 19472, 240, 2 },
// HEADPHONES
{ CATEGORY_HEADPHONES, 41, "White Beats", 19421, 550, 2 },
{ CATEGORY_HEADPHONES, 42, "Black Beats", 19422, 550, 2 },
{ CATEGORY_HEADPHONES, 43, "Red Beats", 19423, 550, 2 },
{ CATEGORY_HEADPHONES, 44, "Blue Beats", 19424, 550, 2 },
// MASKS
{ CATEGORY_MASKS, 96, "Gucci Balaclava", 19801, 10000, 2 },
{ CATEGORY_MASKS, 45, "Black Mask", 18912, 6000, 2 },
{ CATEGORY_MASKS, 46, "Green Mask", 18913, 5200, 2 },
{ CATEGORY_MASKS, 47, "Weed Bandana", 18894, 4500, 2 },
{ CATEGORY_MASKS, 48, "Gimp Mask", 19163, 300, 2 },
{ CATEGORY_MASKS, 49, "Hockey Mask White", 19036, 250, 2 },
{ CATEGORY_MASKS, 50, "Hockey Mask Red", 19037, 250, 2 },
{ CATEGORY_MASKS, 51, "Blue Bandana", 18897, 100, 2 },
{ CATEGORY_MASKS, 53, "Grove Mask", 18913, 200, 2 },
{ CATEGORY_MASKS, 54, "Zorro Mask", 18974, 100, 2 },
// MOTORCYCLE HELMETS
{ CATEGORY_MOTORCYCLE, 87, "Fire Flame Helmet", 18645, 1000, 2 },
{ CATEGORY_MOTORCYCLE, 88, "Blue Helmet", 18976, 800, 2 },
{ CATEGORY_MOTORCYCLE, 89, "Red Helmet", 18977, 700, 2 },
{ CATEGORY_MOTORCYCLE, 90, "White Helmet", 18978, 700, 2 },
{ CATEGORY_MOTORCYCLE, 91, "Pink Helmet", 18979, 500, 2 },
// GUITARS
{ CATEGORY_GUITARS, 55, "Warlock Guitar", 19319, 1250, 1 },
{ CATEGORY_GUITARS, 56, "Flying Guitar", 19318, 800, 1 },
{ CATEGORY_GUITARS, 57, "Bass Guitar", 19317, 400, 1 },
// GLASSES
{ CATEGORY_GLASSES, 58, "Oakley Ferrari", 19006, 900, 2 },
{ CATEGORY_GLASSES, 59, "Armani Aviator Classic", 19022, 840, 2 },
// { CATEGORY_GLASSES, 61, "Armani Aviator Blue" , 19023, 840, 2 },
// { CATEGORY_GLASSES, 62, "Armani Aviator Purple", 19024, 840, 2 },
{ CATEGORY_GLASSES, 63, "Armani Aviator Pink", 19025, 840, 2 },
// { CATEGORY_GLASSES, 64, "Armani Aviator Orange", 19027, 840, 2 },
// { CATEGORY_GLASSES, 65, "Armani Aviator Yellow", 19028, 840, 2 },
// { CATEGORY_GLASSES, 65, "Armani Aviator Green", 19029, 840, 2 },
// { CATEGORY_GLASSES, 66, "Gucci Techno Yellow" , 19017, 650, 2 },
// { CATEGORY_GLASSES, 67, "Gucci Techno Salmon" , 19018, 650, 2 },
{ CATEGORY_GLASSES, 68, "Gucci Techno Red" , 19019, 650, 2 },
{ CATEGORY_GLASSES, 69, "Gucci Techno Blue" , 19020, 650, 2 },
{ CATEGORY_GLASSES, 70, "Gucci Techno Green" , 19021, 650, 2 },
// { CATEGORY_GLASSES, 71, "Versace Vintage", 19033, 520, 2 },
// { CATEGORY_GLASSES, 72, "Versace Havana Wrap", 19030, 490, 2 },
{ CATEGORY_GLASSES, 73, "Oakley Whisker", 19008, 400, 2 },
{ CATEGORY_GLASSES, 76, "Versace Marble Square", 19035, 380, 2 },
// HANDHELD
{ CATEGORY_HANDHELD, 100, "Antique Sword", 19590, 15000, 6 },
{ CATEGORY_HANDHELD, 101, "Microphone", 19610, 900, 6 },
{ CATEGORY_HANDHELD, 102, "Police Radio", 19942, 750, 6 },
{ CATEGORY_HANDHELD, 103, "Left Boxing Glove", 19555, 250, 6 },
{ CATEGORY_HANDHELD, 104, "Right Boxing Glove", 19556, 250, 5 },
{ CATEGORY_HANDHELD, 105, "Briefcase", 19624, 100, 6 },
// WEAPONS
{ CATEGORY_WEAPONS, 125, "RPG", 359, 13337, 1 },
{ CATEGORY_WEAPONS, 124, "Heatseeker", 360, 13337, 1 },
{ CATEGORY_WEAPONS, 123, "Minigun", 362, 13337, 1 },
{ CATEGORY_WEAPONS, 121, "Spas 12", 351, 9000, 1 },
{ CATEGORY_WEAPONS, 122, "M4", 356, 9000, 1 },
{ CATEGORY_WEAPONS, 119, "Sawn-off Shotgun", 350, 8000, 1 },
{ CATEGORY_WEAPONS, 120, "Sniper", 358, 8000, 1 },
{ CATEGORY_WEAPONS, 118, "Shotgun", 349, 6000, 1 },
{ CATEGORY_WEAPONS, 117, "Desert Eagle", 348, 5000, 1 },
{ CATEGORY_WEAPONS, 116, "Rifle", 357, 3000, 1 },
{ CATEGORY_WEAPONS, 115, "Tec 9", 372, 2900, 1 },
{ CATEGORY_WEAPONS, 114, "Mac 10", 352, 2500, 1 },
{ CATEGORY_WEAPONS, 109, "Purple Dildo", 321, 690, 1 },
{ CATEGORY_WEAPONS, 108, "Parachute", 371, 600, 1 },
{ CATEGORY_WEAPONS, 107, "Pool Cue", 338, 400, 1 },
{ CATEGORY_WEAPONS, 106, "Brass Knuckles", 331, 250, 1 },
// MISC
{ CATEGORY_MISC, 99, "Gold Bar", 19941, 38000, 1 },
{ CATEGORY_MISC, 74, "Cowboy Boots", 11735, 3000, 1 },
{ CATEGORY_MISC, 77, "Marijuana Roll", 2901, 2000, 1 },
{ CATEGORY_MISC, 75, "Pistol Holster", 19773, 1000, 1 },
{ CATEGORY_MISC, 79, "Police Light", 19419, 600, 1 },
{ CATEGORY_MISC, 94, "Xmas Box 1", 19054, 500, 1 },
{ CATEGORY_MISC, 95, "Xmas Box 2", 19056, 500, 1 },
{ CATEGORY_MISC, 80, "Surf Board", 2406, 250, 1 },
{ CATEGORY_MISC, 97, "Skateboard", 19878, 200, 1 },
{ CATEGORY_MISC, 81, "Glider", 2512, 150, 1 },
{ CATEGORY_MISC, 82, "Plane", 2510, 120, 1 },
{ CATEGORY_MISC, 98, "Hiker Backpack", 19559, 100, 1 },
{ CATEGORY_MISC, 78, "Backpack", 3026, 90, 1 },
{ CATEGORY_MISC, 83, "Rubbish Bin", 1343, 80, 1 },
{ CATEGORY_MISC, 84, "Chainsaw Dildo", 19086, 69, 5 },
{ CATEGORY_MISC, 85, "Easter Egg", 19344, 50, 2 },
{ CATEGORY_MISC, 86, "Hippobin", 1371, 50, 1 },
{ CATEGORY_MISC, 92, "Pumpkin", 19320, 10, 1 },
// VIP
{ CATEGORY_VIP, -1, "Small Fire", 18688, 0, 1 },
{ CATEGORY_VIP, -1, "Dynamite", 1654, 0, 6 },
{ CATEGORY_VIP, -1, "Caution Barrel", 1218, 0, 1 },
{ CATEGORY_VIP, -1, "Gas Tank", 918, 0, 1 },
{ CATEGORY_VIP, -1, "Parrot", 19079, 0, 15 },
{ CATEGORY_VIP, -1, "Money Stack", 1212, 0, 6 },
{ CATEGORY_VIP, -1, "Turtle", 1609, 0, 1 },
{ CATEGORY_VIP, -1, "S.W.A.T Helmet", 19141, 0, 2 },
{ CATEGORY_VIP, -1, "S.W.A.T Armour", 19142, 0, 1 },
{ CATEGORY_VIP, -1, "Construction Vest", 19904, 0, 1 },
{ CATEGORY_VIP, -1, "Sledge Hammer", 19631, 0, 5 },
{ CATEGORY_VIP, -1, "Laser Sight", 18643, 0, 5 },
{ CATEGORY_VIP, -1, "Better Santa Hat", 19065, 0, 2 }
},
p_AttachedObjectsData [ MAX_PLAYERS ] [ 3 ] [ E_ATTACHED_DATA ],
p_ToySlotSelected [ MAX_PLAYERS char ],
p_ToyCategorySelected [ MAX_PLAYERS char ],
p_ToyIDSelected [ MAX_PLAYERS char ],
bool: p_ToyUnlocked [ MAX_PLAYERS ] [ MAX_TOY_UNLOCKS char ]
;
/* ** Hooks ** */
hook OnPlayerDisconnect( playerid, reason )
{
for ( new i = 0; i < MAX_TOY_UNLOCKS; i ++ )
{
p_ToyUnlocked[ playerid ] { i } = false;
// reset attached toy data in the loop .. reusing it
if ( i < sizeof( p_AttachedObjectsData[ ] ) ) {
resetPlayerToys( playerid, i );
}
}
return 1;
}
hook OnPlayerSpawn( playerid )
{
reloadPlayerToys( playerid );
return 1;
}
hook OnPlayerLogin( playerid )
{
new
accountid = GetPlayerAccountID( playerid );
mysql_function_query( dbHandle, sprintf( "SELECT * FROM `TOY_UNLOCKS` WHERE `USER_ID`=%d", accountid ), true, "OnToyLoad", "d", playerid );
mysql_function_query( dbHandle, sprintf( "SELECT * FROM `TOYS` WHERE `USER_ID`=%d", accountid ), true, "OnToyOffsetLoad", "d", playerid );
return 1;
}
hook OnPlayerEnterDynamicCP( playerid, checkpointid )
{
if ( checkpointid == g_Checkpoints[ CP_PAWNSHOP ] ) {
return ShowPlayerDialog( playerid, DIALOG_TOYS_BUY, DIALOG_STYLE_LIST, "{FFFFFF}Purchase Toys", getToyCategories( .pawnshop = true ), "Select", "Cancel" );
}
return 1;
}
hook OnPlayerEditAttachedObj( playerid, response, index, modelid, boneid, Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ, Float:fRotX, Float:fRotY, Float:fRotZ, Float:fScaleX, Float:fScaleY, Float:fScaleZ )
{
new slot = p_ToySlotSelected{ playerid };
new color = p_AttachedObjectsData[ playerid ] [ slot ] [ E_COLOR ];
if ( response )
{
new bool: modded;
if ( fScaleX < 0.1 || fScaleX > 2.5 ) fScaleX = 1.0, modded = true;
if ( fScaleY < 0.1 || fScaleY > 2.5 ) fScaleY = 1.0, modded = true;
if ( fScaleZ < 0.1 || fScaleZ > 2.5 ) fScaleZ = 1.0, modded = true;
if ( modded ) SendServerMessage( playerid, "Some scaling parts were either too small, or too big. They have been scaled to the default size." );
p_AttachedObjectsData[ playerid ] [ slot ] [ E_BONE ] = boneid;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_OX ] = fOffsetX;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_OY ] = fOffsetY;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_OZ ] = fOffsetZ;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_RX ] = fRotX;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_RY ] = fRotY;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_RZ ] = fRotZ;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_SX ] = fScaleX;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_SY ] = fScaleY;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_SZ ] = fScaleZ;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_MODELID ] = modelid;
RemovePlayerAttachedObject( playerid, index );
SetPlayerAttachedObject( playerid, index, modelid, boneid, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, color, color );
format( szBigString, sizeof( szBigString ), "UPDATE `TOYS` SET `OX`=%f,`OY`=%f,`OZ`=%f,`RX`=%f,`RY`=%f,`RZ`=%f,`SX`=%f,`SY`=%f,`SZ`=%f WHERE `ID`=%d", fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, p_AttachedObjectsData[ playerid ] [ slot ] [ E_SQL_ID ] );
mysql_single_query( szBigString );
//printf("SetPlayerAttachedObject( playerid, %d, %d, %d, %f, %f, %f, %f, %f, %f, %f, %f, %f );",index, modelid, boneid, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ );
}
else
{
// User Cancelled
RemovePlayerAttachedObject( playerid, index );
SetPlayerAttachedObject( playerid, index, p_AttachedObjectsData[ playerid ] [ slot ] [ E_MODELID ], p_AttachedObjectsData[ playerid ] [ slot ] [ E_BONE ],
p_AttachedObjectsData[ playerid ] [ slot ] [ E_OX ], p_AttachedObjectsData[ playerid ] [ slot ] [ E_OY ], p_AttachedObjectsData[ playerid ] [ slot ] [ E_OZ ],
p_AttachedObjectsData[ playerid ] [ slot ] [ E_RX ], p_AttachedObjectsData[ playerid ] [ slot ] [ E_RY ], p_AttachedObjectsData[ playerid ] [ slot ] [ E_RZ ],
p_AttachedObjectsData[ playerid ] [ slot ] [ E_SX ], p_AttachedObjectsData[ playerid ] [ slot ] [ E_SY ], p_AttachedObjectsData[ playerid ] [ slot ] [ E_SZ ],
color, color
);
}
showToyEditMenu( playerid, slot );
return 1;
}
hook OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
{
if ( dialogid == DIALOG_TOYS_MAIN && response )
{
if ( !listitem )
{
if ( !p_AttachedObjectsData[ playerid ] [ 0 ] [ E_ENABLED ] && !p_AttachedObjectsData[ playerid ] [ 1 ] [ E_ENABLED ] && !p_AttachedObjectsData[ playerid ] [ 2 ] [ E_ENABLED ] )
return SendError( playerid, "All attached toys are already disabled." );
format( szNormalString, sizeof( szNormalString ), "UPDATE `TOYS` SET `ENABLED`=0 WHERE `USER_ID`=%d", p_AccountID[ playerid ] );
mysql_single_query( szNormalString );
RemovePlayerAttachedObject( playerid, 9 );
RemovePlayerAttachedObject( playerid, 8 );
RemovePlayerAttachedObject( playerid, 7 );
p_AttachedObjectsData[ playerid ] [ 0 ] [ E_ENABLED ] = 0;
p_AttachedObjectsData[ playerid ] [ 1 ] [ E_ENABLED ] = 0;
p_AttachedObjectsData[ playerid ] [ 2 ] [ E_ENABLED ] = 0;
return SendServerMessage( playerid, "All attached toys have been disabled." );
}
p_ToySlotSelected{ playerid } = listitem - 1;
if ( p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_BONE ] ) {
showToyEditMenu( playerid, p_ToySlotSelected{ playerid } );
} else {
ShowPlayerDialog( playerid, DIALOG_TOYS, DIALOG_STYLE_LIST, "{FFFFFF}Toys", getToyCategories( ), "Select", "Back" );
}
}
else if ( dialogid == DIALOG_TOYS_ITEMS )
{
if ( !response )
return ShowPlayerDialog( playerid, DIALOG_TOYS, DIALOG_STYLE_LIST, "{FFFFFF}Toys", getToyCategories( ), "Select", "Back" );
for( new id, x = 0; id < MAX_TOYS; id++ )
{
if ( g_ToyData[ id ] [ E_CATEGORY ] == p_ToyCategorySelected{ playerid } )
{
if ( x == listitem )
{
p_ToyIDSelected{ playerid } = id;
if ( g_ToyData[ id ] [ E_ID ] == -1 )
{
showToyCategoryItems( playerid, p_ToyCategorySelected{ playerid } );
if ( p_VIPLevel[ playerid ] < VIP_REGULAR )
return SendError( playerid, "You must be a V.I.P to use this, to become one visit "COL_GREY"donate.sfcnr.com" ), 1;
if ( ( ( p_VIPExpiretime[ playerid ] - g_iTime ) / 86400 ) < 3 )
return SendError( playerid, "You need more than 3 days of V.I.P in order to complete this." ), 1;
}
if ( g_ToyData[ id ] [ E_ID ] != -1 && !p_ToyUnlocked[ playerid ] { g_ToyData[ id ] [ E_ID ] } )
{
showToyCategoryItems( playerid, p_ToyCategorySelected{ playerid } );
return SendError( playerid, "You have not unlocked this toy." );
}
SendServerMessage( playerid, "You have selected "COL_GREY"%s"COL_WHITE". Proceed with bone selection to place the toy.", g_ToyData[ id ] [ E_NAME ] );
ShowPlayerDialog( playerid, DIALOG_TOYS_BONE, DIALOG_STYLE_LIST, "{FFFFFF}Toys - Bones", ""COL_GREY"Use Default Bone\nSpine\nHead\nLeft Upper Arm\nRight Upper Arm\nLeft Hand\nRight Hand\nLeft Thigh\nRight Thigh\nLeft Foot\nRight Foot\nRight Calf\nLeft Calf\nLeft Forearm\nRight Forearm\nLeft Clavicle\nRight Clavicle\nNeck\nJaw", "Select", "Back" );
break;
}
x ++;
}
}
}
else if ( dialogid == DIALOG_TOYS_ITEMS_BUY )
{
if ( !response )
return ShowPlayerDialog( playerid, DIALOG_TOYS_BUY, DIALOG_STYLE_LIST, "{FFFFFF}Purchase Toys", getToyCategories( .pawnshop = true ), "Select", "Cancel" );
for( new id, x = 0; id < MAX_TOYS; id++ )
{
if ( g_ToyData[ id ] [ E_CATEGORY ] == p_ToyCategorySelected{ playerid } )
{
if ( x == listitem )
{
if ( p_ToyUnlocked[ playerid ] { g_ToyData[ id ] [ E_ID ] } )
{
showToyCategoryItems( playerid, p_ToyCategorySelected{ playerid }, .pawnshop = true );
return SendError( playerid, "You have already bought this toy." );
}
if ( GetPlayerCash( playerid ) < g_ToyData[ id ] [ E_PRICE ] )
{
showToyCategoryItems( playerid, p_ToyCategorySelected{ playerid }, .pawnshop = true );
return SendError( playerid, "You cannot afford this toy." );
}
UnlockPlayerToy( playerid, g_ToyData[ id ] [ E_ID ] );
GivePlayerCash( playerid, -g_ToyData[ id ] [ E_PRICE ] );
showToyCategoryItems( playerid, p_ToyCategorySelected{ playerid }, .pawnshop = true );
SendServerMessage( playerid, "You have bought a "COL_GREY"%s"COL_WHITE" for "COL_GOLD"%s"COL_WHITE".", g_ToyData[ id ] [ E_NAME ], cash_format( g_ToyData[ id ] [ E_PRICE ] ) );
break;
}
x ++;
}
}
}
else if ( dialogid == DIALOG_TOYS_BONE || dialogid == DIALOG_TOYS_BONE_EDIT )
{
new
iSlot = p_ToySlotSelected{ playerid };
if ( !response && dialogid == DIALOG_TOYS_BONE )
return showToyCategoryItems( playerid, p_ToyCategorySelected{ playerid } );
if ( !response && dialogid == DIALOG_TOYS_BONE_EDIT )
return showToyEditMenu( playerid, iSlot );
if ( !listitem ) {
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_BONE ] = g_ToyData[ p_ToyIDSelected{ playerid } ] [ E_DEFAULT_BONE ];
SendServerMessage( playerid, "You have now placed your toy on the default bone." );
}
else {
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_BONE ] = listitem;
SendServerMessage( playerid, "You have now placed your toy on this bone." );
}
RemovePlayerAttachedObject( playerid, 7 + iSlot );
SetPlayerAttachedObject( playerid, 7 + iSlot, g_ToyData[ p_ToyIDSelected{ playerid } ] [ E_MODEL ], p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_BONE ] );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_ENABLED ] = 1;
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_MODELID ] = g_ToyData[ p_ToyIDSelected{ playerid } ] [ E_MODEL ];
if ( dialogid == DIALOG_TOYS_BONE ) {
format( szBigString, sizeof( szBigString ), "INSERT INTO `TOYS`(`USER_ID`,`SLOT_ID`,`ENABLED`,`MODEL_ID`,`BONE`) VALUES (%d,%d,1,%d,%d)", p_AccountID[ playerid ], iSlot, g_ToyData[ p_ToyIDSelected{ playerid } ] [ E_MODEL ], p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_BONE ] );
mysql_function_query( dbHandle, szBigString, true, "OnPlayerAddToy", "dd", playerid, iSlot );
} else {
format( szNormalString, sizeof( szNormalString ), "UPDATE `TOYS` SET `BONE`=%d,`OX`=0,`OY`=0,`OZ`=0,`RX`=0,`RY`=0,`RZ`=0,`SX`=1,`SY`=1,`SZ`=1 WHERE `ID`=%d", p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_BONE ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_SQL_ID ] );
mysql_single_query( szNormalString );
}
showToyEditMenu( playerid, iSlot );
}
else if ( dialogid == DIALOG_TOYS_COLOR )
{
new
slot = p_ToySlotSelected{ playerid };
if ( !response )
return showToyEditMenu( playerid, slot );
new
hexcode[ 7 ];
if ( sscanf( inputtext, "S(000000)[7]", hexcode ) ) SendError( playerid, "Please ensure your hex is 6 characters at maximum (RRGGBB)." );
else if ( ! isHex( hexcode ) ) SendError( playerid, "This is not a valid hex code." );
else
{
if ( strmatch( hexcode, "000000" ) )
{
p_AttachedObjectsData[ playerid ] [ slot ] [ E_COLOR ] = 0;
mysql_single_query( sprintf( "UPDATE `TOYS` SET `COLOR`=0 WHERE `ID`=%d", p_AttachedObjectsData[ playerid ] [ slot ] [ E_SQL_ID ] ) );
SendServerMessage( playerid, "You have reset your toy's color." );
}
else
{
new
final_hex;
if ( ! sscanf( sprintf( "0xFF%s", hexcode ), "h", final_hex ) )
{
p_AttachedObjectsData[ playerid ] [ slot ] [ E_COLOR ] = final_hex;
mysql_single_query( sprintf( "UPDATE `TOYS` SET `COLOR`=%d WHERE `ID`=%d", p_AttachedObjectsData[ playerid ] [ slot ] [ E_COLOR ], p_AttachedObjectsData[ playerid ] [ slot ] [ E_SQL_ID ] ) );
SendServerMessage( playerid, "You have set your toy's color to {%s}%s"COL_WHITE".", hexcode, hexcode );
}
else SendError( playerid, "This is not a valid hex code." );
}
return reloadPlayerToys( playerid );
}
return showToyEditMenu( playerid, slot );
}
else if ( dialogid == DIALOG_TOYS_EDIT )
{
if ( !response )
return cmd_toys( playerid, "" );
switch( listitem )
{
case 0:
{
if ( !p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_ENABLED ] ) {
SendError( playerid, "You cannot edit a disabled toy." );
return showToyEditMenu( playerid, p_ToySlotSelected{ playerid } );
}
EditAttachedObject( playerid, 7 + p_ToySlotSelected{ playerid } );
SendServerMessage( playerid, "You are now editing a toy." );
}
case 1:
{
if ( !p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_ENABLED ] ) {
SendError( playerid, "You cannot reselect a bone of a disabled toy." );
return showToyEditMenu( playerid, p_ToySlotSelected{ playerid } );
}
ShowPlayerDialog( playerid, DIALOG_TOYS_BONE_EDIT, DIALOG_STYLE_LIST, "{FFFFFF}Toys - Bones", ""COL_GREY"Use Default Bone\nSpine\nHead\nLeft Upper Arm\nRight Upper Arm\nLeft Hand\nRight Hand\nLeft Thigh\nRight Thigh\nLeft Foot\nRight Foot\nRight Calf\nLeft Calf\nLeft Forearm\nRight Forearm\nLeft Clavicle\nRight Clavicle\nNeck\nJaw", "Select", "Back" );
SendServerMessage( playerid, "You are now reselecting your toy's bone." );
}
case 2:
{
if ( !p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_ENABLED ] ) {
SendError( playerid, "You cannot set the color of a disabled toy." );
return showToyEditMenu( playerid, p_ToySlotSelected{ playerid } );
}
ShowPlayerDialog( playerid, DIALOG_TOYS_COLOR, DIALOG_STYLE_INPUT, "{FFFFFF}Toys - Color", ""COL_WHITE"Please specify the color (hex) code as "COL_RED"RR"COL_GREEN"GG"COL_BLUE"BB"COL_WHITE" below:", "Select", "Back" );
SendServerMessage( playerid, "You are now editing your toy's color, enter nothing or 000000 to reset it." );
}
case 3:
{
p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_ENABLED ] = !p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_ENABLED ];
if ( !p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_ENABLED ] )
{
RemovePlayerAttachedObject( playerid, 7 + p_ToySlotSelected{ playerid } );
SendServerMessage( playerid, "You have disabled this toy." );
}
else
{
RemovePlayerAttachedObject( playerid, 7 + p_ToySlotSelected{ playerid } ); // Just incase.
SetPlayerAttachedObject( playerid, 7 + p_ToySlotSelected{ playerid }, p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_MODELID ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_BONE ],
p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_OX ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_OY ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_OZ ],
p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_RX ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_RY ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_RZ ],
p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_SX ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_SY ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_SZ ],
p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_COLOR ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_COLOR ]
);
SendServerMessage( playerid, "You have enabled this toy." );
}
format( szNormalString, sizeof( szNormalString ), "UPDATE `TOYS` SET `ENABLED`=%d WHERE `ID`=%d", p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_ENABLED ], p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_SQL_ID ] );
mysql_single_query( szNormalString );
showToyEditMenu( playerid, p_ToySlotSelected{ playerid } );
}
case 4:
{
RemovePlayerAttachedObject( playerid, 7 + p_ToySlotSelected{ playerid } );
p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_BONE ] = 0;
p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_MODELID ] = 0;
format( szNormalString, sizeof( szNormalString ), "DELETE FROM `TOYS` WHERE `ID`=%d", p_AttachedObjectsData[ playerid ] [ p_ToySlotSelected{ playerid } ] [ E_SQL_ID ] );
mysql_single_query( szNormalString );
SendServerMessage( playerid, "You have removed this toy." );
cmd_toys( playerid, "" );
}
}
}
else if ( dialogid == DIALOG_TOYS ) {
if ( !response )
return cmd_toys( playerid, "" );
p_ToyCategorySelected{ playerid } = listitem;
showToyCategoryItems( playerid, listitem );
}
else if ( dialogid == DIALOG_TOYS_BUY && response ) {
p_ToyCategorySelected{ playerid } = listitem;
showToyCategoryItems( playerid, listitem, .pawnshop = true );
}
return 1;
}
/* ** Commands ** */
CMD:toys( playerid, params[ ] )
{
if ( !IsPlayerSpawned( playerid ) ) return SendError( playerid, "You cannot use this command while you are not spawned." );
new
iToy[ 3 ] [ 24 ] = { { "None" }, { "None" }, { "None" } };
for( new i = 0; i < sizeof( g_ToyData ); i++ ) {
for( new x = 0; x < sizeof( iToy ); x++ ) {
if ( g_ToyData[ i ] [ E_MODEL ] == p_AttachedObjectsData[ playerid ] [ x ] [ E_MODELID ] )
strcpy( iToy[ x ], g_ToyData[ i ] [ E_NAME ] );
}
}
format( szNormalString, sizeof( szNormalString ), ""COL_GREY"Disable All Toys\nSlot 1 (%s)\nSlot 2 (%s)\nSlot 3 (%s)", iToy[ 0 ], iToy[ 1 ], iToy[ 2 ] );
ShowPlayerDialog( playerid, DIALOG_TOYS_MAIN, DIALOG_STYLE_LIST, "{FFFFFF}Toys", szNormalString, "Select", "Close" );
return 1;
}
/* ** SQL Threads ** */
thread OnToyLoad( playerid )
{
if ( !IsPlayerConnected( playerid ) )
return 0;
new
rows, fields, i = -1
;
cache_get_data( rows, fields );
if ( rows ) {
while( ++i < rows ) {
new iToy = cache_get_field_content_int( i, "TOY_ID", dbHandle );
if ( iToy < MAX_TOY_UNLOCKS ) // Must be something wrong otherwise...
p_ToyUnlocked[ playerid ] { iToy } = true;
}
}
return 1;
}
thread OnToyOffsetLoad( playerid )
{
if ( !IsPlayerConnected( playerid ) )
return 0;
new
rows, fields, i = -1
;
cache_get_data( rows, fields );
if ( rows ) {
while( ++i < rows ) {
new
iSlot = cache_get_field_content_int( i, "SLOT_ID", dbHandle );
if ( iSlot < sizeof( p_AttachedObjectsData[ ] ) ) {
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_SQL_ID ] = cache_get_field_content_int( i, "ID", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_ENABLED ] = cache_get_field_content_int( i, "ENABLED", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_MODELID ] = cache_get_field_content_int( i, "MODEL_ID", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_BONE ] = cache_get_field_content_int( i, "BONE", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_OX ] = cache_get_field_content_float( i, "OX", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_OY ] = cache_get_field_content_float( i, "OY", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_OZ ] = cache_get_field_content_float( i, "OZ", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_RX ] = cache_get_field_content_float( i, "RX", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_RY ] = cache_get_field_content_float( i, "RY", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_RZ ] = cache_get_field_content_float( i, "RZ", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_SX ] = cache_get_field_content_float( i, "SX", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_SY ] = cache_get_field_content_float( i, "SY", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_SZ ] = cache_get_field_content_float( i, "SZ", dbHandle );
p_AttachedObjectsData[ playerid ] [ iSlot ] [ E_COLOR ] = cache_get_field_content_int( i, "COLOR", dbHandle );
}
}
}
return 1;
}
thread OnPlayerAddToy( playerid, slotid ) {
p_AttachedObjectsData[ playerid ] [ slotid ] [ E_SQL_ID ] = cache_insert_id( );
return 1;
}
/* ** Functions ** */
stock getToyCategories( bool: pawnshop = false )
{
static
szToyCategory[ 150 ],
szPawnCategory[ 150 ];
if ( szToyCategory[ 0 ] == '\0' ) {
for( new i = 0; i < sizeof( g_ToyCategory ); i++ )
format( szToyCategory, sizeof( szToyCategory ), "%s%s\n", szToyCategory, g_ToyCategory[ i ] );
}
if ( szPawnCategory[ 0 ] == '\0' ) {
for( new i = 0; i < sizeof( g_ToyCategory ); i++ ) if ( i != CATEGORY_VIP )
format( szPawnCategory, sizeof( szPawnCategory ), "%s%s\n", szPawnCategory, g_ToyCategory[ i ] );
}
return pawnshop ? szPawnCategory : szToyCategory;
}
stock showToyCategoryItems( playerid, category, bool: pawnshop = false )
{
erase( szLargeString );
for( new i = 0; i < sizeof( g_ToyData ); i++ )
{
if ( g_ToyData[ i ] [ E_CATEGORY ] == category )
{
if ( pawnshop ) {
format( szLargeString, sizeof( szLargeString ), "%s%s%s\t"COL_GOLD"%s\n", szLargeString, p_ToyUnlocked[ playerid ] { g_ToyData[ i ] [ E_ID ] } ? ( #COL_LGREEN ) : ( #COL_WHITE ), g_ToyData[ i ] [ E_NAME ], cash_format( g_ToyData[ i ] [ E_PRICE ] ) );
} else {
format( szLargeString, sizeof( szLargeString ), "%s%s%s\n", szLargeString, g_ToyData[ i ] [ E_ID ] != -1 ? ( !p_ToyUnlocked[ playerid ] { g_ToyData[ i ] [ E_ID ] } ? ( "{3D3D3D}" ) : ( "{FFFFFF}" ) ) : ( COL_GOLD ), g_ToyData[ i ] [ E_NAME ] );
}
}
}
if ( pawnshop ) {
return ShowPlayerDialog( playerid, DIALOG_TOYS_ITEMS_BUY, DIALOG_STYLE_TABLIST, pawnshop ? ( "{FFFFFF}Purchase Toys" ) : ( "{FFFFFF}Toys" ), szLargeString, "Select", "Back" );
} else {
return ShowPlayerDialog( playerid, DIALOG_TOYS_ITEMS, DIALOG_STYLE_LIST, pawnshop ? ( "{FFFFFF}Purchase Toys" ) : ( "{FFFFFF}Toys" ), szLargeString, "Select", "Back" );
}
}
stock UnlockPlayerToy( playerid, toy_id )
{
if ( toy_id > MAX_TOY_UNLOCKS )
return;
p_ToyUnlocked[ playerid ] { toy_id } = true;
format( szNormalString, 72, "INSERT INTO `TOY_UNLOCKS`(`USER_ID`, `TOY_ID`) VALUES (%d, %d)", p_AccountID[ playerid ], toy_id);
mysql_single_query( szNormalString );
}
stock resetPlayerToys( playerid, slot ) {
p_AttachedObjectsData[ playerid ] [ slot ] [ E_ENABLED ] = 0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_MODELID ] = 0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_BONE ] = 0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_OX ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_OY ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_OZ ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_RX ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_RY ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_RZ ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_SX ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_SY ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_SZ ] = 0.0;
p_AttachedObjectsData[ playerid ] [ slot ] [ E_COLOR ] = 0;
}
stock showToyEditMenu( playerid, slot )
{
if ( p_AttachedObjectsData[ playerid ] [ slot ] [ E_ENABLED ] ) {
return ShowPlayerDialog( playerid, DIALOG_TOYS_EDIT, DIALOG_STYLE_LIST, "{FFFFFF}Toys", ""COL_WHITE"Edit Toy Position\n"COL_WHITE"Edit Toy Bone\n"COL_WHITE"Edit Toy Color\nDisable Toy\n"COL_LRED"Remove Toy", "Select", "Back" );
} else {
return ShowPlayerDialog( playerid, DIALOG_TOYS_EDIT, DIALOG_STYLE_LIST, "{FFFFFF}Toys", ""COL_BLACK"Edit Toy Position\n"COL_BLACK"Edit Toy Bone\n"COL_BLACK"Edit Toy Color\nEnable Toy", "Select", "Back" );
}
}
stock reloadPlayerToys( playerid )
{
for ( new i = 0; i < sizeof ( p_AttachedObjectsData[ ] ); i ++ ) {
if ( p_AttachedObjectsData[ playerid ] [ i ] [ E_ENABLED ] ) {
RemovePlayerAttachedObject( playerid, 7 + i );
SetPlayerAttachedObject( playerid, 7 + i, p_AttachedObjectsData[ playerid ] [ i ] [ E_MODELID ], p_AttachedObjectsData[ playerid ] [ i ] [ E_BONE ],
p_AttachedObjectsData[ playerid ] [ i ] [ E_OX ], p_AttachedObjectsData[ playerid ] [ i ] [ E_OY ], p_AttachedObjectsData[ playerid ] [ i ] [ E_OZ ],
p_AttachedObjectsData[ playerid ] [ i ] [ E_RX ], p_AttachedObjectsData[ playerid ] [ i ] [ E_RY ], p_AttachedObjectsData[ playerid ] [ i ] [ E_RZ ],
p_AttachedObjectsData[ playerid ] [ i ] [ E_SX ], p_AttachedObjectsData[ playerid ] [ i ] [ E_SY ], p_AttachedObjectsData[ playerid ] [ i ] [ E_SZ ],
p_AttachedObjectsData[ playerid ] [ i ] [ E_COLOR ], p_AttachedObjectsData[ playerid ] [ i ] [ E_COLOR ]
);
}
}
return 1;
}