本文整理汇总了C#中MUDEngine.CharData.HasInnate方法的典型用法代码示例。如果您正苦于以下问题:C# CharData.HasInnate方法的具体用法?C# CharData.HasInnate怎么用?C# CharData.HasInnate使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MUDEngine.CharData
的用法示例。
在下文中一共展示了CharData.HasInnate方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Bodyslam
/// <summary>
/// Bodyslam an opponent. Can only be used to initiate combat.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Bodyslam(CharData ch, string[] str)
{
if( ch == null ) return;
CharData victim;
/* Check player's level and class, mobs can use this skill */
if (!ch.HasInnate(Race.RACE_BODYSLAM))
{
ch.SendText("You don't feel massive enough to manhandle that.\r\n");
return;
}
if (ch.IsBlind())
{
return;
}
if (ch.Riding)
{
ch.SendText("You can't do that while mounted.\r\n");
return;
}
if (str.Length != 0)
{
if (!(victim = ch.GetCharRoom(str[0])) || victim.CurrentPosition == Position.dead)
{
ch.SendText("They aren't here.\r\n");
return;
}
}
else
{
ch.SendText("Bodyslam who?\r\n");
return;
}
// Added size restrictions -- Xangis
if (victim.CurrentSize > ch.CurrentSize)
{
if (ch.HasInnate(Race.RACE_SLAM_LARGER))
{
// allowing centaurs to slam one size up if it's an ogre
if (victim.CurrentSize > (ch.CurrentSize + 1))
{
ch.SendText("You can't bodyslam something that much bigger than you.\r\n");
return;
}
}
else
{
ch.SendText("You can't bodyslam something bigger than you.\r\n");
return;
}
}
if ((ch.CurrentSize > victim.CurrentSize) && ((ch.CurrentSize - victim.CurrentSize) > 3))
{
ch.SendText("They're too small to slam.\r\n");
return;
}
/* Bodyslam self? Ok! */
if (ch == victim)
{
ch.SendText("You slam yourself to the ground!\r\n");
SocketConnection.Act("$n&n throws $mself to the ground in a fit of clumsiness.",
ch, null, victim, SocketConnection.MessageTarget.room_vict);
ch.WaitState((Skill.SkillList["bodyslam"].Delay / 2));
ch.CurrentPosition = Position.reclining;
Combat.InflictDamage(ch, ch, MUDMath.NumberRange(1, 6), "bodyslam", ObjTemplate.WearLocation.none, AttackType.DamageType.bludgeon);
return;
}
ch.WaitState(Skill.SkillList["bodyslam"].Delay);
ch.PracticeSkill("bodyslam");
int chance = (ch.Level * 3) / 2 + 15;
chance += ch.GetCurrAgi() - victim.GetCurrAgi();
chance -= (victim.Level - ch.Level);
switch (victim.CurrentPosition)
{
case Position.dead:
return;
case Position.mortally_wounded:
chance += 15;
break;
case Position.incapacitated:
chance += 10;
break;
case Position.unconscious:
chance += 5;
break;
case Position.stunned:
//.........这里部分代码省略.........
示例2: Innate
/// <summary>
/// Innate command. Shows and activates innate abilitiies.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Innate(CharData ch, string[] str)
{
if( ch == null ) return;
string text;
Affect af = new Affect();
// Use innates here
if (str.Length > 0 && !String.IsNullOrEmpty(str[0]))
{
if (!MUDString.IsPrefixOf(str[0], "strength"))
{
if (ch.HasInnate(Race.RACE_STRENGTH))
{
if (ch.IsAffected(Affect.AFFECT_STRENGTH_INCREASED))
{
ch.SendText("You are already affected by strength.");
return;
}
if (ch.HasInnateTimer(InnateTimerData.Type.strength))
{
ch.SendText("You need to rest a bit first.\r\n");
return;
}
af.Type = Affect.AffectType.spell;
af.Value = "strength";
af.Duration = MUDMath.Dice(8, 5);
af.AddModifier(Affect.Apply.strength, MUDMath.Dice(2, 4) + 15);
af.SetBitvector(Affect.AFFECT_STRENGTH_INCREASED);
ch.AddAffect(af);
ch.SendText("You feel stronger.\r\n");
ch.AddInnateTimer(InnateTimerData.Type.strength, 24);
ch.WaitState(14);
}
else
{
ch.SendText("You don't know how to do that.\r\n");
return;
}
}
else if (!MUDString.IsPrefixOf(str[0], "levitate"))
{
if (ch.HasInnate(Race.RACE_LEVITATE))
{
if (ch.IsAffected( Affect.AFFECT_LEVITATE))
{
ch.SendText("You are already levitating.");
return;
}
if (ch.HasInnateTimer(InnateTimerData.Type.levitate))
{
ch.SendText("You need to rest a bit first.\r\n");
return;
}
af.Type = Affect.AffectType.spell;
af.Value = "levitation";
af.Duration = MUDMath.Dice(8, 5);
af.SetBitvector(Affect.AFFECT_LEVITATE);
ch.AddAffect(af);
ch.SendText("Your feet rise off the ground.\r\n");
ch.AddInnateTimer(InnateTimerData.Type.levitate, 24);
ch.WaitState(6);
}
else
{
ch.SendText("You don't know how to do that.\r\n");
return;
}
}
else if (!MUDString.IsPrefixOf(str[0], "faerie"))
{
if (ch.HasInnate(Race.RACE_FAERIE_FIRE))
{
CharData victim = ch.GetCharRoom(str[0]);
if (victim == null)
ch.SendText("You do not see them here.");
else
{
Spell spl = Spell.SpellList["faerie fire"];
if (spl != null)
{
spl.Invoke(ch, ch.Level, victim);
}
}
}
else
{
ch.SendText("You don't know how to do that.\r\n");
return;
//.........这里部分代码省略.........
示例3: LookCommand
/// <summary>
/// Looks at an object, mobile, or room.
/// </summary>
/// <param name="ch">The acting character.</param>
/// <param name="str">Command arguments.</param>
public static void LookCommand(CharData ch, string[] str)
{
if( ch == null ) return;
// Build argument list, stripping articles.
bool inside = false;
List<String> args = new List<string>(str);
for (int i = (args.Count - 1); i >= 0; i-- )
{
if (args[i].Equals("in", StringComparison.CurrentCultureIgnoreCase) || args[i].Equals("i", StringComparison.CurrentCultureIgnoreCase))
{
args.RemoveAt(i);
inside = true;
}
else if (args[i].Equals("at", StringComparison.CurrentCultureIgnoreCase))
{
args.RemoveAt(i);
}
}
// If it's a mob that isn't switched, bail.
if (ch.Socket == null)
return;
if (ch.CurrentPosition < Position.sleeping)
{
ch.SendText("&nYou can't see anything but &+Ystars&n! See how pretty!\r\n");
return;
}
if (ch.CurrentPosition == Position.sleeping)
{
ch.SendText("&nYou can't see anything, you're &+Lsleeping&n! Zzz.\r\n");
return;
}
if (ch.IsBlind())
return;
// Look panel for ships.
if ( args.Count > 0 && args[0].Equals("panel", StringComparison.CurrentCultureIgnoreCase))
{
CommandType.Interpret(ch, "Lookpanel");
return;
}
// Look out for ships.
if (args.Count > 0 && args[0].Equals("out", StringComparison.CurrentCultureIgnoreCase))
{
CommandType.Interpret(ch, "Lookout");
return;
}
Object obj;
Exit exit;
string pdesc;
int number = 0;
string output = String.Empty;
// 'look' or 'look auto' or 'look room'
if (args.Count == 0 || args[0].Equals( "auto", StringComparison.CurrentCultureIgnoreCase) ||
args[0].Equals("room", StringComparison.CurrentCultureIgnoreCase))
{
if (ch.InRoom == null)
{
ch.SendText("You are not in a room. You are just floating in empty space. This should never happen. You should <petition> someone for help.\r\n");
Log.Error("Character executing Commandlook command from null room: " + ch.Name);
return;
}
if (ch.FlightLevel > 0)
{
switch (ch.FlightLevel)
{
case CharData.FlyLevel.low:
ch.SendText("Hovering above ");
break;
case CharData.FlyLevel.medium:
ch.SendText("Flying above ");
break;
case CharData.FlyLevel.high:
ch.SendText("Flying high above ");
break;
}
}
if (!ch.HasActionBit(PC.PLAYER_GODMODE) && ch.InRoom.IsDark()
&& !ch.HasInnate(Race.RACE_ULTRAVISION)
&& !ch.IsAffected( Affect.AFFECT_ULTRAVISION))
{
ch.SendText("&+lSomewhere\r\n");
}
else if (!ch.HasActionBit(PC.PLAYER_GODMODE))
{
String roomOpen = String.Empty;
String roomClose = String.Empty;
if (!ch.IsNPC() && ch.Socket.Terminal == SocketConnection.TerminalType.TERMINAL_ENHANCED)
{
//.........这里部分代码省略.........
示例4: Exits
/// <summary>
/// Shows available room exits.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Exits(CharData ch, string[] str)
{
if( ch == null ) return;
Exit exit;
int door;
bool auto = (str.Length != 0 && !MUDString.StringsNotEqual(str[0], "auto"));
if (ch.IsBlind() || !ch.InRoom)
{
return;
}
string text;
if (!ch.IsNPC() && ch.Socket.Terminal == SocketConnection.TerminalType.TERMINAL_ENHANCED && auto)
{
text = "<exits>";
}
else
{
text = auto ? "&+cExits: &n" : "&+cVisible exits:&n\r\n";
}
bool found = false;
// Show the direction with an asterisk if it
// has a closed door, and in exits command it shows up as a
// closed <whatever>.
for (door = 0; door < Limits.MAX_DIRECTION; ++door)
{
exit = ch.InRoom.ExitData[door];
if (exit && exit.TargetRoom)
{
if (exit.HasFlag(Exit.ExitFlag.secret))
{
/* Mortals do not see secret exits. */
if (ch.Level < Limits.LEVEL_AVATAR)
continue;
/* Mark secret exits for immortals. */
text += "&+LS&n&+c";
}
if (exit.HasFlag(Exit.ExitFlag.blocked))
{
/* Mortals do not see secret exits. */
if (ch.Level < Limits.LEVEL_AVATAR)
continue;
/* Mark secret exits for immortals. */
text += "&+yB&n&+c";
}
found = true;
if (auto)
{
if (exit.HasFlag(Exit.ExitFlag.walled) && exit.HasFlag(Exit.ExitFlag.illusion))
continue;
if (exit.HasFlag(Exit.ExitFlag.closed))
text += "&n&+y#&n&+c";
// Don't show exits to impassable rooms.
// Show a yellow exclamation point to those with holylight on though.
if (exit.TargetRoom && exit.TargetRoom.TerrainType == TerrainType.underground_impassable)
{
if (!ch.HasActionBit(PC.PLAYER_GODMODE))
{
continue;
}
text += "&+Y!&n";
}
text += door.ToString();
text += " ";
}
else
{
if (exit.HasFlag(Exit.ExitFlag.walled))
{
text += String.Format("&n{0} - (Walled)&n\r\n",
MUDString.PadStr(door.ToString().ToUpper(), 5));
}
else if (!exit.HasFlag(Exit.ExitFlag.closed))
{
// gods with holylight on can go to useless exits.
if (exit.TargetRoom && exit.TargetRoom.TerrainType == TerrainType.underground_impassable)
{
if (!ch.HasActionBit(PC.PLAYER_GODMODE))
{
continue;
}
text += "&+Y!&n";
}
text += String.Format("&n {0} - {1}&n\r\n", MUDString.PadStr(door.ToString().ToUpper(), 5),
(!ch.HasInnate(Race.RACE_ULTRAVISION) && Room.GetRoom(exit.IndexNumber).IsDark())
? "&nToo dark to tell" : exit.TargetRoom.Title);
}
else
{
text += String.Format("&+y#&n{0} - Closed {1}\r\n",
//.........这里部分代码省略.........
示例5: FormatObjectToCharacter
/// <summary>
/// Formats an object for display to a character.
/// </summary>
/// <param name="obj"></param>
/// <param name="ch"></param>
/// <param name="shortDisplay"></param>
/// <returns></returns>
public static string FormatObjectToCharacter(Object obj, CharData ch, bool shortDisplay)
{
string text = String.Empty;
if (obj == null || ch == null)
{
Log.Error("format_obj_to_char: null ch or obj.", 0);
return null;
}
if (shortDisplay)
{
if (obj.ShortDescription.Length > 0)
{
text += obj.ShortDescription;
}
text += " ";
}
if (obj.HasFlag(ObjTemplate.ITEM_NOSHOW) && ch.IsImmortal())
{
text += "&n(&+LNoshow&n) ";
}
else if (obj.HasFlag(ObjTemplate.ITEM_NOSHOW))
{
return text;
}
if (obj.HasFlag(ObjTemplate.ITEM_INVIS))
{
text += "&n(&+LInvis&n) ";
}
if ((ch.IsAffected( Affect.AFFECT_DETECT_EVIL) || ch.HasInnate(Race.RACE_DETECT_ALIGN)
|| ch.IsClass(CharClass.Names.antipaladin) || ch.IsClass(CharClass.Names.paladin))
&& obj.HasFlag(ObjTemplate.ITEM_EVIL))
{
text += "&n(&+LDark Aura&n) ";
}
if ((ch.IsAffected(Affect.AFFECT_DETECT_GOOD) || ch.HasInnate(Race.RACE_DETECT_ALIGN)
|| ch.IsClass(CharClass.Names.antipaladin) || ch.IsClass(CharClass.Names.paladin))
&& obj.HasFlag(ObjTemplate.ITEM_BLESS))
{
text += "&n(&+WLight Aura&n) ";
}
if (obj.HasFlag(ObjTemplate.ITEM_MAGIC) && (ch.IsAffected(Affect.AFFECT_DETECT_MAGIC) ||
(!ch.IsNPC() && ch.HasActionBit(PC.PLAYER_GODMODE))))
{
text += "&n(&+BMagic&n) ";
}
if (obj.HasFlag(ObjTemplate.ITEM_GLOW))
{
text += "&n(&+CGlowing&n) ";
}
if (obj.HasFlag(ObjTemplate.ITEM_LIT))
{
text += "&n(&+WIlluminating&n) ";
}
if (obj.HasFlag(ObjTemplate.ITEM_SECRET) && (ch.IsAffected(Affect.AFFECT_DETECT_HIDDEN) ||
(!ch.IsNPC() && ch.HasActionBit(PC.PLAYER_GODMODE))))
{
text += "&n(&+yHidden&n) ";
}
if (!shortDisplay)
{
if (obj.ItemType == ObjTemplate.ObjectType.pc_corpse && (ch.IsImmortal() || (int)ch.GetRacewarSide() == obj.Values[4]))
{
text += "The " + obj.ShortDescription + " is lying here.";
}
else if (obj.FullDescription.Length > 0)
{
text += obj.FullDescription;
}
}
text += "&n";
return text;
}
示例6: Charge
/// <summary>
/// Charge into someone. Helps to have horns on your head.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Charge(CharData ch, string[] str)
{
if( ch == null ) return;
CharData victim;
/* Check player's level and class, mobs can use this skill */
if (!ch.HasInnate(Race.RACE_CHARGE))
{
ch.SendText("You can't do that.\r\n");
return;
}
if (ch.IsBlind())
{
return;
}
if (str.Length != 0)
{
if (!(victim = ch.GetCharRoom(str[0])) || victim.CurrentPosition == Position.dead)
{
ch.SendText("They aren't here.\r\n");
return;
}
}
else
{
ch.SendText("Charge who?\r\n");
return;
}
/* charge me trap */
if (ch == victim)
{
ch.SendText("You chase your tail for a while.\r\n");
return;
}
ch.WaitState(MUDMath.FuzzyNumber(Skill.SkillList["charge"].Delay));
if (!ch.Fighting)
{
Combat.SetFighting(ch, victim);
}
if (!victim.Fighting)
{
Combat.SetFighting(victim, ch);
}
// Chance is based on level of charger and victim.
int chance = (ch.Level * 2) - victim.Level + 25;
if (chance > 95)
{
chance = 95;
}
if (ch.IsNPC() || MUDMath.NumberPercent() < chance)
{
Combat.InflictDamage(ch, victim, MUDMath.NumberRange(1, ch.Level), "charge", ObjTemplate.WearLocation.none, AttackType.DamageType.bludgeon);
}
else
{
Combat.InflictDamage(ch, victim, 0, "charge", ObjTemplate.WearLocation.none, AttackType.DamageType.bludgeon);
}
return;
}
示例7: DoorBash
/// <summary>
/// Knock a door from its hinges with brute force.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void DoorBash(CharData ch, string[] str)
{
if( ch == null ) return;
Exit.Direction door;
Room toRoom;
if (ch.IsNPC() || (!ch.HasSkill("doorbash") && !ch.HasInnate(Race.RACE_DOORBASH)))
{
ch.SendText("You don't feel massive enough!\r\n");
return;
}
if (str.Length == 0)
{
ch.SendText("Doorbash what?\r\n");
return;
}
if (ch.Fighting)
{
ch.SendText("You can't break off your fight.\r\n");
return;
}
if ((door = Movement.FindDoor(ch, str[0])) >= 0)
{
Exit reverseExit;
int chance;
Exit exit = ch.InRoom.GetExit(door);
if (!exit.HasFlag(Exit.ExitFlag.closed))
{
ch.SendText("Calm down. It is already open.\r\n");
return;
}
ch.WaitState(Skill.SkillList["doorbash"].Delay);
if (ch.IsNPC())
{
chance = 0;
}
else if (!ch.HasSkill("doorbash"))
{
chance = 20;
}
else
{
chance = ((PC)ch).SkillAptitude["doorbash"] / 2;
}
if (exit.HasFlag(Exit.ExitFlag.locked))
{
chance /= 2;
}
if (exit.HasFlag(Exit.ExitFlag.bashproof) && !ch.IsImmortal())
{
SocketConnection.Act("WHAAAAM!!! You bash against the $d, but it doesn't budge.",
ch, null, exit.Keyword, SocketConnection.MessageTarget.character);
SocketConnection.Act("WHAAAAM!!! $n&n bashes against the $d, but it holds strong.",
ch, null, exit.Keyword, SocketConnection.MessageTarget.room);
Combat.InflictDamage(ch, ch, (ch.GetMaxHit() / 20), "doorbash", ObjTemplate.WearLocation.none, AttackType.DamageType.bludgeon);
if (exit.HasFlag(Exit.ExitFlag.spiked))
{
SocketConnection.Act("You are impaled by spikes protruding from the $d!",
ch, null, exit.Keyword, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n is impaled by spikes protruding from the $d!",
ch, null, exit.Keyword, SocketConnection.MessageTarget.room);
Combat.InflictDamage(ch, ch, (ch.GetMaxHit() / 5), "doorbash", ObjTemplate.WearLocation.none, AttackType.DamageType.pierce);
}
return;
}
if (exit.HasFlag(Exit.ExitFlag.spiked))
{
SocketConnection.Act("You are impaled by spikes protruding from the $d!",
ch, null, exit.Keyword, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n is impaled by spikes protruding from the $d!",
ch, null, exit.Keyword, SocketConnection.MessageTarget.room);
Combat.InflictDamage(ch, ch, (ch.GetMaxHit() / 5), "doorbash", ObjTemplate.WearLocation.none, AttackType.DamageType.pierce);
}
if ((ch.GetCurrStr() >= 20) && MUDMath.NumberPercent() < (chance + 4 * (ch.GetCurrStr() - 20)))
{
/* Success */
exit.RemoveFlag(Exit.ExitFlag.closed);
if (exit.HasFlag(Exit.ExitFlag.locked))
{
exit.RemoveFlag(Exit.ExitFlag.locked);
}
exit.AddFlag(Exit.ExitFlag.bashed);
//.........这里部分代码省略.........
示例8: 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 )
//.........这里部分代码省略.........
示例9: 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;
}
示例10: FinishSpell
/// <summary>
/// When a spell event terminates, we need something to happen.
///
/// By this point we should have terminated the spell/song event data
/// and should only need the info about the character and the spell
/// and the argument(s).
///
/// Passing of the correct function parameters should be handled by the
/// event system.
/// </summary>
/// <param name="ch">The caster</param>
/// <param name="spell">The spell number</param>
/// <param name="target">The _targetType</param>
public static void FinishSpell( CharData ch, Spell spell, Target target )
{
Object obj;
int chance = 0;
bool found = false;
string lbuf = String.Format("Magic.FinishSpell: {0} by {1}", spell.Name, ch.Name);
Log.Trace( lbuf );
for( int i = Database.CastList.Count - 1; i >= 0; i--)
{
if (Database.CastList[i].Who && Database.CastList[i].Who == ch)
{
Database.CastList.RemoveAt( i );
}
}
// If they're not casting at the end of the song or spell
// they certainly can't finish it.
if( ch.IsAffected( Affect.AFFECT_CASTING ) )
ch.RemoveAffect( Affect.AFFECT_CASTING );
else
{
return;
}
if( !ch.CheckConcentration(spell) )
return;
if( ( ch.IsAffected( Affect.AFFECT_MUTE ) || ch.HasInnate( Race.RACE_MUTE ) )
&& !ch.IsClass( CharClass.Names.psionicist ) )
{
ch.SendText( "Your lips move but no sound comes out.\r\n" );
return;
}
// Make sure the room is still castable.
if( !ch.InRoom.CheckCastable( ch, false, false ) )
return;
if( ch.InRoom.CheckStarshell( ch ) )
return;
MemorizeData memorized = null;
if (!ch.IsNPC() && !ch.IsImmortal() && !ch.IsClass(CharClass.Names.psionicist))
{
foreach( MemorizeData mem in ((PC)ch).Memorized )
{
if( !mem.Memmed )
continue;
if( mem.Name == spell.Name )
{
found = true;
memorized = mem;
break;
}
}
if (!found && !ch.IsNPC() && !ch.IsClass(CharClass.Names.psionicist))
{
ch.SendText( "You do not have that spell memorized!\r\n" );
if( spell.ValidTargets == TargetType.objectOrCharacter )
target = null;
else if( spell.ValidTargets == TargetType.none )
target = null;
return;
}
}
if( ch.IsAffected( Affect.AFFECT_FEEBLEMIND ) )
{
ch.SendText( "You are just too stupid to cast that spell!\r\n" );
SocketConnection.Act( "$n&n screws up $s face in concentration.", ch, null, null, SocketConnection.MessageTarget.room );
SocketConnection.Act( "$n&n tries really, really hard to complete a spell, but fails.", ch, null, null, SocketConnection.MessageTarget.room );
return;
}
// Locate targets.
CharData victim = null;
switch( spell.ValidTargets )
{
default:
Log.Trace( "FinishSpell: bad TargetType for spell {1}.", spell );
return;
case TargetType.objectOrCharacter:
if( ch.IsAffected( Affect.AFFECT_BLIND ) )
{
//.........这里部分代码省略.........
示例11: 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)
{
//.........这里部分代码省略.........
示例12: Cast
/// <summary>
/// Handles all spellcasting, whether it be willing, singing, or casting
/// If they got here as a bard, they're using the SING command word,
/// if they got here as a psionicist, they're using the WILL command word,
/// and if they got here as anything else, they're using CAST.
///
/// These are just cheesy details handled by CommandType.cs... we don't care.
/// What we do care about is that we *know* it's safe to base all our
/// messages/decisions on the character's class.
///
/// This function is also *mob-safe*, meaning that mobs can cast spells
/// too. However, this is not the preferred method (as far as I can tell)
///
/// Shaman totems are checked for in this function.
/// </summary>
/// <param name="ch"></param>
/// <param name="argument"></param>
public static void Cast( CharData ch, string argument )
{
// No casting while berzerked... Nor singing! Hah!
if (ch.IsAffected(Affect.AFFECT_BERZERK))
{
ch.SendText( "Not while you're in a &+RBl&n&+ro&+Ro&n&+rd&+L Rage&n!\r\n" );
return;
}
// No casting while thirsty... Nor singing! Hah!
if (ch.IsAffected(Affect.AFFECT_THIRST) && ( ch.IsNPC() || ( (PC)ch ).Thirst < 10 ) )
{
ch.SendText( "&+BNo&+Ct w&+chi&+ble &+cyo&+Bu'&+cre &+Bso p&+carc&+Bhed&n!\r\n" );
return;
}
String[] pieces = argument.Split( new Char[] {'\''}, StringSplitOptions.RemoveEmptyEntries);
if (pieces.Length < 1)
{
ch.SendText("Spell names must always be in single quotes, such as: cast 'magic missile' troll.\r\n");
return;
}
if (pieces.Length > 1)
{
pieces[1] = pieces[1].Trim();
}
Spell spell;
if (((spell = StringLookup.SpellLookup(pieces[0])) == null) || ((!ch.HasSpell(pieces[0])) && !ch.IsImmortal()))
{
ch.SendText( "You can't do that.\r\n" );
return;
}
if( !CheckTotem( ch, spell ))
return;
if( !ch.CheckConcentration( spell ) )
return;
if (!ch.CheckMemorized(spell))
return;
if( ( !ch.CanSpeak() || ch.HasInnate(Race.RACE_MUTE)) && !ch.IsClass(CharClass.Names.psionicist))
{
ch.SendText( "Your lips move but no sound comes out.\r\n" );
return;
}
if( !ch.InRoom.CheckCastable( ch, ch.IsClass( CharClass.Names.bard ), true) )
return;
if( ch.InRoom.CheckStarshell( ch ) )
return;
int manaUsed = 0;
// TODO: Rather than hard-code psionicist as a mana class, let that be set in the class files.
if (ch.IsClass(CharClass.Names.psionicist))
{
manaUsed = Macros.ManaCost(ch, spell);
}
else if (ch.IsClass(CharClass.Names.bard))
{
manaUsed = spell.MinimumMana;
}
// Locate targets.
if( ch.IsNPC() )
{
ImmortalChat.SendImmortalChat( null, ImmortalChat.IMMTALK_SPAM, 0, "Magic.Cast: Attempting to find _targetType for " + ch.ShortDescription + "&n." );
}
if (pieces.Length > 1)
{
ProcessSpellTargets(ch, spell, pieces[1]);
}
else
{
ProcessSpellTargets(ch, spell, null);
}
}
示例13: ShowCharacterToCharacterFull
//.........这里部分代码省略.........
percent = -1;
}
text = victim.ShowNameTo(ch, true);
if (percent >= 100)
text += " &nis in perfect &n&+ghealth&n. ";
else if (percent >= 90)
text += " &nis slightly &n&+yscratched&n. ";
else if (percent >= 80)
text += " &nhas a &+yfew bruises&n. ";
else if (percent >= 70)
text += " &nhas &+Ysome cuts&n. ";
else if (percent >= 60)
text += " &nhas &+Mseveral wounds&n. ";
else if (percent >= 50)
text += " &nhas &+mmany nasty wounds&n. ";
else if (percent >= 40)
text += " &nis &+Rbleeding freely&n. ";
else if (percent >= 30)
text += " &nis &+Rcovered in blood&n. ";
else if (percent >= 20)
text += " &nis &+rleaking guts&n. ";
else if (percent >= 10)
text += " &nis &+ralmost dead&n. ";
else
text += " &nis &+rDYING&n. ";
ch.SendText(text);
// Show size on look at someone.
text = MUDString.CapitalizeANSIString(String.Format("{0}&n is a {1} of {2} size.\r\n", victim.GetSexPronoun(),
Race.RaceList[victim.GetRace()].ColorName, Race.SizeString(victim.CurrentSize)));
ch.SendText(text);
ShowAffectLines(ch, victim);
bool found = false;
foreach (ObjTemplate.WearLocation location in ObjTemplate.TopDownEquipment)
{
obj = Object.GetEquipmentOnCharacter(victim, location);
if (obj && CharData.CanSeeObj(ch, obj))
{
if (!found)
{
ch.SendText("\r\n");
SocketConnection.Act("&n$E is using:", ch, null, victim, SocketConnection.MessageTarget.character);
found = true;
}
if (obj.ItemType == ObjTemplate.ObjectType.weapon
&& (location == ObjTemplate.WearLocation.hand_one
|| location == ObjTemplate.WearLocation.hand_three
|| location == ObjTemplate.WearLocation.hand_four
|| location == ObjTemplate.WearLocation.hand_two)
&& obj.HasWearFlag(ObjTemplate.WEARABLE_WIELD))
{
if (obj.HasFlag(ObjTemplate.ITEM_TWOHANDED)
&& !ch.HasInnate(Race.RACE_EXTRA_STRONG_WIELD))
{
ch.SendText("&+y(wielding twohanded) &n");
}
else
{
ch.SendText("&+y(wielding) &n");
}
}
else
{
if (obj.ItemType == ObjTemplate.ObjectType.shield
&& (location == ObjTemplate.WearLocation.hand_one
|| location == ObjTemplate.WearLocation.hand_three
|| location == ObjTemplate.WearLocation.hand_four
|| location == ObjTemplate.WearLocation.hand_two)
&& obj.HasWearFlag(ObjTemplate.WEARABLE_SHIELD))
{
ch.SendText("&+y(worn as shield) &n");
}
else
{
ch.SendText(StringConversion.EquipmentLocationDisplay[(int)location]);
}
}
ch.SendText(FormatObjectToCharacter(obj, ch, true));
ch.SendText("\r\n");
}
}
// Keep in mind that players can spam looking at someone in order
// to increase their skill in peek - this will need to be fixed.
if ((victim != ch && !ch.IsNPC()
&& ((((PC)ch).SkillAptitude.ContainsKey("peek") && MUDMath.NumberPercent() < ((PC)ch).SkillAptitude["peek"])
|| ch.Level >= Limits.LEVEL_AVATAR)) || ch.Riding == victim || ch.Rider == victim)
{
ch.SendText("\r\n&nYou peek at the inventory:\r\n");
ch.PracticeSkill("peek");
ShowListToCharacter(victim.Carrying, ch, true, true);
}
return;
}
示例14: ShowCharacterToCharacterAbbreviated
//.........这里部分代码省略.........
if (victim.CurrentPosition == Position.standing && victim.CanFly())
{
text += "flying";
}
else
{
text += Position.PositionString(victim.CurrentPosition);
}
text += " here";
if (victim.Fighting != null)
{
text += "&n fighting ";
if (victim.Fighting == ch)
{
text += "&nyou!";
}
else if (victim.InRoom == victim.Fighting.InRoom)
{
text += victim.Fighting.ShowNameTo(ch, false);
}
else
{
text += "&nsomeone who left??";
}
}
if (victim.Riding && victim.Riding.InRoom == victim.InRoom)
{
text += "&n, mounted on " + victim.Riding.ShowNameTo(ch, false);
}
text += "&n.";
}
if (victim.IsAffected(Affect.AFFECT_CASTING))
{
text += "&n&+y (casting)&n";
}
if (victim.IsAffected(Affect.AFFECT_MINOR_PARA))
{
text += "&n (&+Yparalyzed)&n";
}
if (!victim.IsNPC() && victim.HasActionBit(PC.PLAYER_WIZINVIS)
&& victim.GetTrust() <= ch.GetTrust())
{
text += " &n&+g*&n";
}
if (victim.IsAffected(Affect.AFFECT_HIDE) && (ch.IsAffected(Affect.AFFECT_DETECT_HIDDEN) ||
ch.HasInnate(Race.RACE_DETECT_HIDDEN)))
{
text += " &n(&+LHiding&n)";
}
if (victim.IsAffected(Affect.AFFECT_CHARM) && ch.HasActionBit(PC.PLAYER_GODMODE))
{
text += " &n(&n&+mCharmed&n)";
}
if ((victim.IsAffected(Affect.AFFECT_PASS_DOOR) || victim.HasInnate(Race.RACE_PASSDOOR))
&& ch.HasActionBit(PC.PLAYER_GODMODE))
{
text += " &n(&+WTranslucent&n)";
}
if ((victim.GetRace() == Race.RACE_UNDEAD || victim.GetRace() == Race.RACE_VAMPIRE)
&& (ch.IsAffected( Affect.AFFECT_DETECT_UNDEAD) || ch.HasActionBit(PC.PLAYER_GODMODE)))
{
text += " &n(&+WPale&n)";
}
if (victim.IsAffected(Affect.AFFECT_FAERIE_FIRE))
{
text += " &n(&n&+mFa&+Me&n&+mr&+Mie&+L Aura&n)";
}
if (victim.IsEvil() && (ch.IsAffected(Affect.AFFECT_DETECT_EVIL)
|| ch.HasInnate(Race.RACE_DETECT_ALIGN)
|| ch.IsClass(CharClass.Names.paladin)
|| ch.IsClass(CharClass.Names.antipaladin)))
{
text += " &n(&+rBlood&+L Aura&n)";
}
if (victim.IsGood() && (ch.IsAffected(Affect.AFFECT_DETECT_GOOD)
|| ch.HasInnate(Race.RACE_DETECT_ALIGN)
|| ch.IsClass(CharClass.Names.paladin)
|| ch.IsClass(CharClass.Names.antipaladin)))
{
text += " &n(&+CLight&+L Aura&n)";
}
if (victim.IsAffected(Affect.AFFECT_SANCTUARY))
{
text += " &n(&+WWhite&+L Aura&n)";
}
if (!victim.IsNPC() && victim.HasActionBit(PC.PLAYER_AFK))
{
text += " &n&+b(&+RAFK&n&+b)&n";
}
if (!victim.IsNPC() && victim.HasActionBit(PC.PLAYER_BOTTING))
{
text += " &n&+b(&+YBot&n&+b)&n";
}
text += "\r\n";
ch.SendText(text);
return;
}
示例15: Wear
/// <summary>
/// Put on a piece of equipment.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Wear(CharData ch, string[] str)
{
if( ch == null ) return;
Object obj;
if (ch.IsAffected(Affect.AFFECT_HOLD) || ch.IsAffected(Affect.AFFECT_MINOR_PARA))
{
ch.SendText("Your body refuses the call to movement.\r\n");
return;
}
if (!ch.IsNPC() && ch.IsAffected( Affect.AFFECT_WRAITHFORM))
{
ch.SendText("You try, but your &n&+wghoul&n form resists your attempts.\r\n");
return;
}
if (ch.Fighting || ch.CurrentPosition == Position.fighting)
{
ch.SendText("You can't wear stuff while you're fighting!\r\n");
return;
}
if (str.Length == 0)
{
ch.SendText("Wear, wield, or hold what?\r\n");
return;
}
if (str[0] == "all")
{
foreach (Object iobj in ch.Carrying)
{
if (iobj.WearLocation != ObjTemplate.WearLocation.none || !CharData.CanSeeObj(ch, iobj))
{
continue;
}
if (iobj.HasWearFlag(ObjTemplate.WEARABLE_WIELD)
&& !ch.HasInnate(Race.RACE_WEAPON_WIELD))
{
continue;
}
Object.WearObject(ch, iobj, false);
if (iobj.Trap != null && iobj.Trap.CheckTrigger( Trap.TriggerType.wear))
{
ch.SetOffTrap(iobj);
if (ch.CurrentPosition == Position.dead)
{
return;
}
}
}
return;
}
if (!(obj = ch.GetObjCarrying(str[0])))
{
ch.SendText("You do not have that item.\r\n");
return;
}
if (obj.HasWearFlag(ObjTemplate.WEARABLE_WIELD)
&& !ch.HasInnate(Race.RACE_WEAPON_WIELD))
{
ch.SendText("You are not able to wield a weapon.\r\n");
return;
}
Object.WearObject(ch, obj, true);
if (obj.Trap != null && obj.Trap.CheckTrigger( Trap.TriggerType.wear))
{
ch.SetOffTrap(obj);
if (ch.CurrentPosition == Position.dead)
{
return;
}
}
return;
}