public static void CheckAttackForAttackerFlag(this CharacterInstance ch, CharacterInstance victim) { if (victim.IsNpc() || victim.Act.IsSet((int)PlayerFlags.Killer) || victim.Act.IsSet((int)PlayerFlags.Thief)) { return; } if (!ch.IsNpc() && !victim.IsNpc() && ch.CanPKill() && victim.CanPKill()) { return; } if (ch.IsAffected(AffectedByTypes.Charm)) { if (ch.Master == null) { LogManager.Instance.Bug("{0} bad AffectedByTypes.Charm", ch.IsNpc() ? ch.ShortDescription : ch.Name); // TODO affect_strip ch.AffectedBy.RemoveBit((int)AffectedByTypes.Charm); return; } return; } if (ch.IsNpc() || ch == victim || ch.Level >= LevelConstants.ImmortalLevel || ch.Act.IsSet((int)PlayerFlags.Attacker) || ch.Act.IsSet((int)PlayerFlags.Killer)) { return; } ch.Act.SetBit((int)PlayerFlags.Attacker); save.save_char_obj(ch); }
private static void CheckAttacker(CharacterInstance ch, CharacterInstance victim) { // NPCs, Killers and Theives are fair game if (victim.IsNpc() || victim.Act.IsSet((int)PlayerFlags.Killer) || victim.Act.IsSet((int)PlayerFlags.Thief)) { return; } // Deadly character if (!ch.IsNpc() && !victim.IsNpc() && ch.CanPKill() && victim.CanPKill()) { return; } if (ch.IsAffected(AffectedByTypes.Charm)) { if (ch.Master == null) { // TODO affect_strip(ch, gsn_charm_person); ch.AffectedBy.RemoveBit((int)AffectedByTypes.Charm); return; } return; } if (ch.IsNpc() || ch == victim || ch.IsImmortal() || ch.Act.IsSet((int)PlayerFlags.Attacker) || ch.Act.IsSet((int)PlayerFlags.Killer)) { return; } ch.Act.SetBit((int)PlayerFlags.Attacker); // TODO save_char_obj(ch); }
public static bool LuaCanPKill(CharacterInstance ch) { if (ch == null) { throw new LuaException("Character cannot be null"); } return(ch.CanPKill()); }
private static void QuaffPotion(CharacterInstance ch, ObjectInstance obj, bool hgFlag) { if (!MudProgHandler.ExecuteObjectProg(MudProgTypes.Use, ch, obj, null, null)) { if (!ch.CanPKill() || obj.InObject == null) { comm.act(ATTypes.AT_ACTION, "$n quaffs $p.", ch, obj, null, ToTypes.Room); if (!hgFlag) { comm.act(ATTypes.AT_MAGIC, "You quaff $p.", ch, obj, null, ToTypes.Character); } } else if (obj.InObject != null) { comm.act(ATTypes.AT_ACTION, "$n quaffs $p from $P.", ch, obj, obj.InObject, ToTypes.Room); if (!hgFlag) { comm.act(ATTypes.AT_MAGIC, "You quaff $p from $P.", ch, obj, obj.InObject, ToTypes.Character); } } } if (ch.GetMyTarget() != null && ch.IsPKill()) { Macros.WAIT_STATE(ch, GameConstants.GetSystemValue <int>("PulsesPerSecond") / 5); } else { Macros.WAIT_STATE(ch, GameConstants.GetSystemValue <int>("PulsesPerSecond") / 3); } ((PlayerInstance)ch).GainCondition(ConditionTypes.Thirsty, 1); if (!ch.IsNpc() && ((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Thirsty) > 43) { comm.act(ATTypes.AT_ACTION, "Your stomach is nearing its capacity.", ch, null, null, ToTypes.Character); } var retcode = ch.ObjectCastSpell((int)obj.Values.Skill1ID, (int)obj.Values.SpellLevel, ch); if (retcode == ReturnTypes.None) { retcode = ch.ObjectCastSpell((int)obj.Values.Skill2ID, (int)obj.Values.SpellLevel, ch); } if (retcode == ReturnTypes.None) { retcode = ch.ObjectCastSpell((int)obj.Values.Skill3ID, (int)obj.Values.SpellLevel, ch); } }
public static void CheckDisarm(CharacterInstance ch, CharacterInstance victim, IRepositoryManager dbManager = null) { var obj = victim.GetEquippedItem(WearLocations.Wield); if (CheckFunctions.CheckIfNullObject(ch, obj)) { return; } var tempObj = victim.GetEquippedItem(WearLocations.DualWield); if (tempObj != null && SmaugRandom.Bits(1) == 0) { obj = tempObj; } var skill = (dbManager ?? RepositoryManager.Instance).GetEntity <SkillData>("disarm"); if (skill == null) { throw new ObjectNotFoundException("Skill 'disarm' not found"); } if (!ch.IsNpc() && ch.GetEquippedItem(WearLocations.Wield) == null && SmaugRandom.Bits(1) == 0) { skill.LearnFromFailure(ch); return; } if (!ch.IsNpc() && !ch.CanSee(obj) && SmaugRandom.Bits(1) == 0) { skill.LearnFromFailure(ch); return; } if (Grip.CheckGrip(ch, victim) && !ch.IsNpc()) { skill.LearnFromFailure(ch); return; } comm.act(ATTypes.AT_SKILL, "$n DISARMS you!", ch, null, victim, ToTypes.Victim); comm.act(ATTypes.AT_SKILL, "You disarm $N!", ch, null, victim, ToTypes.Character); comm.act(ATTypes.AT_SKILL, "$n disarms $N!", ch, null, victim, ToTypes.Room); skill.LearnFromFailure(ch); obj.RemoveFrom(); if (!victim.IsNpc() && victim.CanPKill() && !obj.ExtraFlags.IsSet((int)ItemExtraFlags.Loyal)) { obj.MagicFlags.SetBit(ItemMagicFlags.PKDisarmed); obj.Value.ToList()[5] = victim.Level; } if (victim.IsNpc() || (obj.ExtraFlags.IsSet((int)ItemExtraFlags.Loyal) && victim.IsPKill() && !ch.IsNpc())) { obj.AddTo(victim); } else { victim.CurrentRoom.AddTo(obj); } }
public static void do_quaff(CharacterInstance ch, string argument) { if (CheckFunctions.CheckIfEmptyString(ch, argument, "Quaff what?")) { return; } var obj = handler.FindObject(ch, argument, true); if (CheckFunctions.CheckIfNullObject(ch, obj)) { return; } if (!ch.IsNpc() && ch.IsAffected(AffectedByTypes.Charm)) { return; } if (obj.ItemType != ItemTypes.Potion) { QuaffNonPotion(ch, obj); return; } if (CheckFunctions.CheckIfTrue(ch, obj.Values.Quantity == -1 && obj.Values.LiquidID == -1 && obj.Values.Poison == -1, "You suck in nothing but air.")) { return; } if (!ch.IsNpc()) { var pch = (PlayerInstance)ch; if (CheckFunctions.CheckIfTrue(ch, pch.PlayerData.GetConditionValue(ConditionTypes.Full) >= 48 || pch.PlayerData.GetConditionValue(ConditionTypes.Thirsty) >= 48, "Your stomach cannot contain any more.")) { return; } } // TODO People with nuisance flag fill up more quickly obj.Split(); if (obj.InObject != null && !ch.CanPKill()) { comm.act(ATTypes.AT_PLAIN, "You take $p from $P.", ch, obj, obj.InObject, ToTypes.Character); comm.act(ATTypes.AT_PLAIN, "$n takes $p from $P.", ch, obj, obj.InObject, ToTypes.Room); } var hgFlag = !(!ch.IsNpc() && (!ch.IsPKill() || (ch.IsPKill() && !((PlayerInstance)ch).PlayerData.Flags.IsSet(PCFlags.HighGag)))); if (ch.CurrentFighting != null && PotionWasFumbled(ch)) { FumblePotion(ch, obj, hgFlag); } else { QuaffPotion(ch, obj, hgFlag); } if (obj.ObjectIndex.ID == VnumConstants.OBJ_VNUM_FLASK_BREWING) { GameManager.Instance.SystemData.brewed_used++; } else { GameManager.Instance.SystemData.upotion_val += obj.Cost / 100; } // TODO global_objcode? obj.Extract(); }
public static void get_obj(CharacterInstance ch, ObjectInstance obj, ObjectInstance container) { if (CheckFunctions.CheckIfTrue(ch, !obj.WearFlags.IsSet(ItemWearFlags.Take) && (ch.Level < GameManager.Instance.SystemData.GetMinimumLevel(PlayerPermissionTypes.LevelGetObjectNoTake)), "You can't take that.")) { return; } if (obj.MagicFlags.IsSet(ItemMagicFlags.PKDisarmed) && !ch.IsNpc()) { var timer = ch.GetTimer(TimerTypes.PKilled); if (ch.CanPKill() && timer == null) { if (ch.Level - obj.Value.ToList()[5] > 5 || obj.Value.ToList()[5] - ch.Level > 5) { ch.SendTo("\r\n&bA godly force freezes your outstretched hand."); return; } obj.MagicFlags.RemoveBit(ItemMagicFlags.PKDisarmed); obj.Value.ToList()[5] = 0; } } else { ch.SendTo("\r\n&BA godly force freezes your outstretched hand."); return; } if (CheckFunctions.CheckIfTrue(ch, obj.ExtraFlags.IsSet((int)ItemExtraFlags.Prototype) && !ch.CanTakePrototype(), "A godly force prevents you from getting close to it.")) { return; } if (ch.CarryNumber + obj.ObjectNumber > ch.CanCarryN()) { comm.act(ATTypes.AT_PLAIN, "$d: you can't carry that many items.", ch, null, obj.ShortDescription, ToTypes.Character); return; } var weight = obj.ExtraFlags.IsSet((int)ItemExtraFlags.Covering) ? obj.Weight : obj.GetWeight(); if (obj.ItemType != ItemTypes.Money) { if (obj.InObject != null) { var tObject = obj.InObject; var inobj = 1; var checkweight = tObject.ItemType == ItemTypes.Container && tObject.ExtraFlags.IsSet((int)ItemExtraFlags.Magical); while (tObject.InObject != null) { tObject = tObject.InObject; inobj++; checkweight = tObject.ItemType == ItemTypes.Container && tObject.ExtraFlags.IsSet((int)ItemExtraFlags.Magical); } if (tObject.CarriedBy == null || tObject.CarriedBy != ch || checkweight) { if (ch.CarryWeight + weight > ch.CanCarryMaxWeight()) { comm.act(ATTypes.AT_PLAIN, "$d: you can't carry that much weight.", ch, null, obj.ShortDescription, ToTypes.Character); return; } } } else if (ch.CarryWeight + weight > ch.CanCarryMaxWeight()) { comm.act(ATTypes.AT_PLAIN, "$d: you can't carry that much weight.", ch, null, obj.ShortDescription, ToTypes.Character); return; } } if (container != null) { GetObjectFromContainer(ch, obj, container); } else { GetObjectFromRoom(ch, obj); } if (ch.CurrentRoom.Flags.IsSet(RoomFlags.ClanStoreroom) && (container?.CarriedBy == null)) { foreach (var clan in RepositoryManager.Instance.CLANS.Values) { if (clan.StoreRoom == ch.CurrentRoom.ID) { save_clan_storeroom(ch, clan); } } } if (obj.ItemType != ItemTypes.Container) { ch.CheckObjectForTrap(obj, TrapTriggerTypes.Get); } if (ch.CharDied()) { return; } if (obj.ItemType == ItemTypes.Money) { int amt = obj.Values.NumberOfCoins * obj.Count; ch.CurrentCoin += amt; obj.Extract(); } else { obj = obj.AddTo(ch); } if (ch.CharDied() || handler.obj_extracted(obj)) { return; } MudProgHandler.ExecuteObjectProg(MudProgTypes.Get, ch, obj); }
public static ObjectInstance CreateCorpse(CharacterInstance ch, CharacterInstance killer, IRepositoryManager dbManager = null) { string name; ObjectInstance corpse; var databaseMgr = dbManager ?? RepositoryManager.Instance; if (ch.IsNpc()) { name = ch.ShortDescription; corpse = databaseMgr.OBJECTS.Create(databaseMgr.OBJECTTEMPLATES.CastAs <Repository <long, ObjectTemplate> >() .Get(VnumConstants.OBJ_VNUM_CORPSE_NPC), 0); corpse.Timer = 6; if (ch.CurrentCoin > 0) { if (ch.CurrentRoom != null) { ch.CurrentRoom.Area.gold_looted += ch.CurrentCoin; GameManager.Instance.SystemData.global_looted += ch.CurrentCoin / 100; } var money = CreateMoney(ch.CurrentCoin); money.AddTo(corpse); ch.CurrentCoin = 0; } corpse.Cost = -1 * (int)((MobileInstance)ch).MobIndex.ID; corpse.Value.ToList()[2] = corpse.Timer; } else { name = ch.Name; corpse = databaseMgr.OBJECTS.Create(databaseMgr.OBJECTTEMPLATES.Get(VnumConstants.OBJ_VNUM_CORPSE_PC), 0); corpse.Timer = ch.IsInArena() ? 0 : 40; corpse.Value.ToList()[2] = corpse.Timer / 8; corpse.Value.ToList()[4] = ch.Level; if (ch.CanPKill() && GameManager.Instance.SystemData.PlayerKillLoot > 0) { corpse.ExtraFlags.SetBit((int)ItemExtraFlags.ClanCorpse); } corpse.Value.ToList()[3] = !ch.IsNpc() && !killer.IsNpc() ? 1 : 0; } if (ch.CanPKill() && killer.CanPKill() && ch != killer) { corpse.Action = killer.Name; } corpse.Name = $"corpse {name}"; corpse.ShortDescription = name; corpse.Description = name; foreach (var obj in ch.Carrying) { obj.RemoveFrom(); if (obj.ExtraFlags.IsSet((int)ItemExtraFlags.Inventory) || obj.ExtraFlags.IsSet((int)ItemExtraFlags.DeathRot)) { obj.Extract(); } else { obj.AddTo(corpse); } } return(ch.CurrentRoom.AddTo(corpse)); }