From d82051604a1284a23bdb16280f30fba51b7b2bf9 Mon Sep 17 00:00:00 2001 From: Dries007 Date: Wed, 17 Jun 2015 17:49:42 +0200 Subject: [PATCH] void death refund program added --- .../java/net/doubledoordev/d3core/D3Core.java | 5 + .../d3core/util/FMLEventHandler.java | 1 + .../d3core/util/ForgeEventHandler.java | 5 +- .../d3core/util/VoidRefunds.java | 98 +++++++++++++++++++ 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/doubledoordev/d3core/util/VoidRefunds.java diff --git a/src/main/java/net/doubledoordev/d3core/D3Core.java b/src/main/java/net/doubledoordev/d3core/D3Core.java index aebc080..19020bc 100644 --- a/src/main/java/net/doubledoordev/d3core/D3Core.java +++ b/src/main/java/net/doubledoordev/d3core/D3Core.java @@ -70,6 +70,7 @@ import static net.doubledoordev.d3core.util.CoreConstants.*; import static net.doubledoordev.d3core.util.FMLEventHandler.FML_EVENT_HANDLER; import static net.doubledoordev.d3core.util.ForgeEventHandler.FORGE_EVENT_HANDLER; +import static net.doubledoordev.d3core.util.VoidRefunds.VOID_REFUNDS; /** * @author Dries007 @@ -101,7 +102,9 @@ public void preInit(FMLPreInitializationEvent event) { FMLCommonHandler.instance().bus().register(this); FMLCommonHandler.instance().bus().register(FML_EVENT_HANDLER); + FMLCommonHandler.instance().bus().register(VOID_REFUNDS); MinecraftForge.EVENT_BUS.register(FORGE_EVENT_HANDLER); + MinecraftForge.EVENT_BUS.register(VOID_REFUNDS); logger = event.getModLog(); @@ -306,6 +309,8 @@ public void syncConfig() if (pastPost) EndermanGriefing.init(); } + VOID_REFUNDS.config(configuration); + if (configuration.hasChanged()) configuration.save(); } diff --git a/src/main/java/net/doubledoordev/d3core/util/FMLEventHandler.java b/src/main/java/net/doubledoordev/d3core/util/FMLEventHandler.java index 3da4ebf..fb9129c 100644 --- a/src/main/java/net/doubledoordev/d3core/util/FMLEventHandler.java +++ b/src/main/java/net/doubledoordev/d3core/util/FMLEventHandler.java @@ -33,6 +33,7 @@ package net.doubledoordev.d3core.util; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.relauncher.Side; import net.minecraft.world.storage.WorldInfo; diff --git a/src/main/java/net/doubledoordev/d3core/util/ForgeEventHandler.java b/src/main/java/net/doubledoordev/d3core/util/ForgeEventHandler.java index abd808b..ef695ec 100644 --- a/src/main/java/net/doubledoordev/d3core/util/ForgeEventHandler.java +++ b/src/main/java/net/doubledoordev/d3core/util/ForgeEventHandler.java @@ -35,13 +35,13 @@ import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.registry.GameData; -import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityEnderEye; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingDropsEvent; @@ -59,6 +59,7 @@ public class ForgeEventHandler public boolean enableUnlocalizedName; public boolean enableOreDictionary; public boolean nosleep; + public int[] voidRefundDimensions; private ForgeEventHandler() {} diff --git a/src/main/java/net/doubledoordev/d3core/util/VoidRefunds.java b/src/main/java/net/doubledoordev/d3core/util/VoidRefunds.java new file mode 100644 index 0000000..7b50b1c --- /dev/null +++ b/src/main/java/net/doubledoordev/d3core/util/VoidRefunds.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2014, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of the {organization} nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +package net.doubledoordev.d3core.util; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.event.entity.living.LivingDeathEvent; + +import java.util.HashMap; +import java.util.UUID; + +import static net.doubledoordev.d3core.util.CoreConstants.MODID; + +/** + * @author Dries007 + */ +public class VoidRefunds +{ + public static final VoidRefunds VOID_REFUNDS = new VoidRefunds(); + private int[] voidRefundDimensions; + + private final HashMap map = new HashMap<>(); + + private VoidRefunds() + { + } + + public void config(Configuration configuration) + { + final String catVoidDeaths = MODID + ".VoidDeaths"; + configuration.addCustomCategoryComment(catVoidDeaths, "In these dimensions, when you die to void damage, you will keep your items."); + voidRefundDimensions = configuration.get(catVoidDeaths, "refundDimensions", new int[] {}).getIntList(); + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void livingDeathEvent(LivingDeathEvent event) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) return; + if (event.source != DamageSource.outOfWorld || !(event.entity instanceof EntityPlayer)) return; + for (int dim : voidRefundDimensions) + { + if (dim != event.entity.dimension) continue; + event.setCanceled(true); + + InventoryPlayer tempCopy = new InventoryPlayer(null); + tempCopy.copyInventory(((EntityPlayer) event.entity).inventory); + map.put(event.entity.getPersistentID(), tempCopy); + } + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void playerRespawnEvent(PlayerEvent.PlayerRespawnEvent event) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) return; + InventoryPlayer oldInventory = map.get(event.player.getPersistentID()); + if (oldInventory == null) return; + event.player.inventory.copyInventory(oldInventory); + map.remove(event.player.getPersistentID()); + } +}