Too much for individual commits

This commit is contained in:
Vortrex
2021-01-05 20:14:15 -06:00
parent 0bc357a662
commit 3ef9e554cc
28 changed files with 834 additions and 384 deletions

137
IDEAS.md
View File

@@ -15,16 +15,16 @@ NOTICE: Most of these ideas are totally random and some might be unrealistic. Ev
* Garages
* Casinos
* Interactive peds with each one having a background story, characteristics, certain people or groups they like/dislike.
* Interactive peds with each one having a background story, characteristics, certain people or groups they like/dislike.
* Procedurally generated?
* Nightclubs, bars, etc can employ "bouncer" peds that either prevent entry to certain people, or kick people out.
* Background ambience.
* Background ambience.
* Anonymous city traffic and pedestrians
* They come and go and aren't persistent.
* Police peds/traffic will pursue if player has 1+ stars and comes within range and line of sight.
* Named NPCs
* Persistent
* Move from place to place. Eat at restaurants, drive home, to work, get drunk at a bar, etc.
@@ -35,7 +35,7 @@ NOTICE: Most of these ideas are totally random and some might be unrealistic. Ev
* Vehicles catch on fire instead of blowing up.
* Random property fires can occur.
* Firetrucks can "spray" a fire, lowering the damage until it is extinguished (Aim detection).
* Streetsweeper Job
* Instead of checkpoints, show actual messes on the road.
* Drive over the messes with the right vehicle to "clean" the mess.
@@ -46,90 +46,90 @@ NOTICE: Most of these ideas are totally random and some might be unrealistic. Ev
* Allow the trashtruck drivers to "pickup" the trashbag, then "place" into the truck.
* If the truck is full, deliver the trashbags to the dump.
* Only show trashbags if at least one player is currently doing the job.
* Mailman Job
* Use a white solid van (Pony maybe) as a mail van.
* Load mail at the post office, and drive a specific route to "deliver" mail.
* Return the truck for payment.
* Vehicle Towing
* Use a Yankee or something to store the vehicle "inside" (just make the car disappear) until better sync options are built.
* Universal command to tow/release a vehicle ( /tow ).
* Attach to nearest vehicle.
* Item System
* Several item types, including armour, skins, weapons, drugs, materials, and more.
* Items can be dropped and picked up.
* Items can be stored in a vehicle trunk or dash compartment.
* Items can be given, taken, or used.
* Payphones
* Make built in payphones usable (detect position, ring sound, etc)
* Payphones can be called, making them ring to nearby players.
* Multiple bed hospital.
* When one is taken, use the next one.
* If all are full, have a waiting list.
* Multiple bed hospital.
* When one is taken, use the next one.
* If all are full, have a waiting list.
* Allow people to go in and lay on a bed to heal (or use a check-in system)
* Several NPC's
* Paramedics/Doctors at hospitals,
* Paramedics/Doctors at hospitals,
* LC/VC/LS/SF/LV police dept desk clerk and dispatcher.
* Jail guard
* Interactive. Go up and talk to them for responses etc
* Use permissions/flag system for everything.
* Use permissions/flag system for everything.
* Admin abilities
* Moderation (muted/frozen/etc)
* LEO abilities
* Clan abilities
* Account Settings
* etc
* Interiors
* For games with interiors, properties inside of properties (possibly make it a sub-property, but using a "type" to define it. May not be necessary) AKA a business inside a business (illegal back room gambling, anyone?)
* Stealable skins. When one is stolen, it is replaced by the thief's skin
* Black market for anything.
* Black market for anything.
* Smuggled drugs
* LEO items
* Weapons and weapon upgrades
* Illegal vehicle upgrades like NOS.
* Drug houses and weed farms.
* Make weed only plantable in certain areas.
* Drug houses and weed farms.
* Make weed only plantable in certain areas.
* Drug houses aren't limited to the type of house, as anybody can deal or use in any place.
* Size-based inventories.
* Size-based inventories.
* Items should have a size and inventories can only hold so much.
* Items inside of items. This could be (but not limited to):
* Items inside of items. This could be (but not limited to):
* Briefcases
* Wallets
* Safes
* Trashbags
* Boxes/crates
* Use the item sizes for storage capacity
* Weapons like DayZ.
* Multiple weapon types that issue different damages.
* Weapons like DayZ.
* Multiple weapon types that issue different damages.
* Ammo clips that only fit a compatible weapon
* Different clip types hold different amounts of ammo in them (and specific ammo types)
* Hollow point and armor piercing round types
* Modifications. Flashlight, silencer, bigger clip, tracer, scope, etc.
* Crime scene investigations.
* Crime scene investigations.
* Blood
* Fingerprints
* Ballistics/bullets on ground, in objects, walls, etc.
* Gunpowder traces
* Weapons
* Other crime scene stuff for investigation roleplay.
* Other crime scene stuff for investigation roleplay.
* These items should be visible on the ground (particle effects?)
* Can be cleaned up by anybody (including the murderer or suspects)
* Showering or swimming clears blood from body
* Rain washes away blood outside (if not under an object or bridge). Perhaps line of sight check with high up Z at same coord?
* Huge police interiors and garages.
* Multiple interrogation rooms with blocked sound (chat is localized to that room)
* Multiple offices for ranking members
@@ -138,34 +138,34 @@ NOTICE: Most of these ideas are totally random and some might be unrealistic. Ev
* Crime scene lab
* Cell block area (or multiple cell blocks)
* Elevators that can take you to multiple levels of the building (and roof/garage).
* Custom MDC.
* Custom MDC.
* Arrest logs
* Past tickets
* Officer reports
* Investigation info
* APB list
* Admin panel.
* Reports
* Multiple actions for each
* Viewing info and past reports/actions on the reporter and the situation.
* Viewing info and past reports/actions on the reporter and the situation.
* Logs
* Chat
* Action
* Weapon/Kill/Death
* Others
* Log everything possible.
* Depending on type of injuries, have multiple results occur over time.
* Gunshots lead to bleeding which could lead to passing out for loss of blood.
* Depending on type of injuries, have multiple results occur over time.
* Gunshots lead to bleeding which could lead to passing out for loss of blood.
* Post-treatment effects are also possible including siezures from blunt force trauma.
* Custom actions to have different results. Interactive-ness.
* Hotwiring a car could be successful or could also fail, depending on vehicle type and variance.
* The user has to go through each step in order to complete the task.
* Hotwiring could have things like splitting and joining wires to make the car start or the alarm stop.
* Hotwiring a car could be successful or could also fail, depending on vehicle type and variance.
* The user has to go through each step in order to complete the task.
* Hotwiring could have things like splitting and joining wires to make the car start or the alarm stop.
* Include medical procedures in this idea. Surgeries, gunshot wounds, etc
* Require certain tools to perform different actions.
* Different vehicles have different wires to use to be successful.
@@ -178,8 +178,8 @@ NOTICE: Most of these ideas are totally random and some might be unrealistic. Ev
* Trunks can hold players/peds (not visibly) and items and is size based.
* Get "inside" the back of trucks/trailers and store items inside.
* Use an interior for this and allow dropped items (including crates and boxes and etc).
* Get "inside" the back of trucks/trailers and store items inside.
* Use an interior for this and allow dropped items (including crates and boxes and etc).
* Shouts and certain speech can be heard outside wherever the truck is at.
* Vehicle sink or explode while inside the back causes death and objects destroyed.
* Also for airplane interiors
@@ -190,7 +190,7 @@ NOTICE: Most of these ideas are totally random and some might be unrealistic. Ev
* Cleaning weapons improves reliability
* Weapons have identifying parts like barrel bores (for ballistics) and serial numbers. Serial numbers can be removed.
* GUI color schemes (https://vortrex.info/f/1/4eca24d1.png) with a settings page to switch them. Orange, red, blue, purple, etc.
* Police
@@ -229,5 +229,50 @@ NOTICE: Most of these ideas are totally random and some might be unrealistic. Ev
* Speakerphone
* While on a phone call, using /speakerphone or something can allow others near the person on the phone to hear and be heard over the call.
* Player police officers can issue an APB for a player suspect. NPC police drive and walk around as normal in the game but if they spot the player suspect within a certain distance and line of sight, their position is sent to any player police officers via radio and shown as a blip on the radar. If the suspect evades the NPC police, the blip fades out at the last seen suspect location and eventually disappears, no longer available to player police officers. This means that the blip will continue to show other officers at the suspect's updated location until a) all police officers lose line of sight, b) suspect gets too far away or c) enters a house/business (losing line of sight with police unless they enter). All of these will cause the blip to show the suspects last known and seen location while the blip fades out and eventually disappears. Any officer that re-establishes line of sight within a certain distance will cause the suspect's blip to show again for all police. NPC police will NOT use the built-in wanted level system because this causes excessive spawning of police no matter where the suspect is generally completely unfair. Instead, scripting functions like ped.runTo, vehicle.setCarMission, vehicle.setCruiseSpeed, etc will be used to pursue the suspect. The logic in these functions is not perfect. The NPC officer can wreck the police car, get slowed down by traffic or stuck on something altogether, and the ped can be evaded by continously going around corners and such. All of this provides the ability for the suspect to have a chance of getting away. Changing skin/clothes or driving different/unknown vehicles reduces the NPC's line of sight and distance checking and thus reduces their chance of identifying them when near.
* Player police officers can issue an APB for a player suspect. NPC police drive and walk around as normal in the game but if they spot the player suspect within a certain distance and line of sight, their position is sent to any player police officers via radio and shown as a blip on the radar. If the suspect evades the NPC police, the blip fades out at the last seen suspect location and eventually disappears, no longer available to player police officers. This means that the blip will continue to show other officers at the suspect's updated location until a) all police officers lose line of sight, b) suspect gets too far away or c) enters a house/business (losing line of sight with police unless they enter). All of these will cause the blip to show the suspects last known and seen location while the blip fades out and eventually disappears. Any officer that re-establishes line of sight within a certain distance will cause the suspect's blip to show again for all police. NPC police will NOT use the built-in wanted level system because this causes excessive spawning of police no matter where the suspect is generally completely unfair. Instead, scripting functions like ped.runTo, vehicle.setCarMission, vehicle.setCruiseSpeed, etc will be used to pursue the suspect. The logic in these functions is not perfect. The NPC officer can wreck the police car, get slowed down by traffic or stuck on something altogether, and the ped can be evaded by continously going around corners and such. All of this provides the ability for the suspect to have a chance of getting away. Changing skin/clothes or driving different/unknown vehicles reduces the NPC's line of sight and distance checking and thus reduces their chance of identifying them when near.
* Casinos
* Pebble companion app
* More GUI
* Basic layouts
* List
* Columned List (Grid?)
* Single Text Input Prompt
* Complex Layouts
* Info boxes for any type of server entity
* Admin functions for each one (ban, kick, delete, set owner, etc)
* Chat log
* Lists of submitted ideas and bug reports
* Web API
* REST-like URLs
* Type shortened to database table prefix style (/acct, /veh, etc)
* Companion app for my Pebble watch (Rebble)
* Whole thing streamlined
* Server select, then use GUI colours of server
* Connected players
* Links to account/character info
* Character Info leads to owned vehicles, houses, businesses, current clan, etc
* Clan info leads to owned businesses, houses, vehicles, etc
* Business, house, vehicle info has links back to owners info pages
* Alerts for reports, submitted bugs/ideas, hacker detection
* Silent mode to block incoming alerts
* Moderation action choices.
* Players
* Kick, ban, mute, unmute, etc
* Vehicles
* Set owner (select job, public, biz, house, player, clan, etc)
* Despawn
* Delete
* Business/House
* Set owner (select job, public, biz, house, player, clan, etc)
* Lock/unlock
* Delete
* Server
* Config options
* Shutdown, restart, gmx, etc
* Alert (probably pre-made messages, configurable in pebble app)

View File

@@ -8,7 +8,7 @@
// TYPE: Client (JavaScript)
// ===========================================================================
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addEventHandler("OnLostFocus", function(event) {
triggerNetworkEvent("ag.afk", true);
@@ -19,7 +19,7 @@ addEventHandler("OnLostFocus", function(event) {
}
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addEventHandler("OnFocus", function(event) {
triggerNetworkEvent("ag.afk", false);
@@ -32,4 +32,4 @@ addEventHandler("OnFocus", function(event) {
}
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------

View File

@@ -37,7 +37,7 @@ let login = {
let twoFactorAuth = {
window: null,
logoImage: null,
qrCodeHTML: null,
qrCode: null,
messageLabel: null,
codeLabel: null,
codeInput: null,
@@ -1160,7 +1160,7 @@ app.init = function()
console.log(`[Asshat.GUI] Created login GUI`);
// ---------------------------------------------------------------------------------
// ------------------------------------------------------------------------------
console.log(`[Asshat.GUI] Creating two factor auth GUI ...`);
twoFactorAuth.window = mexui.window(game.width/2-150, game.height/2-129, 300, 258, 'LOGIN', {
@@ -1183,13 +1183,13 @@ app.init = function()
twoFactorAuth.window.titleBarIconSize = toVector2(0,0);
twoFactorAuth.window.titleBarHeight = 0;
twoFactorAuth.logoImage = twoFactorAuth.window.image(100, 20, 100, 100, mainLogoPath, {
twoFactorAuth.qrCode = twoFactorAuth.window.image(100, 20, 100, 100, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
twoFactorAuth.messageLabel = twoFactorAuth.window.text(20, 135, 260, 20, 'Please enter the code from your authenticator app!', {
twoFactorAuth.codeLabel = twoFactorAuth.window.text(20, 135, 260, 20, 'Please enter the code from your authenticator app!', {
main: {
textSize: 10.0,
textAlign: 0.5,
@@ -1201,7 +1201,7 @@ app.init = function()
},
});
twoFactorAuth.passwordInput = twoFactorAuth.window.textInput(20, 170, 260, 25, '', {
twoFactorAuth.codeInput = twoFactorAuth.window.textInput(20, 170, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], textInputAlpha),
@@ -1238,7 +1238,7 @@ app.init = function()
console.log(`[Asshat.GUI] Created two factor auth GUI`);
// ---------------------------------------------------------------------------------
// ------------------------------------------------------------------------------
console.log(`[Asshat.GUI] Creating new character GUI ...`);
@@ -1445,7 +1445,7 @@ app.init = function()
console.log(`[Asshat.GUI] Created new character GUI`);
// ---------------------------------------------------------------------------------
// ------------------------------------------------------------------------------
console.log(`[Asshat.GUI] Creating register GUI ...`);
@@ -1560,7 +1560,7 @@ app.init = function()
console.log(`[Asshat.GUI] Created register GUI`);
// ---------------------------------------------------------------------------------
// ------------------------------------------------------------------------------
console.log(`[Asshat.GUI] Creating error GUI ...`);
@@ -1602,7 +1602,7 @@ app.init = function()
console.log(`[Asshat.GUI] Created error GUI ...`);
// ---------------------------------------------------------------------------------
// ------------------------------------------------------------------------------
console.log(`[Asshat.GUI] Created prompt GUI ...`);
@@ -1654,7 +1654,7 @@ app.init = function()
console.log(`[Asshat.GUI] Created prompt GUI`);
// ---------------------------------------------------------------------------------
// ------------------------------------------------------------------------------
console.log(`[Asshat.GUI] Creating info dialog GUI ...`);
@@ -1695,7 +1695,7 @@ app.init = function()
console.log(`[Asshat.GUI] Created info dialog GUI`);
// ---------------------------------------------------------------------------------
// ------------------------------------------------------------------------------
console.log(`[Asshat.GUI] Creating character select GUI ...`);

View File

@@ -11,7 +11,7 @@
let lastKeyBindUse = 0;
let keyBindDelayTime = 2000;
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function bindAccountKey(key, keyState) {
bindKey(toInteger(key), keyState, function(event) {
@@ -24,7 +24,7 @@ function bindAccountKey(key, keyState) {
}
addNetworkHandler("ag.keybinds.add", bindAccountKey);
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function unBindAccountKey(key) {
unbindKey(key);
@@ -32,7 +32,7 @@ function unBindAccountKey(key) {
}
addNetworkHandler("ag.keybinds.del", unBindAccountKey);
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function hasKeyBindDelayElapsed() {
if(sdl.ticks-lastKeyBindUse >= keyBindDelayTime) {
@@ -42,4 +42,4 @@ function hasKeyBindDelayElapsed() {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------

View File

@@ -25,7 +25,7 @@ let unlockedColour = toColour(50, 205, 50, 255);
let lockedColour = toColour(205, 92, 92, 255);
let jobHelpColour = toColour(234, 198, 126, 255);
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
bindEventHandler("onResourceReady", thisResource, function(event, resource) {
propertyLabelNameFont = lucasFont.createDefaultFont(16.0, "Roboto", "Regular");
@@ -35,7 +35,7 @@ bindEventHandler("onResourceReady", thisResource, function(event, resource) {
jobHelpLabelFont = lucasFont.createDefaultFont(10.0, "Roboto", "Light");
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function renderPropertyEntranceLabel(name, position, locked, isBusiness, price) {
if(localPlayer == null) {
@@ -82,7 +82,7 @@ function renderPropertyEntranceLabel(name, position, locked, isBusiness, price)
propertyLabelNameFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelNameFont.size, (isBusiness) ? toColour(0, 153, 255, 255) : toColour(17, 204, 17, 255), false, true, false, true);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function renderPropertyExitLabel(position) {
if(localPlayer == null) {
@@ -110,7 +110,7 @@ function renderPropertyExitLabel(position) {
propertyLabelNameFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelNameFont.size, COLOUR_WHITE, false, true, false, true);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function renderJobLabel(name, position, jobType) {
if(localPlayer == null) {
@@ -158,7 +158,7 @@ function renderJobLabel(name, position, jobType) {
jobNameLabelFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, jobNameLabelFont.size, COLOUR_WHITE, false, true, false, true);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addEventHandler("OnDrawnHUD", function (event) {
if(!renderHUD) {
@@ -208,4 +208,4 @@ addEventHandler("OnDrawnHUD", function (event) {
}
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------

View File

@@ -143,7 +143,7 @@ addNetworkHandler("ag.runCode", function(code, returnTo) {
triggerNetworkEvent("ag.runCodeSuccess", returnTo, code, returnValue);
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function enterVehicleAsPassenger() {
if(localPlayer.vehicle == null) {
@@ -154,13 +154,13 @@ function enterVehicleAsPassenger() {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getClosestVehicle(pos) {
return getVehicles().reduce((i, j) => (i.position.distance(pos) < j.position.distance(pos)) ? i : j);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addNetworkHandler("ag.clearWeapons", function() {
console.log(`[Asshat.Main] Clearing weapons`);

View File

@@ -20,7 +20,7 @@ let playerColours = {};
let playerPaused = {};
let playerPing = {};
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addEventHandler("OnResourceReady", function(event, resource) {
if (resource == thisResource) {
@@ -29,7 +29,7 @@ addEventHandler("OnResourceReady", function(event, resource) {
}
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addNetworkHandler("ag.nametag", function(clientName, characterName, colour, paused, ping) {
playerNames[clientName] = characterName;
@@ -38,13 +38,13 @@ addNetworkHandler("ag.nametag", function(clientName, characterName, colour, paus
playerPing[clientName] = ping;
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addNetworkHandler("ag.ping", function(clientName, ping) {
playerPing[clientName] = ping;
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function drawNametag(x, y, health, armour, text, ping, alpha, distance, colour, afk, skin) {
if(nametagFont == null) {
@@ -113,7 +113,7 @@ function drawNametag(x, y, health, armour, text, ping, alpha, distance, colour,
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function updateNametags(element) {
if(localPlayer != null) {
@@ -166,7 +166,7 @@ function updateNametags(element) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getClientFromPlayer(player) {
getClients().forEach(function(client) {
@@ -176,7 +176,7 @@ function getClientFromPlayer(player) {
});
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addEventHandler("OnDrawnHUD", function(event) {
if(gta.game >= GAME_GTA_IV) {
@@ -190,10 +190,10 @@ addEventHandler("OnDrawnHUD", function(event) {
});
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function createColour(alpha, red, green, blue) {
return alpha << 24 | red << 16 | green << 8 | blue;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------

View File

@@ -13,14 +13,14 @@ let listFont = null;
let pausedColour = COLOUR_RED;
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
bindEventHandler("OnResourceReady", thisResource, function(event, resource) {
titleFont = lucasFont.createDefaultFont(22.0, "Roboto", "Regular");
listFont = lucasFont.createDefaultFont(12.0, "Roboto", "Light");
});
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
addEventHandler("OnDrawnHUD", function (event) {
if(!renderHUD) {

View File

@@ -764,12 +764,11 @@ function initClient(client) {
let tempAccountData = loadAccountFromName(client.name, true);
let tempSubAccounts = loadSubAccountsFromAccount(tempAccountData.databaseId);
getServerData().clients[client.index] = new serverClasses.clientData(client, tempAccountData, tempSubAccounts);
let sessionId = saveConnectionToDatabase(client);
getServerData().clients[client.index].session = sessionId;
getServerData().clients[client.index].connectTime = Math.ceil(sdl.ticks);
if(tempAccountData != false) {
if(isAccountAutoIPLoginEnabled(tempAccountData) && getPlayerData(client).accountData.ipAddress == client.ip) {

View File

@@ -9,7 +9,9 @@
// ===========================================================================
function initAntiCheatScript() {
console.log("[Asshat.AntiCheat]: Initializing anticheat script ...");
console.log("[Asshat.AntiCheat]: Initializing anticheat script ...");
getServerData().antiCheat.whiteListedGameScripts = loadAntiCheatGameScriptWhiteListFromDatabase();
getServerData().antiCheat.blackListedGameScripts = loadAntiCheatGameScriptBlackListFromDatabase();
console.log("[Asshat.AntiCheat]: Anticheat script initialized!");
}
// ---------------------------------------------------------------------------
@@ -26,7 +28,6 @@ function loadAntiCheatGameScriptWhiteListFromDatabase() {
if(dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempWhiteListedGameScriptData = new serverClasses.whiteListedGameScriptData(dbAssoc);
tempWhiteListedGameScripts.push(tempWhiteListedGameScriptData);
console.log(`[Asshat.AntiCheat] Whitelisted game script '${tempWhiteListedGameScriptData.scriptName}' loaded successfully!`);
}
@@ -51,7 +52,6 @@ function loadAntiCheatGameScriptBlackListFromDatabase() {
if(dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempBlackListedGameScriptData = new serverClasses.blackListedGameScriptData(dbAssoc);
tempBlackListedGameScripts.push(tempBlackListedGameScriptData);
console.log(`[Asshat.AntiCheat] Blacklisted game script '${tempBlackListedGameScriptData.scriptName}' loaded successfully!`);
}

View File

@@ -67,7 +67,10 @@ let serverBitFlagKeys = {
],
clanPermissionFlagKeys: [
"none",
"startTurfWar",
"startPointWar",
"inviteMember",
"suspendMember",
"removeMember",
"memberRank",
"memberFlags",
@@ -170,7 +173,7 @@ function doesPlayerHaveStaffPermission(client, requiredFlags) {
// ---------------------------------------------------------------------------
function doesClientHaveClanPermission(client, requiredFlags) {
function doesPlayerHaveClanPermission(client, requiredFlags) {
if(isConsole(client)) {
return true;
}

View File

@@ -13,7 +13,6 @@ function initBusinessScript() {
getServerData().businesses = loadBusinessesFromDatabase();
createAllBusinessPickups();
createAllBusinessBlips();
setAllBusinessIndexes();
console.log("[Asshat.Business]: Business script initialized successfully!");
return true;
@@ -549,6 +548,45 @@ function depositIntoBusinessCommand(command, params, client) {
// ---------------------------------------------------------------------------
function stockItemInBusinessCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let splitParams = params.split(" ");
let itemType = getItemTypeFromParams(splitParams[0]);
let amount = toInteger(splitParams[1]) || 1;
let sellPrice = toInteger(splitParams[2]) || 0;
let businessId = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client));
if(!getBusinessData(businessId)) {
messagePlayerError(client, "Business not found!");
return false;
}
if(!getItemTypeData(itemType)) {
messagePlayerError(client, "Invalid item type name or ID!");
messagePlayerInfo(client, "Use /itemtypes for a list of items");
return false;
}
let orderTotalCost = getItemTypeData(itemType).orderPrice*amount;
if(getBusinessData(businessId).till < orderTotalCost) {
let neededAmount = orderTotalCost-getBusinessData(businessId).till;
messagePlayerError(client, `The business doesn't have enough money (needs [#AAAAAA]$${neededAmount} [#FFFFFF]more)! Use [#AAAAAA]/bizdeposit [#FFFFFF]to add money to the business.`);
return false;
}
getBusinessData(businessId).till -= orderTotalCost;
addToBusinessInventory(businessId, itemType, amount);
messagePlayerSuccess(client, `You ordered ${amount} ${getPluralForm(getItemTypeData(itemType).name)} at $${getItemTypeData(itemType).orderPrice} each for business [#0099FF]'${getBusinessData(businessId).name} [#FFFFFF] and set their sell price [#AAAAAA]$${sellPrice}`);
}
// ---------------------------------------------------------------------------
function viewBusinessTillAmountCommand(command, params, client) {
let businessId = (isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client));
@@ -620,6 +658,30 @@ function moveBusinessExitCommand(command, params, client) {
// ---------------------------------------------------------------------------
function buySkinFromBusinessCommand(command, params, client) {
let businessId = toInteger((isPlayerInAnyBusiness(client)) ? getPlayerBusiness(client) : getClosestBusinessEntrance(getPlayerPosition(client)));
if(getBusinessData(businessId)) {
messagePlayerError(client, `You need to be in a business (or at the door if there is no interior)`);
return false;
}
if(getBusinessData(businessId).type == AG_BIZTYPE_CLOTHES) {
messagePlayerError(client, `This business doesn't sell clothes (skins)!`);
return false;
}
if(getPlayerCurrentSubAccount(client).cash <= AG_TEMPBIZPRICE_CLOTHES) {
messagePlayerError(client, `You don't have enough money! You need [#AAAAAA]$${AG_TEMPBIZPRICE_CLOTHES-getPlayerCurrentSubAccount(client).cash} [#FFFFFF]more!`);
return false;
}
setPlayerSkin(client, skinId);
messageClientSuccess(client, "You bought a new set of clothes ([#AAAAAA]skinId[#FFFFFF]!");
}
// ---------------------------------------------------------------------------
function getBusinessDataFromDatabaseId(databaseId) {
let matchingBusinesses = getServerData().businesses.filter(b => b.databaseId == businessId)
if(matchingBusinesses.length == 1) {
@@ -632,9 +694,8 @@ function getBusinessDataFromDatabaseId(databaseId) {
function getClosestBusinessEntrance(position) {
let closest = 0;
let businesses = getServerData().businesses;
for(let i in businesses) {
if(getDistance(position, businesses[i].entrancePosition) <= getDistance(position, businesses[closest].entrancePosition)) {
for(let i in getServerData().businesses) {
if(getDistance(position, getServerData().businesses[i].entrancePosition) <= getDistance(position, getServerData().businesses[closest].entrancePosition)) {
closest = i;
}
}
@@ -975,3 +1036,21 @@ function setAllBusinessIndexes() {
}
// ---------------------------------------------------------------------------
function addToBusinessInventory(businessId, itemType, amount, buyPrice) {
let tempItemData = new serverClasses.itemData(false);
tempItemData.amount = amount;
tempItemData.buyPrice = buyPrice;
tempItemData.itemType = getItemTypeData(itemType);
tempItemData.ownerId = getBusinessData(business).databaseId;
tempItemData.ownerType = AG_ITEMOWNER_BIZ;
tempItemData.ownerIndex = businessId;
tempItemData.itemTypeIndex = itemType;
saveItemToDatabase(tempItemData);
getServerData().items.push(tempItemData);
let index = getServerData().items.length-1;
getServerData().items[index].index = index;
}
// ---------------------------------------------------------------------------

View File

@@ -11,6 +11,7 @@
function initClanScript() {
console.log("[Asshat.Clan]: Initializing clans script ...");
getServerData().clans = loadClansFromDatabase();
setAllClanDataIndexes();
console.log("[Asshat.Clan]: Clan script initialized successfully!");
return true;
}
@@ -45,7 +46,7 @@ function loadClansFromDatabase() {
return tempClans;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function createClanCommand(command, params, client) {
if(areParamsEmpty(params)) {
@@ -60,10 +61,10 @@ function createClanCommand(command, params, client) {
// Create clan without owner. Can set owner with /clanowner afterward
createClan(params);
messagePlayerSuccess(client, `The [#FF9900]${params} [#FFFFFF]clan has been created!`);
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]created clan[#FF9900]${params}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function deleteClanCommand(command, params, client) {
if(areParamsEmpty(params)) {
@@ -78,14 +79,14 @@ function deleteClanCommand(command, params, client) {
return false;
}
messagePlayerSuccess(client, `The [#FF9900]${getClanData(clanId).name} [#FFFFFF]clan has been deleted!`);
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]deleted clan[#FF9900]${getClanData(clanId).name}`);
deleteClan(clanId);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanOwnerCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("owner"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("owner"))) {
messagePlayerError(client, "You must be the clan owner to use this command!");
return false;
}
@@ -94,12 +95,31 @@ function setClanOwnerCommand(command, params, client) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let splitParams = params.split(" ");
let clanId = getClanFromParams(splitParams[0]);
let targetClient = getPlayerFromParams(splitParams[1]);
if(!targetClient) {
messagePlayerError(client, "Player not found!");
return false;
}
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
return false;
}
getClanData(clanId).owner = getPlayerCurrentSubAccount(targetClient).databaseId;
getPlayerCurrentSubAccount(targetClient).clanFlags = getClanFlagValue("all");
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set clan[#FF9900]${getClanData(clanId).name} [#FFFFFF]owner to [#AAAAAA]${getCharacterFullName(targetClient)}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanTagCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("clanTag"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("clanTag"))) {
messagePlayerError(client, "You can not change the clan tag!");
return false;
}
@@ -108,12 +128,23 @@ function setClanTagCommand(command, params, client) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
return false;
}
getClanData(clanId).params = params;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set clan[#FF9900]${getClanData(clanId).index} [#FFFFFF]tag to [#AAAAAA]${params}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanNameCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("clanName"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("clanName"))) {
messagePlayerError(client, "You can not change the clan name!");
return false;
}
@@ -122,12 +153,23 @@ function setClanNameCommand(command, params, client) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let clanId = getPlayerClan(client);
if(!getClanData(clanId)) {
messagePlayerError(client, "Clan not found!");
return false;
}
getClanData(clanId).name = params;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]set clan[#FF9900]${getClanData(clanId).index} [#FFFFFF]name to [#AAAAAA]${params}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanMemberTagCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("memberTag"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("memberTag"))) {
messagePlayerError(client, "You can not change a clan member's tag!");
return false;
}
@@ -136,12 +178,31 @@ function setClanMemberTagCommand(command, params, client) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let tag = splitParams[1] || "";
if(!targetClient) {
messagePlayerError(client, "Player not found!");
return false;
}
if(!arePlayersInSameClan(client, targetClient) && !doesPlayerHaveStaffPermission(client, getStaffFlagValue("manageClans"))) {
messagePlayerError(client, `${getCharacterFullName(targetClient)} is not in your clan!`);
return false;
}
getPlayerCurrentSubAccount(targetClient).clanTag = tag;
messagePlayerSuccess(client, `You set [#AAAAAA]${getCharacterFullName(targetClient)}'s [#FFFFFF]clan tag to [#AAAAAA]${tag}`);
messagePlayerAlert(client, `[#AAAAAA]${getCharacterFullName(targetClient)} [#FFFFFF]set your clan tag to [#AAAAAA]${tag}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanRankTagCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("rankTag"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("rankTag"))) {
messagePlayerError(client, "You can not change a clan ranks's tag!");
return false;
}
@@ -168,10 +229,10 @@ function setClanRankTagCommand(command, params, client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function addClanMemberFlagCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("memberFlags"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("memberFlags"))) {
messagePlayerError(client, "You can not change a clan member's permissions!");
return false;
}
@@ -205,10 +266,10 @@ function addClanMemberFlagCommand(command, params, client) {
messagePlayerSuccess(client, `You added the [#AAAAAA]${splitParams[1]} [#FFFFFF]clan flag to [#AAAAAA]${getCharacterFullName(client)}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function removeClanMemberFlagCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("memberFlags"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("memberFlags"))) {
messagePlayerError(client, "You can not change a clan member's permissions!");
return false;
}
@@ -242,10 +303,10 @@ function removeClanMemberFlagCommand(command, params, client) {
messagePlayerSuccess(client, `You removed the [#AAAAAA]${splitParams[1]} [#FFFFFF]clan flag from [#AAAAAA]${getCharacterFullName(client)}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function addClanRankFlagCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("rankFlags"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("rankFlags"))) {
messagePlayerError(client, "You can not change a clan rank's permissions!");
return false;
}
@@ -280,10 +341,10 @@ function addClanRankFlagCommand(command, params, client) {
messagePlayerSuccess(client, `You added the [#AAAAAA]${splitParams[1]} [#FFFFFF]clan flag to rank [#AAAAAA]${getClanRankData(clanId, rankId).name}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function removeClanRankFlagCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("rankFlags"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("rankFlags"))) {
messagePlayerError(client, "You can not change a clan rank's permissions!");
return false;
}
@@ -318,10 +379,10 @@ function removeClanRankFlagCommand(command, params, client) {
messagePlayerSuccess(client, `You removed the [#AAAAAA]${splitParams[1]} [#FFFFFF]clan flag from rank [#AAAAAA]${getClanRankData(clanId, rankId).name}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanMemberTitleCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("memberTitle"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("memberTitle"))) {
messagePlayerError(client, "You can not change a clan member's title!");
return false;
}
@@ -350,10 +411,10 @@ function setClanMemberTitleCommand(command, params, client) {
messagePlayerSuccess(client, `You changed the name of [#AAAAAA]${getCharacterFullName(client)} [#FFFFFF]from [#AAAAAA]${oldMemberTitle} [#FFFFFF]to [#AAAAAA]${params}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanRankTitleCommand(command, params, client) {
if(!doesClientHaveClanPermission(client, getClanFlagValue("rankTitle"))) {
if(!doesPlayerHaveClanPermission(client, getClanFlagValue("rankTitle"))) {
messagePlayerError(client, "You can not change your clan's rank titles!");
return false;
}
@@ -382,7 +443,7 @@ function setClanRankTitleCommand(command, params, client) {
messagePlayerSuccess(client, `You changed the name of rank ${rankId} from [#AAAAAA]${oldRankName} [#FFFFFF]to [#AAAAAA]${params}`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function createClan(name) {
let dbConnection = connectToDatabase();
@@ -402,7 +463,7 @@ function createClan(name) {
return true;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function deleteClan(clanId) {
saveClansToDatabase();
@@ -420,7 +481,7 @@ function deleteClan(clanId) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getClanData(clanId) {
let clans = getServerData().clans;
@@ -433,7 +494,7 @@ function getClanData(clanId) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function doesClanNameExist(name) {
let clans = getServerData().clans;
@@ -446,7 +507,7 @@ function doesClanNameExist(name) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function doesClanIdExist(clanId) {
let clans = getServerData().clans;
@@ -459,13 +520,13 @@ function doesClanIdExist(clanId) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function reloadAllClans() {
getServerData().clans = loadClansFromDatabase();
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function saveClansToDatabase() {
let clans = getServerData().clans;
@@ -474,7 +535,7 @@ function saveClansToDatabase() {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function saveClanToDatabase(clanData) {
let dbConnection = connectToDatabase();
@@ -489,58 +550,88 @@ function saveClanToDatabase(clanData) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanTag(clanId, tag) {
getClanData(clanId).tag = tag;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanOwner(clanId, ownerId) {
getClanData(clanId).ownerId = ownerId;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanMemberTag(memberId, tag) {
// finish this later, need to query db
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanMemberFlags(memberId, flags) {
// finish this later, need to query db
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanMemberTitle(memberId, title) {
// finish this later, need to query db
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanRankTag(clanId, rankId, tag) {
getClanRankData(clanId, rankId).tag = tag;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanRankFlags(clanId, rankId, flags) {
getClanRankData(clanId, rankId).flags = flags;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setClanRankTitle(clanId, rankId, title) {
getClanRankData(clanId, rankId).title = title;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function saveAllClansToDatabase() {
for(let i in getServerData().clans) {
saveClanToDatabase(getServerData().clans[i]);
}
}
// ---------------------------------------------------------------------------
function setAllClanDataIndexes() {
for(let i in getServerData().clans) {
getServerData().clans[i].index = i;
for(let j in getServerData().clans[i].ranks) {
getServerData().clans[i].ranks[j].index = j;
getServerData().clans[i].ranks[j].clanIndex = i;
}
for(let k in getServerData().clans[i].members) {
getServerData().clans[i].members[k].index = k;
getServerData().clans[i].members[k].clanIndex = i;
}
}
}
// ---------------------------------------------------------------------------
function arePlayersInSameClan(client1, client2) {
if(getPlayerClan(client1) == getPlayerClan(client2)) {
return true;
}
return false;
}
// ---------------------------------------------------------------------------

View File

@@ -97,6 +97,8 @@ function initClassTable() {
this.currentSubAccount = -1;
this.loggedIn = false;
this.index = -1;
this.connectTime = 0;
this.clientVersion = "0.0.0";
this.busRoute = null;
this.busRouteStop = null;
@@ -120,7 +122,7 @@ function initClassTable() {
}
},
accountData: class {
constructor(accountAssoc) {
constructor(dbAssoc) {
this.databaseId = 0;
this.name = "";
this.password = "";
@@ -144,22 +146,22 @@ function initClassTable() {
this.subAccounts = [];
this.loggedIn = false;
if(accountAssoc) {
this.databaseId = accountAssoc["acct_id"];
this.name = accountAssoc["acct_name"];
this.password = accountAssoc["acct_pass"];
this.registerDate = accountAssoc["acct_when_made"];
if(dbAssoc) {
this.databaseId = dbAssoc["acct_id"];
this.name = dbAssoc["acct_name"];
this.password = dbAssoc["acct_pass"];
this.registerDate = dbAssoc["acct_when_made"];
this.flags = {
moderation: accountAssoc["acct_mod_flags"],
settings: accountAssoc["acct_settings"],
admin: accountAssoc["acct_staff_flags"],
moderation: dbAssoc["acct_mod_flags"],
settings: dbAssoc["acct_settings"],
admin: dbAssoc["acct_staff_flags"],
};
this.staffTitle = accountAssoc["acct_staff_title"];
this.ircAccount = accountAssoc["acct_irc"] || "None";
this.discordAccount = accountAssoc["acct_discord"];
this.settings = accountAssoc["acct_settings"];
this.emailAddress = accountAssoc["acct_email"];
this.ipAddress = accountAssoc["ipstring"];
this.staffTitle = dbAssoc["acct_staff_title"];
this.ircAccount = dbAssoc["acct_irc"] || "None";
this.discordAccount = dbAssoc["acct_discord"];
this.settings = dbAssoc["acct_settings"];
this.emailAddress = dbAssoc["acct_email"];
this.ipAddress = dbAssoc["ipstring"];
this.notes = [];
this.messages = [];
@@ -171,53 +173,72 @@ function initClassTable() {
}
},
accountContactData: class {
constructor(accountContactAssoc) {
if(!accountContactAssoc) {
return;
}
constructor(dbAssoc) {
this.databaseId = 0;
this.accountId = 0;
this.contactAccountId = 0;
this.type = 0;
this.whenAdded = 0;
this.databaseId = accountContactAssoc["acct_contact_id"];
this.accountId = accountContactAssoc["acct_contact_acct"];
this.contactAccountId = accountContactAssoc["acct_contact_contact"];
this.type = accountContactAssoc["acct_contact_type"];
this.whenAdded = accountContactAssoc["acct_contact_when_added"];
if(dbAssoc) {
this.databaseId = dbAssoc["acct_contact_id"];
this.accountId = dbAssoc["acct_contact_acct"];
this.contactAccountId = dbAssoc["acct_contact_contact"];
this.type = dbAssoc["acct_contact_type"];
this.whenAdded = dbAssoc["acct_contact_when_added"];
}
}
},
accountMessageData: class {
constructor(accountMessageAssoc) {
if(!accountMessageAssoc) {
return;
}
constructor(dbAssoc) {
this.databaseId = 0;
this.account = 0;
this.whoSent = 0;
this.whenSent = 0;
this.whenRead = 0;
this.deleted = false;
this.whenDeleted = 0;
this.folder = 0;
this.message = "";
this.databaseId = accountMessageAssoc["acct_msg_id"];
this.account = accountMessageAssoc["acct_msg_acct"];
this.whoSent = accountMessageAssoc["acct_msg_who_sent"];
this.whenSent = accountMessageAssoc["acct_msg_when_sent"];
this.whenRead = accountMessageAssoc["acct_msg_when_read"];
this.deleted = intToBool(accountMessageAssoc["acct_msg_deleted"]);
this.whenDeleted = accountMessageAssoc["acct_msg_when_deleted"];
this.folder = accountMessageAssoc["acct_msg_folder"];
this.message = accountMessageAssoc["acct_msg_message"];
if(dbAssoc) {
this.databaseId = dbAssoc["acct_msg_id"];
this.account = dbAssoc["acct_msg_acct"];
this.whoSent = dbAssoc["acct_msg_who_sent"];
this.whenSent = dbAssoc["acct_msg_when_sent"];
this.whenRead = dbAssoc["acct_msg_when_read"];
this.deleted = intToBool(dbAssoc["acct_msg_deleted"]);
this.whenDeleted = dbAssoc["acct_msg_when_deleted"];
this.folder = dbAssoc["acct_msg_folder"];
this.message = dbAssoc["acct_msg_message"];
}
}
},
accountStaffNoteData: class {
constructor(accountStaffNoteAssoc) {
if(!accountStaffNoteAssoc) {
return;
}
constructor(dbAssoc) {
this.databaseId = 0;
this.account = 0;
this.whoAdded = 0;
this.whenAdded = 0;
this.deleted = false;
this.whenDeleted = 0;
this.server = 0;
this.note = "";
this.databaseId = accountStaffNoteAssoc["acct_note_id"];
this.account = accountStaffNoteAssoc["acct_note_acct"];
this.whoAdded = accountStaffNoteAssoc["acct_note_who_added"];
this.whenAdded = accountStaffNoteAssoc["acct_note_when_added"];
this.deleted = intToBool(accountMessageAssoc["acct_note_deleted"]);
this.whenDeleted = accountMessageAssoc["acct_note_when_deleted"];
this.server = accountMessageAssoc["acct_note_server"];
this.note = accountMessageAssoc["acct_note_message"];
if(dbAssoc) {
this.databaseId = dbAssoc["acct_note_id"];
this.account = dbAssoc["acct_note_acct"];
this.whoAdded = dbAssoc["acct_note_who_added"];
this.whenAdded = dbAssoc["acct_note_when_added"];
this.deleted = intToBool(dbAssoc["acct_note_deleted"]);
this.whenDeleted = dbAssoc["acct_note_when_deleted"];
this.server = dbAssoc["acct_note_server"];
this.note = dbAssoc["acct_note_message"];
}
}
},
subAccountData: class {
constructor(subAccountAssoc) {
constructor(dbAssoc) {
this.databaseId = 0;
this.server = 0;
this.firstName = "John";
@@ -230,60 +251,45 @@ function initClassTable() {
this.spawnPosition = toVector3(0.0, 0.0, 0.0);
this.spawnHeading = 0.0;
this.lastLogin = 0;
this.clan = 0;
this.clanFlags = 0;
this.clanRank = 0;
this.clanTitle = 0;
this.isWorking = false;
this.jobUniform = this.skin;
this.lastJobVehicle = null;
this.job = 0;
this.weapons = [];
this.inJail = false;
this.interior = 0;
this.dimension = 0;
if(subAccountAssoc) {
this.databaseId = subAccountAssoc["sacct_id"];
this.server = subAccountAssoc["sacct_server"];
this.firstName = subAccountAssoc["sacct_name_first"];
this.lastName = subAccountAssoc["sacct_name_last"];
this.account = subAccountAssoc["sacct_acct"];
this.skin = subAccountAssoc["sacct_skin"];
this.cash = subAccountAssoc["sacct_cash"];
this.placeOfOrigin = subAccountAssoc["sacct_origin"];
this.dateOfBirth = subAccountAssoc["sacct_when_born"];
this.spawnPosition = toVector3(subAccountAssoc["sacct_pos_x"], subAccountAssoc["sacct_pos_y"], subAccountAssoc["sacct_pos_z"]);
this.spawnHeading = toFloat(subAccountAssoc["sacct_angle"]);
this.lastLogin = toInteger(subAccountAssoc["sacct_last_login"]);
this.clan = toInteger(subAccountAssoc["sacct_clan"]);
this.clanFlags = toInteger(subAccountAssoc["sacct_clan_flags"]);
this.clanRank = toInteger(subAccountAssoc["sacct_clan_rank"]);
this.clanTitle = toInteger(subAccountAssoc["sacct_clan_title"]);
this.isWorking = false;
this.jobUniform = this.skin;
this.lastJobVehicle = null;
this.job = subAccountAssoc["sacct_job"];
this.weapons = [];
this.inJail = false;
this.interior = subAccountAssoc["sacct_int"];
this.dimension = subAccountAssoc["sacct_vw"];
if(dbAssoc) {
this.databaseId = dbAssoc["sacct_id"];
this.server = dbAssoc["sacct_server"];
this.firstName = dbAssoc["sacct_name_first"];
this.lastName = dbAssoc["sacct_name_last"];
this.account = dbAssoc["sacct_acct"];
this.skin = dbAssoc["sacct_skin"];
this.cash = dbAssoc["sacct_cash"];
this.placeOfOrigin = dbAssoc["sacct_origin"];
this.dateOfBirth = dbAssoc["sacct_when_born"];
this.spawnPosition = toVector3(dbAssoc["sacct_pos_x"], dbAssoc["sacct_pos_y"], dbAssoc["sacct_pos_z"]);
this.spawnHeading = toFloat(dbAssoc["sacct_angle"]);
this.lastLogin = toInteger(dbAssoc["sacct_last_login"]);
this.clan = toInteger(dbAssoc["sacct_clan"]);
this.clanFlags = toInteger(dbAssoc["sacct_clan_flags"]);
this.clanRank = toInteger(dbAssoc["sacct_clan_rank"]);
this.clanTitle = toInteger(dbAssoc["sacct_clan_title"]);
this.job = dbAssoc["sacct_job"];
this.interior = dbAssoc["sacct_int"];
this.dimension = dbAssoc["sacct_vw"];
return;
}
}
},
businessData: class {
constructor(businessAssoc) {
constructor(dbAssoc) {
this.databaseId = 0;
this.name = "";
this.ownerType = AG_BIZOWNER_NONE;
@@ -314,31 +320,31 @@ function initClassTable() {
this.entranceFee = 0;
this.till = 0
if(businessAssoc) {
this.databaseId = toInteger(businessAssoc["biz_id"]);
this.name = toString(businessAssoc["biz_name"]);
this.ownerType = toInteger(businessAssoc["biz_owner_type"]);
this.ownerId = toInteger(businessAssoc["biz_owner_id"]);
this.buyPrice = toInteger(businessAssoc["biz_buy_price"]);
this.locked = intToBool(toInteger(businessAssoc["biz_locked"]));
this.hasInterior = intToBool(toInteger(businessAssoc["biz_has_interior"]));
if(dbAssoc) {
this.databaseId = toInteger(dbAssoc["biz_id"]);
this.name = toString(dbAssoc["biz_name"]);
this.ownerType = toInteger(dbAssoc["biz_owner_type"]);
this.ownerId = toInteger(dbAssoc["biz_owner_id"]);
this.buyPrice = toInteger(dbAssoc["biz_buy_price"]);
this.locked = intToBool(toInteger(dbAssoc["biz_locked"]));
this.hasInterior = intToBool(toInteger(dbAssoc["biz_has_interior"]));
this.entrancePosition = toVector3(toFloat(businessAssoc["biz_entrance_pos_x"]), toFloat(businessAssoc["biz_entrance_pos_y"]), toFloat(businessAssoc["biz_entrance_pos_z"]));
this.entranceRotation = toInteger(businessAssoc["biz_entrance_rot_z"]);
this.entranceInterior = toInteger(businessAssoc["biz_entrance_int"]);
this.entranceDimension = toInteger(businessAssoc["biz_entrance_vw"]);
this.entrancePickupModel = toInteger(businessAssoc["biz_entrance_pickup"]);
this.entranceBlipModel = toInteger(businessAssoc["biz_entrance_blip"]);
this.entrancePosition = toVector3(toFloat(dbAssoc["biz_entrance_pos_x"]), toFloat(dbAssoc["biz_entrance_pos_y"]), toFloat(dbAssoc["biz_entrance_pos_z"]));
this.entranceRotation = toInteger(dbAssoc["biz_entrance_rot_z"]);
this.entranceInterior = toInteger(dbAssoc["biz_entrance_int"]);
this.entranceDimension = toInteger(dbAssoc["biz_entrance_vw"]);
this.entrancePickupModel = toInteger(dbAssoc["biz_entrance_pickup"]);
this.entranceBlipModel = toInteger(dbAssoc["biz_entrance_blip"]);
this.exitPosition = toVector3(businessAssoc["biz_exit_pos_x"], businessAssoc["biz_exit_pos_y"], businessAssoc["biz_exit_pos_z"]);
this.exitRotation = toInteger(businessAssoc["biz_exit_rot_z"]);
this.exitInterior = toInteger(businessAssoc["biz_exit_int"]);
this.exitDimension = toInteger(businessAssoc["biz_exit_vw"]);
this.exitPickupModel = toInteger(businessAssoc["biz_exit_pickup"]);
this.exitBlipModel = toInteger(businessAssoc["biz_exit_blip"]);
this.exitPosition = toVector3(dbAssoc["biz_exit_pos_x"], dbAssoc["biz_exit_pos_y"], dbAssoc["biz_exit_pos_z"]);
this.exitRotation = toInteger(dbAssoc["biz_exit_rot_z"]);
this.exitInterior = toInteger(dbAssoc["biz_exit_int"]);
this.exitDimension = toInteger(dbAssoc["biz_exit_vw"]);
this.exitPickupModel = toInteger(dbAssoc["biz_exit_pickup"]);
this.exitBlipModel = toInteger(dbAssoc["biz_exit_blip"]);
this.entranceFee = toInteger(businessAssoc["biz_entrance_fee"]);
this.till = toInteger(businessAssoc["biz_till"]);
this.entranceFee = toInteger(dbAssoc["biz_entrance_fee"]);
this.till = toInteger(dbAssoc["biz_till"]);
}
}
},
@@ -363,14 +369,14 @@ function initClassTable() {
this.enabled = intToBool(toInteger(dbAssoc("biz_loc_enabled")));
this.index = -1;
this.position = toVector3(toFloat(dbAssoc("biz_loc_pos_x")), toFloat(dbAssoc("biz_loc_pos_y")), toFloat(dbAssoc("biz_loc_pos_z")));
this.position = toVector3(toFloat(dbAssoc["biz_loc_pos_x"]), toFloat(dbAssoc["biz_loc_pos_y"]), toFloat(dbAssoc["biz_loc_pos_z"]));
this.interior = toInteger(dbAssoc["biz_loc_int"]);
this.dimension = toInteger(dbAssoc["biz_loc_vw"]);
}
}
},
houseData: class {
constructor(houseAssoc) {
constructor(dbAssoc) {
this.databaseId = 0
this.description = "";
this.ownerType = AG_HOUSEOWNER_NONE;
@@ -398,36 +404,103 @@ function initClassTable() {
this.exitPickup = null;
this.exitBlip = null;
if(houseAssoc != false) {
this.databaseId = toInteger(houseAssoc["house_id"]);
this.description = toString(houseAssoc["house_description"]);
this.ownerType = toInteger(houseAssoc["house_owner_type"]);
this.ownerId = toInteger(houseAssoc["house_owner_id"]);
this.buyPrice = toInteger(houseAssoc["house_buy_price"]);
this.locked = intToBool(toInteger(houseAssoc["house_locked"]));
this.hasInterior = intToBool(toInteger(houseAssoc["house_has_interior"]));
if(dbAssoc) {
this.databaseId = toInteger(dbAssoc["house_id"]);
this.description = toString(dbAssoc["house_description"]);
this.ownerType = toInteger(dbAssoc["house_owner_type"]);
this.ownerId = toInteger(dbAssoc["house_owner_id"]);
this.buyPrice = toInteger(dbAssoc["house_buy_price"]);
this.locked = intToBool(toInteger(dbAssoc["house_locked"]));
this.hasInterior = intToBool(toInteger(dbAssoc["house_has_interior"]));
this.entrancePosition = toVector3(toFloat(houseAssoc["house_entrance_pos_x"]), toFloat(houseAssoc["house_entrance_pos_y"]), toFloat(houseAssoc["house_entrance_pos_z"]));
this.entranceRotation = toFloat(houseAssoc["house_entrance_rot_z"]);
this.entranceInterior = toInteger(houseAssoc["house_entrance_int"]);
this.entranceDimension = toInteger(houseAssoc["house_entrance_vw"]);
this.entrancePickupModel = toInteger(houseAssoc["house_entrance_pickup"]);
this.entranceBlipModel = toInteger(houseAssoc["house_entrance_blip"]);
this.entrancePosition = toVector3(toFloat(dbAssoc["house_entrance_pos_x"]), toFloat(dbAssoc["house_entrance_pos_y"]), toFloat(dbAssoc["house_entrance_pos_z"]));
this.entranceRotation = toFloat(dbAssoc["house_entrance_rot_z"]);
this.entranceInterior = toInteger(dbAssoc["house_entrance_int"]);
this.entranceDimension = toInteger(dbAssoc["house_entrance_vw"]);
this.entrancePickupModel = toInteger(dbAssoc["house_entrance_pickup"]);
this.entranceBlipModel = toInteger(dbAssoc["house_entrance_blip"]);
this.exitPosition = toVector3(toFloat(houseAssoc["house_exit_pos_x"]), toFloat(houseAssoc["house_exit_pos_y"]), toFloat(houseAssoc["house_exit_pos_z"]));
this.exitRotation = toFloat(houseAssoc["house_exit_rot_z"]);
this.exitInterior = toInteger(houseAssoc["house_exit_int"]);
this.exitDimension = toInteger(houseAssoc["house_exit_vw"]);
this.exitPickupModel = toInteger(houseAssoc["house_exit_pickup"]);
this.exitBlipModel = toInteger(houseAssoc["house_exit_blip"]);
this.exitPosition = toVector3(toFloat(dbAssoc["house_exit_pos_x"]), toFloat(dbAssoc["house_exit_pos_y"]), toFloat(dbAssoc["house_exit_pos_z"]));
this.exitRotation = toFloat(dbAssoc["house_exit_rot_z"]);
this.exitInterior = toInteger(dbAssoc["house_exit_int"]);
this.exitDimension = toInteger(dbAssoc["house_exit_vw"]);
this.exitPickupModel = toInteger(dbAssoc["house_exit_pickup"]);
this.exitBlipModel = toInteger(dbAssoc["house_exit_blip"]);
}
}
},
familyData: class {
clanData: class {
constructor(dbAssoc) {
this.databaseId = 0;
this.name = "";
this.owner = 0;
this.tag = "";
this.enabled = false;
this.index = -1;
this.colour = COLOUR_WHITE;
this.initialRank = 0;
this.members = [];
this.ranks = [];
if(dbAssoc) {
this.databaseId = toInteger(dbAssoc["clan_id"]);
this.name = dbAssoc["clan_name"];
this.owner = toInteger(dbAssoc["clan_owner"]);
this.tag = dbAssoc["clan_tag"];
this.enabled = intToBool(toInteger(dbAssoc["clan_enabled"]));
this.colour = toColour(toInteger(dbAssoc["clan_colour_r"]), toInteger(dbAssoc["clan_colour_g"]), toInteger(dbAssoc["clan_colour_b"]));
}
}
},
factionData: class {
clanRankData: class {
constructor(dbAssoc) {
this.databaseId = 0;
this.clan = 0;
this.name = "";
this.aboveRank = 0;
this.flags = 0;
this.tag = "";
this.enabled = false;
this.index = -1;
this.clanIndex = -1;
if(dbAssoc) {
this.databaseId = toInteger(dbAssoc["clan_rank_id"]);
this.clan = toInteger(dbAssoc["clan_rank_clan"]);
this.name = dbAssoc["clan_rank_name"];
this.aboveRank = toInteger(dbAssoc["clan_rank_above"]);
this.flags = toInteger(dbAssoc["clan_rank_flags"]);
this.tag = dbAssoc["clan_rank_tag"];
this.enabled = intToBool(toInteger(dbAssoc["clan_enabled"]));
this.colour = toColour(toInteger(dbAssoc["clan_colour_r"]), toInteger(dbAssoc["clan_colour_g"]), toInteger(dbAssoc["clan_colour_b"]));
}
}
},
clanMemberData: class {
constructor(dbAssoc) {
this.databaseId = 0;
this.clan = 0;
this.subAccount = 0;
this.flags = 0;
this.customTitle = "";
this.customTag = "";
this.rank = 0;
this.enabled = false;
this.index = -1;
this.clanIndex = -1;
this.rankIndex = -1;
if(dbAssoc) {
this.databaseId = toInteger(dbAssoc["clan_member_id"]);
this.subAccount = toInteger(dbAssoc["clan_member_sacct"]);
this.clan = toInteger(dbAssoc["clan_member_clan"]);
this.name = dbAssoc["clan_member_name"];
this.rank = toInteger(dbAssoc["clan_member_rank"]);
this.flags = toInteger(dbAssoc["clan_member_flags"]);
this.customTag = dbAssoc["clan_member_tag"];
this.customTitle = dbAssoc["clan_member_title"];
}
}
},
vehicleData: class {
constructor(vehicleAssoc = false, vehicle = false) {
@@ -600,6 +673,7 @@ function initClassTable() {
this.requiredRank = 0;
this.enabled = false;
this.index = -1;
this.jobIndex = -1;
if(dbAssoc) {
this.databaseId = dbAssoc["job_equip_id"];
@@ -618,6 +692,7 @@ function initClassTable() {
this.ammo = 0;
this.enabled = false;
this.index = -1;
this.jobIndex = -1;
if(dbAssoc) {
this.databaseId = dbAssoc["job_equip_wep_id"];
@@ -637,6 +712,7 @@ function initClassTable() {
this.skin = -1;
this.enabled = false;
this.index = -1;
this.jobIndex = -1;
if(dbAssoc) {
this.databaseId = dbAssoc["job_uniform_id"];
@@ -659,6 +735,7 @@ function initClassTable() {
this.interior = 0;
this.dimension = 0;
this.index = -1;
this.jobIndex = -1;
if(dbAssoc) {
this.databaseId = dbAssoc["job_loc_id"];
@@ -679,6 +756,8 @@ function initClassTable() {
this.subAccount = 0
this.enabled = false;
this.index = -1;
this.jobIndex = -1;
this.jobIndex = -1;
if(dbAssoc) {
this.databaseId = dbAssoc["job_wl_id"];
@@ -695,6 +774,7 @@ function initClassTable() {
this.subAccount = 0
this.enabled = false;
this.index = -1;
this.jobIndex = -1;
if(dbAssoc) {
this.databaseId = dbAssoc["job_bl_id"];

View File

@@ -174,4 +174,10 @@ function updatePlayerShowLogoState(client, state) {
triggerNetworkEvent("ag.logo", client, state);
}
// ---------------------------------------------------------------------------
function restorePlayerCamera(client) {
triggerNetworkEvent("ag.restoreCamera", client);
}
// ---------------------------------------------------------------------------

View File

@@ -52,19 +52,19 @@ let serverColours = {
}
};
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getServerColours() {
return serverColours;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getColourByType(typeName) {
return getServerColours().byType[typeName];
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getColourByName(colourName) {
return getServerColours().byName[colourName];

View File

@@ -67,6 +67,9 @@ function loadCommands() {
commandData("biztill", viewBusinessTillAmountCommand, "", getStaffFlagValue("none"), true, true),
commandData("bizwithdraw", withdrawFromBusinessCommand, "<amount>", getStaffFlagValue("none"), true, true),
commandData("bizdeposit", depositIntoBusinessCommand, "<amount>", getStaffFlagValue("none"), true, true),
commandData("buy", buyFromBusinessCommand, "<slot> [amount]", getStaffFlagValue("none"), true, true),
commandData("bizstockitem", stockItemInBusinessCommand, "<item name> <amount> <sell price>", getStaffFlagValue("none"), true, true),
commandData("bizitemprice", setBusinessItemSellPriceCommand, "<item slot> <sell price>", getStaffFlagValue("none"), true, true),
commandData("bizname", setBusinessNameCommand, "<name>", getStaffFlagValue("none"), true, true),
commandData("bizowner", setBusinessOwnerCommand, "<player name/id>", getStaffFlagValue("none"), true, true),
commandData("bizblip", setBusinessBlipCommand, "<type name/model id>", getStaffFlagValue("manageBusinesses"), true, true),
@@ -75,6 +78,11 @@ function loadCommands() {
commandData("bizentrance", moveBusinessEntranceCommand, "", getStaffFlagValue("manageBusinesses"), true, true),
commandData("bizexit", moveBusinessExitCommand, "", getStaffFlagValue("manageBusinesses"), true, true),
commandData("bizinttype", setBusinessInteriorTypeCommand, "<interior template name/business id>", getStaffFlagValue("manageBusinesses"), true, true),
// TEMPORARY
commandData("buyskin", buySkinFromBusinessCommand, "<skin id>", getStaffFlagValue("none"), true, true),
commandData("buygun", buyWeaponFromBusinessCommand, "<weapon id>", getStaffFlagValue("none"), true, true),
commandData("buyammo", buyWeaponFromBusinessCommand, "<weapon id>", getStaffFlagValue("none"), true, true),
],
chat: [
commandData("me", meActionCommand, "<message>", getStaffFlagValue("none"), true, false),
@@ -123,6 +131,7 @@ function loadCommands() {
commandData("setsnow", setSnowingCommand, "<falling snow> <ground snow>", getStaffFlagValue("manageServer"), true, true),
commandData("setlogo", toggleServerLogoCommand, "<0/1 state>", getStaffFlagValue("manageServer"), true, true),
commandData("setgui", toggleServerGUICommand, "<0/1 state>", getStaffFlagValue("manageServer"), true, true),
//commandData("setguicolours", setServerGUIColoursCommand, "<red> <green> <blue>", getStaffFlagValue("manageServer"), true, true),
commandData("newcharspawn", setNewCharacterSpawnPositionCommand, "", getStaffFlagValue("manageServer"), true, true),
commandData("newcharcash", setNewCharacterMoneyCommand, "<amount>", getStaffFlagValue("manageServer"), true, true),
commandData("newcharskin", setNewCharacterSkinCommand, "[skin id]", getStaffFlagValue("manageServer"), true, true),
@@ -130,7 +139,10 @@ function loadCommands() {
commandData("joblocinfo", getJobLocationInfoCommand, "", getStaffFlagValue("none"), true, true),
],
core: [],
database: [],
database: [
commandData("dbquery", executeDatabaseQueryCommand, "<query>", getStaffFlagValue("developer"), true, true),
//commandData("dbinfo", getDatabaseInfoCommand, "", getStaffFlagValue("developer"), true, true),
],
developer: [
commandData("scode", executeServerCodeCommand, "<code>", getStaffFlagValue("developer"), true, true),
commandData("ccode", executeClientCodeCommand, "<code>", getStaffFlagValue("developer"), true, true),
@@ -140,7 +152,6 @@ function loadCommands() {
commandData("docmdall", simulateCommandForAllPlayers, "<command> [params]", getStaffFlagValue("developer"), true, true),
],
discord: [],
faction: [],
help: [
commandData("help", helpCommand, "", getStaffFlagValue("none"), false, false),
],
@@ -160,7 +171,11 @@ function loadCommands() {
commandData("houseexit", moveHouseExitCommand, "", getStaffFlagValue("manageHouses"), true, true),
commandData("houseinttype", setHouseInteriorTypeCommand, "<interior template name/business id>", getStaffFlagValue("manageHouses"), true, true),
],
item: [],
item: [
commandData("giveitem", givePlayerItemCommand, "", getStaffFlagValue("none"), true, false),
commandData("takeitem", takePlayerItemCommand, "", getStaffFlagValue("none"), true, false),
commandData("takeallitems", takeAllPlayerItemsCommand, "", getStaffFlagValue("none"), true, false),
],
job: [
commandData("takejob", takeJobCommand, "", getStaffFlagValue("none"), true, false),
commandData("startwork", startWorkingCommand, "", getStaffFlagValue("none"), true, false),

View File

@@ -258,7 +258,7 @@ let gameConfig = {
],
};
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function initConfigScript() {
console.log("[Asshat.Config]: Initializing config script ...");
@@ -307,7 +307,7 @@ function loadServerConfigFromId(tempServerId) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function applyConfigToServer(tempServerConfig) {
server.name = tempServerConfig.name;
@@ -319,7 +319,7 @@ function applyConfigToServer(tempServerConfig) {
updateServerRules();
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function saveServerConfigToDatabase(serverConfigData) {
console.log(`[Asshat.Config]: Saving server ${serverConfigData.databaseId} configuration to database ...`);
@@ -335,31 +335,31 @@ function saveServerConfigToDatabase(serverConfigData) {
console.log(`[Asshat.Config]: Server ${serverConfigData.databaseId} configuration saved to database!`);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getServerConfig() {
return serverConfig;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getGameConfig() {
return gameConfig;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getGlobalConfig() {
return globalConfig;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getServerId() {
return getServerConfig().databaseId;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function setTimeCommand(command, params, client) {
if(getCommand(command).requireLogin) {
@@ -518,4 +518,4 @@ function toggleServerGUICommand(command, params, client) {
return true;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------

View File

@@ -141,4 +141,60 @@ const AG_ISLAND_SANFIERRO = 2;
const AG_ISLAND_REDCOUNTYSOUTHEAST = 3;
const AG_ISLAND_REDCOUNTYNORTH = 4;
const AG_ISLAND_BONECOUNTYNORTH = 5;
const AG_ISLAND_BONECOUNTYSOUTH = 6;
const AG_ISLAND_BONECOUNTYSOUTH = 6;
// Item Owners
const AG_ITEM_OWNER_NONE = 0;
const AG_ITEM_OWNER_PLAYER = 1;
const AG_ITEM_OWNER_VEHTRUNK = 2;
const AG_ITEM_OWNER_VEHDASH = 3;
const AG_ITEM_OWNER_BIZFLOOR = 4;
const AG_ITEM_OWNER_BIZSTORAGE = 5;
const AG_ITEM_OWNER_HOUSE = 6;
const AG_ITEM_OWNER_SAFE = 7;
const AG_ITEM_OWNER_ITEM = 8;
// Item Use Types
const AG_ITEM_USETYPE_NONE = 0; // Has no effect
const AG_ITEM_USETYPE_WEAPON = 1; // Equips weapon
const AG_ITEM_USETYPE_AMMO_CLIP = 2; // Magazine for weapon. If in inventory, R will load it into gun
const AG_ITEM_USETYPE_PHONE = 3; // Pulls out phone
const AG_ITEM_USETYPE_GPS = 4; // Not sure how I want this to work yet
const AG_ITEM_USETYPE_MAP = 5; // Shows minimap on HUD
const AG_ITEM_USETYPE_SKIN = 6; // Changes skin (item skin is replaced with previous skin before changing)
const AG_ITEM_USETYPE_CLOTHESUPPER = 7; // Changes upper clothing (GTA IV shirts)
const AG_ITEM_USETYPE_CLOTHESLOWER = 8; // Changes lower clothing (GTA IV pants)
const AG_ITEM_USETYPE_STORAGE = 9; // Shows stored items. Backpack, crate, briefcase, wallet, etc
const AG_ITEM_USETYPE_VEHKEY = 10; // Locks/unlocks a vehicle and allows starting engine without hotwire
const AG_ITEM_USETYPE_BIZKEY = 11; // Locks/unlocks a business
const AG_ITEM_USETYPE_HOUSEKEY = 12; // Locks/unlocks a house
const AG_ITEM_USETYPE_SEED = 13; // Plants a seed
const AG_ITEM_USETYPE_WEED = 14; // Light drug effect (short term relief of addiction symptoms?)
const AG_ITEM_USETYPE_COKE = 15; // Medium drug effect (medium term relief of addiction symptoms?)
const AG_ITEM_USETYPE_METH = 16; // Heavy drug effect (extended term relief of addiction symptoms?)
const AG_ITEM_USETYPE_CIGAR = 17; // Just for appearance. Makes people look cool I guess
const AG_ITEM_USETYPE_WATER = 18; // Replenishes small amount of health
const AG_ITEM_USETYPE_FOOD = 19; // Eat food. Replenishes a small amount of health
const AG_ITEM_USETYPE_BEER = 20; // Subtle drunk effect. Replenishes small amount of health.
const AG_ITEM_USETYPE_WINE = 21; // Moderate drunk effect. Replenishes moderate amount of health.
const AG_ITEM_USETYPE_LIQUOR = 22; // Heavy drunk effect. Replenishes large amount of health.
const AG_ITEM_USETYPE_COFFEE = 23; // Replenishes moderate amount of health.
const AG_ITEM_USETYPE_AMMO_ROUND = 23; // Bullet. Loads into magazine.
// Item Drop Types
const AG_ITEM_DROPTYPE_NONE = 0; // Can't be dropped
const AG_ITEM_DROPTYPE_OBJECT = 1; // Drops as an object on the ground
const AG_ITEM_DROPTYPE_PICKUP = 2; // Drops as a pickup
const AG_ITEM_DROPTYPE_OBJECTLIGHT = 3; // Object that produces an area light effect (lamp, flashlight, etc)
const AG_ITEM_DROPTYPE_DESTROY = 4; // Will destroy the item on drop (keys mostly but for any tiny object)
const AG_ITEM_DROPTYPE_OBJECTSTACK = 5; // Stackable objects (crates and such). Will sit on top of closest other stackable
// Forensic Types
const AG_FORENSICS_NONE = 0;
const AG_FORENSICS_BULLET = 1; // Bullet. The actual tip that hits a target. Has rifling and ballistics information of the weapon.
const AG_FORENSICS_BLOOD = 2; // Blood. Automatically applied to ground and bullets that hit when somebody is shot
const AG_FORENSICS_BODY = 3; // Body. A dead body lol
const AG_FORENSICS_HAIR = 4; // Hair. Automatically applied to
const AG_FORENSICS_SWEAT = 5; // Sweat. Automatically applied to clothing when worn
const AG_FORENSICS_SALIVA = 6; // Saliva. Automatically applied to drinks when drank
const AG_FORENSICS_BULLETCASINGS = 7; // Bullet casings. Automatically dropped when fired from a weapon except when used in a vehicle (driveby)

View File

@@ -11,7 +11,7 @@
let scriptVersion = "1.0";
let serverStartTime = 0;
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
let serverData = {
saveDataIntervalTimer: false,
@@ -22,6 +22,10 @@ let serverData = {
families: [],
factions: [],
commands: {},
antiCheat: {
whiteListedGameScripts: [],
blackListedGameScripts: [],
},
policeStations: [
false,
[ // GTA 3
@@ -381,7 +385,7 @@ let serverData = {
],
};
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function initServerData() {
// Pre-allocate translation cache language slots
@@ -391,10 +395,10 @@ function initServerData() {
global.getServerData().translation.cache.fill(translationCacheFrom);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getServerData() {
return serverData;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------

View File

@@ -8,7 +8,7 @@
// TYPE: Server (JavaScript)
// ===========================================================================
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
let databaseConfig = {
host: "127.0.0.1",
@@ -21,14 +21,14 @@ let databaseConfig = {
let persistentDatabaseConnection = null;
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function initDatabaseScript() {
console.log("[Asshat.Database]: Initializing database script ...");
console.log("[Asshat.Database]: Database script initialized successfully!");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function connectToDatabase() {
if(persistentDatabaseConnection == null) {
@@ -48,7 +48,7 @@ function connectToDatabase() {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function disconnectFromDatabase(dbConnection) {
if(!databaseConfig.usePersistentConnection) {
@@ -57,13 +57,13 @@ function disconnectFromDatabase(dbConnection) {
return true;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function queryDatabase(dbConnection, queryString) {
return dbConnection.query(queryString);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function escapeDatabaseString(dbConnection, unsafeString) {
if(!dbConnection) {
@@ -72,32 +72,32 @@ function escapeDatabaseString(dbConnection, unsafeString) {
return dbConnection.escapeString(unsafeString);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getDatabaseInsertId(dbConnection) {
return dbConnection.insertId;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getDatabaseError(dbConnection) {
return dbConnection.error;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function freeDatabaseQuery(dbQuery) {
dbQuery.free();
return;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function fetchQueryAssoc(dbQuery) {
return dbQuery.fetchAssoc();
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function quickDatabaseQuery(queryString) {
let dbConnection = connectToDatabase();
@@ -123,4 +123,47 @@ function quickDatabaseQuery(queryString) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function executeDatabaseQueryCommand(command, params, client) {
if(getCommand(command).requireLogin) {
if(!isPlayerLoggedIn(client)) {
messagePlayerError(client, "You must be logged in to use this command!");
return false;
}
}
if(!doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(command))) {
messagePlayerError(client, "You do not have permission to use this command!");
return false;
}
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
if(!targetClient) {
messagePlayerError(client, "That player was not found!");
return false;
}
if(targetCode == "") {
messagePlayerError(client, "You didn't enter any code!");
return false;
}
let success = quickDatabaseQuery(params);
if(!success) {
messagePlayerAlert(client, `Database query failed to execute: [#AAAAAA]${query}`);
} else if(typeof success != "boolean") {
messagePlayeSuccess(client, `Database query successful: [#AAAAAA]${query}`);
messagePlayerInfo(client, `Returns: ${success}`);
} else {
messagePlayeSuccess(client, `Database query successful: [#AAAAAA]${query}`);
}
return true;
}
// -------------------------------------------------------------------------

View File

@@ -43,8 +43,8 @@ addEventHandler("OnPlayerJoined", function(event, client) {
addEventHandler("OnPlayerQuit", function(event, client, quitReasonId) {
console.log(`[Asshat.Event] ${getPlayerDisplayForConsole(client)} disconnected (${disconnectReasons[quitReasonId]}[${quitReasonId}])`);
savePlayerToDatabase(client);
//savePlayerToDatabase(client);
resetClientStuff(client);
getServerData().clients[client.index] = null;

View File

@@ -8,7 +8,7 @@
// TYPE: Server (JavaScript)
// ===========================================================================
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
let randomTips = [
`[#FFFFFF]Press [#0066FF]E [#FFFFFF]near a taxi if you need a ride.`,
@@ -26,7 +26,7 @@ let randomTips = [
`[#FFFFFF]Want to advertise your business? Visit the news station and place an /ad today!`,
];
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function helpCommand(command, params, client) {
if(areParamsEmpty(params)) {
@@ -111,7 +111,7 @@ function helpCommand(command, params, client) {
// == Bindable Keys ============================
// == Clothes ==================================
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showMainHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Help [#FF9900]=================================");
@@ -120,7 +120,7 @@ function showMainHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#A9A9A9]ammunation, skins, mechanic, dealership, discord, colours, keys");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showAccountHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Account Help [#FF9900]=============================");
@@ -129,7 +129,7 @@ function showAccountHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Some settings you can use: [#AAAAAA]/gui, /logo, /iplogin, /autolastchar, /2fa, /loginalert");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showVehicleHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Vehicle Help [#FF9900]=============================");
@@ -140,7 +140,7 @@ function showVehicleHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Don't forget to register and insure your vehicle! Use [#AAAAAA]/gps [#FFFFFF]to find a DMV for this.");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showVehicleDealershipHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Vehicle Dealerships [#FF9900]======================");
@@ -150,7 +150,7 @@ function showVehicleDealershipHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]A new car for sale will appear when you drive away from the dealer.");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showJobHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Job Help [#FF9900]=================================");
@@ -161,7 +161,7 @@ function showJobHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]When entering a job vehicle, information on how to do the job will be shown to you.");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showChatHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Chat Help [#FF9900]================================");
@@ -171,7 +171,7 @@ function showChatHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Some have shorter names available ([#AAAAAA]/t [#FFFFFF]for talk, [#AAAAAA]/s [#FFFFFF]for shout, etc)");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showRulesHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Server Rules [#FF9900]=============================");
@@ -182,28 +182,28 @@ function showRulesHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Keep English in main chats. If you aren't good at English, use [#AAAAAA]/help language");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showWebsiteHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Website [#FF9900]=============================");
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]The website is [#AAAAAA]https://asshatgaming.com");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showDiscordHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Discord [#FF9900]=============================");
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Join our discord! [#AAAAAA]https://discord.gg/4TQ3TGB529");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showAnimationHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Animations [#FF9900]===============================");
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Animations are not yet available.");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showAmmunationHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Ammunation [#FF9900]===============================");
@@ -213,7 +213,7 @@ function showAmmunationHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Weapons can also be purchased illegally from weapon dealers and clans.");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showClothesHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Clothes [#FF9900]==================================");
@@ -222,7 +222,7 @@ function showClothesHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Some skins are restricted to jobs, clans, or for other reasons.");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showBindKeysHelpMessage(client) {
messagePlayerInfo(client, "[#FF9900]== [#FFFF00]Bindable Keys [#FF9900]============================");
@@ -231,7 +231,7 @@ function showBindKeysHelpMessage(client) {
messagePlayerNormal(client, "[#FF9900]• [#FFFFFF]Your keybinds will automatically be usable on all servers");
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showEnteredDriverSeatHasKeysHelpTip(client) {
if(getPlayerData(client).accountData.shownTips & !shownTipsFlags.enteredDriverSeat) {
@@ -240,7 +240,7 @@ function showEnteredDriverSeatHasKeysHelpTip(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showApproachJobWhileUnemployedTip(client) {
if(getPlayerData(client).accountData.shownTips & !shownTipsFlags.approachJobWhileUnemployed) {
@@ -249,7 +249,7 @@ function showApproachJobWhileUnemployedTip(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showTakeNearbyJobTip(client) {
if(getPlayerData(client).accountData.shownTips & !shownTipsFlags.takeJobWhileUnemployed) {
@@ -258,7 +258,7 @@ function showTakeNearbyJobTip(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showApproachCurrentJobTip(client) {
if(getPlayerData(client).accountData.shownTips & !shownTipsFlags.approachCurrentJob) {
@@ -268,7 +268,7 @@ function showApproachCurrentJobTip(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showApproachOtherJobTip(client) {
if(getPlayerData(client).accountData.shownTips & !shownTipsFlags.approachCurrentJob) {
@@ -278,7 +278,7 @@ function showApproachOtherJobTip(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showStartedWorkingTip(client) {
if(getPlayerData(client).accountData.shownTips & !shownTipsFlags.startedWorking) {
@@ -288,7 +288,7 @@ function showStartedWorkingTip(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showApproachOwnedVehicleTip(client) {
if(getPlayerData(client).accountData.shownTips & !shownTipsFlags.approachOwnedVehicle) {
@@ -297,7 +297,7 @@ function showApproachOwnedVehicleTip(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function showApproachClanVehicleTip(client) {
if(getPlayerData(client).accountData.shownTips & !shownTipsFlags.approachAnyVehicle) {
@@ -306,4 +306,4 @@ function showApproachClanVehicleTip(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------

View File

@@ -13,7 +13,6 @@ function initHouseScript() {
getServerData().houses = loadHousesFromDatabase();
createAllHousePickups();
createAllHouseBlips();
setAllHouseIndexes();
console.log("[Asshat.House]: House script initialized successfully!");
return true;

View File

@@ -11,11 +11,9 @@
function initJobScript() {
console.log("[Asshat.Job]: Initializing job script ...");
getServerData().jobs = loadJobsFromDatabase();
setAllJobDataIndexes();
createAllJobPickups();
createAllJobBlips();
setAllJobDataIndexes();
console.log("[Asshat.Job]: Job script initialized successfully!");
return true;
}
@@ -683,11 +681,16 @@ function doesPlayerHaveJobType(client, jobType) {
// ---------------------------------------------------------------------------
function getJobData(jobId) {
for(let i in getServerData().jobs) {
if(getServerData().jobs[i].databaseId == jobId) {
return getServerData().jobs[i];
}
//for(let i in getServerData().jobs) {
// if(getServerData().jobs[i].databaseId == jobId) {
// return getServerData().jobs[i];
// }
//}
if(typeof getServerData().jobs[jobId] != "undefined") {
return getServerData().jobs[jobId];
}
return false;
}
@@ -750,13 +753,15 @@ function createJobLocationCommand(command, params, client) {
function deleteJobLocationCommand(command, params, client) {
let closestJobLocation = getClosestJobLocation(getPlayerPosition(client));
let jobData = getJobData(closestJobLocation.job);
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]deleted location [#AAAAAA]${closestJobLocation.databaseId} [#FFFFFF]for the [#AAAAAA]${jobData.name} [#FFFFFF]job`);
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]deleted location [#AAAAAA]${closestJobLocation.databaseId} [#FFFFFF]for the [#AAAAAA]${getJobData(closestJobLocation.jobIndex).name} [#FFFFFF]job`);
quickDatabaseQuery(`DELETE FROM job_loc WHERE job_loc_id = ${closestJobLocation.databaseId}`);
let tempIndex = closestJobLocation.index;
let tempJob = closestJobLocation.job;
deleteJobLocation(closestJobLocation);
getJobData(closestJobLocation.job).locations.splice(getClosestJobLocation.index, 1);
getJobData(tempJob).locations.splice(tempIndex, 1);
}
// ---------------------------------------------------------------------------
@@ -768,10 +773,9 @@ function toggleJobLocationEnabledCommand(command, params, client) {
}
let closestJobLocation = getClosestJobLocation(getPlayerPosition(client));
let jobData = getJobData(closestJobLocation.job);
closestJobLocation.enabled = !closestJobLocation.enabled;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]${getEnabledDisabledFromBool(closestJobLocation.enabled)} location [#AAAAAA]${closestJobLocation.databaseId} [#FFFFFF]for the [#AAAAAA]${jobData.name} [#FFFFFF]job`);
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]${getEnabledDisabledFromBool(closestJobLocation.enabled)} location [#AAAAAA]${closestJobLocation.databaseId} [#FFFFFF]for the [#AAAAAA]${getJobData(closestJobLocation.jobIndex).name} [#FFFFFF]job`);
}
// ---------------------------------------------------------------------------
@@ -782,11 +786,10 @@ function toggleJobEnabledCommand(command, params, client) {
return false;
}
let jobId = getJobFromParams(params) || getClosestJobLocation(getPlayerPosition(client)).job;
let jobData = getJobData(jobId);
let jobId = getJobFromParams(params) || getClosestJobLocation(getPlayerPosition(client)).jobIndex;
jobData.enabled = !jobData.enabled;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]${getEnabledDisabledFromBool(jobData.enabled)} [#FFFFFF]the [#AAAAAA]${jobData.name} [#FFFFFF]job`);
getJobData(jobId).enabled = !getJobData(jobId).enabled;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]${getEnabledDisabledFromBool(getJobData(jobId).enabled)} [#FFFFFF]the [#AAAAAA]${getJobData(jobId).name} [#FFFFFF]job`);
}
// ---------------------------------------------------------------------------
@@ -797,11 +800,10 @@ function toggleJobWhiteListCommand(command, params, client) {
return false;
}
let jobId = getJobFromParams(params) || getClosestJobLocation(getPlayerPosition(client)).job;
let jobData = getJobData(jobId);
let jobId = getJobFromParams(params) || getClosestJobLocation(getPlayerPosition(client)).jobIndex;
jobData.whiteListEnabled = !jobData.whiteListEnabled;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]${getEnabledDisabledFromBool(jobData.whiteListEnabled)} [#FFFFFF]the whitelist for the [#AAAAAA]${jobData.name} [#FFFFFF]job`);
getJobData(jobId).whiteListEnabled = !getJobData(jobId).whiteListEnabled;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]${getEnabledDisabledFromBool(getJobData(jobId).whiteListEnabled)} [#FFFFFF]the whitelist for the [#AAAAAA]${getJobData(jobId).name} [#FFFFFF]job`);
}
// ---------------------------------------------------------------------------
@@ -812,11 +814,10 @@ function toggleJobBlackListCommand(command, params, client) {
return false;
}
let jobId = getJobFromParams(params) || getClosestJobLocation(getPlayerPosition(client)).job;
let jobData = getJobData(jobId);
let jobId = getJobFromParams(params) || getClosestJobLocation(getPlayerPosition(client)).jobIndex;
jobData.blackListEnabled = !jobData.blackListEnabled;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]${getEnabledDisabledFromBool(jobData.blackListEnabled)} [#FFFFFF]the blacklist for the [#AAAAAA]${jobData.name} [#FFFFFF]job`);
getJobData(jobId).blackListEnabled = !getJobData(jobId).blackListEnabled;
messageAdmins(`[#AAAAAA]${client.name} [#FFFFFF]${getEnabledDisabledFromBool(getJobData(jobId).blackListEnabled)} [#FFFFFF]the blacklist for the [#AAAAAA]${getJobData(jobId).name} [#FFFFFF]job`);
}
// ---------------------------------------------------------------------------
@@ -828,7 +829,7 @@ function addPlayerToJobBlackListCommand(command, params, client) {
}
let targetClient = getPlayerFromParams(splitParams[0]);
let jobId = getJobFromParams(splitParams[1]) || getClosestJobLocation(getPlayerPosition(client)).job;
let jobId = getJobFromParams(splitParams[1]) || getClosestJobLocation(getPlayerPosition(client)).jobIndex;
if(!targetClient) {
messagePlayerError(client, `That player was not found!`);
@@ -858,7 +859,7 @@ function removePlayerFromJobBlackListCommand(command, params, client) {
}
let targetClient = getPlayerFromParams(splitParams[0]);
let jobId = getJobFromParams(splitParams[1]) || getClosestJobLocation(getPlayerPosition(client)).job;
let jobId = getJobFromParams(splitParams[1]) || getClosestJobLocation(getPlayerPosition(client)).jobIndex;
if(!targetClient) {
messagePlayerError(client, `That player was not found!`);
@@ -888,7 +889,7 @@ function addPlayerToJobWhiteListCommand(command, params, client) {
}
let targetClient = getPlayerFromParams(splitParams[0]);
let jobId = getJobFromParams(splitParams[1]) || getClosestJobLocation(getPlayerPosition(client)).job;
let jobId = getJobFromParams(splitParams[1]) || getClosestJobLocation(getPlayerPosition(client)).jobIndex;
if(!targetClient) {
messagePlayerError(client, `That player was not found!`);
@@ -918,7 +919,7 @@ function removePlayerFromJobWhiteListCommand(command, params, client) {
}
let targetClient = getPlayerFromParams(splitParams[0]);
let jobId = getJobFromParams(splitParams[1]) || getClosestJobLocation(getPlayerPosition(client)).job;
let jobId = getJobFromParams(splitParams[1]) || getClosestJobLocation(getPlayerPosition(client)).jobIndex;
if(!targetClient) {
messagePlayerError(client, `That player was not found!`);
@@ -1223,34 +1224,49 @@ function setAllJobDataIndexes() {
getServerData().jobs[i].index = i;
for(let j in getServerData().jobs[i].locations) {
getServerData().jobs[i].locations[j].index = j;
getServerData().jobs[i].locations[j].jobIndex = i;
}
for(let k in getServerData().jobs[i].uniforms) {
getServerData().jobs[i].uniforms[k].index = k;
getServerData().jobs[i].uniforms[k].jobIndex = i;
}
for(let m in getServerData().jobs[i].equipment) {
getServerData().jobs[i].equipment[m].index = m;
getServerData().jobs[i].equipment[m].jobIndex = i;
for(let n in getServerData().jobs[i].equipment[m].weapons) {
getServerData().jobs[i].equipment[m].weapons[n].index = n;
getServerData().jobs[i].equipment[m].weapons[n].jobIndex = i;
getServerData().jobs[i].equipment[m].weapons[n].equipmentIndex = m;
}
}
for(let o in getServerData().jobs[i].blackList) {
getServerData().jobs[i].blackList[o].index = o;
getServerData().jobs[i].blackList[o].jobIndex = i;
}
for(let v in getServerData().jobs[i].whiteList) {
getServerData().jobs[i].blackList[v].index = v;
getServerData().jobs[i].blackList[v].jobIndex = i;
}
}
}
// ---------------------------------------------------------------------------
function createJobLocation(job, position, interior, dimension) {
function createJobLocation(jobId, position, interior, dimension) {
let jobLocationData = new serverClasses.jobLocationData(false);
jobLocationData.position = position;
jobLocationData.job = job;
jobLocationData.job = getJobData(jobId).databaseId;
jobLocationData.interior = interior;
jobLocationData.dimension = dimension;
jobLocationData.enabled = true;
getServerData().jobs[job].locations.push(jobLocationData);
getServerData().jobs[jobId].locations.push(jobLocationData);
createJobLocationPickup(job, getServerData().jobs[job].locations.length-1);
createJobLocationPickup(jobId, getServerData().jobs[jobId].locations.length-1);
saveJobLocationToDatabase(jobLocationData);
}
@@ -1427,7 +1443,6 @@ function saveAllJobsToDatabase() {
function deleteJobLocationBlip(jobId, locationId) {
if(getJobData(jobId).locations[locationId].blip != null) {
//removeFromWorld(getJobData(jobId).locations[locationId].blip);
destroyElement(getJobData(jobId).locations[locationId].blip);
getJobData(jobId).locations[locationId].blip = null;
}
@@ -1436,10 +1451,9 @@ function deleteJobLocationBlip(jobId, locationId) {
// ---------------------------------------------------------------------------
function deleteJobLocationPickup(jobId, locationId) {
if(getJobData(jobId).locations[locationId].pickup != null) {
//removeFromWorld(getJobData(jobId).locations[locationId].pickup);
if(getServerData().jobs[jobId].locations[locationId].pickup != null) {
destroyElement(getJobData(jobId).locations[locationId].pickup);
getJobData(jobId).locations[locationId].pickup = null;
getServerData().jobs[jobId].locations[locationId].pickup = null;
}
}

View File

@@ -273,4 +273,21 @@ function loadGameFixesResource() {
return true;
}
// ---------------------------------------------------------------------------
function getPlayerInfoCommand(command, params, client) {
if(areParamsEmpty(params)) {
return false;
}
let targetClient = getPlayerFromParams(params);
if(!getPlayerData(targetClient)) {
messagePlayerError(client, "Player not found!");
return false;
}
messagePlayerInfo(client, `[#AAAAAA][Player Info] [#FFFFFF]Account: [#AAAAAA]${getPlayerData(targetClient).accountData.name}[${getPlayerData(targetClient).accountData.databaseId}], [#FFFFFF]Character: [#AAAAAA]${getCharacterFullName(client)}[${getPlayerCurrentSubAccount(client).databaseId}], [#FFFFFF]Connected: [#AAAAAA]${getTimeDifferenceDisplay(Math.ceil(sdl.tick/1000), getPlayerData(targetClient).connectTime)} ago, [#FFFFFF]Game Version: [#AAAAAA]${targetClient.gameVersion}, [#FFFFFFF]Client Version: [#AAAAAA]${getPlayerData(targetClient).clientVersion}`);
}
// ---------------------------------------------------------------------------

View File

@@ -1456,7 +1456,6 @@ function processHoldActionKey(client) {
let closestBusiness = getClosestBusiness(client.player.position);
let jobData = getJobData(closestJobId);
if(getPlayerCurrentSubAccount(client).job == AG_JOB_NONE) {
if(jobData.position.distance(client.player.position) <= getGlobalConfig().takeJobDistance) {
takeJob(client, closestJobId);
@@ -1616,12 +1615,12 @@ function getJobFromParams(params) {
if(isNaN(params)) {
for(let i in getServerData().jobs) {
if(toLowerCase(getServerData().jobs[i].name).indexOf(toLowerCase(params)) != -1) {
return getServerData().jobs[i].databaseId;
return i;
}
}
} else {
if(typeof getServerData().jobs[params] != "undefined") {
return getServerData().jobs[params].databaseId;
return params;
}
}
@@ -1776,25 +1775,25 @@ function getClosestPoliceStation(position) {
return getServerData().policeStations[getServerGame()][closest];
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function isGTAIV() {
return (getServerGame() == GAME_GTA_IV);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function arrayBufferToString(arrayBuffer) {
return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getPlayerDisplayForConsole(client) {
return `${client.name}[${client.index}]`;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getPlayerNameForNameTag(client) {
if(isPlayerSpawned(client)) {
@@ -1803,31 +1802,31 @@ function getPlayerNameForNameTag(client) {
return client.name;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function isPlayerSpawned(client) {
return (client.player != null);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getLockedUnlockedTextFromBool(boolVal) {
return (boolVal) ? "locked" : "unlocked";
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getLockedUnlockedEmojiFromBool(boolVal) {
return (boolVal) ? "🔒" : "🔓";
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getPlayerIsland(client) {
return getIsland(getPlayerPosition(client));
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function isAtPayAndSpray(position) {
for(let i in payAndSprays[getServerGame()]) {
@@ -1839,7 +1838,7 @@ function isAtPayAndSpray(position) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
async function waitUntil(condition) {
return new Promise((resolve) => {
@@ -1854,7 +1853,7 @@ async function waitUntil(condition) {
});
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function resetClientStuff(client) {
console.log(`[Asshat.Utilities] Resetting client data for ${getPlayerDisplayForConsole(client)}`);
@@ -1874,4 +1873,4 @@ function resetClientStuff(client) {
getPlayerData(client).lastVehicle = null;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------

View File

@@ -558,7 +558,7 @@ function doesClientOwnVehicle(client, vehicle) {
if(vehicleData.ownerType == AG_VEHOWNER_CLAN) {
if(vehicleData.ownerId == getPlayerCurrentSubAccount(client).clan) {
if(doesClientHaveClanPermission(client, "manageVehicles") || doesClientHaveClanPermission(client, "owner")) {
if(doesPlayerHaveClanPermission(client, "manageVehicles") || doesPlayerHaveClanPermission(client, "owner")) {
return true;
}
}
@@ -958,7 +958,7 @@ function setVehicleLocked(vehicle, locked) {
vehicle.locked = locked;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function getVehicleOwnerTypeText(ownerType) {
switch(ownerType) {
@@ -979,7 +979,7 @@ function getVehicleOwnerTypeText(ownerType) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function isVehicleOwnedByJob(vehicle, jobId) {
if(getVehicleData(vehicle).ownerType == AG_VEHOWNER_JOB) {
@@ -988,7 +988,7 @@ function isVehicleOwnedByJob(vehicle, jobId) {
return false;
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
async function getPlayerNewVehicle(client) {
while(true) {
@@ -999,7 +999,7 @@ async function getPlayerNewVehicle(client) {
}
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------
function createNewDealershipVehicle(model, spawnPosition, spawnRotation, price, dealershipId) {
let vehicleDataSlot = getServerData().vehicles.length;
@@ -1025,4 +1025,4 @@ function createNewDealershipVehicle(model, spawnPosition, spawnRotation, price,
getServerData().vehicles.push(tempVehicleData);
}
// ----------------------------------------------------------------------------
// -------------------------------------------------------------------------