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

593 lines
23 KiB
JavaScript

const store = Vuex.createStore({
components: {},
state: {},
getters: {},
mutations: {},
actions: {}
});
let audioPlayer = null;
const app = Vue.createApp({
components: {},
data: () => ({
show: false,
activePage: "main",
currentPage: "main",
categories: [
{ name: "main", label: "WM MAIN" },
{ name: "coop", label: "CO-OP" },
{ name: "leaderboard", label: "LEADERBOARD" },
{ name: "profile", label: "PROFILE" }
],
locales: false,
mainPageSwiperValue: null,
badgeSwiperValue: null,
playerData: {},
headerAnim: "main",
garbageJobData: {
requiredXp: 3000
},
routes: [],
mainPageRouteData: {},
garbageJobStartStep: {
rentthebus: true,
selectroute: false,
startthejob: false,
lobbyname: "",
lobbypassword: "",
joinpassword: ""
},
currencyUnit: "$",
requiredXp: 0,
dailyMission: [],
top50: [],
notifications: [],
singleCoopData: [],
coopData: false,
myteam: {},
newCoopPageValue: "main", // main , lobby
openPasswordModal: false,
openJoinModal: false,
fakeData: false,
coopPageRouteData: false,
showPassword: false,
badgeData: [],
configBadgeData: false,
playerDailyMission: false,
searchbarValue: ""
}),
computed: {
findMyRank() {
const index = this.top50.findIndex(item => item.name == this.playerData.allData.profiledata.name);
return index !== -1 ? index + 1 : "50+";
},
filterByTermCoopData() {
if (this.searchbarValue.length > 0) {
if (!this.coopData || Object.keys(this.coopData).length === 0) {
return [];
}
const dataArray = Object.values(this.coopData);
return dataArray.filter(item => {
return (item.roomData && String(item.roomData.roomName).toLowerCase().includes(this.searchbarValue.toLowerCase())) || (item.roomData && String(item.roomData.areaName).toLowerCase().includes(this.searchbarValue.toLowerCase())) || (item.players && String(item.players.name).toLowerCase().includes(this.searchbarValue.toLowerCase())) || (item.players && String(item.players.level).toLowerCase().includes(this.searchbarValue.toLowerCase())) || (item.players && String(item.players.identifier).toLowerCase().includes(this.searchbarValue.toLowerCase()));
});
} else {
return Object.values(this.coopData);
}
}
},
watch: {},
beforeDestroy() {},
mounted() {
window.addEventListener("keyup", this.keyHandler);
window.addEventListener("message", this.eventHandler);
},
methods: {
kickPlayer(data) {
if (this.myteam && this.myteam.length > 0) {
postNUI("kickPlayer", data);
}
},
getMyTeamPassword() {
if (this.myteam && this.myteam.length > 0) {
let hostPlayer = this.myteam.filter(player => player.host === true);
if (hostPlayer.length > 0) {
if (hostPlayer[0].roomData.password.length <= 0) {
return this.locales["No_Password"];
}
return hostPlayer[0].roomData.password;
} else {
return "Undefined Room Password";
}
} else {
return "Undefined";
}
},
selectRouteCoopPage(val) {
if (this.playerData.allData.profiledata.level >= val.level) {
this.coopPageRouteData = val;
this.showPassword = false;
const dataArray = Object.values(this.coopData);
dataArray.map(item => {
item.roomData.areaName = this.coopPageRouteData.label;
});
postNUI("updateArea", this.coopPageRouteData);
postNUI("updateLobbys", this.coopData);
} else {
this.notification("INFO", this.locales["insufficientlevel"]);
this.garbageJobStartStep.selectroute = false;
}
},
openChangeAreaPage(val) {
this.showPassword = false;
this.newCoopPageValue = val;
},
isHostPresent() {
if (this.myteam && this.myteam.length > 0) {
let hostPlayer = this.myteam.find(player => player.host === true);
if (hostPlayer && hostPlayer.identifier === this.playerData.allData.profiledata.identifier) {
return true;
} else {
return false;
}
} else {
return false;
}
},
startJobMultiplayer() {
if (this.myteam && this.myteam.length > 0) {
postNUI("startJobMultiplayer", { routename: this.coopPageRouteData.name });
} else {
this.notification("INFO", this.locales["startjoberror"]);
}
},
joinLobbyForPassword() {
if (this.garbageJobStartStep.joinpassword.length > 0) {
if (this.fakeData) {
postNUI("joinLobbyPassword", { password: this.garbageJobStartStep.joinpassword, roomdata: this.fakeData.roomData });
this.openJoinModal = false;
this.fakeData = false;
}
} else {
this.notification("INFO", this.locales["joinpassworderror"]);
}
},
passwordModal(val) {
this.openPasswordModal = val;
this.openJoinModal = false;
},
notification(header, text) {
const timeout = 3000;
let id = Date.now();
if (this.notifications.some(notification => notification.text === text)) {
return;
}
let newNotification = {
id: id,
text: text,
header: header,
timeout: setTimeout(() => {
this.notifications = this.notifications.filter(notification => notification.id != id);
}, timeout)
};
this.notifications.push(newNotification);
clicksound("notification_sound.mp3");
},
calculateProgress(mission, complete) {
return (mission / complete) * 100;
},
keyHandler(event) {
if (event.keyCode == 27) {
this.show = false;
this.activePage = "main";
this.currentPage = "main";
this.garbageJobStartStep.selectroute = false;
this.garbageJobStartStep.startthejob = false;
postNUI("closeMenu");
this.garbageJobData.lobbyname = "";
this.garbageJobData.lobbypassword = "";
this.garbageJobData.joinpassword = "";
this.mainPageRouteData = false;
this.coopPageRouteData = false;
this.showPassword = false;
}
},
selectRoute(val) {
clicksound("click.wav");
if (this.playerData.allData.profiledata.level >= val.level) {
this.garbageJobStartStep.selectroute = true;
} else {
this.notification("INFO", this.locales["insufficientlevel"]);
this.garbageJobStartStep.selectroute = false;
}
},
changeRouteMainPage(index) {
clicksound("click.wav");
const initialSlideData = this.routes[index];
if (this.playerData.allData.profiledata.level >= initialSlideData.level) {
this.garbageJobStartStep.selectroute = false;
this.mainPageRouteData = initialSlideData;
} else {
this.notification("INFO", this.locales["insufficientlevel"]);
this.garbageJobStartStep.selectroute = false;
}
},
startJob() {
clicksound("click.wav");
if (!this.garbageJobStartStep.selectroute) {
this.notification("INFO", this.locales["chooseroutefirst"]);
return;
}
this.garbageJobStartStep.startthejob = true;
setTimeout(() => {
postNUI("closeMenu");
this.show = false;
this.garbageJobStartStep.selectroute = false;
this.garbageJobStartStep.startthejob = false;
postNUI("startJob", {
route: this.mainPageRouteData.name
});
}, 250);
// postNUI("closeMenu");
//
},
badgeSwiper() {
if (this.badgeSwiperValue) {
this.badgeSwiperValue.destroy();
}
this.badgeSwiperValue = new Swiper("#mainswiper3", {
slidesPerView: 1,
slidesPerGroup: 1
});
const initialSlideIndex = this.badgeSwiperValue.activeIndex;
const initialSlideData = this.configBadgeData[initialSlideIndex];
this.badgeData = initialSlideData;
this.badgeSwiperValue.on("slideChange", () => {
const activeSlideIndex = this.badgeSwiperValue.activeIndex;
const activeSlideData = this.configBadgeData[activeSlideIndex];
this.badgeData = activeSlideData;
});
},
takeBadgeFunc(val) {
clicksound("click.wav");
if (this.playerData.allData.profiledata.level >= val.level) {
postNUI("takeBadge", val);
} else {
this.notification("INFO", this.locales["insufficientlevel"]);
this.garbageJobStartStep.selectroute = false;
}
},
mainPageSwiper() {
if (this.mainPageSwiperValue) {
this.mainPageSwiperValue.destroy();
}
this.mainPageSwiperValue = new Swiper("#mainswiper", {
slidesPerView: 4,
loop: false,
spaceBetween: 30,
slidesPerGroup: 2
});
const initialSlideIndex = this.mainPageSwiperValue.activeIndex;
const initialSlideData = this.routes[initialSlideIndex];
this.mainPageRouteData = initialSlideData;
this.mainPageSwiperValue.on("slideChange", () => {
const activeSlideIndex = this.mainPageSwiperValue.activeIndex;
const activeSlideData = this.routes[activeSlideIndex];
this.mainPageRouteData = activeSlideData;
});
},
leaveanddeletelobbie() {
clicksound("click.wav");
if (this.myteam && this.myteam.length > 0) {
postNUI("leaveLobby", this.myteam[0].roomData);
// this.myteam = [];
// this.newCoopPageValue = "main";
}
},
createLobby() {
clicksound("click.wav");
let lobbyname = "undefined";
if (this.garbageJobStartStep.lobbyname.length > 0) {
lobbyname = this.garbageJobStartStep.lobbyname;
} else {
lobbyname = this.playerData.allData.profiledata.name;
}
this.singleCoopData.push({
name: lobbyname,
level: this.playerData.allData.profiledata.level,
avatar: this.playerData.allData.profiledata.avatar,
password: this.garbageJobStartStep.lobbypassword,
areaName: this.coopPageRouteData.label
});
postNUI("createLobby", this.singleCoopData);
this.garbageJobData.lobbyname = "";
this.garbageJobData.lobbypassword = "";
this.garbageJobData.joinpassword = "";
this.singleCoopData = [];
this.newCoopPageValue = "lobby";
},
joinLobby(roomdata) {
clicksound("click.wav");
if (roomdata.roomData.password.length > 0) {
this.openJoinModal = true;
this.fakeData = roomdata;
} else {
postNUI("joinLobby", roomdata);
}
},
changePage(val) {
clicksound("click.wav");
this.garbageJobStartStep.selectroute = false;
this.headerAnim = val;
this.currentPage = false;
setTimeout(() => {
if (val == "main") {
setTimeout(() => {
if (this.mainPageSwiperValue) {
this.mainPageSwiperValue.destroy();
this.badgeSwiperValue.destroy();
}
}, 50);
setTimeout(() => {
this.mainPageSwiper();
this.badgeSwiper();
}, 100);
}
this.currentPage = val;
}, 250);
},
getCategoryStyles(pageName) {
if (this.currentPage === pageName) {
return {
background: "linear-gradient(0deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 100%), linear-gradient(90deg, #2C683A 0%, #E5B440 100%)",
opacity: 1.0
};
} else {
return {
color: "#fff",
opacity: 0.4
};
}
},
getTextLobby(val) {
if (val) {
return "Driver";
} else {
return "Collector";
}
},
roomDataSettingText(val) {
if (val && val.length > 0) {
let hostPlayer = val.filter(player => player.host === true);
if (hostPlayer.length > 0) {
return hostPlayer[0].roomData.roomName + " " + this.locales["Lobby"];
} else {
return "Undefined Room Name";
}
} else {
return "Undefined 2 Room Name ";
}
},
deleteLobiText(val) {
if (val) {
if (val && val.length > 0) {
let hostPlayer = val.filter(player => player.host === true);
if (hostPlayer.length > 0 && hostPlayer[0].identifier == this.playerData.allData.profiledata.identifier) {
return this.locales["deleteLobiText"];
} else {
return this.locales["leaveLobiText"];
}
}
} else {
return "UNDEFINED";
}
},
getMarginStyle() {
switch (this.headerAnim) {
case "main":
return {
marginLeft: "0vw"
};
case "coop":
return {
marginLeft: "12vw"
};
case "leaderboard":
return {
marginLeft: "24.5vw"
};
case "profile":
return {
marginLeft: "37.5vw"
};
}
},
mergeData(sqlData, configData) {
const mergedData = configData.map(mission => {
const sqlMissionData = sqlData[mission.name];
return {
...mission,
complete: sqlMissionData ? sqlMissionData.complete : false,
currentCount: sqlMissionData ? sqlMissionData.count : 0,
progressbar: sqlMissionData ? this.calculateProgress(sqlMissionData.count, mission.count) : 0
};
});
this.playerDailyMission = mergedData;
},
eventHandler(event) {
switch (event.data.action) {
case "CHECK_NUI":
postNUI("loaded", true);
break;
case "NUI_LOAD_DATA":
this.playerData.allData = event.data.payload;
break;
case "OPEN_MENU":
this.show = true;
this.activePage = "main";
this.currentPage = "main";
this.headerAnim = "main";
this.playerData = event.data.payload.playerData;
this.garbageJobData.requiredXp = this.requiredXp[this.playerData.allData.profiledata.level];
this.mainPageRouteData = this.routes[0];
this.coopPageRouteData = this.routes[0];
this.coopData = event.data.payload.coopData;
this.mergeData(this.playerData.allData.dailymission, this.dailyMission);
setTimeout(() => {
this.mainPageSwiper();
this.badgeSwiper();
}, 350);
break;
case "configRoutes":
this.routes = event.data.payload;
break;
case "configCurrencyUnit":
this.currencyUnit = event.data.payload;
break;
case "requiredXp":
this.requiredXp = event.data.payload;
break;
case "configDailyMission":
this.dailyMission = event.data.payload;
break;
case "top50":
this.top50 = event.data.payload;
break;
case "INSERT_LOBBY":
// if (this.playerData.allData.profiledata && this.playerData.allData.profiledata.identifier) {
this.coopData = event.data.payload;
const profileIdentifier = this.playerData.allData.profiledata.identifier;
Object.values(this.coopData).forEach(data => {
if (data.players.identifier == profileIdentifier) {
this.myteam = [];
this.myteam.push({
name: data.players.name,
level: data.players.level,
avatar: data.players.avatar,
host: data.players.host,
identifier: data.players.identifier,
src: data.players.src,
roomData: data.roomData
});
}
});
// }
break;
case "UPDATE_LOBBY":
// if (this.playerData.allData.profiledata && this.playerData.allData.profiledata.identifier) {
this.coopData = event.data.payload;
const profileIdentifier2 = this.playerData.allData.profiledata.identifier;
this.myteam = [];
Object.entries(this.coopData).forEach(([key, value]) => {
const foundPlayer = value.players.find(player => player.identifier === profileIdentifier2);
if (foundPlayer) {
this.myteam = value.players.map(player => ({
name: player.name,
level: player.level,
avatar: player.avatar,
host: player.host,
src: player.src,
identifier: player.identifier,
roomData: value.roomData
}));
this.newCoopPageValue = "lobby";
}
});
// postNUI("updateArea", this.coopPageRouteData);
// }
break;
case "UPDATA_LOBBYS":
this.coopData = event.data.payload;
break;
case "UPDATE_AREA":
this.coopPageRouteData = event.data.payload;
break;
case "notification":
this.notification("INFO", event.data.payload);
break;
case "DELETE_TEAMDATA":
this.myteam = [];
this.newCoopPageValue = "main";
this.openPasswordModal = false;
this.openJoinModal = false;
break;
case "closeMenu":
this.show = false;
this.activePage = "main";
this.currentPage = "main";
this.garbageJobStartStep.selectroute = false;
this.garbageJobStartStep.startthejob = false;
postNUI("closeMenu");
this.garbageJobData.lobbyname = "";
this.garbageJobData.lobbypassword = "";
this.garbageJobData.joinpassword = "";
this.mainPageRouteData = false;
this.coopPageRouteData = false;
break;
case "configBadge":
this.configBadgeData = event.data.payload;
break;
case "configlocales":
this.locales = event.data.payload;
break;
default:
break;
}
}
}
});
app.use(store).mount("#app");
var resourceName = "codem-lstransit";
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) {
// console.log(error)
}
};
function clicksound(val) {
let audioPath = `./sound/${val}`;
audioPlayer = new Howl({
src: [audioPath]
});
audioPlayer.volume(0.4);
audioPlayer.play();
}