client/metaData.js

const { framework } = exports["tgiann-core"].getConfig();

const FramewWorkData =
  framework == "qb"
    ? exports["qb-core"].GetCoreObject()
    : exports["es_extended"].getSharedObject();

const allItems =
  framework == "qb" ? FramewWorkData.Shared.Items : FramewWorkData.TGIANNItems;

const checkDurability = (itemData, zeroLabel) => {
  if (!zeroLabel) zeroLabel = "";
  let qualityPercent = 0;
  let durabilityTime = 0;
  if (!itemData?.info?.durabilityPercent) {
    if (itemData.info.type == "food") {
      durabilityTime = config.foodDurabilityTime || 0;
    }
    let itemLastDate = itemData.info.durubality + durabilityTime;
    let DurabilityFrist = itemLastDate - itemData.info.durubality;
    let Durabilitys = itemLastDate - new Date() / 1000;
    qualityPercent = (Durabilitys / DurabilityFrist) * 100;
  } else {
    qualityPercent = itemData.info.durabilityPercent;
  }

  let qualityColor = "#36f097";
  if (qualityPercent > 75) {
    qualityColor = "#36f097";
  } else if (qualityPercent > 50) {
    qualityColor = "#74C242";
  } else if (qualityPercent >= 25) {
    qualityColor = "#DEB837";
  } else {
    qualityColor = "#CC2727";
  }

  if (qualityPercent !== undefined) {
    qualityPercent = qualityPercent.toFixed(2);
  }
  let qualityLabel = qualityPercent;
  if (qualityPercent <= 0) {
    qualityLabel = zeroLabel;
    qualityPercent = 100;
  }

  return { qualityColor, qualityPercent, qualityLabel };
};

const durubalityBar = (data, lang) => {
  const radius = 6;
  const dasharray = 2 * Math.PI * radius;
  const dashoffset = dasharray * ((100 - data.qualityPercent) / 100);

  return `
    <div class="context_durubality_container">
      <div class="context_durubality_bar">
        <svg
          xmlns="http://www.w3.org/2000/svg"
          width="21"
          height="21"
          viewBox="0 0 21 21"
          fill="none"
          style="transform: rotate(-90deg);"
        >
          <circle
            cx="10.5"
            cy="10.5"
            r="${radius}"
            stroke-width="0.2vh"
            stroke="${data.qualityColor}"
            stroke-dasharray="${dasharray}px"
            stroke-dashoffset="${dashoffset}px"
          />
          <circle
            cx="10.5"
            cy="10.5"
            r="10"
            stroke="white"
            stroke-opacity="0.4"
            stroke-dasharray="2 2"
          />
        </svg>
      </div>
      <div class="context_durubality_label">${lang.metadataDurability}</div>
      <div class="context_durubality_percent">${data.qualityPercent}%</div>
    </div>
  `;
};

RegisterNuiCallback("getMetaDataHtml", ({ itemData, lang }, cb) => {
  const info = itemData?.info;
  const sharedData = allItems[itemData.name];
  let html;

  if (itemData.costs) {
    const needItems = Object.keys(itemData.costs);
    html = `<div class="item_info_container">`;
    needItems.map((item) => {
      const amount = itemData.costs[item];
      const itemSharedData = allItems[item];
      html =
        html +
        `<div class="item_info_row">
          <div class="item_info_row_left">${itemSharedData.label} </div>
          <div class="item_info_row_right">
            ${amount}x
          </div>
        </div>`;
    });
    html = html + "</div>";
  } else if (sharedData.type == "weapon") {
    const data = checkDurability(itemData, lang.metadataBorken);
    html = `
      ${durubalityBar(data, lang)}
      <div class="item_info_container">
        <div class="item_info_row">
          <div class="item_info_row_left">${lang.metadataSerieNumber} </div>
          <div class="item_info_row_right">${
            itemData.info.serie ? itemData.info.serie : lang.notFoundSerie
          }</div>
        </div>
        <div class="item_info_row">
          <div class="item_info_row_left">${lang.metadataAmmo} </div>
          <div class="item_info_row_right">${
            itemData.info.ammo ? itemData.info.ammo : 0
          }</div>
        </div>
        <div class="item_info_row">
          <div class="item_info_row_left">${lang.metadataTotalFiredAmmo} </div>
          <div class="item_info_row_right">
          ${itemData.info.usedTotalAmmo ? itemData.info.usedTotalAmmo : 0}
          </div>
        </div>
      </div>
    `;
  } else if (itemData.name == "armor" || itemData.name == "policearmor") {
    const data = checkDurability(itemData, lang.metadataBorken);
    html = `
      <div class="item_info_container">
        <div class="item_info_row">
          <div class="item_info_row_left">${lang.metadataArmorValue}</div>
          <div class="item_info_row_right">${data.qualityLabel}</div>
        </div>
      </div>
    `;
  } else if (info?.type == "clothe") {
    const model =
      itemData.info.model == 1885233650 ? lang.metadataMan : lang.metadataWoman;

    html = `
      <div class="item_info_container">
        <div class="item_info_row">
            <div class="item_info_row_left">${lang.metadataModel}</div>
            <div class="item_info_row_right">${model}</div>
        </div>
    `;
    let newHtml = "";

    Object.keys(itemData.info.data).map((key, i) => {
      const data = itemData.info.data[key];
      newHtml =
        newHtml +
        `
            <div class="item_info_row">
                <div class="item_info_row">
                    <div class="item_info_row_left">${lang.metadataClothe}</div>
                    <div class="item_info_row_right">${key}</div>
                </div>
                <div class="item_info_row">
                    <div class="item_info_row_left">${lang.metadataClotheType}</div>
                    <div class="item_info_row_right">${data.Prop}</div>
                </div>
                <div class="item_info_row">
                    <div class="item_info_row_left">${lang.metadataClotheColor}</div>
                    <div class="item_info_row_right"> ${data.Texture}</div>
                </div>
            </div>
        `;
    });

    html = html + newHtml + "</div>";
  } else if (info?.type == "ring") {
    html = `
      <div class="item_info_container">
        <div class="item_info_row">
          Yüzüğün İçinde <strong>${itemData.info.name}</strong> Yazmaktadır
        </div>
      </div>
    `;
  }

  SendNUIMessage({
    app: "app-name",
    method: "getMetaDataHtmlSuccess",
    data: html,
  });

  cb("");
});

Last updated