2026-04-14 17:41:39 +02:00

495 lines
19 KiB
JavaScript

import inlinesvg from './util/inlinesvg.js';
import localeEn from "./en.js";
const store = Vuex.createStore({
components: {
inlinesvg: inlinesvg,
},
state: {},
getters: {},
mutations: {},
actions: {}
});
const app = Vue.createApp({
components: {
inlinesvg: inlinesvg,
},
data: () => ({
selectpage: 'selectplayer',
newCharacter: false,
createModal: false,
buyCharacter: false,
tbxID: "Your tbx-id...",
selectedCharacter: false,
characterData: [],
serverlogo: "https://r2.fivemanage.com/8Hb4twhFSbaNdR27bPGV4/m_logo.png",
maxSlots: [],
selectedGender: 'male',
characterInfo: {
firstname: '',
lastname: '',
birthdate: false,
height: 150,
nationality: 'USA'
},
playerActiveSlots: false,
characterIndex: 0,
myCharacter: [],
lastLocation: null,
deleteCharacterButton: false,
currentThema: 'white',
isChanging: false,
locales: [],
moneyType: '$',
closeServerModal: false,
deleteCharacterModal: false,
clickedCountine : false,
}),
methods: {
continuePlayer() {
const character = this.characterData[this.characterIndex];
if (character && !this.clickedCountine) {
this.clickedCountine = true;
postNUI('continuePlayer', character);
}
this.characterIndex = 0;
},
async ChangeCharacter(direction) {
if (this.isChanging) return;
this.isChanging = true;
if (this.characterIndex === this.maxSlots.length - 1 && direction === 'next') {
this.isChanging = false;
return;
}
if (direction === 'next' && this.characterIndex < this.maxSlots.length - 1) {
this.characterIndex++;
const character = this.characterData[this.characterIndex];
if (character) {
this.SelectCharacter(character)
return this.myCharacter = { ...character, label: `${character.charinfo.firstname} ${character.charinfo.lastname}`, isNew: false, isBuy: false };
} else if (this.maxSlots[this.characterIndex]?.tebex) {
this.buyCharacter = true
postNUI('newCharacter')
this.selectedCharacter = false
this.newCharacter = false
setTimeout(() => {
this.isChanging = false;
}, 400);
return this.myCharacter = { label: this.locales["BUYSLOTJS"], isNew: false, isBuy: true };
}
postNUI('newCharacter')
this.selectedCharacter = false
this.buyCharacter = false
this.newCharacter = true
setTimeout(() => {
let nowData = new Date();
this.$nextTick(() => {
let vm = this;
let dp = new AirDatepicker("#pickerinput", {
locale: localeEn,
maxDate: nowData,
onSelect({ date, formattedDate }) {
vm.characterInfo.birthdate = formattedDate
},
});
});
}, 600);
setTimeout(() => {
this.isChanging = false;
}, 400);
return this.myCharacter = { label: this.locales["NEW_CHARACTER_JS"] , isNew: true, isBuy: false };
} else if (direction === 'previus' && this.characterIndex > 0) {
this.characterIndex--;
const character = this.characterData[this.characterIndex];
if (character) {
this.SelectCharacter(character)
return this.myCharacter = { ...character, label: `${character.charinfo.firstname} ${character.charinfo.lastname}`, isNew: false, isBuy: false };
} else if (this.maxSlots[this.characterIndex]?.tebex) {
postNUI('newCharacter')
this.buyCharacter = true
this.selectedCharacter = false
this.newCharacter = false
setTimeout(() => {
this.isChanging = false;
}, 400);
return this.myCharacter = { label: this.locales["BUYSLOTJS"], isNew: false, isBuy: true };
}
postNUI('newCharacter')
this.selectedCharacter = false
this.buyCharacter = false
this.newCharacter = true
setTimeout(() => {
let nowData = new Date();
this.$nextTick(() => {
let vm = this;
let dp = new AirDatepicker("#pickerinput", {
locale: localeEn,
maxDate: nowData,
onSelect({ date, formattedDate }) {
vm.characterInfo.birthdate = formattedDate
},
});
});
}, 600);
setTimeout(() => {
this.isChanging = false;
}, 400);
return this.myCharacter = { label: this.locales["NEW_CHARACTER_JS"], isNew: true, isBuy: false };
}
this.clickedCountine = false;
},
validateBirthdateInput(event) {
const char = String.fromCharCode(event.keyCode);
const regex = /[0-9]|\/|/;
if (!regex.test(char)) {
event.preventDefault();
}
const value = event.target.value;
this.characterInfo.birthdate = value
if (value.length === 2 || value.length === 5) {
if (event.keyCode !== 47) {
event.target.value = value + '/';
}
}
},
checkInputMin() {
if (this.characterInfo.firstname.length > 0) {
this.characterInfo.firstname = this.characterInfo.firstname.replace(/[^a-zA-Z]/g, "");
}
if (this.characterInfo.lastname.length > 0) {
this.characterInfo.lastname = this.characterInfo.lastname.replace(/[^a-zA-Z]/g, "");
}
// if (this.characterInfo.height.length > 0) {
// this.characterInfo.height = this.characterInfo.height.replace(/[^0-9]/g, "");
// }
},
changeGender(val) {
this.selectedGender = val
},
async deleteCharacter() {
if (this.selectedCharacter) {
let result = await postNUI('DeleteCharacter', this.selectedCharacter)
if (result) {
this.selectedCharacter = false
this.characterData = result
const character = this.characterData[this.characterIndex];
if (character) {
this.SelectCharacter(character)
return this.myCharacter = { ...character, label: `${character.charinfo.firstname} ${character.charinfo.lastname}`, isNew: false, isBuy: false };
} else if (this.maxSlots[this.characterIndex]?.tebex) {
postNUI('newCharacter')
this.selectedCharacter = false
this.newCharacter = false
this.buyCharacter = true
setTimeout(() => {
this.isChanging = false;
}, 400);
return this.myCharacter = { label: this.locales["BUYSLOTJS"], isNew: false, isBuy: true };
}
postNUI('newCharacter')
this.selectedCharacter = false
this.buyCharacter = false
this.newCharacter = true
setTimeout(() => {
let nowData = new Date();
this.$nextTick(() => {
let vm = this;
let dp = new AirDatepicker("#pickerinput", {
locale: localeEn,
maxDate: nowData,
onSelect({ date, formattedDate }) {
vm.characterInfo.birthdate = formattedDate
},
});
});
}, 600);
setTimeout(() => {
this.isChanging = false;
}, 400);
this.myCharacter = { label: this.locales["NEW_CHARACTER_JS"], isNew: true, isBuy: false };
} else {
console.log('error')
}
}
},
async SelectCharacter(val) {
this.newCharacter = false
this.selectedCharacter = false
this.buyCharacter = false
this.isChanging = true;
let result = await postNUI('SelectCharacter', val)
if (result) {
setTimeout(() => {
this.selectedCharacter = val
}, 400);
} else {
console.log('error')
}
setTimeout(() => {
this.isChanging = false;
}, 400);
},
CreateNewCharacter() {
this.selectedCharacter = false
this.buyCharacter = false
postNUI('newCharacter')
setTimeout(() => {
this.newCharacter = true
}, 400);
},
openCreateModal() {
this.createModal = true
},
checkTebex(){
postNUI("checkTebex", {
tbxid: this.tbxID,
});
this.createModal = false
},
CreateCharacter() {
if (this.buyCharacter) {
this.createModal = true
return
}
if (this.characterInfo.firstname.length < 3 || this.characterInfo.lastname.length < 3 || this.characterInfo.birthdate == false || this.characterInfo.height < 121 || this.characterInfo.height > 199) return
postNUI("createChar", {
firstname: this.characterInfo.firstname,
lastname: this.characterInfo.lastname,
nationality: this.characterInfo.nationality,
birthdate: this.characterInfo.birthdate,
height: this.characterInfo.height,
gender: this.selectedGender,
cid: this.characterIndex,
});
this.characterIndex = 0;
this.characterInfo = {
firstname: '',
lastname: '',
birthdate: false,
height: 150,
}
},
checkPage(val) {
if (this.createModal) {
return false;
}
if (val === 'mychar') {
return !this.newCharacter && this.selectedCharacter;
}
if (val === 'createchar') {
if (this.newCharacter || this.buyCharacter) {
return true;
}
}
},
checkModal(val) {
if (val === 'tebex') {
return this.createModal;
} else if (val === 'quitServerModal') {
return this.closeServerModal;
} else if (val === 'deleteCharacterModal') {
return this.deleteCharacterModal;
} else if (val === 'none') {
if (this.createModal || this.closeServerModal || this.deleteCharacterModal) {
return false;
} else {
return true;
}
}
},
clickModal(val, val2) {
if (val === 'closeServer') {
this.closeServerModal = !this.closeServerModal;
if (val2) {
postNUI('closeAndDropPlayer')
}
} else if (val === 'deleteCharacter') {
this.deleteCharacterModal = !this.deleteCharacterModal;
if (val2) {
this.deleteCharacter()
}
} else if (val === 'openDelete') {
this.deleteCharacterModal = true;
}
},
updateMaxSlots(playerActiveSlots) {
if (playerActiveSlots === 0) {
return;
}
let tebexCount = 0;
for (const slot of this.maxSlots) {
if (slot.tebex) {
slot.tebex = false;
tebexCount++;
if (tebexCount === playerActiveSlots) {
break;
}
}
}
},
eventHandler(event) {
switch (event.data.action) {
case "CHECK_NUI":
postNUI('LoadedNUI')
break;
case "ShowUI":
this.characterIndex = 0;
this.clickedCountine = false;
document.querySelector('#app').style.display = 'block'
break;
case "LOADED_ADD_SLOTS":
this.maxSlots = event.data.payload.maxSlots;
this.playerActiveSlots = event.data.payload.activeSlots;
this.updateMaxSlots(this.playerActiveSlots);
break;
case "LOADED_PLAYER_DATA":
this.characterData = event.data.payload;
const character = this.characterData[this.characterIndex];
if (character) {
this.SelectCharacter(character)
return this.myCharacter = { ...character, label: `${character.charinfo.firstname} ${character.charinfo.lastname}`, isNew: false, isBuy: false };
} else if (this.maxSlots[this.characterIndex]?.tebex) {
postNUI('newCharacter')
this.selectedCharacter = false
this.newCharacter = false
this.buyCharacter = true
setTimeout(() => {
this.isChanging = false;
}, 400);
return this.myCharacter = { label: this.locales["BUYSLOTJS"] , isNew: false, isBuy: true };
}
postNUI('newCharacter')
this.selectedCharacter = false
this.buyCharacter = false
this.newCharacter = true
setTimeout(() => {
let nowData = new Date();
this.$nextTick(() => {
let vm = this;
let dp = new AirDatepicker("#pickerinput", {
locale: localeEn,
maxDate: nowData,
onSelect({ date, formattedDate }) {
vm.characterInfo.birthdate = formattedDate
},
});
});
}, 600);
setTimeout(() => {
this.isChanging = false;
}, 400);
this.myCharacter = { label: this.locales["NEW_CHARACTER_JS"], isNew: true, isBuy: false };
break;
case "LOAD_CONFIG_DATA":
// this.maxSlots = event.data.payload.slot
this.deleteCharacterButton = event.data.payload.deletecharacter
this.currentThema = event.data.payload.thema
this.serverlogo = event.data.payload.serverLogo
this.locales = event.data.payload.locales
this.moneyType = event.data.payload.moneyType
break;
case "UPDATE_LAST_LOCATION":
this.lastLocation = event.data.payload;
break;
case "closeNUI":
document.querySelector('#app').style.display = 'none'
break;
default:
break;
}
},
updateHeight(value) {
const parsedValue = parseInt(value);
if (!isNaN(parsedValue)) {
if (value.length > 3) {
this.characterInfo.height = value.slice(0, 3);
return;
} else {
this.characterInfo.height = parsedValue;
}
} else {
this.characterInfo.height = '';
}
},
},
computed: {
},
mounted() {
window.addEventListener('message', this.eventHandler);
window.addEventListener('keyup', (event) => {
if (event.key === "Escape") {
if (this.createModal) {
this.createModal = false;
} else {
this.closeServerModal = !this.closeServerModal;
// postNUI('closeAndDropPlayer')
}
}
});
setInterval(() => {
if (this.isChanging ) {
this.isChanging = false;
}
}, 10000);
},
watch: {
'characterInfo.height'(newVal) {
this.updateHeight(newVal);
},
},
});
app.use(store).mount("#app");
var resourceName = "codem-multicharacter";
if (window.GetParentResourceName) {
resourceName = window.GetParentResourceName();
}
window.postNUI = async (name, data) => {
try {
const response = await fetch(`https://${resourceName}/${name}`, {
method: "POST",
mode: "cors",
cache: "no-cache",
credentials: "same-origin",
headers: {
"Content-Type": "application/json"
},
redirect: "follow",
referrerPolicy: "no-referrer",
body: JSON.stringify(data)
});
return !response.ok ? null : response.json();
} catch (error) {
}
};
function clicksound(val) {
if (!soundFx) return;
let audioPath = `./sound/${val}`;
audioPlayer = new Howl({
src: [audioPath]
});
audioPlayer.volume(0.8);
audioPlayer.play();
}