Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        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);
            }
        }
Exemplo n.º 6
0
        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();
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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));
        }