mirror of
https://github.com/GTNewHorizons/StorageDrawers.git
synced 2026-11-12 16:37:28 +00:00
Access protection key
This commit is contained in:
1 parent
280719a1ef
commit
f94d25fc68
13 files changed
+165
-40
No files matched your search
@@ -32,6 +32,8 @@ item.storagedrawers.upgradeSorting.name=Sorting Upgrade
|
||||
item.storagedrawers.upgradeSorting.description=For Refined Relocation
|
||||
item.storagedrawers.shroudKey.name=Concealment Key
|
||||
item.storagedrawers.shroudKey.description=Show or hide item labels
|
||||
item.storagedrawers.personalKey.name=Personal Key
|
||||
item.storagedrawers.personalKey.description=Protect access from other players
|
||||
item.storagedrawers.tape.name=Packing Tape
|
||||
item.storagedrawers.tape.description=Seals drawers for moving
|
||||
|
||||
@@ -97,6 +99,7 @@ storageDrawers.waila.nolimit=Stack Limit: ∞
|
||||
storageDrawers.waila.locked=Locked
|
||||
storageDrawers.waila.void=Void
|
||||
storageDrawers.waila.sorting=Sorting
|
||||
storageDrawers.waila.protected=Protected
|
||||
|
||||
# Configuration
|
||||
storageDrawers.config.title=Storage Drawers Configuration
|
||||
@@ -132,6 +135,7 @@ storageDrawers.config.prop.enableIndicatorUpgrades=Enable Indicator Upgrades
|
||||
storageDrawers.config.prop.enableStorageUpgrades=Enable Storage Upgrades
|
||||
storageDrawers.config.prop.enableLockUpgrades=Enable Drawer Locking
|
||||
storageDrawers.config.prop.enableShroudUpgrades=Enable Item Concealing
|
||||
storageDrawers.config.prop.enablePersonalUpgrades=Enable Access Protection
|
||||
storageDrawers.config.prop.enableVoidUpgrades=Enable Void Upgrade
|
||||
storageDrawers.config.prop.enableCreativeUpgrades=Enable Creative Upgrade
|
||||
storageDrawers.config.prop.enableSortingUpgrades=Enable Sorting Upgrade
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 235 B |
Binary file not shown.
|
After Width: | Height: | Size: 251 B |
Binary file not shown.
|
After Width: | Height: | Size: 357 B |
@@ -0,0 +1,8 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.api.storage.attribute;
|
||||
|
||||
/**
|
||||
* Created by Justin on 2/8/2016.
|
||||
*/
|
||||
public interface IProtectable
|
||||
{
|
||||
}
|
||||
@@ -99,6 +99,10 @@ public class BlockDrawers extends BlockContainer implements IExtendedBlockClickH
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon iconLock;
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon iconClaim;
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon iconClaimLock;
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon iconVoid;
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@@ -297,6 +301,9 @@ public class BlockDrawers extends BlockContainer implements IExtendedBlockClickH
|
||||
TileEntityDrawers tileDrawers = getTileEntitySafe(world, x, y, z);
|
||||
ItemStack item = player.inventory.getCurrentItem();
|
||||
|
||||
if (tileDrawers.getOwner() != null && !player.getPersistentID().equals(tileDrawers.getOwner()))
|
||||
return false;
|
||||
|
||||
if (StorageDrawers.config.cache.debugTrace) {
|
||||
FMLLog.log(StorageDrawers.MOD_ID, Level.INFO, "BlockDrawers.onBlockActivated");
|
||||
FMLLog.log(StorageDrawers.MOD_ID, Level.INFO, (item == null) ? " null item" : " " + item.toString());
|
||||
@@ -340,6 +347,15 @@ public class BlockDrawers extends BlockContainer implements IExtendedBlockClickH
|
||||
tileDrawers.setIsShrouded(!tileDrawers.isShrouded());
|
||||
return true;
|
||||
}
|
||||
else if (item.getItem() == ModItems.personalKey) {
|
||||
if (tileDrawers.getOwner() == null)
|
||||
tileDrawers.setOwner(player.getPersistentID());
|
||||
else if (player.getPersistentID().equals(tileDrawers.getOwner()))
|
||||
tileDrawers.setOwner(null);
|
||||
else
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
else if (item.getItem() == ModItems.tape)
|
||||
return false;
|
||||
}
|
||||
@@ -433,6 +449,9 @@ public class BlockDrawers extends BlockContainer implements IExtendedBlockClickH
|
||||
if (tileDrawers.isSealed())
|
||||
return;
|
||||
|
||||
if (tileDrawers.getOwner() != null && !tileDrawers.getOwner().equals(player.getPersistentID()))
|
||||
return;
|
||||
|
||||
int slot = getDrawerSlot(side, hitX, hitY, hitZ);
|
||||
IDrawer drawer = tileDrawers.getDrawer(slot);
|
||||
|
||||
@@ -791,8 +810,15 @@ public class BlockDrawers extends BlockContainer implements IExtendedBlockClickH
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon getLockIcon () {
|
||||
return iconLock;
|
||||
public IIcon getLockIcon (boolean locked, boolean claimed) {
|
||||
if (locked && claimed)
|
||||
return iconClaimLock;
|
||||
else if (locked)
|
||||
return iconLock;
|
||||
else if (claimed)
|
||||
return iconClaim;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@@ -854,6 +880,8 @@ public class BlockDrawers extends BlockContainer implements IExtendedBlockClickH
|
||||
iconIndicator4[1] = register.registerIcon(StorageDrawers.MOD_ID + ":indicator/indicator_4_on");
|
||||
|
||||
iconLock = register.registerIcon(StorageDrawers.MOD_ID + ":indicator/lock_icon");
|
||||
iconClaim = register.registerIcon(StorageDrawers.MOD_ID + ":indicator/claim_icon");
|
||||
iconClaimLock = register.registerIcon(StorageDrawers.MOD_ID + ":indicator/claim_lock_icon");
|
||||
iconVoid = register.registerIcon(StorageDrawers.MOD_ID + ":indicator/void_icon");
|
||||
|
||||
loadBlockConfig();
|
||||
|
||||
@@ -47,6 +47,7 @@ public abstract class TileEntityDrawers extends BaseTileEntity implements IDrawe
|
||||
private boolean shrouded = false;
|
||||
private boolean taped = false;
|
||||
private boolean hideUpgrade = false;
|
||||
private UUID owner;
|
||||
|
||||
private EnumSet<LockAttribute> lockAttributes = null;
|
||||
|
||||
@@ -241,6 +242,24 @@ public abstract class TileEntityDrawers extends BaseTileEntity implements IDrawe
|
||||
}
|
||||
}
|
||||
|
||||
public UUID getOwner () {
|
||||
if (!StorageDrawers.config.cache.enablePersonalUpgrades)
|
||||
return null;
|
||||
|
||||
return owner;
|
||||
}
|
||||
|
||||
public void setOwner (UUID owner) {
|
||||
if ((this.owner != null && !this.owner.equals(owner)) || (owner != null && !owner.equals(this.owner))) {
|
||||
this.owner = owner;
|
||||
|
||||
if (worldObj != null && !worldObj.isRemote) {
|
||||
markDirty();
|
||||
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean shouldHideUpgrades () {
|
||||
return hideUpgrade;
|
||||
}
|
||||
@@ -476,6 +495,10 @@ public abstract class TileEntityDrawers extends BaseTileEntity implements IDrawe
|
||||
if (tag.hasKey("Shr"))
|
||||
shrouded = tag.getBoolean("Shr");
|
||||
|
||||
owner = null;
|
||||
if (tag.hasKey("Own"))
|
||||
owner = UUID.fromString(tag.getString("Own"));
|
||||
|
||||
hideUpgrade = false;
|
||||
if (tag.hasKey("HideUp"))
|
||||
hideUpgrade = tag.getBoolean("HideUp");
|
||||
@@ -517,6 +540,9 @@ public abstract class TileEntityDrawers extends BaseTileEntity implements IDrawe
|
||||
if (shrouded)
|
||||
tag.setBoolean("Shr", shrouded);
|
||||
|
||||
if (owner != null)
|
||||
tag.setString("Own", owner.toString());
|
||||
|
||||
if (hideUpgrade)
|
||||
tag.setBoolean("HideUp", hideUpgrade);
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@ public class DrawersRenderer implements ISimpleBlockRenderingHandler
|
||||
if (StorageDrawers.config.cache.enableIndicatorUpgrades)
|
||||
renderIndicator(block, x, y, z, side, renderer, tile.getEffectiveStatusLevel());
|
||||
if (StorageDrawers.config.cache.enableLockUpgrades)
|
||||
renderLock(block, x, y, z, side, renderer, tile.isLocked(LockAttribute.LOCK_POPULATED));
|
||||
renderLock(block, x, y, z, side, renderer, tile.isLocked(LockAttribute.LOCK_POPULATED), tile.getOwner() != null);
|
||||
if (StorageDrawers.config.cache.enableVoidUpgrades)
|
||||
renderVoid(block, x, y, z, side, renderer, tile.isVoid());
|
||||
if (StorageDrawers.config.cache.enableTape)
|
||||
@@ -147,12 +147,12 @@ public class DrawersRenderer implements ISimpleBlockRenderingHandler
|
||||
return true;
|
||||
}
|
||||
|
||||
private void renderLock (BlockDrawers block, int x, int y, int z, int side, RenderBlocks renderer, boolean locked) {
|
||||
if (!locked)
|
||||
private void renderLock (BlockDrawers block, int x, int y, int z, int side, RenderBlocks renderer, boolean locked, boolean owned) {
|
||||
if (!locked && !owned)
|
||||
return;
|
||||
|
||||
double depth = block.halfDepth ? .5 : 1;
|
||||
IIcon iconLock = block.getLockIcon();
|
||||
IIcon iconLock = block.getLockIcon(locked, owned);
|
||||
|
||||
RenderHelper.instance.setRenderBounds(0.46875, 0.9375, 0, 0.53125, 1, depth + .005);
|
||||
RenderHelper.instance.state.setRotateTransform(RenderHelper.ZPOS, side);
|
||||
|
||||
@@ -60,6 +60,7 @@ public class ConfigManager
|
||||
public boolean enableVoidUpgrades;
|
||||
public boolean enableCreativeUpgrades;
|
||||
public boolean enableShroudUpgrades;
|
||||
public boolean enablePersonalUpgrades;
|
||||
public boolean enableSortingUpgrades;
|
||||
public boolean renderStorageUpgrades;
|
||||
public boolean enableDrawerUI;
|
||||
@@ -229,6 +230,7 @@ public class ConfigManager
|
||||
cache.enableVoidUpgrades = config.get(Configuration.CATEGORY_GENERAL, "enableVoidUpgrades", true).setLanguageKey(LANG_PREFIX + "prop.enableVoidUpgrades").setRequiresMcRestart(true).getBoolean();
|
||||
cache.enableCreativeUpgrades = config.get(Configuration.CATEGORY_GENERAL, "enableCreativeUpgrades", true).setLanguageKey(LANG_PREFIX + "prop.enableCreativeUpgrades").setRequiresMcRestart(true).getBoolean();
|
||||
cache.enableShroudUpgrades = config.get(Configuration.CATEGORY_GENERAL, "enableShroudUpgrades", true).setLanguageKey(LANG_PREFIX + "prop.enableShroudUpgrades").setRequiresMcRestart(true).getBoolean();
|
||||
cache.enablePersonalUpgrades = config.get(Configuration.CATEGORY_GENERAL, "enablePersonalUpgrades", true).setLanguageKey(LANG_PREFIX + "prop.enablePersonalUpgrades").setRequiresMcRestart(true).getBoolean();
|
||||
cache.enableSortingUpgrades = config.get(Configuration.CATEGORY_GENERAL, "enableSortingUpgrades", true).setLanguageKey(LANG_PREFIX + "prop.enableSortingUpgrades").setRequiresMcRestart(true).getBoolean();
|
||||
cache.enableTape = config.get(Configuration.CATEGORY_GENERAL, "enableTape", true).setLanguageKey(LANG_PREFIX + "prop.enableTape").setRequiresMcRestart(true).getBoolean();
|
||||
cache.itemRenderType = config.get(Configuration.CATEGORY_GENERAL, "itemRenderType", "fast", null, new String[]{"fancy", "fast"}).setLanguageKey(LANG_PREFIX + "prop.itemRenderType").getString();
|
||||
|
||||
@@ -14,6 +14,7 @@ public class ModItems
|
||||
public static ItemUpgradeVoid upgradeVoid;
|
||||
public static ItemUpgradeCreative upgradeCreative;
|
||||
public static ItemShroudKey shroudKey;
|
||||
public static ItemPersonalKey personalKey;
|
||||
public static ItemTape tape;
|
||||
|
||||
public void init () {
|
||||
@@ -24,6 +25,7 @@ public class ModItems
|
||||
upgradeVoid = new ItemUpgradeVoid(makeName("upgradeVoid"));
|
||||
upgradeCreative = new ItemUpgradeCreative(makeName("upgradeCreative"));
|
||||
shroudKey = new ItemShroudKey(makeName("shroudKey"));
|
||||
personalKey = new ItemPersonalKey(makeName("personalKey"));
|
||||
tape = new ItemTape(makeName("tape"));
|
||||
|
||||
GameRegistry.registerItem(upgradeTemplate, "upgradeTemplate");
|
||||
@@ -40,6 +42,8 @@ public class ModItems
|
||||
GameRegistry.registerItem(upgradeLock, "upgradeLock");
|
||||
if (StorageDrawers.config.cache.enableShroudUpgrades)
|
||||
GameRegistry.registerItem(shroudKey, "shroudKey");
|
||||
if (StorageDrawers.config.cache.enablePersonalUpgrades)
|
||||
GameRegistry.registerItem(personalKey, "personalKey");
|
||||
if (StorageDrawers.config.cache.enableTape)
|
||||
GameRegistry.registerItem(tape, "tape");
|
||||
}
|
||||
|
||||
@@ -116,6 +116,10 @@ public class ModRecipes
|
||||
GameRegistry.addShapelessRecipe(new ItemStack(ModItems.shroudKey), ModItems.upgradeLock, Items.ender_eye);
|
||||
}
|
||||
|
||||
if (config.cache.enablePersonalUpgrades) {
|
||||
GameRegistry.addShapelessRecipe(new ItemStack(ModItems.personalKey), ModItems.upgradeLock, Items.name_tag);
|
||||
}
|
||||
|
||||
if (config.cache.enableTape) {
|
||||
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(ModItems.tape), " x ", "yyy",
|
||||
'x', "slimeball", 'y', Items.paper));
|
||||
|
||||
@@ -13,6 +13,7 @@ import mcp.mobius.waila.api.IWailaConfigHandler;
|
||||
import mcp.mobius.waila.api.IWailaDataAccessor;
|
||||
import mcp.mobius.waila.api.IWailaDataProvider;
|
||||
import mcp.mobius.waila.api.IWailaRegistrar;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -61,46 +62,47 @@ public class Waila extends IntegrationModule
|
||||
public List<String> getWailaBody (ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
|
||||
TileEntityDrawers tile = (TileEntityDrawers) accessor.getTileEntity();
|
||||
|
||||
IDrawerGroup group = tile;
|
||||
for (int i = 0; i < group.getDrawerCount(); i++) {
|
||||
if (!group.isDrawerEnabled(i))
|
||||
continue;
|
||||
if (tile.getOwner() == null || tile.getOwner().equals(Minecraft.getMinecraft().thePlayer.getPersistentID())) {
|
||||
IDrawerGroup group = tile;
|
||||
for (int i = 0; i < group.getDrawerCount(); i++) {
|
||||
if (!group.isDrawerEnabled(i))
|
||||
continue;
|
||||
|
||||
String name = StatCollector.translateToLocal("storageDrawers.waila.empty");
|
||||
String name = StatCollector.translateToLocal("storageDrawers.waila.empty");
|
||||
|
||||
IDrawer drawer = group.getDrawer(i);
|
||||
ItemStack stack = drawer.getStoredItemPrototype();
|
||||
if (stack != null && stack.getItem() != null) {
|
||||
String stackName = stack.getDisplayName();
|
||||
List<IWailaTooltipHandler> handlers = StorageDrawers.wailaRegistry.getTooltipHandlers();
|
||||
for (int j = 0, n = handlers.size(); j < n; j++)
|
||||
stackName = handlers.get(j).transformItemName(drawer, stackName);
|
||||
IDrawer drawer = group.getDrawer(i);
|
||||
ItemStack stack = drawer.getStoredItemPrototype();
|
||||
if (stack != null && stack.getItem() != null) {
|
||||
String stackName = stack.getDisplayName();
|
||||
List<IWailaTooltipHandler> handlers = StorageDrawers.wailaRegistry.getTooltipHandlers();
|
||||
for (int j = 0, n = handlers.size(); j < n; j++)
|
||||
stackName = handlers.get(j).transformItemName(drawer, stackName);
|
||||
|
||||
if (drawer.getStoredItemCount() == Integer.MAX_VALUE)
|
||||
name = stackName + " [\u221E]";
|
||||
else if (drawer instanceof IFractionalDrawer && ((IFractionalDrawer) drawer).getConversionRate() > 1)
|
||||
name = stackName + ((i == 0) ? " [" : " [+") + ((IFractionalDrawer) drawer).getStoredItemRemainder() + "]";
|
||||
else if (StorageDrawers.config.cache.stackRemainderWaila) {
|
||||
int stacks = drawer.getStoredItemCount() / drawer.getStoredItemStackSize();
|
||||
int remainder = drawer.getStoredItemCount() - (stacks * drawer.getStoredItemStackSize());
|
||||
if (stacks > 0 && remainder > 0)
|
||||
name = stackName + " [" + stacks + "x" + drawer.getStoredItemStackSize() + " + " + remainder + "]";
|
||||
else if (stacks > 0)
|
||||
name = stackName + " [" + stacks + "x" + drawer.getStoredItemStackSize() + "]";
|
||||
else
|
||||
name = stackName + " [" + remainder + "]";
|
||||
if (drawer.getStoredItemCount() == Integer.MAX_VALUE)
|
||||
name = stackName + " [\u221E]";
|
||||
else if (drawer instanceof IFractionalDrawer && ((IFractionalDrawer) drawer).getConversionRate() > 1)
|
||||
name = stackName + ((i == 0) ? " [" : " [+") + ((IFractionalDrawer) drawer).getStoredItemRemainder() + "]";
|
||||
else if (StorageDrawers.config.cache.stackRemainderWaila) {
|
||||
int stacks = drawer.getStoredItemCount() / drawer.getStoredItemStackSize();
|
||||
int remainder = drawer.getStoredItemCount() - (stacks * drawer.getStoredItemStackSize());
|
||||
if (stacks > 0 && remainder > 0)
|
||||
name = stackName + " [" + stacks + "x" + drawer.getStoredItemStackSize() + " + " + remainder + "]";
|
||||
else if (stacks > 0)
|
||||
name = stackName + " [" + stacks + "x" + drawer.getStoredItemStackSize() + "]";
|
||||
else
|
||||
name = stackName + " [" + remainder + "]";
|
||||
} else
|
||||
name = stackName + " [" + drawer.getStoredItemCount() + "]";
|
||||
}
|
||||
else
|
||||
name = stackName + " [" + drawer.getStoredItemCount() + "]";
|
||||
currenttip.add(StatCollector.translateToLocalFormatted("storageDrawers.waila.drawer", i + 1, name));
|
||||
}
|
||||
currenttip.add(StatCollector.translateToLocalFormatted("storageDrawers.waila.drawer", i + 1, name));
|
||||
}
|
||||
|
||||
if (tile.isUnlimited() || tile.isVending())
|
||||
currenttip.add(StatCollector.translateToLocalFormatted("storageDrawers.waila.nolimit"));
|
||||
else {
|
||||
int limit = tile.getDrawerCapacity() * tile.getEffectiveStorageMultiplier();
|
||||
currenttip.add(StatCollector.translateToLocalFormatted("storageDrawers.waila.limit", limit, tile.getEffectiveStorageMultiplier()));
|
||||
if (tile.isUnlimited() || tile.isVending())
|
||||
currenttip.add(StatCollector.translateToLocalFormatted("storageDrawers.waila.nolimit"));
|
||||
else {
|
||||
int limit = tile.getDrawerCapacity() * tile.getEffectiveStorageMultiplier();
|
||||
currenttip.add(StatCollector.translateToLocalFormatted("storageDrawers.waila.limit", limit, tile.getEffectiveStorageMultiplier()));
|
||||
}
|
||||
}
|
||||
|
||||
String attrib = "";
|
||||
@@ -110,6 +112,8 @@ public class Waila extends IntegrationModule
|
||||
attrib += (attrib.isEmpty() ? "" : ", ") + StatCollector.translateToLocal("storageDrawers.waila.void");
|
||||
if (tile.isSorting())
|
||||
attrib += (attrib.isEmpty() ? "" : ", ") + StatCollector.translateToLocal("storageDrawers.waila.sorting");
|
||||
if (tile.getOwner() != null)
|
||||
attrib += (attrib.isEmpty() ? "" : ", ") + StatCollector.translateToLocal("storageDrawers.waila.protected");
|
||||
|
||||
if (!attrib.isEmpty())
|
||||
currenttip.add(attrib);
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.item;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.jaquadro.minecraft.storagedrawers.StorageDrawers;
|
||||
import com.jaquadro.minecraft.storagedrawers.core.ModCreativeTabs;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import net.minecraft.entity.SharedMonsterAttributes;
|
||||
import net.minecraft.entity.ai.attributes.AttributeModifier;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ItemPersonalKey extends Item
|
||||
{
|
||||
public ItemPersonalKey (String name) {
|
||||
setUnlocalizedName(name);
|
||||
setCreativeTab(ModCreativeTabs.tabStorageDrawers);
|
||||
setTextureName(StorageDrawers.MOD_ID + ":drawer_key_personal");
|
||||
setMaxDamage(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void addInformation (ItemStack itemStack, EntityPlayer player, List list, boolean par4) {
|
||||
String name = getUnlocalizedName(itemStack);
|
||||
list.add(StatCollector.translateToLocalFormatted(name + ".description"));
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public boolean isFull3D()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Multimap getAttributeModifiers (ItemStack item) {
|
||||
Multimap multimap = super.getAttributeModifiers(item);
|
||||
multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", (double)2, 0));
|
||||
return multimap;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user