Main/resources/[creator]/blips_creator/html/index.js

745 lines
22 KiB
JavaScript
Raw Normal View History

2025-06-07 08:51:21 +02:00
const resName = GetParentResourceName();
let isCreatingGlobalBlip = false;
let blipIdToDuplicate = null;
let isAdmin = false;
let currentGameBuild = null;
let spritesIDs = {};
const colors = {
[0]: "rgb(254, 254, 254)",
[1]: "rgb(224, 50, 50)",
[2]: "rgb(113, 203, 113)",
[3]: "rgb(93, 182, 229)",
[4]: "rgb(254, 254, 254)",
[5]: "rgb(238, 198, 78)",
[6]: "rgb(194, 80, 80)",
[7]: "rgb(156, 110, 175)",
[8]: "rgb(254, 122, 195)",
[9]: "rgb(245, 157, 121)",
[10]: "rgb(177, 143, 131)",
[11]: "rgb(141, 206, 167)",
[12]: "rgb(112, 168, 174)",
[13]: "rgb(211, 209, 231)",
[14]: "rgb(143, 126, 152)",
[15]: "rgb(106, 196, 191)",
[16]: "rgb(213, 195, 152)",
[17]: "rgb(234, 142, 80)",
[18]: "rgb(151, 202, 233)",
[19]: "rgb(178, 98, 135)",
[20]: "rgb(143, 141, 121)",
[21]: "rgb(166, 117, 94)",
[22]: "rgb(175, 168, 168)",
[23]: "rgb(231, 141, 154)",
[24]: "rgb(187, 214, 91)",
[25]: "rgb(12, 123, 86)",
[26]: "rgb(122, 195, 254)",
[27]: "rgb(171, 60, 230)",
[28]: "rgb(205, 168, 12)",
[29]: "rgb(69, 97, 171)",
[30]: "rgb(41, 165, 184)",
[31]: "rgb(184, 155, 123)",
[32]: "rgb(200, 224, 254)",
[33]: "rgb(240, 240, 150)",
[34]: "rgb(237, 140, 161)",
[35]: "rgb(249, 138, 138)",
[36]: "rgb(251, 238, 165)",
[37]: "rgb(254, 254, 254)",
[38]: "rgb(44, 109, 184)",
[39]: "rgb(154, 154, 154)",
[40]: "rgb(76, 76, 76)",
[41]: "rgb(242, 157, 157)",
[42]: "rgb(108, 183, 214)",
[43]: "rgb(175, 237, 174)",
[44]: "rgb(255, 167, 95)",
[45]: "rgb(241, 241, 241)",
[46]: "rgb(236, 240, 41)",
[47]: "rgb(255, 154, 24)",
[48]: "rgb(246, 68, 165)",
[49]: "rgb(224, 58, 58)",
[50]: "rgb(138, 109, 227)",
[51]: "rgb(255, 139, 92)",
[52]: "rgb(65, 108, 65)",
[53]: "rgb(179, 221, 243)",
[54]: "rgb(58, 100, 121)",
[55]: "rgb(160, 160, 160)",
[56]: "rgb(132, 114, 50)",
[57]: "rgb(101, 185, 231)",
[58]: "rgb(75, 65, 117)",
[59]: "rgb(225, 59, 59)",
[60]: "rgb(240, 203, 88)",
[61]: "rgb(205, 63, 152)",
[62]: "rgb(207, 207, 207)",
[63]: "rgb(39, 106, 159)",
[64]: "rgb(216, 123, 27)",
[65]: "rgb(142, 131, 147)",
[66]: "rgb(240, 203, 87)",
[67]: "rgb(101, 185, 231)",
[68]: "rgb(101, 185, 231)",
[69]: "rgb(121, 205, 121)",
[70]: "rgb(239, 202, 87)",
[71]: "rgb(239, 202, 87)",
[72]: "rgb(61, 61, 61)",
[73]: "rgb(239, 202, 87)",
[74]: "rgb(101, 185, 231)",
[75]: "rgb(224, 50, 50)",
[76]: "rgb(120, 35, 35)",
[77]: "rgb(101, 185, 231)",
[78]: "rgb(58, 100, 121)",
[79]: "rgb(224, 50, 50)",
[80]: "rgb(101, 185, 231)",
[81]: "rgb(242, 164, 12)",
[82]: "rgb(164, 204, 170)",
[83]: "rgb(168, 84, 242)",
[84]: "rgb(101, 185, 231)",
[85]: "rgb(61, 61, 61)",
}
function showNotification(message, duration=false) {
var notification = $("#notification");
if(duration) {
notification.toast({
autohide: true,
delay: duration
})
} else {
notification.toast({
autohide: false,
})
}
$("#notification-message").text(message)
notification.toast("show")
}
function getPathForSprite(spriteId) {
const spriteData = spritesIDs[spriteId]
if(spriteData.position) {
return `../_sprites/REPLACEABLE/${spriteData.image}`
} else {
return `../_sprites/NOT_REPLACEABLE/${spriteData.image}`
}
}
function fillSprites(){
var spritesDiv = $("#blip-sprites");
for (const [id, spriteData] of Object.entries(spritesIDs)) {
var currentSpritesCount = spritesDiv.children().last().children().length
var sprite = $(`
<div class="col-1">
<img src="${getPathForSprite(id)}" class="blip-sprite img-fluid p-2">
</div>
`)
sprite.val(id)
if(currentSpritesCount < 12 && currentSpritesCount > 0) {
var lastRow = spritesDiv.children().last();
lastRow.append(sprite)
} else {
var newRow = $(`<div class="row"></div>`);
newRow.append(sprite)
spritesDiv.append(newRow)
}
sprite.click(function(){
var blipSprite = $(this).val();
var blipId = $("#edit-blip").val()
$("#blip-sprites").hide();
if(spritesIDs[blipSprite].gameBuild <= gameBuild) {
$("#edit-blip-sprite").attr("src", getPathForSprite(blipSprite))
$.post(`https://${resName}/edit-blip-sprite`, JSON.stringify({blipSprite: blipSprite, blipId: blipId}))
} else {
showNotification(`This sprite requires ${spritesIDs[blipSprite].gameBuild} server game build`, 3000)
}
})
}
}
function fillColors(){
var colorsDiv = $("#blip-colors")
for (const [id, rgb] of Object.entries(colors)) {
var currentColorsCount = colorsDiv.children().last().children().length
var color = $(`<div class="blip-color m-1 col-1"></div>`);
color.css({"background-color": rgb});
color.data("color-id", id)
if(currentColorsCount < 9 && currentColorsCount > 0) {
var lastRow = colorsDiv.children().last();
lastRow.append(color);
} else {
var newRow = $(`<div class="row"></div>`);
newRow.append(color)
colorsDiv.append(newRow)
}
color.click(function(){
var blipId = $("#edit-blip").val();
var blipColor = $(this).data("color-id");
$.post(`https://${resName}/edit-blip-color`, JSON.stringify({blipId: blipId, blipColor: blipColor}))
})
}
} fillColors();
function editBlip(blipId, blipData) {
$("#edit-blip").val(blipId);
setBlipType(blipData.type)
$(`#edit-blip-type option[value="${blipData.type}"]`).prop("selected", true)
$("#edit-blip-name").val(blipData.name)
$("#edit-blip-scale").val(blipData.scale)
$("#edit-blip-alpha").val(blipData.alpha)
$("#edit-blip-sprite").attr("src", getPathForSprite(blipData.sprite))
$("#edit-blip-tick").prop("checked", blipData.ticked)
$("#edit-blip-outline").prop("checked", blipData.outline)
// If is global hides share btn
if(!blipData.identifier) {
$("#edit-blip-share-btn").hide();
$("#edit-blip").data("is-global", true);
$("#edit-blip").data("global-id", blipData.id);
} else {
$("#edit-blip-share-btn").show();
$("#edit-blip").data("is-global", false);
}
switch(blipData.display){
case 2: {
$("#edit-blip-display-both").prop("checked", true)
$("#edit-blip-display-mainmap").prop("checked", false)
$("#edit-blip-display-minimap").prop("checked", false)
break;
}
case 3: {
$("#edit-blip-display-both").prop("checked", false)
$("#edit-blip-display-mainmap").prop("checked", true)
$("#edit-blip-display-minimap").prop("checked", false)
break;
}
case 5: {
$("#edit-blip-display-both").prop("checked", false)
$("#edit-blip-display-mainmap").prop("checked", false)
$("#edit-blip-display-minimap").prop("checked", true)
break;
}
}
$("#map-utilities").hide();
$("#edit-blip").fadeIn();
$("#edit-blip").scrollTop(0)
}
function hideBlip(blipId) {
$.post(`https://${resName}/hide-blip`, JSON.stringify({blipId: blipId}))
}
function showBlip(blipId) {
$.post(`https://${resName}/show-blip`, JSON.stringify({blipId: blipId}))
}
function addBlip(blipId, blipData, canBeEdited){
var container = $("#blips-container");
var lastRow = container.children().last();
var currentBlipsInRow = lastRow.children().length;
var blipDiv = $(`
<div class="blip col border rounded m-2">
<nav class="col-12 float-end">
<ul class="pagination float-end">
<li class="page-item">
<i class="blip-duplicate icon-hoverable bi bi-back float-end fs-3 mx-2"></i>
</li>
<li class="page-item">
${blipData.isHidden && '<i class="blip-toggle icon-hoverable bi bi-eye-slash float-end fs-3"></i>' || '<i class="blip-toggle icon-hoverable bi bi-eye float-end fs-3"></i>'}
</li>
</ul>
</nav>
<p class="blip-name text-center fs-2 fw-bold mt-1">${blipData.name}</p>
<p class="blip-street text-center fs-5 fw-light">${blipData.streetName}</p>
</div>
`);
if(blipData.type == "coords") {
blipDiv.append(`
<img src="${getPathForSprite(blipData.sprite)}" class="blip-sprite rounded mx-auto d-block mb-3" alt="...">
`)
} else if(blipData.type == "area") {
blipDiv.append(`<p class="text-center fs-4">Area</p>`)
}else if(blipData.type == "radius") {
blipDiv.append(`<p class="text-center fs-4">Radius</p>`)
}
if(!blipData.identifier) {
blipDiv.addClass("border-warning");
}
if(currentBlipsInRow < 4 && currentBlipsInRow > 0) {
lastRow.append(blipDiv);
} else {
var newRow = $(`<div class="row"></div>`);
newRow.append(blipDiv);
newRow.append(blipDiv);
container.append(newRow);
}
if(canBeEdited) {
blipDiv.click(function(){
editBlip(blipId, blipData);
})
}
blipDiv.find('.blip-toggle').click(function(e) {
e.preventDefault();
e.stopPropagation();
let eyeDiv = $(this)
if(eyeDiv.hasClass("bi-eye")) {
eyeDiv.removeClass("bi-eye");
eyeDiv.addClass("bi-eye-slash");
hideBlip(blipId)
} else {
eyeDiv.removeClass("bi-eye-slash");
eyeDiv.addClass("bi-eye");
showBlip(blipId)
}
});
blipDiv.find(".blip-duplicate").click(function(e) {
e.preventDefault();
e.stopPropagation();
blipIdToDuplicate = blipId;
$("#map-utilities").hide();
$("#create-blip-mode").modal("show");
});
}
function addBlips(blips, isAdmin) {
$("#blips-container").empty();
if(Object.keys(blips).length > 0) {
let globalBlips = {} // Separated so it can be added after local blips (sorting)
for (const [blipId, blipData] of Object.entries(blips)) {
if(blipData){
if(blipData.identifier) {
addBlip(blipId, blipData, true)
} else {
globalBlips[blipId] = blipData
}
}
}
for (const [blipId, blipData] of Object.entries(globalBlips)) {
if(blipData){
addBlip(blipId, blipData, isAdmin)
}
}
} else {
$("#blips-container").append(`<p class="mt-4 fs-1 text-center">No blips created</p>`);
}
}
$("#edit-blip-sprite").click(function(){
$("#blip-sprites").fadeIn();
})
$("#edit-blip-close-btn").click(function(){
var editBlipDiv = $("#edit-blip");
var blipId = parseInt(editBlipDiv.val());
$.post(`https://${resName}/save-blip`, JSON.stringify({blipId: blipId}), function(isSuccessful){
$("#edit-blip").hide();
openBlipsMenu()
})
})
$("#map-utilities-close-btn").click(function(){
$("#map-utilities").fadeOut();
$.post(`https://${resName}/close`)
})
$("#create-blip-btn").click(function(){
$("#map-utilities").hide();
$("#create-blip-mode").modal("show");
})
$("#edit-blip-name").change(function(){
var blipId = $("#edit-blip").val()
var blipName = $(this).val();
$.post(`https://${resName}/edit-blip-name`, JSON.stringify({blipId: blipId, blipName: blipName}))
})
$("#edit-blip-scale").change(function(){
var blipId = $("#edit-blip").val()
var blipScale = $(this).val();
$.post(`https://${resName}/edit-blip-scale`, JSON.stringify({blipId: blipId, blipScale: blipScale}))
})
$("#edit-blip-alpha").change(function(){
var blipId = $("#edit-blip").val()
var blipAlpha = $(this).val();
$.post(`https://${resName}/edit-blip-alpha`, JSON.stringify({blipId: blipId, blipAlpha: blipAlpha}))
})
$("#edit-blip-tick").change(function(){
var blipId = $("#edit-blip").val()
var blipTick = $(this).prop("checked");
$.post(`https://${resName}/edit-blip-tick`, JSON.stringify({blipId: blipId, blipTick: blipTick}))
})
$("#edit-blip-outline").change(function(){
var blipId = $("#edit-blip").val()
var blipOutline = $(this).prop("checked");
$.post(`https://${resName}/edit-blip-outline`, JSON.stringify({blipId: blipId, blipOutline: blipOutline}))
})
$("#edit-blip-delete-btn").click(function(){
$("#delete-blip-modal").modal("show");
})
$("#delete-blip-btn").click(function(){
var editBlipDiv = $("#edit-blip");
var blipId = $("#edit-blip").val()
if(editBlipDiv.data("is-global")) {
var globalId = parseInt(editBlipDiv.data("global-id"));
$.post(`https://${resName}/delete-global-blip`, JSON.stringify({globalId: globalId, blipId: blipId}))
} else {
$.post(`https://${resName}/delete-blip`, JSON.stringify({blipId: blipId}))
}
$("#delete-blip-modal").modal("hide");
$("#edit-blip").hide();
openBlipsMenu()
})
$('input[type=range]').on('input', function () {
$(this).trigger('change');
});
$('input[type=radio][name=edit-blip-display]').change(function() {
var blipId = $("#edit-blip").val()
var display = $(this).data("display");
$.post(`https://${resName}/edit-blip-display`, JSON.stringify({blipId: blipId, blipDisplay: display}))
});
$("#create-blip-from-coords-btn").click(function(){
$("#x-coord").val("");
$("#y-coord").val("");
$("#z-coord").val("");
$("#x-coord").removeClass("is-invalid");
$("#y-coord").removeClass("is-invalid");
$("#z-coord").removeClass("is-invalid");
$("#create-blip-mode").modal("hide")
$("#create-from-coords-modal").modal("show")
})
$("#confirm-from-coords").click(function(){
var isEverythingFilled = true;
var xInput = $("#x-coord")
var yInput = $("#y-coord")
var zInput = $("#z-coord")
var xCoord = xInput.val();
var yCoord = yInput.val();
var zCoord = zInput.val();
if(!xCoord || xCoord != parseFloat(xCoord)) {
xInput.addClass("is-invalid");
isEverythingFilled = false
} else {
xInput.removeClass("is-invalid")
}
if(!yCoord || yCoord != parseFloat(yCoord)) {
yInput.addClass("is-invalid");
isEverythingFilled = false
} else {
yInput.removeClass("is-invalid")
}
if(!zCoord || zCoord != parseFloat(zCoord)) {
zInput.addClass("is-invalid");
isEverzthingFilled = false
} else {
zInput.removeClass("is-invalid")
}
if(isEverythingFilled) {
$("#create-from-coords-modal").modal("hide")
if(blipIdToDuplicate) {
$.post(`https://${resName}/duplicate-blip-from-coords`, JSON.stringify({blipIdToDuplicate: blipIdToDuplicate, x: xCoord, y: yCoord, z: zCoord}), function(data){
blipIdToDuplicate = null;
$.post(`https://${resName}/focus`)
openBlipsMenu()
});
} else {
$.post(`https://${resName}/create-blip-from-coords`, JSON.stringify({isGlobal: isCreatingGlobalBlip, x: xCoord, y: yCoord, z: zCoord}), function(data){
$.post(`https://${resName}/focus`)
openBlipsMenu()
});
}
}
})
$("#create-blip-place-blip-btn").click(function(){
$("#create-blip-mode").modal("hide")
showNotification("Where your blip should be?")
if(blipIdToDuplicate) {
$.post(`https://${resName}/duplicate-blip`, JSON.stringify({blipIdToDuplicate: blipIdToDuplicate}), function(data){
hideNotification()
blipIdToDuplicate = null;
$.post(`https://${resName}/focus`)
openBlipsMenu()
});
} else {
$.post(`https://${resName}/create-blip`, JSON.stringify({isGlobal: isCreatingGlobalBlip}), function(data){
hideNotification()
$.post(`https://${resName}/focus`)
openBlipsMenu()
})
}
})
$("#from-coords-close-btn").click(function(){
$("#create-blip-mode").modal("show");
})
$("#blip-mode-close-btn").click(function(){
openBlipsMenu()
})
$("#edit-blip-share-btn").click(function(){
var editBlipDiv = $("#edit-blip");
var blipId = parseInt(editBlipDiv.val());
$.post(`https://${resName}/save-blip`, JSON.stringify({blipId: blipId}), function(isSuccessful){
if(isSuccessful){
var playerIdInput = $("#player-id")
playerIdInput.val("");
playerIdInput.removeClass("is-invalid");
$("#share-choose-id").modal("show");
}
})
})
$("#share-btn").click(function(){
var playerIdInput = $("#player-id")
var playerId = playerIdInput.val();
if(!playerId || playerId != parseInt(playerId)) {
playerIdInput.addClass("is-invalid");
} else {
var blipId = $("#edit-blip").val()
$.post(`https://${resName}/share-blip`, JSON.stringify({playerId: parseInt(playerId), blipId: blipId}));
$("#share-choose-id").modal("hide");
}
});
$("#refresh-blips-btn").click(function(){
$("#map-utilities").hide();
openBlipsMenu()
})
function mapActive(){
showNotification("Press SPACEBAR to open the menu", 3000)
}
function hideNotification(){
$("#notification").toast("hide");
}
function openBlipsMenu(){
if(isCreatingGlobalBlip) {
isCreatingGlobalBlip = false
}
$.post(`https://${resName}/get-saved-blips`, {}, function(blips){
blips = JSON.parse(blips)
addBlips(blips, isAdmin)
$("#map-utilities").fadeIn();
})
}
function activateAdmin(){
isAdmin = true
$("#create-global-blip-btn").unbind().click(function(){
isCreatingGlobalBlip = true;
$("#map-utilities").hide();
$("#create-blip-mode").modal("show");
});
}
// Click if the player is not admin
$("#create-global-blip-btn").click(function() {
$("#map-utilities").hide();
$.post(`https://${resName}/askForNotAllowedMenu`, {});
})
window.addEventListener('message', (event) => {
let data = event.data
let action = data.action;
if(action == 'mapActive') {
mapActive();
} else if(action == 'mapClosed') {
hideNotification();
} else if(action == 'openBlipsMenu') {
openBlipsMenu();
} else if(action == "activateAdmin") {
activateAdmin();
} else if (action == "setGameBuild") {
gameBuild = data.gameBuild;
} else if (action == "loadSprites") {
spritesIDs = data.spritesIDs;
fillSprites()
}
})
function setBlipType(type) {
switch(type) {
case 'coords': {
$("#edit-blip-scale-container").show();
$("#edit-blip-tick-container").show();
$("#edit-blip-outline-container").show();
$("#edit-blip-sprite-container").show();
$("#edit-blip-height-width-container").hide();
let blipScaleDiv = $("#edit-blip-scale");
blipScaleDiv.attr("min", 0.5);
blipScaleDiv.attr("max", 2.0);
blipScaleDiv.attr("step", 0.01);
break;
}
case 'area': {
$("#edit-blip-scale-container").hide();
$("#edit-blip-tick-container").hide();
$("#edit-blip-outline-container").hide();
$("#edit-blip-sprite-container").hide();
$("#edit-blip-height-width-container").show();
break;
}
case 'radius': {
$("#edit-blip-scale-container").show();
$("#edit-blip-tick-container").hide();
$("#edit-blip-outline-container").hide();
$("#edit-blip-sprite-container").hide();
$("#edit-blip-height-width-container").hide();
let blipScaleDiv = $("#edit-blip-scale");
blipScaleDiv.attr("min", 1.0);
blipScaleDiv.attr("max", 10000.0);
blipScaleDiv.attr("step", 1.0);
break;
}
}
}
$("#edit-blip-type").change(function() {
let blipType = $(this).val()
let blipId = $("#edit-blip").val()
setBlipType(blipType)
$.post(`https://${resName}/edit-blip-type`, JSON.stringify({blipId: blipId, blipType: blipType}))
})
$("#edit-blip-width").change(function() {
let blipWidth = $(this).val()
let blipId = $("#edit-blip").val()
$.post(`https://${resName}/edit-blip-width`, JSON.stringify({blipId: blipId, blipWidth: blipWidth}))
})
$("#edit-blip-height").change(function() {
let blipHeight = $(this).val()
let blipId = $("#edit-blip").val()
$.post(`https://${resName}/edit-blip-height`, JSON.stringify({blipId: blipId, blipHeight: blipHeight}))
})
async function getCurrentCoords() {
return new Promise((resolve, reject) => {
$.post(`https://${resName}/getCurrentCoords`, {}, function(coords) {
resolve(coords);
})
});
}
$("#current-coords-btn").click(async function() {
let coords = await getCurrentCoords();
$("#x-coord").val(coords.x);
$("#y-coord").val(coords.y);
$("#z-coord").val(coords.z);
})