public static void char_update() { //lc = trworld_create(TR_CHAR_WORLD_BACK) foreach (var ch in RepositoryManager.Instance.CHARACTERS.Values) { handler.CurrentCharacter = ch; if (!ch.IsNpc()) { MudProgHandler.ExecuteRoomProg(MudProgTypes.Random, ch); } if (ch.CharDied()) { continue; } if (ch.IsNpc()) { MudProgHandler.ExecuteMobileProg(MudProgTypes.Time, ch); } if (ch.CharDied()) { continue; } MudProgHandler.ExecuteRoomProg(MudProgTypes.Time, ch); if (ch.CharDied()) { continue; } CharacterInstance ch_save = null; if (!ch.IsNpc() && (((PlayerInstance)ch).Descriptor == null || ((PlayerInstance)ch).Descriptor.ConnectionStatus == ConnectionTypes.Playing) && ch.Level >= 2 && CheckSaveFrequency(ch)) { ch_save = ch; } if ((int)ch.CurrentPosition >= (int)PositionTypes.Stunned) { if (ch.CurrentHealth < ch.MaximumHealth) { ch.CurrentHealth += ch.HealthGain(); } if (ch.CurrentMana < ch.MaximumMana) { ch.CurrentMana += ch.ManaGain(); } if (ch.CurrentMovement < ch.MaximumMovement) { ch.CurrentMovement += ch.MovementGain(); } } if (ch.CurrentPosition == PositionTypes.Stunned) { ch.UpdatePositionByCurrentHealth(); } // TODO Variables if (ch.CurrentMorph?.timer > 0) { --ch.CurrentMorph.timer; if (ch.CurrentMorph.timer == 0) { UnmorphChar.do_unmorph_char(ch, string.Empty); } } // TODO Nuisance if (!ch.IsNpc() && ch.Level < LevelConstants.ImmortalLevel) { var obj = ch.GetEquippedItem(WearLocations.Light); if (obj != null && obj.ItemType == ItemTypes.Light && obj.Value.ToList()[2] > 0) { ProcessLightObject(ch, obj); } if (++ch.Timer >= 12) { ProcessIdle(ch); } if (((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Drunk) > 8) { ((PlayerInstance)ch).WorsenMentalState(((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Drunk) / 8); } if (((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Full) > 1) { // todo fix this //IEnumerable<MentalStateAttribute> attribs = // ch.CurrentPosition.GetAttributes<MentalStateAttribute>(); //if (attribs.Any()) //{ // MentalStateAttribute attrib = // attribs.FirstOrDefault(x => x.Condition.HasFlag(ConditionTypes.Full)); // ch.ImproveMentalState(attrib == null ? 1 : attrib.ModValue); //} } if (((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Thirsty) > 1) { // todo fix this //IEnumerable<MentalStateAttribute> attribs = // ch.CurrentPosition.GetAttributes<MentalStateAttribute>(); //if (attribs.Any()) //{ // MentalStateAttribute attrib = // attribs.FirstOrDefault(x => x.Condition.HasFlag(ConditionTypes.Thirsty)); // ch.ImproveMentalState(attrib == null ? 1 : attrib.ModValue); //} } ch.CheckAlignment(); ((PlayerInstance)ch).GainCondition(ConditionTypes.Drunk, -1); var race = RepositoryManager.Instance.GetRace(ch.CurrentRace); ((PlayerInstance)ch).GainCondition(ConditionTypes.Full, -1 + race.HungerMod); if (ch.IsVampire() && ch.Level >= 10) { if (GameManager.Instance.GameTime.Hour < 21 && GameManager.Instance.GameTime.Hour >= 10) { ((PlayerInstance)ch).GainCondition(ConditionTypes.Bloodthirsty, -1); } } if (ch.CanPKill() && ((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Thirsty) - 9 > 10) { ((PlayerInstance)ch).GainCondition(ConditionTypes.Thirsty, -9); } // TODO Nuisance } if (!ch.IsNpc() && !ch.IsImmortal() && ((PlayerInstance)ch).PlayerData.release_date > DateTime.MinValue && ((PlayerInstance)ch).PlayerData.release_date <= DateTime.Now) { var location = RepositoryManager.Instance.ROOMS.Get(((PlayerInstance)ch).PlayerData.Clan?.RecallRoom ?? VnumConstants.ROOM_VNUM_TEMPLE) ?? ch.CurrentRoom; ch.CurrentRoom.RemoveFrom(ch); location.AddTo(ch); ch.SendTo("The gods have released you from hell as your sentence is up!"); Look.do_look(ch, "auto"); ((PlayerInstance)ch).PlayerData.helled_by = string.Empty; ((PlayerInstance)ch).PlayerData.release_date = DateTime.MinValue; save.save_char_obj(ch); } if (!ch.CharDied()) { if (ch.IsAffected(AffectedByTypes.Poison)) { comm.act(ATTypes.AT_POISON, "$n shivers and suffers.", ch, null, null, ToTypes.Room); comm.act(ATTypes.AT_POISON, "You shiver and suffer.", ch, null, null, ToTypes.Character); var minMentalState = CalculateMinMentalStateWhilePoisoned(ch); ch.MentalState = 20.GetNumberThatIsBetween(minMentalState, 100); ch.CauseDamageTo(ch, 6, RepositoryManager.Instance.LookupSkill("poison")); } else { switch (ch.CurrentPosition) { case PositionTypes.Incapacitated: ch.CauseDamageTo(ch, 1, Program.TYPE_UNDEFINED); break; case PositionTypes.Mortal: ch.CauseDamageTo(ch, 4, Program.TYPE_UNDEFINED); break; } } if (ch.CharDied()) { continue; } if (ch.IsAffected(AffectedByTypes.RecurringSpell)) { var died = false; var found = false; foreach (var paf in ch.Affects.Where(x => x.Location == ApplyTypes.RecurringSpell)) { found = true; if (Macros.IS_VALID_SN(paf.Modifier)) { var skill = RepositoryManager.Instance.SKILLS.Get(paf.Modifier); if (skill == null || skill.Type != SkillTypes.Spell) { continue; } var retCode = skill.SpellFunction.Value.Invoke(paf.Modifier, ch.Level, ch, ch); if (retCode == ReturnTypes.CharacterDied || ch.CharDied()) { died = true; break; } } } if (died) { continue; } if (!found) { ch.AffectedBy.RemoveBit((int)AffectedByTypes.RecurringSpell); } } if (ch.MentalState >= 30) { var val = (ch.MentalState + 5) / 10; if (HighMentalStateTable.ContainsKey(val)) { ch.SendTo(HighMentalStateTable[val].Key); comm.act(ATTypes.AT_ACTION, HighMentalStateTable[val].Value, ch, null, null, ToTypes.Room); } } if (ch.MentalState <= -30) { var val = (Math.Abs(ch.MentalState) + 5) / 10; if (LowMentalStateTable.ContainsKey(val)) { if (val > 7) { if ((int)ch.CurrentPosition > (int)PositionTypes.Sleeping) { if ((ch.CurrentPosition == PositionTypes.Standing || (int)ch.CurrentPosition < (int)PositionTypes.Fighting) && (SmaugRandom.D100() + (100 - val * 10) + 10 < Math.Abs(ch.MentalState))) { Sleep.do_sleep(ch, string.Empty); } else { ch.SendTo(LowMentalStateTable[val]); } } } else { if ((int)ch.CurrentPosition > (int)PositionTypes.Resting) { ch.SendTo(LowMentalStateTable[val]); } } } } if (ch.Timer > 24) { Quit.do_quit(ch, string.Empty); } else if (ch == ch_save && GameManager.Instance.SystemData.SaveFlags.IsSet(AutoSaveFlags.Auto)) { save.save_char_obj(ch); } } } //trowlrd_dispose }
public static ObjectInstance RawKill(this CharacterInstance ch, CharacterInstance victim) { var victimPc = (PlayerInstance)victim; if (victim.IsNotAuthorized()) { LogManager.Instance.Bug("Killing unauthorized"); return(null); } victim.StopFighting(true); if (victim.CurrentMorph != null) { UnmorphChar.do_unmorph_char(victim, string.Empty); return(ch.RawKill(victim)); } MudProgHandler.ExecuteMobileProg(MudProgTypes.Death, ch, victim); if (victim.CharDied()) { return(null); } MudProgHandler.ExecuteRoomProg(MudProgTypes.Death, victim); if (victim.CharDied()) { return(null); } var corpse = ObjectFactory.CreateCorpse(victim, ch); switch (victim.CurrentRoom.SectorType) { case SectorTypes.OceanFloor: case SectorTypes.Underwater: case SectorTypes.ShallowWater: case SectorTypes.DeepWater: comm.act(ATTypes.AT_BLOOD, "$n's blood slowly clouds the surrounding water.", victim, null, null, ToTypes.Room); break; case SectorTypes.Air: comm.act(ATTypes.AT_BLOOD, "$n's blood sprays wildly through the air.", victim, null, null, ToTypes.Room); break; default: ObjectFactory.CreateBlood(victim); break; } if (victim.IsNpc()) { ((MobileInstance)victim).MobIndex.TimesKilled++; victim.Extract(true); victim = null; return(corpse); } victim.SetColor(ATTypes.AT_DIEMSG); Help.do_help(victim, ((PlayerInstance)victim).PlayerData.PvEDeaths + ((PlayerInstance)victim).PlayerData.PvPDeaths < 3 ? "new_death" : "_DIEMSG_"); victim.Extract(false); while (victim.Affects.Count > 0) { victim.RemoveAffect(victim.Affects.First()); } var victimRace = RepositoryManager.Instance.GetRace(victim.CurrentRace); victim.AffectedBy = victimRace.AffectedBy; victim.Resistance = 0; victim.Susceptibility = 0; victim.Immunity = 0; victim.CarryWeight = 0; victim.ArmorClass = 100 + victimRace.ArmorClassBonus; victim.Attacks = victimRace.Attacks; victim.Defenses = victimRace.Defenses; victim.ModStrength = 0; victim.ModDexterity = 0; victim.ModWisdom = 0; victim.ModIntelligence = 0; victim.ModConstitution = 0; victim.ModCharisma = 0; victim.ModLuck = 0; victim.DamageRoll = new DiceData(); victim.HitRoll = new DiceData(); victim.MentalState = -10; victim.CurrentAlignment = Macros.URANGE(-1000, victim.CurrentAlignment, 1000); victim.SavingThrows = victimRace.SavingThrows; victim.CurrentPosition = PositionTypes.Resting; victim.CurrentHealth = Macros.UMAX(1, victim.CurrentHealth); victim.CurrentMana = victim.Level < GetLevelAvatar() ? Macros.UMAX(1, victim.CurrentMana) : 1; victim.CurrentMovement = Macros.UMAX(1, victim.CurrentMovement); if (victim.Act.IsSet((int)PlayerFlags.Killer)) { victim.Act.RemoveBit((int)PlayerFlags.Killer); victim.SendTo("The gods have pardoned you for your murderous acts."); } if (victim.Act.IsSet((int)PlayerFlags.Thief)) { victim.Act.RemoveBit((int)PlayerFlags.Thief); victim.SendTo("The gods have pardoned you for your thievery."); } victimPc.PlayerData.SetConditionValue(ConditionTypes.Full, 12); victimPc.PlayerData.SetConditionValue(ConditionTypes.Thirsty, 12); if (victimPc.IsVampire()) { victimPc.PlayerData.SetConditionValue(ConditionTypes.Bloodthirsty, victim.Level / 2); } // TODO if (IS_SET(sysdata.save_flags, SV_DEATH)) // save_char_obj(victim); return(corpse); }