87 lines
69 KiB
JavaScript
87 lines
69 KiB
JavaScript
let resourceName=null,language=null,commands=null,firstnames={},lastnames={},isDisplayingPreCalloutInterface=!1,isDisplayingCalloutInterface=!1,isDragMode=!1,isDragging=!1,dragElement=null,dragOffset={x:0,y:0},isLayoutMode=!1,layoutElements={},visibleLayoutElements=new Set,originalStyles=new Map,layoutBoundaries={left:20,top:20,right:20,bottom:20},snapGrid={enabled:!0,size:10},collisionDetection={enabled:!0},dimensionValidation={enabled:!0};window.addEventListener("message",e=>{let t=e.data;if("playSound"==t.transactionType&&PlayNUISound(t.transactionFolder,t.transactionFile,t.transactionVolume),"init"==t.type&&("undefined"!=typeof $?(resourceName=t.resourcename,language=t.language,commands=t.commands,firstnames=t.firstnames,lastnames=t.lastnames,$.post(`https://${resourceName}/initComplete`,JSON.stringify({complete:!0}))):console.log("Script is still loading...")),"togglecalloutinfo"==t.type&&toggleCalloutInfo(),"toggleUILayoutMode"==t.type&&(console.log("Received toggleUILayoutMode message from Lua"),toggleUILayoutMode()),"emergencyUICleanup"==t.type&&(console.log("Received emergencyUICleanup message from Lua"),emergencyUICleanup()),"ersselectionmenu"==t.type){var a,n,i,o=t.display;ToggleERSSelectionMenu(o,t.permissions)}if("radialmenu"==t.type){var o=t.display;ToggleRadialMenu(o)}if("pursuitradialmenu"==t.type){var o=t.display;TogglePursuitRadialMenu(o)}if("pursuitmode"==t.type){var s,l,o=t.display,r=t.displayhotkeyhint;TogglePursuitModeUI(o,r,t.zoomhotkey,t.backuphotkey)}if("dualsteeringmode"==t.type){var o=t.display;ToggleDualSteeringMode(o)}if("hotkeyhintprompt"==t.type){var o=t.display,c=t.hotkeys,d=t.time;ToggleHotKeyHintPrompt(o,c,language,d)}if("dispatchmessage"==t.type){var u,o=t.display,c=t.hotkeys,g=t.messagetype,p=t.calloutdata,b=t.message,d=t.time;AddMessageToDispatchQueue(o,c,g,p,d,b,t.toggle)}if("calloutprompt"==t.type){var m,o=t.display,p=t.calloutdata,c=t.hotkeys,d=t.time;ToggleCalloutDisplayPrompt(o,c,language,d,p,t.serviceType)}if("calloutpreinterface"==t.type){var o=t.display,c=t.hotkeys,p=t.calloutdata;TogglePreCalloutInterface(o,c,p)}if("calloutinterface"==t.type){var h,y,o=t.display,c=t.hotkeys,f=t.pedCount,v=t.vehicleCount,x=t.objectCount,w=t.propCount,k=t.fireCount,C=t.smokeCount,p=t.calloutdata,I=t.pedOriginalCount,T=t.vehOriginalCount,S=t.objOriginalCount,P=t.propOriginalCount;ToggleCalloutInterface(o,c,f,v,x,w,k,C,p,I,T,S,P,t.fireOriginalCount,t.smokeOriginalCount)}if("unifiedprompt"==t.type){var o=t.display,E=t.promptType,R=t.hotkey,b=t.message,d=t.time;DisplayUnifiedPrompt(o,E,R,b,d)}if("interactionmodule"==t.type){var N,A,o=t.display;DisplayPedInteractionModule(o,t.ispeddeadordying,t.service)}if("idcardprompt"==t.type){var M,_,o=t.display;DisplayPedIdCard(o,t.pedpersonaldata,t.showdatabasecheck)}if("inventoryprompt"==t.type){var q,o=t.display;DisplayPedInventory(o,t.itemlist)}if("vehicleinfoprompt"==t.type){var D,O,o=t.display;DisplayVehicleInfo(o,t.vehicleData,t.DisableTaxAndMOT)}if("togglequestionsmodule"==t.type){var L,o=t.display;ToggleQuestionsModule(o,t.questions)}if("updateanswers"==t.type){var B,o=t.display;UpdateAnswers(o,t.answers)}if("addorremovewaypoint"==t.type&&AddWaypoint(t.addwaypoint),"updatewaypoint"==t.type){var U,j,F,G=t.scaleX;UpdateWaypointPosition(G,t.scaleY,t.distanceText)}if("areyousure"==t.type){var o=t.display;DisplayAreYouSurePopup(o)}if("gearmenu"==t.type){var W,o=t.display;DisplayGearMenu(o,t.locationdata)}if("updatezonechange"==t.type){UpdateZoneChangeUI(t.lastZone,t.currentZone)}"updatewaypoints"===t.type&&updateWaypoints(t)});var unifiedPromptTimeout,idCardTimeout,dbCheckTimeout,vehicleInfoTimeout,vehicleDbCheckTimeout,inventoryTimeout,zoneChangeTimeout=null;let zoneChangeQueue=[],isAnimating=!1;function UpdateZoneChangeUI(e,t){zoneChangeQueue.push({oldZone:e,newZone:t}),isAnimating||processNextZoneChange()}function processNextZoneChange(){if(0===zoneChangeQueue.length){isAnimating=!1;return}isAnimating=!0;let{oldZone:e,newZone:t}=zoneChangeQueue.shift(),a=document.getElementById("zone-change-ui");if(!a){processNextZoneChange();return}let n=a.querySelector(".old-zone"),i=a.querySelector(".new-zone");if(!n||!i){processNextZoneChange();return}zoneChangeTimeout&&clearTimeout(zoneChangeTimeout),a.classList.remove("show"),i.classList.remove("show"),n.textContent=e||"N/A",i.textContent=t||"N/A",a.offsetWidth,a.classList.add("show"),i.classList.add("show"),zoneChangeTimeout=setTimeout(()=>{a.classList.remove("show"),i.classList.remove("show"),setTimeout(processNextZoneChange,500)},4e3)}let escapeEventListenerAdded=!1;function DisplayAreYouSurePopup(e){if(e){$("#are-you-sure-modal").remove();let t=` <div class="modal fade" id="are-you-sure-modal" tabindex="-1" aria-labelledby="are-you-sure-modal-label" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content bg-dark text-light border-rounded font-monospace bg-opacity-25 border border-warning border-opacity-50"> <div class="modal-header"> <h5 class="modal-title" id="are-you-sure-modal-label">${language.AreYouSureCompleteCallout}</h5> <button type="button" id="no-button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close" onclick="handleNoClick()"></button> </div> <div class="modal-body"> <p>${language.CompletingCalloutCannotBeUndone}</p> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" onclick="handleNoClick()">${language.No}</button> <button type="button" class="btn btn-danger" onclick="handleYesClick()">${language.Yes}</button> </div> </div> </div> </div> `;$("body").append(t),$("#are-you-sure-modal").modal({backdrop:"static",keyboard:!1}),$("#are-you-sure-modal").modal("show"),$("#are-you-sure-modal").on("shown.bs.modal",function(){escapeEventListenerAdded||($(document).on("keydown",function(e){"Escape"===e.key&&($("#are-you-sure-modal").modal("hide"),handleNoClick(),e.stopPropagation())}),escapeEventListenerAdded=!0)}).on("hidden.bs.modal",function(){$(document).off("keydown"),escapeEventListenerAdded=!1})}else $("#are-you-sure-modal").remove()}function handleNoClick(){$.post(`https://${resourceName}/AreYouSure`,JSON.stringify({areyousure:!1})),$("#are-you-sure-modal").modal("hide")}function handleYesClick(){$.post(`https://${resourceName}/AreYouSure`,JSON.stringify({areyousure:!0})),$("#are-you-sure-modal").modal("hide")}function DisplayPedInteractionModule(e,t,a){if(e){if(DisplayUnifiedPrompt(!1),t)$("#ped-interaction-module").empty(),$("#ped-interaction-module").show(),$("#ped-interaction-module").append(` <h3 class="text-light m-3 font-monospace">${language.InteractionOptions}</h3> <div class="container"> <div class="row"> <div class="col-12"> ${[{id:"identify",label:language.IdentifyDeadPed,explanation:language.IdentifyDeadPedExplanation},{id:"drag",label:language.DragPed,explanation:language.DragPedExplanation},{id:"massivebleeding",label:language.CheckMassiveBleeding,explanation:language.CheckMassiveExplanation},{id:"airway",label:language.CheckAirway,explanation:language.CheckAirwayExplanation},{id:"breathing",label:language.CheckBreathing,explanation:language.CheckBreathingExplanation},{id:"circulation",label:language.CheckCirculation,explanation:language.CheckCirculationExplanation},{id:"hypothermia",label:language.CheckHypothermia,explanation:language.CheckHypothermiaExplanation},{id:"cpr",label:language.PerformCPR,explanation:language.PerformCPRExplanation},{id:"putonstretcher",label:language.PutOnStretcher,explanation:language.PutOnStretcherExplanation},{id:"takeoffstretcher",label:language.TakeOffStretcher,explanation:language.TakeOffStretcherExplanation},{id:"bodybag",label:language.PutInBodyBag,explanation:language.PutInBodyBagExplanation}].map(e=>` <div class="row mb-2"> <div class="col-md-4 d-flex align-items-center pe-1"> <button type="button" id="p-btn-${e.id}" class="btn btn-outline-warning btn-sm text-light font-monospace" onclick="PedInteraction('${e.id}')">${e.label}</button> </div> <div class="col-md-8 d-flex align-items-center ps-1"> <span class="text-light font-monospace">${e.explanation}</span> </div> </div> `).join("")} </div> </div> <hr class="my-4 border-light"> <div class="row mb-2"> <div class="col-12 d-flex justify-content-between"> <button type="button" id="p-btn-exit" class="btn btn-outline-secondary btn-sm text-light font-monospace fw-bold" onclick="PedInteraction('exit')">${language.ExitInteraction}</button> </div> </div> </div> `),applySavedPosition("ped-interaction-module"),["identify","drag","massivebleeding","airway","breathing","circulation","hypothermia","cpr","putonstretcher","takeoffstretcher","bodybag","exit"].forEach(e=>addSoundOnHoverEventListener(`p-btn-${e}`));else{$("#ped-interaction-module").empty(),$("#ped-interaction-module").show();var n={police:[{id:"greet",label:language.Greet,explanation:language.GreetExplanation},{id:"id",label:language.AskForId,explanation:language.AskForIdExplanation},{id:"questioning",label:language.Question,explanation:language.QuestionExplanation},{id:"breathalyze",label:language.Breathalyze,explanation:language.BreathalyzeExplanation},{id:"drugtest",label:language.DrugTest,explanation:language.DrugTestExplanation},{id:"warn",label:language.Warn,explanation:language.WarnExplanation},{id:"fine",label:language.Fine,explanation:language.FineExplanation},{id:"grab",label:language.Grab,explanation:language.GrabExplanation},{id:"getout",label:language.GetOut,explanation:language.GetOutExplanation},{id:"follow",label:language.AskToFollow,explanation:language.AskToFollowExplanation},{id:"wait",label:language.AskToWait,explanation:language.AskToWaitExplanation},{id:"handsup",label:language.HandsUp,explanation:language.HandsUpExplanation},{id:"search",label:language.Search,explanation:language.SearchExplanation},{id:"cuff",label:language.Cuff,explanation:language.CuffExplanation},{id:"putinvehicle",label:language.PutInVehicle,explanation:language.PutInVehicleExplanation}],ambulance:[{id:"greet",label:language.Greet,explanation:language.GreetExplanation},{id:"questioning",label:language.Question,explanation:language.QuestionExplanation},{id:"breathalyze",label:language.Breathalyze,explanation:language.BreathalyzeExplanation},{id:"drugtest",label:language.DrugTest,explanation:language.DrugTestExplanation},{id:"getout",label:language.GetOut,explanation:language.GetOutExplanation},{id:"follow",label:language.AskToFollow,explanation:language.AskToFollowExplanation},{id:"wait",label:language.AskToWait,explanation:language.AskToWaitExplanation},{id:"putinvehicle",label:language.PutInVehicle,explanation:language.PutInVehicleExplanation}],fire:[{id:"greet",label:language.Greet,explanation:language.GreetExplanation},{id:"questioning",label:language.Question,explanation:language.QuestionExplanation},{id:"breathalyze",label:language.Breathalyze,explanation:language.BreathalyzeExplanation},{id:"drugtest",label:language.DrugTest,explanation:language.DrugTestExplanation},{id:"getout",label:language.GetOut,explanation:language.GetOutExplanation},{id:"follow",label:language.AskToFollow,explanation:language.AskToFollowExplanation},{id:"wait",label:language.AskToWait,explanation:language.AskToWaitExplanation},{id:"putinvehicle",label:language.PutInVehicle,explanation:language.PutInVehicleExplanation}],tow:[{id:"greet",label:language.Greet,explanation:language.GreetExplanation},{id:"questioning",label:language.Question,explanation:language.QuestionExplanation},{id:"getout",label:language.GetOut,explanation:language.GetOutExplanation},{id:"follow",label:language.AskToFollow,explanation:language.AskToFollowExplanation},{id:"wait",label:language.AskToWait,explanation:language.AskToWaitExplanation},{id:"putinvehicle",label:language.PutInVehicle,explanation:language.PutInVehicleExplanation}]};$("#ped-interaction-module").append(` <h3 class="m-3 text-light font-monospace">${language.InteractionOptions}</h3> <div class="container"> <div class="row"> <!-- Buttons and Explanations --> <div class="col-12"> ${(n[a]||n.police).map(e=>` <div class="row mb-2"> <div class="col-md-4 d-flex align-items-center pe-1"> <button type="button" id="p-btn-${e.id}" class="btn btn-outline-warning btn-sm text-light font-monospace" onclick="PedInteraction('${e.id}')">${e.label}</button> </div> <div class="col-md-8 d-flex align-items-center ps-1"> <span class="text-light font-monospace">${e.explanation}</span> </div> </div> `).join("")} </div> </div> <!-- Spacer Line --> <hr class="my-4 border-light"> <!-- Action Buttons --> <div class="row mb-2"> <div class="col-12 d-flex justify-content-between"> <button type="button" id="p-btn-end" class="btn btn-outline-danger btn-sm text-light font-monospace fw-bold me-2" onclick="PedInteraction('end')">${language.StopInteraction}</button> <button type="button" id="p-btn-exit" class="btn btn-outline-secondary btn-sm text-light font-monospace fw-bold me-2" onclick="PedInteraction('exit')">${language.ExitInteraction}</button> ${"police"===a?`<button type="button" id="p-btn-custody" class="btn btn-outline-primary btn-sm text-light font-monospace fw-bold" onclick="PedInteraction('custody')">${language.SendToCustody}</button>`:""} </div> </div> </div> `);let i=n[a]||n.police,o=[...i.map(e=>e.id),"end","exit",..."police"===a?["custody"]:[]];o.forEach(e=>addSoundOnHoverEventListener(`p-btn-${e}`)),applySavedPosition("ped-interaction-module")}}else $("#ped-interaction-module").hide()}function PedInteraction(e){$.post(`https://${resourceName}/pedInteraction`,JSON.stringify({interactionType:e}))}function addSoundOnHoverEventListener(e){document.getElementById(e).addEventListener("mouseenter",function(){PlayNUISound("generic-sounds","rollover",.5)})}function DisplayUnifiedPrompt(e,t,a,n,i){if(e){$("#unified-prompt").show(),applySavedPosition("unified-prompt"),clearTimeout(unifiedPromptTimeout);let o={pedinteraction:{icon:"\uD83D\uDCAC",color:"text-warning",text:language.ToInteract,timeout:1500},injuredped:{icon:"\uD83E\uDE7A",color:"text-danger",text:language.ToPerformCPR,timeout:1500},impound:{icon:"\uD83D\uDE97",color:"text-danger",text:language.ToInteractImpound,timeout:1500},gear:{icon:"\uD83D\uDE97",color:"text-danger",text:language.ToInteractGear,timeout:1500},stretcher:{icon:"\uD83C\uDFE5",color:"text-info",text:language.ToUseStretcherVeh,timeout:1500},objectcleanup:{icon:"\uD83E\uDDF9",color:"text-success",text:language.ToCleanupObject,timeout:1500},spikesvehicle:{icon:"\uD83D\uDCA2",color:"text-warning",text:n||"",timeout:i||1500}},s=o[t]||o.pedinteraction;$("#unified-prompt").html(`
|
|
<div class="text-light font-monospace">${s.icon} ${language.Press} <span class="${s.color} font-monospace">${a}</span> ${s.text}</div>
|
|
`),unifiedPromptTimeout=setTimeout(function(){$("#unified-prompt").hide()},s.timeout)}else $("#unified-prompt").hide()}function DisplayPedIdCard(e,t,a){if(e){$("#vehicle-info").hide(),$("#ped-interaction-inventory").hide(),clearTimeout(idCardTimeout),clearTimeout(dbCheckTimeout),$("#ped-interaction-id-card").empty();var n=t.ProfilePicture||"N/A",i=t.FirstName||"N/A",o=t.LastName||"N/A",s=t.DOB||"N/A",l=t.Gender||"N/A",r=t.Email||"N/A",c=t.PhoneNumber||"N/A",d=t.Country||"N/A",u=t.State||"N/A",g=t.City||"N/A",p=t.PostalCode||"N/A",b=t.Address||"N/A";t.AddressType;var m=t.Nationality||"N/A",h=t.FlagsOrMarkers,y=t.License_Car||"N/A",f=t.License_Car_Colour||"text-light",v=t.License_Car_Icon||"fas fa-car",x=t.License_Bike||"N/A",w=t.License_Bike_Colour||"text-light",k=t.License_Bike_Icon||"fas fa-bicycle",C=t.License_Boat||"N/A",I=t.License_Boat_Colour||"text-light",T=t.License_Boat_Icon||"fas fa-ship",S=t.License_Truck||"N/A",P=t.License_Truck_Colour||"text-light",E=t.License_Truck_Icon||"fas fa-truck",R=t.License_Pilot||"N/A",N=t.License_Pilot_Colour||"text-light",A=t.License_Pilot_Icon||"fas fa-plane";$("#ped-interaction-id-card").append(` <div id="initial-check" class="card bg-dark text-light border-rounded font-monospace bg-opacity-25 border border-warning border-opacity-50 m-3"> <div class="card-header fw-bold"> ${language.PersonalDetails} </div> <div class="card-body bg-dark text-light small bg-opacity-25 border border-warning border-opacity-25"> <ul class="list-group list-group-flush"> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"><strong>${language.FullName}</strong> <span class="person-name text-info">${i} ${o}</span></li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"><strong>${language.DOB}</strong> <span class="dob text-info">${s}</span></li> </ul> </div> </div> `),$("#ped-interaction-id-card").show(),applySavedPosition("ped-interaction-id-card"),a&&($("#ped-interaction-id-card").append(` <div id="database-check" class="card bg-dark text-light border-rounded font-monospace bg-opacity-25 border border-warning border-opacity-50 m-3"> <div class="card-header fw-bold"> ${language.DatabaseCheck} </div> <div class="card-body bg-dark text-light small bg-opacity-25 border border-warning border-opacity-25 d-flex flex-column align-items-center justify-content-center"> <div class="d-flex flex-column align-items-center"> <div class="spinner-border text-warning mb-2" role="status"> <span class="visually-hidden">Loading...</span> </div> <p>${language.RunningDatabaseCheck}</p> </div> </div> </div> `),dbCheckTimeout=setTimeout(function(){$("#initial-check").remove(),$("#database-check").html(` <div class="card-header fw-bold"> ${language.DatabaseCheckResults} </div> <div class="card-body bg-dark text-light small bg-opacity-25 border border-warning border-opacity-25"> <div class="row mb-3"> <div class="col-md-4"> <div class="text-center fs-5 mb-2 p-1"> <strong class="text-white">${i} ${o}</strong> </div> <img src="${n}" alt="Photo" class="profile-picture border border-warning border-opacity-50 rounded w-100" style="max-height: 220px; object-fit: contain;"> </div> <div class="col-md-8"> <div class="text-center fs-5 mb-2 p-1"> <strong class="text-white">(${s})</strong> </div> <ul class="list-group list-group-flush"> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50"> <strong>${language.Nationality}</strong> ${m} </li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50"> <strong>${language.Gender}</strong> ${l} </li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50"> <strong>${language.Address}</strong> ${b}, ${g}, ${u} ${p} (${d}) </li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50"> <strong>${language.Email}</strong> ${r} | <strong>${language.PhoneNumber}</strong> ${c} </li> </ul> </div> </div> <div class="card-body bg-dark text-light small bg-opacity-25 border border-warning border-opacity-25"> <div class="row g-2"> <div class="col-12"> <strong class="d-block mb-2">${language.Licenses}</strong> <div class="d-flex flex-wrap gap-2"> <span class="license-badge ${f||"text-secondary"}"> <i class="fas fa-car"></i> <i class="${v}"></i> ${y} </span> <span class="license-badge ${w||"text-secondary"}"> <i class="fas fa-motorcycle"></i> <i class="${k}"></i> ${x} </span> <span class="license-badge ${I||"text-secondary"}"> <i class="fas fa-ship"></i> <i class="${T}"></i> ${C} </span> <span class="license-badge ${P||"text-secondary"}"> <i class="fas fa-truck"></i> <i class="${E}"></i> ${S} </span> <span class="license-badge ${N||"text-secondary"}"> <i class="fas fa-plane"></i> <i class="${A}"></i> ${R} </span> </div> </div> </div> </div> ${h&&Object.keys(h).some(e=>h[e])?` <div class="mt-3 p-2 bg-warning bg-opacity-25 border border-warning rounded"> <strong>${language.FlagsOrMarkers}</strong> <p class="card-text"> ${h.armed_and_dangerous?`<i class="bi bi-exclamation-triangle-fill"> </i><span class="microtext">${language.armed_and_dangerous}</span><br>`:""} ${h.assault?`<i class="bi bi-shield-fill-exclamation"> </i><span class="microtext">${language.assault}</span><br>`:""} ${h.burglary?`<i class="bi bi-door-closed-fill"> </i><span class="microtext">${language.burglary}</span><br>`:""} ${h.drug_related?`<i class="bi bi-capsule-pill"> </i><span class="microtext">${language.drug_related}</span><br>`:""} ${h.gang_affiliation?`<i class="bi bi-people-fill"> </i><span class="microtext">${language.gang_affiliation}</span><br>`:""} ${h.homicide?`<i class="bi bi-person-dash-fill"> </i><span class="microtext">${language.homicide}</span><br>`:""} ${h.kidnapping?`<i class="bi bi-person-fill"> </i><span class="microtext">${language.kidnapping}</span><br>`:""} ${h.mental_health_issues?`<i class="bi bi-thermometer-half"> </i><span class="microtext">${language.mental_health_issues}</span><br>`:""} ${h.sex_offense?`<i class="bi bi-heartbreak"> </i><span class="microtext">${language.sex_offense}</span><br>`:""} ${h.terrorism?`<i class="bi bi-fire"> </i><span class="microtext">${language.terrorism}</span><br>`:""} ${h.theft?`<i class="bi bi-bag-fill"> </i><span class="microtext">${language.theft}</span><br>`:""} ${h.traffic_violation?`<i class="bi bi-geo-alt-fill"> </i><span class="microtext">${language.traffic_violation}</span><br>`:""} ${h.wanted_person?`<i class="bi bi-person-bounding-box"> </i><span class="microtext">${language.wanted_person}</span><br>`:""} ${h.other?`<i class="bi bi-dot"> </i><span class="microtext">${language.other}</span><br>`:""} ${h.active_warrant?`<i class="bi bi-file-earmark-lock-fill"> </i><span class="microtext">${language.active_warrant}</span><br>`:""} </p> </div> `:""} </div> `)},3e3)),idCardTimeout=setTimeout(function(){$("#ped-interaction-id-card").hide()},15e3)}else $("#ped-interaction-id-card").hide()}function DisplayVehicleInfo(e,t,a){if(e){$("#ped-interaction-id-card").hide(),$("#ped-interaction-inventory").hide(),clearTimeout(vehicleInfoTimeout),clearTimeout(vehicleDbCheckTimeout),$("#vehicle-info").empty();var n={vehNetId:t.vehNetId,license_plate:t.license_plate,model:t.model,model_hash:t.model_hash,vehicle_class:t.vehicle_class,vehicle_class_from_name:t.vehicle_class_from_name,color:t.color,color_secondary:t.color_secondary,build_year:t.build_year,tax:t.tax,mot:t.mot,insurance:t.insurance,stolen:t.stolen,bolo:t.bolo,bolo_description:t.bolo_description,owner_name:t.owner_name};$("#vehicle-info").append(` <div class="card bg-dark text-light border-rounded font-monospace bg-opacity-25 border border-warning border-opacity-50 m-3"> <div class="card-header fw-bold"> ${language.VehicleDetails} </div> <div class="card-body bg-dark text-light small bg-opacity-25 border border-warning border-opacity-25"> <ul class="list-group list-group-flush"> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"><strong>${language.VehiclePlate}</strong> <span class="vehicle-plate text-info">${n.license_plate}</span></li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"><strong>${language.VehicleModel}</strong> <span class="vehicle-name text-info">${n.model}</span></li> </ul> </div> </div> `),$("#vehicle-info").append(` <div id="vehicle-info-database-check" class="card bg-dark text-light border-rounded font-monospace bg-opacity-25 border border-warning border-opacity-50 m-3"> <div class="card-header fw-bold"> ${language.DatabaseCheck} </div> <div class="card-body bg-dark text-light small bg-opacity-25 border border-warning border-opacity-25 d-flex flex-column align-items-center justify-content-center"> <div class="d-flex flex-column align-items-center"> <div class="spinner-border text-warning mb-2" role="status"> <span class="visually-hidden">Loading...</span> </div> <p>${language.RunningDatabaseCheck}</p> </div> </div> </div> `),$("#vehicle-info").show(),applySavedPosition("vehicle-info"),vehicleDbCheckTimeout=setTimeout(function(){$("#vehicle-info-database-check").html(` <div class="card-header fw-bold"> ${language.DatabaseCheckResults} </div> <div class="card-body bg-dark text-light small bg-opacity-25 border border-warning border-opacity-25"> <ul class="list-group list-group-flush"> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"><strong>${language.VehicleOwner}</strong> <span class="vehicle-owner text-info">${n.owner_name}</span></li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"><strong>${language.VehicleBuildYear}</strong> <span class="vehicle-build-year text-info">${n.build_year}</span></li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"><strong>${language.VehicleColor}</strong> <span class="vehicle-color text-info">${n.color}</span></li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"><strong>${language.VehicleColorSecondary}</strong> <span class="vehicle-color-secondary text-info">${n.color_secondary}</span></li> ${a?"":` <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"> <strong>${language.VehicleTax}</strong> <span class="vehicle-tax ${n.tax?"text-info":"text-danger"}"> ${n.tax?language.Paid:language.NotPaid} </span> </li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"> <strong>${language.VehicleMOT}</strong> <span class="vehicle-mot ${n.mot?"text-info":"text-danger"}"> ${n.mot?language.Passed:language.Failed} </span> </li> `} <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"> <strong>${language.VehicleInsurance}</strong> <span class="vehicle-insurance ${n.insurance?"text-info":"text-danger"}"> ${n.insurance?language.Valid:language.Invalid} </span> </li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"> <strong>${language.VehicleStolen}</strong> <span class="vehicle-stolen ${n.stolen?"text-danger":"text-info"}"> ${n.stolen?language.Yes:language.No} </span> </li> <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50 d-flex justify-content-between" style="gap: 30px;"> <strong>${language.VehicleBolo}</strong> <span class="vehicle-bolo ${n.bolo?"text-danger":"text-info"}"> ${n.bolo?language.Yes:language.No} </span> </li> ${n.bolo?` <li class="list-group-item bg-dark text-light bg-opacity-50 border border-warning border-opacity-50"> <div class="d-flex justify-content-between" style="gap: 30px;"> <strong>${language.VehicleBoloDescription}</strong> </div> <div class="vehicle-bolo-description text-danger"> ${wrapText(n.bolo_description?n.bolo_description:"-",50)} </div> </li> `:""} </ul> </div> `)},5e3),vehicleInfoTimeout=setTimeout(function(){$("#vehicle-info").hide()},15e3)}else $("#vehicle-info").hide()}function DisplayPedInventory(e,t){e?($("#ped-interaction-id-card").hide(),$("#vehicle-info").hide(),clearTimeout(inventoryTimeout),$("#ped-interaction-inventory").empty(),$("#ped-interaction-inventory").append(` <h3 class="m-1 text-light font-monospace">${language.Inventory}</h3> <table class="table m-1 text-light font-monospace border border-warning border-opacity-50 bg-dark bg-opacity-50"> <tbody id="inventory-table-body"> </tbody> </table> `),$.each(t,function(e,t){var a,n=` <tr> <td class="small fw-bold ${t.illegal?"text-danger":""}">${t.name}</td> </tr> `;$("#inventory-table-body").append(n)}),$("#ped-interaction-inventory").show(),applySavedPosition("ped-interaction-inventory"),inventoryTimeout=setTimeout(function(){$("#ped-interaction-inventory").hide()},15e3)):$("#ped-interaction-inventory").hide()}var listener=!1;function setupButton(e,t,a){let n=document.getElementById(e);$(`#${e}`).html(`<i class="${t}" style="opacity:1.0;"></i>`),n.addEventListener("mouseenter",()=>PlayNUISound("generic-sounds","rollover",.5)),n.addEventListener("mouseover",()=>{document.getElementById("instruction-text").style.display="block",$("#instruction-text").html(`<p class="text-light"><em>${a}</em></p>`)}),n.addEventListener("mouseout",()=>document.getElementById("instruction-text").style.display="none")}function setupRadialMenu(){if(!listener){listener=!0;let e=[{id:"middle-x",iconClass:"",instruction:language.ExitRadialMenuInstruction,hoverColour:"",function:"ToggleRadialMenu(false)"},{id:"police-transport",iconClass:language.RequestPoliceTransportIcon,instruction:language.RequestPoliceTransportInstruction,hoverColour:"#0057b9",function:"RequestOrCancelPoliceTransport()"},{id:"ambulance-request",iconClass:language.RequestAmbulanceIcon,instruction:language.RequestAmbulanceInstruction,hoverColour:"#ff0000",function:"RequestOrCancelAmbulance()"},{id:"tow-request",iconClass:language.RequestTowIcon,instruction:language.RequestTowInstruction,hoverColour:"#782323",function:"RequestOrCancelTow()"},{id:"taxi-request",iconClass:language.RequestTaxiIcon,instruction:language.RequestTaxiInstruction,hoverColour:"#FF9A18",function:"RequestOrCancelTaxi()"},{id:"road-service-request",iconClass:language.RequestRoadServiceIcon,instruction:language.RequestRoadServiceInstruction,hoverColour:"#ffbf00",function:"RequestOrCancelRoadService()"},{id:"coroner-request",iconClass:language.RequestCoronerIcon,instruction:language.RequestCoronerInstruction,hoverColour:"#3D3D3D",function:"RequestOrCancelCoroner()"},{id:"animal-rescue-request",iconClass:language.RequestAnimalRescueIcon,instruction:language.RequestAnimalRescueInstruction,hoverColour:"#9bde00",function:"RequestOrCancelAnimalRescue()"},{id:"mechanic-request",iconClass:language.RequestMechanicIcon,instruction:language.RequestMechanicInstruction,hoverColour:"#3D3D3D",function:"RequestOrCancelMechanic()"},{id:"fire-request",iconClass:language.RequestFireIcon,instruction:language.RequestFireInstruction,hoverColour:"#3D3D3D",function:"RequestOrCancelFire()"}];$("#circle-menu").html(`
|
|
<div class="${e[0].id}" id="${e[0].id}" onclick="${e[0].function}"></div>
|
|
<ul>
|
|
${e.slice(1).map(e=>`<li><a class="${e.id}" id="${e.id}" onclick="${e.function}"></a></li>`).join("")}
|
|
</ul>
|
|
`),e.forEach(({id:e,iconClass:t,instruction:a})=>setupButton(e,t,a))}}function ToggleRadialMenu(e){if(setupRadialMenu(),e){document.addEventListener("keyup",handleRadialMenuEscape);let t=document.getElementById("instruction-title");t.style.display="block",$("#instruction-title").html(`<p class="text-light fs-1 font-monospace"><strong>${language.RadialMenuInstructionTitle}</strong></p>`),$("#circle-menu").show(),$("body").append("<div class='blur-overlay'></div>")}else{document.removeEventListener("keyup",handleRadialMenuEscape),PlayNUISound("generic-sounds","radialclose",.5);let a=document.getElementById("instruction-title"),n=document.getElementById("instruction-text");a&&(a.style.display="none"),n&&(n.style.display="none"),$("#circle-menu").hide(),$.post(`https://${resourceName}/closeRadialMenu`,JSON.stringify({})),$(".blur-overlay").remove()}}function handleRadialMenuEscape(e){"Escape"===e.key&&ToggleRadialMenu(!1)}function RequestOrCancelPoliceTransport(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelPoliceTransport`,JSON.stringify({}))}function RequestOrCancelAmbulance(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelAmbulance`,JSON.stringify({}))}function RequestOrCancelTow(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelTow`,JSON.stringify({}))}function RequestOrCancelTaxi(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelTaxi`,JSON.stringify({}))}function RequestOrCancelRoadService(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelRoadService`,JSON.stringify({}))}function RequestOrCancelCoroner(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelCoroner`,JSON.stringify({}))}function RequestOrCancelAnimalRescue(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelAnimalRescue`,JSON.stringify({}))}function RequestOrCancelMechanic(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelMechanic`,JSON.stringify({}))}function RequestOrCancelFire(){ToggleRadialMenu(!1),$.post(`https://${resourceName}/requestOrCancelFire`,JSON.stringify({}))}function TogglePursuitModeUI(e,t,a,n){$("#pursuit-mode-ui").toggle(e),e?$("#pursuit-mode-ui").html(` <div class="pursuit-container"> <div class="lightbar-container"> <div class="lightbar"> <div class="pursuit-text"> ${language.ActivePursuit} </div> </div> </div> ${t?` <div class="pursuit-hotkey-hint-container mt-2"> <span class="pursuit-hotkey-hint">${a} (${language.PursuitHotkeyFocus}) | ${n} (${language.PursuitHotkeyBackup})</span> </div> `:""} </div> <div class="screen-flash-left"></div> <div class="screen-flash-right"></div> `):$("#pursuit-mode-ui").hide()}var pursuitRadialMenuListener=!1;function setupPursuitRadialMenuButton(e,t,a){let n=document.getElementById(e);$(`#${e}`).html(`<i class="${t}" style="opacity:1.0;"></i>`),n.addEventListener("mouseenter",()=>{PlayNUISound("generic-sounds","rollover",.5),document.getElementById("pursuit-instruction-text").style.display="block",$("#pursuit-instruction-text").html(`<p class="text-light"><em>${a}</em></p>`)}),n.addEventListener("mouseleave",()=>{document.getElementById("pursuit-instruction-text").style.display="none"})}function setupPursuitRadialMenu(){if(!pursuitRadialMenuListener){pursuitRadialMenuListener=!0;let e=[{id:"pursuit-middle-x",iconClass:"",instruction:language.ExitRadialMenuInstruction,hoverColour:"",function:"TogglePursuitRadialMenu(false)"},{id:"pursuit-backup-light",iconClass:language.RequestLightBackupIcon,instruction:language.RequestLightBackupInstruction,hoverColour:"#0080f8",function:"RequestPursuitBackup('light')"},{id:"pursuit-backup-medium",iconClass:language.RequestMediumBackupIcon,instruction:language.RequestMediumBackupInstruction,hoverColour:"#014b8f",function:"RequestPursuitBackup('medium')"},{id:"pursuit-backup-heavy",iconClass:language.RequestHeavyBackupIcon,instruction:language.RequestHeavyBackupInstruction,hoverColour:"#001e39",function:"RequestPursuitBackup('heavy')"},{id:"pursuit-backup-air",iconClass:language.RequestAirBackupIcon,instruction:language.RequestAirBackupInstruction,hoverColour:"#00a2dd",function:"RequestPursuitBackup('air')"},{id:"pursuit-backup-army",iconClass:language.RequestArmyBackupIcon,instruction:language.RequestArmyBackupInstruction,hoverColour:"#647b32",function:"RequestPursuitBackup('army')"},];$("#pursuit-radial-menu").html(`
|
|
<div class="${e[0].id}" id="${e[0].id}" onclick="${e[0].function}"></div>
|
|
<ul>
|
|
${e.slice(1).map(e=>`<li><a class="${e.id}" id="${e.id}" onclick="${e.function}"></a></li>`).join("")}
|
|
</ul>
|
|
`),e.forEach(({id:e,iconClass:t,instruction:a})=>setupPursuitRadialMenuButton(e,t,a))}}function TogglePursuitRadialMenu(e){if(setupPursuitRadialMenu(),e){document.addEventListener("keyup",handlePursuitRadialMenuEscape);let t=document.getElementById("pursuit-instruction-title");t.style.display="block",$("#pursuit-instruction-title").html(`<p class="text-light fs-1 font-monospace"><strong>${language.PursuitRadialMenuInstructionTitle}</strong></p>`),$("#pursuit-radial-menu").show(),$("body").append("<div class='blur-overlay'></div>")}else{document.removeEventListener("keyup",handlePursuitRadialMenuEscape),PlayNUISound("generic-sounds","radialclose",.5);let a=document.getElementById("pursuit-instruction-title");a&&(a.style.display="none");let n=document.getElementById("pursuit-instruction-text");n&&(n.style.display="none"),$("#pursuit-radial-menu").hide(),$.post(`https://${resourceName}/closePursuitRadialMenu`,JSON.stringify({})),$(".blur-overlay").remove()}}function handlePursuitRadialMenuEscape(e){"Escape"===e.key&&TogglePursuitRadialMenu(!1)}function RequestPursuitBackup(e){TogglePursuitRadialMenu(!1),$.post(`https://${resourceName}/requestPursuitBackup`,JSON.stringify({unitType:e}))}var isDispatchQueueProcessing=!1,dispatchMessages=[];function AddMessageToDispatchQueue(e,t,a,n,i,o,s){dispatchMessages.push({display:e,hotkeys:t,messagetype:a,calloutdata:n,timeInMS:i,message:o,toggle:s}),isDispatchQueueProcessing||ProcessDispatchQueue()}function ProcessDispatchQueue(){if(dispatchMessages.length>0){isDispatchQueueProcessing=!0;var e=dispatchMessages[0];DisplayDispatchMessage(e.display,e.hotkeys,e.messagetype,e.calloutdata,e.message,e.toggle);var t=e.toggle?e.timeInMS:3e3;StartCountdownTimer(t),setTimeout(function(){dispatchMessages.shift(),ProcessDispatchQueue()},t)}else isDispatchQueueProcessing=!1,$("#dispatch-message-prompt-container").hide()}function DisplayDispatchMessage(e,t,a,n,i,o){if(!o){$("#dispatch-message-prompt-container").empty().show().append(`
|
|
<div class="dispatchmessageicon">
|
|
<i class="bi bi-bell-fill text text-primary"></i>
|
|
<span class="microtext text-light">${language.DispatchMessage}</span>
|
|
</div>
|
|
`),applySavedPosition("dispatch-message-prompt-container");return}"response"==a||"arrival"==a?("response"==a&&$.post(`https://${resourceName}/offerToTrackPlayer`,JSON.stringify({calloutdata:n})),$("#dispatch-message-prompt-container").empty().show().append(` <div id="dispatch-message-prompt-card" class="card bg-primary text-light bg-opacity-25 border border-3 border-primary border-opacity-50"> <div class="card-header bg-dark bg-opacity-75 text-center"> <h5 class="font-monospace">${language.DispatchMessage}</h5> </div> <div class="card-body"> <div class="p-1">${wrapText(i,50)}</div> <table class="table m-1 text-light border border-primary border-opacity-50 bg-dark bg-opacity-75"> <tbody> <tr> <td class="fw-bold p-2 font-monospace">${language.Caller}</td> <td class="p-2">${wrapText(`${n.FirstName} ${n.LastName}`,50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${language.CallDescription}</td> <td class="p-2">${wrapText(n.Description??"N/A",50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${language.Location}</td> <td class="p-2">${wrapText(n.StreetName??"N/A",50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${language.Postal}</td> <td class="p-2">${wrapText(n.Postal??"N/A",50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${language.CalloutUnitsRequired}</td> <td class="p-2">${wrapText(n.CalloutUnitsRequired?.description??"N/A",50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${language.DispatchNote}</td> <td class="p-2">${wrapText(language.DispatchNoteResponseText??"N/A",50)}</td> </tr> </tbody> </table> </div> <div id="countdown-timer" class="card-footer microtext bg-dark bg-opacity-75 p-2"></div> </div> `),applySavedPosition("dispatch-message-prompt-container"),"response"==a&&$("#dispatch-message-prompt-container").append(` <div id="track-unit" class="card-footer microtext bg-dark bg-opacity-50 p-2 d-flex justify-content-between border border-3 border-primary border-opacity-50"> <span id="track-text" class="text-light p-2"> ${language.TrackUnitProposal} </span> <button type="button" class="btn btn-outline-warning bg-dark bg-opacity-50 btn-sm m-1 text-light card-text ml-auto font-monospace">${t.TrackUnit}</button> </div> `)):($("#dispatch-message-prompt-container").empty().show().append(` <div id="dispatch-message-prompt-card" class="card bg-primary text-light bg-opacity-25 border border-3 border-primary border-opacity-50"> <div class="card-header bg-dark bg-opacity-75 text-center"> <h5 class="font-monospace">${language.DispatchMessage}</h5> </div> <div class="card-body card-text"> ${i} </div> <div id="countdown-timer" class="card-footer microtext bg-dark bg-opacity-75"> </div> </div> `),applySavedPosition("dispatch-message-prompt-container"))}function StartCountdownTimer(e){var t=e/1e3;let a=`${language.NextDispatchMessage} <span class="text-warning">${t}</span> ${language.Seconds}...`;$("#countdown-timer").html(`<div class="p-2">${wrapText(a,70)}</div>`);var n=setInterval(function(){--t>=0?$("#countdown-timer").html(`<div class="p-2">${wrapText(`${language.NextDispatchMessage} <span class="text-warning">${t}</span> ${language.Seconds}...`,70)}</div>`):(clearInterval(n),$("#countdown-timer").html(`<div class="p-2">${wrapText("Time's up!",70)}</div>`))},1e3)}function ToggleHotKeyHintPrompt(e,t,a,n){e?($("#hint-prompt-container").empty(),$("#hint-prompt-container").show(),applySavedPosition("hint-prompt-container"),$("#hint-prompt-container").append(` <div id="prompt-card" class="card bg-warning card-text text-light bg-opacity-25 border border-3 border-warning border-opacity-50"> <div class="card-header bg-dark bg-opacity-75 text-center"> <h5 class="font-monospace">${a.Hint}</h5> </div> <div class="card-body"> <table class="table table-sm m-1 text-light bg-dark bg-opacity-75 border border-warning border-opacity-50"> <tbody> <tr> <td> <h6 class="m-1 font-monospace">${a.HotKeys}</h6> <ul class="list-unstyled m-1"> <li class="list-group-item"><button type="button" class="btn btn-outline-warning bg-dark bg-opacity-50 btn-sm m-2 text-light font-monospace">${a.Aim} + ${t.OrderOnKneesOrStandUp}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-warning bg-dark bg-opacity-50 btn-sm m-2 text-light font-monospace">${t.PullOver}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-warning bg-dark bg-opacity-50 btn-sm m-2 text-light font-monospace">${t.AcceptCallout}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-warning bg-dark bg-opacity-50 btn-sm m-2 text-light font-monospace">${t.CompleteCallout}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-warning bg-dark bg-opacity-50 btn-sm m-2 text-light font-monospace">${t.RadialMenu}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-warning bg-dark bg-opacity-50 btn-sm m-2 text-light font-monospace">/${commands.StopTrackingUnit}</button></li> </ul> </td> <td> <h6 class="m-1 font-monospace">${a.Explanation}</h6> <ul class="list-unstyled m-1"> <li class="list-group-item"><button type="button" class="btn btn-outline-hidden btn-sm m-2 text-light font-monospace">${a.OrderOnKneesOrStandUpExplanation}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-hidden btn-sm m-2 text-light font-monospace">${a.PullOver}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-hidden btn-sm m-2 text-light font-monospace">${a.AcceptCallout}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-hidden btn-sm m-2 text-light font-monospace">${a.CompleteCallout}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-hidden btn-sm m-2 text-light font-monospace">${a.RadialMenuExplanation}</button></li> <li class="list-group-item"><button type="button" class="btn btn-outline-hidden btn-sm m-2 text-light font-monospace">${a.StopTrackingUnitExplanation}</button></li> </ul> </td> </tr> </tbody> </table> </div> <div class="card-footer microtext-11 bg-dark bg-opacity-75 d-flex justify-content-between p-2"> <span id="hint-footer-text" class="m-1 p-2"> ${a.ToggleHints} </span> <button type="button" class="btn btn-outline-warning bg-dark bg-opacity-50 btn-sm m-1 text-light card-text microtext ml-auto font-monospace">/${commands.ToggleHints}</button> </div> </div> `),setTimeout(function(){$("#hint-prompt-container").hide(),$.post(`https://${resourceName}/reallowPromptMessages`,JSON.stringify({}))},n)):($("#hint-prompt-container").empty(),$("#hint-prompt-container").hide())}function SelectBackGroundColourByServiceType(e){var t="bg-primary",a="border-primary",n="btn-outline-primary",i="text-light";return"police"==e?(t="bg-primary",a="border-primary",n="btn-outline-primary",i="text-light"):"ambulance"==e?(t="bg-success",a="border-success",n="btn-outline-success",i="text-light"):"fire"==e?(t="bg-danger",a="border-danger",n="btn-outline-danger",i="text-light"):"tow"==e&&(t="bg-warning",a="border-warning",n="btn-outline-warning",i="text-light"),{backgroundColor:t,borderColor:a,textColor:i,buttonOutlineColor:n}}function ToggleCalloutDisplayPrompt(e,t,a,n,i,o){var s=n/1e3,{backgroundColor:l,borderColor:r,textColor:c,buttonOutlineColor:d}=SelectBackGroundColourByServiceType(o);e?($("#callout-prompt-container").empty(),$("#callout-prompt-container").show(),$("#callout-prompt-container").append(` <div id="callout-prompt-card" class="card ${l} card-text ${c} bg-opacity-25 border ${r} border-3 border-opacity-50"> <div class="card-header bg-dark bg-opacity-75 text-center p-2"> <h6 class="font-monospace"> ${wrapText(`${a.EmergencyCall} (${i.CalloutName})`,50)} </h6> </div> <div class="card-body"> <table class="table table-sm m-1 text-light border ${r} border-1 border-opacity-50 bg-dark bg-opacity-75"> <tbody> <tr> <td class="fw-bold p-2 font-monospace">${a.Caller}</td> <td class="p-2">${wrapText(`${i.FirstName} ${i.LastName}`,50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${a.CallDescription}</td> <td class="p-2">${wrapText(i.Description??"N/A",50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${a.Location}</td> <td class="p-2">${wrapText(i.StreetName??"N/A",50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${a.Postal}</td> <td class="p-2">${wrapText(i.Postal??"N/A",50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${a.CalloutUnitsRequired}</td> <td class="p-2">${wrapText(i.CalloutUnitsRequired?.description??"N/A",50)}</td> </tr> <tr> <td class="fw-bold p-2 font-monospace">${a.DispatchNote}</td> <td class="p-2">${wrapText(a.DispatchNoteResponseText??"N/A",50)}</td> </tr> </tbody> </table> </div> <div class="card-footer microtext-11 bg-dark bg-opacity-75 d-flex justify-content-between"> <span id="countdown-text" class="m-2"> ${a.TimeRemainingToAcceptCallout} <span class="text-warning">${s}</span> ${a.Seconds}... </span> <div class="d-inline-flex align-items-center"> <button type="button" class="btn ${d} bg-dark bg-opacity-50 btn-sm text-light card-text microtext-11 font-monospace"> ${t.AcceptCallout} </button> <span class="mx-2">/</span> <button type="button" class="btn ${d} bg-dark bg-opacity-50 btn-sm text-light card-text microtext-11 font-monospace"> ${t.CompleteCallout} </button> </div> </div> </div> `),applySavedPosition("callout-prompt-container"),clearInterval(window.countdownInterval),s--,window.countdownInterval=setInterval(function(){s>0?($("#callout-prompt-container").find("#countdown-text").html(`<span> ${a.TimeRemainingToAcceptCallout} <span class="text-warning">${s}</span> ${a.Seconds}... </span>`),s--):(clearInterval(window.countdownInterval),$("#callout-prompt-container").hide(),$.post(`https://${resourceName}/calloutTimeout`,JSON.stringify({})))},1e3)):($("#callout-prompt-container").empty(),$("#callout-prompt-container").hide())}function ToggleCalloutInterface(e,t,a,n,i,o,s,l,r,c,d,u,g,p,b){isDisplayingCalloutInterface=e,e?($("#callout-interface-container").empty().addClass("slideInFromLeft"),$("#callout-interface-container").show(),$("#callout-interface-container").append(` <h6 class="font-monospace text-white"><span class="text-warning">᯽</span> <strong>${r.CalloutName}</strong></h6> <table class="table m-1 text-light"> <tbody> ${a>0?` <tr class="p-2"> <td class="border-0 font-monospace"><span class="text-warning">⟡</span> ${language.InvolvedPedsRemaining}</td> <td class="border-0">${a}/${c}</td> </tr>`:""} ${n>0?` <tr class="p-2"> <td class="border-0 font-monospace"><span class="text-warning">⟡</span> ${language.InvolvedVehsRemaining}</td> <td class="border-0">${n}/${d}</td> </tr>`:""} ${i>0?` <tr class="p-2"> <td class="border-0 font-monospace"><span class="text-warning">⟡</span> ${language.InvolvedObjsRemaining}</td> <td class="border-0">${i}/${u}</td> </tr>`:""} ${o>0?` <tr class="p-2"> <td class="border-0 font-monospace"><span class="text-warning">⟡</span> ${language.InvolvedPropsRemaining}</td> <td class="border-0">${o}/${g}</td> </tr>`:""} ${s>0?` <tr class="p-2"> <td class="border-0 font-monospace"><span class="text-warning">⟡</span> ${language.ExtinguishAllFires}</td> <td class="border-0">${s}/${p}</td> </tr>`:""} ${l>0?` <tr class="p-2"> <td class="border-0 font-monospace"><span class="text-warning">⟡</span> ${language.ClearAreaOfSmoke}</td> <td class="border-0">${l}/${b}</td> </tr>`:""} </tbody> </table> <br> <div class="hint mt-2">${language.Press} ${t.ToggleCalloutInfo} ${language.ToHideOrShow}</div> `),applySavedPosition("callout-interface-container")):($("#callout-interface-container").empty(),$("#callout-interface-container").hide())}function TogglePreCalloutInterface(e,t,a){isDisplayingPreCalloutInterface=e,e?($("#callout-pre-interface-container").empty().addClass("slideInFromLeft"),$("#callout-pre-interface-container").show(),$("#callout-pre-interface-container").append(` <h5 class="font-monospace text-white"> <span class="text-warning">᯽</span> ${wrapText(`${language.EmergencyCall} (${a?.CalloutName??"N/A"})`,40)} </h5> <table class="table m-1 text-light m-1"> <tbody> <tr class="p-2"> <td class="border-0"> <span class="text-warning">⟡</span> <strong class="font-monospace fs-6">${language.Caller}</strong><br> ${wrapText(`${a?.FirstName??"N/A"} ${a?.LastName??"N/A"}`,70)} </td> </tr> <tr class="p-2"> <td class="border-0"> <span class="text-warning">⟡</span> <strong class="font-monospace fs-6">${language.CallDescription}</strong><br> ${wrapText(a?.Description??"N/A",70)} </td> </tr> <tr class="p-2"> <td class="border-0"> <span class="text-warning">⟡</span> <strong class="font-monospace fs-6">${language.Location}</strong><br> ${wrapText(a?.StreetName??"N/A",70)} </td> </tr> <tr class="p-2"> <td class="border-0"> <span class="text-warning">⟡</span> <strong class="font-monospace fs-6">${language.Postal}</strong><br> ${wrapText(a?.Postal??"N/A",70)} </td> </tr> <tr class="p-2"> <td class="border-0"> <span class="text-warning">⟡</span> <strong class="font-monospace fs-6">${language.CalloutUnitsRequired}</strong><br> ${wrapText(a?.CalloutUnitsRequired?.description??"N/A",70)} </td> </tr> <tr class="p-2"> <td class="border-0"> <span class="text-warning">⟡</span> <strong class="font-monospace fs-6">${language.DispatchNote}</strong><br> ${wrapText(language.DispatchNoteResponseText,70)} </td> </tr> </tbody> </table> <br> <div class="hint mt-2">${language.Press} ${t.ToggleCalloutInfo} ${language.ToHideOrShow}</div> `),applySavedPosition("callout-pre-interface-container")):($("#callout-pre-interface-container").empty(),$("#callout-pre-interface-container").hide())}let Waypoints=[];function UpdateWaypointPosition(e,t,a){if(null==Waypoints[0]){$("#waypoint-container").hide();return}let n=document.getElementById("waypoint-container");$("#waypoint-distance").empty(),$("#waypoint-container").show(),$("#waypoint-distance").append(`
|
|
<span class="text-warning">᯽</span> ${a}
|
|
`);let i=window.innerWidth,o=window.innerHeight,s=n.getBoundingClientRect(),l=s.width,r=s.height;n.style.left=(i-l)*e+"px",n.style.top=(o-r)*t+"px"}function AddWaypoint(e){let t=document.getElementById("waypoint-container");e?Waypoints.push({element:t}):($("#waypoint-container").hide(),Waypoints=[])}let escapeEventListenerAddedERSSelectionMenu=!1,menuSoundInstance=null;function ToggleERSSelectionMenu(e,t){if(e){let a=t.isPolice,n=t.isAmbulance,i=t.isFire,o=t.isTow;fadeOutMenuMusic(menuSoundInstance),menuSoundInstance=PlayNUISound("generic-sounds","selectionmenu",.5);let s=` <div class="modal fade" id="ers-selection-modal" tabindex="-1" aria-labelledby="ers-selection-modal-label" aria-hidden="true"> <div class="modal-dialog modal-fullscreen"> <div class="modal-content bg-dark text-light border-rounded font-monospace bg-opacity-50" style="background: url('nui://${resourceName}/NUI/images/ersLogo.png') no-repeat center / 30%;"> <div class="modal-header border-0 d-flex justify-content-center align-items-center position-relative"> <h2 class="modal-title text-white fw-semibold" id="ers-selection-modal-label">${language.SelectService}</h2> <button type="button" id="s-btn-1" class="btn-close btn-close-white position-absolute end-0 me-3" data-bs-dismiss="modal" aria-label="Close" onclick="CancelServiceSelection()"></button> </div> <hr class="text-light my-0"> <div class="modal-body"> <div class="container-fluid"> <div class="row g-4"> <div class="col-12 col-md-6 col-lg-3"> <div class="card card-flash text-white border border-dark" style="background: url('nui://${resourceName}/NUI/images/police.png') no-repeat center center; background-size: cover; min-height: 250px;"> <div class="card-header text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <h5 class="card-title">${language.Police}</h5> </div> <div class="card-body text-center d-flex flex-column justify-content-center"> <p class="badge bg-dark bg-opacity-50 text-wrap font-monospace fs-6 fw-normal"> ${language.PoliceDescription} </p> </div> <div class="card-footer text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <button type="button" id="s-btn-2" class="btn btn-outline-light btn-sm m-2 ${a?"":"disabled"}" ${a?"":"disabled"} onclick="SelectService('police')"> ${language.Select} </button> </div> </div> </div> <div class="col-12 col-md-6 col-lg-3"> <div class="card card-flash text-white border border-dark" style="background: url('nui://${resourceName}/NUI/images/ambulance.png') no-repeat center center; background-size: cover; min-height: 250px;"> <div class="card-header text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <h5 class="card-title">${language.Ambulance}</h5> </div> <div class="card-body text-center d-flex flex-column justify-content-center"> <p class="badge bg-dark bg-opacity-50 text-wrap font-monospace fs-6 fw-normal"> ${language.AmbulanceDescription} </p> </div> <div class="card-footer text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <button type="button" id="s-btn-3" class="btn btn-outline-light btn-sm m-2 ${n?"":"disabled"}" ${n?"":"disabled"} onclick="SelectService('ambulance')"> ${language.Select} </button> </div> </div> </div> <div class="col-12 col-md-6 col-lg-3"> <div class="card card-flash text-white border border-dark" style="background: url('nui://${resourceName}/NUI/images/fire.png') no-repeat center center; background-size: cover; min-height: 250px;"> <div class="card-header text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <h5 class="card-title">${language.Fire}</h5> </div> <div class="card-body text-center d-flex flex-column justify-content-center"> <p class="badge bg-dark bg-opacity-50 text-wrap font-monospace fs-6 fw-normal"> ${language.FireDescription} </p> </div> <div class="card-footer text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <button type="button" id="s-btn-4" class="btn btn-outline-light btn-sm m-2 ${i?"":"disabled"}" ${i?"":"disabled"} onclick="SelectService('fire')"> ${language.Select} </button> </div> </div> </div> <div class="col-12 col-md-6 col-lg-3"> <div class="card card-flash text-white border border-dark" style="background: url('nui://${resourceName}/NUI/images/tow.png') no-repeat center center; background-size: cover; min-height: 250px;"> <div class="card-header text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <h5 class="card-title">${language.Tow}</h5> </div> <div class="card-body text-center d-flex flex-column justify-content-center"> <p class="badge bg-dark bg-opacity-50 text-wrap font-monospace fs-6 fw-normal"> ${language.TowDescription} </p> </div> <div class="card-footer text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <button type="button" id="s-btn-5" class="btn btn-outline-light btn-sm m-2 ${o?"":"disabled"}" ${o?"":"disabled"} onclick="SelectService('tow')"> ${language.Select} </button> </div> </div> </div> </div> </div> </div> <hr class="text-light my-0"> <div class="modal-footer border-0 d-flex justify-content-between align-items-center"> <div class="text-center text-light" style="flex-grow: 1;"> Crafted by <span><img src="nui://${resourceName}/NUI/images/ns.png" alt="Logo 1" class="logo"></span> Nights Software in collaboration with <span><img src="nui://${resourceName}/NUI/images/ls.png" alt="Logo 2" class="logo"></span> London Studios </div> <button type="button" id="s-btn-6" class="btn btn-secondary" data-bs-dismiss="modal" onclick="CancelServiceSelection()">${language.Cancel}</button> </div> </div> </div> </div> `;$("body").append(s),$("#ers-selection-modal").modal({backdrop:"static",keyboard:!1}),$("#ers-selection-modal").modal("show");for(var l=1;l<=6;l++)addSoundOnHoverEventListener("s-btn-"+l);$("#ers-selection-modal").on("shown.bs.modal",function(){escapeEventListenerAddedERSSelectionMenu||($(document).on("keydown",function(e){"Escape"===e.key&&(fadeOutMenuMusic(menuSoundInstance),$("#ers-selection-modal").modal("hide"),CancelServiceSelection(),e.stopPropagation())}),escapeEventListenerAddedERSSelectionMenu=!0)}).on("hidden.bs.modal",function(){$(document).off("keydown"),escapeEventListenerAddedERSSelectionMenu=!1})}else $("#ers-selection-modal").modal("hide").on("hidden.bs.modal",function(){fadeOutMenuMusic(menuSoundInstance),$(this).remove()})}function CancelServiceSelection(){$.post(`https://${resourceName}/cancelServiceSelection`,JSON.stringify({})),$("#ers-selection-modal").modal("hide").on("hidden.bs.modal",function(){fadeOutMenuMusic(menuSoundInstance),$(this).data("bs.modal",null),$(this).remove()})}function SelectService(e){$.post(`https://${resourceName}/selectedService`,JSON.stringify({service:e})),$("#ers-selection-modal").modal("hide").on("hidden.bs.modal",function(){fadeOutMenuMusic(menuSoundInstance),$(this).data("bs.modal",null),$(this).remove()})}function fadeOutMenuMusic(e){null!==e&&(e.fade(e.volume(),0,5e3),setTimeout(function(){e.stop()},5e3))}let escapeEventListenerAddedERSGearnMenu=!1;function DisplayGearMenu(e,t){if(e){fadeOutMenuMusic(menuSoundInstance),menuSoundInstance=PlayNUISound("generic-sounds","selectionmenu",.5);let a=` <div class="modal fade" id="ers-gear-modal" tabindex="-1" aria-labelledby="ers-gear-modal-label" aria-hidden="true"> <div class="modal-dialog modal-fullscreen"> <div class="modal-content bg-dark text-light border-rounded font-monospace bg-opacity-50" style="background: url('nui://${resourceName}/NUI/images/ersLogo.png') no-repeat center / 30%;"> <div class="modal-header border-0 d-flex justify-content-center align-items-center position-relative"> <h2 class="modal-title text-white fw-semibold" id="ers-gear-modal-label">${language.SelectGear}</h2> <button type="button" id="s-btn-1" class="btn-close btn-close-white position-absolute end-0 me-3" data-bs-dismiss="modal" aria-label="Close" onclick="CancelGearSelection()"></button> </div> <hr class="text-light my-0"> <div class="modal-body"> <div class="container-fluid"> <div class="row g-4" id="gear-options"> </div> </div> </div> <hr class="text-light my-0"> <div class="modal-footer border-0 d-flex justify-content-between align-items-center"> <div class="text-center text-light" style="flex-grow: 1;"> Crafted by <span><img src="nui://${resourceName}/NUI/images/ns.png" alt="Logo 1" class="logo"></span> Nights Software in collaboration with <span><img src="nui://${resourceName}/NUI/images/ls.png" alt="Logo 2" class="logo"></span> London Studios </div> <button type="button" id="s-btn-6" class="btn btn-secondary" data-bs-dismiss="modal" onclick="CancelGearSelection()">${language.Cancel}</button> </div> </div> </div> </div> `;$("body").append(a);var n=t.ClothingData;let i=function e(t){switch(t){case"police":return"primary";case"fire":return"danger";case"ambulance":return"warning";case"tow":return"info";default:return"secondary"}}(t.ServiceType);$.each(n,function(e,a){let n=encodeURIComponent(JSON.stringify(t));$("#gear-options").append(` <div class="col-12 col-md-6 col-lg-3"> <div class="card bg-dark bg-opacity-50 card-flash text-white border border-dark"> <div class="card-header text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <h5 class="card-title">${a.Name}</h5> </div> <div class="card-body text-center d-flex flex-column justify-content-center"> <p class="badge bg-${i} bg-opacity-25 text-wrap font-monospace fs-6 fw-normal"> ${a.Description} </p> </div> <div class="card-footer text-center" style="background-color: rgba(0, 0, 0, 0.5);"> <button type="button" id="g-btn-${e}" class="btn btn-outline-light btn-sm m-2" data-key="${e}" data-location-data="${n}" onclick="handleClick(this)"> ${language.Select} </button> </div> </div> </div> `)}),$("#ers-gear-modal").modal({backdrop:"static",keyboard:!1}),$("#ers-gear-modal").modal("show");for(var o=0;o<n.length;o++)addSoundOnHoverEventListener("g-btn-"+o);$("#ers-gear-modal").on("shown.bs.modal",function(){escapeEventListenerAddedERSGearnMenu||($(document).on("keydown",function(e){"Escape"===e.key&&(fadeOutMenuMusic(menuSoundInstance),$("#ers-gear-modal").modal("hide"),CancelGearSelection(),e.stopPropagation())}),escapeEventListenerAddedERSGearnMenu=!0)}).on("hidden.bs.modal",function(){$(document).off("keydown"),escapeEventListenerAddedERSGearnMenu=!1})}else $("#ers-gear-modal").modal("hide").on("hidden.bs.modal",function(){fadeOutMenuMusic(menuSoundInstance),$(this).remove()})}function handleClick(e){let t;SelectedGear(e.getAttribute("data-key"),JSON.parse(decodeURIComponent(e.getAttribute("data-location-data"))))}function SelectedGear(e,t){$.post(`https://${resourceName}/selectedGear`,JSON.stringify({clothingIndex:e,locationData:t})),$("#ers-gear-modal").modal("hide").on("hidden.bs.modal",function(){fadeOutMenuMusic(menuSoundInstance),$(this).data("bs.modal",null),$(this).remove()})}function CancelGearSelection(){$.post(`https://${resourceName}/cancelGearSelection`,JSON.stringify({})),$("#ers-gear-modal").modal("hide").on("hidden.bs.modal",function(){fadeOutMenuMusic(menuSoundInstance),$(this).data("bs.modal",null),$(this).remove()})}const containerIDs={preCallout:"#callout-pre-interface-container",callout:"#callout-interface-container"};function slideOut(e){$(e).removeClass("slideInFromLeft").addClass("slideOutToLeft"),setTimeout(()=>$(e).hide(),250)}function slideIn(e){$(e).show().removeClass("slideOutToLeft").addClass("slideInFromLeft")}function toggleCalloutInfo(){if(isDisplayingPreCalloutInterface){let e=containerIDs.preCallout;$(e).is(":visible")?slideOut(e):slideIn(e)}if(isDisplayingCalloutInterface){let t=containerIDs.callout;$(t).is(":visible")?slideOut(t):slideIn(t)}}function updateWaypoints(e){let t=e.data,a=trackExistingUnitWaypoints();for(let[n,i]of Object.entries(t))null!==i&&i.distanceText>0&&processUnitWaypoint(n,i,a);removeUnusedUnitWaypoints(a)}function trackExistingUnitWaypoints(){let e=new Set;return document.querySelectorAll(".unit-waypoint-container").forEach(t=>{e.add(t.id)}),e}function processUnitWaypoint(e,t,a){let n=`unit-waypoint-container-${e}`,i=document.getElementById(n);i||(i=createUnitWaypointContainer(n)),updateUnitWaypointPosition(i,t),updateUnitWaypointContent(i,t),a.delete(n)}function createUnitWaypointContainer(e){let t=document.createElement("div");return t.classList.add("unit-waypoint-container","smooth-transition"),t.id=e,document.body.appendChild(t),t}function updateUnitWaypointPosition(e,t){let a=window.innerWidth,n=window.innerHeight,i=e.getBoundingClientRect(),o=i.width,s=i.height;t.scaleX>=0&&t.scaleX<=1&&t.scaleY>=0&&t.scaleY<=1&&(e.style.left=(a-o)*t.scaleX+"px",e.style.top=(n-s)*t.scaleY+"px")}function updateUnitWaypointContent(e,t){e.innerHTML=`
|
|
<span class="unit-waypoint-distance">᯽</span> <span class="unit-waypoint-distance-text">${t.distanceText}${t.metrics}</span>
|
|
`}function removeUnusedUnitWaypoints(e){e.forEach(e=>{let t=document.getElementById(e);t&&t.remove()})}function ToggleQuestionsModule(e,t){if(e){if($("#question-options-list").empty(),$("#ped-interaction-questioning").show(),t.length>0){let a=`
|
|
<div class="flex flex-col space-y-4">
|
|
${t.map((e,t)=>`
|
|
<button
|
|
type="button"
|
|
id="s-btn-${t+1}"
|
|
class="btn btn-glass d-flex align-items-center mb-3 rounded-3 px-4 py-3 fw-semibold card-text text-sm text-light question-btn"
|
|
data-target="${e.id}"
|
|
data-question-text="${e.text}"
|
|
data-sound-file="${e.soundFile}"
|
|
data-sound-volume="${e.soundVolume}"
|
|
>
|
|
<span class="gold-dot me-3"></span>
|
|
<span class="question-text" style="white-space: pre-line;">${wrapText(e.text,30)}</span>
|
|
</button>
|
|
`).join("")}
|
|
</div>
|
|
`;$("#question-options-list").append(a),applySavedPosition("ped-interaction-questioning"),t.forEach((e,t)=>{let a=`s-btn-${t+1}`;document.getElementById(a)&&addSoundOnHoverEventListener(a)}),$("#question-options-list button").off("click").on("click",function(){let e=$(this).data("target"),t=$(this).data("question-text"),a=$(this).data("sound-file"),n=$(this).data("sound-volume");e&&(PlayNUISound("generic-sounds","q_select",1),$.post(`https://${resourceName}/questionSelected`,JSON.stringify({questionData:{id:e,text:t,soundFile:a,soundVolume:n}})))})}let n=`
|
|
<button
|
|
id="leave-questioning-btn"
|
|
class="btn btn-glass d-flex align-items-center mt-8 rounded-3 px-4 py-3 card-text text-sm text-light"
|
|
>
|
|
${language.ExitConversation}
|
|
</button>
|
|
`;$("#question-leave-btn").html(n),document.getElementById("leave-questioning-btn")&&addSoundOnHoverEventListener("leave-questioning-btn"),$("#leave-questioning-btn").off("click").on("click",function(){PlayNUISound("generic-sounds","radialclose",.5),$.post(`https://${resourceName}/leaveQuestioning`,JSON.stringify({}))})}else $("#ped-interaction-questioning").hide(),$("#question-options-list").empty(),$("#question-leave-btn").empty()}function UpdateAnswers(e,t){if(e){let a=$("#question-answers-list");a.empty(),a.html(`
|
|
<div class="conversation-header mb-3">
|
|
<div class="d-flex align-items-center">
|
|
<i class="fa-regular fa-comments text-warning me-2"></i>
|
|
<h6 class="text-light mb-0 font-monospace">${language.ConversationHistory}</h6>
|
|
</div>
|
|
</div>
|
|
<div class="conversation-body">
|
|
<div id="answers-column" class="chat-history" style="max-height: 300px; overflow-y: auto; padding-right: 8px;">
|
|
<div class="d-flex flex-column gap-2">
|
|
${Array.isArray(t)&&t.length>0?t.map((e,t)=>`
|
|
<div class="card bg-black bg-opacity-50 border-0 rounded-3">
|
|
<div class="card-body p-2">
|
|
<div class="d-flex align-items-start">
|
|
<div class="flex-shrink-0">
|
|
<div class="avatar-sm rounded-circle bg-warning bg-opacity-25 d-flex align-items-center justify-content-center" style="width: 32px; height: 32px;">
|
|
<img src="${e.userProfileURL||""}" alt="User Profile" style="width: 100%; height: 100%; object-fit: cover; object-position: top;">
|
|
</div>
|
|
</div>
|
|
<div class="flex-grow-1 ms-2">
|
|
<div class="d-flex align-items-center mb-1">
|
|
<small class="text-muted me-2">${e.question||""}</small>
|
|
<small class="text-muted">${new Date().toLocaleTimeString()}</small>
|
|
</div>
|
|
<p class="card-text text-sm text-light mb-0">${e.answer||""}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`).join(""):'<div class="text-light text-center">...</div>'}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`)}else $("#question-answers-list").empty()}function ToggleDualSteeringMode(e){let t=$("#dual-steering-mode");t.toggle(e),e?(t.html(`
|
|
<div class="dual-steering-mode-title">${language.DualSteeringMode}</div>
|
|
<div class="dual-steering-mode-sep"></div>
|
|
<div class="dual-steering-mode-hint-row"><span class="dual-steering-mode-key">↑</span><span class="dual-steering-mode-action">${language.ReelInWinch}</span></div>
|
|
<div class="dual-steering-mode-hint-row"><span class="dual-steering-mode-key">↓</span><span class="dual-steering-mode-action">${language.ReelOutWinch}</span></div>
|
|
<div class="dual-steering-mode-hint-row"><span class="dual-steering-mode-key">→</span><span class="dual-steering-mode-action">${language.SteerRight}</span></div>
|
|
<div class="dual-steering-mode-hint-row"><span class="dual-steering-mode-key">←</span><span class="dual-steering-mode-action">${language.SteerLeft}</span></div>
|
|
<div class="dual-steering-mode-hint-row"><span class="dual-steering-mode-key">⌫</span><span class="dual-steering-mode-action">${language.DisconnectWinch}</span></div>
|
|
`),applySavedPosition("dual-steering-mode")):t.empty()}function hideAllPrompts(){$("#unified-prompt").empty().hide()}function PlayNUISound(e,t,a){var n=null;return null!=n&&n.pause(),(n=new Howl({src:[`nui://${resourceName}/NUI/sounds/${e}/${t}.ogg`]})).volume(a),n.play(),n}function wrapText(e,t){let a=[],n="";for(let i of e.toString().split(/\s+/))n.length+i.length+(n.length>0?1:0)>t&&(a.push(n.trim()+"-"),n=""),n+=(n.length>0?" ":"")+i;return n.length>0&&a.push(n.trim()),a.join("<br>")}function applySavedPosition(e){}
|