本文整理汇总了C#中MUDEngine.CharData.GetRace方法的典型用法代码示例。如果您正苦于以下问题:C# CharData.GetRace方法的具体用法?C# CharData.GetRace怎么用?C# CharData.GetRace使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MUDEngine.CharData
的用法示例。
在下文中一共展示了CharData.GetRace方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: NewWearObject
/// <summary>
/// Recoding of the WearObject function into a table-based system which is fairly
/// complex, but easy to maintain via the table. Bitshifting is used to check
/// each wear location for a piece of equipment.
///
/// (not enabled)
///
/// TODO: Enable/finish this or remove it. See WearObject for what it is intended
/// to replace.
/// </summary>
/// <param name="ch"></param>
/// <param name="obj"></param>
/// <param name="replaceExisting"></param>
static void NewWearObject(CharData ch, ref Object obj, bool replaceExisting)
{
int count;
for (count = 0; count < WearData.Table.Length; ++count)
{
if (obj.HasWearFlag(new Bitvector(0, (1 << count))))
{
if (WearData.Table[count].BodyPartNeeded == 0 ||
Macros.IsSet((int)Race.RaceList[ch.GetRace()].BodyParts, WearData.Table[count].BodyPartNeeded))
{
if (WearData.Table[count].RacesNotAllowed == -1 ||
ch.GetRace() != WearData.Table[(1 << count)].RacesNotAllowed)
{
bool found = false;
int wearLoc = 0;
foreach (int wear in WearData.Table[count].WearLocations)
{
if (wear != 0 && !ch.RemoveObject((ObjTemplate.WearLocation)wear, replaceExisting))
{
continue;
}
wearLoc = wear;
found = true;
break;
}
if (!found)
{
return;
}
SocketConnection.Act(WearData.Table[(1 << count)].WearMessageToWearer, ch, obj, null, SocketConnection.MessageTarget.character);
SocketConnection.Act(WearData.Table[(1 << count)].WearMessageToRoom, ch, obj, null, SocketConnection.MessageTarget.room);
// Need to allow for multiple wear locations rather than just picking the first one.
ch.EquipObject(ref obj, (ObjTemplate.WearLocation)wearLoc);
return;
}
ch.SendText("Your race cannot wear that type of equipment.\r\n");
return;
}
ch.SendText("The design of your body prevents you from using that.\r\n");
return;
}
}
}
示例2: Springleap
/// <summary>
/// Springleap. Can be used to initiate combat and can be used during combat.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Springleap(CharData ch, string[] str)
{
if( ch == null ) return;
int chance;
/* Check player's level and class, mobs can use this skill */
if ((!ch.HasSkill("springleap")))
{
ch.SendText("You'd better leave the martial arts to Bruce Lee.\r\n");
return;
}
if (ch.GetRace() == Race.RACE_CENTAUR)
{
ch.SendText("Your anatomy prevents you from springleaping.\r\n");
return;
}
if (ch.IsBlind())
{
return;
}
CharData victim = ch.Fighting;
if (str.Length != 0)
{
if (!(victim = ch.GetCharRoom(str[0])) || victim.CurrentPosition == Position.dead)
{
ch.SendText("You don't see them here.\r\n");
return;
}
}
else
{
if (!victim || victim.CurrentPosition == Position.dead)
{
ch.SendText("You aren't fighting anyone.\r\n");
return;
}
}
/* springleap self */
if (ch == victim)
{
ch.SendText("You can't quite figure out how to do that.\r\n");
return;
}
/* Check size of ch vs. victim. */
/* If ch is too small. */
if (ch.CurrentSize - 2 > victim.CurrentSize)
{
SocketConnection.Act("Your acrobatic maneuver cannot accurately leap into such a small being.", ch, null, victim, SocketConnection.MessageTarget.character);
return;
}
/* Ch 2 or more sizes larger than victim => bad! */
if (ch.CurrentSize + 2 < victim.CurrentSize)
{
SocketConnection.Act("Your acrobatic maneuver does not seem to work on someone so large.", ch, null, victim, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n jumps into you, and slides down your leg.", ch, null, victim, SocketConnection.MessageTarget.victim);
SocketConnection.Act("$n&n jumps into $N&n and slides down $S leg.", ch, null, victim, SocketConnection.MessageTarget.room_vict);
ch.WaitState(Skill.SkillList["springleap"].Delay);
ch.CurrentPosition = Position.reclining;
if (victim.Fighting == null)
{
Combat.SetFighting(victim, ch);
}
return;
}
ch.WaitState(MUDMath.FuzzyNumber(Skill.SkillList["springleap"].Delay));
ch.PracticeSkill("springleap");
if (ch.IsNPC())
{
chance = (ch.Level * 3) / 2 + 15;
}
else
{
chance = ((PC)ch).SkillAptitude["springleap"] - 5;
}
if (chance > 95)
{
chance = 95;
}
if (victim.CurrentPosition < Position.fighting)
{
chance /= 4;
}
//.........这里部分代码省略.........
示例3: Attributes
/// <summary>
/// Shows a character's attribute screen.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Attributes(CharData ch, string[] str)
{
if( ch == null ) return;
string buf1 = String.Empty;
if (ch.IsNPC())
{
ch.SendText("&nYour attributes are as would be expected for an NPC.\r\n");
return;
}
if (ch.IsImmortal() && str.Length != 0)
{
CharData worldChar = ch.GetCharWorld(str[0]);
if (!worldChar)
{
ch.SendText("No such person.\r\n");
return;
}
if (worldChar.IsNPC())
{
ch.SendText("NPCs don't have skills!\r\n");
return;
}
}
string buf = String.Format(
"&+WName: &+G{0}&n &+WLevel: {1}&n\r\n",
MUDString.PadStr(ch.Name, 17),
ch.Level);
buf1 += buf;
buf = String.Format(
"&+WRace:&n {0} &+WClass:&n {1} &n&+WSex:&n {2}\r\n",
MUDString.PadStr(Race.RaceList[ch.GetRace()].ColorName, 16),
MUDString.PadStr(ch.CharacterClass.WholistName, 16),
System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(ch.GetSexString()));
buf1 += buf;
// Break a player's size into strings when we get around to it
// -- Xangis
if (!ch.IsNPC())
{
buf = String.Format(
"&+WHeight:&n {0} inches &+WWeight:&n {1} pounds &+WSize:&n {2}\r\n",
MUDString.PadInt(((PC)ch).Height, 3),
MUDString.PadInt(((PC)ch).Weight, 5),
Race.SizeString(ch.CurrentSize));
}
else
{
buf = String.Format("&+WSize:&n {0}\r\n", ch.CurrentSize);
}
buf1 += buf;
TimeSpan time = TimeSpan.FromTicks(ch.TimePlayed.Ticks) + (DateTime.Now - ch.LogonTime);
int days = (int)time.TotalHours / 24;
time = (time - TimeSpan.FromDays(days));
int hours = (int)time.TotalHours;
time = (time - TimeSpan.FromHours(hours));
int minutes = (int)time.TotalMinutes;
// Age is a hack until we get it coded - Xangis
buf = String.Format(
"\r\n&+BAge:&n {0} years. &+BPlaying Time:&n {1} days {2} hours {3} minutes.\r\n",
MUDString.PadInt(ch.GetAge(), 3), days, hours, minutes);
buf1 += buf;
// Need to create a function to display character status strings
buf = String.Format("&+BStatus:&n {0}", System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(Position.PositionString(ch.CurrentPosition)));
if (!ch.IsNPC() && ch.IsAffected(Affect.AFFECT_BERZERK))
{
buf += ", &+Rberzerk&n";
}
if (!ch.IsNPC() && ch.HasActionBit(PC.PLAYER_MEMORIZING))
{
buf += ", Memorizing";
}
if (ch.IsAffected(Affect.AFFECT_CASTING))
{
buf += ", Casting";
}
if (ch.IsAffected(Affect.AFFECT_SINGING))
{
buf += ", Singing";
}
if (!ch.IsNPC() && ch.HasActionBit(PC.PLAYER_MEDITATING))
{
buf += ", Meditating";
}
if (!ch.IsNPC() && ch.HasActionBit(PC.PLAYER_CAMPING))
{ /* This is ugly and should be moved to its own function */
buf += ", Camping";
}
//.........这里部分代码省略.........
示例4: Score
/// <summary>
/// Shows a character's score screen.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Score(CharData ch, string[] str)
{
if( ch == null ) return;
string text = String.Empty;
if (ch == null)
{
Log.Error("Command.Score(): null ch.", 0);
return;
}
Affect prev;
text += "&+WName: &+G" + ch.Name + "&n" + (ch.IsNPC() ? String.Empty : ((PC)ch).Title) + "\r\n";
text += "&+WRace:&n " + MUDString.PadStr(Race.RaceList[ch.GetRace()].ColorName, 16);
text += "&+WClass:&n " + MUDString.PadStr(ch.CharacterClass.WholistName, 32) + "&n\r\n";
text += "&+WLevel: " + MUDString.PadInt(ch.Level, 5) + " Played: " + (ch.TimePlayed.Hours) + " hours &+WSex: ";
text += System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(ch.GetSexString()) + "\r\n";
if (ch.Fighting == null)
{
text += "&+WExperience: &+B" + StringConversion.ExperienceString(ch) + "&n\r\n\r\n";
}
text += "&+WCurrent/Max Health: [&n&+g" + MUDString.PadInt(ch.Hitpoints, 5) + "&+W / &n&+g" + MUDString.PadInt(ch.GetMaxHit(), 5);
text += "&+W] Coins: Carried In Bank\r\n";
text += "&+WCurrent/Max Moves: [&n&+g" + MUDString.PadInt(ch.CurrentMoves, 5) + "&+W / &n&+g" + MUDString.PadInt(ch.MaxMoves, 5);
text += "&+W] &+WPlatinum " + MUDString.PadInt(ch.GetPlatinum(), 5) + " ";
text += (ch.IsNPC() ? 0 : ((PC)ch).Bank.Platinum) + "\r\n";
text += "Current/Max Mana: [&n&+g" + MUDString.PadInt(ch.CurrentMana, 5) + "&+W / &n&+g" + MUDString.PadInt(ch.MaxMana, 5);
text += "&+W] &+YGold " + MUDString.PadInt(ch.GetGold(), 5) + " " + (ch.IsNPC() ? 0 : ((PC)ch).Bank.Gold) + "\r\n";
text += " &n&+wSilver " + MUDString.PadInt(ch.GetSilver(), 5) + " ";
text += (ch.IsNPC() ? 0 : ((PC)ch).Bank.Silver) + "\r\n";
text += "&+WFrags: &+W" + MUDString.PadInt((ch.IsNPC() ? 0 : ((PC)ch).Frags), 3) + "&n &n&+yCopper ";
text += MUDString.PadInt(ch.GetCopper(), 5) + " " + (ch.IsNPC() ? 0 : ((PC)ch).Bank.Copper) + "\r\n";
if (!ch.IsNPC())
{
text += "&+WTotal Deaths: &+W" + MUDString.PadInt(((PC)ch).MobDeaths + ((PC)ch).PlayerDeaths, 5) + "&n &+WMobs Killed: &+W";
text += MUDString.PadInt(((PC)ch).MobKills, 5) + "&n\r\n&+WPlayers Killed: &+W" + MUDString.PadInt(((PC)ch).PlayerKills, 5);
text += "&n &+WPlayer Deaths: &+W" + MUDString.PadInt(((PC)ch).PlayerDeaths, 5) + "&n\r\n";
}
if (!ch.IsNPC())
{
int divisor = ((PC)ch).Created.Quantity;
if (divisor == 0)
divisor = 1;
text += String.Format("&+WItems Created: &n{0} &+WTotal Value: &n{1} &+WBest: &n{2} &+WAvg: &n{3}\r\n",
MUDString.PadInt(((PC)ch).Created.Quantity, 5),
MUDString.PadInt(((PC)ch).Created.TotalCost, 5),
MUDString.PadInt(((PC)ch).Created.MaxCost, 5),
MUDString.PadInt((((PC)ch).Created.TotalCost / divisor), 5));
divisor = ((PC)ch).Destroyed.Quantity;
if (divisor == 0)
divisor = 1;
text += String.Format("&+WItems Destroyed: &n{0} &+WTotal Value: &n{1} &+WBest: &n{2} &+WAvg: &n{3}\r\n",
MUDString.PadInt(((PC)ch).Destroyed.Quantity, 5),
MUDString.PadInt(((PC)ch).Destroyed.TotalCost, 5),
MUDString.PadInt(((PC)ch).Destroyed.MaxCost, 5),
MUDString.PadInt((((PC)ch).Destroyed.TotalCost / divisor), 5));
}
if (!ch.IsNPC())
{
text += "&+WTotal Score: &+W" + ((PC)ch).Score + "&n\r\n";
}
if (ch.IsClass(CharClass.Names.monk) || ch.IsClass(CharClass.Names.mystic))
{
text += "&+WTradition: &+B" + TraditionData.Names[((PC)ch).Tradition] + "&n\r\n";
text += "&+WTraining Points: &+B" + (ch.IsNPC() ? 0 : ((PC)ch).SkillPoints) + "&n\r\n";
}
if (ch.Followers != null && ch.Followers.Count > 0)
{
text += "&+BFollowers:&n\r\n";
foreach (CharData follower in ch.Followers)
{
if (follower == null)
{
continue;
}
text += follower.ShowNameTo(ch, true) + " &n\r\n";
}
text += "\r\n";
}
if (ch.IsAffected( Affect.AFFECT_POISON))
{
text += "&+GYou are poisoned.&n\r\n";
}
if ((ch.IsAffected( Affect.AFFECT_DETECT_MAGIC) || ch.IsImmortal())
&& MUDString.StringsNotEqual(BitvectorFlagType.AffectString(ch.AffectedBy, true), "none"))
{
text += "&+BEnchantments: &+W" + BitvectorFlagType.AffectString(ch.AffectedBy, true) + "&n\r\n\r\n";
}
//.........这里部分代码省略.........
示例5: Shift
public static void Shift(CharData ch, string[] str)
{
if( ch == null ) return;
if (ch.GetRace() != Race.RACE_GITHYANKI && !ch.IsImmortal())
{
ch.SendText("You lack that abillity!\r\n");
return;
}
if (str.Length < 1 || String.IsNullOrEmpty(str[0]))
{
ch.SendText("Shift to where?\r\n");
return;
}
if (ch.Fighting)
{
ch.SendText("You can't break off your fight.\r\n");
return;
}
if ((ch.HasInnateTimer(InnateTimerData.Type.shift_astral) && !MUDString.IsPrefixOf(str[0], "astral"))
|| (ch.HasInnateTimer(InnateTimerData.Type.shift_prime) && !MUDString.IsPrefixOf(str[0], "prime")))
{
ch.SendText("You need to rest a _bitvector first.\r\n");
return;
}
Area area = ch.InRoom.Area;
Spell spell = StringLookup.SpellLookup("plane shift");
if (!spell)
{
ch.SendText("Something seems to be blocking your ability to shift.");
Log.Error("Shift: 'plane shift' spell not found. Check the spells file.");
return;
}
spell.Invoke(ch, ch.Level, new Target(str[0]));
// if it failed, don't lag or add a timer
if (area == ch.InRoom.Area)
return;
if (!ch.IsImmortal())
{
if (!MUDString.IsPrefixOf(str[0], "astral"))
ch.AddInnateTimer(InnateTimerData.Type.shift_astral, 8);
else if (!MUDString.IsPrefixOf(str[0], "prime"))
ch.AddInnateTimer(InnateTimerData.Type.shift_prime, 8);
}
ch.WaitState(14);
}
示例6: CheckShrug
/// <summary>
/// Checks for magic resistance, also known as "shrug" -- as in "shrugging off the effects".
/// </summary>
/// <param name="ch"></param>
/// <param name="victim"></param>
/// <returns></returns>
public static bool CheckShrug( CharData ch, CharData victim )
{
int chance;
if( !victim.HasInnate( Race.RACE_SHRUG ) )
{
return false;
}
switch( victim.GetRace() )
{ // Default at 99 to show races not listed here.
case Race.RACE_GREYELF:
chance = 25;
break;
case Race.RACE_GITHZERAI:
chance = 10;
break;
case Race.RACE_DROW:
chance = 40;
break;
case Race.RACE_RAKSHASA:
chance = 15;
break;
case Race.RACE_GITHYANKI:
chance = 20;
break;
// Demons, devils, etc.
default:
chance = 25 + ( victim.Level ) / 2;
break;
}
if( MUDMath.NumberPercent() < chance )
{
SocketConnection.Act( "&+MYour spell flows around &n$N&+M, leaving $M unharmed!&n", ch, null, victim, SocketConnection.MessageTarget.character );
SocketConnection.Act( "&+M$N&+M's spell flows around you, leaving you unharmed!&n", victim, null, ch, SocketConnection.MessageTarget.character );
SocketConnection.Act( "&+M$N&+M's spell flows around $n&+M, leaving $m unharmed!&n", victim, null, ch, SocketConnection.MessageTarget.room_vict );
return true;
}
return false;
}
示例7: CloneMobile
/// <summary>
/// Creates a duplicate of a mobile minus its inventory.
/// </summary>
/// <param name="parent"></param>
/// <param name="clone"></param>
public static void CloneMobile( CharData parent, CharData clone )
{
int i;
if( parent == null || clone == null || !parent.IsNPC() )
return;
// Fix values.
clone.Name = parent.Name;
clone.ShortDescription = parent.ShortDescription;
clone.FullDescription = parent.FullDescription;
clone.Description = parent.Description;
clone.Gender = parent.Gender;
clone.CharacterClass = parent.CharacterClass;
clone.SetPermRace( parent.GetRace() );
clone.Level = parent.Level;
clone.TrustLevel = 0;
clone.SpecialFunction = parent.SpecialFunction;
clone.SpecialFunctionNames = parent.SpecialFunctionNames;
clone.Timer = parent.Timer;
clone.Wait = parent.Wait;
clone.Hitpoints = parent.Hitpoints;
clone.MaxHitpoints = parent.MaxHitpoints;
clone.CurrentMana = parent.CurrentMana;
clone.MaxMana = parent.MaxMana;
clone.CurrentMoves = parent.CurrentMoves;
clone.MaxMoves = parent.MaxMoves;
clone.SetCoins( parent.GetCopper(), parent.GetSilver(), parent.GetGold(), parent.GetPlatinum() );
clone.ExperiencePoints = parent.ExperiencePoints;
clone.ActionFlags = parent.ActionFlags;
clone.Affected = parent.Affected;
clone.CurrentPosition = parent.CurrentPosition;
clone.Alignment = parent.Alignment;
clone.Hitroll = parent.Hitroll;
clone.Damroll = parent.Damroll;
clone.Wimpy = parent.Wimpy;
clone.Deaf = parent.Deaf;
clone.Hunting = parent.Hunting;
clone.Hating = parent.Hating;
clone.Fearing = parent.Fearing;
clone.Resistant = parent.Resistant;
clone.Immune = parent.Immune;
clone.Susceptible = parent.Susceptible;
clone.CurrentSize = parent.CurrentSize;
clone.PermStrength = parent.PermStrength;
clone.PermIntelligence = parent.PermIntelligence;
clone.PermWisdom = parent.PermWisdom;
clone.PermDexterity = parent.PermDexterity;
clone.PermConstitution = parent.PermConstitution;
clone.PermAgility = parent.PermAgility;
clone.PermCharisma = parent.PermCharisma;
clone.PermPower = parent.PermPower;
clone.PermLuck = parent.PermLuck;
clone.ModifiedStrength = parent.ModifiedStrength;
clone.ModifiedIntelligence = parent.ModifiedIntelligence;
clone.ModifiedWisdom = parent.ModifiedWisdom;
clone.ModifiedDexterity = parent.ModifiedDexterity;
clone.ModifiedConstitution = parent.ModifiedConstitution;
clone.ModifiedAgility = parent.ModifiedAgility;
clone.ModifiedCharisma = parent.ModifiedCharisma;
clone.ModifiedPower = parent.ModifiedPower;
clone.ModifiedLuck = parent.ModifiedLuck;
clone.ArmorPoints = parent.ArmorPoints;
//clone._mpactnum = parent._mpactnum;
for (i = 0; i < 6; i++)
{
clone.SavingThrows[i] = parent.SavingThrows[i];
}
// Now add the affects.
foreach (Affect affect in parent.Affected)
{
clone.AddAffect(affect);
}
}
示例8: CheckResistant
/// <summary>
/// Checks whether char is resistant to the supplied damage type.
/// </summary>
/// <param name="ch"></param>
/// <param name="bit"></param>
/// <returns></returns>
public static bool CheckResistant( CharData ch, Race.DamageType bit )
{
return ( Macros.IsSet( (int)ch.Resistant | (int)Race.RaceList[ ch.GetRace() ].Resistant, (int)bit ) );
}
示例9: CheckVulnerable
/// <summary>
/// Checks whether char is vulnerable to the supplied damage type.
/// </summary>
/// <param name="ch"></param>
/// <param name="bit"></param>
/// <returns></returns>
public static bool CheckVulnerable(CharData ch, Race.DamageType bit)
{
return (Macros.IsSet((int)ch.Vulnerable | (int)Race.RaceList[ch.GetRace()].Vulnerable, (int)bit));
}
示例10: CanSee
/// <summary>
/// True if char can see victim.
///
/// This is only a straightford all-or-none vision checker.
///
/// If you need more granularity, use Command.HowSee which returns an enum
/// based on the level of visibility but otherwise functions similarly.
/// </summary>
/// <param name="ch"></param>
/// <param name="victim"></param>
/// <returns></returns>
public static bool CanSee( CharData ch, CharData victim )
{
if( ch == null )
{
Log.Error( "CharData.CanSee: called with null ch.", 0 );
return false;
}
if( victim == null )
{
Log.Error( "CharData.CanSee: called with null victim.", 0 );
return false;
}
if( ch == victim )
{
return true;
}
/* All mobiles cannot see wizinvised immorts */
if (ch.IsNPC() && !ch.IsNPC() && ch.HasActionBit(PC.PLAYER_WIZINVIS))
{
return false;
}
if (!ch.IsNPC() && ch.HasActionBit(PC.PLAYER_WIZINVIS) && ch.GetTrust() < ch.Level)
{
return false;
}
if (!ch.IsNPC() && ch.HasActionBit(PC.PLAYER_GODMODE))
{
return true;
}
if( ch.IsAffected( Affect.AFFECT_BLIND ) )
{
return false;
}
if (ch.InRoom == null)
{
Log.Error("CanSee called by player " + ch.Name + " with null room.");
return false;
}
if( ch.InRoom.IsDark() && !ch.HasInnate( Race.RACE_ULTRAVISION )
&& !ch.IsAffected( Affect.AFFECT_ULTRAVISION ) && !ch.HasInnate( Race.RACE_INFRAVISION )
&& !ch.IsAffected(Affect.AFFECT_INFRAVISION ) )
{
return false;
}
if (ch.CurrentPosition == Position.dead)
{
return true;
}
if ((victim.IsAffected(Affect.AFFECT_INVISIBLE) || victim.IsAffected(Affect.AFFECT_MINOR_INVIS))
&& !ch.HasInnate( Race.RACE_DETECT_INVIS ) && !ch.IsAffected(Affect.AFFECT_DETECT_INVIS )
&& !(ch.IsAffected(Affect.AFFECT_ELEM_SIGHT) &&
( ch.GetRace() == Race.RACE_AIR_ELE || ch.GetRace() == Race.RACE_WATER_ELE
|| ch.GetRace() == Race.RACE_FIRE_ELE || ch.GetRace() == Race.RACE_EARTH_ELE ) ) )
{
return false;
}
if( victim.IsAffected( Affect.AFFECT_HIDE ) && !ch.HasInnate( Race.RACE_DETECT_HIDDEN )
&& !ch.IsAffected( Affect.AFFECT_DETECT_HIDDEN ) && !ch.Fighting )
{
return false;
}
return true;
}
示例11: CheckImmune
/// <summary>
/// Checks whether char is immune to the supplied damage type.
/// </summary>
/// <param name="ch"></param>
/// <param name="bit"></param>
/// <returns></returns>
public static bool CheckImmune( CharData ch, Race.DamageType bit )
{
return ( Macros.IsSet( (int)ch.Immune | (int)Race.RaceList[ ch.GetRace() ].Immune, (int)bit ) );
}
示例12: IsAggressive
/// <summary>
/// Checks whether the caller is aggressive toward the victim.
/// </summary>
/// <param name="victim"></param>
/// <returns></returns>
public bool IsAggressive(CharData victim)
{
CharData ch = this;
Guild guild = null;
if (victim == null)
{
Log.Error("IsAggressive: called with null ch or victim.", 0);
return false;
}
if (ch == victim)
{
return false;
}
if (MUDString.NameContainedIn("_guildgolem_", ch.Name))
{
foreach (Guild it in Database.GuildList)
{
guild = it;
if (guild.ID == Guild.GolemGuildID(ch))
break;
}
if (guild != null && guild.Ostracized.Length != 0)
{
if (MUDString.NameContainedIn(victim.Name, guild.Ostracized))
return true;
}
}
if (MUDString.NameContainedIn(Race.RaceList[victim.GetRace()].Name, Race.RaceList[ch.GetOrigRace()].Hate))
{
Log.Trace("Returning true for IsAggressive due to race hatred.");
return true;
}
if (ch.HasActionBit(MobTemplate.ACT_AGGROGOOD) && victim.IsGood())
{
Log.Trace("Returning true for IsAggressive due to aggro good and good victim.");
return true;
}
if (ch.HasActionBit(MobTemplate.ACT_AGGROEVIL) && victim.IsEvil())
{
Log.Trace("Returning true for IsAggressive due to aggro evil and evil victim.");
return true;
}
if (ch.HasActionBit(MobTemplate.ACT_AGGRONEUT) && victim.IsNeutral())
{
Log.Trace("Returning true for IsAggressive due to aggro neutral and neutral victim.");
return true;
}
if (ch.HasActionBit(MobTemplate.ACT_AGGROEVILRACE) && victim.GetRacewarSide() == Race.RacewarSide.evil)
{
Log.Trace("Returning true for IsAggressive due to aggro evil race and victim evil racewar.");
return true;
}
if (ch.HasActionBit(MobTemplate.ACT_AGGROGOODRACE) && victim.GetRacewarSide() == Race.RacewarSide.good)
{
Log.Trace("Returning true for IsAggressive due to aggro good race and victim good racewar.");
return true;
}
if (ch.HasActionBit(MobTemplate.ACT_AGGRESSIVE))
{
Log.Trace("Returning true for IsAggressive due to aggressive flag on ch.");
return true;
}
return ch.IsHating(victim);
}
示例13: HitGain
/// <summary>
/// Regeneration and natural healing.
/// </summary>
/// <param name="ch"></param>
/// <returns></returns>
public static int HitGain( CharData ch )
{
int gain;
int percent = 0;
if( ch == null )
{
Log.Error( "HitGain(): null ch", 0 );
return 0;
}
// They aren't going to gain hits in a no heal room...
if (ch.InRoom.HasFlag(RoomTemplate.ROOM_NO_HEAL))
{
return 0;
}
gain = 1;
percent = 100;
if (ch.CheckSkill("fast healing", PracticeType.none))
{
gain += 1;
}
if (MUDMath.NumberPercent() < 3)
{
ch.PracticeSkill("fast healing");
}
switch( ch.CurrentPosition )
{
case Position.sleeping:
gain += 3;
break;
case Position.reclining:
gain += 2;
break;
case Position.resting:
gain += 1;
break;
case Position.fighting:
gain = 0;
break;
}
if( ch.HasInnate( Race.RACE_REGENERATE ) )
{
// Automatically one extra hp, two at level 30.
gain += 1 + (ch.Level / 30);
// One percent chance of gaining another per level.
percent += (ch.Level);
}
// Hunger and thirst for PCs.
if (!ch.IsNPC())
{
if (((PC)ch).Hunger == 0)
{
gain /= 2;
gain -= 1;
percent -= 25;
ch.SendText("&nYou double over from &+Rhunger pains&n!\r\n");
}
if (((PC)ch).Thirst == 0)
{
gain /= 2;
gain -= 1;
percent -= 25;
ch.SendText("&nYou suffer from severe &+cth&+Ci&n&+cr&+Cst&n!\r\n");
}
}
if( ch.IsAffected( Affect.AFFECT_POISON ) )
{
gain /= 4;
percent /= 2;
}
if( gain == 0 )
if( MUDMath.NumberPercent() < percent )
gain = 1;
// Heal rooms heal you a little quicker
if (ch.InRoom.HasFlag(RoomTemplate.ROOM_HEAL))
{
gain += Math.Max(1, gain / 2);
}
if( ( ch.InRoom.TerrainType != TerrainType.underwater_has_ground
&& ch.InRoom.TerrainType != TerrainType.unswimmable_water
&& ch.InRoom.TerrainType != TerrainType.swimmable_water
&& ch.HasInnate( Race.RACE_WATERBREATH )
&& MUDString.StringsNotEqual( Race.RaceList[ ch.GetRace() ].Name, "Object" )
&& ch.GetRace() != Race.RACE_GOD )
//.........这里部分代码省略.........
示例14: EquipInHand
/// <summary>
/// This function's main access commands are wear, wield, and hold, which have the
/// following flow:
/// wear: Command.Wear, wear_obj, equip_hand
/// wield: Command.Wield, equip_hand
/// hold: Command.Hold, equip_hand
///
/// We assume by this point that the character is physically able to use the item and will be able
/// to equip it however specified. Those checks are performed by WearObject(), Equip(), and Hold().
/// </summary>
/// <param name="ch"></param>
/// <param name="obj"></param>
/// <param name="type"></param>
/// <returns></returns>
public static bool EquipInHand(CharData ch, Object obj, int type)
{
int weight = 0;
ObjTemplate.WearLocation firstAvail = ObjTemplate.WearLocation.none;
ObjTemplate.WearLocation secondAvail = ObjTemplate.WearLocation.none;
ObjTemplate.WearLocation lastAvail = ObjTemplate.WearLocation.none;
Object hand1 = GetEquipmentOnCharacter(ch, ObjTemplate.WearLocation.hand_one);
Object hand2 = GetEquipmentOnCharacter(ch, ObjTemplate.WearLocation.hand_two);
Object hand3 = GetEquipmentOnCharacter(ch, ObjTemplate.WearLocation.hand_three);
Object hand4 = GetEquipmentOnCharacter(ch, ObjTemplate.WearLocation.hand_four);
if (hand1 && (hand1._itemType == ObjTemplate.ObjectType.weapon || hand1._itemType == ObjTemplate.ObjectType.ranged_weapon))
weight += hand1.GetWeight();
if (hand2 && (hand2._itemType == ObjTemplate.ObjectType.weapon || hand2._itemType == ObjTemplate.ObjectType.ranged_weapon))
weight += hand2.GetWeight();
if (hand3 && (hand3._itemType == ObjTemplate.ObjectType.weapon || hand3._itemType == ObjTemplate.ObjectType.ranged_weapon))
weight += hand3.GetWeight();
if (hand4 && (hand4._itemType == ObjTemplate.ObjectType.weapon || hand4._itemType == ObjTemplate.ObjectType.ranged_weapon))
weight += hand4.GetWeight();
if (ch.GetRace() != Race.RACE_THRIKREEN)
{
if (hand3)
Log.Error("non-thrikreen wielding item in hand3", 0);
if (hand4)
Log.Error("non-thrikreen wielding item in hand4", 0);
}
// Find number of hand slots used and first available hand.
// Be sure to handle twohanded stuff.
if (hand4 && hand4.HasFlag(ObjTemplate.ITEM_TWOHANDED))
{
Log.Error("Twohanded weapon in fourth hand -- this is not possible.", 0);
}
if (hand3 && hand3.HasFlag(ObjTemplate.ITEM_TWOHANDED))
{
if (hand4)
{
Log.Error("Twohanded weapon in third hand with fourth hand holding twohanded weapon -- this is not possible, all twohanded must have a blank hand after it.", 0);
}
hand4 = hand3;
}
if (hand2 && hand2.HasFlag(ObjTemplate.ITEM_TWOHANDED))
{
if (hand3)
{
Log.Error("Twohanded weapon in second hand with third hand holding twohanded weapon -- this is not possible, all twohanded must have a blank hand after it.", 0);
}
hand2 = hand3;
}
if (!ch.HasInnate(Race.RACE_EXTRA_STRONG_WIELD))
{
if (hand1 && hand1.HasFlag(ObjTemplate.ITEM_TWOHANDED))
{
if (hand2)
{
Log.Error("Twohanded weapon in second hand with first hand holding twohanded weapon -- this is not possible, all twohanded must have a blank hand after it.", 0);
}
hand2 = hand1;
}
}
if (obj.HasFlag(ObjTemplate.ITEM_TWOHANDED)
&& !ch.HasInnate(Race.RACE_EXTRA_STRONG_WIELD))
{
if (ch.GetRace() == Race.RACE_THRIKREEN && !hand4)
{
firstAvail = ObjTemplate.WearLocation.hand_four;
lastAvail = ObjTemplate.WearLocation.hand_four;
}
if (ch.GetRace() == Race.RACE_THRIKREEN && !hand3)
{
if (lastAvail == 0)
lastAvail = ObjTemplate.WearLocation.hand_three;
secondAvail = firstAvail;
firstAvail = ObjTemplate.WearLocation.hand_three;
}
if (!hand2)
{
if (lastAvail == 0)
lastAvail = ObjTemplate.WearLocation.hand_two;
secondAvail = firstAvail;
firstAvail = ObjTemplate.WearLocation.hand_two;
}
if (!hand1)
{
//.........这里部分代码省略.........
示例15: BlurAttack
/// <summary>
/// Processes a blur-type attack. Returns true if the victim died.
/// </summary>
/// <param name="ch"></param>
/// <param name="victim"></param>
/// <returns></returns>
public static bool BlurAttack( CharData ch, CharData victim )
{
if (ch == null) return false;
int numAttacks;
int count;
if( ch.IsAffected( Affect.AFFECT_CASTING ) )
{
return false;
}
if( ch.IsAffected( Affect.AFFECT_BLUR ) && MUDMath.NumberPercent() < 25 )
{
SocketConnection.Act( "$n&n moves with a BLUR of speed!", ch, null, null, SocketConnection.MessageTarget.room );
SocketConnection.Act( "You move with a BLUR of speed!", ch, null, null, SocketConnection.MessageTarget.character );
for( count = 0, numAttacks = 4; count < numAttacks && victim.CurrentPosition > Position.dead; ++count )
{
SingleAttack( ch, victim, String.Empty, ObjTemplate.WearLocation.hand_one );
}
}
else
{
Object wield;
if( MUDMath.NumberPercent() > 10 )
return false;
if( ch.IsClass(CharClass.Names.hunter) || ch.IsClass(CharClass.Names.ranger ))
numAttacks = 2;
else if( ch.GetRace() == Race.RACE_OGRE || ch.GetRace() == Race.RACE_CENTAUR )
numAttacks = 4;
else
numAttacks = 9;
if( MUDMath.NumberPercent() < ch.GetCurrLuck() )
numAttacks++;
if( MUDMath.NumberPercent() < victim.GetCurrLuck() )
numAttacks--;
/* 9716 is the index number for the dagger of the wind. */
// HORRIBLE HORRIBLE TODO: FIXME: BUG: Never hard-code item index numbers.
if( ( wield = Object.GetEquipmentOnCharacter( ch, ObjTemplate.WearLocation.hand_one ) ) && wield.ObjIndexData.IndexNumber == 9716 )
{
SocketConnection.Act( "&+c$n&+c's $p&n &+cbegins to move with the &+Wspeed&+c of a &+lstorm&+c!&n", ch, wield, null, SocketConnection.MessageTarget.room );
SocketConnection.Act( "Your $p&n &+cbegins to move with the &+Wspeed&+c of a &+lstorm&+c!&n", ch, wield, null, SocketConnection.MessageTarget.character );
for( count = 0; count < numAttacks && victim.CurrentPosition > Position.dead; ++count )
{
SingleAttack(ch, victim, String.Empty, ObjTemplate.WearLocation.hand_one);
}
return ( victim.CurrentPosition > Position.dead );
}
if( ( wield = Object.GetEquipmentOnCharacter( ch, ObjTemplate.WearLocation.hand_two ) ) && wield.ObjIndexData.IndexNumber == 9716 )
{
SocketConnection.Act( "&+c$n&+c's $p&n &+cbegins to move with the &+Wspeed&+c of a &+lstorm&+c!&n", ch, wield, null, SocketConnection.MessageTarget.room );
SocketConnection.Act( "Your $p&n &+cbegins to move with the &+Wspeed&+c of a &+lstorm&+c!&n", ch, wield, null, SocketConnection.MessageTarget.character );
for( count = 0; count < numAttacks && victim.CurrentPosition > Position.dead; ++count )
{
SingleAttack(ch, victim, String.Empty, ObjTemplate.WearLocation.hand_two);
}
return ( victim.CurrentPosition > Position.dead );
}
if( ( wield = Object.GetEquipmentOnCharacter( ch, ObjTemplate.WearLocation.hand_three ) ) && wield.ObjIndexData.IndexNumber == 9716 )
{
SocketConnection.Act( "&+c$n&+c's $p&n &+cbegins to move with the &+Wspeed&+c of a &+lstorm&+c!&n", ch, wield, null, SocketConnection.MessageTarget.room );
SocketConnection.Act( "Your $p&n &+cbegins to move with the &+Wspeed&+c of a &+lstorm&+c!&n", ch, wield, null, SocketConnection.MessageTarget.character );
for( count = 0; count < numAttacks && victim.CurrentPosition > Position.dead; ++count )
{
SingleAttack(ch, victim, String.Empty, ObjTemplate.WearLocation.hand_three);
}
return ( victim.CurrentPosition > Position.dead );
}
if( ( wield = Object.GetEquipmentOnCharacter( ch, ObjTemplate.WearLocation.hand_four ) ) && wield.ObjIndexData.IndexNumber == 9716 )
{
SocketConnection.Act( "&+c$n&+c's $p&n &+cbegins to move with the &+Wspeed&+c of a &+lstorm&+c!&n", ch, wield, null, SocketConnection.MessageTarget.room );
SocketConnection.Act( "Your $p&n &+cbegins to move with the &+Wspeed&+c of a &+lstorm&+c!&n", ch, wield, null, SocketConnection.MessageTarget.character );
for( count = 0; count < numAttacks && victim.CurrentPosition > Position.dead; ++count )
{
SingleAttack(ch, victim, String.Empty, ObjTemplate.WearLocation.hand_four);
}
return ( victim.CurrentPosition > Position.dead );
}
}
return false;
}