Files
GTA4RP/scripts/server/house.js
2020-12-24 19:37:03 -06:00

290 lines
12 KiB
JavaScript

// ===========================================================================
// Asshat-Gaming Roleplay
// https://github.com/VortrexFTW/gtac_asshat_rp
// Copyright (c) 2020 Asshat-Gaming (https://asshatgaming.com)
// ---------------------------------------------------------------------------
// FILE: house.js
// DESC: Provides house commands, functions, and usage
// TYPE: Server (JavaScript)
// ===========================================================================
function initHouseScript() {
console.log("[Asshat.House]: Initializing house script ...");
getServerData().houses = loadHousesFromDatabase();
createAllHousePickups();
console.log("[Asshat.House]: House script initialized successfully!");
return true;
}
// ---------------------------------------------------------------------------
function loadHousesFromDatabase() {
console.log("[Asshat.House]: Loading houses from database ...");
let tempHouses = [];
let dbConnection = connectToDatabase();
let dbAssoc;
if(dbConnection) {
let dbQuery = queryDatabase(dbConnection, `SELECT * FROM house_main WHERE house_server = ${serverId}`);
if(dbQuery) {
if(dbQuery.numRows > 0) {
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempHouseData = new serverClasses.houseData(dbAssoc);
tempHouses.push(tempHouseData);
console.log(`[Asshat.House]: House '${tempHouseData.description}' (ID ${tempHouseData.databaseId}) loaded!`);
}
}
freeDatabaseQuery(dbQuery);
}
disconnectFromDatabase(dbConnection);
}
console.log(`[Asshat.House]: ${tempHouses.length} houses loaded from database successfully!`);
return tempHouses;
}
// ---------------------------------------------------------------------------
function createHouseCommand(command, params, client) {
let tempHouseData = createHouse(params, getPlayerPosition(client), toVector3(0.0, 0.0, 0.0), getServerConfig().pickupModels[getServerGame()].house, getServerConfig().blipSprites[getServerGame()].house, getPlayerInterior(client), getPlayerVirtualWorld(client));
getServerData().houses.push(tempHouseData);
sendHouseLabelToPlayers(getServerData().houses.length-1);
messageClientSuccess(client, `House [#009900]${tempHouseData.description} [#FFFFFF]created!`);
}
// ---------------------------------------------------------------------------
function createHouse(description, entrancePosition, exitPosition, entrancePickupModel = -1, entranceBlipModel = -1, entranceInteriorId = 0, entranceVirtualWorld = 0, exitInteriorId = -1, exitVirtualWorld = -1, exitPickupModel = -1, exitBlipModel = -1) {
let tempHouseData = new serverClasses.houseData(false);
tempHouseData.description = description;
tempHouseData.entrancePosition = entrancePosition;
tempHouseData.entranceRotation = 0.0;
tempHouseData.entrancePickupModel = entrancePickupModel;
tempHouseData.entranceBlipModel = entranceBlipModel;
tempHouseData.entranceInterior = entranceInteriorId;
tempHouseData.entranceDimension = entranceVirtualWorld;
tempHouseData.exitPosition = exitPosition;
tempHouseData.exitRotation = 0.0;
tempHouseData.exitPickupModel = exitPickupModel;
tempHouseData.exitBlipModel = exitBlipModel;
tempHouseData.exitInterior = exitInteriorId;
tempHouseData.exitDimension = exitVirtualWorld;
if(entrancePickupModel != -1) {
tempHouseData.entrancePickup = gta.createPickup(entrancePickupModel, entrancePosition, getServerConfig().pickupTypes[getServerGame()].house);
}
if(entranceBlipModel != -1) {
tempHouseData.entranceBlip = gta.createBlip(entrancePosition, entranceBlipModel, 1, getColourByName("lime"));
}
return tempHouseData;
}
// ---------------------------------------------------------------------------
function getHouseDataFromDatabaseId(databaseId) {
let matchingHouses = getServerData().houses.filter(b => b.databaseId == databaseId)
if(matchingHouses.length == 1) {
return matchingHouses[0];
}
return false;
}
// ---------------------------------------------------------------------------
function getClosestHouseEntrance(position) {
let houses = getServerData().houses;
let closest = 0;
for(let i in houses) {
if(getDistance(houses[i].entrancePosition, position) <= getDistance(houses[closest].entrancePosition, position)) {
closest = i;
}
}
return closest;
}
// ---------------------------------------------------------------------------
function getPlayerHouse(client) {
if(doesEntityDataExist(client, "ag.inHouse")) {
return getEntityData(client, "ag.inHouse");
}
return false;
}
// ---------------------------------------------------------------------------
function saveAllHousesToDatabase() {
for(let i in getServerData().houses) {
saveHouseToDatabase(i);
}
}
// ---------------------------------------------------------------------------
function saveHouseToDatabase(houseId) {
let tempHouseData = getServerData().houses[houseId];
console.log(`[Asshat.House]: Saving house '${tempHouseData.databaseId}' to database ...`);
let dbConnection = connectToDatabase();
if(dbConnection) {
let safeHouseDescription = escapeDatabaseString(dbConnection, tempHouseData.description);
if(tempHouseData.databaseId == 0) {
let dbQueryString = `INSERT INTO house_main (house_server, house_description, house_owner_type, house_owner_id, house_locked, house_entrance_pos_x, house_entrance_pos_y, house_entrance_pos_z, house_entrance_rot_z, house_entrance_int, house_entrance_vw, house_exit_pos_x, house_exit_pos_y, house_exit_pos_z, house_exit_rot_z, house_exit_int, house_exit_vw) VALUES (${serverId}, '${safeHouseDescription}', ${tempHouseData.ownerType}, ${tempHouseData.ownerId}, ${boolToInt(tempHouseData.locked)}, ${tempHouseData.entrancePosition.x}, ${tempHouseData.entrancePosition.y}, ${tempHouseData.entrancePosition.z}, ${tempHouseData.entranceRotation}, ${tempHouseData.entranceInterior}, ${tempHouseData.entranceDimension}, ${tempHouseData.exitPosition.x}, ${tempHouseData.exitPosition.y}, ${tempHouseData.exitPosition.z}, ${tempHouseData.exitRotation}, ${tempHouseData.exitInterior}, ${tempHouseData.exitDimension})`;
queryDatabase(dbConnection, dbQueryString);
getServerData().houses[houseId].databaseId = getDatabaseInsertId(dbConnection);
} else {
let dbQueryString = `UPDATE house_main SET house_description='${safeHouseDescription}', house_owner_type=${tempHouseData.ownerType}, house_owner_id=${tempHouseData.ownerId}, house_locked=${boolToInt(tempHouseData.locked)}, house_entrance_pos_x=${tempHouseData.entrancePosition.x}, house_entrance_pos_y=${tempHouseData.entrancePosition.y}, house_entrance_pos_z=${tempHouseData.entrancePosition.z}, house_entrance_rot_z=${tempHouseData.entranceRotation}, house_entrance_int=${tempHouseData.entranceInterior}, house_entrance_vw=${tempHouseData.entranceDimension}, house_exit_pos_x=${tempHouseData.exitPosition.x}, house_exit_pos_y=${tempHouseData.exitPosition.y}, house_exit_pos_z=${tempHouseData.exitPosition.z}, house_exit_rot_z=${tempHouseData.exitRotation}, house_exit_int=${tempHouseData.exitInterior}, house_exit_vw=${tempHouseData.exitDimension} WHERE house_id=${tempHouseData.databaseId}`;
queryDatabase(dbConnection, dbQueryString);
}
disconnectFromDatabase(dbConnection);
return true;
}
console.log(`[Asshat.Business]: Saved house '${tempHouseData.description}' to database!`);
return false;
}
// ---------------------------------------------------------------------------
function createAllHousePickups() {
for(let i in getServerData().houses) {
if(getServerData().houses[i].entrancePickupModel != -1) {
let pickupModelId = getServerConfig().pickupModels[getServerGame()].house;
if(getServerData().houses[i].entrancePickupModel != 0) {
pickupModelId = getServerData().houses[i].entrancePickupModel;
}
getServerData().houses[i].pickup = gta.createPickup(pickupModelId, getServerData().houses[i].entrancePosition);
//getServerData().houses[i].pickup.dimension = getServerData().houses[i].entranceDimension;
//getServerData().houses[i].pickup.interior = getServerData().houses[i].entranceInterior;
getServerData().houses[i].pickup.setData("ag.ownerType", AG_PICKUP_HOUSE, true);
getServerData().houses[i].pickup.setData("ag.ownerId", i, true);
}
}
}
// ---------------------------------------------------------------------------
function getHouseOwnerTypeText(ownerType) {
switch(ownerType) {
case AG_HOUSEOWNER_CLAN:
return "clan";
case AG_HOUSEOWNER_PLAYER:
return "player";
case AG_BIZOWNER_NONE:
return "not owned";
default:
return "unknown";
}
}
// ---------------------------------------------------------------------------
function getHouseInfoCommand(command, params, client) {
let houseId = (isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client));
if(!areParamsEmpty(params)) {
houseId = toInteger(params);
}
if(!getHouseData(houseId)) {
messageClientError(client, "Business not found!");
return false;
}
let ownerName = "Unknown";
switch(getHouseData(houseId).ownerType) {
case AG_HOUSEOWNER_CLAN:
ownerName = getClanData(getBusinessData(houseId).ownerId).name;
break;
case AG_BIZOWNER_PLAYER:
let accountData = loadAccountFromId(getBusinessData(houseId).ownerId);
ownerName = `${accountData.name} [${accountData.databaseId}]`;
break;
case AG_BIZOWNER_NONE:
ownerName = "None"
break;
}
messageClientNormal(client, `🏠 [#11CC11][House Info] [#FFFFFF]Description: [#AAAAAA]${getHouseData(houseId).description}, [#FFFFFF]Owner: [#AAAAAA]${ownerName} (${getHouseOwnerTypeText(getHouseData(houseId).ownerType)}), [#FFFFFF]Locked: [#AAAAAA]${getYesNoFromBool(intToBool(getHouseData(houseId).locked))}, [#FFFFFF]ID: [#AAAAAA]${houseId}/${getHouseData(houseId).databaseId}`);
}
// ---------------------------------------------------------------------------
function isPlayerInAnyHouse(client) {
return doesEntityDataExist(client, "ag.inHouse");
}
// ---------------------------------------------------------------------------
function getHouseData(houseId) {
if(typeof getServerData().houses[houseId] != "undefined") {
return getServerData().houses[houseId];
}
}
// ---------------------------------------------------------------------------
function doesHouseHaveInterior(houseId) {
//if(!getHouseData(houseId)) {
// return false;
//}
let houseData = getHouseData(houseId);
if(houseData.exitPosition == toVector3(0.0, 0.0, 0.0)) {
return false;
}
if(houseData.exitDimension == houseData.entranceDimension) {
return false;
}
if(houseData.exitInterior == 0) {
return false;
}
if(houseData.exitInterior == -1) {
return false;
}
return true;
}
// ---------------------------------------------------------------------------
function sendAllHouseLabelsToPlayer(client) {
let tempHouseLabels = [];
let totalHouses = getServerData().houses.length;
let housesPerNetworkEvent = 100;
let totalNetworkEvents = Math.ceil(totalHouses/housesPerNetworkEvent);
for(let i = 0 ; i < totalNetworkEvents ; i++) {
for(let j = 0 ; j < housesPerNetworkEvent ; j++) {
let tempHouseId = (i*housesPerNetworkEvent)+j;
if(typeof getServerData().houses[tempHouseId] != "undefined") {
tempHouseLabels.push([tempHouseId, getServerData().houses[tempHouseId].entrancePosition, getServerConfig().propertyLabelHeight[getServerGame()], getServerData().houses[tempHouseId].description, getServerData().houses[tempHouseId].locked, false]);
}
}
triggerNetworkEvent("ag.houselabel.all", client, tempHouseLabels);
tempHouseLabels = [];
}
}
// ---------------------------------------------------------------------------
function sendHouseLabelToPlayers(houseId) {
triggerNetworkEvent("ag.houselabel.add", null, houseId, getServerData().houses[houseId].entrancePosition, getServerConfig().propertyLabelHeight[getServerGame()], getServerData().houses[houseId].description, getServerData().houses[houseId].locked, false);
}
// ---------------------------------------------------------------------------