diff --git a/scripts/server/npc.js b/scripts/server/npc.js index 2bc79dca..65c40b2e 100644 --- a/scripts/server/npc.js +++ b/scripts/server/npc.js @@ -8,13 +8,14 @@ // =========================================================================== function initNPCScript() { - + loadNPCsFromDatabase(); + setAllNPCDataIndexes(); } // =========================================================================== function getNPCData(ped) { - return false; + return ped.getData("vrr.dataIndex"); } // =========================================================================== @@ -44,4 +45,149 @@ function createNPCCommand(client, command, params) { spawnNPC(npcIndex-1); } +// =========================================================================== + +function loadNPCsFromDatabase() { + logToConsole(LOG_INFO, `[VRR.NPC]: Loading NPCs from database ...`); + let dbConnection = connectToDatabase(); + let tempNPCs = []; + let dbAssoc; + if(dbConnection) { + let dbQueryString = `SELECT * FROM npc_main WHERE npc_server = ${getServerId()} AND npc_enabled = 1`; + let dbQuery = queryDatabase(dbConnection, dbQueryString); + if(dbQuery) { + while(dbAssoc = fetchQueryAssoc(dbQuery)) { + let tempNPCData = new NPCData(dbAssoc); + tempNPCData.triggers = loadNPCTriggersFromDatabase(); + tempNPCs.push(tempNPCData); + } + freeDatabaseQuery(dbQuery); + } + disconnectFromDatabase(dbConnection); + } + + logToConsole(LOG_INFO, `[VRR.NPC]: ${tempNPCs.length} NPCs loaded from database successfully!`); + return tempNPCs; +} + +// =========================================================================== + +function loadNPCTriggersFromDatabase(npcDatabaseId) { + logToConsole(LOG_INFO, `[VRR.NPC]: Loading NPC triggers for NPC ${npcDatabaseId} from database ...`); + let dbConnection = connectToDatabase(); + let tempNPCTriggers = []; + let dbAssoc; + if(dbConnection) { + let dbQueryString = `SELECT * FROM npc_trig WHERE npc_trig_npc = ${npcDatabaseId} AND npc_trig_enabled = 1`; + let dbQuery = queryDatabase(dbConnection, dbQueryString); + if(dbQuery) { + while(dbAssoc = fetchQueryAssoc(dbQuery)) { + let tempNPCTriggerData = new NPCTriggerData(dbAssoc); + tempNPCTriggerData.conditions = loadNPCTriggerConditionsFromDatabase(tempNPCTriggerData.databaseId); + tempNPCTriggerData.responses = loadNPCTriggerResponsesFromDatabase(tempNPCTriggerData.databaseId); + tempNPCTriggers.push(tempNPCTriggerData); + } + freeDatabaseQuery(dbQuery); + } + disconnectFromDatabase(dbConnection); + } + + logToConsole(LOG_INFO, `[VRR.NPC]: ${tempNPCTriggers.length} NPC triggers loaded for NPC ${npcDatabaseId} from database successfully!`); + return tempNPCTriggers; +} + +// =========================================================================== + +function loadNPCTriggerConditionsFromDatabase(npcTriggerDatabaseId) { + logToConsole(LOG_INFO, `[VRR.NPC]: Loading NPC trigger conditions for trigger ${npcTriggerDatabaseId} from database ...`); + let dbConnection = connectToDatabase(); + let tempNPCTriggerConditions = []; + let dbAssoc; + if(dbConnection) { + let dbQueryString = `SELECT * FROM npc_cond WHERE npc_cond_trig = ${npcTriggerDatabaseId} AND npc_cond_enabled = 1`; + let dbQuery = queryDatabase(dbConnection, dbQueryString); + if(dbQuery) { + while(dbAssoc = fetchQueryAssoc(dbQuery)) { + let tempNPCTriggerConditionData = new NPCTriggerConditionData(dbAssoc); + tempNPCTriggerConditions.push(tempNPCTriggerConditionData); + } + freeDatabaseQuery(dbQuery); + } + disconnectFromDatabase(dbConnection); + } + + logToConsole(LOG_INFO, `[VRR.NPC]: ${tempNPCTriggerConditions.length} conditions loaded for trigger ${npcTriggerDatabaseId} from database successfully!`); + return tempNPCTriggerConditions; +} + +// =========================================================================== + +function loadNPCTriggerResponsesFromDatabase(npcTriggerDatabaseId) { + logToConsole(LOG_INFO, `[VRR.NPC]: Loading NPC trigger responses for trigger ${npcTriggerDatabaseId} from database ...`); + let dbConnection = connectToDatabase(); + let tempNPCTriggerResponses = []; + let dbAssoc; + if(dbConnection) { + let dbQueryString = `SELECT * FROM npc_resp WHERE npc_resp_trig = ${npcTriggerDatabaseId} AND npc_resp_enabled = 1`; + let dbQuery = queryDatabase(dbConnection, dbQueryString); + if(dbQuery) { + while(dbAssoc = fetchQueryAssoc(dbQuery)) { + let tempNPCTriggerResponseData = new NPCTriggerResponseData(dbAssoc); + tempNPCTriggerResponses.push(tempNPCTriggerResponseData); + } + freeDatabaseQuery(dbQuery); + } + disconnectFromDatabase(dbConnection); + } + + logToConsole(LOG_INFO, `[VRR.NPC]: ${tempNPCTriggerResponses.length} responses loaded for trigger ${npcTriggerDatabaseId} from database successfully!`); + return tempNPCTriggerResponses; +} + +// =========================================================================== + +function saveAllNPCsToDatabase() { + for(let i in getServerData().npcs) { + saveNPCToDatabase(i); + } +} + +// =========================================================================== + +function saveNPCToDatabase() { + +} + +// =========================================================================== + +function setAllNPCDataIndexes() { + for(let i in getServerData().npcs) { + getServerData().npcs[i].index = i; + + for(let j in getServerData().npcs[i].triggers) { + getServerData().npcs[i].triggers[j].index = j; + getServerData().npcs[i].triggers[j].npcIndex = i; + + for(let k in getServerData().npcs[i].triggers[j].conditions) { + getServerData().npcs[i].triggers[j].conditions[k].index = k; + getServerData().npcs[i].triggers[j].conditions[m].triggerIndex = j; + } + + for(let m in getServerData().npcs[i].triggers[j].responses) { + getServerData().npcs[i].triggers[j].responses[m].index = m; + getServerData().npcs[i].triggers[j].responses[m].triggerIndex = j; + } + } + } +} + +// =========================================================================== + +function spawnNPC(npcIndex) { + let civilian = createGameCivilian(getNPCData(npcIndex).model, getNPCData(npcIndex).spawnPosition, getNPCData(npcIndex).spawnRotation); + if(civilian) { + civilian.setData("vrr.dataIndex", npcIndex); + } +} + // =========================================================================== \ No newline at end of file