944 lines
35 KiB
JavaScript
944 lines
35 KiB
JavaScript
// ===========================================================================
|
|
// Vortrex's Roleplay Resource
|
|
// https://github.com/VortrexFTW/gtac_roleplay
|
|
// ===========================================================================
|
|
// FILE: house.js
|
|
// DESC: Provides house commands, functions, and usage
|
|
// TYPE: Server (JavaScript)
|
|
// ===========================================================================
|
|
|
|
function initHouseScript() {
|
|
logToConsole(LOG_INFO, "[VRR.House]: Initializing house script ...");
|
|
getServerData().houses = loadHousesFromDatabase();
|
|
|
|
if(getServerConfig().createHousePickups) {
|
|
createAllHousePickups();
|
|
}
|
|
|
|
if(getServerConfig().createHouseBlips) {
|
|
createAllHouseBlips();
|
|
}
|
|
|
|
setAllHouseIndexes();
|
|
logToConsole(LOG_INFO, "[VRR.House]: House script initialized successfully!");
|
|
return true;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function loadHousesFromDatabase() {
|
|
logToConsole(LOG_INFO, "[VRR.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 = ${getServerId()}`);
|
|
if(dbQuery) {
|
|
if(dbQuery.numRows > 0) {
|
|
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
|
|
let tempHouseData = new serverClasses.houseData(dbAssoc);
|
|
tempHouses.push(tempHouseData);
|
|
logToConsole(LOG_VERBOSE, `[VRR.House]: House '${tempHouseData.description}' (ID ${tempHouseData.databaseId}) loaded!`);
|
|
}
|
|
}
|
|
freeDatabaseQuery(dbQuery);
|
|
}
|
|
disconnectFromDatabase(dbConnection);
|
|
}
|
|
logToConsole(LOG_INFO, `[VRR.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), getGameConfig().pickupModels[getServerGame()].house, getGameConfig().blipSprites[getServerGame()].house, getPlayerInterior(client), getPlayerDimension(client));
|
|
let houseId = getServerData().houses.push(tempHouseData);
|
|
|
|
saveAllHousesToDatabase();
|
|
|
|
createHouseEntrancePickup(houseId);
|
|
createHouseExitPickup(houseId);
|
|
createHouseEntranceBlip(houseId);
|
|
createHouseExitBlip(houseId);
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}created house ${getInlineChatColourByType("houseGreen")}${tempHouseData.description}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function lockUnlockHouseCommand(command, params, client) {
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError("House not found!");
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).locked = !getHouseData(houseId).locked;
|
|
|
|
for(let i in getHouseData(houseId).locations) {
|
|
if(getHouseData(houseId).locations[i].type == VRR_HOUSE_LOC_DOOR) {
|
|
setEntityData(getHouseData(houseId).locations[i].entrancePickup, "vrr.label.locked", getHouseData(houseId).locked, true);
|
|
}
|
|
}
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
messagePlayerSuccess(client, `House '${getHouseData(houseId).description}' ${getLockedUnlockedTextFromBool((getHouseData(houseId).locked))}!`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setHouseDescriptionCommand(command, params, client) {
|
|
let newHouseDescription = toString(params);
|
|
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError("House not found!");
|
|
return false;
|
|
}
|
|
|
|
let oldDescription = getHouseData(houseId).description;
|
|
getHouseData(houseId).description = newHouseDescription;
|
|
|
|
for(let i in getHouseData(houseId).locations) {
|
|
if(getHouseData(houseId).locations[i].type == VRR_HOUSE_LOC_DOOR) {
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.name", getHouseData(houseId).description, true);
|
|
}
|
|
}
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
messageAdmins(`${getPlayerName(client)} renamed house ${getInlineChatColourByType("houseGreen")}${oldDescription} ${getInlineChatColourByName("white")}to ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setHouseOwnerCommand(command, params, client) {
|
|
let newHouseOwner = getPlayerFromParams(params);
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
if(!newHouseOwner) {
|
|
messagePlayerError("Player not found!");
|
|
return false;
|
|
}
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError("House not found!");
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
getHouseData(houseId).ownerType = VRR_HOUSEOWNER_PLAYER;
|
|
getHouseData(houseId).ownerId = getServerData().clients[newHouseOwner.index].accountData.databaseId;
|
|
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}owner to ${getInlineChatColourByName("lightGrey")}${newHouseOwner.name}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setHouseClanCommand(command, params, client) {
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
let clan = getClanFromParams(params);
|
|
|
|
if(!clan) {
|
|
messagePlayerError(client, "That clan is invalid or doesn't exist!");
|
|
return false;
|
|
}
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError("House not found!");
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
getHouseData(houseId).ownerType = VRR_HOUSEOWNER_CLAN;
|
|
getHouseData(houseId).ownerId = getClanData(clanId).databaseId;
|
|
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}set house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}owner to the ${getInlineChatColourByType("clanOrange")}${getClanData(clanId).name} ${getInlineChatColourByName("white")}clan!`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setHousePickupCommand(command, params, client) {
|
|
let typeParam = params || "house";
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError(client, "House not found!");
|
|
return false;
|
|
}
|
|
|
|
if(isNaN(typeParam)) {
|
|
if(isNull(getGameConfig().pickupModels[getServerGame()][typeParam])) {
|
|
messagePlayerError(client, "Invalid house type! Use a house type name or a pickup model ID");
|
|
messagePlayerInfo(client, `Pickup Types: [#AAAAAA]${Object.keys(getGameConfig().pickupModels[getServerGame()]).join(", ")}`)
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).entrancePickupModel = getGameConfig().pickupModels[getServerGame()][typeParam];
|
|
} else {
|
|
getHouseData(houseId).entrancePickupModel = toInteger(typeParam);
|
|
}
|
|
|
|
if(getHouseData(houseId).entrancePickupModel != -1) {
|
|
if(getHouseData(houseId).entrancePickup != null) {
|
|
deleteGameElement(getHouseData(houseId).entrancePickup);
|
|
}
|
|
|
|
createHouseEntrancePickup(houseId);
|
|
}
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set house [#11CC11]${getHouseData(houseId).description} [#FFFFFF]pickup display to [#AAAAAA]${toLowerCase(typeParam)}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setHouseInteriorTypeCommand(command, params, client) {
|
|
let splitParams = params.split(" ");
|
|
let typeParam = splitParams[0] || "none";
|
|
let houseId = getHouseFromParams(splitParams[1]) || (isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError(client, "House not found!");
|
|
return false;
|
|
}
|
|
|
|
if(isNaN(typeParam)) {
|
|
let tempHouseLocation = new serverClasses.houseLocationData(false);
|
|
|
|
if(toLowerCase(typeParam) == "none") {
|
|
tempHouseLocation.exitPosition = toVector3(0.0, 0.0, 0.0);
|
|
tempHouseLocation.exitInterior = -1;
|
|
getHouseData(houseId).hasInterior = false;
|
|
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}remove house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}interior`);
|
|
return false;
|
|
}
|
|
|
|
if(isNull(getGameConfig().interiorTemplates[getServerGame()][typeParam])) {
|
|
messagePlayerError(client, "Invalid interior type! Use an interior type name");
|
|
messagePlayerInfo(client, `Interior Types: ${getInlineChatColourByName("lightGrey")}${Object.keys(getGameConfig().interiorTemplates[getServerGame()]).join(", ")}`)
|
|
return false;
|
|
}
|
|
getHouseData(houseId).exitPosition = getHouseData(houseId).exitPosition;
|
|
getHouseData(houseId).exitInterior = getHouseData(houseId).exitInterior;
|
|
getHouseData(houseId).exitDimension = getHouseData(houseId).databaseId+getGlobalConfig().houseDimensionStart;
|
|
getHouseData(houseId).hasInterior = true;
|
|
}
|
|
|
|
deleteHouseEntrancePickup(houseId);
|
|
deleteHouseExitPickup(houseId);
|
|
createHouseEntrancePickup(houseId);
|
|
createHouseExitPickup(houseId);
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set house [#11CC11]${getHouseData(houseId).description} [#FFFFFF]interior type to [#AAAAAA]${toLowerCase(typeParam)}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setHouseBlipCommand(command, params, client) {
|
|
let typeParam = params || "house";
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError(client, "House not found!");
|
|
return false;
|
|
}
|
|
|
|
if(isNaN(typeParam)) {
|
|
if(isNull(getGameConfig().blipSprites[getServerGame()][typeParam])) {
|
|
messagePlayerError(client, "Invalid house type! Use a house type name or a blip image ID");
|
|
messagePlayerInfo(client, `Pickup Types: [#AAAAAA]${Object.keys(getGameConfig().blipSprites[getServerGame()]).join(", ")}`)
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).entranceBlipModel = getGameConfig().blipSprites[getServerGame()][typeParam];
|
|
} else {
|
|
getHouseData(houseId).entranceBlipModel = toInteger(typeParam);
|
|
}
|
|
|
|
if(getHouseData(houseId).entranceBlipModel != -1) {
|
|
if(getHouseData(houseId).entranceBlip != null) {
|
|
deleteGameElement(getHouseData(houseId).entranceBlip);
|
|
}
|
|
|
|
createHouseEntranceBlip(houseId);
|
|
}
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set house [#11CC11]${getHouseData(houseId).description} [#FFFFFF]blip display to [#AAAAAA]${toLowerCase(typeParam)}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function moveHouseEntranceCommand(command, params, client) {
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayer(client, "You need to be near or inside a house!");
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).locations[0].entrancePosition = getPlayerPosition(client);
|
|
getHouseData(houseId).locations[0].entranceDimension = getPlayerDimension(client);
|
|
getHouseData(houseId).locations[0].entranceInterior = getPlayerInterior(client);
|
|
|
|
deleteAllHouseBlips(houseId);
|
|
deleteAllHousePickups(houseId);
|
|
createAllHouseBlips(houseId);
|
|
createAllHousePickups(houseId);
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}moved house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}entrance to their position`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function moveHouseExitCommand(command, params, client) {
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayer(client, "You need to be near or inside a house!");
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).locations = [];
|
|
|
|
getHouseData(houseId).locations[0].entrancePosition = getPlayerPosition(client);
|
|
getHouseData(houseId).locations[0].entranceDimension = getPlayerDimension(client);
|
|
getHouseData(houseId).locations[0].exitInterior = getPlayerInterior(client);
|
|
|
|
deleteAllHouseBlips(houseId);
|
|
deleteAllHousePickups(houseId);
|
|
createAllHouseBlips(houseId);
|
|
createAllHousePickups(houseId);
|
|
|
|
getHouseData(houseId).needsSaved = true;
|
|
|
|
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}moved house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}exit to their position`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function deleteHouseCommand(command, params, client) {
|
|
let houseId = toInteger((isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client)));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError("House not found!");
|
|
return false;
|
|
}
|
|
tempHouseData = getHouseData(houseId);
|
|
|
|
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}deleted house ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description}`);
|
|
deleteHouse(houseId, getPlayerData(client).accountData.databaseId);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function deleteHouse(houseId, whoDeleted = 0) {
|
|
let tempHouseData = getServerData().houses[houseId];
|
|
|
|
let dbConnection = connectToDatabase();
|
|
let dbQuery = null;
|
|
|
|
if(dbConnection) {
|
|
dbQuery = queryDatabase(dbConnection, `DELETE FROM house_main WHERE house_id = ${tempHouseData.databaseId}`);
|
|
if(dbQuery) {
|
|
freeDatabaseQuery(dbQuery);
|
|
}
|
|
disconnectFromDatabase(dbConnection);
|
|
}
|
|
|
|
deleteAllHouseBlips(houseId);
|
|
deleteAllHousePickups(houseId);
|
|
|
|
removePlayersFromHouse(houseId);
|
|
|
|
getServerData().houses.splice(houseId, 1);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function removePlayerFromHouses(client) {
|
|
if(isPlayerInAnyHouse(client)) {
|
|
exitHouse(client);
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
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;
|
|
|
|
let tempHouseLocation = new serverClasses.houseLocationData(false);
|
|
tempHouseLocation.entrancePosition = entrancePosition;
|
|
tempHouseLocation.entranceRotation = 0.0;
|
|
tempHouseLocation.entrancePickupModel = entrancePickupModel;
|
|
tempHouseLocation.entranceBlipModel = entranceBlipModel;
|
|
tempHouseLocation.entranceInterior = entranceInteriorId;
|
|
tempHouseLocation.entranceDimension = entranceVirtualWorld;
|
|
|
|
tempHouseLocation.exitPosition = exitPosition;
|
|
tempHouseLocation.exitRotation = 0.0;
|
|
tempHouseLocation.exitPickupModel = exitPickupModel;
|
|
tempHouseLocation.exitBlipModel = exitBlipModel;
|
|
tempHouseLocation.exitInterior = exitInteriorId;
|
|
tempHouseLocation.exitDimension = exitVirtualWorld;
|
|
|
|
tempHouseData.locations.push(tempHouseLocation);
|
|
|
|
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, "vrr.inHouse")) {
|
|
return getEntityData(client, "vrr.inHouse");
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function saveAllHousesToDatabase() {
|
|
logToConsole(LOG_INFO, `[VRR.House]: Saving all server houses to database ...`);
|
|
for(let i in getServerData().houses) {
|
|
if(getServerData().houses[i].needsSaved) {
|
|
saveHouseToDatabase(i);
|
|
}
|
|
}
|
|
logToConsole(LOG_INFO, `[VRR.House]: Saving all server houses to database ...`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function saveHouseToDatabase(houseId) {
|
|
let tempHouseData = getServerData().houses[houseId];
|
|
|
|
logToConsole(LOG_VERBOSE, `[VRR.House]: Saving house '${tempHouseData.databaseId}' to database ...`);
|
|
let dbConnection = connectToDatabase();
|
|
if(dbConnection) {
|
|
let safeHouseDescription = escapeDatabaseString(dbConnection, tempHouseData.description);
|
|
|
|
let data = [
|
|
["house_server", getServerId()],
|
|
["house_description", safeHouseDescription],
|
|
["house_owner_type", tempHouseData.ownerType],
|
|
["house_owner_id", tempHouseData.ownerId],
|
|
["house_locked", boolToInt(tempHouseData.locked)],
|
|
//["house_entrance_fee", tempHouseData.entranceFee],
|
|
["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_entrance_pickup", tempHouseData.entrancePickupModel],
|
|
["house_entrance_blip", tempHouseData.entranceBlipModel],
|
|
["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.databaseId+getGlobalConfig().houseDimensionStart],
|
|
["house_exit_pickup", tempHouseData.exitPickupModel],
|
|
["house_exit_blip", tempHouseData.exitBlipModel],
|
|
["house_has_interior", boolToInt(tempHouseData.hasInterior)],
|
|
["house_buy_price", tempHouseData.buyPrice],
|
|
["house_rent_price", tempHouseData.rentPrice],
|
|
];
|
|
|
|
let dbQuery = null;
|
|
if(tempHouseData.databaseId == 0) {
|
|
let queryString = createDatabaseInsertQuery("house_main", data);
|
|
dbQuery = queryDatabase(dbConnection, queryString);
|
|
getServerData().houses[houseId].databaseId = getDatabaseInsertId(dbConnection);
|
|
} else {
|
|
let queryString = createDatabaseUpdateQuery("house_main", data, `house_id=${tempHouseData.databaseId}`);
|
|
dbQuery = queryDatabase(dbConnection, queryString);
|
|
}
|
|
|
|
getHouseData(houseId).needsSaved = false;
|
|
freeDatabaseQuery(dbQuery);
|
|
disconnectFromDatabase(dbConnection);
|
|
return true;
|
|
}
|
|
logToConsole(LOG_VERBOSE, `[VRR.House]: Saved house '${tempHouseData.description}' to database!`);
|
|
|
|
return false;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function createAllHousePickups() {
|
|
for(let i in getServerData().houses) {
|
|
createHouseEntrancePickup(i);
|
|
createHouseExitPickup(i);
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function createAllHouseBlips() {
|
|
for(let i in getServerData().houses) {
|
|
createHouseEntranceBlip(i);
|
|
createHouseExitBlip(i);
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function createHouseEntrancePickup(houseId) {
|
|
if(!getServerConfig().createHousePickups) {
|
|
return false;
|
|
}
|
|
|
|
if(getHouseData(houseId).entrancePickupModel != -1) {
|
|
let pickupModelId = getGameConfig().pickupModels[getServerGame()].house;
|
|
|
|
if(getServerData().houses[houseId].entrancePickupModel != 0) {
|
|
pickupModelId = getHouseData(houseId).entrancePickupModel;
|
|
}
|
|
|
|
getHouseData(houseId).entrancePickup = createGamePickup(pickupModelId, getHouseData(houseId).entrancePosition, getGameConfig().pickupTypes[getServerGame()].house);
|
|
setElementOnAllDimensions(getHouseData(houseId).entrancePickup, false);
|
|
setElementDimension(getHouseData(houseId).entrancePickup, getHouseData(houseId).entranceDimension);
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.owner.type", VRR_PICKUP_HOUSE_ENTRANCE, false);
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.owner.id", houseId, false);
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.type", VRR_LABEL_HOUSE, true);
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.name", getHouseData(houseId).description, true);
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.locked", getHouseData(houseId).locked, true);
|
|
if(getHouseData(houseId).buyPrice > 0) {
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.price", getHouseData(houseId).buyPrice, true);
|
|
}
|
|
addToWorld(getHouseData(houseId).entrancePickup);
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function createHouseEntranceBlip(houseId) {
|
|
if(!getServerConfig().createHouseBlips) {
|
|
return false;
|
|
}
|
|
|
|
if(getHouseData(houseId).entranceBlipModel != -1) {
|
|
let blipModelId = getGameConfig().blipSprites[getServerGame()].house;
|
|
|
|
if(getServerData().houses[houseId].entranceBlipModel != 0) {
|
|
blipModelId = getHouseData(houseId).entranceBlipModel;
|
|
}
|
|
|
|
getHouseData(houseId).entranceBlip = createGameBlip(getHouseData(houseId).entrancePosition, blipModelId, 1, getColourByName("houseGreen"));
|
|
setElementDimension(getHouseData(houseId).entranceBlip, getHouseData(houseId).entranceDimension);
|
|
setElementOnAllDimensions(getHouseData(houseId).entranceBlip, false);
|
|
//getHouseData(houseId).entranceBlip.streamInDistance = 300;
|
|
//getHouseData(houseId).entranceBlip.streamOutDistance = 350;
|
|
setEntityData(getHouseData(houseId).entranceBlip, "vrr.owner.type", VRR_BLIP_HOUSE_ENTRANCE, false);
|
|
setEntityData(getHouseData(houseId).entranceBlip, "vrr.owner.id", houseId, false);
|
|
addToWorld(getHouseData(houseId).entranceBlip);
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function createHouseExitPickup(houseId) {
|
|
if(!getServerConfig().createHousePickups) {
|
|
return false;
|
|
}
|
|
|
|
if(getHouseData(houseId).hasInterior) {
|
|
if(getHouseData(houseId).exitPickupModel != -1) {
|
|
let pickupModelId = getGameConfig().pickupModels[getServerGame()].exit;
|
|
|
|
if(getServerData().houses[houseId].exitPickupModel != 0) {
|
|
pickupModelId = getHouseData(houseId).exitPickupModel;
|
|
}
|
|
|
|
getHouseData(houseId).exitPickup = createGamePickup(pickupModelId, getHouseData(houseId).exitPosition, getGameConfig().pickupTypes[getServerGame()].house);
|
|
setElementDimension(getHouseData(houseId).exitPickup, getHouseData(houseId).exitDimension);
|
|
setElementOnAllDimensions(getHouseData(houseId).exitPickup, false);
|
|
setEntityData(getHouseData(houseId).exitPickup, "vrr.owner.type", VRR_PICKUP_HOUSE_EXIT, false);
|
|
setEntityData(getHouseData(houseId).exitPickup, "vrr.owner.id", houseId, false);
|
|
setEntityData(getHouseData(houseId).exitPickup, "vrr.label.type", VRR_LABEL_EXIT, true);
|
|
addToWorld(getHouseData(houseId).exitPickup);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function createHouseExitBlip(houseId) {
|
|
if(!getServerConfig().createHouseBlips) {
|
|
return false;
|
|
}
|
|
|
|
if(getHouseData(houseId).hasInterior) {
|
|
if(getHouseData(houseId).exitBlipModel != -1) {
|
|
let blipModelId = getGameConfig().blipSprites[getServerGame()].house;
|
|
|
|
if(getServerData().houses[houseId].exitBlipModel != 0) {
|
|
blipModelId = getHouseData(houseId).exitBlipModel;
|
|
}
|
|
|
|
getHouseData(houseId).exitBlip = createGameBlip(blipModelId, getHouseData(houseId).exitPosition, 1, getColourByName("houseGreen"));
|
|
setElementDimension(getHouseData(houseId).exitBlip, getHouseData(houseId).entranceDimension);
|
|
setElementOnAllDimensions(getHouseData(houseId).exitBlip, false);
|
|
setEntityData(getHouseData(houseId).exitBlip, "vrr.owner.type", VRR_BLIP_HOUSE_EXIT, false);
|
|
setEntityData(getHouseData(houseId).exitBlip, "vrr.owner.id", houseId, false);
|
|
addToWorld(getHouseData(houseId).exitBlip);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getHouseOwnerTypeText(ownerType) {
|
|
switch(ownerType) {
|
|
case VRR_HOUSEOWNER_CLAN:
|
|
return "clan";
|
|
|
|
case VRR_HOUSEOWNER_PLAYER:
|
|
return "player";
|
|
|
|
case VRR_BIZOWNER_NONE:
|
|
return "not owned";
|
|
|
|
case VRR_BIZOWNER_PUBLIC:
|
|
return "not owned";
|
|
|
|
case VRR_BIZOWNER_JOB:
|
|
return "job";
|
|
|
|
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)) {
|
|
messagePlayerError(client, "House not found!");
|
|
return false;
|
|
}
|
|
|
|
let ownerName = "Unknown";
|
|
switch(getHouseData(houseId).ownerType) {
|
|
case VRR_HOUSEOWNER_CLAN:
|
|
ownerName = getClanData(getHouseData(houseId).ownerId).name;
|
|
break;
|
|
|
|
case VRR_HOUSEOWNER_PLAYER:
|
|
let subAccountData = loadSubAccountFromId(getHouseData(houseId).ownerId);
|
|
ownerName = `${subAccountData.firstName} ${subAccountData.lastName} [${subAccountData.databaseId}]`;
|
|
break;
|
|
|
|
case VRR_HOUSEOWNER_NONE:
|
|
ownerName = "None";
|
|
break;
|
|
|
|
case VRR_HOUSEOWNER_PUBLIC:
|
|
ownerName = "Public";
|
|
break;
|
|
|
|
case VRR_HOUSEOWNER_JOB:
|
|
ownerName = getJobData(getHouseData(houseId).ownerId).name;
|
|
break;
|
|
}
|
|
|
|
messagePlayerNormal(client, `🏠 ${getInlineChatColourByType("houseGreen")}[House Info] ${getInlineChatColourByName("white")}Description: ${getInlineChatColourByName("lightGrey")}${getHouseData(houseId).description}, ${getInlineChatColourByName("white")}Owner: ${getInlineChatColourByName("lightGrey")}${ownerName} (${getHouseOwnerTypeText(getHouseData(houseId).ownerType)}), ${getInlineChatColourByName("white")}Locked: ${getInlineChatColourByName("lightGrey")}${getYesNoFromBool(intToBool(getHouseData(houseId).locked))}, ${getInlineChatColourByName("white")}ID: ${getInlineChatColourByName("lightGrey")}${houseId}/${getHouseData(houseId).databaseId}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setHouseBuyPriceCommand(command, params, client) {
|
|
if(areParamsEmpty(params)) {
|
|
messagePlayerSyntax(client, getCommandSyntaxText(command));
|
|
return false;
|
|
}
|
|
|
|
let splitParams = params.split(" ");
|
|
|
|
let amount = toInteger(splitParams[0]) || 0;
|
|
let houseId = (isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError(client, "Business not found!");
|
|
return false;
|
|
}
|
|
|
|
if(amount < 0) {
|
|
messagePlayerError(client, `The amount can't be less than 0!`);
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).buyPrice = amount;
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.price", getHouseData(houseId).buyPrice, true);
|
|
messagePlayerSuccess(client, `${getInlineChatColourByName("white")}You set business ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description}'s ${getInlineChatColourByName("white")}for-sale price to ${getInlineChatColourByName("lightGrey")}$${makeLargeNumberReadable(amount)}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setHouseRentPriceCommand(command, params, client) {
|
|
if(areParamsEmpty(params)) {
|
|
messagePlayerSyntax(client, getCommandSyntaxText(command));
|
|
return false;
|
|
}
|
|
|
|
let splitParams = params.split(" ");
|
|
|
|
let amount = toInteger(splitParams[0]) || 0;
|
|
let houseId = (isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError(client, "Business not found!");
|
|
return false;
|
|
}
|
|
|
|
if(amount < 0) {
|
|
messagePlayerError(client, `The amount can't be less than 0!`);
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).rentPrice = amount;
|
|
setEntityData(getHouseData(houseId).entrancePickup, "vrr.label.price", `Rent: ${getHouseData(houseId).rentPrice}`, true);
|
|
messagePlayerSuccess(client, `${getInlineChatColourByName("white")}You set business ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description}'s ${getInlineChatColourByName("white")}rent price to ${getInlineChatColourByName("lightGrey")}$${makeLargeNumberReadable(amount)}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function buyHouseCommand(command, params, client) {
|
|
let houseId = (isPlayerInAnyHouse(client)) ? getPlayerHouse(client) : getClosestHouseEntrance(getPlayerPosition(client));
|
|
|
|
if(!getHouseData(houseId)) {
|
|
messagePlayerError(client, "House not found!");
|
|
return false;
|
|
}
|
|
|
|
if(getHouseData(houseId).buyPrice <= 0) {
|
|
messagePlayerError(client, `${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description} ${getInlineChatColourByName("white")}is not for sale!`);
|
|
return false;
|
|
}
|
|
|
|
if(getPlayerCurrentSubAccount(client).cash < getHouseData(houseId).buyPrice) {
|
|
messagePlayerError(client, `You don't have enough money to buy business ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).name}!`);
|
|
return false;
|
|
}
|
|
|
|
getHouseData(houseId).ownerType = VRR_BIZOWNER_PLAYER;
|
|
getHouseData(houseId).ownerId = getPlayerCurrentSubAccount(client).databaseId;
|
|
getHouseData(houseId).buyPrice = 0;
|
|
|
|
updateHousePickupLabelData(houseId);
|
|
|
|
messagePlayerSuccess(client, `You are now the owner of ${getInlineChatColourByType("houseGreen")}${getHouseData(houseId).description}`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function isPlayerInAnyHouse(client) {
|
|
return doesEntityDataExist(client, "vrr.inHouse");
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getHouseData(houseId) {
|
|
if(typeof getServerData().houses[houseId] != "undefined") {
|
|
return getServerData().houses[houseId];
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function doesHouseHaveInterior(houseId) {
|
|
return getHouseData(houseId).hasInterior;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function deleteHouseEntrancePickup(houseId) {
|
|
if(getHouseData(houseId).entrancePickup != null) {
|
|
//removeFromWorld(getHouseData(houseId).entrancePickup);
|
|
deleteGameElement(getHouseData(houseId).entrancePickup);
|
|
getHouseData(houseId).entrancePickup = null;
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function deleteHouseExitPickup(houseId) {
|
|
if(getHouseData(houseId).exitPickup != null) {
|
|
//removeFromWorld(getHouseData(houseId).exitPickup);
|
|
deleteGameElement(getHouseData(houseId).exitPickup);
|
|
getHouseData(houseId).exitPickup = null;
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function deleteHouseEntranceBlip(houseId) {
|
|
if(getHouseData(houseId).entranceBlip != null) {
|
|
//removeFromWorld(getHouseData(houseId).entranceBlip);
|
|
deleteGameElement(getHouseData(houseId).entranceBlip);
|
|
getHouseData(houseId).entranceBlip = null;
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function deleteHouseExitBlip(houseId) {
|
|
if(getHouseData(houseId).exitBlip != null) {
|
|
//removeFromWorld(getHouseData(houseId).exitBlip);
|
|
deleteGameElement(getHouseData(houseId).exitBlip);
|
|
getHouseData(houseId).exitBlip = null;
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function reloadAllHousesCommand(command, params, client) {
|
|
let clients = getClients();
|
|
for(let i in clients) {
|
|
if(isPlayerInAnyHouse(clients[i])) {
|
|
removePlayerFromHouses(clients[i]);
|
|
}
|
|
}
|
|
|
|
for(let i in getServerData().houses) {
|
|
deleteHouseExitBlip(i);
|
|
deleteHouseEntranceBlip(i);
|
|
deleteHouseExitPickup(i);
|
|
deleteHouseEntrancePickup(i);
|
|
}
|
|
|
|
getServerData().houses = null;
|
|
getServerData().houses = loadHousesFromDatabase();
|
|
createAllHousePickups();
|
|
createAllHouseBlips();
|
|
|
|
messageAdminAction(`All houses have been reloaded by an admin!`);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function exitHouse(client) {
|
|
let houseId = getPlayerHouse(client);
|
|
if(isPlayerSpawned(client)) {
|
|
setPlayerInterior(client, getServerData().house[houseId].entranceInterior);
|
|
setPlayerDimension(client, getServerData().house[houseId].entranceDimension);
|
|
setPlayerPosition(client, getServerData().house[houseId].entrancePosition);
|
|
}
|
|
removeEntityData(client, "vrr.inHouse");
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setAllHouseIndexes() {
|
|
for(let i in getServerData().houses) {
|
|
getServerData().houses[i].index = i;
|
|
|
|
for(let j in getServerData().houses[i].locations) {
|
|
getServerData().houses[i].locations[j].index = j;
|
|
getServerData().houses[i].locations[j].houseIndex = i;
|
|
}
|
|
|
|
for(let j in getServerData().houses[i].gameScripts) {
|
|
getServerData().houses[i].gameScripts[j].index = j;
|
|
getServerData().houses[i].gameScripts[j].houseIndex = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function cacheAllHouseItems() {
|
|
for(let i in getServerData().houses) {
|
|
cacheHouseItems(i);
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function cacheHouseItems(houseId) {
|
|
getHouseData(houseId).itemCache = [];
|
|
|
|
for(let i in getServerData().items) {
|
|
if(getItemData(i).ownerType == VRR_ITEM_OWNER_HOUSE && getItemData(i).ownerId == getHouseData(houseId).databaseId) {
|
|
getHouseData(houseId).itemCache.push(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getHouseIdFromDatabaseId(databaseId) {
|
|
let houses = getServerData().houses;
|
|
for(let i in houses) {
|
|
if(houses[i].databaseId == databaseId) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function sendPlayerHouseGameScripts(client, houseId) {
|
|
for(let i in getHouseData(houseId).gameScripts) {
|
|
sendPlayerGameScriptState(client, getHouseData(houseId).gameScripts[i].state);
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function clearPlayerHouseGameScripts(client, houseId) {
|
|
for(let i in getHouseData(houseId).gameScripts) {
|
|
sendPlayerGameScriptState(client, VRR_GAMESCRIPT_DENY);
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|