public void GenerateArenaLoot() { if ((Fighter as CharacterFighter).HasLeft) return; WorldClient client = (Fighter as CharacterFighter).Client; AsyncRandom random = new AsyncRandom(); FightLoot.kamas += (uint)(random.Next(50 * client.Character.Record.Level, 250 * client.Character.Record.Level)); client.Character.AddKamas((int)FightLoot.kamas); uint itemQt = (uint)random.Next(1, client.Character.Record.Level); FightLoot.objects.Add(FightArena.ARENA_ITEM_ID); FightLoot.objects.Add((ushort)itemQt); client.Character.Inventory.Add(FightArena.ARENA_ITEM_ID, itemQt); if (client.Character.Record.Level != 200) { var experienceForNextLevel = ExperienceRecord.GetExperienceForLevel((uint)client.Character.Record.Level + 1); var experienceForLevel = ExperienceRecord.GetExperienceForLevel(client.Character.Record.Level); int earnedXp = (int)((double)(experienceForNextLevel - (double)experienceForLevel) / (double)15); var expdatas = new FightResultExperienceData(true, true, true,true,false, false, false, client.Character.Record.Exp, experienceForLevel, experienceForNextLevel, earnedXp, 0, 0, 0); AdditionalDatas.Add(expdatas); client.Character.AddXp((ulong)earnedXp); } }
static void MoveGroup(MapRecord map,MonsterGroup group) { var random = new AsyncRandom(); var info = MonsterGroup.GetActorInformations(map, group); List<short> cells = Pathfinding.GetCircleCells(info.disposition.cellId, MoveCellsCount); cells.Remove(info.disposition.cellId); cells.RemoveAll(x => !map.WalkableCells.Contains(x)); cells.RemoveAll(x => PathHelper.GetDistanceBetween(info.disposition.cellId, x) <= MoveCellsCount); if (cells.Count == 0) return; var newCell = cells[random.Next(0, cells.Count())]; var path = new Pathfinder(map, info.disposition.cellId, newCell).FindPath(); if (path != null) { path.Insert(0, info.disposition.cellId); map.Instance.Send(new GameMapMovementMessage(path, info.contextualId)); group.CellId = (ushort)newCell; } else Logger.Error("Unable to move group" + group.MonsterGroupId + " on map " + map.Id + ", wrong path"); }
public void GeneratePVMLoot() { if ((Fighter as CharacterFighter).HasLeft) return; #region VariableDefinitions WorldClient client = (Fighter as CharacterFighter).Client; AsyncRandom random = new AsyncRandom(); FightPvM pvmfight = Fighter.Fight as FightPvM; #endregion #region Kamas & Items Generation List<DroppedItem> m_drops = new List<DroppedItem>(); foreach (var monster in pvmfight.MonsterGroup.Monsters) { var template = MonsterRecord.GetMonster(monster.MonsterId); var grade = template.GetGrade(monster.ActualGrade); #region kamas int droppedKamas = random.Next(template.MinKamas, template.MaxKamas + 1); FightLoot.kamas += (uint)(droppedKamas * ConfigurationManager.Instance.KamasDropRatio); #endregion #region items List<CharacterFighter> charactersFighters = Fighter.Team.GetFighters().FindAll(x => x is CharacterFighter).ConvertAll<CharacterFighter>(x => (CharacterFighter)x); int prospectingSum = charactersFighters.Sum((CharacterFighter entry) => entry.Client.Character.StatsRecord.Prospecting); foreach (var item in template.Drops.FindAll(x => x.ProspectingLock <= prospectingSum)) { int D = random.Next(0, 201); double dropchancePercent = item.GetDropRate(monster.ActualGrade) + pvmfight.MonsterGroup.AgeBonus / 5 + client.Character.StatsRecord.Prospecting / 100; if (D <= dropchancePercent) { var alreadyDropped = m_drops.FirstOrDefault(x => x.GID == item.ObjectId); if (alreadyDropped == null) { uint dropMax = GetQuantityDropMax(); uint Q = (uint)random.Next(1, (int)(dropMax + 1)); if (Q > item.Count) Q = 1; m_drops.Add(new DroppedItem(item.ObjectId, Q)); } else alreadyDropped.Quantity++; } } #endregion } #endregion client.Character.AddKamas((int)FightLoot.kamas); foreach (var item in m_drops) { FightLoot.objects.Add(item.GID); FightLoot.objects.Add((ushort)item.Quantity); client.Character.Inventory.Add(item.GID, item.Quantity, false, false); } #region Experience Provider List<MonsterData> monsters = new List<MonsterData>(); foreach (var monster in pvmfight.MonsterGroup.Monsters) { var grade = MonsterRecord.GetMonster(monster.MonsterId).GetGrade(monster.ActualGrade); monsters.Add(new MonsterData(grade.Level, (int)grade.GradeXp)); } var team = Fighter.Team.GetFighters().FindAll(x => x is CharacterFighter).ConvertAll<CharacterFighter>(x => (CharacterFighter)x); ; ExperienceFormulas formulas = new ExperienceFormulas(); formulas.InitXpFormula(new PlayerData(client.Character.Record.Level, client.Character.StatsRecord.Wisdom), monsters, team.ConvertAll<GroupMemberData>(x => new GroupMemberData(x.Client.Character.Record.Level, false)), pvmfight.MonsterGroup.AgeBonus); if (client.Character.Record.Level >= 200) formulas._xpSolo = 0; client.Character.AddXp((ulong)formulas._xpSolo); PlayerLevel = client.Character.Record.Level; var expdatas = new FightResultExperienceData(true, true, true, true, false, false, false, client.Character.Record.Exp, ExperienceRecord.GetExperienceForLevel(client.Character.Record.Level), ExperienceRecord.GetExperienceForLevel((uint)client.Character.Record.Level + 1), (int)formulas._xpSolo, 0, 0, 0); AdditionalDatas.Add(expdatas); #endregion client.Character.Inventory.Refresh(); client.Character.RefreshShortcuts(); }