This commit is contained in:
Vortrex
2021-11-16 02:04:40 -06:00
parent 784422f774
commit 2f1dd55b29
11 changed files with 610 additions and 105 deletions

View File

@@ -119,7 +119,7 @@ function loadServerConfigFromGameAndPort(gameId, port, mpMod) {
if(dbQuery) { if(dbQuery) {
if(dbQuery.numRows > 0) { if(dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery); let dbAssoc = fetchQueryAssoc(dbQuery);
let tempServerConfigData = new ServerConfigData(dbAssoc); let tempServerConfigData = new ServerData(dbAssoc);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
return tempServerConfigData; return tempServerConfigData;
} }
@@ -139,7 +139,7 @@ function loadServerConfigFromId(tempServerId) {
if(dbQuery) { if(dbQuery) {
if(dbQuery.numRows > 0) { if(dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery); let dbAssoc = fetchQueryAssoc(dbQuery);
let tempServerConfigData = new ServerConfigData(dbAssoc); let tempServerConfigData = new ServerData(dbAssoc);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
return tempServerConfigData; return tempServerConfigData;
} }
@@ -157,7 +157,7 @@ function applyConfigToServer(tempServerConfig) {
} }
if(isWeatherSupported()) { if(isWeatherSupported()) {
gta.forceWeather(tempServerConfig.weather); game.forceWeather(tempServerConfig.weather);
} }
updateServerRules(); updateServerRules();
@@ -299,8 +299,8 @@ function setTimeCommand(command, params, client) {
getServerConfig().hour = hour; getServerConfig().hour = hour;
getServerConfig().minute = minute; getServerConfig().minute = minute;
gta.time.hour = getServerConfig().hour; game.time.hour = getServerConfig().hour;
gta.time.minute = getServerConfig().minute; game.time.minute = getServerConfig().minute;
//checkServerGameTime(); //checkServerGameTime();
@@ -363,7 +363,7 @@ function setWeatherCommand(command, params, client) {
return false; return false;
} }
gta.forceWeather(toInteger(weatherId)); game.forceWeather(toInteger(weatherId));
getServerConfig().weather = weatherId; getServerConfig().weather = weatherId;
getServerConfig().needsSaved = true; getServerConfig().needsSaved = true;

View File

@@ -34,6 +34,11 @@ let serverData = {
// =========================================================================== // ===========================================================================
// Pre-cache allowed skins
let allowedSkins = getAllowedSkins(getGame());
// ===========================================================================
function initServerData() { function initServerData() {
// Pre-allocate translation cache language slots // Pre-allocate translation cache language slots
//getServerData().translation.cache = new Array(getServerData().translation.languages.length); //getServerData().translation.cache = new Array(getServerData().translation.languages.length);

View File

@@ -32,6 +32,9 @@ function addAllEventHandlers() {
addEventHandler("onPedEnterVehicle", onPedEnteringVehicle); addEventHandler("onPedEnterVehicle", onPedEnteringVehicle);
addEventHandler("onPedExitVehicle", onPedExitingVehicle); addEventHandler("onPedExitVehicle", onPedExitingVehicle);
addEventHandler("onPedEnteringVehicle", onPedEnteringVehicle);
addEventHandler("onPedExitingVehicle", onPedExitingVehicle);
addEventHandler("OnPlayerCommand", onPlayerCommand); addEventHandler("OnPlayerCommand", onPlayerCommand);
} }
@@ -48,6 +51,8 @@ function onPlayerConnect(event, ipAddress, port) {
// =========================================================================== // ===========================================================================
function onPlayerJoin(event, client) { function onPlayerJoin(event, client) {
logToConsole(LOG_DEBUG, `[VRR.Event] Client ${client.name}[${client.index}] joining from ${ipAddress}`);
if(isFadeCameraSupported()) { if(isFadeCameraSupported()) {
fadeCamera(client, true, 1.0); fadeCamera(client, true, 1.0);
} }
@@ -72,7 +77,7 @@ function onElementStreamIn(event, element, client) {
// =========================================================================== // ===========================================================================
function onPlayerQuit(event, client, quitReasonId) { function onPlayerQuit(event, client, quitReasonId) {
logToConsole(LOG_DEBUG, `👋 ${getPlayerDisplayForConsole(client)} disconnected (${disconnectReasons[quitReasonId]}[${quitReasonId}])`); logToConsole(LOG_DEBUG, `👋 Client ${getPlayerDisplayForConsole(client)} disconnected (${disconnectReasons[quitReasonId]}[${quitReasonId}])`);
updateConnectionLogOnQuit(client, quitReasonId); updateConnectionLogOnQuit(client, quitReasonId);
if(isPlayerLoggedIn(client)) { if(isPlayerLoggedIn(client)) {
messagePlayerNormal(null, `👋 ${getPlayerName(client)} has left the server (${disconnectReasons[quitReasonId]})`, getColourByName("softYellow")); messagePlayerNormal(null, `👋 ${getPlayerName(client)} has left the server (${disconnectReasons[quitReasonId]})`, getColourByName("softYellow"));
@@ -82,6 +87,8 @@ function onPlayerQuit(event, client, quitReasonId) {
} }
messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has left the server.`); messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has left the server.`);
clearTemporaryVehicles();
} }
// =========================================================================== // ===========================================================================
@@ -381,7 +388,7 @@ function onPlayerDeath(client, position) {
client.despawnPlayer(); client.despawnPlayer();
getPlayerCurrentSubAccount(client).interior = closestJail.interior; getPlayerCurrentSubAccount(client).interior = closestJail.interior;
getPlayerCurrentSubAccount(client).dimension = closestJail.dimension; getPlayerCurrentSubAccount(client).dimension = closestJail.dimension;
if(getServerGame() == GAME_GTA_IV) { if(getServerGame() == VRR_GAME_GTA_IV) {
spawnPlayer(client, closestJail.position, closestJail.heading, getPlayerCurrentSubAccount(client).skin); spawnPlayer(client, closestJail.position, closestJail.heading, getPlayerCurrentSubAccount(client).skin);
} else { } else {
spawnPlayer(client, closestJail.position, closestJail.heading, getPlayerCurrentSubAccount(client).skin); spawnPlayer(client, closestJail.position, closestJail.heading, getPlayerCurrentSubAccount(client).skin);
@@ -396,7 +403,7 @@ function onPlayerDeath(client, position) {
client.despawnPlayer(); client.despawnPlayer();
getPlayerCurrentSubAccount(client).interior = closestHospital.interior; getPlayerCurrentSubAccount(client).interior = closestHospital.interior;
getPlayerCurrentSubAccount(client).dimension = closestHospital.dimension; getPlayerCurrentSubAccount(client).dimension = closestHospital.dimension;
if(getServerGame() == GAME_GTA_IV) { if(getServerGame() == VRR_GAME_GTA_IV) {
spawnPlayer(client, closestHospital.position, closestHospital.heading, getPlayerCurrentSubAccount(client).skin); spawnPlayer(client, closestHospital.position, closestHospital.heading, getPlayerCurrentSubAccount(client).skin);
} else { } else {
spawnPlayer(client, closestHospital.position, closestHospital.heading, getPlayerCurrentSubAccount(client).skin); spawnPlayer(client, closestHospital.position, closestHospital.heading, getPlayerCurrentSubAccount(client).skin);
@@ -455,7 +462,7 @@ function onPlayerSpawn(client) {
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player data is valid. Continuing spawn processing ...`); logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player data is valid. Continuing spawn processing ...`);
if(getServerGame() == GAME_GTA_IV) { if(getServerGame() == VRR_GAME_GTA_IV) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped body parts and props`); logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped body parts and props`);
setEntityData(client.player, "vrr.bodyParts", getPlayerCurrentSubAccount(client).bodyParts, true); setEntityData(client.player, "vrr.bodyParts", getPlayerCurrentSubAccount(client).bodyParts, true);
setEntityData(client.player, "vrr.bodyProps", getPlayerCurrentSubAccount(client).bodyProps, true); setEntityData(client.player, "vrr.bodyProps", getPlayerCurrentSubAccount(client).bodyProps, true);
@@ -514,7 +521,7 @@ function onPlayerSpawn(client) {
logToConsole(LOG_DEBUG, `[VRR.Event] Sending snow states to ${getPlayerDisplayForConsole(client)}`); logToConsole(LOG_DEBUG, `[VRR.Event] Sending snow states to ${getPlayerDisplayForConsole(client)}`);
updatePlayerSnowState(client); updatePlayerSnowState(client);
if(getServerGame() == GAME_GTA_SA) { if(getServerGame() == VRR_GAME_GTA_SA) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player walk and fightstyle for ${getPlayerDisplayForConsole(client)}`); logToConsole(LOG_DEBUG, `[VRR.Event] Setting player walk and fightstyle for ${getPlayerDisplayForConsole(client)}`);
setEntityData(client.player, "vrr.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true); setEntityData(client.player, "vrr.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true);

View File

@@ -103,12 +103,15 @@ function createGroundItemObject(itemId) {
deleteGroundItemObject(itemId); deleteGroundItemObject(itemId);
} }
getItemData(itemId).object = createGameObject(getItemTypeData(getItemData(itemId).itemTypeIndex).dropModel, applyOffsetToPos(getItemData(itemId).position, getItemTypeData(getItemData(itemId).itemTypeIndex).dropPosition)); let object = createGameObject(getItemTypeData(getItemData(itemId).itemTypeIndex).dropModel, applyOffsetToPos(getItemData(itemId).position, getItemTypeData(getItemData(itemId).itemTypeIndex).dropPosition));
setElementRotation(getItemData(itemId).object, getItemTypeData(getItemData(itemId).itemTypeIndex).dropRotation); if(object != false) {
setElementOnAllDimensions(getItemData(itemId).object, false); getItemData(itemId).object = object;
setElementDimension(getItemData(itemId).object, getItemData(itemId).dimension); setElementRotation(getItemData(itemId).object, getItemTypeData(getItemData(itemId).itemTypeIndex).dropRotation);
setEntityData(getItemData(itemId).object, "vrr.scale", getItemTypeData(getItemData(itemId).itemTypeIndex).dropScale, true); setElementOnAllDimensions(getItemData(itemId).object, false);
addToWorld(getItemData(itemId).object); setElementDimension(getItemData(itemId).object, getItemData(itemId).dimension);
setEntityData(getItemData(itemId).object, "vrr.scale", getItemTypeData(getItemData(itemId).itemTypeIndex).dropScale, true);
addToWorld(getItemData(itemId).object);
}
getServerData().groundItemCache.push(itemId); getServerData().groundItemCache.push(itemId);
} }
@@ -1341,7 +1344,7 @@ function saveAllItemsToDatabase() {
for(let i in getServerData().items) { for(let i in getServerData().items) {
if(getServerData().items[i].needsSaved) { if(getServerData().items[i].needsSaved) {
if(getServerData().items[i].databaseId != -1) { if(getServerData().items[i].databaseId != -1) {
saveItemToDatabase(i); saveItemToDatabase(getServerData().items[i]);
} }
} }
} }
@@ -1349,39 +1352,98 @@ function saveAllItemsToDatabase() {
// =========================================================================== // ===========================================================================
function saveItemToDatabase(itemId) { function saveItemToDatabase(itemData) {
let tempItemData = getServerData().items[itemId]; logToConsole(LOG_VERBOSE, `[VRR.Item]: Saving item '${itemData.index}' to database ...`);
logToConsole(LOG_VERBOSE, `[VRR.Item]: Saving item '${itemId}' to database ...`);
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if(dbConnection) { if(dbConnection) {
let data = [ let data = [
["item_server", getServerId()], ["item_server", getServerId()],
["item_type", tempItemData.itemType], ["item_type", itemData.itemType],
["item_owner_type", tempItemData.ownerType], ["item_owner_type", itemData.ownerType],
["item_owner_id", tempItemData.ownerId], ["item_owner_id", itemData.ownerId],
["item_amount", tempItemData.amount], ["item_amount", itemData.amount],
["item_pos_x", tempItemData.position.x], ["item_pos_x", itemData.position.x],
["item_pos_y", tempItemData.position.y], ["item_pos_y", itemData.position.y],
["item_pos_z", tempItemData.position.z], ["item_pos_z", itemData.position.z],
["item_int", tempItemData.interior], ["item_int", itemData.interior],
["item_vw", tempItemData.dimension], ["item_vw", itemData.dimension],
["item_buy_price", tempItemData.buyPrice], ["item_buy_price", itemData.buyPrice],
["item_enabled", tempItemData.enabled], ["item_enabled", itemData.enabled],
["item_value", tempItemData.value], ["item_value", itemData.value],
]; ];
let dbQuery = null; let dbQuery = null;
if(tempItemData.databaseId == 0) { if(itemData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("item_main", data); let queryString = createDatabaseInsertQuery("item_main", data);
dbQuery = queryDatabase(dbConnection, queryString); dbQuery = queryDatabase(dbConnection, queryString);
getServerData().items[itemId].databaseId = getDatabaseInsertId(dbConnection); itemData.databaseId = getDatabaseInsertId(dbConnection);
} else { } else {
let queryString = createDatabaseUpdateQuery("item_main", data, `item_id=${tempItemData.databaseId}`); let queryString = createDatabaseUpdateQuery("item_main", data, `item_id=${itemData.databaseId}`);
dbQuery = queryDatabase(dbConnection, queryString); dbQuery = queryDatabase(dbConnection, queryString);
} }
getItemData(itemId).needsSaved = false; itemData.needsSaved = false;
freeDatabaseQuery(dbQuery);
disconnectFromDatabase(dbConnection);
return true;
}
return false;
}
function saveItemTypeToDatabase(itemTypeData) {
logToConsole(LOG_VERBOSE, `[VRR.Item]: Saving item type '${itemTypeData.name}' to database ...`);
let dbConnection = connectToDatabase();
if(dbConnection) {
let data = [
["item_type_id", itemTypeData.databaseId],
["item_type_server", itemTypeData.serverId],
["item_type_name", itemTypeData.name],
["item_type_enabled", itemTypeData.enabled],
["item_type_use_type", itemTypeData.useType],
["item_type_drop_type", itemTypeData.dropType],
["item_type_use_id", itemTypeData.useId],
["item_type_drop_pos_x", itemTypeData.dropPosition.x],
["item_type_drop_pos_y", itemTypeData.dropPosition.y],
["item_type_drop_pos_z", itemTypeData.dropPosition.z],
["item_type_drop_rot_x", itemTypeData.dropRotation.x],
["item_type_drop_rot_y", itemTypeData.dropRotation.y],
["item_type_drop_rot_z", itemTypeData.dropRotation.z],
["item_type_drop_scale_x", itemTypeData.dropScale.x],
["item_type_drop_scale_y", itemTypeData.dropScale.y],
["item_type_drop_scale_z", itemTypeData.dropScale.z],
["item_type_drop_model", itemTypeData.dropModel],
["item_type_use_value", itemTypeData.useValue],
//["item_type_max_value", itemTypeData.maxValue],
["item_type_order_price", itemTypeData.orderPrice],
["item_type_order_value", itemTypeData.orderValue],
["item_type_demand_multiplier", itemTypeData.demandMultiplier],
["item_type_supply_multiplier", itemTypeData.supplyMultiplier],
["item_type_risk_multiplier", itemTypeData.riskMultiplier],
["item_type_size", itemTypeData.size],
["item_type_capacity", itemTypeData.capacity],
["item_type_delay_use", itemTypeData.useDelay],
["item_type_delay_switch", itemTypeData.switchDelay],
["item_type_delay_pickup", itemTypeData.pickupDelay],
["item_type_delay_put", itemTypeData.putDelay],
["item_type_delay_take", itemTypeData.takeDelay],
["item_type_delay_give", itemTypeData.giveDelay],
["item_type_delay_drop", itemTypeData.dropDelay],
];
let dbQuery = null;
if(itemTypeData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("item_type", data);
dbQuery = queryDatabase(dbConnection, queryString);
itemTypeData.databaseId = getDatabaseInsertId(dbConnection);
} else {
let queryString = createDatabaseUpdateQuery("item_type", data, `item_type_id=${itemTypeData.databaseId}`);
dbQuery = queryDatabase(dbConnection, queryString);
}
itemTypeData.needsSaved = false;
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
disconnectFromDatabase(dbConnection); disconnectFromDatabase(dbConnection);
return true; return true;

View File

@@ -87,7 +87,7 @@ function setNewCharacterSkinCommand(command, params, client) {
getServerConfig().newCharacter.skin = skinId; getServerConfig().newCharacter.skin = skinId;
getServerConfig().needsSaved = true; getServerConfig().needsSaved = true;
messagePlayerNormal(client, `The new character skin has been set to ${getSkinNameFromId(skinId)} (ID ${skinId})`); messagePlayerNormal(client, `The new character skin has been set to ${getSkinNameFromModel(skinId)} (ID ${skinId})`);
return true; return true;
} }
@@ -151,40 +151,44 @@ function enterExitPropertyCommand(command, params, client) {
// isEntrance = false; // isEntrance = false;
//} //}
if(getPlayerData(client).currentPickup != false) { if(!getPlayerData(client).currentPickup) {
let ownerType = getEntityData(getPlayerData(client).currentPickup, "vrr.owner.type"); return false;
let ownerId = getEntityData(getPlayerData(client).currentPickup, "vrr.owner.id"); }
//logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} is near pickup for owner ID ${ownerId}`); let ownerType = getEntityData(getPlayerData(client).currentPickup, "vrr.owner.type");
let ownerId = getEntityData(getPlayerData(client).currentPickup, "vrr.owner.id");
switch(ownerType) { switch(ownerType) {
case VRR_PICKUP_BUSINESS_ENTRANCE: case VRR_PICKUP_BUSINESS_ENTRANCE:
isBusiness = true; isBusiness = true;
isEntrance = true; isEntrance = true;
closestProperty = getServerData().businesses[ownerId]; closestProperty = getServerData().businesses[ownerId];
break; break;
case VRR_PICKUP_BUSINESS_EXIT: case VRR_PICKUP_BUSINESS_EXIT:
isBusiness = true; isBusiness = true;
isEntrance = false; isEntrance = false;
closestProperty = getServerData().businesses[ownerId]; closestProperty = getServerData().businesses[ownerId];
break; break;
case VRR_PICKUP_HOUSE_ENTRANCE: case VRR_PICKUP_HOUSE_ENTRANCE:
isBusiness = false; isBusiness = false;
isEntrance = true; isEntrance = true;
closestProperty = getServerData().houses[ownerId]; closestProperty = getServerData().houses[ownerId];
break; break;
case VRR_PICKUP_HOUSE_EXIT: case VRR_PICKUP_HOUSE_EXIT:
isBusiness = false; isBusiness = false;
isEntrance = false; isEntrance = false;
closestProperty = getServerData().houses[ownerId]; closestProperty = getServerData().houses[ownerId];
break; break;
default: default:
return false; return false;
} }
if(closestProperty == null) {
return false;
} }
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s closest door is ${(isBusiness) ? closestProperty.name : closestProperty.description} ${(isEntrance) ? "entrance" : "exit"}`); logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s closest door is ${(isBusiness) ? closestProperty.name : closestProperty.description} ${(isEntrance) ? "entrance" : "exit"}`);
@@ -295,7 +299,7 @@ function getPlayerInfoCommand(command, params, client) {
`${getInlineChatColourByName("white")}Registered: ${getPlayerData(targetClient).accountData}`, `${getInlineChatColourByName("white")}Registered: ${getPlayerData(targetClient).accountData}`,
`${getInlineChatColourByName("white")}Game Version: ${getInlineChatColourByName("lightGrey")}${targetClient.gameVersion}`, `${getInlineChatColourByName("white")}Game Version: ${getInlineChatColourByName("lightGrey")}${targetClient.gameVersion}`,
`${getInlineChatColourByName("white")}Client Version: ${getInlineChatColourByName("lightGrey")}${getPlayerData(targetClient).clientVersion}`, `${getInlineChatColourByName("white")}Client Version: ${getInlineChatColourByName("lightGrey")}${getPlayerData(targetClient).clientVersion}`,
`${getInlineChatColourByName("white")}Skin: ${getInlineChatColourByName("lightGrey")}${getSkinNameFromId(getPlayerCurrentSubAccount(targetClient).skin)}[${getPlayerCurrentSubAccount(targetClient).skin}]`, `${getInlineChatColourByName("white")}Skin: ${getInlineChatColourByName("lightGrey")}${getSkinNameFromModel(getPlayerCurrentSubAccount(targetClient).skin)}[${getPlayerCurrentSubAccount(targetClient).skin}]`,
`${getInlineChatColourByName("white")}Clan: ${getInlineChatColourByName("lightGrey")}${clan}`, `${getInlineChatColourByName("white")}Clan: ${getInlineChatColourByName("lightGrey")}${clan}`,
`${getInlineChatColourByName("white")}Job: ${getInlineChatColourByName("lightGrey")}${job}`, `${getInlineChatColourByName("white")}Job: ${getInlineChatColourByName("lightGrey")}${job}`,
@@ -358,8 +362,8 @@ function showPlayerPrompt(client, promptType, promptMessage, promptTitle) {
function updateServerGameTime() { function updateServerGameTime() {
if(isTimeSupported()) { if(isTimeSupported()) {
gta.time.hour = getServerConfig().hour; game.time.hour = getServerConfig().hour;
gta.time.minute = getServerConfig().minute; game.time.minute = getServerConfig().minute;
} }
} }

View File

@@ -959,22 +959,22 @@ function forcePlayerSkinCommand(command, params, client) {
let splitParams = params.split(" "); let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]); let targetClient = getPlayerFromParams(splitParams[0]);
let skinId = getSkinIdFromParams(splitParams[1]); let skinIndex = getSkinModelIndexFromParams(splitParams[1]);
if(!targetClient) { if(!targetClient) {
messagePlayerError(client, "That player is not connected!"); messagePlayerError(client, "That player is not connected!");
return false; return false;
} }
if(!skinId) { if(!skinIndex) {
messagePlayerError(client, "That skin is invalid!"); messagePlayerError(client, "That skin is invalid!");
return false; return false;
} }
getPlayerCurrentSubAccount(targetClient).skin = skinId; getPlayerCurrentSubAccount(targetClient).skin = skinIndex;
setPlayerSkin(targetClient, skinId); setPlayerSkin(targetClient, skinIndex);
messageAdmins(`${client.name} ${getInlineChatColourByName("white")}set ${getPlayerName(targetClient)}'s ${getInlineChatColourByName("white")}skin to ${getInlineChatColourByName("lightGrey")}${getSkinNameFromId(skinId)}`); messageAdmins(`${client.name} ${getInlineChatColourByName("white")}set ${getPlayerName(targetClient)}'s ${getInlineChatColourByName("white")}skin to ${getInlineChatColourByName("lightGrey")}${getGameData().skins[getGame()][skinIndex][1]}`);
} }
// =========================================================================== // ===========================================================================

View File

@@ -5,4 +5,16 @@
// FILE: npc.js // FILE: npc.js
// DESC: Provides NPC usage and functions // DESC: Provides NPC usage and functions
// TYPE: Server (JavaScript) // TYPE: Server (JavaScript)
// ===========================================================================
function initNPCScript() {
}
// ===========================================================================
function getNPCData(ped) {
return false;
}
// =========================================================================== // ===========================================================================

View File

@@ -37,6 +37,7 @@ function initServerScripts() {
initGUIScript(); initGUIScript();
initEconomyScript(); initEconomyScript();
initRadioScript(); initRadioScript();
initLocaleScript();
initTimers(); initTimers();

View File

@@ -287,8 +287,6 @@ function checkNewCharacter(client, firstName, lastName) {
return true; return true;
} }
let skinId = allowedSkins[getServerGame()][getAllowedSkinDataBySkinId(getServerConfig().newCharacter.skin)][0]
let subAccountData = createSubAccount(getPlayerData(client).accountData.databaseId, firstName, lastName); let subAccountData = createSubAccount(getPlayerData(client).accountData.databaseId, firstName, lastName);
if(!subAccountData) { if(!subAccountData) {
if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) { if(getServerConfig().useGUI && doesPlayerHaveGUIEnabled(client)) {
@@ -296,7 +294,7 @@ function checkNewCharacter(client, firstName, lastName) {
} else { } else {
messagePlayerAlert(client, "Your character could not be created!"); messagePlayerAlert(client, "Your character could not be created!");
} }
messagePlayerAlert(client, `${getServerName()} staff have been notified of the problem and will fix it shortly.`); messagePlayerAlert(client, `${getServerName()} staff have been notified of the problem and will fix it soon.`);
return false; return false;
} }
@@ -372,14 +370,10 @@ function selectCharacter(client, characterId = -1) {
//setPlayerCameraLookAt(client, getPosBehindPos(spawnPosition, spawnHeading, 5), spawnPosition); //setPlayerCameraLookAt(client, getPosBehindPos(spawnPosition, spawnHeading, 5), spawnPosition);
getPlayerData(client).pedState = VRR_PEDSTATE_SPAWNING; getPlayerData(client).pedState = VRR_PEDSTATE_SPAWNING;
if(!isGTAIV()) { if(getGame() < VRR_GAME_MAFIA_ONE) {
spawnPlayer(client, spawnPosition, spawnHeading, skin, spawnInterior, spawnDimension); spawnPlayer(client, spawnPosition, spawnHeading, getGameData().skins[getGame()][skin][0], spawnInterior, spawnDimension);
} else { } else {
//setPlayerPosition(client, spawnPosition); spawnPlayer(client, getGameData().skins[getGame()][skin][0], spawnPosition, spawnHeading);
//setPlayerHeading(client, spawnHeading);
//setPlayerSkin(client, skin);
//restorePlayerCamera(client);
spawnPlayer(client, spawnPosition, spawnHeading, skin, spawnInterior, spawnDimension);
} }
logToConsole(LOG_DEBUG, `[VRR.SubAccount] Spawned ${getPlayerDisplayForConsole(client)} as character ID ${getPlayerData(client).currentSubAccount} with skin ${skin} (${spawnPosition.x}, ${spawnPosition.y}, ${spawnPosition.z})`); logToConsole(LOG_DEBUG, `[VRR.SubAccount] Spawned ${getPlayerDisplayForConsole(client)} as character ID ${getPlayerData(client).currentSubAccount} with skin ${skin} (${spawnPosition.x}, ${spawnPosition.y}, ${spawnPosition.z})`);
@@ -609,7 +603,7 @@ function forceFightStyleCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function createDefaultSubAccountServerData(databaseId, thisServerSkin) { function createDefaultSubAccountServerData(databaseId, thisServerSkin) {
for(let i = 1 ; i <= 4 ; i++) { for(let i = 1 ; i <= 5 ; i++) {
if(i == getServerId()) { if(i == getServerId()) {
let dbQueryString = `INSERT INTO sacct_svr (sacct_svr_sacct, sacct_svr_server, sacct_svr_skin) VALUES (${databaseId}, ${i}, ${thisServerSkin})`; let dbQueryString = `INSERT INTO sacct_svr (sacct_svr_sacct, sacct_svr_server, sacct_svr_skin) VALUES (${databaseId}, ${i}, ${thisServerSkin})`;
quickDatabaseQuery(dbQueryString); quickDatabaseQuery(dbQueryString);

View File

@@ -79,7 +79,7 @@ function saveVehicleToDatabase(vehicleDataId) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if(dbConnection) { if(dbConnection) {
if(!tempVehicleData.spawnLocked) { if(!tempVehicleData.spawnLocked) {
if(doesGameHaveServerElements()) { if(areServerElementsSupported()) {
tempVehicleData.spawnPosition = tempVehicleData.vehicle.position; tempVehicleData.spawnPosition = tempVehicleData.vehicle.position;
tempVehicleData.spawnRotation = tempVehicleData.vehicle.heading; tempVehicleData.spawnRotation = tempVehicleData.vehicle.heading;
} else { } else {
@@ -207,15 +207,15 @@ function createVehicleCommand(command, params, client) {
return false; return false;
} }
let modelId = getVehicleModelIdFromParams(params); let modelIndex = getVehicleModelIndexFromParams(params);
if(!modelId) { if(!modelIndex) {
messagePlayerError(client, "That vehicle type is invalid!"); messagePlayerError(client, "That vehicle type is invalid!");
return false; return false;
} }
let frontPos = getPosInFrontOfPos(getPlayerPosition(client), getPlayerHeading(client), getGlobalConfig().spawnCarDistance); let frontPos = getPosInFrontOfPos(getPlayerPosition(client), getPlayerHeading(client), getGlobalConfig().spawnCarDistance);
let vehicle = createPermanentVehicle(modelId, frontPos, getPlayerHeading(client), getPlayerInterior(client), getPlayerDimension(client)); let vehicle = createPermanentVehicle(modelIndex, frontPos, getPlayerHeading(client), getPlayerInterior(client), getPlayerDimension(client));
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}created a ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)}!`); messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}created a ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)}!`);
} }
@@ -228,15 +228,15 @@ function createTemporaryVehicleCommand(command, params, client) {
return false; return false;
} }
let modelId = getVehicleModelIdFromParams(params); let modelIndex = getVehicleModelIndexFromParams(params);
if(!modelId) { if(!modelIndex) {
messagePlayerError(client, "That vehicle type is invalid!"); messagePlayerError(client, "That vehicle type is invalid!");
return false; return false;
} }
let frontPos = getPosInFrontOfPos(getPlayerPosition(client), getPlayerHeading(client), getGlobalConfig().spawnCarDistance); let frontPos = getPosInFrontOfPos(getPlayerPosition(client), getPlayerHeading(client), getGlobalConfig().spawnCarDistance);
let vehicle = createTemporaryVehicle(modelId, frontPos, getPlayerHeading(client), getPlayerInterior(client), getPlayerDimension(client)); let vehicle = createTemporaryVehicle(modelIndex, frontPos, getPlayerHeading(client), getPlayerInterior(client), getPlayerDimension(client));
messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}created a temporary ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)}`); messageAdmins(`${getInlineChatColourByName("lightGrey")}${getPlayerName(client)} ${getInlineChatColourByName("white")}created a temporary ${getInlineChatColourByType("vehiclePurple")}${getVehicleName(vehicle)}`);
} }
@@ -737,12 +737,6 @@ function doesClientOwnVehicle(client, vehicle) {
// =========================================================================== // ===========================================================================
function getVehicleName(vehicle) {
return getVehicleNameFromModelId(vehicle.modelIndex) || "Unknown";
}
// ===========================================================================
function setVehicleJobCommand(command, params, client) { function setVehicleJobCommand(command, params, client) {
if(!isPlayerInAnyVehicle(client)) { if(!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle!"); messagePlayerError(client, "You need to be in a vehicle!");
@@ -1159,7 +1153,7 @@ function spawnVehicle(vehicleData) {
let vehicle = createGameVehicle(vehicleData.model, vehicleData.spawnPosition, vehicleData.spawnRotation); let vehicle = createGameVehicle(vehicleData.model, vehicleData.spawnPosition, vehicleData.spawnRotation);
addToWorld(vehicle); addToWorld(vehicle);
if(doesGameHaveServerElements()) { if(isSnowSupported()) {
if(vehicleData.colour1IsRGBA && vehicleData.colour2IsRGBA) { if(vehicleData.colour1IsRGBA && vehicleData.colour2IsRGBA) {
vehicle.setRGBColours(vehicleData.colour1RGBA, vehicleData.colour2RGBA); vehicle.setRGBColours(vehicleData.colour1RGBA, vehicleData.colour2RGBA);
} else { } else {
@@ -1250,8 +1244,8 @@ async function getPlayerNewVehicle(client) {
// =========================================================================== // ===========================================================================
function createNewDealershipVehicle(model, spawnPosition, spawnRotation, price, dealershipId, interior = 0, dimension = 0) { function createNewDealershipVehicle(modelIndex, spawnPosition, spawnRotation, price, dealershipId, interior = 0, dimension = 0) {
let vehicle = createGameVehicle(model, spawnPosition, spawnRotation); let vehicle = createGameVehicle(modelIndex, spawnPosition, spawnRotation);
if(!vehicle) { if(!vehicle) {
return false; return false;
} }
@@ -1277,17 +1271,24 @@ function createNewDealershipVehicle(model, spawnPosition, spawnRotation, price,
// =========================================================================== // ===========================================================================
function createTemporaryVehicle(modelId, position, heading, interior = 0, dimension = 0) { function createTemporaryVehicle(modelIndex, position, heading, interior = 0, dimension = 0) {
let vehicle = createGameVehicle(modelId, position, heading); let vehicle = createGameVehicle(modelIndex, position, heading);
setVehicleHeading(vehicle, heading); setVehicleHeading(vehicle, heading);
setElementInterior(vehicle, interior); setElementInterior(vehicle, interior);
setElementDimension(vehicle, dimension); setElementDimension(vehicle, dimension);
addToWorld(vehicle); addToWorld(vehicle);
let tempVehicleData = new VehicleData(false, vehicle); let tempVehicleData = new VehicleData(false, vehicle);
tempVehicleData.model = modelIndex;
tempVehicleData.databaseId = -1; tempVehicleData.databaseId = -1;
tempVehicleData.interior = interior; tempVehicleData.interior = interior;
tempVehicleData.dimension = dimension; tempVehicleData.dimension = dimension;
if(!isGameFeatureSupported("vehicleColours")) {
tempVehicleData.colour1 = 0;
tempVehicleData.colour2 = 0;
tempVehicleData.colour3 = 0;
tempVehicleData.colour4 = 0;
}
let slot = getServerData().vehicles.push(tempVehicleData); let slot = getServerData().vehicles.push(tempVehicleData);
setEntityData(vehicle, "vrr.dataSlot", slot-1, false); setEntityData(vehicle, "vrr.dataSlot", slot-1, false);
@@ -1297,16 +1298,23 @@ function createTemporaryVehicle(modelId, position, heading, interior = 0, dimens
// =========================================================================== // ===========================================================================
function createPermanentVehicle(modelId, position, heading, interior = 0, dimension = 0) { function createPermanentVehicle(modelIndex, position, heading, interior = 0, dimension = 0) {
let vehicle = createGameVehicle(modelId, position, heading); let vehicle = createGameVehicle(modelIndex, position, heading);
setVehicleHeading(vehicle, heading); setVehicleHeading(vehicle, heading);
setElementInterior(vehicle, interior); setElementInterior(vehicle, interior);
setElementDimension(vehicle, dimension); setElementDimension(vehicle, dimension);
addToWorld(vehicle); addToWorld(vehicle);
let tempVehicleData = new VehicleData(false, vehicle); let tempVehicleData = new VehicleData(false, vehicle);
tempVehicleData.model = modelIndex;
tempVehicleData.interior = interior; tempVehicleData.interior = interior;
tempVehicleData.dimension = dimension; tempVehicleData.dimension = dimension;
if(!isGameFeatureSupported("vehicleColours")) {
tempVehicleData.colour1 = 0;
tempVehicleData.colour2 = 0;
tempVehicleData.colour3 = 0;
tempVehicleData.colour4 = 0;
}
let slot = getServerData().vehicles.push(tempVehicleData); let slot = getServerData().vehicles.push(tempVehicleData);
setEntityData(vehicle, "vrr.dataSlot", slot-1, false); setEntityData(vehicle, "vrr.dataSlot", slot-1, false);

View File

@@ -432,4 +432,416 @@ function getPercentage(num, per) {
return (num/100)*per; return (num/100)*per;
} }
// ===========================================================================
function getMultiplayerMod() {
return (getGame() >= 10) ? VRR_MPMOD_MAFIAC : VRR_MPMOD_GTAC;
}
// ===========================================================================
function getGame() {
if(isServerScript()) {
return server.game;
} else {
return game.game;
}
}
// ===========================================================================
function isSnowSupported(gameId) {
return supportedFeatures.snow[getGame()];
}
// ===========================================================================
function isGTAIV() {
return (getGame() == VRR_GAME_GTA_IV);
}
// ===========================================================================
function areServerElementsSupported() {
return supportedFeatures.serverElements[getGame()];
}
// ===========================================================================
function isTimeSupported() {
return supportedFeatures.time[getGame()];
}
// ===========================================================================
function isWeatherSupported() {
return supportedFeatures.weather[getGame()];
}
// ===========================================================================
function arePickupsSupported() {
return supportedFeatures.pickups[getGame()];
}
// ===========================================================================
function areBlipsSupported() {
return supportedFeatures.blips[getGame()];
}
// ===========================================================================
function areMarkersSupported() {
return supportedFeatures.markers[getGame()];
}
// ===========================================================================
function isFadeCameraSupported() {
return supportedFeatures.fadeCamera[getGame()];
}
// ===========================================================================
function isCustomCameraSupported() {
return supportedFeatures.customCamera[getGame()];
}
// ===========================================================================
function isFightStyleSupported() {
return supportedFeatures.fightStyle[getGame()];
}
// ===========================================================================
function areWorldLabelsSupported() {
return supportedFeatures.worldLabels[getGame()];
}
// ===========================================================================
function isGameFeatureSupported(featureName) {
return supportedFeatures[featureName][getGame()];
}
// ===========================================================================
function getAllowedSkins(gameId = getGame()) {
return getGameData().skins[gameId].filter(skin => skin[2] == true);
}
// ===========================================================================
function getGameData() {
return gameData;
}
// ===========================================================================
function getAllowedSkinIndexFromSkin(skin) {
for(let i in allowedSkins) {
if(allowedSkins[i][0] == skin) {
return i;
}
}
return false;
}
// ===========================================================================
function getSkinIndexFromModel(model, gameId = getGame()) {
let skins = getGameData().skins[gameId];
for(let i in skins) {
if(toLowerCase(skins[i][0]).indexOf(toLowerCase(model)) != -1) {
return i;
}
}
return false;
}
// ===========================================================================
function getSkinIndexFromName(name, gameId = getGame()) {
let skins = getGameData().skins[gameId];
for(let i in skins) {
if(toLowerCase(skins[i][1]).indexOf(toLowerCase(name)) != -1) {
return i;
}
}
return false;
}
// ===========================================================================
function getObjectModelIndexFromModel(model, gameId = getGame()) {
let objects = getGameData().objects[gameId];
for(let i in objects) {
if(toLowerCase(objects[i][0]).indexOf(toLowerCase(model)) != -1) {
return i;
}
}
return false;
}
// ===========================================================================
function getGameName(gameId = getGame()) {
return getGameData().gameNames[gameId];
}
// ===========================================================================
function getVehicleModelIndexFromParams(params, gameId = getGame()) {
let fromName = getVehicleModelIndexFromName(params, gameId);
let fromModel = getVehicleModelIndexFromModel(params, gameId);
if(fromModel && !fromName) {
return fromModel;
}
if(!fromModel && fromName) {
return fromName;
}
return false;
}
// ===========================================================================
function getVehicleModelIndexFromName(name, gameId = getGame()) {
let vehicles = getGameData().vehicles[gameId];
for(let i in vehicles) {
if(toLowerCase(vehicles[i][1]).indexOf(toLowerCase(name)) != -1) {
return i;
}
}
return false;
}
// ===========================================================================
function getVehicleModelIndexFromModel(model, gameId = getGame()) {
let vehicles = getGameData().vehicles[gameId];
for(let i in vehicles) {
if(isNaN(model)) {
if(toLowerCase(vehicles[i][0]).indexOf(toLowerCase(model)) != -1) {
return i;
}
} else {
if(vehicles[i][0] == toInteger(model)) {
return i;
}
}
}
return false;
}
// ===========================================================================
function getVehicleModelFromName(name, gameId = getGame()) {
let vehicles = getGameData().vehicles[gameId];
for(let i in vehicles) {
if(toLowerCase(vehicles[i][1]).indexOf(toLowerCase(name)) != -1) {
return vehicles[i][0];
}
}
return false;
}
// ===========================================================================
function getVehicleNameFromModel(model, gameId = getGame()) {
let vehicles = getGameData().vehicles[gameId];
for(let i in vehicles) {
if(isNaN(model)) {
if(toLowerCase(vehicles[i][0]).indexOf(toLowerCase(model)) != -1) {
return vehicles[i][1];
}
} else {
if(vehicles[i][0] == toInteger(model)) {
return vehicles[i][1];
}
}
}
return false;
}
// ===========================================================================
function getSkinModelIndexFromParams(params, gameId = getServerGame()) {
let fromName = getSkinIndexFromName(params, gameId);
let fromModel = getSkinIndexFromModel(params, gameId);
if(fromModel && !fromName) {
return fromModel;
}
if(!fromModel && fromName) {
return fromName;
}
return false;
}
// ===========================================================================
function getSkinNameFromModel(model, gameId = getServerGame()) {
let skins = getGameData().skins[gameId];
for(let i in skins) {
if(toLowerCase(skins[i][0]).indexOf(toLowerCase(model)) != -1) {
return skins[i][1];
}
}
return false;
}
// ===========================================================================
function getSkinModelFromName(name, gameId = getServerGame()) {
let skins = getGameData().skins[gameId];
for(let i in skins) {
if(toLowerCase(skins[i][1]).indexOf(toLowerCase(name)) != -1) {
return skins[i][0];
}
}
}
// ===========================================================================
function getObjectModelIndexFromParams(params, gameId = getServerGame()) {
let fromName = getObjectModelIndexFromName(params, gameId);
let fromModel = getObjectModelIndexFromModel(params, gameId);
if(fromModel && !fromName) {
return fromModel;
}
if(!fromModel && fromName) {
return fromName;
}
return false;
}
// ===========================================================================
function getObjectNameFromModel(model, gameId = getServerGame()) {
let objects = getGameData().objects[gameId];
for(let i in objects) {
if(toLowerCase(objects[i][0]).indexOf(toLowerCase(model)) != -1) {
return objects[i][1];
}
}
return false;
}
// ===========================================================================
function getObjectModelFromName(name, gameId = getServerGame()) {
let objects = getGameData().objects[gameId];
for(let i in objects) {
if(toLowerCase(objects[i][1]).indexOf(toLowerCase(name)) != -1) {
return objects[i][0];
}
}
}
// ===========================================================================
// ===========================================================================
function getPosToRightOfPos(pos, angle, distance) {
let x = (pos.x+((Math.cos((-angle+1.57)+(Math.PI/2)))*distance));
let y = (pos.y+((Math.sin((-angle+1.57)+(Math.PI/2)))*distance));
let rightPos = toVector3(x, y, pos.z);
return rightPos;
}
// ===========================================================================
function getPosToLeftOfPos(pos, angle, distance) {
let x = (pos.x+((Math.cos((angle+1.57)+(Math.PI/2)))*distance));
let y = (pos.y+((Math.sin((angle+1.57)+(Math.PI/2)))*distance));
let leftPos = toVector3(x, y, pos.z);
return leftPos;
}
// ===========================================================================
function getPosInFrontOfPos(pos, angle, distance) {
let x = pos.x;
let y = pos.y;
let z = pos.z;
if(getGame() < VRR_GAME_MAFIA_ONE) {
y = (pos.y+((Math.sin(angle+(Math.PI/2)))*distance));
} else {
angle = radToDeg(angle);
z = (pos.z+((Math.sin(angle+(Math.PI/2)))*distance));
}
x = (pos.x+((Math.cos(angle+(Math.PI/2)))*distance));
return toVector3(x, y, z);
}
// ===========================================================================
function getPosBehindPos(pos, angle, distance) {
let x = pos.x;
let y = pos.y;
let z = pos.z;
if(getGame() < VRR_GAME_MAFIA_ONE) {
y = (pos.y+((Math.sin(angle-(Math.PI/2)))*distance));
} else {
angle = radToDeg(angle);
z = (pos.z+((Math.sin(angle-(Math.PI/2)))*distance));
}
x = (pos.x+((Math.cos(angle-(Math.PI/2)))*distance));
return toVector3(x, y, z);
}
// ===========================================================================
function getPosAbovePos(pos, distance) {
return toVector3(pos.x, pos.y, pos.z+distance);
}
// ===========================================================================
function getPosBelowPos(pos, distance) {
return toVector3(pos.x, pos.y, pos.z-distance);
}
// ===========================================================================
function applyOffsetToPos(position, position2) {
return toVector3(position.x+position2.x, position.y+position2.y, position.z+position2.z);
}
// ===========================================================================
function getRandom(min, max) {
return Math.floor(Math.random() * (toInteger(max) - toInteger(min) + 1)) + toInteger(min)
}
// =========================================================================== // ===========================================================================