From 520164269b4c638f3aaf929c8c3f8970d1a47162 Mon Sep 17 00:00:00 2001
From: Vortrex <3858226+VortrexFTW@users.noreply.github.com>
Date: Wed, 22 Feb 2023 16:24:56 -0600
Subject: [PATCH] Add payphone script and commands
---
meta.xml | 1 +
scripts/server/command.js | 5 +
scripts/server/payphone.js | 219 +++++++++++++++++++++++++++++++++++++
3 files changed, 225 insertions(+)
create mode 100644 scripts/server/payphone.js
diff --git a/meta.xml b/meta.xml
index 9cffe051..9d95f54a 100644
--- a/meta.xml
+++ b/meta.xml
@@ -50,6 +50,7 @@
+
diff --git a/scripts/server/command.js b/scripts/server/command.js
index c6f7ab96..e14e0526 100644
--- a/scripts/server/command.js
+++ b/scripts/server/command.js
@@ -494,6 +494,11 @@ function loadCommands() {
//new CommandData("npcrespawn", respawnNPCCommand, "", getStaffFlagValue("ManageNPCs"), true, false, "Respawns the nearest NPC"),
],
paintball: [],
+ payPhone: [
+ new CommandData("addpayphone", createPayPhoneCommand, "[number]", getStaffFlagValue("ManagePayPhones"), true, false, "Creates an payphone with optional number (random number if not added)"),
+ new CommandData("call", callPlayerCommand, "", getStaffFlagValue("None"), true, false, "Rings the nearest payphone to the player"),
+ //new CommandData("callphone", callPhoneNumberCommand, "", getStaffFlagValue("None"), true, false, "Rings the payphone with number"),
+ ],
race: [
// Unfinished!
//new CommandData("addrace", createRaceCommand, "", getStaffFlagValue("ManageRaces"), true, false, "Creates a race"),
diff --git a/scripts/server/payphone.js b/scripts/server/payphone.js
new file mode 100644
index 00000000..a37dbab6
--- /dev/null
+++ b/scripts/server/payphone.js
@@ -0,0 +1,219 @@
+// ===========================================================================
+// Vortrex's Roleplay Resource
+// https://github.com/VortrexFTW/v-roleplay
+// ===========================================================================
+// FILE: payphone.js
+// DESC: Provides payphone functions and commands
+// TYPE: Server (JavaScript)
+// ===========================================================================
+
+const V_PAYPHONE_STATE_NONE = 0;
+const V_PAYPHONE_STATE_IDLE = 1;
+const V_PAYPHONE_STATE_RINGING = 2;
+const V_PAYPHONE_STATE_ACTIVE_CALL = 3;
+const V_PAYPHONE_STATE_BROKEN = 4;
+
+// ===========================================================================
+
+class PayPhoneData {
+ constructor(dbAssoc = false) {
+ this.databaseId = 0;
+ this.serverId = 0;
+ this.state = V_PAYPHONE_STATE_IDLE;
+ this.number = 0;
+ this.position = toVector3(0.0, 0.0, 0.0);
+ this.usingPlayer = false;
+ this.connectedPlayer = false;
+ this.enabled = false;
+ this.broken = false;
+ this.price = 0;
+ this.whoAdded = 0;
+ this.whenAdded = 0;
+
+ if (dbAssoc) {
+ this.databaseId = toInteger(dbAssoc["payphone_id"]);
+ this.serverId = toInteger(dbAssoc["payphone_server"]);
+ this.number = toInteger(dbAssoc["payphone_number"]);
+ this.enabled = intToBool(dbAssoc["payphone_enabled"]);
+ this.broken = intToBool(dbAssoc["payphone_broken"]);
+ this.position = toVector3(toFloat(dbAssoc["payphone_pos_x"]), toFloat(dbAssoc["payphone_pos_y"]), toFloat(dbAssoc["payphone_pos_z"]));
+ this.price = toInteger(dbAssoc["payphone_price"]);
+ this.whoAdded = toInteger(dbAssoc["payphone_who_added"]);
+ this.whenAdded = toInteger(dbAssoc["payphone_when_added"]);
+ }
+ }
+};
+
+// ===========================================================================
+
+function initPayPhoneScript() {
+ logToConsole(LOG_INFO, "[V.RP.PayPhone]: Initializing payphone script ...");
+ logToConsole(LOG_INFO, "[V.RP.PayPhone]: Payphone script initialized successfully!");
+}
+
+// ===========================================================================
+
+function createPayPhoneCommand(command, params, client) {
+ let payPhoneNumber = generateRandomPhoneNumber();
+
+ if (areParamsEmpty(params)) {
+ if (isNaN(params)) {
+ messagePlayerError(client, getLocaleString(client, "MustBeNumber"));
+ return false;
+ }
+
+ payPhoneNumber = toInteger(params);
+ }
+
+ createPayPhone(getPlayerPosition(client), payPhoneNumber);
+ messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created a payphone with number {ALTCOLOUR}${payPhoneNumber}`);
+}
+
+// ===========================================================================
+
+function createPayPhone(position, number) {
+ let tempPayPhoneData = new PayPhoneData(false);
+ tempPayPhoneData.number = number;
+ tempPayPhoneData.position = position;
+ tempPayPhoneData.needsSaved = true;
+
+ getServerData().payphones.push(tempPayPhoneData);
+
+ return true;
+}
+
+// ===========================================================================
+
+function getClosestPayPhone(position) {
+ let closest = 0;
+ for (let i in getServerData().payPhones) {
+ if (getDistance(position, getServerData().payPhones[i].position) <= getDistance(position, getServerData().payPhones[closest].position)) {
+ closest = i;
+ }
+ }
+
+ return closest;
+}
+
+// ===========================================================================
+
+/**
+ * @param {Number} payPhoneIndex - The data index of the payphone
+ * @return {PayPhoneData} The payphone's data (class instance)
+ */
+function getPayPhoneData(payPhoneIndex) {
+ if (payPhoneIndex == -1) {
+ return false;
+ }
+
+ if (typeof getServerData().payPhones[payPhoneIndex] != "undefined") {
+ return getServerData().payPhones[payPhoneIndex];
+ }
+
+ return false;
+}
+
+// ===========================================================================
+
+function callPlayerCommand(command, params, client) {
+
+}
+
+// ===========================================================================
+
+function loadPayPhonesFromDatabase() {
+ logToConsole(LOG_DEBUG, `[V.RP.PayPhone]: Loading payphones from database ...`);
+ let dbConnection = connectToDatabase();
+ let tempPayPhones = [];
+ let dbAssoc = [];
+ if (dbConnection) {
+ let dbQueryString = `SELECT * FROM payphone_main WHERE payphone_server = ${getServerId()} AND payphone_enabled = 1`;
+ dbAssoc = fetchQueryAssoc(dbConnection, dbQueryString);
+ if (dbAssoc.length > 0) {
+ for (let i in dbAssoc) {
+ let tempPayPhoneData = new PayPhoneData(dbAssoc[i]);
+ tempPayPhones.push(tempPayPhoneData);
+ }
+ }
+ disconnectFromDatabase(dbConnection);
+ }
+
+ logToConsole(LOG_DEBUG, `[V.RP.PayPhone]: ${tempPayPhones.length} payphones loaded from database successfully!`);
+ return tempPayPhones;
+}
+
+// ===========================================================================
+
+function saveAllPayPhonesToDatabase() {
+ if (getServerConfig().devServer) {
+ return false;
+ }
+
+ for (let i in getServerData().payPhones) {
+ savePayPhoneToDatabase(i);
+ }
+}
+
+// ===========================================================================
+
+function savePayPhoneToDatabase(payPhoneIndex) {
+ if (getServerConfig().devServer) {
+ logToConsole(LOG_VERBOSE, `[V.RP.PayPhone]: Payphone ${payPhoneIndex} can't be saved because server is running as developer only. Aborting save ...`);
+ return false;
+ }
+
+ if (getPayPhoneData(payPhoneIndex) == false) {
+ logToConsole(LOG_VERBOSE, `[V.RP.PayPhone]: Payphone ${payPhoneIndex} data is invalid. Aborting save ...`);
+ return false;
+ }
+
+ let tempPayPhoneData = getPayPhoneData(payPhoneIndex);
+
+ if (tempPayPhoneData.databaseId == -1) {
+ logToConsole(LOG_VERBOSE, `[V.RP.PayPhone]: Payphone ${payPhoneIndex} is a temp payphone. Aborting save ...`);
+ return false;
+ }
+
+ if (!tempPayPhoneData.needsSaved) {
+ logToConsole(LOG_VERBOSE, `[V.RP.PayPhone]: Payphone ${payPhoneIndex} hasn't changed data. Aborting save ...`);
+ return false;
+ }
+
+ logToConsole(LOG_VERBOSE, `[V.RP.PayPhone]: Saving payphone ${tempPayPhoneData.databaseId} to database ...`);
+ let dbConnection = connectToDatabase();
+ if (dbConnection) {
+ let data = [
+ ["payphone_server", getServerId()],
+ ["payphone_number", toInteger(tempPayPhoneData.number)],
+ ["payphone_enabled", boolToInt(tempPayPhoneData.enabled)],
+ ["payphone_price", toInteger(tempPayPhoneData.price)],
+ ["payphone_who_added", toInteger(tempPayPhoneData.whoAdded)],
+ ["payphone_when_added", toInteger(tempPayPhoneData.whenAdded)],
+ ["payphone_pos_x", toFloat(tempPayPhoneData.position.x)],
+ ["payphone_pos_y", toFloat(tempPayPhoneData.position.y)],
+ ["payphone_pos_z", toFloat(tempPayPhoneData.position.z)],
+ ];
+
+ let dbQuery = null;
+ if (tempPayPhoneData.databaseId == 0) {
+ let queryString = createDatabaseInsertQuery("payphone_main", data);
+ dbQuery = queryDatabase(dbConnection, queryString);
+ tempPayPhoneData.databaseId = getDatabaseInsertId(dbConnection);
+ tempPayPhoneData.needsSaved = false;
+ } else {
+ let queryString = createDatabaseUpdateQuery("payphone_main", data, `payphone_id=${tempPayPhoneData.databaseId}`);
+ dbQuery = queryDatabase(dbConnection, queryString);
+ tempPayPhoneData.needsSaved = false;
+ }
+
+ logToConsole(LOG_VERBOSE, `[V.RP.PayPhone]: Saved payphone ${payPhoneIndex} to database!`);
+
+ freeDatabaseQuery(dbQuery);
+ disconnectFromDatabase(dbConnection);
+ return true;
+ }
+
+ return false;
+}
+
+// ===========================================================================