Fix Inventory, add different Trunk sizes
This commit is contained in:
@@ -26,10 +26,9 @@ export default function itemShopList(globalData: IGlobalData) {
|
||||
function addItems(data) {
|
||||
|
||||
// Fill it
|
||||
|
||||
for (const item of data) {
|
||||
|
||||
const tempItem = new UIMenuItem(item.Name, "");
|
||||
const tempItem = new UIMenuItem(item.Name, item.Description);
|
||||
|
||||
tempItem.SetRightLabel(`${item.Price > 0 ? `$${item.Price}` : "FREE"}`);
|
||||
|
||||
@@ -70,6 +69,8 @@ export default function itemShopList(globalData: IGlobalData) {
|
||||
// Reset some variables
|
||||
currentMenuIdx = -1;
|
||||
menuTransition = false;
|
||||
items = [];
|
||||
|
||||
|
||||
|
||||
// Create a new main menu
|
||||
@@ -84,6 +85,7 @@ export default function itemShopList(globalData: IGlobalData) {
|
||||
// Main menu events
|
||||
mainMenu.ItemSelect.on((selectedItem, itemIndex) => {
|
||||
const nextItem = items[itemIndex];
|
||||
mp.console.logInfo(JSON.stringify(items));
|
||||
mp.events.callRemote("SERVER:BuyItems", nextItem.Name);
|
||||
|
||||
});
|
||||
|
||||
@@ -14,9 +14,7 @@
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
div {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
|
||||
body {
|
||||
width: 100%;
|
||||
@@ -618,8 +616,8 @@ t#tf_nameorid {
|
||||
display: inline-block;
|
||||
font-size: 0.5vw;
|
||||
position: relative;
|
||||
left: 7.7vw;
|
||||
top: 1vw;
|
||||
left: -7vw;
|
||||
top: 5vw;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
@@ -633,8 +631,8 @@ t#tf_nameorid {
|
||||
display: inline-block;
|
||||
font-size: 0.5vw;
|
||||
position: relative;
|
||||
left: 12.5vw;
|
||||
top: -0.3vw;
|
||||
left: 5.5vw;
|
||||
top: -0.1vw;
|
||||
color: #ffffff;
|
||||
transition: 0.3s;
|
||||
}
|
||||
@@ -653,7 +651,7 @@ t#tf_nameorid {
|
||||
display: inline-block;
|
||||
font-size: 0.5vw;
|
||||
position: relative;
|
||||
left: -5.4vw;
|
||||
left: 5.7vw;
|
||||
top: 6vw;
|
||||
color: #ffffff;
|
||||
transition: 0.3s;
|
||||
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
@@ -62,7 +62,7 @@
|
||||
<div name="vehClass" class="veh hidden">
|
||||
<div class="main">
|
||||
<div class="title">
|
||||
<div class="titlecount"><span id="count2">0</span> / 250 Kilogramm</div>
|
||||
<div class="titlecount"><span id="count2">0</span> / <span id="trunkSize">0</span> Kilogramm</div>
|
||||
<div class="titletext">Fahrzeug</div>
|
||||
</div>
|
||||
<div class="Betrag4" style="display: none;">
|
||||
@@ -193,9 +193,11 @@
|
||||
mp.trigger("CEF:callVehicleInventory");
|
||||
}
|
||||
|
||||
function setVehicleItems(jsonItemArr) {
|
||||
function setVehicleItems(jsonItemArr, trunkSize) {
|
||||
var parsedItemArr = JSON.parse(jsonItemArr)
|
||||
vehInv = [];
|
||||
$('#trunkSize').html(trunkSize / 1000);
|
||||
|
||||
for (var i = 0; i < parsedItemArr.length; i++) {
|
||||
var item = parsedItemArr[i];
|
||||
var newItem = { Name: item.Name, ID: item.ItemId, Amount: item.Amount, Category: 0 };
|
||||
@@ -463,7 +465,7 @@
|
||||
blueButtonImg.setAttribute("class", "blueImg");
|
||||
blueButton.appendChild(blueButtonImg);
|
||||
|
||||
var listLength = list.length;
|
||||
var listLength = list.getElementsByTagName("li").length;
|
||||
|
||||
var row = 1;
|
||||
|
||||
@@ -483,7 +485,7 @@
|
||||
row = 6;
|
||||
}
|
||||
|
||||
var Litem = document.createElement("div");
|
||||
var Litem = document.createElement("li");
|
||||
Litem.setAttribute("class", "item" + row);
|
||||
Litem.setAttribute("id", i);
|
||||
Litem.setAttribute("name", "List" + item.Category);
|
||||
@@ -505,7 +507,7 @@
|
||||
while (child) {
|
||||
e.removeChild(child);
|
||||
child = e.lastElementChild;
|
||||
} console.log(handelInv);
|
||||
}
|
||||
|
||||
for (var i = 0; i < vehInv.length; i++) {
|
||||
var item = vehInv[i];
|
||||
@@ -533,7 +535,7 @@
|
||||
blueButtonImg.setAttribute("class", "blueImg");
|
||||
blueButton.appendChild(blueButtonImg);
|
||||
|
||||
var listLength = list.length;
|
||||
var listLength = list.getElementsByTagName("li").length;
|
||||
|
||||
var row = 1;
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
var offerItemArr;
|
||||
var tradeItemArr;
|
||||
var vehItemArr;
|
||||
var trunkSize;
|
||||
|
||||
var loaded = false;
|
||||
|
||||
@@ -60,18 +61,24 @@
|
||||
});
|
||||
|
||||
mp.events.addDataHandler("backpackItems", (entity: EntityMp, jsonItemArr) => {
|
||||
if (entity.handle != mp.players.local.handle) return;
|
||||
if (entity != mp.players.local) return;
|
||||
itemArr = JSON.parse(jsonItemArr);
|
||||
if (loaded)
|
||||
invBrowser.execute(`setBackpackItems('${JSON.stringify(itemArr)}',true)`);
|
||||
});
|
||||
|
||||
mp.events.addDataHandler("setVehicleTrunk", (entity: EntityMp, size) => {
|
||||
if (entity != mp.players.local) return;
|
||||
trunkSize = size;
|
||||
});
|
||||
|
||||
mp.events.addDataHandler("vehicleItems", (entity: EntityMp, jsonItemArr) => {
|
||||
if (entity != mp.players.local) return;
|
||||
vehItemArr = JSON.parse(jsonItemArr);
|
||||
|
||||
if (loaded)
|
||||
invBrowser.execute(`setVehicleItems('${JSON.stringify(vehItemArr)}')`);
|
||||
if (loaded) {
|
||||
invBrowser.execute(`setVehicleItems('${JSON.stringify(vehItemArr)}', '${trunkSize}')`);
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("CEF:InventoryLoaded", () => {
|
||||
@@ -136,7 +143,6 @@
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
mp.events.add("CEF:acceptTrade", () => {
|
||||
if (invBrowser !== null) {
|
||||
mp.events.callRemote('acceptTrade');
|
||||
|
||||
@@ -2250,6 +2250,91 @@ namespace ReallifeGamemode.Server.Commands
|
||||
}
|
||||
}
|
||||
|
||||
[Command("setshopitem", "~m~Benutzung: ~s~/setshopitem [Item ID]")]
|
||||
public void CmdAdminSetItemInShop(Player player, int itemId)
|
||||
{
|
||||
if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true)
|
||||
{
|
||||
ChatService.NotAuthorized(player);
|
||||
return;
|
||||
}
|
||||
|
||||
IItem item = InventoryManager.GetItemById(itemId);
|
||||
if (item is null)
|
||||
{
|
||||
ChatService.ErrorMessage(player, "Item existiert nicht");
|
||||
return;
|
||||
}
|
||||
|
||||
ItemshopPoint nearestItemShopPoint = PositionManager.itemshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5);
|
||||
|
||||
if (nearestItemShopPoint is null)
|
||||
{
|
||||
ChatService.ErrorMessage(player, "Du bist nicht an einem Item Shop");
|
||||
return;
|
||||
}
|
||||
|
||||
using var dbContext = new DatabaseContext();
|
||||
|
||||
if (dbContext.ShopItems.Where(i => i.ShopId == nearestItemShopPoint.itemShop.id && i.ItemId == item.Id).FirstOrDefault() != null)
|
||||
{
|
||||
ChatService.ErrorMessage(player, "Item ist bereits im Shop");
|
||||
return;
|
||||
}
|
||||
|
||||
ShopItem shopItem = new ShopItem
|
||||
{
|
||||
ShopId = nearestItemShopPoint.itemShop.id,
|
||||
ItemId = item.Id,
|
||||
Amount = 20,
|
||||
Price = item.Price
|
||||
};
|
||||
|
||||
dbContext.ShopItems.Add(shopItem);
|
||||
dbContext.SaveChanges();
|
||||
|
||||
nearestItemShopPoint.itemShop.LoadItems();
|
||||
}
|
||||
|
||||
[Command("rmshopitem", "~m~Benutzung: ~s~/rmshopitem [Item ID]")]
|
||||
public void CmdAdminRemoveItemInShop(Player player, int itemId)
|
||||
{
|
||||
if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true)
|
||||
{
|
||||
ChatService.NotAuthorized(player);
|
||||
return;
|
||||
}
|
||||
|
||||
IItem item = InventoryManager.GetItemById(itemId);
|
||||
if (item is null)
|
||||
{
|
||||
ChatService.ErrorMessage(player, "Item existiert nicht");
|
||||
return;
|
||||
}
|
||||
|
||||
ItemshopPoint nearestItemShopPoint = PositionManager.itemshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5);
|
||||
|
||||
if (nearestItemShopPoint is null)
|
||||
{
|
||||
ChatService.ErrorMessage(player, "Du bist nicht an einem Item Shop");
|
||||
return;
|
||||
}
|
||||
|
||||
using var dbContext = new DatabaseContext();
|
||||
|
||||
ShopItem shopItem = dbContext.ShopItems.Where(i => i.ShopId == nearestItemShopPoint.itemShop.id && i.ItemId == item.Id).FirstOrDefault();
|
||||
|
||||
if(shopItem is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
dbContext.ShopItems.Remove(shopItem);
|
||||
dbContext.SaveChanges();
|
||||
|
||||
nearestItemShopPoint.itemShop.LoadItems();
|
||||
}
|
||||
|
||||
[Command("inventory", "~m~Benutzung: ~s~/inventory [Spieler]")]
|
||||
public void CmdAdminGiveItem(Player player, string targetname)
|
||||
{
|
||||
|
||||
@@ -17,5 +17,116 @@ namespace ReallifeGamemode.Server.Extensions
|
||||
{
|
||||
return NAPI.Pools.GetAllPlayers().Where(p => p.Vehicle != null && p.Vehicle?.Handle == veh.Handle && p.VehicleSeat == 0).FirstOrDefault();
|
||||
}
|
||||
|
||||
//https://wiki.rage.mp/index.php?title=Vehicle_Classes
|
||||
public static int GetVehicleTrunkSize(this Vehicle vehicle)
|
||||
{
|
||||
switch (vehicle.Class)
|
||||
{
|
||||
case 0:
|
||||
return 100 * 1000;
|
||||
|
||||
case 1:
|
||||
return 180 * 1000;
|
||||
|
||||
case 2:
|
||||
return 400 * 1000;
|
||||
|
||||
case 3:
|
||||
return 210 * 1000;
|
||||
|
||||
case 4:
|
||||
if ((VehicleHash)vehicle.HashCode == VehicleHash.Moonbeam
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Moonbeam2
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Ratloader
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Ratloader2
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Slamvan
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Slamvan2
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Slamvan3
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Yosemite
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Yosemite2
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Picador
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Moonbeam)
|
||||
return 250 * 1000;
|
||||
else
|
||||
return 180 * 1000;
|
||||
|
||||
case 5:
|
||||
if ((VehicleHash)vehicle.HashCode == VehicleHash.Fagaloa
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Cheburek)
|
||||
return 200 * 1000;
|
||||
else
|
||||
return 110 * 1000;
|
||||
|
||||
case 6:
|
||||
return 120 * 1000;
|
||||
|
||||
case 7:
|
||||
return 80 * 1000;
|
||||
|
||||
case 8:
|
||||
return 5 * 1000;
|
||||
|
||||
case 9:
|
||||
if ((VehicleHash)vehicle.HashCode == VehicleHash.Bifta
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Blazer
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Blazer2
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Blazer3
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Blazer4
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Blazer5)
|
||||
return 30 * 1000;
|
||||
else
|
||||
return 300 * 1000;
|
||||
|
||||
case 10:
|
||||
return 2500 * 1000;
|
||||
|
||||
case 11:
|
||||
return 0;
|
||||
|
||||
case 12:
|
||||
if ((VehicleHash)vehicle.HashCode == VehicleHash.Minivan
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Minivan2
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Bobcatxl)
|
||||
return 600 * 1000;
|
||||
else
|
||||
return 1000 * 1000;
|
||||
|
||||
case 13:
|
||||
return 0;
|
||||
|
||||
case 14:
|
||||
return 50 * 1000;
|
||||
|
||||
case 15:
|
||||
return 0;
|
||||
|
||||
case 16:
|
||||
return 0;
|
||||
|
||||
case 17:
|
||||
return 0;
|
||||
|
||||
case 18:
|
||||
if ((VehicleHash)vehicle.HashCode == VehicleHash.Policet)
|
||||
return 1000 * 1000;
|
||||
else if ((VehicleHash)vehicle.HashCode == VehicleHash.Firetruk
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Pbus
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Policeb
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Polmav
|
||||
|| (VehicleHash)vehicle.HashCode == VehicleHash.Predator)
|
||||
return 0;
|
||||
else
|
||||
return 150 * 1000;
|
||||
|
||||
case 19:
|
||||
return 0;
|
||||
|
||||
case 20:
|
||||
return 2500 * 1000;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace ReallifeGamemode.Server.Inventory.Items
|
||||
{
|
||||
public override int Id => 101;
|
||||
public override string Name => "Apfel";
|
||||
public override string Description => "Ein Apfel";
|
||||
public override string Description => "Ein Apfel.";
|
||||
public override int Gewicht => 200;
|
||||
public override string Einheit => "g";
|
||||
public override int HpAmount => 10;
|
||||
|
||||
@@ -8,7 +8,7 @@ using ReallifeGamemode.Server.Managers;
|
||||
|
||||
namespace ReallifeGamemode.Server.Inventory.Items
|
||||
{
|
||||
internal class AChips : ConsumableItem
|
||||
internal class AviateChips : ConsumableItem
|
||||
{
|
||||
public override int Id => 104;
|
||||
public override string Name => "aviates Chips";
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace ReallifeGamemode.Server.Inventory.Items
|
||||
public override string Einheit => "g";
|
||||
public override int HpAmount => 30;
|
||||
public override uint Object => 2240524752;
|
||||
public override int Price => 300;
|
||||
public override int Price => 600;
|
||||
|
||||
public override float Cooldown => 20000;
|
||||
|
||||
|
||||
@@ -15,12 +15,12 @@ namespace ReallifeGamemode.Server.Inventory.Items
|
||||
{
|
||||
public override int Id => 103;
|
||||
public override string Name => "Cheeseburger";
|
||||
public override string Description => "Ein Burger";
|
||||
public override string Description => "Extra käsig.";
|
||||
public override int Gewicht => 120;
|
||||
public override string Einheit => "g";
|
||||
public override int HpAmount => 20;
|
||||
public override uint Object => 2240524752;
|
||||
public override int Price => 150;
|
||||
public override int Price => 500;
|
||||
public override float Cooldown => 7000;
|
||||
|
||||
public override void Consume(UserItem uItem)
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace ReallifeGamemode.Server.Inventory.Items
|
||||
{
|
||||
public override int Id => 100;
|
||||
public override string Name => "Chips";
|
||||
public override string Description => "Eine tüte Chips";
|
||||
public override string Description => "80% Luft, 20% Verpackung.";
|
||||
public override int Gewicht => 180;
|
||||
public override string Einheit => "g";
|
||||
public override int HpAmount => 5;
|
||||
|
||||
@@ -17,9 +17,9 @@ namespace ReallifeGamemode.Server.Inventory.Items
|
||||
public override string Einheit => "g";
|
||||
public override int HpAmount => 80;
|
||||
public override uint Object => 2240524752;
|
||||
public override int Price => 50000;
|
||||
public override int Price => 1800;
|
||||
|
||||
public override float Cooldown => 15000;
|
||||
public override float Cooldown => 50000;
|
||||
|
||||
public override void Consume(UserItem uItem)
|
||||
{
|
||||
|
||||
@@ -8,6 +8,6 @@
|
||||
public override int Gewicht => 10;
|
||||
public override string Einheit => "g";
|
||||
public override uint Object => 875075437;
|
||||
public override int Price => 0;
|
||||
public override int Price => 500;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -345,8 +345,7 @@ namespace ReallifeGamemode.Server.Job
|
||||
if (type == PROFESSIONAL && user.BusSkill < SKILL_PROFESSIONAL) { player.TriggerEvent("MenuSelect:Error"); return; }
|
||||
|
||||
List<Vector3> selectedRoute = new List<Vector3>();
|
||||
int index = -1;
|
||||
|
||||
int index;
|
||||
if (playerRouteCurrent.ContainsKey(player.Name))
|
||||
{
|
||||
index = getPlayerRouteInex(player);
|
||||
@@ -640,8 +639,6 @@ namespace ReallifeGamemode.Server.Job
|
||||
player.SendChatMessage($"~y~[JOB]: ~w~Du kannst jetzt auch mit dem Tourbus fahren!");
|
||||
}
|
||||
|
||||
BusDriverJob job = JobManager.GetJob<BusDriverJob>();
|
||||
|
||||
dbContext.SaveChanges();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,8 +36,6 @@ namespace ReallifeGamemode.Server.Managers
|
||||
|
||||
public static Dictionary<Player, PlayerTimer> itemCooldown = new Dictionary<Player, PlayerTimer>();
|
||||
|
||||
private static Timer aTimer;
|
||||
|
||||
public class InventoryItem
|
||||
{
|
||||
public string Name;
|
||||
@@ -90,7 +88,7 @@ namespace ReallifeGamemode.Server.Managers
|
||||
{
|
||||
ServerVehicle carlocked = veh.GetServerVehicle(dbContext);
|
||||
|
||||
if (carlocked.Locked == true)
|
||||
if (carlocked == null || carlocked.Locked == true)
|
||||
{
|
||||
player.TriggerEvent("Error", "Das Fahrzeug ist abgeschlossen!");
|
||||
return;
|
||||
@@ -123,7 +121,7 @@ namespace ReallifeGamemode.Server.Managers
|
||||
};
|
||||
vehicleItems[player].Add(newItem);
|
||||
}
|
||||
|
||||
player.SetSharedData("setVehicleTrunk", veh.GetVehicleTrunkSize());
|
||||
player.SetSharedData("vehicleItems", JsonConvert.SerializeObject(vehicleItems[player].ToArray()));
|
||||
}
|
||||
|
||||
@@ -367,7 +365,7 @@ namespace ReallifeGamemode.Server.Managers
|
||||
RemoveUserItem(user, item, itemAmount);
|
||||
AddItemToVehicleInventory(veh, itemID, itemAmount);
|
||||
|
||||
SetVehicleItems(player);
|
||||
SetBackpackItems(player);
|
||||
VehicleItem vehicleItem = context.VehicleItems.Where(f => f.ItemId == itemID && f.Vehicle == VehicleManager.GetServerVehicleFromVehicle(veh, context)).FirstOrDefault();
|
||||
context.SaveChanges();
|
||||
IItem iItem = GetItemById(itemID);
|
||||
@@ -428,7 +426,7 @@ namespace ReallifeGamemode.Server.Managers
|
||||
int setAmount = 0;
|
||||
for (int i = 1; i <= amount; i++)
|
||||
{
|
||||
if (GetVehicleInventoryWeight(veh) + (i * GetItemById(itemId).Gewicht) > 200000)
|
||||
if (GetVehicleInventoryWeight(veh) + (i * GetItemById(itemId).Gewicht) > veh.GetVehicleTrunkSize())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -155,7 +155,6 @@ namespace ReallifeGamemode.Server.Managers
|
||||
[ServerEvent(Event.PlayerExitVehicle)]
|
||||
public void JobManagerPlayerExitVehicle(Player player, Vehicle veh)
|
||||
{
|
||||
ServerVehicle sVeh = VehicleManager.GetServerVehicleFromVehicle(veh);
|
||||
User u = player.GetUser();
|
||||
|
||||
if (u.JobId == null) return;
|
||||
|
||||
@@ -9,10 +9,6 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Timers;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
||||
|
||||
|
||||
namespace ReallifeGamemode.Server.Managers
|
||||
{
|
||||
@@ -811,7 +807,6 @@ namespace ReallifeGamemode.Server.Managers
|
||||
v.SetSharedData("drivenDistance", (float)distanceDriven);
|
||||
});
|
||||
|
||||
|
||||
if (DateTime.UtcNow.Subtract(lastSave).Seconds >= 30)
|
||||
{
|
||||
lastSave = DateTime.UtcNow;
|
||||
@@ -902,7 +897,6 @@ namespace ReallifeGamemode.Server.Managers
|
||||
|
||||
foreach (KeyValuePair<int, NetHandle> pair in _serverVehicles)
|
||||
{
|
||||
|
||||
if (pair.Value == veh.Handle)
|
||||
{
|
||||
return dbContext.ServerVehicles.Find(pair.Key);
|
||||
|
||||
Reference in New Issue
Block a user