Added a flag to NewDimData so that we can avoid writing dimensions to disk if they haven't been modified. They're still rewritten when the server shuts down.
225 lines
7.5 KiB
Java
225 lines
7.5 KiB
Java
package StevenDimDoors.mod_pocketDim;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.client.audio.SoundManager;
|
|
import net.minecraft.client.audio.SoundPoolEntry;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemDoor;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.ChunkCoordinates;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.client.event.sound.PlayBackgroundMusicEvent;
|
|
import net.minecraftforge.client.event.sound.SoundLoadEvent;
|
|
import net.minecraftforge.event.EventPriority;
|
|
import net.minecraftforge.event.ForgeSubscribe;
|
|
import net.minecraftforge.event.entity.living.LivingDeathEvent;
|
|
import net.minecraftforge.event.entity.living.LivingFallEvent;
|
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
|
import net.minecraftforge.event.terraingen.InitMapGenEvent;
|
|
import net.minecraftforge.event.world.WorldEvent;
|
|
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
|
|
import StevenDimDoors.mod_pocketDim.config.DDProperties;
|
|
import StevenDimDoors.mod_pocketDim.core.DDTeleporter;
|
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
|
import StevenDimDoors.mod_pocketDim.items.BaseItemDoor;
|
|
import StevenDimDoors.mod_pocketDim.util.Point4D;
|
|
import StevenDimDoors.mod_pocketDim.world.LimboProvider;
|
|
import StevenDimDoors.mod_pocketDim.world.PocketProvider;
|
|
import cpw.mods.fml.client.FMLClientHandler;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
public class EventHookContainer
|
|
{
|
|
private final DDProperties properties;
|
|
|
|
public EventHookContainer(DDProperties properties)
|
|
{
|
|
this.properties = properties;
|
|
}
|
|
|
|
@ForgeSubscribe(priority = EventPriority.LOW)
|
|
public void onInitMapGen(InitMapGenEvent event)
|
|
{
|
|
// Replace the Nether fortress generator with our own only if any
|
|
// gateways would ever generate. This allows admins to disable our
|
|
// fortress overriding without disabling all gateways.
|
|
/*
|
|
* if (properties.FortressGatewayGenerationChance > 0 &&
|
|
* properties.WorldRiftGenerationEnabled && event.type ==
|
|
* InitMapGenEvent.EventType.NETHER_BRIDGE) { event.newGen = new
|
|
* DDNetherFortressGenerator(); }
|
|
*/
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
@ForgeSubscribe
|
|
public void onSoundLoad(SoundLoadEvent event)
|
|
{
|
|
event.manager.addSound(mod_pocketDim.modid + ":monk.ogg");
|
|
event.manager.addSound(mod_pocketDim.modid + ":crack.ogg");
|
|
event.manager.addSound(mod_pocketDim.modid + ":tearing.ogg");
|
|
event.manager.addSound(mod_pocketDim.modid + ":rift.ogg");
|
|
event.manager.addSound(mod_pocketDim.modid + ":riftStart.ogg");
|
|
event.manager.addSound(mod_pocketDim.modid + ":riftEnd.ogg");
|
|
event.manager.addSound(mod_pocketDim.modid + ":riftClose.ogg");
|
|
event.manager.addSound(mod_pocketDim.modid + ":riftDoor.ogg");
|
|
event.manager.addSound(mod_pocketDim.modid + ":creepy.ogg");
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
@ForgeSubscribe
|
|
public void onSoundEffectResult(PlayBackgroundMusicEvent event)
|
|
{
|
|
if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID)
|
|
;
|
|
{
|
|
this.playMusicForDim(FMLClientHandler.instance().getClient().thePlayer.worldObj);
|
|
}
|
|
}
|
|
|
|
@ForgeSubscribe
|
|
public void onPlayerEvent(PlayerInteractEvent event)
|
|
{
|
|
// Handle all door placement here
|
|
|
|
World world = event.entity.worldObj;
|
|
ItemStack stack = event.entityPlayer.inventory.getCurrentItem();
|
|
if (stack != null && stack.getItem() instanceof ItemDoor)
|
|
{
|
|
if (mod_pocketDim.itemDimensionalDoor.tryToPlaceDoor(stack, event.entityPlayer, world,
|
|
event.x, event.y, event.z, event.face))
|
|
{
|
|
// Cancel the event so that we don't get two doors from vanilla doors
|
|
event.setCanceled(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
@ForgeSubscribe
|
|
public void onWorldLoad(WorldEvent.Load event)
|
|
{
|
|
// We need to initialize PocketManager here because onServerAboutToStart
|
|
// fires before we can use DimensionManager and onServerStarting fires
|
|
// after the game tries to generate terrain. If a gateway tries to
|
|
// generate before PocketManager has initialized, we get a crash.
|
|
if (!PocketManager.isLoaded())
|
|
{
|
|
PocketManager.load();
|
|
}
|
|
|
|
if (event.world != null)
|
|
{
|
|
this.playMusicForDim(event.world);
|
|
}
|
|
}
|
|
|
|
@ForgeSubscribe
|
|
public void onPlayerFall(LivingFallEvent event)
|
|
{
|
|
event.setCanceled(event.entity.worldObj.provider.dimensionId == properties.LimboDimensionID);
|
|
}
|
|
|
|
@ForgeSubscribe(priority = EventPriority.HIGHEST)
|
|
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;
|
|
|
|
if (properties.LimboEnabled && properties.LimboReturnsInventoryEnabled &&
|
|
entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider)
|
|
{
|
|
EntityPlayer player = (EntityPlayer) entity;
|
|
mod_pocketDim.deathTracker.addUsername(player.username);
|
|
revivePlayerInLimbo(player);
|
|
event.setCanceled(true);
|
|
return false;
|
|
}
|
|
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());
|
|
Point4D destination = LimboProvider.getLimboSkySpawn(player, properties);
|
|
DDTeleporter.teleportEntity(player, destination, false);
|
|
}
|
|
|
|
@ForgeSubscribe
|
|
public void onWorldSave(WorldEvent.Save event)
|
|
{
|
|
if (event.world.provider.dimensionId == 0)
|
|
{
|
|
PocketManager.save(true);
|
|
|
|
if (mod_pocketDim.deathTracker != null && mod_pocketDim.deathTracker.isModified())
|
|
{
|
|
mod_pocketDim.deathTracker.writeToFile();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void playMusicForDim(World world)
|
|
{
|
|
if (world.isRemote)
|
|
{
|
|
SoundManager sndManager = FMLClientHandler.instance().getClient().sndManager;
|
|
|
|
// SenseiKiwi: I've added the following check as a quick fix for a
|
|
// reported crash. This needs to work without a hitch or we have to
|
|
// stop trying to replace the background music...
|
|
if (sndManager != null && sndManager.sndSystem != null)
|
|
{
|
|
if (world.provider instanceof LimboProvider)
|
|
{
|
|
sndManager.sndSystem.stop("BgMusic");
|
|
SoundPoolEntry soundPoolEntry = sndManager.soundPoolSounds.getRandomSoundFromSoundPool(mod_pocketDim.modid + ":creepy");
|
|
if (soundPoolEntry != null)
|
|
{
|
|
sndManager.sndSystem.backgroundMusic("LimboMusic", soundPoolEntry.getSoundUrl(), soundPoolEntry.getSoundName(), false);
|
|
sndManager.sndSystem.play("LimboMusic");
|
|
}
|
|
}
|
|
else if (!(world.provider instanceof LimboProvider))
|
|
{
|
|
sndManager.sndSystem.stop("LimboMusic");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |