Events reworked (moved all logic to LCPlayer, previously PlayerCore)
added ondie-dropping prevention, AND give items back on respawn
This commit is contained in:
parent
237ff18841
commit
d07a3a6b78
4 changed files with 214 additions and 98 deletions
154
src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java
Normal file
154
src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
* Limited Creative - (Bukkit Plugin)
|
||||||
|
* Copyright (C) 2012 jascha@ja-s.de
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package de.jaschastarke.minecraft.limitedcreative;
|
||||||
|
|
||||||
|
import static de.jaschastarke.minecraft.utils.Locale.L;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEntityEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||||
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import de.jaschastarke.minecraft.limitedcreative.serialize.Items;
|
||||||
|
|
||||||
|
public class LCPlayer {
|
||||||
|
private static LimitedCreativeCore plugin = LimitedCreativeCore.plugin;
|
||||||
|
private static Map<Player, LCPlayer> players = new HashMap<Player, LCPlayer>();
|
||||||
|
private Player player;
|
||||||
|
private Map<Integer, ItemStack> tempinv = null;
|
||||||
|
|
||||||
|
private LCPlayer(Player pplayer) {
|
||||||
|
player = pplayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LCPlayer get(Player pplayer) {
|
||||||
|
if (!players.containsKey(pplayer)) {
|
||||||
|
LCPlayer p = new LCPlayer(pplayer);
|
||||||
|
players.put(pplayer, p);
|
||||||
|
return p;
|
||||||
|
} else {
|
||||||
|
return players.get(pplayer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSetCreative() {
|
||||||
|
if (plugin.config.getPermissionToKeepInventory() && player.hasPermission("limitedcreative.keepinventory"))
|
||||||
|
return;
|
||||||
|
Inventory inv = new Inventory(player);
|
||||||
|
inv.save();
|
||||||
|
if (plugin.config.getStoreCreative() && inv.isStored(GameMode.CREATIVE)) {
|
||||||
|
inv.load(GameMode.CREATIVE);
|
||||||
|
} else {
|
||||||
|
inv.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void onSetSurvival() {
|
||||||
|
if (plugin.config.getPermissionToKeepInventory() && player.hasPermission("limitedcreative.keepinventory"))
|
||||||
|
return;
|
||||||
|
Inventory inv = new Inventory(player);
|
||||||
|
if (plugin.config.getStoreCreative()) {
|
||||||
|
inv.save();
|
||||||
|
}
|
||||||
|
if (inv.isStored(GameMode.SURVIVAL))
|
||||||
|
inv.load(GameMode.SURVIVAL);
|
||||||
|
}
|
||||||
|
public void onDropItem(PlayerDropItemEvent event) {
|
||||||
|
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||||
|
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.drop"))
|
||||||
|
return;
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void onPickupItem(PlayerPickupItemEvent event) {
|
||||||
|
if (player.getGameMode() == GameMode.CREATIVE && plugin.config.getBlockPickupInCreative()) {
|
||||||
|
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.pickup"))
|
||||||
|
return;
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDie(EntityDeathEvent event) {
|
||||||
|
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||||
|
if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.drop")) {
|
||||||
|
event.getDrops().clear();
|
||||||
|
tempinv = Items.storeInventory(player.getInventory());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void onRespawn(PlayerRespawnEvent event) {
|
||||||
|
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||||
|
if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.drop")) {
|
||||||
|
if (tempinv != null) {
|
||||||
|
Items.restoreInventory(player.getInventory(), tempinv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tempinv = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDamage(EntityDamageByEntityEvent event) {
|
||||||
|
if (event.getDamager() instanceof Player) {
|
||||||
|
// its PVP
|
||||||
|
Player attacker = (Player) event.getDamager();
|
||||||
|
if (attacker.getGameMode() == GameMode.CREATIVE) {
|
||||||
|
if (!plugin.config.getPermissionsEnabled() || !attacker.hasPermission("limitedcreative.nolimit.pvp")) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||||
|
if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.pvp")) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void onChestAccess(PlayerInteractEvent event) {
|
||||||
|
if (player.getGameMode() != GameMode.CREATIVE)
|
||||||
|
return;
|
||||||
|
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest"))
|
||||||
|
return;
|
||||||
|
event.getPlayer().sendMessage(L("blocked.chest"));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
public void onChestAccess(PlayerInteractEntityEvent event) { // chest-minecarts are different events
|
||||||
|
if (player.getGameMode() != GameMode.CREATIVE)
|
||||||
|
return;
|
||||||
|
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest"))
|
||||||
|
return;
|
||||||
|
event.getPlayer().sendMessage(L("blocked.chest"));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
public void onSignAccess(PlayerInteractEvent event) {
|
||||||
|
if (!plugin.config.getSignBlock() || player.getGameMode() != GameMode.CREATIVE)
|
||||||
|
return;
|
||||||
|
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.sign"))
|
||||||
|
return;
|
||||||
|
event.getPlayer().sendMessage(L("blocked.sign"));
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -29,6 +29,7 @@ import org.bukkit.event.Event.Priority;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent;
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
import org.bukkit.event.entity.EntityListener;
|
import org.bukkit.event.entity.EntityListener;
|
||||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
import org.bukkit.event.player.PlayerGameModeChangeEvent;
|
import org.bukkit.event.player.PlayerGameModeChangeEvent;
|
||||||
|
@ -36,8 +37,8 @@ import org.bukkit.event.player.PlayerInteractEntityEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.event.player.PlayerListener;
|
import org.bukkit.event.player.PlayerListener;
|
||||||
import org.bukkit.event.player.PlayerPickupItemEvent;
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||||
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||||
import org.bukkit.plugin.PluginManager;
|
import org.bukkit.plugin.PluginManager;
|
||||||
import static de.jaschastarke.minecraft.utils.Locale.L;
|
|
||||||
|
|
||||||
public final class Listener {
|
public final class Listener {
|
||||||
private static LimitedCreativeCore plugin;
|
private static LimitedCreativeCore plugin;
|
||||||
|
@ -47,52 +48,41 @@ public final class Listener {
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) {
|
public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) {
|
||||||
if (event.getNewGameMode() == GameMode.CREATIVE) {
|
if (event.getNewGameMode() == GameMode.CREATIVE) {
|
||||||
new PlayerCore(plugin, event.getPlayer()).onSetCreative();
|
LCPlayer.get(event.getPlayer()).onSetCreative();
|
||||||
} else if (event.getNewGameMode() == GameMode.SURVIVAL) {
|
} else if (event.getNewGameMode() == GameMode.SURVIVAL) {
|
||||||
new PlayerCore(plugin, event.getPlayer()).onSetSurvival();
|
LCPlayer.get(event.getPlayer()).onSetSurvival();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerRespawn(PlayerRespawnEvent event) {
|
||||||
|
LCPlayer.get(event.getPlayer()).onRespawn(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||||
if (event.getPlayer().getGameMode() == GameMode.CREATIVE) {
|
LCPlayer.get(event.getPlayer()).onDropItem(event);
|
||||||
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.drop"))
|
|
||||||
return;
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerPickupItem(PlayerPickupItemEvent event) {
|
public void onPlayerPickupItem(PlayerPickupItemEvent event) {
|
||||||
if (event.getPlayer().getGameMode() == GameMode.CREATIVE && plugin.config.getBlockPickupInCreative()) {
|
LCPlayer.get(event.getPlayer()).onPickupItem(event);
|
||||||
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.pickup"))
|
}
|
||||||
return;
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
if (event.isCancelled() || event.getPlayer().getGameMode() == GameMode.SURVIVAL)
|
if (event.isCancelled() || event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||||
return;
|
|
||||||
|
|
||||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Block block = event.getClickedBlock();
|
Block block = event.getClickedBlock();
|
||||||
|
|
||||||
if (block.getState() instanceof ContainerBlock) {
|
if (block.getState() instanceof ContainerBlock) {
|
||||||
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest"))
|
LCPlayer.get(event.getPlayer()).onChestAccess(event);
|
||||||
return;
|
|
||||||
event.getPlayer().sendMessage(L("blocked.chest"));
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
}
|
||||||
if (plugin.config.getSignBlock() && block.getState() instanceof Sign) {
|
if (block.getState() instanceof Sign) {
|
||||||
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.sign"))
|
LCPlayer.get(event.getPlayer()).onSignAccess(event);
|
||||||
return;
|
|
||||||
event.getPlayer().sendMessage(L("blocked.sign"));
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,10 +94,7 @@ public final class Listener {
|
||||||
Entity entity = event.getRightClicked();
|
Entity entity = event.getRightClicked();
|
||||||
|
|
||||||
if (entity instanceof StorageMinecart) {
|
if (entity instanceof StorageMinecart) {
|
||||||
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest"))
|
LCPlayer.get(event.getPlayer()).onChestAccess(event);
|
||||||
return;
|
|
||||||
event.getPlayer().sendMessage(L("blocked.chest"));
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,6 +104,7 @@ public final class Listener {
|
||||||
pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, this, Priority.Normal, plugin);
|
pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, this, Priority.Normal, plugin);
|
||||||
pm.registerEvent(Event.Type.PLAYER_INTERACT, this, Priority.Lowest, plugin);
|
pm.registerEvent(Event.Type.PLAYER_INTERACT, this, Priority.Lowest, plugin);
|
||||||
pm.registerEvent(Event.Type.PLAYER_INTERACT_ENTITY, this, Priority.Lowest, plugin);
|
pm.registerEvent(Event.Type.PLAYER_INTERACT_ENTITY, this, Priority.Lowest, plugin);
|
||||||
|
pm.registerEvent(Event.Type.PLAYER_RESPAWN, this, Priority.Normal, plugin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,26 +113,23 @@ public final class Listener {
|
||||||
public void onEntityDamage(EntityDamageEvent meta_event) {
|
public void onEntityDamage(EntityDamageEvent meta_event) {
|
||||||
if (meta_event instanceof EntityDamageByEntityEvent) {
|
if (meta_event instanceof EntityDamageByEntityEvent) {
|
||||||
EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) meta_event;
|
EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) meta_event;
|
||||||
if (event.getEntity() instanceof Player && event.getDamager() instanceof Player) {
|
if (event.getEntity() instanceof Player) {
|
||||||
// its PVP
|
LCPlayer.get((Player) event.getEntity()).onDamage(event);
|
||||||
Player attacker = (Player) event.getDamager();
|
|
||||||
Player attacked = (Player) event.getEntity();
|
|
||||||
if (attacker.getGameMode() == GameMode.CREATIVE) {
|
|
||||||
if (!plugin.config.getPermissionsEnabled() || !attacker.hasPermission("limitedcreative.nolimit.pvp")) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (attacked.getGameMode() == GameMode.CREATIVE) {
|
|
||||||
if (!plugin.config.getPermissionsEnabled() || !attacked.hasPermission("limitedcreative.nolimit.pvp")) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEntityDeath(EntityDeathEvent event) {
|
||||||
|
if (event.getEntity() instanceof Player) {
|
||||||
|
Player player = (Player) event.getEntity();
|
||||||
|
LCPlayer.get(player).onDie(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void register() {
|
private void register() {
|
||||||
pm.registerEvent(Event.Type.ENTITY_DAMAGE, this, Priority.Normal, plugin);
|
pm.registerEvent(Event.Type.ENTITY_DAMAGE, this, Priority.Normal, plugin);
|
||||||
|
pm.registerEvent(Event.Type.ENTITY_DEATH, this, Priority.Low, plugin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
/*
|
|
||||||
* Limited Creative - (Bukkit Plugin)
|
|
||||||
* Copyright (C) 2012 jascha@ja-s.de
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package de.jaschastarke.minecraft.limitedcreative;
|
|
||||||
|
|
||||||
import org.bukkit.GameMode;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
public class PlayerCore {
|
|
||||||
private static LimitedCreativeCore plugin;
|
|
||||||
private Player player;
|
|
||||||
|
|
||||||
public PlayerCore(LimitedCreativeCore pplugin, Player pplayer) {
|
|
||||||
plugin = pplugin;
|
|
||||||
player = pplayer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onSetCreative() {
|
|
||||||
if (plugin.config.getPermissionToKeepInventory() && player.hasPermission("limitedcreative.keepinventory"))
|
|
||||||
return;
|
|
||||||
Inventory inv = new Inventory(player);
|
|
||||||
inv.save();
|
|
||||||
if (plugin.config.getStoreCreative() && inv.isStored(GameMode.CREATIVE)) {
|
|
||||||
inv.load(GameMode.CREATIVE);
|
|
||||||
} else {
|
|
||||||
inv.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void onSetSurvival() {
|
|
||||||
if (plugin.config.getPermissionToKeepInventory() && player.hasPermission("limitedcreative.keepinventory"))
|
|
||||||
return;
|
|
||||||
Inventory inv = new Inventory(player);
|
|
||||||
if (plugin.config.getStoreCreative()) {
|
|
||||||
inv.save();
|
|
||||||
}
|
|
||||||
if (inv.isStored(GameMode.SURVIVAL))
|
|
||||||
inv.load(GameMode.SURVIVAL);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
package de.jaschastarke.minecraft.limitedcreative.serialize;
|
package de.jaschastarke.minecraft.limitedcreative.serialize;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
@ -72,4 +73,33 @@ public class Items implements Storeable {
|
||||||
return ItemStack.deserialize(serialize);
|
return ItemStack.deserialize(serialize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static Map<Integer, ItemStack> storeInventory(PlayerInventory inv) {
|
||||||
|
Map<Integer, ItemStack> map = new HashMap<Integer, ItemStack>();
|
||||||
|
for (int i = 0; i < inv.getSize(); i++) {
|
||||||
|
if (inv.getItem(i) != null && inv.getItem(i).getTypeId() != 0) {
|
||||||
|
map.put(i, inv.getItem(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < inv.getArmorContents().length; i++) {
|
||||||
|
map.put((i * -1) - 1, inv.getArmorContents()[i]);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
public static void restoreInventory(PlayerInventory inv, Map<Integer, ItemStack> map) {
|
||||||
|
for (int i = 0; i < inv.getSize(); i++) {
|
||||||
|
if (map.containsKey(i)) {
|
||||||
|
inv.setItem(i, map.get(i));
|
||||||
|
} else {
|
||||||
|
inv.setItem(i, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < inv.getArmorContents().length; i++) {
|
||||||
|
int _i = (i * -1) - 1;
|
||||||
|
if (map.containsKey(_i)) {
|
||||||
|
inv.getArmorContents()[i] = map.get(_i);
|
||||||
|
} else {
|
||||||
|
inv.getArmorContents()[i] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue