Changes to EventHookContainer
Added code to save DeathTracker data when then Overworld saves, but only if it's been modified since the last time it was saved. Also changed how we handle player deaths in pocket dimensions. Now we have two death handlers. There is a high-priority one that sends players to Limbo only when Limbo preserves their inventories. The other is a low-priority handler that sends players to Limbo only when inventory preservation is disabled. This gives players a chance to keep their inventories if another mod would have revived them without that penalty.
This commit is contained in:
@@ -22,11 +22,9 @@ import net.minecraftforge.event.world.WorldEvent;
|
|||||||
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
||||||
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
||||||
import StevenDimDoors.mod_pocketDim.items.BaseItemDoor;
|
import StevenDimDoors.mod_pocketDim.items.BaseItemDoor;
|
||||||
import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator;
|
|
||||||
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
||||||
import StevenDimDoors.mod_pocketDim.world.LimboProvider;
|
import StevenDimDoors.mod_pocketDim.world.LimboProvider;
|
||||||
import StevenDimDoors.mod_pocketDim.world.PocketProvider;
|
import StevenDimDoors.mod_pocketDim.world.PocketProvider;
|
||||||
import StevenDimDoors.mod_pocketDim.world.fortresses.DDNetherFortressGenerator;
|
|
||||||
import cpw.mods.fml.client.FMLClientHandler;
|
import cpw.mods.fml.client.FMLClientHandler;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
@@ -148,37 +146,72 @@ public class EventHookContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ForgeSubscribe(priority = EventPriority.HIGHEST)
|
@ForgeSubscribe(priority = EventPriority.HIGHEST)
|
||||||
public boolean LivingDeathEvent(LivingDeathEvent event)
|
public boolean onDeathWithHighPriority(LivingDeathEvent event)
|
||||||
{
|
{
|
||||||
|
// Teleport the entity to Limbo if it's a player in a pocket dimension and
|
||||||
|
// if Limbo preserves player inventories. We'll check again in a low-priority event handler
|
||||||
|
// to give other mods a chance to save the player if Limbo does _not_ preserve inventories.
|
||||||
|
|
||||||
Entity entity = event.entity;
|
Entity entity = event.entity;
|
||||||
|
|
||||||
if (entity instanceof EntityPlayer && properties.LimboEnabled &&
|
if (entity instanceof EntityPlayer && properties.LimboEnabled &&
|
||||||
entity.worldObj.provider instanceof PocketProvider)
|
entity.worldObj.provider instanceof PocketProvider && properties.LimboReturnsInventoryEnabled)
|
||||||
{
|
{
|
||||||
EntityPlayer player = (EntityPlayer) entity;
|
EntityPlayer player = (EntityPlayer) entity;
|
||||||
if (!properties.LimboReturnsInventoryEnabled)
|
mod_pocketDim.deathTracker.addUsername(player.username);
|
||||||
{
|
revivePlayerInLimbo(player);
|
||||||
player.inventory.clearInventory(-1, -1);
|
|
||||||
}
|
|
||||||
player.extinguish();
|
|
||||||
player.clearActivePotions();
|
|
||||||
ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand);
|
|
||||||
Point4D destination = new Point4D((int) (coords.posX+entity.posX), coords.posY, (int) (coords.posZ+entity.posZ ), mod_pocketDim.properties.LimboDimensionID);
|
|
||||||
DDTeleporter.teleportEntity(player, destination, false);
|
|
||||||
player.setHealth(player.getMaxHealth());
|
|
||||||
event.setCanceled(true);
|
event.setCanceled(true);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ForgeSubscribe(priority = EventPriority.LOWEST)
|
||||||
|
public boolean onDeathWithLowPriority(LivingDeathEvent event)
|
||||||
|
{
|
||||||
|
// This low-priority handler gives mods a chance to save a player from death before we apply
|
||||||
|
// teleporting them to Limbo _without_ preserving their inventory. We also check if the player
|
||||||
|
// died in a pocket dimension and record it, regardless of whether the player will be sent to Limbo.
|
||||||
|
|
||||||
|
Entity entity = event.entity;
|
||||||
|
|
||||||
|
if (entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider)
|
||||||
|
{
|
||||||
|
EntityPlayer player = (EntityPlayer) entity;
|
||||||
|
mod_pocketDim.deathTracker.addUsername(player.username);
|
||||||
|
|
||||||
|
if (properties.LimboEnabled && !properties.LimboReturnsInventoryEnabled)
|
||||||
|
{
|
||||||
|
player.inventory.clearInventory(-1, -1);
|
||||||
|
revivePlayerInLimbo(player);
|
||||||
|
event.setCanceled(true);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void revivePlayerInLimbo(EntityPlayer player)
|
||||||
|
{
|
||||||
|
player.extinguish();
|
||||||
|
player.clearActivePotions();
|
||||||
|
player.setHealth(player.getMaxHealth());
|
||||||
|
ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand);
|
||||||
|
Point4D destination = new Point4D((int) (coords.posX + player.posX), coords.posY, (int) (coords.posZ + player.posZ ), mod_pocketDim.properties.LimboDimensionID);
|
||||||
|
DDTeleporter.teleportEntity(player, destination, false);
|
||||||
|
}
|
||||||
|
|
||||||
@ForgeSubscribe
|
@ForgeSubscribe
|
||||||
public void onWorldSave(WorldEvent.Save event)
|
public void onWorldSave(WorldEvent.Save event)
|
||||||
{
|
{
|
||||||
if (event.world.provider.dimensionId == 0)
|
if (event.world.provider.dimensionId == 0)
|
||||||
{
|
{
|
||||||
PocketManager.save();
|
PocketManager.save();
|
||||||
|
|
||||||
|
if (mod_pocketDim.deathTracker.isModified())
|
||||||
|
{
|
||||||
|
mod_pocketDim.deathTracker.writeToFile();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user