|
//
|
|
// Admin spawner using previews. For SA-MP 0.3x and above.
|
|
// - Kye 2012
|
|
//
|
|
|
|
#include <a_samp>
|
|
#include "../include/gl_common.inc"
|
|
|
|
#define TOTAL_ITEMS 20000
|
|
#define SELECTION_ITEMS 21
|
|
#define ITEMS_PER_LINE 7
|
|
|
|
#define HEADER_TEXT "Objects"
|
|
#define NEXT_TEXT "Next"
|
|
#define PREV_TEXT "Prev"
|
|
|
|
#define DIALOG_BASE_X 75.0
|
|
#define DIALOG_BASE_Y 130.0
|
|
#define DIALOG_WIDTH 550.0
|
|
#define DIALOG_HEIGHT 180.0
|
|
#define SPRITE_DIM_X 60.0
|
|
#define SPRITE_DIM_Y 70.0
|
|
|
|
new gTotalItems = TOTAL_ITEMS;
|
|
|
|
new PlayerText:gBackgroundTextDrawId[MAX_PLAYERS];
|
|
new PlayerText:gNextButtonTextDrawId[MAX_PLAYERS];
|
|
new PlayerText:gPrevButtonTextDrawId[MAX_PLAYERS];
|
|
new PlayerText:gSelectionItems[MAX_PLAYERS][SELECTION_ITEMS];
|
|
new PlayerText:gCurrentPageTextDrawId[MAX_PLAYERS];
|
|
new PlayerText:gHeaderTextDrawId[MAX_PLAYERS];
|
|
new gSelectionItemsTag[MAX_PLAYERS][SELECTION_ITEMS];
|
|
new gItemAt[MAX_PLAYERS];
|
|
|
|
//------------------------------------------------
|
|
|
|
public OnFilterScriptInit()
|
|
{
|
|
print("\n--Admin Vehicle Spawner Loaded\n");
|
|
return 1;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
GetNumberOfPages()
|
|
{
|
|
if((gTotalItems >= SELECTION_ITEMS) && (gTotalItems % SELECTION_ITEMS) == 0)
|
|
{
|
|
return (gTotalItems / SELECTION_ITEMS);
|
|
}
|
|
else return (gTotalItems / SELECTION_ITEMS) + 1;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
PlayerText:CreateCurrentPageTextDraw(playerid, Float:Xpos, Float:Ypos)
|
|
{
|
|
new PlayerText:txtInit;
|
|
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, "0/0");
|
|
PlayerTextDrawUseBox(playerid, txtInit, 0);
|
|
PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1);
|
|
PlayerTextDrawFont(playerid, txtInit, 1);
|
|
PlayerTextDrawSetShadow(playerid, txtInit, 0);
|
|
PlayerTextDrawSetOutline(playerid, txtInit, 1);
|
|
PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF);
|
|
PlayerTextDrawShow(playerid, txtInit);
|
|
return txtInit;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// Creates a button textdraw and returns the textdraw ID.
|
|
|
|
PlayerText:CreatePlayerDialogButton(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height, button_text[])
|
|
{
|
|
new PlayerText:txtInit;
|
|
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, button_text);
|
|
PlayerTextDrawUseBox(playerid, txtInit, 1);
|
|
PlayerTextDrawBoxColor(playerid, txtInit, 0x000000FF);
|
|
PlayerTextDrawBackgroundColor(playerid, txtInit, 0x000000FF);
|
|
PlayerTextDrawLetterSize(playerid, txtInit, 0.4, 1.1);
|
|
PlayerTextDrawFont(playerid, txtInit, 1);
|
|
PlayerTextDrawSetShadow(playerid, txtInit, 0); // no shadow
|
|
PlayerTextDrawSetOutline(playerid, txtInit, 0);
|
|
PlayerTextDrawColor(playerid, txtInit, 0x4A5A6BFF);
|
|
PlayerTextDrawSetSelectable(playerid, txtInit, 1);
|
|
PlayerTextDrawAlignment(playerid, txtInit, 2);
|
|
PlayerTextDrawTextSize(playerid, txtInit, Height, Width); // The width and height are reversed for centering.. something the game does <g>
|
|
PlayerTextDrawShow(playerid, txtInit);
|
|
return txtInit;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
PlayerText:CreatePlayerHeaderTextDraw(playerid, Float:Xpos, Float:Ypos, header_text[])
|
|
{
|
|
new PlayerText:txtInit;
|
|
txtInit = CreatePlayerTextDraw(playerid, Xpos, Ypos, header_text);
|
|
PlayerTextDrawUseBox(playerid, txtInit, 0);
|
|
PlayerTextDrawLetterSize(playerid, txtInit, 1.25, 3.0);
|
|
PlayerTextDrawFont(playerid, txtInit, 0);
|
|
PlayerTextDrawSetShadow(playerid, txtInit, 0);
|
|
PlayerTextDrawSetOutline(playerid, txtInit, 1);
|
|
PlayerTextDrawColor(playerid, txtInit, 0xACCBF1FF);
|
|
PlayerTextDrawShow(playerid, txtInit);
|
|
return txtInit;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
PlayerText:CreatePlayerBackgroundTextDraw(playerid, Float:Xpos, Float:Ypos, Float:Width, Float:Height)
|
|
{
|
|
new PlayerText:txtBackground = CreatePlayerTextDraw(playerid, Xpos, Ypos,
|
|
" ~n~"); // enough space for everyone
|
|
PlayerTextDrawUseBox(playerid, txtBackground, 1);
|
|
PlayerTextDrawBoxColor(playerid, txtBackground, 0x4A5A6BBB);
|
|
PlayerTextDrawLetterSize(playerid, txtBackground, 5.0, 5.0);
|
|
PlayerTextDrawFont(playerid, txtBackground, 0);
|
|
PlayerTextDrawSetShadow(playerid, txtBackground, 0);
|
|
PlayerTextDrawSetOutline(playerid, txtBackground, 0);
|
|
PlayerTextDrawColor(playerid, txtBackground,0xFFFFFFFF);
|
|
PlayerTextDrawTextSize(playerid, txtBackground, Width, Height);
|
|
PlayerTextDrawBackgroundColor(playerid, txtBackground, 0x4A5A6BBB);
|
|
PlayerTextDrawShow(playerid, txtBackground);
|
|
return txtBackground;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// Creates a model preview sprite
|
|
|
|
PlayerText:CreateModelPreviewTextDraw(playerid, modelindex, Float:Xpos, Float:Ypos, Float:width, Float:height)
|
|
{
|
|
new PlayerText:txtPlayerSprite = CreatePlayerTextDraw(playerid, Xpos, Ypos, ""); // it has to be set with SetText later
|
|
PlayerTextDrawFont(playerid, txtPlayerSprite, TEXT_DRAW_FONT_MODEL_PREVIEW);
|
|
PlayerTextDrawColor(playerid, txtPlayerSprite, 0xFFFFFFFF);
|
|
PlayerTextDrawBackgroundColor(playerid, txtPlayerSprite, 0x88888899);
|
|
PlayerTextDrawTextSize(playerid, txtPlayerSprite, width, height); // Text size is the Width:Height
|
|
PlayerTextDrawSetPreviewModel(playerid, txtPlayerSprite, modelindex);
|
|
if(modelindex > 319) {
|
|
PlayerTextDrawSetPreviewRot(playerid,txtPlayerSprite, -15.0, 0.0, 0.0);
|
|
}
|
|
PlayerTextDrawSetSelectable(playerid, txtPlayerSprite, 1);
|
|
PlayerTextDrawShow(playerid,txtPlayerSprite);
|
|
return txtPlayerSprite;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
DestroyPlayerModelPreviews(playerid)
|
|
{
|
|
new x=0;
|
|
while(x != SELECTION_ITEMS) {
|
|
if(gSelectionItems[playerid][x] != PlayerText:INVALID_TEXT_DRAW) {
|
|
PlayerTextDrawDestroy(playerid, gSelectionItems[playerid][x]);
|
|
gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW;
|
|
}
|
|
x++;
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
ShowPlayerModelPreviews(playerid)
|
|
{
|
|
new x=0;
|
|
new Float:BaseX = DIALOG_BASE_X;
|
|
new Float:BaseY = DIALOG_BASE_Y - (SPRITE_DIM_Y * 0.33); // down a bit
|
|
new linetracker = 0;
|
|
|
|
new itemat = GetPVarInt(playerid, "ospawner_page") * SELECTION_ITEMS;
|
|
|
|
// Destroy any previous ones created
|
|
DestroyPlayerModelPreviews(playerid);
|
|
|
|
while(x != SELECTION_ITEMS && itemat < gTotalItems) {
|
|
if(linetracker == 0) {
|
|
BaseX = DIALOG_BASE_X + 25.0; // in a bit from the box
|
|
BaseY += SPRITE_DIM_Y + 1.0; // move on the Y for the next line
|
|
}
|
|
gSelectionItems[playerid][x] = CreateModelPreviewTextDraw(playerid, itemat, BaseX, BaseY, SPRITE_DIM_X, SPRITE_DIM_Y);
|
|
gSelectionItemsTag[playerid][x] = itemat;
|
|
BaseX += SPRITE_DIM_X + 1.0; // move on the X for the next sprite
|
|
linetracker++;
|
|
if(linetracker == ITEMS_PER_LINE) linetracker = 0;
|
|
itemat++;
|
|
x++;
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
UpdatePageTextDraw(playerid)
|
|
{
|
|
new PageText[64+1];
|
|
format(PageText, 64, "%d/%d", GetPVarInt(playerid,"ospawner_page") + 1, GetNumberOfPages());
|
|
PlayerTextDrawSetString(playerid, gCurrentPageTextDrawId[playerid], PageText);
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
CreateSelectionMenu(playerid)
|
|
{
|
|
gBackgroundTextDrawId[playerid] = CreatePlayerBackgroundTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y + 20.0, DIALOG_WIDTH, DIALOG_HEIGHT);
|
|
gHeaderTextDrawId[playerid] = CreatePlayerHeaderTextDraw(playerid, DIALOG_BASE_X, DIALOG_BASE_Y, HEADER_TEXT);
|
|
gCurrentPageTextDrawId[playerid] = CreateCurrentPageTextDraw(playerid, DIALOG_WIDTH - 50.0, DIALOG_BASE_Y + 15.0);
|
|
gNextButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 30.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, NEXT_TEXT);
|
|
gPrevButtonTextDrawId[playerid] = CreatePlayerDialogButton(playerid, DIALOG_WIDTH - 90.0, DIALOG_BASE_Y+DIALOG_HEIGHT+100.0, 50.0, 16.0, PREV_TEXT);
|
|
|
|
ShowPlayerModelPreviews(playerid);
|
|
UpdatePageTextDraw(playerid);
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
DestroySelectionMenu(playerid)
|
|
{
|
|
DestroyPlayerModelPreviews(playerid);
|
|
|
|
PlayerTextDrawDestroy(playerid, gHeaderTextDrawId[playerid]);
|
|
PlayerTextDrawDestroy(playerid, gBackgroundTextDrawId[playerid]);
|
|
PlayerTextDrawDestroy(playerid, gCurrentPageTextDrawId[playerid]);
|
|
PlayerTextDrawDestroy(playerid, gNextButtonTextDrawId[playerid]);
|
|
PlayerTextDrawDestroy(playerid, gPrevButtonTextDrawId[playerid]);
|
|
|
|
gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
SpawnVehicle_InfrontOfPlayer(playerid, vehiclemodel, color1, color2)
|
|
{
|
|
new Float:x,Float:y,Float:z;
|
|
new Float:facing;
|
|
new Float:distance;
|
|
|
|
GetPlayerPos(playerid, x, y, z);
|
|
GetPlayerFacingAngle(playerid, facing);
|
|
|
|
new Float:size_x,Float:size_y,Float:size_z;
|
|
GetVehicleModelInfo(vehiclemodel, VEHICLE_MODEL_INFO_SIZE, size_x, size_y, size_z);
|
|
|
|
distance = size_x + 0.5;
|
|
|
|
x += (distance * floatsin(-facing, degrees));
|
|
y += (distance * floatcos(-facing, degrees));
|
|
|
|
facing += 90.0;
|
|
if(facing > 360.0) facing -= 360.0;
|
|
|
|
return CreateVehicle(vehiclemodel, x, y, z + (size_z * 0.25), facing, color1, color2, -1);
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
SpawnObject_InfrontOfPlayer(playerid, model)
|
|
{
|
|
new Float:x,Float:y,Float:z;
|
|
new Float:facing;
|
|
new Float:distance;
|
|
|
|
GetPlayerPos(playerid, x, y, z);
|
|
GetPlayerFacingAngle(playerid, facing);
|
|
|
|
distance = 5.0;
|
|
|
|
x += (distance * floatsin(-facing, degrees));
|
|
y += (distance * floatcos(-facing, degrees));
|
|
|
|
facing += 90.0;
|
|
if(facing > 360.0) facing -= 360.0;
|
|
|
|
return CreateObject(model, x, y, z, 0.0, 0.0, 0.0, 300.0);
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
HandlePlayerItemSelection(playerid, selecteditem)
|
|
{
|
|
if(gSelectionItemsTag[playerid][selecteditem] >= 0 && gSelectionItemsTag[playerid][selecteditem] < 319) {
|
|
SetPlayerSkin(playerid, gSelectionItemsTag[playerid][selecteditem]);
|
|
return;
|
|
}
|
|
if(gSelectionItemsTag[playerid][selecteditem] >= 400 && gSelectionItemsTag[playerid][selecteditem] < 612) {
|
|
// In this case we're spawning a vehicle for them
|
|
SpawnVehicle_InfrontOfPlayer(playerid, gSelectionItemsTag[playerid][selecteditem], -1, -1);
|
|
return;
|
|
}
|
|
if(gSelectionItemsTag[playerid][selecteditem] > 615) {
|
|
new objectid = SpawnObject_InfrontOfPlayer(playerid, gSelectionItemsTag[playerid][selecteditem]);
|
|
EditObject(playerid, objectid);
|
|
return;
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
public OnPlayerConnect(playerid)
|
|
{
|
|
// Init all of the textdraw related globals
|
|
gHeaderTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
gBackgroundTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
gCurrentPageTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
gNextButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
gPrevButtonTextDrawId[playerid] = PlayerText:INVALID_TEXT_DRAW;
|
|
|
|
new x=0;
|
|
while(x != SELECTION_ITEMS) {
|
|
gSelectionItems[playerid][x] = PlayerText:INVALID_TEXT_DRAW;
|
|
x++;
|
|
}
|
|
|
|
gItemAt[playerid] = 0;
|
|
|
|
return 1; // Allow other scripts to keep processing OnPlayerConnect
|
|
}
|
|
|
|
//-------------------------------------------
|
|
// Even though only Player* textdraws are used in this script,
|
|
// OnPlayerClickTextDraw is still required to handle ESC
|
|
|
|
public OnPlayerClickTextDraw(playerid, Text:clickedid)
|
|
{
|
|
if(GetPVarInt(playerid, "ospawner_active") == 0) return 0;
|
|
|
|
// Handle: They cancelled (with ESC)
|
|
if(clickedid == Text:INVALID_TEXT_DRAW) {
|
|
DestroySelectionMenu(playerid);
|
|
SetPVarInt(playerid, "ospawner_active", 0);
|
|
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
|
|
{
|
|
if(GetPVarInt(playerid, "ospawner_active") == 0) return 0;
|
|
|
|
new curpage = GetPVarInt(playerid, "ospawner_page");
|
|
|
|
// Handle: next button
|
|
if(playertextid == gNextButtonTextDrawId[playerid]) {
|
|
if(curpage < (GetNumberOfPages() - 1)) {
|
|
SetPVarInt(playerid, "ospawner_page", curpage + 1);
|
|
ShowPlayerModelPreviews(playerid);
|
|
UpdatePageTextDraw(playerid);
|
|
PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0);
|
|
} else {
|
|
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
// Handle: previous button
|
|
if(playertextid == gPrevButtonTextDrawId[playerid]) {
|
|
if(curpage > 0) {
|
|
SetPVarInt(playerid, "ospawner_page", curpage - 1);
|
|
ShowPlayerModelPreviews(playerid);
|
|
UpdatePageTextDraw(playerid);
|
|
PlayerPlaySound(playerid, 1084, 0.0, 0.0, 0.0);
|
|
} else {
|
|
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
// Search in the array of textdraws used for the items
|
|
new x=0;
|
|
while(x != SELECTION_ITEMS) {
|
|
if(playertextid == gSelectionItems[playerid][x]) {
|
|
DestroySelectionMenu(playerid);
|
|
CancelSelectTextDraw(playerid);
|
|
HandlePlayerItemSelection(playerid, x);
|
|
PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0);
|
|
SetPVarInt(playerid, "ospawner_active", 0);
|
|
return 1;
|
|
}
|
|
x++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
public OnPlayerCommandText(playerid, cmdtext[])
|
|
{
|
|
new cmd[256+1];
|
|
new idx;
|
|
|
|
if(!IsPlayerAdmin(playerid)) return 0;
|
|
|
|
cmd = strtok(cmdtext, idx);
|
|
|
|
if(strcmp("/ospawner", cmd, true) == 0)
|
|
{
|
|
// If there was a previously created selection menu, destroy it
|
|
DestroySelectionMenu(playerid);
|
|
|
|
SetPVarInt(playerid, "ospawner_active", 1);
|
|
SetPVarInt(playerid, "ospawner_page", 1);
|
|
|
|
CreateSelectionMenu(playerid);
|
|
SelectTextDraw(playerid, 0xACCBF1FF);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
//------------------------------------------------
|