Added new ISoundHandler.onPlaySoundAtEntity hook. Should be backwards compatible with any older ISoundHandler implementations.

This commit is contained in:
LexManos 2012-06-13 21:09:00 -07:00
parent 320d1360b8
commit d56f0d0d55
5 changed files with 94 additions and 28 deletions

View file

@ -455,6 +455,7 @@ public class ForgeHooksClient
}
public static LinkedList<ISoundHandler> soundHandlers = new LinkedList<ISoundHandler>();
public static LinkedList<ISoundHandler> soundHandlers2 = new LinkedList<ISoundHandler>();
public static void onSetupAudio(SoundManager soundManager)
{
for (ISoundHandler handler : soundHandlers)
@ -514,7 +515,7 @@ public class ForgeHooksClient
{
for (ISoundHandler handler : soundHandlers)
{
entry = handler.onPlaySoundEffect(soundManager, entry, soundName,volume, pitch);
entry = handler.onPlaySoundEffect(soundManager, entry, soundName, volume, pitch);
if (entry == null)
{
return null;
@ -523,6 +524,20 @@ public class ForgeHooksClient
return entry;
}
public static String onPlaySoundAtEntity(Entity entity, String soundName, float volume, float pitch)
{
MinecraftForgeClient.checkMinecraftVersion("Minecraft Minecraft 1.2.5", "Interface check in onPlaySoundAtEntity, remove it Mods should be updated");
for (ISoundHandler handler : soundHandlers2)
{
soundName = handler.onPlaySoundAtEntity(entity, soundName,volume, pitch);
if (soundName == null)
{
return null;
}
}
return null;
}
public static void onLogin(Packet1Login login, NetClientHandler net, NetworkManager netManager)
{
ForgeHooks.onLogin(netManager, login);

View file

@ -1,5 +1,6 @@
package net.minecraft.src.forge;
import net.minecraft.src.Entity;
import net.minecraft.src.SoundManager;
import net.minecraft.src.SoundPoolEntry;
@ -92,4 +93,17 @@ public interface ISoundHandler
*/
SoundPoolEntry onPlaySoundEffect(SoundManager soundManager, SoundPoolEntry entry, String soundName, float volume, float pitch);
/**
* Raised when an entity attempts to play a sound via World's playSoundAtEntity
* function. This is so that additional data about the state of the entity can
* be obtained efficiently without using AABBs. An important thing to note:
* This hook will be called even if the sound is off.
*
* @param entity The entity that the sound should be played at. Always the calling Entity or the Player.
* @param soundName The name of the requested sound.
* @param volume The sound's volume, between 0.0 and 1.0.
* @param pitch The sound's pitch
* @return The sound to play, null to cancel the event.
*/
String onPlaySoundAtEntity(Entity entity, String soundName, float volume, float pitch);
}

View file

@ -8,6 +8,7 @@ package net.minecraft.src.forge;
import org.lwjgl.opengl.Display;
import net.minecraft.src.Block;
import net.minecraft.src.Entity;
import net.minecraft.src.Item;
import net.minecraft.src.ItemStack;
import net.minecraft.src.ModLoader;
@ -63,6 +64,21 @@ public class MinecraftForgeClient
public static void registerSoundHandler(ISoundHandler handler)
{
ForgeHooksClient.soundHandlers.add(handler);
checkMinecraftVersion("Minecraft Minecraft 1.2.5", "Interface check in registerSoundHandler, remove it Mods should be updated");
try
{
if (handler.getClass().getDeclaredMethod("onPlaySoundAtEntity", Entity.class, String.class, float.class, float.class) != null)
{
ForgeHooksClient.soundHandlers2.add(handler);
}
}
catch (Exception e)
{
if (MinecraftForgeClient.class.getPackage().getName().equals("net.minecraft.src.forge"))
{
e.printStackTrace();
}
}
}
/** Bind a texture. This is used to bind a texture file when

View file

@ -1,5 +1,6 @@
package net.minecraft.src.forge.adaptors;
import net.minecraft.src.Entity;
import net.minecraft.src.SoundManager;
import net.minecraft.src.SoundPoolEntry;
import net.minecraft.src.forge.ISoundHandler;
@ -39,4 +40,10 @@ public class SoundHandlerAdaptor implements ISoundHandler
{
return entry;
}
@Override
public String onPlaySoundAtEntity(Entity entity, String soundName, float volume, float pitch)
{
return soundName;
}
}

View file

@ -1,10 +1,11 @@
--- ../src_base/minecraft/net/minecraft/src/World.java 0000-00-00 00:00:00.000000000 -0000
+++ ../src_work/minecraft/net/minecraft/src/World.java 0000-00-00 00:00:00.000000000 -0000
@@ -9,8 +9,17 @@
@@ -9,8 +9,18 @@
import java.util.Set;
import java.util.TreeSet;
+import net.minecraft.src.forge.ForgeHooks;
+import net.minecraft.src.forge.ForgeHooksClient;
+
public class World implements IBlockAccess
{
@ -18,7 +19,7 @@
/**
* boolean; if true updates scheduled by scheduleBlockUpdate happen immediately
*/
@@ -79,7 +88,7 @@
@@ -79,7 +89,7 @@
* Contains a timestamp from when the World object was created. Is used in the session.lock file
*/
private long lockTimestamp;
@ -27,7 +28,7 @@
/** Option > Difficulty setting (0 - 3) */
public int difficultySetting;
@@ -214,6 +223,7 @@
@@ -214,6 +224,7 @@
this.chunkProvider = this.createChunkProvider();
this.calculateInitialSkylight();
this.calculateInitialWeather();
@ -35,7 +36,7 @@
}
public World(World par1World, WorldProvider par2WorldProvider)
@@ -259,6 +269,7 @@
@@ -259,6 +270,7 @@
this.chunkProvider = this.createChunkProvider();
this.calculateInitialSkylight();
this.calculateInitialWeather();
@ -43,7 +44,7 @@
}
public World(ISaveHandler par1ISaveHandler, String par2Str, WorldSettings par3WorldSettings)
@@ -340,6 +351,7 @@
@@ -340,6 +352,7 @@
this.calculateInitialSkylight();
this.calculateInitialWeather();
@ -51,7 +52,7 @@
}
/**
@@ -507,6 +519,7 @@
@@ -507,6 +520,7 @@
}
this.chunkProvider.saveChunks(par1, par2IProgressUpdate);
@ -59,7 +60,7 @@
}
}
@@ -559,7 +572,8 @@
@@ -559,7 +573,8 @@
*/
public boolean isAirBlock(int par1, int par2, int par3)
{
@ -69,7 +70,20 @@
}
/**
@@ -2068,7 +2082,7 @@
@@ -1453,6 +1468,12 @@
*/
public void playSoundAtEntity(Entity par1Entity, String par2Str, float par3, float par4)
{
+ par2Str = ForgeHooksClient.onPlaySoundAtEntity(par1Entity, par2Str, par3, par4);
+ if (par2Str == null)
+ {
+ return;
+ }
+
for (int var5 = 0; var5 < this.worldAccesses.size(); ++var5)
{
((IWorldAccess)this.worldAccesses.get(var5)).playSound(par2Str, par1Entity.posX, par1Entity.posY - (double)par1Entity.yOffset, par1Entity.posZ, par3, par4);
@@ -2068,7 +2089,7 @@
if (var7 != null)
{
@ -78,7 +92,7 @@
}
}
}
@@ -2098,18 +2112,18 @@
@@ -2098,18 +2119,18 @@
{
this.loadedTileEntityList.add(var8);
}
@ -101,7 +115,7 @@
}
}
@@ -2122,13 +2136,13 @@
@@ -2122,13 +2143,13 @@
public void addTileEntity(Collection par1Collection)
{
@ -121,7 +135,7 @@
}
}
@@ -2150,7 +2164,7 @@
@@ -2150,7 +2171,7 @@
int var4 = MathHelper.floor_double(par1Entity.posZ);
byte var5 = 32;
@ -130,7 +144,7 @@
{
par1Entity.lastTickPosX = par1Entity.posX;
par1Entity.lastTickPosY = par1Entity.posY;
@@ -2327,7 +2341,14 @@
@@ -2327,7 +2348,14 @@
if (var11 == Block.fire.blockID || var11 == Block.lavaMoving.blockID || var11 == Block.lavaStill.blockID)
{
return true;
@ -146,7 +160,7 @@
}
}
}
@@ -2631,25 +2652,19 @@
@@ -2631,25 +2659,19 @@
*/
public void setBlockTileEntity(int par1, int par2, int par3, TileEntity par4TileEntity)
{
@ -184,21 +198,21 @@
}
}
@@ -2658,27 +2673,10 @@
@@ -2658,27 +2680,10 @@
*/
public void removeBlockTileEntity(int par1, int par2, int par3)
{
- TileEntity var4 = this.getBlockTileEntity(par1, par2, par3);
-
- if (var4 != null && this.scanningTileEntities)
+ Chunk chunk = getChunkFromChunkCoords(par1 >> 4, par3 >> 4);
+ if (chunk != null)
{
- {
- var4.invalidate();
- this.addedTileEntityList.remove(var4);
- }
- else
- {
+ Chunk chunk = getChunkFromChunkCoords(par1 >> 4, par3 >> 4);
+ if (chunk != null)
{
- if (var4 != null)
- {
- this.addedTileEntityList.remove(var4);
@ -215,7 +229,7 @@
}
}
@@ -2704,7 +2702,8 @@
@@ -2704,7 +2709,8 @@
*/
public boolean isBlockNormalCube(int par1, int par2, int par3)
{
@ -225,7 +239,7 @@
}
/**
@@ -2720,7 +2719,7 @@
@@ -2720,7 +2726,7 @@
if (var5 != null && !var5.isEmpty())
{
Block var6 = Block.blocksList[this.getBlockId(par1, par2, par3)];
@ -234,7 +248,7 @@
}
else
{
@@ -2985,6 +2984,7 @@
@@ -2985,6 +2991,7 @@
}
}
}
@ -242,7 +256,7 @@
Profiler.endSection();
@@ -3308,7 +3308,7 @@
@@ -3308,7 +3315,7 @@
private int computeBlockLightValue(int par1, int par2, int par3, int par4, int par5, int par6)
{
@ -251,7 +265,7 @@
int var8 = this.getSavedLightValue(EnumSkyBlock.Block, par2 - 1, par3, par4) - par6;
int var9 = this.getSavedLightValue(EnumSkyBlock.Block, par2 + 1, par3, par4) - par6;
int var10 = this.getSavedLightValue(EnumSkyBlock.Block, par2, par3 - 1, par4) - par6;
@@ -3668,10 +3668,10 @@
@@ -3668,10 +3675,10 @@
public List getEntitiesWithinAABBExcludingEntity(Entity par1Entity, AxisAlignedBB par2AxisAlignedBB)
{
this.entitiesWithinAABBExcludingEntity.clear();
@ -266,7 +280,7 @@
for (int var7 = var3; var7 <= var4; ++var7)
{
@@ -3692,10 +3692,10 @@
@@ -3692,10 +3699,10 @@
*/
public List getEntitiesWithinAABB(Class par1Class, AxisAlignedBB par2AxisAlignedBB)
{
@ -281,7 +295,7 @@
ArrayList var7 = new ArrayList();
for (int var8 = var3; var8 <= var4; ++var8)
@@ -3840,7 +3840,10 @@
@@ -3840,7 +3847,10 @@
{
var8 = null;
}
@ -293,7 +307,7 @@
return par1 > 0 && var8 == null && var9.canPlaceBlockOnSide(this, par2, par3, par4, par6);
}
}
@@ -4449,4 +4452,39 @@
@@ -4449,4 +4459,39 @@
{
return this.worldInfo.getTerrainType() == WorldType.FLAT ? 0.0D : 63.0D;
}