Lets be honest, something of this caliber should have been added into the game since day frigging one and it took me a while before I could muster up the courage/knowledge of being able to put this together. This update only requires 2 things. Swamp boots and a really long edit via PlayerMobile.cs which I'll provide down below, so enjoy and good luck.
This idea takes inspiration from various forum posts along with recycling code from the Poisonous Swamps system
The following code was tested on RunUO 2.2 server, so just a heads up. If you're wondering why I'm still working on a now defunct emulator, its a bit complicated to say the least and sadly I'm unable to upload anything through the RunUO Releases forum for some strange reason.
##################################################################
# How to Implement Poison Swamps along with New Foot Step Sounds #
##################################################################
Step 1: Make sure you download the the swamp boots if you already didn't have them or else you'll end up with errors.
Step 2: Go to PlayerMobile.cs and look for this bit of code:
Step 3: Underneath that copy/paste this code:
Step 4: Hopefully that should be everything needed in order to get this running properly. Reboot and enjoy.[/I]
This idea takes inspiration from various forum posts along with recycling code from the Poisonous Swamps system
The following code was tested on RunUO 2.2 server, so just a heads up. If you're wondering why I'm still working on a now defunct emulator, its a bit complicated to say the least and sadly I'm unable to upload anything through the RunUO Releases forum for some strange reason.
##################################################################
# How to Implement Poison Swamps along with New Foot Step Sounds #
##################################################################
Step 1: Make sure you download the the swamp boots if you already didn't have them or else you'll end up with errors.
Step 2: Go to PlayerMobile.cs and look for this bit of code:
C#:
public override bool Move( Direction d )
{
NetState ns = this.NetState;
if ( ns != null )
{
if ( HasGump( typeof( ResurrectGump ) ) ) {
if ( Alive ) {
CloseGump( typeof( ResurrectGump ) );
} else {
SendLocalizedMessage( 500111 ); // You are frozen and cannot move.
return false;
}
}
}
TimeSpan speed = ComputeMovementSpeed( d );
bool res;
if ( !Alive )
Server.Movement.MovementImpl.IgnoreMovableImpassables = true;
res = base.Move( d );
Server.Movement.MovementImpl.IgnoreMovableImpassables = false;
if ( !res )
return false;
m_NextMovementTime += speed;
Step 3: Underneath that copy/paste this code:
C#:
////////////////////////////////////// begin playermobile Move addition
// 'Move( Direction d )' seems to be called when the player moves.
if ( this != null )
SwampCheck( this ); // for poisonous swamps
////////////////////////////////////// end playermobile Move addition
return true;
}
////////////////////////////////////// begin poisonous swamps
private static void SwampCheck( PlayerMobile from )
{
////////////////////////////////////// poisonous swamps... Mostly.
////////////////////////////////////// basic sanity checks
if ( from == null )
return; // wtf? o_O;
// don't poison staff
// if ( from.AccessLevel >= AccessLevel.GameMaster )
// return;
// if the player is dead, don't poison them. Thanks GrayStar! :>
if ( !from.Alive )
return;
// don't poison a poisoned player.
if ( from.Poisoned )
return;
// no swamps on the internal map.
if ( from.Map == Map.Internal )
return;
// is the player wearing swamp boots and not mounted?
Item shoes = from.FindItemOnLayer( Layer.Shoes );
if ( shoes != null && shoes is SwampBoots && !( from.Mounted ) )
return;
////////////////////// find out if the player is moving over a land/terrain (ground), static/frozen (dungeon) swamp, or static/unfrozen/added swamp.
// initialize common variables.
Map map = from.Map;
// is it a land/terrain swamp?
LandTile lt = map.Tiles.GetLandTile( from.X, from.Y );
if ( IsDeepLandSwamp( lt.ID ) && lt.Z == from.Z )
{
if ( Utility.RandomDouble() < 0.001 )
{
// poison player
from.Poison = Poison.Regular;
from.SendMessage( "You were poisoned by the swamp!" );
return;
}
}
else if ( IsLightLandSwamp( lt.ID ) && lt.Z == from.Z )
{
if ( Utility.RandomDouble() < 0.001 )
{
// poison player
from.Poison = Poison.Lesser;
from.SendMessage( "You were poisoned by the swamp!" );
return;
}
}
else if ( IsDirtLand( lt.ID ) && lt.Z == from.Z )
{
from.PlaySound(Utility.RandomList( 0x33B, 0x33C ) );
return;
}
else if ( IsSandLand( lt.ID ) && lt.Z == from.Z )
{
from.PlaySound(Utility.RandomList( 0x33F, 0x340 ) );
return;
}
else if ( IsSnowLand( lt.ID ) && lt.Z == from.Z )
{
from.PlaySound(Utility.RandomList( 0x341, 0x342 ) );
return;
}
else if ( IsTileLightWoodenFloor( lt.ID ) && lt.Z == from.Z )
{
from.PlaySound(Utility.RandomList( 0x121, 0x122 ) );
return;
}
else if ( IsTileDarkWoodenFloor( lt.ID ) && lt.Z == from.Z )
{
from.PlaySound(Utility.RandomList( 0x123, 0x124 ) );
return;
}
else if ( IsTileHardStoneFloor( lt.ID ) && lt.Z == from.Z )
{
from.PlaySound(Utility.RandomList( 0x33D, 0x33E ) );
return;
}
// is it a static swamp?
StaticTile[] staticTiles = map.Tiles.GetStaticTiles( from.X, from.Y );
for ( int i = 0; i < staticTiles.Length; ++i )
{
StaticTile t = staticTiles[I];
ItemData id = TileData.ItemTable[t.ID & 0x3FFF];
int tand = t.ID & 0x3FFF;
if ( t.Z != from.Z )
{
continue;
}
else if ( IsDeepStaticSwamp( tand ) )
{
if ( Utility.RandomDouble() < 0.001 ) // 0.001% chance
{
// poison player
from.Poison = Poison.Regular;
from.SendMessage( "You were poisoned by the swamp!" );
return;
}
}
else if ( IsLightStaticSwamp( tand ) )
{
if ( Utility.RandomDouble() < 0.001 ) // 0.001% chance
{
// poison player
from.Poison = Poison.Lesser;
from.SendMessage( "You were poisoned by the swamp!" );
return;
}
}
else if ( IsStaticLightWoodenFloor( tand ) )
{
from.PlaySound(Utility.RandomList( 0x121, 0x122 ) );
return;
}
else if ( IsStaticDarkWoodenFloor( tand ) )
{
from.PlaySound(Utility.RandomList( 0x123, 0x124 ) );
return;
}
else if ( IsStaticBambooFloorAndSteps( tand ) )
{
from.PlaySound(Utility.RandomList( 0x127, 0x128 ) );
return;
}
else if ( IsStaticHardStoneFloor( tand ) )
{
from.PlaySound(Utility.RandomList( 0x12F, 0x130 ) );
return;
}
else if ( IsStaticBushes( tand ) )
{
from.PlaySound(Utility.RandomList( 0x12D, 0x12E ) );
return;
}
else if ( IsShallowWaterSurface( tand ) )
{
from.PlaySound(Utility.RandomList( 0x131, 0x132 ) );
return;
}
else if ( IsDeepWaterSurface( tand ) )
{
from.PlaySound(Utility.RandomList( 0x133, 0x134 ) );
return;
}
}
// is it an added swamp?
IPooledEnumerable eable = map.GetItemsInRange( new Point3D( from.X, from.Y, from.Z ), 0 );
foreach ( Item item in eable )
{
if ( item == null || item.Z != from.Z )
{
continue;
}
else if ( IsDeepStaticSwamp( item.ItemID ) )
{
if ( Utility.RandomDouble() < 0.001 ) // 0.001% chance
{
// poison player
from.Poison = Poison.Regular;
from.SendMessage( "You were poisoned by the swamp!" );
return;
}
}
else if ( IsLightStaticSwamp( item.ItemID ) )
{
if ( Utility.RandomDouble() < 0.001 ) // 0.001% chance
{
// poison player
from.Poison = Poison.Lesser;
from.SendMessage( "You were poisoned by the swamp!" );
return;
}
}
else if ( IsStaticLightWoodenFloor( item.ItemID ) )
{
from.PlaySound(Utility.RandomList( 0x121, 0x122 ) );
return;
}
else if ( IsStaticDarkWoodenFloor( item.ItemID ) )
{
from.PlaySound(Utility.RandomList( 0x123, 0x124 ) );
return;
}
else if ( IsStaticBambooFloorAndSteps( item.ItemID ) )
{
from.PlaySound(Utility.RandomList( 0x127, 0x128 ) );
return;
}
else if ( IsStaticHardStoneFloor( item.ItemID ) )
{
from.PlaySound(Utility.RandomList( 0x12F, 0x130 ) );
return;
}
else if ( IsStaticBushes( item.ItemID ) )
{
from.PlaySound(Utility.RandomList( 0x12D, 0x12E ) );
return;
}
else if ( IsShallowWaterSurface( item.ItemID ) )
{
from.PlaySound(Utility.RandomList( 0x131, 0x132 ) );
return;
}
else if ( IsDeepWaterSurface( item.ItemID ) )
{
from.PlaySound(Utility.RandomList( 0x133, 0x134 ) );
return;
}
}
eable.Free();
}
private static bool IsLightLandSwamp( int itemID )
{
if ( itemID >= 15808 && itemID <= 15833 )
return true;
if ( itemID >= 15835 && itemID <= 15836 )
return true;
if ( itemID >= 15838 && itemID <= 15848 )
return true;
if ( itemID >= 15853 && itemID <= 15857 )
return true;
return false;
}
private static bool IsDeepLandSwamp( int itemID )
{
if ( itemID >= 15849 && itemID <= 15852 )
return true;
return false;
}
private static bool IsDirtLand( int itemID )
{
if ( itemID >= 113 && itemID <= 140 )
return true;
if ( itemID >= 332 && itemID <= 348 )
return true;
if ( itemID >= 353 && itemID <= 372 )
return true;
if ( itemID >= 476 && itemID <= 495 )
return true;
if ( itemID >= 581 && itemID <= 601 )
return true;
if ( itemID >= 887 && itemID <= 890 )
return true;
if ( itemID >= 1351 && itemID <= 1378 )
return true;
if ( itemID >= 1571 && itemID <= 1598 )
return true;
return false;
}
private static bool IsSandLand( int itemID )
{
if ( itemID >= 22 && itemID <= 25 )
return true;
if ( itemID >= 51 && itemID <= 62 )
return true;
if ( itemID >= 286 && itemID <= 301 )
return true;
if ( itemID >= 642 && itemID <= 657 )
return true;
if ( itemID >= 821 && itemID <= 860 )
return true;
if ( itemID >= 951 && itemID <= 970 )
return true;
if ( itemID >= 1447 && itemID <= 1466 )
return true;
if ( itemID >= 1611 && itemID <= 1650 )
return true;
return false;
}
private static bool IsSnowLand( int itemID )
{
if ( itemID >= 268 && itemID <= 285 )
return true;
if ( itemID >= 302 && itemID <= 305 )
return true;
if ( itemID >= 901 && itemID <= 940 )
return true;
if ( itemID >= 1471 && itemID <= 1506 )
return true;
return false;
}
private static bool IsTileLightWoodenFloor( int itemID )
{
if ( itemID >= 1038 && itemID <= 1045 )
return true;
if ( itemID >= 1227 && itemID <= 1249 )
return true;
return false;
}
private static bool IsTileDarkWoodenFloor( int itemID )
{
if ( itemID >= 1030 && itemID <= 1037 )
return true;
if ( itemID >= 1203 && itemID <= 1222 )
return true;
return false;
}
private static bool IsTileHardStoneFloor( int itemID )
{
if ( itemID >= 513 && itemID <= 536 )
return true;
if ( itemID >= 1001 && itemID <= 1029 )
return true;
if ( itemID >= 1046 && itemID <= 1198 )
return true;
if ( itemID >= 1255 && itemID <= 1308 )
return true;
return false;
}
private static bool IsLightStaticSwamp( int itemID )
{
if ( itemID >= 12809 && itemID <= 12810 )
return true;
if ( itemID >= 12882 && itemID <= 12905 )
return true;
if ( itemID >= 12912 && itemID <= 12933 )
return true;
return false;
}
private static bool IsDeepStaticSwamp( int itemID )
{
if ( itemID >= 12813 && itemID <= 12881 )
return true;
if ( itemID >= 12906 && itemID <= 12911 )
return true;
return false;
}
private static bool IsStaticLightWoodenFloor( int itemID )
{
if ( itemID >= 1185 && itemID <= 1188 )
return true;
if ( itemID >= 1222 && itemID <= 1249 )
return true;
if ( itemID >= 10042 && itemID <= 10065 )
return true;
if ( itemID >= 10350 && itemID <= 10373 )
return true;
if ( itemID >= 11576 && itemID <= 11579 )
return true;
if ( itemID >= 11723 && itemID <= 11726 )
return true;
return false;
}
private static bool IsStaticDarkWoodenFloor( int itemID )
{
if ( itemID >= 1189 && itemID <= 1216 )
return true;
if ( itemID >= 1993 && itemID <= 2000 )
return true;
if ( itemID >= 10018 && itemID <= 10041 )
return true;
if ( itemID >= 10592 && itemID <= 10639 )
return true;
return false;
}
private static bool IsStaticBambooFloorAndSteps( int itemID )
{
if ( itemID >= 1217 && itemID <= 1221 )
return true;
if ( itemID >= 1284 && itemID <= 1292 )
return true;
if ( itemID >= 1801 && itemID <= 1821 )
return true;
if ( itemID >= 1822 && itemID <= 1823 )
return true;
if ( itemID >= 1824 && itemID <= 1845 )
return true;
if ( itemID >= 1846 && itemID <= 1847 )
return true;
if ( itemID >= 1848 && itemID <= 1864 )
return true;
if ( itemID >= 1865 && itemID <= 1871 )
return true;
if ( itemID >= 1872 && itemID <= 1896 )
return true;
if ( itemID >= 1897 && itemID <= 1921 )
return true;
if ( itemID >= 1922 && itemID <= 1923 )
return true;
if ( itemID >= 1924 && itemID <= 1948 )
return true;
if ( itemID >= 1949 && itemID <= 1951 )
return true;
if ( itemID >= 1952 && itemID <= 1967 )
return true;
if ( itemID >= 1968 && itemID <= 1970 )
return true;
if ( itemID >= 1971 && itemID <= 1974 )
return true;
if ( itemID >= 1975 && itemID <= 1977 )
return true;
if ( itemID >= 1978 && itemID <= 1980 )
return true;
if ( itemID >= 1981 && itemID <= 1990 )
return true;
if ( itemID >= 1991 && itemID <= 1992 )
return true;
if ( itemID >= 2010 && itemID <= 2010 )
return true;
if ( itemID >= 2015 && itemID <= 2016 )
return true;
if ( itemID >= 2170 && itemID <= 2173 )
return true;
if ( itemID >= 2201 && itemID <= 2214 )
return true;
if ( itemID >= 2325 && itemID <= 2328 )
return true;
return false;
}
private static bool IsStaticHardStoneFloor( int itemID )
{
if ( itemID >= 1168 && itemID <= 1176 )
return true;
if ( itemID >= 1179 && itemID <= 1184 )
return true;
if ( itemID >= 1250 && itemID <= 1283 )
return true;
if ( itemID >= 1293 && itemID <= 1324 )
return true;
if ( itemID >= 1327 && itemID <= 1338 )
return true;
if ( itemID >= 11189 && itemID <= 11192 )
return true;
if ( itemID >= 11500 && itemID <= 11502 )
return true;
return false;
}
private static bool IsStaticBushes( int itemID )
{
if ( itemID >= 3157 && itemID <= 3163 )
return true;
if ( itemID >= 3203 && itemID <= 3214 )
return true;
if ( itemID >= 3219 && itemID <= 3220 )
return true;
if ( itemID >= 3223 && itemID <= 3224 )
return true;
if ( itemID >= 3231 && itemID <= 3239 )
return true;
if ( itemID >= 3255 && itemID <= 3265 )
return true;
if ( itemID >= 3332 && itemID <= 3333 )
return true;
if ( itemID >= 3391 && itemID <= 3392 )
return true;
if ( itemID >= 6802 && itemID <= 6806 )
return true;
if ( itemID >= 14539 && itemID <= 14563 )
return true;
if ( itemID >= 14572 && itemID <= 14602 )
return true;
return false;
}
private static bool IsShallowWaterSurface( int itemID )
{
if ( itemID >= 6045 && itemID <= 6066 ) // playsound 0x131, 0x132
return true;
return false;
}
private static bool IsDeepWaterSurface( int itemID )
{
if ( itemID >= 6039 && itemID <= 6044 ) // playsound 0x133, 0x134
return true;
return false;
}
////////////////////////////////////// end poisonous swamps
Step 4: Hopefully that should be everything needed in order to get this running properly. Reboot and enjoy.[/I]