public void HandleCreatureKill(MabiCreature creature, MabiCreature killer, MabiVertex position, SkillConst skillId) { if (killer != null) { // Shadow Bunshin soul counter if (skillId != SkillConst.ShadowBunshin) killer.SoulCount++; // Exp if (killer.LevelingEnabled) { // Give exp var exp = creature.BattleExp * WorldConf.ExpRate; killer.GiveExp((ulong)exp); Send.CombatMessage(killer.Client, killer, "+{0} EXP", exp); EventManager.CreatureEvents.OnCreatureKilled(creature, killer); if (killer is MabiPC) EventManager.PlayerEvents.OnKilledByPlayer(creature, killer); } } var npc = creature as MabiNPC; if (npc != null) { var rnd = RandomProvider.Get(); // Gold if (rnd.NextDouble() < WorldConf.GoldDropRate) { var amount = rnd.Next(npc.GoldMin, npc.GoldMax + 1); if (amount > 0) { var gold = new MabiItem(2000); gold.Info.Amount = (ushort)amount; gold.Info.Region = npc.Region; gold.Info.X = (uint)(position.X + rnd.Next(-50, 51)); gold.Info.Y = (uint)(position.Y + rnd.Next(-50, 51)); gold.DisappearTime = DateTime.Now.AddSeconds(60); this.AddItem(gold); } } // Drops foreach (var drop in npc.Drops) { if (rnd.NextDouble() < drop.Chance * WorldConf.DropRate) { var item = new MabiItem(drop.ItemId); item.Info.Amount = 1; item.Info.Region = npc.Region; item.Info.X = (uint)(position.X + rnd.Next(-50, 51)); item.Info.Y = (uint)(position.Y + rnd.Next(-50, 51)); item.DisappearTime = DateTime.Now.AddSeconds(60); this.AddItem(item); } } } // Set finisher? WorldManager.Instance.Broadcast(new MabiPacket(Op.CombatSetFinisher, creature.Id).PutLong(killer.Id), SendTargets.Range, creature); // Clear target Send.CombatTargetSet(killer, null); // Finish this finisher part? WorldManager.Instance.Broadcast(new MabiPacket(Op.CombatSetFinisher2, creature.Id), SendTargets.Range, creature); // TODO: There appears to be something missing to let it lay there for finish, if we don't kill it with the following packets. // TODO: Check for finishing. // Make it dead WorldManager.Instance.Broadcast(new MabiPacket(Op.IsNowDead, creature.Id), SendTargets.Range, creature); // Remove finisher? WorldManager.Instance.Broadcast(new MabiPacket(Op.CombatSetFinisher, creature.Id).PutLong(0), SendTargets.Range, creature); if (creature.ActiveSkillId != SkillConst.None) creature.CancelSkill(); if (creature.Owner != null) { Send.DeadFeather(creature, DeadMenuOptions.Here | DeadMenuOptions.FeatherUp); // TODO: Unmount. } creature.CauseOfDeath = DeathCauses.None; if (creature.ArenaPvPManager != null && creature.ArenaPvPManager == killer.ArenaPvPManager && creature.ArenaPvPManager.IsAttackableBy(creature, killer)) { creature.ArenaPvPManager.CreatureKilled(creature, killer); creature.CauseOfDeath = DeathCauses.Arena; } // TODO: Trans PvP if (creature.CauseOfDeath == DeathCauses.None && creature.EvGEnabled && killer.EvGEnabled) if (creature.EvGSupportRace != 0 && killer.EvGSupportRace != 0 && creature.EvGSupportRace != killer.EvGSupportRace) creature.CauseOfDeath = DeathCauses.EvG; if (creature.CauseOfDeath == DeathCauses.None) creature.CauseOfDeath = DeathCauses.Mob; }
public void CreatureCompletesQuest(MabiCreature creature, MabiQuest quest, bool rewards) { if (rewards) { // Owl WorldManager.Instance.Broadcast(new MabiPacket(Op.QuestOwlComplete, creature.Id).PutLong(quest.Id), SendTargets.Range, creature); // Rewards foreach (var reward in quest.Info.Rewards) { switch (reward.Type) { case RewardType.Exp: creature.GiveExp(reward.Amount); creature.Client.Send(PacketCreator.AcquireExp(creature, reward.Amount)); this.CreatureStatsUpdate(creature); break; case RewardType.Gold: creature.GiveItem(2000, reward.Amount); creature.Client.Send(PacketCreator.AcquireItem(creature, reward.Id, reward.Amount)); break; case RewardType.Item: creature.GiveItem(reward.Id, reward.Amount); creature.Client.Send(PacketCreator.AcquireItem(creature, reward.Id, reward.Amount)); break; case RewardType.Skill: var id = (SkillConst)reward.Id; var rank = (SkillRank)reward.Amount; // Only give skill if char doesn't have it or rank is lower. var skill = creature.Skills.Get(id); if (skill == null || skill.Rank < rank) { creature.Skills.Give(id, rank); WorldManager.Instance.CreatureStatsUpdate(creature); } break; default: Logger.Warning("Unsupported reward type '{0}'.", reward.Type); break; } } // Only call this if there were rewards, we're using this // method to clear quests as well. var script = ScriptManager.Instance.GetQuestScript(quest.Info.Id); if (script != null) script.OnCompleted(creature.Client as WorldClient, quest); } Send.ItemInfo(creature.Client, creature, quest.QuestItem); // Remove from quest log. creature.Client.Send(new MabiPacket(Op.QuestClear, creature.Id).PutLong(quest.Id)); }