pawn Код:
/*
* Cinematic Camera Node Editor v2.6.1
* Added in CameraMover version 2!
* Allows server devs to easily edit camera nodes.
* Now has a full project editor.
*
* ~Southclaw
*/
#include <a_samp>
#include <sscanf2>
#include <CameraMover>
#define INDEX_FILE "Cameras/index.txt"
#define strcpy(%0,%1) strcat((%0[0] = '\0', %0), %1)
// Set up your camera speed defaults here
#define CAM_SPEED (10.0) // Standard speed
#define CAM_HI_SPEED (40.0) // When pressing SPRINT (Space default)
#define CAM_LO_SPEED (3.0) // When pressing WALK (Alt default)
new
SelectedCamera[MAX_PLAYERS],
bool:gPlayerEditing[MAX_PLAYERS],
bool:gPlayerEditingNode[MAX_PLAYERS],
freeCamUsed[MAX_PLAYERS],
freeCamObj[MAX_PLAYERS],
indexData[MAX_CAMERAS][MAX_CAMFILE_LEN];
forward editor_OnCamMove(playerid, node, bool:cont);
#define DIALOG_OFFSET 1000
enum
{
d_MainMenu = DIALOG_OFFSET,
d_NewCamName,
d_ProjectOptions,
d_ExportDialog,
d_NodeID,
d_MoveTime,
d_WaitTime,
d_MoveType,
d_confirmNodeCommit,
d_ConfirmQuit
}
new
PlayerText:cam_buttonBack,
PlayerText:cam_boxBackground,
PlayerText:cam_arrowLeft,
PlayerText:cam_arrowRight,
PlayerText:cam_row1,
PlayerText:cam_row2,
PlayerText:cam_row3,
PlayerText:cam_row4,
PlayerText:cam_row1Data,
PlayerText:cam_row2Data,
PlayerText:cam_row3Data,
PlayerText:cam_row4Data,
PlayerText:cam_buttonEdit,
PlayerText:cam_buttonSave,
PlayerText:cam_buttonDelt,
PlayerText:cam_buttonPrev,
PlayerText:cam_buttonAddN;
public OnFilterScriptInit()
{
FormatMainMenu(0);
}
stock FormatMainMenu(playerid)
{
new
File:idxFile,
line[64],
idx,
strTitle[32],
strList[MAX_CAMERAS*(MAX_CAMFILE_LEN+1)];
strList = "New Camera...\n";
if(!fexist(INDEX_FILE))
{
idxFile = fopen(INDEX_FILE, io_write); // If the file doesn't exist, create it now in case it's used later
if(idxFile)fclose(idxFile);
else SendClientMessage(playerid, 0xFF0000FF, "ERROR: Directory Not Found. Please create a folder called \"Cameras\" inside \"scriptfiles\".");
}
else // But if it does, read each line and add that to the list
{
idxFile = fopen(INDEX_FILE, io_read);
while(fread(idxFile, line))
{
strcat(strList, line);
line[strlen(line)-2] = EOS; // Remove the "\n" this would need to be "-1" if using linux
strcpy(indexData[idx], line);
idx++;
}
fclose(idxFile);
}
format(strTitle, 32, "Total Camera Projects: %d", idx);
ShowPlayerDialog(playerid, d_MainMenu, DIALOG_STYLE_LIST, strTitle, strList, "Accept", "Close");
}
CreateCameraMover(playerid, camname[])
{
new
File:idxFile,
File:camFile,
tmpStr[MAX_CAMFILE_LEN+2],
newData[128],
iLoop,
Float:camX, Float:camY, Float:camZ,
Float:vecX, Float:vecY, Float:vecZ;
if(!fexist(INDEX_FILE))idxFile = fopen(INDEX_FILE, io_write);
else idxFile = fopen(INDEX_FILE, io_append);
strcat(tmpStr, camname);
strcat(tmpStr, "\r\n");
while(strlen(indexData[iLoop][0]))iLoop++;
strcpy(indexData[iLoop], camname);
fwrite(idxFile, tmpStr);
fclose(idxFile);
GetPlayerCameraPos(playerid, camX, camY, camZ);
GetPlayerCameraFrontVector(playerid, vecX, vecY, vecZ);
vecX+=camX;
vecY+=camY;
vecZ+=camZ;
format(tmpStr, MAX_CAMFILE_LEN+2, CAMERA_FILE, camname);
camFile = fopen(tmpStr, io_write);
format(newData, 128, "%f, %f, %f, %f, %f, %f, %d, %d, %d", camX, camY, camZ, vecX, vecY, vecZ, DEFAULT_MOVETIME, DEFAULT_WAITTIME, DEFAULT_MOVETYPE);
fwrite(camFile, newData);
fclose(camFile);
}
stock EditCameraMover(playerid, camera)
{
gPlayerCamData[playerid][p_CamID] = camera;
gPlayerEditing[playerid]=true;
camera_LoadTextDraws(playerid); // Need a check to see if the player has textdraws loaded (Maybe checking if the first ID is an invalid textdraw ID)
SelectTextDraw(playerid, 0xFFFF00FF);
ToggleEditGUI(playerid, true);
JumpToNode(playerid, 0);
}
stock ExitEditing(playerid)
{
gPlayerCamData[playerid][p_CamID] = -1;
gPlayerEditing[playerid] = false;
CancelSelectTextDraw(playerid);
SetCameraBehindPlayer(playerid);
ToggleEditGUI(playerid, false);
TogglePlayerControllable(playerid, true);
}
public editor_OnCamMove(playerid, node, bool:cont)
{
gPlayerCamData[playerid][p_Node]++;
UpdateGUI(playerid);
}
SaveCameraMover(playerid, exportmode=0)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode,
File:camFile_Main,
File:camFile_Backup,
tmpFilename[64],
tmpLine[256],
tmpData[3];
// Create the backup file, then write everything from the main one into the new one
format(tmpFilename, 64, "%s.bak", camFilename[tmpCam]);
camFile_Backup=fopen(tmpFilename, io_write);
camFile_Main = fopen(camFilename[tmpCam], io_write);
while(fread(camFile_Main, tmpLine))fwrite(camFile_Backup, tmpLine);
fclose(camFile_Backup);
fclose(camFile_Main);
// Now, close that backup file, write all the variable data into the main file
camFile_Main = fopen(camFilename[tmpCam], io_write);
while (tmpNode <= camMaxNodes[tmpCam])
{
if(!exportmode)
{
if (camData[tmpCam][tmpNode][cam_moveTime] == tmpData[0] &&
camData[tmpCam][tmpNode][cam_waitTime] == tmpData[1] &&
camData[tmpCam][tmpNode][cam_moveType] == tmpData[2] )
{ // All the data is the same as the last one, ignore it and leave optionals blank
format(tmpLine, 256, "%f, %f, %f, %f, %f, %f\r\n",
camData[tmpCam][tmpNode][cam_cPosX],
camData[tmpCam][tmpNode][cam_cPosY],
camData[tmpCam][tmpNode][cam_cPosZ],
camData[tmpCam][tmpNode][cam_lPosX],
camData[tmpCam][tmpNode][cam_lPosY],
camData[tmpCam][tmpNode][cam_lPosZ] );
}
else
{ // Data is different, write the new data to the line
format(tmpLine, 256, "%f, %f, %f, %f, %f, %f, %d, %d, %d\r\n",
camData[tmpCam][tmpNode][cam_cPosX],
camData[tmpCam][tmpNode][cam_cPosY],
camData[tmpCam][tmpNode][cam_cPosZ],
camData[tmpCam][tmpNode][cam_lPosX],
camData[tmpCam][tmpNode][cam_lPosY],
camData[tmpCam][tmpNode][cam_lPosZ],
camData[tmpCam][tmpNode][cam_moveTime],
camData[tmpCam][tmpNode][cam_waitTime],
camData[tmpCam][tmpNode][cam_moveType] );
tmpData[0] = camData[tmpCam][tmpNode][cam_moveTime];
tmpData[1] = camData[tmpCam][tmpNode][cam_waitTime];
tmpData[2] = camData[tmpCam][tmpNode][cam_moveType];
}
}
else
{
if(tmpNode == camMaxNodes[tmpCam])strcpy(tmpLine, "\r\n");
else
{
format(tmpLine, 256,
"InterpolateCameraPos(playerid, %f, %f, %f, %f, %f, %f, %d, %d);\r\n\
InterpolateCameraLookAt(playerid, %f, %f, %f, %f, %f, %f, %d, %d);\r\n",
camData[tmpCam][tmpNode][cam_cPosX],
camData[tmpCam][tmpNode][cam_cPosY],
camData[tmpCam][tmpNode][cam_cPosZ],
camData[tmpCam][tmpNode+1][cam_cPosX],
camData[tmpCam][tmpNode+1][cam_cPosY],
camData[tmpCam][tmpNode+1][cam_cPosZ],
camData[tmpCam][tmpNode][cam_moveTime],
camData[tmpCam][tmpNode][cam_moveType],
camData[tmpCam][tmpNode][cam_lPosX],
camData[tmpCam][tmpNode][cam_lPosY],
camData[tmpCam][tmpNode][cam_lPosZ],
camData[tmpCam][tmpNode+1][cam_lPosX],
camData[tmpCam][tmpNode+1][cam_lPosY],
camData[tmpCam][tmpNode+1][cam_lPosZ],
camData[tmpCam][tmpNode][cam_moveTime],
camData[tmpCam][tmpNode][cam_moveType] );
}
}
fwrite(camFile_Main, tmpLine);
tmpNode++;
}
fclose(camFile_Main);
}
ToggleEditGUI(playerid, toggle)
{
if(toggle)
{
PlayerTextDrawShow(playerid, cam_buttonBack);
PlayerTextDrawShow(playerid, cam_boxBackground);
PlayerTextDrawShow(playerid, cam_arrowLeft);
PlayerTextDrawShow(playerid, cam_arrowRight);
PlayerTextDrawShow(playerid, cam_row1);
PlayerTextDrawShow(playerid, cam_row2);
PlayerTextDrawShow(playerid, cam_row3);
PlayerTextDrawShow(playerid, cam_row4);
PlayerTextDrawShow(playerid, cam_row1Data);
PlayerTextDrawShow(playerid, cam_row2Data);
PlayerTextDrawShow(playerid, cam_row3Data);
PlayerTextDrawShow(playerid, cam_row4Data);
PlayerTextDrawShow(playerid, cam_buttonEdit);
PlayerTextDrawShow(playerid, cam_buttonSave);
PlayerTextDrawShow(playerid, cam_buttonDelt);
PlayerTextDrawShow(playerid, cam_buttonPrev);
PlayerTextDrawShow(playerid, cam_buttonAddN);
}
else
{
PlayerTextDrawHide(playerid, cam_buttonBack);
PlayerTextDrawHide(playerid, cam_boxBackground);
PlayerTextDrawHide(playerid, cam_arrowLeft);
PlayerTextDrawHide(playerid, cam_arrowRight);
PlayerTextDrawHide(playerid, cam_row1);
PlayerTextDrawHide(playerid, cam_row2);
PlayerTextDrawHide(playerid, cam_row3);
PlayerTextDrawHide(playerid, cam_row4);
PlayerTextDrawHide(playerid, cam_row1Data);
PlayerTextDrawHide(playerid, cam_row2Data);
PlayerTextDrawHide(playerid, cam_row3Data);
PlayerTextDrawHide(playerid, cam_row4Data);
PlayerTextDrawHide(playerid, cam_buttonEdit);
PlayerTextDrawHide(playerid, cam_buttonSave);
PlayerTextDrawHide(playerid, cam_buttonDelt);
PlayerTextDrawHide(playerid, cam_buttonPrev);
PlayerTextDrawHide(playerid, cam_buttonAddN);
}
}
UpdateGUI(playerid)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node],
dataStr[16],
MoveTypeName[3][5]={"NONE", "MOVE", "CUT"};
format(dataStr, 16, "%d/%d", tmpNode, camMaxNodes[tmpCam]);
PlayerTextDrawSetString(playerid, cam_row1Data, dataStr);
PlayerTextDrawShow(playerid, cam_row1Data);
format(dataStr, 16, "%d", camData[tmpCam][tmpNode][cam_moveTime]);
PlayerTextDrawSetString(playerid, cam_row2Data, dataStr);
PlayerTextDrawShow(playerid, cam_row2Data);
format(dataStr, 16, "%d", camData[tmpCam][tmpNode][cam_waitTime]);
PlayerTextDrawSetString(playerid, cam_row3Data, dataStr);
PlayerTextDrawShow(playerid, cam_row3Data);
format(dataStr, 16, "%s(%d)", MoveTypeName[ _:camData[tmpCam][tmpNode][cam_moveType] ], camData[tmpCam][tmpNode][cam_moveType]);
PlayerTextDrawSetString(playerid, cam_row4Data, dataStr);
PlayerTextDrawShow(playerid, cam_row4Data);
}
JumpToNode(playerid, node)
{
new
camera = gPlayerCamData[playerid][p_CamID];
SetPlayerCameraPos(playerid, camData[camera][node][cam_cPosX], camData[camera][node][cam_cPosY], camData[camera][node][cam_cPosZ]);
SetPlayerCameraLookAt(playerid, camData[camera][node][cam_lPosX], camData[camera][node][cam_lPosY], camData[camera][node][cam_lPosZ]);
gPlayerCamData[playerid][p_Node] = node;
UpdateGUI(playerid);
}
EditCurrentNode(playerid)
{
gPlayerEditingNode[playerid] = true;
EnterFreeCam(playerid);
}
CommitCurrentNode(playerid)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node],
Float:vecX, Float:vecY, Float:vecZ;
GetPlayerCameraPos(playerid, camData[tmpCam][tmpNode][cam_cPosX], camData[tmpCam][tmpNode][cam_cPosY], camData[tmpCam][tmpNode][cam_cPosZ]);
GetPlayerCameraFrontVector(playerid, vecX, vecY, vecZ);
camData[tmpCam][tmpNode][cam_lPosX] = camData[tmpCam][tmpNode][cam_cPosX]+(vecX*4); // x4 just to give the LookAt node a little distance, I didn't know if this would affect anything
camData[tmpCam][tmpNode][cam_lPosY] = camData[tmpCam][tmpNode][cam_cPosY]+(vecY*4);
camData[tmpCam][tmpNode][cam_lPosZ] = camData[tmpCam][tmpNode][cam_cPosZ]+(vecZ*4);
gPlayerEditingNode[playerid] = false;
ExitFreeCam(playerid);
UpdateGUI(playerid);
}
CancelCurrentNodeEdit(playerid)
{
JumpToNode(playerid, gPlayerCamData[playerid][p_Node]);
gPlayerEditingNode[playerid] = false;
ExitFreeCam(playerid);
}
EnterFreeCam(playerid)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node];
freeCamUsed[playerid] = true;
TogglePlayerControllable(playerid, true);
SetCameraBehindPlayer(playerid);
ApplyAnimation(playerid, "CARRY", "crry_prtial", 1.0, 0, 0, 0, 1, 0);
CancelSelectTextDraw(playerid);
ToggleEditGUI(playerid, false);
freeCamObj[playerid] = CreateObject(19300, camData[tmpCam][tmpNode][cam_cPosX], camData[tmpCam][tmpNode][cam_cPosY], camData[tmpCam][tmpNode][cam_cPosZ], 0.0, 0.0, 0.0);
AttachCameraToObject(playerid, freeCamObj[playerid]);
}
ExitFreeCam(playerid)
{
JumpToNode(playerid, gPlayerCamData[playerid][p_Node]);
freeCamUsed[playerid] = false;
DestroyObject(freeCamObj[playerid]);
ToggleEditGUI(playerid, true);
SelectTextDraw(playerid, 0xFFFF00FF);
}
EditNewNode(playerid)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node];
ShiftNodeArray(tmpCam, tmpNode);
EditCurrentNode(playerid);
gPlayerCamData[playerid][p_Node]++;
}
DeleteCurrentNode(playerid)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node];
ShiftNodeArray(tmpCam, tmpNode, 1);
JumpToNode(playerid, tmpNode);
}
ShiftNodeArray(camera, startnode, direction=0)
{
if(direction == 0)
{
new iLoop = camMaxNodes[camera]++; // Assign the value then increment it because we are adding another cell
while(iLoop>=startnode) // Loop from the last node to the startnode
{
for(new e;e<MAX_CAMDATA;e++) // Shift all the data to the next node cell
{
camData[camera][iLoop+1][CAM_DATA_ENUM:e] = camData[camera][iLoop][CAM_DATA_ENUM:e];
}
iLoop--;
}
}
else
{
new iLoop = startnode;
while(iLoop<=camMaxNodes[camera]) // Loop from the startnode to the last node
{
for(new e;e<MAX_CAMDATA;e++)
camData[camera][iLoop][CAM_DATA_ENUM:e] = camData[camera][iLoop+1][CAM_DATA_ENUM:e];
iLoop++;
}
for(new e;e<MAX_CAMDATA;e++)camData[camera][camMaxNodes[camera]][CAM_DATA_ENUM:e] = 0;
// I didn't want to have to call two loops
// But I'm not sure how do to it otherwise!
// I'll try a backwards loop when I'm more awake!
// A backwards loop would be able to blank the last cell easier
camMaxNodes[camera]--; // Decrement the max value, we just removed a cell
}
}
/* Debugging!
I used it to test the above function to ensure it
was shifting the right data without deleting stuff!
PRINTALLNODE©
{
new n;
while(n<MAX_CAMNODE)
{
printf("%02d: %d, %d, %d", n, camData[c][n][cam_moveTime], camData[c][n][cam_waitTime], camData[c][n][cam_moveType]);
n++;
}
}
*/
public OnPlayerUpdate(playerid)
{
if(gPlayerEditingNode[playerid] && freeCamUsed[playerid])
{
new
k,
ud,
lr,
Float:camX,
Float:camY,
Float:camZ,
Float:vecX,
Float:vecY,
Float:vecZ,
Float:angR,
Float:angE,
Float:speed = CAM_SPEED;
GetPlayerKeys(playerid, k, ud, lr);
GetPlayerCameraPos(playerid, camX, camY, camZ);
GetPlayerCameraFrontVector(playerid, vecX, vecY, vecZ);
angR = 90-(atan2(vecY, vecX));
if(angR<0.0)angR=360.0+angR;
angE = -(floatabs(atan2(floatsqroot(floatpower(vecX, 2.0) + floatpower(vecY, 2.0)), vecZ))-90.0);
if(k==KEY_JUMP)
{
speed = CAM_HI_SPEED;
}
if(k==KEY_WALK)
{
speed = CAM_LO_SPEED;
}
if(ud==KEY_UP)
{
GetXYZFromAngle(camX, camY, camZ, angR, angE, 50.0);
MoveObject(freeCamObj[playerid], camX, camY, camZ, speed);
}
if(ud==KEY_DOWN)
{
GetXYZFromAngle(camX, camY, camZ, angR, angE, -50.0);
MoveObject(freeCamObj[playerid], camX, camY, camZ, speed);
}
if(lr==KEY_LEFT)
{
GetXYFromAngle(camX, camY, -angR+90.0, 50.0);
MoveObject(freeCamObj[playerid], camX, camY, camZ, speed);
}
if(lr==KEY_RIGHT)
{
GetXYFromAngle(camX, camY, -angR+90.0, -50.0);
MoveObject(freeCamObj[playerid], camX, camY, camZ, speed);
}
if(k==KEY_SPRINT)
{
MoveObject(freeCamObj[playerid], camX, camY, camZ+50.0, speed);
}
if(k==KEY_CROUCH)
{
MoveObject(freeCamObj[playerid], camX, camY, camZ-50.0, speed);
}
if(ud!=KEY_UP && ud!=KEY_DOWN && lr!=KEY_LEFT && lr!=KEY_RIGHT && k!=KEY_SPRINT && k!=KEY_CROUCH)StopObject(freeCamObj[playerid]);
}
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(gPlayerEditingNode[playerid])
{
if(newkeys & KEY_FIRE)
{
new strInfo[64];
format(strInfo, 64, "Apply changes to node %d?", gPlayerCamData[playerid][p_Node]);
ShowPlayerDialog(playerid, d_confirmNodeCommit, DIALOG_STYLE_MSGBOX, "Confirm changes?", strInfo, "Apply", "Reset");
}
if(newkeys & 16)CancelCurrentNodeEdit(playerid);
}
}
public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
{
if(playertextid == cam_buttonBack)ShowPlayerDialog(playerid, d_ConfirmQuit, DIALOG_STYLE_MSGBOX, "Exit Editing", "Are you sure you want to quit? All unsaved data will be lost!", "Ok", "Cancel");
if(playertextid == cam_buttonEdit)EditCurrentNode(playerid);
if(playertextid == cam_buttonSave)ShowPlayerDialog(playerid, d_ExportDialog, DIALOG_STYLE_LIST, "Export Camera As...", "Sequencer Data File\nInterpolate Functions", "Accept", "Cancel");
if(playertextid == cam_buttonDelt)DeleteCurrentNode(playerid);
if(playertextid == cam_buttonPrev)MoveCameraToNextNode(playerid, true);
if(playertextid == cam_buttonAddN)
{
if(GetCameraMaxNodes(gPlayerCamData[playerid][p_CamID]) < MAX_CAMNODE-1)EditNewNode(playerid);
else SendClientMessage(playerid, 0xFF0000FF, "Node limit reached, increase constant <MAX_CAMNODE> in script.");
}
if(playertextid == cam_arrowLeft)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node] - 1;
if(tmpNode < 0)tmpNode = camMaxNodes[tmpCam];
JumpToNode(playerid, tmpNode);
}
if(playertextid == cam_arrowRight)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node] + 1;
if(tmpNode > camMaxNodes[tmpCam])tmpNode = 0;
JumpToNode(playerid, tmpNode);
}
if(playertextid == cam_row1Data)ShowPlayerDialog(playerid, d_NodeID, DIALOG_STYLE_INPUT, "Node ID", "Type a node ID to jump to", "Back", "Accept");
if(playertextid == cam_row2Data)ShowPlayerDialog(playerid, d_MoveTime, DIALOG_STYLE_INPUT, "Move Time", "Time to move to next node (in milliseconds)", "Back", "Accept");
if(playertextid == cam_row3Data)ShowPlayerDialog(playerid, d_WaitTime, DIALOG_STYLE_INPUT, "Wait Time", "Time to wait before moving to next node (in milliseconds)", "Back", "Accept");
if(playertextid == cam_row4Data)ShowPlayerDialog(playerid, d_MoveType, DIALOG_STYLE_MSGBOX, "Cut Type", "Select a Camera Cut Type\nMove: Smoothly moves to the next node.\nJump: Jumps to the next node.", "Move", "Jump");
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == d_MainMenu)
{
if(response)
{
if(listitem==0)ShowPlayerDialog(playerid, d_NewCamName, DIALOG_STYLE_INPUT, "New Camera", "Enter the new camera name below.\nDo not use spaces.", "Accept", "Back");
else
{
SelectedCamera[playerid] = listitem-1;
ShowPlayerDialog(playerid, d_ProjectOptions, DIALOG_STYLE_LIST, "Options", "Edit Camera\nPreview Camera", "Accept", "Back");
}
}
}
if(dialogid == d_NewCamName)
{
if(response)
{
if(strfind(inputtext, " ") == -1)
{
CreateCameraMover(playerid, inputtext);
FormatMainMenu(playerid);
}
else ShowPlayerDialog(playerid, d_NewCamName, DIALOG_STYLE_INPUT, "New Camera", "Enter the new camera name below.\n{FF0000}Do not use spaces.", "Accept", "Back");
}
else FormatMainMenu(playerid);
}
if(dialogid == d_ProjectOptions)
{
if(response)
{
if(listitem == 0)EditCameraMover(playerid, LoadCameraMover(indexData[SelectedCamera[playerid]]));
if(listitem == 1)PlayCameraMover(playerid, LoadCameraMover(indexData[SelectedCamera[playerid]]));
}
else FormatMainMenu(playerid);
}
if(dialogid == d_ExportDialog)
{
if(response)
{
SaveCameraMover(playerid, listitem);
SendClientMessage(playerid, 0xFFFF00FF, "Camera saved!");
}
}
if(dialogid == d_NodeID)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
nextNode = strval(inputtext);
if(0 <= nextNode < camMaxNodes[tmpCam])JumpToNode(playerid, nextNode);
else
{
SendClientMessage(playerid, 0xFF1100FF, "Invalid value entered");
ShowPlayerDialog(playerid, d_NodeID, DIALOG_STYLE_INPUT, "Node ID", "Type a node ID to jump to", "Back", "Accept");
}
}
if(dialogid == d_MoveTime)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node],
tmpMoveTime = strval(inputtext);
if(tmpMoveTime > 0)
{
camData[tmpCam][tmpNode][cam_moveTime] = tmpMoveTime;
UpdateGUI(playerid);
}
else
{
SendClientMessage(playerid, 0xFF1100FF, "Invalid value entered");
ShowPlayerDialog(playerid, d_MoveTime, DIALOG_STYLE_INPUT, "Move Time", "Time to move to next node (in milliseconds)", "Back", "Accept");
}
}
if(dialogid == d_WaitTime)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node],
tmpWaitTime = strval(inputtext);
if(tmpWaitTime > 0)
{
camData[tmpCam][tmpNode][cam_waitTime] = tmpWaitTime;
UpdateGUI(playerid);
}
else
{
SendClientMessage(playerid, 0xFF1100FF, "Invalid value entered");
ShowPlayerDialog(playerid, d_WaitTime, DIALOG_STYLE_INPUT, "Wait Time", "Time to wait before moving to next node (in milliseconds)", "Back", "Accept");
}
}
if(dialogid == d_MoveType)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node];
if(!response)
{
camData[tmpCam][tmpNode][cam_moveType] = CAMERA_MOVE;
UpdateGUI(playerid);
}
else
{
camData[tmpCam][tmpNode][cam_moveType] = CAMERA_CUT;
UpdateGUI(playerid);
}
}
if(dialogid == d_confirmNodeCommit)
{
new
tmpCam = gPlayerCamData[playerid][p_CamID],
tmpNode = gPlayerCamData[playerid][p_Node];
if(response)CommitCurrentNode(playerid);
else
{
SetObjectPos(freeCamObj[playerid],
camData[tmpCam][tmpNode][cam_cPosX],
camData[tmpCam][tmpNode][cam_cPosY],
camData[tmpCam][tmpNode][cam_cPosZ]);
}
}
if(dialogid == d_ConfirmQuit)
{
if(response)
{
ExitEditing(playerid);
FormatMainMenu(playerid);
}
}
}
public OnPlayerConnect(playerid)
{
camera_LoadTextDraws(playerid);
return 1;
}
camera_LoadTextDraws(playerid)
{
// Background
cam_boxBackground = CreatePlayerTextDraw(playerid, 320.000000, 320.000000, "~n~~n~~n~~n~");
PlayerTextDrawAlignment(playerid, cam_boxBackground, 2);
PlayerTextDrawBackgroundColor(playerid, cam_boxBackground, 255);
PlayerTextDrawFont(playerid, cam_boxBackground, 1);
PlayerTextDrawLetterSize(playerid, cam_boxBackground, 0.500000, 2.200000);
PlayerTextDrawColor(playerid, cam_boxBackground, -1);
PlayerTextDrawSetOutline(playerid, cam_boxBackground, 0);
PlayerTextDrawSetProportional(playerid, cam_boxBackground, 1);
PlayerTextDrawSetShadow(playerid, cam_boxBackground, 1);
PlayerTextDrawUseBox(playerid, cam_boxBackground, 1);
PlayerTextDrawBoxColor(playerid, cam_boxBackground, 128);
PlayerTextDrawTextSize(playerid, cam_boxBackground, 380.000000, 300.000000);
// Node Switch
cam_arrowLeft = CreatePlayerTextDraw(playerid, 174.000000, 339.000000, "~<~");
PlayerTextDrawBackgroundColor(playerid, cam_arrowLeft, 255);
PlayerTextDrawFont(playerid, cam_arrowLeft, 1);
PlayerTextDrawLetterSize(playerid, cam_arrowLeft, 0.000000, 4.800001);
PlayerTextDrawColor(playerid, cam_arrowLeft, -1);
PlayerTextDrawSetOutline(playerid, cam_arrowLeft, 0);
PlayerTextDrawSetProportional(playerid, cam_arrowLeft, 1);
PlayerTextDrawSetShadow(playerid, cam_arrowLeft, 1);
PlayerTextDrawUseBox(playerid, cam_arrowLeft, 1);
PlayerTextDrawBoxColor(playerid, cam_arrowLeft, 6618980);
PlayerTextDrawTextSize(playerid, cam_arrowLeft, 210.000000, 58.000000);
PlayerTextDrawSetSelectable(playerid, cam_arrowLeft, true);
cam_arrowRight = CreatePlayerTextDraw(playerid, 432.000000, 339.000000, "~>~");
PlayerTextDrawBackgroundColor(playerid, cam_arrowRight, 255);
PlayerTextDrawFont(playerid, cam_arrowRight, 1);
PlayerTextDrawLetterSize(playerid, cam_arrowRight, 0.000000, 4.800001);
PlayerTextDrawColor(playerid, cam_arrowRight, -1);
PlayerTextDrawSetOutline(playerid, cam_arrowRight, 0);
PlayerTextDrawSetProportional(playerid, cam_arrowRight, 1);
PlayerTextDrawSetShadow(playerid, cam_arrowRight, 1);
PlayerTextDrawUseBox(playerid, cam_arrowRight, 1);
PlayerTextDrawBoxColor(playerid, cam_arrowRight, 6618980);
PlayerTextDrawTextSize(playerid, cam_arrowRight, 466.000000, 58.000000);
PlayerTextDrawSetSelectable(playerid, cam_arrowRight, true);
// Info
cam_row1 = CreatePlayerTextDraw(playerid, 240.000000, 325.000000, "Node:");
PlayerTextDrawBackgroundColor(playerid, cam_row1, 255);
PlayerTextDrawFont(playerid, cam_row1, 1);
PlayerTextDrawLetterSize(playerid, cam_row1, 0.300000, 1.000000);
PlayerTextDrawColor(playerid, cam_row1, -1);
PlayerTextDrawSetOutline(playerid, cam_row1, 0);
PlayerTextDrawSetProportional(playerid, cam_row1, 1);
PlayerTextDrawSetShadow(playerid, cam_row1, 1);
PlayerTextDrawUseBox(playerid, cam_row1, 1);
PlayerTextDrawBoxColor(playerid, cam_row1, 3955300);
PlayerTextDrawTextSize(playerid, cam_row1, 400.000000, 0.000000);
cam_row2 = CreatePlayerTextDraw(playerid, 240.000000, 342.000000, "Move Time (ms):");
PlayerTextDrawBackgroundColor(playerid, cam_row2, 255);
PlayerTextDrawFont(playerid, cam_row2, 1);
PlayerTextDrawLetterSize(playerid, cam_row2, 0.300000, 1.000000);
PlayerTextDrawColor(playerid, cam_row2, -1);
PlayerTextDrawSetOutline(playerid, cam_row2, 0);
PlayerTextDrawSetProportional(playerid, cam_row2, 1);
PlayerTextDrawSetShadow(playerid, cam_row2, 1);
PlayerTextDrawUseBox(playerid, cam_row2, 1);
PlayerTextDrawBoxColor(playerid, cam_row2, 3955300);
PlayerTextDrawTextSize(playerid, cam_row2, 400.000000, 0.000000);
cam_row3 = CreatePlayerTextDraw(playerid, 240.000000, 360.000000, "Wait Time (ms):");
PlayerTextDrawBackgroundColor(playerid, cam_row3, 255);
PlayerTextDrawFont(playerid, cam_row3, 1);
PlayerTextDrawLetterSize(playerid, cam_row3, 0.300000, 1.000000);
PlayerTextDrawColor(playerid, cam_row3, -1);
PlayerTextDrawSetOutline(playerid, cam_row3, 0);
PlayerTextDrawSetProportional(playerid, cam_row3, 1);
PlayerTextDrawSetShadow(playerid, cam_row3, 1);
PlayerTextDrawUseBox(playerid, cam_row3, 1);
PlayerTextDrawBoxColor(playerid, cam_row3, 3955300);
PlayerTextDrawTextSize(playerid, cam_row3, 400.000000, 0.000000);
cam_row4 = CreatePlayerTextDraw(playerid, 240.000000, 378.000000, "Cut Type:");
PlayerTextDrawBackgroundColor(playerid, cam_row4, 255);
PlayerTextDrawFont(playerid, cam_row4, 1);
PlayerTextDrawLetterSize(playerid, cam_row4, 0.300000, 1.000000);
PlayerTextDrawColor(playerid, cam_row4, -1);
PlayerTextDrawSetOutline(playerid, cam_row4, 0);
PlayerTextDrawSetProportional(playerid, cam_row4, 1);
PlayerTextDrawSetShadow(playerid, cam_row4, 1);
PlayerTextDrawUseBox(playerid, cam_row4, 1);
PlayerTextDrawBoxColor(playerid, cam_row4, 3955300);
PlayerTextDrawTextSize(playerid, cam_row4, 400.000000, 0.000000);
// Data fields
cam_row1Data = CreatePlayerTextDraw(playerid, 335.000000, 325.000000, "00");
PlayerTextDrawBackgroundColor(playerid, cam_row1Data, 255);
PlayerTextDrawFont(playerid, cam_row1Data, 1);
PlayerTextDrawLetterSize(playerid, cam_row1Data, 0.300000, 1.000000);
PlayerTextDrawColor(playerid, cam_row1Data, -1);
PlayerTextDrawSetOutline(playerid, cam_row1Data, 0);
PlayerTextDrawSetProportional(playerid, cam_row1Data, 1);
PlayerTextDrawSetShadow(playerid, cam_row1Data, 1);
PlayerTextDrawUseBox(playerid, cam_row1Data, 1);
PlayerTextDrawBoxColor(playerid, cam_row1Data, 3955300);
PlayerTextDrawTextSize(playerid, cam_row1Data, 400.000000, 14.000000);
PlayerTextDrawSetSelectable(playerid, cam_row1Data, true);
cam_row2Data = CreatePlayerTextDraw(playerid, 335.000000, 342.000000, "00000");
PlayerTextDrawBackgroundColor(playerid, cam_row2Data, 255);
PlayerTextDrawFont(playerid, cam_row2Data, 1);
PlayerTextDrawLetterSize(playerid, cam_row2Data, 0.300000, 1.000000);
PlayerTextDrawColor(playerid, cam_row2Data, -1);
PlayerTextDrawSetOutline(playerid, cam_row2Data, 0);
PlayerTextDrawSetProportional(playerid, cam_row2Data, 1);
PlayerTextDrawSetShadow(playerid, cam_row2Data, 1);
PlayerTextDrawUseBox(playerid, cam_row2Data, 1);
PlayerTextDrawBoxColor(playerid, cam_row2Data, 3955300);
PlayerTextDrawTextSize(playerid, cam_row2Data, 400.000000, 14.000000);
PlayerTextDrawSetSelectable(playerid, cam_row2Data, true);
cam_row3Data = CreatePlayerTextDraw(playerid, 335.000000, 360.000000, "00000");
PlayerTextDrawBackgroundColor(playerid, cam_row3Data, 255);
PlayerTextDrawFont(playerid, cam_row3Data, 1);
PlayerTextDrawLetterSize(playerid, cam_row3Data, 0.300000, 1.000000);
PlayerTextDrawColor(playerid, cam_row3Data, -1);
PlayerTextDrawSetOutline(playerid, cam_row3Data, 0);
PlayerTextDrawSetProportional(playerid, cam_row3Data, 1);
PlayerTextDrawSetShadow(playerid, cam_row3Data, 1);
PlayerTextDrawUseBox(playerid, cam_row3Data, 1);
PlayerTextDrawBoxColor(playerid, cam_row3Data, 3955300);
PlayerTextDrawTextSize(playerid, cam_row3Data, 400.000000, 14.000000);
PlayerTextDrawSetSelectable(playerid, cam_row3Data, true);
cam_row4Data = CreatePlayerTextDraw(playerid, 335.000000, 378.000000, "MOVE");
PlayerTextDrawBackgroundColor(playerid, cam_row4Data, 255);
PlayerTextDrawFont(playerid,cam_row4Data, 1);
PlayerTextDrawLetterSize(playerid, cam_row4Data, 0.300000, 1.000000);
PlayerTextDrawColor(playerid, cam_row4Data, 16777215);
PlayerTextDrawSetOutline(playerid, cam_row4Data, 0);
PlayerTextDrawSetProportional(playerid, cam_row4Data, 1);
PlayerTextDrawSetShadow(playerid, cam_row4Data, 1);
PlayerTextDrawUseBox(playerid, cam_row4Data, 1);
PlayerTextDrawBoxColor(playerid, cam_row4Data, 3955300);
PlayerTextDrawTextSize(playerid, cam_row4Data, 400.000000, 14.000000);
PlayerTextDrawSetSelectable(playerid, cam_row4Data, true);
// Edit Controls
cam_buttonEdit = CreatePlayerTextDraw(playerid, 250.000000, 290.000000, "E");
PlayerTextDrawBackgroundColor(playerid, cam_buttonEdit, 255);
PlayerTextDrawFont(playerid, cam_buttonEdit, 1);
PlayerTextDrawLetterSize(playerid, cam_buttonEdit, 1.000000, 2.499999);
PlayerTextDrawColor(playerid, cam_buttonEdit, -1);
PlayerTextDrawSetOutline(playerid, cam_buttonEdit, 0);
PlayerTextDrawSetProportional(playerid, cam_buttonEdit, 1);
PlayerTextDrawSetShadow(playerid, cam_buttonEdit, 1);
PlayerTextDrawUseBox(playerid, cam_buttonEdit, 1);
PlayerTextDrawBoxColor(playerid, cam_buttonEdit, 100);
PlayerTextDrawTextSize(playerid, cam_buttonEdit, 270.000000, 14.0);
PlayerTextDrawSetSelectable(playerid, cam_buttonEdit, true);
cam_buttonSave = CreatePlayerTextDraw(playerid, 280.000000, 290.000000, "S");
PlayerTextDrawBackgroundColor(playerid, cam_buttonSave, 255);
PlayerTextDrawFont(playerid, cam_buttonSave, 1);
PlayerTextDrawLetterSize(playerid, cam_buttonSave, 0.829999, 2.499999);
PlayerTextDrawColor(playerid, cam_buttonSave, -1);
PlayerTextDrawSetOutline(playerid, cam_buttonSave, 0);
PlayerTextDrawSetProportional(playerid, cam_buttonSave, 1);
PlayerTextDrawSetShadow(playerid, cam_buttonSave, 1);
PlayerTextDrawUseBox(playerid, cam_buttonSave, 1);
PlayerTextDrawBoxColor(playerid, cam_buttonSave, 100);
PlayerTextDrawTextSize(playerid, cam_buttonSave, 300.000000, 14.0);
PlayerTextDrawSetSelectable(playerid, cam_buttonSave, true);
cam_buttonDelt = CreatePlayerTextDraw(playerid, 310.000000, 290.000000, "X");
PlayerTextDrawBackgroundColor(playerid, cam_buttonDelt, 255);
PlayerTextDrawFont(playerid, cam_buttonDelt, 1);
PlayerTextDrawLetterSize(playerid, cam_buttonDelt, 0.890000, 2.499999);
PlayerTextDrawColor(playerid, cam_buttonDelt, -1);
PlayerTextDrawSetOutline(playerid, cam_buttonDelt, 0);
PlayerTextDrawSetProportional(playerid, cam_buttonDelt, 1);
PlayerTextDrawSetShadow(playerid, cam_buttonDelt, 1);
PlayerTextDrawUseBox(playerid, cam_buttonDelt, 1);
PlayerTextDrawBoxColor(playerid, cam_buttonDelt, 100);
PlayerTextDrawTextSize(playerid, cam_buttonDelt, 330.000000, 14.0);
PlayerTextDrawSetSelectable(playerid, cam_buttonDelt, true);
cam_buttonPrev = CreatePlayerTextDraw(playerid, 340.000000, 290.000000, ">>");
PlayerTextDrawBackgroundColor(playerid, cam_buttonPrev, 255);
PlayerTextDrawFont(playerid, cam_buttonPrev, 1);
PlayerTextDrawLetterSize(playerid, cam_buttonPrev, 0.389999, 2.499999);
PlayerTextDrawColor(playerid, cam_buttonPrev, -1);
PlayerTextDrawSetOutline(playerid, cam_buttonPrev, 0);
PlayerTextDrawSetProportional(playerid, cam_buttonPrev, 1);
PlayerTextDrawSetShadow(playerid, cam_buttonPrev, 1);
PlayerTextDrawUseBox(playerid, cam_buttonPrev, 1);
PlayerTextDrawBoxColor(playerid, cam_buttonPrev, 100);
PlayerTextDrawTextSize(playerid, cam_buttonPrev, 360.000000, 14.0);
PlayerTextDrawSetSelectable(playerid, cam_buttonPrev, true);
cam_buttonAddN = CreatePlayerTextDraw(playerid, 370.000000, 290.000000, "+");
PlayerTextDrawBackgroundColor(playerid, cam_buttonAddN, 255);
PlayerTextDrawFont(playerid, cam_buttonAddN, 1);
PlayerTextDrawLetterSize(playerid, cam_buttonAddN, 0.860000, 2.499999);
PlayerTextDrawColor(playerid, cam_buttonAddN, -1);
PlayerTextDrawSetOutline(playerid, cam_buttonAddN, 0);
PlayerTextDrawSetProportional(playerid, cam_buttonAddN, 1);
PlayerTextDrawSetShadow(playerid, cam_buttonAddN, 1);
PlayerTextDrawUseBox(playerid, cam_buttonAddN, 1);
PlayerTextDrawBoxColor(playerid, cam_buttonAddN, 100);
PlayerTextDrawTextSize(playerid, cam_buttonAddN, 390.000000, 14.0);
PlayerTextDrawSetSelectable(playerid, cam_buttonAddN, true);
cam_buttonBack = CreatePlayerTextDraw(playerid, 500.000000, 110.000000, "Back");
PlayerTextDrawBackgroundColor(playerid, cam_buttonBack, 255);
PlayerTextDrawFont(playerid, cam_buttonBack, 1);
PlayerTextDrawLetterSize(playerid, cam_buttonBack, 0.759999, 2.499999);
PlayerTextDrawColor(playerid, cam_buttonBack, -16776961);
PlayerTextDrawSetOutline(playerid, cam_buttonBack, 1);
PlayerTextDrawSetProportional(playerid, cam_buttonBack, 1);
PlayerTextDrawUseBox(playerid, cam_buttonBack, 1);
PlayerTextDrawBoxColor(playerid, cam_buttonBack, 100);
PlayerTextDrawTextSize(playerid, cam_buttonBack, 560.000000, 14.000000);
PlayerTextDrawSetSelectable(playerid, cam_buttonBack, true);
}
// Separate functions that are used
stock GetXYFromAngle(&Float:x, &Float:y, Float:a, Float:distance)
x+=(distance*floatsin(-a,degrees)),y+=(distance*floatcos(-a,degrees));
stock GetXYZFromAngle(&Float:x, &Float:y, &Float:z, Float:angle, Float:elevation, Float:distance)
x += ( distance*floatsin(angle,degrees)*floatcos(elevation,degrees) ),y += ( distance*floatcos(angle,degrees)*floatcos(elevation,degrees) ),z += ( distance*floatsin(elevation,degrees) );
// Debugging Commands
new temp_camid;
public OnPlayerCommandText(playerid, cmdtext[])
{
new
cmd[30],
params[98];
sscanf(cmdtext, "s[30]s[98]", cmd, params);
if(!strcmp(cmd, "/cameras"))
{
FormatMainMenu(playerid);
return 1;
}
if(!strcmp(cmd, "/mouse")) // Just in case you exit mouse mode by accident!
{
SelectTextDraw(playerid, 0xFFFF00FF);
return 1;
}
// Some debug commands - Not really needed now the editor is here, but they might come in useful if it glitches.
if(!strcmp(cmd, "/loadcam"))
{
temp_camid = LoadCameraMover(params);
return 1;
}
if(!strcmp(cmd, "/playcam"))
{
PlayCameraMover(playerid, temp_camid, 0, false);
return 1;
}
if(!strcmp(cmd, "/editcam"))
{
EditCameraMover(playerid, temp_camid);
return 1;
}
if(!strcmp(cmd, "/exitediting"))
{
ExitEditing(playerid);
return 1;
}
if(!strcmp(cmd, "/loadtds")) // In case the textdraws bug up (Although this shouldn't happen now, textdraws now load every time you enter edit mode)
{
camera_LoadTextDraws(playerid);
SendClientMessage(playerid, 0xFFFF00FF, "Textdraws Loaded!");
return 1;
}
return 0;
}
public OnCameraReachNode(playerid, camera, node)
{
if(node == camMaxNodes[camera])ApplyAnimation(0, "PED", "KO_shot_face", 5.0, 0, 1, 1, 1, 0, 1);
}