--- ../src-base/minecraft/net/minecraft/entity/player/EntityPlayer.java
+++ ../src-work/minecraft/net/minecraft/entity/player/EntityPlayer.java
@@ -77,9 +77,23 @@
 import net.minecraft.world.WorldSettings;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
+import net.minecraftforge.common.ISpecialArmor.ArmorProperties;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.ForgeEventFactory;
+import net.minecraftforge.event.entity.living.LivingHurtEvent;
+import net.minecraftforge.event.entity.player.AttackEntityEvent;
+import net.minecraftforge.event.entity.player.EntityInteractEvent;
+import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent;
+import net.minecraftforge.event.entity.player.PlayerDropsEvent;
+import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent;
+import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
 
 public abstract class EntityPlayer extends EntityLivingBase
 {
+    public static final String PERSISTED_NBT_TAG = "PlayerPersisted";
+    private java.util.HashMap<Integer, BlockPos> spawnChunkMap = new java.util.HashMap<Integer, BlockPos>();
+    private java.util.HashMap<Integer, Boolean> spawnForcedMap = new java.util.HashMap<Integer, Boolean>();
+
     public InventoryPlayer field_71071_by = new InventoryPlayer(this);
     private InventoryEnderChest field_71078_a = new InventoryEnderChest();
     public Container field_71069_bz;
@@ -176,7 +190,8 @@
     {
         if (this.field_71074_e != null)
         {
-            this.field_71074_e.func_77974_b(this.field_70170_p, this, this.field_71072_f);
+            if (!net.minecraftforge.event.ForgeEventFactory.onUseItemStop(this, field_71074_e, this.field_71072_f))
+                this.field_71074_e.func_77974_b(this.field_70170_p, this, this.field_71072_f);
         }
 
         this.func_71041_bz();
@@ -214,6 +229,14 @@
 
             if (itemstack == this.field_71074_e)
             {
+                field_71072_f = net.minecraftforge.event.ForgeEventFactory.onItemUseTick(this, field_71074_e, field_71072_f);
+                if (field_71072_f <= 0)
+                {
+                    this.func_71036_o();
+                }
+                else
+                { // Forge Keep unindented to lower patch
+                field_71074_e.func_77973_b().onUsingTick(field_71074_e, this, field_71072_f); //Forge Added
                 if (this.field_71072_f <= 25 && this.field_71072_f % 4 == 0)
                 {
                     this.func_71010_c(itemstack, 5);
@@ -223,6 +246,7 @@
                 {
                     this.func_71036_o();
                 }
+                }
             }
             else
             {
@@ -268,7 +292,7 @@
 
         super.func_70071_h_();
 
-        if (!this.field_70170_p.field_72995_K && this.field_71070_bA != null && !this.field_71070_bA.func_75145_c(this))
+        if (!this.field_70170_p.field_72995_K && this.field_71070_bA != null && !net.minecraftforge.common.ForgeHooks.canInteractWith(this, this.field_71070_bA))
         {
             this.func_71053_j();
             this.field_71070_bA = this.field_71069_bz;
@@ -415,11 +439,13 @@
             int i = this.field_71074_e.field_77994_a;
             ItemStack itemstack = this.field_71074_e.func_77950_b(this.field_70170_p, this);
 
+            itemstack = net.minecraftforge.event.ForgeEventFactory.onItemUseFinish(this, field_71074_e, field_71072_f, itemstack);
+
             if (itemstack != this.field_71074_e || itemstack != null && itemstack.field_77994_a != i)
             {
                 this.field_71071_by.field_70462_a[this.field_71071_by.field_70461_c] = itemstack;
 
-                if (itemstack.field_77994_a == 0)
+                if (itemstack != null && itemstack.field_77994_a == 0)
                 {
                     this.field_71071_by.field_70462_a[this.field_71071_by.field_70461_c] = null;
                 }
@@ -479,11 +505,11 @@
             this.field_71109_bG = 0.0F;
             this.func_71015_k(this.field_70165_t - d0, this.field_70163_u - d1, this.field_70161_v - d2);
 
-            if (this.field_70154_o instanceof EntityPig)
+            if (this.field_70154_o instanceof EntityLivingBase && ((EntityLivingBase)field_70154_o).shouldRiderFaceForward(this))
             {
                 this.field_70125_A = f1;
                 this.field_70177_z = f;
-                this.field_70761_aq = ((EntityPig)this.field_70154_o).field_70761_aq;
+                this.field_70761_aq = ((EntityLivingBase)this.field_70154_o).field_70761_aq;
             }
         }
     }
@@ -613,11 +639,15 @@
 
     public void func_70645_a(DamageSource p_70645_1_)
     {
+        if (net.minecraftforge.common.ForgeHooks.onLivingDeath(this,  p_70645_1_)) return;
         super.func_70645_a(p_70645_1_);
         this.func_70105_a(0.2F, 0.2F);
         this.func_70107_b(this.field_70165_t, this.field_70163_u, this.field_70161_v);
         this.field_70181_x = 0.10000000149011612D;
 
+        captureDrops = true;
+        capturedDrops.clear();
+
         if (this.func_70005_c_().equals("Notch"))
         {
             this.func_146097_a(new ItemStack(Items.field_151034_e, 1), true, false);
@@ -628,6 +658,9 @@
             this.field_71071_by.func_70436_m();
         }
 
+        captureDrops = false;
+        if (!field_70170_p.field_72995_K) net.minecraftforge.event.ForgeEventFactory.onPlayerDrops(this, p_70645_1_, capturedDrops, field_70718_bc > 0);
+
         if (p_70645_1_ != null)
         {
             this.field_70159_w = (double)(-MathHelper.func_76134_b((this.field_70739_aP + this.field_70177_z) * (float)Math.PI / 180.0F) * 0.1F);
@@ -716,12 +749,25 @@
 
     public EntityItem func_71040_bB(boolean p_71040_1_)
     {
-        return this.func_146097_a(this.field_71071_by.func_70298_a(this.field_71071_by.field_70461_c, p_71040_1_ && this.field_71071_by.func_70448_g() != null ? this.field_71071_by.func_70448_g().field_77994_a : 1), false, true);
+        ItemStack stack = field_71071_by.func_70448_g();
+
+        if (stack == null)
+        {
+            return null;
+        }
+
+        if (stack.func_77973_b().onDroppedByPlayer(stack, this))
+        {
+            int count = p_71040_1_ && this.field_71071_by.func_70448_g() != null ? this.field_71071_by.func_70448_g().field_77994_a : 1;
+            return net.minecraftforge.common.ForgeHooks.onPlayerTossEvent(this, field_71071_by.func_70298_a(field_71071_by.field_70461_c, count), true);
+        }
+
+        return null;
     }
 
     public EntityItem func_71019_a(ItemStack p_71019_1_, boolean p_71019_2_)
     {
-        return this.func_146097_a(p_71019_1_, false, false);
+        return net.minecraftforge.common.ForgeHooks.onPlayerTossEvent(this, p_71019_1_, false);
     }
 
     public EntityItem func_146097_a(ItemStack p_146097_1_, boolean p_146097_2_, boolean p_146097_3_)
@@ -782,13 +828,25 @@
 
     public void func_71012_a(EntityItem p_71012_1_)
     {
+        if (captureDrops)
+        {
+            capturedDrops.add(p_71012_1_);
+            return;
+        }
         this.field_70170_p.func_72838_d(p_71012_1_);
     }
 
+    @Deprecated //Use location sensitive version below
     public float func_180471_a(Block p_180471_1_)
     {
-        float f = this.field_71071_by.func_146023_a(p_180471_1_);
+        return getBreakSpeed(p_180471_1_.func_176223_P(), new BlockPos(0, -1, 0));
+    }
 
+    public float getBreakSpeed(IBlockState state, BlockPos pos)
+    {
+        ItemStack stack = field_71071_by.func_70448_g();
+        float f = (stack == null ? 1.0F : stack.func_77973_b().getDigSpeed(stack, state));
+
         if (f > 1.0F)
         {
             int i = EnchantmentHelper.func_77509_b(this);
@@ -838,12 +896,13 @@
             f /= 5.0F;
         }
 
-        return f;
+        f = net.minecraftforge.event.ForgeEventFactory.getBreakSpeed(this, state, f, pos);
+        return (f < 0 ? 0 : f);
     }
 
     public boolean func_146099_a(Block p_146099_1_)
     {
-        return this.field_71071_by.func_146025_b(p_146099_1_);
+        return net.minecraftforge.event.ForgeEventFactory.doPlayerHarvestCheck(this, p_146099_1_, this.field_71071_by.func_146025_b(p_146099_1_));
     }
 
     public void func_70037_a(NBTTagCompound p_70037_1_)
@@ -879,6 +938,16 @@
             this.field_82248_d = p_70037_1_.func_74767_n("SpawnForced");
         }
 
+        NBTTagList spawnlist = null;
+        spawnlist = p_70037_1_.func_150295_c("Spawns", 10);
+        for (int i = 0; i < spawnlist.func_74745_c(); i++)
+        {
+            NBTTagCompound spawndata = (NBTTagCompound)spawnlist.func_150305_b(i);
+            int spawndim = spawndata.func_74762_e("Dim");
+            this.spawnChunkMap.put(spawndim, new BlockPos(spawndata.func_74762_e("SpawnX"), spawndata.func_74762_e("SpawnY"), spawndata.func_74762_e("SpawnZ")));
+            this.spawnForcedMap.put(spawndim, spawndata.func_74767_n("SpawnForced"));
+        }
+
         this.field_71100_bB.func_75112_a(p_70037_1_);
         this.field_71075_bZ.func_75095_b(p_70037_1_);
 
@@ -910,6 +979,23 @@
             p_70014_1_.func_74757_a("SpawnForced", this.field_82248_d);
         }
 
+        NBTTagList spawnlist = new NBTTagList();
+        for (java.util.Map.Entry<Integer, BlockPos> entry : this.spawnChunkMap.entrySet())
+        {
+            BlockPos spawn = entry.getValue();
+            if (spawn == null) continue;
+            Boolean forced = spawnForcedMap.get(entry.getKey());
+            if (forced == null) forced = false;
+            NBTTagCompound spawndata = new NBTTagCompound();
+            spawndata.func_74768_a("Dim", entry.getKey());
+            spawndata.func_74768_a("SpawnX", spawn.func_177958_n());
+            spawndata.func_74768_a("SpawnY", spawn.func_177956_o());
+            spawndata.func_74768_a("SpawnZ", spawn.func_177952_p());
+            spawndata.func_74757_a("SpawnForced", forced);
+            spawnlist.func_74742_a(spawndata);
+        }
+        p_70014_1_.func_74782_a("Spawns", spawnlist);
+
         this.field_71100_bB.func_75117_b(p_70014_1_);
         this.field_71075_bZ.func_75091_a(p_70014_1_);
         p_70014_1_.func_74782_a("EnderItems", this.field_71078_a.func_70487_g());
@@ -923,6 +1009,7 @@
 
     public boolean func_70097_a(DamageSource p_70097_1_, float p_70097_2_)
     {
+        if (!net.minecraftforge.common.ForgeHooks.onLivingAttack(this, p_70097_1_, p_70097_2_)) return false;
         if (this.func_180431_b(p_70097_1_))
         {
             return false;
@@ -1023,12 +1110,15 @@
     {
         if (!this.func_180431_b(p_70665_1_))
         {
+            p_70665_2_ = net.minecraftforge.common.ForgeHooks.onLivingHurt(this, p_70665_1_, p_70665_2_);
+            if (p_70665_2_ <= 0) return;
             if (!p_70665_1_.func_76363_c() && this.func_70632_aY() && p_70665_2_ > 0.0F)
             {
                 p_70665_2_ = (1.0F + p_70665_2_) * 0.5F;
             }
 
-            p_70665_2_ = this.func_70655_b(p_70665_1_, p_70665_2_);
+            p_70665_2_ = net.minecraftforge.common.ISpecialArmor.ArmorProperties.applyArmor(this, field_71071_by.field_70460_b, p_70665_1_, p_70665_2_);
+            if (p_70665_2_ <= 0) return;
             p_70665_2_ = this.func_70672_c(p_70665_1_, p_70665_2_);
             float f1 = p_70665_2_;
             p_70665_2_ = Math.max(p_70665_2_ - this.func_110139_bj(), 0.0F);
@@ -1076,6 +1166,7 @@
         }
         else
         {
+            if (!net.minecraftforge.event.ForgeEventFactory.canInteractWith(this, p_70998_1_)) return false;
             ItemStack itemstack = this.func_71045_bC();
             ItemStack itemstack1 = itemstack != null ? itemstack.func_77946_l() : null;
 
@@ -1127,7 +1218,9 @@
 
     public void func_71028_bD()
     {
+        ItemStack orig = func_71045_bC();
         this.field_71071_by.func_70299_a(this.field_71071_by.field_70461_c, (ItemStack)null);
+        net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(this, orig);
     }
 
     public double func_70033_W()
@@ -1137,6 +1230,7 @@
 
     public void func_71059_n(Entity p_71059_1_)
     {
+        if (!net.minecraftforge.common.ForgeHooks.onPlayerAttackTarget(this, p_71059_1_)) return;
         if (p_71059_1_.func_70075_an())
         {
             if (!p_71059_1_.func_85031_j(this))
@@ -1307,6 +1401,8 @@
 
     public EntityPlayer.EnumStatus func_180469_a(BlockPos p_180469_1_)
     {
+        EntityPlayer.EnumStatus ret = net.minecraftforge.event.ForgeEventFactory.onPlayerSleepInBed(this, p_180469_1_);
+        if (ret != null) return ret;
         if (!this.field_70170_p.field_72995_K)
         {
             if (this.func_70608_bn() || !this.func_70089_S())
@@ -1348,7 +1444,7 @@
 
         if (this.field_70170_p.func_175667_e(p_180469_1_))
         {
-            EnumFacing enumfacing = (EnumFacing)this.field_70170_p.func_180495_p(p_180469_1_).func_177229_b(BlockDirectional.field_176387_N);
+            EnumFacing enumfacing = this.field_70170_p.func_180495_p(p_180469_1_).func_177230_c().getBedDirection(field_70170_p, p_180469_1_);
             float f = 0.5F;
             float f1 = 0.5F;
 
@@ -1411,13 +1507,14 @@
 
     public void func_70999_a(boolean p_70999_1_, boolean p_70999_2_, boolean p_70999_3_)
     {
+        net.minecraftforge.event.ForgeEventFactory.onPlayerWakeup(this);
         this.func_70105_a(0.6F, 1.8F);
         IBlockState iblockstate = this.field_70170_p.func_180495_p(this.field_71081_bT);
 
-        if (this.field_71081_bT != null && iblockstate.func_177230_c() == Blocks.field_150324_C)
+        if (this.field_71081_bT != null && iblockstate.func_177230_c().isBed(field_70170_p, field_71081_bT, this))
         {
-            this.field_70170_p.func_180501_a(this.field_71081_bT, iblockstate.func_177226_a(BlockBed.field_176471_b, Boolean.valueOf(false)), 4);
-            BlockPos blockpos = BlockBed.func_176468_a(this.field_70170_p, this.field_71081_bT, 0);
+            iblockstate.func_177230_c().setBedOccupied(field_70170_p, field_71081_bT, this, false);
+            BlockPos blockpos = iblockstate.func_177230_c().getBedSpawnPosition(field_70170_p, field_71081_bT, this);
 
             if (blockpos == null)
             {
@@ -1444,12 +1541,12 @@
 
     private boolean func_175143_p()
     {
-        return this.field_70170_p.func_180495_p(this.field_71081_bT).func_177230_c() == Blocks.field_150324_C;
+        return this.field_70170_p.func_180495_p(this.field_71081_bT).func_177230_c().isBed(field_70170_p, field_71081_bT, this);
     }
 
     public static BlockPos func_180467_a(World p_180467_0_, BlockPos p_180467_1_, boolean p_180467_2_)
     {
-        if (p_180467_0_.func_180495_p(p_180467_1_).func_177230_c() != Blocks.field_150324_C)
+        if (!p_180467_0_.func_180495_p(p_180467_1_).func_177230_c().isBed(p_180467_0_, p_180467_1_, null))
         {
             if (!p_180467_2_)
             {
@@ -1466,7 +1563,7 @@
         }
         else
         {
-            return BlockBed.func_176468_a(p_180467_0_, p_180467_1_, 0);
+            return p_180467_0_.func_180495_p(p_180467_1_).func_177230_c().getBedSpawnPosition(p_180467_0_, p_180467_1_, null);
         }
     }
 
@@ -1475,7 +1572,7 @@
     {
         if (this.field_71081_bT != null)
         {
-            EnumFacing enumfacing = (EnumFacing)this.field_70170_p.func_180495_p(this.field_71081_bT).func_177229_b(BlockDirectional.field_176387_N);
+            EnumFacing enumfacing = this.field_70170_p.func_180495_p(this.field_71081_bT).func_177230_c().getBedDirection(field_70170_p, field_71081_bT);
 
             switch (EntityPlayer.SwitchEnumFacing.field_179420_a[enumfacing.ordinal()])
             {
@@ -1513,16 +1610,22 @@
 
     public BlockPos func_180470_cg()
     {
-        return this.field_71077_c;
+        return getBedLocation(this.field_71093_bK);
     }
 
+    @Deprecated
     public boolean func_82245_bX()
     {
-        return this.field_82248_d;
+        return isSpawnForced(this.field_71093_bK);
     }
 
     public void func_180473_a(BlockPos p_180473_1_, boolean p_180473_2_)
     {
+        if (this.field_71093_bK != 0)
+        {
+            setSpawnChunk(p_180473_1_, p_180473_2_, this.field_71093_bK);
+            return;
+        }
         if (p_180473_1_ != null)
         {
             this.field_71077_c = p_180473_1_;
@@ -1704,6 +1807,10 @@
 
             super.func_180430_e(p_180430_1_, p_180430_2_);
         }
+        else
+        {
+            net.minecraftforge.event.ForgeEventFactory.onPlayerFall(this, p_180430_1_, p_180430_2_);
+        }
     }
 
     protected void func_71061_d_()
@@ -1839,6 +1946,8 @@
     {
         if (p_71008_1_ != this.field_71074_e)
         {
+            p_71008_2_ = net.minecraftforge.event.ForgeEventFactory.onItemUseStart(this, p_71008_1_, p_71008_2_);
+            if (p_71008_2_ <= 0) return;
             this.field_71074_e = p_71008_1_;
             this.field_71072_f = p_71008_2_;
 
@@ -1908,6 +2017,10 @@
             this.field_71106_cc = p_71049_1_.field_71106_cc;
             this.func_85040_s(p_71049_1_.func_71037_bA());
             this.field_82152_aq = p_71049_1_.field_82152_aq;
+            //Copy and re-init ExtendedProperties when switching dimensions.
+            this.extendedProperties = p_71049_1_.extendedProperties;
+            for (net.minecraftforge.common.IExtendedEntityProperties p : this.extendedProperties.values())
+                p.init(this, this.field_70170_p);
         }
         else if (this.field_70170_p.func_82736_K().func_82766_b("keepInventory"))
         {
@@ -1920,6 +2033,18 @@
 
         this.field_71078_a = p_71049_1_.field_71078_a;
         this.func_70096_w().func_75692_b(10, Byte.valueOf(p_71049_1_.func_70096_w().func_75683_a(10)));
+
+        this.spawnChunkMap = p_71049_1_.spawnChunkMap;
+        this.spawnForcedMap = p_71049_1_.spawnForcedMap;
+
+        //Copy over a section of the Entity Data from the old player.
+        //Allows mods to specify data that persists after players respawn.
+        NBTTagCompound old = p_71049_1_.getEntityData();
+        if (old.func_74764_b(PERSISTED_NBT_TAG))
+        {
+            getEntityData().func_74782_a(PERSISTED_NBT_TAG, old.func_74775_l(PERSISTED_NBT_TAG));
+        }
+        net.minecraftforge.event.ForgeEventFactory.onPlayerClone(this, p_71049_1_, !p_71049_2_);
     }
 
     protected boolean func_70041_e_()
@@ -1953,7 +2078,14 @@
 
     public void func_70062_b(int p_70062_1_, ItemStack p_70062_2_)
     {
-        this.field_71071_by.field_70460_b[p_70062_1_] = p_70062_2_;
+        if (p_70062_1_ == 0) //Forge: Fix issue in Player where it doen't take into account selected item
+        {
+            this.field_71071_by.field_70462_a[this.field_71071_by.field_70461_c] = p_70062_2_;
+        }
+        else
+        {
+            this.field_71071_by.field_70460_b[p_70062_1_ - 1] = p_70062_2_;
+        }
     }
 
     @SideOnly(Side.CLIENT)
@@ -1998,7 +2130,7 @@
 
     public IChatComponent func_145748_c_()
     {
-        ChatComponentText chatcomponenttext = new ChatComponentText(ScorePlayerTeam.func_96667_a(this.func_96124_cp(), this.func_70005_c_()));
+        ChatComponentText chatcomponenttext = new ChatComponentText(ScorePlayerTeam.func_96667_a(this.func_96124_cp(), this.getDisplayNameString()));
         chatcomponenttext.func_150256_b().func_150241_a(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/msg " + this.func_70005_c_() + " "));
         chatcomponenttext.func_150256_b().func_150209_a(this.func_174823_aP());
         chatcomponenttext.func_150256_b().func_179989_a(this.func_70005_c_());
@@ -2157,6 +2289,101 @@
         net.minecraftforge.fml.common.network.internal.FMLNetworkHandler.openGui(this, mod, modGuiId, world, x, y, z);
     }
 
+
+    /* ======================================== FORGE START =====================================*/
+    /**
+     * A dimension aware version of getBedLocation.
+     * @param dimension The dimension to get the bed spawn for
+     * @return The player specific spawn location for the dimension.  May be null.
+     */
+    public BlockPos getBedLocation(int dimension)
+    {
+        return dimension == 0 ? field_71077_c : spawnChunkMap.get(dimension);
+    }
+
+    /**
+     * A dimension aware version of isSpawnForced.
+     * Noramally isSpawnForced is used to determine if the respawn system should check for a bed or not.
+     * This just extends that to be dimension aware.
+     * @param dimension The dimension to get whether to check for a bed before spawning for
+     * @return The player specific spawn location for the dimension.  May be null.
+     */
+    public boolean isSpawnForced(int dimension)
+    {
+        if (dimension == 0) return this.field_82248_d;
+        Boolean forced = this.spawnForcedMap.get(dimension);
+        return forced == null ? false : forced;
+    }
+
+    /**
+     * A dimension aware version of setSpawnChunk.
+     * This functions identically, but allows you to specify which dimension to affect, rather than affecting the player's current dimension.
+     * @param pos The spawn point to set as the player-specific spawn point for the dimension
+     * @param forced Whether or not the respawn code should check for a bed at this location (true means it won't check for a bed)
+     * @param dimension Which dimension to apply the player-specific respawn point to
+     */
+    public void setSpawnChunk(BlockPos pos, boolean forced, int dimension)
+    {
+        if (dimension == 0)
+        {
+            if (pos != null)
+            {
+                field_71077_c = pos;
+                field_82248_d = forced;
+            }
+            else
+            {
+                field_71077_c = null;
+                field_82248_d = false;
+            }
+            return;
+        }
+
+        if (pos != null)
+        {
+            spawnChunkMap.put(dimension, pos);
+            spawnForcedMap.put(dimension, forced);
+        }
+        else
+        {
+            spawnChunkMap.remove(dimension);
+            spawnForcedMap.remove(dimension);
+        }
+    }
+
+    private String displayname;
+
+    /**
+     * Returns the default eye height of the player
+     * @return player default eye height
+     */
+    public float getDefaultEyeHeight()
+    {
+        return 0.12F;
+    }
+
+    /**
+     * Get the currently computed display name, cached for efficiency.
+     * @return the current display name
+     */
+    public String getDisplayNameString()
+    {
+        if(this.displayname == null)
+        {
+            this.displayname = ForgeEventFactory.getPlayerDisplayName(this, this.func_70005_c_());
+        }
+        return this.displayname;
+    }
+
+    /**
+     * Force the displayed name to refresh
+     */
+    public void refreshDisplayName()
+    {
+        this.displayname = ForgeEventFactory.getPlayerDisplayName(this, this.func_70005_c_());
+    }
+    /* ======================================== FORGE END  =====================================*/
+
     public static enum EnumChatVisibility
     {
         FULL(0, "options.chat.visibility.full"),
